@jax-data-science/sci-image-visualizer 0.2.15 → 0.2.17
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/index.mjs +7 -2
- package/esm2022/lib/contracts/semantic-segmenter.contract.mjs +11 -0
- package/esm2022/lib/models/region.mjs +3 -3
- package/esm2022/lib/toolbar/segmentation/retinal-layer-tool.service.mjs +197 -0
- package/esm2022/lib/toolbar/segmentation/retinal-model-registry.mjs +119 -0
- package/esm2022/lib/toolbar/segmentation/retinal-segmenter.service.mjs +157 -0
- package/esm2022/lib/toolbar/segmentation/yolo-detect-tool.service.mjs +11 -4
- package/esm2022/lib/toolbar/toolbar.component.mjs +31 -3
- package/esm2022/lib/visualizer.component.mjs +86 -22
- package/fesm2022/jax-data-science-sci-image-visualizer.mjs +591 -23
- package/fesm2022/jax-data-science-sci-image-visualizer.mjs.map +1 -1
- package/index.d.ts +5 -1
- package/lib/contracts/semantic-segmenter.contract.d.ts +105 -0
- package/lib/models/region.d.ts +11 -0
- package/lib/toolbar/segmentation/retinal-layer-tool.service.d.ts +49 -0
- package/lib/toolbar/segmentation/retinal-model-registry.d.ts +71 -0
- package/lib/toolbar/segmentation/retinal-segmenter.service.d.ts +49 -0
- package/lib/toolbar/segmentation/yolo-detect-tool.service.d.ts +2 -0
- package/lib/toolbar/toolbar.component.d.ts +15 -1
- package/lib/visualizer.component.d.ts +38 -2
- package/package.json +2 -1
package/esm2022/index.mjs
CHANGED
|
@@ -25,7 +25,10 @@ export * from './lib/contracts/cell-segmenter.contract';
|
|
|
25
25
|
export { CellposeSegmenterService } from './lib/toolbar/segmentation/cellpose-segmenter.service';
|
|
26
26
|
export * from './lib/contracts/instance-segmenter.contract';
|
|
27
27
|
export { YoloSegmenterService } from './lib/toolbar/segmentation/yolo-segmenter.service';
|
|
28
|
-
export { YoloDetectToolService } from './lib/toolbar/segmentation/yolo-detect-tool.service';
|
|
28
|
+
export { YoloDetectToolService, YOLO_REGION_SOURCE } from './lib/toolbar/segmentation/yolo-detect-tool.service';
|
|
29
|
+
export * from './lib/contracts/semantic-segmenter.contract';
|
|
30
|
+
export { RetinalSegmenterService } from './lib/toolbar/segmentation/retinal-segmenter.service';
|
|
31
|
+
export { RetinalLayerToolService, RETINAL_REGION_SOURCE, } from './lib/toolbar/segmentation/retinal-layer-tool.service';
|
|
29
32
|
// ── Generic client-side image utilities (shared with the host's pipeline) ──
|
|
30
33
|
export { ProcessingImage } from './lib/processing/processing-image';
|
|
31
34
|
export { cropImage } from './lib/processing/image-crop';
|
|
@@ -34,6 +37,8 @@ export { ImageConverterService } from './lib/processing/image-converter.service'
|
|
|
34
37
|
export { SAM_MODELS, DEFAULT_SAM_MODEL_ID, getSamModel, isSamModelReady, setSamModelUrls, setDefaultSamModel, getDefaultSamModelId, } from './lib/toolbar/segmentation/sam-model-registry';
|
|
35
38
|
// ── YOLO instance-segmentation model registry (same repointing story) ─────
|
|
36
39
|
export { YOLO_MODELS, DEFAULT_YOLO_MODEL_ID, getYoloModel, isYoloModelReady, setYoloModelUrls, setDefaultYoloModel, getDefaultYoloModelId, } from './lib/toolbar/segmentation/yolo-model-registry';
|
|
40
|
+
// ── Retinal-layer semantic-segmentation registry (same repointing story) ──
|
|
41
|
+
export { RETINAL_MODELS, DEFAULT_RETINAL_MODEL_ID, getRetinalModel, isRetinalModelReady, readyRetinalModels, setRetinalModelUrls, setDefaultRetinalModel, getDefaultRetinalModelId, } from './lib/toolbar/segmentation/retinal-model-registry';
|
|
37
42
|
// ── onnxruntime-web WASM location (host overrides once, at app init) ───────
|
|
38
43
|
export { setOrtWasmBase, getOrtWasmBase } from './lib/toolbar/segmentation/ort-runtime-config';
|
|
39
44
|
// ── Neutral data models ──────────────────────────────────────────────────
|
|
@@ -54,4 +59,4 @@ export { VisualizerComponent } from './lib/visualizer.component';
|
|
|
54
59
|
export { RegionEditorComponent } from './lib/region-editor/region-editor.component';
|
|
55
60
|
export { HexColorPickerComponent } from './lib/hex-color-picker/hex-color-picker.component';
|
|
56
61
|
export { ChannelHistogramComponent } from './lib/channel-histogram/channel-histogram.component';
|
|
57
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
62
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7OztHQU1HO0FBRUgsNEVBQTRFO0FBQzVFLGNBQWMscUNBQXFDLENBQUM7QUFDcEQsY0FBYyw0Q0FBNEMsQ0FBQztBQUMzRCxjQUFjLHdDQUF3QyxDQUFDO0FBQ3ZELGNBQWMsd0NBQXdDLENBQUM7QUFDdkQsY0FBYyxzQ0FBc0MsQ0FBQztBQUNyRCxjQUFjLHdDQUF3QyxDQUFDO0FBQ3ZELGNBQWMsZ0RBQWdELENBQUM7QUFDL0QsY0FBYyw0QkFBNEIsQ0FBQztBQUMzQyxjQUFjLGdDQUFnQyxDQUFDO0FBQy9DLGNBQWMsMkJBQTJCLENBQUM7QUFDMUMsY0FBYyxnQ0FBZ0MsQ0FBQztBQUMvQyxjQUFjLHVDQUF1QyxDQUFDO0FBQ3RELGNBQWMseUNBQXlDLENBQUM7QUFDeEQsY0FBYywrQkFBK0IsQ0FBQztBQUM5QyxjQUFjLDhCQUE4QixDQUFDO0FBQzdDLGNBQWMseUNBQXlDLENBQUM7QUFDeEQsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sdURBQXVELENBQUM7QUFDakcsY0FBYyw2Q0FBNkMsQ0FBQztBQUM1RCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxtREFBbUQsQ0FBQztBQUN6RixPQUFPLEVBQUUscUJBQXFCLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxxREFBcUQsQ0FBQztBQUNoSCxjQUFjLDZDQUE2QyxDQUFDO0FBQzVELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLHNEQUFzRCxDQUFDO0FBQy9GLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIscUJBQXFCLEdBQ3RCLE1BQU0sdURBQXVELENBQUM7QUFFL0QsOEVBQThFO0FBQzlFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUNwRSxPQUFPLEVBQUUsU0FBUyxFQUFvQixNQUFNLDZCQUE2QixDQUFDO0FBQzFFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDBDQUEwQyxDQUFDO0FBRWpGLDZFQUE2RTtBQUM3RSxPQUFPLEVBQ0wsVUFBVSxFQUFFLG9CQUFvQixFQUFFLFdBQVcsRUFBRSxlQUFlLEVBQUUsZUFBZSxFQUMvRSxrQkFBa0IsRUFBRSxvQkFBb0IsR0FDekMsTUFBTSwrQ0FBK0MsQ0FBQztBQUV2RCw2RUFBNkU7QUFDN0UsT0FBTyxFQUNMLFdBQVcsRUFBRSxxQkFBcUIsRUFBRSxZQUFZLEVBQUUsZ0JBQWdCLEVBQUUsZ0JBQWdCLEVBQ3BGLG1CQUFtQixFQUFFLHFCQUFxQixHQUMzQyxNQUFNLGdEQUFnRCxDQUFDO0FBRXhELDZFQUE2RTtBQUM3RSxPQUFPLEVBQ0wsY0FBYyxFQUFFLHdCQUF3QixFQUFFLGVBQWUsRUFBRSxtQkFBbUIsRUFDOUUsa0JBQWtCLEVBQUUsbUJBQW1CLEVBQUUsc0JBQXNCLEVBQUUsd0JBQXdCLEdBRTFGLE1BQU0sbURBQW1ELENBQUM7QUFFM0QsOEVBQThFO0FBQzlFLE9BQU8sRUFBRSxjQUFjLEVBQUUsY0FBYyxFQUFFLE1BQU0sK0NBQStDLENBQUM7QUFFL0YsNEVBQTRFO0FBQzVFLGNBQWMscUJBQXFCLENBQUM7QUFDcEMsY0FBYywyQkFBMkIsQ0FBQztBQUMxQyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFcEQsNEVBQTRFO0FBQzVFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ2pFLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQzVFLDZFQUE2RTtBQUM3RSxtRUFBbUU7QUFDbkUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFFbkUsNkVBQTZFO0FBQzdFLDBFQUEwRTtBQUMxRSw4RUFBOEU7QUFDOUUsNkRBQTZEO0FBQzdELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDZDQUE2QyxDQUFDO0FBQ3BGLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLG1EQUFtRCxDQUFDO0FBQzVGLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLHFEQUFxRCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBQdWJsaWMgQVBJIG9mIHRoZSBqYXgtaW1hZ2UtdmlzdWFsaXphdGlvbiBsaWJyYXJ5LiBFeHRlcm5hbCBjb25zdW1lcnMgaW1wb3J0XG4gKiBPTkxZIGZyb20gaGVyZSAoYEBqYXgtZGF0YS1zY2llbmNlL3NjaS1pbWFnZS12aXN1YWxpemVyYCk7IGV2ZXJ5dGhpbmcgZWxzZSB1bmRlciBgbGliL2AgaXNcbiAqIGludGVybmFsLiBUaGUgc3VyZmFjZSBpcyBjb250cmFjdHMgKyB0b2tlbnMgKyBuZXV0cmFsIG1vZGVscyArIHRoZSBBbmd1bGFyXG4gKiBtb2R1bGUsIHBsdXMgdGhlIHJvdXRpbmcgc2VydmljZSB0aGUgaG9zdCdzIGNvbXBvc2l0aW9uIHJvb3QgYmluZHMgdGhlIHRva2Vuc1xuICogdG8gKGB1c2VFeGlzdGluZ2ApLlxuICovXG5cbi8vIOKUgOKUgCBDb250cmFjdHMgJiBESSB0b2tlbnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5leHBvcnQgKiBmcm9tICcuL2xpYi9jb250cmFjdHMvdmlzdWFsaXplci5jb250cmFjdCc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9jb250cmFjdHMvcmVnaW9uLWVkaXRvci1hcGkuY29udHJhY3QnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvY29udHJhY3RzL3BvcnRzL2ltYWdlLXN0YXRlLnBvcnQnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvY29udHJhY3RzL3BvcnRzL3RpbGUtYWNjZXNzLnBvcnQnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvY29udHJhY3RzL3BvcnRzL3JlZ2lvbi1pby5wb3J0JztcbmV4cG9ydCAqIGZyb20gJy4vbGliL2NvbnRyYWN0cy9wb3J0cy9wcmVmZXJlbmNlcy5wb3J0JztcbmV4cG9ydCAqIGZyb20gJy4vbGliL2NvbnRyYWN0cy9jaGFubmVsLWhpc3RvZ3JhbS1hcGkuY29udHJhY3QnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvY29udHJhY3RzL3Zpei1jb25maWcnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvY29udHJhY3RzL2ltYWdlLmNvbnRyYWN0JztcbmV4cG9ydCAqIGZyb20gJy4vbGliL2NvbnRyYWN0cy9wbG90LXR5cGUnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvY29udHJhY3RzL3Rvb2xiYXItY29uZmlnJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL2NvbnRyYWN0cy9jYXBhYmlsaXRpZXMuY29udHJhY3QnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvY29udHJhY3RzL3JlZ2lvbi1vdmVybGF5LmNvbnRyYWN0JztcbmV4cG9ydCAqIGZyb20gJy4vbGliL2NvbnRyYWN0cy9kaXNwbGF5LXR5cGVzJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL2NvbnRyYWN0cy9zYW0uY29udHJhY3QnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvY29udHJhY3RzL2NlbGwtc2VnbWVudGVyLmNvbnRyYWN0JztcbmV4cG9ydCB7IENlbGxwb3NlU2VnbWVudGVyU2VydmljZSB9IGZyb20gJy4vbGliL3Rvb2xiYXIvc2VnbWVudGF0aW9uL2NlbGxwb3NlLXNlZ21lbnRlci5zZXJ2aWNlJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL2NvbnRyYWN0cy9pbnN0YW5jZS1zZWdtZW50ZXIuY29udHJhY3QnO1xuZXhwb3J0IHsgWW9sb1NlZ21lbnRlclNlcnZpY2UgfSBmcm9tICcuL2xpYi90b29sYmFyL3NlZ21lbnRhdGlvbi95b2xvLXNlZ21lbnRlci5zZXJ2aWNlJztcbmV4cG9ydCB7IFlvbG9EZXRlY3RUb29sU2VydmljZSwgWU9MT19SRUdJT05fU09VUkNFIH0gZnJvbSAnLi9saWIvdG9vbGJhci9zZWdtZW50YXRpb24veW9sby1kZXRlY3QtdG9vbC5zZXJ2aWNlJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL2NvbnRyYWN0cy9zZW1hbnRpYy1zZWdtZW50ZXIuY29udHJhY3QnO1xuZXhwb3J0IHsgUmV0aW5hbFNlZ21lbnRlclNlcnZpY2UgfSBmcm9tICcuL2xpYi90b29sYmFyL3NlZ21lbnRhdGlvbi9yZXRpbmFsLXNlZ21lbnRlci5zZXJ2aWNlJztcbmV4cG9ydCB7XG4gIFJldGluYWxMYXllclRvb2xTZXJ2aWNlLFxuICBSRVRJTkFMX1JFR0lPTl9TT1VSQ0UsXG59IGZyb20gJy4vbGliL3Rvb2xiYXIvc2VnbWVudGF0aW9uL3JldGluYWwtbGF5ZXItdG9vbC5zZXJ2aWNlJztcblxuLy8g4pSA4pSAIEdlbmVyaWMgY2xpZW50LXNpZGUgaW1hZ2UgdXRpbGl0aWVzIChzaGFyZWQgd2l0aCB0aGUgaG9zdCdzIHBpcGVsaW5lKSDilIDilIBcbmV4cG9ydCB7IFByb2Nlc3NpbmdJbWFnZSB9IGZyb20gJy4vbGliL3Byb2Nlc3NpbmcvcHJvY2Vzc2luZy1pbWFnZSc7XG5leHBvcnQgeyBjcm9wSW1hZ2UsIENyb3BJbWFnZU9wdGlvbnMgfSBmcm9tICcuL2xpYi9wcm9jZXNzaW5nL2ltYWdlLWNyb3AnO1xuZXhwb3J0IHsgSW1hZ2VDb252ZXJ0ZXJTZXJ2aWNlIH0gZnJvbSAnLi9saWIvcHJvY2Vzc2luZy9pbWFnZS1jb252ZXJ0ZXIuc2VydmljZSc7XG5cbi8vIOKUgOKUgCBTQU0gbW9kZWwgcmVnaXN0cnkgKGhvc3QgY29uZmlndXJlcyBob3N0ZWQgT05OWCBVUkxzIG9uY2UgYXZhaWxhYmxlKSDilIDilIBcbmV4cG9ydCB7XG4gIFNBTV9NT0RFTFMsIERFRkFVTFRfU0FNX01PREVMX0lELCBnZXRTYW1Nb2RlbCwgaXNTYW1Nb2RlbFJlYWR5LCBzZXRTYW1Nb2RlbFVybHMsXG4gIHNldERlZmF1bHRTYW1Nb2RlbCwgZ2V0RGVmYXVsdFNhbU1vZGVsSWQsXG59IGZyb20gJy4vbGliL3Rvb2xiYXIvc2VnbWVudGF0aW9uL3NhbS1tb2RlbC1yZWdpc3RyeSc7XG5cbi8vIOKUgOKUgCBZT0xPIGluc3RhbmNlLXNlZ21lbnRhdGlvbiBtb2RlbCByZWdpc3RyeSAoc2FtZSByZXBvaW50aW5nIHN0b3J5KSDilIDilIDilIDilIDilIBcbmV4cG9ydCB7XG4gIFlPTE9fTU9ERUxTLCBERUZBVUxUX1lPTE9fTU9ERUxfSUQsIGdldFlvbG9Nb2RlbCwgaXNZb2xvTW9kZWxSZWFkeSwgc2V0WW9sb01vZGVsVXJscyxcbiAgc2V0RGVmYXVsdFlvbG9Nb2RlbCwgZ2V0RGVmYXVsdFlvbG9Nb2RlbElkLCBZb2xvTW9kZWxEZWYsXG59IGZyb20gJy4vbGliL3Rvb2xiYXIvc2VnbWVudGF0aW9uL3lvbG8tbW9kZWwtcmVnaXN0cnknO1xuXG4vLyDilIDilIAgUmV0aW5hbC1sYXllciBzZW1hbnRpYy1zZWdtZW50YXRpb24gcmVnaXN0cnkgKHNhbWUgcmVwb2ludGluZyBzdG9yeSkg4pSA4pSAXG5leHBvcnQge1xuICBSRVRJTkFMX01PREVMUywgREVGQVVMVF9SRVRJTkFMX01PREVMX0lELCBnZXRSZXRpbmFsTW9kZWwsIGlzUmV0aW5hbE1vZGVsUmVhZHksXG4gIHJlYWR5UmV0aW5hbE1vZGVscywgc2V0UmV0aW5hbE1vZGVsVXJscywgc2V0RGVmYXVsdFJldGluYWxNb2RlbCwgZ2V0RGVmYXVsdFJldGluYWxNb2RlbElkLFxuICBSZXRpbmFsTW9kZWxEZWYsXG59IGZyb20gJy4vbGliL3Rvb2xiYXIvc2VnbWVudGF0aW9uL3JldGluYWwtbW9kZWwtcmVnaXN0cnknO1xuXG4vLyDilIDilIAgb25ueHJ1bnRpbWUtd2ViIFdBU00gbG9jYXRpb24gKGhvc3Qgb3ZlcnJpZGVzIG9uY2UsIGF0IGFwcCBpbml0KSDilIDilIDilIDilIDilIDilIDilIBcbmV4cG9ydCB7IHNldE9ydFdhc21CYXNlLCBnZXRPcnRXYXNtQmFzZSB9IGZyb20gJy4vbGliL3Rvb2xiYXIvc2VnbWVudGF0aW9uL29ydC1ydW50aW1lLWNvbmZpZyc7XG5cbi8vIOKUgOKUgCBOZXV0cmFsIGRhdGEgbW9kZWxzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuZXhwb3J0ICogZnJvbSAnLi9saWIvbW9kZWxzL3JlZ2lvbic7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9tb2RlbHMvY2xhc3MtcHJlc2V0JztcbmV4cG9ydCB7IFNoYXBlU2VsZWN0aW9uIH0gZnJvbSAnLi9saWIvbW9kZWxzL3NoYXBlJztcblxuLy8g4pSA4pSAIEFuZ3VsYXIgbW9kdWxlICsgY29tcG9zaXRpb24tcm9vdCBzZXJ2aWNlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuZXhwb3J0IHsgVmlzdWFsaXphdGlvbk1vZHVsZSB9IGZyb20gJy4vbGliL3Zpc3VhbGl6YXRpb24ubW9kdWxlJztcbmV4cG9ydCB7IFJvdXRpbmdWaXN1YWxpemVyU2VydmljZSB9IGZyb20gJy4vbGliL3JvdXRpbmctdmlzdWFsaXplci5zZXJ2aWNlJztcbi8vIFByb3ZpZGVyIGZhY3RvcnkgZm9yIGFuIGlzb2xhdGVkLCBjb21wb25lbnQtc2NvcGVkIHZpZXdlciBpbnN0YW5jZSAoZS5nLiBhXG4vLyBtb2RhbCB0aGF0IG11c3Qgbm90IHNoYXJlIHRoZSBtYWluIHZpZXdlcidzIHJlZ2lvbi9pbWFnZSBzdGF0ZSkuXG5leHBvcnQgeyBwcm92aWRlVmlzdWFsaXphdGlvbiB9IGZyb20gJy4vbGliL3Byb3ZpZGUtdmlzdWFsaXphdGlvbic7XG5cbi8vIOKUgOKUgCBQdWJsaWMgY29tcG9uZW50cyAoZXhwb3J0ZWQgYnkgVmlzdWFsaXphdGlvbk1vZHVsZSkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4vLyBuZy1wYWNrYWdyIHJlcXVpcmVzIG1vZHVsZS1leHBvcnRlZCBjb21wb25lbnRzIHRvIGJlIHJlYWNoYWJsZSBmcm9tIHRoZVxuLy8gZW50cnkgcG9pbnQgc28gY29uc3VtZXJzIGdldCB0aGVpciB0eXBlczsgdGhlc2UgYXJlIHRoZSBlbWJlZGRhYmxlIGVsZW1lbnRzXG4vLyAoYDx2aXN1YWxpemVyPmAsIGA8cmVnaW9uLWVkaXRvcj5gLCBgPGhleC1jb2xvci1waWNrZXI+YCkuXG5leHBvcnQgeyBWaXN1YWxpemVyQ29tcG9uZW50IH0gZnJvbSAnLi9saWIvdmlzdWFsaXplci5jb21wb25lbnQnO1xuZXhwb3J0IHsgUmVnaW9uRWRpdG9yQ29tcG9uZW50IH0gZnJvbSAnLi9saWIvcmVnaW9uLWVkaXRvci9yZWdpb24tZWRpdG9yLmNvbXBvbmVudCc7XG5leHBvcnQgeyBIZXhDb2xvclBpY2tlckNvbXBvbmVudCB9IGZyb20gJy4vbGliL2hleC1jb2xvci1waWNrZXIvaGV4LWNvbG9yLXBpY2tlci5jb21wb25lbnQnO1xuZXhwb3J0IHsgQ2hhbm5lbEhpc3RvZ3JhbUNvbXBvbmVudCB9IGZyb20gJy4vbGliL2NoYW5uZWwtaGlzdG9ncmFtL2NoYW5uZWwtaGlzdG9ncmFtLmNvbXBvbmVudCc7XG4iXX0=
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { InjectionToken, inject } from '@angular/core';
|
|
2
|
+
import { RetinalSegmenterService } from '../toolbar/segmentation/retinal-segmenter.service';
|
|
3
|
+
/**
|
|
4
|
+
* DI token for the semantic segmenter, defaulting to the in-library
|
|
5
|
+
* jax-ai-js-backed implementation. Hosts override it to supply their own.
|
|
6
|
+
*/
|
|
7
|
+
export const SEMANTIC_SEGMENTER = new InjectionToken('SEMANTIC_SEGMENTER', {
|
|
8
|
+
providedIn: 'root',
|
|
9
|
+
factory: () => inject(RetinalSegmenterService),
|
|
10
|
+
});
|
|
11
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VtYW50aWMtc2VnbWVudGVyLmNvbnRyYWN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9jb250cmFjdHMvc2VtYW50aWMtc2VnbWVudGVyLmNvbnRyYWN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXZELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLG1EQUFtRCxDQUFDO0FBNEc1Rjs7O0dBR0c7QUFDSCxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLGNBQWMsQ0FBcUIsb0JBQW9CLEVBQUU7SUFDN0YsVUFBVSxFQUFFLE1BQU07SUFDbEIsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyx1QkFBdUIsQ0FBQztDQUMvQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3Rpb25Ub2tlbiwgaW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IFJldGluYWxTZWdtZW50ZXJTZXJ2aWNlIH0gZnJvbSAnLi4vdG9vbGJhci9zZWdtZW50YXRpb24vcmV0aW5hbC1zZWdtZW50ZXIuc2VydmljZSc7XG5cbi8qKlxuICogUG9ydCBmb3IgYSAqKnNlbWFudGljKiogc2VnbWVudGVyIOKAlCBvbmUgdGhhdCBhc3NpZ25zIGV2ZXJ5IHBpeGVsIGEgY2xhc3MgZnJvbVxuICogYSBmaXhlZCBzZXQsIHdpdGggbm8gbm90aW9uIG9mIHNlcGFyYXRlIG9iamVjdHMuXG4gKlxuICogVGhlIHRoaXJkIHNpYmxpbmcgb2Yge0BsaW5rIElDZWxsU2VnbWVudGVyfSBhbmQge0BsaW5rIElJbnN0YW5jZVNlZ21lbnRlcn0sXG4gKiBhbmQgZ2VudWluZWx5IGEgZGlmZmVyZW50IHNoYXBlIGZyb20gYm90aC4gQ2VsbHBvc2Ugc2VwYXJhdGVzIHRvdWNoaW5nXG4gKiBpbnN0YW5jZXMgb2Ygb25lIGNsYXNzOyBZT0xPIHJldHVybnMgb3ZlcmxhcHBpbmcgY2xhc3NpZmllZCBvYmplY3RzOyB0aGlzXG4gKiByZXR1cm5zICpsYXllcnMqIOKAlCByZWdpb25zIHRoYXQgdGlsZSB0aGUgaW1hZ2UsIG5ldmVyIG92ZXJsYXAsIGFuZCB3aGVyZSB0d29cbiAqIGRpc2Nvbm5lY3RlZCBwYXRjaGVzIG9mIHRoZSBzYW1lIGNsYXNzIGFyZSB0aGUgc2FtZSBmaW5kaW5nIHJhdGhlciB0aGFuIHR3b1xuICogb2JqZWN0cy4gVGhlcmUgaXMgbm8gY29uZmlkZW5jZSBwZXIgb2JqZWN0IGFuZCBubyBOTVMsIGJlY2F1c2UgdGhlcmUgYXJlIG5vXG4gKiBvYmplY3RzLlxuICpcbiAqIFJlc3VsdHMgYXJlIGRlbGl2ZXJlZCBhcyBwb2x5Z29uIHJpbmdzIGluICoqaW1hZ2UgcGl4ZWxzKiosIHNvIGEgY2FsbGVyIGNhblxuICogYnVpbGQge0BsaW5rIFJlZ2lvbn1zIGRpcmVjdGx5IOKAlCB0aGUgc2FtZSBjdXJyZW5jeSB0aGUgb3RoZXIgdHdvIHBvcnRzIHVzZS5cbiAqL1xuXG4vKiogQSBjbG9zZWQgcmluZzsgdGhlIGxhc3QgcG9pbnQgaXMgTk9UIGEgcmVwZWF0IG9mIHRoZSBmaXJzdC4gKi9cbmV4cG9ydCB0eXBlIFNlbWFudGljUmluZyA9IEFycmF5PFtudW1iZXIsIG51bWJlcl0+O1xuXG4vKiogT25lIGNvbm5lY3RlZCBjb21wb25lbnQgb2Ygb25lIGNsYXNzLCB3aXRoIGFueSBpbnRlcmlvciB2b2lkcy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VtYW50aWNSZWdpb24ge1xuICBleHRlcmlvcjogU2VtYW50aWNSaW5nO1xuICBob2xlczogU2VtYW50aWNSaW5nW107XG4gIGNsYXNzSWQ6IG51bWJlcjtcbiAgY2xhc3NOYW1lOiBzdHJpbmc7XG4gIC8qKiBBcmVhIGluIHBpeGVscywgaG9sZXMgYWxyZWFkeSBzdWJ0cmFjdGVkLiAqL1xuICBhcmVhOiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2VtYW50aWNTZWdtZW50YXRpb24ge1xuICByZWdpb25zOiBTZW1hbnRpY1JlZ2lvbltdO1xuICAvKiogVG90YWwgcGl4ZWxzIGFzc2lnbmVkIHRvIGVhY2ggY2xhc3MsIGluZGV4ZWQgYnkgY2xhc3MgaWQuICovXG4gIGNsYXNzQXJlYXM6IG51bWJlcltdO1xuICAvKiogQ2xhc3MgbmFtZXMgaW5kZXhlZCBieSBjbGFzcyBpZCwgZnJvbSB0aGUgbW9kZWwncyBvd24gbWV0YWRhdGEuICovXG4gIGNsYXNzTmFtZXM6IHN0cmluZ1tdO1xuICB3aWR0aDogbnVtYmVyO1xuICBoZWlnaHQ6IG51bWJlcjtcbiAgLyoqXG4gICAqIEZyYWN0aW9uIG9mIHBpeGVscyB0aGF0IG1ldCBubyBjbGFzcydzIHRocmVzaG9sZC5cbiAgICpcbiAgICogV29ydGggc3VyZmFjaW5nIHJhdGhlciB0aGFuIGRpc2NhcmRpbmc6IHRoZXNlIG1vZGVscyBhcmUgdGhyZXNob2xkZWQgcGVyXG4gICAqIGNsYXNzIHJhdGhlciB0aGFuIGFyZ21heGVkLCBzbyBhIGhpZ2ggdmFsdWUgbWVhbnMgdGhlIG1vZGVsIHdhcyB1bnN1cmVcbiAgICogZXZlcnl3aGVyZSDigJQgd2hpY2ggaXMgdGhlIHNpZ25hdHVyZSBvZiB3cm9uZyBwcmVwcm9jZXNzaW5nICh3cm9uZyBpbnB1dFxuICAgKiBzY2FsZSwgd3JvbmcgZ3JleXNjYWxlKSBsb25nIGJlZm9yZSB0aGUgcG9seWdvbnMgbG9vayBvYnZpb3VzbHkgd3JvbmcuXG4gICAqL1xuICB1bmFzc2lnbmVkRnJhY3Rpb246IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTZW1hbnRpY1NlZ21lbnRPcHRpb25zIHtcbiAgLyoqIFdoaWNoIHJlZ2lzdGVyZWQgbW9kZWwgdG8gcnVuLiBEZWZhdWx0cyB0byB0aGUgcmVnaXN0cnkncyBkZWZhdWx0LiAqL1xuICBtb2RlbElkPzogc3RyaW5nO1xuICAvKipcbiAgICogU2NhbGUgdG8gcnVuIGF0LCBhcyBhIGRpdmlzb3Igb2YgZnVsbCByZXNvbHV0aW9uIOKAlCB0aGUgc2FtZSBtZWFuaW5nIHRoZVxuICAgKiBzZXJ2ZXIgZ2l2ZXMgaXQuXG4gICAqXG4gICAqIE1hdHRlcnMgYXMgbXVjaCBoZXJlIGFzIGZvciBhIGRldGVjdG9yOiB0aGVzZSBjaGVja3BvaW50cyB3ZXJlIHRyYWluZWQgb25cbiAgICogNDB4IG9yIDIweCBwYXRjaGVzLCBhbmQgYSBsYXllciBpbWFnZWQgYXQgdGhlIHdyb25nIHNjYWxlIGRvZXMgbm90IGxvb2tcbiAgICogbGlrZSB0aGUgbGF5ZXIgdGhlIG1vZGVsIGxlYXJuZWQuXG4gICAqL1xuICBkb3duc2FtcGxpbmdGYWN0b3I/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBNaW5pbXVtIHByb2JhYmlsaXR5IGZvciBhIHBpeGVsIHRvIGJlIGFzc2lnbmVkIHRvIGEgY2xhc3MsIGRlZmF1bHQgMC41LlxuICAgKlxuICAgKiBOb3QgYSBwbGFpbiBhcmdtYXguIFRoZSByZWZlcmVuY2Ugd29ya2VyIHRocmVzaG9sZHMgZWFjaCBjbGFzcyBjaGFubmVsXG4gICAqIGluZGVwZW5kZW50bHkgYXQgMC41OyBiZWNhdXNlIHRoZSBtb2RlbCdzIGxhc3QgbGF5ZXIgaXMgYSBzb2Z0bWF4IGF0IG1vc3RcbiAgICogb25lIGNsYXNzIGNhbiBjbGVhciB0aGF0LCBzbyB0aGlzIGlzIGFyZ21heCAqcGx1cyBhIGNvbmZpZGVuY2UgZmxvb3IqIOKAlFxuICAgKiBwaXhlbHMgd2hlcmUgdGhlIHdpbm5lciBpcyB3ZWFrIGFyZSBsZWZ0IHVuYXNzaWduZWQgcmF0aGVyIHRoYW4gZm9yY2VkIGludG9cbiAgICogdGhlIGJlc3Qgb2YgYSBiYWQgc2V0LiBMb3dlcmluZyBpdCB0b3dhcmQgMC4yNSBhcHByb2FjaGVzIGEgdHJ1ZSBhcmdtYXggYW5kXG4gICAqIHZpc2libHkgZmF0dGVucyBldmVyeSBsYXllci5cbiAgICovXG4gIGNsYXNzVGhyZXNob2xkPzogbnVtYmVyO1xuICAvKiogS2VlcCBvbmx5IHRoZXNlIGNsYXNzIGlkczsgb21pdCBmb3IgZXZlcnl0aGluZyBleGNlcHQgYmFja2dyb3VuZC4gKi9cbiAgY2xhc3NGaWx0ZXI/OiBudW1iZXJbXTtcbiAgLyoqIERvdWdsYXMtUGV1Y2tlciB0b2xlcmFuY2UgaW4gcGl4ZWxzIGZvciBvdXRsaW5lIHNpbXBsaWZpY2F0aW9uOyAwIGRpc2FibGVzLiAqL1xuICBzaW1wbGlmeVRvbGVyYW5jZT86IG51bWJlcjtcbiAgLyoqIERyb3AgcmVnaW9ucyB3aG9zZSBhcmVhIGlzIGJlbG93IHRoaXMsIGluIHNxdWFyZSBwaXhlbHMuICovXG4gIG1pbkFyZWE/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBDb29wZXJhdGl2ZSBjYW5jZWxsYXRpb24sIGNoZWNrZWQgYXQgcGF0Y2ggYm91bmRhcmllcyDigJQgc28gaXQgdGFrZXMgZWZmZWN0XG4gICAqIHdpdGhpbiByb3VnaGx5IG9uZSBwYXRjaCByYXRoZXIgdGhhbiBpbnN0YW50bHkuXG4gICAqL1xuICBzaWduYWw/OiBBYm9ydFNpZ25hbDtcbn1cblxuLyoqIFByb2dyZXNzL3N0YXR1cyBjYWxsYmFja3MgKGFsbCBvcHRpb25hbCkuIE1pcnJvcnMge0BsaW5rIEluc3RhbmNlU2VnbWVudFByb2dyZXNzfS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VtYW50aWNTZWdtZW50UHJvZ3Jlc3Mge1xuICAvKiogTW9kZWwtZG93bmxvYWQgcHJvZ3Jlc3MsIDAuLjEgKGZpcnN0IHJ1biBvbmx5KS4gKi9cbiAgb25Qcm9ncmVzcz86IChmcmFjdGlvbjogbnVtYmVyKSA9PiB2b2lkO1xuICAvKipcbiAgICogUmF3IGRvd25sb2FkIGJ5dGUgY291bnRzLCBmb3IgaG9zdHMgdGhhdCByZW5kZXIgYSBzaXplIHJhdGhlciB0aGFuIGEgYmFyZVxuICAgKiBwZXJjZW50YWdlLiBgdG90YWxgIGlzIG51bGwgd2hlbiB0aGUgcmVzcG9uc2UgY2FycmllZCBubyBDb250ZW50LUxlbmd0aC5cbiAgICovXG4gIG9uQnl0ZXM/OiAobG9hZGVkOiBudW1iZXIsIHRvdGFsOiBudW1iZXIgfCBudWxsKSA9PiB2b2lkO1xuICAvKiogSHVtYW4tcmVhZGFibGUgcGhhc2UsIGUuZy4gJ1NlZ21lbnRpbmcgcGF0Y2ggMy844oCmJy4gKi9cbiAgb25TdGF0dXM/OiAoc3RhdHVzOiBzdHJpbmcpID0+IHZvaWQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVNlbWFudGljU2VnbWVudGVyIHtcbiAgLyoqIEFzc2lnbiBldmVyeSBwaXhlbCBhIGNsYXNzIGFuZCByZXR1cm4gdGhlIHJlc3VsdGluZyByZWdpb25zLiAqL1xuICBzZWdtZW50U2VtYW50aWMoXG4gICAgaW1hZ2U6IHsgZGF0YTogVWludDhDbGFtcGVkQXJyYXk7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyIH0sXG4gICAgb3B0cz86IFNlbWFudGljU2VnbWVudE9wdGlvbnMsXG4gICAgcHJvZ3Jlc3M/OiBTZW1hbnRpY1NlZ21lbnRQcm9ncmVzcyxcbiAgKTogUHJvbWlzZTxTZW1hbnRpY1NlZ21lbnRhdGlvbj47XG59XG5cbi8qKlxuICogREkgdG9rZW4gZm9yIHRoZSBzZW1hbnRpYyBzZWdtZW50ZXIsIGRlZmF1bHRpbmcgdG8gdGhlIGluLWxpYnJhcnlcbiAqIGpheC1haS1qcy1iYWNrZWQgaW1wbGVtZW50YXRpb24uIEhvc3RzIG92ZXJyaWRlIGl0IHRvIHN1cHBseSB0aGVpciBvd24uXG4gKi9cbmV4cG9ydCBjb25zdCBTRU1BTlRJQ19TRUdNRU5URVIgPSBuZXcgSW5qZWN0aW9uVG9rZW48SVNlbWFudGljU2VnbWVudGVyPignU0VNQU5USUNfU0VHTUVOVEVSJywge1xuICBwcm92aWRlZEluOiAncm9vdCcsXG4gIGZhY3Rvcnk6ICgpID0+IGluamVjdChSZXRpbmFsU2VnbWVudGVyU2VydmljZSksXG59KTtcbiJdfQ==
|
|
@@ -67,7 +67,7 @@ export class Region {
|
|
|
67
67
|
shape.editable = true;
|
|
68
68
|
shape.line = {
|
|
69
69
|
color: this.color ? this.color : this.shapeColor,
|
|
70
|
-
width: 3
|
|
70
|
+
width: 3,
|
|
71
71
|
};
|
|
72
72
|
shape.fileName = this.filename;
|
|
73
73
|
if (this.kind === 'profile')
|
|
@@ -77,7 +77,7 @@ export class Region {
|
|
|
77
77
|
text: `${this.label}`,
|
|
78
78
|
texttemplate: `${this.label}`,
|
|
79
79
|
font: { color: this.color ? this.color : this.shapeColor },
|
|
80
|
-
textposition: 'top left'
|
|
80
|
+
textposition: 'top left',
|
|
81
81
|
};
|
|
82
82
|
}
|
|
83
83
|
else {
|
|
@@ -163,4 +163,4 @@ export class MultiPolygon {
|
|
|
163
163
|
this.polygons = [];
|
|
164
164
|
}
|
|
165
165
|
}
|
|
166
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVnaW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9tb2RlbHMvcmVnaW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFFekMsTUFBTSxPQUFPLE1BQU07SUFBbkI7UUFRRSxXQUFNLEdBQStDLElBQUksQ0FBQztRQWUxRDs7O3FFQUc2RDtRQUM3RCxNQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ04sZUFBVSxHQUFJLFNBQVMsQ0FBQztRQUN4QixrQkFBYSxHQUFHLENBQUMsQ0FBQztRQUNsQjs7Ozs7Ozs7O1dBU0c7UUFDSCxlQUFVLEdBQUcsQ0FBQyxDQUFDO1FBQ2YsWUFBTyxHQUFHLEtBQUssQ0FBQztRQUNoQixlQUFVLEdBQUcsQ0FBQyxDQUFDO1FBQ2Ysb0JBQWUsR0FBb0IsSUFBSSxDQUFDO0lBZ0cxQyxDQUFDO0lBOUZDOztpRUFFNkQ7SUFDN0QsU0FBUztRQUNQLE9BQU8sSUFBSSxDQUFDLElBQUksS0FBSyxTQUFTLENBQUM7SUFDakMsQ0FBQztJQUVELFFBQVE7UUFDTix3QkFBd0I7UUFDeEIsSUFBSSxJQUFJLENBQUMsTUFBTSxZQUFZLFNBQVMsRUFBRSxDQUFDO1lBQ3JDLE9BQU8sTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsUUFBUSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7dUJBQzlCLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxhQUFhLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDdEUsQ0FBQzthQUFNLElBQUksSUFBSSxDQUFDLE1BQU0sWUFBWSxPQUFPLEVBQUMsQ0FBQztZQUN6QyxJQUFJLElBQUksR0FBRyxHQUFHLENBQUM7WUFDZixrQkFBa0I7WUFDbEIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxF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QUFJLElBQUksQ0FBQztJQUNyRSxDQUFDO0NBQ0Y7QUFFRCxNQUFNLE9BQU8sU0FBUztJQUF0QjtRQUNFLE1BQUMsR0FBRyxDQUFDLENBQUM7UUFDTixNQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ04sVUFBSyxHQUFHLENBQUMsQ0FBQztRQUNWLFdBQU0sR0FBRyxDQUFDLENBQUM7SUFDYixDQUFDO0NBQUE7QUFFRCxNQUFNLE9BQU8sT0FBTztJQUFwQjtRQUNFLFlBQU8sR0FBRyxDQUFDLENBQUM7UUFDWixZQUFPLEdBQWEsRUFBRSxDQUFDO1FBQ3ZCLFlBQU8sR0FBYSxFQUFFLENBQUM7UUFDdkIsZ0JBQVcsR0FBZSxFQUFFLENBQUM7UUFDN0IsbUVBQW1FO1FBQ25FLFdBQU0sR0FBRyxJQUFJLENBQUM7UUFDZDs7Ozs7Ozs7V0FRRztRQUNILFdBQU0sR0FBRyxLQUFLLENBQUM7SUE4QmpCLENBQUM7Q0FBQTtBQUVEOzs7Ozs7Ozs7R0FTRztBQUNILE1BQU0sT0FBTyxZQUFZO0lBQXpCO1FBQ0Usa0VBQWtFO1FBQ2xFLGFBQVEsR0FBYyxFQUFFLENBQUM7SUFDM0IsQ0FBQztDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU2hhcGVTZWxlY3Rpb24gfSBmcm9tICcuL3NoYXBlJztcblxuZXhwb3J0IGNsYXNzIFJlZ2lvbiB7XG5cbiAgLyoqIFN0YWJsZSwgdW5pcXVlIGlkZW50aXR5IGZvciBzZWxlY3Rpb24gYW5kIGVxdWFsaXR5LiBNaW50ZWQgYnlcbiAgICogIFBsb3RseVNlcnZpY2Ugd2hlbiBhIHJlZ2lvbiBmaXJzdCBlbnRlcnMgdGhlIHN5c3RlbS4gTmV2ZXIgZGVyaXZlZFxuICAgKiAgZnJvbSBhcnJheSBpbmRleCDigJQgbmFtZSBjb2xsaXNpb25zIGFjcm9zcyBkZWxldGUvYWRkIGN5Y2xlcyBtdXN0XG4gICAqICBub3QgYnJlYWsgUHJpbWVORyByb3cgc2VsZWN0aW9uLiAqL1xuICBpZCE6IG51bWJlcjtcbiAgbmFtZSE6IHN0cmluZztcbiAgYm91bmRzPzogUmVjdGFuZ2xlIHwgUG9seWdvbiB8IE11bHRpUG9seWdvbiB8IG51bGwgPSBudWxsO1xuICAvKiogcHJvZmlsZSA9IGFuIGludGVuc2l0eS1wcm9maWxlIGxpbmUgUk9JOyByZW5kZXJlZC9kcmFnZ2VkIGxpa2UgYSByZWdpb24gYnV0XG4gICAqICBleGNsdWRlZCBmcm9tIHRoZSBSZWdpb25zIHRhYiBhbmQgZXhwb3J0cy4gVXNlIGBpc1Byb2ZpbGUoKWAgdG8gdGVzdCBpdCDigJRcbiAgICogIGl0J3MgdGhlIGNhbm9uaWNhbCBtYXJrZXIgdGhhdCBzZXBhcmF0ZXMgaW50ZW5zaXR5IGxpbmVzIChvd25lZCBieSB0aGVcbiAgICogIGludGVuc2l0eSB0b29sLCBzYW1wbGVkIGludG8gdGhlIGluc2V0KSBmcm9tIGFubm90YXRpb24gcmVnaW9ucyAob3duZWQgYnlcbiAgICogIHRoZSBSZWdpb24gRWRpdG9yKS4gQm90aCBiYWNrZW5kcyAoUGxvdGx5LCBPU0QpIGhvbm91ciBpdC4gKi9cbiAga2luZD86ICdwcm9maWxlJztcbiAgY29sb3I/OiBzdHJpbmc7IC8vIGhleCBzdHJpbmcsIGUuZy4gJyNSUkdHQkInICh0aGUgaGlzdG9yaWNhbCBcIltyLCBnLCBiXVwiIG5vdGUgaXMgc3RhbGUpXG4gIC8vIGNsYXNzIGxhYmVsXG4gIGxhYmVsPzogc3RyaW5nO1xuICAvKiogVHJ1ZSB3aGVuIHRoZSB1c2VyIHNldCB0aGlzIHJlZ2lvbidzIGNvbG91ciBleHBsaWNpdGx5IChSZWdpb24gRWRpdG9yIENvbG9yXG4gICAqICBjb2x1bW4pLiBQcmVzZXQgY29sb3VyIHJlc29sdXRpb24gKGppdC11aSM3MCkgc2tpcHMgb3ZlcnJpZGRlbiByZWdpb25zIHNvIGFcbiAgICogIG1hbnVhbCBjb2xvdXIgaXMgbm90IGNsb2JiZXJlZCB3aGVuIHByZXNldHMgYXJlIChyZSlhcHBsaWVkIG9uIGxvYWQvaW1wb3J0LiAqL1xuICBjb2xvck92ZXJyaWRkZW4/OiBib29sZWFuO1xuICBmaWxlbmFtZT86IHN0cmluZztcbiAgLyoqIFplcm8tYmFzZWQgei1zbGljZSB0aGlzIHJlZ2lvbiBiZWxvbmdzIHRvIHdpdGhpbiBhIHN0YWNrIOKAlCBtaXJyb3JzXG4gICAqICBRdVBhdGgncyBgZ2VvbWV0cnkucGxhbmUuemAgKGEgbWlzc2luZyBwbGFuZSAvIGRlZmF1bHQgcGxhbmUgcmVhZHMgYmFjayBhc1xuICAgKiAgMCkuIFVzZWQgdG8gcGxhY2UvZmlsdGVyIFJPSXMgcGVyIHNsaWNlOyAwIGZvciBhIHBsYWluIHNpbmdsZS1wbGFuZSBpbWFnZVxuICAgKiAgb3IgYSByZWdpb24gZHJhd24gd2l0aG91dCBhIHNsaWNlIGNvbnRleHQgKGppdC11aSM5MykuICovXG4gIHogPSAwO1xuICBzaGFwZUNvbG9yPyA9ICcjMDBGRkZGJztcbiAgYnl0ZXNQZXJQaXhlbCA9IDg7XG4gIC8qKlxuICAgKiByZXNvbHV0aW9uIGlzIHRoZSByZXNvbHV0aW9uIGF0IHdoaWNoIHRoZSByZWdpb25cbiAgICogd2FzIGZvdW5kLiBJbiBvcmRlciB0byBnZXQgaXQgaW4gdGhlIGZ1bGwgaW1hZ2VcbiAgICogY29vcmRpbmF0ZXMgaXQgd2lsbCBub3JtYWxseSBiZSAwLiBIb3dldmVyIGlmXG4gICAqIHRoZXJlIGlzIGEgbWlzdGFrZSB3aXRoIHRoZSByZXNvbHV0aW9uIGl0IG1heSBub3RcbiAgICogYmUuIFdlIHJldHVybiB0aGUgcmVzb2x1dGlvbiBoZXJlIGluIG9yZGVyIHRvIGJlXG4gICAqIHN1cmUgd2hhdCBpdCBpcy4gVGhlIHNlcnZlciBtYXkgbmVlZCB0byBiZSBjaGFuZ2VkXG4gICAqIHRvIGVuc3VyZSB0aGF0IHJlc3VsdHMgcmVnaW9ucyBhcmUgYWx3YXlzIHJldHVybmVkXG4gICAqIGF0IHJlc29sdXRpb24gPSAwXG4gICAqL1xuICByZXNvbHV0aW9uID0gMDtcbiAgY3JvcHBlZCA9IGZhbHNlO1xuICB0aWxlTnVtYmVyID0gMDtcbiAgdGlsZUNvb3JkaW5hdGVzOiBudW1iZXJbXSB8IG51bGwgPSBudWxsO1xuXG4gIC8qKiBUcnVlIGZvciBpbnRlbnNpdHktcHJvZmlsZSBsaW5lIFJPSXMgKHRoZSBpbnRlbnNpdHkgdG9vbCdzIGxpbmVzKS4gVGhlc2UgYXJlXG4gICAqICBOT1QgYW5ub3RhdGlvbiByZWdpb25zOiB0aGV5IG5ldmVyIGFwcGVhciBpbiB0aGUgUmVnaW9uIEVkaXRvciBhbmQgZWRpdG9yXG4gICAqICBvcGVyYXRpb25zIChzZWxlY3Qvc2F2ZS9kZWxldGUpIG11c3QgbmV2ZXIgdG91Y2ggdGhlbS4gKi9cbiAgaXNQcm9maWxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmtpbmQgPT09ICdwcm9maWxlJztcbiAgfVxuXG4gIHRvU3RyaW5nKCkge1xuICAgIC8vIGlmIHNoYXBlIGlzIHJlY3RhbmdsZVxuICAgIGlmICh0aGlzLmJvdW5kcyBpbnN0YW5jZW9mIFJlY3RhbmdsZSkge1xuICAgICAgcmV0dXJuIGB4OiAke3RoaXMuYm91bmRzLnh9LCB5OiAke3RoaXMuYm91bmRzLnl9LFxuICAgICAgICAgICAgICB3aWR0aDogJHt0aGlzLmJvdW5kcy53aWR0aH0sIGhlaWdodDogJHt0aGlzLmJvdW5kcy5oZWlnaHR9YDtcbiAgICB9IGVsc2UgaWYgKHRoaXMuYm91bmRzIGluc3RhbmNlb2YgUG9seWdvbil7XG4gICAgICBsZXQgcGF0aCA9ICdNJztcbiAgICAgIC8vIGRpc3BsYXkgYXMgcGF0aFxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmJvdW5kcy5ucG9pbnRzOyBpKyspIHtcbiAgICAgICAgaWYgKGkgPCB0aGlzLmJvdW5kcy5ucG9pbnRzIC0gMSkge1xuICAgICAgICAgIHBhdGggPSBgJHtwYXRofSR7dGhpcy5ib3VuZHMueHBvaW50c1tpXX0sJHt0aGlzLmJvdW5kcy55cG9pbnRzW2ldfUxgO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBhdGggPSBgJHtwYXRofSR7dGhpcy5ib3VuZHMueHBvaW50c1tpXX0sJHt0aGlzLmJvdW5kcy55cG9pbnRzW2ldfWA7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmJvdW5kcy5jbG9zZWQgIT09IGZhbHNlKSB7XG4gICAgICAgIHBhdGggKz0gJ1onO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHBhdGg7XG4gICAgfVxuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgU2hhcGVTZWxlY3Rpb24gb2JqZWN0IHRoYXQgY2FuIGJlIHVzZWQgdG9cbiAgICogY3JlYXRlIGEgc2hhcGUgaW4gUGxvdGx5LlxuICAgKiBAcGFyYW0gc2hvd1JlZ2lvbkxhYmVsXG4gICAqIEByZXR1cm4gU2hhcGVTZWxlY3Rpb25cbiAgICovXG4gICBnZXRTaGFwZShzaG93UmVnaW9uTGFiZWw6IGJvb2xlYW4gPSB0cnVlKTogU2hhcGVTZWxlY3Rpb24ge1xuICAgIGNvbnN0IHNoYXBlID0gbmV3IFNoYXBlU2VsZWN0aW9uKCk7XG4gICAgc2hhcGUuaWQgPSB0aGlzLmlkO1xuICAgIHNoYXBlLm5hbWUgPSB0aGlzLm5hbWU7XG4gICAgc2hhcGUuZWRpdGFibGUgPSB0cnVlO1xuICAgIHNoYXBlLmxpbmUgPSB7XG4gICAgICBjb2xvcjogdGhpcy5jb2xvciA/IHRoaXMuY29sb3IgOiB0aGlzLnNoYXBlQ29sb3IsXG4gICAgICB3aWR0aDogM1xuICAgIH07XG4gICAgc2hhcGUuZmlsZU5hbWUgPSB0aGlzLmZpbGVuYW1lO1xuICAgIGlmICh0aGlzLmtpbmQgPT09ICdwcm9maWxlJykgc2hhcGUua2luZCA9ICdwcm9maWxlJztcbiAgICBpZiAoc2hvd1JlZ2lvbkxhYmVsKSB7XG4gICAgICBzaGFwZS5sYWJlbCA9IHtcbiAgICAgICAgdGV4dDogYCR7dGhpcy5sYWJlbH1gLFxuICAgICAgICB0ZXh0dGVtcGxhdGU6IGAke3RoaXMubGFiZWx9YCxcbiAgICAgICAgZm9udDogeyBjb2xvcjogdGhpcy5jb2xvciA/IHRoaXMuY29sb3IgOiB0aGlzLnNoYXBlQ29sb3IgfSxcbiAgICAgICAgdGV4dHBvc2l0aW9uOiAndG9wIGxlZnQnXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICBzaGFwZS5sYWJlbCA9IHt9O1xuICAgIH1cbiAgICBzaGFwZS5sZWdlbmQgPSB0aGlzLmxhYmVsO1xuXG4gICAgY29uc3QgYm5kcyA9IHRoaXMuYm91bmRzO1xuICAgIGlmIChibmRzICE9IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKHRoaXMuaXNSZWN0YW5nbGUoYm5kcykpIHtcbiAgICAgICAgc2hhcGUudHlwZSA9ICdyZWN0JztcbiAgICAgICAgc2hhcGUueDAgPSBibmRzLng7XG4gICAgICAgIHNoYXBlLnkwID0gYm5kcy55O1xuICAgICAgICBzaGFwZS54MSA9IGJuZHMueCArIGJuZHMud2lkdGg7XG4gICAgICAgIHNoYXBlLnkxID0gYm5kcy55ICsgYm5kcy5oZWlnaHQ7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5pc1BvbHlnb24oYm5kcykpIHtcbiAgICAgICAgc2hhcGUudHlwZSA9ICdwYXRoJztcbiAgICAgICAgbGV0IHBhdGggPSAnTSc7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYm5kcy5ucG9pbnRzOyBpKyspIHtcbiAgICAgICAgICBpZiAoaSA8IGJuZHMubnBvaW50cyAtIDEpIHtcbiAgICAgICAgICAgIHBhdGggPSBgJHtwYXRofSR7Ym5kcy54cG9pbnRzW2ldfSwke2JuZHMueXBvaW50c1tpXX1MYDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGF0aCA9IGAke3BhdGh9JHtibmRzLnhwb2ludHNbaV19LCR7Ym5kcy55cG9pbnRzW2ldfWA7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChibmRzLmNsb3NlZCAhPT0gZmFsc2UpIHtcbiAgICAgICAgICBwYXRoICs9ICdaJztcbiAgICAgICAgfVxuICAgICAgICBzaGFwZS5wYXRoID0gcGF0aDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHNoYXBlO1xuICB9XG5cbiAgaXNSZWN0YW5nbGUoYm5kczogYW55KTogYm5kcyBpcyBSZWN0YW5nbGUge1xuICAgIHJldHVybiAneCcgaW4gYm5kcyAmJiAneScgaW4gYm5kcyAmJiAnd2lkdGgnIGluIGJuZHMgJiYgJ2hlaWdodCcgaW4gYm5kcztcbiAgfVxuXG4gIGlzUG9seWdvbihibmRzOiBhbnkpOiBibmRzIGlzIFBvbHlnb24ge1xuICAgIHJldHVybiAnbnBvaW50cycgaW4gYm5kcyAmJiAneHBvaW50cycgaW4gYm5kcyAmJiAneXBvaW50cycgaW4gYm5kcztcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgUmVjdGFuZ2xlIHtcbiAgeCA9IDA7XG4gIHkgPSAwO1xuICB3aWR0aCA9IDA7XG4gIGhlaWdodCA9IDA7XG59XG5cbmV4cG9ydCBjbGFzcyBQb2x5Z29uIHtcbiAgbnBvaW50cyA9IDA7XG4gIHhwb2ludHM6IG51bWJlcltdID0gW107XG4gIHlwb2ludHM6IG51bWJlcltdID0gW107XG4gIGNvb3JkaW5hdGVzOiBudW1iZXJbXVtdID0gW107XG4gIC8qKiBmYWxzZSBmb3Igb3BlbiBwb2x5bGluZXM7IHRydWUgKGRlZmF1bHQpIGZvciBjbG9zZWQgcG9seWdvbnMgKi9cbiAgY2xvc2VkID0gdHJ1ZTtcbiAgLyoqXG4gICAqIFdoZW4gdHJ1ZSB0aGUgdmVydGljZXMgYXJlIHRyZWF0ZWQgYXMgYmV6aWVyLXNwbGluZSAqKmFuY2hvcnMqKiBhbmQgdGhlXG4gICAqIHJlZ2lvbiBpcyByZW5kZXJlZC9leHBvcnRlZCBhcyBhIHNtb290aCBjdXJ2ZSB0aHJvdWdoIHRoZW0uIFRoZSB2ZXJ0aWNlc1xuICAgKiBzdGF5IHRoZSBlZGl0YWJsZSBhbmNob3JzIOKAlCB0b2dnbGluZyB0aGlzIGZsYWcgaXMgdGhlIHRvQmV6aWVyXG4gICAqIChgdHJ1ZWApIC8gdG9Qb2x5Z29uIChgZmFsc2VgKSwgd2hpY2ggb25seSBhZGQvcmVtb3ZlIHRoZSBjdXJ2ZSwgbmV2ZXIgbW92ZVxuICAgKiB0aGUgYW5jaG9ycy4gR2VvSlNPTiBrZWVwcyB0aGUgZmxhdHRlbmVkIGN1cnZlIGFzIHRoZSBnZW9tZXRyeSAoc28gUXVQYXRoXG4gICAqIHJlbmRlcnMgaXQpIHBsdXMgdGhlIGFuY2hvcnMgKyBoYW5kbGVzICsgZmxhZyBpbiBwcm9wZXJ0aWVzIChzbyBKSVRcbiAgICogcm91bmQtdHJpcHMgdGhlIGVkaXRhYmxlIGJlemllcikuXG4gICAqL1xuICBiZXppZXIgPSBmYWxzZTtcbiAgLyoqXG4gICAqIFBlci1hbmNob3IgY3ViaWMtYmV6aWVyIGNvbnRyb2wtcG9pbnQgb2Zmc2V0cywgKipyZWxhdGl2ZSoqIHRvIHRoZWlyIGFuY2hvclxuICAgKiAoc28gdGhleSB0cmFuc2xhdGUgd2l0aCBpdCkuIFByZXNlbnQgb25seSBmb3IgYmV6aWVyIHJlZ2lvbnM7IGluaXRpYWxpc2VkXG4gICAqIGZyb20gdGhlIENhdG11bGwtUm9tIGNvbnN0cnVjdGlvbiAoYSBzbW9vdGggY3VydmUpIHdoZW4gYmV6aWVyIGlzIHR1cm5lZCBvbixcbiAgICogdGhlbiBpbmRpdmlkdWFsbHkgZWRpdGFibGUgYnkgZHJhZ2dpbmcgdGhlIGhhbmRsZXMuIGBoYW5kbGVzSW5baV1gIC9cbiAgICogYGhhbmRsZXNPdXRbaV1gIGFyZSBgW2R4LCBkeV1gIGZvciB2ZXJ0ZXggYGlgLlxuICAgKi9cbiAgaGFuZGxlc0luPzogbnVtYmVyW11bXTtcbiAgaGFuZGxlc091dD86IG51bWJlcltdW107XG5cbiAgLyoqXG4gICAqIEludGVyaW9yIHJpbmdzIChob2xlcykg4oCUIGppdC11aSM4NS4gRWFjaCByaW5nIGlzIGEgbGlzdCBvZiBgW3gsIHldYFxuICAgKiBpbWFnZS1waXhlbCBwYWlycyBpbiB0aGUgU0FNRSBjbG9zZWQtcG9seWdvbiBjb252ZW50aW9uIGFzIHRoZSBleHRlcmlvclxuICAgKiAoYGNvb3JkaW5hdGVzYCk6IG5vIHJlcGVhdGVkIGNsb3NpbmcgcG9pbnQuIFByZXNlbnQgb25seSBvbiBjbG9zZWQgcG9seWdvbnMuXG4gICAqIEEgcG9pbnQgaW5zaWRlIHRoZSBleHRlcmlvciAqKmFuZCoqIGluc2lkZSBhbnkgaG9sZSBpcyBPVVRTSURFIHRoZSByZWdpb25cbiAgICogKGV2ZW4tb2RkIHJ1bGUpLiBBYnNlbnQvZW1wdHkgPT0gYSBzb2xpZCBwb2x5Z29uICh0aGUgcHJpb3IgYmVoYXZpb3VyKSwgc29cbiAgICogZXZlcnkgZXhpc3RpbmcgcmVnaW9uIGlzIHVuYWZmZWN0ZWQuXG4gICAqL1xuICBob2xlcz86IG51bWJlcltdW11bXTtcblxuICAvKipcbiAgICogUGVyLWhvbGUgYsOpemllciBjb250cm9sLXBvaW50IG9mZnNldHMsIHBhcmFsbGVsIHRvIHtAbGluayBob2xlc30gKG9uZSBlbnRyeSBwZXIgcmluZywgZWFjaCBhXG4gICAqIGxpc3Qgb2YgYFtkeCwgZHldYCBwZXIgcmluZyB2ZXJ0ZXgsICoqcmVsYXRpdmUqKiB0byB0aGUgdmVydGV4KS4gUHJlc2VudCBvbmx5IHdoZW4gYGJlemllcmAgaXNcbiAgICogb24gZm9yIGEgZG9udXQg4oCUIHNlZWRlZCBmcm9tIHRoZSBDYXRtdWxsLVJvbSBkZWZhdWx0IGFuZCBpbmRpdmlkdWFsbHkgZWRpdGFibGUsIGV4YWN0bHkgbGlrZVxuICAgKiB0aGUgZXh0ZXJpb3Ige0BsaW5rIGhhbmRsZXNJbn0ve0BsaW5rIGhhbmRsZXNPdXR9LiBTbyBhIGRvbnV0IHNtb290aGVkIHRvIGEgYsOpemllciBjdXJ2ZXMgaXRzXG4gICAqIGhvbGVzIHRvbyAoaml0LXVpIzEwMikuXG4gICAqL1xuICBob2xlSGFuZGxlc0luPzogbnVtYmVyW11bXVtdO1xuICBob2xlSGFuZGxlc091dD86IG51bWJlcltdW11bXTtcbn1cblxuLyoqXG4gKiBBIHJlZ2lvbiB3aG9zZSBnZW9tZXRyeSBpcyBzZXZlcmFsIGRpc2pvaW50IHBhcnRzIOKAlCBlLmcuIHRoZSByZXN1bHQgb2YgbWVyZ2luZ1xuICogdHdvIG5vbi10b3VjaGluZyByZWdpb25zLCBvciB0aGUgaW52ZXJzZSBvZiBhIGJsb2IgKGppdC11aSM4NSkuIEVhY2ggcGFydCBpcyBhXG4gKiBjbG9zZWQge0BsaW5rIFBvbHlnb259IHRoYXQgbWF5IGNhcnJ5IGl0cyBvd24gaG9sZXMsIHNvIGEgTXVsdGlQb2x5Z29uXG4gKiByZXByZXNlbnRzIFwic3BhcnNlIGJpdHMsIHNvbWUgd2l0aCBkb251dCBob2xlc1wiIGFzIGEgc2luZ2xlIHJlZ2lvbi4gTWFwcyAxOjFcbiAqIG9udG8gYSBHZW9KU09OIGBNdWx0aVBvbHlnb25gIChhbmQgUXVQYXRoJ3MgZ2VvbWV0cnkpLlxuICpcbiAqIEEgc2luZ2xlLXBhcnQgTXVsdGlQb2x5Z29uIGlzIGVxdWl2YWxlbnQgdG8gdGhhdCBQb2x5Z29uOyBjYWxsZXJzIHNob3VsZFxuICogcHJlZmVyIGEgcGxhaW4ge0BsaW5rIFBvbHlnb259IGZvciBvbmUgY29ubmVjdGVkIHBhcnQuXG4gKi9cbmV4cG9ydCBjbGFzcyBNdWx0aVBvbHlnb24ge1xuICAvKiogT25lIG9yIG1vcmUgZGlzam9pbnQgY2xvc2VkIHBvbHlnb25zIChlYWNoIG1heSBoYXZlIGhvbGVzKS4gKi9cbiAgcG9seWdvbnM6IFBvbHlnb25bXSA9IFtdO1xufVxuXG5leHBvcnQgdHlwZSBCb3VuZHMgPSBSZWN0YW5nbGUgfCBQb2x5Z29uIHwge1xuICB4PzogbnVtYmVyO1xuICB5PzogbnVtYmVyO1xuICB3aWR0aD86IG51bWJlcjtcbiAgaGVpZ2h0PzogbnVtYmVyO1xuICBucG9pbnRzPzogbnVtYmVyO1xuICB4cG9pbnRzPzogbnVtYmVyW107XG4gIHlwb2ludHM/OiBudW1iZXJbXTtcbn07XG4iXX0=
|
|
166
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVnaW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9tb2RlbHMvcmVnaW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFFekMsTUFBTSxPQUFPLE1BQU07SUFBbkI7UUFPRSxXQUFNLEdBQStDLElBQUksQ0FBQztRQTBCMUQ7OztxRUFHNkQ7UUFDN0QsTUFBQyxHQUFHLENBQUMsQ0FBQztRQUNOLGVBQVUsR0FBSSxTQUFTLENBQUM7UUFDeEIsa0JBQWEsR0FBRyxDQUFDLENBQUM7UUFDbEI7Ozs7Ozs7OztXQVNHO1FBQ0gsZUFBVSxHQUFHLENBQUMsQ0FBQztRQUNmLFlBQU8sR0FBRyxLQUFLLENBQUM7UUFDaEIsZUFBVSxHQUFHLENBQUMsQ0FBQztRQUNmLG9CQUFlLEdBQW9CLElBQUksQ0FBQztJQWdHMUMsQ0FBQztJQTlGQzs7aUVBRTZEO0lBQzdELFNBQVM7UUFDUCxPQUFPLElBQUksQ0FBQyxJQUFJLEtBQUssU0FBUyxDQUFDO0lBQ2pDLENBQUM7SUFFRCxRQUFRO1FBQ04sd0JBQXdCO1FBQ3hCLElBQUksSUFBSSxDQUFDLE1BQU0sWUFBWSxTQUFTLEVBQUUsQ0FBQztZQUNyQyxPQUFPLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFFBQVEsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO3VCQUM5QixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssYUFBYSxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ3RFLENBQUM7YUFBTSxJQUFJLElBQUksQ0FBQyxNQUFNLFlBQVksT0FBTyxFQUFFLENBQUM7WUFDMUMsSUFBSSxJQUFJLEdBQUcsR0FBRyxDQUFDO1lBQ2Ysa0JBQWtCO1lBQ2xCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8s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SUFBSSxJQUFJLENBQUM7SUFDckUsQ0FBQztDQUNGO0FBRUQsTUFBTSxPQUFPLFNBQVM7SUFBdEI7UUFDRSxNQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ04sTUFBQyxHQUFHLENBQUMsQ0FBQztRQUNOLFVBQUssR0FBRyxDQUFDLENBQUM7UUFDVixXQUFNLEdBQUcsQ0FBQyxDQUFDO0lBQ2IsQ0FBQztDQUFBO0FBRUQsTUFBTSxPQUFPLE9BQU87SUFBcEI7UUFDRSxZQUFPLEdBQUcsQ0FBQyxDQUFDO1FBQ1osWUFBTyxHQUFhLEVBQUUsQ0FBQztRQUN2QixZQUFPLEdBQWEsRUFBRSxDQUFDO1FBQ3ZCLGdCQUFXLEdBQWUsRUFBRSxDQUFDO1FBQzdCLG1FQUFtRTtRQUNuRSxXQUFNLEdBQUcsSUFBSSxDQUFDO1FBQ2Q7Ozs7Ozs7O1dBUUc7UUFDSCxXQUFNLEdBQUcsS0FBSyxDQUFDO0lBOEJqQixDQUFDO0NBQUE7QUFFRDs7Ozs7Ozs7O0dBU0c7QUFDSCxNQUFNLE9BQU8sWUFBWTtJQUF6QjtRQUNFLGtFQUFrRTtRQUNsRSxhQUFRLEdBQWMsRUFBRSxDQUFDO0lBQzNCLENBQUM7Q0FBQSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFNoYXBlU2VsZWN0aW9uIH0gZnJvbSAnLi9zaGFwZSc7XG5cbmV4cG9ydCBjbGFzcyBSZWdpb24ge1xuICAvKiogU3RhYmxlLCB1bmlxdWUgaWRlbnRpdHkgZm9yIHNlbGVjdGlvbiBhbmQgZXF1YWxpdHkuIE1pbnRlZCBieVxuICAgKiAgUGxvdGx5U2VydmljZSB3aGVuIGEgcmVnaW9uIGZpcnN0IGVudGVycyB0aGUgc3lzdGVtLiBOZXZlciBkZXJpdmVkXG4gICAqICBmcm9tIGFycmF5IGluZGV4IOKAlCBuYW1lIGNvbGxpc2lvbnMgYWNyb3NzIGRlbGV0ZS9hZGQgY3ljbGVzIG11c3RcbiAgICogIG5vdCBicmVhayBQcmltZU5HIHJvdyBzZWxlY3Rpb24uICovXG4gIGlkITogbnVtYmVyO1xuICBuYW1lITogc3RyaW5nO1xuICBib3VuZHM/OiBSZWN0YW5nbGUgfCBQb2x5Z29uIHwgTXVsdGlQb2x5Z29uIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBwcm9maWxlID0gYW4gaW50ZW5zaXR5LXByb2ZpbGUgbGluZSBST0k7IHJlbmRlcmVkL2RyYWdnZWQgbGlrZSBhIHJlZ2lvbiBidXRcbiAgICogIGV4Y2x1ZGVkIGZyb20gdGhlIFJlZ2lvbnMgdGFiIGFuZCBleHBvcnRzLiBVc2UgYGlzUHJvZmlsZSgpYCB0byB0ZXN0IGl0IOKAlFxuICAgKiAgaXQncyB0aGUgY2Fub25pY2FsIG1hcmtlciB0aGF0IHNlcGFyYXRlcyBpbnRlbnNpdHkgbGluZXMgKG93bmVkIGJ5IHRoZVxuICAgKiAgaW50ZW5zaXR5IHRvb2wsIHNhbXBsZWQgaW50byB0aGUgaW5zZXQpIGZyb20gYW5ub3RhdGlvbiByZWdpb25zIChvd25lZCBieVxuICAgKiAgdGhlIFJlZ2lvbiBFZGl0b3IpLiBCb3RoIGJhY2tlbmRzIChQbG90bHksIE9TRCkgaG9ub3VyIGl0LiAqL1xuICBraW5kPzogJ3Byb2ZpbGUnO1xuICAvKipcbiAgICogV2hpY2ggYXV0b21hdGVkIHRvb2wgcHJvZHVjZWQgdGhpcyByZWdpb24sIGUuZy4gYCd5b2xvJ2AuIEFic2VudCBvblxuICAgKiBhbnl0aGluZyB0aGUgdXNlciBkcmV3LlxuICAgKlxuICAgKiBMZXRzIGEgdG9vbCByZXBsYWNlIGl0cyAqb3duKiBwcmV2aW91cyBvdXRwdXQgb24gYSByZS1ydW4gd2l0aG91dCB0b3VjaGluZ1xuICAgKiBoYW5kLWRyYXduIHdvcmsgb3IgYW5vdGhlciB0b29sJ3MgcmVzdWx0cyDigJQgd2hpY2ggbWF0dGVycyB3aGlsZSB0dW5pbmdcbiAgICogcGFyYW1ldGVycywgd2hlcmUgZXZlcnkgcnVuIHdvdWxkIG90aGVyd2lzZSBwaWxlIG9udG8gdGhlIGxhc3QuIElkZW50aXR5XG4gICAqIGNvbXBhcmlzb24gaXMgbm90IGEgc3Vic3RpdHV0ZTogcmVnaW9ucyBtYXkgYmUgcmUtbWludGVkIGFzIHRoZXkgcGFzc1xuICAgKiB0aHJvdWdoIHRoZSBzdG9yZSwgc28gdGhlIG1hcmtlciBoYXMgdG8gdHJhdmVsIHdpdGggdGhlIGRhdGEuXG4gICAqL1xuICBzb3VyY2U/OiBzdHJpbmc7XG4gIGNvbG9yPzogc3RyaW5nOyAvLyBoZXggc3RyaW5nLCBlLmcuICcjUlJHR0JCJyAodGhlIGhpc3RvcmljYWwgXCJbciwgZywgYl1cIiBub3RlIGlzIHN0YWxlKVxuICAvLyBjbGFzcyBsYWJlbFxuICBsYWJlbD86IHN0cmluZztcbiAgLyoqIFRydWUgd2hlbiB0aGUgdXNlciBzZXQgdGhpcyByZWdpb24ncyBjb2xvdXIgZXhwbGljaXRseSAoUmVnaW9uIEVkaXRvciBDb2xvclxuICAgKiAgY29sdW1uKS4gUHJlc2V0IGNvbG91ciByZXNvbHV0aW9uIChqaXQtdWkjNzApIHNraXBzIG92ZXJyaWRkZW4gcmVnaW9ucyBzbyBhXG4gICAqICBtYW51YWwgY29sb3VyIGlzIG5vdCBjbG9iYmVyZWQgd2hlbiBwcmVzZXRzIGFyZSAocmUpYXBwbGllZCBvbiBsb2FkL2ltcG9ydC4gKi9cbiAgY29sb3JPdmVycmlkZGVuPzogYm9vbGVhbjtcbiAgZmlsZW5hbWU/OiBzdHJpbmc7XG4gIC8qKiBaZXJvLWJhc2VkIHotc2xpY2UgdGhpcyByZWdpb24gYmVsb25ncyB0byB3aXRoaW4gYSBzdGFjayDigJQgbWlycm9yc1xuICAgKiAgUXVQYXRoJ3MgYGdlb21ldHJ5LnBsYW5lLnpgIChhIG1pc3NpbmcgcGxhbmUgLyBkZWZhdWx0IHBsYW5lIHJlYWRzIGJhY2sgYXNcbiAgICogIDApLiBVc2VkIHRvIHBsYWNlL2ZpbHRlciBST0lzIHBlciBzbGljZTsgMCBmb3IgYSBwbGFpbiBzaW5nbGUtcGxhbmUgaW1hZ2VcbiAgICogIG9yIGEgcmVnaW9uIGRyYXduIHdpdGhvdXQgYSBzbGljZSBjb250ZXh0IChqaXQtdWkjOTMpLiAqL1xuICB6ID0gMDtcbiAgc2hhcGVDb2xvcj8gPSAnIzAwRkZGRic7XG4gIGJ5dGVzUGVyUGl4ZWwgPSA4O1xuICAvKipcbiAgICogcmVzb2x1dGlvbiBpcyB0aGUgcmVzb2x1dGlvbiBhdCB3aGljaCB0aGUgcmVnaW9uXG4gICAqIHdhcyBmb3VuZC4gSW4gb3JkZXIgdG8gZ2V0IGl0IGluIHRoZSBmdWxsIGltYWdlXG4gICAqIGNvb3JkaW5hdGVzIGl0IHdpbGwgbm9ybWFsbHkgYmUgMC4gSG93ZXZlciBpZlxuICAgKiB0aGVyZSBpcyBhIG1pc3Rha2Ugd2l0aCB0aGUgcmVzb2x1dGlvbiBpdCBtYXkgbm90XG4gICAqIGJlLiBXZSByZXR1cm4gdGhlIHJlc29sdXRpb24gaGVyZSBpbiBvcmRlciB0byBiZVxuICAgKiBzdXJlIHdoYXQgaXQgaXMuIFRoZSBzZXJ2ZXIgbWF5IG5lZWQgdG8gYmUgY2hhbmdlZFxuICAgKiB0byBlbnN1cmUgdGhhdCByZXN1bHRzIHJlZ2lvbnMgYXJlIGFsd2F5cyByZXR1cm5lZFxuICAgKiBhdCByZXNvbHV0aW9uID0gMFxuICAgKi9cbiAgcmVzb2x1dGlvbiA9IDA7XG4gIGNyb3BwZWQgPSBmYWxzZTtcbiAgdGlsZU51bWJlciA9IDA7XG4gIHRpbGVDb29yZGluYXRlczogbnVtYmVyW10gfCBudWxsID0gbnVsbDtcblxuICAvKiogVHJ1ZSBmb3IgaW50ZW5zaXR5LXByb2ZpbGUgbGluZSBST0lzICh0aGUgaW50ZW5zaXR5IHRvb2wncyBsaW5lcykuIFRoZXNlIGFyZVxuICAgKiAgTk9UIGFubm90YXRpb24gcmVnaW9uczogdGhleSBuZXZlciBhcHBlYXIgaW4gdGhlIFJlZ2lvbiBFZGl0b3IgYW5kIGVkaXRvclxuICAgKiAgb3BlcmF0aW9ucyAoc2VsZWN0L3NhdmUvZGVsZXRlKSBtdXN0IG5ldmVyIHRvdWNoIHRoZW0uICovXG4gIGlzUHJvZmlsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5raW5kID09PSAncHJvZmlsZSc7XG4gIH1cblxuICB0b1N0cmluZygpIHtcbiAgICAvLyBpZiBzaGFwZSBpcyByZWN0YW5nbGVcbiAgICBpZiAodGhpcy5ib3VuZHMgaW5zdGFuY2VvZiBSZWN0YW5nbGUpIHtcbiAgICAgIHJldHVybiBgeDogJHt0aGlzLmJvdW5kcy54fSwgeTogJHt0aGlzLmJvdW5kcy55fSxcbiAgICAgICAgICAgICAgd2lkdGg6ICR7dGhpcy5ib3VuZHMud2lkdGh9LCBoZWlnaHQ6ICR7dGhpcy5ib3VuZHMuaGVpZ2h0fWA7XG4gICAgfSBlbHNlIGlmICh0aGlzLmJvdW5kcyBpbnN0YW5jZW9mIFBvbHlnb24pIHtcbiAgICAgIGxldCBwYXRoID0gJ00nO1xuICAgICAgLy8gZGlzcGxheSBhcyBwYXRoXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuYm91bmRzLm5wb2ludHM7IGkrKykge1xuICAgICAgICBpZiAoaSA8IHRoaXMuYm91bmRzLm5wb2ludHMgLSAxKSB7XG4gICAgICAgICAgcGF0aCA9IGAke3BhdGh9JHt0aGlzLmJvdW5kcy54cG9pbnRzW2ldfSwke3RoaXMuYm91bmRzLnlwb2ludHNbaV19TGA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcGF0aCA9IGAke3BhdGh9JHt0aGlzLmJvdW5kcy54cG9pbnRzW2ldfSwke3RoaXMuYm91bmRzLnlwb2ludHNbaV19YDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHRoaXMuYm91bmRzLmNsb3NlZCAhPT0gZmFsc2UpIHtcbiAgICAgICAgcGF0aCArPSAnWic7XG4gICAgICB9XG4gICAgICByZXR1cm4gcGF0aDtcbiAgICB9XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBTaGFwZVNlbGVjdGlvbiBvYmplY3QgdGhhdCBjYW4gYmUgdXNlZCB0b1xuICAgKiBjcmVhdGUgYSBzaGFwZSBpbiBQbG90bHkuXG4gICAqIEBwYXJhbSBzaG93UmVnaW9uTGFiZWxcbiAgICogQHJldHVybiBTaGFwZVNlbGVjdGlvblxuICAgKi9cbiAgZ2V0U2hhcGUoc2hvd1JlZ2lvbkxhYmVsOiBib29sZWFuID0gdHJ1ZSk6IFNoYXBlU2VsZWN0aW9uIHtcbiAgICBjb25zdCBzaGFwZSA9IG5ldyBTaGFwZVNlbGVjdGlvbigpO1xuICAgIHNoYXBlLmlkID0gdGhpcy5pZDtcbiAgICBzaGFwZS5uYW1lID0gdGhpcy5uYW1lO1xuICAgIHNoYXBlLmVkaXRhYmxlID0gdHJ1ZTtcbiAgICBzaGFwZS5saW5lID0ge1xuICAgICAgY29sb3I6IHRoaXMuY29sb3IgPyB0aGlzLmNvbG9yIDogdGhpcy5zaGFwZUNvbG9yLFxuICAgICAgd2lkdGg6IDMsXG4gICAgfTtcbiAgICBzaGFwZS5maWxlTmFtZSA9IHRoaXMuZmlsZW5hbWU7XG4gICAgaWYgKHRoaXMua2luZCA9PT0gJ3Byb2ZpbGUnKSBzaGFwZS5raW5kID0gJ3Byb2ZpbGUnO1xuICAgIGlmIChzaG93UmVnaW9uTGFiZWwpIHtcbiAgICAgIHNoYXBlLmxhYmVsID0ge1xuICAgICAgICB0ZXh0OiBgJHt0aGlzLmxhYmVsfWAsXG4gICAgICAgIHRleHR0ZW1wbGF0ZTogYCR7dGhpcy5sYWJlbH1gLFxuICAgICAgICBmb250OiB7IGNvbG9yOiB0aGlzLmNvbG9yID8gdGhpcy5jb2xvciA6IHRoaXMuc2hhcGVDb2xvciB9LFxuICAgICAgICB0ZXh0cG9zaXRpb246ICd0b3AgbGVmdCcsXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICBzaGFwZS5sYWJlbCA9IHt9O1xuICAgIH1cbiAgICBzaGFwZS5sZWdlbmQgPSB0aGlzLmxhYmVsO1xuXG4gICAgY29uc3QgYm5kcyA9IHRoaXMuYm91bmRzO1xuICAgIGlmIChibmRzICE9IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKHRoaXMuaXNSZWN0YW5nbGUoYm5kcykpIHtcbiAgICAgICAgc2hhcGUudHlwZSA9ICdyZWN0JztcbiAgICAgICAgc2hhcGUueDAgPSBibmRzLng7XG4gICAgICAgIHNoYXBlLnkwID0gYm5kcy55O1xuICAgICAgICBzaGFwZS54MSA9IGJuZHMueCArIGJuZHMud2lkdGg7XG4gICAgICAgIHNoYXBlLnkxID0gYm5kcy55ICsgYm5kcy5oZWlnaHQ7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5pc1BvbHlnb24oYm5kcykpIHtcbiAgICAgICAgc2hhcGUudHlwZSA9ICdwYXRoJztcbiAgICAgICAgbGV0IHBhdGggPSAnTSc7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYm5kcy5ucG9pbnRzOyBpKyspIHtcbiAgICAgICAgICBpZiAoaSA8IGJuZHMubnBvaW50cyAtIDEpIHtcbiAgICAgICAgICAgIHBhdGggPSBgJHtwYXRofSR7Ym5kcy54cG9pbnRzW2ldfSwke2JuZHMueXBvaW50c1tpXX1MYDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGF0aCA9IGAke3BhdGh9JHtibmRzLnhwb2ludHNbaV19LCR7Ym5kcy55cG9pbnRzW2ldfWA7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChibmRzLmNsb3NlZCAhPT0gZmFsc2UpIHtcbiAgICAgICAgICBwYXRoICs9ICdaJztcbiAgICAgICAgfVxuICAgICAgICBzaGFwZS5wYXRoID0gcGF0aDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHNoYXBlO1xuICB9XG5cbiAgaXNSZWN0YW5nbGUoYm5kczogYW55KTogYm5kcyBpcyBSZWN0YW5nbGUge1xuICAgIHJldHVybiAneCcgaW4gYm5kcyAmJiAneScgaW4gYm5kcyAmJiAnd2lkdGgnIGluIGJuZHMgJiYgJ2hlaWdodCcgaW4gYm5kcztcbiAgfVxuXG4gIGlzUG9seWdvbihibmRzOiBhbnkpOiBibmRzIGlzIFBvbHlnb24ge1xuICAgIHJldHVybiAnbnBvaW50cycgaW4gYm5kcyAmJiAneHBvaW50cycgaW4gYm5kcyAmJiAneXBvaW50cycgaW4gYm5kcztcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgUmVjdGFuZ2xlIHtcbiAgeCA9IDA7XG4gIHkgPSAwO1xuICB3aWR0aCA9IDA7XG4gIGhlaWdodCA9IDA7XG59XG5cbmV4cG9ydCBjbGFzcyBQb2x5Z29uIHtcbiAgbnBvaW50cyA9IDA7XG4gIHhwb2ludHM6IG51bWJlcltdID0gW107XG4gIHlwb2ludHM6IG51bWJlcltdID0gW107XG4gIGNvb3JkaW5hdGVzOiBudW1iZXJbXVtdID0gW107XG4gIC8qKiBmYWxzZSBmb3Igb3BlbiBwb2x5bGluZXM7IHRydWUgKGRlZmF1bHQpIGZvciBjbG9zZWQgcG9seWdvbnMgKi9cbiAgY2xvc2VkID0gdHJ1ZTtcbiAgLyoqXG4gICAqIFdoZW4gdHJ1ZSB0aGUgdmVydGljZXMgYXJlIHRyZWF0ZWQgYXMgYmV6aWVyLXNwbGluZSAqKmFuY2hvcnMqKiBhbmQgdGhlXG4gICAqIHJlZ2lvbiBpcyByZW5kZXJlZC9leHBvcnRlZCBhcyBhIHNtb290aCBjdXJ2ZSB0aHJvdWdoIHRoZW0uIFRoZSB2ZXJ0aWNlc1xuICAgKiBzdGF5IHRoZSBlZGl0YWJsZSBhbmNob3JzIOKAlCB0b2dnbGluZyB0aGlzIGZsYWcgaXMgdGhlIHRvQmV6aWVyXG4gICAqIChgdHJ1ZWApIC8gdG9Qb2x5Z29uIChgZmFsc2VgKSwgd2hpY2ggb25seSBhZGQvcmVtb3ZlIHRoZSBjdXJ2ZSwgbmV2ZXIgbW92ZVxuICAgKiB0aGUgYW5jaG9ycy4gR2VvSlNPTiBrZWVwcyB0aGUgZmxhdHRlbmVkIGN1cnZlIGFzIHRoZSBnZW9tZXRyeSAoc28gUXVQYXRoXG4gICAqIHJlbmRlcnMgaXQpIHBsdXMgdGhlIGFuY2hvcnMgKyBoYW5kbGVzICsgZmxhZyBpbiBwcm9wZXJ0aWVzIChzbyBKSVRcbiAgICogcm91bmQtdHJpcHMgdGhlIGVkaXRhYmxlIGJlemllcikuXG4gICAqL1xuICBiZXppZXIgPSBmYWxzZTtcbiAgLyoqXG4gICAqIFBlci1hbmNob3IgY3ViaWMtYmV6aWVyIGNvbnRyb2wtcG9pbnQgb2Zmc2V0cywgKipyZWxhdGl2ZSoqIHRvIHRoZWlyIGFuY2hvclxuICAgKiAoc28gdGhleSB0cmFuc2xhdGUgd2l0aCBpdCkuIFByZXNlbnQgb25seSBmb3IgYmV6aWVyIHJlZ2lvbnM7IGluaXRpYWxpc2VkXG4gICAqIGZyb20gdGhlIENhdG11bGwtUm9tIGNvbnN0cnVjdGlvbiAoYSBzbW9vdGggY3VydmUpIHdoZW4gYmV6aWVyIGlzIHR1cm5lZCBvbixcbiAgICogdGhlbiBpbmRpdmlkdWFsbHkgZWRpdGFibGUgYnkgZHJhZ2dpbmcgdGhlIGhhbmRsZXMuIGBoYW5kbGVzSW5baV1gIC9cbiAgICogYGhhbmRsZXNPdXRbaV1gIGFyZSBgW2R4LCBkeV1gIGZvciB2ZXJ0ZXggYGlgLlxuICAgKi9cbiAgaGFuZGxlc0luPzogbnVtYmVyW11bXTtcbiAgaGFuZGxlc091dD86IG51bWJlcltdW107XG5cbiAgLyoqXG4gICAqIEludGVyaW9yIHJpbmdzIChob2xlcykg4oCUIGppdC11aSM4NS4gRWFjaCByaW5nIGlzIGEgbGlzdCBvZiBgW3gsIHldYFxuICAgKiBpbWFnZS1waXhlbCBwYWlycyBpbiB0aGUgU0FNRSBjbG9zZWQtcG9seWdvbiBjb252ZW50aW9uIGFzIHRoZSBleHRlcmlvclxuICAgKiAoYGNvb3JkaW5hdGVzYCk6IG5vIHJlcGVhdGVkIGNsb3NpbmcgcG9pbnQuIFByZXNlbnQgb25seSBvbiBjbG9zZWQgcG9seWdvbnMuXG4gICAqIEEgcG9pbnQgaW5zaWRlIHRoZSBleHRlcmlvciAqKmFuZCoqIGluc2lkZSBhbnkgaG9sZSBpcyBPVVRTSURFIHRoZSByZWdpb25cbiAgICogKGV2ZW4tb2RkIHJ1bGUpLiBBYnNlbnQvZW1wdHkgPT0gYSBzb2xpZCBwb2x5Z29uICh0aGUgcHJpb3IgYmVoYXZpb3VyKSwgc29cbiAgICogZXZlcnkgZXhpc3RpbmcgcmVnaW9uIGlzIHVuYWZmZWN0ZWQuXG4gICAqL1xuICBob2xlcz86IG51bWJlcltdW11bXTtcblxuICAvKipcbiAgICogUGVyLWhvbGUgYsOpemllciBjb250cm9sLXBvaW50IG9mZnNldHMsIHBhcmFsbGVsIHRvIHtAbGluayBob2xlc30gKG9uZSBlbnRyeSBwZXIgcmluZywgZWFjaCBhXG4gICAqIGxpc3Qgb2YgYFtkeCwgZHldYCBwZXIgcmluZyB2ZXJ0ZXgsICoqcmVsYXRpdmUqKiB0byB0aGUgdmVydGV4KS4gUHJlc2VudCBvbmx5IHdoZW4gYGJlemllcmAgaXNcbiAgICogb24gZm9yIGEgZG9udXQg4oCUIHNlZWRlZCBmcm9tIHRoZSBDYXRtdWxsLVJvbSBkZWZhdWx0IGFuZCBpbmRpdmlkdWFsbHkgZWRpdGFibGUsIGV4YWN0bHkgbGlrZVxuICAgKiB0aGUgZXh0ZXJpb3Ige0BsaW5rIGhhbmRsZXNJbn0ve0BsaW5rIGhhbmRsZXNPdXR9LiBTbyBhIGRvbnV0IHNtb290aGVkIHRvIGEgYsOpemllciBjdXJ2ZXMgaXRzXG4gICAqIGhvbGVzIHRvbyAoaml0LXVpIzEwMikuXG4gICAqL1xuICBob2xlSGFuZGxlc0luPzogbnVtYmVyW11bXVtdO1xuICBob2xlSGFuZGxlc091dD86IG51bWJlcltdW11bXTtcbn1cblxuLyoqXG4gKiBBIHJlZ2lvbiB3aG9zZSBnZW9tZXRyeSBpcyBzZXZlcmFsIGRpc2pvaW50IHBhcnRzIOKAlCBlLmcuIHRoZSByZXN1bHQgb2YgbWVyZ2luZ1xuICogdHdvIG5vbi10b3VjaGluZyByZWdpb25zLCBvciB0aGUgaW52ZXJzZSBvZiBhIGJsb2IgKGppdC11aSM4NSkuIEVhY2ggcGFydCBpcyBhXG4gKiBjbG9zZWQge0BsaW5rIFBvbHlnb259IHRoYXQgbWF5IGNhcnJ5IGl0cyBvd24gaG9sZXMsIHNvIGEgTXVsdGlQb2x5Z29uXG4gKiByZXByZXNlbnRzIFwic3BhcnNlIGJpdHMsIHNvbWUgd2l0aCBkb251dCBob2xlc1wiIGFzIGEgc2luZ2xlIHJlZ2lvbi4gTWFwcyAxOjFcbiAqIG9udG8gYSBHZW9KU09OIGBNdWx0aVBvbHlnb25gIChhbmQgUXVQYXRoJ3MgZ2VvbWV0cnkpLlxuICpcbiAqIEEgc2luZ2xlLXBhcnQgTXVsdGlQb2x5Z29uIGlzIGVxdWl2YWxlbnQgdG8gdGhhdCBQb2x5Z29uOyBjYWxsZXJzIHNob3VsZFxuICogcHJlZmVyIGEgcGxhaW4ge0BsaW5rIFBvbHlnb259IGZvciBvbmUgY29ubmVjdGVkIHBhcnQuXG4gKi9cbmV4cG9ydCBjbGFzcyBNdWx0aVBvbHlnb24ge1xuICAvKiogT25lIG9yIG1vcmUgZGlzam9pbnQgY2xvc2VkIHBvbHlnb25zIChlYWNoIG1heSBoYXZlIGhvbGVzKS4gKi9cbiAgcG9seWdvbnM6IFBvbHlnb25bXSA9IFtdO1xufVxuXG5leHBvcnQgdHlwZSBCb3VuZHMgPVxuICB8IFJlY3RhbmdsZVxuICB8IFBvbHlnb25cbiAgfCB7XG4gICAgICB4PzogbnVtYmVyO1xuICAgICAgeT86IG51bWJlcjtcbiAgICAgIHdpZHRoPzogbnVtYmVyO1xuICAgICAgaGVpZ2h0PzogbnVtYmVyO1xuICAgICAgbnBvaW50cz86IG51bWJlcjtcbiAgICAgIHhwb2ludHM/OiBudW1iZXJbXTtcbiAgICAgIHlwb2ludHM/OiBudW1iZXJbXTtcbiAgICB9O1xuIl19
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
import { Inject, Injectable, Optional } from '@angular/core';
|
|
2
|
+
import { BehaviorSubject, firstValueFrom } from 'rxjs';
|
|
3
|
+
import { Region, Polygon } from '../../models/region';
|
|
4
|
+
import { TILE_ACCESS_PORT } from '../../contracts/ports/tile-access.port';
|
|
5
|
+
import * as i0 from "@angular/core";
|
|
6
|
+
/** Marks regions this tool produced, so a re-run can replace only its own. */
|
|
7
|
+
export const RETINAL_REGION_SOURCE = 'retinal-layer';
|
|
8
|
+
/**
|
|
9
|
+
* Retinal-layer segmentation over the current view.
|
|
10
|
+
*
|
|
11
|
+
* Sibling of {@link YoloDetectToolService}, and structured the same way: run on
|
|
12
|
+
* whatever is on screen, map the results onto full-image coordinates through
|
|
13
|
+
* the viewer's source rect, and commit them as regions. The difference is what
|
|
14
|
+
* comes back — layers that tile the field rather than discrete objects, so
|
|
15
|
+
* every region is one connected component of one layer and there is no
|
|
16
|
+
* per-object confidence to filter on.
|
|
17
|
+
*
|
|
18
|
+
* Exposes the same `status$` / `busy$` / `progress$` surface as the cellpose and
|
|
19
|
+
* YOLO tools so the host's shared segmentation toast drives it unchanged.
|
|
20
|
+
*/
|
|
21
|
+
export class RetinalLayerToolService {
|
|
22
|
+
constructor(
|
|
23
|
+
/** Server-side crop, so segmentation can run at the model's scale rather
|
|
24
|
+
* than the viewer's. Optional: without it the tool falls back to the
|
|
25
|
+
* displayed pixels, which is correct but scale-dependent. */
|
|
26
|
+
tileAccess = null) {
|
|
27
|
+
this.tileAccess = tileAccess;
|
|
28
|
+
this.status$ = new BehaviorSubject('');
|
|
29
|
+
this.busy$ = new BehaviorSubject(false);
|
|
30
|
+
this.progress$ = new BehaviorSubject(-1);
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Segment the current view and commit the layers as regions.
|
|
34
|
+
*
|
|
35
|
+
* @returns the number of regions added.
|
|
36
|
+
*/
|
|
37
|
+
async segmentInView(viz, segmenter, opts = {}) {
|
|
38
|
+
const pixels = viz.getDisplayedPixelData?.();
|
|
39
|
+
if (!pixels || pixels.width === 0 || pixels.height === 0) {
|
|
40
|
+
this.status$.next('No image on screen to segment.');
|
|
41
|
+
return 0;
|
|
42
|
+
}
|
|
43
|
+
this.busy$.next(true);
|
|
44
|
+
this.progress$.next(-1);
|
|
45
|
+
try {
|
|
46
|
+
const rect = viz.getDisplayedSourceRect?.() ?? null;
|
|
47
|
+
const target = Number(opts.downsamplingFactor ?? 0) || 0;
|
|
48
|
+
const viewFactor = rect && pixels.width > 0 ? rect.width / pixels.width : 1;
|
|
49
|
+
// Re-crop at the model's scale when the view is coarser than it wants.
|
|
50
|
+
// The image is tile-backed, so that detail exists server-side even though
|
|
51
|
+
// the displayed pixels have discarded it.
|
|
52
|
+
let source = { data: pixels.data, width: pixels.width, height: pixels.height };
|
|
53
|
+
if (rect && target > 0 && target < viewFactor * 0.98) {
|
|
54
|
+
this.status$.next('Fetching image at model resolution…');
|
|
55
|
+
const hi = await this.fetchCropAtScale(rect, target);
|
|
56
|
+
if (hi)
|
|
57
|
+
source = hi;
|
|
58
|
+
}
|
|
59
|
+
const result = await segmenter.segmentSemantic(source, opts, {
|
|
60
|
+
onProgress: (f) => this.progress$.next(f),
|
|
61
|
+
onStatus: (s) => this.status$.next(s),
|
|
62
|
+
});
|
|
63
|
+
// View pixels -> full-resolution image pixels. Without this every region
|
|
64
|
+
// would sit at view-local coordinates, i.e. the wrong place on the slide
|
|
65
|
+
// for any zoomed or panned view.
|
|
66
|
+
const offsetX = rect ? rect.x : 0;
|
|
67
|
+
const offsetY = rect ? rect.y : 0;
|
|
68
|
+
// Against the pixels actually inferred on, which may be the re-crop.
|
|
69
|
+
const ratioX = rect && source.width > 0 ? rect.width / source.width : 1;
|
|
70
|
+
const ratioY = rect && source.height > 0 ? rect.height / source.height : 1;
|
|
71
|
+
// View pixels -> image pixels, for any ring.
|
|
72
|
+
const mapRing = (ring) => ring.map(([x, y]) => [Math.round(offsetX + x * ratioX), Math.round(offsetY + y * ratioY)]);
|
|
73
|
+
const added = [];
|
|
74
|
+
for (const r of result.regions) {
|
|
75
|
+
if (r.exterior.length < 3)
|
|
76
|
+
continue;
|
|
77
|
+
const exterior = mapRing(r.exterior);
|
|
78
|
+
added.push(this.makeRegion(exterior.map(([x]) => x), exterior.map(([, y]) => y), r.className,
|
|
79
|
+
// Holes are real findings here, not noise: a layer with a void
|
|
80
|
+
// through it is a donut, and dropping the interior rings fills it
|
|
81
|
+
// in silently. Rings that survive simplification to fewer than 3
|
|
82
|
+
// points cannot bound anything, so they are skipped rather than
|
|
83
|
+
// emitted as degenerate geometry.
|
|
84
|
+
r.holes.filter((h) => h.length >= 3).map(mapRing)));
|
|
85
|
+
}
|
|
86
|
+
if (added.length === 0) {
|
|
87
|
+
// Distinguish "found nothing" from "was unsure everywhere". The second
|
|
88
|
+
// is the signature of wrong preprocessing or the wrong magnification,
|
|
89
|
+
// and reads as a silent no-op unless it is said out loud.
|
|
90
|
+
this.status$.next(result.unassignedFraction > 0.9
|
|
91
|
+
? 'No layers found — the model was unsure across the whole view. ' +
|
|
92
|
+
'Check the magnification matches the model.'
|
|
93
|
+
: 'No layers found.');
|
|
94
|
+
return 0;
|
|
95
|
+
}
|
|
96
|
+
// Replace this tool's own previous output, keep everything else.
|
|
97
|
+
// Hand-drawn regions and other tools' output carry a different `source`
|
|
98
|
+
// (or none) and are untouched.
|
|
99
|
+
const kept = (viz.getRegions() ?? []).filter((x) => x.source !== RETINAL_REGION_SOURCE);
|
|
100
|
+
viz.setRegions([...kept, ...added]);
|
|
101
|
+
this.status$.next(`Added ${added.length} region(s).`);
|
|
102
|
+
return added.length;
|
|
103
|
+
}
|
|
104
|
+
catch (err) {
|
|
105
|
+
this.status$.next(err instanceof Error ? err.message : 'Retinal layer segmentation failed.');
|
|
106
|
+
return 0;
|
|
107
|
+
}
|
|
108
|
+
finally {
|
|
109
|
+
this.busy$.next(false);
|
|
110
|
+
this.progress$.next(-1);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Re-crop `rect` at `1/target` of full resolution. Returns null on any
|
|
115
|
+
* failure, so the caller falls back to the displayed pixels — a coarser crop
|
|
116
|
+
* beats a failed run.
|
|
117
|
+
*/
|
|
118
|
+
async fetchCropAtScale(rect, target) {
|
|
119
|
+
if (!this.tileAccess)
|
|
120
|
+
return null;
|
|
121
|
+
let w = Math.round(rect.width / target);
|
|
122
|
+
let h = Math.round(rect.height / target);
|
|
123
|
+
// A factor of 1 over a whole-slide ROI would ask for hundreds of megapixels.
|
|
124
|
+
const MAX_PIXELS = 16_777_216; // 4096²
|
|
125
|
+
const pixels = w * h;
|
|
126
|
+
if (pixels > MAX_PIXELS) {
|
|
127
|
+
const k = Math.sqrt(MAX_PIXELS / pixels);
|
|
128
|
+
w = Math.round(w * k);
|
|
129
|
+
h = Math.round(h * k);
|
|
130
|
+
}
|
|
131
|
+
if (w < 64 || h < 64)
|
|
132
|
+
return null;
|
|
133
|
+
try {
|
|
134
|
+
const roi = {
|
|
135
|
+
x: Math.round(rect.x),
|
|
136
|
+
y: Math.round(rect.y),
|
|
137
|
+
width: Math.round(rect.width),
|
|
138
|
+
height: Math.round(rect.height),
|
|
139
|
+
};
|
|
140
|
+
const screen = { x: 0, y: 0, width: w, height: h };
|
|
141
|
+
const bytes = await firstValueFrom(this.tileAccess.zoomOnRegion(roi, screen, 0));
|
|
142
|
+
if (!bytes || bytes.byteLength === 0)
|
|
143
|
+
return null;
|
|
144
|
+
const bitmap = await createImageBitmap(new Blob([bytes]));
|
|
145
|
+
const canvas = document.createElement('canvas');
|
|
146
|
+
canvas.width = bitmap.width;
|
|
147
|
+
canvas.height = bitmap.height;
|
|
148
|
+
const ctx = canvas.getContext('2d');
|
|
149
|
+
if (!ctx)
|
|
150
|
+
return null;
|
|
151
|
+
ctx.drawImage(bitmap, 0, 0);
|
|
152
|
+
// Read the dimensions BEFORE close(): closing an ImageBitmap zeroes its
|
|
153
|
+
// width/height, so returning them afterwards yields a 0x0 image with a
|
|
154
|
+
// full pixel buffer — inference then runs on nothing and finds nothing.
|
|
155
|
+
const width = bitmap.width;
|
|
156
|
+
const height = bitmap.height;
|
|
157
|
+
const out = ctx.getImageData(0, 0, width, height);
|
|
158
|
+
bitmap.close?.();
|
|
159
|
+
return { data: out.data, width, height };
|
|
160
|
+
}
|
|
161
|
+
catch {
|
|
162
|
+
return null;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
makeRegion(xs, ys, className, holes = []) {
|
|
166
|
+
const poly = new Polygon();
|
|
167
|
+
poly.npoints = xs.length;
|
|
168
|
+
poly.xpoints = xs;
|
|
169
|
+
poly.ypoints = ys;
|
|
170
|
+
poly.coordinates = xs.map((x, i) => [x, ys[i]]);
|
|
171
|
+
poly.closed = true;
|
|
172
|
+
// Same closed-ring convention as the exterior: no repeated closing point.
|
|
173
|
+
// Left unset when empty so a solid region does not carry an empty array
|
|
174
|
+
// through export and round-tripping.
|
|
175
|
+
if (holes.length)
|
|
176
|
+
poly.holes = holes;
|
|
177
|
+
const region = new Region();
|
|
178
|
+
region.bounds = poly;
|
|
179
|
+
region.source = RETINAL_REGION_SOURCE;
|
|
180
|
+
// The class name drives preset colour resolution; leaving `color` unset lets
|
|
181
|
+
// an existing preset for this layer win.
|
|
182
|
+
region.label = className;
|
|
183
|
+
return region;
|
|
184
|
+
}
|
|
185
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.9", ngImport: i0, type: RetinalLayerToolService, deps: [{ token: TILE_ACCESS_PORT, optional: true }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
186
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.9", ngImport: i0, type: RetinalLayerToolService, providedIn: 'root' }); }
|
|
187
|
+
}
|
|
188
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.9", ngImport: i0, type: RetinalLayerToolService, decorators: [{
|
|
189
|
+
type: Injectable,
|
|
190
|
+
args: [{ providedIn: 'root' }]
|
|
191
|
+
}], ctorParameters: () => [{ type: undefined, decorators: [{
|
|
192
|
+
type: Optional
|
|
193
|
+
}, {
|
|
194
|
+
type: Inject,
|
|
195
|
+
args: [TILE_ACCESS_PORT]
|
|
196
|
+
}] }] });
|
|
197
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmV0aW5hbC1sYXllci10b29sLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL3Rvb2xiYXIvc2VnbWVudGF0aW9uL3JldGluYWwtbGF5ZXItdG9vbC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM3RCxPQUFPLEVBQUUsZUFBZSxFQUFFLGNBQWMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUV2RCxPQUFPLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBYSxNQUFNLHFCQUFxQixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBdUIsTUFBTSx3Q0FBd0MsQ0FBQzs7QUFPL0YsOEVBQThFO0FBQzlFLE1BQU0sQ0FBQyxNQUFNLHFCQUFxQixHQUFHLGVBQWUsQ0FBQztBQUVyRDs7Ozs7Ozs7Ozs7O0dBWUc7QUFFSCxNQUFNLE9BQU8sdUJBQXVCO0lBS2xDO0lBQ0U7O2tFQUU4RDtJQUNoQixhQUFvQyxJQUFJO1FBQXhDLGVBQVUsR0FBVixVQUFVLENBQThCO1FBUi9FLFlBQU8sR0FBRyxJQUFJLGVBQWUsQ0FBUyxFQUFFLENBQUMsQ0FBQztRQUMxQyxVQUFLLEdBQUcsSUFBSSxlQUFlLENBQVUsS0FBSyxDQUFDLENBQUM7UUFDNUMsY0FBUyxHQUFHLElBQUksZUFBZSxDQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFPbEQsQ0FBQztJQUVKOzs7O09BSUc7SUFDSCxLQUFLLENBQUMsYUFBYSxDQUNqQixHQUFnQixFQUNoQixTQUE2QixFQUM3QixPQUErQixFQUFFO1FBRWpDLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxxQkFBcUIsRUFBRSxFQUFFLENBQUM7UUFDN0MsSUFBSSxDQUFDLE1BQU0sSUFBSSxNQUFNLENBQUMsS0FBSyxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMs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YmxlLCBPcHRpb25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBmaXJzdFZhbHVlRnJvbSB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgeyBSZWdpb24sIFBvbHlnb24sIFJlY3RhbmdsZSB9IGZyb20gJy4uLy4uL21vZGVscy9yZWdpb24nO1xuaW1wb3J0IHsgVElMRV9BQ0NFU1NfUE9SVCwgdHlwZSBUaWxlQWNjZXNzUG9ydCB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9wb3J0cy90aWxlLWFjY2Vzcy5wb3J0JztcbmltcG9ydCB0eXBlIHsgSVZpc3VhbGl6ZXIgfSBmcm9tICcuLi8uLi9jb250cmFjdHMvdmlzdWFsaXplci5jb250cmFjdCc7XG5pbXBvcnQgdHlwZSB7XG4gIElTZW1hbnRpY1NlZ21lbnRlcixcbiAgU2VtYW50aWNTZWdtZW50T3B0aW9ucyxcbn0gZnJvbSAnLi4vLi4vY29udHJhY3RzL3NlbWFudGljLXNlZ21lbnRlci5jb250cmFjdCc7XG5cbi8qKiBNYXJrcyByZWdpb25zIHRoaXMgdG9vbCBwcm9kdWNlZCwgc28gYSByZS1ydW4gY2FuIHJlcGxhY2Ugb25seSBpdHMgb3duLiAqL1xuZXhwb3J0IGNvbnN0IFJFVElOQUxfUkVHSU9OX1NPVVJDRSA9ICdyZXRpbmFsLWxheWVyJztcblxuLyoqXG4gKiBSZXRpbmFsLWxheWVyIHNlZ21lbnRhdGlvbiBvdmVyIHRoZSBjdXJyZW50IHZpZXcuXG4gKlxuICogU2libGluZyBvZiB7QGxpbmsgWW9sb0RldGVjdFRvb2xTZXJ2aWNlfSwgYW5kIHN0cnVjdHVyZWQgdGhlIHNhbWUgd2F5OiBydW4gb25cbiAqIHdoYXRldmVyIGlzIG9uIHNjcmVlbiwgbWFwIHRoZSByZXN1bHRzIG9udG8gZnVsbC1pbWFnZSBjb29yZGluYXRlcyB0aHJvdWdoXG4gKiB0aGUgdmlld2VyJ3Mgc291cmNlIHJlY3QsIGFuZCBjb21taXQgdGhlbSBhcyByZWdpb25zLiBUaGUgZGlmZmVyZW5jZSBpcyB3aGF0XG4gKiBjb21lcyBiYWNrIOKAlCBsYXllcnMgdGhhdCB0aWxlIHRoZSBmaWVsZCByYXRoZXIgdGhhbiBkaXNjcmV0ZSBvYmplY3RzLCBzb1xuICogZXZlcnkgcmVnaW9uIGlzIG9uZSBjb25uZWN0ZWQgY29tcG9uZW50IG9mIG9uZSBsYXllciBhbmQgdGhlcmUgaXMgbm9cbiAqIHBlci1vYmplY3QgY29uZmlkZW5jZSB0byBmaWx0ZXIgb24uXG4gKlxuICogRXhwb3NlcyB0aGUgc2FtZSBgc3RhdHVzJGAgLyBgYnVzeSRgIC8gYHByb2dyZXNzJGAgc3VyZmFjZSBhcyB0aGUgY2VsbHBvc2UgYW5kXG4gKiBZT0xPIHRvb2xzIHNvIHRoZSBob3N0J3Mgc2hhcmVkIHNlZ21lbnRhdGlvbiB0b2FzdCBkcml2ZXMgaXQgdW5jaGFuZ2VkLlxuICovXG5ASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46ICdyb290JyB9KVxuZXhwb3J0IGNsYXNzIFJldGluYWxMYXllclRvb2xTZXJ2aWNlIHtcbiAgcmVhZG9ubHkgc3RhdHVzJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8c3RyaW5nPignJyk7XG4gIHJlYWRvbmx5IGJ1c3kkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG4gIHJlYWRvbmx5IHByb2dyZXNzJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8bnVtYmVyPigtMSk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgLyoqIFNlcnZlci1zaWRlIGNyb3AsIHNvIHNlZ21lbnRhdGlvbiBjYW4gcnVuIGF0IHRoZSBtb2RlbCdzIHNjYWxlIHJhdGhlclxuICAgICAqICB0aGFuIHRoZSB2aWV3ZXIncy4gT3B0aW9uYWw6IHdpdGhvdXQgaXQgdGhlIHRvb2wgZmFsbHMgYmFjayB0byB0aGVcbiAgICAgKiAgZGlzcGxheWVkIHBpeGVscywgd2hpY2ggaXMgY29ycmVjdCBidXQgc2NhbGUtZGVwZW5kZW50LiAqL1xuICAgIEBPcHRpb25hbCgpIEBJbmplY3QoVElMRV9BQ0NFU1NfUE9SVCkgcHJpdmF0ZSB0aWxlQWNjZXNzOiBUaWxlQWNjZXNzUG9ydCB8IG51bGwgPSBudWxsLFxuICApIHt9XG5cbiAgLyoqXG4gICAqIFNlZ21lbnQgdGhlIGN1cnJlbnQgdmlldyBhbmQgY29tbWl0IHRoZSBsYXllcnMgYXMgcmVnaW9ucy5cbiAgICpcbiAgICogQHJldHVybnMgdGhlIG51bWJlciBvZiByZWdpb25zIGFkZGVkLlxuICAgKi9cbiAgYXN5bmMgc2VnbWVudEluVmlldyhcbiAgICB2aXo6IElWaXN1YWxpemVyLFxuICAgIHNlZ21lbnRlcjogSVNlbWFudGljU2VnbWVudGVyLFxuICAgIG9wdHM6IFNlbWFudGljU2VnbWVudE9wdGlvbnMgPSB7fSxcbiAgKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBjb25zdCBwaXhlbHMgPSB2aXouZ2V0RGlzcGxheWVkUGl4ZWxEYXRhPy4oKTtcbiAgICBpZiAoIXBpeGVscyB8fCBwaXhlbHMud2lkdGggPT09IDAgfHwgcGl4ZWxzLmhlaWdodCA9PT0gMCkge1xuICAgICAgdGhpcy5zdGF0dXMkLm5leHQoJ05vIGltYWdlIG9uIHNjcmVlbiB0byBzZWdtZW50LicpO1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgdGhpcy5idXN5JC5uZXh0KHRydWUpO1xuICAgIHRoaXMucHJvZ3Jlc3MkLm5leHQoLTEpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZWN0ID0gdml6LmdldERpc3BsYXllZFNvdXJjZVJlY3Q/LigpID8/IG51bGw7XG4gICAgICBjb25zdCB0YXJnZXQgPSBOdW1iZXIob3B0cy5kb3duc2FtcGxpbmdGYWN0b3IgPz8gMCkgfHwgMDtcbiAgICAgIGNvbnN0IHZpZXdGYWN0b3IgPSByZWN0ICYmIHBpeGVscy53aWR0aCA+IDAgPyByZWN0LndpZHRoIC8gcGl4ZWxzLndpZHRoIDogMTtcblxuICAgICAgLy8gUmUtY3JvcCBhdCB0aGUgbW9kZWwncyBzY2FsZSB3aGVuIHRoZSB2aWV3IGlzIGNvYXJzZXIgdGhhbiBpdCB3YW50cy5cbiAgICAgIC8vIFRoZSBpbWFnZSBpcyB0aWxlLWJhY2tlZCwgc28gdGhhdCBkZXRhaWwgZXhpc3RzIHNlcnZlci1zaWRlIGV2ZW4gdGhvdWdoXG4gICAgICAvLyB0aGUgZGlzcGxheWVkIHBpeGVscyBoYXZlIGRpc2NhcmRlZCBpdC5cbiAgICAgIGxldCBzb3VyY2UgPSB7IGRhdGE6IHBpeGVscy5kYXRhLCB3aWR0aDogcGl4ZWxzLndpZHRoLCBoZWlnaHQ6IHBpeGVscy5oZWlnaHQgfTtcbiAgICAgIGlmIChyZWN0ICYmIHRhcmdldCA+IDAgJiYgdGFyZ2V0IDwgdmlld0ZhY3RvciAqIDAuOTgpIHtcbiAgICAgICAgdGhpcy5zdGF0dXMkLm5leHQoJ0ZldGNoaW5nIGltYWdlIGF0IG1vZGVsIHJlc29sdXRpb27igKYnKTtcbiAgICAgICAgY29uc3QgaGkgPSBhd2FpdCB0aGlzLmZldGNoQ3JvcEF0U2NhbGUocmVjdCwgdGFyZ2V0KTtcbiAgICAgICAgaWYgKGhpKSBzb3VyY2UgPSBoaTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc2VnbWVudGVyLnNlZ21lbnRTZW1hbnRpYyhzb3VyY2UsIG9wdHMsIHtcbiAgICAgICAgb25Qcm9ncmVzczogKGYpID0+IHRoaXMucHJvZ3Jlc3MkLm5leHQoZiksXG4gICAgICAgIG9uU3RhdHVzOiAocykgPT4gdGhpcy5zdGF0dXMkLm5leHQocyksXG4gICAgICB9KTtcblxuICAgICAgLy8gVmlldyBwaXhlbHMgLT4gZnVsbC1yZXNvbHV0aW9uIGltYWdlIHBpeGVscy4gV2l0aG91dCB0aGlzIGV2ZXJ5IHJlZ2lvblxuICAgICAgLy8gd291bGQgc2l0IGF0IHZpZXctbG9jYWwgY29vcmRpbmF0ZXMsIGkuZS4gdGhlIHdyb25nIHBsYWNlIG9uIHRoZSBzbGlkZVxuICAgICAgLy8gZm9yIGFueSB6b29tZWQgb3IgcGFubmVkIHZpZXcuXG4gICAgICBjb25zdCBvZmZzZXRYID0gcmVjdCA/IHJlY3QueCA6IDA7XG4gICAgICBjb25zdCBvZmZzZXRZID0gcmVjdCA/IHJlY3QueSA6IDA7XG4gICAgICAvLyBBZ2FpbnN0IHRoZSBwaXhlbHMgYWN0dWFsbHkgaW5mZXJyZWQgb24sIHdoaWNoIG1heSBiZSB0aGUgcmUtY3JvcC5cbiAgICAgIGNvbnN0IHJhdGlvWCA9IHJlY3QgJiYgc291cmNlLndpZHRoID4gMCA/IHJlY3Qud2lkdGggLyBzb3VyY2Uud2lkdGggOiAxO1xuICAgICAgY29uc3QgcmF0aW9ZID0gcmVjdCAmJiBzb3VyY2UuaGVpZ2h0ID4gMCA/IHJlY3QuaGVpZ2h0IC8gc291cmNlLmhlaWdodCA6IDE7XG5cbiAgICAgIC8vIFZpZXcgcGl4ZWxzIC0+IGltYWdlIHBpeGVscywgZm9yIGFueSByaW5nLlxuICAgICAgY29uc3QgbWFwUmluZyA9IChyaW5nOiBBcnJheTxbbnVtYmVyLCBudW1iZXJdPik6IG51bWJlcltdW10gPT5cbiAgICAgICAgcmluZy5tYXAoKFt4LCB5XSkgPT4gW01hdGgucm91bmQob2Zmc2V0WCArIHggKiByYXRpb1gpLCBNYXRoLnJvdW5kKG9mZnNldFkgKyB5ICogcmF0aW9ZKV0pO1xuXG4gICAgICBjb25zdCBhZGRlZDogUmVnaW9uW10gPSBbXTtcbiAgICAgIGZvciAoY29uc3QgciBvZiByZXN1bHQucmVnaW9ucykge1xuICAgICAgICBpZiAoci5leHRlcmlvci5sZW5ndGggPCAzKSBjb250aW51ZTtcbiAgICAgICAgY29uc3QgZXh0ZXJpb3IgPSBtYXBSaW5nKHIuZXh0ZXJpb3IpO1xuICAgICAgICBhZGRlZC5wdXNoKFxuICAgICAgICAgIHRoaXMubWFrZVJlZ2lvbihcbiAgICAgICAgICAgIGV4dGVyaW9yLm1hcCgoW3hdKSA9PiB4KSxcbiAgICAgICAgICAgIGV4dGVyaW9yLm1hcCgoWywgeV0pID0+IHkpLFxuICAgICAgICAgICAgci5jbGFzc05hbWUsXG4gICAgICAgICAgICAvLyBIb2xlcyBhcmUgcmVhbCBmaW5kaW5ncyBoZXJlLCBub3Qgbm9pc2U6IGEgbGF5ZXIgd2l0aCBhIHZvaWRcbiAgICAgICAgICAgIC8vIHRocm91Z2ggaXQgaXMgYSBkb251dCwgYW5kIGRyb3BwaW5nIHRoZSBpbnRlcmlvciByaW5ncyBmaWxscyBpdFxuICAgICAgICAgICAgLy8gaW4gc2lsZW50bHkuIFJpbmdzIHRoYXQgc3Vydml2ZSBzaW1wbGlmaWNhdGlvbiB0byBmZXdlciB0aGFuIDNcbiAgICAgICAgICAgIC8vIHBvaW50cyBjYW5ub3QgYm91bmQgYW55dGhpbmcsIHNvIHRoZXkgYXJlIHNraXBwZWQgcmF0aGVyIHRoYW5cbiAgICAgICAgICAgIC8vIGVtaXR0ZWQgYXMgZGVnZW5lcmF0ZSBnZW9tZXRyeS5cbiAgICAgICAgICAgIHIuaG9sZXMuZmlsdGVyKChoKSA9PiBoLmxlbmd0aCA+PSAzKS5tYXAobWFwUmluZyksXG4gICAgICAgICAgKSxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGFkZGVkLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAvLyBEaXN0aW5ndWlzaCBcImZvdW5kIG5vdGhpbmdcIiBmcm9tIFwid2FzIHVuc3VyZSBldmVyeXdoZXJlXCIuIFRoZSBzZWNvbmRcbiAgICAgICAgLy8gaXMgdGhlIHNpZ25hdHVyZSBvZiB3cm9uZyBwcmVwcm9jZXNzaW5nIG9yIHRoZSB3cm9uZyBtYWduaWZpY2F0aW9uLFxuICAgICAgICAvLyBhbmQgcmVhZHMgYXMgYSBzaWxlbnQgbm8tb3AgdW5sZXNzIGl0IGlzIHNhaWQgb3V0IGxvdWQuXG4gICAgICAgIHRoaXMuc3RhdHVzJC5uZXh0KFxuICAgICAgICAgIHJlc3VsdC51bmFzc2lnbmVkRnJhY3Rpb24gPiAwLjlcbiAgICAgICAgICAgID8gJ05vIGxheWVycyBmb3VuZCDigJQgdGhlIG1vZGVsIHdhcyB1bnN1cmUgYWNyb3NzIHRoZSB3aG9sZSB2aWV3LiAnICtcbiAgICAgICAgICAgICAgICAnQ2hlY2sgdGhlIG1hZ25pZmljYXRpb24gbWF0Y2hlcyB0aGUgbW9kZWwuJ1xuICAgICAgICAgICAgOiAnTm8gbGF5ZXJzIGZvdW5kLicsXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiAwO1xuICAgICAgfVxuXG4gICAgICAvLyBSZXBsYWNlIHRoaXMgdG9vbCdzIG93biBwcmV2aW91cyBvdXRwdXQsIGtlZXAgZXZlcnl0aGluZyBlbHNlLlxuICAgICAgLy8gSGFuZC1kcmF3biByZWdpb25zIGFuZCBvdGhlciB0b29scycgb3V0cHV0IGNhcnJ5IGEgZGlmZmVyZW50IGBzb3VyY2VgXG4gICAgICAvLyAob3Igbm9uZSkgYW5kIGFyZSB1bnRvdWNoZWQuXG4gICAgICBjb25zdCBrZXB0ID0gKHZpei5nZXRSZWdpb25zKCkgPz8gW10pLmZpbHRlcigoeCkgPT4geC5zb3VyY2UgIT09IFJFVElOQUxfUkVHSU9OX1NPVVJDRSk7XG4gICAgICB2aXouc2V0UmVnaW9ucyhbLi4ua2VwdCwgLi4uYWRkZWRdKTtcbiAgICAgIHRoaXMuc3RhdHVzJC5uZXh0KGBBZGRlZCAke2FkZGVkLmxlbmd0aH0gcmVnaW9uKHMpLmApO1xuICAgICAgcmV0dXJuIGFkZGVkLmxlbmd0aDtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHRoaXMuc3RhdHVzJC5uZXh0KGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiAnUmV0aW5hbCBsYXllciBzZWdtZW50YXRpb24gZmFpbGVkLicpO1xuICAgICAgcmV0dXJuIDA7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuYnVzeSQubmV4dChmYWxzZSk7XG4gICAgICB0aGlzLnByb2dyZXNzJC5uZXh0KC0xKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmUtY3JvcCBgcmVjdGAgYXQgYDEvdGFyZ2V0YCBvZiBmdWxsIHJlc29sdXRpb24uIFJldHVybnMgbnVsbCBvbiBhbnlcbiAgICogZmFpbHVyZSwgc28gdGhlIGNhbGxlciBmYWxscyBiYWNrIHRvIHRoZSBkaXNwbGF5ZWQgcGl4ZWxzIOKAlCBhIGNvYXJzZXIgY3JvcFxuICAgKiBiZWF0cyBhIGZhaWxlZCBydW4uXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGZldGNoQ3JvcEF0U2NhbGUoXG4gICAgcmVjdDogeyB4OiBudW1iZXI7IHk6IG51bWJlcjsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfSxcbiAgICB0YXJnZXQ6IG51bWJlcixcbiAgKTogUHJvbWlzZTx7IGRhdGE6IFVpbnQ4Q2xhbXBlZEFycmF5OyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlciB9IHwgbnVsbD4ge1xuICAgIGlmICghdGhpcy50aWxlQWNjZXNzKSByZXR1cm4gbnVsbDtcbiAgICBsZXQgdyA9IE1hdGgucm91bmQocmVjdC53aWR0aCAvIHRhcmdldCk7XG4gICAgbGV0IGggPSBNYXRoLnJvdW5kKHJlY3QuaGVpZ2h0IC8gdGFyZ2V0KTtcblxuICAgIC8vIEEgZmFjdG9yIG9mIDEgb3ZlciBhIHdob2xlLXNsaWRlIFJPSSB3b3VsZCBhc2sgZm9yIGh1bmRyZWRzIG9mIG1lZ2FwaXhlbHMuXG4gICAgY29uc3QgTUFYX1BJWEVMUyA9IDE2Xzc3N18yMTY7IC8vIDQwOTbCslxuICAgIGNvbnN0IHBpeGVscyA9IHcgKiBoO1xuICAgIGlmIChwaXhlbHMgPiBNQVhfUElYRUxTKSB7XG4gICAgICBjb25zdCBrID0gTWF0aC5zcXJ0KE1BWF9QSVhFTFMgLyBwaXhlbHMpO1xuICAgICAgdyA9IE1hdGgucm91bmQodyAqIGspO1xuICAgICAgaCA9IE1hdGgucm91bmQoaCAqIGspO1xuICAgIH1cbiAgICBpZiAodyA8IDY0IHx8IGggPCA2NCkgcmV0dXJuIG51bGw7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3Qgcm9pID0ge1xuICAgICAgICB4OiBNYXRoLnJvdW5kKHJlY3QueCksXG4gICAgICAgIHk6IE1hdGgucm91bmQocmVjdC55KSxcbiAgICAgICAgd2lkdGg6IE1hdGgucm91bmQocmVjdC53aWR0aCksXG4gICAgICAgIGhlaWdodDogTWF0aC5yb3VuZChyZWN0LmhlaWdodCksXG4gICAgICB9IGFzIFJlY3RhbmdsZTtcbiAgICAgIGNvbnN0IHNjcmVlbiA9IHsgeDogMCwgeTogMCwgd2lkdGg6IHcsIGhlaWdodDogaCB9IGFzIFJlY3RhbmdsZTtcbiAgICAgIGNvbnN0IGJ5dGVzID0gYXdhaXQgZmlyc3RWYWx1ZUZyb20odGhpcy50aWxlQWNjZXNzLnpvb21PblJlZ2lvbihyb2ksIHNjcmVlbiwgMCkpO1xuICAgICAgaWYgKCFieXRlcyB8fCBieXRlcy5ieXRlTGVuZ3RoID09PSAwKSByZXR1cm4gbnVsbDtcblxuICAgICAgY29uc3QgYml0bWFwID0gYXdhaXQgY3JlYXRlSW1hZ2VCaXRtYXAobmV3IEJsb2IoW2J5dGVzXSkpO1xuICAgICAgY29uc3QgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgICBjYW52YXMud2lkdGggPSBiaXRtYXAud2lkdGg7XG4gICAgICBjYW52YXMuaGVpZ2h0ID0gYml0bWFwLmhlaWdodDtcbiAgICAgIGNvbnN0IGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xuICAgICAgaWYgKCFjdHgpIHJldHVybiBudWxsO1xuICAgICAgY3R4LmRyYXdJbWFnZShiaXRtYXAsIDAsIDApO1xuICAgICAgLy8gUmVhZCB0aGUgZGltZW5zaW9ucyBCRUZPUkUgY2xvc2UoKTogY2xvc2luZyBhbiBJbWFnZUJpdG1hcCB6ZXJvZXMgaXRzXG4gICAgICAvLyB3aWR0aC9oZWlnaHQsIHNvIHJldHVybmluZyB0aGVtIGFmdGVyd2FyZHMgeWllbGRzIGEgMHgwIGltYWdlIHdpdGggYVxuICAgICAgLy8gZnVsbCBwaXhlbCBidWZmZXIg4oCUIGluZmVyZW5jZSB0aGVuIHJ1bnMgb24gbm90aGluZyBhbmQgZmluZHMgbm90aGluZy5cbiAgICAgIGNvbnN0IHdpZHRoID0gYml0bWFwLndpZHRoO1xuICAgICAgY29uc3QgaGVpZ2h0ID0gYml0bWFwLmhlaWdodDtcbiAgICAgIGNvbnN0IG91dCA9IGN0eC5nZXRJbWFnZURhdGEoMCwgMCwgd2lkdGgsIGhlaWdodCk7XG4gICAgICBiaXRtYXAuY2xvc2U/LigpO1xuICAgICAgcmV0dXJuIHsgZGF0YTogb3V0LmRhdGEsIHdpZHRoLCBoZWlnaHQgfTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgbWFrZVJlZ2lvbih4czogbnVtYmVyW10sIHlzOiBudW1iZXJbXSwgY2xhc3NOYW1lOiBzdHJpbmcsIGhvbGVzOiBudW1iZXJbXVtdW10gPSBbXSk6IFJlZ2lvbiB7XG4gICAgY29uc3QgcG9seSA9IG5ldyBQb2x5Z29uKCk7XG4gICAgcG9seS5ucG9pbnRzID0geHMubGVuZ3RoO1xuICAgIHBvbHkueHBvaW50cyA9IHhzO1xuICAgIHBvbHkueXBvaW50cyA9IHlzO1xuICAgIHBvbHkuY29vcmRpbmF0ZXMgPSB4cy5tYXAoKHgsIGkpID0+IFt4LCB5c1tpXV0pO1xuICAgIHBvbHkuY2xvc2VkID0gdHJ1ZTtcbiAgICAvLyBTYW1lIGNsb3NlZC1yaW5nIGNvbnZlbnRpb24gYXMgdGhlIGV4dGVyaW9yOiBubyByZXBlYXRlZCBjbG9zaW5nIHBvaW50LlxuICAgIC8vIExlZnQgdW5zZXQgd2hlbiBlbXB0eSBzbyBhIHNvbGlkIHJlZ2lvbiBkb2VzIG5vdCBjYXJyeSBhbiBlbXB0eSBhcnJheVxuICAgIC8vIHRocm91Z2ggZXhwb3J0IGFuZCByb3VuZC10cmlwcGluZy5cbiAgICBpZiAoaG9sZXMubGVuZ3RoKSBwb2x5LmhvbGVzID0gaG9sZXM7XG5cbiAgICBjb25zdCByZWdpb24gPSBuZXcgUmVnaW9uKCk7XG4gICAgcmVnaW9uLmJvdW5kcyA9IHBvbHk7XG4gICAgcmVnaW9uLnNvdXJjZSA9IFJFVElOQUxfUkVHSU9OX1NPVVJDRTtcbiAgICAvLyBUaGUgY2xhc3MgbmFtZSBkcml2ZXMgcHJlc2V0IGNvbG91ciByZXNvbHV0aW9uOyBsZWF2aW5nIGBjb2xvcmAgdW5zZXQgbGV0c1xuICAgIC8vIGFuIGV4aXN0aW5nIHByZXNldCBmb3IgdGhpcyBsYXllciB3aW4uXG4gICAgcmVnaW9uLmxhYmVsID0gY2xhc3NOYW1lO1xuICAgIHJldHVybiByZWdpb247XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Registry of retinal-layer semantic-segmentation models.
|
|
3
|
+
*
|
|
4
|
+
* Mirrors {@link YOLO_MODELS}: public HF-hosted ONNX by default, repointable at
|
|
5
|
+
* private hosting via {@link setRetinalModelUrls}.
|
|
6
|
+
*
|
|
7
|
+
* ONLY ONE CHECKPOINT IS ENABLED, AND THAT IS DELIBERATE
|
|
8
|
+
* The server offers four. Measured against the ground-truth masks shipped
|
|
9
|
+
* alongside them, only VNet reproduces them:
|
|
10
|
+
*
|
|
11
|
+
* | checkpoint | mIoU |
|
|
12
|
+
* |---|---|
|
|
13
|
+
* | **VNet 2D** | **0.9061** |
|
|
14
|
+
* | ResUNet-a 2D (base) | 0.3065 |
|
|
15
|
+
* | ResUNet-a 2D 20x | 0.2869 |
|
|
16
|
+
* | ResUNet-a 2D 40x | 0.2718 |
|
|
17
|
+
*
|
|
18
|
+
* The ResUNet-a numbers are not quantization damage — their ONNX exports match
|
|
19
|
+
* their own Keras originals exactly. They disagree with the *masks*, folding
|
|
20
|
+
* ground-truth class 1 into their class 2 and class 3 into background, and no
|
|
21
|
+
* relabelling rescues them (the best of all 24 class permutations reaches only
|
|
22
|
+
* 0.36). Either those masks belong to a different model generation or the class
|
|
23
|
+
* definitions moved — an open question for whoever trained them.
|
|
24
|
+
*
|
|
25
|
+
* So their weights stay unpublished (their Hub repos are private) and their
|
|
26
|
+
* entries here carry an empty `modelUrl`, which {@link isRetinalModelReady}
|
|
27
|
+
* reports as not-ready. They are listed rather than deleted so a host shows
|
|
28
|
+
* them as unavailable-in-browser instead of pretending the server's choice does
|
|
29
|
+
* not exist — and so enabling one later is a URL, not a code change.
|
|
30
|
+
*
|
|
31
|
+
* Export tooling: the sibling `browser-onnx-tools` project.
|
|
32
|
+
*/
|
|
33
|
+
const HF = 'https://huggingface.co/Ballon999';
|
|
34
|
+
const RESUNET_UNAVAILABLE = 'Not available in the browser: this checkpoint scores mIoU ~0.3 against its own ' +
|
|
35
|
+
'ground-truth masks, pending a review of its class definitions. Run this step on the server.';
|
|
36
|
+
export const RETINAL_MODELS = [
|
|
37
|
+
{
|
|
38
|
+
id: 'vnet-2d-retinal',
|
|
39
|
+
label: 'VNet 2D (40x)',
|
|
40
|
+
modelUrl: `${HF}/vnet-2d-retinal-layer-onnx/resolve/main/model.fp16w.onnx`,
|
|
41
|
+
patchSize: 512,
|
|
42
|
+
// Nearly 6x the YOLO checkpoints. Worth surfacing before a user on a
|
|
43
|
+
// metered connection triggers it by clicking a toolbar button.
|
|
44
|
+
sizeMb: 590,
|
|
45
|
+
miou: 0.9061,
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
id: 'resunet-a-2d-retinal',
|
|
49
|
+
label: 'ResUNet-a 2D (40x)',
|
|
50
|
+
modelUrl: '',
|
|
51
|
+
patchSize: 512,
|
|
52
|
+
sizeMb: 102,
|
|
53
|
+
miou: 0.3065,
|
|
54
|
+
unavailableReason: RESUNET_UNAVAILABLE,
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
id: 'resunet-a-2d-retinal-20x',
|
|
58
|
+
label: 'ResUNet-a 2D (20x)',
|
|
59
|
+
modelUrl: '',
|
|
60
|
+
patchSize: 256,
|
|
61
|
+
sizeMb: 102,
|
|
62
|
+
miou: 0.2869,
|
|
63
|
+
unavailableReason: RESUNET_UNAVAILABLE,
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
id: 'resunet-a-2d-retinal-40x',
|
|
67
|
+
label: 'ResUNet-a 2D (40x, alt)',
|
|
68
|
+
modelUrl: '',
|
|
69
|
+
patchSize: 512,
|
|
70
|
+
sizeMb: 102,
|
|
71
|
+
miou: 0.2718,
|
|
72
|
+
unavailableReason: RESUNET_UNAVAILABLE,
|
|
73
|
+
},
|
|
74
|
+
];
|
|
75
|
+
export const DEFAULT_RETINAL_MODEL_ID = 'vnet-2d-retinal';
|
|
76
|
+
let defaultModelId = DEFAULT_RETINAL_MODEL_ID;
|
|
77
|
+
/** Look up a model definition by id. Returns undefined for an unknown id. */
|
|
78
|
+
export function getRetinalModel(id) {
|
|
79
|
+
return RETINAL_MODELS.find((m) => m.id === id);
|
|
80
|
+
}
|
|
81
|
+
/** Whether a model has usable weights configured. */
|
|
82
|
+
export function isRetinalModelReady(id) {
|
|
83
|
+
const m = getRetinalModel(id);
|
|
84
|
+
return !!m && m.modelUrl.trim().length > 0;
|
|
85
|
+
}
|
|
86
|
+
/** Only the models a browser can actually run. */
|
|
87
|
+
export function readyRetinalModels() {
|
|
88
|
+
return RETINAL_MODELS.filter((m) => m.modelUrl.trim().length > 0);
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Repoint a model at different hosting (a GCS bucket, a same-origin proxy), or
|
|
92
|
+
* enable one of the disabled entries. Call once at app init, before first use.
|
|
93
|
+
* An empty `modelUrl` disables the model.
|
|
94
|
+
*/
|
|
95
|
+
export function setRetinalModelUrls(id, urls) {
|
|
96
|
+
const m = getRetinalModel(id);
|
|
97
|
+
if (!m)
|
|
98
|
+
return;
|
|
99
|
+
if (urls.modelUrl !== undefined)
|
|
100
|
+
m.modelUrl = urls.modelUrl;
|
|
101
|
+
if (urls.metaUrl !== undefined)
|
|
102
|
+
m.metaUrl = urls.metaUrl;
|
|
103
|
+
// A host that supplies weights has answered the question the reason
|
|
104
|
+
// describes. Decided from the model's post-update state rather than from the
|
|
105
|
+
// argument: a whitespace-only url, or a call that sets only `metaUrl`, leaves
|
|
106
|
+
// the model just as disabled — and clearing the reason there would strip the
|
|
107
|
+
// one explanation the user gets while `isRetinalModelReady` still says no.
|
|
108
|
+
if (isRetinalModelReady(id))
|
|
109
|
+
delete m.unavailableReason;
|
|
110
|
+
}
|
|
111
|
+
/** Change which model runs when a caller does not name one. */
|
|
112
|
+
export function setDefaultRetinalModel(id) {
|
|
113
|
+
if (getRetinalModel(id))
|
|
114
|
+
defaultModelId = id;
|
|
115
|
+
}
|
|
116
|
+
export function getDefaultRetinalModelId() {
|
|
117
|
+
return defaultModelId;
|
|
118
|
+
}
|
|
119
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmV0aW5hbC1tb2RlbC1yZWdpc3RyeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvdG9vbGJhci9zZWdtZW50YXRpb24vcmV0aW5hbC1tb2RlbC1yZWdpc3RyeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQStCRztBQXNCSCxNQUFNLEVBQUUsR0FBRyxrQ0FBa0MsQ0FBQztBQUU5QyxNQUFNLG1CQUFtQixHQUN2QixpRkFBaUY7SUFDakYsNkZBQTZGLENBQUM7QUFFaEcsTUFBTSxDQUFDLE1BQU0sY0FBYyxHQUFzQjtJQUMvQztRQUNFLEVBQUUsRUFBRSxpQkFBaUI7UUFDckIsS0FBSyxFQUFFLGVBQWU7UUFDdEIsUUFBUSxFQUFFLEdBQUcsRUFBRSwyREFBMkQ7UUFDMUUsU0FBUyxFQUFFLEdBQUc7UUFDZCxxRUFBcUU7UUFDckUsK0RBQStEO1FBQy9ELE1BQU0sRUFBRSxHQUFHO1FBQ1gsSUFBSSxFQUFFLE1BQU07S0FDYjtJQUNEO1FBQ0UsRUFBRSxFQUFFLHNCQUFzQjtRQUMxQixLQUFLLEVBQUUsb0JBQW9CO1FBQzNCLFFBQVEsRUFBRSxFQUFFO1FBQ1osU0FBUyxFQUFFLEdBQUc7UUFDZCxNQUFNLEVBQUUsR0FBRztRQUNYLElBQUksRUFBRSxNQUFNO1FBQ1osaUJBQWlCLEVBQUUsbUJBQW1CO0tBQ3ZDO0lBQ0Q7UUFDRSxFQUFFLEVBQUUsMEJBQTBCO1FBQzlCLEtBQUssRUFBRSxvQkFBb0I7UUFDM0IsUUFBUSxFQUFFLEVBQUU7UUFDWixTQUFTLEVBQUUsR0FBRztRQUNkLE1BQU0sRUFBRSxHQUFHO1FBQ1gsSUFBSSxFQUFFLE1BQU07UUFDWixpQkFBaUIsRUFBRSxtQkFBbUI7S0FDdkM7SUFDRDtRQUNFLEVBQUUsRUFBRSwwQkFBMEI7UUFDOUIsS0FBSyxFQUFFLHlCQUF5QjtRQUNoQyxRQUFRLEVBQUUsRUFBRTtRQUNaLFNBQVMsRUFBRSxHQUFHO1FBQ2QsTUFBTSxFQUFFLEdBQUc7UUFDWCxJQUFJLEVBQUUsTUFBTTtRQUNaLGlCQUFpQixFQUFFLG1CQUFtQjtLQUN2QztDQUNGLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSx3QkFBd0IsR0FBRyxpQkFBaUIsQ0FBQztBQUUxRCxJQUFJLGNBQWMsR0FBRyx3QkFBd0IsQ0FBQztBQUU5Qyw2RUFBNkU7QUFDN0UsTUFBTSxVQUFVLGVBQWUsQ0FBQyxFQUFVO0lBQ3hDLE9BQU8sY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztBQUNqRCxDQUFDO0FBRUQscURBQXFEO0FBQ3JELE1BQU0sVUFBVSxtQkFBbUIsQ0FBQyxFQUFVO0lBQzVDLE1BQU0sQ0FBQyxHQUFHLGVBQWUsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUM5QixPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0FBQzdDLENBQUM7QUFFRCxrREFBa0Q7QUFDbEQsTUFBTSxVQUFVLGtCQUFrQjtJQUNoQyxPQUFPLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ3BFLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLG1CQUFtQixDQUFDLEVBQVUsRUFBRSxJQUE2QztJQUMzRixNQUFNLENBQUMsR0FBRyxlQUFlLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDOUIsSUFBSSxDQUFDLENBQUM7UUFBRSxPQUFPO0lBQ2YsSUFBSSxJQUFJLENBQUMsUUFBUSxLQUFLLFNBQVM7UUFBRSxDQUFDLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDNUQsSUFBSSxJQUFJLENBQUMsT0FBTyxLQUFLLFNBQVM7UUFBRSxDQUFDLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUM7SUFDekQsb0VBQW9FO0lBQ3BFLDZFQUE2RTtJQUM3RSw4RUFBOEU7SUFDOUUsNkVBQTZFO0lBQzdFLDJFQUEyRTtJQUMzRSxJQUFJLG1CQUFtQixDQUFDLEVBQUUsQ0FBQztRQUFFLE9BQU8sQ0FBQyxDQUFDLGlCQUFpQixDQUFDO0FBQzFELENBQUM7QUFFRCwrREFBK0Q7QUFDL0QsTUFBTSxVQUFVLHNCQUFzQixDQUFDLEVBQVU7SUFDL0MsSUFBSSxlQUFlLENBQUMsRUFBRSxDQUFDO1FBQUUsY0FBYyxHQUFHLEVBQUUsQ0FBQztBQUMvQyxDQUFDO0FBRUQsTUFBTSxVQUFVLHdCQUF3QjtJQUN0QyxPQUFPLGNBQWMsQ0FBQztBQUN4QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBSZWdpc3RyeSBvZiByZXRpbmFsLWxheWVyIHNlbWFudGljLXNlZ21lbnRhdGlvbiBtb2RlbHMuXG4gKlxuICogTWlycm9ycyB7QGxpbmsgWU9MT19NT0RFTFN9OiBwdWJsaWMgSEYtaG9zdGVkIE9OTlggYnkgZGVmYXVsdCwgcmVwb2ludGFibGUgYXRcbiAqIHByaXZhdGUgaG9zdGluZyB2aWEge0BsaW5rIHNldFJldGluYWxNb2RlbFVybHN9LlxuICpcbiAqIE9OTFkgT05FIENIRUNLUE9JTlQgSVMgRU5BQkxFRCwgQU5EIFRIQVQgSVMgREVMSUJFUkFURVxuICogVGhlIHNlcnZlciBvZmZlcnMgZm91ci4gTWVhc3VyZWQgYWdhaW5zdCB0aGUgZ3JvdW5kLXRydXRoIG1hc2tzIHNoaXBwZWRcbiAqIGFsb25nc2lkZSB0aGVtLCBvbmx5IFZOZXQgcmVwcm9kdWNlcyB0aGVtOlxuICpcbiAqIHwgY2hlY2twb2ludCB8IG1Jb1UgfFxuICogfC0tLXwtLS18XG4gKiB8ICoqVk5ldCAyRCoqIHwgKiowLjkwNjEqKiB8XG4gKiB8IFJlc1VOZXQtYSAyRCAoYmFzZSkgfCAwLjMwNjUgfFxuICogfCBSZXNVTmV0LWEgMkQgMjB4IHwgMC4yODY5IHxcbiAqIHwgUmVzVU5ldC1hIDJEIDQweCB8IDAuMjcxOCB8XG4gKlxuICogVGhlIFJlc1VOZXQtYSBudW1iZXJzIGFyZSBub3QgcXVhbnRpemF0aW9uIGRhbWFnZSDigJQgdGhlaXIgT05OWCBleHBvcnRzIG1hdGNoXG4gKiB0aGVpciBvd24gS2VyYXMgb3JpZ2luYWxzIGV4YWN0bHkuIFRoZXkgZGlzYWdyZWUgd2l0aCB0aGUgKm1hc2tzKiwgZm9sZGluZ1xuICogZ3JvdW5kLXRydXRoIGNsYXNzIDEgaW50byB0aGVpciBjbGFzcyAyIGFuZCBjbGFzcyAzIGludG8gYmFja2dyb3VuZCwgYW5kIG5vXG4gKiByZWxhYmVsbGluZyByZXNjdWVzIHRoZW0gKHRoZSBiZXN0IG9mIGFsbCAyNCBjbGFzcyBwZXJtdXRhdGlvbnMgcmVhY2hlcyBvbmx5XG4gKiAwLjM2KS4gRWl0aGVyIHRob3NlIG1hc2tzIGJlbG9uZyB0byBhIGRpZmZlcmVudCBtb2RlbCBnZW5lcmF0aW9uIG9yIHRoZSBjbGFzc1xuICogZGVmaW5pdGlvbnMgbW92ZWQg4oCUIGFuIG9wZW4gcXVlc3Rpb24gZm9yIHdob2V2ZXIgdHJhaW5lZCB0aGVtLlxuICpcbiAqIFNvIHRoZWlyIHdlaWdodHMgc3RheSB1bnB1Ymxpc2hlZCAodGhlaXIgSHViIHJlcG9zIGFyZSBwcml2YXRlKSBhbmQgdGhlaXJcbiAqIGVudHJpZXMgaGVyZSBjYXJyeSBhbiBlbXB0eSBgbW9kZWxVcmxgLCB3aGljaCB7QGxpbmsgaXNSZXRpbmFsTW9kZWxSZWFkeX1cbiAqIHJlcG9ydHMgYXMgbm90LXJlYWR5LiBUaGV5IGFyZSBsaXN0ZWQgcmF0aGVyIHRoYW4gZGVsZXRlZCBzbyBhIGhvc3Qgc2hvd3NcbiAqIHRoZW0gYXMgdW5hdmFpbGFibGUtaW4tYnJvd3NlciBpbnN0ZWFkIG9mIHByZXRlbmRpbmcgdGhlIHNlcnZlcidzIGNob2ljZSBkb2VzXG4gKiBub3QgZXhpc3Qg4oCUIGFuZCBzbyBlbmFibGluZyBvbmUgbGF0ZXIgaXMgYSBVUkwsIG5vdCBhIGNvZGUgY2hhbmdlLlxuICpcbiAqIEV4cG9ydCB0b29saW5nOiB0aGUgc2libGluZyBgYnJvd3Nlci1vbm54LXRvb2xzYCBwcm9qZWN0LlxuICovXG5cbmV4cG9ydCBpbnRlcmZhY2UgUmV0aW5hbE1vZGVsRGVmIHtcbiAgaWQ6IHN0cmluZztcbiAgbGFiZWw6IHN0cmluZztcbiAgLyoqIFVSTCBvZiB0aGUgYC5vbm54YCB3ZWlnaHRzLiAqKkVtcHR5IGRpc2FibGVzIHRoZSBtb2RlbC4qKiAqL1xuICBtb2RlbFVybDogc3RyaW5nO1xuICAvKipcbiAgICogVVJMIG9mIHRoZSBgbW9kZWwuanNvbmAgc2lkZWNhci4gT21pdCB0byB1c2UgYG1vZGVsLmpzb25gIGFsb25nc2lkZSB0aGVcbiAgICogd2VpZ2h0cywgd2hpY2ggaXMgaG93IGV2ZXJ5IHB1Ymxpc2hlZCByZXBvIGlzIGxhaWQgb3V0LlxuICAgKi9cbiAgbWV0YVVybD86IHN0cmluZztcbiAgLyoqIFBhdGNoIHNpemUgdGhlIGNoZWNrcG9pbnQgd2FzIHRyYWluZWQgYXQsIGZvciBjYWxsZXJzIHRoYXQgc2l6ZSByZWFkcyB0byBpdC4gKi9cbiAgcGF0Y2hTaXplOiBudW1iZXI7XG4gIC8qKiBEb3dubG9hZCBzaXplIG9mIHRoZSBgZnAxNndgIHdlaWdodHMsIE1CIOKAlCB0aGVzZSBhcmUgbGFyZ2UgZW5vdWdoIHRvIHdhcm4gYWJvdXQuICovXG4gIHNpemVNYjogbnVtYmVyO1xuICAvKiogTWVhc3VyZWQgbUlvVSBhZ2FpbnN0IHRoZSBidWNrZXQncyBncm91bmQtdHJ1dGggbWFza3MuICovXG4gIG1pb3U6IG51bWJlcjtcbiAgLyoqIFNldCB3aGVuIHRoZSBtb2RlbCBpcyBrbm93aW5nbHkgZGlzYWJsZWQ7IHNob3duIHRvIHRoZSB1c2VyLiAqL1xuICB1bmF2YWlsYWJsZVJlYXNvbj86IHN0cmluZztcbn1cblxuY29uc3QgSEYgPSAnaHR0cHM6Ly9odWdnaW5nZmFjZS5jby9CYWxsb245OTknO1xuXG5jb25zdCBSRVNVTkVUX1VOQVZBSUxBQkxFID1cbiAgJ05vdCBhdmFpbGFibGUgaW4gdGhlIGJyb3dzZXI6IHRoaXMgY2hlY2twb2ludCBzY29yZXMgbUlvVSB+MC4zIGFnYWluc3QgaXRzIG93biAnICtcbiAgJ2dyb3VuZC10cnV0aCBtYXNrcywgcGVuZGluZyBhIHJldmlldyBvZiBpdHMgY2xhc3MgZGVmaW5pdGlvbnMuIFJ1biB0aGlzIHN0ZXAgb24gdGhlIHNlcnZlci4nO1xuXG5leHBvcnQgY29uc3QgUkVUSU5BTF9NT0RFTFM6IFJldGluYWxNb2RlbERlZltdID0gW1xuICB7XG4gICAgaWQ6ICd2bmV0LTJkLXJldGluYWwnLFxuICAgIGxhYmVsOiAnVk5ldCAyRCAoNDB4KScsXG4gICAgbW9kZWxVcmw6IGAke0hGfS92bmV0LTJkLXJldGluYWwtbGF5ZXItb25ueC9yZXNvbHZlL21haW4vbW9kZWwuZnAxNncub25ueGAsXG4gICAgcGF0Y2hTaXplOiA1MTIsXG4gICAgLy8gTmVhcmx5IDZ4IHRoZSBZT0xPIGNoZWNrcG9pbnRzLiBXb3J0aCBzdXJmYWNpbmcgYmVmb3JlIGEgdXNlciBvbiBhXG4gICAgLy8gbWV0ZXJlZCBjb25uZWN0aW9uIHRyaWdnZXJzIGl0IGJ5IGNsaWNraW5nIGEgdG9vbGJhciBidXR0b24uXG4gICAgc2l6ZU1iOiA1OTAsXG4gICAgbWlvdTogMC45MDYxLFxuICB9LFxuICB7XG4gICAgaWQ6ICdyZXN1bmV0LWEtMmQtcmV0aW5hbCcsXG4gICAgbGFiZWw6ICdSZXNVTmV0LWEgMkQgKDQweCknLFxuICAgIG1vZGVsVXJsOiAnJyxcbiAgICBwYXRjaFNpemU6IDUxMixcbiAgICBzaXplTWI6IDEwMixcbiAgICBtaW91OiAwLjMwNjUsXG4gICAgdW5hdmFpbGFibGVSZWFzb246IFJFU1VORVRfVU5BVkFJTEFCTEUsXG4gIH0sXG4gIHtcbiAgICBpZDogJ3Jlc3VuZXQtYS0yZC1yZXRpbmFsLTIweCcsXG4gICAgbGFiZWw6ICdSZXNVTmV0LWEgMkQgKDIweCknLFxuICAgIG1vZGVsVXJsOiAnJyxcbiAgICBwYXRjaFNpemU6IDI1NixcbiAgICBzaXplTWI6IDEwMixcbiAgICBtaW91OiAwLjI4NjksXG4gICAgdW5hdmFpbGFibGVSZWFzb246IFJFU1VORVRfVU5BVkFJTEFCTEUsXG4gIH0sXG4gIHtcbiAgICBpZDogJ3Jlc3VuZXQtYS0yZC1yZXRpbmFsLTQweCcsXG4gICAgbGFiZWw6ICdSZXNVTmV0LWEgMkQgKDQweCwgYWx0KScsXG4gICAgbW9kZWxVcmw6ICcnLFxuICAgIHBhdGNoU2l6ZTogNTEyLFxuICAgIHNpemVNYjogMTAyLFxuICAgIG1pb3U6IDAuMjcxOCxcbiAgICB1bmF2YWlsYWJsZVJlYXNvbjogUkVTVU5FVF9VTkFWQUlMQUJMRSxcbiAgfSxcbl07XG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX1JFVElOQUxfTU9ERUxfSUQgPSAndm5ldC0yZC1yZXRpbmFsJztcblxubGV0IGRlZmF1bHRNb2RlbElkID0gREVGQVVMVF9SRVRJTkFMX01PREVMX0lEO1xuXG4vKiogTG9vayB1cCBhIG1vZGVsIGRlZmluaXRpb24gYnkgaWQuIFJldHVybnMgdW5kZWZpbmVkIGZvciBhbiB1bmtub3duIGlkLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFJldGluYWxNb2RlbChpZDogc3RyaW5nKTogUmV0aW5hbE1vZGVsRGVmIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIFJFVElOQUxfTU9ERUxTLmZpbmQoKG0pID0+IG0uaWQgPT09IGlkKTtcbn1cblxuLyoqIFdoZXRoZXIgYSBtb2RlbCBoYXMgdXNhYmxlIHdlaWdodHMgY29uZmlndXJlZC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1JldGluYWxNb2RlbFJlYWR5KGlkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgbSA9IGdldFJldGluYWxNb2RlbChpZCk7XG4gIHJldHVybiAhIW0gJiYgbS5tb2RlbFVybC50cmltKCkubGVuZ3RoID4gMDtcbn1cblxuLyoqIE9ubHkgdGhlIG1vZGVscyBhIGJyb3dzZXIgY2FuIGFjdHVhbGx5IHJ1bi4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWFkeVJldGluYWxNb2RlbHMoKTogUmV0aW5hbE1vZGVsRGVmW10ge1xuICByZXR1cm4gUkVUSU5BTF9NT0RFTFMuZmlsdGVyKChtKSA9PiBtLm1vZGVsVXJsLnRyaW0oKS5sZW5ndGggPiAwKTtcbn1cblxuLyoqXG4gKiBSZXBvaW50IGEgbW9kZWwgYXQgZGlmZmVyZW50IGhvc3RpbmcgKGEgR0NTIGJ1Y2tldCwgYSBzYW1lLW9yaWdpbiBwcm94eSksIG9yXG4gKiBlbmFibGUgb25lIG9mIHRoZSBkaXNhYmxlZCBlbnRyaWVzLiBDYWxsIG9uY2UgYXQgYXBwIGluaXQsIGJlZm9yZSBmaXJzdCB1c2UuXG4gKiBBbiBlbXB0eSBgbW9kZWxVcmxgIGRpc2FibGVzIHRoZSBtb2RlbC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldFJldGluYWxNb2RlbFVybHMoaWQ6IHN0cmluZywgdXJsczogeyBtb2RlbFVybD86IHN0cmluZzsgbWV0YVVybD86IHN0cmluZyB9KTogdm9pZCB7XG4gIGNvbnN0IG0gPSBnZXRSZXRpbmFsTW9kZWwoaWQpO1xuICBpZiAoIW0pIHJldHVybjtcbiAgaWYgKHVybHMubW9kZWxVcmwgIT09IHVuZGVmaW5lZCkgbS5tb2RlbFVybCA9IHVybHMubW9kZWxVcmw7XG4gIGlmICh1cmxzLm1ldGFVcmwgIT09IHVuZGVmaW5lZCkgbS5tZXRhVXJsID0gdXJscy5tZXRhVXJsO1xuICAvLyBBIGhvc3QgdGhhdCBzdXBwbGllcyB3ZWlnaHRzIGhhcyBhbnN3ZXJlZCB0aGUgcXVlc3Rpb24gdGhlIHJlYXNvblxuICAvLyBkZXNjcmliZXMuIERlY2lkZWQgZnJvbSB0aGUgbW9kZWwncyBwb3N0LXVwZGF0ZSBzdGF0ZSByYXRoZXIgdGhhbiBmcm9tIHRoZVxuICAvLyBhcmd1bWVudDogYSB3aGl0ZXNwYWNlLW9ubHkgdXJsLCBvciBhIGNhbGwgdGhhdCBzZXRzIG9ubHkgYG1ldGFVcmxgLCBsZWF2ZXNcbiAgLy8gdGhlIG1vZGVsIGp1c3QgYXMgZGlzYWJsZWQg4oCUIGFuZCBjbGVhcmluZyB0aGUgcmVhc29uIHRoZXJlIHdvdWxkIHN0cmlwIHRoZVxuICAvLyBvbmUgZXhwbGFuYXRpb24gdGhlIHVzZXIgZ2V0cyB3aGlsZSBgaXNSZXRpbmFsTW9kZWxSZWFkeWAgc3RpbGwgc2F5cyBuby5cbiAgaWYgKGlzUmV0aW5hbE1vZGVsUmVhZHkoaWQpKSBkZWxldGUgbS51bmF2YWlsYWJsZVJlYXNvbjtcbn1cblxuLyoqIENoYW5nZSB3aGljaCBtb2RlbCBydW5zIHdoZW4gYSBjYWxsZXIgZG9lcyBub3QgbmFtZSBvbmUuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0RGVmYXVsdFJldGluYWxNb2RlbChpZDogc3RyaW5nKTogdm9pZCB7XG4gIGlmIChnZXRSZXRpbmFsTW9kZWwoaWQpKSBkZWZhdWx0TW9kZWxJZCA9IGlkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGVmYXVsdFJldGluYWxNb2RlbElkKCk6IHN0cmluZyB7XG4gIHJldHVybiBkZWZhdWx0TW9kZWxJZDtcbn1cbiJdfQ==
|