@jax-data-science/sci-image-visualizer 0.17.0 → 0.18.1
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/lib/contracts/display-types.mjs +3 -2
- package/esm2022/lib/contracts/image.contract.mjs +1 -1
- package/esm2022/lib/contracts/ports/spatial-data.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/spatial-dataset.contract.mjs +1 -1
- package/esm2022/lib/contracts/visualizer.contract.mjs +1 -1
- package/esm2022/lib/geometry/cell-meshes.mjs +37 -0
- package/esm2022/lib/geometry/place.mjs +47 -0
- package/esm2022/lib/implementations/napari-js/napari-camera-depth.mjs +93 -0
- package/esm2022/lib/implementations/napari-js/napari-loading-state.mjs +1 -1
- package/esm2022/lib/implementations/napari-js/napari-region-overlay.mjs +2 -2
- package/esm2022/lib/implementations/napari-js/napari-scene.mjs +1 -1
- package/esm2022/lib/implementations/napari-js/napari-spatial-2d-scene.mjs +81 -15
- package/esm2022/lib/implementations/napari-js/napari-spatial-3d-cells.mjs +746 -0
- package/esm2022/lib/implementations/napari-js/napari-spatial-3d-scene.mjs +325 -18
- package/esm2022/lib/implementations/napari-js/napari-spatial-3d-transcripts.mjs +182 -24
- package/esm2022/lib/implementations/napari-js/napari-spatial-hover.mjs +95 -5
- package/esm2022/lib/implementations/napari-js/napari-spatial-scene.mjs +15 -1
- package/esm2022/lib/implementations/napari-js/napari-spatial-tiles.mjs +30 -2
- package/esm2022/lib/implementations/napari-js/napari-visualizer.service.mjs +40 -1
- package/esm2022/lib/implementations/napari-js/napari-volume-region-meshes.mjs +111 -28
- package/esm2022/lib/implementations/napari-js/napari-volume-scene.mjs +14 -2
- package/esm2022/lib/implementations/napari-js/spatial-tiles/cell-layers.mjs +180 -48
- package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-layers.mjs +28 -8
- package/esm2022/lib/implementations/osd/osd-region-overlay.mjs +2 -2
- package/esm2022/lib/implementations/spatial-data-http/spatial-data-http.service.mjs +10 -1
- package/esm2022/lib/region-editor/class-tree/class-tree.component.mjs +30 -3
- package/esm2022/lib/region-editor/classes-panel/classes-panel.component.mjs +15 -3
- package/esm2022/lib/region-editor/region-editor.component.mjs +24 -4
- package/esm2022/lib/region-source/region-source-ops.mjs +7 -1
- package/esm2022/lib/region-source/region-tiles.mjs +1 -1
- package/esm2022/lib/region-source/worker-region-source.mjs +24 -1
- package/esm2022/lib/routing-visualizer.service.mjs +404 -7
- package/esm2022/lib/spatial/observations-in-selection.mjs +83 -0
- package/esm2022/lib/spatial/plane-cells.mjs +119 -0
- package/esm2022/lib/spatial/spatial-controls.facade.mjs +298 -5
- package/esm2022/lib/spatial/spatial-encoding.mjs +35 -3
- package/esm2022/lib/spatial/spatial-hover.mjs +34 -1
- package/esm2022/lib/spatial/spatial-planes.mjs +49 -0
- package/esm2022/lib/spatial/spatial-selection.mjs +2 -2
- package/esm2022/lib/spatial/spatial-tile-merge.mjs +38 -1
- package/esm2022/lib/spatial/transcripts-in-selection.mjs +208 -0
- package/esm2022/lib/spatial-controls/spatial-cells-panel/spatial-cells-panel.component.mjs +42 -65
- package/esm2022/lib/spatial-controls/spatial-color-by/spatial-color-by.component.mjs +187 -0
- package/esm2022/lib/spatial-controls/spatial-controls.component.mjs +47 -12
- package/esm2022/lib/spatial-controls/spatial-gene-tree/spatial-gene-tree.component.mjs +3 -3
- package/esm2022/lib/spatial-controls/spatial-groups-panel/spatial-groups-panel.component.mjs +38 -10
- package/esm2022/lib/spatial-controls/spatial-key/spatial-key.component.mjs +3 -3
- package/esm2022/lib/spatial-controls/spatial-marker-genes-form/spatial-marker-genes-form.component.mjs +3 -3
- package/esm2022/lib/spatial-controls/spatial-observations-panel/spatial-observations-panel.component.mjs +79 -57
- package/esm2022/lib/spatial-controls/spatial-selection-observations/spatial-selection-observations.component.mjs +101 -0
- package/esm2022/lib/spatial-controls/spatial-selection-transcripts/spatial-selection-transcripts.component.mjs +94 -0
- package/esm2022/lib/spatial-controls/spatial-transcripts-panel/spatial-transcripts-panel.component.mjs +9 -3
- package/esm2022/lib/store/region-source-scope.mjs +10 -1
- package/esm2022/lib/store/region-store.service.mjs +33 -2
- package/esm2022/lib/toolbar/toolbar.component.mjs +10 -3
- package/esm2022/lib/visualizer/spatial-region-set.mjs +95 -0
- package/esm2022/lib/visualizer.component.mjs +40 -4
- package/fesm2022/{jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-DHrHO2ay.mjs → jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-YrNqv8wH.mjs} +4521 -759
- package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-YrNqv8wH.mjs.map +1 -0
- package/fesm2022/{jax-data-science-sci-image-visualizer-onnx-sam-session-CKEUwNta.mjs → jax-data-science-sci-image-visualizer-onnx-sam-session-Dph35S7m.mjs} +2 -2
- package/fesm2022/{jax-data-science-sci-image-visualizer-onnx-sam-session-CKEUwNta.mjs.map → jax-data-science-sci-image-visualizer-onnx-sam-session-Dph35S7m.mjs.map} +1 -1
- package/fesm2022/jax-data-science-sci-image-visualizer.mjs +1 -1
- package/fesm2022/region-source.worker.js +84 -2
- package/lib/contracts/display-types.d.ts +90 -4
- package/lib/contracts/image.contract.d.ts +6 -0
- package/lib/contracts/ports/spatial-data.port.d.ts +7 -0
- package/lib/contracts/region-editor-api.contract.d.ts +9 -0
- package/lib/contracts/region-store.contract.d.ts +6 -0
- package/lib/contracts/spatial-dataset.contract.d.ts +7 -1
- package/lib/contracts/visualizer.contract.d.ts +43 -1
- package/lib/geometry/cell-meshes.d.ts +27 -0
- package/lib/geometry/place.d.ts +45 -0
- package/lib/implementations/napari-js/napari-camera-depth.d.ts +23 -0
- package/lib/implementations/napari-js/napari-loading-state.d.ts +1 -1
- package/lib/implementations/napari-js/napari-scene.d.ts +12 -0
- package/lib/implementations/napari-js/napari-spatial-2d-scene.d.ts +19 -3
- package/lib/implementations/napari-js/napari-spatial-3d-cells.d.ts +141 -0
- package/lib/implementations/napari-js/napari-spatial-3d-scene.d.ts +87 -0
- package/lib/implementations/napari-js/napari-spatial-3d-transcripts.d.ts +49 -8
- package/lib/implementations/napari-js/napari-spatial-hover.d.ts +22 -0
- package/lib/implementations/napari-js/napari-spatial-scene.d.ts +12 -0
- package/lib/implementations/napari-js/napari-spatial-tiles.d.ts +15 -0
- package/lib/implementations/napari-js/napari-visualizer.service.d.ts +27 -1
- package/lib/implementations/napari-js/napari-volume-region-meshes.d.ts +38 -19
- package/lib/implementations/napari-js/napari-volume-scene.d.ts +2 -0
- package/lib/implementations/napari-js/spatial-tiles/cell-layers.d.ts +53 -0
- package/lib/implementations/napari-js/spatial-tiles/transcript-layers.d.ts +11 -2
- package/lib/implementations/spatial-data-http/spatial-data-http.service.d.ts +7 -0
- package/lib/region-editor/class-tree/class-tree.component.d.ts +16 -1
- package/lib/region-editor/classes-panel/classes-panel.component.d.ts +10 -1
- package/lib/region-editor/region-editor.component.d.ts +4 -0
- package/lib/region-source/region-source-ops.d.ts +12 -0
- package/lib/region-source/region-tiles.d.ts +8 -0
- package/lib/region-source/worker-region-source.d.ts +18 -0
- package/lib/routing-visualizer.service.d.ts +140 -1
- package/lib/spatial/observations-in-selection.d.ts +43 -0
- package/lib/spatial/plane-cells.d.ts +37 -0
- package/lib/spatial/spatial-controls.facade.d.ts +59 -0
- package/lib/spatial/spatial-encoding.d.ts +14 -1
- package/lib/spatial/spatial-hover.d.ts +23 -0
- package/lib/spatial/spatial-planes.d.ts +22 -0
- package/lib/spatial/spatial-selection.d.ts +2 -1
- package/lib/spatial/spatial-tile-merge.d.ts +9 -0
- package/lib/spatial/transcripts-in-selection.d.ts +95 -0
- package/lib/spatial-controls/spatial-cells-panel/spatial-cells-panel.component.d.ts +19 -28
- package/lib/spatial-controls/spatial-color-by/spatial-color-by.component.d.ts +64 -0
- package/lib/spatial-controls/spatial-controls.component.d.ts +17 -2
- package/lib/spatial-controls/spatial-groups-panel/spatial-groups-panel.component.d.ts +16 -6
- package/lib/spatial-controls/spatial-observations-panel/spatial-observations-panel.component.d.ts +26 -23
- package/lib/spatial-controls/spatial-selection-observations/spatial-selection-observations.component.d.ts +48 -0
- package/lib/spatial-controls/spatial-selection-transcripts/spatial-selection-transcripts.component.d.ts +43 -0
- package/lib/spatial-controls/spatial-transcripts-panel/spatial-transcripts-panel.component.d.ts +3 -1
- package/lib/store/region-source-scope.d.ts +4 -0
- package/lib/store/region-store.service.d.ts +21 -0
- package/lib/toolbar/toolbar.component.d.ts +6 -1
- package/lib/visualizer/spatial-region-set.d.ts +55 -0
- package/lib/visualizer.component.d.ts +14 -0
- package/package.json +1 -1
- package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-DHrHO2ay.mjs.map +0 -1
|
@@ -6,6 +6,7 @@ import { timeout } from 'rxjs/operators';
|
|
|
6
6
|
import { ALL_GENES } from '../../contracts/ports/spatial-data.port';
|
|
7
7
|
import { findColumnMeta, } from '../../contracts/spatial-dataset.contract';
|
|
8
8
|
import { assertManifestVersion, datasetFromManifest, decodeColumn, decodeCoords, decodeDensity, decodeEmbedding, decodeFeatureVector, decodePolygonTile, decodePolygons, decodeRadius, decodeTranscriptTile, } from './spatial-wire';
|
|
9
|
+
import { openHttpRegionSource } from '../../region-source/http-region-source';
|
|
9
10
|
import { searchGeneNames } from '../../spatial/gene-search';
|
|
10
11
|
import { Supersede } from '../../util/supersede';
|
|
11
12
|
import * as i0 from "@angular/core";
|
|
@@ -400,6 +401,14 @@ export class SpatialDataHttpService {
|
|
|
400
401
|
this.tileBytesTotal -= this.tileBytes.get(key) ?? 0;
|
|
401
402
|
this.tileBytes.delete(key);
|
|
402
403
|
}
|
|
404
|
+
/**
|
|
405
|
+
* The region set a boundary set names (`polygonTiles.sets[i].regionSource`), served beside the
|
|
406
|
+
* datasets as an HTTP region source (`{base}/regions/{id}/…`, see `openHttpRegionSource`), its
|
|
407
|
+
* requests through the host's `HttpClient` as every other request here.
|
|
408
|
+
*/
|
|
409
|
+
openRegionSet(id) {
|
|
410
|
+
return openHttpRegionSource(`${this.baseUrl}regions/${encodeURIComponent(id)}/`, { http: this.http });
|
|
411
|
+
}
|
|
403
412
|
/**
|
|
404
413
|
* The reference volume's voxels, single-flighted like the polygons.
|
|
405
414
|
*
|
|
@@ -510,4 +519,4 @@ export class SpatialDataHttpService {
|
|
|
510
519
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.9", ngImport: i0, type: SpatialDataHttpService, decorators: [{
|
|
511
520
|
type: Injectable
|
|
512
521
|
}], ctorParameters: () => [{ type: i1.HttpClient }] });
|
|
513
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BhdGlhbC1kYXRhLWh0dHAuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvaW1wbGVtZW50YXRpb25zL3NwYXRpYWwtZGF0YS1odHRwL3NwYXRpYWwtZGF0YS1odHRwLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBcUIsTUFBTSxzQkFBc0IsQ0FBQztBQUNyRSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ3JDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLGVBQWUsRUFBYyxjQUFjLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDbkUsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXpDLE9BQU8sRUFBRSxTQUFTLEVBQXdDLE1BQU0seUNBQXlDLENBQUM7QUFDMUcsT0FBTyxFQVlMLGNBQWMsR0FDZixNQUFNLDBDQUEwQyxDQUFDO0FBQ2xELE9BQU8sRUFHTCxxQkFBcUIsRUFDckIsbUJBQW1CLEVBQ25CLFlBQVksRUFDWixZQUFZLEVBQ1osYUFBYSxFQUNiLGVBQWUsRUFDZixtQkFBbUIsRUFDbkIsaUJBQWlCLEVBQ2pCLGNBQWMsRUFDZCxZQUFZLEVBQ1osb0JBQW9CLEdBQ3JCLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQzVELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQzs7O0FBRWpEOzs7OztHQUtHO0FBQ0gsTUFBTSxPQUFPLGVBQWdCLFNBQVEsS0FBSztJQUN4QyxZQUFZLEVBQVU7UUFDcEIsS0FBSyxDQUFDLDJCQUEyQixFQUFFLGlDQUFpQyxDQUFDLENBQUM7UUFDdEUsSUFBSSxDQUFDLElBQUksR0FBRyxpQkFBaUIsQ0FBQztJQUNoQyxDQUFDO0NB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cm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBMcnVDYWNoZSB9IGZyb20gJ25hcGFyaS1qcyc7XG5pbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUsIGZpcnN0VmFsdWVGcm9tIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyB0aW1lb3V0IH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBBTExfR0VORVMsIFNwYXRpYWxEYXRhUG9ydCwgVHJhbnNjcmlwdFRpbGVRdWVyeSB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9wb3J0cy9zcGF0aWFsLWRhdGEucG9ydCc7XG5pbXBvcnQge1xuICBTcGF0aWFsQ29sdW1uLFxuICBTcGF0aWFsRGF0YXNldCxcbiAgU3BhdGlhbERlbnNpdHlSYXN0ZXIsXG4gIFNwYXRpYWxFbWJlZGRpbmcsXG4gIFNwYXRpYWxQb2x5Z29uVGlsZSxcbiAgU3BhdGlhbFBvbHlnb25zLFxuICBDYXRlZ29yaWNhbENvbHVtbk1ldGEsXG4gIFNwYXRpYWxNYXJrZXJHZW5lcyxcbiAgU3BhdGlhbFRyYW5zY3JpcHRDb3VudHMsXG4gIFNwYXRpYWxUcmFuc2NyaXB0U3VtbWFyeSxcbiAgU3BhdGlhbFRyYW5zY3JpcHRUaWxlLFxuICBmaW5kQ29sdW1uTWV0YSxcbn0gZnJvbSAnLi4vLi4vY29udHJhY3RzL3NwYXRpYWwtZGF0YXNldC5jb250cmFjdCc7XG5pbXBvcnQge1xuICBTcGF0aWFsRGF0YXNldFN1bW1hcnksXG4gIFNwYXRpYWxNYW5pZmVzdCxcbiAgYXNzZXJ0TWFuaWZlc3RWZXJzaW9uLFxuICBkYXRhc2V0RnJvbU1hbmlmZXN0LFxuICBkZWNvZGVDb2x1bW4sXG4gIGRlY29kZUNvb3JkcyxcbiAgZGVjb2RlRGVuc2l0eSxcbiAgZGVjb2RlRW1iZWRkaW5nLFxuICBkZWNvZGVGZWF0dXJlVmVjdG9yLFxuICBkZWNvZGVQb2x5Z29uVGlsZSxcbiAgZGVjb2RlUG9seWdvbnMsXG4gIGRlY29kZVJhZGl1cyxcbiAgZGVjb2RlVHJhbnNjcmlwdFRpbGUsXG59IGZyb20gJy4vc3BhdGlhbC13aXJlJztcbmltcG9ydCB7IHNlYXJjaEdlbmVOYW1lcyB9IGZyb20gJy4uLy4uL3NwYXRpYWwvZ2VuZS1zZWFyY2gnO1xuaW1wb3J0IHsgU3VwZXJzZWRlIH0gZnJvbSAnLi4vLi4vdXRpbC9zdXBlcnNlZGUnO1xuXG4vKipcbiAqIEEgZGF0YXNldCBzZWxlY3Rpb24gdGhhdCBhIG5ld2VyIHNlbGVjdGlvbiAob3IgYSBgY2xlYXJgKSBvdmVydG9vay5cbiAqXG4gKiBUaHJvd24gcmF0aGVyIHRoYW4gcmVzb2x2ZWQgc28gYSBjYWxsZXIgY2Fubm90IG1pc3Rha2UgaXQgZm9yIFwidGhpcyBkYXRhc2V0IGlzXG4gKiBub3cgbG9hZGVkXCI6IG5vdGhpbmcgd2FzIHB1Ymxpc2hlZCwgb24gcHVycG9zZS5cbiAqL1xuZXhwb3J0IGNsYXNzIFN1cGVyc2VkZWRFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IoaWQ6IHN0cmluZykge1xuICAgIHN1cGVyKGBbc3BhdGlhbF0gc2VsZWN0aW9uIG9mIFwiJHtpZH1cIiB3YXMgc3VwZXJzZWRlZCBieSBhIG5ld2VyIG9uZWApO1xuICAgIHRoaXMubmFtZSA9ICdTdXBlcnNlZGVkRXJyb3InO1xuICB9XG59XG5cbi8qKlxuICogV2hhdCB0aGUgTFJVIGNhbiBob2xkLiBPbmUgYWxpYXMgcmF0aGVyIHRoYW4gYSB1bmlvbiByZXBlYXRlZCBhdCBlYWNoIHVzZSwgc28gYWRkaW5nIGEgcGF5bG9hZFxuICoga2luZCBpcyBhIHNpbmdsZSBlZGl0IGluc3RlYWQgb2YgZm91ciB0aGF0IGNhbiBkcmlmdCBhcGFydC5cbiAqL1xudHlwZSBDYWNoZWRQYXlsb2FkID0gU3BhdGlhbENvbHVtbiB8IEZsb2F0MzJBcnJheSB8IFNwYXRpYWxFbWJlZGRpbmcgfCBTcGF0aWFsRGVuc2l0eVJhc3RlcjtcblxuLyoqXG4gKiBCeXRlcyBhIGRlY29kZWQgcGF5bG9hZCBob2xkczogaXRzIG93biB0eXBlZC1hcnJheSB2aWV3cywgb25lIGxldmVsIGRlZXAg4oCUIGV2ZXJ5XG4gKiBwYXlsb2FkIGhlcmUgaXMgYSB0eXBlZCBhcnJheSBvciBhIGZsYXQgcmVjb3JkIG9mIHRoZW0uXG4gKi9cbmZ1bmN0aW9uIHBheWxvYWRCeXRlcyh2YWx1ZTogdW5rbm93bik6IG51bWJlciB7XG4gIGlmIChBcnJheUJ1ZmZlci5pc1ZpZXcodmFsdWUpKSByZXR1cm4gdmFsdWUuYnl0ZUxlbmd0aDtcbiAgbGV0IGJ5dGVzID0gMDtcbiAgaWYgKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHtcbiAgICBmb3IgKGNvbnN0IHYgb2YgT2JqZWN0LnZhbHVlcyh2YWx1ZSkpIGlmIChBcnJheUJ1ZmZlci5pc1ZpZXcodikpIGJ5dGVzICs9IHYuYnl0ZUxlbmd0aDtcbiAgfVxuICByZXR1cm4gYnl0ZXM7XG59XG5cbmNvbnN0IE1pQiA9IDEwMjQgKiAxMDI0O1xuXG4vKipcbiAqIFJlZmVyZW5jZSB7QGxpbmsgU3BhdGlhbERhdGFQb3J0fSBhZGFwdGVyIGZvciB0aGUgd2lyZSBmb3JtYXQgdGhlIGJ1bmRsZWRcbiAqIGV4YW1wbGUgc2VydmVyIHNwZWFrcyAoc2VlIGBzcGF0aWFsLXdpcmUudHNgIGFuZFxuICogYGV4YW1wbGVzL3RpbGUtc2VydmVyL2xpYi9zcGF0aWFsLm1qc2ApLlxuICpcbiAqIE9QVElPTkFMIEFORCBVTkJPVU5EIEJZIERFRkFVTFQg4oCUIHRoaXMgc2VydmljZSBpcyBgQEluamVjdGFibGUoKWAgd2l0aG91dFxuICogYHByb3ZpZGVkSW5gLCBzbyBub3RoaW5nIGdldHMgaXQgdW5sZXNzIGEgaG9zdCBleHBsaWNpdGx5IHByb3ZpZGVzIGl0OlxuICpcbiAqIGBgYHRzXG4gKiBwcm92aWRlcnM6IFtcbiAqICAgU3BhdGlhbERhdGFIdHRwU2VydmljZSxcbiAqICAgeyBwcm92aWRlOiBTUEFUSUFMX0RBVEFfUE9SVCwgdXNlRXhpc3Rpbmc6IFNwYXRpYWxEYXRhSHR0cFNlcnZpY2UgfSxcbiAqIF1cbiAqIGBgYFxuICpcbiAqIFRoYXQgbWlycm9ycyBgQ2VsbHBvc2VTZWdtZW50ZXJTZXJ2aWNlYDogYSBjb25jcmV0ZSBpbXBsZW1lbnRhdGlvbiB0aGVcbiAqIGxpYnJhcnkgc2hpcHMgZm9yIGNvbnZlbmllbmNlLCBub3QgYSBkZWZhdWx0IHRoZSBwb3J0IGludmVyc2lvbiBpcyBxdWlldGx5XG4gKiBnaXZpbmcgdXAgb24uIEEgaG9zdCB3aXRoIGl0cyBvd24gYmFja2VuZCBpbXBsZW1lbnRzIGBTcGF0aWFsRGF0YVBvcnRgXG4gKiBkaXJlY3RseSBhbmQgbmV2ZXIgdG91Y2hlcyB0aGlzIGNsYXNzLlxuICpcbiAqIFJlcXVlc3RzIGdvIHRocm91Z2ggQW5ndWxhcidzIGBIdHRwQ2xpZW50YCAobm90IGBmZXRjaGApIHNvIHRoZSBob3N0J3NcbiAqIGludGVyY2VwdG9ycyDigJQgYXV0aCBoZWFkZXJzIGFib3ZlIGFsbCDigJQgYXBwbHksIG1hdGNoaW5nIGB0aWxlLWNsaWVudC50c2AuXG4gKi9cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBTcGF0aWFsRGF0YUh0dHBTZXJ2aWNlIGltcGxlbWVudHMgU3BhdGlhbERhdGFQb3J0IHtcbiAgLyoqIFNlcnZlciByb290LCBub3JtYWxpc2VkIHRvIGVuZCB3aXRoIGV4YWN0bHkgb25lIGAvYC4gKi9cbiAgcHJpdmF0ZSBiYXNlVXJsID0gJyc7XG4gIC8qKiBQZXItcmVxdWVzdCBjZWlsaW5nLiBWZWN0b3JzIGFyZSBzbWFsbDsgYSBodW5nIHJlcXVlc3Qgc2hvdWxkIG5vdCB3ZWRnZVxuICAgKiAgdGhlIHBpY2tlci4gKi9cbiAgcHJpdmF0ZSB0aW1lb3V0TXMgPSAzMF8wMDA7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBkYXRhc2V0JCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8U3BhdGlhbERhdGFzZXQgfCBudWxsPihudWxsKTtcbiAgcHJpdmF0ZSBtYW5pZmVzdDogU3BhdGlhbE1hbmlmZXN0IHwgbnVsbCA9IG51bGw7XG4gIC8qKiBBZHZhbmNlZCBieSBldmVyeSBgc2VsZWN0RGF0YXNldGAgYW5kIGV2ZXJ5IGBjbGVhcmAsIHNvIGEgc2VsZWN0aW9uIHRoYXRcbiAgICogIGZpbmlzaGVzIGFmdGVyIGEgbmV3ZXIgaW50ZW50IGNhbiB0ZWxsIGFuZCBkcm9wIHdoYXQgaXQgZmV0Y2hlZC4gQ2FjaGUgZmlsbHNcbiAgICogIHRha2UgYSB7QGxpbmsgU3VwZXJzZWRlLmN1cnJlbnQgc25hcHNob3R9IG9mIGl0LCBzbyBhIHZlY3RvciBvciB0aWxlIHRoYXQgbGFuZHNcbiAgICogIGFmdGVyIGEgc3dpdGNoIGlzIHJldHVybmVkIHRvIGl0cyBjYWxsZXIgYnV0IG5ldmVyIGtlcHQgZm9yIHRoZSBuZXh0IGRhdGFzZXQuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgc2VsZWN0aW9uID0gbmV3IFN1cGVyc2VkZSgpO1xuXG4gIC8qKlxuICAgKiBMb2FkZWQgdmVjdG9ycywga2V5ZWQgYGNvbHVtbjo8bmFtZT5gIC8gYGZlYXR1cmU6PG5hbWU+YC4gQm91bmRlZCBMUlU6XG4gICAqIGNvbG91cmluZyBieSBjbHVzdGVyIOKGkiBieSBhIGdlbmUg4oaSIGJhY2sgYnkgY2x1c3RlciBtdXN0IG5vdCByZWZldGNoLCBidXQgYW5cbiAgICogYWZ0ZXJub29uIG9mIGJyb3dzaW5nIGdlbmVzIG11c3Qgbm90IGdyb3cgd2l0aG91dCBsaW1pdCBlaXRoZXIuXG4gICAqXG4gICAqIEJvdW5kZWQgYnkgQllURVMgYXMgd2VsbCBhcyBlbnRyaWVzOiBvbmUgdmVjdG9yIGlzIGA0wrdOYCBieXRlcyDigJQgMiBNQiBhdCA1MDBrXG4gICAqIGNlbGxzLCBidXQgMTQuOCBNQiBhdCAzLjdNLCB3aGVyZSAzMiBlbnRyaWVzIChhbiBlbWJlZGRpbmcgaXMgdHdvIG9yIHRocmVlXG4gICAqIHZlY3RvcnMpIGNvdWxkIHBpbiBjbG9zZSB0byBoYWxmIGEgZ2lnYWJ5dGUuXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGNhY2hlID0gbmV3IE1hcDxzdHJpbmcsIHsgdmFsdWU6IENhY2hlZFBheWxvYWQ7IGJ5dGVzOiBudW1iZXIgfT4oKTtcbiAgcHJpdmF0ZSBjYWNoZWRCeXRlcyA9IDA7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IENBQ0hFX0xJTUlUID0gMzI7XG4gIHByaXZhdGUgY2FjaGVCeXRlcyA9IDI1NiAqIE1pQjtcblxuICAvKiogSW4tZmxpZ2h0IHJlcXVlc3RzLCBzbyBkb3VibGUtY2xpY2tpbmcgYSBnZW5lIGlzc3VlcyBvbmUgZmV0Y2guICovXG4gIHByaXZhdGUgcmVhZG9ubHkgaW5GbGlnaHQgPSBuZXcgTWFwPHN0cmluZywgUHJvbWlzZTxDYWNoZWRQYXlsb2FkPj4oKTtcblxuICAvKipcbiAgICogVGlsZXMgZ2V0IHRoZWlyIG93biwgbGFyZ2VyIGNhY2hlOiBwYW5uaW5nIHJldmlzaXRzIHRoZW0gY29uc3RhbnRseSwgYW5kIG9uZSBzY3JlZW5cbiAgICogb2YgYSB6b29tZWQtb3V0IHNlY3Rpb24gaXMgZG96ZW5zIG9mIHRoZW0g4oCUIGZhciBwYXN0IHRoZSB2ZWN0b3IgY2FjaGUncyBsaW1pdC5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgdGlsZUNhY2hlID0gbmV3IE1hcDxzdHJpbmcsIFByb21pc2U8U3BhdGlhbFBvbHlnb25UaWxlIHwgU3BhdGlhbFRyYW5zY3JpcHRUaWxlPj4oKTtcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgVElMRV9DQUNIRV9MSU1JVCA9IDM4NDtcbiAgLyoqIEJ5dGVzIG9mIGVhY2ggUkVTT0xWRUQgdGlsZSBpbiB7QGxpbmsgdGlsZUNhY2hlfTsgYSBwZW5kaW5nIG9uZSBjb3VudHMgb25jZSBpdCBsYW5kcy4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSB0aWxlQnl0ZXMgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuICBwcml2YXRlIHRpbGVCeXRlc1RvdGFsID0gMDtcbiAgcHJpdmF0ZSB0aWxlQ2FjaGVCeXRlcyA9IDEyOCAqIE1pQjtcblxuICBwcml2YXRlIHZvbHVtZVByb21pc2U6IFByb21pc2U8VWludDhBcnJheT4gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBwb2x5Z29uc1Byb21pc2U6IFByb21pc2U8U3BhdGlhbFBvbHlnb25zPiB8IG51bGwgPSBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgaHR0cDogSHR0cENsaWVudCkge31cblxuICAvLyDilIDilIAgY29uZmlndXJhdGlvbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKipcbiAgICogUG9pbnQgdGhlIGFkYXB0ZXIgYXQgYSBzZXJ2ZXIuIENsZWFycyBhbnkgbG9hZGVkIGRhdGFzZXQuXG4gICAqXG4gICAqIGBjYWNoZUJ5dGVzYCAvIGB0aWxlQ2FjaGVCeXRlc2AgY2FwIHRoZSBkZWNvZGVkIHZlY3RvcnMgKGRlZmF1bHQgMjU2IE1pQikgYW5kIHRpbGVzXG4gICAqIChkZWZhdWx0IDEyOCBNaUIpIGtlcHQgZm9yIHJldXNlOyB0aGUgbW9zdCByZWNlbnQgZW50cnkgaXMgYWx3YXlzIGtlcHQuXG4gICAqL1xuICBjb25maWd1cmUob3B0aW9uczogeyBiYXNlVXJsOiBzdHJpbmc7IHRpbWVvdXRNcz86IG51bWJlcjsgY2FjaGVCeXRlcz86IG51bWJlcjsgdGlsZUNhY2hlQnl0ZXM/OiBudW1iZXIgfSk6IHZvaWQge1xuICAgIGNvbnN0IHJhdyA9IG9wdGlvbnMuYmFzZVVybCA/PyAnJztcbiAgICB0aGlzLmJhc2VVcmwgPSByYXcuZW5kc1dpdGgoJy8nKSA/IHJhdyA6IGAke3Jhd30vYDtcbiAgICBpZiAob3B0aW9ucy50aW1lb3V0TXMgIT09IHVuZGVmaW5lZCkgdGhpcy50aW1lb3V0TXMgPSBvcHRpb25zLnRpbWVvdXRNcztcbiAgICBpZiAob3B0aW9ucy5jYWNoZUJ5dGVzICE9PSB1bmRlZmluZWQpIHRoaXMuY2FjaGVCeXRlcyA9IG9wdGlvbnMuY2FjaGVCeXRlcztcbiAgICBpZiAob3B0aW9ucy50aWxlQ2FjaGVCeXRlcyAhPT0gdW5kZWZpbmVkKSB0aGlzLnRpbGVDYWNoZUJ5dGVzID0gb3B0aW9ucy50aWxlQ2FjaGVCeXRlcztcbiAgICB0aGlzLmNsZWFyKCk7XG4gIH1cblxuICAvKiogRGF0YXNldHMgdGhpcyBzZXJ2ZXIgb2ZmZXJzLCBmb3IgYSBob3N0LXNpZGUgcGlja2VyLiAqL1xuICBsaXN0RGF0YXNldHMoKTogUHJvbWlzZTxTcGF0aWFsRGF0YXNldFN1bW1hcnlbXT4ge1xuICAgIHJldHVybiB0aGlzLmdldEpzb248eyBkYXRhc2V0czogU3BhdGlhbERhdGFzZXRTdW1tYXJ5W10gfT4oJ3NwYXRpYWwvZGF0YXNldHMnKS50aGVuKChyKSA9PiByLmRhdGFzZXRzID8/IFtdKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPbmUgZGF0YXNldCdzIG1hbmlmZXN0LCBXSVRIT1VUIHNlbGVjdGluZyBpdC4gTGV0cyBhIGhvc3QgaW5zcGVjdCB3aGF0IGFcbiAgICogc2VydmVyIG9mZmVycyDigJQgY29sdW1uIGFuZCBmZWF0dXJlIG1ldGFkYXRhLCBhbmQgd2hpY2ggaW1hZ2UgYSBkYXRhc2V0XG4gICAqIHJlZ2lzdGVycyBvbnRvIOKAlCB3aGlsZSBidWlsZGluZyBhIHBpY2tlciwgcmF0aGVyIHRoYW4gaGF2aW5nIHRvIGxvYWQgZWFjaFxuICAgKiBkYXRhc2V0IHRvIGZpbmQgb3V0LlxuICAgKi9cbiAgcmVhZE1hbmlmZXN0KGlkOiBzdHJpbmcpOiBQcm9taXNlPFNwYXRpYWxNYW5pZmVzdD4ge1xuICAgIHJldHVybiB0aGlzLmdldEpzb248U3BhdGlhbE1hbmlmZXN0Pihgc3BhdGlhbC8ke2VuY29kZVVSSUNvbXBvbmVudChpZCl9L21hbmlmZXN0YCkudGhlbigobWFuaWZlc3QpID0+IHtcbiAgICAgIGFzc2VydE1hbmlmZXN0VmVyc2lvbihtYW5pZmVzdCk7XG4gICAgICByZXR1cm4gbWFuaWZlc3Q7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogTG9hZCBhIGRhdGFzZXQgYW5kIHB1Ymxpc2ggaXQgb24ge0BsaW5rIGdldERhdGFzZXQkfS4gRmV0Y2hlcyB0aGUgbWFuaWZlc3QsXG4gICAqIHRoZW4sIGluIHBhcmFsbGVsLCB0aGUgdmVjdG9ycyB0aGF0IGFyZSBhbHdheXMgbmVlZGVkIChjb29yZGluYXRlcywgYW5kXG4gICAqIGlkcy9yYWRpdXMgd2hlbiB0aGUgbWFuaWZlc3Qgc2F5cyB0aGV5IGV4aXN0KSDigJQgbm90aGluZyBlbHNlLlxuICAgKi9cbiAgYXN5bmMgc2VsZWN0RGF0YXNldChpZDogc3RyaW5nKTogUHJvbWlzZTxTcGF0aWFsRGF0YXNldD4ge1xuICAgIHRoaXMuY2xlYXIoKTtcbiAgICAvLyBTZWxlY3Rpb25zIGFyZSBTRVFVRU5DRUQ6IHRoaXMgaXMgdHdvIGF3YWl0cyBkZWVwLCBzbyBhIHNsb3dlciBlYXJsaWVyXG4gICAgLy8gY2FsbCB3b3VsZCBvdGhlcndpc2UgYXNzaWduIGB0aGlzLm1hbmlmZXN0YCBvciBwdWJsaXNoIGl0cyBkYXRhc2V0IGFmdGVyIGFcbiAgICAvLyBsYXRlciBvbmUg4oCUIGxlYXZpbmcgdGhlIG1hbmlmZXN0IGFuZCB0aGUgb2JzZXJ2YXRpb25zIGZyb20gdHdvIGRpZmZlcmVudFxuICAgIC8vIGRhdGFzZXRzLCB3aGljaCBpcyB3b3JzZSB0aGFuIGVpdGhlciBiZWluZyBsYXRlLlxuICAgIGNvbnN0IHRhc2sgPSB0aGlzLnNlbGVjdGlvbi5uZXh0KCk7XG4gICAgY29uc3Qgc3VwZXJzZWRlZCA9ICgpID0+ICF0YXNrLmlzQ3VycmVudCgpO1xuICAgIGNvbnN0IHBhdGggPSBgc3BhdGlhbC8ke2VuY29kZVVSSUNvbXBvbmVudChpZCl9YDtcblxuICAgIGNvbnN0IG1hbmlmZXN0ID0gYXdhaXQgdGhpcy5nZXRKc29uPFNwYXRpYWxNYW5pZmVzdD4oYCR7cGF0aH0vbWFuaWZlc3RgKTtcbiAgICBhc3NlcnRNYW5pZmVzdFZlcnNpb24obWFuaWZlc3QpO1xuICAgIGlmIChzdXBlcnNlZGVkKCkpIHRocm93IG5ldyBTdXBlcnNlZGVkRXJyb3IoaWQpO1xuICAgIHRoaXMubWFuaWZlc3QgPSBtYW5pZmVzdDtcblxuICAgIC8vIEluZGVwZW5kZW50IG9mIGVhY2ggb3RoZXIsIHNvIHJlcXVlc3RlZCB0b2dldGhlcjogdGltZSB0byBmaXJzdCBwYWludCBpcyB0aGVcbiAgICAvLyBzbG93ZXN0IG9mIHRoZW0sIG5vdCB0aGVpciBzdW0gKHRoZSBpZHMgSlNPTiBhbG9uZSBpcyB0ZW5zIG9mIE1CIG9uIGEgbGFyZ2UgZGF0YXNldCkuXG4gICAgY29uc3QgW2Nvb3Jkc0J1ZiwgaWRzLCByYWRpdXNCdWZdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgdGhpcy5nZXRCaW5hcnkoYCR7cGF0aH0vY29vcmRzYCksXG4gICAgICBtYW5pZmVzdC5oYXNJZHMgPyB0aGlzLmdldEpzb248eyBpZHM6IHN0cmluZ1tdIH0+KGAke3BhdGh9L2lkc2ApLnRoZW4oKHIpID0+IHIuaWRzKSA6IHVuZGVmaW5lZCxcbiAgICAgIG1hbmlmZXN0LnJhZGl1cz8ubW9kZSA9PT0gJ3Blci1vYnNlcnZhdGlvbicgPyB0aGlzLmdldEJpbmFyeShgJHtwYXRofS9yYWRpdXNgKSA6IHVuZGVmaW5lZCxcbiAgICBdKTtcbiAgICBpZiAoc3VwZXJzZWRlZCgpKSB0aHJvdyBuZXcgU3VwZXJzZWRlZEVycm9yKGlkKTtcbiAgICBjb25zdCBjb29yZHMgPSBkZWNvZGVDb29yZHMoY29vcmRzQnVmLCBtYW5pZmVzdC5jb3VudCwgISFtYW5pZmVzdC5oYXNaKTtcbiAgICBjb25zdCByYWRpdXMgPSByYWRpdXNCdWYgPyBkZWNvZGVSYWRpdXMocmFkaXVzQnVmLCBtYW5pZmVzdC5jb3VudCkgOiB1bmRlZmluZWQ7XG5cbiAgICBjb25zdCBkYXRhc2V0ID0gZGF0YXNldEZyb21NYW5pZmVzdChtYW5pZmVzdCwgY29vcmRzLCB7IGlkcywgcmFkaXVzIH0pO1xuICAgIHRoaXMuZGF0YXNldCQubmV4dChkYXRhc2V0KTtcbiAgICByZXR1cm4gZGF0YXNldDtcbiAgfVxuXG4gIC8qKiBEcm9wIHRoZSBsb2FkZWQgZGF0YXNldCBhbmQgZXZlcnkgY2FjaGVkIHZlY3Rvci4gKi9cbiAgY2xlYXIoKTogdm9pZCB7XG4gICAgLy8gQSBjbGVhciBpcyBpdHNlbGYgdGhlIG5ld2VzdCBpbnRlbnQsIHNvIGl0IHN1cGVyc2VkZXMgYW55IHNlbGVjdGlvbiBzdGlsbFxuICAgIC8vIGluIGZsaWdodCByYXRoZXIgdGhhbiBsZXR0aW5nIG9uZSBsYW5kIGFmdGVyd2FyZHMuXG4gICAgdGhpcy5zZWxlY3Rpb24uY2FuY2VsKCk7XG4gICAgdGhpcy5tYW5pZmVzdCA9IG51bGw7XG4gICAgdGhpcy5jYWNoZS5jbGVhcigpO1xuICAgIHRoaXMuY2FjaGVkQnl0ZXMgPSAwO1xuICAgIHRoaXMuaW5GbGlnaHQuY2xlYXIoKTtcbiAgICB0aGlzLnRpbGVDYWNoZS5jbGVhcigpO1xuICAgIHRoaXMudGlsZUJ5dGVzLmNsZWFyKCk7XG4gICAgdGhpcy50aWxlQnl0ZXNUb3RhbCA9IDA7XG4gICAgdGhpcy5zdW1tYXJ5Q2FjaGUuY2xlYXIoKTtcbiAgICB0aGlzLnBvbHlnb25zUHJvbWlzZSA9IG51bGw7XG4gICAgdGhpcy52b2x1bWVQcm9taXNlID0gbnVsbDtcbiAgICBpZiAodGhpcy5kYXRhc2V0JC52YWx1ZSAhPT0gbnVsbCkgdGhpcy5kYXRhc2V0JC5uZXh0KG51bGwpO1xuICB9XG5cbiAgLy8g4pSA4pSAIFNwYXRpYWxEYXRhUG9ydCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICBnZXREYXRhc2V0JCgpOiBPYnNlcnZhYmxlPFNwYXRpYWxEYXRhc2V0IHwgbnVsbD4ge1xuICAgIHJldHVybiB0aGlzLmRhdGFzZXQkLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgZ2V0Q29sdW1uKG5hbWU6IHN0cmluZyk6IFByb21pc2U8U3BhdGlhbENvbHVtbj4ge1xuICAgIGNvbnN0IG1hbmlmZXN0ID0gdGhpcy5yZXF1aXJlTWFuaWZlc3QoKTtcbiAgICBjb25zdCBkYXRhc2V0ID0gdGhpcy5kYXRhc2V0JC52YWx1ZSE7XG4gICAgY29uc3QgbWV0YSA9IGZpbmRDb2x1bW5NZXRhKGRhdGFzZXQsIG5hbWUpO1xuICAgIGlmICghbWV0YSkge1xuICAgICAgLy8gUmVqZWN0IHJhdGhlciB0aGFuIHJlc29sdmUgZW1wdHk6IGEgdHlwbyBtdXN0IHN1cmZhY2UgYXMgYW4gZXJyb3IsIG5vdFxuICAgICAgLy8gYXMgYSBwbG90IHRoYXQgc2lsZW50bHkgcmVuZGVycyBldmVyeSBwb2ludCBhcyBcIm5vIGRhdGFcIi5cbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChcbiAgICAgICAgbmV3IEVycm9yKFxuICAgICAgICAgIGBbc3BhdGlhbF0gdW5rbm93biBjb2x1bW4gXCIke25hbWV9XCIuIEF2YWlsYWJsZTogJHtkYXRhc2V0LmNvbHVtbnMubWFwKChjKSA9PiBjLm5hbWUpLmpvaW4oJywgJyl9YCxcbiAgICAgICAgKSxcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmZldGNoQ2FjaGVkKGBjb2x1bW46JHtuYW1lfWAsICgpID0+XG4gICAgICB0aGlzLmdldEJpbmFyeShgc3BhdGlhbC8ke2VuY29kZVVSSUNvbXBvbmVudChtYW5pZmVzdC5pZCl9L2NvbHVtbi8ke2VuY29kZVVSSUNvbXBvbmVudChuYW1lKX1gKS50aGVuKChidWYpID0+XG4gICAgICAgIGRlY29kZUNvbHVtbihidWYsIG1ldGEsIG1hbmlmZXN0LmNvdW50KSxcbiAgICAgICksXG4gICAgKSBhcyBQcm9taXNlPFNwYXRpYWxDb2x1bW4+O1xuICB9XG5cbiAgZ2V0RW1iZWRkaW5nKG5hbWU6IHN0cmluZyk6IFByb21pc2U8U3BhdGlhbEVtYmVkZGluZz4ge1xuICAgIGNvbnN0IG1hbmlmZXN0ID0gdGhpcy5yZXF1aXJlTWFuaWZlc3QoKTtcbiAgICBjb25zdCBtZXRhID0gbWFuaWZlc3QuZW1iZWRkaW5ncz8uZmluZCgoZSkgPT4gZS5uYW1lID09PSBuYW1lKTtcbiAgICBpZiAoIW1ldGEpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoYFtzcGF0aWFsXSB1bmtub3duIGVtYmVkZGluZyBcIiR7bmFtZX1cImApKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZmV0Y2hDYWNoZWQoYGVtYmVkZGluZzoke25hbWV9YCwgKCkgPT5cbiAgICAgIHRoaXMuZ2V0QmluYXJ5KGBzcGF0aWFsLyR7ZW5jb2RlVVJJQ29tcG9uZW50KG1hbmlmZXN0LmlkKX0vZW1iZWRkaW5nLyR7ZW5jb2RlVVJJQ29tcG9uZW50KG5hbWUpfWApLnRoZW4oXG4gICAgICAgIChidWYpID0+IGRlY29kZUVtYmVkZGluZyhidWYsIG1ldGEsIG1hbmlmZXN0LmNvdW50KSxcbiAgICAgICksXG4gICAgKSBhcyBQcm9taXNlPFNwYXRpYWxFbWJlZGRpbmc+O1xuICB9XG5cbiAgZ2V0RmVhdHVyZVZlY3RvcihuYW1lOiBzdHJpbmcpOiBQcm9taXNlPEZsb2F0MzJBcnJheT4ge1xuICAgIGNvbnN0IG1hbmlmZXN0ID0gdGhpcy5yZXF1aXJlTWFuaWZlc3QoKTtcbiAgICBjb25zdCBuYW1lcyA9IG1hbmlmZXN0LmZlYXR1cmVzPy5uYW1lcztcbiAgICBpZiAobmFtZXMgJiYgIW5hbWVzLmluY2x1ZGVzKG5hbWUpKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKGBbc3BhdGlhbF0gdW5rbm93biBmZWF0dXJlIFwiJHtuYW1lfVwiYCkpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5mZXRjaENhY2hlZChgZmVhdHVyZToke25hbWV9YCwgKCkgPT5cbiAgICAgIHRoaXMuZ2V0QmluYXJ5KGBzcGF0aWFsLyR7ZW5jb2RlVVJJQ29tcG9uZW50KG1hbmlmZXN0LmlkKX0vZmVhdHVyZS8ke2VuY29kZVVSSUNvbXBvbmVudChuYW1lKX1gKS50aGVuKFxuICAgICAgICAoYnVmKSA9PiBkZWNvZGVGZWF0dXJlVmVjdG9yKGJ1ZiwgbWFuaWZlc3QuY291bnQpLFxuICAgICAgKSxcbiAgICApIGFzIFByb21pc2U8RmxvYXQzMkFycmF5PjtcbiAgfVxuXG4gIGFzeW5jIHNlYXJjaEZlYXR1cmVzKHF1ZXJ5OiBzdHJpbmcsIGxpbWl0ID0gNTApOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgY29uc3QgbWFuaWZlc3QgPSB0aGlzLnJlcXVpcmVNYW5pZmVzdCgpO1xuICAgIC8vIEEgZGF0YXNldCB0aGF0IGlubGluZWQgaXRzIG5hbWVzICh0YXJnZXRlZCBwYW5lbCkgaXMgZmlsdGVyZWQgbG9jYWxseSDigJRcbiAgICAvLyBubyByb3VuZC10cmlwIGZvciBhIGtleXN0cm9rZSDigJQgYW5kIHJhbmtlZCBhcyB0aGUgcGlja2VyIHJhbmtzIHRoZW0uXG4gICAgY29uc3QgbmFtZXMgPSBtYW5pZmVzdC5mZWF0dXJlcz8ubmFtZXM7XG4gICAgaWYgKG5hbWVzKSByZXR1cm4gc2VhcmNoR2VuZU5hbWVzKG5hbWVzLCBxdWVyeSwgbGltaXQpO1xuICAgIGNvbnN0IHVybCA9XG4gICAgICBgc3BhdGlhbC8ke2VuY29kZVVSSUNvbXBvbmVudChtYW5pZmVzdC5pZCl9L2ZlYXR1cmVzYCArIGA/cT0ke2VuY29kZVVSSUNvbXBvbmVudChxdWVyeSl9JmxpbWl0PSR7bGltaXR9YDtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMuZ2V0SnNvbjx7IG5hbWVzOiBzdHJpbmdbXSB9Pih1cmwpKS5uYW1lcyA/PyBbXTtcbiAgfVxuXG4gIGdldFBvbHlnb25zKCk6IFByb21pc2U8U3BhdGlhbFBvbHlnb25zPiB7XG4gICAgY29uc3QgbWFuaWZlc3QgPSB0aGlzLnJlcXVpcmVNYW5pZmVzdCgpO1xuICAgIGlmICghbWFuaWZlc3QucG9seWdvbnMpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoJ1tzcGF0aWFsXSB0aGlzIGRhdGFzZXQgaGFzIG5vIHBvbHlnb24gZ2VvbWV0cnknKSk7XG4gICAgfVxuICAgIC8vIEdlb21ldHJ5IGlzIG9uZSBsYXJnZSBibG9iIHJhdGhlciB0aGFuIGEgcGVyLW5hbWUgdmVjdG9yLCBzbyBpdCBnZXRzIGl0c1xuICAgIC8vIG93biBzaW5nbGUtZmxpZ2h0IHNsb3QgaW5zdGVhZCBvZiBhIGNhY2hlIGVudHJ5LlxuICAgIHRoaXMucG9seWdvbnNQcm9taXNlID8/PSB0aGlzLmdldEJpbmFyeShgc3BhdGlhbC8ke2VuY29kZVVSSUNvbXBvbmVudChtYW5pZmVzdC5pZCl9L3BvbHlnb25zYClcbiAgICAgIC50aGVuKGRlY29kZVBvbHlnb25zKVxuICAgICAgLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgdGhpcy5wb2x5Z29uc1Byb21pc2UgPSBudWxsO1xuICAgICAgICB0aHJvdyBlcnI7XG4gICAgICB9KTtcbiAgICByZXR1cm4gdGhpcy5wb2x5Z29uc1Byb21pc2U7XG4gIH1cblxuICBnZXRQb2x5Z29uVGlsZShzZXQ6IHN0cmluZywgbGV2ZWw6IG51bWJlciwgZ3g6IG51bWJlciwgZ3k6IG51bWJlcik6IFByb21pc2U8U3BhdGlhbFBvbHlnb25UaWxlPiB7XG4gICAgY29uc3QgbWFuaWZlc3QgPSB0aGlzLnJlcXVpcmVNYW5pZmVzdCgpO1xuICAgIGlmICghbWFuaWZlc3QucG9seWdvblRpbGVzKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCdbc3BhdGlhbF0gdGhpcyBkYXRhc2V0IGhhcyBubyB0aWxlZCBwb2x5Z29ucycpKTtcbiAgICB9XG4gICAgY29uc3QgcGF0aCA9XG4gICAgICBgc3BhdGlhbC8ke2VuY29kZVVSSUNvbXBvbmVudChtYW5pZmVzdC5pZCl9L3BvbHlnb24tdGlsZS9gICtcbiAgICAgIGAke2VuY29kZVVSSUNvbXBvbmVudChzZXQpfS8ke2xldmVsfS8ke2d4fS8ke2d5fWA7XG4gICAgcmV0dXJuIHRoaXMuY2FjaGVkVGlsZShwYXRoLCAoKSA9PlxuICAgICAgdGhpcy5nZXRCaW5hcnkocGF0aCkudGhlbigoYnVmKSA9PiBkZWNvZGVQb2x5Z29uVGlsZShidWYsIG1hbmlmZXN0LmNvdW50KSksXG4gICAgKSBhcyBQcm9taXNlPFNwYXRpYWxQb2x5Z29uVGlsZT47XG4gIH1cblxuICBnZXRUcmFuc2NyaXB0VGlsZShcbiAgICBsZXZlbDogbnVtYmVyLFxuICAgIGd4OiBudW1iZXIsXG4gICAgZ3k6IG51bWJlcixcbiAgICBxdWVyeTogVHJhbnNjcmlwdFRpbGVRdWVyeSxcbiAgKTogUHJvbWlzZTxTcGF0aWFsVHJhbnNjcmlwdFRpbGU+IHtcbiAgICBjb25zdCBtYW5pZmVzdCA9IHRoaXMucmVxdWlyZU1hbmlmZXN0KCk7XG4gICAgaWYgKCFtYW5pZmVzdC50cmFuc2NyaXB0VGlsZXMpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoJ1tzcGF0aWFsXSB0aGlzIGRhdGFzZXQgaGFzIG5vIHRpbGVkIHRyYW5zY3JpcHRzJykpO1xuICAgIH1cbiAgICBjb25zdCBnZW5lcyA9IHF1ZXJ5LmdlbmVzLm1hcChlbmNvZGVVUklDb21wb25lbnQpLmpvaW4oJywnKTtcbiAgICBjb25zdCBib3ggPSBxdWVyeS5ib3ggPyBgJmJveD0ke3F1ZXJ5LmJveC5qb2luKCcsJyl9YCA6ICcnO1xuICAgIGNvbnN0IHBhdGggPVxuICAgICAgYHNwYXRpYWwvJHtlbmNvZGVVUklDb21wb25lbnQobWFuaWZlc3QuaWQpfS90cmFuc2NyaXB0LXRpbGUvJHtsZXZlbH0vJHtneH0vJHtneX1gICtcbiAgICAgIGA/Z2VuZXM9JHtnZW5lc30mcXVhbGl0eT0ke3F1ZXJ5LnF1YWxpdHkgPz8gJ2hpZ2gnfSR7Ym94fWA7XG4gICAgLy8gVGhlIGNvZGVzIGluZGV4IHRoZSBnZW5lcyBhc2tlZCBmb3Ig4oCUIGV4Y2VwdCBmb3IgQUxMX0dFTkVTLCB3aG9zZSBsaXN0IHRoZVxuICAgIC8vIHNlcnZlciBvd25zLCBzbyBvbmx5IHRoZSBvYnNlcnZhdGlvbnMgY2FuIGJlIGJvdW5kZWQgdGhlcmUuXG4gICAgY29uc3QgbGltaXRzID0ge1xuICAgICAgb2JzZXJ2YXRpb25zOiBtYW5pZmVzdC5jb3VudCxcbiAgICAgIC4uLihxdWVyeS5nZW5lcy5pbmNsdWRlcyhBTExfR0VORVMpID8ge30gOiB7IGdlbmVzOiBxdWVyeS5nZW5lcy5sZW5ndGggfSksXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5jYWNoZWRUaWxlKHBhdGgsICgpID0+XG4gICAgICB0aGlzLmdldEJpbmFyeShwYXRoKS50aGVuKChidWYpID0+IGRlY29kZVRyYW5zY3JpcHRUaWxlKGJ1ZiwgbGltaXRzKSksXG4gICAgKSBhcyBQcm9taXNlPFNwYXRpYWxUcmFuc2NyaXB0VGlsZT47XG4gIH1cblxuICBnZXRUcmFuc2NyaXB0R2VuZUJpbnMobGV2ZWw6IG51bWJlciwgdHg6IG51bWJlciwgdHk6IG51bWJlciwgZ2VuZXM6IHN0cmluZ1tdKTogUHJvbWlzZTxTcGF0aWFsVHJhbnNjcmlwdFRpbGU+IHtcbiAgICBjb25zdCBtYW5pZmVzdCA9IHRoaXMucmVxdWlyZU1hbmlmZXN0KCk7XG4gICAgaWYgKCFtYW5pZmVzdC50cmFuc2NyaXB0R2VuZUJpbnMpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoJ1tzcGF0aWFsXSB0aGlzIGRhdGFzZXQgaGFzIG5vIHBlci1nZW5lIGJpbnMnKSk7XG4gICAgfVxuICAgIGNvbnN0IHBhdGggPVxuICAgICAgYHNwYXRpYWwvJHtlbmNvZGVVUklDb21wb25lbnQobWFuaWZlc3QuaWQpfS9nZW5lLWJpbnMvJHtsZXZlbH0vJHt0eH0vJHt0eX1gICtcbiAgICAgIGA/Z2VuZXM9JHtnZW5lcy5tYXAoZW5jb2RlVVJJQ29tcG9uZW50KS5qb2luKCcsJyl9YDtcbiAgICBjb25zdCBsaW1pdHMgPSB7XG4gICAgICBvYnNlcnZhdGlvbnM6IG1hbmlmZXN0LmNvdW50LFxuICAgICAgLi4uKGdlbmVzLmluY2x1ZGVzKEFMTF9HRU5FUykgPyB7fSA6IHsgZ2VuZXM6IGdlbmVzLmxlbmd0aCB9KSxcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLmNhY2hlZFRpbGUocGF0aCwgKCkgPT5cbiAgICAgIHRoaXMuZ2V0QmluYXJ5KHBhdGgpLnRoZW4oKGJ1ZikgPT4gZGVjb2RlVHJhbnNjcmlwdFRpbGUoYnVmLCBsaW1pdHMpKSxcbiAgICApIGFzIFByb21pc2U8U3BhdGlhbFRyYW5zY3JpcHRUaWxlPjtcbiAgfVxuXG4gIGdldFRyYW5zY3JpcHRCaW5zKGxldmVsOiBudW1iZXIsIHR4OiBudW1iZXIsIHR5OiBudW1iZXIpOiBQcm9taXNlPFNwYXRpYWxUcmFuc2NyaXB0VGlsZT4ge1xuICAgIGNvbnN0IG1hbmlmZXN0ID0gdGhpcy5yZXF1aXJlTWFuaWZlc3QoKTtcbiAgICBpZiAoIW1hbmlmZXN0LnRyYW5zY3JpcHRCaW5zKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCdbc3BhdGlhbF0gdGhpcyBkYXRhc2V0IGhhcyBubyB0cmFuc2NyaXB0IHB5cmFtaWQnKSk7XG4gICAgfVxuICAgIGNvbnN0IHBhdGggPSBgc3BhdGlhbC8ke2VuY29kZVVSSUNvbXBvbmVudChtYW5pZmVzdC5pZCl9L3RyYW5zY3JpcHQtYmlucy8ke2xldmVsfS8ke3R4fS8ke3R5fWA7XG4gICAgcmV0dXJuIHRoaXMuY2FjaGVkVGlsZShwYXRoLCAoKSA9PlxuICAgICAgdGhpcy5nZXRCaW5hcnkocGF0aCkudGhlbigoYnVmKSA9PiBkZWNvZGVUcmFuc2NyaXB0VGlsZShidWYsIHsgb2JzZXJ2YXRpb25zOiBtYW5pZmVzdC5jb3VudCB9KSksXG4gICAgKSBhcyBQcm9taXNlPFNwYXRpYWxUcmFuc2NyaXB0VGlsZT47XG4gIH1cblxuICAvKiogU21hbGwgSlNPTiBhbnN3ZXJzLCBrZXllZCBieSBVUkwg4oCUIGhvdmVyaW5nIGJhY2sgYW5kIGZvcnRoIG11c3Qgbm90IHJlZmV0Y2guIExlYXN0IHJlY2VudGx5XG4gICAqICBVU0VEIGdvZXMgZmlyc3QsIHNvIHRoZSBzdW1tYXJ5IHVuZGVyIHRoZSBwb2ludGVyIHN0YXlzIHdoaWxlIG90aGVycyBhcmUgZXZpY3RlZC4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBzdW1tYXJ5Q2FjaGUgPSBuZXcgTHJ1Q2FjaGU8UHJvbWlzZTxTcGF0aWFsVHJhbnNjcmlwdFN1bW1hcnk+PigyNTYpO1xuXG4gIGdldFRyYW5zY3JpcHRTdW1tYXJ5KHF1ZXJ5OiB7XG4gICAgYm94PzogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl07XG4gICAgZ2VuZXM/OiBzdHJpbmdbXTtcbiAgICBjZWxscz86IG51bWJlcltdO1xuICB9KTogUHJvbWlzZTxTcGF0aWFsVHJhbnNjcmlwdFN1bW1hcnk+IHtcbiAgICBjb25zdCBtYW5pZmVzdCA9IHRoaXMucmVxdWlyZU1hbmlmZXN0KCk7XG4gICAgY29uc3QgcGFyYW1zOiBzdHJpbmdbXSA9IFtdO1xuICAgIGlmIChxdWVyeS5ib3gpIHBhcmFtcy5wdXNoKGBib3g9JHtxdWVyeS5ib3gubWFwKCh2KSA9PiArdi50b0ZpeGVkKDMpKS5qb2luKCcsJyl9YCk7XG4gICAgaWYgKHF1ZXJ5LmdlbmVzPy5sZW5ndGgpIHBhcmFtcy5wdXNoKGBnZW5lcz0ke3F1ZXJ5LmdlbmVzLm1hcChlbmNvZGVVUklDb21wb25lbnQpLmpvaW4oJywnKX1gKTtcbiAgICBpZiAocXVlcnkuY2VsbHM/Lmxlbmd0aCkgcGFyYW1zLnB1c2goYGNlbGxzPSR7cXVlcnkuY2VsbHMuam9pbignLCcpfWApO1xuICAgIGNvbnN0IHVybCA9IGBzcGF0aWFsLyR7ZW5jb2RlVVJJQ29tcG9uZW50KG1hbmlmZXN0LmlkKX0vdHJhbnNjcmlwdC1zdW1tYXJ5PyR7cGFyYW1zLmpvaW4oJyYnKX1gO1xuICAgIGxldCBoaXQgPSB0aGlzLnN1bW1hcnlDYWNoZS5nZXQodXJsKTtcbiAgICBpZiAoIWhpdCkge1xuICAgICAgaGl0ID0gdGhpcy5nZXRKc29uPFNwYXRpYWxUcmFuc2NyaXB0U3VtbWFyeT4odXJsKTtcbiAgICAgIGhpdC5jYXRjaCgoKSA9PiB0aGlzLnN1bW1hcnlDYWNoZS5kZWxldGUodXJsKSk7XG4gICAgICB0aGlzLnN1bW1hcnlDYWNoZS5zZXQodXJsLCBoaXQpO1xuICAgIH1cbiAgICByZXR1cm4gaGl0O1xuICB9XG5cbiAgZ2V0RGVuc2l0eShnZW5lczogc3RyaW5nW10sIGJpblNpemU/OiBudW1iZXIpOiBQcm9taXNlPFNwYXRpYWxEZW5zaXR5UmFzdGVyPiB7XG4gICAgY29uc3QgbWFuaWZlc3QgPSB0aGlzLnJlcXVpcmVNYW5pZmVzdCgpO1xuICAgIGlmICghbWFuaWZlc3QuZGVuc2l0eSkgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcignW3NwYXRpYWxdIHRoaXMgZGF0YXNldCBoYXMgbm8gZGVuc2l0eSByYXN0ZXInKSk7XG4gICAgY29uc3QgbGlzdCA9IFsuLi5nZW5lc107XG4gICAgY29uc3QgYmluID0gYmluU2l6ZSA/IGAmYmluPSR7YmluU2l6ZX1gIDogJyc7XG4gICAgcmV0dXJuIHRoaXMuZmV0Y2hDYWNoZWQoYGRlbnNpdHk6JHtsaXN0LmpvaW4oJywnKX06JHtiaW5TaXplID8/ICcnfWAsICgpID0+XG4gICAgICB0aGlzLmdldEJpbmFyeShcbiAgICAgICAgYHNwYXRpYWwvJHtlbmNvZGVVUklDb21wb25lbnQobWFuaWZlc3QuaWQpfS9kZW5zaXR5P2dlbmVzPSR7bGlzdC5tYXAoZW5jb2RlVVJJQ29tcG9uZW50KS5qb2luKCcsJyl9JHtiaW59YCxcbiAgICAgICkudGhlbigoYnVmKSA9PiBkZWNvZGVEZW5zaXR5KGJ1ZiwgbGlzdCkpLFxuICAgICkgYXMgUHJvbWlzZTxTcGF0aWFsRGVuc2l0eVJhc3Rlcj47XG4gIH1cblxuICBhc3luYyBpbXBvcnRHcm91cHMobGFiZWw6IHN0cmluZywgdGFibGU6IHN0cmluZyk6IFByb21pc2U8eyBjb2x1bW46IENhdGVnb3JpY2FsQ29sdW1uTWV0YTsgbWF0Y2hlZDogbnVtYmVyIH0+IHtcbiAgICBjb25zdCBtYW5pZmVzdCA9IHRoaXMucmVxdWlyZU1hbmlmZXN0KCk7XG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5iYXNlVXJsfXNwYXRpYWwvJHtlbmNvZGVVUklDb21wb25lbnQobWFuaWZlc3QuaWQpfS9ncm91cHM/bmFtZT0ke2VuY29kZVVSSUNvbXBvbmVudChsYWJlbCl9YDtcbiAgICAvLyBIdHRwQ2xpZW50LCBub3QgZmV0Y2g6IGEgaG9zdCdzIGludGVyY2VwdG9ycyAoaXRzIGF1dGggaGVhZGVyKSBtdXN0IGFwcGx5IHRvIHRoZVxuICAgIC8vIHVwbG9hZCBhcyB0aGV5IGRvIHRvIGV2ZXJ5IHJlYWQsIG9yIGEgcHJvdGVjdGVkIHNlcnZlciByZWZ1c2VzIGl0LlxuICAgIGxldCBib2R5OiB7IGNvbHVtbjogQ2F0ZWdvcmljYWxDb2x1bW5NZXRhOyBtYXRjaGVkOiBudW1iZXIgfTtcbiAgICB0cnkge1xuICAgICAgYm9keSA9IGF3YWl0IGZpcnN0VmFsdWVGcm9tKFxuICAgICAgICB0aGlzLmh0dHBcbiAgICAgICAgICAucG9zdDx7IGNvbHVtbjogQ2F0ZWdvcmljYWxDb2x1bW5NZXRhOyBtYXRjaGVkOiBudW1iZXIgfT4odXJsLCB0YWJsZSwge1xuICAgICAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ3RleHQvY3N2JyB9LFxuICAgICAgICAgIH0pXG4gICAgICAgICAgLnBpcGUodGltZW91dCh0aGlzLnRpbWVvdXRNcykpLFxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnN0IGUgPSBlcnIgYXMgSHR0cEVycm9yUmVzcG9uc2U7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoZT8uZXJyb3I/LmVycm9yID8/IGBbc3BhdGlhbF0gaW1wb3J0IGZhaWxlZCAoSFRUUCAke2U/LnN0YXR1cyA/PyAnPyd9KWApO1xuICAgIH1cbiAgICBjb25zdCBjb2x1bW4gPSBib2R5LmNvbHVtbjtcbiAgICAvLyBUaGUgbmV3IGNvbHVtbiBqb2lucyB0aGUgZGF0YXNldDogcmUtZW1pdCBzbyBldmVyeSBwYW5lbCBzZWVzIGl0LlxuICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLmRhdGFzZXQkLnZhbHVlO1xuICAgIGlmIChjdXJyZW50ICYmIHRoaXMubWFuaWZlc3Q/LmlkID09PSBtYW5pZmVzdC5pZCkge1xuICAgICAgY29uc3QgY29sdW1ucyA9IGN1cnJlbnQuY29sdW1ucy5maWx0ZXIoKGMpID0+IGMubmFtZSAhPT0gY29sdW1uLm5hbWUpLmNvbmNhdChjb2x1bW4pO1xuICAgICAgdGhpcy5tYW5pZmVzdCA9IHsgLi4udGhpcy5tYW5pZmVzdCwgY29sdW1ucyB9O1xuICAgICAgdGhpcy51bmNhY2hlKGBjb2x1bW46JHtjb2x1bW4ubmFtZX1gKTtcbiAgICAgIHRoaXMuZGF0YXNldCQubmV4dCh7IC4uLmN1cnJlbnQsIGNvbHVtbnMgfSk7XG4gICAgfVxuICAgIHJldHVybiB7IGNvbHVtbiwgbWF0Y2hlZDogYm9keS5tYXRjaGVkIH07XG4gIH1cblxuICBnZXRNYXJrZXJHZW5lcyhjb2x1bW46IHN0cmluZywgcGVyR3JvdXAgPSA1KTogUHJvbWlzZTxTcGF0aWFsTWFya2VyR2VuZXM+IHtcbiAgICBjb25zdCBtYW5pZmVzdCA9IHRoaXMucmVxdWlyZU1hbmlmZXN0KCk7XG4gICAgLy8gTm8gcGVyLXJlcXVlc3QgdGltZW91dDogdGhlIGZpcnN0IGNvbXB1dGF0aW9uIGlzIGEgcGFzcyBvdmVyIHRoZSB3aG9sZSBtYXRyaXguXG4gICAgcmV0dXJuIGZpcnN0VmFsdWVGcm9tKFxuICAgICAgdGhpcy5odHRwLmdldDxTcGF0aWFsTWFya2VyR2VuZXM+KFxuICAgICAgICBgJHt0aGlzLmJhc2VVcmx9c3BhdGlhbC8ke2VuY29kZVVSSUNvbXBvbmVudChtYW5pZmVzdC5pZCl9L21hcmtlcnMvJHtlbmNvZGVVUklDb21wb25lbnQoY29sdW1uKX0/bj0ke3Blckdyb3VwfWAsXG4gICAgICApLFxuICAgICk7XG4gIH1cblxuICBnZXRUcmFuc2NyaXB0Q291bnRzKGdlbmVzOiBzdHJpbmdbXSk6IFByb21pc2U8U3BhdGlhbFRyYW5zY3JpcHRDb3VudHM+IHtcbiAgICBjb25zdCBtYW5pZmVzdCA9IHRoaXMucmVxdWlyZU1hbmlmZXN0KCk7XG4gICAgcmV0dXJuIHRoaXMuZ2V0SnNvbjxTcGF0aWFsVHJhbnNjcmlwdENvdW50cz4oXG4gICAgICBgc3BhdGlhbC8ke2VuY29kZVVSSUNvbXBvbmVudChtYW5pZmVzdC5pZCl9L3RyYW5zY3JpcHQtY291bnRzP2dlbmVzPSR7Z2VuZXMubWFwKGVuY29kZVVSSUNvbXBvbmVudCkuam9pbignLCcpfWAsXG4gICAgKTtcbiAgfVxuXG4gIC8qKiBMUlUgb3ZlciB0aWxlIHByb21pc2VzLCBzbyBjb25jdXJyZW50IGFza3Mgc2hhcmUgb25lIHJlcXVlc3QgYW5kIGEgZmFpbHVyZSBpcyBub3Qga2VwdC4gKi9cbiAgcHJpdmF0ZSBjYWNoZWRUaWxlPFQgZXh0ZW5kcyBTcGF0aWFsUG9seWdvblRpbGUgfCBTcGF0aWFsVHJhbnNjcmlwdFRpbGU+KFxuICAgIGtleTogc3RyaW5nLFxuICAgIGxvYWQ6ICgpID0+IFByb21pc2U8VD4sXG4gICk6IFByb21pc2U8VD4ge1xuICAgIGNvbnN0IGhpdCA9IHRoaXMudGlsZUNhY2hlLmdldChrZXkpO1xuICAgIGlmIChoaXQpIHtcbiAgICAgIHRoaXMudGlsZUNhY2hlLmRlbGV0ZShrZXkpO1xuICAgICAgdGhpcy50aWxlQ2FjaGUuc2V0KGtleSwgaGl0KTtcbiAgICAgIHJldHVybiBoaXQgYXMgUHJvbWlzZTxUPjtcbiAgICB9XG4gICAgY29uc3QgZ2VuZXJhdGlvbiA9IHRoaXMuc2VsZWN0aW9uLmN1cnJlbnQoKTtcbiAgICBjb25zdCBwcm9taXNlOiBQcm9taXNlPFQ+ID0gbG9hZCgpLnRoZW4oXG4gICAgICAodGlsZSkgPT4ge1xuICAgICAgICAvLyBTaXplZCBvbmNlIGl0IGxhbmRzLCBhbmQgb25seSB3aGlsZSBpdCBpcyBzdGlsbCB0aGUgZW50cnkgdW5kZXIgaXRzIGtleS5cbiAgICAgICAgaWYgKHRoaXMudGlsZUNhY2hlLmdldChrZXkpID09PSBwcm9taXNlICYmICF0aGlzLnRpbGVCeXRlcy5oYXMoa2V5KSkge1xuICAgICAgICAgIGNvbnN0IGJ5dGVzID0gcGF5bG9hZEJ5dGVzKHRpbGUpO1xuICAgICAgICAgIHRoaXMudGlsZUJ5dGVzLnNldChrZXksIGJ5dGVzKTtcbiAgICAgICAgICB0aGlzLnRpbGVCeXRlc1RvdGFsICs9IGJ5dGVzO1xuICAgICAgICAgIHRoaXMuZXZpY3RUaWxlcygpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aWxlO1xuICAgICAgfSxcbiAgICAgIChlcnIpID0+IHtcbiAgICAgICAgaWYgKHRoaXMudGlsZUNhY2hlLmdldChrZXkpID09PSBwcm9taXNlKSB0aGlzLmRyb3BUaWxlKGtleSk7XG4gICAgICAgIHRocm93IGVycjtcbiAgICAgIH0sXG4gICAgKTtcbiAgICBpZiAoZ2VuZXJhdGlvbi5pc0N1cnJlbnQoKSkge1xuICAgICAgdGhpcy50aWxlQ2FjaGUuc2V0KGtleSwgcHJvbWlzZSk7XG4gICAgICB0aGlzLmV2aWN0VGlsZXMoKTtcbiAgICB9XG4gICAgcmV0dXJuIHByb21pc2U7XG4gIH1cblxuICAvKiogT2xkZXN0IGZpcnN0LCBwYXN0IHRoZSBlbnRyeSBjYXAgb3IgdGhlIGJ5dGUgYnVkZ2V0LCBrZWVwaW5nIHRoZSBuZXdlc3QuICovXG4gIHByaXZhdGUgZXZpY3RUaWxlcygpOiB2b2lkIHtcbiAgICB3aGlsZSAoXG4gICAgICB0aGlzLnRpbGVDYWNoZS5zaXplID4gMSAmJlxuICAgICAgKHRoaXMudGlsZUNhY2hlLnNpemUgPiBTcGF0aWFsRGF0YUh0dHBTZXJ2aWNlLlRJTEVfQ0FDSEVfTElNSVQgfHwgdGhpcy50aWxlQnl0ZXNUb3RhbCA+IHRoaXMudGlsZUNhY2hlQnl0ZXMpXG4gICAgKSB7XG4gICAgICB0aGlzLmRyb3BUaWxlKHRoaXMudGlsZUNhY2hlLmtleXMoKS5uZXh0KCkudmFsdWUhKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGRyb3BUaWxlKGtleTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy50aWxlQ2FjaGUuZGVsZXRlKGtleSk7XG4gICAgdGhpcy50aWxlQnl0ZXNUb3RhbCAtPSB0aGlzLnRpbGVCeXRlcy5nZXQoa2V5KSA/PyAwO1xuICAgIHRoaXMudGlsZUJ5dGVzLmRlbGV0ZShrZXkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSByZWZlcmVuY2Ugdm9sdW1lJ3Mgdm94ZWxzLCBzaW5nbGUtZmxpZ2h0ZWQgbGlrZSB0aGUgcG9seWdvbnMuXG4gICAqXG4gICAqIFZhbGlkYXRlZCBhZ2FpbnN0IHRoZSBtYW5pZmVzdCdzIGRlY2xhcmVkIGRpbWVuc2lvbnMgYmVmb3JlIGl0IGlzIGhhbmRlZFxuICAgKiBiYWNrOiBhIHNob3J0IG9yIGxvbmcgYnVmZmVyIHJlYWQgYXMgYSAzRCB0ZXh0dXJlIGRvZXMgbm90IGZhaWwsIGl0IHNoZWFyc1xuICAgKiB0aGUgYW5hdG9teSBpbnRvIGRpYWdvbmFsIHN0cmVha3MsIGFuZCB0aGF0IGlzIGZhciBoYXJkZXIgdG8gcmVjb2duaXNlIGFzIGFcbiAgICogdHJhbnNwb3J0IHByb2JsZW0gdGhhbiBhbiBlcnJvciBpcy5cbiAgICovXG4gIGdldFZvbHVtZSgpOiBQcm9taXNlPFVpbnQ4QXJyYXk+IHtcbiAgICBjb25zdCBtYW5pZmVzdCA9IHRoaXMucmVxdWlyZU1hbmlmZXN0KCk7XG4gICAgY29uc3QgbWV0YSA9IG1hbmlmZXN0LnZvbHVtZTtcbiAgICBpZiAoIW1ldGEpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoJ1tzcGF0aWFsXSB0aGlzIGRhdGFzZXQgaGFzIG5vIHJlZmVyZW5jZSB2b2x1bWUnKSk7XG4gICAgfVxuICAgIHRoaXMudm9sdW1lUHJvbWlzZSA/Pz0gdGhpcy5nZXRCaW5hcnkoYHNwYXRpYWwvJHtlbmNvZGVVUklDb21wb25lbnQobWFuaWZlc3QuaWQpfS92b2x1bWVgKVxuICAgICAgLnRoZW4oKGJ1ZikgPT4ge1xuICAgICAgICBjb25zdCB3YW50ID0gbWV0YS53aWR0aCAqIG1ldGEuaGVpZ2h0ICogbWV0YS5kZXB0aDtcbiAgICAgICAgaWYgKGJ1Zi5ieXRlTGVuZ3RoICE9PSB3YW50KSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYFtzcGF0aWFsXSB2b2x1bWUgaXMgJHtidWYuYnl0ZUxlbmd0aH0gYnl0ZXMsIGV4cGVjdGVkICR7d2FudH0gYCArXG4gICAgICAgICAgICAgIGAoJHttZXRhLndpZHRofXgke21ldGEuaGVpZ2h0fXgke21ldGEuZGVwdGh9KWAsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoYnVmKTtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICB0aGlzLnZvbHVtZVByb21pc2UgPSBudWxsO1xuICAgICAgICB0aHJvdyBlcnI7XG4gICAgICB9KTtcbiAgICByZXR1cm4gdGhpcy52b2x1bWVQcm9taXNlO1xuICB9XG5cbiAgLy8g4pSA4pSAIGludGVybmFscyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICBwcml2YXRlIHJlcXVpcmVNYW5pZmVzdCgpOiBTcGF0aWFsTWFuaWZlc3Qge1xuICAgIGlmICghdGhpcy5tYW5pZmVzdCB8fCAhdGhpcy5kYXRhc2V0JC52YWx1ZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdbc3BhdGlhbF0gbm8gZGF0YXNldCBzZWxlY3RlZCDigJQgY2FsbCBzZWxlY3REYXRhc2V0KCkgZmlyc3QnKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMubWFuaWZlc3Q7XG4gIH1cblxuICAvKipcbiAgICogQ2FjaGUgKyBzaW5nbGUtZmxpZ2h0IGFyb3VuZCBhIHZlY3RvciBmZXRjaC5cbiAgICpcbiAgICogS2V5cyBhcmUgTE9HSUNBTCDigJQgYGZlYXR1cmU6R0FQREhgLCBub3QgYDxkYXRhc2V0Pi9mZWF0dXJlOkdBUERIYCDigJQgYmVjYXVzZSBgY2xlYXIoKWBcbiAgICogZW1wdGllcyB0aGUgbWFwcyBvbiBldmVyeSBzd2l0Y2gsIHNvIHR3byBkYXRhc2V0cyBuZXZlciBob2xkIGVudHJpZXMgYXQgb25jZS4gV2hhdFxuICAgKiB0aGF0IGRvZXMgbm90IGNvdmVyIGlzIGEgcmVxdWVzdCBzdGlsbCBpbiB0aGUgYWlyIHdoZW4gdGhlIHN3aXRjaCBoYXBwZW5zOiBgY2xlYXIoKWBcbiAgICogY2Fubm90IGNhbmNlbCBhbiBIVFRQIGNhbGwsIHNvIGEgdmVjdG9yIGZldGNoZWQgZm9yIGRhdGFzZXQgQSBjYW4gcmVzb2x2ZSBhZnRlciBCIGhhc1xuICAgKiBiZWVuIHNlbGVjdGVkIGFuZCB3cml0ZSBpdHNlbGYgaW50byBCJ3MgY2FjaGUgdW5kZXIgYSBrZXkgQiB3b3VsZCByZWFkLiBCb3RoIGRhdGFzZXRzXG4gICAqIGhhdmluZyBhIGdlbmUgb2YgdGhhdCBuYW1lIGlzIHRoZSBjb21tb24gY2FzZSwgbm90IHRoZSB1bmx1Y2t5IG9uZSwgYW5kIHRoZSByZXN1bHQgaXNcbiAgICogYSBwbG90IG9mIEEncyBleHByZXNzaW9uIG92ZXIgQidzIGNlbGxzIOKAlCB3aGljaCBsb29rcyBsaWtlIGRhdGEsIG5vdCBsaWtlIGEgZmF1bHQuXG4gICAqXG4gICAqIFNvIHRoZSBnZW5lcmF0aW9uIGlzIGNoZWNrZWQgYWZ0ZXIgdGhlIGF3YWl0LCBhbmQgdGhlIGluLWZsaWdodCBzbG90IGlzIGNsZWFyZWQgb25seVxuICAgKiB3aGVuIHRoZSBwcm9taXNlIHN0aWxsIHNpdHRpbmcgaW4gaXQgaXMgdGhpcyBvbmU6IGEgbGF0ZSBhcnJpdmFsIG11c3Qgbm90IGV2aWN0IHRoZVxuICAgKiBlbnRyeSBhIG5ld2VyIHJlcXVlc3QgZm9yIHRoZSBzYW1lIGtleSBpcyBhbHJlYWR5IHNoYXJpbmcuXG4gICAqL1xuICBwcml2YXRlIGZldGNoQ2FjaGVkKGtleTogc3RyaW5nLCBsb2FkOiAoKSA9PiBQcm9taXNlPENhY2hlZFBheWxvYWQ+KTogUHJvbWlzZTxDYWNoZWRQYXlsb2FkPiB7XG4gICAgY29uc3QgaGl0ID0gdGhpcy5jYWNoZS5nZXQoa2V5KTtcbiAgICBpZiAoaGl0KSB7XG4gICAgICAvLyBSZS1pbnNlcnQgdG8gbWFyayBtb3N0LXJlY2VudGx5LXVzZWQgKE1hcCBwcmVzZXJ2ZXMgaW5zZXJ0aW9uIG9yZGVyKS5cbiAgICAgIHRoaXMuY2FjaGUuZGVsZXRlKGtleSk7XG4gICAgICB0aGlzLmNhY2hlLnNldChrZXksIGhpdCk7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGhpdC52YWx1ZSk7XG4gICAgfVxuICAgIGNvbnN0IHBlbmRpbmcgPSB0aGlzLmluRmxpZ2h0LmdldChrZXkpO1xuICAgIGlmIChwZW5kaW5nKSByZXR1cm4gcGVuZGluZztcblxuICAgIGNvbnN0IGdlbmVyYXRpb24gPSB0aGlzLnNlbGVjdGlvbi5jdXJyZW50KCk7XG4gICAgY29uc3QgcHJvbWlzZTogUHJvbWlzZTxDYWNoZWRQYXlsb2FkPiA9IGxvYWQoKVxuICAgICAgLnRoZW4oKHZhbHVlKSA9PiB7XG4gICAgICAgIC8vIFN0aWxsIHJldHVybmVkIHRvIHRoZSBjYWxsZXIgdGhhdCBhc2tlZDogaXQgbWF5IHdlbGwgYmUgYSBjb21wb25lbnQgdGhhdCBpc1xuICAgICAgICAvLyBpdHNlbGYgYmVpbmcgdG9ybiBkb3duLCBhbmQgcmVqZWN0aW5nIGhlcmUgd291bGQgc3VyZmFjZSBhIHN3aXRjaCBhcyBhbiBlcnJvci5cbiAgICAgICAgLy8gV2hhdCBtdXN0IG5vdCBoYXBwZW4gaXMgdGhlIHZhbHVlIGJlaW5nIGtlcHQgZm9yIHdob2V2ZXIgY29tZXMgbmV4dC5cbiAgICAgICAgaWYgKGdlbmVyYXRpb24uaXNDdXJyZW50KCkpIHtcbiAgICAgICAgICB0aGlzLnVuY2FjaGUoa2V5KTtcbiAgICAgICAgICBjb25zdCBieXRlcyA9IHBheWxvYWRCeXRlcyh2YWx1ZSk7XG4gICAgICAgICAgdGhpcy5jYWNoZS5zZXQoa2V5LCB7IHZhbHVlLCBieXRlcyB9KTtcbiAgICAgICAgICB0aGlzLmNhY2hlZEJ5dGVzICs9IGJ5dGVzO1xuICAgICAgICAgIHRoaXMuZXZpY3QoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICB9KVxuICAgICAgLmZpbmFsbHkoKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5pbkZsaWdodC5nZXQoa2V5KSA9PT0gcHJvbWlzZSkgdGhpcy5pbkZsaWdodC5kZWxldGUoa2V5KTtcbiAgICAgIH0pO1xuICAgIHRoaXMuaW5GbGlnaHQuc2V0KGtleSwgcHJvbWlzZSk7XG4gICAgcmV0dXJuIHByb21pc2U7XG4gIH1cblxuICAvKiogT2xkZXN0IGZpcnN0LCBwYXN0IHRoZSBlbnRyeSBjYXAgb3IgdGhlIGJ5dGUgYnVkZ2V0LCBrZWVwaW5nIHRoZSBuZXdlc3QuICovXG4gIHByaXZhdGUgZXZpY3QoKTogdm9pZCB7XG4gICAgd2hpbGUgKFxuICAgICAgdGhpcy5jYWNoZS5zaXplID4gMSAmJlxuICAgICAgKHRoaXMuY2FjaGUuc2l6ZSA+IFNwYXRpYWxEYXRhSHR0cFNlcnZpY2UuQ0FDSEVfTElNSVQgfHwgdGhpcy5jYWNoZWRCeXRlcyA+IHRoaXMuY2FjaGVCeXRlcylcbiAgICApIHtcbiAgICAgIHRoaXMudW5jYWNoZSh0aGlzLmNhY2hlLmtleXMoKS5uZXh0KCkudmFsdWUhKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHVuY2FjaGUoa2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBlbnRyeSA9IHRoaXMuY2FjaGUuZ2V0KGtleSk7XG4gICAgaWYgKCFlbnRyeSkgcmV0dXJuO1xuICAgIHRoaXMuY2FjaGUuZGVsZXRlKGtleSk7XG4gICAgdGhpcy5jYWNoZWRCeXRlcyAtPSBlbnRyeS5ieXRlcztcbiAgfVxuXG4gIHByaXZhdGUgZ2V0SnNvbjxUPihwYXRoOiBzdHJpbmcpOiBQcm9taXNlPFQ+IHtcbiAgICByZXR1cm4gZmlyc3RWYWx1ZUZyb20odGhpcy5odHRwLmdldDxUPihgJHt0aGlzLmJhc2VVcmx9JHtwYXRofWApLnBpcGUodGltZW91dCh0aGlzLnRpbWVvdXRNcykpKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0QmluYXJ5KHBhdGg6IHN0cmluZyk6IFByb21pc2U8QXJyYXlCdWZmZXI+IHtcbiAgICByZXR1cm4gZmlyc3RWYWx1ZUZyb20oXG4gICAgICB0aGlzLmh0dHAuZ2V0KGAke3RoaXMuYmFzZVVybH0ke3BhdGh9YCwgeyByZXNwb25zZVR5cGU6ICdhcnJheWJ1ZmZlcicgfSkucGlwZSh0aW1lb3V0KHRoaXMudGltZW91dE1zKSksXG4gICAgKTtcbiAgfVxufVxuIl19
|
|
522
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BhdGlhbC1kYXRhLWh0dHAuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvaW1wbGVtZW50YXRpb25zL3NwYXRpYWwtZGF0YS1odHRwL3NwYXRpYWwtZGF0YS1odHRwLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBcUIsTUFBTSxzQkFBc0IsQ0FBQztBQUNyRSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ3JDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLGVBQWUsRUFBYyxjQUFjLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDbkUsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXpDLE9BQU8sRUFBRSxTQUFTLEVBQXdDLE1BQU0seUNBQXlDLENBQUM7QUFDMUcsT0FBTyxFQVlMLGNBQWMsR0FDZixNQUFNLDBDQUEwQyxDQUFDO0FBQ2xELE9BQU8sRUFHTCxxQkFBcUIsRUFDckIsbUJBQW1CLEVBQ25CLFlBQVksRUFDWixZQUFZLEVBQ1osYUFBYSxFQUNiLGVBQWUsRUFDZixtQkFBbUIsRUFDbkIsaUJBQWlCLEVBQ2pCLGNBQWMsRUFDZCxZQUFZLEVBQ1osb0JBQW9CLEdBQ3JCLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFFOUUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQzVELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQzs7O0FBRWpEOzs7OztHQUtHO0FBQ0gsTUFBTSxPQUFPLGVBQWdCLFNBQVEsS0FBSztJQUN4QyxZQUFZLEVBQVU7UUFDcEIsS0FBSyxDQUFDLDJCQUEyQixFQUFFLGlDQUFpQyxDQUFDLENBQUM7UUFDdEUs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WUFBWSxFQUFFLGFBQWEsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FDdkcsQ0FBQztJQUNKLENBQUM7OEdBNWhCVSxzQkFBc0I7a0hBQXRCLHNCQUFzQjs7MkZBQXRCLHNCQUFzQjtrQkFEbEMsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEh0dHBDbGllbnQsIEh0dHBFcnJvclJlc3BvbnNlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgTHJ1Q2FjaGUgfSBmcm9tICduYXBhcmktanMnO1xuaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlLCBmaXJzdFZhbHVlRnJvbSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgdGltZW91dCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgQUxMX0dFTkVTLCBTcGF0aWFsRGF0YVBvcnQsIFRyYW5zY3JpcHRUaWxlUXVlcnkgfSBmcm9tICcuLi8uLi9jb250cmFjdHMvcG9ydHMvc3BhdGlhbC1kYXRhLnBvcnQnO1xuaW1wb3J0IHtcbiAgU3BhdGlhbENvbHVtbixcbiAgU3BhdGlhbERhdGFzZXQsXG4gIFNwYXRpYWxEZW5zaXR5UmFzdGVyLFxuICBTcGF0aWFsRW1iZWRkaW5nLFxuICBTcGF0aWFsUG9seWdvblRpbGUsXG4gIFNwYXRpYWxQb2x5Z29ucyxcbiAgQ2F0ZWdvcmljYWxDb2x1bW5NZXRhLFxuICBTcGF0aWFsTWFya2VyR2VuZXMsXG4gIFNwYXRpYWxUcmFuc2NyaXB0Q291bnRzLFxuICBTcGF0aWFsVHJhbnNjcmlwdFN1bW1hcnksXG4gIFNwYXRpYWxUcmFuc2NyaXB0VGlsZSxcbiAgZmluZENvbHVtbk1ldGEsXG59IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9zcGF0aWFsLWRhdGFzZXQuY29udHJhY3QnO1xuaW1wb3J0IHtcbiAgU3BhdGlhbERhdGFzZXRTdW1tYXJ5LFxuICBTcGF0aWFsTWFuaWZlc3QsXG4gIGFzc2VydE1hbmlmZXN0VmVyc2lvbixcbiAgZGF0YXNldEZyb21NYW5pZmVzdCxcbiAgZGVjb2RlQ29sdW1uLFxuICBkZWNvZGVDb29yZHMsXG4gIGRlY29kZURlbnNpdHksXG4gIGRlY29kZUVtYmVkZGluZyxcbiAgZGVjb2RlRmVhdHVyZVZlY3RvcixcbiAgZGVjb2RlUG9seWdvblRpbGUsXG4gIGRlY29kZVBvbHlnb25zLFxuICBkZWNvZGVSYWRpdXMsXG4gIGRlY29kZVRyYW5zY3JpcHRUaWxlLFxufSBmcm9tICcuL3NwYXRpYWwtd2lyZSc7XG5pbXBvcnQgeyBvcGVuSHR0cFJlZ2lvblNvdXJjZSB9IGZyb20gJy4uLy4uL3JlZ2lvbi1zb3VyY2UvaHR0cC1yZWdpb24tc291cmNlJztcbmltcG9ydCB0eXBlIHsgUmVnaW9uU291cmNlIH0gZnJvbSAnLi4vLi4vcmVnaW9uLXNvdXJjZS9yZWdpb24tc291cmNlJztcbmltcG9ydCB7IHNlYXJjaEdlbmVOYW1lcyB9IGZyb20gJy4uLy4uL3NwYXRpYWwvZ2VuZS1zZWFyY2gnO1xuaW1wb3J0IHsgU3VwZXJzZWRlIH0gZnJvbSAnLi4vLi4vdXRpbC9zdXBlcnNlZGUnO1xuXG4vKipcbiAqIEEgZGF0YXNldCBzZWxlY3Rpb24gdGhhdCBhIG5ld2VyIHNlbGVjdGlvbiAob3IgYSBgY2xlYXJgKSBvdmVydG9vay5cbiAqXG4gKiBUaHJvd24gcmF0aGVyIHRoYW4gcmVzb2x2ZWQgc28gYSBjYWxsZXIgY2Fubm90IG1pc3Rha2UgaXQgZm9yIFwidGhpcyBkYXRhc2V0IGlzXG4gKiBub3cgbG9hZGVkXCI6IG5vdGhpbmcgd2FzIHB1Ymxpc2hlZCwgb24gcHVycG9zZS5cbiAqL1xuZXhwb3J0IGNsYXNzIFN1cGVyc2VkZWRFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IoaWQ6IHN0cmluZykge1xuICAgIHN1cGVyKGBbc3BhdGlhbF0gc2VsZWN0aW9uIG9mIFwiJHtpZH1cIiB3YXMgc3VwZXJzZWRlZCBieSBhIG5ld2VyIG9uZWApO1xuICAgIHRoaXMubmFtZSA9ICdTdXBlcnNlZGVkRXJyb3InO1xuICB9XG59XG5cbi8qKlxuICogV2hhdCB0aGUgTFJVIGNhbiBob2xkLiBPbmUgYWxpYXMgcmF0aGVyIHRoYW4gYSB1bmlvbiByZXBlYXRlZCBhdCBlYWNoIHVzZSwgc28gYWRkaW5nIGEgcGF5bG9hZFxuICoga2luZCBpcyBhIHNpbmdsZSBlZGl0IGluc3RlYWQgb2YgZm91ciB0aGF0IGNhbiBkcmlmdCBhcGFydC5cbiAqL1xudHlwZSBDYWNoZWRQYXlsb2FkID0gU3BhdGlhbENvbHVtbiB8IEZsb2F0MzJBcnJheSB8IFNwYXRpYWxFbWJlZGRpbmcgfCBTcGF0aWFsRGVuc2l0eVJhc3RlcjtcblxuLyoqXG4gKiBCeXRlcyBhIGRlY29kZWQgcGF5bG9hZCBob2xkczogaXRzIG93biB0eXBlZC1hcnJheSB2aWV3cywgb25lIGxldmVsIGRlZXAg4oCUIGV2ZXJ5XG4gKiBwYXlsb2FkIGhlcmUgaXMgYSB0eXBlZCBhcnJheSBvciBhIGZsYXQgcmVjb3JkIG9mIHRoZW0uXG4gKi9cbmZ1bmN0aW9uIHBheWxvYWRCeXRlcyh2YWx1ZTogdW5rbm93bik6IG51bWJlciB7XG4gIGlmIChBcnJheUJ1ZmZlci5pc1ZpZXcodmFsdWUpKSByZXR1cm4gdmFsdWUuYnl0ZUxlbmd0aDtcbiAgbGV0IGJ5dGVzID0gMDtcbiAgaWYgKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHtcbiAgICBmb3IgKGNvbnN0IHYgb2YgT2JqZWN0LnZhbHVlcyh2YWx1ZSkpIGlmIChBcnJheUJ1ZmZlci5pc1ZpZXcodikpIGJ5dGVzICs9IHYuYnl0ZUxlbmd0aDtcbiAgfVxuICByZXR1cm4gYnl0ZXM7XG59XG5cbmNvbnN0IE1pQiA9IDEwMjQgKiAxMDI0O1xuXG4vKipcbiAqIFJlZmVyZW5jZSB7QGxpbmsgU3BhdGlhbERhdGFQb3J0fSBhZGFwdGVyIGZvciB0aGUgd2lyZSBmb3JtYXQgdGhlIGJ1bmRsZWRcbiAqIGV4YW1wbGUgc2VydmVyIHNwZWFrcyAoc2VlIGBzcGF0aWFsLXdpcmUudHNgIGFuZFxuICogYGV4YW1wbGVzL3RpbGUtc2VydmVyL2xpYi9zcGF0aWFsLm1qc2ApLlxuICpcbiAqIE9QVElPTkFMIEFORCBVTkJPVU5EIEJZIERFRkFVTFQg4oCUIHRoaXMgc2VydmljZSBpcyBgQEluamVjdGFibGUoKWAgd2l0aG91dFxuICogYHByb3ZpZGVkSW5gLCBzbyBub3RoaW5nIGdldHMgaXQgdW5sZXNzIGEgaG9zdCBleHBsaWNpdGx5IHByb3ZpZGVzIGl0OlxuICpcbiAqIGBgYHRzXG4gKiBwcm92aWRlcnM6IFtcbiAqICAgU3BhdGlhbERhdGFIdHRwU2VydmljZSxcbiAqICAgeyBwcm92aWRlOiBTUEFUSUFMX0RBVEFfUE9SVCwgdXNlRXhpc3Rpbmc6IFNwYXRpYWxEYXRhSHR0cFNlcnZpY2UgfSxcbiAqIF1cbiAqIGBgYFxuICpcbiAqIFRoYXQgbWlycm9ycyBgQ2VsbHBvc2VTZWdtZW50ZXJTZXJ2aWNlYDogYSBjb25jcmV0ZSBpbXBsZW1lbnRhdGlvbiB0aGVcbiAqIGxpYnJhcnkgc2hpcHMgZm9yIGNvbnZlbmllbmNlLCBub3QgYSBkZWZhdWx0IHRoZSBwb3J0IGludmVyc2lvbiBpcyBxdWlldGx5XG4gKiBnaXZpbmcgdXAgb24uIEEgaG9zdCB3aXRoIGl0cyBvd24gYmFja2VuZCBpbXBsZW1lbnRzIGBTcGF0aWFsRGF0YVBvcnRgXG4gKiBkaXJlY3RseSBhbmQgbmV2ZXIgdG91Y2hlcyB0aGlzIGNsYXNzLlxuICpcbiAqIFJlcXVlc3RzIGdvIHRocm91Z2ggQW5ndWxhcidzIGBIdHRwQ2xpZW50YCAobm90IGBmZXRjaGApIHNvIHRoZSBob3N0J3NcbiAqIGludGVyY2VwdG9ycyDigJQgYXV0aCBoZWFkZXJzIGFib3ZlIGFsbCDigJQgYXBwbHksIG1hdGNoaW5nIGB0aWxlLWNsaWVudC50c2AuXG4gKi9cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBTcGF0aWFsRGF0YUh0dHBTZXJ2aWNlIGltcGxlbWVudHMgU3BhdGlhbERhdGFQb3J0IHtcbiAgLyoqIFNlcnZlciByb290LCBub3JtYWxpc2VkIHRvIGVuZCB3aXRoIGV4YWN0bHkgb25lIGAvYC4gKi9cbiAgcHJpdmF0ZSBiYXNlVXJsID0gJyc7XG4gIC8qKiBQZXItcmVxdWVzdCBjZWlsaW5nLiBWZWN0b3JzIGFyZSBzbWFsbDsgYSBodW5nIHJlcXVlc3Qgc2hvdWxkIG5vdCB3ZWRnZVxuICAgKiAgdGhlIHBpY2tlci4gKi9cbiAgcHJpdmF0ZSB0aW1lb3V0TXMgPSAzMF8wMDA7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBkYXRhc2V0JCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8U3BhdGlhbERhdGFzZXQgfCBudWxsPihudWxsKTtcbiAgcHJpdmF0ZSBtYW5pZmVzdDogU3BhdGlhbE1hbmlmZXN0IHwgbnVsbCA9IG51bGw7XG4gIC8qKiBBZHZhbmNlZCBieSBldmVyeSBgc2VsZWN0RGF0YXNldGAgYW5kIGV2ZXJ5IGBjbGVhcmAsIHNvIGEgc2VsZWN0aW9uIHRoYXRcbiAgICogIGZpbmlzaGVzIGFmdGVyIGEgbmV3ZXIgaW50ZW50IGNhbiB0ZWxsIGFuZCBkcm9wIHdoYXQgaXQgZmV0Y2hlZC4gQ2FjaGUgZmlsbHNcbiAgICogIHRha2UgYSB7QGxpbmsgU3VwZXJzZWRlLmN1cnJlbnQgc25hcHNob3R9IG9mIGl0LCBzbyBhIHZlY3RvciBvciB0aWxlIHRoYXQgbGFuZHNcbiAgICogIGFmdGVyIGEgc3dpdGNoIGlzIHJldHVybmVkIHRvIGl0cyBjYWxsZXIgYnV0IG5ldmVyIGtlcHQgZm9yIHRoZSBuZXh0IGRhdGFzZXQuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgc2VsZWN0aW9uID0gbmV3IFN1cGVyc2VkZSgpO1xuXG4gIC8qKlxuICAgKiBMb2FkZWQgdmVjdG9ycywga2V5ZWQgYGNvbHVtbjo8bmFtZT5gIC8gYGZlYXR1cmU6PG5hbWU+YC4gQm91bmRlZCBMUlU6XG4gICAqIGNvbG91cmluZyBieSBjbHVzdGVyIOKGkiBieSBhIGdlbmUg4oaSIGJhY2sgYnkgY2x1c3RlciBtdXN0IG5vdCByZWZldGNoLCBidXQgYW5cbiAgICogYWZ0ZXJub29uIG9mIGJyb3dzaW5nIGdlbmVzIG11c3Qgbm90IGdyb3cgd2l0aG91dCBsaW1pdCBlaXRoZXIuXG4gICAqXG4gICAqIEJvdW5kZWQgYnkgQllURVMgYXMgd2VsbCBhcyBlbnRyaWVzOiBvbmUgdmVjdG9yIGlzIGA0wrdOYCBieXRlcyDigJQgMiBNQiBhdCA1MDBrXG4gICAqIGNlbGxzLCBidXQgMTQuOCBNQiBhdCAzLjdNLCB3aGVyZSAzMiBlbnRyaWVzIChhbiBlbWJlZGRpbmcgaXMgdHdvIG9yIHRocmVlXG4gICAqIHZlY3RvcnMpIGNvdWxkIHBpbiBjbG9zZSB0byBoYWxmIGEgZ2lnYWJ5dGUuXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGNhY2hlID0gbmV3IE1hcDxzdHJpbmcsIHsgdmFsdWU6IENhY2hlZFBheWxvYWQ7IGJ5dGVzOiBudW1iZXIgfT4oKTtcbiAgcHJpdmF0ZSBjYWNoZWRCeXRlcyA9IDA7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IENBQ0hFX0xJTUlUID0gMzI7XG4gIHByaXZhdGUgY2FjaGVCeXRlcyA9IDI1NiAqIE1pQjtcblxuICAvKiogSW4tZmxpZ2h0IHJlcXVlc3RzLCBzbyBkb3VibGUtY2xpY2tpbmcgYSBnZW5lIGlzc3VlcyBvbmUgZmV0Y2guICovXG4gIHByaXZhdGUgcmVhZG9ubHkgaW5GbGlnaHQgPSBuZXcgTWFwPHN0cmluZywgUHJvbWlzZTxDYWNoZWRQYXlsb2FkPj4oKTtcblxuICAvKipcbiAgICogVGlsZXMgZ2V0IHRoZWlyIG93biwgbGFyZ2VyIGNhY2hlOiBwYW5uaW5nIHJldmlzaXRzIHRoZW0gY29uc3RhbnRseSwgYW5kIG9uZSBzY3JlZW5cbiAgICogb2YgYSB6b29tZWQtb3V0IHNlY3Rpb24gaXMgZG96ZW5zIG9mIHRoZW0g4oCUIGZhciBwYXN0IHRoZSB2ZWN0b3IgY2FjaGUncyBsaW1pdC5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgdGlsZUNhY2hlID0gbmV3IE1hcDxzdHJpbmcsIFByb21pc2U8U3BhdGlhbFBvbHlnb25UaWxlIHwgU3BhdGlhbFRyYW5zY3JpcHRUaWxlPj4oKTtcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgVElMRV9DQUNIRV9MSU1JVCA9IDM4NDtcbiAgLyoqIEJ5dGVzIG9mIGVhY2ggUkVTT0xWRUQgdGlsZSBpbiB7QGxpbmsgdGlsZUNhY2hlfTsgYSBwZW5kaW5nIG9uZSBjb3VudHMgb25jZSBpdCBsYW5kcy4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSB0aWxlQnl0ZXMgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuICBwcml2YXRlIHRpbGVCeXRlc1RvdGFsID0gMDtcbiAgcHJpdmF0ZSB0aWxlQ2FjaGVCeXRlcyA9IDEyOCAqIE1pQjtcblxuICBwcml2YXRlIHZvbHVtZVByb21pc2U6IFByb21pc2U8VWludDhBcnJheT4gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBwb2x5Z29uc1Byb21pc2U6IFByb21pc2U8U3BhdGlhbFBvbHlnb25zPiB8IG51bGwgPSBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgaHR0cDogSHR0cENsaWVudCkge31cblxuICAvLyDilIDilIAgY29uZmlndXJhdGlvbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKipcbiAgICogUG9pbnQgdGhlIGFkYXB0ZXIgYXQgYSBzZXJ2ZXIuIENsZWFycyBhbnkgbG9hZGVkIGRhdGFzZXQuXG4gICAqXG4gICAqIGBjYWNoZUJ5dGVzYCAvIGB0aWxlQ2FjaGVCeXRlc2AgY2FwIHRoZSBkZWNvZGVkIHZlY3RvcnMgKGRlZmF1bHQgMjU2IE1pQikgYW5kIHRpbGVzXG4gICAqIChkZWZhdWx0IDEyOCBNaUIpIGtlcHQgZm9yIHJldXNlOyB0aGUgbW9zdCByZWNlbnQgZW50cnkgaXMgYWx3YXlzIGtlcHQuXG4gICAqL1xuICBjb25maWd1cmUob3B0aW9uczogeyBiYXNlVXJsOiBzdHJpbmc7IHRpbWVvdXRNcz86IG51bWJlcjsgY2FjaGVCeXRlcz86IG51bWJlcjsgdGlsZUNhY2hlQnl0ZXM/OiBudW1iZXIgfSk6IHZvaWQge1xuICAgIGNvbnN0IHJhdyA9IG9wdGlvbnMuYmFzZVVybCA/PyAnJztcbiAgICB0aGlzLmJhc2VVcmwgPSByYXcuZW5kc1dpdGgoJy8nKSA/IHJhdyA6IGAke3Jhd30vYDtcbiAgICBpZiAob3B0aW9ucy50aW1lb3V0TXMgIT09IHVuZGVmaW5lZCkgdGhpcy50aW1lb3V0TXMgPSBvcHRpb25zLnRpbWVvdXRNcztcbiAgICBpZiAob3B0aW9ucy5jYWNoZUJ5dGVzICE9PSB1bmRlZmluZWQpIHRoaXMuY2FjaGVCeXRlcyA9IG9wdGlvbnMuY2FjaGVCeXRlcztcbiAgICBpZiAob3B0aW9ucy50aWxlQ2FjaGVCeXRlcyAhPT0gdW5kZWZpbmVkKSB0aGlzLnRpbGVDYWNoZUJ5dGVzID0gb3B0aW9ucy50aWxlQ2FjaGVCeXRlcztcbiAgICB0aGlzLmNsZWFyKCk7XG4gIH1cblxuICAvKiogRGF0YXNldHMgdGhpcyBzZXJ2ZXIgb2ZmZXJzLCBmb3IgYSBob3N0LXNpZGUgcGlja2VyLiAqL1xuICBsaXN0RGF0YXNldHMoKTogUHJvbWlzZTxTcGF0aWFsRGF0YXNldFN1bW1hcnlbXT4ge1xuICAgIHJldHVybiB0aGlzLmdldEpzb248eyBkYXRhc2V0czogU3BhdGlhbERhdGFzZXRTdW1tYXJ5W10gfT4oJ3NwYXRpYWwvZGF0YXNldHMnKS50aGVuKChyKSA9PiByLmRhdGFzZXRzID8/IFtdKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPbmUgZGF0YXNldCdzIG1hbmlmZXN0LCBXSVRIT1VUIHNlbGVjdGluZyBpdC4gTGV0cyBhIGhvc3QgaW5zcGVjdCB3aGF0IGFcbiAgICogc2VydmVyIG9mZmVycyDigJQgY29sdW1uIGFuZCBmZWF0dXJlIG1ldGFkYXRhLCBhbmQgd2hpY2ggaW1hZ2UgYSBkYXRhc2V0XG4gICAqIHJlZ2lzdGVycyBvbnRvIOKAlCB3aGlsZSBidWlsZGluZyBhIHBpY2tlciwgcmF0aGVyIHRoYW4gaGF2aW5nIHRvIGxvYWQgZWFjaFxuICAgKiBkYXRhc2V0IHRvIGZpbmQgb3V0LlxuICAgKi9cbiAgcmVhZE1hbmlmZXN0KGlkOiBzdHJpbmcpOiBQcm9taXNlPFNwYXRpYWxNYW5pZmVzdD4ge1xuICAgIHJldHVybiB0aGlzLmdldEpzb248U3BhdGlhbE1hbmlmZXN0Pihgc3BhdGlhbC8ke2VuY29kZVVSSUNvbXBvbmVudChpZCl9L21hbmlmZXN0YCkudGhlbigobWFuaWZlc3QpID0+IHtcbiAgICAgIGFzc2VydE1hbmlmZXN0VmVyc2lvbihtYW5pZmVzdCk7XG4gICAgICByZXR1cm4gbWFuaWZlc3Q7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogTG9hZCBhIGRhdGFzZXQgYW5kIHB1Ymxpc2ggaXQgb24ge0BsaW5rIGdldERhdGFzZXQkfS4gRmV0Y2hlcyB0aGUgbWFuaWZlc3QsXG4gICAqIHRoZW4sIGluIHBhcmFsbGVsLCB0aGUgdmVjdG9ycyB0aGF0IGFyZSBhbHdheXMgbmVlZGVkIChjb29yZGluYXRlcywgYW5kXG4gICAqIGlkcy9yYWRpdXMgd2hlbiB0aGUgbWFuaWZlc3Qgc2F5cyB0aGV5IGV4aXN0KSDigJQgbm90aGluZyBlbHNlLlxuICAgKi9cbiAgYXN5bmMgc2VsZWN0RGF0YXNldChpZDogc3RyaW5nKTogUHJvbWlzZTxTcGF0aWFsRGF0YXNldD4ge1xuICAgIHRoaXMuY2xlYXIoKTtcbiAgICAvLyBTZWxlY3Rpb25zIGFyZSBTRVFVRU5DRUQ6IHRoaXMgaXMgdHdvIGF3YWl0cyBkZWVwLCBzbyBhIHNsb3dlciBlYXJsaWVyXG4gICAgLy8gY2FsbCB3b3VsZCBvdGhlcndpc2UgYXNzaWduIGB0aGlzLm1hbmlmZXN0YCBvciBwdWJsaXNoIGl0cyBkYXRhc2V0IGFmdGVyIGFcbiAgICAvLyBsYXRlciBvbmUg4oCUIGxlYXZpbmcgdGhlIG1hbmlmZXN0IGFuZCB0aGUgb2JzZXJ2YXRpb25zIGZyb20gdHdvIGRpZmZlcmVudFxuICAgIC8vIGRhdGFzZXRzLCB3aGljaCBpcyB3b3JzZSB0aGFuIGVpdGhlciBiZWluZyBsYXRlLlxuICAgIGNvbnN0IHRhc2sgPSB0aGlzLnNlbGVjdGlvbi5uZXh0KCk7XG4gICAgY29uc3Qgc3VwZXJzZWRlZCA9ICgpID0+ICF0YXNrLmlzQ3VycmVudCgpO1xuICAgIGNvbnN0IHBhdGggPSBgc3BhdGlhbC8ke2VuY29kZVVSSUNvbXBvbmVudChpZCl9YDtcblxuICAgIGNvbnN0IG1hbmlmZXN0ID0gYXdhaXQgdGhpcy5nZXRKc29uPFNwYXRpYWxNYW5pZmVzdD4oYCR7cGF0aH0vbWFuaWZlc3RgKTtcbiAgICBhc3NlcnRNYW5pZmVzdFZlcnNpb24obWFuaWZlc3QpO1xuICAgIGlmIChzdXBlcnNlZGVkKCkpIHRocm93IG5ldyBTdXBlcnNlZGVkRXJyb3IoaWQpO1xuICAgIHRoaXMubWFuaWZlc3QgPSBtYW5pZmVzdDtcblxuICAgIC8vIEluZGVwZW5kZW50IG9mIGVhY2ggb3RoZXIsIHNvIHJlcXVlc3RlZCB0b2dldGhlcjogdGltZSB0byBmaXJzdCBwYWludCBpcyB0aGVcbiAgICAvLyBzbG93ZXN0IG9mIHRoZW0sIG5vdCB0aGVpciBzdW0gKHRoZSBpZHMgSlNPTiBhbG9uZSBpcyB0ZW5zIG9mIE1CIG9uIGEgbGFyZ2UgZGF0YXNldCkuXG4gICAgY29uc3QgW2Nvb3Jkc0J1ZiwgaWRzLCByYWRpdXNCdWZdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgdGhpcy5nZXRCaW5hcnkoYCR7cGF0aH0vY29vcmRzYCksXG4gICAgICBtYW5pZmVzdC5oYXNJZHMgPyB0aGlzLmdldEpzb248eyBpZHM6IHN0cmluZ1tdIH0+KGAke3BhdGh9L2lkc2ApLnRoZW4oKHIpID0+IHIuaWRzKSA6IHVuZGVmaW5lZCxcbiAgICAgIG1hbmlmZXN0LnJhZGl1cz8ubW9kZSA9PT0gJ3Blci1vYnNlcnZhdGlvbicgPyB0aGlzLmdldEJpbmFyeShgJHtwYXRofS9yYWRpdXNgKSA6IHVuZGVmaW5lZCxcbiAgICBdKTtcbiAgICBpZiAoc3VwZXJzZWRlZCgpKSB0aHJvdyBuZXcgU3VwZXJzZWRlZEVycm9yKGlkKTtcbiAgICBjb25zdCBjb29yZHMgPSBkZWNvZGVDb29yZHMoY29vcmRzQnVmLCBtYW5pZmVzdC5jb3VudCwgISFtYW5pZmVzdC5oYXNaKTtcbiAgICBjb25zdCByYWRpdXMgPSByYWRpdXNCdWYgPyBkZWNvZGVSYWRpdXMocmFkaXVzQnVmLCBtYW5pZmVzdC5jb3VudCkgOiB1bmRlZmluZWQ7XG5cbiAgICBjb25zdCBkYXRhc2V0ID0gZGF0YXNldEZyb21NYW5pZmVzdChtYW5pZmVzdCwgY29vcmRzLCB7IGlkcywgcmFkaXVzIH0pO1xuICAgIHRoaXMuZGF0YXNldCQubmV4dChkYXRhc2V0KTtcbiAgICByZXR1cm4gZGF0YXNldDtcbiAgfVxuXG4gIC8qKiBEcm9wIHRoZSBsb2FkZWQgZGF0YXNldCBhbmQgZXZlcnkgY2FjaGVkIHZlY3Rvci4gKi9cbiAgY2xlYXIoKTogdm9pZCB7XG4gICAgLy8gQSBjbGVhciBpcyBpdHNlbGYgdGhlIG5ld2VzdCBpbnRlbnQsIHNvIGl0IHN1cGVyc2VkZXMgYW55IHNlbGVjdGlvbiBzdGlsbFxuICAgIC8vIGluIGZsaWdodCByYXRoZXIgdGhhbiBsZXR0aW5nIG9uZSBsYW5kIGFmdGVyd2FyZHMuXG4gICAgdGhpcy5zZWxlY3Rpb24uY2FuY2VsKCk7XG4gICAgdGhpcy5tYW5pZmVzdCA9IG51bGw7XG4gICAgdGhpcy5jYWNoZS5jbGVhcigpO1xuICAgIHRoaXMuY2FjaGVkQnl0ZXMgPSAwO1xuICAgIHRoaXMuaW5GbGlnaHQuY2xlYXIoKTtcbiAgICB0aGlzLnRpbGVDYWNoZS5jbGVhcigpO1xuICAgIHRoaXMudGlsZUJ5dGVzLmNsZWFyKCk7XG4gICAgdGhpcy50aWxlQnl0ZXNUb3RhbCA9IDA7XG4gICAgdGhpcy5zdW1tYXJ5Q2FjaGUuY2xlYXIoKTtcbiAgICB0aGlzLnBvbHlnb25zUHJvbWlzZSA9IG51bGw7XG4gICAgdGhpcy52b2x1bWVQcm9taXNlID0gbnVsbDtcbiAgICBpZiAodGhpcy5kYXRhc2V0JC52YWx1ZSAhPT0gbnVsbCkgdGhpcy5kYXRhc2V0JC5uZXh0KG51bGwpO1xuICB9XG5cbiAgLy8g4pSA4pSAIFNwYXRpYWxEYXRhUG9ydCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICBnZXREYXRhc2V0JCgpOiBPYnNlcnZhYmxlPFNwYXRpYWxEYXRhc2V0IHwgbnVsbD4ge1xuICAgIHJldHVybiB0aGlzLmRhdGFzZXQkLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgZ2V0Q29sdW1uKG5hbWU6IHN0cmluZyk6IFByb21pc2U8U3BhdGlhbENvbHVtbj4ge1xuICAgIGNvbnN0IG1hbmlmZXN0ID0gdGhpcy5yZXF1aXJlTWFuaWZlc3QoKTtcbiAgICBjb25zdCBkYXRhc2V0ID0gdGhpcy5kYXRhc2V0JC52YWx1ZSE7XG4gICAgY29uc3QgbWV0YSA9IGZpbmRDb2x1bW5NZXRhKGRhdGFzZXQsIG5hbWUpO1xuICAgIGlmICghbWV0YSkge1xuICAgICAgLy8gUmVqZWN0IHJhdGhlciB0aGFuIHJlc29sdmUgZW1wdHk6IGEgdHlwbyBtdXN0IHN1cmZhY2UgYXMgYW4gZXJyb3IsIG5vdFxuICAgICAgLy8gYXMgYSBwbG90IHRoYXQgc2lsZW50bHkgcmVuZGVycyBldmVyeSBwb2ludCBhcyBcIm5vIGRhdGFcIi5cbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChcbiAgICAgICAgbmV3IEVycm9yKFxuICAgICAgICAgIGBbc3BhdGlhbF0gdW5rbm93biBjb2x1bW4gXCIke25hbWV9XCIuIEF2YWlsYWJsZTogJHtkYXRhc2V0LmNvbHVtbnMubWFwKChjKSA9PiBjLm5hbWUpLmpvaW4oJywgJyl9YCxcbiAgICAgICAgKSxcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmZldGNoQ2FjaGVkKGBjb2x1bW46JHtuYW1lfWAsICgpID0+XG4gICAgICB0aGlzLmdldEJpbmFyeShgc3BhdGlhbC8ke2VuY29kZVVSSUNvbXBvbmVudChtYW5pZmVzdC5pZCl9L2NvbHVtbi8ke2VuY29kZVVSSUNvbXBvbmVudChuYW1lKX1gKS50aGVuKChidWYpID0+XG4gICAgICAgIGRlY29kZUNvbHVtbihidWYsIG1ldGEsIG1hbmlmZXN0LmNvdW50KSxcbiAgICAgICksXG4gICAgKSBhcyBQcm9taXNlPFNwYXRpYWxDb2x1bW4+O1xuICB9XG5cbiAgZ2V0RW1iZWRkaW5nKG5hbWU6IHN0cmluZyk6IFByb21pc2U8U3BhdGlhbEVtYmVkZGluZz4ge1xuICAgIGNvbnN0IG1hbmlmZXN0ID0gdGhpcy5yZXF1aXJlTWFuaWZlc3QoKTtcbiAgICBjb25zdCBtZXRhID0gbWFuaWZlc3QuZW1iZWRkaW5ncz8uZmluZCgoZSkgPT4gZS5uYW1lID09PSBuYW1lKTtcbiAgICBpZiAoIW1ldGEpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoYFtzcGF0aWFsXSB1bmtub3duIGVtYmVkZGluZyBcIiR7bmFtZX1cImApKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZmV0Y2hDYWNoZWQoYGVtYmVkZGluZzoke25hbWV9YCwgKCkgPT5cbiAgICAgIHRoaXMuZ2V0QmluYXJ5KGBzcGF0aWFsLyR7ZW5jb2RlVVJJQ29tcG9uZW50KG1hbmlmZXN0LmlkKX0vZW1iZWRkaW5nLyR7ZW5jb2RlVVJJQ29tcG9uZW50KG5hbWUpfWApLnRoZW4oXG4gICAgICAgIChidWYpID0+IGRlY29kZUVtYmVkZGluZyhidWYsIG1ldGEsIG1hbmlmZXN0LmNvdW50KSxcbiAgICAgICksXG4gICAgKSBhcyBQcm9taXNlPFNwYXRpYWxFbWJlZGRpbmc+O1xuICB9XG5cbiAgZ2V0RmVhdHVyZVZlY3RvcihuYW1lOiBzdHJpbmcpOiBQcm9taXNlPEZsb2F0MzJBcnJheT4ge1xuICAgIGNvbnN0IG1hbmlmZXN0ID0gdGhpcy5yZXF1aXJlTWFuaWZlc3QoKTtcbiAgICBjb25zdCBuYW1lcyA9IG1hbmlmZXN0LmZlYXR1cmVzPy5uYW1lcztcbiAgICBpZiAobmFtZXMgJiYgIW5hbWVzLmluY2x1ZGVzKG5hbWUpKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKGBbc3BhdGlhbF0gdW5rbm93biBmZWF0dXJlIFwiJHtuYW1lfVwiYCkpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5mZXRjaENhY2hlZChgZmVhdHVyZToke25hbWV9YCwgKCkgPT5cbiAgICAgIHRoaXMuZ2V0QmluYXJ5KGBzcGF0aWFsLyR7ZW5jb2RlVVJJQ29tcG9uZW50KG1hbmlmZXN0LmlkKX0vZmVhdHVyZS8ke2VuY29kZVVSSUNvbXBvbmVudChuYW1lKX1gKS50aGVuKFxuICAgICAgICAoYnVmKSA9PiBkZWNvZGVGZWF0dXJlVmVjdG9yKGJ1ZiwgbWFuaWZlc3QuY291bnQpLFxuICAgICAgKSxcbiAgICApIGFzIFByb21pc2U8RmxvYXQzMkFycmF5PjtcbiAgfVxuXG4gIGFzeW5jIHNlYXJjaEZlYXR1cmVzKHF1ZXJ5OiBzdHJpbmcsIGxpbWl0ID0gNTApOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgY29uc3QgbWFuaWZlc3QgPSB0aGlzLnJlcXVpcmVNYW5pZmVzdCgpO1xuICAgIC8vIEEgZGF0YXNldCB0aGF0IGlubGluZWQgaXRzIG5hbWVzICh0YXJnZXRlZCBwYW5lbCkgaXMgZmlsdGVyZWQgbG9jYWxseSDigJRcbiAgICAvLyBubyByb3VuZC10cmlwIGZvciBhIGtleXN0cm9rZSDigJQgYW5kIHJhbmtlZCBhcyB0aGUgcGlja2VyIHJhbmtzIHRoZW0uXG4gICAgY29uc3QgbmFtZXMgPSBtYW5pZmVzdC5mZWF0dXJlcz8ubmFtZXM7XG4gICAgaWYgKG5hbWVzKSByZXR1cm4gc2VhcmNoR2VuZU5hbWVzKG5hbWVzLCBxdWVyeSwgbGltaXQpO1xuICAgIGNvbnN0IHVybCA9XG4gICAgICBgc3BhdGlhbC8ke2VuY29kZVVSSUNvbXBvbmVudChtYW5pZmVzdC5pZCl9L2ZlYXR1cmVzYCArIGA/cT0ke2VuY29kZVVSSUNvbXBvbmVudChxdWVyeSl9JmxpbWl0PSR7bGltaXR9YDtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMuZ2V0SnNvbjx7IG5hbWVzOiBzdHJpbmdbXSB9Pih1cmwpKS5uYW1lcyA/PyBbXTtcbiAgfVxuXG4gIGdldFBvbHlnb25zKCk6IFByb21pc2U8U3BhdGlhbFBvbHlnb25zPiB7XG4gICAgY29uc3QgbWFuaWZlc3QgPSB0aGlzLnJlcXVpcmVNYW5pZmVzdCgpO1xuICAgIGlmICghbWFuaWZlc3QucG9seWdvbnMpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoJ1tzcGF0aWFsXSB0aGlzIGRhdGFzZXQgaGFzIG5vIHBvbHlnb24gZ2VvbWV0cnknKSk7XG4gICAgfVxuICAgIC8vIEdlb21ldHJ5IGlzIG9uZSBsYXJnZSBibG9iIHJhdGhlciB0aGFuIGEgcGVyLW5hbWUgdmVjdG9yLCBzbyBpdCBnZXRzIGl0c1xuICAgIC8vIG93biBzaW5nbGUtZmxpZ2h0IHNsb3QgaW5zdGVhZCBvZiBhIGNhY2hlIGVudHJ5LlxuICAgIHRoaXMucG9seWdvbnNQcm9taXNlID8/PSB0aGlzLmdldEJpbmFyeShgc3BhdGlhbC8ke2VuY29kZVVSSUNvbXBvbmVudChtYW5pZmVzdC5pZCl9L3BvbHlnb25zYClcbiAgICAgIC50aGVuKGRlY29kZVBvbHlnb25zKVxuICAgICAgLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgdGhpcy5wb2x5Z29uc1Byb21pc2UgPSBudWxsO1xuICAgICAgICB0aHJvdyBlcnI7XG4gICAgICB9KTtcbiAgICByZXR1cm4gdGhpcy5wb2x5Z29uc1Byb21pc2U7XG4gIH1cblxuICBnZXRQb2x5Z29uVGlsZShzZXQ6IHN0cmluZywgbGV2ZWw6IG51bWJlciwgZ3g6IG51bWJlciwgZ3k6IG51bWJlcik6IFByb21pc2U8U3BhdGlhbFBvbHlnb25UaWxlPiB7XG4gICAgY29uc3QgbWFuaWZlc3QgPSB0aGlzLnJlcXVpcmVNYW5pZmVzdCgpO1xuICAgIGlmICghbWFuaWZlc3QucG9seWdvblRpbGVzKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCdbc3BhdGlhbF0gdGhpcyBkYXRhc2V0IGhhcyBubyB0aWxlZCBwb2x5Z29ucycpKTtcbiAgICB9XG4gICAgY29uc3QgcGF0aCA9XG4gICAgICBgc3BhdGlhbC8ke2VuY29kZVVSSUNvbXBvbmVudChtYW5pZmVzdC5pZCl9L3BvbHlnb24tdGlsZS9gICtcbiAgICAgIGAke2VuY29kZVVSSUNvbXBvbmVudChzZXQpfS8ke2xldmVsfS8ke2d4fS8ke2d5fWA7XG4gICAgcmV0dXJuIHRoaXMuY2FjaGVkVGlsZShwYXRoLCAoKSA9PlxuICAgICAgdGhpcy5nZXRCaW5hcnkocGF0aCkudGhlbigoYnVmKSA9PiBkZWNvZGVQb2x5Z29uVGlsZShidWYsIG1hbmlmZXN0LmNvdW50KSksXG4gICAgKSBhcyBQcm9taXNlPFNwYXRpYWxQb2x5Z29uVGlsZT47XG4gIH1cblxuICBnZXRUcmFuc2NyaXB0VGlsZShcbiAgICBsZXZlbDogbnVtYmVyLFxuICAgIGd4OiBudW1iZXIsXG4gICAgZ3k6IG51bWJlcixcbiAgICBxdWVyeTogVHJhbnNjcmlwdFRpbGVRdWVyeSxcbiAgKTogUHJvbWlzZTxTcGF0aWFsVHJhbnNjcmlwdFRpbGU+IHtcbiAgICBjb25zdCBtYW5pZmVzdCA9IHRoaXMucmVxdWlyZU1hbmlmZXN0KCk7XG4gICAgaWYgKCFtYW5pZmVzdC50cmFuc2NyaXB0VGlsZXMpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoJ1tzcGF0aWFsXSB0aGlzIGRhdGFzZXQgaGFzIG5vIHRpbGVkIHRyYW5zY3JpcHRzJykpO1xuICAgIH1cbiAgICBjb25zdCBnZW5lcyA9IHF1ZXJ5LmdlbmVzLm1hcChlbmNvZGVVUklDb21wb25lbnQpLmpvaW4oJywnKTtcbiAgICBjb25zdCBib3ggPSBxdWVyeS5ib3ggPyBgJmJveD0ke3F1ZXJ5LmJveC5qb2luKCcsJyl9YCA6ICcnO1xuICAgIGNvbnN0IHBhdGggPVxuICAgICAgYHNwYXRpYWwvJHtlbmNvZGVVUklDb21wb25lbnQobWFuaWZlc3QuaWQpfS90cmFuc2NyaXB0LXRpbGUvJHtsZXZlbH0vJHtneH0vJHtneX1gICtcbiAgICAgIGA/Z2VuZXM9JHtnZW5lc30mcXVhbGl0eT0ke3F1ZXJ5LnF1YWxpdHkgPz8gJ2hpZ2gnfSR7Ym94fWA7XG4gICAgLy8gVGhlIGNvZGVzIGluZGV4IHRoZSBnZW5lcyBhc2tlZCBmb3Ig4oCUIGV4Y2VwdCBmb3IgQUxMX0dFTkVTLCB3aG9zZSBsaXN0IHRoZVxuICAgIC8vIHNlcnZlciBvd25zLCBzbyBvbmx5IHRoZSBvYnNlcnZhdGlvbnMgY2FuIGJlIGJvdW5kZWQgdGhlcmUuXG4gICAgY29uc3QgbGltaXRzID0ge1xuICAgICAgb2JzZXJ2YXRpb25zOiBtYW5pZmVzdC5jb3VudCxcbiAgICAgIC4uLihxdWVyeS5nZW5lcy5pbmNsdWRlcyhBTExfR0VORVMpID8ge30gOiB7IGdlbmVzOiBxdWVyeS5nZW5lcy5sZW5ndGggfSksXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5jYWNoZWRUaWxlKHBhdGgsICgpID0+XG4gICAgICB0aGlzLmdldEJpbmFyeShwYXRoKS50aGVuKChidWYpID0+IGRlY29kZVRyYW5zY3JpcHRUaWxlKGJ1ZiwgbGltaXRzKSksXG4gICAgKSBhcyBQcm9taXNlPFNwYXRpYWxUcmFuc2NyaXB0VGlsZT47XG4gIH1cblxuICBnZXRUcmFuc2NyaXB0R2VuZUJpbnMobGV2ZWw6IG51bWJlciwgdHg6IG51bWJlciwgdHk6IG51bWJlciwgZ2VuZXM6IHN0cmluZ1tdKTogUHJvbWlzZTxTcGF0aWFsVHJhbnNjcmlwdFRpbGU+IHtcbiAgICBjb25zdCBtYW5pZmVzdCA9IHRoaXMucmVxdWlyZU1hbmlmZXN0KCk7XG4gICAgaWYgKCFtYW5pZmVzdC50cmFuc2NyaXB0R2VuZUJpbnMpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoJ1tzcGF0aWFsXSB0aGlzIGRhdGFzZXQgaGFzIG5vIHBlci1nZW5lIGJpbnMnKSk7XG4gICAgfVxuICAgIGNvbnN0IHBhdGggPVxuICAgICAgYHNwYXRpYWwvJHtlbmNvZGVVUklDb21wb25lbnQobWFuaWZlc3QuaWQpfS9nZW5lLWJpbnMvJHtsZXZlbH0vJHt0eH0vJHt0eX1gICtcbiAgICAgIGA/Z2VuZXM9JHtnZW5lcy5tYXAoZW5jb2RlVVJJQ29tcG9uZW50KS5qb2luKCcsJyl9YDtcbiAgICBjb25zdCBsaW1pdHMgPSB7XG4gICAgICBvYnNlcnZhdGlvbnM6IG1hbmlmZXN0LmNvdW50LFxuICAgICAgLi4uKGdlbmVzLmluY2x1ZGVzKEFMTF9HRU5FUykgPyB7fSA6IHsgZ2VuZXM6IGdlbmVzLmxlbmd0aCB9KSxcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLmNhY2hlZFRpbGUocGF0aCwgKCkgPT5cbiAgICAgIHRoaXMuZ2V0QmluYXJ5KHBhdGgpLnRoZW4oKGJ1ZikgPT4gZGVjb2RlVHJhbnNjcmlwdFRpbGUoYnVmLCBsaW1pdHMpKSxcbiAgICApIGFzIFByb21pc2U8U3BhdGlhbFRyYW5zY3JpcHRUaWxlPjtcbiAgfVxuXG4gIGdldFRyYW5zY3JpcHRCaW5zKGxldmVsOiBudW1iZXIsIHR4OiBudW1iZXIsIHR5OiBudW1iZXIpOiBQcm9taXNlPFNwYXRpYWxUcmFuc2NyaXB0VGlsZT4ge1xuICAgIGNvbnN0IG1hbmlmZXN0ID0gdGhpcy5yZXF1aXJlTWFuaWZlc3QoKTtcbiAgICBpZiAoIW1hbmlmZXN0LnRyYW5zY3JpcHRCaW5zKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCdbc3BhdGlhbF0gdGhpcyBkYXRhc2V0IGhhcyBubyB0cmFuc2NyaXB0IHB5cmFtaWQnKSk7XG4gICAgfVxuICAgIGNvbnN0IHBhdGggPSBgc3BhdGlhbC8ke2VuY29kZVVSSUNvbXBvbmVudChtYW5pZmVzdC5pZCl9L3RyYW5zY3JpcHQtYmlucy8ke2xldmVsfS8ke3R4fS8ke3R5fWA7XG4gICAgcmV0dXJuIHRoaXMuY2FjaGVkVGlsZShwYXRoLCAoKSA9PlxuICAgICAgdGhpcy5nZXRCaW5hcnkocGF0aCkudGhlbigoYnVmKSA9PiBkZWNvZGVUcmFuc2NyaXB0VGlsZShidWYsIHsgb2JzZXJ2YXRpb25zOiBtYW5pZmVzdC5jb3VudCB9KSksXG4gICAgKSBhcyBQcm9taXNlPFNwYXRpYWxUcmFuc2NyaXB0VGlsZT47XG4gIH1cblxuICAvKiogU21hbGwgSlNPTiBhbnN3ZXJzLCBrZXllZCBieSBVUkwg4oCUIGhvdmVyaW5nIGJhY2sgYW5kIGZvcnRoIG11c3Qgbm90IHJlZmV0Y2guIExlYXN0IHJlY2VudGx5XG4gICAqICBVU0VEIGdvZXMgZmlyc3QsIHNvIHRoZSBzdW1tYXJ5IHVuZGVyIHRoZSBwb2ludGVyIHN0YXlzIHdoaWxlIG90aGVycyBhcmUgZXZpY3RlZC4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBzdW1tYXJ5Q2FjaGUgPSBuZXcgTHJ1Q2FjaGU8UHJvbWlzZTxTcGF0aWFsVHJhbnNjcmlwdFN1bW1hcnk+PigyNTYpO1xuXG4gIGdldFRyYW5zY3JpcHRTdW1tYXJ5KHF1ZXJ5OiB7XG4gICAgYm94PzogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl07XG4gICAgZ2VuZXM/OiBzdHJpbmdbXTtcbiAgICBjZWxscz86IG51bWJlcltdO1xuICB9KTogUHJvbWlzZTxTcGF0aWFsVHJhbnNjcmlwdFN1bW1hcnk+IHtcbiAgICBjb25zdCBtYW5pZmVzdCA9IHRoaXMucmVxdWlyZU1hbmlmZXN0KCk7XG4gICAgY29uc3QgcGFyYW1zOiBzdHJpbmdbXSA9IFtdO1xuICAgIGlmIChxdWVyeS5ib3gpIHBhcmFtcy5wdXNoKGBib3g9JHtxdWVyeS5ib3gubWFwKCh2KSA9PiArdi50b0ZpeGVkKDMpKS5qb2luKCcsJyl9YCk7XG4gICAgaWYgKHF1ZXJ5LmdlbmVzPy5sZW5ndGgpIHBhcmFtcy5wdXNoKGBnZW5lcz0ke3F1ZXJ5LmdlbmVzLm1hcChlbmNvZGVVUklDb21wb25lbnQpLmpvaW4oJywnKX1gKTtcbiAgICBpZiAocXVlcnkuY2VsbHM/Lmxlbmd0aCkgcGFyYW1zLnB1c2goYGNlbGxzPSR7cXVlcnkuY2VsbHMuam9pbignLCcpfWApO1xuICAgIGNvbnN0IHVybCA9IGBzcGF0aWFsLyR7ZW5jb2RlVVJJQ29tcG9uZW50KG1hbmlmZXN0LmlkKX0vdHJhbnNjcmlwdC1zdW1tYXJ5PyR7cGFyYW1zLmpvaW4oJyYnKX1gO1xuICAgIGxldCBoaXQgPSB0aGlzLnN1bW1hcnlDYWNoZS5nZXQodXJsKTtcbiAgICBpZiAoIWhpdCkge1xuICAgICAgaGl0ID0gdGhpcy5nZXRKc29uPFNwYXRpYWxUcmFuc2NyaXB0U3VtbWFyeT4odXJsKTtcbiAgICAgIGhpdC5jYXRjaCgoKSA9PiB0aGlzLnN1bW1hcnlDYWNoZS5kZWxldGUodXJsKSk7XG4gICAgICB0aGlzLnN1bW1hcnlDYWNoZS5zZXQodXJsLCBoaXQpO1xuICAgIH1cbiAgICByZXR1cm4gaGl0O1xuICB9XG5cbiAgZ2V0RGVuc2l0eShnZW5lczogc3RyaW5nW10sIGJpblNpemU/OiBudW1iZXIpOiBQcm9taXNlPFNwYXRpYWxEZW5zaXR5UmFzdGVyPiB7XG4gICAgY29uc3QgbWFuaWZlc3QgPSB0aGlzLnJlcXVpcmVNYW5pZmVzdCgpO1xuICAgIGlmICghbWFuaWZlc3QuZGVuc2l0eSkgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcignW3NwYXRpYWxdIHRoaXMgZGF0YXNldCBoYXMgbm8gZGVuc2l0eSByYXN0ZXInKSk7XG4gICAgY29uc3QgbGlzdCA9IFsuLi5nZW5lc107XG4gICAgY29uc3QgYmluID0gYmluU2l6ZSA/IGAmYmluPSR7YmluU2l6ZX1gIDogJyc7XG4gICAgcmV0dXJuIHRoaXMuZmV0Y2hDYWNoZWQoYGRlbnNpdHk6JHtsaXN0LmpvaW4oJywnKX06JHtiaW5TaXplID8/ICcnfWAsICgpID0+XG4gICAgICB0aGlzLmdldEJpbmFyeShcbiAgICAgICAgYHNwYXRpYWwvJHtlbmNvZGVVUklDb21wb25lbnQobWFuaWZlc3QuaWQpfS9kZW5zaXR5P2dlbmVzPSR7bGlzdC5tYXAoZW5jb2RlVVJJQ29tcG9uZW50KS5qb2luKCcsJyl9JHtiaW59YCxcbiAgICAgICkudGhlbigoYnVmKSA9PiBkZWNvZGVEZW5zaXR5KGJ1ZiwgbGlzdCkpLFxuICAgICkgYXMgUHJvbWlzZTxTcGF0aWFsRGVuc2l0eVJhc3Rlcj47XG4gIH1cblxuICBhc3luYyBpbXBvcnRHcm91cHMobGFiZWw6IHN0cmluZywgdGFibGU6IHN0cmluZyk6IFByb21pc2U8eyBjb2x1bW46IENhdGVnb3JpY2FsQ29sdW1uTWV0YTsgbWF0Y2hlZDogbnVtYmVyIH0+IHtcbiAgICBjb25zdCBtYW5pZmVzdCA9IHRoaXMucmVxdWlyZU1hbmlmZXN0KCk7XG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5iYXNlVXJsfXNwYXRpYWwvJHtlbmNvZGVVUklDb21wb25lbnQobWFuaWZlc3QuaWQpfS9ncm91cHM/bmFtZT0ke2VuY29kZVVSSUNvbXBvbmVudChsYWJlbCl9YDtcbiAgICAvLyBIdHRwQ2xpZW50LCBub3QgZmV0Y2g6IGEgaG9zdCdzIGludGVyY2VwdG9ycyAoaXRzIGF1dGggaGVhZGVyKSBtdXN0IGFwcGx5IHRvIHRoZVxuICAgIC8vIHVwbG9hZCBhcyB0aGV5IGRvIHRvIGV2ZXJ5IHJlYWQsIG9yIGEgcHJvdGVjdGVkIHNlcnZlciByZWZ1c2VzIGl0LlxuICAgIGxldCBib2R5OiB7IGNvbHVtbjogQ2F0ZWdvcmljYWxDb2x1bW5NZXRhOyBtYXRjaGVkOiBudW1iZXIgfTtcbiAgICB0cnkge1xuICAgICAgYm9keSA9IGF3YWl0IGZpcnN0VmFsdWVGcm9tKFxuICAgICAgICB0aGlzLmh0dHBcbiAgICAgICAgICAucG9zdDx7IGNvbHVtbjogQ2F0ZWdvcmljYWxDb2x1bW5NZXRhOyBtYXRjaGVkOiBudW1iZXIgfT4odXJsLCB0YWJsZSwge1xuICAgICAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ3RleHQvY3N2JyB9LFxuICAgICAgICAgIH0pXG4gICAgICAgICAgLnBpcGUodGltZW91dCh0aGlzLnRpbWVvdXRNcykpLFxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnN0IGUgPSBlcnIgYXMgSHR0cEVycm9yUmVzcG9uc2U7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoZT8uZXJyb3I/LmVycm9yID8/IGBbc3BhdGlhbF0gaW1wb3J0IGZhaWxlZCAoSFRUUCAke2U/LnN0YXR1cyA/PyAnPyd9KWApO1xuICAgIH1cbiAgICBjb25zdCBjb2x1bW4gPSBib2R5LmNvbHVtbjtcbiAgICAvLyBUaGUgbmV3IGNvbHVtbiBqb2lucyB0aGUgZGF0YXNldDogcmUtZW1pdCBzbyBldmVyeSBwYW5lbCBzZWVzIGl0LlxuICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLmRhdGFzZXQkLnZhbHVlO1xuICAgIGlmIChjdXJyZW50ICYmIHRoaXMubWFuaWZlc3Q/LmlkID09PSBtYW5pZmVzdC5pZCkge1xuICAgICAgY29uc3QgY29sdW1ucyA9IGN1cnJlbnQuY29sdW1ucy5maWx0ZXIoKGMpID0+IGMubmFtZSAhPT0gY29sdW1uLm5hbWUpLmNvbmNhdChjb2x1bW4pO1xuICAgICAgdGhpcy5tYW5pZmVzdCA9IHsgLi4udGhpcy5tYW5pZmVzdCwgY29sdW1ucyB9O1xuICAgICAgdGhpcy51bmNhY2hlKGBjb2x1bW46JHtjb2x1bW4ubmFtZX1gKTtcbiAgICAgIHRoaXMuZGF0YXNldCQubmV4dCh7IC4uLmN1cnJlbnQsIGNvbHVtbnMgfSk7XG4gICAgfVxuICAgIHJldHVybiB7IGNvbHVtbiwgbWF0Y2hlZDogYm9keS5tYXRjaGVkIH07XG4gIH1cblxuICBnZXRNYXJrZXJHZW5lcyhjb2x1bW46IHN0cmluZywgcGVyR3JvdXAgPSA1KTogUHJvbWlzZTxTcGF0aWFsTWFya2VyR2VuZXM+IHtcbiAgICBjb25zdCBtYW5pZmVzdCA9IHRoaXMucmVxdWlyZU1hbmlmZXN0KCk7XG4gICAgLy8gTm8gcGVyLXJlcXVlc3QgdGltZW91dDogdGhlIGZpcnN0IGNvbXB1dGF0aW9uIGlzIGEgcGFzcyBvdmVyIHRoZSB3aG9sZSBtYXRyaXguXG4gICAgcmV0dXJuIGZpcnN0VmFsdWVGcm9tKFxuICAgICAgdGhpcy5odHRwLmdldDxTcGF0aWFsTWFya2VyR2VuZXM+KFxuICAgICAgICBgJHt0aGlzLmJhc2VVcmx9c3BhdGlhbC8ke2VuY29kZVVSSUNvbXBvbmVudChtYW5pZmVzdC5pZCl9L21hcmtlcnMvJHtlbmNvZGVVUklDb21wb25lbnQoY29sdW1uKX0/bj0ke3Blckdyb3VwfWAsXG4gICAgICApLFxuICAgICk7XG4gIH1cblxuICBnZXRUcmFuc2NyaXB0Q291bnRzKGdlbmVzOiBzdHJpbmdbXSk6IFByb21pc2U8U3BhdGlhbFRyYW5zY3JpcHRDb3VudHM+IHtcbiAgICBjb25zdCBtYW5pZmVzdCA9IHRoaXMucmVxdWlyZU1hbmlmZXN0KCk7XG4gICAgcmV0dXJuIHRoaXMuZ2V0SnNvbjxTcGF0aWFsVHJhbnNjcmlwdENvdW50cz4oXG4gICAgICBgc3BhdGlhbC8ke2VuY29kZVVSSUNvbXBvbmVudChtYW5pZmVzdC5pZCl9L3RyYW5zY3JpcHQtY291bnRzP2dlbmVzPSR7Z2VuZXMubWFwKGVuY29kZVVSSUNvbXBvbmVudCkuam9pbignLCcpfWAsXG4gICAgKTtcbiAgfVxuXG4gIC8qKiBMUlUgb3ZlciB0aWxlIHByb21pc2VzLCBzbyBjb25jdXJyZW50IGFza3Mgc2hhcmUgb25lIHJlcXVlc3QgYW5kIGEgZmFpbHVyZSBpcyBub3Qga2VwdC4gKi9cbiAgcHJpdmF0ZSBjYWNoZWRUaWxlPFQgZXh0ZW5kcyBTcGF0aWFsUG9seWdvblRpbGUgfCBTcGF0aWFsVHJhbnNjcmlwdFRpbGU+KFxuICAgIGtleTogc3RyaW5nLFxuICAgIGxvYWQ6ICgpID0+IFByb21pc2U8VD4sXG4gICk6IFByb21pc2U8VD4ge1xuICAgIGNvbnN0IGhpdCA9IHRoaXMudGlsZUNhY2hlLmdldChrZXkpO1xuICAgIGlmIChoaXQpIHtcbiAgICAgIHRoaXMudGlsZUNhY2hlLmRlbGV0ZShrZXkpO1xuICAgICAgdGhpcy50aWxlQ2FjaGUuc2V0KGtleSwgaGl0KTtcbiAgICAgIHJldHVybiBoaXQgYXMgUHJvbWlzZTxUPjtcbiAgICB9XG4gICAgY29uc3QgZ2VuZXJhdGlvbiA9IHRoaXMuc2VsZWN0aW9uLmN1cnJlbnQoKTtcbiAgICBjb25zdCBwcm9taXNlOiBQcm9taXNlPFQ+ID0gbG9hZCgpLnRoZW4oXG4gICAgICAodGlsZSkgPT4ge1xuICAgICAgICAvLyBTaXplZCBvbmNlIGl0IGxhbmRzLCBhbmQgb25seSB3aGlsZSBpdCBpcyBzdGlsbCB0aGUgZW50cnkgdW5kZXIgaXRzIGtleS5cbiAgICAgICAgaWYgKHRoaXMudGlsZUNhY2hlLmdldChrZXkpID09PSBwcm9taXNlICYmICF0aGlzLnRpbGVCeXRlcy5oYXMoa2V5KSkge1xuICAgICAgICAgIGNvbnN0IGJ5dGVzID0gcGF5bG9hZEJ5dGVzKHRpbGUpO1xuICAgICAgICAgIHRoaXMudGlsZUJ5dGVzLnNldChrZXksIGJ5dGVzKTtcbiAgICAgICAgICB0aGlzLnRpbGVCeXRlc1RvdGFsICs9IGJ5dGVzO1xuICAgICAgICAgIHRoaXMuZXZpY3RUaWxlcygpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aWxlO1xuICAgICAgfSxcbiAgICAgIChlcnIpID0+IHtcbiAgICAgICAgaWYgKHRoaXMudGlsZUNhY2hlLmdldChrZXkpID09PSBwcm9taXNlKSB0aGlzLmRyb3BUaWxlKGtleSk7XG4gICAgICAgIHRocm93IGVycjtcbiAgICAgIH0sXG4gICAgKTtcbiAgICBpZiAoZ2VuZXJhdGlvbi5pc0N1cnJlbnQoKSkge1xuICAgICAgdGhpcy50aWxlQ2FjaGUuc2V0KGtleSwgcHJvbWlzZSk7XG4gICAgICB0aGlzLmV2aWN0VGlsZXMoKTtcbiAgICB9XG4gICAgcmV0dXJuIHByb21pc2U7XG4gIH1cblxuICAvKiogT2xkZXN0IGZpcnN0LCBwYXN0IHRoZSBlbnRyeSBjYXAgb3IgdGhlIGJ5dGUgYnVkZ2V0LCBrZWVwaW5nIHRoZSBuZXdlc3QuICovXG4gIHByaXZhdGUgZXZpY3RUaWxlcygpOiB2b2lkIHtcbiAgICB3aGlsZSAoXG4gICAgICB0aGlzLnRpbGVDYWNoZS5zaXplID4gMSAmJlxuICAgICAgKHRoaXMudGlsZUNhY2hlLnNpemUgPiBTcGF0aWFsRGF0YUh0dHBTZXJ2aWNlLlRJTEVfQ0FDSEVfTElNSVQgfHwgdGhpcy50aWxlQnl0ZXNUb3RhbCA+IHRoaXMudGlsZUNhY2hlQnl0ZXMpXG4gICAgKSB7XG4gICAgICB0aGlzLmRyb3BUaWxlKHRoaXMudGlsZUNhY2hlLmtleXMoKS5uZXh0KCkudmFsdWUhKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGRyb3BUaWxlKGtleTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy50aWxlQ2FjaGUuZGVsZXRlKGtleSk7XG4gICAgdGhpcy50aWxlQnl0ZXNUb3RhbCAtPSB0aGlzLnRpbGVCeXRlcy5nZXQoa2V5KSA/PyAwO1xuICAgIHRoaXMudGlsZUJ5dGVzLmRlbGV0ZShrZXkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSByZWdpb24gc2V0IGEgYm91bmRhcnkgc2V0IG5hbWVzIChgcG9seWdvblRpbGVzLnNldHNbaV0ucmVnaW9uU291cmNlYCksIHNlcnZlZCBiZXNpZGUgdGhlXG4gICAqIGRhdGFzZXRzIGFzIGFuIEhUVFAgcmVnaW9uIHNvdXJjZSAoYHtiYXNlfS9yZWdpb25zL3tpZH0v4oCmYCwgc2VlIGBvcGVuSHR0cFJlZ2lvblNvdXJjZWApLCBpdHNcbiAgICogcmVxdWVzdHMgdGhyb3VnaCB0aGUgaG9zdCdzIGBIdHRwQ2xpZW50YCBhcyBldmVyeSBvdGhlciByZXF1ZXN0IGhlcmUuXG4gICAqL1xuICBvcGVuUmVnaW9uU2V0KGlkOiBzdHJpbmcpOiBQcm9taXNlPFJlZ2lvblNvdXJjZT4ge1xuICAgIHJldHVybiBvcGVuSHR0cFJlZ2lvblNvdXJjZShgJHt0aGlzLmJhc2VVcmx9cmVnaW9ucy8ke2VuY29kZVVSSUNvbXBvbmVudChpZCl9L2AsIHsgaHR0cDogdGhpcy5odHRwIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSByZWZlcmVuY2Ugdm9sdW1lJ3Mgdm94ZWxzLCBzaW5nbGUtZmxpZ2h0ZWQgbGlrZSB0aGUgcG9seWdvbnMuXG4gICAqXG4gICAqIFZhbGlkYXRlZCBhZ2FpbnN0IHRoZSBtYW5pZmVzdCdzIGRlY2xhcmVkIGRpbWVuc2lvbnMgYmVmb3JlIGl0IGlzIGhhbmRlZFxuICAgKiBiYWNrOiBhIHNob3J0IG9yIGxvbmcgYnVmZmVyIHJlYWQgYXMgYSAzRCB0ZXh0dXJlIGRvZXMgbm90IGZhaWwsIGl0IHNoZWFyc1xuICAgKiB0aGUgYW5hdG9teSBpbnRvIGRpYWdvbmFsIHN0cmVha3MsIGFuZCB0aGF0IGlzIGZhciBoYXJkZXIgdG8gcmVjb2duaXNlIGFzIGFcbiAgICogdHJhbnNwb3J0IHByb2JsZW0gdGhhbiBhbiBlcnJvciBpcy5cbiAgICovXG4gIGdldFZvbHVtZSgpOiBQcm9taXNlPFVpbnQ4QXJyYXk+IHtcbiAgICBjb25zdCBtYW5pZmVzdCA9IHRoaXMucmVxdWlyZU1hbmlmZXN0KCk7XG4gICAgY29uc3QgbWV0YSA9IG1hbmlmZXN0LnZvbHVtZTtcbiAgICBpZiAoIW1ldGEpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoJ1tzcGF0aWFsXSB0aGlzIGRhdGFzZXQgaGFzIG5vIHJlZmVyZW5jZSB2b2x1bWUnKSk7XG4gICAgfVxuICAgIHRoaXMudm9sdW1lUHJvbWlzZSA/Pz0gdGhpcy5nZXRCaW5hcnkoYHNwYXRpYWwvJHtlbmNvZGVVUklDb21wb25lbnQobWFuaWZlc3QuaWQpfS92b2x1bWVgKVxuICAgICAgLnRoZW4oKGJ1ZikgPT4ge1xuICAgICAgICBjb25zdCB3YW50ID0gbWV0YS53aWR0aCAqIG1ldGEuaGVpZ2h0ICogbWV0YS5kZXB0aDtcbiAgICAgICAgaWYgKGJ1Zi5ieXRlTGVuZ3RoICE9PSB3YW50KSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYFtzcGF0aWFsXSB2b2x1bWUgaXMgJHtidWYuYnl0ZUxlbmd0aH0gYnl0ZXMsIGV4cGVjdGVkICR7d2FudH0gYCArXG4gICAgICAgICAgICAgIGAoJHttZXRhLndpZHRofXgke21ldGEuaGVpZ2h0fXgke21ldGEuZGVwdGh9KWAsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoYnVmKTtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICB0aGlzLnZvbHVtZVByb21pc2UgPSBudWxsO1xuICAgICAgICB0aHJvdyBlcnI7XG4gICAgICB9KTtcbiAgICByZXR1cm4gdGhpcy52b2x1bWVQcm9taXNlO1xuICB9XG5cbiAgLy8g4pSA4pSAIGludGVybmFscyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICBwcml2YXRlIHJlcXVpcmVNYW5pZmVzdCgpOiBTcGF0aWFsTWFuaWZlc3Qge1xuICAgIGlmICghdGhpcy5tYW5pZmVzdCB8fCAhdGhpcy5kYXRhc2V0JC52YWx1ZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdbc3BhdGlhbF0gbm8gZGF0YXNldCBzZWxlY3RlZCDigJQgY2FsbCBzZWxlY3REYXRhc2V0KCkgZmlyc3QnKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMubWFuaWZlc3Q7XG4gIH1cblxuICAvKipcbiAgICogQ2FjaGUgKyBzaW5nbGUtZmxpZ2h0IGFyb3VuZCBhIHZlY3RvciBmZXRjaC5cbiAgICpcbiAgICogS2V5cyBhcmUgTE9HSUNBTCDigJQgYGZlYXR1cmU6R0FQREhgLCBub3QgYDxkYXRhc2V0Pi9mZWF0dXJlOkdBUERIYCDigJQgYmVjYXVzZSBgY2xlYXIoKWBcbiAgICogZW1wdGllcyB0aGUgbWFwcyBvbiBldmVyeSBzd2l0Y2gsIHNvIHR3byBkYXRhc2V0cyBuZXZlciBob2xkIGVudHJpZXMgYXQgb25jZS4gV2hhdFxuICAgKiB0aGF0IGRvZXMgbm90IGNvdmVyIGlzIGEgcmVxdWVzdCBzdGlsbCBpbiB0aGUgYWlyIHdoZW4gdGhlIHN3aXRjaCBoYXBwZW5zOiBgY2xlYXIoKWBcbiAgICogY2Fubm90IGNhbmNlbCBhbiBIVFRQIGNhbGwsIHNvIGEgdmVjdG9yIGZldGNoZWQgZm9yIGRhdGFzZXQgQSBjYW4gcmVzb2x2ZSBhZnRlciBCIGhhc1xuICAgKiBiZWVuIHNlbGVjdGVkIGFuZCB3cml0ZSBpdHNlbGYgaW50byBCJ3MgY2FjaGUgdW5kZXIgYSBrZXkgQiB3b3VsZCByZWFkLiBCb3RoIGRhdGFzZXRzXG4gICAqIGhhdmluZyBhIGdlbmUgb2YgdGhhdCBuYW1lIGlzIHRoZSBjb21tb24gY2FzZSwgbm90IHRoZSB1bmx1Y2t5IG9uZSwgYW5kIHRoZSByZXN1bHQgaXNcbiAgICogYSBwbG90IG9mIEEncyBleHByZXNzaW9uIG92ZXIgQidzIGNlbGxzIOKAlCB3aGljaCBsb29rcyBsaWtlIGRhdGEsIG5vdCBsaWtlIGEgZmF1bHQuXG4gICAqXG4gICAqIFNvIHRoZSBnZW5lcmF0aW9uIGlzIGNoZWNrZWQgYWZ0ZXIgdGhlIGF3YWl0LCBhbmQgdGhlIGluLWZsaWdodCBzbG90IGlzIGNsZWFyZWQgb25seVxuICAgKiB3aGVuIHRoZSBwcm9taXNlIHN0aWxsIHNpdHRpbmcgaW4gaXQgaXMgdGhpcyBvbmU6IGEgbGF0ZSBhcnJpdmFsIG11c3Qgbm90IGV2aWN0IHRoZVxuICAgKiBlbnRyeSBhIG5ld2VyIHJlcXVlc3QgZm9yIHRoZSBzYW1lIGtleSBpcyBhbHJlYWR5IHNoYXJpbmcuXG4gICAqL1xuICBwcml2YXRlIGZldGNoQ2FjaGVkKGtleTogc3RyaW5nLCBsb2FkOiAoKSA9PiBQcm9taXNlPENhY2hlZFBheWxvYWQ+KTogUHJvbWlzZTxDYWNoZWRQYXlsb2FkPiB7XG4gICAgY29uc3QgaGl0ID0gdGhpcy5jYWNoZS5nZXQoa2V5KTtcbiAgICBpZiAoaGl0KSB7XG4gICAgICAvLyBSZS1pbnNlcnQgdG8gbWFyayBtb3N0LXJlY2VudGx5LXVzZWQgKE1hcCBwcmVzZXJ2ZXMgaW5zZXJ0aW9uIG9yZGVyKS5cbiAgICAgIHRoaXMuY2FjaGUuZGVsZXRlKGtleSk7XG4gICAgICB0aGlzLmNhY2hlLnNldChrZXksIGhpdCk7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGhpdC52YWx1ZSk7XG4gICAgfVxuICAgIGNvbnN0IHBlbmRpbmcgPSB0aGlzLmluRmxpZ2h0LmdldChrZXkpO1xuICAgIGlmIChwZW5kaW5nKSByZXR1cm4gcGVuZGluZztcblxuICAgIGNvbnN0IGdlbmVyYXRpb24gPSB0aGlzLnNlbGVjdGlvbi5jdXJyZW50KCk7XG4gICAgY29uc3QgcHJvbWlzZTogUHJvbWlzZTxDYWNoZWRQYXlsb2FkPiA9IGxvYWQoKVxuICAgICAgLnRoZW4oKHZhbHVlKSA9PiB7XG4gICAgICAgIC8vIFN0aWxsIHJldHVybmVkIHRvIHRoZSBjYWxsZXIgdGhhdCBhc2tlZDogaXQgbWF5IHdlbGwgYmUgYSBjb21wb25lbnQgdGhhdCBpc1xuICAgICAgICAvLyBpdHNlbGYgYmVpbmcgdG9ybiBkb3duLCBhbmQgcmVqZWN0aW5nIGhlcmUgd291bGQgc3VyZmFjZSBhIHN3aXRjaCBhcyBhbiBlcnJvci5cbiAgICAgICAgLy8gV2hhdCBtdXN0IG5vdCBoYXBwZW4gaXMgdGhlIHZhbHVlIGJlaW5nIGtlcHQgZm9yIHdob2V2ZXIgY29tZXMgbmV4dC5cbiAgICAgICAgaWYgKGdlbmVyYXRpb24uaXNDdXJyZW50KCkpIHtcbiAgICAgICAgICB0aGlzLnVuY2FjaGUoa2V5KTtcbiAgICAgICAgICBjb25zdCBieXRlcyA9IHBheWxvYWRCeXRlcyh2YWx1ZSk7XG4gICAgICAgICAgdGhpcy5jYWNoZS5zZXQoa2V5LCB7IHZhbHVlLCBieXRlcyB9KTtcbiAgICAgICAgICB0aGlzLmNhY2hlZEJ5dGVzICs9IGJ5dGVzO1xuICAgICAgICAgIHRoaXMuZXZpY3QoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICB9KVxuICAgICAgLmZpbmFsbHkoKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5pbkZsaWdodC5nZXQoa2V5KSA9PT0gcHJvbWlzZSkgdGhpcy5pbkZsaWdodC5kZWxldGUoa2V5KTtcbiAgICAgIH0pO1xuICAgIHRoaXMuaW5GbGlnaHQuc2V0KGtleSwgcHJvbWlzZSk7XG4gICAgcmV0dXJuIHByb21pc2U7XG4gIH1cblxuICAvKiogT2xkZXN0IGZpcnN0LCBwYXN0IHRoZSBlbnRyeSBjYXAgb3IgdGhlIGJ5dGUgYnVkZ2V0LCBrZWVwaW5nIHRoZSBuZXdlc3QuICovXG4gIHByaXZhdGUgZXZpY3QoKTogdm9pZCB7XG4gICAgd2hpbGUgKFxuICAgICAgdGhpcy5jYWNoZS5zaXplID4gMSAmJlxuICAgICAgKHRoaXMuY2FjaGUuc2l6ZSA+IFNwYXRpYWxEYXRhSHR0cFNlcnZpY2UuQ0FDSEVfTElNSVQgfHwgdGhpcy5jYWNoZWRCeXRlcyA+IHRoaXMuY2FjaGVCeXRlcylcbiAgICApIHtcbiAgICAgIHRoaXMudW5jYWNoZSh0aGlzLmNhY2hlLmtleXMoKS5uZXh0KCkudmFsdWUhKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHVuY2FjaGUoa2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBlbnRyeSA9IHRoaXMuY2FjaGUuZ2V0KGtleSk7XG4gICAgaWYgKCFlbnRyeSkgcmV0dXJuO1xuICAgIHRoaXMuY2FjaGUuZGVsZXRlKGtleSk7XG4gICAgdGhpcy5jYWNoZWRCeXRlcyAtPSBlbnRyeS5ieXRlcztcbiAgfVxuXG4gIHByaXZhdGUgZ2V0SnNvbjxUPihwYXRoOiBzdHJpbmcpOiBQcm9taXNlPFQ+IHtcbiAgICByZXR1cm4gZmlyc3RWYWx1ZUZyb20odGhpcy5odHRwLmdldDxUPihgJHt0aGlzLmJhc2VVcmx9JHtwYXRofWApLnBpcGUodGltZW91dCh0aGlzLnRpbWVvdXRNcykpKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0QmluYXJ5KHBhdGg6IHN0cmluZyk6IFByb21pc2U8QXJyYXlCdWZmZXI+IHtcbiAgICByZXR1cm4gZmlyc3RWYWx1ZUZyb20oXG4gICAgICB0aGlzLmh0dHAuZ2V0KGAke3RoaXMuYmFzZVVybH0ke3BhdGh9YCwgeyByZXNwb25zZVR5cGU6ICdhcnJheWJ1ZmZlcicgfSkucGlwZSh0aW1lb3V0KHRoaXMudGltZW91dE1zKSksXG4gICAgKTtcbiAgfVxufVxuIl19
|
|
@@ -34,6 +34,12 @@ export class ClassTreeComponent {
|
|
|
34
34
|
this.volume = false;
|
|
35
35
|
/** The classes shown in 3D. */
|
|
36
36
|
this.shown3d = new Set();
|
|
37
|
+
/** Classes that can be drawn as individual cells here (a 3D segmentation's, in spatial 3D). */
|
|
38
|
+
this.cellable = new Set();
|
|
39
|
+
/** Those drawn as individual cells now. */
|
|
40
|
+
this.individual = new Set();
|
|
41
|
+
/** Draw a class (its subclasses with it) as individual cells, or merged again. */
|
|
42
|
+
this.toggleCells = new EventEmitter();
|
|
37
43
|
/** The classes hidden from view. */
|
|
38
44
|
this.hidden = new Set();
|
|
39
45
|
this.pick = new EventEmitter();
|
|
@@ -84,6 +90,21 @@ export class ClassTreeComponent {
|
|
|
84
90
|
const e = event;
|
|
85
91
|
this.pick.emit({ name, classes: subtree(this.tree, name), additive: e.shiftKey || e.metaKey || e.ctrlKey });
|
|
86
92
|
}
|
|
93
|
+
/** A class (with its subclasses) as individual cells, or merged again: all of them as it is. */
|
|
94
|
+
flipCells(name, event) {
|
|
95
|
+
event.stopPropagation();
|
|
96
|
+
const classes = subtree(this.tree, name).filter((c) => this.cellable.has(c));
|
|
97
|
+
this.toggleCells.emit({ classes, individual: !classes.every((c) => this.individual.has(c)) });
|
|
98
|
+
}
|
|
99
|
+
/** Whether every cellable class of `name`'s subtree is drawn as cells. */
|
|
100
|
+
allIndividual(name) {
|
|
101
|
+
const classes = subtree(this.tree, name).filter((c) => this.cellable.has(c));
|
|
102
|
+
return !!classes.length && classes.every((c) => this.individual.has(c));
|
|
103
|
+
}
|
|
104
|
+
/** Whether `name` or a subclass can be drawn as cells. */
|
|
105
|
+
anyCellable(name) {
|
|
106
|
+
return subtree(this.tree, name).some((c) => this.cellable.has(c));
|
|
107
|
+
}
|
|
87
108
|
/** The eye: a class hidden (wholly) is shown again with its subclasses; otherwise they are hidden. */
|
|
88
109
|
flipHidden(name, event) {
|
|
89
110
|
event.stopPropagation();
|
|
@@ -118,11 +139,11 @@ export class ClassTreeComponent {
|
|
|
118
139
|
}
|
|
119
140
|
}
|
|
120
141
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.9", ngImport: i0, type: ClassTreeComponent, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
121
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.9", type: ClassTreeComponent, isStandalone: true, selector: "region-class-tree", inputs: { nodes: "nodes", counts: "counts", colorOf: "colorOf", picked: "picked", marked: "marked", volume: "volume", shown3d: "shown3d", hidden: "hidden" }, outputs: { pick: "pick", recolor: "recolor", toggle3d: "toggle3d", toggleHidden: "toggleHidden" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"class-tree\">\n <div class=\"tree-header\" *ngIf=\"picked as p\">\n <span class=\"tree-picked\">\n <b>{{ p }}</b\n ><span *ngIf=\"node(p)?.title as t\"> \u00B7 {{ t }}</span>\n </span>\n </div>\n <input\n type=\"text\"\n pInputText\n class=\"p-inputtext-sm tree-search\"\n placeholder=\"Search by name\"\n aria-label=\"Search the classes\"\n [ngModel]=\"query\"\n (ngModelChange)=\"onQuery($event)\"\n (keydown.enter)=\"pickFirstMatch($event)\"\n />\n <div class=\"tree-body\" role=\"tree\">\n <div\n *ngFor=\"let row of rows; trackBy: trackRow\"\n class=\"tree-row\"\n role=\"treeitem\"\n tabindex=\"0\"\n [attr.aria-expanded]=\"row.hasChildren ? row.expanded : null\"\n [class.absent]=\"total(row.name) === 0\"\n [class.picked]=\"row.name === picked\"\n [class.marked]=\"marked.has(row.name)\"\n [class.hidden-class]=\"visibility.get(row.name) === 'hidden'\"\n [style.padding-left.rem]=\"0.35 + row.depth * 0.9\"\n [pTooltip]=\"node(row.name)?.title || row.name\"\n tooltipPosition=\"left\"\n [showDelay]=\"600\"\n (click)=\"choose(row.name, $event)\"\n (keydown.enter)=\"choose(row.name, $event)\"\n >\n <i\n class=\"pi tree-toggle\"\n [class.pi-minus-circle]=\"row.hasChildren && row.expanded\"\n [class.pi-plus-circle]=\"row.hasChildren && !row.expanded\"\n [attr.aria-label]=\"row.expanded ? 'Collapse' : 'Expand'\"\n (click)=\"row.hasChildren && toggle(row, $event)\"\n ></i>\n <i\n class=\"pi tree-eye\"\n [ngClass]=\"visibility.get(row.name) === 'hidden' ? 'pi-eye-slash' : 'pi-eye'\"\n [class.partial]=\"visibility.get(row.name) === 'partial'\"\n role=\"button\"\n [attr.aria-pressed]=\"visibility.get(row.name) !== 'hidden'\"\n [attr.aria-label]=\"(visibility.get(row.name) === 'hidden' ? 'Show ' : 'Hide ') + row.name\"\n [pTooltip]=\"\n (visibility.get(row.name) === 'hidden' ? 'Show' : 'Hide') +\n (row.hasChildren ? ' it and its subclasses' : '') +\n (visibility.get(row.name) === 'partial' ? ' (some are hidden)' : '')\n \"\n tooltipPosition=\"left\"\n (click)=\"flipHidden(row.name, $event)\"\n (keydown.enter)=\"flipHidden(row.name, $event)\"\n ></i>\n <span class=\"tree-swatch\" (click)=\"$event.stopPropagation()\" (keydown.enter)=\"$event.stopPropagation()\">\n <hex-color-picker\n [color]=\"colorOf(row.name)\"\n (colorChange)=\"recolor.emit({ name: row.name, color: $event })\"\n >\n </hex-color-picker>\n </span>\n <span class=\"tree-name\">{{ row.name }}</span>\n <span class=\"tree-long\">{{ node(row.name)?.title }}</span>\n <span class=\"tree-count\" *ngIf=\"total(row.name) > 0\">{{ total(row.name) }}</span>\n <i\n *ngIf=\"volume\"\n class=\"pi pi-box tree-3d\"\n [class.on]=\"shown3d.has(row.name)\"\n role=\"button\"\n [attr.aria-pressed]=\"shown3d.has(row.name)\"\n [attr.aria-label]=\"'Show ' + row.name + ' in 3D'\"\n pTooltip=\"Show in the volume, in 3D\"\n tooltipPosition=\"left\"\n (click)=\"flip3d(row.name, $event)\"\n ></i>\n </div>\n <div *ngIf=\"!rows.length\" class=\"tree-empty\">No class matches.</div>\n </div>\n</div>\n", styles: [":host{display:block;flex:0 0 auto}.class-tree{display:flex;flex-direction:column;padding-top:.25rem}.tree-header{display:flex;align-items:baseline;gap:.5rem;padding:0 .5rem .25rem}.tree-picked{font-size:.8rem;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.tree-search{margin:0 .5rem .25rem}.tree-body{height:14rem;min-height:3rem;max-height:70vh;overflow:auto;resize:vertical;padding-bottom:.25rem}.tree-row{display:flex;align-items:center;gap:.35rem;padding-top:.05rem;padding-bottom:.05rem;padding-right:.5rem;cursor:pointer;font-size:.8rem;white-space:nowrap}.tree-row:hover,.tree-row:focus-visible{background:var(--surface-hover, rgba(0, 0, 0, .04))}.tree-row.picked{background:var(--highlight-bg, rgba(51, 153, 255, .15))}.tree-row.marked{box-shadow:inset 3px 0 0 var(--primary-color)}.tree-row.absent{color:var(--text-color-secondary, #8a8a8a);font-style:italic;opacity:.7}.tree-toggle{flex:0 0 .9rem;font-size:.75rem;color:var(--text-color-secondary)}.tree-swatch{flex:0 0 auto;display:inline-flex}::ng-deep region-class-tree .tree-swatch .hex-picker-swatch{width:.8rem;height:.8rem;border-width:1px;border-radius:0}.tree-name{font-weight:700}.absent .tree-name{font-weight:400}.tree-long{min-width:0;overflow:hidden;text-overflow:ellipsis;flex:1 1 auto}.tree-count{flex:0 0 auto;font-size:.7rem;color:var(--text-color-secondary)}.tree-empty{padding:.5rem;font-size:.8rem;color:var(--text-color-secondary)}.tree-3d{flex:0 0 auto;font-size:.8rem;opacity:.35;cursor:pointer}.tree-3d:hover{opacity:.8}.tree-3d.on{opacity:1;color:var(--primary-color)}.tree-eye{flex:0 0 auto;font-size:.8rem;opacity:.4;cursor:pointer}.tree-eye:hover{opacity:.9}.tree-eye.partial{opacity:.7;color:var(--primary-color)}.tree-row.hidden-class .tree-eye{opacity:1}.tree-row.hidden-class .tree-swatch,.tree-row.hidden-class .tree-name,.tree-row.hidden-class .tree-long,.tree-row.hidden-class .tree-count{opacity:.45}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: InputTextModule }, { kind: "directive", type: i3.InputText, selector: "[pInputText]", inputs: ["variant"] }, { kind: "ngmodule", type: TooltipModule }, { kind: "directive", type: i4.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "appendTo", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "autoHide", "fitContent", "hideOnEscape", "pTooltip", "tooltipDisabled", "tooltipOptions"] }, { kind: "component", type: HexColorPickerComponent, selector: "hex-color-picker", inputs: ["color"], outputs: ["colorChange", "colorInput"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
142
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.9", type: ClassTreeComponent, isStandalone: true, selector: "region-class-tree", inputs: { nodes: "nodes", counts: "counts", colorOf: "colorOf", picked: "picked", marked: "marked", volume: "volume", shown3d: "shown3d", cellable: "cellable", individual: "individual", hidden: "hidden" }, outputs: { toggleCells: "toggleCells", pick: "pick", recolor: "recolor", toggle3d: "toggle3d", toggleHidden: "toggleHidden" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"class-tree\">\n <div class=\"tree-header\" *ngIf=\"picked as p\">\n <span class=\"tree-picked\">\n <b>{{ p }}</b\n ><span *ngIf=\"node(p)?.title as t\"> \u00B7 {{ t }}</span>\n </span>\n </div>\n <input\n type=\"text\"\n pInputText\n class=\"p-inputtext-sm tree-search\"\n placeholder=\"Search by name\"\n aria-label=\"Search the classes\"\n [ngModel]=\"query\"\n (ngModelChange)=\"onQuery($event)\"\n (keydown.enter)=\"pickFirstMatch($event)\"\n />\n <div class=\"tree-body\" role=\"tree\">\n <div\n *ngFor=\"let row of rows; trackBy: trackRow\"\n class=\"tree-row\"\n role=\"treeitem\"\n tabindex=\"0\"\n [attr.aria-expanded]=\"row.hasChildren ? row.expanded : null\"\n [class.absent]=\"total(row.name) === 0\"\n [class.picked]=\"row.name === picked\"\n [class.marked]=\"marked.has(row.name)\"\n [class.hidden-class]=\"visibility.get(row.name) === 'hidden'\"\n [style.padding-left.rem]=\"0.35 + row.depth * 0.9\"\n [pTooltip]=\"node(row.name)?.title || row.name\"\n tooltipPosition=\"left\"\n [showDelay]=\"600\"\n (click)=\"choose(row.name, $event)\"\n (keydown.enter)=\"choose(row.name, $event)\"\n >\n <i\n class=\"pi tree-toggle\"\n [class.pi-minus-circle]=\"row.hasChildren && row.expanded\"\n [class.pi-plus-circle]=\"row.hasChildren && !row.expanded\"\n [attr.aria-label]=\"row.expanded ? 'Collapse' : 'Expand'\"\n (click)=\"row.hasChildren && toggle(row, $event)\"\n ></i>\n <i\n class=\"pi tree-eye\"\n [ngClass]=\"visibility.get(row.name) === 'hidden' ? 'pi-eye-slash' : 'pi-eye'\"\n [class.partial]=\"visibility.get(row.name) === 'partial'\"\n role=\"button\"\n [attr.aria-pressed]=\"visibility.get(row.name) !== 'hidden'\"\n [attr.aria-label]=\"(visibility.get(row.name) === 'hidden' ? 'Show ' : 'Hide ') + row.name\"\n [pTooltip]=\"\n (visibility.get(row.name) === 'hidden' ? 'Show' : 'Hide') +\n (row.hasChildren ? ' it and its subclasses' : '') +\n (visibility.get(row.name) === 'partial' ? ' (some are hidden)' : '')\n \"\n tooltipPosition=\"left\"\n (click)=\"flipHidden(row.name, $event)\"\n (keydown.enter)=\"flipHidden(row.name, $event)\"\n ></i>\n <span class=\"tree-swatch\" (click)=\"$event.stopPropagation()\" (keydown.enter)=\"$event.stopPropagation()\">\n <hex-color-picker\n [color]=\"colorOf(row.name)\"\n (colorChange)=\"recolor.emit({ name: row.name, color: $event })\"\n >\n </hex-color-picker>\n </span>\n <span class=\"tree-name\">{{ row.name }}</span>\n <span class=\"tree-long\">{{ node(row.name)?.title }}</span>\n <span class=\"tree-count\" *ngIf=\"total(row.name) > 0\">{{ total(row.name) }}</span>\n <i\n *ngIf=\"volume\"\n class=\"pi pi-box tree-3d\"\n [class.on]=\"shown3d.has(row.name)\"\n role=\"button\"\n [attr.aria-pressed]=\"shown3d.has(row.name)\"\n [attr.aria-label]=\"'Show ' + row.name + ' in 3D'\"\n pTooltip=\"Show in the volume, in 3D\"\n tooltipPosition=\"left\"\n (click)=\"flip3d(row.name, $event)\"\n ></i>\n <i\n *ngIf=\"volume && anyCellable(row.name)\"\n class=\"pi pi-th-large tree-3d tree-cells\"\n [class.on]=\"allIndividual(row.name)\"\n role=\"button\"\n [attr.aria-pressed]=\"allIndividual(row.name)\"\n [attr.aria-label]=\"'Show ' + row.name + ' as individual cells'\"\n [pTooltip]=\"allIndividual(row.name) ? 'Show as one surface' : 'Show each cell by itself'\"\n tooltipPosition=\"left\"\n (click)=\"flipCells(row.name, $event)\"\n ></i>\n </div>\n <div *ngIf=\"!rows.length\" class=\"tree-empty\">No class matches.</div>\n </div>\n</div>\n", styles: [":host{display:block;flex:0 0 auto}.class-tree{display:flex;flex-direction:column;padding-top:.25rem}.tree-header{display:flex;align-items:baseline;gap:.5rem;padding:0 .5rem .25rem}.tree-picked{font-size:.8rem;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.tree-search{margin:0 .5rem .25rem}.tree-body{height:14rem;min-height:3rem;max-height:70vh;overflow:auto;resize:vertical;padding-bottom:.25rem}.tree-row{display:flex;align-items:center;gap:.35rem;padding-top:.05rem;padding-bottom:.05rem;padding-right:.5rem;cursor:pointer;font-size:.8rem;white-space:nowrap}.tree-row:hover,.tree-row:focus-visible{background:var(--surface-hover, rgba(0, 0, 0, .04))}.tree-row.picked{background:var(--highlight-bg, rgba(51, 153, 255, .15))}.tree-row.marked{box-shadow:inset 3px 0 0 var(--primary-color)}.tree-row.absent{color:var(--text-color-secondary, #8a8a8a);font-style:italic;opacity:.7}.tree-toggle{flex:0 0 .9rem;font-size:.75rem;color:var(--text-color-secondary)}.tree-swatch{flex:0 0 auto;display:inline-flex}::ng-deep region-class-tree .tree-swatch .hex-picker-swatch{width:.8rem;height:.8rem;border-width:1px;border-radius:0}.tree-name{font-weight:700}.absent .tree-name{font-weight:400}.tree-long{min-width:0;overflow:hidden;text-overflow:ellipsis;flex:1 1 auto}.tree-count{flex:0 0 auto;font-size:.7rem;color:var(--text-color-secondary)}.tree-empty{padding:.5rem;font-size:.8rem;color:var(--text-color-secondary)}.tree-3d{flex:0 0 auto;font-size:.8rem;opacity:.35;cursor:pointer}.tree-3d:hover{opacity:.8}.tree-3d.on{opacity:1;color:var(--primary-color)}.tree-eye{flex:0 0 auto;font-size:.8rem;opacity:.4;cursor:pointer}.tree-eye:hover{opacity:.9}.tree-eye.partial{opacity:.7;color:var(--primary-color)}.tree-row.hidden-class .tree-eye{opacity:1}.tree-row.hidden-class .tree-swatch,.tree-row.hidden-class .tree-name,.tree-row.hidden-class .tree-long,.tree-row.hidden-class .tree-count{opacity:.45}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: InputTextModule }, { kind: "directive", type: i3.InputText, selector: "[pInputText]", inputs: ["variant"] }, { kind: "ngmodule", type: TooltipModule }, { kind: "directive", type: i4.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "appendTo", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "autoHide", "fitContent", "hideOnEscape", "pTooltip", "tooltipDisabled", "tooltipOptions"] }, { kind: "component", type: HexColorPickerComponent, selector: "hex-color-picker", inputs: ["color"], outputs: ["colorChange", "colorInput"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
122
143
|
}
|
|
123
144
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.9", ngImport: i0, type: ClassTreeComponent, decorators: [{
|
|
124
145
|
type: Component,
|
|
125
|
-
args: [{ selector: 'region-class-tree', standalone: true, imports: [CommonModule, FormsModule, InputTextModule, TooltipModule, HexColorPickerComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"class-tree\">\n <div class=\"tree-header\" *ngIf=\"picked as p\">\n <span class=\"tree-picked\">\n <b>{{ p }}</b\n ><span *ngIf=\"node(p)?.title as t\"> \u00B7 {{ t }}</span>\n </span>\n </div>\n <input\n type=\"text\"\n pInputText\n class=\"p-inputtext-sm tree-search\"\n placeholder=\"Search by name\"\n aria-label=\"Search the classes\"\n [ngModel]=\"query\"\n (ngModelChange)=\"onQuery($event)\"\n (keydown.enter)=\"pickFirstMatch($event)\"\n />\n <div class=\"tree-body\" role=\"tree\">\n <div\n *ngFor=\"let row of rows; trackBy: trackRow\"\n class=\"tree-row\"\n role=\"treeitem\"\n tabindex=\"0\"\n [attr.aria-expanded]=\"row.hasChildren ? row.expanded : null\"\n [class.absent]=\"total(row.name) === 0\"\n [class.picked]=\"row.name === picked\"\n [class.marked]=\"marked.has(row.name)\"\n [class.hidden-class]=\"visibility.get(row.name) === 'hidden'\"\n [style.padding-left.rem]=\"0.35 + row.depth * 0.9\"\n [pTooltip]=\"node(row.name)?.title || row.name\"\n tooltipPosition=\"left\"\n [showDelay]=\"600\"\n (click)=\"choose(row.name, $event)\"\n (keydown.enter)=\"choose(row.name, $event)\"\n >\n <i\n class=\"pi tree-toggle\"\n [class.pi-minus-circle]=\"row.hasChildren && row.expanded\"\n [class.pi-plus-circle]=\"row.hasChildren && !row.expanded\"\n [attr.aria-label]=\"row.expanded ? 'Collapse' : 'Expand'\"\n (click)=\"row.hasChildren && toggle(row, $event)\"\n ></i>\n <i\n class=\"pi tree-eye\"\n [ngClass]=\"visibility.get(row.name) === 'hidden' ? 'pi-eye-slash' : 'pi-eye'\"\n [class.partial]=\"visibility.get(row.name) === 'partial'\"\n role=\"button\"\n [attr.aria-pressed]=\"visibility.get(row.name) !== 'hidden'\"\n [attr.aria-label]=\"(visibility.get(row.name) === 'hidden' ? 'Show ' : 'Hide ') + row.name\"\n [pTooltip]=\"\n (visibility.get(row.name) === 'hidden' ? 'Show' : 'Hide') +\n (row.hasChildren ? ' it and its subclasses' : '') +\n (visibility.get(row.name) === 'partial' ? ' (some are hidden)' : '')\n \"\n tooltipPosition=\"left\"\n (click)=\"flipHidden(row.name, $event)\"\n (keydown.enter)=\"flipHidden(row.name, $event)\"\n ></i>\n <span class=\"tree-swatch\" (click)=\"$event.stopPropagation()\" (keydown.enter)=\"$event.stopPropagation()\">\n <hex-color-picker\n [color]=\"colorOf(row.name)\"\n (colorChange)=\"recolor.emit({ name: row.name, color: $event })\"\n >\n </hex-color-picker>\n </span>\n <span class=\"tree-name\">{{ row.name }}</span>\n <span class=\"tree-long\">{{ node(row.name)?.title }}</span>\n <span class=\"tree-count\" *ngIf=\"total(row.name) > 0\">{{ total(row.name) }}</span>\n <i\n *ngIf=\"volume\"\n class=\"pi pi-box tree-3d\"\n [class.on]=\"shown3d.has(row.name)\"\n role=\"button\"\n [attr.aria-pressed]=\"shown3d.has(row.name)\"\n [attr.aria-label]=\"'Show ' + row.name + ' in 3D'\"\n pTooltip=\"Show in the volume, in 3D\"\n tooltipPosition=\"left\"\n (click)=\"flip3d(row.name, $event)\"\n ></i>\n </div>\n <div *ngIf=\"!rows.length\" class=\"tree-empty\">No class matches.</div>\n </div>\n</div>\n", styles: [":host{display:block;flex:0 0 auto}.class-tree{display:flex;flex-direction:column;padding-top:.25rem}.tree-header{display:flex;align-items:baseline;gap:.5rem;padding:0 .5rem .25rem}.tree-picked{font-size:.8rem;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.tree-search{margin:0 .5rem .25rem}.tree-body{height:14rem;min-height:3rem;max-height:70vh;overflow:auto;resize:vertical;padding-bottom:.25rem}.tree-row{display:flex;align-items:center;gap:.35rem;padding-top:.05rem;padding-bottom:.05rem;padding-right:.5rem;cursor:pointer;font-size:.8rem;white-space:nowrap}.tree-row:hover,.tree-row:focus-visible{background:var(--surface-hover, rgba(0, 0, 0, .04))}.tree-row.picked{background:var(--highlight-bg, rgba(51, 153, 255, .15))}.tree-row.marked{box-shadow:inset 3px 0 0 var(--primary-color)}.tree-row.absent{color:var(--text-color-secondary, #8a8a8a);font-style:italic;opacity:.7}.tree-toggle{flex:0 0 .9rem;font-size:.75rem;color:var(--text-color-secondary)}.tree-swatch{flex:0 0 auto;display:inline-flex}::ng-deep region-class-tree .tree-swatch .hex-picker-swatch{width:.8rem;height:.8rem;border-width:1px;border-radius:0}.tree-name{font-weight:700}.absent .tree-name{font-weight:400}.tree-long{min-width:0;overflow:hidden;text-overflow:ellipsis;flex:1 1 auto}.tree-count{flex:0 0 auto;font-size:.7rem;color:var(--text-color-secondary)}.tree-empty{padding:.5rem;font-size:.8rem;color:var(--text-color-secondary)}.tree-3d{flex:0 0 auto;font-size:.8rem;opacity:.35;cursor:pointer}.tree-3d:hover{opacity:.8}.tree-3d.on{opacity:1;color:var(--primary-color)}.tree-eye{flex:0 0 auto;font-size:.8rem;opacity:.4;cursor:pointer}.tree-eye:hover{opacity:.9}.tree-eye.partial{opacity:.7;color:var(--primary-color)}.tree-row.hidden-class .tree-eye{opacity:1}.tree-row.hidden-class .tree-swatch,.tree-row.hidden-class .tree-name,.tree-row.hidden-class .tree-long,.tree-row.hidden-class .tree-count{opacity:.45}\n"] }]
|
|
146
|
+
args: [{ selector: 'region-class-tree', standalone: true, imports: [CommonModule, FormsModule, InputTextModule, TooltipModule, HexColorPickerComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"class-tree\">\n <div class=\"tree-header\" *ngIf=\"picked as p\">\n <span class=\"tree-picked\">\n <b>{{ p }}</b\n ><span *ngIf=\"node(p)?.title as t\"> \u00B7 {{ t }}</span>\n </span>\n </div>\n <input\n type=\"text\"\n pInputText\n class=\"p-inputtext-sm tree-search\"\n placeholder=\"Search by name\"\n aria-label=\"Search the classes\"\n [ngModel]=\"query\"\n (ngModelChange)=\"onQuery($event)\"\n (keydown.enter)=\"pickFirstMatch($event)\"\n />\n <div class=\"tree-body\" role=\"tree\">\n <div\n *ngFor=\"let row of rows; trackBy: trackRow\"\n class=\"tree-row\"\n role=\"treeitem\"\n tabindex=\"0\"\n [attr.aria-expanded]=\"row.hasChildren ? row.expanded : null\"\n [class.absent]=\"total(row.name) === 0\"\n [class.picked]=\"row.name === picked\"\n [class.marked]=\"marked.has(row.name)\"\n [class.hidden-class]=\"visibility.get(row.name) === 'hidden'\"\n [style.padding-left.rem]=\"0.35 + row.depth * 0.9\"\n [pTooltip]=\"node(row.name)?.title || row.name\"\n tooltipPosition=\"left\"\n [showDelay]=\"600\"\n (click)=\"choose(row.name, $event)\"\n (keydown.enter)=\"choose(row.name, $event)\"\n >\n <i\n class=\"pi tree-toggle\"\n [class.pi-minus-circle]=\"row.hasChildren && row.expanded\"\n [class.pi-plus-circle]=\"row.hasChildren && !row.expanded\"\n [attr.aria-label]=\"row.expanded ? 'Collapse' : 'Expand'\"\n (click)=\"row.hasChildren && toggle(row, $event)\"\n ></i>\n <i\n class=\"pi tree-eye\"\n [ngClass]=\"visibility.get(row.name) === 'hidden' ? 'pi-eye-slash' : 'pi-eye'\"\n [class.partial]=\"visibility.get(row.name) === 'partial'\"\n role=\"button\"\n [attr.aria-pressed]=\"visibility.get(row.name) !== 'hidden'\"\n [attr.aria-label]=\"(visibility.get(row.name) === 'hidden' ? 'Show ' : 'Hide ') + row.name\"\n [pTooltip]=\"\n (visibility.get(row.name) === 'hidden' ? 'Show' : 'Hide') +\n (row.hasChildren ? ' it and its subclasses' : '') +\n (visibility.get(row.name) === 'partial' ? ' (some are hidden)' : '')\n \"\n tooltipPosition=\"left\"\n (click)=\"flipHidden(row.name, $event)\"\n (keydown.enter)=\"flipHidden(row.name, $event)\"\n ></i>\n <span class=\"tree-swatch\" (click)=\"$event.stopPropagation()\" (keydown.enter)=\"$event.stopPropagation()\">\n <hex-color-picker\n [color]=\"colorOf(row.name)\"\n (colorChange)=\"recolor.emit({ name: row.name, color: $event })\"\n >\n </hex-color-picker>\n </span>\n <span class=\"tree-name\">{{ row.name }}</span>\n <span class=\"tree-long\">{{ node(row.name)?.title }}</span>\n <span class=\"tree-count\" *ngIf=\"total(row.name) > 0\">{{ total(row.name) }}</span>\n <i\n *ngIf=\"volume\"\n class=\"pi pi-box tree-3d\"\n [class.on]=\"shown3d.has(row.name)\"\n role=\"button\"\n [attr.aria-pressed]=\"shown3d.has(row.name)\"\n [attr.aria-label]=\"'Show ' + row.name + ' in 3D'\"\n pTooltip=\"Show in the volume, in 3D\"\n tooltipPosition=\"left\"\n (click)=\"flip3d(row.name, $event)\"\n ></i>\n <i\n *ngIf=\"volume && anyCellable(row.name)\"\n class=\"pi pi-th-large tree-3d tree-cells\"\n [class.on]=\"allIndividual(row.name)\"\n role=\"button\"\n [attr.aria-pressed]=\"allIndividual(row.name)\"\n [attr.aria-label]=\"'Show ' + row.name + ' as individual cells'\"\n [pTooltip]=\"allIndividual(row.name) ? 'Show as one surface' : 'Show each cell by itself'\"\n tooltipPosition=\"left\"\n (click)=\"flipCells(row.name, $event)\"\n ></i>\n </div>\n <div *ngIf=\"!rows.length\" class=\"tree-empty\">No class matches.</div>\n </div>\n</div>\n", styles: [":host{display:block;flex:0 0 auto}.class-tree{display:flex;flex-direction:column;padding-top:.25rem}.tree-header{display:flex;align-items:baseline;gap:.5rem;padding:0 .5rem .25rem}.tree-picked{font-size:.8rem;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.tree-search{margin:0 .5rem .25rem}.tree-body{height:14rem;min-height:3rem;max-height:70vh;overflow:auto;resize:vertical;padding-bottom:.25rem}.tree-row{display:flex;align-items:center;gap:.35rem;padding-top:.05rem;padding-bottom:.05rem;padding-right:.5rem;cursor:pointer;font-size:.8rem;white-space:nowrap}.tree-row:hover,.tree-row:focus-visible{background:var(--surface-hover, rgba(0, 0, 0, .04))}.tree-row.picked{background:var(--highlight-bg, rgba(51, 153, 255, .15))}.tree-row.marked{box-shadow:inset 3px 0 0 var(--primary-color)}.tree-row.absent{color:var(--text-color-secondary, #8a8a8a);font-style:italic;opacity:.7}.tree-toggle{flex:0 0 .9rem;font-size:.75rem;color:var(--text-color-secondary)}.tree-swatch{flex:0 0 auto;display:inline-flex}::ng-deep region-class-tree .tree-swatch .hex-picker-swatch{width:.8rem;height:.8rem;border-width:1px;border-radius:0}.tree-name{font-weight:700}.absent .tree-name{font-weight:400}.tree-long{min-width:0;overflow:hidden;text-overflow:ellipsis;flex:1 1 auto}.tree-count{flex:0 0 auto;font-size:.7rem;color:var(--text-color-secondary)}.tree-empty{padding:.5rem;font-size:.8rem;color:var(--text-color-secondary)}.tree-3d{flex:0 0 auto;font-size:.8rem;opacity:.35;cursor:pointer}.tree-3d:hover{opacity:.8}.tree-3d.on{opacity:1;color:var(--primary-color)}.tree-eye{flex:0 0 auto;font-size:.8rem;opacity:.4;cursor:pointer}.tree-eye:hover{opacity:.9}.tree-eye.partial{opacity:.7;color:var(--primary-color)}.tree-row.hidden-class .tree-eye{opacity:1}.tree-row.hidden-class .tree-swatch,.tree-row.hidden-class .tree-name,.tree-row.hidden-class .tree-long,.tree-row.hidden-class .tree-count{opacity:.45}\n"] }]
|
|
126
147
|
}], ctorParameters: () => [{ type: i0.ElementRef }], propDecorators: { nodes: [{
|
|
127
148
|
type: Input
|
|
128
149
|
}], counts: [{
|
|
@@ -137,6 +158,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.9", ngImpor
|
|
|
137
158
|
type: Input
|
|
138
159
|
}], shown3d: [{
|
|
139
160
|
type: Input
|
|
161
|
+
}], cellable: [{
|
|
162
|
+
type: Input
|
|
163
|
+
}], individual: [{
|
|
164
|
+
type: Input
|
|
165
|
+
}], toggleCells: [{
|
|
166
|
+
type: Output
|
|
140
167
|
}], hidden: [{
|
|
141
168
|
type: Input
|
|
142
169
|
}], pick: [{
|
|
@@ -153,4 +180,4 @@ export function scrollToPicked(host, selector) {
|
|
|
153
180
|
const row = host.querySelector(selector);
|
|
154
181
|
row?.scrollIntoView?.({ block: 'nearest' });
|
|
155
182
|
}
|
|
156
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3MtdHJlZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL3JlZ2lvbi1lZGl0b3IvY2xhc3MtdHJlZS9jbGFzcy10cmVlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvcmVnaW9uLWVkaXRvci9jbGFzcy10cmVlL2NsYXNzLXRyZWUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsVUFBVSxFQUNWLFlBQVksRUFDWixLQUFLLEVBRUwsTUFBTSxHQUVQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ3BELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUdoRCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxtREFBbUQsQ0FBQztBQUM1RixPQUFPLEVBQTJCLFNBQVMsRUFBRSxjQUFjLEVBQUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGNBQWMsQ0FBQzs7Ozs7O0FBWXhHOzs7Ozs7R0FNRztBQVNILE1BQU0sT0FBTyxrQkFBa0I7SUFpQzdCLFlBQTZCLEVBQTJCO1FBQTNCLE9BQUUsR0FBRixFQUFFLENBQXlCO1FBaEN4RCxxQkFBcUI7UUFDWixVQUFLLEdBQStCLEVBQUUsQ0FBQztRQUNoRCw2RUFBNkU7UUFDcEUsV0FBTSxHQUFnQyxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ3pELHNGQUFzRjtRQUM3RSxZQUFPLEdBQTZCLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQztRQUM3RCxrRkFBa0Y7UUFDekUsV0FBTSxHQUFrQixJQUFJLENB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QUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsR0FBRyxLQUFLLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDeEYsQ0FBQztJQUNILENBQUM7OEdBeEdVLGtCQUFrQjtrR0FBbEIsa0JBQWtCLG1XQzVDL0IscTFHQW1GQSw0N0RENUNZLFlBQVksNlZBQUUsV0FBVyw4bUJBQUUsZUFBZSx3SEFBRSxhQUFhLHNYQUFFLHVCQUF1Qjs7MkZBS2pGLGtCQUFrQjtrQkFSOUIsU0FBUzsrQkFDRSxtQkFBbUIsY0FDakIsSUFBSSxXQUNQLENBQUMsWUFBWSxFQUFFLFdBQVcsRUFBRSxlQUFlLEVBQUUsYUFBYSxFQUFFLHVCQUF1QixDQUFDLG1CQUc1RSx1QkFBdUIsQ0FBQyxNQUFNOytFQUl0QyxLQUFLO3NCQUFiLEtBQUs7Z0JBRUcsTUFBTTtzQkFBZCxLQUFLO2dCQUVHLE9BQU87c0JBQWYsS0FBSztnQkFFRyxNQUFNO3NCQUFkLEtBQUs7Z0JBRUcsTUFBTTtzQkFBZCxLQUFLO2dCQUVHLE1BQU07c0JBQWQsS0FBSztnQkFFRyxPQUFPO3NCQUFmLEtBQUs7Z0JBRUcsTUFBTTtzQkFBZCxLQUFLO2dCQUVJLElBQUk7c0JBQWIsTUFBTTtnQkFFRyxPQUFPO3NCQUFoQixNQUFNO2dCQUVHLFFBQVE7c0JBQWpCLE1BQU07Z0JBRUcsWUFBWTtzQkFBckIsTUFBTTs7QUFtRlQsc0ZBQXNGO0FBQ3RGLE1BQU0sVUFBVSxjQUFjLENBQUMsSUFBaUIsRUFBRSxRQUFnQjtJQUNoRSxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBdUIsQ0FBQztJQUMvRCxHQUFHLEVBQUUsY0FBYyxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQztBQUM5QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPdXRwdXQsXG4gIFNpbXBsZUNoYW5nZXMsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgSW5wdXRUZXh0TW9kdWxlIH0gZnJvbSAncHJpbWVuZy9pbnB1dHRleHQnO1xuaW1wb3J0IHsgVG9vbHRpcE1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvdG9vbHRpcCc7XG5cbmltcG9ydCB0eXBlIHsgUmVnaW9uQ2xhc3NOb2RlIH0gZnJvbSAnLi4vLi4vcmVnaW9uLXNvdXJjZS9yZWdpb24tdGlsZXMnO1xuaW1wb3J0IHsgSGV4Q29sb3JQaWNrZXJDb21wb25lbnQgfSBmcm9tICcuLi8uLi9oZXgtY29sb3ItcGlja2VyL2hleC1jb2xvci1waWNrZXIuY29tcG9uZW50JztcbmltcG9ydCB7IENsYXNzVHJlZSwgQ2xhc3NUcmVlUm93LCBhbmNlc3RvcnMsIGJ1aWxkQ2xhc3NUcmVlLCBzdWJ0cmVlLCB2aXNpYmxlUm93cyB9IGZyb20gJy4vY2xhc3MtdHJlZSc7XG5cbi8qKiBBIHBpY2sgaW4gdGhlIHRyZWU6IHRoZSBjbGFzcywgYW5kIGl0IHdpdGggZXZlcnkgY2xhc3MgdW5kZXIgaXQuICovXG5leHBvcnQgaW50ZXJmYWNlIENsYXNzVHJlZVBpY2sge1xuICBuYW1lOiBzdHJpbmc7XG4gIGNsYXNzZXM6IHN0cmluZ1tdO1xuICBhZGRpdGl2ZTogYm9vbGVhbjtcbn1cblxuLyoqIFdoZXRoZXIgYSBjbGFzcyBpcyBzaG93bjogaXQgYW5kIGl0cyBzdWJjbGFzc2VzIGFsbCwgbm9uZSAoJ2hpZGRlbicpLCBvciBvbmx5IHNvbWUgKCdwYXJ0aWFsJykuICovXG5leHBvcnQgdHlwZSBDbGFzc1Zpc2liaWxpdHkgPSAnc2hvd24nIHwgJ2hpZGRlbicgfCAncGFydGlhbCc7XG5cbi8qKlxuICogVGhlIFJlZ2lvbiBFZGl0b3IncyBjbGFzc2VzIGFzIGEgaGllcmFyY2h5IChhIGJyYWluIGF0bGFzJ3Mgb250b2xvZ3kpLCBhcyB0aGUgQWxsZW4gYXRsYXMgdmlld2VyXG4gKiBzaG93cyBpdDogY29sbGFwc2libGUsIGVhY2ggY2xhc3Mgd2l0aCBpdHMgY29sb3VyLCBuYW1lIGFuZCBsb25nIG5hbWUsIGFuZCB0aGUgcmVnaW9ucyBpdCBhbmRcbiAqIGl0cyBzdWJjbGFzc2VzIGhhdmUgb24gdGhpcyBzbGljZTsgYSBjbGFzcyB3aXRoIG5vbmUgaXMgZ3JleWVkLiBQaWNraW5nIGEgY2xhc3Mgc2VsZWN0cyBhbGwgaXRzXG4gKiByZWdpb25zIGFuZCBpdHMgc3ViY2xhc3NlcycgKHRoZSBlZGl0b3IgZG9lcyB0aGUgc2VsZWN0aW5nKS4gU2VhcmNoIGJ5IG5hbWUgb3IgbG9uZyBuYW1lLiBBXG4gKiBjbGFzcydzIHN3YXRjaCByZWNvbG91cnMgaXQsIGFzIHRoZSBjbGFzcyBsaXN0J3MgZG9lczsgaXRzIGV5ZSBoaWRlcyBpdCBhbmQgaXRzIHN1YmNsYXNzZXMuXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3JlZ2lvbi1jbGFzcy10cmVlJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgRm9ybXNNb2R1bGUsIElucHV0VGV4dE1vZHVsZSwgVG9vbHRpcE1vZHVsZSwgSGV4Q29sb3JQaWNrZXJDb21wb25lbnRdLFxuICB0ZW1wbGF0ZVVybDogJy4vY2xhc3MtdHJlZS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2NsYXNzLXRyZWUuY29tcG9uZW50LnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIENsYXNzVHJlZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcyB7XG4gIC8qKiBUaGUgaGllcmFyY2h5LiAqL1xuICBASW5wdXQoKSBub2RlczogcmVhZG9ubHkgUmVnaW9uQ2xhc3NOb2RlW10gPSBbXTtcbiAgLyoqIFJlZ2lvbnMgcGVyIGNsYXNzIG9uIHRoaXMgc2xpY2UgKHRoZSByZWdpb25zIGFuZCB0aGUgcmVnaW9uIHNvdXJjZSdzKS4gKi9cbiAgQElucHV0KCkgY291bnRzOiBSZWFkb25seU1hcDxzdHJpbmcsIG51bWJlcj4gPSBuZXcgTWFwKCk7XG4gIC8qKiBBIGNsYXNzJ3MgY29sb3VyIChhIG5ldyBmdW5jdGlvbiB3aGVuIHRoZSBjb2xvdXJzIGNoYW5nZSwgc28gdGhlIHJvd3MgcmVwYWludCkuICovXG4gIEBJbnB1dCgpIGNvbG9yT2Y6IChuYW1lOiBzdHJpbmcpID0+IHN0cmluZyA9ICgpID0+ICcjOTk5OTk5JztcbiAgLyoqIFRoZSBjbGFzcyBwaWNrZWQgbGFzdCAoaGlnaGxpZ2h0ZWQsIGl0cyBwYXRoIGV4cGFuZGVkLCBzY3JvbGxlZCBpbnRvIHZpZXcpLiAqL1xuICBASW5wdXQoKSBwaWNrZWQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAvKiogQ2xhc3NlcyB3aXRoIGEgc2VsZWN0ZWQgcmVnaW9uIChtYXJrZWQpLiAqL1xuICBASW5wdXQoKSBtYXJrZWQ6IFJlYWRvbmx5U2V0PHN0cmluZz4gPSBuZXcgU2V0KCk7XG4gIC8qKiBXaGV0aGVyIGEgdm9sdW1lIHZpZXcgaXMgb24gc2NyZWVuOiBlYWNoIGNsYXNzIGNhbiB0aGVuIGJlIHNob3duIGluIDNELiAqL1xuICBASW5wdXQoKSB2b2x1bWUgPSBmYWxzZTtcbiAgLyoqIFRoZSBjbGFzc2VzIHNob3duIGluIDNELiAqL1xuICBASW5wdXQoKSBzaG93bjNkOiBSZWFkb25seVNldDxzdHJpbmc+ID0gbmV3IFNldCgpO1xuICAvKiogVGhlIGNsYXNzZXMgaGlkZGVuIGZyb20gdmlldy4gKi9cbiAgQElucHV0KCkgaGlkZGVuOiBSZWFkb25seVNldDxzdHJpbmc+ID0gbmV3IFNldCgpO1xuXG4gIEBPdXRwdXQoKSBwaWNrID0gbmV3IEV2ZW50RW1pdHRlcjxDbGFzc1RyZWVQaWNrPigpO1xuICAvKiogQSBjbGFzcydzIHN3YXRjaCBwaWNrZWQgYSBuZXcgY29sb3VyLiAqL1xuICBAT3V0cHV0KCkgcmVjb2xvciA9IG5ldyBFdmVudEVtaXR0ZXI8eyBuYW1lOiBzdHJpbmc7IGNvbG9yOiBzdHJpbmcgfT4oKTtcbiAgLyoqIEEgY2xhc3MncyAzRCB0b2dnbGU6IGl0IHdpdGggZXZlcnkgY2xhc3MgdW5kZXIgaXQuICovXG4gIEBPdXRwdXQoKSB0b2dnbGUzZCA9IG5ldyBFdmVudEVtaXR0ZXI8eyBuYW1lOiBzdHJpbmc7IGNsYXNzZXM6IHN0cmluZ1tdIH0+KCk7XG4gIC8qKiBBIGNsYXNzJ3MgZXllOiBoaWRlIChvciBzaG93KSBpdCB3aXRoIGV2ZXJ5IGNsYXNzIHVuZGVyIGl0LiAqL1xuICBAT3V0cHV0KCkgdG9nZ2xlSGlkZGVuID0gbmV3IEV2ZW50RW1pdHRlcjx7IGNsYXNzZXM6IHN0cmluZ1tdOyBoaWRkZW46IGJvb2xlYW4gfT4oKTtcblxuICBwcm90ZWN0ZWQgdHJlZTogQ2xhc3NUcmVlID0gYnVpbGRDbGFzc1RyZWUoW10sIG5ldyBNYXAoKSk7XG4gIHByb3RlY3RlZCByb3dzOiBDbGFzc1RyZWVSb3dbXSA9IFtdO1xuICAvKiogRWFjaCByb3cncyB2aXNpYmlsaXR5IChhIHJvdyBhYnNlbnQ6IHNob3duKS4gKi9cbiAgcHJvdGVjdGVkIHZpc2liaWxpdHkgPSBuZXcgTWFwPHN0cmluZywgQ2xhc3NWaXNpYmlsaXR5PigpO1xuICBwcm90ZWN0ZWQgcXVlcnkgPSAnJztcbiAgcHJpdmF0ZSBleHBhbmRlZCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgZWw6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+KSB7fVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBjb25zdCBmcmVzaCA9ICEhY2hhbmdlc1snbm9kZXMnXTtcbiAgICBpZiAoZnJlc2ggfHwgY2hhbmdlc1snY291bnRzJ10pIHRoaXMudHJlZSA9IGJ1aWxkQ2xhc3NUcmVlKHRoaXMubm9kZXMsIHRoaXMuY291bnRzKTtcbiAgICAvLyBBIG5ldyBoaWVyYXJjaHkgb3BlbnMgd2l0aCBpdHMgcm9vdHMgZXhwYW5kZWQsIGFzIHRoZSBhdGxhcyB2aWV3ZXIgZG9lcy5cbiAgICBpZiAoZnJlc2gpIHRoaXMuZXhwYW5kZWQgPSBuZXcgU2V0KHRoaXMudHJlZS5yb290cyk7XG4gICAgaWYgKGNoYW5nZXNbJ3BpY2tlZCddICYmIHRoaXMucGlja2VkKSBmb3IgKGNvbnN0IGEgb2YgYW5jZXN0b3JzKHRoaXMudHJlZSwgdGhpcy5waWNrZWQpKSB0aGlzLmV4cGFuZGVkLmFkZChhKTtcbiAgICB0aGlzLnJlZnJlc2goKTtcbiAgICAvLyBBIHBpY2sgZnJvbSBlbHNld2hlcmUgKGEgc3VyZmFjZSBjbGlja2VkIGluIDNEKSBtYXkgYmUgb2ZmIHNjcmVlbjogYnJpbmcgaXRzIHJvdyBpbnRvIHZpZXcuXG4gICAgaWYgKGNoYW5nZXNbJ3BpY2tlZCddICYmIHRoaXMucGlja2VkKVxuICAgICAgc2V0VGltZW91dCgoKSA9PiBzY3JvbGxUb1BpY2tlZCh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQsICcudHJlZS1yb3cucGlja2VkJykpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG5vZGUobmFtZTogc3RyaW5nKTogUmVnaW9uQ2xhc3NOb2RlIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy50cmVlLm5vZGUuZ2V0KG5hbWUpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHRvdGFsKG5hbWU6IHN0cmluZyk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMudHJlZS50b3RhbC5nZXQobmFtZSkgPz8gMDtcbiAgfVxuXG4gIHByb3RlY3RlZCB0b2dnbGUocm93OiBDbGFzc1RyZWVSb3csIGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGlmICh0aGlzLmV4cGFuZGVkLmhhcyhyb3cubmFtZSkpIHRoaXMuZXhwYW5kZWQuZGVsZXRlKHJvdy5uYW1lKTtcbiAgICBlbHNlIHRoaXMuZXhwYW5kZWQuYWRkKHJvdy5uYW1lKTtcbiAgICB0aGlzLnJlZnJlc2goKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjaG9vc2UobmFtZTogc3RyaW5nLCBldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCBlID0gZXZlbnQgYXMgTW91c2VFdmVudCB8IEtleWJvYXJkRXZlbnQ7XG4gICAgdGhpcy5waWNrLmVtaXQoeyBuYW1lLCBjbGFzc2VzOiBzdWJ0cmVlKHRoaXMudHJlZSwgbmFtZSksIGFkZGl0aXZlOiBlLnNoaWZ0S2V5IHx8IGUubWV0YUtleSB8fCBlLmN0cmxLZXkgfSk7XG4gIH1cblxuICAvKiogVGhlIGV5ZTogYSBjbGFzcyBoaWRkZW4gKHdob2xseSkgaXMgc2hvd24gYWdhaW4gd2l0aCBpdHMgc3ViY2xhc3Nlczsgb3RoZXJ3aXNlIHRoZXkgYXJlIGhpZGRlbi4gKi9cbiAgcHJvdGVjdGVkIGZsaXBIaWRkZW4obmFtZTogc3RyaW5nLCBldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBjb25zdCBoaWRkZW4gPSB0aGlzLnZpc2liaWxpdHkuZ2V0KG5hbWUpICE9PSAnaGlkZGVuJztcbiAgICB0aGlzLnRvZ2dsZUhpZGRlbi5lbWl0KHsgY2xhc3Nlczogc3VidHJlZSh0aGlzLnRyZWUsIG5hbWUpLCBoaWRkZW4gfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZmxpcDNkKG5hbWU6IHN0cmluZywgZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgdGhpcy50b2dnbGUzZC5lbWl0KHsgbmFtZSwgY2xhc3Nlczogc3VidHJlZSh0aGlzLnRyZWUsIG5hbWUpIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uUXVlcnkodmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMucXVlcnkgPSB2YWx1ZTtcbiAgICB0aGlzLnJlZnJlc2goKTtcbiAgfVxuXG4gIC8qKiBFbnRlciBpbiB0aGUgc2VhcmNoIGJveCBwaWNrcyB0aGUgZmlyc3QgbWF0Y2guICovXG4gIHByb3RlY3RlZCBwaWNrRmlyc3RNYXRjaChldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCBxID0gdGhpcy5xdWVyeS50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICBjb25zdCBoaXQgPSB0aGlzLnJvd3MuZmluZChcbiAgICAgIChyKSA9PiByLm5hbWUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhxKSB8fCAodGhpcy5ub2RlKHIubmFtZSk/LnRpdGxlID8/ICcnKS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHEpLFxuICAgICk7XG4gICAgaWYgKGhpdCkgdGhpcy5jaG9vc2UoaGl0Lm5hbWUsIGV2ZW50KTtcbiAgfVxuXG4gIHByb3RlY3RlZCByZWFkb25seSB0cmFja1JvdyA9IChfOiBudW1iZXIsIHI6IENsYXNzVHJlZVJvdykgPT4gci5uYW1lO1xuXG4gIHByaXZhdGUgcmVmcmVzaCgpOiB2b2lkIHtcbiAgICB0aGlzLnJvd3MgPSB2aXNpYmxlUm93cyh0aGlzLnRyZWUsIHRoaXMuZXhwYW5kZWQsIHRoaXMucXVlcnkpO1xuICAgIHRoaXMudmlzaWJpbGl0eSA9IG5ldyBNYXAoKTtcbiAgICBpZiAoIXRoaXMuaGlkZGVuLnNpemUpIHJldHVybjtcbiAgICBmb3IgKGNvbnN0IHJvdyBvZiB0aGlzLnJvd3MpIHtcbiAgICAgIGNvbnN0IGNsYXNzZXMgPSBzdWJ0cmVlKHRoaXMudHJlZSwgcm93Lm5hbWUpO1xuICAgICAgY29uc3Qgb2ZmID0gY2xhc3Nlcy5maWx0ZXIoKGMpID0+IHRoaXMuaGlkZGVuLmhhcyhjKSkubGVuZ3RoO1xuICAgICAgaWYgKG9mZikgdGhpcy52aXNpYmlsaXR5LnNldChyb3cubmFtZSwgb2ZmID09PSBjbGFzc2VzLmxlbmd0aCA/ICdoaWRkZW4nIDogJ3BhcnRpYWwnKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqIFNjcm9sbCB0aGUgcm93IG1hdGNoaW5nIGBzZWxlY3RvcmAgaW5zaWRlIGBob3N0YCBpbnRvIHZpZXcsIGlmIGl0IGlzIG91dCBvZiBpdC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzY3JvbGxUb1BpY2tlZChob3N0OiBIVE1MRWxlbWVudCwgc2VsZWN0b3I6IHN0cmluZyk6IHZvaWQge1xuICBjb25zdCByb3cgPSBob3N0LnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpIGFzIEhUTUxFbGVtZW50IHwgbnVsbDtcbiAgcm93Py5zY3JvbGxJbnRvVmlldz8uKHsgYmxvY2s6ICduZWFyZXN0JyB9KTtcbn1cbiIsIjxkaXYgY2xhc3M9XCJjbGFzcy10cmVlXCI+XG4gIDxkaXYgY2xhc3M9XCJ0cmVlLWhlYWRlclwiICpuZ0lmPVwicGlja2VkIGFzIHBcIj5cbiAgICA8c3BhbiBjbGFzcz1cInRyZWUtcGlja2VkXCI+XG4gICAgICA8Yj57eyBwIH19PC9iXG4gICAgICA+PHNwYW4gKm5nSWY9XCJub2RlKHApPy50aXRsZSBhcyB0XCI+IMK3IHt7IHQgfX08L3NwYW4+XG4gICAgPC9zcGFuPlxuICA8L2Rpdj5cbiAgPGlucHV0XG4gICAgdHlwZT1cInRleHRcIlxuICAgIHBJbnB1dFRleHRcbiAgICBjbGFzcz1cInAtaW5wdXR0ZXh0LXNtIHRyZWUtc2VhcmNoXCJcbiAgICBwbGFjZWhvbGRlcj1cIlNlYXJjaCBieSBuYW1lXCJcbiAgICBhcmlhLWxhYmVsPVwiU2VhcmNoIHRoZSBjbGFzc2VzXCJcbiAgICBbbmdNb2RlbF09XCJxdWVyeVwiXG4gICAgKG5nTW9kZWxDaGFuZ2UpPVwib25RdWVyeSgkZXZlbnQpXCJcbiAgICAoa2V5ZG93bi5lbnRlcik9XCJwaWNrRmlyc3RNYXRjaCgkZXZlbnQpXCJcbiAgLz5cbiAgPGRpdiBjbGFzcz1cInRyZWUtYm9keVwiIHJvbGU9XCJ0cmVlXCI+XG4gICAgPGRpdlxuICAgICAgKm5nRm9yPVwibGV0IHJvdyBvZiByb3dzOyB0cmFja0J5OiB0cmFja1Jvd1wiXG4gICAgICBjbGFzcz1cInRyZWUtcm93XCJcbiAgICAgIHJvbGU9XCJ0cmVlaXRlbVwiXG4gICAgICB0YWJpbmRleD1cIjBcIlxuICAgICAgW2F0dHIuYXJpYS1leHBhbmRlZF09XCJyb3cuaGFzQ2hpbGRyZW4gPyByb3cuZXhwYW5kZWQgOiBudWxsXCJcbiAgICAgIFtjbGFzcy5hYnNlbnRdPVwidG90YWwocm93Lm5hbWUpID09PSAwXCJcbiAgICAgIFtjbGFzcy5waWNrZWRdPVwicm93Lm5hbWUgPT09IHBpY2tlZFwiXG4gICAgICBbY2xhc3MubWFya2VkXT1cIm1hcmtlZC5oYXMocm93Lm5hbWUpXCJcbiAgICAgIFtjbGFzcy5oaWRkZW4tY2xhc3NdPVwidmlzaWJpbGl0eS5nZXQocm93Lm5hbWUpID09PSAnaGlkZGVuJ1wiXG4gICAgICBbc3R5bGUucGFkZGluZy1sZWZ0LnJlbV09XCIwLjM1ICsgcm93LmRlcHRoICogMC45XCJcbiAgICAgIFtwVG9vbHRpcF09XCJub2RlKHJvdy5uYW1lKT8udGl0bGUgfHwgcm93Lm5hbWVcIlxuICAgICAgdG9vbHRpcFBvc2l0aW9uPVwibGVmdFwiXG4gICAgICBbc2hvd0RlbGF5XT1cIjYwMFwiXG4gICAgICAoY2xpY2spPVwiY2hvb3NlKHJvdy5uYW1lLCAkZXZlbnQpXCJcbiAgICAgIChrZXlkb3duLmVudGVyKT1cImNob29zZShyb3cubmFtZSwgJGV2ZW50KVwiXG4gICAgPlxuICAgICAgPGlcbiAgICAgICAgY2xhc3M9XCJwaSB0cmVlLXRvZ2dsZVwiXG4gICAgICAgIFtjbGFzcy5waS1taW51cy1jaXJjbGVdPVwicm93Lmhhc0NoaWxkcmVuICYmIHJvdy5leHBhbmRlZFwiXG4gICAgICAgIFtjbGFzcy5waS1wbHVzLWNpcmNsZV09XCJyb3cuaGFzQ2hpbGRyZW4gJiYgIXJvdy5leHBhbmRlZFwiXG4gICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwicm93LmV4cGFuZGVkID8gJ0NvbGxhcHNlJyA6ICdFeHBhbmQnXCJcbiAgICAgICAgKGNsaWNrKT1cInJvdy5oYXNDaGlsZHJlbiAmJiB0b2dnbGUocm93LCAkZXZlbnQpXCJcbiAgICAgID48L2k+XG4gICAgICA8aVxuICAgICAgICBjbGFzcz1cInBpIHRyZWUtZXllXCJcbiAgICAgICAgW25nQ2xhc3NdPVwidmlzaWJpbGl0eS5nZXQocm93Lm5hbWUpID09PSAnaGlkZGVuJyA/ICdwaS1leWUtc2xhc2gnIDogJ3BpLWV5ZSdcIlxuICAgICAgICBbY2xhc3MucGFydGlhbF09XCJ2aXNpYmlsaXR5LmdldChyb3cubmFtZSkgPT09ICdwYXJ0aWFsJ1wiXG4gICAgICAgIHJvbGU9XCJidXR0b25cIlxuICAgICAgICBbYXR0ci5hcmlhLXByZXNzZWRdPVwidmlzaWJpbGl0eS5nZXQocm93Lm5hbWUpICE9PSAnaGlkZGVuJ1wiXG4gICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiKHZpc2liaWxpdHkuZ2V0KHJvdy5uYW1lKSA9PT0gJ2hpZGRlbicgPyAnU2hvdyAnIDogJ0hpZGUgJykgKyByb3cubmFtZVwiXG4gICAgICAgIFtwVG9vbHRpcF09XCJcbiAgICAgICAgICAodmlzaWJpbGl0eS5nZXQocm93Lm5hbWUpID09PSAnaGlkZGVuJyA/ICdTaG93JyA6ICdIaWRlJykgK1xuICAgICAgICAgIChyb3cuaGFzQ2hpbGRyZW4gPyAnIGl0IGFuZCBpdHMgc3ViY2xhc3NlcycgOiAnJykgK1xuICAgICAgICAgICh2aXNpYmlsaXR5LmdldChyb3cubmFtZSkgPT09ICdwYXJ0aWFsJyA/ICcgKHNvbWUgYXJlIGhpZGRlbiknIDogJycpXG4gICAgICAgIFwiXG4gICAgICAgIHRvb2x0aXBQb3NpdGlvbj1cImxlZnRcIlxuICAgICAgICAoY2xpY2spPVwiZmxpcEhpZGRlbihyb3cubmFtZSwgJGV2ZW50KVwiXG4gICAgICAgIChrZXlkb3duLmVudGVyKT1cImZsaXBIaWRkZW4ocm93Lm5hbWUsICRldmVudClcIlxuICAgICAgPjwvaT5cbiAgICAgIDxzcGFuIGNsYXNzPVwidHJlZS1zd2F0Y2hcIiAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCIgKGtleWRvd24uZW50ZXIpPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCI+XG4gICAgICAgIDxoZXgtY29sb3ItcGlja2VyXG4gICAgICAgICAgW2NvbG9yXT1cImNvbG9yT2Yocm93Lm5hbWUpXCJcbiAgICAgICAgICAoY29sb3JDaGFuZ2UpPVwicmVjb2xvci5lbWl0KHsgbmFtZTogcm93Lm5hbWUsIGNvbG9yOiAkZXZlbnQgfSlcIlxuICAgICAgICA+XG4gICAgICAgIDwvaGV4LWNvbG9yLXBpY2tlcj5cbiAgICAgIDwvc3Bhbj5cbiAgICAgIDxzcGFuIGNsYXNzPVwidHJlZS1uYW1lXCI+e3sgcm93Lm5hbWUgfX08L3NwYW4+XG4gICAgICA8c3BhbiBjbGFzcz1cInRyZWUtbG9uZ1wiPnt7IG5vZGUocm93Lm5hbWUpPy50aXRsZSB9fTwvc3Bhbj5cbiAgICAgIDxzcGFuIGNsYXNzPVwidHJlZS1jb3VudFwiICpuZ0lmPVwidG90YWwocm93Lm5hbWUpID4gMFwiPnt7IHRvdGFsKHJvdy5uYW1lKSB9fTwvc3Bhbj5cbiAgICAgIDxpXG4gICAgICAgICpuZ0lmPVwidm9sdW1lXCJcbiAgICAgICAgY2xhc3M9XCJwaSBwaS1ib3ggdHJlZS0zZFwiXG4gICAgICAgIFtjbGFzcy5vbl09XCJzaG93bjNkLmhhcyhyb3cubmFtZSlcIlxuICAgICAgICByb2xlPVwiYnV0dG9uXCJcbiAgICAgICAgW2F0dHIuYXJpYS1wcmVzc2VkXT1cInNob3duM2QuaGFzKHJvdy5uYW1lKVwiXG4gICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ1Nob3cgJyArIHJvdy5uYW1lICsgJyBpbiAzRCdcIlxuICAgICAgICBwVG9vbHRpcD1cIlNob3cgaW4gdGhlIHZvbHVtZSwgaW4gM0RcIlxuICAgICAgICB0b29sdGlwUG9zaXRpb249XCJsZWZ0XCJcbiAgICAgICAgKGNsaWNrKT1cImZsaXAzZChyb3cubmFtZSwgJGV2ZW50KVwiXG4gICAgICA+PC9pPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgKm5nSWY9XCIhcm93cy5sZW5ndGhcIiBjbGFzcz1cInRyZWUtZW1wdHlcIj5ObyBjbGFzcyBtYXRjaGVzLjwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19
|
|
183
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3MtdHJlZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL3JlZ2lvbi1lZGl0b3IvY2xhc3MtdHJlZS9jbGFzcy10cmVlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvcmVnaW9uLWVkaXRvci9jbGFzcy10cmVlL2NsYXNzLXRyZWUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsVUFBVSxFQUNWLFlBQVksRUFDWixLQUFLLEVBRUwsTUFBTSxHQUVQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ3BELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUdoRCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxtREFBbUQsQ0FBQztBQUM1RixPQUFPLEVBQTJCLFNBQVMsRUFBRSxjQUFjLEVBQUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGNBQWMsQ0FBQzs7Ozs7O0FBWXhHOzs7Ozs7R0FNRztBQVNILE1BQU0sT0FBTyxrQkFBa0I7SUF3QzdCLFlBQTZCLEVBQTJCO1FBQTNCLE9BQUUsR0FBRixFQUFFLENBQXlCO1FBdkN4RCxxQkFBcUI7UUFDWixVQUFLLEdBQStCLEVBQUUsQ0FBQztRQUNoRCw2RUFBNkU7UUFDcEUsV0FBTSxHQUFnQyxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ3pELHNGQUFzRjtRQUM3RSxZQUFPLEdBQTZCLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQztRQUM3RCxrRkFBa0Y7UUFDekUsV0FBTSxHQUFrQixJQUFJLENB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LE1BQU0sVUFBVSxjQUFjLENBQUMsSUFBaUIsRUFBRSxRQUFnQjtJQUNoRSxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBdUIsQ0FBQztJQUMvRCxHQUFHLEVBQUUsY0FBYyxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQztBQUM5QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPdXRwdXQsXG4gIFNpbXBsZUNoYW5nZXMsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgSW5wdXRUZXh0TW9kdWxlIH0gZnJvbSAncHJpbWVuZy9pbnB1dHRleHQnO1xuaW1wb3J0IHsgVG9vbHRpcE1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvdG9vbHRpcCc7XG5cbmltcG9ydCB0eXBlIHsgUmVnaW9uQ2xhc3NOb2RlIH0gZnJvbSAnLi4vLi4vcmVnaW9uLXNvdXJjZS9yZWdpb24tdGlsZXMnO1xuaW1wb3J0IHsgSGV4Q29sb3JQaWNrZXJDb21wb25lbnQgfSBmcm9tICcuLi8uLi9oZXgtY29sb3ItcGlja2VyL2hleC1jb2xvci1waWNrZXIuY29tcG9uZW50JztcbmltcG9ydCB7IENsYXNzVHJlZSwgQ2xhc3NUcmVlUm93LCBhbmNlc3RvcnMsIGJ1aWxkQ2xhc3NUcmVlLCBzdWJ0cmVlLCB2aXNpYmxlUm93cyB9IGZyb20gJy4vY2xhc3MtdHJlZSc7XG5cbi8qKiBBIHBpY2sgaW4gdGhlIHRyZWU6IHRoZSBjbGFzcywgYW5kIGl0IHdpdGggZXZlcnkgY2xhc3MgdW5kZXIgaXQuICovXG5leHBvcnQgaW50ZXJmYWNlIENsYXNzVHJlZVBpY2sge1xuICBuYW1lOiBzdHJpbmc7XG4gIGNsYXNzZXM6IHN0cmluZ1tdO1xuICBhZGRpdGl2ZTogYm9vbGVhbjtcbn1cblxuLyoqIFdoZXRoZXIgYSBjbGFzcyBpcyBzaG93bjogaXQgYW5kIGl0cyBzdWJjbGFzc2VzIGFsbCwgbm9uZSAoJ2hpZGRlbicpLCBvciBvbmx5IHNvbWUgKCdwYXJ0aWFsJykuICovXG5leHBvcnQgdHlwZSBDbGFzc1Zpc2liaWxpdHkgPSAnc2hvd24nIHwgJ2hpZGRlbicgfCAncGFydGlhbCc7XG5cbi8qKlxuICogVGhlIFJlZ2lvbiBFZGl0b3IncyBjbGFzc2VzIGFzIGEgaGllcmFyY2h5IChhIGJyYWluIGF0bGFzJ3Mgb250b2xvZ3kpLCBhcyB0aGUgQWxsZW4gYXRsYXMgdmlld2VyXG4gKiBzaG93cyBpdDogY29sbGFwc2libGUsIGVhY2ggY2xhc3Mgd2l0aCBpdHMgY29sb3VyLCBuYW1lIGFuZCBsb25nIG5hbWUsIGFuZCB0aGUgcmVnaW9ucyBpdCBhbmRcbiAqIGl0cyBzdWJjbGFzc2VzIGhhdmUgb24gdGhpcyBzbGljZTsgYSBjbGFzcyB3aXRoIG5vbmUgaXMgZ3JleWVkLiBQaWNraW5nIGEgY2xhc3Mgc2VsZWN0cyBhbGwgaXRzXG4gKiByZWdpb25zIGFuZCBpdHMgc3ViY2xhc3NlcycgKHRoZSBlZGl0b3IgZG9lcyB0aGUgc2VsZWN0aW5nKS4gU2VhcmNoIGJ5IG5hbWUgb3IgbG9uZyBuYW1lLiBBXG4gKiBjbGFzcydzIHN3YXRjaCByZWNvbG91cnMgaXQsIGFzIHRoZSBjbGFzcyBsaXN0J3MgZG9lczsgaXRzIGV5ZSBoaWRlcyBpdCBhbmQgaXRzIHN1YmNsYXNzZXMuXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3JlZ2lvbi1jbGFzcy10cmVlJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgRm9ybXNNb2R1bGUsIElucHV0VGV4dE1vZHVsZSwgVG9vbHRpcE1vZHVsZSwgSGV4Q29sb3JQaWNrZXJDb21wb25lbnRdLFxuICB0ZW1wbGF0ZVVybDogJy4vY2xhc3MtdHJlZS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2NsYXNzLXRyZWUuY29tcG9uZW50LnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIENsYXNzVHJlZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcyB7XG4gIC8qKiBUaGUgaGllcmFyY2h5LiAqL1xuICBASW5wdXQoKSBub2RlczogcmVhZG9ubHkgUmVnaW9uQ2xhc3NOb2RlW10gPSBbXTtcbiAgLyoqIFJlZ2lvbnMgcGVyIGNsYXNzIG9uIHRoaXMgc2xpY2UgKHRoZSByZWdpb25zIGFuZCB0aGUgcmVnaW9uIHNvdXJjZSdzKS4gKi9cbiAgQElucHV0KCkgY291bnRzOiBSZWFkb25seU1hcDxzdHJpbmcsIG51bWJlcj4gPSBuZXcgTWFwKCk7XG4gIC8qKiBBIGNsYXNzJ3MgY29sb3VyIChhIG5ldyBmdW5jdGlvbiB3aGVuIHRoZSBjb2xvdXJzIGNoYW5nZSwgc28gdGhlIHJvd3MgcmVwYWludCkuICovXG4gIEBJbnB1dCgpIGNvbG9yT2Y6IChuYW1lOiBzdHJpbmcpID0+IHN0cmluZyA9ICgpID0+ICcjOTk5OTk5JztcbiAgLyoqIFRoZSBjbGFzcyBwaWNrZWQgbGFzdCAoaGlnaGxpZ2h0ZWQsIGl0cyBwYXRoIGV4cGFuZGVkLCBzY3JvbGxlZCBpbnRvIHZpZXcpLiAqL1xuICBASW5wdXQoKSBwaWNrZWQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAvKiogQ2xhc3NlcyB3aXRoIGEgc2VsZWN0ZWQgcmVnaW9uIChtYXJrZWQpLiAqL1xuICBASW5wdXQoKSBtYXJrZWQ6IFJlYWRvbmx5U2V0PHN0cmluZz4gPSBuZXcgU2V0KCk7XG4gIC8qKiBXaGV0aGVyIGEgdm9sdW1lIHZpZXcgaXMgb24gc2NyZWVuOiBlYWNoIGNsYXNzIGNhbiB0aGVuIGJlIHNob3duIGluIDNELiAqL1xuICBASW5wdXQoKSB2b2x1bWUgPSBmYWxzZTtcbiAgLyoqIFRoZSBjbGFzc2VzIHNob3duIGluIDNELiAqL1xuICBASW5wdXQoKSBzaG93bjNkOiBSZWFkb25seVNldDxzdHJpbmc+ID0gbmV3IFNldCgpO1xuICAvKiogQ2xhc3NlcyB0aGF0IGNhbiBiZSBkcmF3biBhcyBpbmRpdmlkdWFsIGNlbGxzIGhlcmUgKGEgM0Qgc2VnbWVudGF0aW9uJ3MsIGluIHNwYXRpYWwgM0QpLiAqL1xuICBASW5wdXQoKSBjZWxsYWJsZTogUmVhZG9ubHlTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoKTtcbiAgLyoqIFRob3NlIGRyYXduIGFzIGluZGl2aWR1YWwgY2VsbHMgbm93LiAqL1xuICBASW5wdXQoKSBpbmRpdmlkdWFsOiBSZWFkb25seVNldDxzdHJpbmc+ID0gbmV3IFNldCgpO1xuICAvKiogRHJhdyBhIGNsYXNzIChpdHMgc3ViY2xhc3NlcyB3aXRoIGl0KSBhcyBpbmRpdmlkdWFsIGNlbGxzLCBvciBtZXJnZWQgYWdhaW4uICovXG4gIEBPdXRwdXQoKSB0b2dnbGVDZWxscyA9IG5ldyBFdmVudEVtaXR0ZXI8eyBjbGFzc2VzOiBzdHJpbmdbXTsgaW5kaXZpZHVhbDogYm9vbGVhbiB9PigpO1xuXG4gIC8qKiBUaGUgY2xhc3NlcyBoaWRkZW4gZnJvbSB2aWV3LiAqL1xuICBASW5wdXQoKSBoaWRkZW46IFJlYWRvbmx5U2V0PHN0cmluZz4gPSBuZXcgU2V0KCk7XG5cbiAgQE91dHB1dCgpIHBpY2sgPSBuZXcgRXZlbnRFbWl0dGVyPENsYXNzVHJlZVBpY2s+KCk7XG4gIC8qKiBBIGNsYXNzJ3Mgc3dhdGNoIHBpY2tlZCBhIG5ldyBjb2xvdXIuICovXG4gIEBPdXRwdXQoKSByZWNvbG9yID0gbmV3IEV2ZW50RW1pdHRlcjx7IG5hbWU6IHN0cmluZzsgY29sb3I6IHN0cmluZyB9PigpO1xuICAvKiogQSBjbGFzcydzIDNEIHRvZ2dsZTogaXQgd2l0aCBldmVyeSBjbGFzcyB1bmRlciBpdC4gKi9cbiAgQE91dHB1dCgpIHRvZ2dsZTNkID0gbmV3IEV2ZW50RW1pdHRlcjx7IG5hbWU6IHN0cmluZzsgY2xhc3Nlczogc3RyaW5nW10gfT4oKTtcbiAgLyoqIEEgY2xhc3MncyBleWU6IGhpZGUgKG9yIHNob3cpIGl0IHdpdGggZXZlcnkgY2xhc3MgdW5kZXIgaXQuICovXG4gIEBPdXRwdXQoKSB0b2dnbGVIaWRkZW4gPSBuZXcgRXZlbnRFbWl0dGVyPHsgY2xhc3Nlczogc3RyaW5nW107IGhpZGRlbjogYm9vbGVhbiB9PigpO1xuXG4gIHByb3RlY3RlZCB0cmVlOiBDbGFzc1RyZWUgPSBidWlsZENsYXNzVHJlZShbXSwgbmV3IE1hcCgpKTtcbiAgcHJvdGVjdGVkIHJvd3M6IENsYXNzVHJlZVJvd1tdID0gW107XG4gIC8qKiBFYWNoIHJvdydzIHZpc2liaWxpdHkgKGEgcm93IGFic2VudDogc2hvd24pLiAqL1xuICBwcm90ZWN0ZWQgdmlzaWJpbGl0eSA9IG5ldyBNYXA8c3RyaW5nLCBDbGFzc1Zpc2liaWxpdHk+KCk7XG4gIHByb3RlY3RlZCBxdWVyeSA9ICcnO1xuICBwcml2YXRlIGV4cGFuZGVkID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBlbDogRWxlbWVudFJlZjxIVE1MRWxlbWVudD4pIHt9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGNvbnN0IGZyZXNoID0gISFjaGFuZ2VzWydub2RlcyddO1xuICAgIGlmIChmcmVzaCB8fCBjaGFuZ2VzWydjb3VudHMnXSkgdGhpcy50cmVlID0gYnVpbGRDbGFzc1RyZWUodGhpcy5ub2RlcywgdGhpcy5jb3VudHMpO1xuICAgIC8vIEEgbmV3IGhpZXJhcmNoeSBvcGVucyB3aXRoIGl0cyByb290cyBleHBhbmRlZCwgYXMgdGhlIGF0bGFzIHZpZXdlciBkb2VzLlxuICAgIGlmIChmcmVzaCkgdGhpcy5leHBhbmRlZCA9IG5ldyBTZXQodGhpcy50cmVlLnJvb3RzKTtcbiAgICBpZiAoY2hhbmdlc1sncGlja2VkJ10gJiYgdGhpcy5waWNrZWQpIGZvciAoY29uc3QgYSBvZiBhbmNlc3RvcnModGhpcy50cmVlLCB0aGlzLnBpY2tlZCkpIHRoaXMuZXhwYW5kZWQuYWRkKGEpO1xuICAgIHRoaXMucmVmcmVzaCgpO1xuICAgIC8vIEEgcGljayBmcm9tIGVsc2V3aGVyZSAoYSBzdXJmYWNlIGNsaWNrZWQgaW4gM0QpIG1heSBiZSBvZmYgc2NyZWVuOiBicmluZyBpdHMgcm93IGludG8gdmlldy5cbiAgICBpZiAoY2hhbmdlc1sncGlja2VkJ10gJiYgdGhpcy5waWNrZWQpXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHNjcm9sbFRvUGlja2VkKHRoaXMuZWwubmF0aXZlRWxlbWVudCwgJy50cmVlLXJvdy5waWNrZWQnKSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgbm9kZShuYW1lOiBzdHJpbmcpOiBSZWdpb25DbGFzc05vZGUgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnRyZWUubm9kZS5nZXQobmFtZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgdG90YWwobmFtZTogc3RyaW5nKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy50cmVlLnRvdGFsLmdldChuYW1lKSA/PyAwO1xuICB9XG5cbiAgcHJvdGVjdGVkIHRvZ2dsZShyb3c6IENsYXNzVHJlZVJvdywgZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgaWYgKHRoaXMuZXhwYW5kZWQuaGFzKHJvdy5uYW1lKSkgdGhpcy5leHBhbmRlZC5kZWxldGUocm93Lm5hbWUpO1xuICAgIGVsc2UgdGhpcy5leHBhbmRlZC5hZGQocm93Lm5hbWUpO1xuICAgIHRoaXMucmVmcmVzaCgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNob29zZShuYW1lOiBzdHJpbmcsIGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IGUgPSBldmVudCBhcyBNb3VzZUV2ZW50IHwgS2V5Ym9hcmRFdmVudDtcbiAgICB0aGlzLnBpY2suZW1pdCh7IG5hbWUsIGNsYXNzZXM6IHN1YnRyZWUodGhpcy50cmVlLCBuYW1lKSwgYWRkaXRpdmU6IGUuc2hpZnRLZXkgfHwgZS5tZXRhS2V5IHx8IGUuY3RybEtleSB9KTtcbiAgfVxuXG4gIC8qKiBBIGNsYXNzICh3aXRoIGl0cyBzdWJjbGFzc2VzKSBhcyBpbmRpdmlkdWFsIGNlbGxzLCBvciBtZXJnZWQgYWdhaW46IGFsbCBvZiB0aGVtIGFzIGl0IGlzLiAqL1xuICBwcm90ZWN0ZWQgZmxpcENlbGxzKG5hbWU6IHN0cmluZywgZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgY29uc3QgY2xhc3NlcyA9IHN1YnRyZWUodGhpcy50cmVlLCBuYW1lKS5maWx0ZXIoKGMpID0+IHRoaXMuY2VsbGFibGUuaGFzKGMpKTtcbiAgICB0aGlzLnRvZ2dsZUNlbGxzLmVtaXQoeyBjbGFzc2VzLCBpbmRpdmlkdWFsOiAhY2xhc3Nlcy5ldmVyeSgoYykgPT4gdGhpcy5pbmRpdmlkdWFsLmhhcyhjKSkgfSk7XG4gIH1cblxuICAvKiogV2hldGhlciBldmVyeSBjZWxsYWJsZSBjbGFzcyBvZiBgbmFtZWAncyBzdWJ0cmVlIGlzIGRyYXduIGFzIGNlbGxzLiAqL1xuICBwcm90ZWN0ZWQgYWxsSW5kaXZpZHVhbChuYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCBjbGFzc2VzID0gc3VidHJlZSh0aGlzLnRyZWUsIG5hbWUpLmZpbHRlcigoYykgPT4gdGhpcy5jZWxsYWJsZS5oYXMoYykpO1xuICAgIHJldHVybiAhIWNsYXNzZXMubGVuZ3RoICYmIGNsYXNzZXMuZXZlcnkoKGMpID0+IHRoaXMuaW5kaXZpZHVhbC5oYXMoYykpO1xuICB9XG5cbiAgLyoqIFdoZXRoZXIgYG5hbWVgIG9yIGEgc3ViY2xhc3MgY2FuIGJlIGRyYXduIGFzIGNlbGxzLiAqL1xuICBwcm90ZWN0ZWQgYW55Q2VsbGFibGUobmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHN1YnRyZWUodGhpcy50cmVlLCBuYW1lKS5zb21lKChjKSA9PiB0aGlzLmNlbGxhYmxlLmhhcyhjKSk7XG4gIH1cblxuICAvKiogVGhlIGV5ZTogYSBjbGFzcyBoaWRkZW4gKHdob2xseSkgaXMgc2hvd24gYWdhaW4gd2l0aCBpdHMgc3ViY2xhc3Nlczsgb3RoZXJ3aXNlIHRoZXkgYXJlIGhpZGRlbi4gKi9cbiAgcHJvdGVjdGVkIGZsaXBIaWRkZW4obmFtZTogc3RyaW5nLCBldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBjb25zdCBoaWRkZW4gPSB0aGlzLnZpc2liaWxpdHkuZ2V0KG5hbWUpICE9PSAnaGlkZGVuJztcbiAgICB0aGlzLnRvZ2dsZUhpZGRlbi5lbWl0KHsgY2xhc3Nlczogc3VidHJlZSh0aGlzLnRyZWUsIG5hbWUpLCBoaWRkZW4gfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZmxpcDNkKG5hbWU6IHN0cmluZywgZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgdGhpcy50b2dnbGUzZC5lbWl0KHsgbmFtZSwgY2xhc3Nlczogc3VidHJlZSh0aGlzLnRyZWUsIG5hbWUpIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uUXVlcnkodmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMucXVlcnkgPSB2YWx1ZTtcbiAgICB0aGlzLnJlZnJlc2goKTtcbiAgfVxuXG4gIC8qKiBFbnRlciBpbiB0aGUgc2VhcmNoIGJveCBwaWNrcyB0aGUgZmlyc3QgbWF0Y2guICovXG4gIHByb3RlY3RlZCBwaWNrRmlyc3RNYXRjaChldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCBxID0gdGhpcy5xdWVyeS50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICBjb25zdCBoaXQgPSB0aGlzLnJvd3MuZmluZChcbiAgICAgIChyKSA9PiByLm5hbWUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhxKSB8fCAodGhpcy5ub2RlKHIubmFtZSk/LnRpdGxlID8/ICcnKS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHEpLFxuICAgICk7XG4gICAgaWYgKGhpdCkgdGhpcy5jaG9vc2UoaGl0Lm5hbWUsIGV2ZW50KTtcbiAgfVxuXG4gIHByb3RlY3RlZCByZWFkb25seSB0cmFja1JvdyA9IChfOiBudW1iZXIsIHI6IENsYXNzVHJlZVJvdykgPT4gci5uYW1lO1xuXG4gIHByaXZhdGUgcmVmcmVzaCgpOiB2b2lkIHtcbiAgICB0aGlzLnJvd3MgPSB2aXNpYmxlUm93cyh0aGlzLnRyZWUsIHRoaXMuZXhwYW5kZWQsIHRoaXMucXVlcnkpO1xuICAgIHRoaXMudmlzaWJpbGl0eSA9IG5ldyBNYXAoKTtcbiAgICBpZiAoIXRoaXMuaGlkZGVuLnNpemUpIHJldHVybjtcbiAgICBmb3IgKGNvbnN0IHJvdyBvZiB0aGlzLnJvd3MpIHtcbiAgICAgIGNvbnN0IGNsYXNzZXMgPSBzdWJ0cmVlKHRoaXMudHJlZSwgcm93Lm5hbWUpO1xuICAgICAgY29uc3Qgb2ZmID0gY2xhc3Nlcy5maWx0ZXIoKGMpID0+IHRoaXMuaGlkZGVuLmhhcyhjKSkubGVuZ3RoO1xuICAgICAgaWYgKG9mZikgdGhpcy52aXNpYmlsaXR5LnNldChyb3cubmFtZSwgb2ZmID09PSBjbGFzc2VzLmxlbmd0aCA/ICdoaWRkZW4nIDogJ3BhcnRpYWwnKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqIFNjcm9sbCB0aGUgcm93IG1hdGNoaW5nIGBzZWxlY3RvcmAgaW5zaWRlIGBob3N0YCBpbnRvIHZpZXcsIGlmIGl0IGlzIG91dCBvZiBpdC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzY3JvbGxUb1BpY2tlZChob3N0OiBIVE1MRWxlbWVudCwgc2VsZWN0b3I6IHN0cmluZyk6IHZvaWQge1xuICBjb25zdCByb3cgPSBob3N0LnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpIGFzIEhUTUxFbGVtZW50IHwgbnVsbDtcbiAgcm93Py5zY3JvbGxJbnRvVmlldz8uKHsgYmxvY2s6ICduZWFyZXN0JyB9KTtcbn1cbiIsIjxkaXYgY2xhc3M9XCJjbGFzcy10cmVlXCI+XG4gIDxkaXYgY2xhc3M9XCJ0cmVlLWhlYWRlclwiICpuZ0lmPVwicGlja2VkIGFzIHBcIj5cbiAgICA8c3BhbiBjbGFzcz1cInRyZWUtcGlja2VkXCI+XG4gICAgICA8Yj57eyBwIH19PC9iXG4gICAgICA+PHNwYW4gKm5nSWY9XCJub2RlKHApPy50aXRsZSBhcyB0XCI+IMK3IHt7IHQgfX08L3NwYW4+XG4gICAgPC9zcGFuPlxuICA8L2Rpdj5cbiAgPGlucHV0XG4gICAgdHlwZT1cInRleHRcIlxuICAgIHBJbnB1dFRleHRcbiAgICBjbGFzcz1cInAtaW5wdXR0ZXh0LXNtIHRyZWUtc2VhcmNoXCJcbiAgICBwbGFjZWhvbGRlcj1cIlNlYXJjaCBieSBuYW1lXCJcbiAgICBhcmlhLWxhYmVsPVwiU2VhcmNoIHRoZSBjbGFzc2VzXCJcbiAgICBbbmdNb2RlbF09XCJxdWVyeVwiXG4gICAgKG5nTW9kZWxDaGFuZ2UpPVwib25RdWVyeSgkZXZlbnQpXCJcbiAgICAoa2V5ZG93bi5lbnRlcik9XCJwaWNrRmlyc3RNYXRjaCgkZXZlbnQpXCJcbiAgLz5cbiAgPGRpdiBjbGFzcz1cInRyZWUtYm9keVwiIHJvbGU9XCJ0cmVlXCI+XG4gICAgPGRpdlxuICAgICAgKm5nRm9yPVwibGV0IHJvdyBvZiByb3dzOyB0cmFja0J5OiB0cmFja1Jvd1wiXG4gICAgICBjbGFzcz1cInRyZWUtcm93XCJcbiAgICAgIHJvbGU9XCJ0cmVlaXRlbVwiXG4gICAgICB0YWJpbmRleD1cIjBcIlxuICAgICAgW2F0dHIuYXJpYS1leHBhbmRlZF09XCJyb3cuaGFzQ2hpbGRyZW4gPyByb3cuZXhwYW5kZWQgOiBudWxsXCJcbiAgICAgIFtjbGFzcy5hYnNlbnRdPVwidG90YWwocm93Lm5hbWUpID09PSAwXCJcbiAgICAgIFtjbGFzcy5waWNrZWRdPVwicm93Lm5hbWUgPT09IHBpY2tlZFwiXG4gICAgICBbY2xhc3MubWFya2VkXT1cIm1hcmtlZC5oYXMocm93Lm5hbWUpXCJcbiAgICAgIFtjbGFzcy5oaWRkZW4tY2xhc3NdPVwidmlzaWJpbGl0eS5nZXQocm93Lm5hbWUpID09PSAnaGlkZGVuJ1wiXG4gICAgICBbc3R5bGUucGFkZGluZy1sZWZ0LnJlbV09XCIwLjM1ICsgcm93LmRlcHRoICogMC45XCJcbiAgICAgIFtwVG9vbHRpcF09XCJub2RlKHJvdy5uYW1lKT8udGl0bGUgfHwgcm93Lm5hbWVcIlxuICAgICAgdG9vbHRpcFBvc2l0aW9uPVwibGVmdFwiXG4gICAgICBbc2hvd0RlbGF5XT1cIjYwMFwiXG4gICAgICAoY2xpY2spPVwiY2hvb3NlKHJvdy5uYW1lLCAkZXZlbnQpXCJcbiAgICAgIChrZXlkb3duLmVudGVyKT1cImNob29zZShyb3cubmFtZSwgJGV2ZW50KVwiXG4gICAgPlxuICAgICAgPGlcbiAgICAgICAgY2xhc3M9XCJwaSB0cmVlLXRvZ2dsZVwiXG4gICAgICAgIFtjbGFzcy5waS1taW51cy1jaXJjbGVdPVwicm93Lmhhc0NoaWxkcmVuICYmIHJvdy5leHBhbmRlZFwiXG4gICAgICAgIFtjbGFzcy5waS1wbHVzLWNpcmNsZV09XCJyb3cuaGFzQ2hpbGRyZW4gJiYgIXJvdy5leHBhbmRlZFwiXG4gICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwicm93LmV4cGFuZGVkID8gJ0NvbGxhcHNlJyA6ICdFeHBhbmQnXCJcbiAgICAgICAgKGNsaWNrKT1cInJvdy5oYXNDaGlsZHJlbiAmJiB0b2dnbGUocm93LCAkZXZlbnQpXCJcbiAgICAgID48L2k+XG4gICAgICA8aVxuICAgICAgICBjbGFzcz1cInBpIHRyZWUtZXllXCJcbiAgICAgICAgW25nQ2xhc3NdPVwidmlzaWJpbGl0eS5nZXQocm93Lm5hbWUpID09PSAnaGlkZGVuJyA/ICdwaS1leWUtc2xhc2gnIDogJ3BpLWV5ZSdcIlxuICAgICAgICBbY2xhc3MucGFydGlhbF09XCJ2aXNpYmlsaXR5LmdldChyb3cubmFtZSkgPT09ICdwYXJ0aWFsJ1wiXG4gICAgICAgIHJvbGU9XCJidXR0b25cIlxuICAgICAgICBbYXR0ci5hcmlhLXByZXNzZWRdPVwidmlzaWJpbGl0eS5nZXQocm93Lm5hbWUpICE9PSAnaGlkZGVuJ1wiXG4gICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiKHZpc2liaWxpdHkuZ2V0KHJvdy5uYW1lKSA9PT0gJ2hpZGRlbicgPyAnU2hvdyAnIDogJ0hpZGUgJykgKyByb3cubmFtZVwiXG4gICAgICAgIFtwVG9vbHRpcF09XCJcbiAgICAgICAgICAodmlzaWJpbGl0eS5nZXQocm93Lm5hbWUpID09PSAnaGlkZGVuJyA/ICdTaG93JyA6ICdIaWRlJykgK1xuICAgICAgICAgIChyb3cuaGFzQ2hpbGRyZW4gPyAnIGl0IGFuZCBpdHMgc3ViY2xhc3NlcycgOiAnJykgK1xuICAgICAgICAgICh2aXNpYmlsaXR5LmdldChyb3cubmFtZSkgPT09ICdwYXJ0aWFsJyA/ICcgKHNvbWUgYXJlIGhpZGRlbiknIDogJycpXG4gICAgICAgIFwiXG4gICAgICAgIHRvb2x0aXBQb3NpdGlvbj1cImxlZnRcIlxuICAgICAgICAoY2xpY2spPVwiZmxpcEhpZGRlbihyb3cubmFtZSwgJGV2ZW50KVwiXG4gICAgICAgIChrZXlkb3duLmVudGVyKT1cImZsaXBIaWRkZW4ocm93Lm5hbWUsICRldmVudClcIlxuICAgICAgPjwvaT5cbiAgICAgIDxzcGFuIGNsYXNzPVwidHJlZS1zd2F0Y2hcIiAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCIgKGtleWRvd24uZW50ZXIpPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCI+XG4gICAgICAgIDxoZXgtY29sb3ItcGlja2VyXG4gICAgICAgICAgW2NvbG9yXT1cImNvbG9yT2Yocm93Lm5hbWUpXCJcbiAgICAgICAgICAoY29sb3JDaGFuZ2UpPVwicmVjb2xvci5lbWl0KHsgbmFtZTogcm93Lm5hbWUsIGNvbG9yOiAkZXZlbnQgfSlcIlxuICAgICAgICA+XG4gICAgICAgIDwvaGV4LWNvbG9yLXBpY2tlcj5cbiAgICAgIDwvc3Bhbj5cbiAgICAgIDxzcGFuIGNsYXNzPVwidHJlZS1uYW1lXCI+e3sgcm93Lm5hbWUgfX08L3NwYW4+XG4gICAgICA8c3BhbiBjbGFzcz1cInRyZWUtbG9uZ1wiPnt7IG5vZGUocm93Lm5hbWUpPy50aXRsZSB9fTwvc3Bhbj5cbiAgICAgIDxzcGFuIGNsYXNzPVwidHJlZS1jb3VudFwiICpuZ0lmPVwidG90YWwocm93Lm5hbWUpID4gMFwiPnt7IHRvdGFsKHJvdy5uYW1lKSB9fTwvc3Bhbj5cbiAgICAgIDxpXG4gICAgICAgICpuZ0lmPVwidm9sdW1lXCJcbiAgICAgICAgY2xhc3M9XCJwaSBwaS1ib3ggdHJlZS0zZFwiXG4gICAgICAgIFtjbGFzcy5vbl09XCJzaG93bjNkLmhhcyhyb3cubmFtZSlcIlxuICAgICAgICByb2xlPVwiYnV0dG9uXCJcbiAgICAgICAgW2F0dHIuYXJpYS1wcmVzc2VkXT1cInNob3duM2QuaGFzKHJvdy5uYW1lKVwiXG4gICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ1Nob3cgJyArIHJvdy5uYW1lICsgJyBpbiAzRCdcIlxuICAgICAgICBwVG9vbHRpcD1cIlNob3cgaW4gdGhlIHZvbHVtZSwgaW4gM0RcIlxuICAgICAgICB0b29sdGlwUG9zaXRpb249XCJsZWZ0XCJcbiAgICAgICAgKGNsaWNrKT1cImZsaXAzZChyb3cubmFtZSwgJGV2ZW50KVwiXG4gICAgICA+PC9pPlxuICAgICAgPGlcbiAgICAgICAgKm5nSWY9XCJ2b2x1bWUgJiYgYW55Q2VsbGFibGUocm93Lm5hbWUpXCJcbiAgICAgICAgY2xhc3M9XCJwaSBwaS10aC1sYXJnZSB0cmVlLTNkIHRyZWUtY2VsbHNcIlxuICAgICAgICBbY2xhc3Mub25dPVwiYWxsSW5kaXZpZHVhbChyb3cubmFtZSlcIlxuICAgICAgICByb2xlPVwiYnV0dG9uXCJcbiAgICAgICAgW2F0dHIuYXJpYS1wcmVzc2VkXT1cImFsbEluZGl2aWR1YWwocm93Lm5hbWUpXCJcbiAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInU2hvdyAnICsgcm93Lm5hbWUgKyAnIGFzIGluZGl2aWR1YWwgY2VsbHMnXCJcbiAgICAgICAgW3BUb29sdGlwXT1cImFsbEluZGl2aWR1YWwocm93Lm5hbWUpID8gJ1Nob3cgYXMgb25lIHN1cmZhY2UnIDogJ1Nob3cgZWFjaCBjZWxsIGJ5IGl0c2VsZidcIlxuICAgICAgICB0b29sdGlwUG9zaXRpb249XCJsZWZ0XCJcbiAgICAgICAgKGNsaWNrKT1cImZsaXBDZWxscyhyb3cubmFtZSwgJGV2ZW50KVwiXG4gICAgICA+PC9pPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgKm5nSWY9XCIhcm93cy5sZW5ndGhcIiBjbGFzcz1cInRyZWUtZW1wdHlcIj5ObyBjbGFzcyBtYXRjaGVzLjwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19
|