From e3e69b1da4855c584f563f6ff75e3bca74e9c50f Mon Sep 17 00:00:00 2001 From: Tony Air Date: Sat, 1 Jun 2019 00:56:48 +0700 Subject: [PATCH] Language fix --- dist/app.js | 2 +- dist/app.js.map | 2 +- dist/index.html | 2 +- src/_ui.form.croppie.js | 4 ++-- src/index.html | 6 +++--- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/dist/app.js b/dist/app.js index 5012397..d687ad7 100644 --- a/dist/app.js +++ b/dist/app.js @@ -8,5 +8,5 @@ * * Date: 2019-03-10T09:55:53.729Z */ -t.exports=function(){"use strict";function t(e){return(t="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t})(e)}function e(t,e){for(var i=0;i0&&t<1/0};function B(t){return void 0===t}function L(e){return"object"===t(e)&&null!==e}var R=Object.prototype.hasOwnProperty;function N(t){if(!L(t))return!1;try{var e=t.constructor,i=e.prototype;return e&&i&&R.call(i,"isPrototypeOf")}catch(t){return!1}}function I(t){return"function"==typeof t}var _=Array.prototype.slice;function j(t){return Array.from?Array.from(t):_.call(t)}function A(t,e){return t&&I(e)&&(Array.isArray(t)||T(t.length)?j(t).forEach(function(i,a){e.call(t,i,a,t)}):L(t)&&Object.keys(t).forEach(function(i){e.call(t,t[i],i,t)})),t}var S=Object.assign||function(t){for(var e=arguments.length,i=new Array(e>1?e-1:0),a=1;a0&&i.forEach(function(e){L(e)&&Object.keys(e).forEach(function(i){t[i]=e[i]})}),t},W=/\.\d*(?:0|9){12}\d*$/;function z(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1e11;return W.test(t)?Math.round(t*e)/e:t}var H=/^width|height|left|top|marginLeft|marginTop$/;function $(t,e){var i=t.style;A(e,function(t,e){H.test(e)&&T(t)&&(t="".concat(t,"px")),i[e]=t})}function X(t,e){if(e)if(T(t.length))A(t,function(t){X(t,e)});else if(t.classList)t.classList.add(e);else{var i=t.className.trim();i?i.indexOf(e)<0&&(t.className="".concat(i," ").concat(e)):t.className=e}}function Y(t,e){e&&(T(t.length)?A(t,function(t){Y(t,e)}):t.classList?t.classList.remove(e):t.className.indexOf(e)>=0&&(t.className=t.className.replace(e,"")))}function U(t,e,i){e&&(T(t.length)?A(t,function(t){U(t,e,i)}):i?X(t,e):Y(t,e))}var P=/([a-z\d])([A-Z])/g;function F(t){return t.replace(P,"$1-$2").toLowerCase()}function q(t,e){return L(t[e])?t[e]:t.dataset?t.dataset[e]:t.getAttribute("data-".concat(F(e)))}function Q(t,e,i){L(i)?t[e]=i:t.dataset?t.dataset[e]=i:t.setAttribute("data-".concat(F(e)),i)}var J=/\s\s*/,V=function(){var t=!1;if(a){var e=!1,i=function(){},o=Object.defineProperty({},"once",{get:function(){return t=!0,e},set:function(t){e=t}});n.addEventListener("test",i,o),n.removeEventListener("test",i,o)}return t}();function G(t,e,i){var a=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{},n=i;e.trim().split(J).forEach(function(e){if(!V){var o=t.listeners;o&&o[e]&&o[e][i]&&(n=o[e][i],delete o[e][i],0===Object.keys(o[e]).length&&delete o[e],0===Object.keys(o).length&&delete t.listeners)}t.removeEventListener(e,n,a)})}function Z(t,e,i){var a=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{},n=i;e.trim().split(J).forEach(function(e){if(a.once&&!V){var o=t.listeners,r=void 0===o?{}:o;n=function(){delete r[e][i],t.removeEventListener(e,n,a);for(var o=arguments.length,s=new Array(o),h=0;h1&&void 0!==arguments[1]?arguments[1]:"contain",o=O(a),r=O(i);if(o&&r){var s=i*e;"contain"===n&&s>a||"cover"===n&&s=8&&(o=c+l)}}}if(o){var d,u,m=i.getUint16(o,a);for(u=0;ut.width?3===i?s=t.height*r:h=t.width/r:3===i?h=t.width/r:s=t.height*r;var c={aspectRatio:r,naturalWidth:n,naturalHeight:o,width:s,height:h};c.left=(t.width-s)/2,c.top=(t.height-h)/2,c.oldLeft=c.left,c.oldTop=c.top,this.canvasData=c,this.limited=1===i||2===i,this.limitCanvas(!0,!0),this.initialImageData=S({},e),this.initialCanvasData=S({},c)},limitCanvas:function(t,e){var i=this.options,a=this.containerData,n=this.canvasData,o=this.cropBoxData,r=i.viewMode,s=n.aspectRatio,h=this.cropped&&o;if(t){var c=Number(i.minCanvasWidth)||0,p=Number(i.minCanvasHeight)||0;r>1?(c=Math.max(c,a.width),p=Math.max(p,a.height),3===r&&(p*s>c?c=p*s:p=c/s)):r>0&&(c?c=Math.max(c,h?o.width:0):p?p=Math.max(p,h?o.height:0):h&&(c=o.width,(p=o.height)*s>c?c=p*s:p=c/s));var l=st({aspectRatio:s,width:c,height:p});c=l.width,p=l.height,n.minWidth=c,n.minHeight=p,n.maxWidth=1/0,n.maxHeight=1/0}if(e)if(r>(h?0:1)){var d=a.width-n.width,u=a.height-n.height;n.minLeft=Math.min(0,d),n.minTop=Math.min(0,u),n.maxLeft=Math.max(0,d),n.maxTop=Math.max(0,u),h&&this.limited&&(n.minLeft=Math.min(o.left,o.left+(o.width-n.width)),n.minTop=Math.min(o.top,o.top+(o.height-n.height)),n.maxLeft=o.left,n.maxTop=o.top,2===r&&(n.width>=a.width&&(n.minLeft=Math.min(0,d),n.maxLeft=Math.max(0,d)),n.height>=a.height&&(n.minTop=Math.min(0,u),n.maxTop=Math.max(0,u))))}else n.minLeft=-n.width,n.minTop=-n.height,n.maxLeft=a.width,n.maxTop=a.height},renderCanvas:function(t,e){var i=this.canvasData,a=this.imageData;if(e){var n=function(t){var e=t.width,i=t.height,a=t.degree;if(90==(a=Math.abs(a)%180))return{width:i,height:e};var n=a%90*Math.PI/180,o=Math.sin(n),r=Math.cos(n),s=e*r+i*o,h=e*o+i*r;return a>90?{width:h,height:s}:{width:s,height:h}}({width:a.naturalWidth*Math.abs(a.scaleX||1),height:a.naturalHeight*Math.abs(a.scaleY||1),degree:a.rotate||0}),o=n.width,r=n.height,s=i.width*(o/i.naturalWidth),h=i.height*(r/i.naturalHeight);i.left-=(s-i.width)/2,i.top-=(h-i.height)/2,i.width=s,i.height=h,i.aspectRatio=o/r,i.naturalWidth=o,i.naturalHeight=r,this.limitCanvas(!0,!1)}(i.width>i.maxWidth||i.widthi.maxHeight||i.heighte.width?n.height=n.width/i:n.width=n.height*i),this.cropBoxData=n,this.limitCropBox(!0,!0),n.width=Math.min(Math.max(n.width,n.minWidth),n.maxWidth),n.height=Math.min(Math.max(n.height,n.minHeight),n.maxHeight),n.width=Math.max(n.minWidth,n.width*a),n.height=Math.max(n.minHeight,n.height*a),n.left=e.left+(e.width-n.width)/2,n.top=e.top+(e.height-n.height)/2,n.oldLeft=n.left,n.oldTop=n.top,this.initialCropBoxData=S({},n)},limitCropBox:function(t,e){var i=this.options,a=this.containerData,n=this.canvasData,o=this.cropBoxData,r=this.limited,s=i.aspectRatio;if(t){var h=Number(i.minCropBoxWidth)||0,c=Number(i.minCropBoxHeight)||0,p=r?Math.min(a.width,n.width,n.width+n.left,a.width-n.left):a.width,l=r?Math.min(a.height,n.height,n.height+n.top,a.height-n.top):a.height;h=Math.min(h,a.width),c=Math.min(c,a.height),s&&(h&&c?c*s>h?c=h/s:h=c*s:h?c=h/s:c&&(h=c*s),l*s>p?l=p/s:p=l*s),o.minWidth=Math.min(h,p),o.minHeight=Math.min(c,l),o.maxWidth=p,o.maxHeight=l}e&&(r?(o.minLeft=Math.max(0,n.left),o.minTop=Math.max(0,n.top),o.maxLeft=Math.min(a.width,n.left+n.width)-o.width,o.maxTop=Math.min(a.height,n.top+n.height)-o.height):(o.minLeft=0,o.minTop=0,o.maxLeft=a.width-o.width,o.maxTop=a.height-o.height))},renderCropBox:function(){var t=this.options,e=this.containerData,i=this.cropBoxData;(i.width>i.maxWidth||i.widthi.maxHeight||i.height=e.width&&i.height>=e.height?"move":"all"),$(this.cropBox,S({width:i.width,height:i.height},ot({translateX:i.left,translateY:i.top}))),this.cropped&&this.limited&&this.limitCanvas(!0,!0),this.disabled||this.output()},output:function(){this.preview(),K(this.element,"crop",this.getData())}},dt={initPreview:function(){var t=this.crossOrigin,e=this.options.preview,i=t?this.crossOriginUrl:this.url,a=document.createElement("img");if(t&&(a.crossOrigin=t),a.src=i,this.viewBox.appendChild(a),this.viewBoxImage=a,e){var n=e;"string"==typeof e?n=this.element.ownerDocument.querySelectorAll(e):e.querySelector&&(n=[e]),this.previews=n,A(n,function(e){var a=document.createElement("img");Q(e,g,{width:e.offsetWidth,height:e.offsetHeight,html:e.innerHTML}),t&&(a.crossOrigin=t),a.src=i,a.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;"',e.innerHTML="",e.appendChild(a)})}},resetPreview:function(){A(this.previews,function(t){var e=q(t,g);$(t,{width:e.width,height:e.height}),t.innerHTML=e.html,function(t,e){if(L(t[e]))try{delete t[e]}catch(i){t[e]=void 0}else if(t.dataset)try{delete t.dataset[e]}catch(i){t.dataset[e]=void 0}else t.removeAttribute("data-".concat(F(e)))}(t,g)})},preview:function(){var t=this.imageData,e=this.canvasData,i=this.cropBoxData,a=i.width,n=i.height,o=t.width,r=t.height,s=i.left-e.left-t.left,h=i.top-e.top-t.top;this.cropped&&!this.disabled&&($(this.viewBoxImage,S({width:o,height:r},ot(S({translateX:-s,translateY:-h},t)))),A(this.previews,function(e){var i=q(e,g),c=i.width,p=i.height,l=c,d=p,u=1;a&&(d=n*(u=c/a)),n&&d>p&&(l=a*(u=p/n),d=p),$(e,{width:l,height:d}),$(e.getElementsByTagName("img")[0],S({width:o*u,height:r*u},ot(S({translateX:-s*u,translateY:-h*u},t))))}))}},ut={bind:function(){var t=this.element,e=this.options,i=this.cropper;I(e.cropstart)&&Z(t,"cropstart",e.cropstart),I(e.cropmove)&&Z(t,"cropmove",e.cropmove),I(e.cropend)&&Z(t,"cropend",e.cropend),I(e.crop)&&Z(t,"crop",e.crop),I(e.zoom)&&Z(t,"zoom",e.zoom),Z(i,b,this.onCropStart=this.cropStart.bind(this)),e.zoomable&&e.zoomOnWheel&&Z(i,"wheel",this.onWheel=this.wheel.bind(this),{passive:!1,capture:!0}),e.toggleDragModeOnDblclick&&Z(i,"dblclick",this.onDblclick=this.dblclick.bind(this)),Z(t.ownerDocument,y,this.onCropMove=this.cropMove.bind(this)),Z(t.ownerDocument,x,this.onCropEnd=this.cropEnd.bind(this)),e.responsive&&Z(window,"resize",this.onResize=this.resize.bind(this))},unbind:function(){var t=this.element,e=this.options,i=this.cropper;I(e.cropstart)&&G(t,"cropstart",e.cropstart),I(e.cropmove)&&G(t,"cropmove",e.cropmove),I(e.cropend)&&G(t,"cropend",e.cropend),I(e.crop)&&G(t,"crop",e.crop),I(e.zoom)&&G(t,"zoom",e.zoom),G(i,b,this.onCropStart),e.zoomable&&e.zoomOnWheel&&G(i,"wheel",this.onWheel,{passive:!1,capture:!0}),e.toggleDragModeOnDblclick&&G(i,"dblclick",this.onDblclick),G(t.ownerDocument,y,this.onCropMove),G(t.ownerDocument,x,this.onCropEnd),e.responsive&&G(window,"resize",this.onResize)}},mt={resize:function(){var t=this.options,e=this.container,i=this.containerData,a=Number(t.minContainerWidth)||200,n=Number(t.minContainerHeight)||100;if(!(this.disabled||i.width<=a||i.height<=n)){var o,r,s=e.offsetWidth/i.width;1===s&&e.offsetHeight===i.height||(t.restore&&(o=this.getCanvasData(),r=this.getCropBoxData()),this.render(),t.restore&&(this.setCanvasData(A(o,function(t,e){o[e]=t*s})),this.setCropBoxData(A(r,function(t,e){r[e]=t*s}))))}},dblclick:function(){var t,e;this.disabled||"none"===this.options.dragMode||this.setDragMode((t=this.dragBox,e=s,(t.classList?t.classList.contains(e):t.className.indexOf(e)>-1)?"move":"crop"))},wheel:function(t){var e=this,i=Number(this.options.wheelZoomRatio)||.1,a=1;this.disabled||(t.preventDefault(),this.wheeling||(this.wheeling=!0,setTimeout(function(){e.wheeling=!1},50),t.deltaY?a=t.deltaY>0?1:-1:t.wheelDelta?a=-t.wheelDelta/120:t.detail&&(a=t.detail>0?1:-1),this.zoom(-a*i,t)))},cropStart:function(t){var e=t.buttons,i=t.button;if(!(this.disabled||T(e)&&1!==e||T(i)&&0!==i||t.ctrlKey)){var a,n=this.options,o=this.pointers;t.changedTouches?A(t.changedTouches,function(t){o[t.identifier]=rt(t)}):o[t.pointerId||0]=rt(t),a=Object.keys(o).length>1&&n.zoomable&&n.zoomOnTouch?"zoom":q(t.target,m),M.test(a)&&!1!==K(this.element,"cropstart",{originalEvent:t,action:a})&&(t.preventDefault(),this.action=a,this.cropping=!1,"crop"===a&&(this.cropping=!0,X(this.dragBox,d)))}},cropMove:function(t){var e=this.action;if(!this.disabled&&e){var i=this.pointers;t.preventDefault(),!1!==K(this.element,"cropmove",{originalEvent:t,action:e})&&(t.changedTouches?A(t.changedTouches,function(t){S(i[t.identifier]||{},rt(t,!0))}):S(i[t.pointerId||0]||{},rt(t,!0)),this.change(t))}},cropEnd:function(t){if(!this.disabled){var e=this.action,i=this.pointers;t.changedTouches?A(t.changedTouches,function(t){delete i[t.identifier]}):delete i[t.pointerId||0],e&&(t.preventDefault(),Object.keys(i).length||(this.action=""),this.cropping&&(this.cropping=!1,U(this.dragBox,d,this.cropped&&this.options.modal)),K(this.element,"cropend",{originalEvent:t,action:e}))}}},gt={change:function(t){var e,i=this.options,a=this.canvasData,n=this.containerData,o=this.cropBoxData,r=this.pointers,s=this.action,h=i.aspectRatio,p=o.left,l=o.top,d=o.width,u=o.height,m=p+d,g=l+u,f=0,v=0,w=n.width,b=n.height,y=!0;!h&&t.shiftKey&&(h=d&&u?d/u:1),this.limited&&(f=o.minLeft,v=o.minTop,w=f+Math.min(n.width,a.width,a.left+a.width),b=v+Math.min(n.height,a.height,a.top+a.height));var x=r[Object.keys(r)[0]],M={x:x.endX-x.startX,y:x.endY-x.startY},D=function(t){switch(t){case"e":m+M.x>w&&(M.x=w-m);break;case"w":p+M.xb&&(M.y=b-g)}};switch(s){case"all":p+=M.x,l+=M.y;break;case"e":if(M.x>=0&&(m>=w||h&&(l<=v||g>=b))){y=!1;break}D("e"),(d+=M.x)<0&&(s="w",p-=d=-d),h&&(u=d/h,l+=(o.height-u)/2);break;case"n":if(M.y<=0&&(l<=v||h&&(p<=f||m>=w))){y=!1;break}D("n"),u-=M.y,l+=M.y,u<0&&(s="s",l-=u=-u),h&&(d=u*h,p+=(o.width-d)/2);break;case"w":if(M.x<=0&&(p<=f||h&&(l<=v||g>=b))){y=!1;break}D("w"),d-=M.x,p+=M.x,d<0&&(s="e",p-=d=-d),h&&(u=d/h,l+=(o.height-u)/2);break;case"s":if(M.y>=0&&(g>=b||h&&(p<=f||m>=w))){y=!1;break}D("s"),(u+=M.y)<0&&(s="n",l-=u=-u),h&&(d=u*h,p+=(o.width-d)/2);break;case"ne":if(h){if(M.y<=0&&(l<=v||m>=w)){y=!1;break}D("n"),u-=M.y,l+=M.y,d=u*h}else D("n"),D("e"),M.x>=0?mv&&(u-=M.y,l+=M.y):(u-=M.y,l+=M.y);d<0&&u<0?(s="sw",l-=u=-u,p-=d=-d):d<0?(s="nw",p-=d=-d):u<0&&(s="se",l-=u=-u);break;case"nw":if(h){if(M.y<=0&&(l<=v||p<=f)){y=!1;break}D("n"),u-=M.y,l+=M.y,d=u*h,p+=o.width-d}else D("n"),D("w"),M.x<=0?p>f?(d-=M.x,p+=M.x):M.y<=0&&l<=v&&(y=!1):(d-=M.x,p+=M.x),M.y<=0?l>v&&(u-=M.y,l+=M.y):(u-=M.y,l+=M.y);d<0&&u<0?(s="se",l-=u=-u,p-=d=-d):d<0?(s="ne",p-=d=-d):u<0&&(s="sw",l-=u=-u);break;case"sw":if(h){if(M.x<=0&&(p<=f||g>=b)){y=!1;break}D("w"),d-=M.x,p+=M.x,u=d/h}else D("s"),D("w"),M.x<=0?p>f?(d-=M.x,p+=M.x):M.y>=0&&g>=b&&(y=!1):(d-=M.x,p+=M.x),M.y>=0?g=0&&(m>=w||g>=b)){y=!1;break}D("e"),d+=M.x,u=d/h}else D("s"),D("e"),M.x>=0?m=0&&g>=b&&(y=!1):d+=M.x,M.y>=0?g0?s=M.y>0?"se":"ne":M.x<0&&(p-=d,s=M.y>0?"sw":"nw"),M.y<0&&(l-=u),this.cropped||(Y(this.cropBox,c),this.cropped=!0,this.limited&&this.limitCropBox(!0,!0))}y&&(o.width=d,o.height=u,o.left=p,o.top=l,this.action=s,this.renderCropBox()),A(r,function(t){t.startX=t.endX,t.startY=t.endY})}},ft={crop:function(){return!this.ready||this.cropped||this.disabled||(this.cropped=!0,this.limitCropBox(!0,!0),this.options.modal&&X(this.dragBox,d),Y(this.cropBox,c),this.setCropBoxData(this.initialCropBoxData)),this},reset:function(){return this.ready&&!this.disabled&&(this.imageData=S({},this.initialImageData),this.canvasData=S({},this.initialCanvasData),this.cropBoxData=S({},this.initialCropBoxData),this.renderCanvas(),this.cropped&&this.renderCropBox()),this},clear:function(){return this.cropped&&!this.disabled&&(S(this.cropBoxData,{left:0,top:0,width:0,height:0}),this.cropped=!1,this.renderCropBox(),this.limitCanvas(!0,!0),this.renderCanvas(),Y(this.dragBox,d),X(this.cropBox,c)),this},replace:function(t){var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1];return!this.disabled&&t&&(this.isImg&&(this.element.src=t),e?(this.url=t,this.image.src=t,this.ready&&(this.viewBoxImage.src=t,A(this.previews,function(e){e.getElementsByTagName("img")[0].src=t}))):(this.isImg&&(this.replaced=!0),this.options.data=null,this.uncreate(),this.load(t))),this},enable:function(){return this.ready&&this.disabled&&(this.disabled=!1,Y(this.cropper,h)),this},disable:function(){return this.ready&&!this.disabled&&(this.disabled=!0,X(this.cropper,h)),this},destroy:function(){var t=this.element;return t.cropper?(t.cropper=void 0,this.isImg&&this.replaced&&(t.src=this.originalUrl),this.uncreate(),this):this},move:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:t,i=this.canvasData,a=i.left,n=i.top;return this.moveTo(B(t)?t:a+Number(t),B(e)?e:n+Number(e))},moveTo:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:t,i=this.canvasData,a=!1;return t=Number(t),e=Number(e),this.ready&&!this.disabled&&this.options.movable&&(T(t)&&(i.left=t,a=!0),T(e)&&(i.top=e,a=!0),a&&this.renderCanvas(!0)),this},zoom:function(t,e){var i=this.canvasData;return t=(t=Number(t))<0?1/(1-t):1+t,this.zoomTo(i.width*t/i.naturalWidth,null,e)},zoomTo:function(t,e,i){var a=this.options,n=this.canvasData,o=n.width,r=n.height,s=n.naturalWidth,h=n.naturalHeight;if((t=Number(t))>=0&&this.ready&&!this.disabled&&a.zoomable){var c=s*t,p=h*t;if(!1===K(this.element,"zoom",{ratio:t,oldRatio:o/s,originalEvent:i}))return this;if(i){var l=this.pointers,d=tt(this.cropper),u=l&&Object.keys(l).length?function(t){var e=0,i=0,a=0;return A(t,function(t){var n=t.startX,o=t.startY;e+=n,i+=o,a+=1}),{pageX:e/=a,pageY:i/=a}}(l):{pageX:i.pageX,pageY:i.pageY};n.left-=(c-o)*((u.pageX-d.left-n.left)/o),n.top-=(p-r)*((u.pageY-d.top-n.top)/r)}else N(e)&&T(e.x)&&T(e.y)?(n.left-=(c-o)*((e.x-n.left)/o),n.top-=(p-r)*((e.y-n.top)/r)):(n.left-=(c-o)/2,n.top-=(p-r)/2);n.width=c,n.height=p,this.renderCanvas(!0)}return this},rotate:function(t){return this.rotateTo((this.imageData.rotate||0)+Number(t))},rotateTo:function(t){return T(t=Number(t))&&this.ready&&!this.disabled&&this.options.rotatable&&(this.imageData.rotate=t%360,this.renderCanvas(!0,!0)),this},scaleX:function(t){var e=this.imageData.scaleY;return this.scale(t,T(e)?e:1)},scaleY:function(t){var e=this.imageData.scaleX;return this.scale(T(e)?e:1,t)},scale:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:t,i=this.imageData,a=!1;return t=Number(t),e=Number(e),this.ready&&!this.disabled&&this.options.scalable&&(T(t)&&(i.scaleX=t,a=!0),T(e)&&(i.scaleY=e,a=!0),a&&this.renderCanvas(!0,!0)),this},getData:function(){var t,e=arguments.length>0&&void 0!==arguments[0]&&arguments[0],i=this.options,a=this.imageData,n=this.canvasData,o=this.cropBoxData;if(this.ready&&this.cropped){t={x:o.left-n.left,y:o.top-n.top,width:o.width,height:o.height};var r=a.width/a.naturalWidth;if(A(t,function(e,i){t[i]=e/r}),e){var s=Math.round(t.y+t.height),h=Math.round(t.x+t.width);t.x=Math.round(t.x),t.y=Math.round(t.y),t.width=h-t.x,t.height=s-t.y}}else t={x:0,y:0,width:0,height:0};return i.rotatable&&(t.rotate=a.rotate||0),i.scalable&&(t.scaleX=a.scaleX||1,t.scaleY=a.scaleY||1),t},setData:function(t){var e=this.options,i=this.imageData,a=this.canvasData,n={};if(this.ready&&!this.disabled&&N(t)){var o=!1;e.rotatable&&T(t.rotate)&&t.rotate!==i.rotate&&(i.rotate=t.rotate,o=!0),e.scalable&&(T(t.scaleX)&&t.scaleX!==i.scaleX&&(i.scaleX=t.scaleX,o=!0),T(t.scaleY)&&t.scaleY!==i.scaleY&&(i.scaleY=t.scaleY,o=!0)),o&&this.renderCanvas(!0,!0);var r=i.width/i.naturalWidth;T(t.x)&&(n.left=t.x*r+a.left),T(t.y)&&(n.top=t.y*r+a.top),T(t.width)&&(n.width=t.width*r),T(t.height)&&(n.height=t.height*r),this.setCropBoxData(n)}return this},getContainerData:function(){return this.ready?S({},this.containerData):{}},getImageData:function(){return this.sized?S({},this.imageData):{}},getCanvasData:function(){var t=this.canvasData,e={};return this.ready&&A(["left","top","width","height","naturalWidth","naturalHeight"],function(i){e[i]=t[i]}),e},setCanvasData:function(t){var e=this.canvasData,i=e.aspectRatio;return this.ready&&!this.disabled&&N(t)&&(T(t.left)&&(e.left=t.left),T(t.top)&&(e.top=t.top),T(t.width)?(e.width=t.width,e.height=t.width/i):T(t.height)&&(e.height=t.height,e.width=t.height*i),this.renderCanvas(!0)),this},getCropBoxData:function(){var t,e=this.cropBoxData;return this.ready&&this.cropped&&(t={left:e.left,top:e.top,width:e.width,height:e.height}),t||{}},setCropBoxData:function(t){var e,i,a=this.cropBoxData,n=this.options.aspectRatio;return this.ready&&this.cropped&&!this.disabled&&N(t)&&(T(t.left)&&(a.left=t.left),T(t.top)&&(a.top=t.top),T(t.width)&&t.width!==a.width&&(e=!0,a.width=t.width),T(t.height)&&t.height!==a.height&&(i=!0,a.height=t.height),n&&(e?a.height=a.width/n:i&&(a.width=a.height*n)),this.renderCropBox()),this},getCroppedCanvas:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};if(!this.ready||!window.HTMLCanvasElement)return null;var e=this.canvasData,a=function(t,e,a,n){var o=e.aspectRatio,r=e.naturalWidth,s=e.naturalHeight,h=e.rotate,c=void 0===h?0:h,p=e.scaleX,l=void 0===p?1:p,d=e.scaleY,u=void 0===d?1:d,m=a.aspectRatio,g=a.naturalWidth,f=a.naturalHeight,v=n.fillColor,w=void 0===v?"transparent":v,b=n.imageSmoothingEnabled,y=void 0===b||b,x=n.imageSmoothingQuality,M=void 0===x?"low":x,D=n.maxWidth,C=void 0===D?1/0:D,k=n.maxHeight,E=void 0===k?1/0:k,T=n.minWidth,O=void 0===T?0:T,B=n.minHeight,L=void 0===B?0:B,R=document.createElement("canvas"),N=R.getContext("2d"),I=st({aspectRatio:m,width:C,height:E}),_=st({aspectRatio:m,width:O,height:L},"cover"),j=Math.min(I.width,Math.max(_.width,g)),A=Math.min(I.height,Math.max(_.height,f)),S=st({aspectRatio:o,width:C,height:E}),W=st({aspectRatio:o,width:O,height:L},"cover"),H=Math.min(S.width,Math.max(W.width,r)),$=Math.min(S.height,Math.max(W.height,s)),X=[-H/2,-$/2,H,$];return R.width=z(j),R.height=z(A),N.fillStyle=w,N.fillRect(0,0,j,A),N.save(),N.translate(j/2,A/2),N.rotate(c*Math.PI/180),N.scale(l,u),N.imageSmoothingEnabled=y,N.imageSmoothingQuality=M,N.drawImage.apply(N,[t].concat(i(X.map(function(t){return Math.floor(z(t))})))),N.restore(),R}(this.image,this.imageData,e,t);if(!this.cropped)return a;var n=this.getData(),o=n.x,r=n.y,s=n.width,h=n.height,c=a.width/Math.floor(e.naturalWidth);1!==c&&(o*=c,r*=c,s*=c,h*=c);var p=s/h,l=st({aspectRatio:p,width:t.maxWidth||1/0,height:t.maxHeight||1/0}),d=st({aspectRatio:p,width:t.minWidth||0,height:t.minHeight||0},"cover"),u=st({aspectRatio:p,width:t.width||(1!==c?a.width:s),height:t.height||(1!==c?a.height:h)}),m=u.width,g=u.height;m=Math.min(l.width,Math.max(d.width,m)),g=Math.min(l.height,Math.max(d.height,g));var f=document.createElement("canvas"),v=f.getContext("2d");f.width=z(m),f.height=z(g),v.fillStyle=t.fillColor||"transparent",v.fillRect(0,0,m,g);var w=t.imageSmoothingEnabled,b=void 0===w||w,y=t.imageSmoothingQuality;v.imageSmoothingEnabled=b,y&&(v.imageSmoothingQuality=y);var x,M,D,C,k,E,T=a.width,O=a.height,B=o,L=r;B<=-s||B>T?(B=0,x=0,D=0,k=0):B<=0?(D=-B,B=0,x=Math.min(T,s+B),k=x):B<=T&&(D=0,x=Math.min(s,T-B),k=x),x<=0||L<=-h||L>O?(L=0,M=0,C=0,E=0):L<=0?(C=-L,L=0,M=Math.min(O,h+L),E=M):L<=O&&(C=0,M=Math.min(h,O-L),E=M);var R=[B,L,x,M];if(k>0&&E>0){var N=m/s;R.push(D*N,C*N,k*N,E*N)}return v.drawImage.apply(v,[a].concat(i(R.map(function(t){return Math.floor(z(t))})))),f},setAspectRatio:function(t){var e=this.options;return this.disabled||B(t)||(e.aspectRatio=Math.max(0,t)||NaN,this.ready&&(this.initCropBox(),this.cropped&&this.renderCropBox())),this},setDragMode:function(t){var e=this.options,i=this.dragBox,a=this.face;if(this.ready&&!this.disabled){var n="crop"===t,o=e.movable&&"move"===t;t=n||o?t:"none",e.dragMode=t,Q(i,m,t),U(i,s,n),U(i,u,o),e.cropBoxMovable||(Q(a,m,t),U(a,s,n),U(a,u,o))}return this}},vt=n.Cropper,wt=function(){function t(e){var i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),!e||!C.test(e.tagName))throw new Error("The first argument is required and must be an or element.");this.element=e,this.options=S({},k,N(i)&&i),this.cropped=!1,this.disabled=!1,this.pointers={},this.ready=!1,this.reloading=!1,this.replaced=!1,this.sized=!1,this.sizing=!1,this.init()}return i=t,o=[{key:"noConflict",value:function(){return window.Cropper=vt,t}},{key:"setDefaults",value:function(t){S(k,N(t)&&t)}}],(a=[{key:"init",value:function(){var t,e=this.element,i=e.tagName.toLowerCase();if(!e.cropper){if(e.cropper=this,"img"===i){if(this.isImg=!0,t=e.getAttribute("src")||"",this.originalUrl=t,!t)return;t=e.src}else"canvas"===i&&window.HTMLCanvasElement&&(t=e.toDataURL());this.load(t)}}},{key:"load",value:function(t){var e=this;if(t){this.url=t,this.imageData={};var i=this.element,a=this.options;if(a.rotatable||a.scalable||(a.checkOrientation=!1),a.checkOrientation&&window.ArrayBuffer)if(D.test(t))this.read((n=t.replace(ct,""),o=atob(n),r=new ArrayBuffer(o.length),A(s=new Uint8Array(r),function(t,e){s[e]=o.charCodeAt(e)}),r));else{var n,o,r,s,h=new XMLHttpRequest,c=this.clone.bind(this);this.reloading=!0,this.xhr=h,h.onabort=c,h.onerror=c,h.ontimeout=c,h.onprogress=function(){"image/jpeg"!==h.getResponseHeader("content-type")&&h.abort()},h.onload=function(){e.read(h.response)},h.onloadend=function(){e.reloading=!1,e.xhr=null},a.checkCrossOrigin&&at(t)&&i.crossOrigin&&(t=nt(t)),h.open("GET",t),h.responseType="arraybuffer",h.withCredentials="use-credentials"===i.crossOrigin,h.send()}else this.clone()}}},{key:"read",value:function(t){var e=this.options,i=this.imageData,a=pt(t),n=0,o=1,r=1;if(a>1){this.url=function(t,e){for(var i=[],a=new Uint8Array(t);a.length>0;)i.push(ht.apply(null,j(a.subarray(0,8192)))),a=a.subarray(8192);return"data:".concat(e,";base64,").concat(btoa(i.join("")))}(t,"image/jpeg");var s=function(t){var e=0,i=1,a=1;switch(t){case 2:i=-1;break;case 3:e=-180;break;case 4:a=-1;break;case 5:e=90,a=-1;break;case 6:e=90;break;case 7:e=90,i=-1;break;case 8:e=-90}return{rotate:e,scaleX:i,scaleY:a}}(a);n=s.rotate,o=s.scaleX,r=s.scaleY}e.rotatable&&(i.rotate=n),e.scalable&&(i.scaleX=o,i.scaleY=r),this.clone()}},{key:"clone",value:function(){var t,e,i=this.element,a=this.url;this.options.checkCrossOrigin&&at(a)&&((t=i.crossOrigin)?e=a:(t="anonymous",e=nt(a))),this.crossOrigin=t,this.crossOriginUrl=e;var n=document.createElement("img");t&&(n.crossOrigin=t),n.src=e||a,this.image=n,n.onload=this.start.bind(this),n.onerror=this.stop.bind(this),X(n,p),i.parentNode.insertBefore(n,i.nextSibling)}},{key:"start",value:function(){var t=this,e=this.isImg?this.element:this.image;e.onload=null,e.onerror=null,this.sizing=!0;var i=n.navigator&&/^(?:.(?!chrome|android))*safari/i.test(n.navigator.userAgent),a=function(e,i){S(t.imageData,{naturalWidth:e,naturalHeight:i,aspectRatio:e/i}),t.sizing=!1,t.sized=!0,t.build()};if(!e.naturalWidth||i){var o=document.createElement("img"),r=document.body||document.documentElement;this.sizingImage=o,o.onload=function(){a(o.width,o.height),i||r.removeChild(o)},o.src=e.src,i||(o.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;",r.appendChild(o))}else a(e.naturalWidth,e.naturalHeight)}},{key:"stop",value:function(){var t=this.image;t.onload=null,t.onerror=null,t.parentNode.removeChild(t),this.image=null}},{key:"build",value:function(){if(this.sized&&!this.ready){var t=this.element,e=this.options,i=this.image,a=t.parentNode,n=document.createElement("div");n.innerHTML='
';var o=n.querySelector(".".concat("cropper","-container")),r=o.querySelector(".".concat("cropper","-canvas")),s=o.querySelector(".".concat("cropper","-drag-box")),h=o.querySelector(".".concat("cropper","-crop-box")),d=h.querySelector(".".concat("cropper","-face"));this.container=a,this.cropper=o,this.canvas=r,this.dragBox=s,this.cropBox=h,this.viewBox=o.querySelector(".".concat("cropper","-view-box")),this.face=d,r.appendChild(i),X(t,c),a.insertBefore(o,t.nextSibling),this.isImg||Y(i,p),this.initPreview(),this.bind(),e.initialAspectRatio=Math.max(0,e.initialAspectRatio)||NaN,e.aspectRatio=Math.max(0,e.aspectRatio)||NaN,e.viewMode=Math.max(0,Math.min(3,Math.round(e.viewMode)))||0,X(h,c),e.guides||X(h.getElementsByClassName("".concat("cropper","-dashed")),c),e.center||X(h.getElementsByClassName("".concat("cropper","-center")),c),e.background&&X(o,"".concat("cropper","-bg")),e.highlight||X(d,l),e.cropBoxMovable&&(X(d,u),Q(d,m,"all")),e.cropBoxResizable||(X(h.getElementsByClassName("".concat("cropper","-line")),c),X(h.getElementsByClassName("".concat("cropper","-point")),c)),this.render(),this.ready=!0,this.setDragMode(e.dragMode),e.autoCrop&&this.crop(),this.setData(e.data),I(e.ready)&&Z(t,"ready",e.ready,{once:!0}),K(t,"ready")}}},{key:"unbuild",value:function(){this.ready&&(this.ready=!1,this.unbind(),this.resetPreview(),this.cropper.parentNode.removeChild(this.cropper),Y(this.element,c))}},{key:"uncreate",value:function(){this.ready?(this.unbuild(),this.ready=!1,this.cropped=!1):this.sizing?(this.sizingImage.onload=null,this.sizing=!1,this.sized=!1):this.reloading?(this.xhr.onabort=null,this.xhr.abort()):this.image&&this.stop()}}])&&e(i.prototype,a),o&&e(i,o),t;var i,a,o}();return S(wt.prototype,lt,dt,ut,mt,gt,ft),wt}()},"./node_modules/font-awesome sync \\.(otf|eot|svg|ttf|woff|woff2)$":function(t,e){function i(t){var e=new Error("Cannot find module '"+t+"'");throw e.code="MODULE_NOT_FOUND",e}i.keys=function(){return[]},i.resolve=i,t.exports=i,i.id="./node_modules/font-awesome sync \\.(otf|eot|svg|ttf|woff|woff2)$"},"./src/_events.js":function(t,e){t.exports={AJAX:"ajax-load",LOADED:"load",SET_TARGET_UPDATE:"set-target-update",RESTORE_FIELD:"restore-field",FORM_INIT_BASICS:"form-basics",FORM_INIT_STEPPED:"form-init-stepped",FORM_INIT_VALIDATE:"form-init-validate",FORM_INIT_VALIDATE_FIELD:"form-init-validate-field",FORM_INIT_STORAGE:"form-init-storage",FORM_VALIDATION_FAILED:"form-validation-failed",FORM_STEPPED_NEW_STEP:"form-new-step",FORM_STEPPED_FIRST_STEP:"form-first-step",FORM_STEPPED_LAST_STEP:"form-last-step"}},"./src/app.js":function(t,e,i){"use strict";i.r(e);i("./src/app.scss");var a=i("./src/_events.js"),n=i.n(a),o=i("jquery"),r=i.n(o),s=function(){function t(t,e){for(var i=0;i'),r.$image=r.$el.find("img.cropping-image"),r.original_image=r.$image[0],r.mask_img=!1,r.name=r.$input.attr("name"),r.width=r.$input.data("width"),r.height=r.$input.data("height"),r.options=o,r.cropper=!1,r.$el.data(i,r),r.$el.prepend('
'),r.$removeBtns=r.$el.find(".remove-masks"),r.masks=[],r.$input.on("change",function(t){var e=t.currentTarget.files;e&&e.length&&r.loadFile(e[0])}),r.$el.append('Обрезать'),r.$el.find(".act-crop").on("click",function(t){if(!r.cropper)return!0;t.preventDefault();var i=r.cropper.getCroppedCanvas({width:r.width,height:r.height});r.$image[0].src=i.toDataURL(),r.original_image=new Image,r.original_image.src=i.toDataURL(),r.cropper.destroy(),r.cropper=!1,r.$el.removeClass(e+"-cropping"),r.$el.addClass(e+"-cropped")}),r.$el.find(".masks .mask-item").on("click",function(e){e.preventDefault(),r.setMask(t(e.currentTarget))}),r.$form.on("submit",function(t){if(!r.cropper)return!0;h.show(),r.saveImage();var e=r.cropper.getCroppedCanvas({width:r.width,height:r.height});r.$image[0].src=e.toDataURL(),e.toBlob(function(t){r.uploadFile(t)}),t.preventDefault()})}return l(a,null,[{key:"dispose",value:function(){console.log("Destroying: "+e)}},{key:"_jQueryInterface",value:function(){return this.each(function(e,n){var o=t(n),r=o.data(i);r||(r=new a(n),o.data(i,r))})}}]),a}(),s=function(){var i=this;this.setMask=function(t){var e=i;e.mask_img&&e.addMask(e.getMask()),e.cropper&&(e.cropper.destroy(),e.cropper=!1,e.saveImage()),e.mask_img=new Image,e.mask_img.src=t.data("src"),e.mask_img.onload=function(){var i=e.mask_img;e.cropper=new p.a(e.$image[0],{aspectRatio:i.width/i.height,viewMode:0,guides:!0,center:!0,highlight:!0,cropBoxMovable:!0,cropBoxResizable:!0,movable:!1,rotatable:!1,zoomable:!1,ready:function(){e.$el.find(".cropper-face").css({"background-color":"transparent","background-image":"url("+e.mask_img.src+")",opacity:"0.8"}),e.$el.find(".cropper-face").data("current-mask",t)}})}},this.addMask=function(e){var a=i,n=Date.now();a.masks[n]=e;var o=t('Удалить #'+n+"");return a.$el.find(".masks").append(o),o.on("click",function(e){e.preventDefault();var i=t(e.currentTarget).data("id");a.removeMask(i)}),n},this.removeMask=function(t){var e=i;delete e.masks[t],e.$el.find('.masks [data-id="'+t+'"]').remove(),e.mask_img=!1,e.$el.find(".cropper-face").data("current-mask").click()},this.getMask=function(){var t=i,e=document.createElement("canvas"),a=e.getContext("2d"),n=t.cropper,o=n.getData().width,r=n.getData().height,s=n.getData().y,h=n.getData().x;n.getImageData().left,n.getImageData().top,n.getImageData().aspectRatio;return e.width=t.width,e.height=t.height,a.imageSmoothingEnabled=!0,{img:t.mask_img,left:h,top:s,width:o,height:r}},this.saveImage=function(){var t=i,e=document.createElement("canvas"),a=e.getContext("2d");for(var n in e.width=t.width,e.height=t.height,a.imageSmoothingEnabled=!0,a.drawImage(t.original_image,0,0,t.width,t.height),t.masks){var o=t.masks[n];console.log(o),a.drawImage(o.img,o.left,o.top,o.width,o.height)}return t.$image[0].src=e.toDataURL(),e},this.loadFile=function(t){var a=i;/^image\/\w+/.test(t.type)?(a.$image[0].src=URL.createObjectURL(t),a.cropper&&a.cropper.destroy(),a.cropper=new p.a(a.$image[0],a.options),a.$input[0].value=null,a.$el.addClass(e+"-cropping")):window.alert("Please choose an image file.")},this.uploadFile=function(e){console.log("Initializing uploading sequence!");var o=i,r=new FormData(o.$form[0]);r.delete("BackURL"),r.delete(o.name),r.append(o.name,e,o.name+"-image.png"),r.append("ajax","1"),t.ajax({url:o.$form.attr("action"),data:r,processData:!1,contentType:!1,type:o.$form.attr("method"),success:function(e){console.log("UPLOAD SUCCESS!"),h.hide(),t(a).trigger(n.a.AJAX)}})}};t.fn[e]=r._jQueryInterface,t.fn[e].Constructor=r,t.fn[e].noConflict=function(){return t.fn[e]=JQUERY_NO_CONFLICT,r._jQueryInterface},t(window).on(n.a.AJAX+" "+n.a.LOADED,function(){t(".field.croppie").jsCroppieUI()})}(r.a);var d=function(){function t(t,e){for(var i=0;i0&&t<1/0};function B(t){return void 0===t}function L(e){return"object"===t(e)&&null!==e}var R=Object.prototype.hasOwnProperty;function N(t){if(!L(t))return!1;try{var e=t.constructor,i=e.prototype;return e&&i&&R.call(i,"isPrototypeOf")}catch(t){return!1}}function I(t){return"function"==typeof t}var _=Array.prototype.slice;function j(t){return Array.from?Array.from(t):_.call(t)}function A(t,e){return t&&I(e)&&(Array.isArray(t)||T(t.length)?j(t).forEach(function(i,a){e.call(t,i,a,t)}):L(t)&&Object.keys(t).forEach(function(i){e.call(t,t[i],i,t)})),t}var S=Object.assign||function(t){for(var e=arguments.length,i=new Array(e>1?e-1:0),a=1;a0&&i.forEach(function(e){L(e)&&Object.keys(e).forEach(function(i){t[i]=e[i]})}),t},W=/\.\d*(?:0|9){12}\d*$/;function z(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1e11;return W.test(t)?Math.round(t*e)/e:t}var H=/^width|height|left|top|marginLeft|marginTop$/;function $(t,e){var i=t.style;A(e,function(t,e){H.test(e)&&T(t)&&(t="".concat(t,"px")),i[e]=t})}function X(t,e){if(e)if(T(t.length))A(t,function(t){X(t,e)});else if(t.classList)t.classList.add(e);else{var i=t.className.trim();i?i.indexOf(e)<0&&(t.className="".concat(i," ").concat(e)):t.className=e}}function Y(t,e){e&&(T(t.length)?A(t,function(t){Y(t,e)}):t.classList?t.classList.remove(e):t.className.indexOf(e)>=0&&(t.className=t.className.replace(e,"")))}function U(t,e,i){e&&(T(t.length)?A(t,function(t){U(t,e,i)}):i?X(t,e):Y(t,e))}var P=/([a-z\d])([A-Z])/g;function F(t){return t.replace(P,"$1-$2").toLowerCase()}function q(t,e){return L(t[e])?t[e]:t.dataset?t.dataset[e]:t.getAttribute("data-".concat(F(e)))}function Q(t,e,i){L(i)?t[e]=i:t.dataset?t.dataset[e]=i:t.setAttribute("data-".concat(F(e)),i)}var J=/\s\s*/,V=function(){var t=!1;if(a){var e=!1,i=function(){},o=Object.defineProperty({},"once",{get:function(){return t=!0,e},set:function(t){e=t}});n.addEventListener("test",i,o),n.removeEventListener("test",i,o)}return t}();function G(t,e,i){var a=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{},n=i;e.trim().split(J).forEach(function(e){if(!V){var o=t.listeners;o&&o[e]&&o[e][i]&&(n=o[e][i],delete o[e][i],0===Object.keys(o[e]).length&&delete o[e],0===Object.keys(o).length&&delete t.listeners)}t.removeEventListener(e,n,a)})}function Z(t,e,i){var a=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{},n=i;e.trim().split(J).forEach(function(e){if(a.once&&!V){var o=t.listeners,r=void 0===o?{}:o;n=function(){delete r[e][i],t.removeEventListener(e,n,a);for(var o=arguments.length,s=new Array(o),h=0;h1&&void 0!==arguments[1]?arguments[1]:"contain",o=O(a),r=O(i);if(o&&r){var s=i*e;"contain"===n&&s>a||"cover"===n&&s=8&&(o=c+l)}}}if(o){var d,u,m=i.getUint16(o,a);for(u=0;ut.width?3===i?s=t.height*r:h=t.width/r:3===i?h=t.width/r:s=t.height*r;var c={aspectRatio:r,naturalWidth:n,naturalHeight:o,width:s,height:h};c.left=(t.width-s)/2,c.top=(t.height-h)/2,c.oldLeft=c.left,c.oldTop=c.top,this.canvasData=c,this.limited=1===i||2===i,this.limitCanvas(!0,!0),this.initialImageData=S({},e),this.initialCanvasData=S({},c)},limitCanvas:function(t,e){var i=this.options,a=this.containerData,n=this.canvasData,o=this.cropBoxData,r=i.viewMode,s=n.aspectRatio,h=this.cropped&&o;if(t){var c=Number(i.minCanvasWidth)||0,p=Number(i.minCanvasHeight)||0;r>1?(c=Math.max(c,a.width),p=Math.max(p,a.height),3===r&&(p*s>c?c=p*s:p=c/s)):r>0&&(c?c=Math.max(c,h?o.width:0):p?p=Math.max(p,h?o.height:0):h&&(c=o.width,(p=o.height)*s>c?c=p*s:p=c/s));var l=st({aspectRatio:s,width:c,height:p});c=l.width,p=l.height,n.minWidth=c,n.minHeight=p,n.maxWidth=1/0,n.maxHeight=1/0}if(e)if(r>(h?0:1)){var d=a.width-n.width,u=a.height-n.height;n.minLeft=Math.min(0,d),n.minTop=Math.min(0,u),n.maxLeft=Math.max(0,d),n.maxTop=Math.max(0,u),h&&this.limited&&(n.minLeft=Math.min(o.left,o.left+(o.width-n.width)),n.minTop=Math.min(o.top,o.top+(o.height-n.height)),n.maxLeft=o.left,n.maxTop=o.top,2===r&&(n.width>=a.width&&(n.minLeft=Math.min(0,d),n.maxLeft=Math.max(0,d)),n.height>=a.height&&(n.minTop=Math.min(0,u),n.maxTop=Math.max(0,u))))}else n.minLeft=-n.width,n.minTop=-n.height,n.maxLeft=a.width,n.maxTop=a.height},renderCanvas:function(t,e){var i=this.canvasData,a=this.imageData;if(e){var n=function(t){var e=t.width,i=t.height,a=t.degree;if(90==(a=Math.abs(a)%180))return{width:i,height:e};var n=a%90*Math.PI/180,o=Math.sin(n),r=Math.cos(n),s=e*r+i*o,h=e*o+i*r;return a>90?{width:h,height:s}:{width:s,height:h}}({width:a.naturalWidth*Math.abs(a.scaleX||1),height:a.naturalHeight*Math.abs(a.scaleY||1),degree:a.rotate||0}),o=n.width,r=n.height,s=i.width*(o/i.naturalWidth),h=i.height*(r/i.naturalHeight);i.left-=(s-i.width)/2,i.top-=(h-i.height)/2,i.width=s,i.height=h,i.aspectRatio=o/r,i.naturalWidth=o,i.naturalHeight=r,this.limitCanvas(!0,!1)}(i.width>i.maxWidth||i.widthi.maxHeight||i.heighte.width?n.height=n.width/i:n.width=n.height*i),this.cropBoxData=n,this.limitCropBox(!0,!0),n.width=Math.min(Math.max(n.width,n.minWidth),n.maxWidth),n.height=Math.min(Math.max(n.height,n.minHeight),n.maxHeight),n.width=Math.max(n.minWidth,n.width*a),n.height=Math.max(n.minHeight,n.height*a),n.left=e.left+(e.width-n.width)/2,n.top=e.top+(e.height-n.height)/2,n.oldLeft=n.left,n.oldTop=n.top,this.initialCropBoxData=S({},n)},limitCropBox:function(t,e){var i=this.options,a=this.containerData,n=this.canvasData,o=this.cropBoxData,r=this.limited,s=i.aspectRatio;if(t){var h=Number(i.minCropBoxWidth)||0,c=Number(i.minCropBoxHeight)||0,p=r?Math.min(a.width,n.width,n.width+n.left,a.width-n.left):a.width,l=r?Math.min(a.height,n.height,n.height+n.top,a.height-n.top):a.height;h=Math.min(h,a.width),c=Math.min(c,a.height),s&&(h&&c?c*s>h?c=h/s:h=c*s:h?c=h/s:c&&(h=c*s),l*s>p?l=p/s:p=l*s),o.minWidth=Math.min(h,p),o.minHeight=Math.min(c,l),o.maxWidth=p,o.maxHeight=l}e&&(r?(o.minLeft=Math.max(0,n.left),o.minTop=Math.max(0,n.top),o.maxLeft=Math.min(a.width,n.left+n.width)-o.width,o.maxTop=Math.min(a.height,n.top+n.height)-o.height):(o.minLeft=0,o.minTop=0,o.maxLeft=a.width-o.width,o.maxTop=a.height-o.height))},renderCropBox:function(){var t=this.options,e=this.containerData,i=this.cropBoxData;(i.width>i.maxWidth||i.widthi.maxHeight||i.height=e.width&&i.height>=e.height?"move":"all"),$(this.cropBox,S({width:i.width,height:i.height},ot({translateX:i.left,translateY:i.top}))),this.cropped&&this.limited&&this.limitCanvas(!0,!0),this.disabled||this.output()},output:function(){this.preview(),K(this.element,"crop",this.getData())}},dt={initPreview:function(){var t=this.crossOrigin,e=this.options.preview,i=t?this.crossOriginUrl:this.url,a=document.createElement("img");if(t&&(a.crossOrigin=t),a.src=i,this.viewBox.appendChild(a),this.viewBoxImage=a,e){var n=e;"string"==typeof e?n=this.element.ownerDocument.querySelectorAll(e):e.querySelector&&(n=[e]),this.previews=n,A(n,function(e){var a=document.createElement("img");Q(e,g,{width:e.offsetWidth,height:e.offsetHeight,html:e.innerHTML}),t&&(a.crossOrigin=t),a.src=i,a.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;"',e.innerHTML="",e.appendChild(a)})}},resetPreview:function(){A(this.previews,function(t){var e=q(t,g);$(t,{width:e.width,height:e.height}),t.innerHTML=e.html,function(t,e){if(L(t[e]))try{delete t[e]}catch(i){t[e]=void 0}else if(t.dataset)try{delete t.dataset[e]}catch(i){t.dataset[e]=void 0}else t.removeAttribute("data-".concat(F(e)))}(t,g)})},preview:function(){var t=this.imageData,e=this.canvasData,i=this.cropBoxData,a=i.width,n=i.height,o=t.width,r=t.height,s=i.left-e.left-t.left,h=i.top-e.top-t.top;this.cropped&&!this.disabled&&($(this.viewBoxImage,S({width:o,height:r},ot(S({translateX:-s,translateY:-h},t)))),A(this.previews,function(e){var i=q(e,g),c=i.width,p=i.height,l=c,d=p,u=1;a&&(d=n*(u=c/a)),n&&d>p&&(l=a*(u=p/n),d=p),$(e,{width:l,height:d}),$(e.getElementsByTagName("img")[0],S({width:o*u,height:r*u},ot(S({translateX:-s*u,translateY:-h*u},t))))}))}},ut={bind:function(){var t=this.element,e=this.options,i=this.cropper;I(e.cropstart)&&Z(t,"cropstart",e.cropstart),I(e.cropmove)&&Z(t,"cropmove",e.cropmove),I(e.cropend)&&Z(t,"cropend",e.cropend),I(e.crop)&&Z(t,"crop",e.crop),I(e.zoom)&&Z(t,"zoom",e.zoom),Z(i,b,this.onCropStart=this.cropStart.bind(this)),e.zoomable&&e.zoomOnWheel&&Z(i,"wheel",this.onWheel=this.wheel.bind(this),{passive:!1,capture:!0}),e.toggleDragModeOnDblclick&&Z(i,"dblclick",this.onDblclick=this.dblclick.bind(this)),Z(t.ownerDocument,y,this.onCropMove=this.cropMove.bind(this)),Z(t.ownerDocument,x,this.onCropEnd=this.cropEnd.bind(this)),e.responsive&&Z(window,"resize",this.onResize=this.resize.bind(this))},unbind:function(){var t=this.element,e=this.options,i=this.cropper;I(e.cropstart)&&G(t,"cropstart",e.cropstart),I(e.cropmove)&&G(t,"cropmove",e.cropmove),I(e.cropend)&&G(t,"cropend",e.cropend),I(e.crop)&&G(t,"crop",e.crop),I(e.zoom)&&G(t,"zoom",e.zoom),G(i,b,this.onCropStart),e.zoomable&&e.zoomOnWheel&&G(i,"wheel",this.onWheel,{passive:!1,capture:!0}),e.toggleDragModeOnDblclick&&G(i,"dblclick",this.onDblclick),G(t.ownerDocument,y,this.onCropMove),G(t.ownerDocument,x,this.onCropEnd),e.responsive&&G(window,"resize",this.onResize)}},mt={resize:function(){var t=this.options,e=this.container,i=this.containerData,a=Number(t.minContainerWidth)||200,n=Number(t.minContainerHeight)||100;if(!(this.disabled||i.width<=a||i.height<=n)){var o,r,s=e.offsetWidth/i.width;1===s&&e.offsetHeight===i.height||(t.restore&&(o=this.getCanvasData(),r=this.getCropBoxData()),this.render(),t.restore&&(this.setCanvasData(A(o,function(t,e){o[e]=t*s})),this.setCropBoxData(A(r,function(t,e){r[e]=t*s}))))}},dblclick:function(){var t,e;this.disabled||"none"===this.options.dragMode||this.setDragMode((t=this.dragBox,e=s,(t.classList?t.classList.contains(e):t.className.indexOf(e)>-1)?"move":"crop"))},wheel:function(t){var e=this,i=Number(this.options.wheelZoomRatio)||.1,a=1;this.disabled||(t.preventDefault(),this.wheeling||(this.wheeling=!0,setTimeout(function(){e.wheeling=!1},50),t.deltaY?a=t.deltaY>0?1:-1:t.wheelDelta?a=-t.wheelDelta/120:t.detail&&(a=t.detail>0?1:-1),this.zoom(-a*i,t)))},cropStart:function(t){var e=t.buttons,i=t.button;if(!(this.disabled||T(e)&&1!==e||T(i)&&0!==i||t.ctrlKey)){var a,n=this.options,o=this.pointers;t.changedTouches?A(t.changedTouches,function(t){o[t.identifier]=rt(t)}):o[t.pointerId||0]=rt(t),a=Object.keys(o).length>1&&n.zoomable&&n.zoomOnTouch?"zoom":q(t.target,m),M.test(a)&&!1!==K(this.element,"cropstart",{originalEvent:t,action:a})&&(t.preventDefault(),this.action=a,this.cropping=!1,"crop"===a&&(this.cropping=!0,X(this.dragBox,d)))}},cropMove:function(t){var e=this.action;if(!this.disabled&&e){var i=this.pointers;t.preventDefault(),!1!==K(this.element,"cropmove",{originalEvent:t,action:e})&&(t.changedTouches?A(t.changedTouches,function(t){S(i[t.identifier]||{},rt(t,!0))}):S(i[t.pointerId||0]||{},rt(t,!0)),this.change(t))}},cropEnd:function(t){if(!this.disabled){var e=this.action,i=this.pointers;t.changedTouches?A(t.changedTouches,function(t){delete i[t.identifier]}):delete i[t.pointerId||0],e&&(t.preventDefault(),Object.keys(i).length||(this.action=""),this.cropping&&(this.cropping=!1,U(this.dragBox,d,this.cropped&&this.options.modal)),K(this.element,"cropend",{originalEvent:t,action:e}))}}},gt={change:function(t){var e,i=this.options,a=this.canvasData,n=this.containerData,o=this.cropBoxData,r=this.pointers,s=this.action,h=i.aspectRatio,p=o.left,l=o.top,d=o.width,u=o.height,m=p+d,g=l+u,f=0,v=0,w=n.width,b=n.height,y=!0;!h&&t.shiftKey&&(h=d&&u?d/u:1),this.limited&&(f=o.minLeft,v=o.minTop,w=f+Math.min(n.width,a.width,a.left+a.width),b=v+Math.min(n.height,a.height,a.top+a.height));var x=r[Object.keys(r)[0]],M={x:x.endX-x.startX,y:x.endY-x.startY},D=function(t){switch(t){case"e":m+M.x>w&&(M.x=w-m);break;case"w":p+M.xb&&(M.y=b-g)}};switch(s){case"all":p+=M.x,l+=M.y;break;case"e":if(M.x>=0&&(m>=w||h&&(l<=v||g>=b))){y=!1;break}D("e"),(d+=M.x)<0&&(s="w",p-=d=-d),h&&(u=d/h,l+=(o.height-u)/2);break;case"n":if(M.y<=0&&(l<=v||h&&(p<=f||m>=w))){y=!1;break}D("n"),u-=M.y,l+=M.y,u<0&&(s="s",l-=u=-u),h&&(d=u*h,p+=(o.width-d)/2);break;case"w":if(M.x<=0&&(p<=f||h&&(l<=v||g>=b))){y=!1;break}D("w"),d-=M.x,p+=M.x,d<0&&(s="e",p-=d=-d),h&&(u=d/h,l+=(o.height-u)/2);break;case"s":if(M.y>=0&&(g>=b||h&&(p<=f||m>=w))){y=!1;break}D("s"),(u+=M.y)<0&&(s="n",l-=u=-u),h&&(d=u*h,p+=(o.width-d)/2);break;case"ne":if(h){if(M.y<=0&&(l<=v||m>=w)){y=!1;break}D("n"),u-=M.y,l+=M.y,d=u*h}else D("n"),D("e"),M.x>=0?mv&&(u-=M.y,l+=M.y):(u-=M.y,l+=M.y);d<0&&u<0?(s="sw",l-=u=-u,p-=d=-d):d<0?(s="nw",p-=d=-d):u<0&&(s="se",l-=u=-u);break;case"nw":if(h){if(M.y<=0&&(l<=v||p<=f)){y=!1;break}D("n"),u-=M.y,l+=M.y,d=u*h,p+=o.width-d}else D("n"),D("w"),M.x<=0?p>f?(d-=M.x,p+=M.x):M.y<=0&&l<=v&&(y=!1):(d-=M.x,p+=M.x),M.y<=0?l>v&&(u-=M.y,l+=M.y):(u-=M.y,l+=M.y);d<0&&u<0?(s="se",l-=u=-u,p-=d=-d):d<0?(s="ne",p-=d=-d):u<0&&(s="sw",l-=u=-u);break;case"sw":if(h){if(M.x<=0&&(p<=f||g>=b)){y=!1;break}D("w"),d-=M.x,p+=M.x,u=d/h}else D("s"),D("w"),M.x<=0?p>f?(d-=M.x,p+=M.x):M.y>=0&&g>=b&&(y=!1):(d-=M.x,p+=M.x),M.y>=0?g=0&&(m>=w||g>=b)){y=!1;break}D("e"),d+=M.x,u=d/h}else D("s"),D("e"),M.x>=0?m=0&&g>=b&&(y=!1):d+=M.x,M.y>=0?g0?s=M.y>0?"se":"ne":M.x<0&&(p-=d,s=M.y>0?"sw":"nw"),M.y<0&&(l-=u),this.cropped||(Y(this.cropBox,c),this.cropped=!0,this.limited&&this.limitCropBox(!0,!0))}y&&(o.width=d,o.height=u,o.left=p,o.top=l,this.action=s,this.renderCropBox()),A(r,function(t){t.startX=t.endX,t.startY=t.endY})}},ft={crop:function(){return!this.ready||this.cropped||this.disabled||(this.cropped=!0,this.limitCropBox(!0,!0),this.options.modal&&X(this.dragBox,d),Y(this.cropBox,c),this.setCropBoxData(this.initialCropBoxData)),this},reset:function(){return this.ready&&!this.disabled&&(this.imageData=S({},this.initialImageData),this.canvasData=S({},this.initialCanvasData),this.cropBoxData=S({},this.initialCropBoxData),this.renderCanvas(),this.cropped&&this.renderCropBox()),this},clear:function(){return this.cropped&&!this.disabled&&(S(this.cropBoxData,{left:0,top:0,width:0,height:0}),this.cropped=!1,this.renderCropBox(),this.limitCanvas(!0,!0),this.renderCanvas(),Y(this.dragBox,d),X(this.cropBox,c)),this},replace:function(t){var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1];return!this.disabled&&t&&(this.isImg&&(this.element.src=t),e?(this.url=t,this.image.src=t,this.ready&&(this.viewBoxImage.src=t,A(this.previews,function(e){e.getElementsByTagName("img")[0].src=t}))):(this.isImg&&(this.replaced=!0),this.options.data=null,this.uncreate(),this.load(t))),this},enable:function(){return this.ready&&this.disabled&&(this.disabled=!1,Y(this.cropper,h)),this},disable:function(){return this.ready&&!this.disabled&&(this.disabled=!0,X(this.cropper,h)),this},destroy:function(){var t=this.element;return t.cropper?(t.cropper=void 0,this.isImg&&this.replaced&&(t.src=this.originalUrl),this.uncreate(),this):this},move:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:t,i=this.canvasData,a=i.left,n=i.top;return this.moveTo(B(t)?t:a+Number(t),B(e)?e:n+Number(e))},moveTo:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:t,i=this.canvasData,a=!1;return t=Number(t),e=Number(e),this.ready&&!this.disabled&&this.options.movable&&(T(t)&&(i.left=t,a=!0),T(e)&&(i.top=e,a=!0),a&&this.renderCanvas(!0)),this},zoom:function(t,e){var i=this.canvasData;return t=(t=Number(t))<0?1/(1-t):1+t,this.zoomTo(i.width*t/i.naturalWidth,null,e)},zoomTo:function(t,e,i){var a=this.options,n=this.canvasData,o=n.width,r=n.height,s=n.naturalWidth,h=n.naturalHeight;if((t=Number(t))>=0&&this.ready&&!this.disabled&&a.zoomable){var c=s*t,p=h*t;if(!1===K(this.element,"zoom",{ratio:t,oldRatio:o/s,originalEvent:i}))return this;if(i){var l=this.pointers,d=tt(this.cropper),u=l&&Object.keys(l).length?function(t){var e=0,i=0,a=0;return A(t,function(t){var n=t.startX,o=t.startY;e+=n,i+=o,a+=1}),{pageX:e/=a,pageY:i/=a}}(l):{pageX:i.pageX,pageY:i.pageY};n.left-=(c-o)*((u.pageX-d.left-n.left)/o),n.top-=(p-r)*((u.pageY-d.top-n.top)/r)}else N(e)&&T(e.x)&&T(e.y)?(n.left-=(c-o)*((e.x-n.left)/o),n.top-=(p-r)*((e.y-n.top)/r)):(n.left-=(c-o)/2,n.top-=(p-r)/2);n.width=c,n.height=p,this.renderCanvas(!0)}return this},rotate:function(t){return this.rotateTo((this.imageData.rotate||0)+Number(t))},rotateTo:function(t){return T(t=Number(t))&&this.ready&&!this.disabled&&this.options.rotatable&&(this.imageData.rotate=t%360,this.renderCanvas(!0,!0)),this},scaleX:function(t){var e=this.imageData.scaleY;return this.scale(t,T(e)?e:1)},scaleY:function(t){var e=this.imageData.scaleX;return this.scale(T(e)?e:1,t)},scale:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:t,i=this.imageData,a=!1;return t=Number(t),e=Number(e),this.ready&&!this.disabled&&this.options.scalable&&(T(t)&&(i.scaleX=t,a=!0),T(e)&&(i.scaleY=e,a=!0),a&&this.renderCanvas(!0,!0)),this},getData:function(){var t,e=arguments.length>0&&void 0!==arguments[0]&&arguments[0],i=this.options,a=this.imageData,n=this.canvasData,o=this.cropBoxData;if(this.ready&&this.cropped){t={x:o.left-n.left,y:o.top-n.top,width:o.width,height:o.height};var r=a.width/a.naturalWidth;if(A(t,function(e,i){t[i]=e/r}),e){var s=Math.round(t.y+t.height),h=Math.round(t.x+t.width);t.x=Math.round(t.x),t.y=Math.round(t.y),t.width=h-t.x,t.height=s-t.y}}else t={x:0,y:0,width:0,height:0};return i.rotatable&&(t.rotate=a.rotate||0),i.scalable&&(t.scaleX=a.scaleX||1,t.scaleY=a.scaleY||1),t},setData:function(t){var e=this.options,i=this.imageData,a=this.canvasData,n={};if(this.ready&&!this.disabled&&N(t)){var o=!1;e.rotatable&&T(t.rotate)&&t.rotate!==i.rotate&&(i.rotate=t.rotate,o=!0),e.scalable&&(T(t.scaleX)&&t.scaleX!==i.scaleX&&(i.scaleX=t.scaleX,o=!0),T(t.scaleY)&&t.scaleY!==i.scaleY&&(i.scaleY=t.scaleY,o=!0)),o&&this.renderCanvas(!0,!0);var r=i.width/i.naturalWidth;T(t.x)&&(n.left=t.x*r+a.left),T(t.y)&&(n.top=t.y*r+a.top),T(t.width)&&(n.width=t.width*r),T(t.height)&&(n.height=t.height*r),this.setCropBoxData(n)}return this},getContainerData:function(){return this.ready?S({},this.containerData):{}},getImageData:function(){return this.sized?S({},this.imageData):{}},getCanvasData:function(){var t=this.canvasData,e={};return this.ready&&A(["left","top","width","height","naturalWidth","naturalHeight"],function(i){e[i]=t[i]}),e},setCanvasData:function(t){var e=this.canvasData,i=e.aspectRatio;return this.ready&&!this.disabled&&N(t)&&(T(t.left)&&(e.left=t.left),T(t.top)&&(e.top=t.top),T(t.width)?(e.width=t.width,e.height=t.width/i):T(t.height)&&(e.height=t.height,e.width=t.height*i),this.renderCanvas(!0)),this},getCropBoxData:function(){var t,e=this.cropBoxData;return this.ready&&this.cropped&&(t={left:e.left,top:e.top,width:e.width,height:e.height}),t||{}},setCropBoxData:function(t){var e,i,a=this.cropBoxData,n=this.options.aspectRatio;return this.ready&&this.cropped&&!this.disabled&&N(t)&&(T(t.left)&&(a.left=t.left),T(t.top)&&(a.top=t.top),T(t.width)&&t.width!==a.width&&(e=!0,a.width=t.width),T(t.height)&&t.height!==a.height&&(i=!0,a.height=t.height),n&&(e?a.height=a.width/n:i&&(a.width=a.height*n)),this.renderCropBox()),this},getCroppedCanvas:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};if(!this.ready||!window.HTMLCanvasElement)return null;var e=this.canvasData,a=function(t,e,a,n){var o=e.aspectRatio,r=e.naturalWidth,s=e.naturalHeight,h=e.rotate,c=void 0===h?0:h,p=e.scaleX,l=void 0===p?1:p,d=e.scaleY,u=void 0===d?1:d,m=a.aspectRatio,g=a.naturalWidth,f=a.naturalHeight,v=n.fillColor,w=void 0===v?"transparent":v,b=n.imageSmoothingEnabled,y=void 0===b||b,x=n.imageSmoothingQuality,M=void 0===x?"low":x,D=n.maxWidth,C=void 0===D?1/0:D,k=n.maxHeight,E=void 0===k?1/0:k,T=n.minWidth,O=void 0===T?0:T,B=n.minHeight,L=void 0===B?0:B,R=document.createElement("canvas"),N=R.getContext("2d"),I=st({aspectRatio:m,width:C,height:E}),_=st({aspectRatio:m,width:O,height:L},"cover"),j=Math.min(I.width,Math.max(_.width,g)),A=Math.min(I.height,Math.max(_.height,f)),S=st({aspectRatio:o,width:C,height:E}),W=st({aspectRatio:o,width:O,height:L},"cover"),H=Math.min(S.width,Math.max(W.width,r)),$=Math.min(S.height,Math.max(W.height,s)),X=[-H/2,-$/2,H,$];return R.width=z(j),R.height=z(A),N.fillStyle=w,N.fillRect(0,0,j,A),N.save(),N.translate(j/2,A/2),N.rotate(c*Math.PI/180),N.scale(l,u),N.imageSmoothingEnabled=y,N.imageSmoothingQuality=M,N.drawImage.apply(N,[t].concat(i(X.map(function(t){return Math.floor(z(t))})))),N.restore(),R}(this.image,this.imageData,e,t);if(!this.cropped)return a;var n=this.getData(),o=n.x,r=n.y,s=n.width,h=n.height,c=a.width/Math.floor(e.naturalWidth);1!==c&&(o*=c,r*=c,s*=c,h*=c);var p=s/h,l=st({aspectRatio:p,width:t.maxWidth||1/0,height:t.maxHeight||1/0}),d=st({aspectRatio:p,width:t.minWidth||0,height:t.minHeight||0},"cover"),u=st({aspectRatio:p,width:t.width||(1!==c?a.width:s),height:t.height||(1!==c?a.height:h)}),m=u.width,g=u.height;m=Math.min(l.width,Math.max(d.width,m)),g=Math.min(l.height,Math.max(d.height,g));var f=document.createElement("canvas"),v=f.getContext("2d");f.width=z(m),f.height=z(g),v.fillStyle=t.fillColor||"transparent",v.fillRect(0,0,m,g);var w=t.imageSmoothingEnabled,b=void 0===w||w,y=t.imageSmoothingQuality;v.imageSmoothingEnabled=b,y&&(v.imageSmoothingQuality=y);var x,M,D,C,k,E,T=a.width,O=a.height,B=o,L=r;B<=-s||B>T?(B=0,x=0,D=0,k=0):B<=0?(D=-B,B=0,x=Math.min(T,s+B),k=x):B<=T&&(D=0,x=Math.min(s,T-B),k=x),x<=0||L<=-h||L>O?(L=0,M=0,C=0,E=0):L<=0?(C=-L,L=0,M=Math.min(O,h+L),E=M):L<=O&&(C=0,M=Math.min(h,O-L),E=M);var R=[B,L,x,M];if(k>0&&E>0){var N=m/s;R.push(D*N,C*N,k*N,E*N)}return v.drawImage.apply(v,[a].concat(i(R.map(function(t){return Math.floor(z(t))})))),f},setAspectRatio:function(t){var e=this.options;return this.disabled||B(t)||(e.aspectRatio=Math.max(0,t)||NaN,this.ready&&(this.initCropBox(),this.cropped&&this.renderCropBox())),this},setDragMode:function(t){var e=this.options,i=this.dragBox,a=this.face;if(this.ready&&!this.disabled){var n="crop"===t,o=e.movable&&"move"===t;t=n||o?t:"none",e.dragMode=t,Q(i,m,t),U(i,s,n),U(i,u,o),e.cropBoxMovable||(Q(a,m,t),U(a,s,n),U(a,u,o))}return this}},vt=n.Cropper,wt=function(){function t(e){var i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),!e||!C.test(e.tagName))throw new Error("The first argument is required and must be an or element.");this.element=e,this.options=S({},k,N(i)&&i),this.cropped=!1,this.disabled=!1,this.pointers={},this.ready=!1,this.reloading=!1,this.replaced=!1,this.sized=!1,this.sizing=!1,this.init()}return i=t,o=[{key:"noConflict",value:function(){return window.Cropper=vt,t}},{key:"setDefaults",value:function(t){S(k,N(t)&&t)}}],(a=[{key:"init",value:function(){var t,e=this.element,i=e.tagName.toLowerCase();if(!e.cropper){if(e.cropper=this,"img"===i){if(this.isImg=!0,t=e.getAttribute("src")||"",this.originalUrl=t,!t)return;t=e.src}else"canvas"===i&&window.HTMLCanvasElement&&(t=e.toDataURL());this.load(t)}}},{key:"load",value:function(t){var e=this;if(t){this.url=t,this.imageData={};var i=this.element,a=this.options;if(a.rotatable||a.scalable||(a.checkOrientation=!1),a.checkOrientation&&window.ArrayBuffer)if(D.test(t))this.read((n=t.replace(ct,""),o=atob(n),r=new ArrayBuffer(o.length),A(s=new Uint8Array(r),function(t,e){s[e]=o.charCodeAt(e)}),r));else{var n,o,r,s,h=new XMLHttpRequest,c=this.clone.bind(this);this.reloading=!0,this.xhr=h,h.onabort=c,h.onerror=c,h.ontimeout=c,h.onprogress=function(){"image/jpeg"!==h.getResponseHeader("content-type")&&h.abort()},h.onload=function(){e.read(h.response)},h.onloadend=function(){e.reloading=!1,e.xhr=null},a.checkCrossOrigin&&at(t)&&i.crossOrigin&&(t=nt(t)),h.open("GET",t),h.responseType="arraybuffer",h.withCredentials="use-credentials"===i.crossOrigin,h.send()}else this.clone()}}},{key:"read",value:function(t){var e=this.options,i=this.imageData,a=pt(t),n=0,o=1,r=1;if(a>1){this.url=function(t,e){for(var i=[],a=new Uint8Array(t);a.length>0;)i.push(ht.apply(null,j(a.subarray(0,8192)))),a=a.subarray(8192);return"data:".concat(e,";base64,").concat(btoa(i.join("")))}(t,"image/jpeg");var s=function(t){var e=0,i=1,a=1;switch(t){case 2:i=-1;break;case 3:e=-180;break;case 4:a=-1;break;case 5:e=90,a=-1;break;case 6:e=90;break;case 7:e=90,i=-1;break;case 8:e=-90}return{rotate:e,scaleX:i,scaleY:a}}(a);n=s.rotate,o=s.scaleX,r=s.scaleY}e.rotatable&&(i.rotate=n),e.scalable&&(i.scaleX=o,i.scaleY=r),this.clone()}},{key:"clone",value:function(){var t,e,i=this.element,a=this.url;this.options.checkCrossOrigin&&at(a)&&((t=i.crossOrigin)?e=a:(t="anonymous",e=nt(a))),this.crossOrigin=t,this.crossOriginUrl=e;var n=document.createElement("img");t&&(n.crossOrigin=t),n.src=e||a,this.image=n,n.onload=this.start.bind(this),n.onerror=this.stop.bind(this),X(n,p),i.parentNode.insertBefore(n,i.nextSibling)}},{key:"start",value:function(){var t=this,e=this.isImg?this.element:this.image;e.onload=null,e.onerror=null,this.sizing=!0;var i=n.navigator&&/^(?:.(?!chrome|android))*safari/i.test(n.navigator.userAgent),a=function(e,i){S(t.imageData,{naturalWidth:e,naturalHeight:i,aspectRatio:e/i}),t.sizing=!1,t.sized=!0,t.build()};if(!e.naturalWidth||i){var o=document.createElement("img"),r=document.body||document.documentElement;this.sizingImage=o,o.onload=function(){a(o.width,o.height),i||r.removeChild(o)},o.src=e.src,i||(o.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;",r.appendChild(o))}else a(e.naturalWidth,e.naturalHeight)}},{key:"stop",value:function(){var t=this.image;t.onload=null,t.onerror=null,t.parentNode.removeChild(t),this.image=null}},{key:"build",value:function(){if(this.sized&&!this.ready){var t=this.element,e=this.options,i=this.image,a=t.parentNode,n=document.createElement("div");n.innerHTML='
';var o=n.querySelector(".".concat("cropper","-container")),r=o.querySelector(".".concat("cropper","-canvas")),s=o.querySelector(".".concat("cropper","-drag-box")),h=o.querySelector(".".concat("cropper","-crop-box")),d=h.querySelector(".".concat("cropper","-face"));this.container=a,this.cropper=o,this.canvas=r,this.dragBox=s,this.cropBox=h,this.viewBox=o.querySelector(".".concat("cropper","-view-box")),this.face=d,r.appendChild(i),X(t,c),a.insertBefore(o,t.nextSibling),this.isImg||Y(i,p),this.initPreview(),this.bind(),e.initialAspectRatio=Math.max(0,e.initialAspectRatio)||NaN,e.aspectRatio=Math.max(0,e.aspectRatio)||NaN,e.viewMode=Math.max(0,Math.min(3,Math.round(e.viewMode)))||0,X(h,c),e.guides||X(h.getElementsByClassName("".concat("cropper","-dashed")),c),e.center||X(h.getElementsByClassName("".concat("cropper","-center")),c),e.background&&X(o,"".concat("cropper","-bg")),e.highlight||X(d,l),e.cropBoxMovable&&(X(d,u),Q(d,m,"all")),e.cropBoxResizable||(X(h.getElementsByClassName("".concat("cropper","-line")),c),X(h.getElementsByClassName("".concat("cropper","-point")),c)),this.render(),this.ready=!0,this.setDragMode(e.dragMode),e.autoCrop&&this.crop(),this.setData(e.data),I(e.ready)&&Z(t,"ready",e.ready,{once:!0}),K(t,"ready")}}},{key:"unbuild",value:function(){this.ready&&(this.ready=!1,this.unbind(),this.resetPreview(),this.cropper.parentNode.removeChild(this.cropper),Y(this.element,c))}},{key:"uncreate",value:function(){this.ready?(this.unbuild(),this.ready=!1,this.cropped=!1):this.sizing?(this.sizingImage.onload=null,this.sizing=!1,this.sized=!1):this.reloading?(this.xhr.onabort=null,this.xhr.abort()):this.image&&this.stop()}}])&&e(i.prototype,a),o&&e(i,o),t;var i,a,o}();return S(wt.prototype,lt,dt,ut,mt,gt,ft),wt}()},"./node_modules/font-awesome sync \\.(otf|eot|svg|ttf|woff|woff2)$":function(t,e){function i(t){var e=new Error("Cannot find module '"+t+"'");throw e.code="MODULE_NOT_FOUND",e}i.keys=function(){return[]},i.resolve=i,t.exports=i,i.id="./node_modules/font-awesome sync \\.(otf|eot|svg|ttf|woff|woff2)$"},"./src/_events.js":function(t,e){t.exports={AJAX:"ajax-load",LOADED:"load",SET_TARGET_UPDATE:"set-target-update",RESTORE_FIELD:"restore-field",FORM_INIT_BASICS:"form-basics",FORM_INIT_STEPPED:"form-init-stepped",FORM_INIT_VALIDATE:"form-init-validate",FORM_INIT_VALIDATE_FIELD:"form-init-validate-field",FORM_INIT_STORAGE:"form-init-storage",FORM_VALIDATION_FAILED:"form-validation-failed",FORM_STEPPED_NEW_STEP:"form-new-step",FORM_STEPPED_FIRST_STEP:"form-first-step",FORM_STEPPED_LAST_STEP:"form-last-step"}},"./src/app.js":function(t,e,i){"use strict";i.r(e);i("./src/app.scss");var a=i("./src/_events.js"),n=i.n(a),o=i("jquery"),r=i.n(o),s=function(){function t(t,e){for(var i=0;i'),r.$image=r.$el.find("img.cropping-image"),r.original_image=r.$image[0],r.mask_img=!1,r.name=r.$input.attr("name"),r.width=r.$input.data("width"),r.height=r.$input.data("height"),r.options=o,r.cropper=!1,r.$el.data(i,r),r.$el.prepend('
'),r.$removeBtns=r.$el.find(".remove-masks"),r.masks=[],r.$input.on("change",function(t){var e=t.currentTarget.files;e&&e.length&&r.loadFile(e[0])}),r.$el.append('Crop it'),r.$el.find(".act-crop").on("click",function(t){if(!r.cropper)return!0;t.preventDefault();var i=r.cropper.getCroppedCanvas({width:r.width,height:r.height});r.$image[0].src=i.toDataURL(),r.original_image=new Image,r.original_image.src=i.toDataURL(),r.cropper.destroy(),r.cropper=!1,r.$el.removeClass(e+"-cropping"),r.$el.addClass(e+"-cropped")}),r.$el.find(".masks .mask-item").on("click",function(e){e.preventDefault(),r.setMask(t(e.currentTarget))}),r.$form.on("submit",function(t){if(!r.cropper)return!0;h.show(),r.saveImage();var e=r.cropper.getCroppedCanvas({width:r.width,height:r.height});r.$image[0].src=e.toDataURL(),e.toBlob(function(t){r.uploadFile(t)}),t.preventDefault()})}return l(a,null,[{key:"dispose",value:function(){console.log("Destroying: "+e)}},{key:"_jQueryInterface",value:function(){return this.each(function(e,n){var o=t(n),r=o.data(i);r||(r=new a(n),o.data(i,r))})}}]),a}(),s=function(){var i=this;this.setMask=function(t){var e=i;e.mask_img&&e.addMask(e.getMask()),e.cropper&&(e.cropper.destroy(),e.cropper=!1,e.saveImage()),e.mask_img=new Image,e.mask_img.src=t.data("src"),e.mask_img.onload=function(){var i=e.mask_img;e.cropper=new p.a(e.$image[0],{aspectRatio:i.width/i.height,viewMode:0,guides:!0,center:!0,highlight:!0,cropBoxMovable:!0,cropBoxResizable:!0,movable:!1,rotatable:!1,zoomable:!1,ready:function(){e.$el.find(".cropper-face").css({"background-color":"transparent","background-image":"url("+e.mask_img.src+")",opacity:"0.8"}),e.$el.find(".cropper-face").data("current-mask",t)}})}},this.addMask=function(e){var a=i,n=Date.now();a.masks[n]=e;var o=t('Delete mask #'+n+"");return a.$el.find(".masks").append(o),o.on("click",function(e){e.preventDefault();var i=t(e.currentTarget).data("id");a.removeMask(i)}),n},this.removeMask=function(t){var e=i;delete e.masks[t],e.$el.find('.masks [data-id="'+t+'"]').remove(),e.mask_img=!1,e.$el.find(".cropper-face").data("current-mask").click()},this.getMask=function(){var t=i,e=document.createElement("canvas"),a=e.getContext("2d"),n=t.cropper,o=n.getData().width,r=n.getData().height,s=n.getData().y,h=n.getData().x;n.getImageData().left,n.getImageData().top,n.getImageData().aspectRatio;return e.width=t.width,e.height=t.height,a.imageSmoothingEnabled=!0,{img:t.mask_img,left:h,top:s,width:o,height:r}},this.saveImage=function(){var t=i,e=document.createElement("canvas"),a=e.getContext("2d");for(var n in e.width=t.width,e.height=t.height,a.imageSmoothingEnabled=!0,a.drawImage(t.original_image,0,0,t.width,t.height),t.masks){var o=t.masks[n];console.log(o),a.drawImage(o.img,o.left,o.top,o.width,o.height)}return t.$image[0].src=e.toDataURL(),e},this.loadFile=function(t){var a=i;/^image\/\w+/.test(t.type)?(a.$image[0].src=URL.createObjectURL(t),a.cropper&&a.cropper.destroy(),a.cropper=new p.a(a.$image[0],a.options),a.$input[0].value=null,a.$el.addClass(e+"-cropping")):window.alert("Please choose an image file.")},this.uploadFile=function(e){console.log("Initializing uploading sequence!");var o=i,r=new FormData(o.$form[0]);r.delete("BackURL"),r.delete(o.name),r.append(o.name,e,o.name+"-image.png"),r.append("ajax","1"),t.ajax({url:o.$form.attr("action"),data:r,processData:!1,contentType:!1,type:o.$form.attr("method"),success:function(e){console.log("UPLOAD SUCCESS!"),h.hide(),t(a).trigger(n.a.AJAX)}})}};t.fn[e]=r._jQueryInterface,t.fn[e].Constructor=r,t.fn[e].noConflict=function(){return t.fn[e]=JQUERY_NO_CONFLICT,r._jQueryInterface},t(window).on(n.a.AJAX+" "+n.a.LOADED,function(){t(".field.croppie").jsCroppieUI()})}(r.a);var d=function(){function t(t,e){for(var i=0;i' + '
' + '' + '
' + '
' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '
' + '';\n\n /**\n * Check if the given value is not a number.\n */\n\n var isNaN = Number.isNaN || WINDOW.isNaN;\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 */\n\n function isNumber(value) {\n return typeof value === 'number' && !isNaN(value);\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 */\n\n var isPositiveNumber = function isPositiveNumber(value) {\n return value > 0 && value < Infinity;\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 */\n\n function isUndefined(value) {\n return typeof value === 'undefined';\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 */\n\n function isObject(value) {\n return _typeof(value) === 'object' && value !== null;\n }\n var hasOwnProperty = Object.prototype.hasOwnProperty;\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 */\n\n function isPlainObject(value) {\n if (!isObject(value)) {\n return false;\n }\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 * 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 */\n\n function isFunction(value) {\n return typeof value === 'function';\n }\n var slice = Array.prototype.slice;\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 */\n\n function toArray(value) {\n return Array.from ? Array.from(value) : slice.call(value);\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 */\n\n function forEach(data, callback) {\n if (data && isFunction(callback)) {\n if (Array.isArray(data) || isNumber(data.length)\n /* array-like */\n ) {\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\n return data;\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 */\n\n var 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\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\n return target;\n };\n var REGEXP_DECIMALS = /\\.\\d*(?:0|9){12}\\d*$/;\n /**\n * Normalize decimal number.\n * Check out {@link http://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 */\n\n function 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 }\n var REGEXP_SUFFIX = /^width|height|left|top|marginLeft|marginTop$/;\n /**\n * Apply styles to the given element.\n * @param {Element} element - The target element.\n * @param {Object} styles - The styles for applying.\n */\n\n function 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\n style[property] = value;\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 */\n\n function hasClass(element, value) {\n return element.classList ? element.classList.contains(value) : element.className.indexOf(value) > -1;\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 */\n\n function addClass(element, value) {\n if (!value) {\n return;\n }\n\n if (isNumber(element.length)) {\n forEach(element, function (elem) {\n addClass(elem, value);\n });\n return;\n }\n\n if (element.classList) {\n element.classList.add(value);\n return;\n }\n\n var className = element.className.trim();\n\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 * Remove classes from the given element.\n * @param {Element} element - The target element.\n * @param {string} value - The classes to be removed.\n */\n\n function removeClass(element, value) {\n if (!value) {\n return;\n }\n\n if (isNumber(element.length)) {\n forEach(element, function (elem) {\n removeClass(elem, value);\n });\n return;\n }\n\n if (element.classList) {\n element.classList.remove(value);\n return;\n }\n\n if (element.className.indexOf(value) >= 0) {\n element.className = element.className.replace(value, '');\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 */\n\n function toggleClass(element, value, added) {\n if (!value) {\n return;\n }\n\n if (isNumber(element.length)) {\n forEach(element, function (elem) {\n toggleClass(elem, value, added);\n });\n return;\n } // IE10-11 doesn't support the second parameter of `classList.toggle`\n\n\n if (added) {\n addClass(element, value);\n } else {\n removeClass(element, value);\n }\n }\n var REGEXP_CAMEL_CASE = /([a-z\\d])([A-Z])/g;\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 */\n\n function toParamCase(value) {\n return value.replace(REGEXP_CAMEL_CASE, '$1-$2').toLowerCase();\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 */\n\n function getData(element, name) {\n if (isObject(element[name])) {\n return element[name];\n }\n\n if (element.dataset) {\n return element.dataset[name];\n }\n\n return element.getAttribute(\"data-\".concat(toParamCase(name)));\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 */\n\n function 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 * Remove data from the given element.\n * @param {Element} element - The target element.\n * @param {string} name - The data key to remove.\n */\n\n function 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 }\n var REGEXP_SPACES = /\\s\\s*/;\n\n var onceSupported = function () {\n var supported = false;\n\n if (IS_BROWSER) {\n var once = false;\n\n var listener = function listener() {};\n\n var options = Object.defineProperty({}, 'once', {\n get: function get() {\n supported = true;\n return once;\n },\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\n return supported;\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 */\n\n\n function 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\n if (listeners && listeners[event] && listeners[event][listener]) {\n handler = listeners[event][listener];\n delete listeners[event][listener];\n\n if (Object.keys(listeners[event]).length === 0) {\n delete listeners[event];\n }\n\n if (Object.keys(listeners).length === 0) {\n delete element.listeners;\n }\n }\n }\n\n element.removeEventListener(event, handler, options);\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 */\n\n function 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\n _handler = function handler() {\n delete listeners[event][listener];\n element.removeEventListener(event, _handler, options);\n\n for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n args[_key2] = arguments[_key2];\n }\n\n listener.apply(element, args);\n };\n\n if (!listeners[event]) {\n listeners[event] = {};\n }\n\n if (listeners[event][listener]) {\n element.removeEventListener(event, listeners[event][listener], options);\n }\n\n listeners[event][listener] = _handler;\n element.listeners = listeners;\n }\n\n element.addEventListener(event, _handler, options);\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 */\n\n function dispatchEvent(element, type, data) {\n var event; // Event and CustomEvent on IE9-11 are global objects, not constructors\n\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\n return element.dispatchEvent(event);\n }\n /**\n * Get the offset base on the document.\n * @param {Element} element - The target element.\n * @returns {Object} The offset data.\n */\n\n function 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 }\n var location = WINDOW.location;\n var REGEXP_ORIGINS = /^(\\w+:)\\/\\/([^:/?#]*):?(\\d*)/i;\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 */\n\n function 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 * Add timestamp to the given URL.\n * @param {string} url - The target URL.\n * @returns {string} The result URL.\n */\n\n function addTimestamp(url) {\n var timestamp = \"timestamp=\".concat(new Date().getTime());\n return url + (url.indexOf('?') === -1 ? '?' : '&') + timestamp;\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 */\n\n function 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\n if (isNumber(translateX) && translateX !== 0) {\n values.push(\"translateX(\".concat(translateX, \"px)\"));\n }\n\n if (isNumber(translateY) && translateY !== 0) {\n values.push(\"translateY(\".concat(translateY, \"px)\"));\n } // Rotate should come first before scale to match orientation transform\n\n\n if (isNumber(rotate) && rotate !== 0) {\n values.push(\"rotate(\".concat(rotate, \"deg)\"));\n }\n\n if (isNumber(scaleX) && scaleX !== 1) {\n values.push(\"scaleX(\".concat(scaleX, \")\"));\n }\n\n if (isNumber(scaleY) && scaleY !== 1) {\n values.push(\"scaleY(\".concat(scaleY, \")\"));\n }\n\n var transform = values.length ? values.join(' ') : 'none';\n return {\n WebkitTransform: transform,\n msTransform: transform,\n transform: transform\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 */\n\n function getMaxZoomRatio(pointers) {\n var pointers2 = assign({}, pointers);\n var ratios = [];\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 ratios.push(ratio);\n });\n });\n ratios.sort(function (a, b) {\n return Math.abs(a) < Math.abs(b);\n });\n return ratios[0];\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 */\n\n function 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 : assign({\n startX: pageX,\n startY: pageY\n }, end);\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 */\n\n function 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 * 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 */\n\n function getAdjustedSizes(_ref4) // or 'cover'\n {\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\n if (isValidWidth && isValidHeight) {\n var adjustedWidth = height * aspectRatio;\n\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\n return {\n width: width,\n height: height\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 */\n\n function getRotatedSizes(_ref5) {\n var width = _ref5.width,\n height = _ref5.height,\n degree = _ref5.degree;\n degree = Math.abs(degree) % 180;\n\n if (degree === 90) {\n return {\n width: height,\n height: width\n };\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 * 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 */\n\n function 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)); // Note: should always use image's natural sizes for drawing as\n // imageData.naturalWidth === canvasData.naturalHeight when rotate % 180 === 90\n\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 }\n var fromCharCode = String.fromCharCode;\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 */\n\n function getStringFromCharCode(dataView, start, length) {\n var str = '';\n length += start;\n\n for (var i = start; i < length; i += 1) {\n str += fromCharCode(dataView.getUint8(i));\n }\n\n return str;\n }\n var REGEXP_DATA_URL_HEAD = /^data:.*,/;\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 */\n\n function 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 * 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 */\n\n function arrayBufferToDataURL(arrayBuffer, mimeType) {\n var chunks = []; // Chunk Typed Array for better performance (#435)\n\n var chunkSize = 8192;\n var uint8 = new Uint8Array(arrayBuffer);\n\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\n return \"data:\".concat(mimeType, \";base64,\").concat(btoa(chunks.join('')));\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 */\n\n function resetAndGetOrientation(arrayBuffer) {\n var dataView = new DataView(arrayBuffer);\n var orientation; // Ignores range error when the image does not have correct Exif information\n\n try {\n var littleEndian;\n var app1Start;\n var ifdStart; // Only handle JPEG image (start by 0xFFD8)\n\n if (dataView.getUint8(0) === 0xFF && dataView.getUint8(1) === 0xD8) {\n var length = dataView.byteLength;\n var offset = 2;\n\n while (offset + 1 < length) {\n if (dataView.getUint8(offset) === 0xFF && dataView.getUint8(offset + 1) === 0xE1) {\n app1Start = offset;\n break;\n }\n\n offset += 1;\n }\n }\n\n if (app1Start) {\n var exifIDCode = app1Start + 4;\n var tiffOffset = app1Start + 10;\n\n if (getStringFromCharCode(dataView, exifIDCode, 4) === 'Exif') {\n var endianness = dataView.getUint16(tiffOffset);\n littleEndian = endianness === 0x4949;\n\n if (littleEndian || endianness === 0x4D4D\n /* bigEndian */\n ) {\n if (dataView.getUint16(tiffOffset + 2, littleEndian) === 0x002A) {\n var firstIFDOffset = dataView.getUint32(tiffOffset + 4, littleEndian);\n\n if (firstIFDOffset >= 0x00000008) {\n ifdStart = tiffOffset + firstIFDOffset;\n }\n }\n }\n }\n }\n\n if (ifdStart) {\n var _length = dataView.getUint16(ifdStart, littleEndian);\n\n var _offset;\n\n var i;\n\n for (i = 0; i < _length; i += 1) {\n _offset = ifdStart + i * 12 + 2;\n\n if (dataView.getUint16(_offset, littleEndian) === 0x0112\n /* Orientation */\n ) {\n // 8 is the offset of the current tag's value\n _offset += 8; // Get the original orientation value\n\n orientation = dataView.getUint16(_offset, littleEndian); // Override the orientation with its default value\n\n dataView.setUint16(_offset, 1, littleEndian);\n break;\n }\n }\n }\n } catch (error) {\n orientation = 1;\n }\n\n return orientation;\n }\n /**\n * Parse Exif Orientation value.\n * @param {number} orientation - The orientation to parse.\n * @returns {Object} The parsed result.\n */\n\n function parseOrientation(orientation) {\n var rotate = 0;\n var scaleX = 1;\n var scaleY = 1;\n\n switch (orientation) {\n // Flip horizontal\n case 2:\n scaleX = -1;\n break;\n // Rotate left 180°\n\n case 3:\n rotate = -180;\n break;\n // Flip vertical\n\n case 4:\n scaleY = -1;\n break;\n // Flip vertical and rotate right 90°\n\n case 5:\n rotate = 90;\n scaleY = -1;\n break;\n // Rotate right 90°\n\n case 6:\n rotate = 90;\n break;\n // Flip horizontal and rotate right 90°\n\n case 7:\n rotate = 90;\n scaleX = -1;\n break;\n // Rotate left 90°\n\n case 8:\n rotate = -90;\n break;\n\n default:\n }\n\n return {\n rotate: rotate,\n scaleX: scaleX,\n scaleY: scaleY\n };\n }\n\n var render = {\n render: function render() {\n this.initContainer();\n this.initCanvas();\n this.initCropBox();\n this.renderCanvas();\n\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 addClass(cropper, CLASS_HIDDEN);\n removeClass(element, CLASS_HIDDEN);\n var containerData = {\n width: Math.max(container.offsetWidth, Number(options.minContainerWidth) || 200),\n height: Math.max(container.offsetHeight, Number(options.minContainerHeight) || 100)\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\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\n var canvasData = {\n aspectRatio: aspectRatio,\n naturalWidth: naturalWidth,\n naturalHeight: naturalHeight,\n width: canvasWidth,\n height: canvasHeight\n };\n canvasData.left = (containerData.width - canvasWidth) / 2;\n canvasData.top = (containerData.height - canvasHeight) / 2;\n canvasData.oldLeft = canvasData.left;\n canvasData.oldTop = canvasData.top;\n this.canvasData = canvasData;\n this.limited = viewMode === 1 || viewMode === 2;\n this.limitCanvas(true, true);\n this.initialImageData = assign({}, imageData);\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\n if (sizeLimited) {\n var minCanvasWidth = Number(options.minCanvasWidth) || 0;\n var minCanvasHeight = Number(options.minCanvasHeight) || 0;\n\n if (viewMode > 1) {\n minCanvasWidth = Math.max(minCanvasWidth, containerData.width);\n minCanvasHeight = Math.max(minCanvasHeight, containerData.height);\n\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\n if (minCanvasHeight * aspectRatio > minCanvasWidth) {\n minCanvasWidth = minCanvasHeight * aspectRatio;\n } else {\n minCanvasHeight = minCanvasWidth / aspectRatio;\n }\n }\n }\n\n var _getAdjustedSizes = getAdjustedSizes({\n aspectRatio: aspectRatio,\n width: minCanvasWidth,\n height: minCanvasHeight\n });\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\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\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\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\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\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\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\n if (canvasData.width > canvasData.maxWidth || canvasData.width < canvasData.minWidth) {\n canvasData.left = canvasData.oldLeft;\n }\n\n if (canvasData.height > canvasData.maxHeight || canvasData.height < canvasData.minHeight) {\n canvasData.top = canvasData.oldTop;\n }\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\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\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\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\n this.cropBoxData = cropBoxData;\n this.limitCropBox(true, true); // Initialize auto crop area\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); // The width/height of auto crop area must large than \"minWidth/Height\"\n\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\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; // The min/maxCropBoxWidth/Height must be less than container's width/height\n\n minCropBoxWidth = Math.min(minCropBoxWidth, containerData.width);\n minCropBoxHeight = Math.min(minCropBoxHeight, containerData.height);\n\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\n if (maxCropBoxHeight * aspectRatio > maxCropBoxWidth) {\n maxCropBoxHeight = maxCropBoxWidth / aspectRatio;\n } else {\n maxCropBoxWidth = maxCropBoxHeight * aspectRatio;\n }\n } // The minWidth/Height must be less than maxWidth/Height\n\n\n cropBoxData.minWidth = Math.min(minCropBoxWidth, maxCropBoxWidth);\n cropBoxData.minHeight = Math.min(minCropBoxHeight, maxCropBoxHeight);\n cropBoxData.maxWidth = maxCropBoxWidth;\n cropBoxData.maxHeight = maxCropBoxHeight;\n }\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\n if (cropBoxData.width > cropBoxData.maxWidth || cropBoxData.width < cropBoxData.minWidth) {\n cropBoxData.left = cropBoxData.oldLeft;\n }\n\n if (cropBoxData.height > cropBoxData.maxHeight || cropBoxData.height < cropBoxData.minHeight) {\n cropBoxData.top = cropBoxData.oldTop;\n }\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\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\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\n if (this.cropped && this.limited) {\n this.limitCanvas(true, true);\n }\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\n var preview = {\n initPreview: function initPreview() {\n var crossOrigin = this.crossOrigin;\n var preview = this.options.preview;\n var url = crossOrigin ? this.crossOriginUrl : this.url;\n var image = document.createElement('img');\n\n if (crossOrigin) {\n image.crossOrigin = crossOrigin;\n }\n\n image.src = url;\n this.viewBox.appendChild(image);\n this.viewBoxImage = image;\n\n if (!preview) {\n return;\n }\n\n var previews = preview;\n\n if (typeof preview === 'string') {\n previews = this.element.ownerDocument.querySelectorAll(preview);\n } else if (preview.querySelector) {\n previews = [preview];\n }\n\n this.previews = previews;\n forEach(previews, function (el) {\n var img = document.createElement('img'); // Save the original size for recover\n\n setData(el, DATA_PREVIEW, {\n width: el.offsetWidth,\n height: el.offsetHeight,\n html: el.innerHTML\n });\n\n if (crossOrigin) {\n img.crossOrigin = crossOrigin;\n }\n\n img.src = url;\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\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\n if (!this.cropped || this.disabled) {\n return;\n }\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\n if (cropBoxWidth) {\n ratio = originalWidth / cropBoxWidth;\n newHeight = cropBoxHeight * ratio;\n }\n\n if (cropBoxHeight && newHeight > originalHeight) {\n ratio = originalHeight / cropBoxHeight;\n newWidth = cropBoxWidth * ratio;\n newHeight = originalHeight;\n }\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\n var events = {\n bind: function bind() {\n var element = this.element,\n options = this.options,\n cropper = this.cropper;\n\n if (isFunction(options.cropstart)) {\n addListener(element, EVENT_CROP_START, options.cropstart);\n }\n\n if (isFunction(options.cropmove)) {\n addListener(element, EVENT_CROP_MOVE, options.cropmove);\n }\n\n if (isFunction(options.cropend)) {\n addListener(element, EVENT_CROP_END, options.cropend);\n }\n\n if (isFunction(options.crop)) {\n addListener(element, EVENT_CROP, options.crop);\n }\n\n if (isFunction(options.zoom)) {\n addListener(element, EVENT_ZOOM, options.zoom);\n }\n\n addListener(cropper, EVENT_POINTER_DOWN, this.onCropStart = this.cropStart.bind(this));\n\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\n if (options.toggleDragModeOnDblclick) {\n addListener(cropper, EVENT_DBLCLICK, this.onDblclick = this.dblclick.bind(this));\n }\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\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\n if (isFunction(options.cropstart)) {\n removeListener(element, EVENT_CROP_START, options.cropstart);\n }\n\n if (isFunction(options.cropmove)) {\n removeListener(element, EVENT_CROP_MOVE, options.cropmove);\n }\n\n if (isFunction(options.cropend)) {\n removeListener(element, EVENT_CROP_END, options.cropend);\n }\n\n if (isFunction(options.crop)) {\n removeListener(element, EVENT_CROP, options.crop);\n }\n\n if (isFunction(options.zoom)) {\n removeListener(element, EVENT_ZOOM, options.zoom);\n }\n\n removeListener(cropper, EVENT_POINTER_DOWN, this.onCropStart);\n\n if (options.zoomable && options.zoomOnWheel) {\n removeListener(cropper, EVENT_WHEEL, this.onWheel, {\n passive: false,\n capture: true\n });\n }\n\n if (options.toggleDragModeOnDblclick) {\n removeListener(cropper, EVENT_DBLCLICK, this.onDblclick);\n }\n\n removeListener(element.ownerDocument, EVENT_POINTER_MOVE, this.onCropMove);\n removeListener(element.ownerDocument, EVENT_POINTER_UP, this.onCropEnd);\n\n if (options.responsive) {\n removeListener(window, EVENT_RESIZE, this.onResize);\n }\n }\n };\n\n var handlers = {\n resize: function resize() {\n var options = this.options,\n container = this.container,\n containerData = this.containerData;\n var minContainerWidth = Number(options.minContainerWidth) || MIN_CONTAINER_WIDTH;\n var minContainerHeight = Number(options.minContainerHeight) || MIN_CONTAINER_HEIGHT;\n\n if (this.disabled || containerData.width <= minContainerWidth || containerData.height <= minContainerHeight) {\n return;\n }\n\n var ratio = container.offsetWidth / containerData.width; // Resize when width changed or height changed\n\n if (ratio !== 1 || container.offsetHeight !== containerData.height) {\n var canvasData;\n var cropBoxData;\n\n if (options.restore) {\n canvasData = this.getCanvasData();\n cropBoxData = this.getCropBoxData();\n }\n\n this.render();\n\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\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\n var ratio = Number(this.options.wheelZoomRatio) || 0.1;\n var delta = 1;\n\n if (this.disabled) {\n return;\n }\n\n event.preventDefault(); // Limit wheel speed to prevent zoom too fast (#21)\n\n if (this.wheeling) {\n return;\n }\n\n this.wheeling = true;\n setTimeout(function () {\n _this.wheeling = false;\n }, 50);\n\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\n this.zoom(-delta * ratio, event);\n },\n cropStart: function cropStart(event) {\n var buttons = event.buttons,\n button = event.button;\n\n if (this.disabled // No primary button (Usually the left button)\n // Note that touch events have no `buttons` or `button` property\n || isNumber(buttons) && buttons !== 1 || isNumber(button) && button !== 0 // Open context menu\n || event.ctrlKey) {\n return;\n }\n\n var options = this.options,\n pointers = this.pointers;\n var action;\n\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\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\n if (!REGEXP_ACTIONS.test(action)) {\n return;\n }\n\n if (dispatchEvent(this.element, EVENT_CROP_START, {\n originalEvent: event,\n action: action\n }) === false) {\n return;\n } // This line is required for preventing page zooming in iOS browsers\n\n\n event.preventDefault();\n this.action = action;\n this.cropping = false;\n\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\n if (this.disabled || !action) {\n return;\n }\n\n var pointers = this.pointers;\n event.preventDefault();\n\n if (dispatchEvent(this.element, EVENT_CROP_MOVE, {\n originalEvent: event,\n action: action\n }) === false) {\n return;\n }\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\n this.change(event);\n },\n cropEnd: function cropEnd(event) {\n if (this.disabled) {\n return;\n }\n\n var action = this.action,\n pointers = this.pointers;\n\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\n if (!action) {\n return;\n }\n\n event.preventDefault();\n\n if (!Object.keys(pointers).length) {\n this.action = '';\n }\n\n if (this.cropping) {\n this.cropping = false;\n toggleClass(this.dragBox, CLASS_MODAL, this.cropped && this.options.modal);\n }\n\n dispatchEvent(this.element, EVENT_CROP_END, {\n originalEvent: event,\n action: action\n });\n }\n };\n\n var 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; // Locking aspect ratio in \"free mode\" by holding shift key\n\n if (!aspectRatio && event.shiftKey) {\n aspectRatio = width && height ? width / height : 1;\n }\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\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\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\n break;\n\n case ACTION_WEST:\n if (left + range.x < minLeft) {\n range.x = minLeft - left;\n }\n\n break;\n\n case ACTION_NORTH:\n if (top + range.y < minTop) {\n range.y = minTop - top;\n }\n\n break;\n\n case ACTION_SOUTH:\n if (bottom + range.y > maxHeight) {\n range.y = maxHeight - bottom;\n }\n\n break;\n\n default:\n }\n };\n\n switch (action) {\n // Move crop box\n case ACTION_ALL:\n left += range.x;\n top += range.y;\n break;\n // Resize crop box\n\n case ACTION_EAST:\n if (range.x >= 0 && (right >= maxWidth || aspectRatio && (top <= minTop || bottom >= maxHeight))) {\n renderable = false;\n break;\n }\n\n check(ACTION_EAST);\n width += range.x;\n\n if (width < 0) {\n action = ACTION_WEST;\n width = -width;\n left -= width;\n }\n\n if (aspectRatio) {\n height = width / aspectRatio;\n top += (cropBoxData.height - height) / 2;\n }\n\n break;\n\n case ACTION_NORTH:\n if (range.y <= 0 && (top <= minTop || aspectRatio && (left <= minLeft || right >= maxWidth))) {\n renderable = false;\n break;\n }\n\n check(ACTION_NORTH);\n height -= range.y;\n top += range.y;\n\n if (height < 0) {\n action = ACTION_SOUTH;\n height = -height;\n top -= height;\n }\n\n if (aspectRatio) {\n width = height * aspectRatio;\n left += (cropBoxData.width - width) / 2;\n }\n\n break;\n\n case ACTION_WEST:\n if (range.x <= 0 && (left <= minLeft || aspectRatio && (top <= minTop || bottom >= maxHeight))) {\n renderable = false;\n break;\n }\n\n check(ACTION_WEST);\n width -= range.x;\n left += range.x;\n\n if (width < 0) {\n action = ACTION_EAST;\n width = -width;\n left -= width;\n }\n\n if (aspectRatio) {\n height = width / aspectRatio;\n top += (cropBoxData.height - height) / 2;\n }\n\n break;\n\n case ACTION_SOUTH:\n if (range.y >= 0 && (bottom >= maxHeight || aspectRatio && (left <= minLeft || right >= maxWidth))) {\n renderable = false;\n break;\n }\n\n check(ACTION_SOUTH);\n height += range.y;\n\n if (height < 0) {\n action = ACTION_NORTH;\n height = -height;\n top -= height;\n }\n\n if (aspectRatio) {\n width = height * aspectRatio;\n left += (cropBoxData.width - width) / 2;\n }\n\n break;\n\n case ACTION_NORTH_EAST:\n if (aspectRatio) {\n if (range.y <= 0 && (top <= minTop || right >= maxWidth)) {\n renderable = false;\n break;\n }\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\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\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\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\n break;\n\n case ACTION_NORTH_WEST:\n if (aspectRatio) {\n if (range.y <= 0 && (top <= minTop || left <= minLeft)) {\n renderable = false;\n break;\n }\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\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\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\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\n break;\n\n case ACTION_SOUTH_WEST:\n if (aspectRatio) {\n if (range.x <= 0 && (left <= minLeft || bottom >= maxHeight)) {\n renderable = false;\n break;\n }\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\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\n if (range.y >= 0) {\n if (bottom < maxHeight) {\n height += range.y;\n }\n } else {\n height += range.y;\n }\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\n break;\n\n case ACTION_SOUTH_EAST:\n if (aspectRatio) {\n if (range.x >= 0 && (right >= maxWidth || bottom >= maxHeight)) {\n renderable = false;\n break;\n }\n\n check(ACTION_EAST);\n width += range.x;\n height = width / aspectRatio;\n } else {\n check(ACTION_SOUTH);\n check(ACTION_EAST);\n\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\n if (range.y >= 0) {\n if (bottom < maxHeight) {\n height += range.y;\n }\n } else {\n height += range.y;\n }\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\n break;\n // Move canvas\n\n case ACTION_MOVE:\n this.move(range.x, range.y);\n renderable = false;\n break;\n // Zoom canvas\n\n case ACTION_ZOOM:\n this.zoom(getMaxZoomRatio(pointers), event);\n renderable = false;\n break;\n // Create crop box\n\n case ACTION_CROP:\n if (!range.x || !range.y) {\n renderable = false;\n break;\n }\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\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\n if (range.y < 0) {\n top -= height;\n } // Show the crop box if is hidden\n\n\n if (!this.cropped) {\n removeClass(this.cropBox, CLASS_HIDDEN);\n this.cropped = true;\n\n if (this.limited) {\n this.limitCropBox(true, true);\n }\n }\n\n break;\n\n default:\n }\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 } // Override\n\n\n forEach(pointers, function (p) {\n p.startX = p.endX;\n p.startY = p.endY;\n });\n }\n };\n\n var 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\n if (this.options.modal) {\n addClass(this.dragBox, CLASS_MODAL);\n }\n\n removeClass(this.cropBox, CLASS_HIDDEN);\n this.setCropBoxData(this.initialCropBoxData);\n }\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\n if (this.cropped) {\n this.renderCropBox();\n }\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); // Render canvas after crop box rendered\n\n this.renderCanvas();\n removeClass(this.dragBox, CLASS_MODAL);\n addClass(this.cropBox, CLASS_HIDDEN);\n }\n\n return this;\n },\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\n if (!this.disabled && url) {\n if (this.isImg) {\n this.element.src = url;\n }\n\n if (hasSameSize) {\n this.url = url;\n this.image.src = url;\n\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\n this.options.data = null;\n this.uncreate();\n this.load(url);\n }\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\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\n return this;\n },\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\n if (!element[NAMESPACE]) {\n return this;\n }\n\n element[NAMESPACE] = undefined;\n\n if (this.isImg && this.replaced) {\n element.src = this.originalUrl;\n }\n\n this.uncreate();\n return this;\n },\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 /**\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\n if (this.ready && !this.disabled && this.options.movable) {\n if (isNumber(x)) {\n canvasData.left = x;\n changed = true;\n }\n\n if (isNumber(y)) {\n canvasData.top = y;\n changed = true;\n }\n\n if (changed) {\n this.renderCanvas(true);\n }\n }\n\n return this;\n },\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\n if (ratio < 0) {\n ratio = 1 / (1 - ratio);\n } else {\n ratio = 1 + ratio;\n }\n\n return this.zoomTo(canvasData.width * ratio / canvasData.naturalWidth, null, _originalEvent);\n },\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\n if (ratio >= 0 && this.ready && !this.disabled && options.zoomable) {\n var newWidth = naturalWidth * ratio;\n var newHeight = naturalHeight * ratio;\n\n if (dispatchEvent(this.element, EVENT_ZOOM, {\n ratio: ratio,\n oldRatio: width / naturalWidth,\n originalEvent: _originalEvent\n }) === false) {\n return this;\n }\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 }; // Zoom from the triggering point of the event\n\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\n canvasData.width = newWidth;\n canvasData.height = newHeight;\n this.renderCanvas(true);\n }\n\n return this;\n },\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 /**\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\n if (isNumber(degree) && this.ready && !this.disabled && this.options.rotatable) {\n this.imageData.rotate = degree % 360;\n this.renderCanvas(true, true);\n }\n\n return this;\n },\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 /**\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 /**\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\n if (this.ready && !this.disabled && this.options.scalable) {\n if (isNumber(scaleX)) {\n imageData.scaleX = scaleX;\n transformed = true;\n }\n\n if (isNumber(scaleY)) {\n imageData.scaleY = scaleY;\n transformed = true;\n }\n\n if (transformed) {\n this.renderCanvas(true, true);\n }\n }\n\n return this;\n },\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\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\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\n if (options.rotatable) {\n data.rotate = imageData.rotate || 0;\n }\n\n if (options.scalable) {\n data.scaleX = imageData.scaleX || 1;\n data.scaleY = imageData.scaleY || 1;\n }\n\n return data;\n },\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\n if (this.ready && !this.disabled && isPlainObject(data)) {\n var transformed = false;\n\n if (options.rotatable) {\n if (isNumber(data.rotate) && data.rotate !== imageData.rotate) {\n imageData.rotate = data.rotate;\n transformed = true;\n }\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\n if (isNumber(data.scaleY) && data.scaleY !== imageData.scaleY) {\n imageData.scaleY = data.scaleY;\n transformed = true;\n }\n }\n\n if (transformed) {\n this.renderCanvas(true, true);\n }\n\n var ratio = imageData.width / imageData.naturalWidth;\n\n if (isNumber(data.x)) {\n cropBoxData.left = data.x * ratio + canvasData.left;\n }\n\n if (isNumber(data.y)) {\n cropBoxData.top = data.y * ratio + canvasData.top;\n }\n\n if (isNumber(data.width)) {\n cropBoxData.width = data.width * ratio;\n }\n\n if (isNumber(data.height)) {\n cropBoxData.height = data.height * ratio;\n }\n\n this.setCropBoxData(cropBoxData);\n }\n\n return this;\n },\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 /**\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 /**\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\n if (this.ready) {\n forEach(['left', 'top', 'width', 'height', 'naturalWidth', 'naturalHeight'], function (n) {\n data[n] = canvasData[n];\n });\n }\n\n return data;\n },\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\n if (this.ready && !this.disabled && isPlainObject(data)) {\n if (isNumber(data.left)) {\n canvasData.left = data.left;\n }\n\n if (isNumber(data.top)) {\n canvasData.top = data.top;\n }\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\n this.renderCanvas(true);\n }\n\n return this;\n },\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\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\n return data || {};\n },\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\n if (this.ready && this.cropped && !this.disabled && isPlainObject(data)) {\n if (isNumber(data.left)) {\n cropBoxData.left = data.left;\n }\n\n if (isNumber(data.top)) {\n cropBoxData.top = data.top;\n }\n\n if (isNumber(data.width) && data.width !== cropBoxData.width) {\n widthChanged = true;\n cropBoxData.width = data.width;\n }\n\n if (isNumber(data.height) && data.height !== cropBoxData.height) {\n heightChanged = true;\n cropBoxData.height = data.height;\n }\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\n this.renderCropBox();\n }\n\n return this;\n },\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\n if (!this.ready || !window.HTMLCanvasElement) {\n return null;\n }\n\n var canvasData = this.canvasData;\n var source = getSourceCanvas(this.image, this.imageData, canvasData, options); // Returns the source canvas if it is not cropped.\n\n if (!this.cropped) {\n return source;\n }\n\n var _this$getData = this.getData(),\n initialX = _this$getData.x,\n initialY = _this$getData.y,\n initialWidth = _this$getData.width,\n initialHeight = _this$getData.height;\n\n var ratio = source.width / Math.floor(canvasData.naturalWidth);\n\n if (ratio !== 1) {\n initialX *= ratio;\n initialY *= ratio;\n initialWidth *= ratio;\n initialHeight *= ratio;\n }\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\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\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\n if (imageSmoothingQuality) {\n context.imageSmoothingQuality = imageSmoothingQuality;\n } // https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D.drawImage\n\n\n var sourceWidth = source.width;\n var sourceHeight = source.height; // Source canvas parameters\n\n var srcX = initialX;\n var srcY = initialY;\n var srcWidth;\n var srcHeight; // Destination canvas parameters\n\n var dstX;\n var dstY;\n var dstWidth;\n var dstHeight;\n\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\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\n var params = [srcX, srcY, srcWidth, srcHeight]; // Avoid \"IndexSizeError\"\n\n if (dstWidth > 0 && dstHeight > 0) {\n var scale = width / initialWidth;\n params.push(dstX * scale, dstY * scale, dstWidth * scale, dstHeight * scale);\n } // All the numerical parameters should be integer for `drawImage`\n // https://github.com/fengyuanchen/cropper/issues/476\n\n\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 /**\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\n if (!this.disabled && !isUndefined(aspectRatio)) {\n // 0 -> NaN\n options.aspectRatio = Math.max(0, aspectRatio) || NaN;\n\n if (this.ready) {\n this.initCropBox();\n\n if (this.cropped) {\n this.renderCropBox();\n }\n }\n }\n\n return this;\n },\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\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\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\n return this;\n }\n };\n\n var AnotherCropper = WINDOW.Cropper;\n\n var Cropper =\n /*#__PURE__*/\n 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\n _classCallCheck(this, Cropper);\n\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\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\n _createClass(Cropper, [{\n key: \"init\",\n value: function init() {\n var element = this.element;\n var tagName = element.tagName.toLowerCase();\n var url;\n\n if (element[NAMESPACE]) {\n return;\n }\n\n element[NAMESPACE] = this;\n\n if (tagName === 'img') {\n this.isImg = true; // e.g.: \"img/picture.jpg\"\n\n url = element.getAttribute('src') || '';\n this.originalUrl = url; // Stop when it's a blank image\n\n if (!url) {\n return;\n } // e.g.: \"http://example.com/img/picture.jpg\"\n\n\n url = element.src;\n } else if (tagName === 'canvas' && window.HTMLCanvasElement) {\n url = element.toDataURL();\n }\n\n this.load(url);\n }\n }, {\n key: \"load\",\n value: function load(url) {\n var _this = this;\n\n if (!url) {\n return;\n }\n\n this.url = url;\n this.imageData = {};\n var element = this.element,\n options = this.options;\n\n if (!options.rotatable && !options.scalable) {\n options.checkOrientation = false;\n } // Only IE10+ supports Typed Arrays\n\n\n if (!options.checkOrientation || !window.ArrayBuffer) {\n this.clone();\n return;\n } // Read ArrayBuffer from Data URL of JPEG images directly for better performance.\n\n\n if (REGEXP_DATA_URL_JPEG.test(url)) {\n this.read(dataURLToArrayBuffer(url));\n return;\n }\n\n var xhr = new XMLHttpRequest();\n var clone = this.clone.bind(this);\n this.reloading = true;\n this.xhr = xhr; // 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\n xhr.onabort = clone;\n xhr.onerror = clone;\n xhr.ontimeout = clone;\n\n xhr.onprogress = function () {\n if (xhr.getResponseHeader('content-type') !== MIME_TYPE_JPEG) {\n xhr.abort();\n }\n };\n\n xhr.onload = function () {\n _this.read(xhr.response);\n };\n\n xhr.onloadend = function () {\n _this.reloading = false;\n _this.xhr = null;\n }; // Bust cache when there is a \"crossOrigin\" property to avoid browser cache error\n\n\n if (options.checkCrossOrigin && isCrossOriginURL(url) && element.crossOrigin) {\n url = addTimestamp(url);\n }\n\n xhr.open('GET', url);\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; // Reset the orientation value to its default value 1\n // as some iOS browsers will render image with its orientation\n\n var orientation = resetAndGetOrientation(arrayBuffer);\n var rotate = 0;\n var scaleX = 1;\n var scaleY = 1;\n\n if (orientation > 1) {\n // Generate a new URL which has the default orientation value\n this.url = arrayBufferToDataURL(arrayBuffer, MIME_TYPE_JPEG);\n\n var _parseOrientation = parseOrientation(orientation);\n\n rotate = _parseOrientation.rotate;\n scaleX = _parseOrientation.scaleX;\n scaleY = _parseOrientation.scaleY;\n }\n\n if (options.rotatable) {\n imageData.rotate = rotate;\n }\n\n if (options.scalable) {\n imageData.scaleX = scaleX;\n imageData.scaleY = scaleY;\n }\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;\n var crossOriginUrl;\n\n if (this.options.checkCrossOrigin && isCrossOriginURL(url)) {\n crossOrigin = element.crossOrigin;\n\n if (crossOrigin) {\n crossOriginUrl = url;\n } else {\n crossOrigin = 'anonymous'; // Bust cache when there is not a \"crossOrigin\" property\n\n crossOriginUrl = addTimestamp(url);\n }\n }\n\n this.crossOrigin = crossOrigin;\n this.crossOriginUrl = crossOriginUrl;\n var image = document.createElement('img');\n\n if (crossOrigin) {\n image.crossOrigin = crossOrigin;\n }\n\n image.src = crossOriginUrl || url;\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\n var image = this.isImg ? this.element : this.image;\n image.onload = null;\n image.onerror = null;\n this.sizing = true;\n var IS_SAFARI = WINDOW.navigator && /^(?:.(?!chrome|android))*safari/i.test(WINDOW.navigator.userAgent);\n\n var done = function done(naturalWidth, naturalHeight) {\n assign(_this2.imageData, {\n naturalWidth: naturalWidth,\n naturalHeight: naturalHeight,\n aspectRatio: naturalWidth / naturalHeight\n });\n _this2.sizing = false;\n _this2.sized = true;\n\n _this2.build();\n }; // Modern browsers (except Safari)\n\n\n if (image.naturalWidth && !IS_SAFARI) {\n done(image.naturalWidth, image.naturalHeight);\n return;\n }\n\n var sizingImage = document.createElement('img');\n var body = document.body || document.documentElement;\n this.sizingImage = sizingImage;\n\n sizingImage.onload = function () {\n done(sizingImage.width, sizingImage.height);\n\n if (!IS_SAFARI) {\n body.removeChild(sizingImage);\n }\n };\n\n sizingImage.src = image.src; // iOS Safari will convert the image automatically\n // with its orientation once append it into DOM (#279)\n\n if (!IS_SAFARI) {\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\n var element = this.element,\n options = this.options,\n image = this.image; // Create cropper elements\n\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); // Hide the original image\n\n addClass(element, CLASS_HIDDEN); // Inserts the cropper after to the current image\n\n container.insertBefore(cropper, element.nextSibling); // Show the image if is hidden\n\n if (!this.isImg) {\n removeClass(image, CLASS_HIDE);\n }\n\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\n if (!options.guides) {\n addClass(cropBox.getElementsByClassName(\"\".concat(NAMESPACE, \"-dashed\")), CLASS_HIDDEN);\n }\n\n if (!options.center) {\n addClass(cropBox.getElementsByClassName(\"\".concat(NAMESPACE, \"-center\")), CLASS_HIDDEN);\n }\n\n if (options.background) {\n addClass(cropper, \"\".concat(NAMESPACE, \"-bg\"));\n }\n\n if (!options.highlight) {\n addClass(face, CLASS_INVISIBLE);\n }\n\n if (options.cropBoxMovable) {\n addClass(face, CLASS_MOVE);\n setData(face, DATA_ACTION, ACTION_ALL);\n }\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\n this.render();\n this.ready = true;\n this.setDragMode(options.dragMode);\n\n if (options.autoCrop) {\n this.crop();\n }\n\n this.setData(options.data);\n\n if (isFunction(options.ready)) {\n addListener(element, EVENT_READY, options.ready, {\n once: true\n });\n }\n\n dispatchEvent(element, EVENT_READY);\n }\n }, {\n key: \"unbuild\",\n value: function unbuild() {\n if (!this.ready) {\n return;\n }\n\n this.ready = false;\n this.unbind();\n this.resetPreview();\n this.cropper.parentNode.removeChild(this.cropper);\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 * Get the no conflict cropper class.\n * @returns {Cropper} The cropper class.\n */\n\n }], [{\n key: \"noConflict\",\n value: function noConflict() {\n window.Cropper = AnotherCropper;\n return Cropper;\n }\n /**\n * Change the default options.\n * @param {Object} options - The new default options.\n */\n\n }, {\n key: \"setDefaults\",\n value: function setDefaults(options) {\n assign(DEFAULTS, isPlainObject(options) && options);\n }\n }]);\n\n return Cropper;\n }();\n\n assign(Cropper.prototype, render, preview, events, handlers, change, methods);\n\n return Cropper;\n\n}));\n","function webpackEmptyContext(req) {\n\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\te.code = 'MODULE_NOT_FOUND';\n\tthrow e;\n}\nwebpackEmptyContext.keys = function() { return []; };\nwebpackEmptyContext.resolve = webpackEmptyContext;\nmodule.exports = webpackEmptyContext;\nwebpackEmptyContext.id = \"./node_modules/font-awesome sync \\\\.(otf|eot|svg|ttf|woff|woff2)$\";","/**\n * Add your global events here\n */\n\nmodule.exports = {\n AJAX: 'ajax-load',\n LOADED: 'load',\n SET_TARGET_UPDATE: 'set-target-update',\n RESTORE_FIELD: 'restore-field',\n FORM_INIT_BASICS: 'form-basics',\n FORM_INIT_STEPPED: 'form-init-stepped',\n FORM_INIT_VALIDATE: 'form-init-validate',\n FORM_INIT_VALIDATE_FIELD: 'form-init-validate-field',\n FORM_INIT_STORAGE: 'form-init-storage',\n FORM_VALIDATION_FAILED: 'form-validation-failed',\n FORM_STEPPED_NEW_STEP: 'form-new-step',\n FORM_STEPPED_FIRST_STEP: 'form-first-step',\n FORM_STEPPED_LAST_STEP: 'form-last-step',\n};\n","import $ from 'jquery';\n\nconst SpinnerUI = (($) => {\n class SpinnerUI {\n static show(callback) {\n $('#PageLoading').show(0, callback);\n }\n\n static hide(callback) {\n $('#PageLoading').hide('slow', callback);\n }\n }\n\n return SpinnerUI;\n})($);\n\nexport default SpinnerUI;\n","\"use strict\";\n\nimport $ from 'jquery';\n\nimport Events from './_events';\nimport SpinnerUI from './_ui.spinner';\n\nimport Cropper from 'cropperjs/dist/cropper.js'; //'cropperjs/src/index.js';\n\nconst CroppieUI = (($) => {\n\n const NAME = 'jsCroppieUI';\n const DATA_KEY = NAME;\n\n const G = window;\n const D = document;\n const DEFAULTS = {\n aspectRatio: 16 / 9,\n };\n\n class CroppieUI {\n\n constructor(element) {\n console.log(`Initializing: ${NAME}`);\n\n const ui = this;\n\n ui._element = element;\n\n ui.$el = $(ui._element);\n ui.$form = ui.$el.parents('form');\n ui.$input = ui.$el.find('input[type=\"file\"]');\n\n ui.$el.prepend('\"\"');\n ui.$image = ui.$el.find('img.cropping-image');\n ui.original_image = ui.$image[0];\n ui.mask_img = false;\n\n ui.name = ui.$input.attr('name');\n ui.width = ui.$input.data('width');\n ui.height = ui.$input.data('height');\n\n ui.options = DEFAULTS;\n ui.cropper = false;\n\n ui.$el.data(DATA_KEY, ui);\n\n ui.$el.prepend('
');\n ui.$removeBtns = ui.$el.find('.remove-masks');\n ui.masks = [];\n\n ui.$input.on('change', (e) => {\n const files = e.currentTarget.files;\n\n if (files && files.length) {\n ui.loadFile(files[0]);\n }\n });\n\n // actions\n ui.$el.append('Обрезать');\n\n // crop\n ui.$el.find('.act-crop').on('click', (e) => {\n if (!ui.cropper) {\n return true;\n }\n\n e.preventDefault();\n\n const canvas = ui.cropper.getCroppedCanvas({\n width: ui.width,\n height: ui.height,\n });\n\n ui.$image[0].src = canvas.toDataURL();\n\n ui.original_image = new Image();\n ui.original_image.src = canvas.toDataURL();\n\n ui.cropper.destroy();\n ui.cropper = false;\n\n ui.$el.removeClass(`${NAME}-cropping`);\n ui.$el.addClass(`${NAME}-cropped`);\n });\n\n // mask\n ui.$el.find('.masks .mask-item').on('click', (e) => {\n e.preventDefault();\n ui.setMask($(e.currentTarget));\n });\n\n // submit\n ui.$form.on('submit', (e) => {\n if (!ui.cropper) {\n return true;\n }\n\n SpinnerUI.show();\n\n ui.saveImage();\n\n const canvas = ui.cropper.getCroppedCanvas({\n width: ui.width,\n height: ui.height,\n });\n\n ui.$image[0].src = canvas.toDataURL();\n canvas.toBlob((blob) => {\n ui.uploadFile(blob);\n });\n\n e.preventDefault();\n });\n }\n\n setMask = ($el) => {\n const ui = this;\n\n // add current mask\n if (ui.mask_img) {\n ui.addMask(ui.getMask());\n }\n\n // update image storage\n if (ui.cropper) {\n ui.cropper.destroy();\n ui.cropper = false;\n\n ui.saveImage();\n }\n\n // add new image\n ui.mask_img = new Image();\n ui.mask_img.src = $el.data('src');\n\n ui.mask_img.onload = () => {\n const img = ui.mask_img;\n\n ui.cropper = new Cropper(ui.$image[0], {\n aspectRatio: img.width / img.height,\n viewMode: 0,\n guides: true,\n center: true,\n highlight: true,\n cropBoxMovable: true,\n cropBoxResizable: true,\n movable: false,\n rotatable: false,\n zoomable: false,\n ready: () => {\n ui.$el.find('.cropper-face').css({\n 'background-color': 'transparent',\n 'background-image': `url(${ui.mask_img.src})`,\n 'opacity': '0.8',\n });\n ui.$el.find('.cropper-face').data('current-mask', $el);\n }\n });\n };\n }\n\n // returns mask ID\n addMask = (mask) => {\n const ui = this;\n const id = Date.now();\n\n ui.masks[id] = mask;\n\n // draw removable button\n let $btn = $('Удалить #' + id + '');\n ui.$el.find('.masks').append($btn);\n\n /*ui.$removeBtns.prepend($btn);\n $btn = ui.$removeBtns.find('[data-id=\"' + id + '\"]');\n\n $btn.css({\n left: 100 * mask.left / ui.width + '%',\n top: 100 * mask.top / ui.width + '%',\n width: 100 * mask.width / ui.width + '%',\n height: 100 * mask.height / ui.height + '%',\n });*/\n $btn.on('click', (e) => {\n e.preventDefault();\n\n const $btn = $(e.currentTarget);\n const id = $btn.data('id');\n\n ui.removeMask(id);\n });\n return id;\n }\n\n removeMask = (id) => {\n const ui = this;\n delete ui.masks[id];\n ui.$el.find('.masks [data-id=\"' + id + '\"]').remove();\n\n ui.mask_img = false;\n ui.$el.find('.cropper-face').data('current-mask').click();\n }\n\n getMask = () => {\n const ui = this,\n canvas = document.createElement('canvas'),\n context = canvas.getContext('2d'),\n cropper = ui.cropper,\n maskWidth = cropper.getData().width,\n maskHeight = cropper.getData().height,\n maskTop = cropper.getData().y,\n maskLeft = cropper.getData().x,\n imageLeft = cropper.getImageData().left,\n imageTop = cropper.getImageData().top,\n imageAspect = cropper.getImageData().aspectRatio;\n\n canvas.width = ui.width;\n canvas.height = ui.height;\n context.imageSmoothingEnabled = true;\n\n return {\n img: ui.mask_img,\n left: maskLeft,\n top: maskTop,\n width: maskWidth,\n height: maskHeight\n };\n }\n\n saveImage = () => {\n const ui = this,\n canvas = document.createElement('canvas'),\n context = canvas.getContext('2d');\n\n canvas.width = ui.width;\n canvas.height = ui.height;\n context.imageSmoothingEnabled = true;\n\n context.drawImage(ui.original_image, 0, 0, ui.width, ui.height);\n\n for (let id in ui.masks) {\n const mask = ui.masks[id];\n console.log(mask);\n context.drawImage(mask.img, mask.left, mask.top, mask.width, mask.height);\n }\n\n ui.$image[0].src = canvas.toDataURL();\n\n return canvas;\n };\n\n loadFile = (file) => {\n const ui = this;\n\n if (/^image\\/\\w+/.test(file.type)) {\n\n ui.$image[0].src = URL.createObjectURL(file);\n\n if (ui.cropper) {\n ui.cropper.destroy();\n }\n\n ui.cropper = new Cropper(ui.$image[0], ui.options);\n ui.$input[0].value = null;\n\n ui.$el.addClass(`${NAME}-cropping`);\n } else {\n window.alert('Please choose an image file.');\n }\n };\n\n uploadFile = (blob) => {\n console.log('Initializing uploading sequence!');\n\n const ui = this;\n const data = new FormData(ui.$form[0]);\n\n data.delete('BackURL');\n data.delete(ui.name);\n data.append(ui.name, blob, ui.name + '-image.png');\n data.append('ajax', '1');\n\n $.ajax({\n url: ui.$form.attr('action'),\n data: data,\n processData: false,\n contentType: false,\n type: ui.$form.attr('method'),\n success: (data) => {\n console.log('UPLOAD SUCCESS!');\n\n SpinnerUI.hide();\n $(G).trigger(Events.AJAX);\n }\n });\n };\n\n static dispose() {\n console.log(`Destroying: ${NAME}`);\n }\n\n static _jQueryInterface() {\n return this.each((i, el) => {\n // attach functionality to element\n const $el = $(el);\n let data = $el.data(DATA_KEY);\n\n if (!data) {\n data = new CroppieUI(el);\n $el.data(DATA_KEY, data);\n }\n });\n }\n }\n\n // jQuery interface\n $.fn[NAME] = CroppieUI._jQueryInterface;\n $.fn[NAME].Constructor = CroppieUI;\n $.fn[NAME].noConflict = () => {\n $.fn[NAME] = JQUERY_NO_CONFLICT;\n return CroppieUI._jQueryInterface;\n };\n\n // auto-apply\n $(window).on(`${Events.AJAX} ${Events.LOADED}`, () => {\n $('.field.croppie').jsCroppieUI();\n });\n\n return CroppieUI;\n})($);\n\nexport default CroppieUI;\n","import 'app.scss';\nimport Events from './_events';\nimport Croppie from './_ui.form.croppie';\n\nfunction importAll(r) {\n return r.keys().map(r);\n}\n\nconst images = importAll(require.context('./img/', false, /\\.(png|jpe?g|svg)$/));\nconst fontAwesome = importAll(require.context('font-awesome', false, /\\.(otf|eot|svg|ttf|woff|woff2)$/));\n\nconst LayoutUI = (($) => {\n // Constants\n const W = window;\n const D = document;\n const $Body = $('body');\n\n const NAME = 'LayoutUI';\n\n class LayoutUI {\n static init() {\n const ui = this;\n ui.dispose();\n\n console.log(`Initializing: ${NAME}`);\n }\n\n static dispose() {\n console.log(`Destroying: ${NAME}`);\n }\n }\n\n $(W).on(`${Events.AJAX} ${Events.LOADED}`, () => {\n LayoutUI.init();\n });\n\n W.LayoutUI = LayoutUI;\n\n return LayoutUI;\n})($);\n\nexport default LayoutUI;\n","var map = {\n\t\"./bg.png\": \"./src/img/bg.png\",\n\t\"./photo1.png\": \"./src/img/photo1.png\",\n\t\"./photo2.jpg\": \"./src/img/photo2.jpg\",\n\t\"./photo3.svg\": \"./src/img/photo3.svg\"\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = \"./src/img sync \\\\.(png|jpe?g|svg)$\";","module.exports = \"../img/bg.png\";","module.exports = \"../img/photo1.png\";","module.exports = \"../img/photo2.jpg\";","module.exports = \"../fonts/photo3.svg\";","module.exports = jQuery;"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./node_modules/cropperjs/dist/cropper.js","webpack:///./node_modules/font-awesome sync nonrecursive \\.(otf|eot|svg|ttf|woff|woff2)$","webpack:///./src/_events.js","webpack:///./src/_ui.spinner.js","webpack:///./src/_ui.form.croppie.js","webpack:///./src/app.js","webpack:///./src/img sync nonrecursive \\.(png|jpe","webpack:///./src/img/bg.png","webpack:///./src/img/photo1.png","webpack:///./src/img/photo2.jpg","webpack:///./src/img/photo3.svg","webpack:///external \"jQuery\""],"names":["installedModules","__webpack_require__","moduleId","exports","module","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","_typeof","obj","iterator","constructor","_defineProperties","target","props","length","descriptor","configurable","writable","_toConsumableArray","arr","Array","isArray","arr2","_arrayWithoutHoles","iter","toString","from","_iterableToArray","TypeError","_nonIterableSpread","IS_BROWSER","window","WINDOW","IS_TOUCH_DEVICE","document","documentElement","HAS_POINTER_EVENT","CLASS_CROP","concat","CLASS_DISABLED","CLASS_HIDDEN","CLASS_HIDE","CLASS_INVISIBLE","CLASS_MODAL","CLASS_MOVE","DATA_ACTION","DATA_PREVIEW","EVENT_TOUCH_START","EVENT_TOUCH_MOVE","EVENT_TOUCH_END","EVENT_POINTER_DOWN","EVENT_POINTER_MOVE","EVENT_POINTER_UP","REGEXP_ACTIONS","REGEXP_DATA_URL_JPEG","REGEXP_TAG_NAME","DEFAULTS","viewMode","dragMode","initialAspectRatio","NaN","aspectRatio","data","preview","responsive","restore","checkCrossOrigin","checkOrientation","modal","guides","center","highlight","background","autoCrop","autoCropArea","movable","rotatable","scalable","zoomable","zoomOnTouch","zoomOnWheel","wheelZoomRatio","cropBoxMovable","cropBoxResizable","toggleDragModeOnDblclick","minCanvasWidth","minCanvasHeight","minCropBoxWidth","minCropBoxHeight","minContainerWidth","minContainerHeight","ready","cropstart","cropmove","cropend","crop","zoom","isNaN","Number","isNumber","isPositiveNumber","Infinity","isUndefined","isObject","isPlainObject","_constructor","error","isFunction","slice","toArray","forEach","callback","keys","assign","_len","arguments","args","_key","arg","REGEXP_DECIMALS","normalizeDecimalNumber","times","undefined","test","Math","round","REGEXP_SUFFIX","setStyle","element","styles","style","addClass","elem","classList","add","className","trim","indexOf","removeClass","remove","replace","toggleClass","added","REGEXP_CAMEL_CASE","toParamCase","toLowerCase","getData","dataset","getAttribute","setData","setAttribute","REGEXP_SPACES","onceSupported","supported","once","listener","options","set","addEventListener","removeEventListener","removeListener","type","handler","split","event","listeners","addListener","_handler","_element$listeners","_len2","_key2","apply","dispatchEvent","Event","CustomEvent","detail","bubbles","cancelable","createEvent","initCustomEvent","getOffset","box","getBoundingClientRect","left","pageXOffset","clientLeft","top","pageYOffset","clientTop","location","REGEXP_ORIGINS","isCrossOriginURL","url","parts","match","protocol","hostname","port","addTimestamp","timestamp","Date","getTime","getTransforms","_ref","rotate","scaleX","scaleY","translateX","translateY","values","push","transform","join","WebkitTransform","msTransform","getPointer","_ref2","endOnly","pageX","pageY","end","endX","endY","startX","startY","getAdjustedSizes","_ref4","height","width","isValidWidth","isValidHeight","adjustedWidth","fromCharCode","String","REGEXP_DATA_URL_HEAD","resetAndGetOrientation","arrayBuffer","orientation","dataView","DataView","littleEndian","app1Start","ifdStart","getUint8","byteLength","offset","exifIDCode","tiffOffset","start","str","getStringFromCharCode","endianness","getUint16","firstIFDOffset","getUint32","_offset","_length","setUint16","render","this","initContainer","initCanvas","initCropBox","renderCanvas","cropped","renderCropBox","container","cropper","containerData","max","offsetWidth","offsetHeight","imageData","rotated","abs","naturalWidth","naturalHeight","canvasWidth","canvasHeight","canvasData","oldLeft","oldTop","limited","limitCanvas","initialImageData","initialCanvasData","sizeLimited","positionLimited","cropBoxData","_getAdjustedSizes","minWidth","minHeight","maxWidth","maxHeight","newCanvasLeft","newCanvasTop","minLeft","min","minTop","maxLeft","maxTop","changed","transformed","_getRotatedSizes","_ref5","degree","arc","PI","sinArc","sin","cosArc","cos","newWidth","newHeight","getRotatedSizes","canvas","renderImage","limitCropBox","image","output","initialCropBoxData","maxCropBoxWidth","maxCropBoxHeight","face","cropBox","disabled","initPreview","crossOrigin","crossOriginUrl","createElement","src","viewBox","appendChild","viewBoxImage","previews","ownerDocument","querySelectorAll","querySelector","el","img","html","innerHTML","cssText","resetPreview","removeAttribute","removeData","cropBoxWidth","cropBoxHeight","originalWidth","originalHeight","ratio","getElementsByTagName","events","onCropStart","cropStart","onWheel","wheel","passive","capture","onDblclick","dblclick","onCropMove","cropMove","onCropEnd","cropEnd","onResize","resize","unbind","handlers","getCanvasData","getCropBoxData","setCanvasData","setCropBoxData","setDragMode","dragBox","contains","_this","delta","preventDefault","wheeling","setTimeout","deltaY","wheelDelta","buttons","button","ctrlKey","action","pointers","changedTouches","touch","identifier","pointerId","originalEvent","cropping","change","right","bottom","renderable","shiftKey","pointer","range","x","y","check","side","move","pointers2","ratios","pointer2","x1","y1","x2","y2","z1","sqrt","sort","a","b","getMaxZoomRatio","methods","reset","clear","hasSameSize","isImg","replaced","uncreate","load","enable","disable","destroy","originalUrl","offsetX","offsetY","_this$canvasData","moveTo","_originalEvent","zoomTo","pivot","oldRatio","count","_ref3","getPointersCenter","rotateTo","_scaleX","scale","_scaleY","rounded","getContainerData","getImageData","sized","widthChanged","heightChanged","getCroppedCanvas","HTMLCanvasElement","source","_ref6","_ref7","_ref8","imageAspectRatio","imageNaturalWidth","imageNaturalHeight","_ref6$rotate","_ref6$scaleX","_ref6$scaleY","_ref8$fillColor","fillColor","_ref8$imageSmoothingE","imageSmoothingEnabled","_ref8$imageSmoothingQ","imageSmoothingQuality","_ref8$maxWidth","_ref8$maxHeight","_ref8$minWidth","_ref8$minHeight","context","getContext","maxSizes","minSizes","destMaxSizes","destMinSizes","destWidth","destHeight","params","fillStyle","fillRect","save","translate","drawImage","map","param","floor","getSourceCanvas","_this$getData","initialX","initialY","initialWidth","initialHeight","_options$imageSmoothi","srcWidth","srcHeight","dstX","dstY","dstWidth","dstHeight","sourceWidth","sourceHeight","srcX","srcY","setAspectRatio","croppable","AnotherCropper","Cropper","instance","Constructor","_classCallCheck","tagName","Error","reloading","sizing","init","staticProps","protoProps","toDataURL","ArrayBuffer","read","base64","binary","atob","uint8","Uint8Array","charCodeAt","xhr","XMLHttpRequest","clone","onabort","onerror","ontimeout","onprogress","getResponseHeader","abort","onload","response","onloadend","open","responseType","withCredentials","send","mimeType","chunks","subarray","btoa","arrayBufferToDataURL","_parseOrientation","parseOrientation","stop","parentNode","insertBefore","nextSibling","_this2","IS_SAFARI","navigator","userAgent","done","build","sizingImage","body","removeChild","template","getElementsByClassName","unbuild","factory","webpackEmptyContext","req","e","code","resolve","id","AJAX","LOADED","SET_TARGET_UPDATE","RESTORE_FIELD","FORM_INIT_BASICS","FORM_INIT_STEPPED","FORM_INIT_VALIDATE","FORM_INIT_VALIDATE_FIELD","FORM_INIT_STORAGE","FORM_VALIDATION_FAILED","FORM_STEPPED_NEW_STEP","FORM_STEPPED_FIRST_STEP","FORM_STEPPED_LAST_STEP","SpinnerUI","$","_createClass","show","hide","NAME","DATA_KEY","G","CroppieUI","_ui_form_croppie_classCallCheck","_initialiseProps","console","log","ui","_element","$el","$form","parents","$input","find","prepend","$image","original_image","mask_img","attr","$removeBtns","masks","on","files","currentTarget","loadFile","append","Image","setMask","saveImage","toBlob","blob","uploadFile","_ui_form_croppie_createClass","each","addMask","getMask","css","background-color","background-image","opacity","mask","now","$btn","removeMask","click","maskWidth","maskHeight","maskTop","maskLeft","file","URL","createObjectURL","alert","FormData","delete","ajax","processData","contentType","success","trigger","Events","fn","_jQueryInterface","noConflict","JQUERY_NO_CONFLICT","jsCroppieUI","importAll","require","LayoutUI","W","app_classCallCheck","app_createClass","dispose","./bg.png","./photo1.png","./photo2.jpg","./photo3.svg","webpackContext","webpackContextResolve","jQuery"],"mappings":"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","file":"app.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = \"./src/app.js\");\n","/*!\n * Cropper.js v1.5.1\n * https://fengyuanchen.github.io/cropperjs\n *\n * Copyright 2015-present Chen Fengyuan\n * Released under the MIT license\n *\n * Date: 2019-03-10T09:55:53.729Z\n */\n\n(function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n typeof define === 'function' && define.amd ? define(factory) :\n (global = global || self, global.Cropper = factory());\n}(this, function () { 'use strict';\n\n function _typeof(obj) {\n if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n _typeof = function (obj) {\n return typeof obj;\n };\n } else {\n _typeof = function (obj) {\n return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n };\n }\n\n return _typeof(obj);\n }\n\n function _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n }\n\n function _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, descriptor.key, descriptor);\n }\n }\n\n function _createClass(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n return Constructor;\n }\n\n function _toConsumableArray(arr) {\n return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread();\n }\n\n function _arrayWithoutHoles(arr) {\n if (Array.isArray(arr)) {\n for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) arr2[i] = arr[i];\n\n return arr2;\n }\n }\n\n function _iterableToArray(iter) {\n if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === \"[object Arguments]\") return Array.from(iter);\n }\n\n function _nonIterableSpread() {\n throw new TypeError(\"Invalid attempt to spread non-iterable instance\");\n }\n\n var IS_BROWSER = typeof window !== 'undefined';\n var WINDOW = IS_BROWSER ? window : {};\n var IS_TOUCH_DEVICE = IS_BROWSER ? 'ontouchstart' in WINDOW.document.documentElement : false;\n var HAS_POINTER_EVENT = IS_BROWSER ? 'PointerEvent' in WINDOW : false;\n var NAMESPACE = 'cropper'; // Actions\n\n var ACTION_ALL = 'all';\n var ACTION_CROP = 'crop';\n var ACTION_MOVE = 'move';\n var ACTION_ZOOM = 'zoom';\n var ACTION_EAST = 'e';\n var ACTION_WEST = 'w';\n var ACTION_SOUTH = 's';\n var ACTION_NORTH = 'n';\n var ACTION_NORTH_EAST = 'ne';\n var ACTION_NORTH_WEST = 'nw';\n var ACTION_SOUTH_EAST = 'se';\n var ACTION_SOUTH_WEST = 'sw'; // Classes\n\n var CLASS_CROP = \"\".concat(NAMESPACE, \"-crop\");\n var CLASS_DISABLED = \"\".concat(NAMESPACE, \"-disabled\");\n var CLASS_HIDDEN = \"\".concat(NAMESPACE, \"-hidden\");\n var CLASS_HIDE = \"\".concat(NAMESPACE, \"-hide\");\n var CLASS_INVISIBLE = \"\".concat(NAMESPACE, \"-invisible\");\n var CLASS_MODAL = \"\".concat(NAMESPACE, \"-modal\");\n var CLASS_MOVE = \"\".concat(NAMESPACE, \"-move\"); // Data keys\n\n var DATA_ACTION = \"\".concat(NAMESPACE, \"Action\");\n var DATA_PREVIEW = \"\".concat(NAMESPACE, \"Preview\"); // Drag modes\n\n var DRAG_MODE_CROP = 'crop';\n var DRAG_MODE_MOVE = 'move';\n var DRAG_MODE_NONE = 'none'; // Events\n\n var EVENT_CROP = 'crop';\n var EVENT_CROP_END = 'cropend';\n var EVENT_CROP_MOVE = 'cropmove';\n var EVENT_CROP_START = 'cropstart';\n var EVENT_DBLCLICK = 'dblclick';\n var EVENT_TOUCH_START = IS_TOUCH_DEVICE ? 'touchstart' : 'mousedown';\n var EVENT_TOUCH_MOVE = IS_TOUCH_DEVICE ? 'touchmove' : 'mousemove';\n var EVENT_TOUCH_END = IS_TOUCH_DEVICE ? 'touchend touchcancel' : 'mouseup';\n var EVENT_POINTER_DOWN = HAS_POINTER_EVENT ? 'pointerdown' : EVENT_TOUCH_START;\n var EVENT_POINTER_MOVE = HAS_POINTER_EVENT ? 'pointermove' : EVENT_TOUCH_MOVE;\n var EVENT_POINTER_UP = HAS_POINTER_EVENT ? 'pointerup pointercancel' : EVENT_TOUCH_END;\n var EVENT_READY = 'ready';\n var EVENT_RESIZE = 'resize';\n var EVENT_WHEEL = 'wheel';\n var EVENT_ZOOM = 'zoom'; // Mime types\n\n var MIME_TYPE_JPEG = 'image/jpeg'; // RegExps\n\n var REGEXP_ACTIONS = /^e|w|s|n|se|sw|ne|nw|all|crop|move|zoom$/;\n var REGEXP_DATA_URL_JPEG = /^data:image\\/jpeg;base64,/;\n var REGEXP_TAG_NAME = /^img|canvas$/i; // Misc\n // Inspired by the default width and height of a canvas element.\n\n var MIN_CONTAINER_WIDTH = 200;\n var MIN_CONTAINER_HEIGHT = 100;\n\n var DEFAULTS = {\n // Define the view mode of the cropper\n viewMode: 0,\n // 0, 1, 2, 3\n // Define the dragging mode of the cropper\n dragMode: DRAG_MODE_CROP,\n // 'crop', 'move' or 'none'\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: 200,\n minContainerHeight: 100,\n // Shortcuts of events\n ready: null,\n cropstart: null,\n cropmove: null,\n cropend: null,\n crop: null,\n zoom: null\n };\n\n var TEMPLATE = '
' + '
' + '
' + '
' + '
' + '
' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '
' + '
';\n\n /**\n * Check if the given value is not a number.\n */\n\n var isNaN = Number.isNaN || WINDOW.isNaN;\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 */\n\n function isNumber(value) {\n return typeof value === 'number' && !isNaN(value);\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 */\n\n var isPositiveNumber = function isPositiveNumber(value) {\n return value > 0 && value < Infinity;\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 */\n\n function isUndefined(value) {\n return typeof value === 'undefined';\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 */\n\n function isObject(value) {\n return _typeof(value) === 'object' && value !== null;\n }\n var hasOwnProperty = Object.prototype.hasOwnProperty;\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 */\n\n function isPlainObject(value) {\n if (!isObject(value)) {\n return false;\n }\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 * 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 */\n\n function isFunction(value) {\n return typeof value === 'function';\n }\n var slice = Array.prototype.slice;\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 */\n\n function toArray(value) {\n return Array.from ? Array.from(value) : slice.call(value);\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 */\n\n function forEach(data, callback) {\n if (data && isFunction(callback)) {\n if (Array.isArray(data) || isNumber(data.length)\n /* array-like */\n ) {\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\n return data;\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 */\n\n var 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\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\n return target;\n };\n var REGEXP_DECIMALS = /\\.\\d*(?:0|9){12}\\d*$/;\n /**\n * Normalize decimal number.\n * Check out {@link http://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 */\n\n function 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 }\n var REGEXP_SUFFIX = /^width|height|left|top|marginLeft|marginTop$/;\n /**\n * Apply styles to the given element.\n * @param {Element} element - The target element.\n * @param {Object} styles - The styles for applying.\n */\n\n function 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\n style[property] = value;\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 */\n\n function hasClass(element, value) {\n return element.classList ? element.classList.contains(value) : element.className.indexOf(value) > -1;\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 */\n\n function addClass(element, value) {\n if (!value) {\n return;\n }\n\n if (isNumber(element.length)) {\n forEach(element, function (elem) {\n addClass(elem, value);\n });\n return;\n }\n\n if (element.classList) {\n element.classList.add(value);\n return;\n }\n\n var className = element.className.trim();\n\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 * Remove classes from the given element.\n * @param {Element} element - The target element.\n * @param {string} value - The classes to be removed.\n */\n\n function removeClass(element, value) {\n if (!value) {\n return;\n }\n\n if (isNumber(element.length)) {\n forEach(element, function (elem) {\n removeClass(elem, value);\n });\n return;\n }\n\n if (element.classList) {\n element.classList.remove(value);\n return;\n }\n\n if (element.className.indexOf(value) >= 0) {\n element.className = element.className.replace(value, '');\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 */\n\n function toggleClass(element, value, added) {\n if (!value) {\n return;\n }\n\n if (isNumber(element.length)) {\n forEach(element, function (elem) {\n toggleClass(elem, value, added);\n });\n return;\n } // IE10-11 doesn't support the second parameter of `classList.toggle`\n\n\n if (added) {\n addClass(element, value);\n } else {\n removeClass(element, value);\n }\n }\n var REGEXP_CAMEL_CASE = /([a-z\\d])([A-Z])/g;\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 */\n\n function toParamCase(value) {\n return value.replace(REGEXP_CAMEL_CASE, '$1-$2').toLowerCase();\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 */\n\n function getData(element, name) {\n if (isObject(element[name])) {\n return element[name];\n }\n\n if (element.dataset) {\n return element.dataset[name];\n }\n\n return element.getAttribute(\"data-\".concat(toParamCase(name)));\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 */\n\n function 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 * Remove data from the given element.\n * @param {Element} element - The target element.\n * @param {string} name - The data key to remove.\n */\n\n function 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 }\n var REGEXP_SPACES = /\\s\\s*/;\n\n var onceSupported = function () {\n var supported = false;\n\n if (IS_BROWSER) {\n var once = false;\n\n var listener = function listener() {};\n\n var options = Object.defineProperty({}, 'once', {\n get: function get() {\n supported = true;\n return once;\n },\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\n return supported;\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 */\n\n\n function 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\n if (listeners && listeners[event] && listeners[event][listener]) {\n handler = listeners[event][listener];\n delete listeners[event][listener];\n\n if (Object.keys(listeners[event]).length === 0) {\n delete listeners[event];\n }\n\n if (Object.keys(listeners).length === 0) {\n delete element.listeners;\n }\n }\n }\n\n element.removeEventListener(event, handler, options);\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 */\n\n function 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\n _handler = function handler() {\n delete listeners[event][listener];\n element.removeEventListener(event, _handler, options);\n\n for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n args[_key2] = arguments[_key2];\n }\n\n listener.apply(element, args);\n };\n\n if (!listeners[event]) {\n listeners[event] = {};\n }\n\n if (listeners[event][listener]) {\n element.removeEventListener(event, listeners[event][listener], options);\n }\n\n listeners[event][listener] = _handler;\n element.listeners = listeners;\n }\n\n element.addEventListener(event, _handler, options);\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 */\n\n function dispatchEvent(element, type, data) {\n var event; // Event and CustomEvent on IE9-11 are global objects, not constructors\n\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\n return element.dispatchEvent(event);\n }\n /**\n * Get the offset base on the document.\n * @param {Element} element - The target element.\n * @returns {Object} The offset data.\n */\n\n function 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 }\n var location = WINDOW.location;\n var REGEXP_ORIGINS = /^(\\w+:)\\/\\/([^:/?#]*):?(\\d*)/i;\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 */\n\n function 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 * Add timestamp to the given URL.\n * @param {string} url - The target URL.\n * @returns {string} The result URL.\n */\n\n function addTimestamp(url) {\n var timestamp = \"timestamp=\".concat(new Date().getTime());\n return url + (url.indexOf('?') === -1 ? '?' : '&') + timestamp;\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 */\n\n function 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\n if (isNumber(translateX) && translateX !== 0) {\n values.push(\"translateX(\".concat(translateX, \"px)\"));\n }\n\n if (isNumber(translateY) && translateY !== 0) {\n values.push(\"translateY(\".concat(translateY, \"px)\"));\n } // Rotate should come first before scale to match orientation transform\n\n\n if (isNumber(rotate) && rotate !== 0) {\n values.push(\"rotate(\".concat(rotate, \"deg)\"));\n }\n\n if (isNumber(scaleX) && scaleX !== 1) {\n values.push(\"scaleX(\".concat(scaleX, \")\"));\n }\n\n if (isNumber(scaleY) && scaleY !== 1) {\n values.push(\"scaleY(\".concat(scaleY, \")\"));\n }\n\n var transform = values.length ? values.join(' ') : 'none';\n return {\n WebkitTransform: transform,\n msTransform: transform,\n transform: transform\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 */\n\n function getMaxZoomRatio(pointers) {\n var pointers2 = assign({}, pointers);\n var ratios = [];\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 ratios.push(ratio);\n });\n });\n ratios.sort(function (a, b) {\n return Math.abs(a) < Math.abs(b);\n });\n return ratios[0];\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 */\n\n function 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 : assign({\n startX: pageX,\n startY: pageY\n }, end);\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 */\n\n function 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 * 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 */\n\n function getAdjustedSizes(_ref4) // or 'cover'\n {\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\n if (isValidWidth && isValidHeight) {\n var adjustedWidth = height * aspectRatio;\n\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\n return {\n width: width,\n height: height\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 */\n\n function getRotatedSizes(_ref5) {\n var width = _ref5.width,\n height = _ref5.height,\n degree = _ref5.degree;\n degree = Math.abs(degree) % 180;\n\n if (degree === 90) {\n return {\n width: height,\n height: width\n };\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 * 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 */\n\n function 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)); // Note: should always use image's natural sizes for drawing as\n // imageData.naturalWidth === canvasData.naturalHeight when rotate % 180 === 90\n\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 }\n var fromCharCode = String.fromCharCode;\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 */\n\n function getStringFromCharCode(dataView, start, length) {\n var str = '';\n length += start;\n\n for (var i = start; i < length; i += 1) {\n str += fromCharCode(dataView.getUint8(i));\n }\n\n return str;\n }\n var REGEXP_DATA_URL_HEAD = /^data:.*,/;\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 */\n\n function 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 * 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 */\n\n function arrayBufferToDataURL(arrayBuffer, mimeType) {\n var chunks = []; // Chunk Typed Array for better performance (#435)\n\n var chunkSize = 8192;\n var uint8 = new Uint8Array(arrayBuffer);\n\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\n return \"data:\".concat(mimeType, \";base64,\").concat(btoa(chunks.join('')));\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 */\n\n function resetAndGetOrientation(arrayBuffer) {\n var dataView = new DataView(arrayBuffer);\n var orientation; // Ignores range error when the image does not have correct Exif information\n\n try {\n var littleEndian;\n var app1Start;\n var ifdStart; // Only handle JPEG image (start by 0xFFD8)\n\n if (dataView.getUint8(0) === 0xFF && dataView.getUint8(1) === 0xD8) {\n var length = dataView.byteLength;\n var offset = 2;\n\n while (offset + 1 < length) {\n if (dataView.getUint8(offset) === 0xFF && dataView.getUint8(offset + 1) === 0xE1) {\n app1Start = offset;\n break;\n }\n\n offset += 1;\n }\n }\n\n if (app1Start) {\n var exifIDCode = app1Start + 4;\n var tiffOffset = app1Start + 10;\n\n if (getStringFromCharCode(dataView, exifIDCode, 4) === 'Exif') {\n var endianness = dataView.getUint16(tiffOffset);\n littleEndian = endianness === 0x4949;\n\n if (littleEndian || endianness === 0x4D4D\n /* bigEndian */\n ) {\n if (dataView.getUint16(tiffOffset + 2, littleEndian) === 0x002A) {\n var firstIFDOffset = dataView.getUint32(tiffOffset + 4, littleEndian);\n\n if (firstIFDOffset >= 0x00000008) {\n ifdStart = tiffOffset + firstIFDOffset;\n }\n }\n }\n }\n }\n\n if (ifdStart) {\n var _length = dataView.getUint16(ifdStart, littleEndian);\n\n var _offset;\n\n var i;\n\n for (i = 0; i < _length; i += 1) {\n _offset = ifdStart + i * 12 + 2;\n\n if (dataView.getUint16(_offset, littleEndian) === 0x0112\n /* Orientation */\n ) {\n // 8 is the offset of the current tag's value\n _offset += 8; // Get the original orientation value\n\n orientation = dataView.getUint16(_offset, littleEndian); // Override the orientation with its default value\n\n dataView.setUint16(_offset, 1, littleEndian);\n break;\n }\n }\n }\n } catch (error) {\n orientation = 1;\n }\n\n return orientation;\n }\n /**\n * Parse Exif Orientation value.\n * @param {number} orientation - The orientation to parse.\n * @returns {Object} The parsed result.\n */\n\n function parseOrientation(orientation) {\n var rotate = 0;\n var scaleX = 1;\n var scaleY = 1;\n\n switch (orientation) {\n // Flip horizontal\n case 2:\n scaleX = -1;\n break;\n // Rotate left 180°\n\n case 3:\n rotate = -180;\n break;\n // Flip vertical\n\n case 4:\n scaleY = -1;\n break;\n // Flip vertical and rotate right 90°\n\n case 5:\n rotate = 90;\n scaleY = -1;\n break;\n // Rotate right 90°\n\n case 6:\n rotate = 90;\n break;\n // Flip horizontal and rotate right 90°\n\n case 7:\n rotate = 90;\n scaleX = -1;\n break;\n // Rotate left 90°\n\n case 8:\n rotate = -90;\n break;\n\n default:\n }\n\n return {\n rotate: rotate,\n scaleX: scaleX,\n scaleY: scaleY\n };\n }\n\n var render = {\n render: function render() {\n this.initContainer();\n this.initCanvas();\n this.initCropBox();\n this.renderCanvas();\n\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 addClass(cropper, CLASS_HIDDEN);\n removeClass(element, CLASS_HIDDEN);\n var containerData = {\n width: Math.max(container.offsetWidth, Number(options.minContainerWidth) || 200),\n height: Math.max(container.offsetHeight, Number(options.minContainerHeight) || 100)\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\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\n var canvasData = {\n aspectRatio: aspectRatio,\n naturalWidth: naturalWidth,\n naturalHeight: naturalHeight,\n width: canvasWidth,\n height: canvasHeight\n };\n canvasData.left = (containerData.width - canvasWidth) / 2;\n canvasData.top = (containerData.height - canvasHeight) / 2;\n canvasData.oldLeft = canvasData.left;\n canvasData.oldTop = canvasData.top;\n this.canvasData = canvasData;\n this.limited = viewMode === 1 || viewMode === 2;\n this.limitCanvas(true, true);\n this.initialImageData = assign({}, imageData);\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\n if (sizeLimited) {\n var minCanvasWidth = Number(options.minCanvasWidth) || 0;\n var minCanvasHeight = Number(options.minCanvasHeight) || 0;\n\n if (viewMode > 1) {\n minCanvasWidth = Math.max(minCanvasWidth, containerData.width);\n minCanvasHeight = Math.max(minCanvasHeight, containerData.height);\n\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\n if (minCanvasHeight * aspectRatio > minCanvasWidth) {\n minCanvasWidth = minCanvasHeight * aspectRatio;\n } else {\n minCanvasHeight = minCanvasWidth / aspectRatio;\n }\n }\n }\n\n var _getAdjustedSizes = getAdjustedSizes({\n aspectRatio: aspectRatio,\n width: minCanvasWidth,\n height: minCanvasHeight\n });\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\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\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\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\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\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\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\n if (canvasData.width > canvasData.maxWidth || canvasData.width < canvasData.minWidth) {\n canvasData.left = canvasData.oldLeft;\n }\n\n if (canvasData.height > canvasData.maxHeight || canvasData.height < canvasData.minHeight) {\n canvasData.top = canvasData.oldTop;\n }\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\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\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\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\n this.cropBoxData = cropBoxData;\n this.limitCropBox(true, true); // Initialize auto crop area\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); // The width/height of auto crop area must large than \"minWidth/Height\"\n\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\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; // The min/maxCropBoxWidth/Height must be less than container's width/height\n\n minCropBoxWidth = Math.min(minCropBoxWidth, containerData.width);\n minCropBoxHeight = Math.min(minCropBoxHeight, containerData.height);\n\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\n if (maxCropBoxHeight * aspectRatio > maxCropBoxWidth) {\n maxCropBoxHeight = maxCropBoxWidth / aspectRatio;\n } else {\n maxCropBoxWidth = maxCropBoxHeight * aspectRatio;\n }\n } // The minWidth/Height must be less than maxWidth/Height\n\n\n cropBoxData.minWidth = Math.min(minCropBoxWidth, maxCropBoxWidth);\n cropBoxData.minHeight = Math.min(minCropBoxHeight, maxCropBoxHeight);\n cropBoxData.maxWidth = maxCropBoxWidth;\n cropBoxData.maxHeight = maxCropBoxHeight;\n }\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\n if (cropBoxData.width > cropBoxData.maxWidth || cropBoxData.width < cropBoxData.minWidth) {\n cropBoxData.left = cropBoxData.oldLeft;\n }\n\n if (cropBoxData.height > cropBoxData.maxHeight || cropBoxData.height < cropBoxData.minHeight) {\n cropBoxData.top = cropBoxData.oldTop;\n }\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\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\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\n if (this.cropped && this.limited) {\n this.limitCanvas(true, true);\n }\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\n var preview = {\n initPreview: function initPreview() {\n var crossOrigin = this.crossOrigin;\n var preview = this.options.preview;\n var url = crossOrigin ? this.crossOriginUrl : this.url;\n var image = document.createElement('img');\n\n if (crossOrigin) {\n image.crossOrigin = crossOrigin;\n }\n\n image.src = url;\n this.viewBox.appendChild(image);\n this.viewBoxImage = image;\n\n if (!preview) {\n return;\n }\n\n var previews = preview;\n\n if (typeof preview === 'string') {\n previews = this.element.ownerDocument.querySelectorAll(preview);\n } else if (preview.querySelector) {\n previews = [preview];\n }\n\n this.previews = previews;\n forEach(previews, function (el) {\n var img = document.createElement('img'); // Save the original size for recover\n\n setData(el, DATA_PREVIEW, {\n width: el.offsetWidth,\n height: el.offsetHeight,\n html: el.innerHTML\n });\n\n if (crossOrigin) {\n img.crossOrigin = crossOrigin;\n }\n\n img.src = url;\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\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\n if (!this.cropped || this.disabled) {\n return;\n }\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\n if (cropBoxWidth) {\n ratio = originalWidth / cropBoxWidth;\n newHeight = cropBoxHeight * ratio;\n }\n\n if (cropBoxHeight && newHeight > originalHeight) {\n ratio = originalHeight / cropBoxHeight;\n newWidth = cropBoxWidth * ratio;\n newHeight = originalHeight;\n }\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\n var events = {\n bind: function bind() {\n var element = this.element,\n options = this.options,\n cropper = this.cropper;\n\n if (isFunction(options.cropstart)) {\n addListener(element, EVENT_CROP_START, options.cropstart);\n }\n\n if (isFunction(options.cropmove)) {\n addListener(element, EVENT_CROP_MOVE, options.cropmove);\n }\n\n if (isFunction(options.cropend)) {\n addListener(element, EVENT_CROP_END, options.cropend);\n }\n\n if (isFunction(options.crop)) {\n addListener(element, EVENT_CROP, options.crop);\n }\n\n if (isFunction(options.zoom)) {\n addListener(element, EVENT_ZOOM, options.zoom);\n }\n\n addListener(cropper, EVENT_POINTER_DOWN, this.onCropStart = this.cropStart.bind(this));\n\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\n if (options.toggleDragModeOnDblclick) {\n addListener(cropper, EVENT_DBLCLICK, this.onDblclick = this.dblclick.bind(this));\n }\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\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\n if (isFunction(options.cropstart)) {\n removeListener(element, EVENT_CROP_START, options.cropstart);\n }\n\n if (isFunction(options.cropmove)) {\n removeListener(element, EVENT_CROP_MOVE, options.cropmove);\n }\n\n if (isFunction(options.cropend)) {\n removeListener(element, EVENT_CROP_END, options.cropend);\n }\n\n if (isFunction(options.crop)) {\n removeListener(element, EVENT_CROP, options.crop);\n }\n\n if (isFunction(options.zoom)) {\n removeListener(element, EVENT_ZOOM, options.zoom);\n }\n\n removeListener(cropper, EVENT_POINTER_DOWN, this.onCropStart);\n\n if (options.zoomable && options.zoomOnWheel) {\n removeListener(cropper, EVENT_WHEEL, this.onWheel, {\n passive: false,\n capture: true\n });\n }\n\n if (options.toggleDragModeOnDblclick) {\n removeListener(cropper, EVENT_DBLCLICK, this.onDblclick);\n }\n\n removeListener(element.ownerDocument, EVENT_POINTER_MOVE, this.onCropMove);\n removeListener(element.ownerDocument, EVENT_POINTER_UP, this.onCropEnd);\n\n if (options.responsive) {\n removeListener(window, EVENT_RESIZE, this.onResize);\n }\n }\n };\n\n var handlers = {\n resize: function resize() {\n var options = this.options,\n container = this.container,\n containerData = this.containerData;\n var minContainerWidth = Number(options.minContainerWidth) || MIN_CONTAINER_WIDTH;\n var minContainerHeight = Number(options.minContainerHeight) || MIN_CONTAINER_HEIGHT;\n\n if (this.disabled || containerData.width <= minContainerWidth || containerData.height <= minContainerHeight) {\n return;\n }\n\n var ratio = container.offsetWidth / containerData.width; // Resize when width changed or height changed\n\n if (ratio !== 1 || container.offsetHeight !== containerData.height) {\n var canvasData;\n var cropBoxData;\n\n if (options.restore) {\n canvasData = this.getCanvasData();\n cropBoxData = this.getCropBoxData();\n }\n\n this.render();\n\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\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\n var ratio = Number(this.options.wheelZoomRatio) || 0.1;\n var delta = 1;\n\n if (this.disabled) {\n return;\n }\n\n event.preventDefault(); // Limit wheel speed to prevent zoom too fast (#21)\n\n if (this.wheeling) {\n return;\n }\n\n this.wheeling = true;\n setTimeout(function () {\n _this.wheeling = false;\n }, 50);\n\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\n this.zoom(-delta * ratio, event);\n },\n cropStart: function cropStart(event) {\n var buttons = event.buttons,\n button = event.button;\n\n if (this.disabled // No primary button (Usually the left button)\n // Note that touch events have no `buttons` or `button` property\n || isNumber(buttons) && buttons !== 1 || isNumber(button) && button !== 0 // Open context menu\n || event.ctrlKey) {\n return;\n }\n\n var options = this.options,\n pointers = this.pointers;\n var action;\n\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\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\n if (!REGEXP_ACTIONS.test(action)) {\n return;\n }\n\n if (dispatchEvent(this.element, EVENT_CROP_START, {\n originalEvent: event,\n action: action\n }) === false) {\n return;\n } // This line is required for preventing page zooming in iOS browsers\n\n\n event.preventDefault();\n this.action = action;\n this.cropping = false;\n\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\n if (this.disabled || !action) {\n return;\n }\n\n var pointers = this.pointers;\n event.preventDefault();\n\n if (dispatchEvent(this.element, EVENT_CROP_MOVE, {\n originalEvent: event,\n action: action\n }) === false) {\n return;\n }\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\n this.change(event);\n },\n cropEnd: function cropEnd(event) {\n if (this.disabled) {\n return;\n }\n\n var action = this.action,\n pointers = this.pointers;\n\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\n if (!action) {\n return;\n }\n\n event.preventDefault();\n\n if (!Object.keys(pointers).length) {\n this.action = '';\n }\n\n if (this.cropping) {\n this.cropping = false;\n toggleClass(this.dragBox, CLASS_MODAL, this.cropped && this.options.modal);\n }\n\n dispatchEvent(this.element, EVENT_CROP_END, {\n originalEvent: event,\n action: action\n });\n }\n };\n\n var 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; // Locking aspect ratio in \"free mode\" by holding shift key\n\n if (!aspectRatio && event.shiftKey) {\n aspectRatio = width && height ? width / height : 1;\n }\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\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\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\n break;\n\n case ACTION_WEST:\n if (left + range.x < minLeft) {\n range.x = minLeft - left;\n }\n\n break;\n\n case ACTION_NORTH:\n if (top + range.y < minTop) {\n range.y = minTop - top;\n }\n\n break;\n\n case ACTION_SOUTH:\n if (bottom + range.y > maxHeight) {\n range.y = maxHeight - bottom;\n }\n\n break;\n\n default:\n }\n };\n\n switch (action) {\n // Move crop box\n case ACTION_ALL:\n left += range.x;\n top += range.y;\n break;\n // Resize crop box\n\n case ACTION_EAST:\n if (range.x >= 0 && (right >= maxWidth || aspectRatio && (top <= minTop || bottom >= maxHeight))) {\n renderable = false;\n break;\n }\n\n check(ACTION_EAST);\n width += range.x;\n\n if (width < 0) {\n action = ACTION_WEST;\n width = -width;\n left -= width;\n }\n\n if (aspectRatio) {\n height = width / aspectRatio;\n top += (cropBoxData.height - height) / 2;\n }\n\n break;\n\n case ACTION_NORTH:\n if (range.y <= 0 && (top <= minTop || aspectRatio && (left <= minLeft || right >= maxWidth))) {\n renderable = false;\n break;\n }\n\n check(ACTION_NORTH);\n height -= range.y;\n top += range.y;\n\n if (height < 0) {\n action = ACTION_SOUTH;\n height = -height;\n top -= height;\n }\n\n if (aspectRatio) {\n width = height * aspectRatio;\n left += (cropBoxData.width - width) / 2;\n }\n\n break;\n\n case ACTION_WEST:\n if (range.x <= 0 && (left <= minLeft || aspectRatio && (top <= minTop || bottom >= maxHeight))) {\n renderable = false;\n break;\n }\n\n check(ACTION_WEST);\n width -= range.x;\n left += range.x;\n\n if (width < 0) {\n action = ACTION_EAST;\n width = -width;\n left -= width;\n }\n\n if (aspectRatio) {\n height = width / aspectRatio;\n top += (cropBoxData.height - height) / 2;\n }\n\n break;\n\n case ACTION_SOUTH:\n if (range.y >= 0 && (bottom >= maxHeight || aspectRatio && (left <= minLeft || right >= maxWidth))) {\n renderable = false;\n break;\n }\n\n check(ACTION_SOUTH);\n height += range.y;\n\n if (height < 0) {\n action = ACTION_NORTH;\n height = -height;\n top -= height;\n }\n\n if (aspectRatio) {\n width = height * aspectRatio;\n left += (cropBoxData.width - width) / 2;\n }\n\n break;\n\n case ACTION_NORTH_EAST:\n if (aspectRatio) {\n if (range.y <= 0 && (top <= minTop || right >= maxWidth)) {\n renderable = false;\n break;\n }\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\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\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\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\n break;\n\n case ACTION_NORTH_WEST:\n if (aspectRatio) {\n if (range.y <= 0 && (top <= minTop || left <= minLeft)) {\n renderable = false;\n break;\n }\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\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\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\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\n break;\n\n case ACTION_SOUTH_WEST:\n if (aspectRatio) {\n if (range.x <= 0 && (left <= minLeft || bottom >= maxHeight)) {\n renderable = false;\n break;\n }\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\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\n if (range.y >= 0) {\n if (bottom < maxHeight) {\n height += range.y;\n }\n } else {\n height += range.y;\n }\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\n break;\n\n case ACTION_SOUTH_EAST:\n if (aspectRatio) {\n if (range.x >= 0 && (right >= maxWidth || bottom >= maxHeight)) {\n renderable = false;\n break;\n }\n\n check(ACTION_EAST);\n width += range.x;\n height = width / aspectRatio;\n } else {\n check(ACTION_SOUTH);\n check(ACTION_EAST);\n\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\n if (range.y >= 0) {\n if (bottom < maxHeight) {\n height += range.y;\n }\n } else {\n height += range.y;\n }\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\n break;\n // Move canvas\n\n case ACTION_MOVE:\n this.move(range.x, range.y);\n renderable = false;\n break;\n // Zoom canvas\n\n case ACTION_ZOOM:\n this.zoom(getMaxZoomRatio(pointers), event);\n renderable = false;\n break;\n // Create crop box\n\n case ACTION_CROP:\n if (!range.x || !range.y) {\n renderable = false;\n break;\n }\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\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\n if (range.y < 0) {\n top -= height;\n } // Show the crop box if is hidden\n\n\n if (!this.cropped) {\n removeClass(this.cropBox, CLASS_HIDDEN);\n this.cropped = true;\n\n if (this.limited) {\n this.limitCropBox(true, true);\n }\n }\n\n break;\n\n default:\n }\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 } // Override\n\n\n forEach(pointers, function (p) {\n p.startX = p.endX;\n p.startY = p.endY;\n });\n }\n };\n\n var 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\n if (this.options.modal) {\n addClass(this.dragBox, CLASS_MODAL);\n }\n\n removeClass(this.cropBox, CLASS_HIDDEN);\n this.setCropBoxData(this.initialCropBoxData);\n }\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\n if (this.cropped) {\n this.renderCropBox();\n }\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); // Render canvas after crop box rendered\n\n this.renderCanvas();\n removeClass(this.dragBox, CLASS_MODAL);\n addClass(this.cropBox, CLASS_HIDDEN);\n }\n\n return this;\n },\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\n if (!this.disabled && url) {\n if (this.isImg) {\n this.element.src = url;\n }\n\n if (hasSameSize) {\n this.url = url;\n this.image.src = url;\n\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\n this.options.data = null;\n this.uncreate();\n this.load(url);\n }\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\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\n return this;\n },\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\n if (!element[NAMESPACE]) {\n return this;\n }\n\n element[NAMESPACE] = undefined;\n\n if (this.isImg && this.replaced) {\n element.src = this.originalUrl;\n }\n\n this.uncreate();\n return this;\n },\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 /**\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\n if (this.ready && !this.disabled && this.options.movable) {\n if (isNumber(x)) {\n canvasData.left = x;\n changed = true;\n }\n\n if (isNumber(y)) {\n canvasData.top = y;\n changed = true;\n }\n\n if (changed) {\n this.renderCanvas(true);\n }\n }\n\n return this;\n },\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\n if (ratio < 0) {\n ratio = 1 / (1 - ratio);\n } else {\n ratio = 1 + ratio;\n }\n\n return this.zoomTo(canvasData.width * ratio / canvasData.naturalWidth, null, _originalEvent);\n },\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\n if (ratio >= 0 && this.ready && !this.disabled && options.zoomable) {\n var newWidth = naturalWidth * ratio;\n var newHeight = naturalHeight * ratio;\n\n if (dispatchEvent(this.element, EVENT_ZOOM, {\n ratio: ratio,\n oldRatio: width / naturalWidth,\n originalEvent: _originalEvent\n }) === false) {\n return this;\n }\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 }; // Zoom from the triggering point of the event\n\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\n canvasData.width = newWidth;\n canvasData.height = newHeight;\n this.renderCanvas(true);\n }\n\n return this;\n },\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 /**\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\n if (isNumber(degree) && this.ready && !this.disabled && this.options.rotatable) {\n this.imageData.rotate = degree % 360;\n this.renderCanvas(true, true);\n }\n\n return this;\n },\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 /**\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 /**\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\n if (this.ready && !this.disabled && this.options.scalable) {\n if (isNumber(scaleX)) {\n imageData.scaleX = scaleX;\n transformed = true;\n }\n\n if (isNumber(scaleY)) {\n imageData.scaleY = scaleY;\n transformed = true;\n }\n\n if (transformed) {\n this.renderCanvas(true, true);\n }\n }\n\n return this;\n },\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\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\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\n if (options.rotatable) {\n data.rotate = imageData.rotate || 0;\n }\n\n if (options.scalable) {\n data.scaleX = imageData.scaleX || 1;\n data.scaleY = imageData.scaleY || 1;\n }\n\n return data;\n },\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\n if (this.ready && !this.disabled && isPlainObject(data)) {\n var transformed = false;\n\n if (options.rotatable) {\n if (isNumber(data.rotate) && data.rotate !== imageData.rotate) {\n imageData.rotate = data.rotate;\n transformed = true;\n }\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\n if (isNumber(data.scaleY) && data.scaleY !== imageData.scaleY) {\n imageData.scaleY = data.scaleY;\n transformed = true;\n }\n }\n\n if (transformed) {\n this.renderCanvas(true, true);\n }\n\n var ratio = imageData.width / imageData.naturalWidth;\n\n if (isNumber(data.x)) {\n cropBoxData.left = data.x * ratio + canvasData.left;\n }\n\n if (isNumber(data.y)) {\n cropBoxData.top = data.y * ratio + canvasData.top;\n }\n\n if (isNumber(data.width)) {\n cropBoxData.width = data.width * ratio;\n }\n\n if (isNumber(data.height)) {\n cropBoxData.height = data.height * ratio;\n }\n\n this.setCropBoxData(cropBoxData);\n }\n\n return this;\n },\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 /**\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 /**\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\n if (this.ready) {\n forEach(['left', 'top', 'width', 'height', 'naturalWidth', 'naturalHeight'], function (n) {\n data[n] = canvasData[n];\n });\n }\n\n return data;\n },\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\n if (this.ready && !this.disabled && isPlainObject(data)) {\n if (isNumber(data.left)) {\n canvasData.left = data.left;\n }\n\n if (isNumber(data.top)) {\n canvasData.top = data.top;\n }\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\n this.renderCanvas(true);\n }\n\n return this;\n },\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\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\n return data || {};\n },\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\n if (this.ready && this.cropped && !this.disabled && isPlainObject(data)) {\n if (isNumber(data.left)) {\n cropBoxData.left = data.left;\n }\n\n if (isNumber(data.top)) {\n cropBoxData.top = data.top;\n }\n\n if (isNumber(data.width) && data.width !== cropBoxData.width) {\n widthChanged = true;\n cropBoxData.width = data.width;\n }\n\n if (isNumber(data.height) && data.height !== cropBoxData.height) {\n heightChanged = true;\n cropBoxData.height = data.height;\n }\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\n this.renderCropBox();\n }\n\n return this;\n },\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\n if (!this.ready || !window.HTMLCanvasElement) {\n return null;\n }\n\n var canvasData = this.canvasData;\n var source = getSourceCanvas(this.image, this.imageData, canvasData, options); // Returns the source canvas if it is not cropped.\n\n if (!this.cropped) {\n return source;\n }\n\n var _this$getData = this.getData(),\n initialX = _this$getData.x,\n initialY = _this$getData.y,\n initialWidth = _this$getData.width,\n initialHeight = _this$getData.height;\n\n var ratio = source.width / Math.floor(canvasData.naturalWidth);\n\n if (ratio !== 1) {\n initialX *= ratio;\n initialY *= ratio;\n initialWidth *= ratio;\n initialHeight *= ratio;\n }\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\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\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\n if (imageSmoothingQuality) {\n context.imageSmoothingQuality = imageSmoothingQuality;\n } // https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D.drawImage\n\n\n var sourceWidth = source.width;\n var sourceHeight = source.height; // Source canvas parameters\n\n var srcX = initialX;\n var srcY = initialY;\n var srcWidth;\n var srcHeight; // Destination canvas parameters\n\n var dstX;\n var dstY;\n var dstWidth;\n var dstHeight;\n\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\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\n var params = [srcX, srcY, srcWidth, srcHeight]; // Avoid \"IndexSizeError\"\n\n if (dstWidth > 0 && dstHeight > 0) {\n var scale = width / initialWidth;\n params.push(dstX * scale, dstY * scale, dstWidth * scale, dstHeight * scale);\n } // All the numerical parameters should be integer for `drawImage`\n // https://github.com/fengyuanchen/cropper/issues/476\n\n\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 /**\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\n if (!this.disabled && !isUndefined(aspectRatio)) {\n // 0 -> NaN\n options.aspectRatio = Math.max(0, aspectRatio) || NaN;\n\n if (this.ready) {\n this.initCropBox();\n\n if (this.cropped) {\n this.renderCropBox();\n }\n }\n }\n\n return this;\n },\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\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\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\n return this;\n }\n };\n\n var AnotherCropper = WINDOW.Cropper;\n\n var Cropper =\n /*#__PURE__*/\n 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\n _classCallCheck(this, Cropper);\n\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\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\n _createClass(Cropper, [{\n key: \"init\",\n value: function init() {\n var element = this.element;\n var tagName = element.tagName.toLowerCase();\n var url;\n\n if (element[NAMESPACE]) {\n return;\n }\n\n element[NAMESPACE] = this;\n\n if (tagName === 'img') {\n this.isImg = true; // e.g.: \"img/picture.jpg\"\n\n url = element.getAttribute('src') || '';\n this.originalUrl = url; // Stop when it's a blank image\n\n if (!url) {\n return;\n } // e.g.: \"http://example.com/img/picture.jpg\"\n\n\n url = element.src;\n } else if (tagName === 'canvas' && window.HTMLCanvasElement) {\n url = element.toDataURL();\n }\n\n this.load(url);\n }\n }, {\n key: \"load\",\n value: function load(url) {\n var _this = this;\n\n if (!url) {\n return;\n }\n\n this.url = url;\n this.imageData = {};\n var element = this.element,\n options = this.options;\n\n if (!options.rotatable && !options.scalable) {\n options.checkOrientation = false;\n } // Only IE10+ supports Typed Arrays\n\n\n if (!options.checkOrientation || !window.ArrayBuffer) {\n this.clone();\n return;\n } // Read ArrayBuffer from Data URL of JPEG images directly for better performance.\n\n\n if (REGEXP_DATA_URL_JPEG.test(url)) {\n this.read(dataURLToArrayBuffer(url));\n return;\n }\n\n var xhr = new XMLHttpRequest();\n var clone = this.clone.bind(this);\n this.reloading = true;\n this.xhr = xhr; // 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\n xhr.onabort = clone;\n xhr.onerror = clone;\n xhr.ontimeout = clone;\n\n xhr.onprogress = function () {\n if (xhr.getResponseHeader('content-type') !== MIME_TYPE_JPEG) {\n xhr.abort();\n }\n };\n\n xhr.onload = function () {\n _this.read(xhr.response);\n };\n\n xhr.onloadend = function () {\n _this.reloading = false;\n _this.xhr = null;\n }; // Bust cache when there is a \"crossOrigin\" property to avoid browser cache error\n\n\n if (options.checkCrossOrigin && isCrossOriginURL(url) && element.crossOrigin) {\n url = addTimestamp(url);\n }\n\n xhr.open('GET', url);\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; // Reset the orientation value to its default value 1\n // as some iOS browsers will render image with its orientation\n\n var orientation = resetAndGetOrientation(arrayBuffer);\n var rotate = 0;\n var scaleX = 1;\n var scaleY = 1;\n\n if (orientation > 1) {\n // Generate a new URL which has the default orientation value\n this.url = arrayBufferToDataURL(arrayBuffer, MIME_TYPE_JPEG);\n\n var _parseOrientation = parseOrientation(orientation);\n\n rotate = _parseOrientation.rotate;\n scaleX = _parseOrientation.scaleX;\n scaleY = _parseOrientation.scaleY;\n }\n\n if (options.rotatable) {\n imageData.rotate = rotate;\n }\n\n if (options.scalable) {\n imageData.scaleX = scaleX;\n imageData.scaleY = scaleY;\n }\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;\n var crossOriginUrl;\n\n if (this.options.checkCrossOrigin && isCrossOriginURL(url)) {\n crossOrigin = element.crossOrigin;\n\n if (crossOrigin) {\n crossOriginUrl = url;\n } else {\n crossOrigin = 'anonymous'; // Bust cache when there is not a \"crossOrigin\" property\n\n crossOriginUrl = addTimestamp(url);\n }\n }\n\n this.crossOrigin = crossOrigin;\n this.crossOriginUrl = crossOriginUrl;\n var image = document.createElement('img');\n\n if (crossOrigin) {\n image.crossOrigin = crossOrigin;\n }\n\n image.src = crossOriginUrl || url;\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\n var image = this.isImg ? this.element : this.image;\n image.onload = null;\n image.onerror = null;\n this.sizing = true;\n var IS_SAFARI = WINDOW.navigator && /^(?:.(?!chrome|android))*safari/i.test(WINDOW.navigator.userAgent);\n\n var done = function done(naturalWidth, naturalHeight) {\n assign(_this2.imageData, {\n naturalWidth: naturalWidth,\n naturalHeight: naturalHeight,\n aspectRatio: naturalWidth / naturalHeight\n });\n _this2.sizing = false;\n _this2.sized = true;\n\n _this2.build();\n }; // Modern browsers (except Safari)\n\n\n if (image.naturalWidth && !IS_SAFARI) {\n done(image.naturalWidth, image.naturalHeight);\n return;\n }\n\n var sizingImage = document.createElement('img');\n var body = document.body || document.documentElement;\n this.sizingImage = sizingImage;\n\n sizingImage.onload = function () {\n done(sizingImage.width, sizingImage.height);\n\n if (!IS_SAFARI) {\n body.removeChild(sizingImage);\n }\n };\n\n sizingImage.src = image.src; // iOS Safari will convert the image automatically\n // with its orientation once append it into DOM (#279)\n\n if (!IS_SAFARI) {\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\n var element = this.element,\n options = this.options,\n image = this.image; // Create cropper elements\n\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); // Hide the original image\n\n addClass(element, CLASS_HIDDEN); // Inserts the cropper after to the current image\n\n container.insertBefore(cropper, element.nextSibling); // Show the image if is hidden\n\n if (!this.isImg) {\n removeClass(image, CLASS_HIDE);\n }\n\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\n if (!options.guides) {\n addClass(cropBox.getElementsByClassName(\"\".concat(NAMESPACE, \"-dashed\")), CLASS_HIDDEN);\n }\n\n if (!options.center) {\n addClass(cropBox.getElementsByClassName(\"\".concat(NAMESPACE, \"-center\")), CLASS_HIDDEN);\n }\n\n if (options.background) {\n addClass(cropper, \"\".concat(NAMESPACE, \"-bg\"));\n }\n\n if (!options.highlight) {\n addClass(face, CLASS_INVISIBLE);\n }\n\n if (options.cropBoxMovable) {\n addClass(face, CLASS_MOVE);\n setData(face, DATA_ACTION, ACTION_ALL);\n }\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\n this.render();\n this.ready = true;\n this.setDragMode(options.dragMode);\n\n if (options.autoCrop) {\n this.crop();\n }\n\n this.setData(options.data);\n\n if (isFunction(options.ready)) {\n addListener(element, EVENT_READY, options.ready, {\n once: true\n });\n }\n\n dispatchEvent(element, EVENT_READY);\n }\n }, {\n key: \"unbuild\",\n value: function unbuild() {\n if (!this.ready) {\n return;\n }\n\n this.ready = false;\n this.unbind();\n this.resetPreview();\n this.cropper.parentNode.removeChild(this.cropper);\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 * Get the no conflict cropper class.\n * @returns {Cropper} The cropper class.\n */\n\n }], [{\n key: \"noConflict\",\n value: function noConflict() {\n window.Cropper = AnotherCropper;\n return Cropper;\n }\n /**\n * Change the default options.\n * @param {Object} options - The new default options.\n */\n\n }, {\n key: \"setDefaults\",\n value: function setDefaults(options) {\n assign(DEFAULTS, isPlainObject(options) && options);\n }\n }]);\n\n return Cropper;\n }();\n\n assign(Cropper.prototype, render, preview, events, handlers, change, methods);\n\n return Cropper;\n\n}));\n","function webpackEmptyContext(req) {\n\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\te.code = 'MODULE_NOT_FOUND';\n\tthrow e;\n}\nwebpackEmptyContext.keys = function() { return []; };\nwebpackEmptyContext.resolve = webpackEmptyContext;\nmodule.exports = webpackEmptyContext;\nwebpackEmptyContext.id = \"./node_modules/font-awesome sync \\\\.(otf|eot|svg|ttf|woff|woff2)$\";","/**\n * Add your global events here\n */\n\nmodule.exports = {\n AJAX: 'ajax-load',\n LOADED: 'load',\n SET_TARGET_UPDATE: 'set-target-update',\n RESTORE_FIELD: 'restore-field',\n FORM_INIT_BASICS: 'form-basics',\n FORM_INIT_STEPPED: 'form-init-stepped',\n FORM_INIT_VALIDATE: 'form-init-validate',\n FORM_INIT_VALIDATE_FIELD: 'form-init-validate-field',\n FORM_INIT_STORAGE: 'form-init-storage',\n FORM_VALIDATION_FAILED: 'form-validation-failed',\n FORM_STEPPED_NEW_STEP: 'form-new-step',\n FORM_STEPPED_FIRST_STEP: 'form-first-step',\n FORM_STEPPED_LAST_STEP: 'form-last-step',\n};\n","import $ from 'jquery';\n\nconst SpinnerUI = (($) => {\n class SpinnerUI {\n static show(callback) {\n $('#PageLoading').show(0, callback);\n }\n\n static hide(callback) {\n $('#PageLoading').hide('slow', callback);\n }\n }\n\n return SpinnerUI;\n})($);\n\nexport default SpinnerUI;\n","\"use strict\";\n\nimport $ from 'jquery';\n\nimport Events from './_events';\nimport SpinnerUI from './_ui.spinner';\n\nimport Cropper from 'cropperjs/dist/cropper.js'; //'cropperjs/src/index.js';\n\nconst CroppieUI = (($) => {\n\n const NAME = 'jsCroppieUI';\n const DATA_KEY = NAME;\n\n const G = window;\n const D = document;\n const DEFAULTS = {\n aspectRatio: 16 / 9,\n };\n\n class CroppieUI {\n\n constructor(element) {\n console.log(`Initializing: ${NAME}`);\n\n const ui = this;\n\n ui._element = element;\n\n ui.$el = $(ui._element);\n ui.$form = ui.$el.parents('form');\n ui.$input = ui.$el.find('input[type=\"file\"]');\n\n ui.$el.prepend('\"\"');\n ui.$image = ui.$el.find('img.cropping-image');\n ui.original_image = ui.$image[0];\n ui.mask_img = false;\n\n ui.name = ui.$input.attr('name');\n ui.width = ui.$input.data('width');\n ui.height = ui.$input.data('height');\n\n ui.options = DEFAULTS;\n ui.cropper = false;\n\n ui.$el.data(DATA_KEY, ui);\n\n ui.$el.prepend('
');\n ui.$removeBtns = ui.$el.find('.remove-masks');\n ui.masks = [];\n\n ui.$input.on('change', (e) => {\n const files = e.currentTarget.files;\n\n if (files && files.length) {\n ui.loadFile(files[0]);\n }\n });\n\n // actions\n ui.$el.append('Crop it');\n\n // crop\n ui.$el.find('.act-crop').on('click', (e) => {\n if (!ui.cropper) {\n return true;\n }\n\n e.preventDefault();\n\n const canvas = ui.cropper.getCroppedCanvas({\n width: ui.width,\n height: ui.height,\n });\n\n ui.$image[0].src = canvas.toDataURL();\n\n ui.original_image = new Image();\n ui.original_image.src = canvas.toDataURL();\n\n ui.cropper.destroy();\n ui.cropper = false;\n\n ui.$el.removeClass(`${NAME}-cropping`);\n ui.$el.addClass(`${NAME}-cropped`);\n });\n\n // mask\n ui.$el.find('.masks .mask-item').on('click', (e) => {\n e.preventDefault();\n ui.setMask($(e.currentTarget));\n });\n\n // submit\n ui.$form.on('submit', (e) => {\n if (!ui.cropper) {\n return true;\n }\n\n SpinnerUI.show();\n\n ui.saveImage();\n\n const canvas = ui.cropper.getCroppedCanvas({\n width: ui.width,\n height: ui.height,\n });\n\n ui.$image[0].src = canvas.toDataURL();\n canvas.toBlob((blob) => {\n ui.uploadFile(blob);\n });\n\n e.preventDefault();\n });\n }\n\n setMask = ($el) => {\n const ui = this;\n\n // add current mask\n if (ui.mask_img) {\n ui.addMask(ui.getMask());\n }\n\n // update image storage\n if (ui.cropper) {\n ui.cropper.destroy();\n ui.cropper = false;\n\n ui.saveImage();\n }\n\n // add new image\n ui.mask_img = new Image();\n ui.mask_img.src = $el.data('src');\n\n ui.mask_img.onload = () => {\n const img = ui.mask_img;\n\n ui.cropper = new Cropper(ui.$image[0], {\n aspectRatio: img.width / img.height,\n viewMode: 0,\n guides: true,\n center: true,\n highlight: true,\n cropBoxMovable: true,\n cropBoxResizable: true,\n movable: false,\n rotatable: false,\n zoomable: false,\n ready: () => {\n ui.$el.find('.cropper-face').css({\n 'background-color': 'transparent',\n 'background-image': `url(${ui.mask_img.src})`,\n 'opacity': '0.8',\n });\n ui.$el.find('.cropper-face').data('current-mask', $el);\n }\n });\n };\n }\n\n // returns mask ID\n addMask = (mask) => {\n const ui = this;\n const id = Date.now();\n\n ui.masks[id] = mask;\n\n // draw removable button\n let $btn = $('Delete mask #' + id + '');\n ui.$el.find('.masks').append($btn);\n\n /*ui.$removeBtns.prepend($btn);\n $btn = ui.$removeBtns.find('[data-id=\"' + id + '\"]');\n\n $btn.css({\n left: 100 * mask.left / ui.width + '%',\n top: 100 * mask.top / ui.width + '%',\n width: 100 * mask.width / ui.width + '%',\n height: 100 * mask.height / ui.height + '%',\n });*/\n $btn.on('click', (e) => {\n e.preventDefault();\n\n const $btn = $(e.currentTarget);\n const id = $btn.data('id');\n\n ui.removeMask(id);\n });\n return id;\n }\n\n removeMask = (id) => {\n const ui = this;\n delete ui.masks[id];\n ui.$el.find('.masks [data-id=\"' + id + '\"]').remove();\n\n ui.mask_img = false;\n ui.$el.find('.cropper-face').data('current-mask').click();\n }\n\n getMask = () => {\n const ui = this,\n canvas = document.createElement('canvas'),\n context = canvas.getContext('2d'),\n cropper = ui.cropper,\n maskWidth = cropper.getData().width,\n maskHeight = cropper.getData().height,\n maskTop = cropper.getData().y,\n maskLeft = cropper.getData().x,\n imageLeft = cropper.getImageData().left,\n imageTop = cropper.getImageData().top,\n imageAspect = cropper.getImageData().aspectRatio;\n\n canvas.width = ui.width;\n canvas.height = ui.height;\n context.imageSmoothingEnabled = true;\n\n return {\n img: ui.mask_img,\n left: maskLeft,\n top: maskTop,\n width: maskWidth,\n height: maskHeight\n };\n }\n\n saveImage = () => {\n const ui = this,\n canvas = document.createElement('canvas'),\n context = canvas.getContext('2d');\n\n canvas.width = ui.width;\n canvas.height = ui.height;\n context.imageSmoothingEnabled = true;\n\n context.drawImage(ui.original_image, 0, 0, ui.width, ui.height);\n\n for (let id in ui.masks) {\n const mask = ui.masks[id];\n console.log(mask);\n context.drawImage(mask.img, mask.left, mask.top, mask.width, mask.height);\n }\n\n ui.$image[0].src = canvas.toDataURL();\n\n return canvas;\n };\n\n loadFile = (file) => {\n const ui = this;\n\n if (/^image\\/\\w+/.test(file.type)) {\n\n ui.$image[0].src = URL.createObjectURL(file);\n\n if (ui.cropper) {\n ui.cropper.destroy();\n }\n\n ui.cropper = new Cropper(ui.$image[0], ui.options);\n ui.$input[0].value = null;\n\n ui.$el.addClass(`${NAME}-cropping`);\n } else {\n window.alert('Please choose an image file.');\n }\n };\n\n uploadFile = (blob) => {\n console.log('Initializing uploading sequence!');\n\n const ui = this;\n const data = new FormData(ui.$form[0]);\n\n data.delete('BackURL');\n data.delete(ui.name);\n data.append(ui.name, blob, ui.name + '-image.png');\n data.append('ajax', '1');\n\n $.ajax({\n url: ui.$form.attr('action'),\n data: data,\n processData: false,\n contentType: false,\n type: ui.$form.attr('method'),\n success: (data) => {\n console.log('UPLOAD SUCCESS!');\n\n SpinnerUI.hide();\n $(G).trigger(Events.AJAX);\n }\n });\n };\n\n static dispose() {\n console.log(`Destroying: ${NAME}`);\n }\n\n static _jQueryInterface() {\n return this.each((i, el) => {\n // attach functionality to element\n const $el = $(el);\n let data = $el.data(DATA_KEY);\n\n if (!data) {\n data = new CroppieUI(el);\n $el.data(DATA_KEY, data);\n }\n });\n }\n }\n\n // jQuery interface\n $.fn[NAME] = CroppieUI._jQueryInterface;\n $.fn[NAME].Constructor = CroppieUI;\n $.fn[NAME].noConflict = () => {\n $.fn[NAME] = JQUERY_NO_CONFLICT;\n return CroppieUI._jQueryInterface;\n };\n\n // auto-apply\n $(window).on(`${Events.AJAX} ${Events.LOADED}`, () => {\n $('.field.croppie').jsCroppieUI();\n });\n\n return CroppieUI;\n})($);\n\nexport default CroppieUI;\n","import 'app.scss';\nimport Events from './_events';\nimport Croppie from './_ui.form.croppie';\n\nfunction importAll(r) {\n return r.keys().map(r);\n}\n\nconst images = importAll(require.context('./img/', false, /\\.(png|jpe?g|svg)$/));\nconst fontAwesome = importAll(require.context('font-awesome', false, /\\.(otf|eot|svg|ttf|woff|woff2)$/));\n\nconst LayoutUI = (($) => {\n // Constants\n const W = window;\n const D = document;\n const $Body = $('body');\n\n const NAME = 'LayoutUI';\n\n class LayoutUI {\n static init() {\n const ui = this;\n ui.dispose();\n\n console.log(`Initializing: ${NAME}`);\n }\n\n static dispose() {\n console.log(`Destroying: ${NAME}`);\n }\n }\n\n $(W).on(`${Events.AJAX} ${Events.LOADED}`, () => {\n LayoutUI.init();\n });\n\n W.LayoutUI = LayoutUI;\n\n return LayoutUI;\n})($);\n\nexport default LayoutUI;\n","var map = {\n\t\"./bg.png\": \"./src/img/bg.png\",\n\t\"./photo1.png\": \"./src/img/photo1.png\",\n\t\"./photo2.jpg\": \"./src/img/photo2.jpg\",\n\t\"./photo3.svg\": \"./src/img/photo3.svg\"\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = \"./src/img sync \\\\.(png|jpe?g|svg)$\";","module.exports = \"../img/bg.png\";","module.exports = \"../img/photo1.png\";","module.exports = \"../img/photo2.jpg\";","module.exports = \"../fonts/photo3.svg\";","module.exports = jQuery;"],"sourceRoot":""} \ No newline at end of file diff --git a/dist/index.html b/dist/index.html index afd03fd..3b5ed8b 100644 --- a/dist/index.html +++ b/dist/index.html @@ -1 +1 @@ -JCROP

Ткни чтобы выбрать маску

Mask #1
Mask #2
\ No newline at end of file +JCROP

Select image mask

Mask #1
Mask #2
\ No newline at end of file diff --git a/src/_ui.form.croppie.js b/src/_ui.form.croppie.js index 9c72a55..f498d6c 100755 --- a/src/_ui.form.croppie.js +++ b/src/_ui.form.croppie.js @@ -58,7 +58,7 @@ const CroppieUI = (($) => { }); // actions - ui.$el.append('Обрезать'); + ui.$el.append('Crop it'); // crop ui.$el.find('.act-crop').on('click', (e) => { @@ -169,7 +169,7 @@ const CroppieUI = (($) => { ui.masks[id] = mask; // draw removable button - let $btn = $('Удалить #' + id + ''); + let $btn = $('Delete mask #' + id + ''); ui.$el.find('.masks').append($btn); /*ui.$removeBtns.prepend($btn); diff --git a/src/index.html b/src/index.html index 2a338d8..a21d75a 100644 --- a/src/index.html +++ b/src/index.html @@ -13,7 +13,7 @@
-

Ткни чтобы выбрать маску

+

Select image mask

Mask #1
@@ -21,7 +21,7 @@ Mask #2
- +
- +