ng-cornerstone
Version:
[](https://github.com/prettier/prettier) [](http://commitizen.git
215 lines • 28.6 kB
JavaScript
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==