{"version":3,"file":"cropperjs-BY_-nzPR.js","sources":["../../node_modules/cropperjs/dist/cropper.esm.js"],"sourcesContent":["/*!\n * Cropper.js v1.6.2\n * https://fengyuanchen.github.io/cropperjs\n *\n * Copyright 2015-present Chen Fengyuan\n * Released under the MIT license\n *\n * Date: 2024-04-21T07:43:05.335Z\n */\n\nfunction ownKeys(e, r) {\n var t = Object.keys(e);\n if (Object.getOwnPropertySymbols) {\n var o = Object.getOwnPropertySymbols(e);\n r && (o = o.filter(function (r) {\n return Object.getOwnPropertyDescriptor(e, r).enumerable;\n })), t.push.apply(t, o);\n }\n return t;\n}\nfunction _objectSpread2(e) {\n for (var r = 1; r < arguments.length; r++) {\n var t = null != arguments[r] ? arguments[r] : {};\n r % 2 ? ownKeys(Object(t), !0).forEach(function (r) {\n _defineProperty(e, r, t[r]);\n }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) {\n Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r));\n });\n }\n return e;\n}\nfunction _toPrimitive(t, r) {\n if (\"object\" != typeof t || !t) return t;\n var e = t[Symbol.toPrimitive];\n if (void 0 !== e) {\n var i = e.call(t, r || \"default\");\n if (\"object\" != typeof i) return i;\n throw new TypeError(\"@@toPrimitive must return a primitive value.\");\n }\n return (\"string\" === r ? String : Number)(t);\n}\nfunction _toPropertyKey(t) {\n var i = _toPrimitive(t, \"string\");\n return \"symbol\" == typeof i ? i : i + \"\";\n}\nfunction _typeof(o) {\n \"@babel/helpers - typeof\";\n\n return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) {\n return typeof o;\n } : function (o) {\n return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o;\n }, _typeof(o);\n}\nfunction _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n}\nfunction _defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor);\n }\n}\nfunction _createClass(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n Object.defineProperty(Constructor, \"prototype\", {\n writable: false\n });\n return Constructor;\n}\nfunction _defineProperty(obj, key, value) {\n key = _toPropertyKey(key);\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n return obj;\n}\nfunction _toConsumableArray(arr) {\n return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread();\n}\nfunction _arrayWithoutHoles(arr) {\n if (Array.isArray(arr)) return _arrayLikeToArray(arr);\n}\nfunction _iterableToArray(iter) {\n if (typeof Symbol !== \"undefined\" && iter[Symbol.iterator] != null || iter[\"@@iterator\"] != null) return Array.from(iter);\n}\nfunction _unsupportedIterableToArray(o, minLen) {\n if (!o) return;\n if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n var n = Object.prototype.toString.call(o).slice(8, -1);\n if (n === \"Object\" && o.constructor) n = o.constructor.name;\n if (n === \"Map\" || n === \"Set\") return Array.from(o);\n if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n}\nfunction _arrayLikeToArray(arr, len) {\n if (len == null || len > arr.length) len = arr.length;\n for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];\n return arr2;\n}\nfunction _nonIterableSpread() {\n throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\n\nvar IS_BROWSER = typeof window !== 'undefined' && typeof window.document !== 'undefined';\nvar WINDOW = IS_BROWSER ? window : {};\nvar IS_TOUCH_DEVICE = IS_BROWSER && WINDOW.document.documentElement ? 'ontouchstart' in WINDOW.document.documentElement : false;\nvar HAS_POINTER_EVENT = IS_BROWSER ? 'PointerEvent' in WINDOW : false;\nvar NAMESPACE = 'cropper';\n\n// Actions\nvar ACTION_ALL = 'all';\nvar ACTION_CROP = 'crop';\nvar ACTION_MOVE = 'move';\nvar ACTION_ZOOM = 'zoom';\nvar ACTION_EAST = 'e';\nvar ACTION_WEST = 'w';\nvar ACTION_SOUTH = 's';\nvar ACTION_NORTH = 'n';\nvar ACTION_NORTH_EAST = 'ne';\nvar ACTION_NORTH_WEST = 'nw';\nvar ACTION_SOUTH_EAST = 'se';\nvar ACTION_SOUTH_WEST = 'sw';\n\n// Classes\nvar CLASS_CROP = \"\".concat(NAMESPACE, \"-crop\");\nvar CLASS_DISABLED = \"\".concat(NAMESPACE, \"-disabled\");\nvar CLASS_HIDDEN = \"\".concat(NAMESPACE, \"-hidden\");\nvar CLASS_HIDE = \"\".concat(NAMESPACE, \"-hide\");\nvar CLASS_INVISIBLE = \"\".concat(NAMESPACE, \"-invisible\");\nvar CLASS_MODAL = \"\".concat(NAMESPACE, \"-modal\");\nvar CLASS_MOVE = \"\".concat(NAMESPACE, \"-move\");\n\n// Data keys\nvar DATA_ACTION = \"\".concat(NAMESPACE, \"Action\");\nvar DATA_PREVIEW = \"\".concat(NAMESPACE, \"Preview\");\n\n// Drag modes\nvar DRAG_MODE_CROP = 'crop';\nvar DRAG_MODE_MOVE = 'move';\nvar DRAG_MODE_NONE = 'none';\n\n// Events\nvar EVENT_CROP = 'crop';\nvar EVENT_CROP_END = 'cropend';\nvar EVENT_CROP_MOVE = 'cropmove';\nvar EVENT_CROP_START = 'cropstart';\nvar EVENT_DBLCLICK = 'dblclick';\nvar EVENT_TOUCH_START = IS_TOUCH_DEVICE ? 'touchstart' : 'mousedown';\nvar EVENT_TOUCH_MOVE = IS_TOUCH_DEVICE ? 'touchmove' : 'mousemove';\nvar EVENT_TOUCH_END = IS_TOUCH_DEVICE ? 'touchend touchcancel' : 'mouseup';\nvar EVENT_POINTER_DOWN = HAS_POINTER_EVENT ? 'pointerdown' : EVENT_TOUCH_START;\nvar EVENT_POINTER_MOVE = HAS_POINTER_EVENT ? 'pointermove' : EVENT_TOUCH_MOVE;\nvar EVENT_POINTER_UP = HAS_POINTER_EVENT ? 'pointerup pointercancel' : EVENT_TOUCH_END;\nvar EVENT_READY = 'ready';\nvar EVENT_RESIZE = 'resize';\nvar EVENT_WHEEL = 'wheel';\nvar EVENT_ZOOM = 'zoom';\n\n// Mime types\nvar MIME_TYPE_JPEG = 'image/jpeg';\n\n// RegExps\nvar REGEXP_ACTIONS = /^e|w|s|n|se|sw|ne|nw|all|crop|move|zoom$/;\nvar REGEXP_DATA_URL = /^data:/;\nvar REGEXP_DATA_URL_JPEG = /^data:image\\/jpeg;base64,/;\nvar REGEXP_TAG_NAME = /^img|canvas$/i;\n\n// Misc\n// Inspired by the default width and height of a canvas element.\nvar MIN_CONTAINER_WIDTH = 200;\nvar MIN_CONTAINER_HEIGHT = 100;\n\nvar DEFAULTS = {\n // Define the view mode of the cropper\n viewMode: 0,\n // 0, 1, 2, 3\n\n // Define the dragging mode of the cropper\n dragMode: DRAG_MODE_CROP,\n // 'crop', 'move' or 'none'\n\n // Define the initial aspect ratio of the crop box\n initialAspectRatio: NaN,\n // Define the aspect ratio of the crop box\n aspectRatio: NaN,\n // An object with the previous cropping result data\n data: null,\n // A selector for adding extra containers to preview\n preview: '',\n // Re-render the cropper when resize the window\n responsive: true,\n // Restore the cropped area after resize the window\n restore: true,\n // Check if the current image is a cross-origin image\n checkCrossOrigin: true,\n // Check the current image's Exif Orientation information\n checkOrientation: true,\n // Show the black modal\n modal: true,\n // Show the dashed lines for guiding\n guides: true,\n // Show the center indicator for guiding\n center: true,\n // Show the white modal to highlight the crop box\n highlight: true,\n // Show the grid background\n background: true,\n // Enable to crop the image automatically when initialize\n autoCrop: true,\n // Define the percentage of automatic cropping area when initializes\n autoCropArea: 0.8,\n // Enable to move the image\n movable: true,\n // Enable to rotate the image\n rotatable: true,\n // Enable to scale the image\n scalable: true,\n // Enable to zoom the image\n zoomable: true,\n // Enable to zoom the image by dragging touch\n zoomOnTouch: true,\n // Enable to zoom the image by wheeling mouse\n zoomOnWheel: true,\n // Define zoom ratio when zoom the image by wheeling mouse\n wheelZoomRatio: 0.1,\n // Enable to move the crop box\n cropBoxMovable: true,\n // Enable to resize the crop box\n cropBoxResizable: true,\n // Toggle drag mode between \"crop\" and \"move\" when click twice on the cropper\n toggleDragModeOnDblclick: true,\n // Size limitation\n minCanvasWidth: 0,\n minCanvasHeight: 0,\n minCropBoxWidth: 0,\n minCropBoxHeight: 0,\n minContainerWidth: MIN_CONTAINER_WIDTH,\n minContainerHeight: MIN_CONTAINER_HEIGHT,\n // Shortcuts of events\n ready: null,\n cropstart: null,\n cropmove: null,\n cropend: null,\n crop: null,\n zoom: null\n};\n\nvar TEMPLATE = '
' + '
' + '
' + '
' + '
' + '
' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '
' + '
';\n\n/**\n * Check if the given value is not a number.\n */\nvar isNaN = Number.isNaN || WINDOW.isNaN;\n\n/**\n * Check if the given value is a number.\n * @param {*} value - The value to check.\n * @returns {boolean} Returns `true` if the given value is a number, else `false`.\n */\nfunction isNumber(value) {\n return typeof value === 'number' && !isNaN(value);\n}\n\n/**\n * Check if the given value is a positive number.\n * @param {*} value - The value to check.\n * @returns {boolean} Returns `true` if the given value is a positive number, else `false`.\n */\nvar isPositiveNumber = function isPositiveNumber(value) {\n return value > 0 && value < Infinity;\n};\n\n/**\n * Check if the given value is undefined.\n * @param {*} value - The value to check.\n * @returns {boolean} Returns `true` if the given value is undefined, else `false`.\n */\nfunction isUndefined(value) {\n return typeof value === 'undefined';\n}\n\n/**\n * Check if the given value is an object.\n * @param {*} value - The value to check.\n * @returns {boolean} Returns `true` if the given value is an object, else `false`.\n */\nfunction isObject(value) {\n return _typeof(value) === 'object' && value !== null;\n}\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\n\n/**\n * Check if the given value is a plain object.\n * @param {*} value - The value to check.\n * @returns {boolean} Returns `true` if the given value is a plain object, else `false`.\n */\nfunction isPlainObject(value) {\n if (!isObject(value)) {\n return false;\n }\n try {\n var _constructor = value.constructor;\n var prototype = _constructor.prototype;\n return _constructor && prototype && hasOwnProperty.call(prototype, 'isPrototypeOf');\n } catch (error) {\n return false;\n }\n}\n\n/**\n * Check if the given value is a function.\n * @param {*} value - The value to check.\n * @returns {boolean} Returns `true` if the given value is a function, else `false`.\n */\nfunction isFunction(value) {\n return typeof value === 'function';\n}\nvar slice = Array.prototype.slice;\n\n/**\n * Convert array-like or iterable object to an array.\n * @param {*} value - The value to convert.\n * @returns {Array} Returns a new array.\n */\nfunction toArray(value) {\n return Array.from ? Array.from(value) : slice.call(value);\n}\n\n/**\n * Iterate the given data.\n * @param {*} data - The data to iterate.\n * @param {Function} callback - The process function for each element.\n * @returns {*} The original data.\n */\nfunction forEach(data, callback) {\n if (data && isFunction(callback)) {\n if (Array.isArray(data) || isNumber(data.length) /* array-like */) {\n toArray(data).forEach(function (value, key) {\n callback.call(data, value, key, data);\n });\n } else if (isObject(data)) {\n Object.keys(data).forEach(function (key) {\n callback.call(data, data[key], key, data);\n });\n }\n }\n return data;\n}\n\n/**\n * Extend the given object.\n * @param {*} target - The target object to extend.\n * @param {*} args - The rest objects for merging to the target object.\n * @returns {Object} The extended object.\n */\nvar assign = Object.assign || function assign(target) {\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n if (isObject(target) && args.length > 0) {\n args.forEach(function (arg) {\n if (isObject(arg)) {\n Object.keys(arg).forEach(function (key) {\n target[key] = arg[key];\n });\n }\n });\n }\n return target;\n};\nvar REGEXP_DECIMALS = /\\.\\d*(?:0|9){12}\\d*$/;\n\n/**\n * Normalize decimal number.\n * Check out {@link https://0.30000000000000004.com/}\n * @param {number} value - The value to normalize.\n * @param {number} [times=100000000000] - The times for normalizing.\n * @returns {number} Returns the normalized number.\n */\nfunction normalizeDecimalNumber(value) {\n var times = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 100000000000;\n return REGEXP_DECIMALS.test(value) ? Math.round(value * times) / times : value;\n}\nvar REGEXP_SUFFIX = /^width|height|left|top|marginLeft|marginTop$/;\n\n/**\n * Apply styles to the given element.\n * @param {Element} element - The target element.\n * @param {Object} styles - The styles for applying.\n */\nfunction setStyle(element, styles) {\n var style = element.style;\n forEach(styles, function (value, property) {\n if (REGEXP_SUFFIX.test(property) && isNumber(value)) {\n value = \"\".concat(value, \"px\");\n }\n style[property] = value;\n });\n}\n\n/**\n * Check if the given element has a special class.\n * @param {Element} element - The element to check.\n * @param {string} value - The class to search.\n * @returns {boolean} Returns `true` if the special class was found.\n */\nfunction hasClass(element, value) {\n return element.classList ? element.classList.contains(value) : element.className.indexOf(value) > -1;\n}\n\n/**\n * Add classes to the given element.\n * @param {Element} element - The target element.\n * @param {string} value - The classes to be added.\n */\nfunction addClass(element, value) {\n if (!value) {\n return;\n }\n if (isNumber(element.length)) {\n forEach(element, function (elem) {\n addClass(elem, value);\n });\n return;\n }\n if (element.classList) {\n element.classList.add(value);\n return;\n }\n var className = element.className.trim();\n if (!className) {\n element.className = value;\n } else if (className.indexOf(value) < 0) {\n element.className = \"\".concat(className, \" \").concat(value);\n }\n}\n\n/**\n * Remove classes from the given element.\n * @param {Element} element - The target element.\n * @param {string} value - The classes to be removed.\n */\nfunction removeClass(element, value) {\n if (!value) {\n return;\n }\n if (isNumber(element.length)) {\n forEach(element, function (elem) {\n removeClass(elem, value);\n });\n return;\n }\n if (element.classList) {\n element.classList.remove(value);\n return;\n }\n if (element.className.indexOf(value) >= 0) {\n element.className = element.className.replace(value, '');\n }\n}\n\n/**\n * Add or remove classes from the given element.\n * @param {Element} element - The target element.\n * @param {string} value - The classes to be toggled.\n * @param {boolean} added - Add only.\n */\nfunction toggleClass(element, value, added) {\n if (!value) {\n return;\n }\n if (isNumber(element.length)) {\n forEach(element, function (elem) {\n toggleClass(elem, value, added);\n });\n return;\n }\n\n // IE10-11 doesn't support the second parameter of `classList.toggle`\n if (added) {\n addClass(element, value);\n } else {\n removeClass(element, value);\n }\n}\nvar REGEXP_CAMEL_CASE = /([a-z\\d])([A-Z])/g;\n\n/**\n * Transform the given string from camelCase to kebab-case\n * @param {string} value - The value to transform.\n * @returns {string} The transformed value.\n */\nfunction toParamCase(value) {\n return value.replace(REGEXP_CAMEL_CASE, '$1-$2').toLowerCase();\n}\n\n/**\n * Get data from the given element.\n * @param {Element} element - The target element.\n * @param {string} name - The data key to get.\n * @returns {string} The data value.\n */\nfunction getData(element, name) {\n if (isObject(element[name])) {\n return element[name];\n }\n if (element.dataset) {\n return element.dataset[name];\n }\n return element.getAttribute(\"data-\".concat(toParamCase(name)));\n}\n\n/**\n * Set data to the given element.\n * @param {Element} element - The target element.\n * @param {string} name - The data key to set.\n * @param {string} data - The data value.\n */\nfunction setData(element, name, data) {\n if (isObject(data)) {\n element[name] = data;\n } else if (element.dataset) {\n element.dataset[name] = data;\n } else {\n element.setAttribute(\"data-\".concat(toParamCase(name)), data);\n }\n}\n\n/**\n * Remove data from the given element.\n * @param {Element} element - The target element.\n * @param {string} name - The data key to remove.\n */\nfunction removeData(element, name) {\n if (isObject(element[name])) {\n try {\n delete element[name];\n } catch (error) {\n element[name] = undefined;\n }\n } else if (element.dataset) {\n // #128 Safari not allows to delete dataset property\n try {\n delete element.dataset[name];\n } catch (error) {\n element.dataset[name] = undefined;\n }\n } else {\n element.removeAttribute(\"data-\".concat(toParamCase(name)));\n }\n}\nvar REGEXP_SPACES = /\\s\\s*/;\nvar onceSupported = function () {\n var supported = false;\n if (IS_BROWSER) {\n var once = false;\n var listener = function listener() {};\n var options = Object.defineProperty({}, 'once', {\n get: function get() {\n supported = true;\n return once;\n },\n /**\n * This setter can fix a `TypeError` in strict mode\n * {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Errors/Getter_only}\n * @param {boolean} value - The value to set\n */\n set: function set(value) {\n once = value;\n }\n });\n WINDOW.addEventListener('test', listener, options);\n WINDOW.removeEventListener('test', listener, options);\n }\n return supported;\n}();\n\n/**\n * Remove event listener from the target element.\n * @param {Element} element - The event target.\n * @param {string} type - The event type(s).\n * @param {Function} listener - The event listener.\n * @param {Object} options - The event options.\n */\nfunction removeListener(element, type, listener) {\n var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};\n var handler = listener;\n type.trim().split(REGEXP_SPACES).forEach(function (event) {\n if (!onceSupported) {\n var listeners = element.listeners;\n if (listeners && listeners[event] && listeners[event][listener]) {\n handler = listeners[event][listener];\n delete listeners[event][listener];\n if (Object.keys(listeners[event]).length === 0) {\n delete listeners[event];\n }\n if (Object.keys(listeners).length === 0) {\n delete element.listeners;\n }\n }\n }\n element.removeEventListener(event, handler, options);\n });\n}\n\n/**\n * Add event listener to the target element.\n * @param {Element} element - The event target.\n * @param {string} type - The event type(s).\n * @param {Function} listener - The event listener.\n * @param {Object} options - The event options.\n */\nfunction addListener(element, type, listener) {\n var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};\n var _handler = listener;\n type.trim().split(REGEXP_SPACES).forEach(function (event) {\n if (options.once && !onceSupported) {\n var _element$listeners = element.listeners,\n listeners = _element$listeners === void 0 ? {} : _element$listeners;\n _handler = function handler() {\n delete listeners[event][listener];\n element.removeEventListener(event, _handler, options);\n for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n args[_key2] = arguments[_key2];\n }\n listener.apply(element, args);\n };\n if (!listeners[event]) {\n listeners[event] = {};\n }\n if (listeners[event][listener]) {\n element.removeEventListener(event, listeners[event][listener], options);\n }\n listeners[event][listener] = _handler;\n element.listeners = listeners;\n }\n element.addEventListener(event, _handler, options);\n });\n}\n\n/**\n * Dispatch event on the target element.\n * @param {Element} element - The event target.\n * @param {string} type - The event type(s).\n * @param {Object} data - The additional event data.\n * @returns {boolean} Indicate if the event is default prevented or not.\n */\nfunction dispatchEvent(element, type, data) {\n var event;\n\n // Event and CustomEvent on IE9-11 are global objects, not constructors\n if (isFunction(Event) && isFunction(CustomEvent)) {\n event = new CustomEvent(type, {\n detail: data,\n bubbles: true,\n cancelable: true\n });\n } else {\n event = document.createEvent('CustomEvent');\n event.initCustomEvent(type, true, true, data);\n }\n return element.dispatchEvent(event);\n}\n\n/**\n * Get the offset base on the document.\n * @param {Element} element - The target element.\n * @returns {Object} The offset data.\n */\nfunction getOffset(element) {\n var box = element.getBoundingClientRect();\n return {\n left: box.left + (window.pageXOffset - document.documentElement.clientLeft),\n top: box.top + (window.pageYOffset - document.documentElement.clientTop)\n };\n}\nvar location = WINDOW.location;\nvar REGEXP_ORIGINS = /^(\\w+:)\\/\\/([^:/?#]*):?(\\d*)/i;\n\n/**\n * Check if the given URL is a cross origin URL.\n * @param {string} url - The target URL.\n * @returns {boolean} Returns `true` if the given URL is a cross origin URL, else `false`.\n */\nfunction isCrossOriginURL(url) {\n var parts = url.match(REGEXP_ORIGINS);\n return parts !== null && (parts[1] !== location.protocol || parts[2] !== location.hostname || parts[3] !== location.port);\n}\n\n/**\n * Add timestamp to the given URL.\n * @param {string} url - The target URL.\n * @returns {string} The result URL.\n */\nfunction addTimestamp(url) {\n var timestamp = \"timestamp=\".concat(new Date().getTime());\n return url + (url.indexOf('?') === -1 ? '?' : '&') + timestamp;\n}\n\n/**\n * Get transforms base on the given object.\n * @param {Object} obj - The target object.\n * @returns {string} A string contains transform values.\n */\nfunction getTransforms(_ref) {\n var rotate = _ref.rotate,\n scaleX = _ref.scaleX,\n scaleY = _ref.scaleY,\n translateX = _ref.translateX,\n translateY = _ref.translateY;\n var values = [];\n if (isNumber(translateX) && translateX !== 0) {\n values.push(\"translateX(\".concat(translateX, \"px)\"));\n }\n if (isNumber(translateY) && translateY !== 0) {\n values.push(\"translateY(\".concat(translateY, \"px)\"));\n }\n\n // Rotate should come first before scale to match orientation transform\n if (isNumber(rotate) && rotate !== 0) {\n values.push(\"rotate(\".concat(rotate, \"deg)\"));\n }\n if (isNumber(scaleX) && scaleX !== 1) {\n values.push(\"scaleX(\".concat(scaleX, \")\"));\n }\n if (isNumber(scaleY) && scaleY !== 1) {\n values.push(\"scaleY(\".concat(scaleY, \")\"));\n }\n var transform = values.length ? values.join(' ') : 'none';\n return {\n WebkitTransform: transform,\n msTransform: transform,\n transform: transform\n };\n}\n\n/**\n * Get the max ratio of a group of pointers.\n * @param {string} pointers - The target pointers.\n * @returns {number} The result ratio.\n */\nfunction getMaxZoomRatio(pointers) {\n var pointers2 = _objectSpread2({}, pointers);\n var maxRatio = 0;\n forEach(pointers, function (pointer, pointerId) {\n delete pointers2[pointerId];\n forEach(pointers2, function (pointer2) {\n var x1 = Math.abs(pointer.startX - pointer2.startX);\n var y1 = Math.abs(pointer.startY - pointer2.startY);\n var x2 = Math.abs(pointer.endX - pointer2.endX);\n var y2 = Math.abs(pointer.endY - pointer2.endY);\n var z1 = Math.sqrt(x1 * x1 + y1 * y1);\n var z2 = Math.sqrt(x2 * x2 + y2 * y2);\n var ratio = (z2 - z1) / z1;\n if (Math.abs(ratio) > Math.abs(maxRatio)) {\n maxRatio = ratio;\n }\n });\n });\n return maxRatio;\n}\n\n/**\n * Get a pointer from an event object.\n * @param {Object} event - The target event object.\n * @param {boolean} endOnly - Indicates if only returns the end point coordinate or not.\n * @returns {Object} The result pointer contains start and/or end point coordinates.\n */\nfunction getPointer(_ref2, endOnly) {\n var pageX = _ref2.pageX,\n pageY = _ref2.pageY;\n var end = {\n endX: pageX,\n endY: pageY\n };\n return endOnly ? end : _objectSpread2({\n startX: pageX,\n startY: pageY\n }, end);\n}\n\n/**\n * Get the center point coordinate of a group of pointers.\n * @param {Object} pointers - The target pointers.\n * @returns {Object} The center point coordinate.\n */\nfunction getPointersCenter(pointers) {\n var pageX = 0;\n var pageY = 0;\n var count = 0;\n forEach(pointers, function (_ref3) {\n var startX = _ref3.startX,\n startY = _ref3.startY;\n pageX += startX;\n pageY += startY;\n count += 1;\n });\n pageX /= count;\n pageY /= count;\n return {\n pageX: pageX,\n pageY: pageY\n };\n}\n\n/**\n * Get the max sizes in a rectangle under the given aspect ratio.\n * @param {Object} data - The original sizes.\n * @param {string} [type='contain'] - The adjust type.\n * @returns {Object} The result sizes.\n */\nfunction getAdjustedSizes(_ref4) {\n var aspectRatio = _ref4.aspectRatio,\n height = _ref4.height,\n width = _ref4.width;\n var type = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'contain';\n var isValidWidth = isPositiveNumber(width);\n var isValidHeight = isPositiveNumber(height);\n if (isValidWidth && isValidHeight) {\n var adjustedWidth = height * aspectRatio;\n if (type === 'contain' && adjustedWidth > width || type === 'cover' && adjustedWidth < width) {\n height = width / aspectRatio;\n } else {\n width = height * aspectRatio;\n }\n } else if (isValidWidth) {\n height = width / aspectRatio;\n } else if (isValidHeight) {\n width = height * aspectRatio;\n }\n return {\n width: width,\n height: height\n };\n}\n\n/**\n * Get the new sizes of a rectangle after rotated.\n * @param {Object} data - The original sizes.\n * @returns {Object} The result sizes.\n */\nfunction getRotatedSizes(_ref5) {\n var width = _ref5.width,\n height = _ref5.height,\n degree = _ref5.degree;\n degree = Math.abs(degree) % 180;\n if (degree === 90) {\n return {\n width: height,\n height: width\n };\n }\n var arc = degree % 90 * Math.PI / 180;\n var sinArc = Math.sin(arc);\n var cosArc = Math.cos(arc);\n var newWidth = width * cosArc + height * sinArc;\n var newHeight = width * sinArc + height * cosArc;\n return degree > 90 ? {\n width: newHeight,\n height: newWidth\n } : {\n width: newWidth,\n height: newHeight\n };\n}\n\n/**\n * Get a canvas which drew the given image.\n * @param {HTMLImageElement} image - The image for drawing.\n * @param {Object} imageData - The image data.\n * @param {Object} canvasData - The canvas data.\n * @param {Object} options - The options.\n * @returns {HTMLCanvasElement} The result canvas.\n */\nfunction getSourceCanvas(image, _ref6, _ref7, _ref8) {\n var imageAspectRatio = _ref6.aspectRatio,\n imageNaturalWidth = _ref6.naturalWidth,\n imageNaturalHeight = _ref6.naturalHeight,\n _ref6$rotate = _ref6.rotate,\n rotate = _ref6$rotate === void 0 ? 0 : _ref6$rotate,\n _ref6$scaleX = _ref6.scaleX,\n scaleX = _ref6$scaleX === void 0 ? 1 : _ref6$scaleX,\n _ref6$scaleY = _ref6.scaleY,\n scaleY = _ref6$scaleY === void 0 ? 1 : _ref6$scaleY;\n var aspectRatio = _ref7.aspectRatio,\n naturalWidth = _ref7.naturalWidth,\n naturalHeight = _ref7.naturalHeight;\n var _ref8$fillColor = _ref8.fillColor,\n fillColor = _ref8$fillColor === void 0 ? 'transparent' : _ref8$fillColor,\n _ref8$imageSmoothingE = _ref8.imageSmoothingEnabled,\n imageSmoothingEnabled = _ref8$imageSmoothingE === void 0 ? true : _ref8$imageSmoothingE,\n _ref8$imageSmoothingQ = _ref8.imageSmoothingQuality,\n imageSmoothingQuality = _ref8$imageSmoothingQ === void 0 ? 'low' : _ref8$imageSmoothingQ,\n _ref8$maxWidth = _ref8.maxWidth,\n maxWidth = _ref8$maxWidth === void 0 ? Infinity : _ref8$maxWidth,\n _ref8$maxHeight = _ref8.maxHeight,\n maxHeight = _ref8$maxHeight === void 0 ? Infinity : _ref8$maxHeight,\n _ref8$minWidth = _ref8.minWidth,\n minWidth = _ref8$minWidth === void 0 ? 0 : _ref8$minWidth,\n _ref8$minHeight = _ref8.minHeight,\n minHeight = _ref8$minHeight === void 0 ? 0 : _ref8$minHeight;\n var canvas = document.createElement('canvas');\n var context = canvas.getContext('2d');\n var maxSizes = getAdjustedSizes({\n aspectRatio: aspectRatio,\n width: maxWidth,\n height: maxHeight\n });\n var minSizes = getAdjustedSizes({\n aspectRatio: aspectRatio,\n width: minWidth,\n height: minHeight\n }, 'cover');\n var width = Math.min(maxSizes.width, Math.max(minSizes.width, naturalWidth));\n var height = Math.min(maxSizes.height, Math.max(minSizes.height, naturalHeight));\n\n // Note: should always use image's natural sizes for drawing as\n // imageData.naturalWidth === canvasData.naturalHeight when rotate % 180 === 90\n var destMaxSizes = getAdjustedSizes({\n aspectRatio: imageAspectRatio,\n width: maxWidth,\n height: maxHeight\n });\n var destMinSizes = getAdjustedSizes({\n aspectRatio: imageAspectRatio,\n width: minWidth,\n height: minHeight\n }, 'cover');\n var destWidth = Math.min(destMaxSizes.width, Math.max(destMinSizes.width, imageNaturalWidth));\n var destHeight = Math.min(destMaxSizes.height, Math.max(destMinSizes.height, imageNaturalHeight));\n var params = [-destWidth / 2, -destHeight / 2, destWidth, destHeight];\n canvas.width = normalizeDecimalNumber(width);\n canvas.height = normalizeDecimalNumber(height);\n context.fillStyle = fillColor;\n context.fillRect(0, 0, width, height);\n context.save();\n context.translate(width / 2, height / 2);\n context.rotate(rotate * Math.PI / 180);\n context.scale(scaleX, scaleY);\n context.imageSmoothingEnabled = imageSmoothingEnabled;\n context.imageSmoothingQuality = imageSmoothingQuality;\n context.drawImage.apply(context, [image].concat(_toConsumableArray(params.map(function (param) {\n return Math.floor(normalizeDecimalNumber(param));\n }))));\n context.restore();\n return canvas;\n}\nvar fromCharCode = String.fromCharCode;\n\n/**\n * Get string from char code in data view.\n * @param {DataView} dataView - The data view for read.\n * @param {number} start - The start index.\n * @param {number} length - The read length.\n * @returns {string} The read result.\n */\nfunction getStringFromCharCode(dataView, start, length) {\n var str = '';\n length += start;\n for (var i = start; i < length; i += 1) {\n str += fromCharCode(dataView.getUint8(i));\n }\n return str;\n}\nvar REGEXP_DATA_URL_HEAD = /^data:.*,/;\n\n/**\n * Transform Data URL to array buffer.\n * @param {string} dataURL - The Data URL to transform.\n * @returns {ArrayBuffer} The result array buffer.\n */\nfunction dataURLToArrayBuffer(dataURL) {\n var base64 = dataURL.replace(REGEXP_DATA_URL_HEAD, '');\n var binary = atob(base64);\n var arrayBuffer = new ArrayBuffer(binary.length);\n var uint8 = new Uint8Array(arrayBuffer);\n forEach(uint8, function (value, i) {\n uint8[i] = binary.charCodeAt(i);\n });\n return arrayBuffer;\n}\n\n/**\n * Transform array buffer to Data URL.\n * @param {ArrayBuffer} arrayBuffer - The array buffer to transform.\n * @param {string} mimeType - The mime type of the Data URL.\n * @returns {string} The result Data URL.\n */\nfunction arrayBufferToDataURL(arrayBuffer, mimeType) {\n var chunks = [];\n\n // Chunk Typed Array for better performance (#435)\n var chunkSize = 8192;\n var uint8 = new Uint8Array(arrayBuffer);\n while (uint8.length > 0) {\n // XXX: Babel's `toConsumableArray` helper will throw error in IE or Safari 9\n // eslint-disable-next-line prefer-spread\n chunks.push(fromCharCode.apply(null, toArray(uint8.subarray(0, chunkSize))));\n uint8 = uint8.subarray(chunkSize);\n }\n return \"data:\".concat(mimeType, \";base64,\").concat(btoa(chunks.join('')));\n}\n\n/**\n * Get orientation value from given array buffer.\n * @param {ArrayBuffer} arrayBuffer - The array buffer to read.\n * @returns {number} The read orientation value.\n */\nfunction resetAndGetOrientation(arrayBuffer) {\n var dataView = new DataView(arrayBuffer);\n var orientation;\n\n // Ignores range error when the image does not have correct Exif information\n try {\n var littleEndian;\n var app1Start;\n var ifdStart;\n\n // Only handle JPEG image (start by 0xFFD8)\n if (dataView.getUint8(0) === 0xFF && dataView.getUint8(1) === 0xD8) {\n var length = dataView.byteLength;\n var offset = 2;\n while (offset + 1 < length) {\n if (dataView.getUint8(offset) === 0xFF && dataView.getUint8(offset + 1) === 0xE1) {\n app1Start = offset;\n break;\n }\n offset += 1;\n }\n }\n if (app1Start) {\n var exifIDCode = app1Start + 4;\n var tiffOffset = app1Start + 10;\n if (getStringFromCharCode(dataView, exifIDCode, 4) === 'Exif') {\n var endianness = dataView.getUint16(tiffOffset);\n littleEndian = endianness === 0x4949;\n if (littleEndian || endianness === 0x4D4D /* bigEndian */) {\n if (dataView.getUint16(tiffOffset + 2, littleEndian) === 0x002A) {\n var firstIFDOffset = dataView.getUint32(tiffOffset + 4, littleEndian);\n if (firstIFDOffset >= 0x00000008) {\n ifdStart = tiffOffset + firstIFDOffset;\n }\n }\n }\n }\n }\n if (ifdStart) {\n var _length = dataView.getUint16(ifdStart, littleEndian);\n var _offset;\n var i;\n for (i = 0; i < _length; i += 1) {\n _offset = ifdStart + i * 12 + 2;\n if (dataView.getUint16(_offset, littleEndian) === 0x0112 /* Orientation */) {\n // 8 is the offset of the current tag's value\n _offset += 8;\n\n // Get the original orientation value\n orientation = dataView.getUint16(_offset, littleEndian);\n\n // Override the orientation with its default value\n dataView.setUint16(_offset, 1, littleEndian);\n break;\n }\n }\n }\n } catch (error) {\n orientation = 1;\n }\n return orientation;\n}\n\n/**\n * Parse Exif Orientation value.\n * @param {number} orientation - The orientation to parse.\n * @returns {Object} The parsed result.\n */\nfunction parseOrientation(orientation) {\n var rotate = 0;\n var scaleX = 1;\n var scaleY = 1;\n switch (orientation) {\n // Flip horizontal\n case 2:\n scaleX = -1;\n break;\n\n // Rotate left 180°\n case 3:\n rotate = -180;\n break;\n\n // Flip vertical\n case 4:\n scaleY = -1;\n break;\n\n // Flip vertical and rotate right 90°\n case 5:\n rotate = 90;\n scaleY = -1;\n break;\n\n // Rotate right 90°\n case 6:\n rotate = 90;\n break;\n\n // Flip horizontal and rotate right 90°\n case 7:\n rotate = 90;\n scaleX = -1;\n break;\n\n // Rotate left 90°\n case 8:\n rotate = -90;\n break;\n }\n return {\n rotate: rotate,\n scaleX: scaleX,\n scaleY: scaleY\n };\n}\n\nvar render = {\n render: function render() {\n this.initContainer();\n this.initCanvas();\n this.initCropBox();\n this.renderCanvas();\n if (this.cropped) {\n this.renderCropBox();\n }\n },\n initContainer: function initContainer() {\n var element = this.element,\n options = this.options,\n container = this.container,\n cropper = this.cropper;\n var minWidth = Number(options.minContainerWidth);\n var minHeight = Number(options.minContainerHeight);\n addClass(cropper, CLASS_HIDDEN);\n removeClass(element, CLASS_HIDDEN);\n var containerData = {\n width: Math.max(container.offsetWidth, minWidth >= 0 ? minWidth : MIN_CONTAINER_WIDTH),\n height: Math.max(container.offsetHeight, minHeight >= 0 ? minHeight : MIN_CONTAINER_HEIGHT)\n };\n this.containerData = containerData;\n setStyle(cropper, {\n width: containerData.width,\n height: containerData.height\n });\n addClass(element, CLASS_HIDDEN);\n removeClass(cropper, CLASS_HIDDEN);\n },\n // Canvas (image wrapper)\n initCanvas: function initCanvas() {\n var containerData = this.containerData,\n imageData = this.imageData;\n var viewMode = this.options.viewMode;\n var rotated = Math.abs(imageData.rotate) % 180 === 90;\n var naturalWidth = rotated ? imageData.naturalHeight : imageData.naturalWidth;\n var naturalHeight = rotated ? imageData.naturalWidth : imageData.naturalHeight;\n var aspectRatio = naturalWidth / naturalHeight;\n var canvasWidth = containerData.width;\n var canvasHeight = containerData.height;\n if (containerData.height * aspectRatio > containerData.width) {\n if (viewMode === 3) {\n canvasWidth = containerData.height * aspectRatio;\n } else {\n canvasHeight = containerData.width / aspectRatio;\n }\n } else if (viewMode === 3) {\n canvasHeight = containerData.width / aspectRatio;\n } else {\n canvasWidth = containerData.height * aspectRatio;\n }\n var canvasData = {\n aspectRatio: aspectRatio,\n naturalWidth: naturalWidth,\n naturalHeight: naturalHeight,\n width: canvasWidth,\n height: canvasHeight\n };\n this.canvasData = canvasData;\n this.limited = viewMode === 1 || viewMode === 2;\n this.limitCanvas(true, true);\n canvasData.width = Math.min(Math.max(canvasData.width, canvasData.minWidth), canvasData.maxWidth);\n canvasData.height = Math.min(Math.max(canvasData.height, canvasData.minHeight), canvasData.maxHeight);\n canvasData.left = (containerData.width - canvasData.width) / 2;\n canvasData.top = (containerData.height - canvasData.height) / 2;\n canvasData.oldLeft = canvasData.left;\n canvasData.oldTop = canvasData.top;\n this.initialCanvasData = assign({}, canvasData);\n },\n limitCanvas: function limitCanvas(sizeLimited, positionLimited) {\n var options = this.options,\n containerData = this.containerData,\n canvasData = this.canvasData,\n cropBoxData = this.cropBoxData;\n var viewMode = options.viewMode;\n var aspectRatio = canvasData.aspectRatio;\n var cropped = this.cropped && cropBoxData;\n if (sizeLimited) {\n var minCanvasWidth = Number(options.minCanvasWidth) || 0;\n var minCanvasHeight = Number(options.minCanvasHeight) || 0;\n if (viewMode > 1) {\n minCanvasWidth = Math.max(minCanvasWidth, containerData.width);\n minCanvasHeight = Math.max(minCanvasHeight, containerData.height);\n if (viewMode === 3) {\n if (minCanvasHeight * aspectRatio > minCanvasWidth) {\n minCanvasWidth = minCanvasHeight * aspectRatio;\n } else {\n minCanvasHeight = minCanvasWidth / aspectRatio;\n }\n }\n } else if (viewMode > 0) {\n if (minCanvasWidth) {\n minCanvasWidth = Math.max(minCanvasWidth, cropped ? cropBoxData.width : 0);\n } else if (minCanvasHeight) {\n minCanvasHeight = Math.max(minCanvasHeight, cropped ? cropBoxData.height : 0);\n } else if (cropped) {\n minCanvasWidth = cropBoxData.width;\n minCanvasHeight = cropBoxData.height;\n if (minCanvasHeight * aspectRatio > minCanvasWidth) {\n minCanvasWidth = minCanvasHeight * aspectRatio;\n } else {\n minCanvasHeight = minCanvasWidth / aspectRatio;\n }\n }\n }\n var _getAdjustedSizes = getAdjustedSizes({\n aspectRatio: aspectRatio,\n width: minCanvasWidth,\n height: minCanvasHeight\n });\n minCanvasWidth = _getAdjustedSizes.width;\n minCanvasHeight = _getAdjustedSizes.height;\n canvasData.minWidth = minCanvasWidth;\n canvasData.minHeight = minCanvasHeight;\n canvasData.maxWidth = Infinity;\n canvasData.maxHeight = Infinity;\n }\n if (positionLimited) {\n if (viewMode > (cropped ? 0 : 1)) {\n var newCanvasLeft = containerData.width - canvasData.width;\n var newCanvasTop = containerData.height - canvasData.height;\n canvasData.minLeft = Math.min(0, newCanvasLeft);\n canvasData.minTop = Math.min(0, newCanvasTop);\n canvasData.maxLeft = Math.max(0, newCanvasLeft);\n canvasData.maxTop = Math.max(0, newCanvasTop);\n if (cropped && this.limited) {\n canvasData.minLeft = Math.min(cropBoxData.left, cropBoxData.left + (cropBoxData.width - canvasData.width));\n canvasData.minTop = Math.min(cropBoxData.top, cropBoxData.top + (cropBoxData.height - canvasData.height));\n canvasData.maxLeft = cropBoxData.left;\n canvasData.maxTop = cropBoxData.top;\n if (viewMode === 2) {\n if (canvasData.width >= containerData.width) {\n canvasData.minLeft = Math.min(0, newCanvasLeft);\n canvasData.maxLeft = Math.max(0, newCanvasLeft);\n }\n if (canvasData.height >= containerData.height) {\n canvasData.minTop = Math.min(0, newCanvasTop);\n canvasData.maxTop = Math.max(0, newCanvasTop);\n }\n }\n }\n } else {\n canvasData.minLeft = -canvasData.width;\n canvasData.minTop = -canvasData.height;\n canvasData.maxLeft = containerData.width;\n canvasData.maxTop = containerData.height;\n }\n }\n },\n renderCanvas: function renderCanvas(changed, transformed) {\n var canvasData = this.canvasData,\n imageData = this.imageData;\n if (transformed) {\n var _getRotatedSizes = getRotatedSizes({\n width: imageData.naturalWidth * Math.abs(imageData.scaleX || 1),\n height: imageData.naturalHeight * Math.abs(imageData.scaleY || 1),\n degree: imageData.rotate || 0\n }),\n naturalWidth = _getRotatedSizes.width,\n naturalHeight = _getRotatedSizes.height;\n var width = canvasData.width * (naturalWidth / canvasData.naturalWidth);\n var height = canvasData.height * (naturalHeight / canvasData.naturalHeight);\n canvasData.left -= (width - canvasData.width) / 2;\n canvasData.top -= (height - canvasData.height) / 2;\n canvasData.width = width;\n canvasData.height = height;\n canvasData.aspectRatio = naturalWidth / naturalHeight;\n canvasData.naturalWidth = naturalWidth;\n canvasData.naturalHeight = naturalHeight;\n this.limitCanvas(true, false);\n }\n if (canvasData.width > canvasData.maxWidth || canvasData.width < canvasData.minWidth) {\n canvasData.left = canvasData.oldLeft;\n }\n if (canvasData.height > canvasData.maxHeight || canvasData.height < canvasData.minHeight) {\n canvasData.top = canvasData.oldTop;\n }\n canvasData.width = Math.min(Math.max(canvasData.width, canvasData.minWidth), canvasData.maxWidth);\n canvasData.height = Math.min(Math.max(canvasData.height, canvasData.minHeight), canvasData.maxHeight);\n this.limitCanvas(false, true);\n canvasData.left = Math.min(Math.max(canvasData.left, canvasData.minLeft), canvasData.maxLeft);\n canvasData.top = Math.min(Math.max(canvasData.top, canvasData.minTop), canvasData.maxTop);\n canvasData.oldLeft = canvasData.left;\n canvasData.oldTop = canvasData.top;\n setStyle(this.canvas, assign({\n width: canvasData.width,\n height: canvasData.height\n }, getTransforms({\n translateX: canvasData.left,\n translateY: canvasData.top\n })));\n this.renderImage(changed);\n if (this.cropped && this.limited) {\n this.limitCropBox(true, true);\n }\n },\n renderImage: function renderImage(changed) {\n var canvasData = this.canvasData,\n imageData = this.imageData;\n var width = imageData.naturalWidth * (canvasData.width / canvasData.naturalWidth);\n var height = imageData.naturalHeight * (canvasData.height / canvasData.naturalHeight);\n assign(imageData, {\n width: width,\n height: height,\n left: (canvasData.width - width) / 2,\n top: (canvasData.height - height) / 2\n });\n setStyle(this.image, assign({\n width: imageData.width,\n height: imageData.height\n }, getTransforms(assign({\n translateX: imageData.left,\n translateY: imageData.top\n }, imageData))));\n if (changed) {\n this.output();\n }\n },\n initCropBox: function initCropBox() {\n var options = this.options,\n canvasData = this.canvasData;\n var aspectRatio = options.aspectRatio || options.initialAspectRatio;\n var autoCropArea = Number(options.autoCropArea) || 0.8;\n var cropBoxData = {\n width: canvasData.width,\n height: canvasData.height\n };\n if (aspectRatio) {\n if (canvasData.height * aspectRatio > canvasData.width) {\n cropBoxData.height = cropBoxData.width / aspectRatio;\n } else {\n cropBoxData.width = cropBoxData.height * aspectRatio;\n }\n }\n this.cropBoxData = cropBoxData;\n this.limitCropBox(true, true);\n\n // Initialize auto crop area\n cropBoxData.width = Math.min(Math.max(cropBoxData.width, cropBoxData.minWidth), cropBoxData.maxWidth);\n cropBoxData.height = Math.min(Math.max(cropBoxData.height, cropBoxData.minHeight), cropBoxData.maxHeight);\n\n // The width/height of auto crop area must large than \"minWidth/Height\"\n cropBoxData.width = Math.max(cropBoxData.minWidth, cropBoxData.width * autoCropArea);\n cropBoxData.height = Math.max(cropBoxData.minHeight, cropBoxData.height * autoCropArea);\n cropBoxData.left = canvasData.left + (canvasData.width - cropBoxData.width) / 2;\n cropBoxData.top = canvasData.top + (canvasData.height - cropBoxData.height) / 2;\n cropBoxData.oldLeft = cropBoxData.left;\n cropBoxData.oldTop = cropBoxData.top;\n this.initialCropBoxData = assign({}, cropBoxData);\n },\n limitCropBox: function limitCropBox(sizeLimited, positionLimited) {\n var options = this.options,\n containerData = this.containerData,\n canvasData = this.canvasData,\n cropBoxData = this.cropBoxData,\n limited = this.limited;\n var aspectRatio = options.aspectRatio;\n if (sizeLimited) {\n var minCropBoxWidth = Number(options.minCropBoxWidth) || 0;\n var minCropBoxHeight = Number(options.minCropBoxHeight) || 0;\n var maxCropBoxWidth = limited ? Math.min(containerData.width, canvasData.width, canvasData.width + canvasData.left, containerData.width - canvasData.left) : containerData.width;\n var maxCropBoxHeight = limited ? Math.min(containerData.height, canvasData.height, canvasData.height + canvasData.top, containerData.height - canvasData.top) : containerData.height;\n\n // The min/maxCropBoxWidth/Height must be less than container's width/height\n minCropBoxWidth = Math.min(minCropBoxWidth, containerData.width);\n minCropBoxHeight = Math.min(minCropBoxHeight, containerData.height);\n if (aspectRatio) {\n if (minCropBoxWidth && minCropBoxHeight) {\n if (minCropBoxHeight * aspectRatio > minCropBoxWidth) {\n minCropBoxHeight = minCropBoxWidth / aspectRatio;\n } else {\n minCropBoxWidth = minCropBoxHeight * aspectRatio;\n }\n } else if (minCropBoxWidth) {\n minCropBoxHeight = minCropBoxWidth / aspectRatio;\n } else if (minCropBoxHeight) {\n minCropBoxWidth = minCropBoxHeight * aspectRatio;\n }\n if (maxCropBoxHeight * aspectRatio > maxCropBoxWidth) {\n maxCropBoxHeight = maxCropBoxWidth / aspectRatio;\n } else {\n maxCropBoxWidth = maxCropBoxHeight * aspectRatio;\n }\n }\n\n // The minWidth/Height must be less than maxWidth/Height\n cropBoxData.minWidth = Math.min(minCropBoxWidth, maxCropBoxWidth);\n cropBoxData.minHeight = Math.min(minCropBoxHeight, maxCropBoxHeight);\n cropBoxData.maxWidth = maxCropBoxWidth;\n cropBoxData.maxHeight = maxCropBoxHeight;\n }\n if (positionLimited) {\n if (limited) {\n cropBoxData.minLeft = Math.max(0, canvasData.left);\n cropBoxData.minTop = Math.max(0, canvasData.top);\n cropBoxData.maxLeft = Math.min(containerData.width, canvasData.left + canvasData.width) - cropBoxData.width;\n cropBoxData.maxTop = Math.min(containerData.height, canvasData.top + canvasData.height) - cropBoxData.height;\n } else {\n cropBoxData.minLeft = 0;\n cropBoxData.minTop = 0;\n cropBoxData.maxLeft = containerData.width - cropBoxData.width;\n cropBoxData.maxTop = containerData.height - cropBoxData.height;\n }\n }\n },\n renderCropBox: function renderCropBox() {\n var options = this.options,\n containerData = this.containerData,\n cropBoxData = this.cropBoxData;\n if (cropBoxData.width > cropBoxData.maxWidth || cropBoxData.width < cropBoxData.minWidth) {\n cropBoxData.left = cropBoxData.oldLeft;\n }\n if (cropBoxData.height > cropBoxData.maxHeight || cropBoxData.height < cropBoxData.minHeight) {\n cropBoxData.top = cropBoxData.oldTop;\n }\n cropBoxData.width = Math.min(Math.max(cropBoxData.width, cropBoxData.minWidth), cropBoxData.maxWidth);\n cropBoxData.height = Math.min(Math.max(cropBoxData.height, cropBoxData.minHeight), cropBoxData.maxHeight);\n this.limitCropBox(false, true);\n cropBoxData.left = Math.min(Math.max(cropBoxData.left, cropBoxData.minLeft), cropBoxData.maxLeft);\n cropBoxData.top = Math.min(Math.max(cropBoxData.top, cropBoxData.minTop), cropBoxData.maxTop);\n cropBoxData.oldLeft = cropBoxData.left;\n cropBoxData.oldTop = cropBoxData.top;\n if (options.movable && options.cropBoxMovable) {\n // Turn to move the canvas when the crop box is equal to the container\n setData(this.face, DATA_ACTION, cropBoxData.width >= containerData.width && cropBoxData.height >= containerData.height ? ACTION_MOVE : ACTION_ALL);\n }\n setStyle(this.cropBox, assign({\n width: cropBoxData.width,\n height: cropBoxData.height\n }, getTransforms({\n translateX: cropBoxData.left,\n translateY: cropBoxData.top\n })));\n if (this.cropped && this.limited) {\n this.limitCanvas(true, true);\n }\n if (!this.disabled) {\n this.output();\n }\n },\n output: function output() {\n this.preview();\n dispatchEvent(this.element, EVENT_CROP, this.getData());\n }\n};\n\nvar preview = {\n initPreview: function initPreview() {\n var element = this.element,\n crossOrigin = this.crossOrigin;\n var preview = this.options.preview;\n var url = crossOrigin ? this.crossOriginUrl : this.url;\n var alt = element.alt || 'The image to preview';\n var image = document.createElement('img');\n if (crossOrigin) {\n image.crossOrigin = crossOrigin;\n }\n image.src = url;\n image.alt = alt;\n this.viewBox.appendChild(image);\n this.viewBoxImage = image;\n if (!preview) {\n return;\n }\n var previews = preview;\n if (typeof preview === 'string') {\n previews = element.ownerDocument.querySelectorAll(preview);\n } else if (preview.querySelector) {\n previews = [preview];\n }\n this.previews = previews;\n forEach(previews, function (el) {\n var img = document.createElement('img');\n\n // Save the original size for recover\n setData(el, DATA_PREVIEW, {\n width: el.offsetWidth,\n height: el.offsetHeight,\n html: el.innerHTML\n });\n if (crossOrigin) {\n img.crossOrigin = crossOrigin;\n }\n img.src = url;\n img.alt = alt;\n\n /**\n * Override img element styles\n * Add `display:block` to avoid margin top issue\n * Add `height:auto` to override `height` attribute on IE8\n * (Occur only when margin-top <= -height)\n */\n img.style.cssText = 'display:block;' + 'width:100%;' + 'height:auto;' + 'min-width:0!important;' + 'min-height:0!important;' + 'max-width:none!important;' + 'max-height:none!important;' + 'image-orientation:0deg!important;\"';\n el.innerHTML = '';\n el.appendChild(img);\n });\n },\n resetPreview: function resetPreview() {\n forEach(this.previews, function (element) {\n var data = getData(element, DATA_PREVIEW);\n setStyle(element, {\n width: data.width,\n height: data.height\n });\n element.innerHTML = data.html;\n removeData(element, DATA_PREVIEW);\n });\n },\n preview: function preview() {\n var imageData = this.imageData,\n canvasData = this.canvasData,\n cropBoxData = this.cropBoxData;\n var cropBoxWidth = cropBoxData.width,\n cropBoxHeight = cropBoxData.height;\n var width = imageData.width,\n height = imageData.height;\n var left = cropBoxData.left - canvasData.left - imageData.left;\n var top = cropBoxData.top - canvasData.top - imageData.top;\n if (!this.cropped || this.disabled) {\n return;\n }\n setStyle(this.viewBoxImage, assign({\n width: width,\n height: height\n }, getTransforms(assign({\n translateX: -left,\n translateY: -top\n }, imageData))));\n forEach(this.previews, function (element) {\n var data = getData(element, DATA_PREVIEW);\n var originalWidth = data.width;\n var originalHeight = data.height;\n var newWidth = originalWidth;\n var newHeight = originalHeight;\n var ratio = 1;\n if (cropBoxWidth) {\n ratio = originalWidth / cropBoxWidth;\n newHeight = cropBoxHeight * ratio;\n }\n if (cropBoxHeight && newHeight > originalHeight) {\n ratio = originalHeight / cropBoxHeight;\n newWidth = cropBoxWidth * ratio;\n newHeight = originalHeight;\n }\n setStyle(element, {\n width: newWidth,\n height: newHeight\n });\n setStyle(element.getElementsByTagName('img')[0], assign({\n width: width * ratio,\n height: height * ratio\n }, getTransforms(assign({\n translateX: -left * ratio,\n translateY: -top * ratio\n }, imageData))));\n });\n }\n};\n\nvar events = {\n bind: function bind() {\n var element = this.element,\n options = this.options,\n cropper = this.cropper;\n if (isFunction(options.cropstart)) {\n addListener(element, EVENT_CROP_START, options.cropstart);\n }\n if (isFunction(options.cropmove)) {\n addListener(element, EVENT_CROP_MOVE, options.cropmove);\n }\n if (isFunction(options.cropend)) {\n addListener(element, EVENT_CROP_END, options.cropend);\n }\n if (isFunction(options.crop)) {\n addListener(element, EVENT_CROP, options.crop);\n }\n if (isFunction(options.zoom)) {\n addListener(element, EVENT_ZOOM, options.zoom);\n }\n addListener(cropper, EVENT_POINTER_DOWN, this.onCropStart = this.cropStart.bind(this));\n if (options.zoomable && options.zoomOnWheel) {\n addListener(cropper, EVENT_WHEEL, this.onWheel = this.wheel.bind(this), {\n passive: false,\n capture: true\n });\n }\n if (options.toggleDragModeOnDblclick) {\n addListener(cropper, EVENT_DBLCLICK, this.onDblclick = this.dblclick.bind(this));\n }\n addListener(element.ownerDocument, EVENT_POINTER_MOVE, this.onCropMove = this.cropMove.bind(this));\n addListener(element.ownerDocument, EVENT_POINTER_UP, this.onCropEnd = this.cropEnd.bind(this));\n if (options.responsive) {\n addListener(window, EVENT_RESIZE, this.onResize = this.resize.bind(this));\n }\n },\n unbind: function unbind() {\n var element = this.element,\n options = this.options,\n cropper = this.cropper;\n if (isFunction(options.cropstart)) {\n removeListener(element, EVENT_CROP_START, options.cropstart);\n }\n if (isFunction(options.cropmove)) {\n removeListener(element, EVENT_CROP_MOVE, options.cropmove);\n }\n if (isFunction(options.cropend)) {\n removeListener(element, EVENT_CROP_END, options.cropend);\n }\n if (isFunction(options.crop)) {\n removeListener(element, EVENT_CROP, options.crop);\n }\n if (isFunction(options.zoom)) {\n removeListener(element, EVENT_ZOOM, options.zoom);\n }\n removeListener(cropper, EVENT_POINTER_DOWN, this.onCropStart);\n if (options.zoomable && options.zoomOnWheel) {\n removeListener(cropper, EVENT_WHEEL, this.onWheel, {\n passive: false,\n capture: true\n });\n }\n if (options.toggleDragModeOnDblclick) {\n removeListener(cropper, EVENT_DBLCLICK, this.onDblclick);\n }\n removeListener(element.ownerDocument, EVENT_POINTER_MOVE, this.onCropMove);\n removeListener(element.ownerDocument, EVENT_POINTER_UP, this.onCropEnd);\n if (options.responsive) {\n removeListener(window, EVENT_RESIZE, this.onResize);\n }\n }\n};\n\nvar handlers = {\n resize: function resize() {\n if (this.disabled) {\n return;\n }\n var options = this.options,\n container = this.container,\n containerData = this.containerData;\n var ratioX = container.offsetWidth / containerData.width;\n var ratioY = container.offsetHeight / containerData.height;\n var ratio = Math.abs(ratioX - 1) > Math.abs(ratioY - 1) ? ratioX : ratioY;\n\n // Resize when width changed or height changed\n if (ratio !== 1) {\n var canvasData;\n var cropBoxData;\n if (options.restore) {\n canvasData = this.getCanvasData();\n cropBoxData = this.getCropBoxData();\n }\n this.render();\n if (options.restore) {\n this.setCanvasData(forEach(canvasData, function (n, i) {\n canvasData[i] = n * ratio;\n }));\n this.setCropBoxData(forEach(cropBoxData, function (n, i) {\n cropBoxData[i] = n * ratio;\n }));\n }\n }\n },\n dblclick: function dblclick() {\n if (this.disabled || this.options.dragMode === DRAG_MODE_NONE) {\n return;\n }\n this.setDragMode(hasClass(this.dragBox, CLASS_CROP) ? DRAG_MODE_MOVE : DRAG_MODE_CROP);\n },\n wheel: function wheel(event) {\n var _this = this;\n var ratio = Number(this.options.wheelZoomRatio) || 0.1;\n var delta = 1;\n if (this.disabled) {\n return;\n }\n event.preventDefault();\n\n // Limit wheel speed to prevent zoom too fast (#21)\n if (this.wheeling) {\n return;\n }\n this.wheeling = true;\n setTimeout(function () {\n _this.wheeling = false;\n }, 50);\n if (event.deltaY) {\n delta = event.deltaY > 0 ? 1 : -1;\n } else if (event.wheelDelta) {\n delta = -event.wheelDelta / 120;\n } else if (event.detail) {\n delta = event.detail > 0 ? 1 : -1;\n }\n this.zoom(-delta * ratio, event);\n },\n cropStart: function cropStart(event) {\n var buttons = event.buttons,\n button = event.button;\n if (this.disabled\n\n // Handle mouse event and pointer event and ignore touch event\n || (event.type === 'mousedown' || event.type === 'pointerdown' && event.pointerType === 'mouse') && (\n // No primary button (Usually the left button)\n isNumber(buttons) && buttons !== 1 || isNumber(button) && button !== 0\n\n // Open context menu\n || event.ctrlKey)) {\n return;\n }\n var options = this.options,\n pointers = this.pointers;\n var action;\n if (event.changedTouches) {\n // Handle touch event\n forEach(event.changedTouches, function (touch) {\n pointers[touch.identifier] = getPointer(touch);\n });\n } else {\n // Handle mouse event and pointer event\n pointers[event.pointerId || 0] = getPointer(event);\n }\n if (Object.keys(pointers).length > 1 && options.zoomable && options.zoomOnTouch) {\n action = ACTION_ZOOM;\n } else {\n action = getData(event.target, DATA_ACTION);\n }\n if (!REGEXP_ACTIONS.test(action)) {\n return;\n }\n if (dispatchEvent(this.element, EVENT_CROP_START, {\n originalEvent: event,\n action: action\n }) === false) {\n return;\n }\n\n // This line is required for preventing page zooming in iOS browsers\n event.preventDefault();\n this.action = action;\n this.cropping = false;\n if (action === ACTION_CROP) {\n this.cropping = true;\n addClass(this.dragBox, CLASS_MODAL);\n }\n },\n cropMove: function cropMove(event) {\n var action = this.action;\n if (this.disabled || !action) {\n return;\n }\n var pointers = this.pointers;\n event.preventDefault();\n if (dispatchEvent(this.element, EVENT_CROP_MOVE, {\n originalEvent: event,\n action: action\n }) === false) {\n return;\n }\n if (event.changedTouches) {\n forEach(event.changedTouches, function (touch) {\n // The first parameter should not be undefined (#432)\n assign(pointers[touch.identifier] || {}, getPointer(touch, true));\n });\n } else {\n assign(pointers[event.pointerId || 0] || {}, getPointer(event, true));\n }\n this.change(event);\n },\n cropEnd: function cropEnd(event) {\n if (this.disabled) {\n return;\n }\n var action = this.action,\n pointers = this.pointers;\n if (event.changedTouches) {\n forEach(event.changedTouches, function (touch) {\n delete pointers[touch.identifier];\n });\n } else {\n delete pointers[event.pointerId || 0];\n }\n if (!action) {\n return;\n }\n event.preventDefault();\n if (!Object.keys(pointers).length) {\n this.action = '';\n }\n if (this.cropping) {\n this.cropping = false;\n toggleClass(this.dragBox, CLASS_MODAL, this.cropped && this.options.modal);\n }\n dispatchEvent(this.element, EVENT_CROP_END, {\n originalEvent: event,\n action: action\n });\n }\n};\n\nvar change = {\n change: function change(event) {\n var options = this.options,\n canvasData = this.canvasData,\n containerData = this.containerData,\n cropBoxData = this.cropBoxData,\n pointers = this.pointers;\n var action = this.action;\n var aspectRatio = options.aspectRatio;\n var left = cropBoxData.left,\n top = cropBoxData.top,\n width = cropBoxData.width,\n height = cropBoxData.height;\n var right = left + width;\n var bottom = top + height;\n var minLeft = 0;\n var minTop = 0;\n var maxWidth = containerData.width;\n var maxHeight = containerData.height;\n var renderable = true;\n var offset;\n\n // Locking aspect ratio in \"free mode\" by holding shift key\n if (!aspectRatio && event.shiftKey) {\n aspectRatio = width && height ? width / height : 1;\n }\n if (this.limited) {\n minLeft = cropBoxData.minLeft;\n minTop = cropBoxData.minTop;\n maxWidth = minLeft + Math.min(containerData.width, canvasData.width, canvasData.left + canvasData.width);\n maxHeight = minTop + Math.min(containerData.height, canvasData.height, canvasData.top + canvasData.height);\n }\n var pointer = pointers[Object.keys(pointers)[0]];\n var range = {\n x: pointer.endX - pointer.startX,\n y: pointer.endY - pointer.startY\n };\n var check = function check(side) {\n switch (side) {\n case ACTION_EAST:\n if (right + range.x > maxWidth) {\n range.x = maxWidth - right;\n }\n break;\n case ACTION_WEST:\n if (left + range.x < minLeft) {\n range.x = minLeft - left;\n }\n break;\n case ACTION_NORTH:\n if (top + range.y < minTop) {\n range.y = minTop - top;\n }\n break;\n case ACTION_SOUTH:\n if (bottom + range.y > maxHeight) {\n range.y = maxHeight - bottom;\n }\n break;\n }\n };\n switch (action) {\n // Move crop box\n case ACTION_ALL:\n left += range.x;\n top += range.y;\n break;\n\n // Resize crop box\n case ACTION_EAST:\n if (range.x >= 0 && (right >= maxWidth || aspectRatio && (top <= minTop || bottom >= maxHeight))) {\n renderable = false;\n break;\n }\n check(ACTION_EAST);\n width += range.x;\n if (width < 0) {\n action = ACTION_WEST;\n width = -width;\n left -= width;\n }\n if (aspectRatio) {\n height = width / aspectRatio;\n top += (cropBoxData.height - height) / 2;\n }\n break;\n case ACTION_NORTH:\n if (range.y <= 0 && (top <= minTop || aspectRatio && (left <= minLeft || right >= maxWidth))) {\n renderable = false;\n break;\n }\n check(ACTION_NORTH);\n height -= range.y;\n top += range.y;\n if (height < 0) {\n action = ACTION_SOUTH;\n height = -height;\n top -= height;\n }\n if (aspectRatio) {\n width = height * aspectRatio;\n left += (cropBoxData.width - width) / 2;\n }\n break;\n case ACTION_WEST:\n if (range.x <= 0 && (left <= minLeft || aspectRatio && (top <= minTop || bottom >= maxHeight))) {\n renderable = false;\n break;\n }\n check(ACTION_WEST);\n width -= range.x;\n left += range.x;\n if (width < 0) {\n action = ACTION_EAST;\n width = -width;\n left -= width;\n }\n if (aspectRatio) {\n height = width / aspectRatio;\n top += (cropBoxData.height - height) / 2;\n }\n break;\n case ACTION_SOUTH:\n if (range.y >= 0 && (bottom >= maxHeight || aspectRatio && (left <= minLeft || right >= maxWidth))) {\n renderable = false;\n break;\n }\n check(ACTION_SOUTH);\n height += range.y;\n if (height < 0) {\n action = ACTION_NORTH;\n height = -height;\n top -= height;\n }\n if (aspectRatio) {\n width = height * aspectRatio;\n left += (cropBoxData.width - width) / 2;\n }\n break;\n case ACTION_NORTH_EAST:\n if (aspectRatio) {\n if (range.y <= 0 && (top <= minTop || right >= maxWidth)) {\n renderable = false;\n break;\n }\n check(ACTION_NORTH);\n height -= range.y;\n top += range.y;\n width = height * aspectRatio;\n } else {\n check(ACTION_NORTH);\n check(ACTION_EAST);\n if (range.x >= 0) {\n if (right < maxWidth) {\n width += range.x;\n } else if (range.y <= 0 && top <= minTop) {\n renderable = false;\n }\n } else {\n width += range.x;\n }\n if (range.y <= 0) {\n if (top > minTop) {\n height -= range.y;\n top += range.y;\n }\n } else {\n height -= range.y;\n top += range.y;\n }\n }\n if (width < 0 && height < 0) {\n action = ACTION_SOUTH_WEST;\n height = -height;\n width = -width;\n top -= height;\n left -= width;\n } else if (width < 0) {\n action = ACTION_NORTH_WEST;\n width = -width;\n left -= width;\n } else if (height < 0) {\n action = ACTION_SOUTH_EAST;\n height = -height;\n top -= height;\n }\n break;\n case ACTION_NORTH_WEST:\n if (aspectRatio) {\n if (range.y <= 0 && (top <= minTop || left <= minLeft)) {\n renderable = false;\n break;\n }\n check(ACTION_NORTH);\n height -= range.y;\n top += range.y;\n width = height * aspectRatio;\n left += cropBoxData.width - width;\n } else {\n check(ACTION_NORTH);\n check(ACTION_WEST);\n if (range.x <= 0) {\n if (left > minLeft) {\n width -= range.x;\n left += range.x;\n } else if (range.y <= 0 && top <= minTop) {\n renderable = false;\n }\n } else {\n width -= range.x;\n left += range.x;\n }\n if (range.y <= 0) {\n if (top > minTop) {\n height -= range.y;\n top += range.y;\n }\n } else {\n height -= range.y;\n top += range.y;\n }\n }\n if (width < 0 && height < 0) {\n action = ACTION_SOUTH_EAST;\n height = -height;\n width = -width;\n top -= height;\n left -= width;\n } else if (width < 0) {\n action = ACTION_NORTH_EAST;\n width = -width;\n left -= width;\n } else if (height < 0) {\n action = ACTION_SOUTH_WEST;\n height = -height;\n top -= height;\n }\n break;\n case ACTION_SOUTH_WEST:\n if (aspectRatio) {\n if (range.x <= 0 && (left <= minLeft || bottom >= maxHeight)) {\n renderable = false;\n break;\n }\n check(ACTION_WEST);\n width -= range.x;\n left += range.x;\n height = width / aspectRatio;\n } else {\n check(ACTION_SOUTH);\n check(ACTION_WEST);\n if (range.x <= 0) {\n if (left > minLeft) {\n width -= range.x;\n left += range.x;\n } else if (range.y >= 0 && bottom >= maxHeight) {\n renderable = false;\n }\n } else {\n width -= range.x;\n left += range.x;\n }\n if (range.y >= 0) {\n if (bottom < maxHeight) {\n height += range.y;\n }\n } else {\n height += range.y;\n }\n }\n if (width < 0 && height < 0) {\n action = ACTION_NORTH_EAST;\n height = -height;\n width = -width;\n top -= height;\n left -= width;\n } else if (width < 0) {\n action = ACTION_SOUTH_EAST;\n width = -width;\n left -= width;\n } else if (height < 0) {\n action = ACTION_NORTH_WEST;\n height = -height;\n top -= height;\n }\n break;\n case ACTION_SOUTH_EAST:\n if (aspectRatio) {\n if (range.x >= 0 && (right >= maxWidth || bottom >= maxHeight)) {\n renderable = false;\n break;\n }\n check(ACTION_EAST);\n width += range.x;\n height = width / aspectRatio;\n } else {\n check(ACTION_SOUTH);\n check(ACTION_EAST);\n if (range.x >= 0) {\n if (right < maxWidth) {\n width += range.x;\n } else if (range.y >= 0 && bottom >= maxHeight) {\n renderable = false;\n }\n } else {\n width += range.x;\n }\n if (range.y >= 0) {\n if (bottom < maxHeight) {\n height += range.y;\n }\n } else {\n height += range.y;\n }\n }\n if (width < 0 && height < 0) {\n action = ACTION_NORTH_WEST;\n height = -height;\n width = -width;\n top -= height;\n left -= width;\n } else if (width < 0) {\n action = ACTION_SOUTH_WEST;\n width = -width;\n left -= width;\n } else if (height < 0) {\n action = ACTION_NORTH_EAST;\n height = -height;\n top -= height;\n }\n break;\n\n // Move canvas\n case ACTION_MOVE:\n this.move(range.x, range.y);\n renderable = false;\n break;\n\n // Zoom canvas\n case ACTION_ZOOM:\n this.zoom(getMaxZoomRatio(pointers), event);\n renderable = false;\n break;\n\n // Create crop box\n case ACTION_CROP:\n if (!range.x || !range.y) {\n renderable = false;\n break;\n }\n offset = getOffset(this.cropper);\n left = pointer.startX - offset.left;\n top = pointer.startY - offset.top;\n width = cropBoxData.minWidth;\n height = cropBoxData.minHeight;\n if (range.x > 0) {\n action = range.y > 0 ? ACTION_SOUTH_EAST : ACTION_NORTH_EAST;\n } else if (range.x < 0) {\n left -= width;\n action = range.y > 0 ? ACTION_SOUTH_WEST : ACTION_NORTH_WEST;\n }\n if (range.y < 0) {\n top -= height;\n }\n\n // Show the crop box if is hidden\n if (!this.cropped) {\n removeClass(this.cropBox, CLASS_HIDDEN);\n this.cropped = true;\n if (this.limited) {\n this.limitCropBox(true, true);\n }\n }\n break;\n }\n if (renderable) {\n cropBoxData.width = width;\n cropBoxData.height = height;\n cropBoxData.left = left;\n cropBoxData.top = top;\n this.action = action;\n this.renderCropBox();\n }\n\n // Override\n forEach(pointers, function (p) {\n p.startX = p.endX;\n p.startY = p.endY;\n });\n }\n};\n\nvar methods = {\n // Show the crop box manually\n crop: function crop() {\n if (this.ready && !this.cropped && !this.disabled) {\n this.cropped = true;\n this.limitCropBox(true, true);\n if (this.options.modal) {\n addClass(this.dragBox, CLASS_MODAL);\n }\n removeClass(this.cropBox, CLASS_HIDDEN);\n this.setCropBoxData(this.initialCropBoxData);\n }\n return this;\n },\n // Reset the image and crop box to their initial states\n reset: function reset() {\n if (this.ready && !this.disabled) {\n this.imageData = assign({}, this.initialImageData);\n this.canvasData = assign({}, this.initialCanvasData);\n this.cropBoxData = assign({}, this.initialCropBoxData);\n this.renderCanvas();\n if (this.cropped) {\n this.renderCropBox();\n }\n }\n return this;\n },\n // Clear the crop box\n clear: function clear() {\n if (this.cropped && !this.disabled) {\n assign(this.cropBoxData, {\n left: 0,\n top: 0,\n width: 0,\n height: 0\n });\n this.cropped = false;\n this.renderCropBox();\n this.limitCanvas(true, true);\n\n // Render canvas after crop box rendered\n this.renderCanvas();\n removeClass(this.dragBox, CLASS_MODAL);\n addClass(this.cropBox, CLASS_HIDDEN);\n }\n return this;\n },\n /**\n * Replace the image's src and rebuild the cropper\n * @param {string} url - The new URL.\n * @param {boolean} [hasSameSize] - Indicate if the new image has the same size as the old one.\n * @returns {Cropper} this\n */\n replace: function replace(url) {\n var hasSameSize = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n if (!this.disabled && url) {\n if (this.isImg) {\n this.element.src = url;\n }\n if (hasSameSize) {\n this.url = url;\n this.image.src = url;\n if (this.ready) {\n this.viewBoxImage.src = url;\n forEach(this.previews, function (element) {\n element.getElementsByTagName('img')[0].src = url;\n });\n }\n } else {\n if (this.isImg) {\n this.replaced = true;\n }\n this.options.data = null;\n this.uncreate();\n this.load(url);\n }\n }\n return this;\n },\n // Enable (unfreeze) the cropper\n enable: function enable() {\n if (this.ready && this.disabled) {\n this.disabled = false;\n removeClass(this.cropper, CLASS_DISABLED);\n }\n return this;\n },\n // Disable (freeze) the cropper\n disable: function disable() {\n if (this.ready && !this.disabled) {\n this.disabled = true;\n addClass(this.cropper, CLASS_DISABLED);\n }\n return this;\n },\n /**\n * Destroy the cropper and remove the instance from the image\n * @returns {Cropper} this\n */\n destroy: function destroy() {\n var element = this.element;\n if (!element[NAMESPACE]) {\n return this;\n }\n element[NAMESPACE] = undefined;\n if (this.isImg && this.replaced) {\n element.src = this.originalUrl;\n }\n this.uncreate();\n return this;\n },\n /**\n * Move the canvas with relative offsets\n * @param {number} offsetX - The relative offset distance on the x-axis.\n * @param {number} [offsetY=offsetX] - The relative offset distance on the y-axis.\n * @returns {Cropper} this\n */\n move: function move(offsetX) {\n var offsetY = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : offsetX;\n var _this$canvasData = this.canvasData,\n left = _this$canvasData.left,\n top = _this$canvasData.top;\n return this.moveTo(isUndefined(offsetX) ? offsetX : left + Number(offsetX), isUndefined(offsetY) ? offsetY : top + Number(offsetY));\n },\n /**\n * Move the canvas to an absolute point\n * @param {number} x - The x-axis coordinate.\n * @param {number} [y=x] - The y-axis coordinate.\n * @returns {Cropper} this\n */\n moveTo: function moveTo(x) {\n var y = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : x;\n var canvasData = this.canvasData;\n var changed = false;\n x = Number(x);\n y = Number(y);\n if (this.ready && !this.disabled && this.options.movable) {\n if (isNumber(x)) {\n canvasData.left = x;\n changed = true;\n }\n if (isNumber(y)) {\n canvasData.top = y;\n changed = true;\n }\n if (changed) {\n this.renderCanvas(true);\n }\n }\n return this;\n },\n /**\n * Zoom the canvas with a relative ratio\n * @param {number} ratio - The target ratio.\n * @param {Event} _originalEvent - The original event if any.\n * @returns {Cropper} this\n */\n zoom: function zoom(ratio, _originalEvent) {\n var canvasData = this.canvasData;\n ratio = Number(ratio);\n if (ratio < 0) {\n ratio = 1 / (1 - ratio);\n } else {\n ratio = 1 + ratio;\n }\n return this.zoomTo(canvasData.width * ratio / canvasData.naturalWidth, null, _originalEvent);\n },\n /**\n * Zoom the canvas to an absolute ratio\n * @param {number} ratio - The target ratio.\n * @param {Object} pivot - The zoom pivot point coordinate.\n * @param {Event} _originalEvent - The original event if any.\n * @returns {Cropper} this\n */\n zoomTo: function zoomTo(ratio, pivot, _originalEvent) {\n var options = this.options,\n canvasData = this.canvasData;\n var width = canvasData.width,\n height = canvasData.height,\n naturalWidth = canvasData.naturalWidth,\n naturalHeight = canvasData.naturalHeight;\n ratio = Number(ratio);\n if (ratio >= 0 && this.ready && !this.disabled && options.zoomable) {\n var newWidth = naturalWidth * ratio;\n var newHeight = naturalHeight * ratio;\n if (dispatchEvent(this.element, EVENT_ZOOM, {\n ratio: ratio,\n oldRatio: width / naturalWidth,\n originalEvent: _originalEvent\n }) === false) {\n return this;\n }\n if (_originalEvent) {\n var pointers = this.pointers;\n var offset = getOffset(this.cropper);\n var center = pointers && Object.keys(pointers).length ? getPointersCenter(pointers) : {\n pageX: _originalEvent.pageX,\n pageY: _originalEvent.pageY\n };\n\n // Zoom from the triggering point of the event\n canvasData.left -= (newWidth - width) * ((center.pageX - offset.left - canvasData.left) / width);\n canvasData.top -= (newHeight - height) * ((center.pageY - offset.top - canvasData.top) / height);\n } else if (isPlainObject(pivot) && isNumber(pivot.x) && isNumber(pivot.y)) {\n canvasData.left -= (newWidth - width) * ((pivot.x - canvasData.left) / width);\n canvasData.top -= (newHeight - height) * ((pivot.y - canvasData.top) / height);\n } else {\n // Zoom from the center of the canvas\n canvasData.left -= (newWidth - width) / 2;\n canvasData.top -= (newHeight - height) / 2;\n }\n canvasData.width = newWidth;\n canvasData.height = newHeight;\n this.renderCanvas(true);\n }\n return this;\n },\n /**\n * Rotate the canvas with a relative degree\n * @param {number} degree - The rotate degree.\n * @returns {Cropper} this\n */\n rotate: function rotate(degree) {\n return this.rotateTo((this.imageData.rotate || 0) + Number(degree));\n },\n /**\n * Rotate the canvas to an absolute degree\n * @param {number} degree - The rotate degree.\n * @returns {Cropper} this\n */\n rotateTo: function rotateTo(degree) {\n degree = Number(degree);\n if (isNumber(degree) && this.ready && !this.disabled && this.options.rotatable) {\n this.imageData.rotate = degree % 360;\n this.renderCanvas(true, true);\n }\n return this;\n },\n /**\n * Scale the image on the x-axis.\n * @param {number} scaleX - The scale ratio on the x-axis.\n * @returns {Cropper} this\n */\n scaleX: function scaleX(_scaleX) {\n var scaleY = this.imageData.scaleY;\n return this.scale(_scaleX, isNumber(scaleY) ? scaleY : 1);\n },\n /**\n * Scale the image on the y-axis.\n * @param {number} scaleY - The scale ratio on the y-axis.\n * @returns {Cropper} this\n */\n scaleY: function scaleY(_scaleY) {\n var scaleX = this.imageData.scaleX;\n return this.scale(isNumber(scaleX) ? scaleX : 1, _scaleY);\n },\n /**\n * Scale the image\n * @param {number} scaleX - The scale ratio on the x-axis.\n * @param {number} [scaleY=scaleX] - The scale ratio on the y-axis.\n * @returns {Cropper} this\n */\n scale: function scale(scaleX) {\n var scaleY = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : scaleX;\n var imageData = this.imageData;\n var transformed = false;\n scaleX = Number(scaleX);\n scaleY = Number(scaleY);\n if (this.ready && !this.disabled && this.options.scalable) {\n if (isNumber(scaleX)) {\n imageData.scaleX = scaleX;\n transformed = true;\n }\n if (isNumber(scaleY)) {\n imageData.scaleY = scaleY;\n transformed = true;\n }\n if (transformed) {\n this.renderCanvas(true, true);\n }\n }\n return this;\n },\n /**\n * Get the cropped area position and size data (base on the original image)\n * @param {boolean} [rounded=false] - Indicate if round the data values or not.\n * @returns {Object} The result cropped data.\n */\n getData: function getData() {\n var rounded = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n var options = this.options,\n imageData = this.imageData,\n canvasData = this.canvasData,\n cropBoxData = this.cropBoxData;\n var data;\n if (this.ready && this.cropped) {\n data = {\n x: cropBoxData.left - canvasData.left,\n y: cropBoxData.top - canvasData.top,\n width: cropBoxData.width,\n height: cropBoxData.height\n };\n var ratio = imageData.width / imageData.naturalWidth;\n forEach(data, function (n, i) {\n data[i] = n / ratio;\n });\n if (rounded) {\n // In case rounding off leads to extra 1px in right or bottom border\n // we should round the top-left corner and the dimension (#343).\n var bottom = Math.round(data.y + data.height);\n var right = Math.round(data.x + data.width);\n data.x = Math.round(data.x);\n data.y = Math.round(data.y);\n data.width = right - data.x;\n data.height = bottom - data.y;\n }\n } else {\n data = {\n x: 0,\n y: 0,\n width: 0,\n height: 0\n };\n }\n if (options.rotatable) {\n data.rotate = imageData.rotate || 0;\n }\n if (options.scalable) {\n data.scaleX = imageData.scaleX || 1;\n data.scaleY = imageData.scaleY || 1;\n }\n return data;\n },\n /**\n * Set the cropped area position and size with new data\n * @param {Object} data - The new data.\n * @returns {Cropper} this\n */\n setData: function setData(data) {\n var options = this.options,\n imageData = this.imageData,\n canvasData = this.canvasData;\n var cropBoxData = {};\n if (this.ready && !this.disabled && isPlainObject(data)) {\n var transformed = false;\n if (options.rotatable) {\n if (isNumber(data.rotate) && data.rotate !== imageData.rotate) {\n imageData.rotate = data.rotate;\n transformed = true;\n }\n }\n if (options.scalable) {\n if (isNumber(data.scaleX) && data.scaleX !== imageData.scaleX) {\n imageData.scaleX = data.scaleX;\n transformed = true;\n }\n if (isNumber(data.scaleY) && data.scaleY !== imageData.scaleY) {\n imageData.scaleY = data.scaleY;\n transformed = true;\n }\n }\n if (transformed) {\n this.renderCanvas(true, true);\n }\n var ratio = imageData.width / imageData.naturalWidth;\n if (isNumber(data.x)) {\n cropBoxData.left = data.x * ratio + canvasData.left;\n }\n if (isNumber(data.y)) {\n cropBoxData.top = data.y * ratio + canvasData.top;\n }\n if (isNumber(data.width)) {\n cropBoxData.width = data.width * ratio;\n }\n if (isNumber(data.height)) {\n cropBoxData.height = data.height * ratio;\n }\n this.setCropBoxData(cropBoxData);\n }\n return this;\n },\n /**\n * Get the container size data.\n * @returns {Object} The result container data.\n */\n getContainerData: function getContainerData() {\n return this.ready ? assign({}, this.containerData) : {};\n },\n /**\n * Get the image position and size data.\n * @returns {Object} The result image data.\n */\n getImageData: function getImageData() {\n return this.sized ? assign({}, this.imageData) : {};\n },\n /**\n * Get the canvas position and size data.\n * @returns {Object} The result canvas data.\n */\n getCanvasData: function getCanvasData() {\n var canvasData = this.canvasData;\n var data = {};\n if (this.ready) {\n forEach(['left', 'top', 'width', 'height', 'naturalWidth', 'naturalHeight'], function (n) {\n data[n] = canvasData[n];\n });\n }\n return data;\n },\n /**\n * Set the canvas position and size with new data.\n * @param {Object} data - The new canvas data.\n * @returns {Cropper} this\n */\n setCanvasData: function setCanvasData(data) {\n var canvasData = this.canvasData;\n var aspectRatio = canvasData.aspectRatio;\n if (this.ready && !this.disabled && isPlainObject(data)) {\n if (isNumber(data.left)) {\n canvasData.left = data.left;\n }\n if (isNumber(data.top)) {\n canvasData.top = data.top;\n }\n if (isNumber(data.width)) {\n canvasData.width = data.width;\n canvasData.height = data.width / aspectRatio;\n } else if (isNumber(data.height)) {\n canvasData.height = data.height;\n canvasData.width = data.height * aspectRatio;\n }\n this.renderCanvas(true);\n }\n return this;\n },\n /**\n * Get the crop box position and size data.\n * @returns {Object} The result crop box data.\n */\n getCropBoxData: function getCropBoxData() {\n var cropBoxData = this.cropBoxData;\n var data;\n if (this.ready && this.cropped) {\n data = {\n left: cropBoxData.left,\n top: cropBoxData.top,\n width: cropBoxData.width,\n height: cropBoxData.height\n };\n }\n return data || {};\n },\n /**\n * Set the crop box position and size with new data.\n * @param {Object} data - The new crop box data.\n * @returns {Cropper} this\n */\n setCropBoxData: function setCropBoxData(data) {\n var cropBoxData = this.cropBoxData;\n var aspectRatio = this.options.aspectRatio;\n var widthChanged;\n var heightChanged;\n if (this.ready && this.cropped && !this.disabled && isPlainObject(data)) {\n if (isNumber(data.left)) {\n cropBoxData.left = data.left;\n }\n if (isNumber(data.top)) {\n cropBoxData.top = data.top;\n }\n if (isNumber(data.width) && data.width !== cropBoxData.width) {\n widthChanged = true;\n cropBoxData.width = data.width;\n }\n if (isNumber(data.height) && data.height !== cropBoxData.height) {\n heightChanged = true;\n cropBoxData.height = data.height;\n }\n if (aspectRatio) {\n if (widthChanged) {\n cropBoxData.height = cropBoxData.width / aspectRatio;\n } else if (heightChanged) {\n cropBoxData.width = cropBoxData.height * aspectRatio;\n }\n }\n this.renderCropBox();\n }\n return this;\n },\n /**\n * Get a canvas drawn the cropped image.\n * @param {Object} [options={}] - The config options.\n * @returns {HTMLCanvasElement} - The result canvas.\n */\n getCroppedCanvas: function getCroppedCanvas() {\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n if (!this.ready || !window.HTMLCanvasElement) {\n return null;\n }\n var canvasData = this.canvasData;\n var source = getSourceCanvas(this.image, this.imageData, canvasData, options);\n\n // Returns the source canvas if it is not cropped.\n if (!this.cropped) {\n return source;\n }\n var _this$getData = this.getData(options.rounded),\n initialX = _this$getData.x,\n initialY = _this$getData.y,\n initialWidth = _this$getData.width,\n initialHeight = _this$getData.height;\n var ratio = source.width / Math.floor(canvasData.naturalWidth);\n if (ratio !== 1) {\n initialX *= ratio;\n initialY *= ratio;\n initialWidth *= ratio;\n initialHeight *= ratio;\n }\n var aspectRatio = initialWidth / initialHeight;\n var maxSizes = getAdjustedSizes({\n aspectRatio: aspectRatio,\n width: options.maxWidth || Infinity,\n height: options.maxHeight || Infinity\n });\n var minSizes = getAdjustedSizes({\n aspectRatio: aspectRatio,\n width: options.minWidth || 0,\n height: options.minHeight || 0\n }, 'cover');\n var _getAdjustedSizes = getAdjustedSizes({\n aspectRatio: aspectRatio,\n width: options.width || (ratio !== 1 ? source.width : initialWidth),\n height: options.height || (ratio !== 1 ? source.height : initialHeight)\n }),\n width = _getAdjustedSizes.width,\n height = _getAdjustedSizes.height;\n width = Math.min(maxSizes.width, Math.max(minSizes.width, width));\n height = Math.min(maxSizes.height, Math.max(minSizes.height, height));\n var canvas = document.createElement('canvas');\n var context = canvas.getContext('2d');\n canvas.width = normalizeDecimalNumber(width);\n canvas.height = normalizeDecimalNumber(height);\n context.fillStyle = options.fillColor || 'transparent';\n context.fillRect(0, 0, width, height);\n var _options$imageSmoothi = options.imageSmoothingEnabled,\n imageSmoothingEnabled = _options$imageSmoothi === void 0 ? true : _options$imageSmoothi,\n imageSmoothingQuality = options.imageSmoothingQuality;\n context.imageSmoothingEnabled = imageSmoothingEnabled;\n if (imageSmoothingQuality) {\n context.imageSmoothingQuality = imageSmoothingQuality;\n }\n\n // https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D.drawImage\n var sourceWidth = source.width;\n var sourceHeight = source.height;\n\n // Source canvas parameters\n var srcX = initialX;\n var srcY = initialY;\n var srcWidth;\n var srcHeight;\n\n // Destination canvas parameters\n var dstX;\n var dstY;\n var dstWidth;\n var dstHeight;\n if (srcX <= -initialWidth || srcX > sourceWidth) {\n srcX = 0;\n srcWidth = 0;\n dstX = 0;\n dstWidth = 0;\n } else if (srcX <= 0) {\n dstX = -srcX;\n srcX = 0;\n srcWidth = Math.min(sourceWidth, initialWidth + srcX);\n dstWidth = srcWidth;\n } else if (srcX <= sourceWidth) {\n dstX = 0;\n srcWidth = Math.min(initialWidth, sourceWidth - srcX);\n dstWidth = srcWidth;\n }\n if (srcWidth <= 0 || srcY <= -initialHeight || srcY > sourceHeight) {\n srcY = 0;\n srcHeight = 0;\n dstY = 0;\n dstHeight = 0;\n } else if (srcY <= 0) {\n dstY = -srcY;\n srcY = 0;\n srcHeight = Math.min(sourceHeight, initialHeight + srcY);\n dstHeight = srcHeight;\n } else if (srcY <= sourceHeight) {\n dstY = 0;\n srcHeight = Math.min(initialHeight, sourceHeight - srcY);\n dstHeight = srcHeight;\n }\n var params = [srcX, srcY, srcWidth, srcHeight];\n\n // Avoid \"IndexSizeError\"\n if (dstWidth > 0 && dstHeight > 0) {\n var scale = width / initialWidth;\n params.push(dstX * scale, dstY * scale, dstWidth * scale, dstHeight * scale);\n }\n\n // All the numerical parameters should be integer for `drawImage`\n // https://github.com/fengyuanchen/cropper/issues/476\n context.drawImage.apply(context, [source].concat(_toConsumableArray(params.map(function (param) {\n return Math.floor(normalizeDecimalNumber(param));\n }))));\n return canvas;\n },\n /**\n * Change the aspect ratio of the crop box.\n * @param {number} aspectRatio - The new aspect ratio.\n * @returns {Cropper} this\n */\n setAspectRatio: function setAspectRatio(aspectRatio) {\n var options = this.options;\n if (!this.disabled && !isUndefined(aspectRatio)) {\n // 0 -> NaN\n options.aspectRatio = Math.max(0, aspectRatio) || NaN;\n if (this.ready) {\n this.initCropBox();\n if (this.cropped) {\n this.renderCropBox();\n }\n }\n }\n return this;\n },\n /**\n * Change the drag mode.\n * @param {string} mode - The new drag mode.\n * @returns {Cropper} this\n */\n setDragMode: function setDragMode(mode) {\n var options = this.options,\n dragBox = this.dragBox,\n face = this.face;\n if (this.ready && !this.disabled) {\n var croppable = mode === DRAG_MODE_CROP;\n var movable = options.movable && mode === DRAG_MODE_MOVE;\n mode = croppable || movable ? mode : DRAG_MODE_NONE;\n options.dragMode = mode;\n setData(dragBox, DATA_ACTION, mode);\n toggleClass(dragBox, CLASS_CROP, croppable);\n toggleClass(dragBox, CLASS_MOVE, movable);\n if (!options.cropBoxMovable) {\n // Sync drag mode to crop box when it is not movable\n setData(face, DATA_ACTION, mode);\n toggleClass(face, CLASS_CROP, croppable);\n toggleClass(face, CLASS_MOVE, movable);\n }\n }\n return this;\n }\n};\n\nvar AnotherCropper = WINDOW.Cropper;\nvar Cropper = /*#__PURE__*/function () {\n /**\n * Create a new Cropper.\n * @param {Element} element - The target element for cropping.\n * @param {Object} [options={}] - The configuration options.\n */\n function Cropper(element) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n _classCallCheck(this, Cropper);\n if (!element || !REGEXP_TAG_NAME.test(element.tagName)) {\n throw new Error('The first argument is required and must be an or element.');\n }\n this.element = element;\n this.options = assign({}, DEFAULTS, isPlainObject(options) && options);\n this.cropped = false;\n this.disabled = false;\n this.pointers = {};\n this.ready = false;\n this.reloading = false;\n this.replaced = false;\n this.sized = false;\n this.sizing = false;\n this.init();\n }\n return _createClass(Cropper, [{\n key: \"init\",\n value: function init() {\n var element = this.element;\n var tagName = element.tagName.toLowerCase();\n var url;\n if (element[NAMESPACE]) {\n return;\n }\n element[NAMESPACE] = this;\n if (tagName === 'img') {\n this.isImg = true;\n\n // e.g.: \"img/picture.jpg\"\n url = element.getAttribute('src') || '';\n this.originalUrl = url;\n\n // Stop when it's a blank image\n if (!url) {\n return;\n }\n\n // e.g.: \"https://example.com/img/picture.jpg\"\n url = element.src;\n } else if (tagName === 'canvas' && window.HTMLCanvasElement) {\n url = element.toDataURL();\n }\n this.load(url);\n }\n }, {\n key: \"load\",\n value: function load(url) {\n var _this = this;\n if (!url) {\n return;\n }\n this.url = url;\n this.imageData = {};\n var element = this.element,\n options = this.options;\n if (!options.rotatable && !options.scalable) {\n options.checkOrientation = false;\n }\n\n // Only IE10+ supports Typed Arrays\n if (!options.checkOrientation || !window.ArrayBuffer) {\n this.clone();\n return;\n }\n\n // Detect the mime type of the image directly if it is a Data URL\n if (REGEXP_DATA_URL.test(url)) {\n // Read ArrayBuffer from Data URL of JPEG images directly for better performance\n if (REGEXP_DATA_URL_JPEG.test(url)) {\n this.read(dataURLToArrayBuffer(url));\n } else {\n // Only a JPEG image may contains Exif Orientation information,\n // the rest types of Data URLs are not necessary to check orientation at all.\n this.clone();\n }\n return;\n }\n\n // 1. Detect the mime type of the image by a XMLHttpRequest.\n // 2. Load the image as ArrayBuffer for reading orientation if its a JPEG image.\n var xhr = new XMLHttpRequest();\n var clone = this.clone.bind(this);\n this.reloading = true;\n this.xhr = xhr;\n\n // 1. Cross origin requests are only supported for protocol schemes:\n // http, https, data, chrome, chrome-extension.\n // 2. Access to XMLHttpRequest from a Data URL will be blocked by CORS policy\n // in some browsers as IE11 and Safari.\n xhr.onabort = clone;\n xhr.onerror = clone;\n xhr.ontimeout = clone;\n xhr.onprogress = function () {\n // Abort the request directly if it not a JPEG image for better performance\n if (xhr.getResponseHeader('content-type') !== MIME_TYPE_JPEG) {\n xhr.abort();\n }\n };\n xhr.onload = function () {\n _this.read(xhr.response);\n };\n xhr.onloadend = function () {\n _this.reloading = false;\n _this.xhr = null;\n };\n\n // Bust cache when there is a \"crossOrigin\" property to avoid browser cache error\n if (options.checkCrossOrigin && isCrossOriginURL(url) && element.crossOrigin) {\n url = addTimestamp(url);\n }\n\n // The third parameter is required for avoiding side-effect (#682)\n xhr.open('GET', url, true);\n xhr.responseType = 'arraybuffer';\n xhr.withCredentials = element.crossOrigin === 'use-credentials';\n xhr.send();\n }\n }, {\n key: \"read\",\n value: function read(arrayBuffer) {\n var options = this.options,\n imageData = this.imageData;\n\n // Reset the orientation value to its default value 1\n // as some iOS browsers will render image with its orientation\n var orientation = resetAndGetOrientation(arrayBuffer);\n var rotate = 0;\n var scaleX = 1;\n var scaleY = 1;\n if (orientation > 1) {\n // Generate a new URL which has the default orientation value\n this.url = arrayBufferToDataURL(arrayBuffer, MIME_TYPE_JPEG);\n var _parseOrientation = parseOrientation(orientation);\n rotate = _parseOrientation.rotate;\n scaleX = _parseOrientation.scaleX;\n scaleY = _parseOrientation.scaleY;\n }\n if (options.rotatable) {\n imageData.rotate = rotate;\n }\n if (options.scalable) {\n imageData.scaleX = scaleX;\n imageData.scaleY = scaleY;\n }\n this.clone();\n }\n }, {\n key: \"clone\",\n value: function clone() {\n var element = this.element,\n url = this.url;\n var crossOrigin = element.crossOrigin;\n var crossOriginUrl = url;\n if (this.options.checkCrossOrigin && isCrossOriginURL(url)) {\n if (!crossOrigin) {\n crossOrigin = 'anonymous';\n }\n\n // Bust cache when there is not a \"crossOrigin\" property (#519)\n crossOriginUrl = addTimestamp(url);\n }\n this.crossOrigin = crossOrigin;\n this.crossOriginUrl = crossOriginUrl;\n var image = document.createElement('img');\n if (crossOrigin) {\n image.crossOrigin = crossOrigin;\n }\n image.src = crossOriginUrl || url;\n image.alt = element.alt || 'The image to crop';\n this.image = image;\n image.onload = this.start.bind(this);\n image.onerror = this.stop.bind(this);\n addClass(image, CLASS_HIDE);\n element.parentNode.insertBefore(image, element.nextSibling);\n }\n }, {\n key: \"start\",\n value: function start() {\n var _this2 = this;\n var image = this.image;\n image.onload = null;\n image.onerror = null;\n this.sizing = true;\n\n // Match all browsers that use WebKit as the layout engine in iOS devices,\n // such as Safari for iOS, Chrome for iOS, and in-app browsers.\n var isIOSWebKit = WINDOW.navigator && /(?:iPad|iPhone|iPod).*?AppleWebKit/i.test(WINDOW.navigator.userAgent);\n var done = function done(naturalWidth, naturalHeight) {\n assign(_this2.imageData, {\n naturalWidth: naturalWidth,\n naturalHeight: naturalHeight,\n aspectRatio: naturalWidth / naturalHeight\n });\n _this2.initialImageData = assign({}, _this2.imageData);\n _this2.sizing = false;\n _this2.sized = true;\n _this2.build();\n };\n\n // Most modern browsers (excepts iOS WebKit)\n if (image.naturalWidth && !isIOSWebKit) {\n done(image.naturalWidth, image.naturalHeight);\n return;\n }\n var sizingImage = document.createElement('img');\n var body = document.body || document.documentElement;\n this.sizingImage = sizingImage;\n sizingImage.onload = function () {\n done(sizingImage.width, sizingImage.height);\n if (!isIOSWebKit) {\n body.removeChild(sizingImage);\n }\n };\n sizingImage.src = image.src;\n\n // iOS WebKit will convert the image automatically\n // with its orientation once append it into DOM (#279)\n if (!isIOSWebKit) {\n sizingImage.style.cssText = 'left:0;' + 'max-height:none!important;' + 'max-width:none!important;' + 'min-height:0!important;' + 'min-width:0!important;' + 'opacity:0;' + 'position:absolute;' + 'top:0;' + 'z-index:-1;';\n body.appendChild(sizingImage);\n }\n }\n }, {\n key: \"stop\",\n value: function stop() {\n var image = this.image;\n image.onload = null;\n image.onerror = null;\n image.parentNode.removeChild(image);\n this.image = null;\n }\n }, {\n key: \"build\",\n value: function build() {\n if (!this.sized || this.ready) {\n return;\n }\n var element = this.element,\n options = this.options,\n image = this.image;\n\n // Create cropper elements\n var container = element.parentNode;\n var template = document.createElement('div');\n template.innerHTML = TEMPLATE;\n var cropper = template.querySelector(\".\".concat(NAMESPACE, \"-container\"));\n var canvas = cropper.querySelector(\".\".concat(NAMESPACE, \"-canvas\"));\n var dragBox = cropper.querySelector(\".\".concat(NAMESPACE, \"-drag-box\"));\n var cropBox = cropper.querySelector(\".\".concat(NAMESPACE, \"-crop-box\"));\n var face = cropBox.querySelector(\".\".concat(NAMESPACE, \"-face\"));\n this.container = container;\n this.cropper = cropper;\n this.canvas = canvas;\n this.dragBox = dragBox;\n this.cropBox = cropBox;\n this.viewBox = cropper.querySelector(\".\".concat(NAMESPACE, \"-view-box\"));\n this.face = face;\n canvas.appendChild(image);\n\n // Hide the original image\n addClass(element, CLASS_HIDDEN);\n\n // Inserts the cropper after to the current image\n container.insertBefore(cropper, element.nextSibling);\n\n // Show the hidden image\n removeClass(image, CLASS_HIDE);\n this.initPreview();\n this.bind();\n options.initialAspectRatio = Math.max(0, options.initialAspectRatio) || NaN;\n options.aspectRatio = Math.max(0, options.aspectRatio) || NaN;\n options.viewMode = Math.max(0, Math.min(3, Math.round(options.viewMode))) || 0;\n addClass(cropBox, CLASS_HIDDEN);\n if (!options.guides) {\n addClass(cropBox.getElementsByClassName(\"\".concat(NAMESPACE, \"-dashed\")), CLASS_HIDDEN);\n }\n if (!options.center) {\n addClass(cropBox.getElementsByClassName(\"\".concat(NAMESPACE, \"-center\")), CLASS_HIDDEN);\n }\n if (options.background) {\n addClass(cropper, \"\".concat(NAMESPACE, \"-bg\"));\n }\n if (!options.highlight) {\n addClass(face, CLASS_INVISIBLE);\n }\n if (options.cropBoxMovable) {\n addClass(face, CLASS_MOVE);\n setData(face, DATA_ACTION, ACTION_ALL);\n }\n if (!options.cropBoxResizable) {\n addClass(cropBox.getElementsByClassName(\"\".concat(NAMESPACE, \"-line\")), CLASS_HIDDEN);\n addClass(cropBox.getElementsByClassName(\"\".concat(NAMESPACE, \"-point\")), CLASS_HIDDEN);\n }\n this.render();\n this.ready = true;\n this.setDragMode(options.dragMode);\n if (options.autoCrop) {\n this.crop();\n }\n this.setData(options.data);\n if (isFunction(options.ready)) {\n addListener(element, EVENT_READY, options.ready, {\n once: true\n });\n }\n dispatchEvent(element, EVENT_READY);\n }\n }, {\n key: \"unbuild\",\n value: function unbuild() {\n if (!this.ready) {\n return;\n }\n this.ready = false;\n this.unbind();\n this.resetPreview();\n var parentNode = this.cropper.parentNode;\n if (parentNode) {\n parentNode.removeChild(this.cropper);\n }\n removeClass(this.element, CLASS_HIDDEN);\n }\n }, {\n key: \"uncreate\",\n value: function uncreate() {\n if (this.ready) {\n this.unbuild();\n this.ready = false;\n this.cropped = false;\n } else if (this.sizing) {\n this.sizingImage.onload = null;\n this.sizing = false;\n this.sized = false;\n } else if (this.reloading) {\n this.xhr.onabort = null;\n this.xhr.abort();\n } else if (this.image) {\n this.stop();\n }\n }\n\n /**\n * Get the no conflict cropper class.\n * @returns {Cropper} The cropper class.\n */\n }], [{\n key: \"noConflict\",\n value: function noConflict() {\n window.Cropper = AnotherCropper;\n return Cropper;\n }\n\n /**\n * Change the default options.\n * @param {Object} options - The new default options.\n */\n }, {\n key: \"setDefaults\",\n value: function setDefaults(options) {\n assign(DEFAULTS, isPlainObject(options) && options);\n }\n }]);\n}();\nassign(Cropper.prototype, render, preview, events, handlers, change, methods);\n\nexport { Cropper as default };\n"],"names":["ownKeys","e","r","t","o","_objectSpread2","_defineProperty","_toPrimitive","_toPropertyKey","i","_typeof","_classCallCheck","instance","Constructor","_defineProperties","target","props","descriptor","_createClass","protoProps","staticProps","obj","key","value","_toConsumableArray","arr","_arrayWithoutHoles","_iterableToArray","_unsupportedIterableToArray","_nonIterableSpread","_arrayLikeToArray","iter","minLen","n","len","arr2","IS_BROWSER","WINDOW","IS_TOUCH_DEVICE","HAS_POINTER_EVENT","NAMESPACE","ACTION_ALL","ACTION_CROP","ACTION_MOVE","ACTION_ZOOM","ACTION_EAST","ACTION_WEST","ACTION_SOUTH","ACTION_NORTH","ACTION_NORTH_EAST","ACTION_NORTH_WEST","ACTION_SOUTH_EAST","ACTION_SOUTH_WEST","CLASS_CROP","CLASS_DISABLED","CLASS_HIDDEN","CLASS_HIDE","CLASS_INVISIBLE","CLASS_MODAL","CLASS_MOVE","DATA_ACTION","DATA_PREVIEW","DRAG_MODE_CROP","DRAG_MODE_MOVE","DRAG_MODE_NONE","EVENT_CROP","EVENT_CROP_END","EVENT_CROP_MOVE","EVENT_CROP_START","EVENT_DBLCLICK","EVENT_TOUCH_START","EVENT_TOUCH_MOVE","EVENT_TOUCH_END","EVENT_POINTER_DOWN","EVENT_POINTER_MOVE","EVENT_POINTER_UP","EVENT_READY","EVENT_RESIZE","EVENT_WHEEL","EVENT_ZOOM","MIME_TYPE_JPEG","REGEXP_ACTIONS","REGEXP_DATA_URL","REGEXP_DATA_URL_JPEG","REGEXP_TAG_NAME","MIN_CONTAINER_WIDTH","MIN_CONTAINER_HEIGHT","DEFAULTS","TEMPLATE","isNaN","isNumber","isPositiveNumber","isUndefined","isObject","hasOwnProperty","isPlainObject","_constructor","prototype","isFunction","slice","toArray","forEach","data","callback","assign","_len","args","_key","arg","REGEXP_DECIMALS","normalizeDecimalNumber","times","REGEXP_SUFFIX","setStyle","element","styles","style","property","hasClass","addClass","elem","className","removeClass","toggleClass","added","REGEXP_CAMEL_CASE","toParamCase","getData","name","setData","removeData","REGEXP_SPACES","onceSupported","supported","once","listener","options","removeListener","type","handler","event","listeners","addListener","_handler","_element$listeners","_len2","_key2","dispatchEvent","getOffset","box","location","REGEXP_ORIGINS","isCrossOriginURL","url","parts","addTimestamp","timestamp","getTransforms","_ref","rotate","scaleX","scaleY","translateX","translateY","values","transform","getMaxZoomRatio","pointers","pointers2","maxRatio","pointer","pointerId","pointer2","x1","y1","x2","y2","z1","z2","ratio","getPointer","_ref2","endOnly","pageX","pageY","end","getPointersCenter","count","_ref3","startX","startY","getAdjustedSizes","_ref4","aspectRatio","height","width","isValidWidth","isValidHeight","adjustedWidth","getRotatedSizes","_ref5","degree","arc","sinArc","cosArc","newWidth","newHeight","getSourceCanvas","image","_ref6","_ref7","_ref8","imageAspectRatio","imageNaturalWidth","imageNaturalHeight","_ref6$rotate","_ref6$scaleX","_ref6$scaleY","naturalWidth","naturalHeight","_ref8$fillColor","fillColor","_ref8$imageSmoothingE","imageSmoothingEnabled","_ref8$imageSmoothingQ","imageSmoothingQuality","_ref8$maxWidth","maxWidth","_ref8$maxHeight","maxHeight","_ref8$minWidth","minWidth","_ref8$minHeight","minHeight","canvas","context","maxSizes","minSizes","destMaxSizes","destMinSizes","destWidth","destHeight","params","param","fromCharCode","getStringFromCharCode","dataView","start","length","str","REGEXP_DATA_URL_HEAD","dataURLToArrayBuffer","dataURL","base64","binary","arrayBuffer","uint8","arrayBufferToDataURL","mimeType","chunks","chunkSize","resetAndGetOrientation","orientation","littleEndian","app1Start","ifdStart","offset","exifIDCode","tiffOffset","endianness","firstIFDOffset","_length","_offset","parseOrientation","render","container","cropper","containerData","imageData","viewMode","rotated","canvasWidth","canvasHeight","canvasData","sizeLimited","positionLimited","cropBoxData","cropped","minCanvasWidth","minCanvasHeight","_getAdjustedSizes","newCanvasLeft","newCanvasTop","changed","transformed","_getRotatedSizes","autoCropArea","limited","minCropBoxWidth","minCropBoxHeight","maxCropBoxWidth","maxCropBoxHeight","preview","crossOrigin","alt","previews","el","img","cropBoxWidth","cropBoxHeight","left","top","originalWidth","originalHeight","events","handlers","ratioX","ratioY","_this","delta","buttons","button","action","touch","change","right","bottom","minLeft","minTop","renderable","range","check","side","p","methods","hasSameSize","offsetX","offsetY","_this$canvasData","x","y","_originalEvent","pivot","center","_scaleX","_scaleY","rounded","widthChanged","heightChanged","source","_this$getData","initialX","initialY","initialWidth","initialHeight","_options$imageSmoothi","sourceWidth","sourceHeight","srcX","srcY","srcWidth","srcHeight","dstX","dstY","dstWidth","dstHeight","scale","mode","dragBox","face","croppable","movable","AnotherCropper","Cropper","tagName","xhr","clone","_parseOrientation","crossOriginUrl","_this2","isIOSWebKit","done","sizingImage","body","template","cropBox","parentNode"],"mappings":"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","x_google_ignoreList":[0]}