UNPKG

@jacobsdigitalfactory/react-image-hotspots

Version:
569 lines (512 loc) 76.3 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _react = _interopRequireDefault(require("react")); var _propTypes = _interopRequireDefault(require("prop-types")); var _Hotspot = _interopRequireDefault(require("./Hotspot")); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); } function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(source, true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(source).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); } function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } var ImageHotspots = /*#__PURE__*/ function (_React$Component) { _inherits(ImageHotspots, _React$Component); function ImageHotspots(props) { var _this; _classCallCheck(this, ImageHotspots); _this = _possibleConstructorReturn(this, _getPrototypeOf(ImageHotspots).call(this, props)); _defineProperty(_assertThisInitialized(_this), "componentDidMount", function () { var _this$props = _this.props, hideFullscreenControl = _this$props.hideFullscreenControl, hideZoomControls = _this$props.hideZoomControls, hideMinimap = _this$props.hideMinimap, hotspots = _this$props.hotspots, background = _this$props.background; var _this$container$curre = _this.container.current, width = _this$container$curre.offsetWidth, height = _this$container$curre.offsetHeight; var orientation = width > height ? 'landscape' : 'portrait'; var ratio = orientation === 'landscape' ? width / height : height / width; _this.setState({ container: { width: width, height: height, ratio: ratio, orientation: orientation, background: background }, hideFullscreenControl: hideFullscreenControl, hideZoomControls: hideZoomControls, hideMinimap: hideMinimap, hotspots: hotspots }); window.addEventListener('resize', _this.onWindowResize); }); _defineProperty(_assertThisInitialized(_this), "componentWillUnmount", function () { window.removeEventListener('resize', _this.onWindowResize); }); _defineProperty(_assertThisInitialized(_this), "startDrag", function (event, element) { var cursorX = event.clientX; var cursorY = event.clientY; if (element === 'image') { _this.setState(function (state) { return _objectSpread({}, state, { cursorX: cursorX, cursorY: cursorY, dragging: true }); }); } else if (element === 'guide') {// TODO } event.preventDefault(); }); _defineProperty(_assertThisInitialized(_this), "whileDrag", function (event) { var _this$state = _this.state, image = _this$state.image, minimap = _this$state.minimap; var cursorX = event.clientX; var cursorY = event.clientY; var deltaX = cursorX - _this.state.cursorX; var deltaY = cursorY - _this.state.cursorY; var newOffsetX = image.offsetX + deltaX; var newOffsetY = image.offsetY + deltaY; _this.setState(function (state) { return _objectSpread({}, state, { cursorX: cursorX, cursorY: cursorY, image: _objectSpread({}, image, { offsetX: newOffsetX, offsetY: newOffsetY }), minimap: _objectSpread({}, minimap, { offsetX: -(minimap.width / image.width * newOffsetX), offsetY: -(minimap.height / image.height * newOffsetY) }) }); }); }); _defineProperty(_assertThisInitialized(_this), "stopDrag", function () { var _this$state2 = _this.state, container = _this$state2.container, image = _this$state2.image, minimap = _this$state2.minimap; var deltaX = container.width - image.width - image.offsetX; var deltaY = container.height - image.height - image.offsetY; var offsetXMax = container.orientation === image.orientation ? -Math.abs(image.width - container.width) : -Math.abs(container.width - image.width); var offsetYMax = container.orientation === image.orientation ? -Math.abs(container.height - image.height) : -Math.abs(image.height - container.height); _this.setState(function (state) { return _objectSpread({}, state, { image: _objectSpread({}, state.image, { offsetX: image.offsetX >= 0 ? 0 : deltaX >= 0 ? offsetXMax : image.offsetX, offsetY: image.offsetY >= 0 ? container.height > image.height ? container.height / 2 - image.height / 2 : 0 : deltaY >= 0 ? container.height > image.height ? container.height / 2 - image.height / 2 : offsetYMax : image.offsetY }), minimap: _objectSpread({}, state.minimap, { offsetX: image.offsetX >= 0 || image.width < container.width ? 0 : deltaX >= 0 ? -(minimap.height / image.height * offsetXMax) : -(minimap.height / image.height * image.offsetX), offsetY: image.offsetY >= 0 || image.height < container.height ? 0 : deltaY >= 0 ? -(minimap.height / image.height * offsetYMax) : -(minimap.height / image.height * image.offsetY) }), dragging: false }); }); }); _defineProperty(_assertThisInitialized(_this), "onImageLoad", function (_ref) { var image = _ref.target; var initialWidth = image.offsetWidth, initialHeight = image.offsetHeight; var _this$state3 = _this.state, container = _this$state3.container, minimap = _this$state3.minimap, hideZoomControls = _this$state3.hideZoomControls, hideMinimap = _this$state3.hideMinimap; var orientation = initialWidth > initialHeight ? 'landscape' : 'portrait'; var ratio = orientation === 'landscape' ? initialWidth / initialHeight : initialHeight / initialWidth; var width = container.orientation === orientation ? orientation === 'landscape' ? ratio >= container.ratio ? container.width // landscape image bigger than landscape container : container.height * ratio // landscape image smaller than landscape container : ratio >= container.ratio ? container.height / ratio // portrait image bigger than portrait container : container.width // portrait image smaller than portrait container : orientation === 'landscape' ? container.width // landscape image and portrait container : container.height / ratio; // portrait image and landscape container var height = container.orientation === orientation ? orientation === 'landscape' ? ratio >= container.ratio ? container.width / ratio // landscape image bigger than landscape container : container.height // landscape image smaller than landscape container : ratio >= container.ratio ? container.height // portrait image bigger than portrait container : container.width * ratio // portrait image smaller than portrait container : orientation === 'landscape' ? container.width / ratio // landscape image and portrait container : container.height; // portrait image and landscape container var resizable = initialWidth > width || initialHeight > height; _this.setState(function (prevState) { return _objectSpread({}, prevState, { image: _objectSpread({}, prevState.image, { initialWidth: initialWidth, initialHeight: initialHeight, width: width, height: height, scale: 1, ratio: ratio, orientation: orientation, offsetX: 0, offsetY: container.height / 2 - height / 2 }), minimap: _objectSpread({}, minimap, { width: orientation === 'landscape' ? minimap.initialSize : minimap.initialSize / ratio, height: orientation === 'portrait' ? minimap.initialSize : minimap.initialSize / ratio, guideWidth: orientation === 'landscape' ? minimap.initialSize : minimap.initialSize / ratio, guideHeight: orientation === 'portrait' ? minimap.initialSize : minimap.initialSize / ratio }), hideZoomControls: hideZoomControls || !resizable, hideMinimap: hideMinimap || !resizable, resizable: resizable, draggable: false }); }); }); _defineProperty(_assertThisInitialized(_this), "onWindowResize", function () { var _this$container$curre2 = _this.container.current, width = _this$container$curre2.offsetWidth, height = _this$container$curre2.offsetHeight; var orientation = width > height ? 'landscape' : 'portrait'; var ratio = orientation === 'landscape' ? width / height : height / width; _this.setState({ container: { width: width, height: height, ratio: ratio, orientation: orientation } }); _this.zoom(_this.state.image.scale); }); _defineProperty(_assertThisInitialized(_this), "toggleFullscreen", function () { var fullscreen = _this.state.fullscreen; if (!fullscreen) { _this.requestFullscreen(_this.container.current); _this.setState({ fullscreen: true }); } else { _this.exitFullscreen(); _this.setState({ fullscreen: false }); } }); _defineProperty(_assertThisInitialized(_this), "zoom", function (scale) { if (scale > 0) { var _this$state4 = _this.state, container = _this$state4.container, image = _this$state4.image, minimap = _this$state4.minimap; var width = container.orientation === image.orientation ? image.orientation === 'landscape' ? image.ratio >= container.ratio ? container.width * scale // landscape image bigger than landscape container : container.height * image.ratio * scale // landscape image smaller than landscape container : image.ratio >= container.ratio ? container.height / image.ratio * scale // portrait image bigger than portrait container : container.width * scale // portrait image smaller than portrait container : image.orientation === 'landscape' ? container.width * scale // landscape image and portrait container : container.height / image.ratio * scale; // portrait image and landscape container var height = container.orientation === image.orientation ? image.orientation === 'landscape' ? image.ratio >= container.ratio ? container.width / image.ratio * scale // landscape image bigger than landscape container : container.height * scale // landscape image smaller than landscape container : image.ratio >= container.ratio ? container.height * scale // portrait image bigger than portrait container : container.width * image.ratio * scale // portrait image smaller than portrait container : image.orientation === 'landscape' ? container.width / image.ratio * scale // landscape image and portrait container : container.height * scale; // portrait image and landscape container var guideWidth = container.width >= width ? minimap.width : minimap.width / (width / container.width); var guideHeight = container.height >= height ? minimap.height : minimap.height / (height / container.height); var deltaX = Math.round(width - image.width); var deltaY = Math.round(height - image.height); var guideDeltaX = Math.round(guideWidth - minimap.guideWidth); var guideDeltaY = Math.round(guideHeight - minimap.guideHeight); var offsetX = image.offsetX - deltaX / 2; var offsetY = image.offsetY - deltaY / 2; var guideOffsetX = Math.round(minimap.offsetX - guideDeltaX / 2); var guideOffsetY = Math.round(minimap.offsetY - guideDeltaY / 2); var offsetXMax = -Math.abs(Math.round(container.width - width)); var offsetYMax = -Math.abs(Math.round(container.height - height)); var guideOffsetXMax = Math.round(minimap.width - guideWidth); var guideOffsetYMax = Math.round(minimap.height - guideHeight); if (image.initialWidth > width && image.initialHeight > height) { _this.setState(function (prevState) { return { image: _objectSpread({}, prevState.image, { width: width, height: height, scale: scale, offsetX: offsetX >= 0 || container.width > width ? 0 : image.offsetX <= offsetXMax ? offsetXMax : offsetX, offsetY: container.height > height ? container.height / 2 - height / 2 : offsetY >= 0 ? 0 : image.offsetY < offsetYMax ? offsetYMax : offsetY }), minimap: _objectSpread({}, prevState.minimap, { guideWidth: guideWidth, guideHeight: guideHeight, offsetX: guideOffsetX <= 0 ? 0 : minimap.offsetX < guideOffsetXMax ? guideOffsetX : guideOffsetXMax, offsetY: guideOffsetY <= 0 || height < container.height ? 0 : minimap.offsetY < guideOffsetYMax ? guideOffsetY : guideOffsetYMax }), draggable: scale > 1 }; }); } // Reset image position if (scale === 1) { _this.setState(function (prevState) { return { image: _objectSpread({}, prevState.image, { offsetX: 0, offsetY: container.height / 2 - height / 2 }), minimap: _objectSpread({}, prevState.minimap, { offsetX: 0, offsetY: 0 }) }; }); } } }); _defineProperty(_assertThisInitialized(_this), "requestFullscreen", function (element) { if (element.requestFullscreen) { element.requestFullscreen(); } else if (element.mozRequestFullScreen) { element.mozRequestFullScreen(); } else if (element.webkitRequestFullscreen) { element.webkitRequestFullscreen(); } else if (element.msRequestFullscreen) { element.msRequestFullscreen(); } }); _defineProperty(_assertThisInitialized(_this), "exitFullscreen", function () { if (document.exitFullscreen) { document.exitFullscreen(); } else if (document.mozCancelFullScreen) { document.mozCancelFullScreen(); } else if (document.webkitExitFullscreen) { document.webkitExitFullscreen(); } else if (document.msExitFullscreen) { document.msExitFullscreen(); } }); _defineProperty(_assertThisInitialized(_this), "render", function () { var _this$props2 = _this.props, src = _this$props2.src, alt = _this$props2.alt, hotspots = _this$props2.hotspots, background = _this$props2.background; var _this$state5 = _this.state, container = _this$state5.container, image = _this$state5.image, minimap = _this$state5.minimap, fullscreen = _this$state5.fullscreen, dragging = _this$state5.dragging, hideFullscreenControl = _this$state5.hideFullscreenControl, hideZoomControls = _this$state5.hideZoomControls, hideMinimap = _this$state5.hideMinimap, draggable = _this$state5.draggable; var imageLoaded = image.initialWidth && image.initialHeight; var containerStyle = { width: '100%', height: '100%', position: 'relative', overflow: 'hidden', textAlign: 'center', background: background || container.background }; var imageStyle = { position: 'relative', left: image.offsetX, top: image.offsetY }; var hotspotsStyle = { position: 'absolute', top: image.offsetY, left: image.offsetX, right: image.offsetX >= 0 ? 0 : 'auto', margin: 'auto', pointerEvents: 'none' }; var topControlsStyle = { position: 'absolute', top: 10, right: 10, pointerEvents: _this.state.dragging ? 'none' : 'auto' }; var bottomControlsStyle = { position: 'absolute', bottom: 10, right: 10, pointerEvents: _this.state.dragging ? 'none' : 'auto' }; var buttonStyle = { width: '25px', height: '25px', border: 'none', background: '#fff', boxShadow: '0px 0px 2px 0px rgba(0,0,0,0.5)' }; var minimapStyle = { width: minimap.width, height: minimap.height, position: 'absolute', display: 'block', bottom: 10, left: 10, background: '#fff', boxShadow: '0px 0px 2px 0px rgba(0,0,0,0.5)', pointerEvents: 'none' }; var guideStyle = { width: minimap.guideWidth, height: minimap.guideHeight, position: 'absolute', display: 'block', left: minimap.offsetX, top: minimap.offsetY, border: '1px solid rgba(64, 139, 252, 0.8)', background: 'rgba(64, 139, 252, 0.1)', pointerEvents: 'none' }; if (imageLoaded) { if (container.orientation === 'landscape') { imageStyle.height = image.height; } else { imageStyle.width = image.width; } if (image.orientation === 'landscape') { hotspotsStyle.width = image.width; hotspotsStyle.height = image.width / image.ratio; } else { hotspotsStyle.width = image.height / image.ratio; hotspotsStyle.height = image.height; } } return _react["default"].createElement("div", { className: "react-image-hotspots", ref: _this.container, style: containerStyle, onMouseOut: function onMouseOut(event) { if (dragging) { _this.stopDrag(event); } }, onBlur: function onBlur(event) { if (dragging) { _this.stopDrag(event); } } }, src && _react["default"].createElement("img", { src: src, alt: alt, onLoad: _this.onImageLoad, style: imageStyle, onMouseDown: function onMouseDown(event) { if (!hideZoomControls && draggable) { _this.startDrag(event, 'image'); } }, onMouseMove: function onMouseMove(event) { if (!hideZoomControls && dragging) { _this.whileDrag(event); } }, onMouseUp: function onMouseUp(event) { if (dragging) { _this.stopDrag(event); } } }), hotspots && _react["default"].createElement("div", { style: hotspotsStyle }, hotspots.map(function (hotspot, i) { return _react["default"].createElement(_Hotspot["default"], _extends({ key: i }, hotspot)); })), !hideFullscreenControl && _react["default"].createElement("div", { style: topControlsStyle }, _react["default"].createElement("button", { style: buttonStyle, onClick: function onClick() { return _this.toggleFullscreen(); } }, fullscreen ? 'X' : 'FS')), !hideZoomControls && _react["default"].createElement(_react["default"].Fragment, null, _react["default"].createElement("div", { style: bottomControlsStyle }, draggable && _react["default"].createElement(_react["default"].Fragment, null, _react["default"].createElement("button", { style: buttonStyle, onClick: function onClick() { return _this.zoom(1); } }, "Fit"), _react["default"].createElement("br", null), _react["default"].createElement("br", null)), _react["default"].createElement("button", { style: buttonStyle, onClick: function onClick() { return _this.zoom(image.scale + 1); } }, "+"), _react["default"].createElement("br", null), _react["default"].createElement("button", { style: buttonStyle, onClick: function onClick() { return _this.zoom(image.scale - 1); } }, "-")), !hideMinimap && _react["default"].createElement("div", { style: minimapStyle }, src && _react["default"].createElement("img", { src: src, width: minimapStyle.width, height: minimapStyle.height }), _react["default"].createElement("div", { style: guideStyle })))); }); _this.state = { container: { width: undefined, height: undefined, ratio: undefined, orientation: undefined, background: undefined }, image: { initialWidth: undefined, initialHeight: undefined, width: undefined, height: undefined, scale: undefined, ratio: undefined, orientation: undefined, offsetX: undefined, offsetY: undefined }, minimap: { initialSize: 100, width: undefined, height: undefined, guideWidth: undefined, guideHeight: undefined, offsetX: 0, offsetY: 0 }, hideFullscreenControl: false, hideZoomControls: false, hideMinimap: false, resizable: undefined, draggable: undefined, cursorX: undefined, cursorY: undefined, mcursorX: undefined, mcursorY: undefined, dragging: undefined, isGuideDragging: undefined, hotspots: [] }; _this.container = _react["default"].createRef(); return _this; } return ImageHotspots; }(_react["default"].Component); ImageHotspots.propTypes = { src: _propTypes["default"].string, alt: _propTypes["default"].string, hotspots: _propTypes["default"].array }; var _default = ImageHotspots; exports["default"] = _default; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9JbWFnZUhvdHNwb3RzLmpzIl0sIm5hbWVzIjpbIkltYWdlSG90c3BvdHMiLCJwcm9wcyIsImhpZGVGdWxsc2NyZWVuQ29udHJvbCIsImhpZGVab29tQ29udHJvbHMiLCJoaWRlTWluaW1hcCIsImhvdHNwb3RzIiwiYmFja2dyb3VuZCIsImNvbnRhaW5lciIsImN1cnJlbnQiLCJ3aWR0aCIsIm9mZnNldFdpZHRoIiwiaGVpZ2h0Iiwib2Zmc2V0SGVpZ2h0Iiwib3JpZW50YXRpb24iLCJyYXRpbyIsInNldFN0YXRlIiwid2luZG93IiwiYWRkRXZlbnRMaXN0ZW5lciIsIm9uV2luZG93UmVzaXplIiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsImV2ZW50IiwiZWxlbWVudCIsImN1cnNvclgiLCJjbGllbnRYIiwiY3Vyc29yWSIsImNsaWVudFkiLCJzdGF0ZSIsImRyYWdnaW5nIiwicHJldmVudERlZmF1bHQiLCJpbWFnZSIsIm1pbmltYXAiLCJkZWx0YVgiLCJkZWx0YVkiLCJuZXdPZmZzZXRYIiwib2Zmc2V0WCIsIm5ld09mZnNldFkiLCJvZmZzZXRZIiwib2Zmc2V0WE1heCIsIk1hdGgiLCJhYnMiLCJvZmZzZXRZTWF4IiwidGFyZ2V0IiwiaW5pdGlhbFdpZHRoIiwiaW5pdGlhbEhlaWdodCIsInJlc2l6YWJsZSIsInByZXZTdGF0ZSIsInNjYWxlIiwiaW5pdGlhbFNpemUiLCJndWlkZVdpZHRoIiwiZ3VpZGVIZWlnaHQiLCJkcmFnZ2FibGUiLCJ6b29tIiwiZnVsbHNjcmVlbiIsInJlcXVlc3RGdWxsc2NyZWVuIiwiZXhpdEZ1bGxzY3JlZW4iLCJyb3VuZCIsImd1aWRlRGVsdGFYIiwiZ3VpZGVEZWx0YVkiLCJndWlkZU9mZnNldFgiLCJndWlkZU9mZnNldFkiLCJndWlkZU9mZnNldFhNYXgiLCJndWlkZU9mZnNldFlNYXgiLCJtb3pSZXF1ZXN0RnVsbFNjcmVlbiIsIndlYmtpdFJlcXVlc3RGdWxsc2NyZWVuIiwibXNSZXF1ZXN0RnVsbHNjcmVlbiIsImRvY3VtZW50IiwibW96Q2FuY2VsRnVsbFNjcmVlbiIsIndlYmtpdEV4aXRGdWxsc2NyZWVuIiwibXNFeGl0RnVsbHNjcmVlbiIsInNyYyIsImFsdCIsImltYWdlTG9hZGVkIiwiY29udGFpbmVyU3R5bGUiLCJwb3NpdGlvbiIsIm92ZXJmbG93IiwidGV4dEFsaWduIiwiaW1hZ2VTdHlsZSIsImxlZnQiLCJ0b3AiLCJob3RzcG90c1N0eWxlIiwicmlnaHQiLCJtYXJnaW4iLCJwb2ludGVyRXZlbnRzIiwidG9wQ29udHJvbHNTdHlsZSIsImJvdHRvbUNvbnRyb2xzU3R5bGUiLCJib3R0b20iLCJidXR0b25TdHlsZSIsImJvcmRlciIsImJveFNoYWRvdyIsIm1pbmltYXBTdHlsZSIsImRpc3BsYXkiLCJndWlkZVN0eWxlIiwic3RvcERyYWciLCJvbkltYWdlTG9hZCIsInN0YXJ0RHJhZyIsIndoaWxlRHJhZyIsIm1hcCIsImhvdHNwb3QiLCJpIiwidG9nZ2xlRnVsbHNjcmVlbiIsInVuZGVmaW5lZCIsIm1jdXJzb3JYIiwibWN1cnNvclkiLCJpc0d1aWRlRHJhZ2dpbmciLCJSZWFjdCIsImNyZWF0ZVJlZiIsIkNvbXBvbmVudCIsInByb3BUeXBlcyIsIlByb3BUeXBlcyIsInN0cmluZyIsImFycmF5Il0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0lBRU1BLGE7Ozs7O0FBQ0oseUJBQWFDLEtBQWIsRUFBb0I7QUFBQTs7QUFBQTs7QUFDbEIsdUZBQU1BLEtBQU47O0FBRGtCLHdFQWdEQSxZQUFNO0FBQUEsd0JBT3BCLE1BQUtBLEtBUGU7QUFBQSxVQUV0QkMscUJBRnNCLGVBRXRCQSxxQkFGc0I7QUFBQSxVQUd0QkMsZ0JBSHNCLGVBR3RCQSxnQkFIc0I7QUFBQSxVQUl0QkMsV0FKc0IsZUFJdEJBLFdBSnNCO0FBQUEsVUFLdEJDLFFBTHNCLGVBS3RCQSxRQUxzQjtBQUFBLFVBTXRCQyxVQU5zQixlQU10QkEsVUFOc0I7QUFBQSxr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