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

103 lines 15.6 kB
// See https://github.com/OHIF/Viewers/blob/94a9067fe3d291d30e25a1bda5913511388edea2/platform/core/src/utils/metadataProvider/getPixelSpacingInformation.js export default function getPixelSpacingInformation(instance) { // See http://gdcm.sourceforge.net/wiki/index.php/Imager_Pixel_Spacing // TODO: Add Ultrasound region spacing // TODO: Add manual calibration // TODO: Use ENUMS from dcmjs const projectionRadiographSOPClassUIDs = [ '1.2.840.10008.5.1.4.1.1.1', // CR Image Storage '1.2.840.10008.5.1.4.1.1.1.1', // Digital X-Ray Image Storage – for Presentation '1.2.840.10008.5.1.4.1.1.1.1.1', // Digital X-Ray Image Storage – for Processing '1.2.840.10008.5.1.4.1.1.1.2', // Digital Mammography X-Ray Image Storage – for Presentation '1.2.840.10008.5.1.4.1.1.1.2.1', // Digital Mammography X-Ray Image Storage – for Processing '1.2.840.10008.5.1.4.1.1.1.3', // Digital Intra – oral X-Ray Image Storage – for Presentation '1.2.840.10008.5.1.4.1.1.1.3.1', // Digital Intra – oral X-Ray Image Storage – for Processing '1.2.840.10008.5.1.4.1.1.12.1', // X-Ray Angiographic Image Storage '1.2.840.10008.5.1.4.1.1.12.1.1', // Enhanced XA Image Storage '1.2.840.10008.5.1.4.1.1.12.2', // X-Ray Radiofluoroscopic Image Storage '1.2.840.10008.5.1.4.1.1.12.2.1', // Enhanced XRF Image Storage '1.2.840.10008.5.1.4.1.1.12.3', // X-Ray Angiographic Bi-plane Image Storage Retired ]; const { PixelSpacing, ImagerPixelSpacing, SOPClassUID, PixelSpacingCalibrationType, PixelSpacingCalibrationDescription, EstimatedRadiographicMagnificationFactor, SequenceOfUltrasoundRegions, } = instance; const isProjection = projectionRadiographSOPClassUIDs.includes(SOPClassUID); const TYPES = { NOT_APPLICABLE: 'NOT_APPLICABLE', UNKNOWN: 'UNKNOWN', CALIBRATED: 'CALIBRATED', DETECTOR: 'DETECTOR', }; if (!isProjection) { return PixelSpacing; } if (isProjection && !ImagerPixelSpacing) { // If only Pixel Spacing is present, and this is a projection radiograph, // PixelSpacing should be used, but the user should be informed that // what it means is unknown return { PixelSpacing, type: TYPES.UNKNOWN, isProjection, }; } else if (PixelSpacing && ImagerPixelSpacing && PixelSpacing === ImagerPixelSpacing) { // If Imager Pixel Spacing and Pixel Spacing are present and they have the same values, // then the user should be informed that the measurements are at the detector plane return { PixelSpacing, type: TYPES.DETECTOR, isProjection, }; } else if (PixelSpacing && ImagerPixelSpacing && PixelSpacing !== ImagerPixelSpacing) { // If Imager Pixel Spacing and Pixel Spacing are present and they have different values, // then the user should be informed that these are "calibrated" // (in some unknown manner if Pixel Spacing Calibration Type and/or // Pixel Spacing Calibration Description are absent) return { PixelSpacing, type: TYPES.CALIBRATED, isProjection, PixelSpacingCalibrationType, PixelSpacingCalibrationDescription, }; } else if (!PixelSpacing && ImagerPixelSpacing) { let CorrectedImagerPixelSpacing = ImagerPixelSpacing; if (EstimatedRadiographicMagnificationFactor) { // Note that in IHE Mammo profile compliant displays, the value of Imager Pixel Spacing is required to be corrected by // Estimated Radiographic Magnification Factor and the user informed of that. // TODO: should this correction be done before all of this logic? CorrectedImagerPixelSpacing = ImagerPixelSpacing.map((pixelSpacing) => pixelSpacing / EstimatedRadiographicMagnificationFactor); } else { console.warn('EstimatedRadiographicMagnificationFactor was not present. Unable to correct ImagerPixelSpacing.'); } return { PixelSpacing: CorrectedImagerPixelSpacing, isProjection, }; } else if (SequenceOfUltrasoundRegions && typeof SequenceOfUltrasoundRegions === 'object') { const { PhysicalDeltaX, PhysicalDeltaY } = SequenceOfUltrasoundRegions; const USPixelSpacing = [PhysicalDeltaX * 10, PhysicalDeltaY * 10]; return { PixelSpacing: USPixelSpacing, }; } else if (SequenceOfUltrasoundRegions && Array.isArray(SequenceOfUltrasoundRegions) && SequenceOfUltrasoundRegions.length > 1) { console.warn('Sequence of Ultrasound Regions > one entry. This is not yet implemented, all measurements will be shown in pixels.'); } else if (!isProjection && !ImagerPixelSpacing) { // If only Pixel Spacing is present, and this is not a projection radiograph, // we can stop here return { PixelSpacing, type: TYPES.NOT_APPLICABLE, isProjection, }; } console.warn('Unknown combination of PixelSpacing and ImagerPixelSpacing identified. Unable to determine spacing.'); } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2V0UGl4ZWxTcGFjaW5nSW5mb3JtYXRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1jb3JuZXJzdG9uZS9zcmMvbGliL2NvcmUvcHJvdmlkZXIvZ2V0UGl4ZWxTcGFjaW5nSW5mb3JtYXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsMkpBQTJKO0FBRTNKLE1BQU0sQ0FBQyxPQUFPLFVBQVUsMEJBQTBCLENBQUMsUUFBUTtJQUN6RCxzRUFBc0U7SUFFdEUsc0NBQXNDO0lBQ3RDLCtCQUErQjtJQUUvQiw2QkFBNkI7SUFDN0IsTUFBTSxnQ0FBZ0MsR0FBRztRQUN2QywyQkFBMkIsRUFBRSxtQkFBbUI7UUFDaEQsNkJBQTZCLEVBQUUsaURBQWlEO1FBQ2hGLCtCQUErQixFQUFFLCtDQUErQztRQUNoRiw2QkFBNkIsRUFBRSw2REFBNkQ7UUFDNUYsK0JBQStCLEVBQUUsMkRBQTJEO1FBQzVGLDZCQUE2QixFQUFFLDhEQUE4RDtRQUM3RiwrQkFBK0IsRUFBRSw0REFBNEQ7UUFDN0YsOEJBQThCLEVBQUUsbUNBQW1DO1FBQ25FLGdDQUFnQyxFQUFFLDRCQUE0QjtRQUM5RCw4QkFBOEIsRUFBRSx3Q0FBd0M7UUFDeEUsZ0NBQWdDLEVBQUUsNkJBQTZCO1FBQy9ELDhCQUE4QixFQUFFLG9EQUFvRDtLQUNyRixDQUFDO0lBRUYsTUFBTSxFQUNKLFlBQVksRUFDWixrQkFBa0IsRUFDbEIsV0FBVyxFQUNYLDJCQUEyQixFQUMzQixrQ0FBa0MsRUFDbEMsd0NBQXdDLEVBQ3hDLDJCQUEyQixHQUM1QixHQUFHLFFBQVEsQ0FBQztJQUViLE1BQU0sWUFBWSxHQUFHLGdDQUFnQyxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUU1RSxNQUFNLEtBQUssR0FBRztRQUNaLGNBQWMsRUFBRSxnQkFBZ0I7UUFDaEMsT0FBTyxFQUFFLFNBQVM7UUFDbEIsVUFBVSxFQUFFLFlBQVk7UUFDeEIsUUFBUSxFQUFFLFVBQVU7S0FDckIsQ0FBQztJQUVGLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUNsQixPQUFPLFlBQVksQ0FBQztJQUN0QixDQUFDO0lBRUQsSUFBSSxZQUFZLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBQ3hDLHlFQUF5RTtRQUN6RSxvRUFBb0U7UUFDcEUsMkJBQTJCO1FBQzNCLE9BQU87WUFDTCxZQUFZO1lBQ1osSUFBSSxFQUFFLEtBQUssQ0FBQyxPQUFPO1lBQ25CLFlBQVk7U0FDYixDQUFDO0lBQ0osQ0FBQztTQUFNLElBQUksWUFBWSxJQUFJLGtCQUFrQixJQUFJLFlBQVksS0FBSyxrQkFBa0IsRUFBRSxDQUFDO1FBQ3JGLHVGQUF1RjtRQUN2RixtRkFBbUY7UUFDbkYsT0FBTztZQUNMLFlBQVk7WUFDWixJQUFJLEVBQUUsS0FBSyxDQUFDLFFBQVE7WUFDcEIsWUFBWTtTQUNiLENBQUM7SUFDSixDQUFDO1NBQU0sSUFBSSxZQUFZLElBQUksa0JBQWtCLElBQUksWUFBWSxLQUFLLGtCQUFrQixFQUFFLENBQUM7UUFDckYsd0ZBQXdGO1FBQ3hGLCtEQUErRDtRQUMvRCxtRUFBbUU7UUFDbkUsb0RBQW9EO1FBQ3BELE9BQU87WUFDTCxZQUFZO1lBQ1osSUFBSSxFQUFFLEtBQUssQ0FBQyxVQUFVO1lBQ3RCLFlBQVk7WUFDWiwyQkFBMkI7WUFDM0Isa0NBQWtDO1NBQ25DLENBQUM7SUFDSixDQUFDO1NBQU0sSUFBSSxDQUFDLFlBQVksSUFBSSxrQkFBa0IsRUFBRSxDQUFDO1FBQy9DLElBQUksMkJBQTJCLEdBQUcsa0JBQWtCLENBQUM7UUFDckQsSUFBSSx3Q0FBd0MsRUFBRSxDQUFDO1lBQzdDLHNIQUFzSDtZQUN0SCw2RUFBNkU7WUFDN0UsaUVBQWlFO1lBQ2pFLDJCQUEyQixHQUFHLGtCQUFrQixDQUFDLEdBQUcsQ0FDbEQsQ0FBQyxZQUFZLEVBQUUsRUFBRSxDQUFDLFlBQVksR0FBRyx3Q0FBd0MsQ0FDMUUsQ0FBQztRQUNKLENBQUM7YUFBTSxDQUFDO1lBQ04sT0FBTyxDQUFDLElBQUksQ0FBQyxpR0FBaUcsQ0FBQyxDQUFDO1FBQ2xILENBQUM7UUFFRCxPQUFPO1lBQ0wsWUFBWSxFQUFFLDJCQUEyQjtZQUN6QyxZQUFZO1NBQ2IsQ0FBQztJQUNKLENBQUM7U0FBTSxJQUFJLDJCQUEyQixJQUFJLE9BQU8sMkJBQTJCLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDMUYsTUFBTSxFQUFFLGNBQWMsRUFBRSxjQUFjLEVBQUUsR0FBRywyQkFBMkIsQ0FBQztRQUN2RSxNQUFNLGNBQWMsR0FBRyxDQUFDLGNBQWMsR0FBRyxFQUFFLEVBQUUsY0FBYyxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBRWxFLE9BQU87WUFDTCxZQUFZLEVBQUUsY0FBYztTQUM3QixDQUFDO0lBQ0osQ0FBQztTQUFNLElBQ0wsMkJBQTJCO1FBQzNCLEtBQUssQ0FBQyxPQUFPLENBQUMsMkJBQTJCLENBQUM7UUFDMUMsMkJBQTJCLENBQUMsTUFBTSxHQUFHLENBQUMsRUFDdEMsQ0FBQztRQUNELE9BQU8sQ0FBQyxJQUFJLENBQ1Ysb0hBQW9ILENBQ3JILENBQUM7SUFDSixDQUFDO1NBQU0sSUFBSSxDQUFDLFlBQVksSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDaEQsNkVBQTZFO1FBQzdFLG1CQUFtQjtRQUNuQixPQUFPO1lBQ0wsWUFBWTtZQUNaLElBQUksRUFBRSxLQUFLLENBQUMsY0FBYztZQUMxQixZQUFZO1NBQ2IsQ0FBQztJQUNKLENBQUM7SUFFRCxPQUFPLENBQUMsSUFBSSxDQUFDLHFHQUFxRyxDQUFDLENBQUM7QUFDdEgsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vT0hJRi9WaWV3ZXJzL2Jsb2IvOTRhOTA2N2ZlM2QyOTFkMzBlMjVhMWJkYTU5MTM1MTEzODhlZGVhMi9wbGF0Zm9ybS9jb3JlL3NyYy91dGlscy9tZXRhZGF0YVByb3ZpZGVyL2dldFBpeGVsU3BhY2luZ0luZm9ybWF0aW9uLmpzXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldFBpeGVsU3BhY2luZ0luZm9ybWF0aW9uKGluc3RhbmNlKSB7XG4gIC8vIFNlZSBodHRwOi8vZ2RjbS5zb3VyY2Vmb3JnZS5uZXQvd2lraS9pbmRleC5waHAvSW1hZ2VyX1BpeGVsX1NwYWNpbmdcblxuICAvLyBUT0RPOiBBZGQgVWx0cmFzb3VuZCByZWdpb24gc3BhY2luZ1xuICAvLyBUT0RPOiBBZGQgbWFudWFsIGNhbGlicmF0aW9uXG5cbiAgLy8gVE9ETzogVXNlIEVOVU1TIGZyb20gZGNtanNcbiAgY29uc3QgcHJvamVjdGlvblJhZGlvZ3JhcGhTT1BDbGFzc1VJRHMgPSBbXG4gICAgJzEuMi44NDAuMTAwMDguNS4xLjQuMS4xLjEnLCAvL1x0Q1IgSW1hZ2UgU3RvcmFnZVxuICAgICcxLjIuODQwLjEwMDA4LjUuMS40LjEuMS4xLjEnLCAvL1x0RGlnaXRhbCBYLVJheSBJbWFnZSBTdG9yYWdlIOKAkyBmb3IgUHJlc2VudGF0aW9uXG4gICAgJzEuMi44NDAuMTAwMDguNS4xLjQuMS4xLjEuMS4xJywgLy9cdERpZ2l0YWwgWC1SYXkgSW1hZ2UgU3RvcmFnZSDigJMgZm9yIFByb2Nlc3NpbmdcbiAgICAnMS4yLjg0MC4xMDAwOC41LjEuNC4xLjEuMS4yJywgLy9cdERpZ2l0YWwgTWFtbW9ncmFwaHkgWC1SYXkgSW1hZ2UgU3RvcmFnZSDigJMgZm9yIFByZXNlbnRhdGlvblxuICAgICcxLjIuODQwLjEwMDA4LjUuMS40LjEuMS4xLjIuMScsIC8vXHREaWdpdGFsIE1hbW1vZ3JhcGh5IFgtUmF5IEltYWdlIFN0b3JhZ2Ug4oCTIGZvciBQcm9jZXNzaW5nXG4gICAgJzEuMi44NDAuMTAwMDguNS4xLjQuMS4xLjEuMycsIC8vXHREaWdpdGFsIEludHJhIOKAkyBvcmFsIFgtUmF5IEltYWdlIFN0b3JhZ2Ug4oCTIGZvciBQcmVzZW50YXRpb25cbiAgICAnMS4yLjg0MC4xMDAwOC41LjEuNC4xLjEuMS4zLjEnLCAvL1x0RGlnaXRhbCBJbnRyYSDigJMgb3JhbCBYLVJheSBJbWFnZSBTdG9yYWdlIOKAkyBmb3IgUHJvY2Vzc2luZ1xuICAgICcxLjIuODQwLjEwMDA4LjUuMS40LjEuMS4xMi4xJywgLy9cdFgtUmF5IEFuZ2lvZ3JhcGhpYyBJbWFnZSBTdG9yYWdlXG4gICAgJzEuMi44NDAuMTAwMDguNS4xLjQuMS4xLjEyLjEuMScsIC8vXHRFbmhhbmNlZCBYQSBJbWFnZSBTdG9yYWdlXG4gICAgJzEuMi44NDAuMTAwMDguNS4xLjQuMS4xLjEyLjInLCAvL1x0WC1SYXkgUmFkaW9mbHVvcm9zY29waWMgSW1hZ2UgU3RvcmFnZVxuICAgICcxLjIuODQwLjEwMDA4LjUuMS40LjEuMS4xMi4yLjEnLCAvL1x0RW5oYW5jZWQgWFJGIEltYWdlIFN0b3JhZ2VcbiAgICAnMS4yLjg0MC4xMDAwOC41LjEuNC4xLjEuMTIuMycsIC8vIFgtUmF5IEFuZ2lvZ3JhcGhpYyBCaS1wbGFuZSBJbWFnZSBTdG9yYWdlXHRSZXRpcmVkXG4gIF07XG5cbiAgY29uc3Qge1xuICAgIFBpeGVsU3BhY2luZyxcbiAgICBJbWFnZXJQaXhlbFNwYWNpbmcsXG4gICAgU09QQ2xhc3NVSUQsXG4gICAgUGl4ZWxTcGFjaW5nQ2FsaWJyYXRpb25UeXBlLFxuICAgIFBpeGVsU3BhY2luZ0NhbGlicmF0aW9uRGVzY3JpcHRpb24sXG4gICAgRXN0aW1hdGVkUmFkaW9ncmFwaGljTWFnbmlmaWNhdGlvbkZhY3RvcixcbiAgICBTZXF1ZW5jZU9mVWx0cmFzb3VuZFJlZ2lvbnMsXG4gIH0gPSBpbnN0YW5jZTtcblxuICBjb25zdCBpc1Byb2plY3Rpb24gPSBwcm9qZWN0aW9uUmFkaW9ncmFwaFNPUENsYXNzVUlEcy5pbmNsdWRlcyhTT1BDbGFzc1VJRCk7XG5cbiAgY29uc3QgVFlQRVMgPSB7XG4gICAgTk9UX0FQUExJQ0FCTEU6ICdOT1RfQVBQTElDQUJMRScsXG4gICAgVU5LTk9XTjogJ1VOS05PV04nLFxuICAgIENBTElCUkFURUQ6ICdDQUxJQlJBVEVEJyxcbiAgICBERVRFQ1RPUjogJ0RFVEVDVE9SJyxcbiAgfTtcblxuICBpZiAoIWlzUHJvamVjdGlvbikge1xuICAgIHJldHVybiBQaXhlbFNwYWNpbmc7XG4gIH1cblxuICBpZiAoaXNQcm9qZWN0aW9uICYmICFJbWFnZXJQaXhlbFNwYWNpbmcpIHtcbiAgICAvLyBJZiBvbmx5IFBpeGVsIFNwYWNpbmcgaXMgcHJlc2VudCwgYW5kIHRoaXMgaXMgYSBwcm9qZWN0aW9uIHJhZGlvZ3JhcGgsXG4gICAgLy8gUGl4ZWxTcGFjaW5nIHNob3VsZCBiZSB1c2VkLCBidXQgdGhlIHVzZXIgc2hvdWxkIGJlIGluZm9ybWVkIHRoYXRcbiAgICAvLyB3aGF0IGl0IG1lYW5zIGlzIHVua25vd25cbiAgICByZXR1cm4ge1xuICAgICAgUGl4ZWxTcGFjaW5nLFxuICAgICAgdHlwZTogVFlQRVMuVU5LTk9XTixcbiAgICAgIGlzUHJvamVjdGlvbixcbiAgICB9O1xuICB9IGVsc2UgaWYgKFBpeGVsU3BhY2luZyAmJiBJbWFnZXJQaXhlbFNwYWNpbmcgJiYgUGl4ZWxTcGFjaW5nID09PSBJbWFnZXJQaXhlbFNwYWNpbmcpIHtcbiAgICAvLyBJZiBJbWFnZXIgUGl4ZWwgU3BhY2luZyBhbmQgUGl4ZWwgU3BhY2luZyBhcmUgcHJlc2VudCBhbmQgdGhleSBoYXZlIHRoZSBzYW1lIHZhbHVlcyxcbiAgICAvLyB0aGVuIHRoZSB1c2VyIHNob3VsZCBiZSBpbmZvcm1lZCB0aGF0IHRoZSBtZWFzdXJlbWVudHMgYXJlIGF0IHRoZSBkZXRlY3RvciBwbGFuZVxuICAgIHJldHVybiB7XG4gICAgICBQaXhlbFNwYWNpbmcsXG4gICAgICB0eXBlOiBUWVBFUy5ERVRFQ1RPUixcbiAgICAgIGlzUHJvamVjdGlvbixcbiAgICB9O1xuICB9IGVsc2UgaWYgKFBpeGVsU3BhY2luZyAmJiBJbWFnZXJQaXhlbFNwYWNpbmcgJiYgUGl4ZWxTcGFjaW5nICE9PSBJbWFnZXJQaXhlbFNwYWNpbmcpIHtcbiAgICAvLyBJZiBJbWFnZXIgUGl4ZWwgU3BhY2luZyBhbmQgUGl4ZWwgU3BhY2luZyBhcmUgcHJlc2VudCBhbmQgdGhleSBoYXZlIGRpZmZlcmVudCB2YWx1ZXMsXG4gICAgLy8gdGhlbiB0aGUgdXNlciBzaG91bGQgYmUgaW5mb3JtZWQgdGhhdCB0aGVzZSBhcmUgXCJjYWxpYnJhdGVkXCJcbiAgICAvLyAoaW4gc29tZSB1bmtub3duIG1hbm5lciBpZiBQaXhlbCBTcGFjaW5nIENhbGlicmF0aW9uIFR5cGUgYW5kL29yXG4gICAgLy8gUGl4ZWwgU3BhY2luZyBDYWxpYnJhdGlvbiBEZXNjcmlwdGlvbiBhcmUgYWJzZW50KVxuICAgIHJldHVybiB7XG4gICAgICBQaXhlbFNwYWNpbmcsXG4gICAgICB0eXBlOiBUWVBFUy5DQUxJQlJBVEVELFxuICAgICAgaXNQcm9qZWN0aW9uLFxuICAgICAgUGl4ZWxTcGFjaW5nQ2FsaWJyYXRpb25UeXBlLFxuICAgICAgUGl4ZWxTcGFjaW5nQ2FsaWJyYXRpb25EZXNjcmlwdGlvbixcbiAgICB9O1xuICB9IGVsc2UgaWYgKCFQaXhlbFNwYWNpbmcgJiYgSW1hZ2VyUGl4ZWxTcGFjaW5nKSB7XG4gICAgbGV0IENvcnJlY3RlZEltYWdlclBpeGVsU3BhY2luZyA9IEltYWdlclBpeGVsU3BhY2luZztcbiAgICBpZiAoRXN0aW1hdGVkUmFkaW9ncmFwaGljTWFnbmlmaWNhdGlvbkZhY3Rvcikge1xuICAgICAgLy8gTm90ZSB0aGF0IGluIElIRSBNYW1tbyBwcm9maWxlIGNvbXBsaWFudCBkaXNwbGF5cywgdGhlIHZhbHVlIG9mIEltYWdlciBQaXhlbCBTcGFjaW5nIGlzIHJlcXVpcmVkIHRvIGJlIGNvcnJlY3RlZCBieVxuICAgICAgLy8gRXN0aW1hdGVkIFJhZGlvZ3JhcGhpYyBNYWduaWZpY2F0aW9uIEZhY3RvciBhbmQgdGhlIHVzZXIgaW5mb3JtZWQgb2YgdGhhdC5cbiAgICAgIC8vIFRPRE86IHNob3VsZCB0aGlzIGNvcnJlY3Rpb24gYmUgZG9uZSBiZWZvcmUgYWxsIG9mIHRoaXMgbG9naWM/XG4gICAgICBDb3JyZWN0ZWRJbWFnZXJQaXhlbFNwYWNpbmcgPSBJbWFnZXJQaXhlbFNwYWNpbmcubWFwKFxuICAgICAgICAocGl4ZWxTcGFjaW5nKSA9PiBwaXhlbFNwYWNpbmcgLyBFc3RpbWF0ZWRSYWRpb2dyYXBoaWNNYWduaWZpY2F0aW9uRmFjdG9yLFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS53YXJuKCdFc3RpbWF0ZWRSYWRpb2dyYXBoaWNNYWduaWZpY2F0aW9uRmFjdG9yIHdhcyBub3QgcHJlc2VudC4gVW5hYmxlIHRvIGNvcnJlY3QgSW1hZ2VyUGl4ZWxTcGFjaW5nLicpO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBQaXhlbFNwYWNpbmc6IENvcnJlY3RlZEltYWdlclBpeGVsU3BhY2luZyxcbiAgICAgIGlzUHJvamVjdGlvbixcbiAgICB9O1xuICB9IGVsc2UgaWYgKFNlcXVlbmNlT2ZVbHRyYXNvdW5kUmVnaW9ucyAmJiB0eXBlb2YgU2VxdWVuY2VPZlVsdHJhc291bmRSZWdpb25zID09PSAnb2JqZWN0Jykge1xuICAgIGNvbnN0IHsgUGh5c2ljYWxEZWx0YVgsIFBoeXNpY2FsRGVsdGFZIH0gPSBTZXF1ZW5jZU9mVWx0cmFzb3VuZFJlZ2lvbnM7XG4gICAgY29uc3QgVVNQaXhlbFNwYWNpbmcgPSBbUGh5c2ljYWxEZWx0YVggKiAxMCwgUGh5c2ljYWxEZWx0YVkgKiAxMF07XG5cbiAgICByZXR1cm4ge1xuICAgICAgUGl4ZWxTcGFjaW5nOiBVU1BpeGVsU3BhY2luZyxcbiAgICB9O1xuICB9IGVsc2UgaWYgKFxuICAgIFNlcXVlbmNlT2ZVbHRyYXNvdW5kUmVnaW9ucyAmJlxuICAgIEFycmF5LmlzQXJyYXkoU2VxdWVuY2VPZlVsdHJhc291bmRSZWdpb25zKSAmJlxuICAgIFNlcXVlbmNlT2ZVbHRyYXNvdW5kUmVnaW9ucy5sZW5ndGggPiAxXG4gICkge1xuICAgIGNvbnNvbGUud2FybihcbiAgICAgICdTZXF1ZW5jZSBvZiBVbHRyYXNvdW5kIFJlZ2lvbnMgPiBvbmUgZW50cnkuIFRoaXMgaXMgbm90IHlldCBpbXBsZW1lbnRlZCwgYWxsIG1lYXN1cmVtZW50cyB3aWxsIGJlIHNob3duIGluIHBpeGVscy4nLFxuICAgICk7XG4gIH0gZWxzZSBpZiAoIWlzUHJvamVjdGlvbiAmJiAhSW1hZ2VyUGl4ZWxTcGFjaW5nKSB7XG4gICAgLy8gSWYgb25seSBQaXhlbCBTcGFjaW5nIGlzIHByZXNlbnQsIGFuZCB0aGlzIGlzIG5vdCBhIHByb2plY3Rpb24gcmFkaW9ncmFwaCxcbiAgICAvLyB3ZSBjYW4gc3RvcCBoZXJlXG4gICAgcmV0dXJuIHtcbiAgICAgIFBpeGVsU3BhY2luZyxcbiAgICAgIHR5cGU6IFRZUEVTLk5PVF9BUFBMSUNBQkxFLFxuICAgICAgaXNQcm9qZWN0aW9uLFxuICAgIH07XG4gIH1cblxuICBjb25zb2xlLndhcm4oJ1Vua25vd24gY29tYmluYXRpb24gb2YgUGl4ZWxTcGFjaW5nIGFuZCBJbWFnZXJQaXhlbFNwYWNpbmcgaWRlbnRpZmllZC4gVW5hYmxlIHRvIGRldGVybWluZSBzcGFjaW5nLicpO1xufVxuIl19