UNPKG

ng-cornerstone

Version:

[![code style: prettier](https://img.shields.io/badge/code_style-prettier-ff69b4.svg?style=flat-square)](https://github.com/prettier/prettier) [![Commitizen friendly](https://img.shields.io/badge/commitizen-friendly-brightgreen.svg)](http://commitizen.git

215 lines 28.6 kB
import { AngleTool, ArrowAnnotateTool, EllipticalROITool, LengthTool, PanTool, RectangleROITool, StackScrollTool, TrackballRotateTool, WindowLevelTool, ZoomTool, } from '@cornerstonejs/tools'; import { Enums, getRenderingEngine } from '@cornerstonejs/core'; import { ToolEnum } from './tool.types'; function reset(renderingEngineId, viewportId) { // Get the rendering engine const renderingEngine = getRenderingEngine(renderingEngineId); // Get the volume viewport const viewport = renderingEngine?.getViewport(viewportId); // Resets the viewport's camera viewport.resetCamera(); viewport.render(); } function flipV(renderingEngineId, viewportId) { // Get the rendering engine const renderingEngine = getRenderingEngine(renderingEngineId); // Get the stack viewport const viewport = renderingEngine?.getViewport(viewportId); const { flipVertical } = viewport.getCamera(); viewport.setCamera({ flipVertical: !flipVertical }); viewport.render(); } function flipH(renderingEngineId, viewportId) { // Get the rendering engine const renderingEngine = getRenderingEngine(renderingEngineId); // Get the stack viewport const viewport = renderingEngine?.getViewport(viewportId); const { flipHorizontal } = viewport.getCamera(); viewport.setCamera({ flipHorizontal: !flipHorizontal }); viewport.render(); } function rotate(renderingEngineId, viewportId) { // Get the rendering engine const renderingEngine = getRenderingEngine(renderingEngineId); // Get the stack viewport const viewport = renderingEngine?.getViewport(viewportId); const { rotation = 0 } = viewport.getViewPresentation(); viewport.setViewPresentation({ rotation: rotation + 15 }); viewport.render(); } function next(renderingEngineId, viewportId) { // Get the rendering engine const renderingEngine = getRenderingEngine(renderingEngineId); // Get the stack viewport const viewport = renderingEngine?.getViewport(viewportId); // Get the current index of the image displayed const currentImageIdIndex = viewport.getCurrentImageIdIndex(); // Increment the index, clamping to the last image if necessary const numImages = viewport.getImageIds().length; let newImageIdIndex = currentImageIdIndex + 1; newImageIdIndex = Math.min(newImageIdIndex, numImages - 1); // Set the new image index, the viewport itself does a re-render viewport.setImageIdIndex(newImageIdIndex); } function previous(renderingEngineId, viewportId) { // Get the rendering engine const renderingEngine = getRenderingEngine(renderingEngineId); // Get the stack viewport const viewport = renderingEngine?.getViewport(viewportId); // Get the current index of the image displayed const currentImageIdIndex = viewport.getCurrentImageIdIndex(); // Increment the index, clamping to the first image if necessary let newImageIdIndex = currentImageIdIndex - 1; newImageIdIndex = Math.max(newImageIdIndex, 0); // Set the new image index, the viewport itself does a re-render viewport.setImageIdIndex(newImageIdIndex); } function changeOrientation(renderingEngineId, viewportId, options) { const renderingEngine = getRenderingEngine(renderingEngineId); const viewport = renderingEngine.getViewport(viewportId); const { orientation } = options; // Set the new orientation viewport.setOrientation(orientation); // Reset the camera after the normal changes viewport.resetCamera(); viewport.render(); } export const TOOL_CONFIG_MAP = { [ToolEnum.Reset]: { icon: 'dmv-recover', label: 'Reset', name: 'reset', callback: reset, types: [Enums.ViewportType.STACK, Enums.ViewportType.ORTHOGRAPHIC, Enums.ViewportType.VOLUME_3D], }, [ToolEnum.FlipV]: { icon: 'dmv-fliph', label: 'Flip-H', name: 'fliph', callback: flipH, types: [Enums.ViewportType.STACK, Enums.ViewportType.ORTHOGRAPHIC], }, [ToolEnum.FlipH]: { icon: 'dmv-flipv', label: 'Flip-V', name: 'flipV', callback: flipV, types: [Enums.ViewportType.STACK, Enums.ViewportType.ORTHOGRAPHIC], }, [ToolEnum.Rotate]: { icon: 'dmv-rotate', label: 'Rotate', name: 'rotate', callback: rotate, types: [Enums.ViewportType.STACK, Enums.ViewportType.ORTHOGRAPHIC, Enums.ViewportType.VOLUME_3D], }, [ToolEnum.Sagittal]: { icon: 'dmv-sagittal', label: 'Sagittal', name: 'sagittal', callback: changeOrientation, options: { orientation: Enums.OrientationAxis.SAGITTAL }, types: [Enums.ViewportType.ORTHOGRAPHIC], }, [ToolEnum.Coronal]: { icon: 'dmv-coronal', label: 'Coronal', name: 'coronal', callback: changeOrientation, options: { orientation: Enums.OrientationAxis.CORONAL }, types: [Enums.ViewportType.ORTHOGRAPHIC], }, [ToolEnum.Axial]: { icon: 'dmv-axial', label: 'Axial', name: 'axial', callback: changeOrientation, options: { orientation: Enums.OrientationAxis.AXIAL }, types: [Enums.ViewportType.ORTHOGRAPHIC], }, [ToolEnum.Next]: { icon: 'dmv-right', label: 'Next', name: 'next', callback: next, types: [Enums.ViewportType.STACK], }, [ToolEnum.Previous]: { icon: 'dmv-left', label: 'Previous', name: 'previous', callback: previous, types: [Enums.ViewportType.STACK], }, [ToolEnum.ArrowAnnotateTool]: { icon: 'dmv-annotation', label: 'Arrow', tool: ArrowAnnotateTool, name: ArrowAnnotateTool.toolName, types: [Enums.ViewportType.STACK, Enums.ViewportType.ORTHOGRAPHIC], }, [ToolEnum.AngleTool]: { icon: 'dmv-angle', label: 'Angle', tool: AngleTool, name: AngleTool.toolName, types: [Enums.ViewportType.STACK, Enums.ViewportType.ORTHOGRAPHIC], }, [ToolEnum.LengthTool]: { icon: 'dmv-ruler', label: 'Ruler', tool: LengthTool, name: LengthTool.toolName, types: [Enums.ViewportType.STACK, Enums.ViewportType.ORTHOGRAPHIC], }, [ToolEnum.RectangleROITool]: { icon: 'dmv-rectangle', label: 'Rectangle', tool: RectangleROITool, name: RectangleROITool.toolName, types: [Enums.ViewportType.STACK, Enums.ViewportType.ORTHOGRAPHIC], }, [ToolEnum.EllipticalROITool]: { icon: 'dmv-ellipse', label: 'Ellipse', tool: EllipticalROITool, name: EllipticalROITool.toolName, types: [Enums.ViewportType.STACK, Enums.ViewportType.ORTHOGRAPHIC], }, [ToolEnum.TrackballRotateTool]: { icon: 'dmv-rotate', label: 'Trackball', tool: TrackballRotateTool, name: TrackballRotateTool.toolName, types: [Enums.ViewportType.STACK, Enums.ViewportType.ORTHOGRAPHIC, Enums.ViewportType.VOLUME_3D], }, [ToolEnum.ZoomTool]: { icon: 'dmv-zoom', label: 'Zoom', tool: ZoomTool, name: ZoomTool.toolName, types: [Enums.ViewportType.STACK, Enums.ViewportType.ORTHOGRAPHIC, Enums.ViewportType.VOLUME_3D], }, [ToolEnum.PanTool]: { icon: 'dmv-pan', label: 'Pan', tool: PanTool, name: PanTool.toolName, types: [Enums.ViewportType.STACK, Enums.ViewportType.ORTHOGRAPHIC, Enums.ViewportType.VOLUME_3D], }, [ToolEnum.WindowLevelTool]: { icon: 'dmv-window-level', label: 'WL', tool: WindowLevelTool, name: WindowLevelTool.toolName, types: [Enums.ViewportType.STACK, Enums.ViewportType.ORTHOGRAPHIC, Enums.ViewportType.VOLUME_3D], }, [ToolEnum.StackScrollTool]: { icon: 'dmv-layer', label: 'Scroll', tool: StackScrollTool, name: StackScrollTool.toolName, types: [Enums.ViewportType.STACK, Enums.ViewportType.ORTHOGRAPHIC], }, }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9vbC5jb25maWcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1jb3JuZXJzdG9uZS9zcmMvbGliL3Rvb2wvdG9vbC5jb25maWcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxpQkFBaUIsRUFDakIsaUJBQWlCLEVBQ2pCLFVBQVUsRUFDVixPQUFPLEVBQ1AsZ0JBQWdCLEVBQ2hCLGVBQWUsRUFDZixtQkFBbUIsRUFDbkIsZUFBZSxFQUNmLFFBQVEsR0FDVCxNQUFNLHNCQUFzQixDQUFDO0FBQzlCLE9BQU8sRUFBRSxLQUFLLEVBQUUsa0JBQWtCLEVBQVMsTUFBTSxxQkFBcUIsQ0FBQztBQUN2RSxPQUFPLEVBQWMsUUFBUSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBRXBELFNBQVMsS0FBSyxDQUFDLGlCQUF5QixFQUFFLFVBQWtCO0lBQzFELDJCQUEyQjtJQUMzQixNQUFNLGVBQWUsR0FBRyxrQkFBa0IsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0lBQzlELDBCQUEwQjtJQUMxQixNQUFNLFFBQVEsR0FBMEIsZUFBZSxFQUFFLFdBQVcsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUNqRiwrQkFBK0I7SUFDL0IsUUFBUSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ3ZCLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQztBQUNwQixDQUFDO0FBRUQsU0FBUyxLQUFLLENBQUMsaUJBQXlCLEVBQUUsVUFBa0I7SUFDMUQsMkJBQTJCO0lBQzNCLE1BQU0sZUFBZSxHQUFHLGtCQUFrQixDQUFDLGlCQUFpQixDQUFDLENBQUM7SUFDOUQseUJBQXlCO0lBQ3pCLE1BQU0sUUFBUSxHQUF5QixlQUFlLEVBQUUsV0FBVyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ2hGLE1BQU0sRUFBRSxZQUFZLEVBQUUsR0FBRyxRQUFRLENBQUMsU0FBUyxFQUFFLENBQUM7SUFDOUMsUUFBUSxDQUFDLFNB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b250ZW50IjpbImltcG9ydCB7XG4gIEFuZ2xlVG9vbCxcbiAgQXJyb3dBbm5vdGF0ZVRvb2wsXG4gIEVsbGlwdGljYWxST0lUb29sLFxuICBMZW5ndGhUb29sLFxuICBQYW5Ub29sLFxuICBSZWN0YW5nbGVST0lUb29sLFxuICBTdGFja1Njcm9sbFRvb2wsXG4gIFRyYWNrYmFsbFJvdGF0ZVRvb2wsXG4gIFdpbmRvd0xldmVsVG9vbCxcbiAgWm9vbVRvb2wsXG59IGZyb20gJ0Bjb3JuZXJzdG9uZWpzL3Rvb2xzJztcbmltcG9ydCB7IEVudW1zLCBnZXRSZW5kZXJpbmdFbmdpbmUsIFR5cGVzIH0gZnJvbSAnQGNvcm5lcnN0b25lanMvY29yZSc7XG5pbXBvcnQgeyBUb29sQ29uZmlnLCBUb29sRW51bSB9IGZyb20gJy4vdG9vbC50eXBlcyc7XG5cbmZ1bmN0aW9uIHJlc2V0KHJlbmRlcmluZ0VuZ2luZUlkOiBzdHJpbmcsIHZpZXdwb3J0SWQ6IHN0cmluZyk6IHZvaWQge1xuICAvLyBHZXQgdGhlIHJlbmRlcmluZyBlbmdpbmVcbiAgY29uc3QgcmVuZGVyaW5nRW5naW5lID0gZ2V0UmVuZGVyaW5nRW5naW5lKHJlbmRlcmluZ0VuZ2luZUlkKTtcbiAgLy8gR2V0IHRoZSB2b2x1bWUgdmlld3BvcnRcbiAgY29uc3Qgdmlld3BvcnQgPSA8VHlwZXMuSVZvbHVtZVZpZXdwb3J0PnJlbmRlcmluZ0VuZ2luZT8uZ2V0Vmlld3BvcnQodmlld3BvcnRJZCk7XG4gIC8vIFJlc2V0cyB0aGUgdmlld3BvcnQncyBjYW1lcmFcbiAgdmlld3BvcnQucmVzZXRDYW1lcmEoKTtcbiAgdmlld3BvcnQucmVuZGVyKCk7XG59XG5cbmZ1bmN0aW9uIGZsaXBWKHJlbmRlcmluZ0VuZ2luZUlkOiBzdHJpbmcsIHZpZXdwb3J0SWQ6IHN0cmluZyk6IHZvaWQge1xuICAvLyBHZXQgdGhlIHJlbmRlcmluZyBlbmdpbmVcbiAgY29uc3QgcmVuZGVyaW5nRW5naW5lID0gZ2V0UmVuZGVyaW5nRW5naW5lKHJlbmRlcmluZ0VuZ2luZUlkKTtcbiAgLy8gR2V0IHRoZSBzdGFjayB2aWV3cG9ydFxuICBjb25zdCB2aWV3cG9ydCA9IDxUeXBlcy5JU3RhY2tWaWV3cG9ydD5yZW5kZXJpbmdFbmdpbmU/LmdldFZpZXdwb3J0KHZpZXdwb3J0SWQpO1xuICBjb25zdCB7IGZsaXBWZXJ0aWNhbCB9ID0gdmlld3BvcnQuZ2V0Q2FtZXJhKCk7XG4gIHZpZXdwb3J0LnNldENhbWVyYSh7IGZsaXBWZXJ0aWNhbDogIWZsaXBWZXJ0aWNhbCB9KTtcbiAgdmlld3BvcnQucmVuZGVyKCk7XG59XG5cbmZ1bmN0aW9uIGZsaXBIKHJlbmRlcmluZ0VuZ2luZUlkOiBzdHJpbmcsIHZpZXdwb3J0SWQ6IHN0cmluZyk6IHZvaWQge1xuICAvLyBHZXQgdGhlIHJlbmRlcmluZyBlbmdpbmVcbiAgY29uc3QgcmVuZGVyaW5nRW5naW5lID0gZ2V0UmVuZGVyaW5nRW5naW5lKHJlbmRlcmluZ0VuZ2luZUlkKTtcbiAgLy8gR2V0IHRoZSBzdGFjayB2aWV3cG9ydFxuICBjb25zdCB2aWV3cG9ydCA9IDxUeXBlcy5JU3RhY2tWaWV3cG9ydD5yZW5kZXJpbmdFbmdpbmU/LmdldFZpZXdwb3J0KHZpZXdwb3J0SWQpO1xuICBjb25zdCB7IGZsaXBIb3Jpem9udGFsIH0gPSB2aWV3cG9ydC5nZXRDYW1lcmEoKTtcbiAgdmlld3BvcnQuc2V0Q2FtZXJhKHsgZmxpcEhvcml6b250YWw6ICFmbGlwSG9yaXpvbnRhbCB9KTtcbiAgdmlld3BvcnQucmVuZGVyKCk7XG59XG5cbmZ1bmN0aW9uIHJvdGF0ZShyZW5kZXJpbmdFbmdpbmVJZDogc3RyaW5nLCB2aWV3cG9ydElkOiBzdHJpbmcpOiB2b2lkIHtcbiAgLy8gR2V0IHRoZSByZW5kZXJpbmcgZW5naW5lXG4gIGNvbnN0IHJlbmRlcmluZ0VuZ2luZSA9IGdldFJlbmRlcmluZ0VuZ2luZShyZW5kZXJpbmdFbmdpbmVJZCk7XG4gIC8vIEdldCB0aGUgc3RhY2sgdmlld3BvcnRcbiAgY29uc3Qgdmlld3BvcnQgPSA8VHlwZXMuSVN0YWNrVmlld3BvcnQ+cmVuZGVyaW5nRW5naW5lPy5nZXRWaWV3cG9ydCh2aWV3cG9ydElkKTtcbiAgY29uc3QgeyByb3RhdGlvbiA9IDAgfSA9IHZpZXdwb3J0LmdldFZpZXdQcmVzZW50YXRpb24oKTtcbiAgdmlld3BvcnQuc2V0Vmlld1ByZXNlbnRhdGlvbih7IHJvdGF0aW9uOiByb3RhdGlvbiArIDE1IH0pO1xuICB2aWV3cG9ydC5yZW5kZXIoKTtcbn1cblxuZnVuY3Rpb24gbmV4dChyZW5kZXJpbmdFbmdpbmVJZDogc3RyaW5nLCB2aWV3cG9ydElkOiBzdHJpbmcpOiB2b2lkIHtcbiAgLy8gR2V0IHRoZSByZW5kZXJpbmcgZW5naW5lXG4gIGNvbnN0IHJlbmRlcmluZ0VuZ2luZSA9IGdldFJlbmRlcmluZ0VuZ2luZShyZW5kZXJpbmdFbmdpbmVJZCk7XG4gIC8vIEdldCB0aGUgc3RhY2sgdmlld3BvcnRcbiAgY29uc3Qgdmlld3BvcnQgPSA8VHlwZXMuSVN0YWNrVmlld3BvcnQ+cmVuZGVyaW5nRW5naW5lPy5nZXRWaWV3cG9ydCh2aWV3cG9ydElkKTtcbiAgLy8gR2V0IHRoZSBjdXJyZW50IGluZGV4IG9mIHRoZSBpbWFnZSBkaXNwbGF5ZWRcbiAgY29uc3QgY3VycmVudEltYWdlSWRJbmRleCA9IHZpZXdwb3J0LmdldEN1cnJlbnRJbWFnZUlkSW5kZXgoKTtcbiAgLy8gSW5jcmVtZW50IHRoZSBpbmRleCwgY2xhbXBpbmcgdG8gdGhlIGxhc3QgaW1hZ2UgaWYgbmVjZXNzYXJ5XG4gIGNvbnN0IG51bUltYWdlcyA9IHZpZXdwb3J0LmdldEltYWdlSWRzKCkubGVuZ3RoO1xuICBsZXQgbmV3SW1hZ2VJZEluZGV4ID0gY3VycmVudEltYWdlSWRJbmRleCArIDE7XG4gIG5ld0ltYWdlSWRJbmRleCA9IE1hdGgubWluKG5ld0ltYWdlSWRJbmRleCwgbnVtSW1hZ2VzIC0gMSk7XG4gIC8vIFNldCB0aGUgbmV3IGltYWdlIGluZGV4LCB0aGUgdmlld3BvcnQgaXRzZWxmIGRvZXMgYSByZS1yZW5kZXJcbiAgdmlld3BvcnQuc2V0SW1hZ2VJZEluZGV4KG5ld0ltYWdlSWRJbmRleCk7XG59XG5cbmZ1bmN0aW9uIHByZXZpb3VzKHJlbmRlcmluZ0VuZ2luZUlkOiBzdHJpbmcsIHZpZXdwb3J0SWQ6IHN0cmluZyk6IHZvaWQge1xuICAvLyBHZXQgdGhlIHJlbmRlcmluZyBlbmdpbmVcbiAgY29uc3QgcmVuZGVyaW5nRW5naW5lID0gZ2V0UmVuZGVyaW5nRW5naW5lKHJlbmRlcmluZ0VuZ2luZUlkKTtcbiAgLy8gR2V0IHRoZSBzdGFjayB2aWV3cG9ydFxuICBjb25zdCB2aWV3cG9ydCA9IDxUeXBlcy5JU3RhY2tWaWV3cG9ydD5yZW5kZXJpbmdFbmdpbmU/LmdldFZpZXdwb3J0KHZpZXdwb3J0SWQpO1xuICAvLyBHZXQgdGhlIGN1cnJlbnQgaW5kZXggb2YgdGhlIGltYWdlIGRpc3BsYXllZFxuICBjb25zdCBjdXJyZW50SW1hZ2VJZEluZGV4ID0gdmlld3BvcnQuZ2V0Q3VycmVudEltYWdlSWRJbmRleCgpO1xuICAvLyBJbmNyZW1lbnQgdGhlIGluZGV4LCBjbGFtcGluZyB0byB0aGUgZmlyc3QgaW1hZ2UgaWYgbmVjZXNzYXJ5XG4gIGxldCBuZXdJbWFnZUlkSW5kZXggPSBjdXJyZW50SW1hZ2VJZEluZGV4IC0gMTtcbiAgbmV3SW1hZ2VJZEluZGV4ID0gTWF0aC5tYXgobmV3SW1hZ2VJZEluZGV4LCAwKTtcbiAgLy8gU2V0IHRoZSBuZXcgaW1hZ2UgaW5kZXgsIHRoZSB2aWV3cG9ydCBpdHNlbGYgZG9lcyBhIHJlLXJlbmRlclxuICB2aWV3cG9ydC5zZXRJbWFnZUlkSW5kZXgobmV3SW1hZ2VJZEluZGV4KTtcbn1cblxuZnVuY3Rpb24gY2hhbmdlT3JpZW50YXRpb24ocmVuZGVyaW5nRW5naW5lSWQ6IHN0cmluZywgdmlld3BvcnRJZDogc3RyaW5nLCBvcHRpb25zOiBhbnkpIHtcbiAgY29uc3QgcmVuZGVyaW5nRW5naW5lID0gZ2V0UmVuZGVyaW5nRW5naW5lKHJlbmRlcmluZ0VuZ2luZUlkKTtcbiAgY29uc3Qgdmlld3BvcnQgPSByZW5kZXJpbmdFbmdpbmUhLmdldFZpZXdwb3J0KHZpZXdwb3J0SWQpIGFzIFR5cGVzLklWb2x1bWVWaWV3cG9ydDtcbiAgY29uc3QgeyBvcmllbnRhdGlvbiB9ID0gb3B0aW9ucztcbiAgLy8gU2V0IHRoZSBuZXcgb3JpZW50YXRpb25cbiAgdmlld3BvcnQuc2V0T3JpZW50YXRpb24ob3JpZW50YXRpb24pO1xuICAvLyBSZXNldCB0aGUgY2FtZXJhIGFmdGVyIHRoZSBub3JtYWwgY2hhbmdlc1xuICB2aWV3cG9ydC5yZXNldENhbWVyYSgpO1xuICB2aWV3cG9ydC5yZW5kZXIoKTtcbn1cblxuZXhwb3J0IGNvbnN0IFRPT0xfQ09ORklHX01BUDogeyBba2V5IGluIFRvb2xFbnVtXT86IFRvb2xDb25maWcgfSA9IHtcbiAgW1Rvb2xFbnVtLlJlc2V0XToge1xuICAgIGljb246ICdkbXYtcmVjb3ZlcicsXG4gICAgbGFiZWw6ICdSZXNldCcsXG4gICAgbmFtZTogJ3Jlc2V0JyxcbiAgICBjYWxsYmFjazogcmVzZXQsXG4gICAgdHlwZXM6IFtFbnVtcy5WaWV3cG9ydFR5cGUuU1RBQ0ssIEVudW1zLlZpZXdwb3J0VHlwZS5PUlRIT0dSQVBISUMsIEVudW1zLlZpZXdwb3J0VHlwZS5WT0xVTUVfM0RdLFxuICB9LFxuICBbVG9vbEVudW0uRmxpcFZdOiB7XG4gICAgaWNvbjogJ2Rtdi1mbGlwaCcsXG4gICAgbGFiZWw6ICdGbGlwLUgnLFxuICAgIG5hbWU6ICdmbGlwaCcsXG4gICAgY2FsbGJhY2s6IGZsaXBILFxuICAgIHR5cGVzOiBbRW51bXMuVmlld3BvcnRUeXBlLlNUQUNLLCBFbnVtcy5WaWV3cG9ydFR5cGUuT1JUSE9HUkFQSElDXSxcbiAgfSxcbiAgW1Rvb2xFbnVtLkZsaXBIXToge1xuICAgIGljb246ICdkbXYtZmxpcHYnLFxuICAgIGxhYmVsOiAnRmxpcC1WJyxcbiAgICBuYW1lOiAnZmxpcFYnLFxuICAgIGNhbGxiYWNrOiBmbGlwVixcbiAgICB0eXBlczogW0VudW1zLlZpZXdwb3J0VHlwZS5TVEFDSywgRW51bXMuVmlld3BvcnRUeXBlLk9SVEhPR1JBUEhJQ10sXG4gIH0sXG4gIFtUb29sRW51bS5Sb3RhdGVdOiB7XG4gICAgaWNvbjogJ2Rtdi1yb3RhdGUnLFxuICAgIGxhYmVsOiAnUm90YXRlJyxcbiAgICBuYW1lOiAncm90YXRlJyxcbiAgICBjYWxsYmFjazogcm90YXRlLFxuICAgIHR5cGVzOiBbRW51bXMuVmlld3BvcnRUeXBlLlNUQUNLLCBFbnVtcy5WaWV3cG9ydFR5cGUuT1JUSE9HUkFQSElDLCBFbnVtcy5WaWV3cG9ydFR5cGUuVk9MVU1FXzNEXSxcbiAgfSxcbiAgW1Rvb2xFbnVtLlNhZ2l0dGFsXToge1xuICAgIGljb246ICdkbXYtc2FnaXR0YWwnLFxuICAgIGxhYmVsOiAnU2FnaXR0YWwnLFxuICAgIG5hbWU6ICdzYWdpdHRhbCcsXG4gICAgY2FsbGJhY2s6IGNoYW5nZU9yaWVudGF0aW9uLFxuICAgIG9wdGlvbnM6IHsgb3JpZW50YXRpb246IEVudW1zLk9yaWVudGF0aW9uQXhpcy5TQUdJVFRBTCB9LFxuICAgIHR5cGVzOiBbRW51bXMuVmlld3BvcnRUeXBlLk9SVEhPR1JBUEhJQ10sXG4gIH0sXG4gIFtUb29sRW51bS5Db3JvbmFsXToge1xuICAgIGljb246ICdkbXYtY29yb25hbCcsXG4gICAgbGFiZWw6ICdDb3JvbmFsJyxcbiAgICBuYW1lOiAnY29yb25hbCcsXG4gICAgY2FsbGJhY2s6IGNoYW5nZU9yaWVudGF0aW9uLFxuICAgIG9wdGlvbnM6IHsgb3JpZW50YXRpb246IEVudW1zLk9yaWVudGF0aW9uQXhpcy5DT1JPTkFMIH0sXG4gICAgdHlwZXM6IFtFbnVtcy5WaWV3cG9ydFR5cGUuT1JUSE9HUkFQSElDXSxcbiAgfSxcbiAgW1Rvb2xFbnVtLkF4aWFsXToge1xuICAgIGljb246ICdkbXYtYXhpYWwnLFxuICAgIGxhYmVsOiAnQXhpYWwnLFxuICAgIG5hbWU6ICdheGlhbCcsXG4gICAgY2FsbGJhY2s6IGNoYW5nZU9yaWVudGF0aW9uLFxuICAgIG9wdGlvbnM6IHsgb3JpZW50YXRpb246IEVudW1zLk9yaWVudGF0aW9uQXhpcy5BWElBTCB9LFxuICAgIHR5cGVzOiBbRW51bXMuVmlld3BvcnRUeXBlLk9SVEhPR1JBUEhJQ10sXG4gIH0sXG4gIFtUb29sRW51bS5OZXh0XToge1xuICAgIGljb246ICdkbXYtcmlnaHQnLFxuICAgIGxhYmVsOiAnTmV4dCcsXG4gICAgbmFtZTogJ25leHQnLFxuICAgIGNhbGxiYWNrOiBuZXh0LFxuICAgIHR5cGVzOiBbRW51bXMuVmlld3BvcnRUeXBlLlNUQUNLXSxcbiAgfSxcbiAgW1Rvb2xFbnVtLlByZXZpb3VzXToge1xuICAgIGljb246ICdkbXYtbGVmdCcsXG4gICAgbGFiZWw6ICdQcmV2aW91cycsXG4gICAgbmFtZTogJ3ByZXZpb3VzJyxcbiAgICBjYWxsYmFjazogcHJldmlvdXMsXG4gICAgdHlwZXM6IFtFbnVtcy5WaWV3cG9ydFR5cGUuU1RBQ0tdLFxuICB9LFxuICBbVG9vbEVudW0uQXJyb3dBbm5vdGF0ZVRvb2xdOiB7XG4gICAgaWNvbjogJ2Rtdi1hbm5vdGF0aW9uJyxcbiAgICBsYWJlbDogJ0Fycm93JyxcbiAgICB0b29sOiBBcnJvd0Fubm90YXRlVG9vbCxcbiAgICBuYW1lOiBBcnJvd0Fubm90YXRlVG9vbC50b29sTmFtZSxcbiAgICB0eXBlczogW0VudW1zLlZpZXdwb3J0VHlwZS5TVEFDSywgRW51bXMuVmlld3BvcnRUeXBlLk9SVEhPR1JBUEhJQ10sXG4gIH0sXG4gIFtUb29sRW51bS5BbmdsZVRvb2xdOiB7XG4gICAgaWNvbjogJ2Rtdi1hbmdsZScsXG4gICAgbGFiZWw6ICdBbmdsZScsXG4gICAgdG9vbDogQW5nbGVUb29sLFxuICAgIG5hbWU6IEFuZ2xlVG9vbC50b29sTmFtZSxcbiAgICB0eXBlczogW0VudW1zLlZpZXdwb3J0VHlwZS5TVEFDSywgRW51bXMuVmlld3BvcnRUeXBlLk9SVEhPR1JBUEhJQ10sXG4gIH0sXG4gIFtUb29sRW51bS5MZW5ndGhUb29sXToge1xuICAgIGljb246ICdkbXYtcnVsZXInLFxuICAgIGxhYmVsOiAnUnVsZXInLFxuICAgIHRvb2w6IExlbmd0aFRvb2wsXG4gICAgbmFtZTogTGVuZ3RoVG9vbC50b29sTmFtZSxcbiAgICB0eXBlczogW0VudW1zLlZpZXdwb3J0VHlwZS5TVEFDSywgRW51bXMuVmlld3BvcnRUeXBlLk9SVEhPR1JBUEhJQ10sXG4gIH0sXG4gIFtUb29sRW51bS5SZWN0YW5nbGVST0lUb29sXToge1xuICAgIGljb246ICdkbXYtcmVjdGFuZ2xlJyxcbiAgICBsYWJlbDogJ1JlY3RhbmdsZScsXG4gICAgdG9vbDogUmVjdGFuZ2xlUk9JVG9vbCxcbiAgICBuYW1lOiBSZWN0YW5nbGVST0lUb29sLnRvb2xOYW1lLFxuICAgIHR5cGVzOiBbRW51bXMuVmlld3BvcnRUeXBlLlNUQUNLLCBFbnVtcy5WaWV3cG9ydFR5cGUuT1JUSE9HUkFQSElDXSxcbiAgfSxcbiAgW1Rvb2xFbnVtLkVsbGlwdGljYWxST0lUb29sXToge1xuICAgIGljb246ICdkbXYtZWxsaXBzZScsXG4gICAgbGFiZWw6ICdFbGxpcHNlJyxcbiAgICB0b29sOiBFbGxpcHRpY2FsUk9JVG9vbCxcbiAgICBuYW1lOiBFbGxpcHRpY2FsUk9JVG9vbC50b29sTmFtZSxcbiAgICB0eXBlczogW0VudW1zLlZpZXdwb3J0VHlwZS5TVEFDSywgRW51bXMuVmlld3BvcnRUeXBlLk9SVEhPR1JBUEhJQ10sXG4gIH0sXG4gIFtUb29sRW51bS5UcmFja2JhbGxSb3RhdGVUb29sXToge1xuICAgIGljb246ICdkbXYtcm90YXRlJyxcbiAgICBsYWJlbDogJ1RyYWNrYmFsbCcsXG4gICAgdG9vbDogVHJhY2tiYWxsUm90YXRlVG9vbCxcbiAgICBuYW1lOiBUcmFja2JhbGxSb3RhdGVUb29sLnRvb2xOYW1lLFxuICAgIHR5cGVzOiBbRW51bXMuVmlld3BvcnRUeXBlLlNUQUNLLCBFbnVtcy5WaWV3cG9ydFR5cGUuT1JUSE9HUkFQSElDLCBFbnVtcy5WaWV3cG9ydFR5cGUuVk9MVU1FXzNEXSxcbiAgfSxcbiAgW1Rvb2xFbnVtLlpvb21Ub29sXToge1xuICAgIGljb246ICdkbXYtem9vbScsXG4gICAgbGFiZWw6ICdab29tJyxcbiAgICB0b29sOiBab29tVG9vbCxcbiAgICBuYW1lOiBab29tVG9vbC50b29sTmFtZSxcbiAgICB0eXBlczogW0VudW1zLlZpZXdwb3J0VHlwZS5TVEFDSywgRW51bXMuVmlld3BvcnRUeXBlLk9SVEhPR1JBUEhJQywgRW51bXMuVmlld3BvcnRUeXBlLlZPTFVNRV8zRF0sXG4gIH0sXG4gIFtUb29sRW51bS5QYW5Ub29sXToge1xuICAgIGljb246ICdkbXYtcGFuJyxcbiAgICBsYWJlbDogJ1BhbicsXG4gICAgdG9vbDogUGFuVG9vbCxcbiAgICBuYW1lOiBQYW5Ub29sLnRvb2xOYW1lLFxuICAgIHR5cGVzOiBbRW51bXMuVmlld3BvcnRUeXBlLlNUQUNLLCBFbnVtcy5WaWV3cG9ydFR5cGUuT1JUSE9HUkFQSElDLCBFbnVtcy5WaWV3cG9ydFR5cGUuVk9MVU1FXzNEXSxcbiAgfSxcbiAgW1Rvb2xFbnVtLldpbmRvd0xldmVsVG9vbF06IHtcbiAgICBpY29uOiAnZG12LXdpbmRvdy1sZXZlbCcsXG4gICAgbGFiZWw6ICdXTCcsXG4gICAgdG9vbDogV2luZG93TGV2ZWxUb29sLFxuICAgIG5hbWU6IFdpbmRvd0xldmVsVG9vbC50b29sTmFtZSxcbiAgICB0eXBlczogW0VudW1zLlZpZXdwb3J0VHlwZS5TVEFDSywgRW51bXMuVmlld3BvcnRUeXBlLk9SVEhPR1JBUEhJQywgRW51bXMuVmlld3BvcnRUeXBlLlZPTFVNRV8zRF0sXG4gIH0sXG4gIFtUb29sRW51bS5TdGFja1Njcm9sbFRvb2xdOiB7XG4gICAgaWNvbjogJ2Rtdi1sYXllcicsXG4gICAgbGFiZWw6ICdTY3JvbGwnLFxuICAgIHRvb2w6IFN0YWNrU2Nyb2xsVG9vbCxcbiAgICBuYW1lOiBTdGFja1Njcm9sbFRvb2wudG9vbE5hbWUsXG4gICAgdHlwZXM6IFtFbnVtcy5WaWV3cG9ydFR5cGUuU1RBQ0ssIEVudW1zLlZpZXdwb3J0VHlwZS5PUlRIT0dSQVBISUNdLFxuICB9LFxufTtcbiJdfQ==