UNPKG

fabric-warpvas

Version:

This JavaScript library helps you efficiently build image warping tools on Fabric.js

1 lines 243 kB
!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e((t="undefined"!=typeof globalThis?globalThis:t||self).fabricWarpvas={})}(this,(function(e){"use strict";function r(t,e,r){return(e=function(t){var e=function(t,e){if("object"!=typeof t||!t)return t;var r=t[Symbol.toPrimitive];if(void 0!==r){var i=r.call(t,e||"default");if("object"!=typeof i)return i;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===e?String:Number)(t)}(t,"string");return"symbol"==typeof e?e:e+""}(e))in t?Object.defineProperty(t,e,{value:r,enumerable:!0,configurable:!0,writable:!0}):t[e]=r,t}function i(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(t);e&&(i=i.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),r.push.apply(r,i)}return r}function n(t){for(var e=1;e<arguments.length;e++){var n=null!=arguments[e]?arguments[e]:{};e%2?i(Object(n),!0).forEach((function(e){r(t,e,n[e])})):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(n)):i(Object(n)).forEach((function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(n,e))}))}return t}function s(t,e){if(null==t)return{};var r,i,n=function(t,e){if(null==t)return{};var r={};for(var i in t)if({}.hasOwnProperty.call(t,i)){if(e.indexOf(i)>=0)continue;r[i]=t[i]}return r}(t,e);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(t);for(i=0;i<s.length;i++)r=s[i],e.indexOf(r)>=0||{}.propertyIsEnumerable.call(t,r)&&(n[r]=t[r])}return n}function o(t,e){return e||(e=t.slice(0)),Object.freeze(Object.defineProperties(t,{raw:{value:Object.freeze(e)}}))}let a=class{constructor(){r(this,"browserShadowBlurConstant",1),r(this,"DPI",96),r(this,"devicePixelRatio","undefined"!=typeof window?window.devicePixelRatio:1),r(this,"perfLimitSizeTotal",2097152),r(this,"maxCacheSideLimit",4096),r(this,"minCacheSideLimit",256),r(this,"disableStyleCopyPaste",!1),r(this,"enableGLFiltering",!0),r(this,"textureSize",4096),r(this,"forceGLPutImageData",!1),r(this,"cachesBoundsOfCurve",!1),r(this,"fontPaths",{}),r(this,"NUM_FRACTION_DIGITS",4)}};const c=new class extends a{constructor(t){super(),this.configure(t)}configure(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};Object.assign(this,t)}addFonts(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};this.fontPaths=n(n({},this.fontPaths),t)}removeFonts(){(arguments.length>0&&void 0!==arguments[0]?arguments[0]:[]).forEach((t=>{delete this.fontPaths[t]}))}clearFonts(){this.fontPaths={}}restoreDefaults(t){const e=new a,r=(null==t?void 0:t.reduce(((t,r)=>(t[r]=e[r],t)),{}))||e;this.configure(r)}},h=function(t){for(var e=arguments.length,r=new Array(e>1?e-1:0),i=1;i<e;i++)r[i-1]=arguments[i];return console[t]("fabric",...r)};let l=class extends Error{constructor(t,e){super("fabric: ".concat(t),e)}},u=class extends l{constructor(t){super("".concat(t," 'options.signal' is in 'aborted' state"))}},d=class{},g=class extends d{testPrecision(t,e){const r="precision ".concat(e," float;\nvoid main(){}"),i=t.createShader(t.FRAGMENT_SHADER);return!!i&&(t.shaderSource(i,r),t.compileShader(i),!!t.getShaderParameter(i,t.COMPILE_STATUS))}queryWebGL(t){const e=t.getContext("webgl");e&&(this.maxTextureSize=e.getParameter(e.MAX_TEXTURE_SIZE),this.GLPrecision=["highp","mediump","lowp"].find((t=>this.testPrecision(e,t))),e.getExtension("WEBGL_lose_context").loseContext(),h("log","WebGL: max texture size ".concat(this.maxTextureSize)))}isSupported(t){return!!this.maxTextureSize&&this.maxTextureSize>=t}};const f={};let p;const y=()=>p||(p={document:document,window:window,isTouchSupported:"ontouchstart"in window||"ontouchstart"in document||window&&window.navigator&&window.navigator.maxTouchPoints>0,WebGLProbe:new g,dispose(){},copyPasteData:f}),m=()=>y().document,x=()=>y().window,v=()=>{var t;return Math.max(null!==(t=c.devicePixelRatio)&&void 0!==t?t:x().devicePixelRatio,1)};const b=new class{constructor(){r(this,"charWidthsCache",{}),r(this,"boundsOfCurveCache",{})}getFontCache(t){let{fontFamily:e,fontStyle:r,fontWeight:i}=t;e=e.toLowerCase(),this.charWidthsCache[e]||(this.charWidthsCache[e]={});const n=this.charWidthsCache[e],s="".concat(r.toLowerCase(),"_").concat((i+"").toLowerCase());return n[s]||(n[s]={}),n[s]}clearFontCache(t){(t=(t||"").toLowerCase())?this.charWidthsCache[t]&&delete this.charWidthsCache[t]:this.charWidthsCache={}}limitDimsByArea(t){const{perfLimitSizeTotal:e}=c,r=Math.sqrt(e*t);return[Math.floor(r),Math.floor(e/r)]}};const _="6.6.5";function w(){}const C=Math.PI/2,O=2*Math.PI,S=Math.PI/180,T=Object.freeze([1,0,0,1,0,0]),j=.4477152502,E="center",k="left",P="top",M="right",A="none",R="moving",z="scaling",F="rotating",D="rotate",B="skewing",I="resizing",L="modifyPoly",X="modifyPath",Y="changed",V="scale",G="scaleX",W="scaleY",N="skewX",U="skewY",H="fill",q="stroke",$="modified",J="json",K="svg";const Z=new class{constructor(){this[J]=new Map,this[K]=new Map}has(t){return this[J].has(t)}getClass(t){const e=this[J].get(t);if(!e)throw new l("No class registered for ".concat(t));return e}setClass(t,e){e?this[J].set(e,t):(this[J].set(t.type,t),this[J].set(t.type.toLowerCase(),t))}getSVGClass(t){return this[K].get(t)}setSVGClass(t,e){this[K].set(null!=e?e:t.type.toLowerCase(),t)}},Q=new class extends Array{remove(t){const e=this.indexOf(t);e>-1&&this.splice(e,1)}cancelAll(){const t=this.splice(0);return t.forEach((t=>t.abort())),t}cancelByCanvas(t){if(!t)return[];const e=this.filter((e=>{var r;return e.target===t||"object"==typeof e.target&&(null===(r=e.target)||void 0===r?void 0:r.canvas)===t}));return e.forEach((t=>t.abort())),e}cancelByTarget(t){if(!t)return[];const e=this.filter((e=>e.target===t));return e.forEach((t=>t.abort())),e}};let tt=class{constructor(){r(this,"__eventListeners",{})}on(t,e){if(this.__eventListeners||(this.__eventListeners={}),"object"==typeof t)return Object.entries(t).forEach((t=>{let[e,r]=t;this.on(e,r)})),()=>this.off(t);if(e){const r=t;return this.__eventListeners[r]||(this.__eventListeners[r]=[]),this.__eventListeners[r].push(e),()=>this.off(r,e)}return()=>!1}once(t,e){if("object"==typeof t){const e=[];return Object.entries(t).forEach((t=>{let[r,i]=t;e.push(this.once(r,i))})),()=>e.forEach((t=>t()))}if(e){const r=this.on(t,(function(){for(var t=arguments.length,i=new Array(t),n=0;n<t;n++)i[n]=arguments[n];e.call(this,...i),r()}));return r}return()=>!1}_removeEventListener(t,e){if(this.__eventListeners[t])if(e){const r=this.__eventListeners[t],i=r.indexOf(e);i>-1&&r.splice(i,1)}else this.__eventListeners[t]=[]}off(t,e){if(this.__eventListeners)if(void 0===t)for(const t in this.__eventListeners)this._removeEventListener(t);else"object"==typeof t?Object.entries(t).forEach((t=>{let[e,r]=t;this._removeEventListener(e,r)})):this._removeEventListener(t,e)}fire(t,e){var r;if(!this.__eventListeners)return;const i=null===(r=this.__eventListeners[t])||void 0===r?void 0:r.concat();if(i)for(let t=0;t<i.length;t++)i[t].call(this,e||{})}};const et=(t,e)=>{const r=t.indexOf(e);return-1!==r&&t.splice(r,1),t},rt=t=>{if(0===t)return 1;switch(Math.abs(t)/C){case 1:case 3:return 0;case 2:return-1}return Math.cos(t)},it=t=>{if(0===t)return 0;const e=t/C,r=Math.sign(t);switch(e){case 1:return r;case 2:return 0;case 3:return-r}return Math.sin(t)};let nt=class t{constructor(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;"object"==typeof t?(this.x=t.x,this.y=t.y):(this.x=t,this.y=e)}add(e){return new t(this.x+e.x,this.y+e.y)}addEquals(t){return this.x+=t.x,this.y+=t.y,this}scalarAdd(e){return new t(this.x+e,this.y+e)}scalarAddEquals(t){return this.x+=t,this.y+=t,this}subtract(e){return new t(this.x-e.x,this.y-e.y)}subtractEquals(t){return this.x-=t.x,this.y-=t.y,this}scalarSubtract(e){return new t(this.x-e,this.y-e)}scalarSubtractEquals(t){return this.x-=t,this.y-=t,this}multiply(e){return new t(this.x*e.x,this.y*e.y)}scalarMultiply(e){return new t(this.x*e,this.y*e)}scalarMultiplyEquals(t){return this.x*=t,this.y*=t,this}divide(e){return new t(this.x/e.x,this.y/e.y)}scalarDivide(e){return new t(this.x/e,this.y/e)}scalarDivideEquals(t){return this.x/=t,this.y/=t,this}eq(t){return this.x===t.x&&this.y===t.y}lt(t){return this.x<t.x&&this.y<t.y}lte(t){return this.x<=t.x&&this.y<=t.y}gt(t){return this.x>t.x&&this.y>t.y}gte(t){return this.x>=t.x&&this.y>=t.y}lerp(e){let r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:.5;return r=Math.max(Math.min(1,r),0),new t(this.x+(e.x-this.x)*r,this.y+(e.y-this.y)*r)}distanceFrom(t){const e=this.x-t.x,r=this.y-t.y;return Math.sqrt(e*e+r*r)}midPointFrom(t){return this.lerp(t)}min(e){return new t(Math.min(this.x,e.x),Math.min(this.y,e.y))}max(e){return new t(Math.max(this.x,e.x),Math.max(this.y,e.y))}toString(){return"".concat(this.x,",").concat(this.y)}setXY(t,e){return this.x=t,this.y=e,this}setX(t){return this.x=t,this}setY(t){return this.y=t,this}setFromPoint(t){return this.x=t.x,this.y=t.y,this}swap(t){const e=this.x,r=this.y;this.x=t.x,this.y=t.y,t.x=e,t.y=r}clone(){return new t(this.x,this.y)}rotate(e){let r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:st;const i=it(e),n=rt(e),s=this.subtract(r);return new t(s.x*n-s.y*i,s.x*i+s.y*n).add(r)}transform(e){let r=arguments.length>1&&void 0!==arguments[1]&&arguments[1];return new t(e[0]*this.x+e[2]*this.y+(r?0:e[4]),e[1]*this.x+e[3]*this.y+(r?0:e[5]))}};const st=new nt(0,0);function ot(t){class e extends t{constructor(){super(...arguments),r(this,"_objects",[])}_onObjectAdded(t){}_onObjectRemoved(t){}_onStackOrderChanged(t){}add(){for(var t=arguments.length,e=new Array(t),r=0;r<t;r++)e[r]=arguments[r];const i=this._objects.push(...e);return e.forEach((t=>this._onObjectAdded(t))),i}insertAt(t){for(var e=arguments.length,r=new Array(e>1?e-1:0),i=1;i<e;i++)r[i-1]=arguments[i];return this._objects.splice(t,0,...r),r.forEach((t=>this._onObjectAdded(t))),this._objects.length}remove(){const t=this._objects,e=[];for(var r=arguments.length,i=new Array(r),n=0;n<r;n++)i[n]=arguments[n];return i.forEach((r=>{const i=t.indexOf(r);-1!==i&&(t.splice(i,1),e.push(r),this._onObjectRemoved(r))})),e}forEachObject(t){this.getObjects().forEach(((e,r,i)=>t(e,r,i)))}getObjects(){for(var t=arguments.length,e=new Array(t),r=0;r<t;r++)e[r]=arguments[r];return 0===e.length?[...this._objects]:this._objects.filter((t=>t.isType(...e)))}item(t){return this._objects[t]}isEmpty(){return 0===this._objects.length}size(){return this._objects.length}contains(t,r){return!!this._objects.includes(t)||!!r&&this._objects.some((r=>r instanceof e&&r.contains(t,!0)))}complexity(){return this._objects.reduce(((t,e)=>t+(e.complexity?e.complexity():0)),0)}sendObjectToBack(t){return!(!t||t===this._objects[0]||(et(this._objects,t),this._objects.unshift(t),this._onStackOrderChanged(t),0))}bringObjectToFront(t){return!(!t||t===this._objects[this._objects.length-1]||(et(this._objects,t),this._objects.push(t),this._onStackOrderChanged(t),0))}sendObjectBackwards(t,e){if(!t)return!1;const r=this._objects.indexOf(t);if(0!==r){const i=this.findNewLowerIndex(t,r,e);return et(this._objects,t),this._objects.splice(i,0,t),this._onStackOrderChanged(t),!0}return!1}bringObjectForward(t,e){if(!t)return!1;const r=this._objects.indexOf(t);if(r!==this._objects.length-1){const i=this.findNewUpperIndex(t,r,e);return et(this._objects,t),this._objects.splice(i,0,t),this._onStackOrderChanged(t),!0}return!1}moveObjectTo(t,e){return t!==this._objects[e]&&(et(this._objects,t),this._objects.splice(e,0,t),this._onStackOrderChanged(t),!0)}findNewLowerIndex(t,e,r){let i;if(r){i=e;for(let r=e-1;r>=0;--r)if(t.isOverlapping(this._objects[r])){i=r;break}}else i=e-1;return i}findNewUpperIndex(t,e,r){let i;if(r){i=e;for(let r=e+1;r<this._objects.length;++r)if(t.isOverlapping(this._objects[r])){i=r;break}}else i=e+1;return i}collectObjects(t){let{left:e,top:r,width:i,height:n}=t,{includeIntersecting:s=!0}=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};const o=[],a=new nt(e,r),c=a.add(new nt(i,n));for(let t=this._objects.length-1;t>=0;t--){const e=this._objects[t];e.selectable&&e.visible&&(s&&e.intersectsWithRect(a,c)||e.isContainedWithinRect(a,c)||s&&e.containsPoint(a)||s&&e.containsPoint(c))&&o.push(e)}return o}}return e}let at=class extends tt{_setOptions(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};for(const e in t)this.set(e,t[e])}_setObject(t){for(const e in t)this._set(e,t[e])}set(t,e){return"object"==typeof t?this._setObject(t):this._set(t,e),this}_set(t,e){this[t]=e}toggle(t){const e=this.get(t);return"boolean"==typeof e&&this.set(t,!e),this}get(t){return this[t]}};function ct(t){return x().requestAnimationFrame(t)}let ht=0;const lt=()=>ht++,ut=()=>{const t=m().createElement("canvas");if(!t||void 0===t.getContext)throw new l("Failed to create `canvas` element");return t},dt=t=>{const e=ut();return e.width=t.width,e.height=t.height,e},gt=(t,e,r)=>t.toDataURL("image/".concat(e),r),ft=(t,e,r)=>new Promise(((i,n)=>{t.toBlob(i,"image/".concat(e),r)})),pt=t=>t*S,yt=t=>t/S,mt=(t,e,r)=>new nt(t).transform(e,r),xt=t=>{const e=1/(t[0]*t[3]-t[1]*t[2]),r=[e*t[3],-e*t[1],-e*t[2],e*t[0],0,0],{x:i,y:n}=new nt(t[4],t[5]).transform(r,!0);return r[4]=-i,r[5]=-n,r},vt=(t,e,r)=>[t[0]*e[0]+t[2]*e[1],t[1]*e[0]+t[3]*e[1],t[0]*e[2]+t[2]*e[3],t[1]*e[2]+t[3]*e[3],r?0:t[0]*e[4]+t[2]*e[5]+t[4],r?0:t[1]*e[4]+t[3]*e[5]+t[5]],bt=(t,e)=>t.reduceRight(((t,r)=>r&&t?vt(r,t,e):r||t),void 0)||T.concat(),_t=t=>{let[e,r]=t;return Math.atan2(r,e)},wt=t=>{const e=_t(t),r=Math.pow(t[0],2)+Math.pow(t[1],2),i=Math.sqrt(r),n=(t[0]*t[3]-t[2]*t[1])/i,s=Math.atan2(t[0]*t[2]+t[1]*t[3],r);return{angle:yt(e),scaleX:i,scaleY:n,skewX:yt(s),skewY:0,translateX:t[4]||0,translateY:t[5]||0}},Ct=function(t){return[1,0,0,1,t,arguments.length>1&&void 0!==arguments[1]?arguments[1]:0]};function Ot(){let{angle:t=0}=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},{x:e=0,y:r=0}=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};const i=pt(t),n=rt(i),s=it(i);return[n,s,-s,n,e?e-(n*e-s*r):0,r?r-(s*e+n*r):0]}const St=function(t){return[t,0,0,arguments.length>1&&void 0!==arguments[1]?arguments[1]:t,0,0]},Tt=t=>Math.tan(pt(t)),jt=t=>[1,0,Tt(t),1,0,0],Et=t=>[1,Tt(t),0,1,0,0],kt=t=>{let{scaleX:e=1,scaleY:r=1,flipX:i=!1,flipY:n=!1,skewX:s=0,skewY:o=0}=t,a=St(i?-e:e,n?-r:r);return s&&(a=vt(a,jt(s),!0)),o&&(a=vt(a,Et(o),!0)),a},Pt=t=>{const{translateX:e=0,translateY:r=0,angle:i=0}=t;let n=Ct(e,r);i&&(n=vt(n,Ot({angle:i})));const s=kt(t);return(t=>t.every(((t,e)=>t===T[e])))(s)||(n=vt(n,s)),n},Mt=function(t){let{signal:e,crossOrigin:r=null}=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return new Promise((function(i,n){if(e&&e.aborted)return n(new u("loadImage"));const s=m().createElement("img");let o;e&&(o=function(t){s.src="",n(t)},e.addEventListener("abort",o,{once:!0}));const a=function(){s.onload=s.onerror=null,o&&(null==e||e.removeEventListener("abort",o)),i(s)};t?(s.onload=a,s.onerror=function(){o&&(null==e||e.removeEventListener("abort",o)),n(new l("Error loading ".concat(s.src)))},r&&(s.crossOrigin=r),s.src=t):a()}))},At=function(t){let{signal:e,reviver:r=w}=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return new Promise(((i,n)=>{const s=[];e&&e.addEventListener("abort",n,{once:!0}),Promise.all(t.map((t=>Z.getClass(t.type).fromObject(t,{signal:e}).then((e=>(r(t,e),s.push(e),e)))))).then(i).catch((t=>{s.forEach((t=>{t.dispose&&t.dispose()})),n(t)})).finally((()=>{e&&e.removeEventListener("abort",n)}))}))},Rt=function(t){let{signal:e}=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return new Promise(((r,i)=>{const n=[];e&&e.addEventListener("abort",i,{once:!0});const s=Object.values(t).map((t=>t&&t.type&&Z.has(t.type)?At([t],{signal:e}).then((t=>{let[e]=t;return n.push(e),e})):t)),o=Object.keys(t);Promise.all(s).then((t=>t.reduce(((t,e,r)=>(t[o[r]]=e,t)),{}))).then(r).catch((t=>{n.forEach((t=>{t.dispose&&t.dispose()})),i(t)})).finally((()=>{e&&e.removeEventListener("abort",i)}))}))},zt=function(t){return(arguments.length>1&&void 0!==arguments[1]?arguments[1]:[]).reduce(((e,r)=>(r in t&&(e[r]=t[r]),e)),{})},Ft=(t,e)=>Object.keys(t).reduce(((r,i)=>(e(t[i],i,t)&&(r[i]=t[i]),r)),{}),Dt=(t,e)=>parseFloat(Number(t).toFixed(e)),Bt=t=>"matrix("+t.map((t=>Dt(t,c.NUM_FRACTION_DIGITS))).join(" ")+")",It=t=>!!t&&void 0!==t.toLive,Lt=t=>!!t&&"function"==typeof t.toObject,Xt=t=>!!t&&void 0!==t.offsetX&&"source"in t;const Yt=t=>t.ownerDocument||null;function Vt(t){var e;const r=t&&Yt(t),i={left:0,top:0};if(!r)return i;const n=(null===(e=(t=>{var e;return(null===(e=t.ownerDocument)||void 0===e?void 0:e.defaultView)||null})(t))||void 0===e?void 0:e.getComputedStyle(t,null))||{};i.left+=parseInt(n.borderLeftWidth,10)||0,i.top+=parseInt(n.borderTopWidth,10)||0,i.left+=parseInt(n.paddingLeft,10)||0,i.top+=parseInt(n.paddingTop,10)||0;let s={left:0,top:0};const o=r.documentElement;void 0!==t.getBoundingClientRect&&(s=t.getBoundingClientRect());const a=function(t){const e=t&&Yt(t);let r=0,i=0;if(!t||!e)return{left:r,top:i};let n=t;const s=e.documentElement,o=e.body||{scrollLeft:0,scrollTop:0};for(;n&&(n.parentNode||n.host)&&(n=n.parentNode||n.host,n===e?(r=o.scrollLeft||s.scrollLeft||0,i=o.scrollTop||s.scrollTop||0):(r+=n.scrollLeft||0,i+=n.scrollTop||0),1!==n.nodeType||"fixed"!==n.style.position););return{left:r,top:i}}(t);return{left:s.left+a.left-(o.clientLeft||0)+i.left,top:s.top+a.top-(o.clientTop||0)+i.top}}let Gt=class{constructor(t){r(this,"_originalCanvasStyle",void 0),r(this,"lower",void 0);const e=this.createLowerCanvas(t);this.lower={el:e,ctx:e.getContext("2d")}}createLowerCanvas(t){const e=(t=>!!t&&void 0!==t.getContext)(t)?t:t&&m().getElementById(t)||ut();if(e.hasAttribute("data-fabric"))throw new l("Trying to initialize a canvas that has already been initialized. Did you forget to dispose the canvas?");return this._originalCanvasStyle=e.style.cssText,e.setAttribute("data-fabric","main"),e.classList.add("lower-canvas"),e}cleanupDOM(t){let{width:e,height:r}=t;const{el:i}=this.lower;i.classList.remove("lower-canvas"),i.removeAttribute("data-fabric"),i.setAttribute("width","".concat(e)),i.setAttribute("height","".concat(r)),i.style.cssText=this._originalCanvasStyle||"",this._originalCanvasStyle=void 0}setDimensions(t,e){const{el:r,ctx:i}=this.lower;!function(t,e,r){let{width:i,height:n}=r,s=arguments.length>3&&void 0!==arguments[3]?arguments[3]:1;t.width=i,t.height=n,s>1&&(t.setAttribute("width",(i*s).toString()),t.setAttribute("height",(n*s).toString()),e.scale(s,s))}(r,i,t,e)}setCSSDimensions(t){((t,e)=>{let{width:r,height:i}=e;r&&(t.style.width="number"==typeof r?"".concat(r,"px"):r),i&&(t.style.height="number"==typeof i?"".concat(i,"px"):i)})(this.lower.el,t)}calcOffset(){return Vt(this.lower.el)}dispose(){y().dispose(this.lower.el),delete this.lower}};const Wt={backgroundVpt:!0,backgroundColor:"",overlayVpt:!0,overlayColor:"",includeDefaultValues:!0,svgViewportTransformation:!0,renderOnAddRemove:!0,skipOffscreen:!0,enableRetinaScaling:!0,imageSmoothingEnabled:!0,controlsAboveOverlay:!1,allowTouchScrolling:!1,viewportTransform:[...T]};let Nt=class t extends(ot(at)){get lowerCanvasEl(){var t;return null===(t=this.elements.lower)||void 0===t?void 0:t.el}get contextContainer(){var t;return null===(t=this.elements.lower)||void 0===t?void 0:t.ctx}static getDefaults(){return t.ownDefaults}constructor(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};super(),Object.assign(this,this.constructor.getDefaults()),this.set(e),this.initElements(t),this._setDimensionsImpl({width:this.width||this.elements.lower.el.width||0,height:this.height||this.elements.lower.el.height||0}),this.skipControlsDrawing=!1,this.viewportTransform=[...this.viewportTransform],this.calcViewportBoundaries()}initElements(t){this.elements=new Gt(t)}add(){const t=super.add(...arguments);return arguments.length>0&&this.renderOnAddRemove&&this.requestRenderAll(),t}insertAt(t){for(var e=arguments.length,r=new Array(e>1?e-1:0),i=1;i<e;i++)r[i-1]=arguments[i];const n=super.insertAt(t,...r);return r.length>0&&this.renderOnAddRemove&&this.requestRenderAll(),n}remove(){const t=super.remove(...arguments);return t.length>0&&this.renderOnAddRemove&&this.requestRenderAll(),t}_onObjectAdded(t){t.canvas&&t.canvas!==this&&(h("warn","Canvas is trying to add an object that belongs to a different canvas.\nResulting to default behavior: removing object from previous canvas and adding to new canvas"),t.canvas.remove(t)),t._set("canvas",this),t.setCoords(),this.fire("object:added",{target:t}),t.fire("added",{target:this})}_onObjectRemoved(t){t._set("canvas",void 0),this.fire("object:removed",{target:t}),t.fire("removed",{target:this})}_onStackOrderChanged(){this.renderOnAddRemove&&this.requestRenderAll()}getRetinaScaling(){return this.enableRetinaScaling?v():1}calcOffset(){return this._offset=this.elements.calcOffset()}getWidth(){return this.width}getHeight(){return this.height}setWidth(t,e){return this.setDimensions({width:t},e)}setHeight(t,e){return this.setDimensions({height:t},e)}_setDimensionsImpl(t){let{cssOnly:e=!1,backstoreOnly:r=!1}=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(!e){const e=n({width:this.width,height:this.height},t);this.elements.setDimensions(e,this.getRetinaScaling()),this.hasLostContext=!0,this.width=e.width,this.height=e.height}r||this.elements.setCSSDimensions(t),this.calcOffset()}setDimensions(t,e){this._setDimensionsImpl(t,e),e&&e.cssOnly||this.requestRenderAll()}getZoom(){return this.viewportTransform[0]}setViewportTransform(t){this.viewportTransform=t,this.calcViewportBoundaries(),this.renderOnAddRemove&&this.requestRenderAll()}zoomToPoint(t,e){const r=t,i=[...this.viewportTransform],n=mt(t,xt(i));i[0]=e,i[3]=e;const s=mt(n,i);i[4]+=r.x-s.x,i[5]+=r.y-s.y,this.setViewportTransform(i)}setZoom(t){this.zoomToPoint(new nt(0,0),t)}absolutePan(t){const e=[...this.viewportTransform];return e[4]=-t.x,e[5]=-t.y,this.setViewportTransform(e)}relativePan(t){return this.absolutePan(new nt(-t.x-this.viewportTransform[4],-t.y-this.viewportTransform[5]))}getElement(){return this.elements.lower.el}clearContext(t){t.clearRect(0,0,this.width,this.height)}getContext(){return this.elements.lower.ctx}clear(){this.remove(...this.getObjects()),this.backgroundImage=void 0,this.overlayImage=void 0,this.backgroundColor="",this.overlayColor="",this.clearContext(this.getContext()),this.fire("canvas:cleared"),this.renderOnAddRemove&&this.requestRenderAll()}renderAll(){this.cancelRequestedRender(),this.destroyed||this.renderCanvas(this.getContext(),this._objects)}renderAndReset(){this.nextRenderHandle=0,this.renderAll()}requestRenderAll(){this.nextRenderHandle||this.disposed||this.destroyed||(this.nextRenderHandle=ct((()=>this.renderAndReset())))}calcViewportBoundaries(){const t=this.width,e=this.height,r=xt(this.viewportTransform),i=mt({x:0,y:0},r),n=mt({x:t,y:e},r),s=i.min(n),o=i.max(n);return this.vptCoords={tl:s,tr:new nt(o.x,s.y),bl:new nt(s.x,o.y),br:o}}cancelRequestedRender(){this.nextRenderHandle&&(function(t){x().cancelAnimationFrame(t)}(this.nextRenderHandle),this.nextRenderHandle=0)}drawControls(t){}renderCanvas(t,e){if(this.destroyed)return;const r=this.viewportTransform,i=this.clipPath;this.calcViewportBoundaries(),this.clearContext(t),t.imageSmoothingEnabled=this.imageSmoothingEnabled,t.patternQuality="best",this.fire("before:render",{ctx:t}),this._renderBackground(t),t.save(),t.transform(r[0],r[1],r[2],r[3],r[4],r[5]),this._renderObjects(t,e),t.restore(),this.controlsAboveOverlay||this.skipControlsDrawing||this.drawControls(t),i&&(i._set("canvas",this),i.shouldCache(),i._transformDone=!0,i.renderCache({forClipping:!0}),this.drawClipPathOnCanvas(t,i)),this._renderOverlay(t),this.controlsAboveOverlay&&!this.skipControlsDrawing&&this.drawControls(t),this.fire("after:render",{ctx:t}),this.__cleanupTask&&(this.__cleanupTask(),this.__cleanupTask=void 0)}drawClipPathOnCanvas(t,e){const r=this.viewportTransform;t.save(),t.transform(...r),t.globalCompositeOperation="destination-in",e.transform(t),t.scale(1/e.zoomX,1/e.zoomY),t.drawImage(e._cacheCanvas,-e.cacheTranslationX,-e.cacheTranslationY),t.restore()}_renderObjects(t,e){for(let r=0,i=e.length;r<i;++r)e[r]&&e[r].render(t)}_renderBackgroundOrOverlay(t,e){const r=this["".concat(e,"Color")],i=this["".concat(e,"Image")],n=this.viewportTransform,s=this["".concat(e,"Vpt")];if(!r&&!i)return;const o=It(r);if(r){if(t.save(),t.beginPath(),t.moveTo(0,0),t.lineTo(this.width,0),t.lineTo(this.width,this.height),t.lineTo(0,this.height),t.closePath(),t.fillStyle=o?r.toLive(t):r,s&&t.transform(...n),o){t.transform(1,0,0,1,r.offsetX||0,r.offsetY||0);const e=r.gradientTransform||r.patternTransform;e&&t.transform(...e)}t.fill(),t.restore()}if(i){t.save();const{skipOffscreen:e}=this;this.skipOffscreen=s,s&&t.transform(...n),i.render(t),this.skipOffscreen=e,t.restore()}}_renderBackground(t){this._renderBackgroundOrOverlay(t,"background")}_renderOverlay(t){this._renderBackgroundOrOverlay(t,"overlay")}getCenter(){return{top:this.height/2,left:this.width/2}}getCenterPoint(){return new nt(this.width/2,this.height/2)}centerObjectH(t){return this._centerObject(t,new nt(this.getCenterPoint().x,t.getCenterPoint().y))}centerObjectV(t){return this._centerObject(t,new nt(t.getCenterPoint().x,this.getCenterPoint().y))}centerObject(t){return this._centerObject(t,this.getCenterPoint())}viewportCenterObject(t){return this._centerObject(t,this.getVpCenter())}viewportCenterObjectH(t){return this._centerObject(t,new nt(this.getVpCenter().x,t.getCenterPoint().y))}viewportCenterObjectV(t){return this._centerObject(t,new nt(t.getCenterPoint().x,this.getVpCenter().y))}getVpCenter(){return mt(this.getCenterPoint(),xt(this.viewportTransform))}_centerObject(t,e){t.setXY(e,E,E),t.setCoords(),this.renderOnAddRemove&&this.requestRenderAll()}toDatalessJSON(t){return this.toDatalessObject(t)}toObject(t){return this._toObjectMethod("toObject",t)}toJSON(){return this.toObject()}toDatalessObject(t){return this._toObjectMethod("toDatalessObject",t)}_toObjectMethod(t,e){const r=this.clipPath,i=r&&!r.excludeFromExport?this._toObject(r,t,e):null;return n(n(n({version:_},zt(this,e)),{},{objects:this._objects.filter((t=>!t.excludeFromExport)).map((r=>this._toObject(r,t,e)))},this.__serializeBgOverlay(t,e)),i?{clipPath:i}:null)}_toObject(t,e,r){let i;this.includeDefaultValues||(i=t.includeDefaultValues,t.includeDefaultValues=!1);const n=t[e](r);return this.includeDefaultValues||(t.includeDefaultValues=!!i),n}__serializeBgOverlay(t,e){const r={},i=this.backgroundImage,n=this.overlayImage,s=this.backgroundColor,o=this.overlayColor;return It(s)?s.excludeFromExport||(r.background=s.toObject(e)):s&&(r.background=s),It(o)?o.excludeFromExport||(r.overlay=o.toObject(e)):o&&(r.overlay=o),i&&!i.excludeFromExport&&(r.backgroundImage=this._toObject(i,t,e)),n&&!n.excludeFromExport&&(r.overlayImage=this._toObject(n,t,e)),r}toSVG(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},e=arguments.length>1?arguments[1]:void 0;t.reviver=e;const r=[];return this._setSVGPreamble(r,t),this._setSVGHeader(r,t),this.clipPath&&r.push('<g clip-path="url(#'.concat(this.clipPath.clipPathId,')" >\n')),this._setSVGBgOverlayColor(r,"background"),this._setSVGBgOverlayImage(r,"backgroundImage",e),this._setSVGObjects(r,e),this.clipPath&&r.push("</g>\n"),this._setSVGBgOverlayColor(r,"overlay"),this._setSVGBgOverlayImage(r,"overlayImage",e),r.push("</svg>"),r.join("")}_setSVGPreamble(t,e){e.suppressPreamble||t.push('<?xml version="1.0" encoding="',e.encoding||"UTF-8",'" standalone="no" ?>\n','<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" ','"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">\n')}_setSVGHeader(t,e){const r=e.width||"".concat(this.width),i=e.height||"".concat(this.height),n=c.NUM_FRACTION_DIGITS,s=e.viewBox;let o;if(s)o='viewBox="'.concat(s.x," ").concat(s.y," ").concat(s.width," ").concat(s.height,'" ');else if(this.svgViewportTransformation){const t=this.viewportTransform;o='viewBox="'.concat(Dt(-t[4]/t[0],n)," ").concat(Dt(-t[5]/t[3],n)," ").concat(Dt(this.width/t[0],n)," ").concat(Dt(this.height/t[3],n),'" ')}else o='viewBox="0 0 '.concat(this.width," ").concat(this.height,'" ');t.push("<svg ",'xmlns="http://www.w3.org/2000/svg" ','xmlns:xlink="http://www.w3.org/1999/xlink" ','version="1.1" ','width="',r,'" ','height="',i,'" ',o,'xml:space="preserve">\n',"<desc>Created with Fabric.js ",_,"</desc>\n","<defs>\n",this.createSVGFontFacesMarkup(),this.createSVGRefElementsMarkup(),this.createSVGClipPathMarkup(e),"</defs>\n")}createSVGClipPathMarkup(t){const e=this.clipPath;return e?(e.clipPathId="CLIPPATH_".concat(lt()),'<clipPath id="'.concat(e.clipPathId,'" >\n').concat(e.toClipPathSVG(t.reviver),"</clipPath>\n")):""}createSVGRefElementsMarkup(){return["background","overlay"].map((t=>{const e=this["".concat(t,"Color")];if(It(e)){const r=this["".concat(t,"Vpt")],i=this.viewportTransform,n={isType:()=>!1,width:this.width/(r?i[0]:1),height:this.height/(r?i[3]:1)};return e.toSVG(n,{additionalTransform:r?Bt(i):""})}})).join("")}createSVGFontFacesMarkup(){const t=[],e={},r=c.fontPaths;this._objects.forEach((function e(r){t.push(r),(t=>!!t&&Array.isArray(t._objects))(r)&&r._objects.forEach(e)})),t.forEach((t=>{if(!(t=>!!t&&"function"==typeof t._renderText)(t))return;const{styles:i,fontFamily:n}=t;!e[n]&&r[n]&&(e[n]=!0,i&&Object.values(i).forEach((t=>{Object.values(t).forEach((t=>{let{fontFamily:i=""}=t;!e[i]&&r[i]&&(e[i]=!0)}))})))}));const i=Object.keys(e).map((t=>"\t\t@font-face {\n\t\t\tfont-family: '".concat(t,"';\n\t\t\tsrc: url('").concat(r[t],"');\n\t\t}\n"))).join("");return i?'\t<style type="text/css"><![CDATA[\n'.concat(i,"]]></style>\n"):""}_setSVGObjects(t,e){this.forEachObject((r=>{r.excludeFromExport||this._setSVGObject(t,r,e)}))}_setSVGObject(t,e,r){t.push(e.toSVG(r))}_setSVGBgOverlayImage(t,e,r){const i=this[e];i&&!i.excludeFromExport&&i.toSVG&&t.push(i.toSVG(r))}_setSVGBgOverlayColor(t,e){const r=this["".concat(e,"Color")];if(r)if(It(r)){const i=r.repeat||"",n=this.width,s=this.height,o=this["".concat(e,"Vpt")]?Bt(xt(this.viewportTransform)):"";t.push('<rect transform="'.concat(o," translate(").concat(n/2,",").concat(s/2,')" x="').concat(r.offsetX-n/2,'" y="').concat(r.offsetY-s/2,'" width="').concat("repeat-y"!==i&&"no-repeat"!==i||!Xt(r)?n:r.source.width,'" height="').concat("repeat-x"!==i&&"no-repeat"!==i||!Xt(r)?s:r.source.height,'" fill="url(#SVGID_').concat(r.id,')"></rect>\n'))}else t.push('<rect x="0" y="0" width="100%" height="100%" ','fill="',r,'"',"></rect>\n")}loadFromJSON(t,e){let{signal:r}=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};if(!t)return Promise.reject(new l("`json` is undefined"));const i="string"==typeof t?JSON.parse(t):t,{objects:n=[],backgroundImage:s,background:o,overlayImage:a,overlay:c,clipPath:h}=i,u=this.renderOnAddRemove;return this.renderOnAddRemove=!1,Promise.all([At(n,{reviver:e,signal:r}),Rt({backgroundImage:s,backgroundColor:o,overlayImage:a,overlayColor:c,clipPath:h},{signal:r})]).then((t=>{let[e,r]=t;return this.clear(),this.add(...e),this.set(i),this.set(r),this.renderOnAddRemove=u,this}))}clone(t){const e=this.toObject(t);return this.cloneWithoutData().loadFromJSON(e)}cloneWithoutData(){const t=dt(this);return new this.constructor(t)}toDataURL(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};const{format:e="png",quality:r=1,multiplier:i=1,enableRetinaScaling:n=!1}=t,s=i*(n?this.getRetinaScaling():1);return gt(this.toCanvasElement(s,t),e,r)}toBlob(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};const{format:e="png",quality:r=1,multiplier:i=1,enableRetinaScaling:n=!1}=t,s=i*(n?this.getRetinaScaling():1);return ft(this.toCanvasElement(s,t),e,r)}toCanvasElement(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:1,{width:e,height:r,left:i,top:n,filter:s}=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};const o=(e||this.width)*t,a=(r||this.height)*t,c=this.getZoom(),h=this.width,l=this.height,u=this.skipControlsDrawing,d=c*t,g=this.viewportTransform,f=[d,0,0,d,(g[4]-(i||0))*t,(g[5]-(n||0))*t],p=this.enableRetinaScaling,y=dt({width:o,height:a}),m=s?this._objects.filter((t=>s(t))):this._objects;return this.enableRetinaScaling=!1,this.viewportTransform=f,this.width=o,this.height=a,this.skipControlsDrawing=!0,this.calcViewportBoundaries(),this.renderCanvas(y.getContext("2d"),m),this.viewportTransform=g,this.width=h,this.height=l,this.calcViewportBoundaries(),this.enableRetinaScaling=p,this.skipControlsDrawing=u,y}dispose(){return!this.disposed&&this.elements.cleanupDOM({width:this.width,height:this.height}),Q.cancelByCanvas(this),this.disposed=!0,new Promise(((t,e)=>{const r=()=>{this.destroy(),t(!0)};r.kill=e,this.__cleanupTask&&this.__cleanupTask.kill("aborted"),this.destroyed?t(!1):this.nextRenderHandle?this.__cleanupTask=r:r()}))}destroy(){this.destroyed=!0,this.cancelRequestedRender(),this.forEachObject((t=>t.dispose())),this._objects=[],this.backgroundImage&&this.backgroundImage.dispose(),this.backgroundImage=void 0,this.overlayImage&&this.overlayImage.dispose(),this.overlayImage=void 0,this.elements.dispose()}toString(){return"#<Canvas (".concat(this.complexity(),"): { objects: ").concat(this._objects.length," }>")}};r(Nt,"ownDefaults",Wt);const Ut=t=>{let e=0,r=0,i=0,n=0;for(let s=0,o=t.length;s<o;s++){const{x:o,y:a}=t[s];(o>i||!s)&&(i=o),(o<e||!s)&&(e=o),(a>n||!s)&&(n=a),(a<r||!s)&&(r=a)}return{left:e,top:r,width:i-e,height:n-r}},Ht=["translateX","translateY","scaleX","scaleY"],qt=(t,e)=>{const r=wt(e),{translateX:i,translateY:n,scaleX:o,scaleY:a}=r,c=s(r,Ht),h=new nt(i,n);t.flipX=!1,t.flipY=!1,Object.assign(t,c),t.set({scaleX:o,scaleY:a}),t.setPositionByOrigin(h,E,E)},$t=(t,e,r)=>{const i=t/2,n=e/2,s=[new nt(-i,-n),new nt(i,-n),new nt(-i,n),new nt(i,n)].map((t=>t.transform(r))),o=Ut(s);return new nt(o.width,o.height)},Jt=function(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:T;return vt(xt(arguments.length>1&&void 0!==arguments[1]?arguments[1]:T),t)},Kt={left:-.5,top:-.5,center:0,bottom:.5,right:.5},Zt=t=>"string"==typeof t?Kt[t]:t-.5,Qt="not-allowed";function te(t){return.5-Zt(t)}const ee=(t,e)=>t[e];function re(t,e){const r=t.getTotalAngle()+yt(Math.atan2(e.y,e.x))+360;return Math.round(r%360/45)}function ie(t,e,r,i,n){var s;let{target:o,corner:a}=t;const c=o.controls[a],h=(null===(s=o.canvas)||void 0===s?void 0:s.getZoom())||1,l=o.padding/h,u=function(t,e,r,i){const n=t.getRelativeCenterPoint(),s=void 0!==r&&void 0!==i?t.translateToGivenOrigin(n,E,E,r,i):new nt(t.left,t.top);return(t.angle?e.rotate(-pt(t.angle),n):e).subtract(s)}(o,new nt(i,n),e,r);return u.x>=l&&(u.x-=l),u.x<=-l&&(u.x+=l),u.y>=l&&(u.y-=l),u.y<=l&&(u.y+=l),u.x-=c.offsetX,u.y-=c.offsetY,u}const ne={aliceblue:"#F0F8FF",antiquewhite:"#FAEBD7",aqua:"#0FF",aquamarine:"#7FFFD4",azure:"#F0FFFF",beige:"#F5F5DC",bisque:"#FFE4C4",black:"#000",blanchedalmond:"#FFEBCD",blue:"#00F",blueviolet:"#8A2BE2",brown:"#A52A2A",burlywood:"#DEB887",cadetblue:"#5F9EA0",chartreuse:"#7FFF00",chocolate:"#D2691E",coral:"#FF7F50",cornflowerblue:"#6495ED",cornsilk:"#FFF8DC",crimson:"#DC143C",cyan:"#0FF",darkblue:"#00008B",darkcyan:"#008B8B",darkgoldenrod:"#B8860B",darkgray:"#A9A9A9",darkgrey:"#A9A9A9",darkgreen:"#006400",darkkhaki:"#BDB76B",darkmagenta:"#8B008B",darkolivegreen:"#556B2F",darkorange:"#FF8C00",darkorchid:"#9932CC",darkred:"#8B0000",darksalmon:"#E9967A",darkseagreen:"#8FBC8F",darkslateblue:"#483D8B",darkslategray:"#2F4F4F",darkslategrey:"#2F4F4F",darkturquoise:"#00CED1",darkviolet:"#9400D3",deeppink:"#FF1493",deepskyblue:"#00BFFF",dimgray:"#696969",dimgrey:"#696969",dodgerblue:"#1E90FF",firebrick:"#B22222",floralwhite:"#FFFAF0",forestgreen:"#228B22",fuchsia:"#F0F",gainsboro:"#DCDCDC",ghostwhite:"#F8F8FF",gold:"#FFD700",goldenrod:"#DAA520",gray:"#808080",grey:"#808080",green:"#008000",greenyellow:"#ADFF2F",honeydew:"#F0FFF0",hotpink:"#FF69B4",indianred:"#CD5C5C",indigo:"#4B0082",ivory:"#FFFFF0",khaki:"#F0E68C",lavender:"#E6E6FA",lavenderblush:"#FFF0F5",lawngreen:"#7CFC00",lemonchiffon:"#FFFACD",lightblue:"#ADD8E6",lightcoral:"#F08080",lightcyan:"#E0FFFF",lightgoldenrodyellow:"#FAFAD2",lightgray:"#D3D3D3",lightgrey:"#D3D3D3",lightgreen:"#90EE90",lightpink:"#FFB6C1",lightsalmon:"#FFA07A",lightseagreen:"#20B2AA",lightskyblue:"#87CEFA",lightslategray:"#789",lightslategrey:"#789",lightsteelblue:"#B0C4DE",lightyellow:"#FFFFE0",lime:"#0F0",limegreen:"#32CD32",linen:"#FAF0E6",magenta:"#F0F",maroon:"#800000",mediumaquamarine:"#66CDAA",mediumblue:"#0000CD",mediumorchid:"#BA55D3",mediumpurple:"#9370DB",mediumseagreen:"#3CB371",mediumslateblue:"#7B68EE",mediumspringgreen:"#00FA9A",mediumturquoise:"#48D1CC",mediumvioletred:"#C71585",midnightblue:"#191970",mintcream:"#F5FFFA",mistyrose:"#FFE4E1",moccasin:"#FFE4B5",navajowhite:"#FFDEAD",navy:"#000080",oldlace:"#FDF5E6",olive:"#808000",olivedrab:"#6B8E23",orange:"#FFA500",orangered:"#FF4500",orchid:"#DA70D6",palegoldenrod:"#EEE8AA",palegreen:"#98FB98",paleturquoise:"#AFEEEE",palevioletred:"#DB7093",papayawhip:"#FFEFD5",peachpuff:"#FFDAB9",peru:"#CD853F",pink:"#FFC0CB",plum:"#DDA0DD",powderblue:"#B0E0E6",purple:"#800080",rebeccapurple:"#639",red:"#F00",rosybrown:"#BC8F8F",royalblue:"#4169E1",saddlebrown:"#8B4513",salmon:"#FA8072",sandybrown:"#F4A460",seagreen:"#2E8B57",seashell:"#FFF5EE",sienna:"#A0522D",silver:"#C0C0C0",skyblue:"#87CEEB",slateblue:"#6A5ACD",slategray:"#708090",slategrey:"#708090",snow:"#FFFAFA",springgreen:"#00FF7F",steelblue:"#4682B4",tan:"#D2B48C",teal:"#008080",thistle:"#D8BFD8",tomato:"#FF6347",turquoise:"#40E0D0",violet:"#EE82EE",wheat:"#F5DEB3",white:"#FFF",whitesmoke:"#F5F5F5",yellow:"#FF0",yellowgreen:"#9ACD32"},se=(t,e,r)=>(r<0&&(r+=1),r>1&&(r-=1),r<1/6?t+6*(e-t)*r:r<.5?e:r<2/3?t+(e-t)*(2/3-r)*6:t),oe=(t,e,r,i)=>{t/=255,e/=255,r/=255;const n=Math.max(t,e,r),s=Math.min(t,e,r);let o,a;const c=(n+s)/2;if(n===s)o=a=0;else{const i=n-s;switch(a=c>.5?i/(2-n-s):i/(n+s),n){case t:o=(e-r)/i+(e<r?6:0);break;case e:o=(r-t)/i+2;break;case r:o=(t-e)/i+4}o/=6}return[Math.round(360*o),Math.round(100*a),Math.round(100*c),i]},ae=function(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"1";return parseFloat(t)/(t.endsWith("%")?100:1)},ce=t=>Math.min(Math.round(t),255).toString(16).toUpperCase().padStart(2,"0"),he=t=>{let[e,r,i,n=1]=t;const s=Math.round(.3*e+.59*r+.11*i);return[s,s,s,n]};let le=class t{constructor(e){if(r(this,"isUnrecognised",!1),e)if(e instanceof t)this.setSource([...e._source]);else if(Array.isArray(e)){const[t,r,i,n=1]=e;this.setSource([t,r,i,n])}else this.setSource(this._tryParsingColor(e));else this.setSource([0,0,0,1])}_tryParsingColor(e){return(e=e.toLowerCase())in ne&&(e=ne[e]),"transparent"===e?[255,255,255,0]:t.sourceFromHex(e)||t.sourceFromRgb(e)||t.sourceFromHsl(e)||(this.isUnrecognised=!0)&&[0,0,0,1]}getSource(){return this._source}setSource(t){this._source=t}toRgb(){const[t,e,r]=this.getSource();return"rgb(".concat(t,",").concat(e,",").concat(r,")")}toRgba(){return"rgba(".concat(this.getSource().join(","),")")}toHsl(){const[t,e,r]=oe(...this.getSource());return"hsl(".concat(t,",").concat(e,"%,").concat(r,"%)")}toHsla(){const[t,e,r,i]=oe(...this.getSource());return"hsla(".concat(t,",").concat(e,"%,").concat(r,"%,").concat(i,")")}toHex(){return this.toHexa().slice(0,6)}toHexa(){const[t,e,r,i]=this.getSource();return"".concat(ce(t)).concat(ce(e)).concat(ce(r)).concat(ce(Math.round(255*i)))}getAlpha(){return this.getSource()[3]}setAlpha(t){return this._source[3]=t,this}toGrayscale(){return this.setSource(he(this.getSource())),this}toBlackWhite(t){const[e,,,r]=he(this.getSource()),i=e<(t||127)?0:255;return this.setSource([i,i,i,r]),this}overlayWith(e){e instanceof t||(e=new t(e));const r=this.getSource(),i=e.getSource(),[n,s,o]=r.map(((t,e)=>Math.round(.5*t+.5*i[e])));return this.setSource([n,s,o,r[3]]),this}static fromRgb(e){return t.fromRgba(e)}static fromRgba(e){return new t(t.sourceFromRgb(e))}static sourceFromRgb(t){const e=t.match(/^rgba?\(\s*(\d{0,3}(?:\.\d+)?%?)\s*[\s|,]\s*(\d{0,3}(?:\.\d+)?%?)\s*[\s|,]\s*(\d{0,3}(?:\.\d+)?%?)\s*(?:\s*[,/]\s*(\d{0,3}(?:\.\d+)?%?)\s*)?\)$/i);if(e){const[t,r,i]=e.slice(1,4).map((t=>{const e=parseFloat(t);return t.endsWith("%")?Math.round(2.55*e):e}));return[t,r,i,ae(e[4])]}}static fromHsl(e){return t.fromHsla(e)}static fromHsla(e){return new t(t.sourceFromHsl(e))}static sourceFromHsl(e){const r=e.match(/^hsla?\(\s*([+-]?\d{0,3}(?:\.\d+)?(?:deg|turn|rad)?)\s*[\s|,]\s*(\d{0,3}(?:\.\d+)?%?)\s*[\s|,]\s*(\d{0,3}(?:\.\d+)?%?)\s*(?:\s*[,/]\s*(\d*(?:\.\d+)?%?)\s*)?\)$/i);if(!r)return;const i=(t.parseAngletoDegrees(r[1])%360+360)%360/360,n=parseFloat(r[2])/100,s=parseFloat(r[3])/100;let o,a,c;if(0===n)o=a=c=s;else{const t=s<=.5?s*(n+1):s+n-s*n,e=2*s-t;o=se(e,t,i+1/3),a=se(e,t,i),c=se(e,t,i-1/3)}return[Math.round(255*o),Math.round(255*a),Math.round(255*c),ae(r[4])]}static fromHex(e){return new t(t.sourceFromHex(e))}static sourceFromHex(t){if(t.match(/^#?(([0-9a-f]){3,4}|([0-9a-f]{2}){3,4})$/i)){const e=t.slice(t.indexOf("#")+1);let r;r=e.length<=4?e.split("").map((t=>t+t)):e.match(/.{2}/g);const[i,n,s,o=255]=r.map((t=>parseInt(t,16)));return[i,n,s,o/255]}}static parseAngletoDegrees(t){const e=t.toLowerCase(),r=parseFloat(e);return e.includes("rad")?yt(r):e.includes("turn")?360*r:r}};const ue=function(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:16;const r=/\D{0,2}$/.exec(t),i=parseFloat(t),n=c.DPI;switch(null==r?void 0:r[0]){case"mm":return i*n/25.4;case"cm":return i*n/2.54;case"in":return i*n;case"pt":return i*n/72;case"pc":return i*n/72*12;case"em":return i*e;default:return i}},de=function(t,e){let r,i,n=!(arguments.length>2&&void 0!==arguments[2])||arguments[2];if(e)if(e.toLive)r="url(#SVGID_".concat(e.id,")");else{const t=new le(e),n=t.getAlpha();r=t.toRgb(),1!==n&&(i=n.toString())}else r="none";return n?"".concat(t,": ").concat(r,"; ").concat(i?"".concat(t,"-opacity: ").concat(i,"; "):""):"".concat(t,'="').concat(r,'" ').concat(i?"".concat(t,'-opacity="').concat(i,'" '):"")};function ge(t){return new RegExp("^("+t.join("|")+")\\b","i")}var fe;const pe=String.raw(fe||(fe=o(["(?:[-+]?(?:d*.d+|d+.?)(?:[eE][-+]?d+)?)"],["(?:[-+]?(?:\\d*\\.\\d+|\\d+\\.?)(?:[eE][-+]?\\d+)?)"]))),ye=new RegExp("(normal|italic)?\\s*(normal|small-caps)?\\s*(normal|bold|bolder|lighter|100|200|300|400|500|600|700|800|900)?\\s*("+pe+"(?:px|cm|mm|em|pt|pc|in)*)(?:\\/(normal|"+pe+"))?\\s+(.*)"),me={cx:k,x:k,r:"radius",cy:P,y:P,display:"visible",visibility:"visible",transform:"transformMatrix","fill-opacity":"fillOpacity","fill-rule":"fillRule","font-family":"fontFamily","font-size":"fontSize","font-style":"fontStyle","font-weight":"fontWeight","letter-spacing":"charSpacing","paint-order":"paintFirst","stroke-dasharray":"strokeDashArray","stroke-dashoffset":"strokeDashOffset","stroke-linecap":"strokeLineCap","stroke-linejoin":"strokeLineJoin","stroke-miterlimit":"strokeMiterLimit","stroke-opacity":"strokeOpacity","stroke-width":"strokeWidth","text-decoration":"textDecoration","text-anchor":"textAnchor",opacity:"opacity","clip-path":"clipPath","clip-rule":"clipRule","vector-effect":"strokeUniform","image-rendering":"imageSmoothing"},xe="font-size",ve="clip-path";ge(["path","circle","polygon","polyline","ellipse","rect","line","image","text"]),ge(["symbol","image","marker","pattern","view","svg"]);const be=ge(["symbol","g","a","svg","clipPath","defs"]);new nt(1,0),new nt;const _e=(t,e)=>new nt(e).subtract(t),we="(-?\\d+(?:\\.\\d*)?(?:px)?(?:\\s?|$))?",Ce=new RegExp("(?:\\s|^)"+we+we+"("+pe+"?(?:px)?)?(?:\\s?|$)(?:$|\\s)");let Oe=class t{constructor(e){const r="string"==typeof e?t.parseShadow(e):e;Object.assign(this,t.ownDefaults,r),this.id=lt()}static parseShadow(t){const e=t.trim(),[,r=0,i=0,n=0]=(Ce.exec(e)||[]).map((t=>parseFloat(t)||0));return{color:(e.replace(Ce,"")||"rgb(0,0,0)").trim(),offsetX:r,offsetY:i,blur:n}}toString(){return[this.offsetX,this.offsetY,this.blur,this.color].join("px ")}toSVG(t){const e=((t,e)=>t.rotate(e))(new nt(this.offsetX,this.offsetY),pt(-t.angle)),r=new le(this.color);let i=40,n=40;return t.width&&t.height&&(i=100*Dt((Math.abs(e.x)+this.blur)/t.width,c.NUM_FRACTION_DIGITS)+20,n=100*Dt((Math.abs(e.y)+this.blur)/t.height,c.NUM_FRACTION_DIGITS)+20),t.flipX&&(e.x*=-1),t.flipY&&(e.y*=-1),'<filter id="SVGID_'.concat(this.id,'" y="-').concat(n,'%" height="').concat(100+2*n,'%" x="-').concat(i,'%" width="').concat(100+2*i,'%" >\n\t<feGaussianBlur in="SourceAlpha" stdDeviation="').concat(Dt(this.blur?this.blur/2:0,c.NUM_FRACTION_DIGITS),'"></feGaussianBlur>\n\t<feOffset dx="').concat(Dt(e.x,c.NUM_FRACTION_DIGITS),'" dy="').concat(Dt(e.y,c.NUM_FRACTION_DIGITS),'" result="oBlur" ></feOffset>\n\t<feFlood flood-color="').concat(r.toRgb(),'" flood-opacity="').concat(r.getAlpha(),'"/>\n\t<feComposite in2="oBlur" operator="in" />\n\t<feMerge>\n\t\t<feMergeNode></feMergeNode>\n\t\t<feMergeNode in="SourceGraphic"></feMergeNode>\n\t</feMerge>\n</filter>\n')}toObject(){const e={color:this.color,blur:this.blur,offsetX:this.offsetX,offsetY:this.offsetY,affectStroke:this.affectStroke,nonScaling:this.nonScaling,type:this.constructor.type},r=t.ownDefaults;return this.includeDefaultValues?e:Ft(e,((t,e)=>t!==r[e]))}static async fromObject(t){return new this(t)}};r(Oe,"ownDefaults",{color:"rgb(0,0,0)",blur:0,offsetX:0,offsetY:0,affectStroke:!1,includeDefaultValues:!0,nonScaling:!1}),r(Oe,"type","shadow"),Z.setClass(Oe,"shadow");const Se=(t,e,r)=>Math.max(t,Math.min(e,r)),Te=[P,k,G,W,"flipX","flipY","originX","originY","angle","opacity","globalCompositeOperation","shadow","visible",N,U],je=[H,q,"strokeWidth","strokeDashArray","width","height","paintFirst","strokeUniform","strokeLineCap","strokeDashOffset","strokeLineJoin","strokeMiterLimit","backgroundColor","clipPath"],Ee={top:0,left:0,width:0,height:0,angle:0,flipX:!1,flipY:!1,scaleX:1,scaleY:1,minScaleLimit:0,skewX:0,skewY:0,originX:k,originY:P,strokeWidth:1,strokeUniform:!1,padding:0,opacity:1,paintFirst:H,fill:"rgb(0,0,0)",fillRule:"nonzero",stroke:null,strokeDashArray:null,strokeDashOffset:0,strokeLineCap:"butt",strokeLineJoin:"miter",strokeMiterLimit:4,globalCompositeOperation:"source-over",backgroundColor:"",shadow:null,visible:!0,includeDefaultValues:!0,excludeFromExport:!1,objectCaching:!0,clipPath:void 0,inverted:!1,absolutePositioned:!1,centeredRotation:!0,centeredScaling:!1,dirty:!0},ke=(t,e,r,i)=>-r*Math.cos(t/i*C)+r+e,Pe=()=>!1;let Me=class{constructor(t){let{startValue:e,byValue:i,duration:n=500,delay:s=0,easing:o=ke,onStart:a=w,onChange:c=w,onComplete:h=w,abort:l=Pe,target:u}=t;r(this,"_state","pending"),r(this,"durationProgress",0),r(this,"valueProgress",0),this.tick=this.tick.bind(this),this.duration=n,this.delay=s,this.easing=o,this._onStart=a,this._onChange=c,this._onComplete=h,this._abort=l,this.target=u,this.startValue=e,this.byValue=i,this.value=this.startValue,this.endValue=Object.freeze(this.calculate(this.duration).value)}get state(){return this._state}isDone(){return"aborted"===this._state||"completed"===this._state}start(){const t=t=>{"pending"===this._state&&(this.startTime=t||+new Date,this._state="running",this._onStart(),this.tick(this.startTime))};this.register(),this.delay>0?setTimeout((()=>ct(t)),this.delay):ct(t)}tick(t){const e=(t||+new Date)-this.startTime,r=Math.min(e,this.duration);this.durationProgress=r/this.duration;const{value:i,valueProgress:n}=this.calculate(r);this.value=Object.freeze(i),this.valueProgress=n,"aborted"!==this._state&&(this._abort(this.value,this.valueProgress,this.durationProgress)?(this._state="aborted",this.unregister()):e>=this.duration?(this.durationProgress=this.valueProgress=1,this._onChange(this.endValue,this.valueProgress,this.durationProgress),this._state="completed",this._onComplete(this.endValue,this.valueProgress,this.durationProgress),this.unregister()):(this._onChange(this.value,this.valueProgress,this.durationProgress),ct(this.tick)))}register(){Q.push(this)}unregister(){Q.remove(this)}abort(){this._state="aborted",this.unregister()}};const Ae=["startValue","endValue"];let Re=class extends Me{constructor(t){let{startValue:e=0,endValue:r=100}=t;super(n(n({},s(t,Ae)),{},{startValue:e,byValue:r-e}))}calculate(t){const e=this.easing(t,this.startValue,this.byValue,this.duration);return{value:e,valueProgress:Math.abs((e-this.startValue)/this.byValue)}}};const ze=["startValue","endValue"];let Fe=class extends Me{constructor(t){let{startValue:e=[0],endValue:r=[100]}=t;super(n(n({},s(t,ze)),{},{startValue:e,byValue:r.map(((t,r)=>t-e[r]))}))}calculate(t){const e=this.startValue.map(((e,r)=>this.easing(t,e,this.byValue[r],this.duration,r)));return{value:e,valueProgress:Math.abs((e[0]-this.startValue[0])/this.byValue[0])}}};const De=["startValue","endValue","easing","onChange","onComplete","abort"],Be=(t,e,r,i)=>e+r*(1-Math.cos(t/i*C)),Ie=t=>t&&((e,r,i)=>t(new le(e).toRgba(),r,i));let Le=class extends Me{constructor(t){let{startValue:e,endValue:r,easing:i=Be,onChange:o,onComplete:a,abort:c}=t,h=s(t,De);const l=new le(e).getSource(),u=new le(r).getSource();super(n(n({},h),{},{startValue:l,byValue:u.map(((t,e)=>t-l[e])),easing:i,onChange:Ie(o),onComplete:Ie(a),abort:Ie(c)}))}calculate(t){const[e,r,i,n]=this.startValue.map(((e,r)=>this.easing(t,e,this.byValue[r],this.duration,r))),s=[...[e,r,i].map(Math.round),Se(0,n,1)];return{value:s,valueProgress:s.map(((t,e)=>0!==this.byValue[e]?Math.abs((t-this.startValue[e])/this.byValue[e]):0)).find((t=>0!==t))||0}}};let Xe=class t{constructor(t){this.status=t,this.points=[]}includes(t){return this.points.some((e=>e.eq(t)))}append(){for(var t=arguments.length,e=new Array(t),r=0;r<t;r++)e[r]=arguments[r];return this.points=this.points.concat(e.filter((t=>!this.includes(t)))),this}static isPointContained(t,e,r){let i=arguments.length>3&&void 0!==arguments[3]&&arguments[3];if(e.eq(r))return t.eq(e);if(e.x===r.x)return t.x===e.x&&(i||t.y>=Math.min(e.y,r.y)&&t.y<=Math.max(e.y,r.y));if(e.y===r.y)return t.y