From 919f95a0a06b770d4a8523255a0785dde8859470 Mon Sep 17 00:00:00 2001 From: kangax Date: Wed, 20 Mar 2013 10:28:35 +0100 Subject: [PATCH] Move collection-related methods to fabric.Collection, shared by fabric.Canvas and fabric.Group. --- build.js | 1 + dist/all.js | 342 +++++++++++++++++-------------------- dist/all.min.js | 12 +- dist/all.min.js.gz | Bin 46954 -> 46990 bytes src/collection.mixin.js | 145 ++++++++++++++++ src/group.class.js | 99 +---------- src/static_canvas.class.js | 98 +---------- test/unit/group.js | 21 ++- 8 files changed, 342 insertions(+), 376 deletions(-) create mode 100644 src/collection.mixin.js diff --git a/build.js b/build.js index 5a758890..27d28672 100644 --- a/build.js +++ b/build.js @@ -92,6 +92,7 @@ var filesToInclude = [ 'src/log.js', 'src/observable.mixin.js', + 'src/collection.mixin.js', 'src/util/misc.js', 'src/util/lang_array.js', diff --git a/dist/all.js b/dist/all.js index 27289847..0b95e2be 100644 --- a/dist/all.js +++ b/dist/all.js @@ -1866,6 +1866,151 @@ fabric.Observable.off = fabric.Observable.stopObserving; * @type function */ fabric.Observable.trigger = fabric.Observable.fire; +fabric.Collection = { + + /** + * Adds objects to collection, then renders canvas (if `renderOnAddition` is not `false`) + * Objects should be instances of (or inherit from) fabric.Object + * @method add + * @param [...] Zero or more fabric instances + * @chainable + */ + add: function () { + this._objects.push.apply(this._objects, arguments); + for (var i = arguments.length; i--; ) { + this._onObjectAdded(arguments[i]); + } + this.renderOnAddition && this.renderAll(); + return this; + }, + + /** + * Inserts an object into collection at specified index and renders canvas + * An object should be an instance of (or inherit from) fabric.Object + * @method insertAt + * @param object {Object} Object to insert + * @param index {Number} index to insert object at + * @param nonSplicing {Boolean} when `true`, no splicing (shifting) of objects occurs + * @chainable + */ + insertAt: function (object, index, nonSplicing) { + var objects = this.getObjects(); + if (nonSplicing) { + objects[index] = object; + } + else { + objects.splice(index, 0, object); + } + this._onObjectAdded(object); + this.renderOnAddition && this.renderAll(); + return this; + }, + + /** + * Removes an object from a group + * @method remove + * @param {Object} object + * @return {fabric.Group} thisArg + * @chainable + */ + remove: function(object) { + + var objects = this.getObjects(); + var index = objects.indexOf(object); + + // only call onObjectRemoved if an object was actually removed + if (index !== -1) { + objects.splice(index, 1); + this._onObjectRemoved(object); + } + + this.renderAll && this.renderAll(); + return object; + }, + + /** + * Executes given function for each object in this group + * @method forEachObject + * @param {Function} callback + * Callback invoked with current object as first argument, + * index - as second and an array of all objects - as third. + * Iteration happens in reverse order (for performance reasons). + * Callback is invoked in a context of Global Object (e.g. `window`) + * when no `context` argument is given + * + * @param {Object} context Context (aka thisObject) + * @chainable + */ + forEachObject: function(callback, context) { + var objects = this.getObjects(), + i = objects.length; + while (i--) { + callback.call(context, objects[i], i, objects); + } + return this; + }, + + /** + * Returns object at specified index + * @method item + * @param {Number} index + * @return {fabric.Object} + */ + item: function (index) { + return this.getObjects()[index]; + }, + + /** + * Returns true if collection contains no objects + * @method isEmpty + * @return {Boolean} true if collection is empty + */ + isEmpty: function () { + return this.getObjects().length === 0; + }, + + /** + * Returns a size of a collection (i.e: length of an array containing its objects) + * @return {Number} Collection size + */ + size: function() { + return this.getObjects().length; + }, + + /** + * Returns true if collection contains an object + * @method contains + * @param {Object} object Object to check against + * @return {Boolean} `true` if collection contains an object + */ + contains: function(object) { + return this.getObjects().indexOf(object) > -1; + }, + + /** + * Returns number representation of a collection complexity + * @method complexity + * @return {Number} complexity + */ + complexity: function () { + return this.getObjects().reduce(function (memo, current) { + memo += current.complexity ? current.complexity() : 0; + return memo; + }, 0); + }, + + /** + * Makes all of the collection objects grayscale (i.e. calling `toGrayscale` on them) + * @method toGrayscale + * @return {fabric.Group} thisArg + * @chainable + */ + toGrayscale: function() { + return this.forEachObject(function(obj) { + obj.toGrayscale(); + }); + } +}; (function() { var sqrt = Math.sqrt, @@ -5901,6 +6046,7 @@ fabric.Shadow = fabric.util.createClass(/** @scope fabric.Shadow.prototype */ { }; extend(fabric.StaticCanvas.prototype, fabric.Observable); + extend(fabric.StaticCanvas.prototype, fabric.Collection); extend(fabric.StaticCanvas.prototype, /** @scope fabric.StaticCanvas.prototype */ { @@ -6311,28 +6457,11 @@ fabric.Shadow = fabric.util.createClass(/** @scope fabric.Shadow.prototype */ { } }, - /** - * Adds objects to canvas, then renders canvas (if `renderOnAddition` is not `false`). - * Objects should be instances of (or inherit from) fabric.Object - * @method add - * @param [...] Zero or more fabric instances - * @return {fabric.Canvas} thisArg - * @chainable - */ - add: function () { - this._objects.push.apply(this._objects, arguments); - for (var i = arguments.length; i--; ) { - this._initObject(arguments[i]); - } - this.renderOnAddition && this.renderAll(); - return this; - }, - /** * @private * @method _initObject */ - _initObject: function(obj) { + _onObjectAdded: function(obj) { this.stateful && obj.setupState(); obj.setCoords(); obj.canvas = this; @@ -6341,25 +6470,10 @@ fabric.Shadow = fabric.util.createClass(/** @scope fabric.Shadow.prototype */ { }, /** - * Inserts an object to canvas at specified index and renders canvas. - * An object should be an instance of (or inherit from) fabric.Object - * @method insertAt - * @param object {Object} Object to insert - * @param index {Number} index to insert object at - * @param nonSplicing {Boolean} when `true`, no splicing (shifting) of objects occurs - * @return {fabric.Canvas} thisArg - * @chainable + * @method private */ - insertAt: function (object, index, nonSplicing) { - if (nonSplicing) { - this._objects[index] = object; - } - else { - this._objects.splice(index, 0, object); - } - this._initObject(object); - this.renderOnAddition && this.renderAll(); - return this; + _onObjectRemoved: function(obj) { + this.fire('object:removed', { target: obj }); }, /** @@ -6893,15 +7007,6 @@ fabric.Shadow = fabric.util.createClass(/** @scope fabric.Shadow.prototype */ { return markup.join(''); }, - /** - * Returns true if canvas contains no objects - * @method isEmpty - * @return {Boolean} true if canvas is empty - */ - isEmpty: function () { - return this._objects.length === 0; - }, - /** * Removes an object from canvas and returns it * @method remove @@ -6916,17 +7021,7 @@ fabric.Shadow = fabric.util.createClass(/** @scope fabric.Shadow.prototype */ { this.fire('selection:cleared'); } - var objects = this._objects; - var index = objects.indexOf(object); - - // removing any object should fire "objct:removed" events - if (index !== -1) { - objects.splice(index,1); - this.fire('object:removed', { target: object }); - } - - this.renderAll(); - return object; + return fabric.Collection.remove.call(this, object); }, /** @@ -7021,42 +7116,6 @@ fabric.Shadow = fabric.util.createClass(/** @scope fabric.Shadow.prototype */ { return this.renderAll && this.renderAll(); }, - /** - * Returns object at specified index - * @method item - * @param {Number} index - * @return {fabric.Object} - */ - item: function (index) { - return this.getObjects()[index]; - }, - - /** - * Returns number representation of an instance complexity - * @method complexity - * @return {Number} complexity - */ - complexity: function () { - return this.getObjects().reduce(function (memo, current) { - memo += current.complexity ? current.complexity() : 0; - return memo; - }, 0); - }, - - /** - * Iterates over all objects, invoking callback for each one of them - * @method forEachObject - * @return {fabric.Canvas} thisArg - */ - forEachObject: function(callback, context) { - var objects = this.getObjects(), - i = objects.length; - while (i--) { - callback.call(context, objects[i], i, objects); - } - return this; - }, - /** * Clears a canvas element and removes all event handlers. * @method dispose @@ -14377,8 +14436,7 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, /** @scope fabric.Stati extend = fabric.util.object.extend, min = fabric.util.array.min, max = fabric.util.array.max, - invoke = fabric.util.array.invoke, - removeFromArray = fabric.util.removeFromArray; + invoke = fabric.util.array.invoke; if (fabric.Group) { return; @@ -14401,7 +14459,7 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, /** @scope fabric.Stati * @class Group * @extends fabric.Object */ - fabric.Group = fabric.util.createClass(fabric.Object, /** @scope fabric.Group.prototype */ { + fabric.Group = fabric.util.createClass(fabric.Object, fabric.Collection, /** @scope fabric.Group.prototype */ { /** * Type of an object @@ -14513,8 +14571,7 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, /** @scope fabric.Stati */ removeWithUpdate: function(object) { this._restoreObjectsState(); - removeFromArray(this._objects, object); - delete object.group; + this.remove(object); object.setActive(false); this._calcBounds(); this._updateObjectsCoords(); @@ -14522,37 +14579,17 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, /** @scope fabric.Stati }, /** - * Adds an object to a group - * @method add - * @param {Object} object - * @return {fabric.Group} thisArg - * @chainable + * @private */ - add: function(object) { - this._objects.push(object); + _onObjectAdded: function(object) { object.group = this; - return this; }, /** - * Removes an object from a group - * @method remove - * @param {Object} object - * @return {fabric.Group} thisArg - * @chainable + * @private */ - remove: function(object) { - removeFromArray(this._objects, object); + _onObjectRemoved: function(object) { delete object.group; - return this; - }, - - /** - * Returns a size of a group (i.e: length of an array containing its objects) - * @return {Number} Group size - */ - size: function() { - return this.getObjects().length; }, /** @@ -14590,16 +14627,6 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, /** @scope fabric.Stati } }, - /** - * Returns true if a group contains an object - * @method contains - * @param {Object} object Object to check against - * @return {Boolean} `true` if group contains an object - */ - contains: function(object) { - return this._objects.indexOf(object) > -1; - }, - /** * Returns object representation of an instance * @method toObject @@ -14656,28 +14683,6 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, /** @scope fabric.Stati this.setCoords(); }, - /** - * Returns object from the group at the specified index - * @method item - * @param index {Number} index of item to get - * @return {fabric.Object} - */ - item: function(index) { - return this.getObjects()[index]; - }, - - /** - * Returns complexity of an instance - * @method complexity - * @return {Number} complexity - */ - complexity: function() { - return this.getObjects().reduce(function(total, object) { - total += (typeof object.complexity === 'function') ? object.complexity() : 0; - return total; - }, 0); - }, - /** * Retores original state of each of group objects (original state is that which was before group was created). * @private @@ -14781,23 +14786,6 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, /** @scope fabric.Stati return this; }, - /** - * Executes given function for each object in this group - * @method forEachObject - * @param {Function} callback - * Callback invoked with current object as first argument, - * index - as second and an array of all objects - as third. - * Iteration happens in reverse order (for performance reasons). - * Callback is invoked in a context of Global Object (e.g. `window`) - * when no `context` argument is given - * - * @param {Object} context Context (aka thisObject) - * - * @return {fabric.Group} thisArg - * @chainable - */ - forEachObject: fabric.StaticCanvas.prototype.forEachObject, - /** * @private * @method _setOpacityIfSame @@ -14869,20 +14857,6 @@ fabric.util.object.extend(fabric.StaticCanvas.prototype, /** @scope fabric.Stati centerY + halfHeight > point.y; }, - /** - * Makes all of this group's objects grayscale (i.e. calling `toGrayscale` on them) - * @method toGrayscale - * @return {fabric.Group} thisArg - * @chainable - */ - toGrayscale: function() { - var i = this._objects.length; - while (i--) { - this._objects[i].toGrayscale(); - } - return this; - }, - /** * Returns svg representation of an instance * @method toSVG diff --git a/dist/all.min.js b/dist/all.min.js index 4ef48343..35e94fa6 100644 --- a/dist/all.min.js +++ b/dist/all.min.js @@ -1,6 +1,6 @@ -/* build: `node build.js modules=ALL exclude=gestures` *//*! Fabric.js Copyright 2008-2013, Printio (Juriy Zaytsev, Maxim Chernyak) */var fabric=fabric||{version:"1.1.2"};typeof exports!="undefined"&&(exports.fabric=fabric),typeof document!="undefined"&&typeof window!="undefined"?(fabric.document=document,fabric.window=window):(fabric.document=require("jsdom").jsdom(""),fabric.window=fabric.document.createWindow()),fabric.isTouchSupported="ontouchstart"in fabric.document.documentElement,fabric.isLikelyNode=typeof Buffer!="undefined"&&typeof window=="undefined";var Cufon=function(){function r(e){var t=this.face=e.face;this.glyphs=e.glyphs,this.w=e.w,this.baseSize=parseInt(t["units-per-em"],10),this.family=t["font-family"].toLowerCase(),this.weight=t["font-weight"],this.style=t["font-style"]||"normal",this.viewBox=function(){var e=t.bbox.split(/\s+/),n={minX:parseInt(e[0],10),minY:parseInt(e[1],10),maxX:parseInt(e[2],10),maxY:parseInt(e[3],10)};return n.width=n.maxX-n.minX,n.height=n.maxY-n.minY,n.toString=function(){return[this.minX,this.minY,this.width,this.height].join(" ")},n}(),this.ascent=-parseInt(t.ascent,10),this.descent=-parseInt(t.descent,10),this.height=-this.ascent+this.descent}function i(){var e={},t={oblique:"italic",italic:"oblique"};this.add=function(t){(e[t.style]||(e[t.style]={}))[t.weight]=t},this.get=function(n,r){var i=e[n]||e[t[n]]||e.normal||e.italic||e.oblique;if(!i)return null;r={normal:400,bold:700}[r]||parseInt(r,10);if(i[r])return i[r];var s={1:1,99:0}[r%100],o=[],u,a;s===undefined&&(s=r>400),r==500&&(r=400);for(var f in i){f=parseInt(f,10);if(!u||fa)a=f;o.push(f)}return ra&&(r=a),o.sort(function(e,t){return(s?e>r&&t>r?et:et:e=i.length+e?r():setTimeout(arguments.callee,10)}),function(t){e?t():n.push(t)}}(),supports:function(e,t){var n=fabric.document.createElement("span").style;return n[e]===undefined?!1:(n[e]=t,n[e]===t)},textAlign:function(e,t,n,r){return t.get("textAlign")=="right"?n>0&&(e=" "+e):nk&&(k=N),A.push(N),N=0;continue}var O=t.glyphs[T[b]]||t.missingGlyph;if(!O)continue;N+=C=Number(O.w||t.w)+h}A.push(N),N=Math.max(k,N);var M=[];for(var b=A.length;b--;)M[b]=N-A[b];if(C===null)return null;d+=l.width-C,m+=l.minX;var _,D;if(f)_=u,D=u.firstChild;else{_=fabric.document.createElement("span"),_.className="cufon cufon-canvas",_.alt=n,D=fabric.document.createElement("canvas"),_.appendChild(D);if(i.printable){var P=fabric.document.createElement("span");P.className="cufon-alt",P.appendChild(fabric.document.createTextNode(n)),_.appendChild(P)}}var H=_.style,B=D.style||{},j=c.convert(l.height-p+v),F=Math.ceil(j),I=F/j;D.width=Math.ceil(c.convert(N+d-m)*I),D.height=F,p+=l.minY,B.top=Math.round(c.convert(p-t.ascent))+"px",B.left=Math.round(c.convert(m))+"px";var q=Math.ceil(c.convert(N*I)),R=q+"px",U=c.convert(t.height),z=(i.lineHeight-1)*c.convert(-t.ascent/5)*(L-1);Cufon.textOptions.width=q,Cufon.textOptions.height=U*L+z,Cufon.textOptions.lines=L,Cufon.textOptions.totalLineHeight=z,e?(H.width=R,H.height=U+"px"):(H.paddingLeft=R,H.paddingBottom=U-1+"px");var W=Cufon.textOptions.context||D.getContext("2d"),X=F/l.height;Cufon.textOptions.fontAscent=t.ascent*X,Cufon.textOptions.boundaries=null;for(var V=Cufon.textOptions.shadowOffsets,b=y.length;b--;)V[b]=[y[b][0]*X,y[b][1]*X];W.save(),W.scale(X,X),W.translate(-m-1/X*D.width/2+(Cufon.fonts[t.family].offsetLeft||0),-p-Cufon.textOptions.height/X/2+(Cufon.fonts[t.family].offsetTop||0)),W.lineWidth=t.face["underline-thickness"],W.save();var J=Cufon.getTextDecoration(i),K=i.fontStyle==="italic";W.save(),Q();if(g)for(var b=0,w=g.length;b.cufon-vml-canvas{text-indent:0}@media screen{cvml\\:shape,cvml\\:shadow{behavior:url(#default#VML);display:block;antialias:true;position:absolute}.cufon-vml-canvas{position:absolute;text-align:left}.cufon-vml{display:inline-block;position:relative;vertical-align:middle}.cufon-vml .cufon-alt{position:absolute;left:-10000in;font-size:1px}a .cufon-vml{cursor:pointer}}@media print{.cufon-vml *{display:none}.cufon-vml .cufon-alt{display:inline}}'),function(e,t,i,s,o,u,a){var f=t===null;f&&(t=o.alt);var l=e.viewBox,c=i.computedFontSize||(i.computedFontSize=new Cufon.CSS.Size(n(u,i.get("fontSize"))+"px",e.baseSize)),h=i.computedLSpacing;h==undefined&&(h=i.get("letterSpacing"),i.computedLSpacing=h=h=="normal"?0:~~c.convertFrom(r(u,h)));var p,d;if(f)p=o,d=o.firstChild;else{p=fabric.document.createElement("span"),p.className="cufon cufon-vml",p.alt=t,d=fabric.document.createElement("span"),d.className="cufon-vml-canvas",p.appendChild(d);if(s.printable){var v=fabric.document.createElement("span");v.className="cufon-alt",v.appendChild(fabric.document.createTextNode(t)),p.appendChild(v)}a||p.appendChild(fabric.document.createElement("cvml:shape"))}var m=p.style,g=d.style,y=c.convert(l.height),b=Math.ceil(y),w=b/y,E=l.minX,S=l.minY;g.height=b,g.top=Math.round(c.convert(S-e.ascent)),g.left=Math.round(c.convert(E)),m.height=c.convert(e.height)+"px";var x=Cufon.getTextDecoration(s),T=i.get("color"),N=Cufon.CSS.textTransform(t,i).split(""),C=0,k=0,L=null,A,O,M=s.textShadow;for(var _=0,D=0,P=N.length;_r?n:i-t;s(u(f,a,l,n));if(i>r||o()){e.onComplete&&e.onComplete();return}h(c)}()}function p(e,t,n){if(e){var r=new Image;r.onload=function(){t&&t.call(n,r),r=r.onload=null},r.src=e}else t&&t.call(n,e)}function d(e,t){function n(e){return fabric[fabric.util.string.camelize(fabric.util.string.capitalize(e))]}function r(){++s===o&&t&&t(i)}var i=[],s=0,o=e.length;e.forEach(function(e,t){if(!e.type)return;var s=n(e.type);s.async?s.fromObject(e,function(e,n){n||(i[t]=e),r()}):(i[t]=s.fromObject(e),r())})}function v(e,t,n){var r;if(e.length>1){var i=e.some(function(e){return e.type==="text"});i?(r=new fabric.Group([],t),e.reverse().forEach(function(e){e.cx&&(e.left=e.cx),e.cy&&(e.top=e.cy),r.addWithUpdate(e)})):r=new fabric.PathGroup(e,t)}else r=e[0];return typeof n!="undefined"&&r.setSourcePath(n),r}function m(e,t,n){if(n&&Object.prototype.toString.call(n)==="[object Array]")for(var r=0,i=n.length;rr)r+=u[p++%h],r>l&&(r=l),n[d?"lineTo":"moveTo"](r,0),d=!d;n.restore()}function y(e){return e||(e=fabric.document.createElement("canvas")),!e.getContext&&typeof G_vmlCanvasManager!="undefined"&&G_vmlCanvasManager.initElement(e),e}function b(e){var t=e.prototype;for(var n=t.stateProperties.length;n--;){var r=t.stateProperties[n],i=r.charAt(0).toUpperCase()+r.slice(1),s="set"+i,o="get"+i;t[o]||(t[o]=function(e){return new Function('return this.get("'+e+'")')}(r)),t[s]||(t[s]=function(e){return new Function("value",'return this.set("'+e+'", value)')}(r))}}function w(e,t){t.save(),t.beginPath(),e.clipTo(t),t.clip()}var e=Math.sqrt,t=Math.atan2;fabric.util={};var i=Math.PI/180,c=fabric.window.requestAnimationFrame||fabric.window.webkitRequestAnimationFrame||fabric.window.mozRequestAnimationFrame||fabric.window.oRequestAnimationFrame||fabric.window.msRequestAnimationFrame||function(e){fabric.window.setTimeout(e,1e3/60)},h=function(){return c.apply(fabric.window,arguments)};fabric.util.removeFromArray=n,fabric.util.degreesToRadians=s,fabric.util.radiansToDegrees=o,fabric.util.rotatePoint=u,fabric.util.toFixed=a,fabric.util.getRandomInt=r,fabric.util.falseFunction=f,fabric.util.animate=l,fabric.util.requestAnimFrame=h,fabric.util.loadImage=p,fabric.util.enlivenObjects=d,fabric.util.groupSVGElements=v,fabric.util.populateWithProperties=m,fabric.util.drawDashedLine=g,fabric.util.createCanvasElement=y,fabric.util.createAccessors=b,fabric.util.clipContext=w}(),function(){function t(t,n){var r=e.call(arguments,2),i=[];for(var s=0,o=t.length;s=r&&(r=e[n][t]);else while(n--)e[n]>=r&&(r=e[n]);return r}function r(e,t){if(!e||e.length===0)return undefined;var n=e.length-1,r=t?e[n][t]:e[n];if(t)while(n--)e[n][t]>>0;if(n===0)return-1;var r=0;arguments.length>0&&(r=Number(arguments[1]),r!==r?r=0:r!==0&&r!==Number.POSITIVE_INFINITY&&r!==Number.NEGATIVE_INFINITY&&(r=(r>0||-1)*Math.floor(Math.abs(r))));if(r>=n)return-1;var i=r>=0?r:Math.max(n-Math.abs(r),0);for(;i>>0;n>>0;r>>0;n>>0;n>>0;i>>0,n=0,r;if(arguments.length>1)r=arguments[1];else do{if(n in this){r=this[n++];break}if(++n>=t)throw new TypeError}while(!0);for(;n/g,">")}String.prototype.trim||(String.prototype.trim=function(){return this.replace(/^[\s\xA0]+/,"").replace(/[\s\xA0]+$/,"")}),fabric.util.string={camelize:e,capitalize:t,escapeXml:n}}(),function(){var e=Array.prototype.slice,t=Function.prototype.apply,n=function(){};Function.prototype.bind||(Function.prototype.bind=function(r){var i=this,s=e.call(arguments,1),o;return s.length?o=function(){return t.call(i,this instanceof n?this:r,s.concat(e.call(arguments)))}:o=function(){return t.call(i,this instanceof n?this:r,arguments)},n.prototype=this.prototype,o.prototype=new n,o})}(),function(){function i(){}function s(t){var n=this.constructor.superclass.prototype[t];return arguments.length>1?n.apply(this,e.call(arguments,1)):n.call(this)}function o(){function u(){this.initialize.apply(this,arguments)}var n=null,o=e.call(arguments,0);typeof o[0]=="function"&&(n=o.shift()),u.superclass=n,u.subclasses=[],n&&(i.prototype=n.prototype,u.prototype=new i,n.subclasses.push(u));for(var a=0,f=o.length;a-1?e.prototype[i]=function(e){return function(){var n=this.constructor.superclass;this.constructor.superclass=r;var i=t[e].apply(this,arguments);this.constructor.superclass=n;if(e!=="initialize")return i}}(i):e.prototype[i]=t[i],n&&(t.toString!==Object.prototype.toString&&(e.prototype.toString=t.toString),t.valueOf!==Object.prototype.valueOf&&(e.prototype.valueOf=t.valueOf))};fabric.util.createClass=o}(),function(){function e(e){var t=Array.prototype.slice.call(arguments,1),n,r,i=t.length;for(r=0;r-1?s(e,t.match(/opacity:\s*(\d?\.?\d*)/)[1]):e;for(var r in t)if(r==="opacity")s(e,t[r]);else{var i=r==="float"||r==="cssFloat"?typeof n.styleFloat=="undefined"?"cssFloat":"styleFloat":r;n[i]=t[r]}return e}var t=fabric.document.createElement("div"),n=typeof t.style.opacity=="string",r=typeof t.style.filter=="string",i=/alpha\s*\(\s*opacity\s*=\s*([^\)]+)\)/,s=function(e){return e};n?s=function(e,t){return e.style.opacity=t,e}:r&&(s=function(e,t){var n=e.style;return e.currentStyle&&!e.currentStyle.hasLayout&& -(n.zoom=1),i.test(n.filter)?(t=t>=.9999?"":"alpha(opacity="+t*100+")",n.filter=n.filter.replace(i,t)):n.filter+=" alpha(opacity="+t*100+")",e}),fabric.util.setStyle=e}(),function(){function t(e){return typeof e=="string"?fabric.document.getElementById(e):e}function s(e,t){var n=fabric.document.createElement(e);for(var r in t)r==="class"?n.className=t[r]:r==="for"?n.htmlFor=t[r]:n.setAttribute(r,t[r]);return n}function o(e,t){(" "+e.className+" ").indexOf(" "+t+" ")===-1&&(e.className+=(e.className?" ":"")+t)}function u(e,t,n){return typeof t=="string"&&(t=s(t,n)),e.parentNode&&e.parentNode.replaceChild(t,e),t.appendChild(e),t}function a(e){var t=0,n=0;do t+=e.offsetTop||0,n+=e.offsetLeft||0,e=e.offsetParent;while(e);return{left:n,top:t}}var e=Array.prototype.slice,n=function(t){return e.call(t,0)},r;try{r=n(fabric.document.childNodes)instanceof Array}catch(i){}r||(n=function(e){var t=new Array(e.length),n=e.length;while(n--)t[n]=e[n];return t});var f;fabric.document.defaultView&&fabric.document.defaultView.getComputedStyle?f=function(e){return fabric.document.defaultView.getComputedStyle(e,null).position}:f=function(e){var t=e.style.position;return!t&&e.currentStyle&&(t=e.currentStyle.position),t},function(){function n(e){return typeof e.onselectstart!="undefined"&&(e.onselectstart=fabric.util.falseFunction),t?e.style[t]="none":typeof e.unselectable=="string"&&(e.unselectable="on"),e}function r(e){return typeof e.onselectstart!="undefined"&&(e.onselectstart=null),t?e.style[t]="":typeof e.unselectable=="string"&&(e.unselectable=""),e}var e=fabric.document.documentElement.style,t="userSelect"in e?"userSelect":"MozUserSelect"in e?"MozUserSelect":"WebkitUserSelect"in e?"WebkitUserSelect":"KhtmlUserSelect"in e?"KhtmlUserSelect":"";fabric.util.makeElementUnselectable=n,fabric.util.makeElementSelectable=r}(),function(){function e(e,t){var n=fabric.document.getElementsByTagName("head")[0],r=fabric.document.createElement("script"),i=!0;r.type="text/javascript",r.setAttribute("runat","server"),r.onload=r.onreadystatechange=function(e){if(i){if(typeof this.readyState=="string"&&this.readyState!=="loaded"&&this.readyState!=="complete")return;i=!1,t(e||fabric.window.event),r=r.onload=r.onreadystatechange=null}},r.src=e,n.appendChild(r)}fabric.util.getScript=e}(),fabric.util.getById=t,fabric.util.toArray=n,fabric.util.makeElement=s,fabric.util.addClass=o,fabric.util.wrapElement=u,fabric.util.getElementOffset=a,fabric.util.getElementPosition=f}(),function(){function e(e,t){return e+(/\?/.test(e)?"&":"?")+t}function n(){}function r(r,i){i||(i={});var s=i.method?i.method.toUpperCase():"GET",o=i.onComplete||function(){},u=t(),a;return u.onreadystatechange=function(){u.readyState===4&&(o(u),u.onreadystatechange=n)},s==="GET"&&(a=null,typeof i.parameters=="string"&&(r=e(r,i.parameters))),u.open(s,r,!0),(s==="POST"||s==="PUT")&&u.setRequestHeader("Content-Type","application/x-www-form-urlencoded"),u.send(a),u}var t=function(){var e=[function(){return new ActiveXObject("Microsoft.XMLHTTP")},function(){return new ActiveXObject("Msxml2.XMLHTTP")},function(){return new ActiveXObject("Msxml2.XMLHTTP.3.0")},function(){return new XMLHttpRequest}];for(var t=e.length;t--;)try{var n=e[t]();if(n)return e[t]}catch(r){}}();fabric.util.request=r}(),function(){function e(e,t,n,r){return n*(e/=r)*e+t}function t(e,t,n,r){return-n*(e/=r)*(e-2)+t}function n(e,t,n,r){return e/=r/2,e<1?n/2*e*e+t:-n/2*(--e*(e-2)-1)+t}function r(e,t,n,r){return n*(e/=r)*e*e+t}function i(e,t,n,r){return n*((e=e/r-1)*e*e+1)+t}function s(e,t,n,r){return e/=r/2,e<1?n/2*e*e*e+t:n/2*((e-=2)*e*e+2)+t}function o(e,t,n,r){return n*(e/=r)*e*e*e+t}function u(e,t,n,r){return-n*((e=e/r-1)*e*e*e-1)+t}function a(e,t,n,r){return e/=r/2,e<1?n/2*e*e*e*e+t:-n/2*((e-=2)*e*e*e-2)+t}function f(e,t,n,r){return n*(e/=r)*e*e*e*e+t}function l(e,t,n,r){return n*((e=e/r-1)*e*e*e*e+1)+t}function c(e,t,n,r){return e/=r/2,e<1?n/2*e*e*e*e*e+t:n/2*((e-=2)*e*e*e*e+2)+t}function h(e,t,n,r){return-n*Math.cos(e/r*(Math.PI/2))+n+t}function p(e,t,n,r){return n*Math.sin(e/r*(Math.PI/2))+t}function d(e,t,n,r){return-n/2*(Math.cos(Math.PI*e/r)-1)+t}function v(e,t,n,r){return e===0?t:n*Math.pow(2,10*(e/r-1))+t}function m(e,t,n,r){return e===r?t+n:n*(-Math.pow(2,-10*e/r)+1)+t}function g(e,t,n,r){return e===0?t:e===r?t+n:(e/=r/2,e<1?n/2*Math.pow(2,10*(e-1))+t:n/2*(-Math.pow(2,-10*--e)+2)+t)}function y(e,t,n,r){return-n*(Math.sqrt(1-(e/=r)*e)-1)+t}function b(e,t,n,r){return n*Math.sqrt(1-(e=e/r-1)*e)+t}function w(e,t,n,r){return e/=r/2,e<1?-n/2*(Math.sqrt(1-e*e)-1)+t:n/2*(Math.sqrt(1-(e-=2)*e)+1)+t}function E(e,t,n,r){var i=1.70158,s=0,o=n;return e===0?t:(e/=r,e===1?t+n:(s||(s=r*.3),o-1;e=e.split(/\s+/);var n=[],r,i;if(t){r=0,i=e.length;for(;r/i,"")));if(!s.documentElement)return;t.parseSVGDocument(s.documentElement,function(r,i){d.set(e,{objects:t.util.array.invoke(r,"toObject"),options:i}),n(r,i)},r)}e=e.replace(/^\n\s*/,"").trim(),d.has(e,function(r){r?d.get(e,function(e){var t=m(e);n(t.objects,t.options)}):new t.util.request(e,{method:"get",onComplete:i})})}function m(e){var n=e.objects,i=e.options;return n=n.map(function(e){return t[r(e.type)].fromObject(e)}),{objects:n,options:i}}function g(e,n,r){e=e.trim();var i;if(typeof DOMParser!="undefined"){var s=new DOMParser;s&&s.parseFromString&&(i=s.parseFromString(e,"text/xml"))}else t.window.ActiveXObject&&(i=new ActiveXObject("Microsoft.XMLDOM"),i.async="false",i.loadXML(e.replace(//i,"")));t.parseSVGDocument(i.documentElement,function(e,t){n(e,t)},r)}function y(e){var t="";for(var n=0,r=e.length;n',"",""].join("")),t}function b(e){var t="";return e.backgroundColor&&e.backgroundColor.source&&(t=['',''].join("")),t}var t=e.fabric||(e.fabric={}),n=t.util.object.extend,r=t.util.string.capitalize,i=t.util.object.clone,s={cx:"left",x:"left",cy:"top",y:"top",r:"radius","fill-opacity":"opacity","fill-rule":"fillRule","stroke-width":"strokeWidth",transform:"transformMatrix","text-decoration":"textDecoration","font-size":"fontSize","font-weight":"fontWeight","font-style":"fontStyle","font-family":"fontFamily"};t.parseTransformAttribute=function(){function e(e,t){var n=t[0];e[0]=Math.cos(n),e[1]=Math.sin(n),e[2]=-Math.sin(n),e[3]=Math.cos(n)}function t(e,t){var n=t[0],r=t.length===2?t[1]:t[0];e[0]=n,e[3]=r}function n(e,t){e[2]=t[0]}function r(e,t){e[1]=t[0]}function i(e,t){e[4]=t[0],t.length===2&&(e[5]=t[1])}var s=[1,0,0,1,0,0],o="(?:[-+]?\\d+(?:\\.\\d+)?(?:e[-+]?\\d+)?)",u="(?:\\s+,?\\s*|,\\s*)",a="(?:(skewX)\\s*\\(\\s*("+o+")\\s*\\))",f="(?:(skewY)\\s*\\(\\s*("+o+")\\s*\\))",l="(?:(rotate)\\s*\\(\\s*("+o+")(?:"+u+"("+o+")"+u+"("+o+"))?\\s*\\))",c="(?:(scale)\\s*\\(\\s*("+o+")(?:"+u+"("+o+"))?\\s*\\))",h="(?:(translate)\\s*\\(\\s*("+o+")(?:"+u+"("+o+"))?\\s*\\))",p="(?:(matrix)\\s*\\(\\s*("+o+")"+u+"("+o+")"+u+"("+o+")"+u+"("+o+")"+u+"("+o+")"+u+"("+o+")"+"\\s*\\))",d="(?:"+p+"|"+h+"|"+c+"|"+l+"|"+a+"|"+f+")",v="(?:"+d+"(?:"+u+d+")*"+")",m="^\\s*(?:"+v+"?)\\s*$",g=new RegExp(m),y=new RegExp(d);return function(o){var u=s.concat();return!o||o&&!g.test(o)?u:(o.replace(y,function(s){var o=(new RegExp(d)).exec(s).filter(function(e){return e!==""&&e!=null}),a=o[1],f=o.slice(2).map(parseFloat);switch(a){case"translate":i(u,f);break;case"rotate":e(u,f);break;case"scale":t(u,f);break;case"skewX":n(u,f);break;case"skewY":r(u,f);break;case"matrix":u=f}}),u)}}(),t.parseSVGDocument=function(){function s(e,t){while(e&&(e=e.parentNode))if(t.test(e.nodeName))return!0;return!1}var e=/^(path|circle|polygon|polyline|ellipse|rect|line|image|text)$/,n="(?:[-+]?\\d+(?:\\.\\d+)?(?:e[-+]?\\d+)?)",r=new RegExp("^\\s*("+n+"+)\\s*,?"+"\\s*("+n+"+)\\s*,?"+"\\s*("+n+"+)\\s*,?"+"\\s*("+n+"+)\\s*"+"$");return function(n,o,u){if(!n)return;var a=new Date,f=t.util.toArray(n.getElementsByTagName("*"));if(f.length===0){f=n.selectNodes("//*[name(.)!='svg']");var l=[];for(var c=0,p=f.length;c']:this.type==="radial"&&(i=["']);for(var s=0;s');return i.push(this.type==="linear"?"":""),i.join("")}}),fabric.util.object.extend(fabric.Gradient,{fromElement:function(n,r){var i=n.getElementsByTagName("stop"),s=n.nodeName==="linearGradient"?"linear":"radial",o=n.getAttribute("gradientUnits")||"objectBoundingBox",u=[],a={};s==="linear"?a={x1:n.getAttribute("x1")||0,y1:n.getAttribute("y1")||0,x2:n.getAttribute("x2")||"100%",y2:n.getAttribute("y2")||0}:s==="radial"&&(a={x1:n.getAttribute("fx")||n.getAttribute("cx")||"50%",y1:n.getAttribute("fy")||n.getAttribute("cy")||"50%",r1:0,x2:n.getAttribute("cx")||"50%",y2:n.getAttribute("cy")||"50%",r2:n.getAttribute("r")||"50%"});for(var f=i.length;f--;)u.push(e(i[f]));return t(r,a),new fabric.Gradient({type:s,coords:a,gradientUnits:o,colorStops:u})},forObject:function(e,n){return n||(n={}),t(e,n),new fabric.Gradient(n)}}),fabric.getGradientDefs=r}(),fabric.Pattern=fabric.util.createClass({repeat:"repeat",initialize:function(e){e||(e={}),e.source&&(this.source=typeof e.source=="string"?new Function(e.source):e.source),e.repeat&&(this.repeat=e.repeat)},toObject:function(){var e;return typeof this.source=="function"?e=String(this.source).match(/function\s+\w*\s*\(.*\)\s+\{([\s\S]*)\}/)[1]:typeof this.source.src=="string"&&(e=this.source.src),{source:e,repeat:this.repeat}},toLive:function(e){var t=typeof this.source=="function"?this.source():this.source;return e.createPattern(t,this.repeat)}}),fabric.Shadow=fabric.util.createClass({color:"rgb(0,0,0)",blur:0,offsetX:0,offsetY:0,affectStroke:!1,initialize:function(e){for(var t in e)this[t]=e[t]},toObject:function(){return{color:this.color,blur:this.blur,offsetX:this.offsetX,offsetY:this.offsetY}},toSVG:function(){}}),function(e){"use strict";function n(e,t){arguments.length>0&&this.init(e,t)}var t=e.fabric||(e.fabric={});if(t.Point){t.warn("fabric.Point is already defined");return}t.Point=n,n.prototype={constructor:n,init:function(e,t){this.x=e,this.y=t},add:function(e){return new n(this.x+e.x,this.y+e.y)},addEquals:function(e){return this.x+=e.x,this.y+=e.y,this},scalarAdd:function(e){return new n(this.x+e,this.y+e)},scalarAddEquals:function(e){return this.x+=e,this.y+=e,this},subtract:function(e){return new n(this.x-e.x,this.y-e.y)},subtractEquals:function(e){return this.x-=e.x,this.y-=e.y,this},scalarSubtract:function(e){return new n(this.x-e,this.y-e)},scalarSubtractEquals:function(e){return this.x-=e,this.y-=e,this},multiply:function(e){return new n(this.x*e,this.y*e)},multiplyEquals:function(e){return this.x*=e,this.y*=e,this},divide:function(e){return new n(this.x/e,this.y/e)},divideEquals:function(e){return this.x/=e,this.y/=e,this},eq:function(e){return this.x===e.x&&this.y===e.y},lt:function(e){return this.xe.x&&this.y>e.y},gte:function(e){return this.x>=e.x&&this.y>=e.y},lerp:function(e,t){return new n(this.x+(e.x-this.x)*t,this.y+(e.y-this.y)*t)},distanceFrom:function(e){var t=this.x-e.x,n=this.y-e.y;return Math.sqrt(t*t+n*n)},midPointFrom:function(e){return new n(this.x+(e.x-this.x)/2,this.y+(e.y-this.y)/2)},min:function(e){return new n(Math.min(this.x,e.x),Math.min(this.y,e.y))},max:function(e){return new n(Math.max(this.x,e.x),Math.max(this.y,e.y))},toString:function(){return this.x+","+this.y},setXY:function(e,t){this.x=e,this.y=t},setFromPoint:function(e){this.x=e.x,this.y=e.y},swap:function(e){var t=this.x,n=this.y;this.x=e.x,this.y=e.y,e.x=t,e.y=n}}}(typeof exports!="undefined"?exports:this),function(e){"use strict";function n(e){arguments.length>0&&this.init(e)}var t=e.fabric||(e.fabric={});if(t.Intersection){t.warn("fabric.Intersection is already defined");return}t.Intersection=n,t.Intersection.prototype={init:function(e){this.status=e,this.points=[]},appendPoint:function(e){this.points.push(e)},appendPoints:function(e){this.points=this.points.concat(e)}},t.Intersection.intersectLineLine=function(e,r,i,s){var o,u=(s.x-i.x)*(e.y-i.y)-(s.y-i.y)*(e.x-i.x),a=(r.x-e.x)*(e.y-i.y)-(r.y-e.y)*(e.x-i.x),f=(s.y-i.y)*(r.x-e.x)-(s.x-i.x)*(r.y-e.y);if(f!==0){var l=u/f,c=a/f;0<=l&&l<=1&&0<=c&&c<=1?(o=new n("Intersection"),o.points.push(new t.Point(e.x+l*(r.x-e.x),e.y+l*(r.y-e.y)))):o=new n("No Intersection")}else u===0||a===0?o=new n("Coincident"):o=new n("Parallel");return o},t.Intersection.intersectLinePolygon=function(e,t,r){var i=new n("No Intersection"),s=r.length;for(var o=0;o0&&(i.status="Intersection"),i},t.Intersection.intersectPolygonPolygon=function(e,t){var r=new n("No Intersection"),i=e.length;for(var s=0;s0&&(r.status="Intersection"),r},t.Intersection.intersectPolygonRectangle=function(e,r,i){var s=r.min(i),o=r.max(i),u=new t.Point(o.x,s.y),a=new t.Point(s.x,o.y),f=n.intersectLinePolygon(s,u,e),l=n.intersectLinePolygon(u,o,e),c=n.intersectLinePolygon(o,a,e),h=n.intersectLinePolygon(a,s,e),p=new n("No Intersection");return p.appendPoints(f.points),p.appendPoints(l.points),p.appendPoints(c.points),p.appendPoints(h.points),p.points.length>0&&(p.status="Intersection"),p}}(typeof exports!="undefined"?exports:this),function(e){"use strict";function n(e){e?this._tryParsingColor(e):this.setSource([0,0,0,1])}var t=e.fabric||(e.fabric={});if(t.Color){t.warn("fabric.Color is already defined.");return}t.Color=n,t.Color.prototype={_tryParsingColor:function(e){var t;e in n.colorNameMap&&(e=n.colorNameMap[e]),t=n.sourceFromHex(e),t||(t=n.sourceFromRgb(e)),t&&this.setSource(t)},getSource:function(){return this._source},setSource:function(e){this._source=e},toRgb:function(){var e=this.getSource();return"rgb("+e[0]+","+e[1]+","+e[2]+")"},toRgba:function(){var e=this.getSource();return"rgba("+e[0]+","+e[1]+","+e[2]+","+e[3]+")"},toHex:function(){var e=this.getSource(),t=e[0].toString(16);t=t.length===1?"0"+t:t;var n=e[1].toString(16);n=n.length===1?"0"+n:n;var r=e[2].toString(16);return r=r.length===1?"0"+r:r,t.toUpperCase()+n.toUpperCase()+r.toUpperCase()},getAlpha:function(){return this.getSource()[3]},setAlpha:function(e){var t=this.getSource();return t[3]=e,this.setSource(t),this},toGrayscale:function(){var e=this.getSource(),t=parseInt((e[0]*.3+e[1]*.59+e[2]*.11).toFixed(0),10),n=e[3];return this.setSource([t,t,t,n]),this},toBlackWhite:function(e){var t=this.getSource(),n=(t[0]*.3+t[1]*.59+t[2]*.11).toFixed(0),r=t[3];return e=e||127,n=Number(n)',''),t.push("',"Created with Fabric.js ",fabric.version,"","",fabric.createSVGFontFacesMarkup(this.getObjects()),fabric.createSVGRefElementsMarkup(this),""),this.backgroundColor&&this.backgroundColor.source&&t.push('"),this.backgroundImage&&t.push(''),this.overlayImage&&t.push('');for(var n=0,r=this.getObjects(),i=r.length;n"),t.join("")},isEmpty:function(){return this._objects.length===0},remove:function(e){this.getActiveObject()===e&&(this.fire("before:selection:cleared",{target:e}),this.discardActiveObject(),this.fire("selection:cleared"));var t=this._objects,n=t.indexOf(e);return n!==-1&&(t.splice(n,1),this.fire("object:removed",{target:e})),this.renderAll(),e},sendToBack:function(e){return n(this._objects,e),this._objects.unshift(e),this.renderAll&&this.renderAll()},bringToFront:function(e){return n(this._objects,e),this._objects.push(e),this.renderAll&&this.renderAll()},sendBackwards:function(e){var t=this._objects.indexOf(e),r=t;if(t!==0){for(var i=t-1;i>=0;--i){var s=e.intersectsWithObject(this._objects[i])||e.isContainedWithinObject(this._objects[i])||this._objects[i].isContainedWithinObject(e);if(s){r=i;break}}n(this._objects,e),this._objects.splice(r,0,e)}return this.renderAll&&this.renderAll()},bringForward:function(e){var t=this.getObjects(),r=t.indexOf(e),i=r;if(r!==t.length-1){for(var s=r+1,o=this._objects.length;s"},e(fabric.StaticCanvas,{EMPTY_JSON:'{"objects": [], "background": "white"}',toGrayscale:function(e){var t=e.getContext("2d"),n=t.getImageData(0,0,e.width,e.height),r=n.data,i=n.width,s=n.height,o,u,a,f;for(a=0;a0&&(t>this.targetFindTolerance?t-=this.targetFindTolerance:t=0,n>this.targetFindTolerance?n-=this.targetFindTolerance:n=0);var o=!0,u=r.getImageData(t,n,this.targetFindTolerance*2||1,this.targetFindTolerance*2||1);for(var a=3;a0?0:-n),t.ey-(r>0?0:-r),i,o),e.lineWidth=this.selectionLineWidth,e.strokeStyle=this.selectionBorderColor;if(this.selectionDashArray.length>1){var u=t.ex+a-(n>0?0:i),f=t.ey+a-(r>0?0:o);e.beginPath(),fabric.util.drawDashedLine(e,u,f,u+i,f,this.selectionDashArray),fabric.util.drawDashedLine(e,u,f+o-1,u+i,f+o-1,this.selectionDashArray),fabric.util.drawDashedLine(e,u,f,u,f+o,this.selectionDashArray),fabric.util.drawDashedLine(e,u+i-1,f,u+i-1,f+o,this.selectionDashArray),e.closePath(),e.stroke()}else e.strokeRect(t.ex+a-(n>0?0:i),t.ey+a-(r>0?0:o),i,o)},_findSelectedObjects:function(e){var t=[],n=this._groupSelector.ex,r=this._groupSelector.ey,i=n+this._groupSelector.left,s=r+this._groupSelector.top,a,f=new fabric.Point(o(n,i),o(r,s)),l=new fabric.Point(u(n,i),u(r,s));for(var c=0,h=this._objects.length;c1&&(t=new fabric.Group(t),this.setActiveGroup(t),t.saveCoords(),this.fire("selection:created",{target:t})),this.renderAll()},findTarget:function(e,t){var n,r=this.getPointer(e);if(this.controlsAboveOverlay&&this.lastRenderedObjectWithControlsAboveOverlay&&this.containsPoint(e,this.lastRenderedObjectWithControlsAboveOverlay)&&this.lastRenderedObjectWithControlsAboveOverlay._findTargetCorner(e,this._offset))return n=this.lastRenderedObjectWithControlsAboveOverlay,n;var i=this.getActiveGroup();if(i&&!t&&this.containsPoint(e,i))return n=i,n;var s=[];for(var o=this._objects.length;o--;)if(this._objects[o]&&this.containsPoint(e,this._objects[o])){if(!this.perPixelTargetFind&&!this._objects[o].perPixelTargetFind){n=this._objects[o],this.relatedTarget=n;break}s[s.length]=this._objects[o]}for(var u=0,a=s.length;u"},get:function(e){return this[e]},set:function(e,t){if(typeof e=="object")for(var n in e)this._set(n,e[n]);else typeof t=="function"?this._set(e,t(this.get(e))):this._set(e,t);return this},_set:function(e,t){var n=e==="scaleX"||e==="scaleY";n&&(t=this._constrainScale(t));if(e==="scaleX"&&t<0)this.flipX=!this.flipX,t*=-1;else if(e==="scaleY"&&t<0)this.flipY=!this.flipY,t*=-1;else if(e==="width"||e==="height")this.minScaleLimit=r(Math.min(.1,1/Math.max(this.width,this.height)),2);return this[e]=t,this},toggle:function(e){var t=this.get(e);return typeof t=="boolean"&&this.set(e,!t),this},setSourcePath:function(e){return this.sourcePath=e,this},render:function(e,n){if(this.width===0||this.height===0||!this.visible)return;e.save();var r=this.transformMatrix;r&&!this.group&&e.setTransform(r[0],r[1],r[2],r[3],r[4],r[5]),n||this.transform(e);if(this.stroke||this.strokeDashArray)e.lineWidth=this.strokeWidth,this.stroke&&this.stroke.toLive?e.strokeStyle=this.stroke.toLive(e):e.strokeStyle=this.stroke;this.overlayFill?e.fillStyle=this.overlayFill:this.fill&&(e.fillStyle=this.fill.toLive?this.fill.toLive(e):this.fill),r&&this.group&&(e.translate(-this.group.width/2,-this.group.height/2),e.transform(r[0],r[1],r[2],r[3],r[4],r[5])),this._setShadow(e),this.clipTo&&t.util.clipContext(this,e),this._render(e,n),this.clipTo&&e.restore(),this._removeShadow(e),this.active&&!n&&(this.drawBorders(e),this.drawControls(e)),e.restore()},_setShadow:function(e){if(!this.shadow)return;e.shadowColor=this.shadow.color,e.shadowBlur=this.shadow.blur,e.shadowOffsetX=this.shadow.offsetX,e.shadowOffsetY=this.shadow.offsetY},_removeShadow:function(e){e.shadowColor="",e.shadowBlur=e.shadowOffsetX=e.shadowOffsetY=0},clone:function(e,n){return this.constructor.fromObject?this.constructor.fromObject(this.toObject(n),e):new t.Object(this.toObject(n))},cloneAsImage:function(e){if(t.Image){var n=new o;n.onload=function(){e&&e(new t.Image(n),r),n=n.onload=null};var r={angle:this.getAngle(),flipX:this.getFlipX(),flipY:this.getFlipY()};this.set({angle:0,flipX:!1,flipY:!1}),this.toDataURL(function(e){n.src=e})}return this},toDataURL:function(e){function i(t){t.left=n.width/2,t.top=n.height/2,t.setActive(!1),r.add(t);var i=r.toDataURL();r.dispose(),r=t=null,e&&e(i)}var n=t.util.createCanvasElement();n.width=this.getBoundingRectWidth(),n.height=this.getBoundingRectHeight(),t.util.wrapElement(n,"div");var r=new t.Canvas(n);r.backgroundColor="transparent",r.renderAll(),this.constructor.async?this.clone(i):i(this.clone())},hasStateChanged:function(){return this.stateProperties.some(function(e){return this[e]!==this.originalState[e]},this)},saveState:function(e){return this.stateProperties.forEach(function(e){this.originalState[e]=this.get(e)},this),e&&e.stateProperties&&e.stateProperties.forEach(function(e){this.originalState[e]=this.get(e)},this),this},setupState:function(){this.originalState={},this.saveState()},isType:function(e){return this.type===e},toGrayscale:function(){var e=this.get("fill");return e&&this.set("overlayFill",(new t.Color(e)).toGrayscale().toRgb()),this},complexity:function(){return 0},toJSON:function(e){return this.toObject(e)},setGradient:function(e,n){n||(n={});var r={colorStops:[]};r.type=n.type||(n.r1||n.r2?"radial":"linear"),r.coords={x1:n.x1,y1:n.y1,x2:n.x2,y2:n.y2};if(n.r1||n.r2)r.coords.r1=n.r1,r.coords.r2=n.r2;for(var i in n.colorStops){var s=new t.Color(n.colorStops[i]);r.colorStops.push({offset:i,color:s.toRgb(),opacity:s.getAlpha()})}this.set(e,t.Gradient.forObject(this,r))},setPatternFill:function(e){this.set("fill",new t.Pattern(e))},setShadow:function(e){this.set("shadow",new t.Shadow(e))},animate:function(){if(arguments[0]&&typeof arguments[0]=="object")for(var e in arguments[0])this._animate(e,arguments[0][e],arguments[1]);else this._animate.apply(this,arguments);return this},_animate:function(e,n,r){var i=this,s;n=n.toString(),r?r=t.util.object.clone(r):r={},~e.indexOf(".")&&(s=e.split("."));var o=s?this.get(s[0])[s[1]]:this.get(e);"from"in r||(r.from=o),~n.indexOf("=")?n=o+parseFloat(n.replace("=","")):n=parseFloat(n),t.util.animate({startValue:r.from,endValue:n,byValue:r.by,easing:r.easing,duration:r.duration,onChange:function(t){s?i[s[0]][s[1]]=t:i.set(e,t),r.onChange&&r.onChange()},onComplete:function(){i.setCoords(),r.onComplete&&r.onComplete()}})},centerH:function(){return this.canvas.centerObjectH(this),this},centerV:function(){return this.canvas.centerObjectV(this),this},center:function(){return this.centerH().centerV()},remove:function(){return this.canvas.remove(this)},sendToBack:function(){return this.group?t.StaticCanvas.prototype.sendToBack.call(this.group,this):this.canvas.sendToBack(this),this},bringToFront:function(){return this.group?t.StaticCanvas.prototype.bringToFront.call(this.group,this):this.canvas.bringToFront(this),this},sendBackwards:function(){return this.group?t.StaticCanvas.prototype.sendBackwards.call(this.group,this):this.canvas.sendBackwards(this),this},bringForward:function(){return this.group?t.StaticCanvas.prototype.bringForward.call(this.group,this):this.canvas.bringForward(this),this}}),t.util.createAccessors(t.Object),t.Object.prototype.rotate=t.Object.prototype.setAngle,n(t.Object.prototype,t.Observable),t.Object.NUM_FRACTION_DIGITS=2,t.Object.__uid=0}(typeof exports!="undefined"?exports:this),function(){var e=fabric.util.degreesToRadians;fabric.util.object.extend(fabric.Object.prototype,{translateToCenterPoint:function(t,n,r){var i=t.x,s=t.y;return n==="left"?i=t.x+this.getWidth()/2:n==="right"&&(i=t.x-this.getWidth()/2),r==="top"?s=t.y+this.getHeight()/2:r==="bottom"&&(s=t.y-this.getHeight()/2),fabric.util.rotatePoint(new fabric.Point(i,s),t,e(this.angle))},translateToOriginPoint:function(t,n,r){var i=t.x,s=t.y;return n==="left"?i=t.x-this.getWidth()/2:n==="right"&&(i=t.x+this.getWidth()/2),r==="top"?s=t.y-this.getHeight()/2:r==="bottom"&&(s=t.y+this.getHeight()/2),fabric.util.rotatePoint(new fabric.Point(i,s),t,e(this.angle))},getCenterPoint:function(){return this.translateToCenterPoint(new fabric.Point(this.left,this.top),this.originX,this.originY)},toLocalPoint:function(t,n,r){var i=this.getCenterPoint(),s,o;return n!==undefined&&r!==undefined?(n==="left"?s=i.x-this.getWidth()/2:n==="right"?s=i.x+this.getWidth()/2:s=i.x,r==="top"?o=i.y-this.getHeight()/2:r==="bottom"?o=i.y+this.getHeight()/2:o=i.y):(s=this.left,o=this.top),fabric.util.rotatePoint(new fabric.Point(t.x,t.y),i,-e(this.angle)).subtractEquals(new fabric.Point(s,o))},setPositionByOrigin:function(e,t,n){var r=this.translateToCenterPoint(e,t,n),i=this.translateToOriginPoint(r,this.originX,this.originY);this.set("left",i.x),this.set("top",i.y)},adjustPosition:function(t){var n=e(this.angle),r=this.getWidth()/2,i=Math.cos(n)*r,s=Math.sin(n)*r,o=this.getWidth(),u=Math.cos(n)*o,a=Math.sin(n)*o;this.originX==="center"&&t==="left"||this.originX==="right"&&t==="center"?(this.left-=i,this.top-=s):this.originX==="left"&&t==="center"||this.originX==="center"&&t==="right"?(this.left+=i,this.top+=s):this.originX==="left"&&t==="right"?(this.left+=u,this.top+=a):this.originX==="right"&&t==="left"&&(this.left-=u,this.top-=a),this.setCoords(),this.originX=t}})}(),function(){var e=fabric.util.degreesToRadians;fabric.util.object.extend(fabric.Object.prototype,{intersectsWithRect:function(e,t){var n=this.oCoords,r=new fabric.Point(n.tl.x,n.tl.y),i=new fabric.Point(n.tr.x,n.tr.y),s=new fabric.Point(n.bl.x,n.bl.y),o=new fabric.Point(n.br.x,n.br.y),u=fabric.Intersection.intersectPolygonRectangle([r,i,o,s],e,t);return u.status==="Intersection"},intersectsWithObject:function(e){function t(e){return{tl:new fabric.Point(e.tl.x,e.tl.y),tr:new fabric.Point(e.tr.x,e.tr.y),bl:new fabric.Point(e.bl.x,e.bl.y),br:new fabric.Point(e.br.x,e.br.y)}}var n=t(this.oCoords),r=t(e.oCoords),i=fabric.Intersection.intersectPolygonPolygon([n.tl,n.tr,n.br,n.bl],[r.tl,r.tr,r.br,r.bl]);return i.status==="Intersection"},isContainedWithinObject:function(e){return this.isContainedWithinRect(e.oCoords.tl,e.oCoords.br)},isContainedWithinRect:function(e,t){var n=this.oCoords,r=new fabric.Point(n.tl.x,n.tl.y),i=new fabric.Point(n.tr.x,n.tr.y),s=new fabric.Point(n.bl.x,n.bl.y);return r.x>e.x&&i.xe.y&&s.y1?this.strokeWidth:0,n=this.padding,r=e(this.angle);this.currentWidth=(this.width+t)*this.scaleX+n*2,this.currentHeight=(this.height+t)*this.scaleY+n*2,this.currentWidth<0&&(this.currentWidth=Math.abs(this.currentWidth));var i=Math.sqrt(Math.pow(this.currentWidth/2,2)+Math.pow(this.currentHeight/2,2)),s=Math.atan(this.currentHeight/this.currentWidth),o=Math.cos(s+r)*i,u=Math.sin(s+r)*i,a=Math.sin(r),f=Math.cos(r),l=this.getCenterPoint(),c={x:l.x-o,y:l.y-u},h={x:c.x+this.currentWidth*f,y:c.y+this.currentWidth*a},p={x:h.x-this.currentHeight*a,y:h.y+this.currentHeight*f},d={x:c.x-this.currentHeight*a,y:c.y+this.currentHeight*f},v={x:c.x-this.currentHeight/2*a,y:c.y+this.currentHeight/2*f},m={x:c.x+this.currentWidth/2*f,y:c.y+this.currentWidth/2*a},g={x:h.x-this.currentHeight/2*a,y:h.y+this.currentHeight/2*f},y={x:d.x+this.currentWidth/2*f,y:d.y+this.currentWidth/2*a},b={x:c.x+this.currentWidth/2*f,y:c.y+this.currentWidth/2*a};return this.oCoords={tl:c,tr:h,br:p,bl:d,ml:v,mt:m,mr:g,mb:y,mtr:b},this._setCornerCoords(),this}})}(),function(){var e=fabric.util.getPointer,t=fabric.util.degreesToRadians;fabric.util.object.extend(fabric.Object.prototype,{_findTargetCorner:function(t,n){if(!this.hasControls||!this.active)return!1;var r=e(t,this.canvas.upperCanvasEl),i=r.x-n.left,s=r.y-n.top,o,u;for(var a in this.oCoords){if(a==="mtr"&&!this.hasRotatingPoint)continue;if(!(!this.get("lockUniScaling")||a!=="mt"&&a!=="mr"&&a!=="mb"&&a!=="ml"))continue;u=this._getImageLines(this.oCoords[a].corner,a),o=this._findCrossPoints(i,s,u);if(o%2===1&&o!==0)return this.__corner=a,a}return!1},_findCrossPoints:function(e,t,n){var r,i,s,o,u,a,f=0,l;for(var c in n){l=n[c];if(l.o.y=t&&l.d.y>=t)continue;l.o.x===l.d.x&&l.o.x>=e?(u=l.o.x,a=t):(r=0,i=(l.d.y-l.o.y)/(l.d.x-l.o.x),s=t-r*e,o=l.o.y-i*l.o.x,u=-(s-o)/(r-i),a=s+r*u),u>=e&&(f+=1);if(f===2)break}return f},_getImageLines:function(e){return{topline:{o:e.tl,d:e.tr},rightline:{o:e.tr,d:e.br},bottomline:{o:e.br,d:e.bl},leftline:{o:e.bl,d:e.tl}}},_setCornerCoords:function(){var e=this.oCoords,n=t(this.angle),r=t(45-this.angle),i=Math.sqrt(2*Math.pow(this.cornerSize,2))/2,s=i*Math.cos(r),o=i*Math.sin(r),u=Math.sin(n),a=Math.cos(n);e.tl.corner={tl:{x:e.tl.x-o,y:e.tl.y-s},tr:{x:e.tl.x+s,y:e.tl.y-o},bl:{x:e.tl.x-s,y:e.tl.y+o},br:{x:e.tl.x+o,y:e.tl.y+s}},e.tr.corner={tl:{x:e.tr.x-o,y:e.tr.y-s},tr:{x:e.tr.x+s,y:e.tr.y-o},br:{x:e.tr.x+o,y:e.tr.y+s},bl:{x:e.tr.x-s,y:e.tr.y+o}},e.bl.corner={tl:{x:e.bl.x-o,y:e.bl.y-s},bl:{x:e.bl.x-s,y:e.bl.y+o},br:{x:e.bl.x+o,y:e.bl.y+s},tr:{x:e.bl.x+s,y:e.bl.y-o}},e.br.corner={tr:{x:e.br.x+s,y:e.br.y-o},bl:{x:e.br.x-s,y:e.br.y+o},br:{x:e.br.x+o,y:e.br.y+s},tl:{x:e.br.x-o,y:e.br.y-s}},e.ml.corner={tl:{x:e.ml.x-o,y:e.ml.y-s},tr:{x:e.ml.x+s,y:e.ml.y-o},bl:{x:e.ml.x-s,y:e.ml.y+o},br:{x:e.ml.x+o,y:e.ml.y+s}},e.mt.corner={tl:{x:e.mt.x-o,y:e.mt.y-s},tr:{x:e.mt.x+s,y:e.mt.y-o},bl:{x:e.mt.x-s,y:e.mt.y+o},br:{x:e.mt.x+o,y:e.mt.y+s}},e.mr.corner={tl:{x:e.mr.x-o,y:e.mr.y-s},tr:{x:e.mr.x+s,y:e.mr.y-o},bl:{x:e.mr.x-s,y:e.mr.y+o},br:{x:e.mr.x+o,y:e.mr.y+s}},e.mb.corner={tl:{x:e.mb.x-o,y:e.mb.y-s},tr:{x:e.mb.x+s,y:e.mb.y-o},bl:{x:e.mb.x-s,y:e.mb.y+o},br:{x:e.mb.x+o,y:e.mb.y+s}},e.mtr.corner={tl:{x:e.mtr.x-o+u*this.rotatingPointOffset,y:e.mtr.y-s-a*this.rotatingPointOffset},tr:{x:e.mtr.x+s+u*this.rotatingPointOffset,y:e.mtr.y-o-a*this.rotatingPointOffset},bl:{x:e.mtr.x-s+u*this.rotatingPointOffset,y:e.mtr.y+o-a*this.rotatingPointOffset},br:{x:e.mtr.x+o+u*this.rotatingPointOffset,y:e.mtr.y+s-a*this.rotatingPointOffset}}},drawBorders:function(e){if(!this.hasBorders)return;var t=this.padding,n=t*2,r=this.strokeWidth>1?this.strokeWidth:0;e.save(),e.globalAlpha=this.isMoving?this.borderOpacityWhenMoving:1,e.strokeStyle=this.borderColor;var i=1/this._constrainScale(this.scaleX),s=1/this._constrainScale(this.scaleY);e.lineWidth=1/this.borderScaleFactor,e.scale(i,s);var o=this.getWidth(),u=this.getHeight();e.strokeRect(~~(-(o/2)-t-r/2*this.scaleX)+.5,~~(-(u/2)-t-r/2*this.scaleY)+.5,~~(o+n+r*this.scaleX),~~(u+n+r*this.scaleY));if(this.hasRotatingPoint&&!this.get("lockRotation")&&this.hasControls){var a=(this.flipY?u+r*this.scaleY+t*2:-u-r*this.scaleY-t*2)/2;e.beginPath(),e.moveTo(0,a),e.lineTo(0,a+(this.flipY?this.rotatingPointOffset:-this.rotatingPointOffset)),e.closePath(),e.stroke()}return e.restore(),this},drawControls:function(e){if(!this.hasControls)return;var t=this.cornerSize,n=t/2,r=this.strokeWidth/2,i=-(this.width/2),s=-(this.height/2),o,u,a=t/this.scaleX,f=t/this.scaleY,l=this.padding/this.scaleX,c=this.padding/this.scaleY,h=n/this.scaleY,p=n/this.scaleX,d=(n-t)/this.scaleX,v=(n-t)/this.scaleY,m=this.height,g=this.width,y=this.transparentCorners?"strokeRect":"fillRect",b=typeof G_vmlCanvasManager!="undefined";return e.save(),e.lineWidth=1/Math.max(this.scaleX,this.scaleY),e.globalAlpha=this.isMoving?this.borderOpacityWhenMoving:1,e.strokeStyle=e.fillStyle=this.cornerColor,o=i-p-r-l,u=s-h-r-c,b||e.clearRect(o,u,a,f),e[y](o,u,a,f),o=i+g-p+r+l,u=s-h-r-c,b||e.clearRect(o,u,a,f),e[y](o,u,a,f),o=i-p-r-l,u=s+m+v+r+c,b||e.clearRect(o,u,a,f),e[y](o,u,a,f),o=i+g+d+r+l,u=s+m+v+r+c,b||e.clearRect(o,u,a,f),e[y](o,u,a,f),this.get("lockUniScaling")||(o=i+g/2-p,u=s-h-r-c,b||e.clearRect(o,u,a,f),e[y](o,u,a,f),o=i+g/2-p,u=s+m+v+r+c,b||e.clearRect(o,u,a,f),e[y](o,u,a,f),o=i+g+d+r+l,u=s+m/2-h,b||e.clearRect(o,u,a,f),e[y](o,u,a,f),o=i-p-r-l,u=s+m/2-h,b||e.clearRect(o,u,a,f),e[y](o,u,a,f)),this.hasRotatingPoint&&(o=i+g/2-p,u=this.flipY?s+m+this.rotatingPointOffset/this.scaleY-f/2+r+c:s-this.rotatingPointOffset/this.scaleY-f/2-r-c,b||e.clearRect(o,u,a,f),e[y](o,u,a,f)),e.restore(),this}})}(),function(e){"use strict";var t=e.fabric||(e.fabric={}),n=t.util.object.extend,r={x1:1,x2:1,y1:1,y2:1};if(t.Line){t.warn("fabric.Line is already defined");return}t.Line=t.util.createClass(t.Object,{type:"line",initialize:function(e,t){t=t||{},e||(e=[0,0,0,0]),this.callSuper("initialize",t),this.set("x1",e[0]),this.set("y1",e[1]),this.set("x2",e[2]),this.set("y2",e[3]),this._setWidthHeight(t)},_setWidthHeight:function(e){e||(e={}),this.set("width",this.x2-this.x1||1),this.set("height",this.y2-this.y1||1),this.set("left","left"in e?e.left:this.x1+this.width/2),this.set("top","top"in e?e.top:this.y1+this.height/2)},_set:function(e,t){return this[e]=t,e in r&&this._setWidthHeight(),this},_render:function(e){e.beginPath(),this.group&&e.translate(-this.group.width/2+this.left,-this.group.height/2+this.top),e.moveTo(this.width===1?0:-this.width/2,this.height===1?0:-this.height/2),e.lineTo(this.width===1?0:this.width/2,this.height===1?0:this.height/2),e.lineWidth=this.strokeWidth;var t=e.strokeStyle;e.strokeStyle=e.fillStyle,e.stroke(),e.strokeStyle=t},complexity:function(){return 1},toObject:function(e){return n(this.callSuper("toObject",e),{x1:this.get("x1"),y1:this.get("y1"),x2:this.get("x2"),y2:this.get("y2")})},toSVG:function(){var e=[];return this.stroke&&this.stroke.toLive&&e.push(this.stroke.toSVG(this,!0)),e.push("'),e.join("")}}),t.Line.ATTRIBUTE_NAMES="x1 y1 x2 y2 stroke stroke-width transform".split(" "),t.Line.fromElement=function(e,r){var i=t.parseAttributes(e,t.Line.ATTRIBUTE_NAMES),s=[i.x1||0,i.y1||0,i.x2||0,i.y2||0];return new t.Line(s,n(i,r))},t.Line.fromObject=function(e){var n=[e.x1,e.y1,e.x2,e.y2];return new t.Line(n,e)}}(typeof exports!="undefined"?exports:this),function(e){"use strict";function i(e){return"radius"in e&&e.radius>0}var t=e.fabric||(e.fabric={}),n=Math.PI*2,r=t.util.object.extend;if(t.Circle){t.warn("fabric.Circle is already defined.");return}t.Circle=t.util.createClass(t.Object,{type:"circle",initialize:function(e){e=e||{},this.set("radius",e.radius||0),this.callSuper("initialize",e);var t=this.get("radius")*2;this.set("width",t).set("height",t)},toObject:function(e){return r(this.callSuper("toObject",e),{radius:this.get("radius")})},toSVG:function(){var e=[];return this.fill&&this.fill.toLive&&e.push(this.fill.toSVG(this,!1)),this.stroke&&this.stroke.toLive&&e.push(this.stroke.toSVG(this,!1)),e.push("'),e.join("")},_render:function(e,t){e.beginPath(),e.globalAlpha=this.group?e.globalAlpha*this.opacity:this.opacity,e.arc(t?this.left:0,t?this.top:0,this.radius,0,n,!1),e.closePath(),this.fill&&e.fill(),this._removeShadow(e),this.stroke&&e.stroke()},getRadiusX:function(){return this.get("radius")*this.get("scaleX")},getRadiusY:function(){return this.get("radius")*this.get("scaleY")},setRadius:function(e){this.radius=e,this.set("width",e*2).set("height",e*2)},complexity:function(){return 1}}),t.Circle.ATTRIBUTE_NAMES="cx cy r fill fill-opacity opacity stroke stroke-width transform".split(" "),t.Circle.fromElement=function(e,n){n||(n={});var s=t.parseAttributes(e,t.Circle.ATTRIBUTE_NAMES);if(!i(s))throw new Error("value of `r` attribute is required and can not be negative");"left"in s&&(s.left-=n.width/2||0),"top"in s&&(s.top-=n.height/2||0);var o=new t.Circle(r(s,n));return o.cx=parseFloat(e.getAttribute("cx"))||0,o.cy=parseFloat(e.getAttribute("cy"))||0,o},t.Circle.fromObject=function(e){return new t.Circle(e)}}(typeof exports!="undefined"?exports:this),function(e){"use strict";var t=e.fabric||(e.fabric={});if(t.Triangle){t.warn("fabric.Triangle is already defined");return}t.Triangle=t.util.createClass(t.Object,{type:"triangle",initialize:function(e){e=e||{},this.callSuper("initialize",e),this.set("width",e.width||100).set("height",e.height||100)},_render:function(e){var t=this.width/2,n=this.height/2;e.beginPath(),e.moveTo(-t,n),e.lineTo(0,-n),e.lineTo(t,n),e.closePath(),this.fill&&e.fill(),this.stroke&&e.stroke()},complexity:function(){return 1},toSVG:function(){var e=[],t=this.width/2,n=this.height/2,r=[-t+" "+n,"0 "+ -n,t+" "+n].join(",");return this.fill&&this.fill.toLive&&e.push(this.fill.toSVG(this,!0)),this.stroke&&this.stroke.toLive&&e.push(this.stroke.toSVG(this,!0)),e.push("'),e.join("")}}),t.Triangle.fromObject=function(e){return new t.Triangle(e)}}(typeof exports!="undefined"?exports:this),function(e){"use strict";var t=e.fabric||(e.fabric={}),n=Math.PI*2,r=t.util.object.extend;if(t.Ellipse){t.warn("fabric.Ellipse is already defined.");return}t.Ellipse=t.util.createClass(t.Object,{type:"ellipse",rx:0,ry:0,initialize:function(e){e=e||{},this.callSuper("initialize",e),this.set("rx",e.rx||0),this.set("ry",e.ry||0),this.set("width",this.get("rx")*2),this.set("height",this.get("ry")*2)},toObject:function(e){return r(this.callSuper("toObject",e),{rx:this.get("rx"),ry:this.get("ry")})},toSVG:function(){var e=[];return this.fill&&this.fill.toLive&&e.push(this.fill.toSVG(this,!1)),this.stroke&&this.stroke.toLive&&e.push(this.stroke.toSVG(this,!1)),e.push("'),e.join("")},render:function(e,t){if(this.rx===0||this.ry===0)return;return this.callSuper("render",e,t)},_render:function(e,t){e.beginPath(),e.save(),e.globalAlpha=this.group?e.globalAlpha*this.opacity:this.opacity,this.transformMatrix&&this.group&&e.translate(this.cx,this.cy),e.transform(1,0,0,this.ry/this.rx,0,0),e.arc(t?this.left:0,t?this.top:0,this.rx,0,n,!1),this.stroke&&e.stroke(),this._removeShadow(e),this.fill&&e.fill(),e.restore()},complexity:function(){return 1}}),t.Ellipse.ATTRIBUTE_NAMES="cx cy rx ry fill fill-opacity opacity stroke stroke-width transform".split(" "),t.Ellipse.fromElement=function(e,n){n||(n={});var i=t.parseAttributes(e,t.Ellipse.ATTRIBUTE_NAMES),s=i.left,o=i.top;"left"in i&&(i.left-=n.width/2||0),"top"in i&&(i.top-=n.height/2||0);var u=new t.Ellipse(r(i,n));return u.cx=s||0,u.cy=o||0,u},t.Ellipse.fromObject=function(e){return new t.Ellipse(e)}}(typeof exports!="undefined"?exports:this),function(e){"use strict";function r(e){return e.left=e.left||0,e.top=e.top||0,e}var t=e.fabric||(e.fabric={}),n=t.util.object.extend;if(t.Rect){console.warn("fabric.Rect is already defined");return}t.Rect=t.util.createClass(t.Object,{type:"rect",rx:0,ry:0,initialize:function(e){e=e||{},this._initStateProperties(),this.callSuper("initialize",e),this._initRxRy(),this.x=0,this.y=0},_initStateProperties:function(){this.stateProperties=this.stateProperties.concat(["rx","ry"])},_initRxRy:function(){this.rx&&!this.ry?this.ry=this.rx:this.ry&&!this.rx&&(this.rx=this.ry)},_render:function(e){var t=this.rx||0,n=this.ry||0,r=-this.width/2,i=-this.height/2,s=this.width,o=this.height;e.beginPath(),e.globalAlpha=this.group?e.globalAlpha*this.opacity:this.opacity,this.transformMatrix&&this.group&&e.translate(this.width/2+this.x,this.height/2+this.y),!this.transformMatrix&&this.group&&e.translate(-this.group.width/2+this.width/2+this.x,-this.group.height/2+this.height/2+this.y),e.moveTo(r+t,i),e.lineTo(r+s-t,i),e.quadraticCurveTo(r+s,i,r+s,i+n,r+s,i+n),e.lineTo(r+s,i+o-n),e.quadraticCurveTo(r+s,i+o,r+s-t,i+o,r+s-t,i+o),e.lineTo(r+t,i+o),e.quadraticCurveTo(r,i+o,r,i+o-n,r,i+o-n),e.lineTo(r,i+n),e.quadraticCurveTo(r,i,r+t,i,r+t,i),e.closePath(),this.fill&&e.fill(),this._removeShadow(e),this.strokeDashArray?this._renderDashedStroke(e):this.stroke&&e.stroke()},_renderDashedStroke:function(e){function u(u,a){var f=0,l=0,c=(a?i.height:i.width)+s*2;while(fc&&(l=f-c),u?n+=h*u-(l*u||0):r+=h*a-(l*a||0),e[1&t?"moveTo":"lineTo"](n,r),t>=o&&(t=0)}}1&this.strokeDashArray.length&&this.strokeDashArray.push.apply(this.strokeDashArray,this.strokeDashArray);var t=0,n=-this.width/2,r=-this.height/2,i=this,s=this.padding,o=this.strokeDashArray.length;e.save(),e.beginPath(),u(1,0),u(0,1),u(-1,0),u(0,-1),e.stroke(),e.closePath(),e.restore()},_normalizeLeftTopProperties:function(e){return e.left&&this.set("left",e.left+this.getWidth()/2),this.set("x",e.left||0),e.top&&this.set("top",e.top+this.getHeight()/2),this.set("y",e.top||0),this},complexity:function(){return 1},toObject:function(e){return n(this.callSuper("toObject",e),{rx:this.get("rx")||0,ry:this.get("ry")||0})},toSVG:function(){var e=[];return this.fill&&this.fill.toLive&&e.push(this.fill.toSVG(this,!1)),this.stroke&&this.stroke.toLive&&e.push(this.stroke.toSVG(this,!1)),e.push("'),e.join("")}}),t.Rect.ATTRIBUTE_NAMES="x y width height rx ry fill fill-opacity opacity stroke stroke-width transform".split(" "),t.Rect.fromElement=function(e,i){if(!e)return null;var s=t.parseAttributes(e,t.Rect.ATTRIBUTE_NAMES);s=r(s);var o=new t.Rect(n(i?t.util.object.clone(i):{},s));return o._normalizeLeftTopProperties(s),o},t.Rect.fromObject=function(e){return new t.Rect(e)}}(typeof exports!="undefined"?exports:this),function(e){"use strict";var t=e.fabric||(e.fabric={}),n=t.util.toFixed;if(t.Polyline){t.warn("fabric.Polyline is already defined");return}t.Polyline=t.util.createClass(t.Object,{type:"polyline",initialize:function(e,t,n){t=t||{},this.set("points",e),this.callSuper("initialize",t),this._calcDimensions(n)},_calcDimensions:function(e){return t.Polygon.prototype._calcDimensions.call(this,e)},toObject:function(e){return t.Polygon.prototype.toObject.call(this,e)},toSVG:function(){var e=[],t=[];for(var r=0,i=this.points.length;r'),t.join("")},_render:function(e){var t;e.beginPath(),e.moveTo(this.points[0].x,this.points[0].y);for(var n=0,r=this.points.length;n'),t.join("")},_render:function(e){var t;e.beginPath(),e.moveTo(this.points[0].x,this.points[0].y);for(var n=0,r=this.points.length;n1&&(g=Math.sqrt(g),n*=g,i*=g);var y=d/n,b=p/n,w=-p/i,E=d/i,S=y*l+b*c,x=w*l+E*c,T=y*e+b*t,N=w*e+E*t,C=(T-S)*(T-S)+(N-x)*(N-x),k=1/C-.25;k<0&&(k=0);var L=Math.sqrt(k);a===u&&(L=-L);var A=.5*(S+T)-L*(N-x),O=.5*(x+N)+L*(T-S),M=Math.atan2(x-O,S-A),_=Math.atan2(N-O,T-A),D=_-M;D<0&&a===1?D+=2*Math.PI:D>0&&a===0&&(D-=2*Math.PI);var P=Math.ceil(Math.abs(D/(Math.PI*.5+.001))),H=[];for(var B=0;B"},toObject:function(e){var t=h(this.callSuper("toObject",e),{path:this.path});return this.sourcePath&&(t.sourcePath=this.sourcePath),this.transformMatrix&&(t.transformMatrix=this.transformMatrix),t},toDatalessObject:function(e){var t=this.toObject(e);return this.sourcePath&&(t.path=this.sourcePath),delete t.sourcePath,t},toSVG:function(){var e=[],t=[];for(var n=0,r=this.path.length;n',"",""),t.join("")},complexity:function(){return this.path.length},_parsePath:function(){var e=[],n,r,i;for(var s=0,o,u=this.path.length;sc)for(var h=1,p=o.length;h"];for(var n=0,r=e.length;n"),t.join("")},toString:function(){return"#"},isSameColor:function(){var e=this.getObjects()[0].get("fill");return this.getObjects().every(function(t){return t.get("fill")===e})},complexity:function(){return this.paths.reduce(function(e,t){return e+(t&&t.complexity?t.complexity():0)},0)},toGrayscale:function(){var e=this.paths.length;while(e--)this.paths[e].toGrayscale();return this},getObjects:function(){return this.paths}}),t.PathGroup.fromObject=function(e){var n=u(e.paths);return new t.PathGroup(n,e)}}(typeof exports!="undefined"?exports:this),function(e){"use strict";var t=e.fabric||(e.fabric={}),n=t.util.object.extend,r=t.util.array.min,i=t.util.array.max,s=t.util.array.invoke,o=t.util.removeFromArray;if(t.Group)return;var u={lockMovementX:!0,lockMovementY:!0,lockRotation:!0,lockScalingX:!0,lockScalingY:!0,lockUniScaling:!0};t.Group=t.util.createClass(t.Object,{type:"group",initialize:function(e,t){t=t||{},this._objects=e||[];for(var r=this._objects.length;r--;)this._objects[r].group=this;this.originalState={},this.callSuper("initialize"),this._calcBounds(),this._updateObjectsCoords(),t&&n(this,t),this._setOpacityIfSame(),this.setCoords(!0),this.saveCoords()},_updateObjectsCoords:function(){var e=this.left,t=this.top;this.forEachObject(function(n){var r=n.get("left"),i=n.get("top");n.set("originalLeft",r),n.set("originalTop",i),n.set("left",r-e),n.set("top",i-t),n.setCoords(),n.__origHasControls=n.hasControls,n.hasControls=!1},this)},toString:function(){return"#"},getObjects:function(){return this._objects},addWithUpdate:function(e){return this._restoreObjectsState(),this._objects.push(e),e.group=this,this._calcBounds(),this._updateObjectsCoords(),this},removeWithUpdate:function(e){return this._restoreObjectsState(),o(this._objects,e),delete e.group,e.setActive(!1),this._calcBounds(),this._updateObjectsCoords(),this},add:function(e){return this._objects.push(e),e.group=this,this},remove:function(e){return o(this._objects,e),delete e.group,this},size:function(){return this.getObjects().length},delegatedProperties:{fill:!0,opacity:!0,fontFamily:!0,fontWeight:!0,fontSize:!0,fontStyle:!0,lineHeight:!0,textDecoration:!0,textShadow:!0,textAlign:!0,backgroundColor:!0},_set:function(e,t){if(e in this.delegatedProperties){var n=this._objects.length;this[e]=t;while(n--)this._objects[n].set(e,t)}else this[e]=t},contains:function(e){return this._objects.indexOf(e)>-1},toObject:function(e){return n(this.callSuper("toObject",e),{objects:s(this._objects,"toObject",e)})},render:function(e,n){if(!this.visible)return;e.save(),this.transform(e);var r=Math.max(this.scaleX,this.scaleY);this.clipTo&&t.util.clipContext(this,e);for(var i=this._objects.length;i>0;i--){var s=this._objects[i-1],o=s.borderScaleFactor,u=s.hasRotatingPoint;if(!s.visible)continue;s.borderScaleFactor=r,s.hasRotatingPoint=!1,s.render(e),s.borderScaleFactor=o,s.hasRotatingPoint=u}this.clipTo&&e.restore(),!n&&this.active&&(this.drawBorders(e),this.drawControls(e)),e.restore(),this.setCoords()},item:function(e){return this.getObjects()[e]},complexity:function(){return this.getObjects().reduce(function(e,t){return e+=typeof t.complexity=="function"?t.complexity():0,e},0)},_restoreObjectsState:function(){return this._objects.forEach(this._restoreObjectState,this),this},_restoreObjectState:function(e){var t=this.get("left"),n=this.get("top"),r=this.getAngle()*(Math.PI/180),i=Math.cos(r)*e.get("top")+Math.sin(r)*e.get("left"),s=-Math.sin(r)*e.get("top")+Math.cos(r)*e.get("left");return e.setAngle(e.getAngle()+this.getAngle()),e.set("left",t+s*this.get("scaleX")),e.set("top",n+i*this.get("scaleY")),e.set("scaleX",e.get("scaleX")*this.get("scaleX")),e.set("scaleY",e.get("scaleY")*this.get("scaleY")),e.setCoords(),e.hasControls=e.__origHasControls,delete e.__origHasControls,e.setActive(!1),e.setCoords(),delete e.group,this},destroy:function(){return this._restoreObjectsState()},saveCoords:function(){return this._originalLeft=this.get("left"),this._originalTop=this.get("top"),this},hasMoved:function(){return this._originalLeft!==this.get("left")||this._originalTop!==this.get("top")},setObjectsCoords:function(){return this.forEachObject(function(e){e.setCoords()}),this},activateAllObjects:function(){return this.forEachObject(function(e){e.setActive()}),this},forEachObject:t.StaticCanvas.prototype.forEachObject,_setOpacityIfSame:function(){var e=this.getObjects(),t=e[0]?e[0].get("opacity"):1,n=e.every(function(e){return e.get("opacity")===t});n&&(this.opacity=t)},_calcBounds:function(){var e=[],t=[],n,s,o,u,a,f,l,c=0,h=this._objects.length;for(;ce.x&&i-ne.y},toGrayscale:function(){var e=this._objects.length;while(e--)this._objects[e].toGrayscale();return this},toSVG:function(){var e=[];for(var t=this._objects.length;t--;)e.push(this._objects[t].toSVG());return''+e.join("")+""},get:function(e){if(e in u){if(this[e])return this[e];for(var t=0,n=this._objects.length;t'+'"+""},getSrc:function(){return this.getElement().src||this.getElement()._src},toString:function(){return'#'},clone:function(e,t){this.constructor.fromObject(this.toObject(t),e)},applyFilters:function(e){if(this.filters.length===0){this.setElement(this._originalImage),e&&e();return}var t=typeof Buffer!="undefined"&&typeof window=="undefined",n=this._originalImage,r=fabric.util.createCanvasElement(),i=t?new(require("canvas").Image):fabric.document.createElement("img"),s=this;r.width=n.width,r.height=n.height,r.getContext("2d").drawImage(n,0,0,n.width,n.height),this.filters.forEach(function(e){e&&e.applyTo(r)}),i.onload=function(){s._element=i,e&&e(),i.onload=r=n=null},i.width=n.width,i.height=n.height;if(t){var o=r.toDataURL("image/png").substring(22);i.src=new Buffer(o,"base64"),s._element=i,e&&e()}else i.src=r.toDataURL("image/png");return this},_render:function(e){e.drawImage(this._element,-this.width/2,-this.height/2,this.width,this.height)},_resetWidthHeight:function(){var e=this.getElement();this.set("width",e.width),this.set("height",e.height)},_initElement:function(e){this.setElement(fabric.util.getById(e)),fabric.util.addClass(this.getElement(),fabric.Image.CSS_CANVAS)},_initConfig:function(e){e||(e={}),this.setOptions(e),this._setWidthHeight(e)},_initFilters:function(e){e.filters&&e.filters.length&&(this.filters=e.filters.map(function(e){return e&&fabric.Image.filters[e.type].fromObject(e)}))},_setWidthHeight:function(e){this.width="width"in e?e.width:this.getElement().width||0,this.height="height"in e?e.height:this.getElement().height||0},complexity:function(){return 1}}),fabric.Image.CSS_CANVAS="canvas-img",fabric.Image.prototype.getSvgSrc=fabric.Image.prototype.getSrc,fabric.Image.fromObject=function(e,t){var n=fabric.document.createElement("img"),r=e.src;e.width&&(n.width=e.width),e.height&&(n.height=e.height),n.onload=function(){fabric.Image.prototype._initFilters.call(e,e);var r=new fabric.Image(n,e);t&&t(r),n=n.onload=n.onerror=null},n.onerror=function(){fabric.log("Error loading "+n.src),t&&t(null,!0),n=n.onload=n.onerror=null},n.src=r},fabric.Image.fromURL=function(e,t,n){var r=fabric.document.createElement("img");r.onload=function(){t&&t(new fabric.Image(r,n)),r=r.onload=null},r.src=e},fabric.Image.ATTRIBUTE_NAMES="x y width height fill fill-opacity opacity stroke stroke-width transform xlink:href".split(" "),fabric.Image.fromElement=function(e,n,r){var i=fabric.parseAttributes(e,fabric.Image.ATTRIBUTE_NAMES);fabric.Image.fromURL(i["xlink:href"],n,t(r?fabric.util.object.clone(r):{},i))},fabric.Image.async=!0}(typeof exports!="undefined"?exports:this),fabric.util.object.extend(fabric.Object.prototype,{_getAngleValueForStraighten:function(){var e=this.getAngle()%360;return e>0?Math.round((e-1)/90)*90:Math.round(e/90)*90},straighten:function(){return this.setAngle(this._getAngleValueForStraighten()),this},fxStraighten:function(e){e=e||{};var t=function(){},n=e.onComplete||t,r=e.onChange||t,i=this;return fabric.util.animate({startValue:this.get("angle"),endValue:this._getAngleValueForStraighten(),duration:this.FX_DURATION,onChange:function(e){i.setAngle(e),r()},onComplete:function(){i.setCoords(),n()},onStart:function(){i.setActive(!1)}}),this}}),fabric.util.object.extend(fabric.StaticCanvas.prototype,{straightenObject:function(e){return e.straighten(),this.renderAll(),this},fxStraightenObject:function(e){return e.fxStraighten({onChange:this.renderAll.bind(this)}),this}}),fabric.Image.filters={},fabric.Image.filters.Grayscale=fabric.util.createClass({type:"Grayscale",applyTo:function(e){var t=e.getContext("2d"),n=t.getImageData(0,0,e.width,e.height),r=n.data,i=n.width,s=n.height,o,u,a,f;for(a=0;ao&&f>o&&l>o&&u(a-f)0&&(r[s]=a,r[s+1]=f,r[s+2]=l);t.putImageData(n,0,0)},toJSON:function(){return{type:this.type,color:this.color}}}),fabric.Image.filters.Tint.fromObject=function(e){return new fabric.Image.filters.Tint(e)},fabric.Image.filters.Convolute=fabric.util.createClass({type:"Convolute",initialize:function(e){e||(e={}),this.opaque=e.opaque,this.matrix=e.matrix||[0,0,0,0,1,0,0,0,0];var t=fabric.util.createCanvasElement();this.tmpCtx=t.getContext("2d")},_createImageData:function(e,t){return this.tmpCtx.createImageData(e,t)},applyTo:function(e){var t=this.matrix,n=e.getContext("2d"),r=n.getImageData(0,0,e.width,e.height),i=Math.round(Math.sqrt(t.length)),s=Math.floor(i/2),o=r.data,u=r.width,a=r.height,f=u,l=a,c=this._createImageData(f,l),h=c.data,p=this.opaque?1:0;for(var d=0;d=0&&N=0&&C'},_render:function(e){typeof Cufon=="undefined"||this.useNative===!0?this._renderViaNative(e):this._renderViaCufon(e)},_renderViaCufon:function(e){var t=Cufon.textOptions||(Cufon.textOptions={});t.left=this.left,t.top=this.top,t.context=e,t.color=this.fill;var n=this._initDummyElementForCufon();this.transform(e),Cufon.replaceElement(n,{engine:"canvas",separate:"none",fontFamily:this.fontFamily,fontWeight:this.fontWeight,textDecoration:this.textDecoration,textShadow:this.textShadow,textAlign:this.textAlign,fontStyle:this.fontStyle,lineHeight:this.lineHeight,strokeStyle:this.strokeStyle,strokeWidth:this.strokeWidth,backgroundColor:this.backgroundColor,textBackgroundColor:this.textBackgroundColor}),this.width=t.width,this.height=t.height,this._totalLineHeight=t.totalLineHeight,this._fontAscent=t.fontAscent,this._boundaries=t.boundaries,this._shadowOffsets=t.shadowOffsets,this._shadows=t.shadows||[],n=null,this.setCoords()},_renderViaNative:function(e){this.transform(e),this._setTextStyles(e);var n=this.text.split(/\r?\n/);this.width=this._getTextWidth(e,n),this.height=this._getTextHeight(e,n),this._renderTextBackground(e,n),this.textAlign!=="left"&&this.textAlign!=="justify"&&(e.save(),e.translate(this.textAlign==="center"?this.width/2:this.width,0)),this._setTextShadow(e),this.clipTo&&t.util.clipContext(this,e),this._renderTextFill(e,n),this._renderTextStroke(e,n),this.clipTo&&e.restore(),this.textShadow&&e.restore(),this.textAlign!=="left"&&this.textAlign!=="justify"&&e.restore(),this._renderTextDecoration(e,n),this._setBoundaries(e,n),this._totalLineHeight=0,this.setCoords()},_setBoundaries:function(e,t){this._boundaries=[];for(var n=0,r=t.length;nn&&(n=s)}return n},_setTextShadow:function(e){if(this.textShadow){var t=/\s+(-?\d+)(?:px)?\s+(-?\d+)(?:px)?\s+(\d+)(?:px)?\s*/,n=this.textShadow,r=t.exec(this.textShadow),i=n.replace(t,"");e.save(),e.shadowColor=i,e.shadowOffsetX=parseInt(r[1],10),e.shadowOffsetY=parseInt(r[2],10),e.shadowBlur=parseInt(r[3],10),this._shadows=[{blur:e.shadowBlur,color:e.shadowColor,offX:e.shadowOffsetX,offY:e.shadowOffsetY}],this._shadowOffsets=[[parseInt(e.shadowOffsetX,10),parseInt(e.shadowOffsetY,10)]]}},_drawTextLine:function(e,t,n,r,i){if(this.textAlign!=="justify"){t[e](n,r,i);return}var s=t.measureText(n).width,o=this.width;if(o>s){var u=n.split(/\s+/),a=t.measureText(n.replace(/\s+/g,"")).width,f=o-a,l=u.length-1,c=f/l,h=0;for(var p=0,d=u.length;p-1&&i(this.fontSize),this.textDecoration.indexOf("line-through")>-1&&i(this.fontSize/2),this.textDecoration.indexOf("overline")>-1&&i(0 -)},_getFontDeclaration:function(){return[t.isLikelyNode?this.fontWeight:this.fontStyle,t.isLikelyNode?this.fontStyle:this.fontWeight,this.fontSize+"px",t.isLikelyNode?'"'+this.fontFamily+'"':this.fontFamily].join(" ")},_initDummyElementForCufon:function(){var e=t.document.createElement("pre"),n=t.document.createElement("div");return n.appendChild(e),typeof G_vmlCanvasManager=="undefined"?e.innerHTML=this.text:e.innerText=this.text.replace(/\r?\n/gi,"\r"),e.style.fontSize=this.fontSize+"px",e.style.letterSpacing="normal",e},render:function(e,t){e.save(),this._render(e),!t&&this.active&&(this.drawBorders(e),this.drawControls(e)),e.restore()},toObject:function(e){return n(this.callSuper("toObject",e),{text:this.text,fontSize:this.fontSize,fontWeight:this.fontWeight,fontFamily:this.fontFamily,fontStyle:this.fontStyle,lineHeight:this.lineHeight,textDecoration:this.textDecoration,textShadow:this.textShadow,textAlign:this.textAlign,path:this.path,strokeStyle:this.strokeStyle,strokeWidth:this.strokeWidth,backgroundColor:this.backgroundColor,textBackgroundColor:this.textBackgroundColor,useNative:this.useNative})},toSVG:function(){var e=this.text.split(/\r?\n/),t=this.useNative?this.fontSize*this.lineHeight:-this._fontAscent-this._fontAscent/5*this.lineHeight,n=-(this.width/2),r=this.useNative?this.fontSize-1:this.height/2-e.length*this.fontSize-this._totalLineHeight,s=this._getSVGTextAndBg(t,n,e),o=this._getSVGShadows(t,e);return r+=this._fontAscent?this._fontAscent/5*this.lineHeight:0,['',s.textBgRects.join(""),"',o.join(""),s.textSpans.join(""),"",""].join("")},_getSVGShadows:function(e,n){var r=[],s,o,u,a,f=1;if(!this._shadows||!this._boundaries)return r;for(s=0,u=this._shadows.length;s",t.util.string.escapeXml(n[o]),""),f=1}else f++;return r},_getSVGTextAndBg:function(e,n,r){var s=[],o=[],u,a,f,l=1;this.backgroundColor&&this._boundaries&&o.push("');for(u=0,f=r.length;u",t.util.string.escapeXml(r[u]),""),l=1):l++;if(!this.textBackgroundColor||!this._boundaries)continue;o.push("')}return{textSpans:s,textBgRects:o}},_getFillAttributes:function(e){var n=e?new t.Color(e):"";return!n||!n.getSource()||n.getAlpha()===1?'fill="'+e+'"':'opacity="'+n.getAlpha()+'" fill="'+n.setAlpha(1).toRgb()+'"'},setColor:function(e){return this.set("fill",e),this},getText:function(){return this.text},_set:function(e,t){e==="fontFamily"&&this.path&&(this.path=this.path.replace(/(.*?)([^\/]*)(\.font\.js)/,"$1"+t+"$3")),this.callSuper("_set",e,t),e in s&&(this._initDimensions(),this.setCoords())}}),t.Text.ATTRIBUTE_NAMES="x y fill fill-opacity opacity stroke stroke-width transform font-family font-style font-weight font-size text-decoration".split(" "),t.Text.fromObject=function(e){return new t.Text(e.text,r(e))},t.Text.fromElement=function(e,n){if(!e)return null;var r=t.parseAttributes(e,t.Text.ATTRIBUTE_NAMES);n=t.util.object.extend(n?t.util.object.clone(n):{},r);var i=new t.Text(e.textContent,n);return i.set({left:i.getLeft()+i.getWidth()/2,top:i.getTop()-i.getHeight()/2}),i},t.util.createAccessors(t.Text)}(typeof exports!="undefined"?exports:this),function(){function request(e,t,n){var r=URL.parse(e),i=HTTP.request({hostname:r.hostname,port:r.port,path:r.pathname,method:"GET"},function(e){var r="";t&&e.setEncoding(t),e.on("end",function(){n(r)}),e.on("data",function(t){e.statusCode===200&&(r+=t)})});i.on("error",function(e){e.errno===process.ECONNREFUSED?fabric.log("ECONNREFUSED: connection refused to "+r.hostname+":"+r.port):fabric.log(e.message)})}function request_fs(e,t){var n=require("fs"),r=n.createReadStream(e),i="";r.on("data",function(e){i+=e}),r.on("end",function(){t(i)})}if(typeof document!="undefined"&&typeof window!="undefined")return;var DOMParser=(new require("xmldom")).DOMParser,URL=require("url"),HTTP=require("http"),Canvas=require("canvas"),Image=require("canvas").Image;fabric.util.loadImage=function(e,t,n){var r=function(r){i.src=new Buffer(r,"binary"),i._src=e,t&&t.call(n,i)},i=new Image;e&&e.indexOf("data")===0?(i.src=i._src=e,t&&t.call(n,i)):e&&e.indexOf("http")!==0?request_fs(e,r):e&&request(e,"binary",r)},fabric.loadSVGFromURL=function(e,t){e=e.replace(/^\n\s*/,"").replace(/\?.*$/,"").trim(),request(e,"",function(e){fabric.loadSVGFromString(e,t)})},fabric.loadSVGFromString=function(e,t){var n=(new DOMParser).parseFromString(e);fabric.parseSVGDocument(n.documentElement,function(e,n){t(e,n)})},fabric.util.getScript=function(url,callback){request(url,"",function(body){eval(body),callback&&callback()})},fabric.Image.fromObject=function(e,t){fabric.util.loadImage(e.src,function(n){var r=new fabric.Image(n);r._initConfig(e),r._initFilters(e),t(r)})},fabric.createCanvasForNode=function(e,t){var n=fabric.document.createElement("canvas"),r=new Canvas(e||600,t||600);n.style={},n.width=r.width,n.height=r.height;var i=fabric.Canvas||fabric.StaticCanvas,s=new i(n);return s.contextContainer=r.getContext("2d"),s.nodeCanvas=r,s.Font=Canvas.Font,s},fabric.StaticCanvas.prototype.createPNGStream=function(){return this.nodeCanvas.createPNGStream()},fabric.StaticCanvas.prototype.createJPEGStream=function(e){return this.nodeCanvas.createJPEGStream(e)};var origSetWidth=fabric.StaticCanvas.prototype.setWidth;fabric.StaticCanvas.prototype.setWidth=function(e){return origSetWidth.call(this,e),this.nodeCanvas.width=e,this},fabric.Canvas&&(fabric.Canvas.prototype.setWidth=fabric.StaticCanvas.prototype.setWidth);var origSetHeight=fabric.StaticCanvas.prototype.setHeight;fabric.StaticCanvas.prototype.setHeight=function(e){return origSetHeight.call(this,e),this.nodeCanvas.height=e,this},fabric.Canvas&&(fabric.Canvas.prototype.setHeight=fabric.StaticCanvas.prototype.setHeight)}(); \ No newline at end of file +/* build: `node build.js modules=ALL exclude=gestures` *//*! Fabric.js Copyright 2008-2013, Printio (Juriy Zaytsev, Maxim Chernyak) */var fabric=fabric||{version:"1.1.2"};typeof exports!="undefined"&&(exports.fabric=fabric),typeof document!="undefined"&&typeof window!="undefined"?(fabric.document=document,fabric.window=window):(fabric.document=require("jsdom").jsdom(""),fabric.window=fabric.document.createWindow()),fabric.isTouchSupported="ontouchstart"in fabric.document.documentElement,fabric.isLikelyNode=typeof Buffer!="undefined"&&typeof window=="undefined";var Cufon=function(){function r(e){var t=this.face=e.face;this.glyphs=e.glyphs,this.w=e.w,this.baseSize=parseInt(t["units-per-em"],10),this.family=t["font-family"].toLowerCase(),this.weight=t["font-weight"],this.style=t["font-style"]||"normal",this.viewBox=function(){var e=t.bbox.split(/\s+/),n={minX:parseInt(e[0],10),minY:parseInt(e[1],10),maxX:parseInt(e[2],10),maxY:parseInt(e[3],10)};return n.width=n.maxX-n.minX,n.height=n.maxY-n.minY,n.toString=function(){return[this.minX,this.minY,this.width,this.height].join(" ")},n}(),this.ascent=-parseInt(t.ascent,10),this.descent=-parseInt(t.descent,10),this.height=-this.ascent+this.descent}function i(){var e={},t={oblique:"italic",italic:"oblique"};this.add=function(t){(e[t.style]||(e[t.style]={}))[t.weight]=t},this.get=function(n,r){var i=e[n]||e[t[n]]||e.normal||e.italic||e.oblique;if(!i)return null;r={normal:400,bold:700}[r]||parseInt(r,10);if(i[r])return i[r];var s={1:1,99:0}[r%100],o=[],u,a;s===undefined&&(s=r>400),r==500&&(r=400);for(var f in i){f=parseInt(f,10);if(!u||fa)a=f;o.push(f)}return ra&&(r=a),o.sort(function(e,t){return(s?e>r&&t>r?et:et:e=i.length+e?r():setTimeout(arguments.callee,10)}),function(t){e?t():n.push(t)}}(),supports:function(e,t){var n=fabric.document.createElement("span").style;return n[e]===undefined?!1:(n[e]=t,n[e]===t)},textAlign:function(e,t,n,r){return t.get("textAlign")=="right"?n>0&&(e=" "+e):nk&&(k=N),A.push(N),N=0;continue}var O=t.glyphs[T[b]]||t.missingGlyph;if(!O)continue;N+=C=Number(O.w||t.w)+h}A.push(N),N=Math.max(k,N);var M=[];for(var b=A.length;b--;)M[b]=N-A[b];if(C===null)return null;d+=l.width-C,m+=l.minX;var _,D;if(f)_=u,D=u.firstChild;else{_=fabric.document.createElement("span"),_.className="cufon cufon-canvas",_.alt=n,D=fabric.document.createElement("canvas"),_.appendChild(D);if(i.printable){var P=fabric.document.createElement("span");P.className="cufon-alt",P.appendChild(fabric.document.createTextNode(n)),_.appendChild(P)}}var H=_.style,B=D.style||{},j=c.convert(l.height-p+v),F=Math.ceil(j),I=F/j;D.width=Math.ceil(c.convert(N+d-m)*I),D.height=F,p+=l.minY,B.top=Math.round(c.convert(p-t.ascent))+"px",B.left=Math.round(c.convert(m))+"px";var q=Math.ceil(c.convert(N*I)),R=q+"px",U=c.convert(t.height),z=(i.lineHeight-1)*c.convert(-t.ascent/5)*(L-1);Cufon.textOptions.width=q,Cufon.textOptions.height=U*L+z,Cufon.textOptions.lines=L,Cufon.textOptions.totalLineHeight=z,e?(H.width=R,H.height=U+"px"):(H.paddingLeft=R,H.paddingBottom=U-1+"px");var W=Cufon.textOptions.context||D.getContext("2d"),X=F/l.height;Cufon.textOptions.fontAscent=t.ascent*X,Cufon.textOptions.boundaries=null;for(var V=Cufon.textOptions.shadowOffsets,b=y.length;b--;)V[b]=[y[b][0]*X,y[b][1]*X];W.save(),W.scale(X,X),W.translate(-m-1/X*D.width/2+(Cufon.fonts[t.family].offsetLeft||0),-p-Cufon.textOptions.height/X/2+(Cufon.fonts[t.family].offsetTop||0)),W.lineWidth=t.face["underline-thickness"],W.save();var J=Cufon.getTextDecoration(i),K=i.fontStyle==="italic";W.save(),Q();if(g)for(var b=0,w=g.length;b.cufon-vml-canvas{text-indent:0}@media screen{cvml\\:shape,cvml\\:shadow{behavior:url(#default#VML);display:block;antialias:true;position:absolute}.cufon-vml-canvas{position:absolute;text-align:left}.cufon-vml{display:inline-block;position:relative;vertical-align:middle}.cufon-vml .cufon-alt{position:absolute;left:-10000in;font-size:1px}a .cufon-vml{cursor:pointer}}@media print{.cufon-vml *{display:none}.cufon-vml .cufon-alt{display:inline}}'),function(e,t,i,s,o,u,a){var f=t===null;f&&(t=o.alt);var l=e.viewBox,c=i.computedFontSize||(i.computedFontSize=new Cufon.CSS.Size(n(u,i.get("fontSize"))+"px",e.baseSize)),h=i.computedLSpacing;h==undefined&&(h=i.get("letterSpacing"),i.computedLSpacing=h=h=="normal"?0:~~c.convertFrom(r(u,h)));var p,d;if(f)p=o,d=o.firstChild;else{p=fabric.document.createElement("span"),p.className="cufon cufon-vml",p.alt=t,d=fabric.document.createElement("span"),d.className="cufon-vml-canvas",p.appendChild(d);if(s.printable){var v=fabric.document.createElement("span");v.className="cufon-alt",v.appendChild(fabric.document.createTextNode(t)),p.appendChild(v)}a||p.appendChild(fabric.document.createElement("cvml:shape"))}var m=p.style,g=d.style,y=c.convert(l.height),b=Math.ceil(y),w=b/y,E=l.minX,S=l.minY;g.height=b,g.top=Math.round(c.convert(S-e.ascent)),g.left=Math.round(c.convert(E)),m.height=c.convert(e.height)+"px";var x=Cufon.getTextDecoration(s),T=i.get("color"),N=Cufon.CSS.textTransform(t,i).split(""),C=0,k=0,L=null,A,O,M=s.textShadow;for(var _=0,D=0,P=N.length;_-1},complexity:function(){return this.getObjects().reduce(function(e,t){return e+=t.complexity?t.complexity():0,e},0)},toGrayscale:function(){return this.forEachObject(function(e){e.toGrayscale()})}},function(){function n(e,t){var n=e.indexOf(t);return n!==-1&&e.splice(n,1),e}function r(e,t){return Math.floor(Math.random()*(t-e+1))+e}function s(e){return e*i}function o(e){return e/i}function u(e,t,n){var r=Math.sin(n),i=Math.cos(n);e.subtractEquals(t);var s=e.x*i-e.y*r,o=e.x*r+e.y*i;return(new fabric.Point(s,o)).addEquals(t)}function a(e,t){return parseFloat(Number(e).toFixed(t))}function f(){return!1}function l(e){e||(e={});var t=+(new Date),n=e.duration||500,r=t+n,i,s=e.onChange||function(){},o=e.abort||function(){return!1},u=e.easing||function(e,t,n,r){return-n*Math.cos(e/r*(Math.PI/2))+n+t},a="startValue"in e?e.startValue:0,f="endValue"in e?e.endValue:100,l=e.byValue||f-a;e.onStart&&e.onStart(),function c(){i=+(new Date);var f=i>r?n:i-t;s(u(f,a,l,n));if(i>r||o()){e.onComplete&&e.onComplete();return}h(c)}()}function p(e,t,n){if(e){var r=new Image;r.onload=function(){t&&t.call(n,r),r=r.onload=null},r.src=e}else t&&t.call(n,e)}function d(e,t){function n(e){return fabric[fabric.util.string.camelize(fabric.util.string.capitalize(e))]}function r(){++s===o&&t&&t(i)}var i=[],s=0,o=e.length;e.forEach(function(e,t){if(!e.type)return;var s=n(e.type);s.async?s.fromObject(e,function(e,n){n||(i[t]=e),r()}):(i[t]=s.fromObject(e),r())})}function v(e,t,n){var r;if(e.length>1){var i=e.some(function(e){return e.type==="text"});i?(r=new fabric.Group([],t),e.reverse().forEach(function(e){e.cx&&(e.left=e.cx),e.cy&&(e.top=e.cy),r.addWithUpdate(e)})):r=new fabric.PathGroup(e,t)}else r=e[0];return typeof n!="undefined"&&r.setSourcePath(n),r}function m(e,t,n){if(n&&Object.prototype.toString.call(n)==="[object Array]")for(var r=0,i=n.length;rr)r+=u[p++%h],r>l&&(r=l),n[d?"lineTo":"moveTo"](r,0),d=!d;n.restore()}function y(e){return e||(e=fabric.document.createElement("canvas")),!e.getContext&&typeof G_vmlCanvasManager!="undefined"&&G_vmlCanvasManager.initElement(e),e}function b(e){var t=e.prototype;for(var n=t.stateProperties.length;n--;){var r=t.stateProperties[n],i=r.charAt(0).toUpperCase()+r.slice(1),s="set"+i,o="get"+i;t[o]||(t[o]=function(e){return new Function('return this.get("'+e+'")')}(r)),t[s]||(t[s]=function(e){return new Function("value",'return this.set("'+e+'", value)')}(r))}}function w(e,t){t.save(),t.beginPath(),e.clipTo(t),t.clip()}var e=Math.sqrt,t=Math.atan2;fabric.util={};var i=Math.PI/180,c=fabric.window.requestAnimationFrame||fabric.window.webkitRequestAnimationFrame||fabric.window.mozRequestAnimationFrame||fabric.window.oRequestAnimationFrame||fabric.window.msRequestAnimationFrame||function(e){fabric.window.setTimeout(e,1e3/60)},h=function(){return c.apply(fabric.window,arguments)};fabric.util.removeFromArray=n,fabric.util.degreesToRadians=s,fabric.util.radiansToDegrees=o,fabric.util.rotatePoint=u,fabric.util.toFixed=a,fabric.util.getRandomInt=r,fabric.util.falseFunction=f,fabric.util.animate=l,fabric.util.requestAnimFrame=h,fabric.util.loadImage=p,fabric.util.enlivenObjects=d,fabric.util.groupSVGElements=v,fabric.util.populateWithProperties=m,fabric.util.drawDashedLine=g,fabric.util.createCanvasElement=y,fabric.util.createAccessors=b,fabric.util.clipContext=w}(),function(){function t(t,n){var r=e.call(arguments,2),i=[];for(var s=0,o=t.length;s=r&&(r=e[n][t]);else while(n--)e[n]>=r&&(r=e[n]);return r}function r(e,t){if(!e||e.length===0)return undefined;var n=e.length-1,r=t?e[n][t]:e[n];if(t)while(n--)e[n][t]>>0;if(n===0)return-1;var r=0;arguments.length>0&&(r=Number(arguments[1]),r!==r?r=0:r!==0&&r!==Number.POSITIVE_INFINITY&&r!==Number.NEGATIVE_INFINITY&&(r=(r>0||-1)*Math.floor(Math.abs(r))));if(r>=n)return-1;var i=r>=0?r:Math.max(n-Math.abs(r),0);for(;i>>0;n>>0;r>>0;n>>0;n>>0;i>>0,n=0,r;if(arguments.length>1)r=arguments[1];else do{if(n in this){r=this[n++];break}if(++n>=t)throw new TypeError}while(!0);for(;n/g,">")}String.prototype.trim||(String.prototype.trim=function(){return this.replace(/^[\s\xA0]+/,"").replace(/[\s\xA0]+$/,"")}),fabric.util.string={camelize:e,capitalize:t,escapeXml:n}}(),function(){var e=Array.prototype.slice,t=Function.prototype.apply,n=function(){};Function.prototype.bind||(Function.prototype.bind=function(r){var i=this,s=e.call(arguments,1),o;return s.length?o=function(){return t.call(i,this instanceof n?this:r,s.concat(e.call(arguments)))}:o=function(){return t.call(i,this instanceof n?this:r,arguments)},n.prototype=this.prototype,o.prototype=new n,o})}(),function(){function i(){}function s(t){var n=this.constructor.superclass.prototype[t];return arguments.length>1?n.apply(this,e.call(arguments,1)):n.call(this)}function o(){function u(){this.initialize.apply(this,arguments)}var n=null,o=e.call(arguments,0);typeof o[0]=="function"&&(n=o.shift()),u.superclass=n,u.subclasses=[],n&&(i.prototype=n.prototype,u.prototype=new i,n.subclasses.push(u));for(var a=0,f=o.length;a-1?e.prototype[i]=function(e){return function(){var n=this.constructor.superclass;this.constructor.superclass=r;var i=t[e].apply(this,arguments);this.constructor.superclass=n;if(e!=="initialize")return i}}(i):e.prototype[i]=t[i],n&&(t.toString!==Object.prototype.toString&&(e.prototype.toString=t.toString),t.valueOf!==Object.prototype.valueOf&&(e.prototype.valueOf=t.valueOf))};fabric.util.createClass=o}(),function(){function e(e){var t=Array.prototype.slice.call(arguments,1),n,r,i=t.length;for(r=0;r-1?s(e,t.match(/opacity:\s*(\d?\.?\d*)/)[1]):e;for(var r in t)if(r==="opacity")s(e,t[r]);else{var i=r==="float"||r==="cssFloat"?typeof n.styleFloat=="undefined"?"cssFloat":"styleFloat":r;n[i]=t[r]}return e}var t=fabric.document.createElement("div"),n=typeof t.style.opacity=="string",r=typeof t.style.filter=="string",i=/alpha\s*\(\s*opacity\s*=\s*([^\)]+)\)/,s=function(e){return e};n?s=function(e,t){return e.style.opacity=t,e}:r&&(s=function(e,t){var n=e.style;return e.currentStyle&&!e.currentStyle.hasLayout&&(n.zoom=1),i.test(n.filter)?(t=t>=.9999?"":"alpha(opacity="+t*100+")",n.filter=n.filter.replace(i,t)):n.filter+=" alpha(opacity="+t*100+")",e}),fabric.util.setStyle=e}(),function(){function t(e){return typeof e=="string"?fabric.document.getElementById(e):e}function s(e,t){var n=fabric.document.createElement(e);for(var r in t)r==="class"?n.className=t[r]:r==="for"?n.htmlFor=t[r]:n.setAttribute(r,t[r]);return n}function o(e,t){(" "+e.className+" ").indexOf(" "+t+" ")===-1&&(e.className+=(e.className?" ":"")+t)}function u(e,t,n){return typeof t=="string"&&(t=s(t,n)),e.parentNode&&e.parentNode.replaceChild(t,e),t.appendChild(e),t}function a(e){var t=0,n=0;do t+=e.offsetTop||0,n+=e.offsetLeft||0,e=e.offsetParent;while(e);return{left:n,top:t}}var e=Array.prototype.slice,n=function(t){return e.call(t,0)},r;try{r=n(fabric.document.childNodes)instanceof Array}catch(i){}r||(n=function(e){var t=new Array(e.length),n=e.length;while(n--)t[n]=e[n];return t});var f;fabric.document.defaultView&&fabric.document.defaultView.getComputedStyle?f=function(e){return fabric.document.defaultView.getComputedStyle(e,null).position}:f=function(e){var t=e.style.position;return!t&&e.currentStyle&&(t=e.currentStyle.position),t},function(){function n(e){return typeof e.onselectstart!="undefined"&&(e.onselectstart=fabric.util.falseFunction),t?e.style[t]="none":typeof e.unselectable=="string"&&(e.unselectable="on"),e}function r(e){return typeof e.onselectstart!="undefined"&&(e.onselectstart=null),t?e.style[t]="":typeof e.unselectable=="string"&&(e.unselectable=""),e}var e=fabric.document.documentElement.style,t="userSelect"in e?"userSelect":"MozUserSelect"in e?"MozUserSelect":"WebkitUserSelect"in e?"WebkitUserSelect":"KhtmlUserSelect"in e?"KhtmlUserSelect":"";fabric.util.makeElementUnselectable=n,fabric.util.makeElementSelectable=r}(),function(){function e(e,t){var n=fabric.document.getElementsByTagName("head")[0],r=fabric.document.createElement("script"),i=!0;r.type="text/javascript",r.setAttribute("runat","server"),r.onload=r.onreadystatechange=function(e){if(i){if(typeof this.readyState=="string"&&this.readyState!=="loaded"&&this.readyState!=="complete")return;i=!1,t(e||fabric.window.event),r=r.onload=r.onreadystatechange=null}},r.src=e,n.appendChild(r)}fabric.util.getScript=e}(),fabric.util.getById=t,fabric.util.toArray=n,fabric.util.makeElement=s,fabric.util.addClass=o,fabric.util.wrapElement=u,fabric.util.getElementOffset=a,fabric.util.getElementPosition=f}(),function(){function e(e,t){return e+(/\?/.test(e)?"&":"?")+t}function n(){}function r(r,i){i||(i={});var s=i.method?i.method.toUpperCase():"GET",o=i.onComplete||function(){},u=t(),a;return u.onreadystatechange=function(){u.readyState===4&&(o(u),u.onreadystatechange=n)},s==="GET"&&(a=null,typeof i.parameters=="string"&&(r=e(r,i.parameters))),u.open(s,r,!0),(s==="POST"||s==="PUT")&&u.setRequestHeader("Content-Type","application/x-www-form-urlencoded"),u.send(a),u}var t=function(){var e=[function(){return new ActiveXObject("Microsoft.XMLHTTP")},function(){return new ActiveXObject("Msxml2.XMLHTTP")},function(){return new ActiveXObject("Msxml2.XMLHTTP.3.0")},function(){return new XMLHttpRequest}];for(var t=e.length;t--;)try{var n=e[t]();if(n)return e[t]}catch(r){}}();fabric.util.request=r}(),function(){function e(e,t,n,r){return n*(e/=r)*e+t}function t(e,t,n,r){return-n*(e/=r)*(e-2)+t}function n(e,t,n,r){return e/=r/2,e<1?n/2*e*e+t:-n/2*(--e*(e-2)-1)+t}function r(e,t,n,r){return n*(e/=r)*e*e+t}function i(e,t,n,r){return n*((e=e/r-1)*e*e+1)+t}function s(e,t,n,r){return e/=r/2,e<1?n/2*e*e*e+t:n/2*((e-=2)*e*e+2)+t}function o(e,t,n,r){return n*(e/=r)*e*e*e+t}function u(e,t,n,r){return-n*((e=e/r-1)*e*e*e-1)+t}function a(e,t,n,r){return e/=r/2,e<1?n/2*e*e*e*e+t:-n/2*((e-=2)*e*e*e-2)+t}function f(e,t,n,r){return n*(e/=r)*e*e*e*e+t}function l(e,t,n,r){return n*((e=e/r-1)*e*e*e*e+1)+t}function c(e,t,n,r){return e/=r/2,e<1?n/2*e*e*e*e*e+t:n/2*((e-=2)*e*e*e*e+2)+t}function h(e,t,n,r){return-n*Math.cos(e/r*(Math.PI/2))+n+t}function p(e,t,n,r){return n*Math.sin(e/r*(Math.PI/2))+t}function d(e,t,n,r){return-n/2*(Math.cos(Math.PI*e/r)-1)+t}function v(e,t,n,r){return e===0?t:n*Math.pow(2,10*(e/r-1))+t}function m(e,t,n,r){return e===r?t+n:n*(-Math.pow(2,-10*e/r)+1)+t}function g(e,t,n,r){return e===0?t:e===r?t+n:(e/=r/2,e<1?n/2*Math.pow(2,10*(e-1))+t:n/2*(-Math.pow(2,-10*--e)+2)+t)}function y(e,t,n,r){return-n*(Math.sqrt(1-(e/=r)*e)-1)+t}function b(e,t,n,r){return n*Math.sqrt(1-(e=e/r-1)*e)+t}function w(e,t,n,r){return e/=r/2,e<1?-n/2*(Math.sqrt(1-e*e)-1)+t:n/2*(Math.sqrt(1-(e-=2)*e)+1)+t}function E(e,t,n,r){var i=1.70158,s=0,o=n;return e===0?t:(e/=r,e===1?t+n:(s||(s=r*.3),o-1;e=e.split(/\s+/);var n=[],r,i;if(t){r=0,i=e.length;for(;r/i,"")));if(!s.documentElement)return;t.parseSVGDocument(s.documentElement,function(r,i){d.set(e,{objects:t.util.array.invoke(r,"toObject"),options:i}),n(r,i)},r)}e=e.replace(/^\n\s*/,"").trim(),d.has(e,function(r){r?d.get(e,function(e){var t=m(e);n(t.objects,t.options)}):new t.util.request(e,{method:"get",onComplete:i})})}function m(e){var n=e.objects,i=e.options;return n=n.map(function(e){return t[r(e.type)].fromObject(e)}),{objects:n,options:i}}function g(e,n,r){e=e.trim();var i;if(typeof DOMParser!="undefined"){var s=new DOMParser;s&&s.parseFromString&&(i=s.parseFromString(e,"text/xml"))}else t.window.ActiveXObject&&(i=new ActiveXObject("Microsoft.XMLDOM"),i.async="false",i.loadXML(e.replace(//i,"")));t.parseSVGDocument(i.documentElement,function(e,t){n(e,t)},r)}function y(e){var t="";for(var n=0,r=e.length;n',"",""].join("")),t}function b(e){var t="";return e.backgroundColor&&e.backgroundColor.source&&(t=['',''].join("")),t}var t=e.fabric||(e.fabric={}),n=t.util.object.extend,r=t.util.string.capitalize,i=t.util.object.clone,s={cx:"left",x:"left",cy:"top",y:"top",r:"radius","fill-opacity":"opacity","fill-rule":"fillRule","stroke-width":"strokeWidth",transform:"transformMatrix","text-decoration":"textDecoration","font-size":"fontSize","font-weight":"fontWeight","font-style":"fontStyle","font-family":"fontFamily"};t.parseTransformAttribute=function(){function e(e,t){var n=t[0];e[0]=Math.cos(n),e[1]=Math.sin(n),e[2]=-Math.sin(n),e[3]=Math.cos(n)}function t(e,t){var n=t[0],r=t.length===2?t[1]:t[0];e[0]=n,e[3]=r}function n(e,t){e[2]=t[0]}function r(e,t){e[1]=t[0]}function i(e,t){e[4]=t[0],t.length===2&&(e[5]=t[1])}var s=[1,0,0,1,0,0],o="(?:[-+]?\\d+(?:\\.\\d+)?(?:e[-+]?\\d+)?)",u="(?:\\s+,?\\s*|,\\s*)",a="(?:(skewX)\\s*\\(\\s*("+o+")\\s*\\))",f="(?:(skewY)\\s*\\(\\s*("+o+")\\s*\\))",l="(?:(rotate)\\s*\\(\\s*("+o+")(?:"+u+"("+o+")"+u+"("+o+"))?\\s*\\))",c="(?:(scale)\\s*\\(\\s*("+o+")(?:"+u+"("+o+"))?\\s*\\))",h="(?:(translate)\\s*\\(\\s*("+o+")(?:"+u+"("+o+"))?\\s*\\))",p="(?:(matrix)\\s*\\(\\s*("+o+")"+u+"("+o+")"+u+"("+o+")"+u+"("+o+")"+u+"("+o+")"+u+"("+o+")"+"\\s*\\))",d="(?:"+p+"|"+h+"|"+c+"|"+l+"|"+a+"|"+f+")",v="(?:"+d+"(?:"+u+d+")*"+")",m="^\\s*(?:"+v+"?)\\s*$",g=new RegExp(m),y=new RegExp(d);return function(o){var u=s.concat();return!o||o&&!g.test(o)?u:(o.replace(y,function(s){var o=(new RegExp(d)).exec(s).filter(function(e){return e!==""&&e!=null}),a=o[1],f=o.slice(2).map(parseFloat);switch(a){case"translate":i(u,f);break;case"rotate":e(u,f);break;case"scale":t(u,f);break;case"skewX":n(u,f);break;case"skewY":r(u,f);break;case"matrix":u=f}}),u)}}(),t.parseSVGDocument=function(){function s(e,t){while(e&&(e=e.parentNode))if(t.test(e.nodeName))return!0;return!1}var e=/^(path|circle|polygon|polyline|ellipse|rect|line|image|text)$/,n="(?:[-+]?\\d+(?:\\.\\d+)?(?:e[-+]?\\d+)?)",r=new RegExp("^\\s*("+n+"+)\\s*,?"+"\\s*("+n+"+)\\s*,?"+"\\s*("+n+"+)\\s*,?"+"\\s*("+n+"+)\\s*"+"$");return function(n,o,u){if(!n)return;var a=new Date,f=t.util.toArray(n.getElementsByTagName("*"));if(f.length===0){f=n.selectNodes("//*[name(.)!='svg']");var l=[];for(var c=0,p=f.length;c']:this.type==="radial"&&(i=["']);for(var s=0;s');return i.push(this.type==="linear"?"":""),i.join("")}}),fabric.util.object.extend(fabric.Gradient,{fromElement:function(n,r){var i=n.getElementsByTagName("stop"),s=n.nodeName==="linearGradient"?"linear":"radial",o=n.getAttribute("gradientUnits")||"objectBoundingBox",u=[],a={};s==="linear"?a={x1:n.getAttribute("x1")||0,y1:n.getAttribute("y1")||0,x2:n.getAttribute("x2")||"100%",y2:n.getAttribute("y2")||0}:s==="radial"&&(a={x1:n.getAttribute("fx")||n.getAttribute("cx")||"50%",y1:n.getAttribute("fy")||n.getAttribute("cy")||"50%",r1:0,x2:n.getAttribute("cx")||"50%",y2:n.getAttribute("cy")||"50%",r2:n.getAttribute("r")||"50%"});for(var f=i.length;f--;)u.push(e(i[f]));return t(r,a),new fabric.Gradient({type:s,coords:a,gradientUnits:o,colorStops:u})},forObject:function(e,n){return n||(n={}),t(e,n),new fabric.Gradient(n)}}),fabric.getGradientDefs=r}(),fabric.Pattern=fabric.util.createClass({repeat:"repeat",initialize:function(e){e||(e={}),e.source&&(this.source=typeof e.source=="string"?new Function(e.source):e.source),e.repeat&&(this.repeat=e.repeat)},toObject:function(){var e;return typeof this.source=="function"?e=String(this.source).match(/function\s+\w*\s*\(.*\)\s+\{([\s\S]*)\}/)[1]:typeof this.source.src=="string"&&(e=this.source.src),{source:e,repeat:this.repeat}},toLive:function(e){var t=typeof this.source=="function"?this.source():this.source;return e.createPattern(t,this.repeat)}}),fabric.Shadow=fabric.util.createClass({color:"rgb(0,0,0)",blur:0,offsetX:0,offsetY:0,affectStroke:!1,initialize:function(e){for(var t in e)this[t]=e[t]},toObject:function(){return{color:this.color,blur:this.blur,offsetX:this.offsetX,offsetY:this.offsetY}},toSVG:function(){}}),function(e){"use strict";function n(e,t){arguments.length>0&&this.init(e,t)}var t=e.fabric||(e.fabric={});if(t.Point){t.warn("fabric.Point is already defined");return}t.Point=n,n.prototype={constructor:n,init:function(e,t){this.x=e,this.y=t},add:function(e){return new n(this.x+e.x,this.y+e.y)},addEquals:function(e){return this.x+=e.x,this.y+=e.y,this},scalarAdd:function(e){return new n(this.x+e,this.y+e)},scalarAddEquals:function(e){return this.x+=e,this.y+=e,this},subtract:function(e){return new n(this.x-e.x,this.y-e.y)},subtractEquals:function(e){return this.x-=e.x,this.y-=e.y,this},scalarSubtract:function(e){return new n(this.x-e,this.y-e)},scalarSubtractEquals:function(e){return this.x-=e,this.y-=e,this},multiply:function(e){return new n(this.x*e,this.y*e)},multiplyEquals:function(e){return this.x*=e,this.y*=e,this},divide:function(e){return new n(this.x/e,this.y/e)},divideEquals:function(e){return this.x/=e,this.y/=e,this},eq:function(e){return this.x===e.x&&this.y===e.y},lt:function(e){return this.xe.x&&this.y>e.y},gte:function(e){return this.x>=e.x&&this.y>=e.y},lerp:function(e,t){return new n(this.x+(e.x-this.x)*t,this.y+(e.y-this.y)*t)},distanceFrom:function(e){var t=this.x-e.x,n=this.y-e.y;return Math.sqrt(t*t+n*n)},midPointFrom:function(e){return new n(this.x+(e.x-this.x)/2,this.y+(e.y-this.y)/2)},min:function(e){return new n(Math.min(this.x,e.x),Math.min(this.y,e.y))},max:function(e){return new n(Math.max(this.x,e.x),Math.max(this.y,e.y))},toString:function(){return this.x+","+this.y},setXY:function(e,t){this.x=e,this.y=t},setFromPoint:function(e){this.x=e.x,this.y=e.y},swap:function(e){var t=this.x,n=this.y;this.x=e.x,this.y=e.y,e.x=t,e.y=n}}}(typeof exports!="undefined"?exports:this),function(e){"use strict";function n(e){arguments.length>0&&this.init(e)}var t=e.fabric||(e.fabric={});if(t.Intersection){t.warn("fabric.Intersection is already defined");return}t.Intersection=n,t.Intersection.prototype={init:function(e){this.status=e,this.points=[]},appendPoint:function(e){this.points.push(e)},appendPoints:function(e){this.points=this.points.concat(e)}},t.Intersection.intersectLineLine=function(e,r,i,s){var o,u=(s.x-i.x)*(e.y-i.y)-(s.y-i.y)*(e.x-i.x),a=(r.x-e.x)*(e.y-i.y)-(r.y-e.y)*(e.x-i.x),f=(s.y-i.y)*(r.x-e.x)-(s.x-i.x)*(r.y-e.y);if(f!==0){var l=u/f,c=a/f;0<=l&&l<=1&&0<=c&&c<=1?(o=new n("Intersection"),o.points.push(new t.Point(e.x+l*(r.x-e.x),e.y+l*(r.y-e.y)))):o=new n("No Intersection")}else u===0||a===0?o=new n("Coincident"):o=new n("Parallel");return o},t.Intersection.intersectLinePolygon=function(e,t,r){var i=new n("No Intersection"),s=r.length;for(var o=0;o0&&(i.status="Intersection"),i},t.Intersection.intersectPolygonPolygon=function(e,t){var r=new n("No Intersection"),i=e.length;for(var s=0;s0&&(r.status="Intersection"),r},t.Intersection.intersectPolygonRectangle=function(e,r,i){var s=r.min(i),o=r.max(i),u=new t.Point(o.x,s.y),a=new t.Point(s.x,o.y),f=n.intersectLinePolygon(s,u,e),l=n.intersectLinePolygon(u,o,e),c=n.intersectLinePolygon(o,a,e),h=n.intersectLinePolygon(a,s,e),p=new n("No Intersection");return p.appendPoints(f.points),p.appendPoints(l.points),p.appendPoints(c.points),p.appendPoints(h.points),p.points.length>0&&(p.status="Intersection"),p}}(typeof exports!="undefined"?exports:this),function(e){"use strict";function n(e){e?this._tryParsingColor(e):this.setSource([0,0,0,1])}var t=e.fabric||(e.fabric={});if(t.Color){t.warn("fabric.Color is already defined.");return}t.Color=n,t.Color.prototype={_tryParsingColor:function(e){var t;e in n.colorNameMap&&(e=n.colorNameMap[e]),t=n.sourceFromHex(e),t||(t=n.sourceFromRgb(e)),t&&this.setSource(t)},getSource:function(){return this._source},setSource:function(e){this._source=e},toRgb:function(){var e=this.getSource();return"rgb("+e[0]+","+e[1]+","+e[2]+")"},toRgba:function(){var e=this.getSource();return"rgba("+e[0]+","+e[1]+","+e[2]+","+e[3]+")"},toHex:function(){var e=this.getSource(),t=e[0].toString(16);t=t.length===1?"0"+t:t;var n=e[1].toString(16);n=n.length===1?"0"+n:n;var r=e[2].toString(16);return r=r.length===1?"0"+r:r,t.toUpperCase()+n.toUpperCase()+r.toUpperCase()},getAlpha:function(){return this.getSource()[3]},setAlpha:function(e){var t=this.getSource();return t[3]=e,this.setSource(t),this},toGrayscale:function(){var e=this.getSource(),t=parseInt((e[0]*.3+e[1]*.59+e[2]*.11).toFixed(0),10),n=e[3];return this.setSource([t,t,t,n]),this},toBlackWhite:function(e){var t=this.getSource(),n=(t[0]*.3+t[1]*.59+t[2]*.11).toFixed(0),r=t[3];return e=e||127,n=Number(n)',''),t.push("',"Created with Fabric.js ",fabric.version,"","",fabric.createSVGFontFacesMarkup(this.getObjects()),fabric.createSVGRefElementsMarkup(this),""),this.backgroundColor&&this.backgroundColor.source&&t.push('"),this.backgroundImage&&t.push(''),this.overlayImage&&t.push('');for(var n=0,r=this.getObjects(),i=r.length;n"),t.join("")},remove:function(e){return this.getActiveObject()===e&&(this.fire("before:selection:cleared",{target:e}),this.discardActiveObject(),this.fire("selection:cleared")),fabric.Collection.remove.call(this,e)},sendToBack:function(e){return n(this._objects,e),this._objects.unshift(e),this.renderAll&&this.renderAll()},bringToFront:function(e){return n(this._objects,e),this._objects.push(e),this.renderAll&&this.renderAll()},sendBackwards:function(e){var t=this._objects.indexOf(e),r=t;if(t!==0){for(var i=t-1;i>=0;--i){var s=e.intersectsWithObject(this._objects[i])||e.isContainedWithinObject(this._objects[i])||this._objects[i].isContainedWithinObject(e);if(s){r=i;break}}n(this._objects,e),this._objects.splice(r,0,e)}return this.renderAll&&this.renderAll()},bringForward:function(e){var t=this.getObjects(),r=t.indexOf(e),i=r;if(r!==t.length-1){for(var s=r+1,o=this._objects.length;s"},e(fabric.StaticCanvas,{EMPTY_JSON:'{"objects": [], "background": "white"}',toGrayscale:function(e){var t=e.getContext("2d"),n=t.getImageData(0,0,e.width,e.height),r=n.data,i=n.width,s=n.height,o,u,a,f;for(a=0;a0&&(t>this.targetFindTolerance?t-=this.targetFindTolerance:t=0,n>this.targetFindTolerance?n-=this.targetFindTolerance:n=0);var o=!0,u=r.getImageData(t,n,this.targetFindTolerance*2||1,this.targetFindTolerance*2||1);for(var a=3;a0?0:-n),t.ey-(r>0?0:-r),i,o),e.lineWidth=this.selectionLineWidth,e.strokeStyle=this.selectionBorderColor;if(this.selectionDashArray.length>1){var u=t.ex+a-(n>0?0:i),f=t.ey+a-(r>0?0:o);e.beginPath(),fabric.util.drawDashedLine(e,u,f,u+i,f,this.selectionDashArray),fabric.util.drawDashedLine(e,u,f+o-1,u+i,f+o-1,this.selectionDashArray),fabric.util.drawDashedLine(e,u,f,u,f+o,this.selectionDashArray),fabric.util.drawDashedLine(e,u+i-1,f,u+i-1,f+o,this.selectionDashArray),e.closePath(),e.stroke()}else e.strokeRect(t.ex+a-(n>0?0:i),t.ey+a-(r>0?0:o),i,o)},_findSelectedObjects:function(e){var t=[],n=this._groupSelector.ex,r=this._groupSelector.ey,i=n+this._groupSelector.left,s=r+this._groupSelector.top,a,f=new fabric.Point(o(n,i),o(r,s)),l=new fabric.Point(u(n,i),u(r,s));for(var c=0,h=this._objects.length;c1&&(t=new fabric.Group(t),this.setActiveGroup(t),t.saveCoords(),this.fire("selection:created",{target:t})),this.renderAll()},findTarget:function(e,t){var n,r=this.getPointer(e);if(this.controlsAboveOverlay&&this.lastRenderedObjectWithControlsAboveOverlay&&this.containsPoint(e,this.lastRenderedObjectWithControlsAboveOverlay)&&this.lastRenderedObjectWithControlsAboveOverlay._findTargetCorner(e,this._offset))return n=this.lastRenderedObjectWithControlsAboveOverlay,n;var i=this.getActiveGroup();if(i&&!t&&this.containsPoint(e,i))return n=i,n;var s=[];for(var o=this._objects.length;o--;)if(this._objects[o]&&this.containsPoint(e,this._objects[o])){if(!this.perPixelTargetFind&&!this._objects[o].perPixelTargetFind){n=this._objects[o],this.relatedTarget=n;break}s[s.length]=this._objects[o]}for(var u=0,a=s.length;u"},get:function(e){return this[e]},set:function(e,t){if(typeof e=="object")for(var n in e)this._set(n,e[n]);else typeof t=="function"?this._set(e,t(this.get(e))):this._set(e,t);return this},_set:function(e,t){var n=e==="scaleX"||e==="scaleY";n&&(t=this._constrainScale(t));if(e==="scaleX"&&t<0)this.flipX=!this.flipX,t*=-1;else if(e==="scaleY"&&t<0)this.flipY=!this.flipY,t*=-1;else if(e==="width"||e==="height")this.minScaleLimit=r(Math.min(.1,1/Math.max(this.width,this.height)),2);return this[e]=t,this},toggle:function(e){var t=this.get(e);return typeof t=="boolean"&&this.set(e,!t),this},setSourcePath:function(e){return this.sourcePath=e,this},render:function(e,n){if(this.width===0||this.height===0||!this.visible)return;e.save();var r=this.transformMatrix;r&&!this.group&&e.setTransform(r[0],r[1],r[2],r[3],r[4],r[5]),n||this.transform(e);if(this.stroke||this.strokeDashArray)e.lineWidth=this.strokeWidth,this.stroke&&this.stroke.toLive?e.strokeStyle=this.stroke.toLive(e):e.strokeStyle=this.stroke;this.overlayFill?e.fillStyle=this.overlayFill:this.fill&&(e.fillStyle=this.fill.toLive?this.fill.toLive(e):this.fill),r&&this.group&&(e.translate(-this.group.width/2,-this.group.height/2),e.transform(r[0],r[1],r[2],r[3],r[4],r[5])),this._setShadow(e),this.clipTo&&t.util.clipContext(this,e),this._render(e,n),this.clipTo&&e.restore(),this._removeShadow(e),this.active&&!n&&(this.drawBorders(e),this.drawControls(e)),e.restore()},_setShadow:function(e){if(!this.shadow)return;e.shadowColor=this.shadow.color,e.shadowBlur=this.shadow.blur,e.shadowOffsetX=this.shadow.offsetX,e.shadowOffsetY=this.shadow.offsetY},_removeShadow:function(e){e.shadowColor="",e.shadowBlur=e.shadowOffsetX=e.shadowOffsetY=0},clone:function(e,n){return this.constructor.fromObject?this.constructor.fromObject(this.toObject(n),e):new t.Object(this.toObject(n))},cloneAsImage:function(e){if(t.Image){var n=new o;n.onload=function(){e&&e(new t.Image(n),r),n=n.onload=null};var r={angle:this.getAngle(),flipX:this.getFlipX(),flipY:this.getFlipY()};this.set({angle:0,flipX:!1,flipY:!1}),this.toDataURL(function(e){n.src=e})}return this},toDataURL:function(e){function i(t){t.left=n.width/2,t.top=n.height/2,t.setActive(!1),r.add(t);var i=r.toDataURL();r.dispose(),r=t=null,e&&e(i)}var n=t.util.createCanvasElement();n.width=this.getBoundingRectWidth(),n.height=this.getBoundingRectHeight(),t.util.wrapElement(n,"div");var r=new t.Canvas(n);r.backgroundColor="transparent",r.renderAll(),this.constructor.async?this.clone(i):i(this.clone())},hasStateChanged:function(){return this.stateProperties.some(function(e){return this[e]!==this.originalState[e]},this)},saveState:function(e){return this.stateProperties.forEach(function(e){this.originalState[e]=this.get(e)},this),e&&e.stateProperties&&e.stateProperties.forEach(function(e){this.originalState[e]=this.get(e)},this),this},setupState:function(){this.originalState={},this.saveState()},isType:function(e){return this.type===e},toGrayscale:function(){var e=this.get("fill");return e&&this.set("overlayFill",(new t.Color(e)).toGrayscale().toRgb()),this},complexity:function(){return 0},toJSON:function(e){return this.toObject(e)},setGradient:function(e,n){n||(n={});var r={colorStops:[]};r.type=n.type||(n.r1||n.r2?"radial":"linear"),r.coords={x1:n.x1,y1:n.y1,x2:n.x2,y2:n.y2};if(n.r1||n.r2)r.coords.r1=n.r1,r.coords.r2=n.r2;for(var i in n.colorStops){var s=new t.Color(n.colorStops[i]);r.colorStops.push({offset:i,color:s.toRgb(),opacity:s.getAlpha()})}this.set(e,t.Gradient.forObject(this,r))},setPatternFill:function(e){this.set("fill",new t.Pattern(e))},setShadow:function(e){this.set("shadow",new t.Shadow(e))},animate:function(){if(arguments[0]&&typeof arguments[0]=="object")for(var e in arguments[0])this._animate(e,arguments[0][e],arguments[1]);else this._animate.apply(this,arguments);return this},_animate:function(e,n,r){var i=this,s;n=n.toString(),r?r=t.util.object.clone(r):r={},~e.indexOf(".")&&(s=e.split("."));var o=s?this.get(s[0])[s[1]]:this.get(e);"from"in r||(r.from=o),~n.indexOf("=")?n=o+parseFloat(n.replace("=","")):n=parseFloat(n),t.util.animate({startValue:r.from,endValue:n,byValue:r.by,easing:r.easing,duration:r.duration,onChange:function(t){s?i[s[0]][s[1]]=t:i.set(e,t),r.onChange&&r.onChange()},onComplete:function(){i.setCoords(),r.onComplete&&r.onComplete()}})},centerH:function(){return this.canvas.centerObjectH(this),this},centerV:function(){return this.canvas.centerObjectV(this),this},center:function(){return this.centerH().centerV()},remove:function(){return this.canvas.remove(this)},sendToBack:function(){return this.group?t.StaticCanvas.prototype.sendToBack.call(this.group,this):this.canvas.sendToBack(this),this},bringToFront:function(){return this.group?t.StaticCanvas.prototype.bringToFront.call(this.group,this):this.canvas.bringToFront(this),this},sendBackwards:function(){return this.group?t.StaticCanvas.prototype.sendBackwards.call(this.group,this):this.canvas.sendBackwards(this),this},bringForward:function(){return this.group?t.StaticCanvas.prototype.bringForward.call(this.group,this):this.canvas.bringForward(this),this}}),t.util.createAccessors(t.Object),t.Object.prototype.rotate=t.Object.prototype.setAngle,n(t.Object.prototype,t.Observable),t.Object.NUM_FRACTION_DIGITS=2,t.Object.__uid=0}(typeof exports!="undefined"?exports:this),function(){var e=fabric.util.degreesToRadians;fabric.util.object.extend(fabric.Object.prototype,{translateToCenterPoint:function(t,n,r){var i=t.x,s=t.y;return n==="left"?i=t.x+this.getWidth()/2:n==="right"&&(i=t.x-this.getWidth()/2),r==="top"?s=t.y+this.getHeight()/2:r==="bottom"&&(s=t.y-this.getHeight()/2),fabric.util.rotatePoint(new fabric.Point(i,s),t,e(this.angle))},translateToOriginPoint:function(t,n,r){var i=t.x,s=t.y;return n==="left"?i=t.x-this.getWidth()/2:n==="right"&&(i=t.x+this.getWidth()/2),r==="top"?s=t.y-this.getHeight()/2:r==="bottom"&&(s=t.y+this.getHeight()/2),fabric.util.rotatePoint(new fabric.Point(i,s),t,e(this.angle))},getCenterPoint:function(){return this.translateToCenterPoint(new fabric.Point(this.left,this.top),this.originX,this.originY)},toLocalPoint:function(t,n,r){var i=this.getCenterPoint(),s,o;return n!==undefined&&r!==undefined?(n==="left"?s=i.x-this.getWidth()/2:n==="right"?s=i.x+this.getWidth()/2:s=i.x,r==="top"?o=i.y-this.getHeight()/2:r==="bottom"?o=i.y+this.getHeight()/2:o=i.y):(s=this.left,o=this.top),fabric.util.rotatePoint(new fabric.Point(t.x,t.y),i,-e(this.angle)).subtractEquals(new fabric.Point(s,o))},setPositionByOrigin:function(e,t,n){var r=this.translateToCenterPoint(e,t,n),i=this.translateToOriginPoint(r,this.originX,this.originY);this.set("left",i.x),this.set("top",i.y)},adjustPosition:function(t){var n=e(this.angle),r=this.getWidth()/2,i=Math.cos(n)*r,s=Math.sin(n)*r,o=this.getWidth(),u=Math.cos(n)*o,a=Math.sin(n)*o;this.originX==="center"&&t==="left"||this.originX==="right"&&t==="center"?(this.left-=i,this.top-=s):this.originX==="left"&&t==="center"||this.originX==="center"&&t==="right"?(this.left+=i,this.top+=s):this.originX==="left"&&t==="right"?(this.left+=u,this.top+=a):this.originX==="right"&&t==="left"&&(this.left-=u,this.top-=a),this.setCoords(),this.originX=t}})}(),function(){var e=fabric.util.degreesToRadians;fabric.util.object.extend(fabric.Object.prototype,{intersectsWithRect:function(e,t){var n=this.oCoords,r=new fabric.Point(n.tl.x,n.tl.y),i=new fabric.Point(n.tr.x,n.tr.y),s=new fabric.Point(n.bl.x,n.bl.y),o=new fabric.Point(n.br.x,n.br.y),u=fabric.Intersection.intersectPolygonRectangle([r,i,o,s],e,t);return u.status==="Intersection"},intersectsWithObject:function(e){function t(e){return{tl:new fabric.Point(e.tl.x,e.tl.y),tr:new fabric.Point(e.tr.x,e.tr.y),bl:new fabric.Point(e.bl.x,e.bl.y),br:new fabric.Point(e.br.x,e.br.y)}}var n=t(this.oCoords),r=t(e.oCoords),i=fabric.Intersection.intersectPolygonPolygon([n.tl,n.tr,n.br,n.bl],[r.tl,r.tr,r.br,r.bl]);return i.status==="Intersection"},isContainedWithinObject:function(e){return this.isContainedWithinRect(e.oCoords.tl,e.oCoords.br)},isContainedWithinRect:function(e,t){var n=this.oCoords,r=new fabric.Point(n.tl.x,n.tl.y),i=new fabric.Point(n.tr.x,n.tr.y),s=new fabric.Point(n.bl.x,n.bl.y);return r.x>e.x&&i.xe.y&&s.y1?this.strokeWidth:0,n=this.padding,r=e(this.angle);this.currentWidth=(this.width+t)*this.scaleX+n*2,this.currentHeight=(this.height+t)*this.scaleY+n*2,this.currentWidth<0&&(this.currentWidth=Math.abs(this.currentWidth));var i=Math.sqrt(Math.pow(this.currentWidth/2,2)+Math.pow(this.currentHeight/2,2)),s=Math.atan(this.currentHeight/this.currentWidth),o=Math.cos(s+r)*i,u=Math.sin(s+r)*i,a=Math.sin(r),f=Math.cos(r),l=this.getCenterPoint(),c={x:l.x-o,y:l.y-u},h={x:c.x+this.currentWidth*f,y:c.y+this.currentWidth*a},p={x:h.x-this.currentHeight*a,y:h.y+this.currentHeight*f},d={x:c.x-this.currentHeight*a,y:c.y+this.currentHeight*f},v={x:c.x-this.currentHeight/2*a,y:c.y+this.currentHeight/2*f},m={x:c.x+this.currentWidth/2*f,y:c.y+this.currentWidth/2*a},g={x:h.x-this.currentHeight/2*a,y:h.y+this.currentHeight/2*f},y={x:d.x+this.currentWidth/2*f,y:d.y+this.currentWidth/2*a},b={x:c.x+this.currentWidth/2*f,y:c.y+this.currentWidth/2*a};return this.oCoords={tl:c,tr:h,br:p,bl:d,ml:v,mt:m,mr:g,mb:y,mtr:b},this._setCornerCoords(),this}})}(),function(){var e=fabric.util.getPointer,t=fabric.util.degreesToRadians;fabric.util.object.extend(fabric.Object.prototype,{_findTargetCorner:function(t,n){if(!this.hasControls||!this.active)return!1;var r=e(t,this.canvas.upperCanvasEl),i=r.x-n.left,s=r.y-n.top,o,u;for(var a in this.oCoords){if(a==="mtr"&&!this.hasRotatingPoint)continue;if(!(!this.get("lockUniScaling")||a!=="mt"&&a!=="mr"&&a!=="mb"&&a!=="ml"))continue;u=this._getImageLines(this.oCoords[a].corner,a),o=this._findCrossPoints(i,s,u);if(o%2===1&&o!==0)return this.__corner=a,a}return!1},_findCrossPoints:function(e,t,n){var r,i,s,o,u,a,f=0,l;for(var c in n){l=n[c];if(l.o.y=t&&l.d.y>=t)continue;l.o.x===l.d.x&&l.o.x>=e?(u=l.o.x,a=t):(r=0,i=(l.d.y-l.o.y)/(l.d.x-l.o.x),s=t-r*e,o=l.o.y-i*l.o.x,u=-(s-o)/(r-i),a=s+r*u),u>=e&&(f+=1);if(f===2)break}return f},_getImageLines:function(e){return{topline:{o:e.tl,d:e.tr},rightline:{o:e.tr,d:e.br},bottomline:{o:e.br,d:e.bl},leftline:{o:e.bl,d:e.tl}}},_setCornerCoords:function(){var e=this.oCoords,n=t(this.angle),r=t(45-this.angle),i=Math.sqrt(2*Math.pow(this.cornerSize,2))/2,s=i*Math.cos(r),o=i*Math.sin(r),u=Math.sin(n),a=Math.cos(n);e.tl.corner={tl:{x:e.tl.x-o,y:e.tl.y-s},tr:{x:e.tl.x+s,y:e.tl.y-o},bl:{x:e.tl.x-s,y:e.tl.y+o},br:{x:e.tl.x+o,y:e.tl.y+s}},e.tr.corner={tl:{x:e.tr.x-o,y:e.tr.y-s},tr:{x:e.tr.x+s,y:e.tr.y-o},br:{x:e.tr.x+o,y:e.tr.y+s},bl:{x:e.tr.x-s,y:e.tr.y+o}},e.bl.corner={tl:{x:e.bl.x-o,y:e.bl.y-s},bl:{x:e.bl.x-s,y:e.bl.y+o},br:{x:e.bl.x+o,y:e.bl.y+s},tr:{x:e.bl.x+s,y:e.bl.y-o}},e.br.corner={tr:{x:e.br.x+s,y:e.br.y-o},bl:{x:e.br.x-s,y:e.br.y+o},br:{x:e.br.x+o,y:e.br.y+s},tl:{x:e.br.x-o,y:e.br.y-s}},e.ml.corner={tl:{x:e.ml.x-o,y:e.ml.y-s},tr:{x:e.ml.x+s,y:e.ml.y-o},bl:{x:e.ml.x-s,y:e.ml.y+o},br:{x:e.ml.x+o,y:e.ml.y+s}},e.mt.corner={tl:{x:e.mt.x-o,y:e.mt.y-s},tr:{x:e.mt.x+s,y:e.mt.y-o},bl:{x:e.mt.x-s,y:e.mt.y+o},br:{x:e.mt.x+o,y:e.mt.y+s}},e.mr.corner={tl:{x:e.mr.x-o,y:e.mr.y-s},tr:{x:e.mr.x+s,y:e.mr.y-o},bl:{x:e.mr.x-s,y:e.mr.y+o},br:{x:e.mr.x+o,y:e.mr.y+s}},e.mb.corner={tl:{x:e.mb.x-o,y:e.mb.y-s},tr:{x:e.mb.x+s,y:e.mb.y-o},bl:{x:e.mb.x-s,y:e.mb.y+o},br:{x:e.mb.x+o,y:e.mb.y+s}},e.mtr.corner={tl:{x:e.mtr.x-o+u*this.rotatingPointOffset,y:e.mtr.y-s-a*this.rotatingPointOffset},tr:{x:e.mtr.x+s+u*this.rotatingPointOffset,y:e.mtr.y-o-a*this.rotatingPointOffset},bl:{x:e.mtr.x-s+u*this.rotatingPointOffset,y:e.mtr.y+o-a*this.rotatingPointOffset},br:{x:e.mtr.x+o+u*this.rotatingPointOffset,y:e.mtr.y+s-a*this.rotatingPointOffset}}},drawBorders:function(e){if(!this.hasBorders)return;var t=this.padding,n=t*2,r=this.strokeWidth>1?this.strokeWidth:0;e.save(),e.globalAlpha=this.isMoving?this.borderOpacityWhenMoving:1,e.strokeStyle=this.borderColor;var i=1/this._constrainScale(this.scaleX),s=1/this._constrainScale(this.scaleY);e.lineWidth=1/this.borderScaleFactor,e.scale(i,s);var o=this.getWidth(),u=this.getHeight();e.strokeRect(~~(-(o/2)-t-r/2*this.scaleX)+.5,~~(-(u/2)-t-r/2*this.scaleY)+.5,~~(o+n+r*this.scaleX),~~(u+n+r*this.scaleY));if(this.hasRotatingPoint&&!this.get("lockRotation")&&this.hasControls){var a=(this.flipY?u+r*this.scaleY+t*2:-u-r*this.scaleY-t*2)/2;e.beginPath(),e.moveTo(0,a),e.lineTo(0,a+(this.flipY?this.rotatingPointOffset:-this.rotatingPointOffset)),e.closePath(),e.stroke()}return e.restore(),this},drawControls:function(e){if(!this.hasControls)return;var t=this.cornerSize,n=t/2,r=this.strokeWidth/2,i=-(this.width/2),s=-(this.height/2),o,u,a=t/this.scaleX,f=t/this.scaleY,l=this.padding/this.scaleX,c=this.padding/this.scaleY,h=n/this.scaleY,p=n/this.scaleX,d=(n-t)/this.scaleX,v=(n-t)/this.scaleY,m=this.height,g=this.width,y=this.transparentCorners?"strokeRect":"fillRect",b=typeof G_vmlCanvasManager!="undefined";return e.save(),e.lineWidth=1/Math.max(this.scaleX,this.scaleY),e.globalAlpha=this.isMoving?this.borderOpacityWhenMoving:1,e.strokeStyle=e.fillStyle=this.cornerColor,o=i-p-r-l,u=s-h-r-c,b||e.clearRect(o,u,a,f),e[y](o,u,a,f),o=i+g-p+r+l,u=s-h-r-c,b||e.clearRect(o,u,a,f),e[y](o,u,a,f),o=i-p-r-l,u=s+m+v+r+c,b||e.clearRect(o,u,a,f),e[y](o,u,a,f),o=i+g+d+r+l,u=s+m+v+r+c,b||e.clearRect(o,u,a,f),e[y](o,u,a,f),this.get("lockUniScaling")||(o=i+g/2-p,u=s-h-r-c,b||e.clearRect(o,u,a,f),e[y](o,u,a,f),o=i+g/2-p,u=s+m+v+r+c,b||e.clearRect(o,u,a,f),e[y](o,u,a,f),o=i+g+d+r+l,u=s+m/2-h,b||e.clearRect(o,u,a,f),e[y](o,u,a,f),o=i-p-r-l,u=s+m/2-h,b||e.clearRect(o,u,a,f),e[y](o,u,a,f)),this.hasRotatingPoint&&(o=i+g/2-p,u=this.flipY?s+m+this.rotatingPointOffset/this.scaleY-f/2+r+c:s-this.rotatingPointOffset/this.scaleY-f/2-r-c,b||e.clearRect(o,u,a,f),e[y](o,u,a,f)),e.restore(),this}})}(),function(e){"use strict";var t=e.fabric||(e.fabric={}),n=t.util.object.extend,r={x1:1,x2:1,y1:1,y2:1};if(t.Line){t.warn("fabric.Line is already defined");return}t.Line=t.util.createClass(t.Object,{type:"line",initialize:function(e,t){t=t||{},e||(e=[0,0,0,0]),this.callSuper("initialize",t),this.set("x1",e[0]),this.set("y1",e[1]),this.set("x2",e[2]),this.set("y2",e[3]),this._setWidthHeight(t)},_setWidthHeight:function(e){e||(e={}),this.set("width",this.x2-this.x1||1),this.set("height",this.y2-this.y1||1),this.set("left","left"in e?e.left:this.x1+this.width/2),this.set("top","top"in e?e.top:this.y1+this.height/2)},_set:function(e,t){return this[e]=t,e in r&&this._setWidthHeight(),this},_render:function(e){e.beginPath(),this.group&&e.translate(-this.group.width/2+this.left,-this.group.height/2+this.top),e.moveTo(this.width===1?0:-this.width/2,this.height===1?0:-this.height/2),e.lineTo(this.width===1?0:this.width/2,this.height===1?0:this.height/2),e.lineWidth=this.strokeWidth;var t=e.strokeStyle;e.strokeStyle=e.fillStyle,e.stroke(),e.strokeStyle=t},complexity:function(){return 1},toObject:function(e){return n(this.callSuper("toObject",e),{x1:this.get("x1"),y1:this.get("y1"),x2:this.get("x2"),y2:this.get("y2")})},toSVG:function(){var e=[];return this.stroke&&this.stroke.toLive&&e.push(this.stroke.toSVG(this,!0)),e.push("'),e.join("")}}),t.Line.ATTRIBUTE_NAMES="x1 y1 x2 y2 stroke stroke-width transform".split(" "),t.Line.fromElement=function(e,r){var i=t.parseAttributes(e,t.Line.ATTRIBUTE_NAMES),s=[i.x1||0,i.y1||0,i.x2||0,i.y2||0];return new t.Line(s,n(i,r))},t.Line.fromObject=function(e){var n=[e.x1,e.y1,e.x2,e.y2];return new t.Line(n,e)}}(typeof exports!="undefined"?exports:this),function(e){"use strict";function i(e){return"radius"in e&&e.radius>0}var t=e.fabric||(e.fabric={}),n=Math.PI*2,r=t.util.object.extend;if(t.Circle){t.warn("fabric.Circle is already defined.");return}t.Circle=t.util.createClass(t.Object,{type:"circle",initialize:function(e){e=e||{},this.set("radius",e.radius||0),this.callSuper("initialize",e);var t=this.get("radius")*2;this.set("width",t).set("height",t)},toObject:function(e){return r(this.callSuper("toObject",e),{radius:this.get("radius")})},toSVG:function(){var e=[];return this.fill&&this.fill.toLive&&e.push(this.fill.toSVG(this,!1)),this.stroke&&this.stroke.toLive&&e.push(this.stroke.toSVG(this,!1)),e.push("'),e.join("")},_render:function(e,t){e.beginPath(),e.globalAlpha=this.group?e.globalAlpha*this.opacity:this.opacity,e.arc(t?this.left:0,t?this.top:0,this.radius,0,n,!1),e.closePath(),this.fill&&e.fill(),this._removeShadow(e),this.stroke&&e.stroke()},getRadiusX:function(){return this.get("radius")*this.get("scaleX")},getRadiusY:function(){return this.get("radius")*this.get("scaleY")},setRadius:function(e){this.radius=e,this.set("width",e*2).set("height",e*2)},complexity:function(){return 1}}),t.Circle.ATTRIBUTE_NAMES="cx cy r fill fill-opacity opacity stroke stroke-width transform".split(" "),t.Circle.fromElement=function(e,n){n||(n={});var s=t.parseAttributes(e,t.Circle.ATTRIBUTE_NAMES);if(!i(s))throw new Error("value of `r` attribute is required and can not be negative");"left"in s&&(s.left-=n.width/2||0),"top"in s&&(s.top-=n.height/2||0);var o=new t.Circle(r(s,n));return o.cx=parseFloat(e.getAttribute("cx"))||0,o.cy=parseFloat(e.getAttribute("cy"))||0,o},t.Circle.fromObject=function(e){return new t.Circle(e)}}(typeof exports!="undefined"?exports:this),function(e){"use strict";var t=e.fabric||(e.fabric={});if(t.Triangle){t.warn("fabric.Triangle is already defined");return}t.Triangle=t.util.createClass(t.Object,{type:"triangle",initialize:function(e){e=e||{},this.callSuper("initialize",e),this.set("width",e.width||100).set("height",e.height||100)},_render:function(e){var t=this.width/2,n=this.height/2;e.beginPath(),e.moveTo(-t,n),e.lineTo(0,-n),e.lineTo(t,n),e.closePath(),this.fill&&e.fill(),this.stroke&&e.stroke()},complexity:function(){return 1},toSVG:function(){var e=[],t=this.width/2,n=this.height/2,r=[-t+" "+n,"0 "+ -n,t+" "+n].join(",");return this.fill&&this.fill.toLive&&e.push(this.fill.toSVG(this,!0)),this.stroke&&this.stroke.toLive&&e.push(this.stroke.toSVG(this,!0)),e.push("'),e.join("")}}),t.Triangle.fromObject=function(e){return new t.Triangle(e)}}(typeof exports!="undefined"?exports:this),function(e){"use strict";var t=e.fabric||(e.fabric={}),n=Math.PI*2,r=t.util.object.extend;if(t.Ellipse){t.warn("fabric.Ellipse is already defined.");return}t.Ellipse=t.util.createClass(t.Object,{type:"ellipse",rx:0,ry:0,initialize:function(e){e=e||{},this.callSuper("initialize",e),this.set("rx",e.rx||0),this.set("ry",e.ry||0),this.set("width",this.get("rx")*2),this.set("height",this.get("ry")*2)},toObject:function(e){return r(this.callSuper("toObject",e),{rx:this.get("rx"),ry:this.get("ry")})},toSVG:function(){var e=[];return this.fill&&this.fill.toLive&&e.push(this.fill.toSVG(this,!1)),this.stroke&&this.stroke.toLive&&e.push(this.stroke.toSVG(this,!1)),e.push("'),e.join("")},render:function(e,t){if(this.rx===0||this.ry===0)return;return this.callSuper("render",e,t)},_render:function(e,t){e.beginPath(),e.save(),e.globalAlpha=this.group?e.globalAlpha*this.opacity:this.opacity,this.transformMatrix&&this.group&&e.translate(this.cx,this.cy),e.transform(1,0,0,this.ry/this.rx,0,0),e.arc(t?this.left:0,t?this.top:0,this.rx,0,n,!1),this.stroke&&e.stroke(),this._removeShadow(e),this.fill&&e.fill(),e.restore()},complexity:function(){return 1}}),t.Ellipse.ATTRIBUTE_NAMES="cx cy rx ry fill fill-opacity opacity stroke stroke-width transform".split(" "),t.Ellipse.fromElement=function(e,n){n||(n={});var i=t.parseAttributes(e,t.Ellipse.ATTRIBUTE_NAMES),s=i.left,o=i.top;"left"in i&&(i.left-=n.width/2||0),"top"in i&&(i.top-=n.height/2||0);var u=new t.Ellipse(r(i,n));return u.cx=s||0,u.cy=o||0,u},t.Ellipse.fromObject=function(e){return new t.Ellipse(e)}}(typeof exports!="undefined"?exports:this),function(e){"use strict";function r(e){return e.left=e.left||0,e.top=e.top||0,e}var t=e.fabric||(e.fabric={}),n=t.util.object.extend;if(t.Rect){console.warn("fabric.Rect is already defined");return}t.Rect=t.util.createClass(t.Object,{type:"rect",rx:0,ry:0,initialize:function(e){e=e||{},this._initStateProperties(),this.callSuper("initialize",e),this._initRxRy(),this.x=0,this.y=0},_initStateProperties:function(){this.stateProperties=this.stateProperties.concat(["rx","ry"])},_initRxRy:function(){this.rx&&!this.ry?this.ry=this.rx:this.ry&&!this.rx&&(this.rx=this.ry)},_render:function(e){var t=this.rx||0,n=this.ry||0,r=-this.width/2,i=-this.height/2,s=this.width,o=this.height;e.beginPath(),e.globalAlpha=this.group?e.globalAlpha*this.opacity:this.opacity,this.transformMatrix&&this.group&&e.translate(this.width/2+this.x,this.height/2+this.y),!this.transformMatrix&&this.group&&e.translate(-this.group.width/2+this.width/2+this.x,-this.group.height/2+this.height/2+this.y),e.moveTo(r+t,i),e.lineTo(r+s-t,i),e.quadraticCurveTo(r+s,i,r+s,i+n,r+s,i+n),e.lineTo(r+s,i+o-n),e.quadraticCurveTo(r+s,i+o,r+s-t,i+o,r+s-t,i+o),e.lineTo(r+t,i+o),e.quadraticCurveTo(r,i+o,r,i+o-n,r,i+o-n),e.lineTo(r,i+n),e.quadraticCurveTo(r,i,r+t,i,r+t,i),e.closePath(),this.fill&&e.fill(),this._removeShadow(e),this.strokeDashArray?this._renderDashedStroke(e):this.stroke&&e.stroke()},_renderDashedStroke:function(e){function u(u,a){var f=0,l=0,c=(a?i.height:i.width)+s*2;while(fc&&(l=f-c),u?n+=h*u-(l*u||0):r+=h*a-(l*a||0),e[1&t?"moveTo":"lineTo"](n,r),t>=o&&(t=0)}}1&this.strokeDashArray.length&&this.strokeDashArray.push.apply(this.strokeDashArray,this.strokeDashArray);var t=0,n=-this.width/2,r=-this.height/2,i=this,s=this.padding,o=this.strokeDashArray.length;e.save(),e.beginPath(),u(1,0),u(0,1),u(-1,0),u(0,-1),e.stroke(),e.closePath(),e.restore()},_normalizeLeftTopProperties:function(e){return e.left&&this.set("left",e.left+this.getWidth()/2),this.set("x",e.left||0),e.top&&this.set("top",e.top+this.getHeight()/2),this.set("y",e.top||0),this},complexity:function(){return 1},toObject:function(e){return n(this.callSuper("toObject",e),{rx:this.get("rx")||0,ry:this.get("ry")||0})},toSVG:function(){var e=[];return this.fill&&this.fill.toLive&&e.push(this.fill.toSVG(this,!1)),this.stroke&&this.stroke.toLive&&e.push(this.stroke.toSVG(this,!1)),e.push("'),e.join("")}}),t.Rect.ATTRIBUTE_NAMES="x y width height rx ry fill fill-opacity opacity stroke stroke-width transform".split(" "),t.Rect.fromElement=function(e,i){if(!e)return null;var s=t.parseAttributes(e,t.Rect.ATTRIBUTE_NAMES);s=r(s);var o=new t.Rect(n(i?t.util.object.clone(i):{},s));return o._normalizeLeftTopProperties(s),o},t.Rect.fromObject=function(e){return new t.Rect(e)}}(typeof exports!="undefined"?exports:this),function(e){"use strict";var t=e.fabric||(e.fabric={}),n=t.util.toFixed;if(t.Polyline){t.warn("fabric.Polyline is already defined");return}t.Polyline=t.util.createClass(t.Object,{type:"polyline",initialize:function(e,t,n){t=t||{},this.set("points",e),this.callSuper("initialize",t),this._calcDimensions(n)},_calcDimensions:function(e){return t.Polygon.prototype._calcDimensions.call(this,e)},toObject:function(e){return t.Polygon.prototype.toObject.call(this,e)},toSVG:function(){var e=[],t=[];for(var r=0,i=this.points.length;r'),t.join("")},_render:function(e){var t;e.beginPath(),e.moveTo(this.points[0].x,this.points[0].y);for(var n=0,r=this.points.length;n'),t.join("")},_render:function(e){var t;e.beginPath(),e.moveTo(this.points[0].x,this.points[0].y);for(var n=0,r=this.points.length;n1&&(g=Math.sqrt(g),n*=g,i*=g);var y=d/n,b=p/n,w=-p/i,E=d/i,S=y*l+b*c,x=w*l+E*c,T=y*e+b*t,N=w*e+E*t,C=(T-S)*(T-S)+(N-x)*(N-x),k=1/C-.25;k<0&&(k=0);var L=Math.sqrt(k);a===u&&(L=-L);var A=.5*(S+T)-L*(N-x),O=.5*(x+N)+L*(T-S),M=Math.atan2(x-O,S-A),_=Math.atan2(N-O,T-A),D=_-M;D<0&&a===1?D+=2*Math.PI:D>0&&a===0&&(D-=2*Math.PI);var P=Math.ceil(Math.abs(D/(Math.PI*.5+.001))),H=[];for(var B=0;B"},toObject:function(e){var t=h(this.callSuper("toObject",e),{path:this.path});return this.sourcePath&&(t.sourcePath=this.sourcePath),this.transformMatrix&&(t.transformMatrix=this.transformMatrix),t},toDatalessObject:function(e){var t=this.toObject(e);return this.sourcePath&&(t.path=this.sourcePath),delete t.sourcePath,t},toSVG:function(){var e=[],t=[];for(var n=0,r=this.path.length;n',"",""),t.join("")},complexity:function(){return this.path.length},_parsePath:function(){var e=[],n,r,i;for(var s=0,o,u=this.path.length;sc)for(var h=1,p=o.length;h"];for(var n=0,r=e.length;n"),t.join("")},toString:function(){return"#"},isSameColor:function(){var e=this.getObjects()[0].get("fill");return this.getObjects().every(function(t){return t.get("fill")===e})},complexity:function(){return this.paths.reduce(function(e,t){return e+(t&&t.complexity?t.complexity():0)},0)},toGrayscale:function(){var e=this.paths.length;while(e--)this.paths[e].toGrayscale();return this},getObjects:function(){return this.paths}}),t.PathGroup.fromObject=function(e){var n=u(e.paths);return new t.PathGroup(n,e)}}(typeof exports!="undefined"?exports:this),function(e){"use strict";var t=e.fabric||(e.fabric={}),n=t.util.object.extend,r=t.util.array.min,i=t.util.array.max,s=t.util.array.invoke;if(t.Group)return;var o={lockMovementX:!0,lockMovementY:!0,lockRotation:!0,lockScalingX:!0,lockScalingY:!0,lockUniScaling:!0};t.Group=t.util.createClass(t.Object,t.Collection,{type:"group",initialize:function(e,t){t=t||{},this._objects=e||[];for(var r=this._objects.length;r--;)this._objects[r].group=this;this.originalState={},this.callSuper("initialize"),this._calcBounds(),this._updateObjectsCoords(),t&&n(this,t),this._setOpacityIfSame(),this.setCoords(!0),this.saveCoords()},_updateObjectsCoords:function(){var e=this.left,t=this.top;this.forEachObject(function(n){var r=n.get("left"),i=n.get("top");n.set("originalLeft",r),n.set("originalTop",i),n.set("left",r-e),n.set("top",i-t),n.setCoords(),n.__origHasControls=n.hasControls,n.hasControls=!1},this)},toString:function(){return"#"},getObjects:function(){return this._objects},addWithUpdate:function(e){return this._restoreObjectsState(),this._objects.push(e),e.group=this,this._calcBounds(),this._updateObjectsCoords(),this},removeWithUpdate:function(e){return this._restoreObjectsState(),this.remove(e),e.setActive(!1),this._calcBounds(),this._updateObjectsCoords(),this},_onObjectAdded:function(e){e.group=this},_onObjectRemoved:function(e){delete e.group},delegatedProperties:{fill:!0,opacity:!0,fontFamily:!0,fontWeight:!0,fontSize:!0,fontStyle:!0,lineHeight:!0,textDecoration:!0,textShadow:!0,textAlign:!0,backgroundColor:!0},_set:function(e,t){if(e in this.delegatedProperties){var n=this._objects.length;this[e]=t;while(n--)this._objects[n].set(e,t)}else this[e]=t},toObject:function(e){return n(this.callSuper("toObject",e),{objects:s(this._objects,"toObject",e)})},render:function(e,n){if(!this.visible)return;e.save(),this.transform(e);var r=Math.max(this.scaleX,this.scaleY);this.clipTo&&t.util.clipContext(this,e);for(var i=this._objects.length;i>0;i--){var s=this._objects[i-1],o=s.borderScaleFactor,u=s.hasRotatingPoint;if(!s.visible)continue;s.borderScaleFactor=r,s.hasRotatingPoint=!1,s.render(e),s.borderScaleFactor=o,s.hasRotatingPoint=u}this.clipTo&&e.restore(),!n&&this.active&&(this.drawBorders(e),this.drawControls(e)),e.restore(),this.setCoords()},_restoreObjectsState:function(){return this._objects.forEach(this._restoreObjectState,this),this},_restoreObjectState:function(e){var t=this.get("left"),n=this.get("top"),r=this.getAngle()*(Math.PI/180),i=Math.cos(r)*e.get("top")+Math.sin(r)*e.get("left"),s=-Math.sin(r)*e.get("top")+Math.cos(r)*e.get("left");return e.setAngle(e.getAngle()+this.getAngle()),e.set("left",t+s*this.get("scaleX")),e.set("top",n+i*this.get("scaleY")),e.set("scaleX",e.get("scaleX")*this.get("scaleX")),e.set("scaleY",e.get("scaleY")*this.get("scaleY")),e.setCoords(),e.hasControls=e.__origHasControls,delete e.__origHasControls,e.setActive(!1),e.setCoords(),delete e.group,this},destroy:function(){return this._restoreObjectsState()},saveCoords:function(){return this._originalLeft=this.get("left"),this._originalTop=this.get("top"),this},hasMoved:function(){return this._originalLeft!==this.get("left")||this._originalTop!==this.get("top")},setObjectsCoords:function(){return this.forEachObject(function(e){e.setCoords()}),this},activateAllObjects:function(){return this.forEachObject(function(e){e.setActive()}),this},_setOpacityIfSame:function(){var e=this.getObjects(),t=e[0]?e[0].get("opacity"):1,n=e.every(function(e){return e.get("opacity")===t});n&&(this.opacity=t)},_calcBounds:function(){var e=[],t=[],n,s,o,u,a,f,l,c=0,h=this._objects.length;for(;ce.x&&i-ne.y},toSVG:function(){var e=[];for(var t=this._objects.length;t--;)e.push(this._objects[t].toSVG());return''+e.join("")+""},get:function(e){if(e in o){if(this[e])return this[e];for(var t=0,n=this._objects.length;t'+'"+""},getSrc:function(){return this.getElement().src||this.getElement()._src},toString:function(){return'#'},clone:function(e,t){this.constructor.fromObject(this.toObject(t),e)},applyFilters:function(e){if(this.filters.length===0){this.setElement(this._originalImage),e&&e();return}var t=typeof Buffer!="undefined"&&typeof window=="undefined",n=this._originalImage,r=fabric.util.createCanvasElement(),i=t?new(require("canvas").Image):fabric.document.createElement("img"),s=this;r.width=n.width,r.height=n.height,r.getContext("2d").drawImage(n,0,0,n.width,n.height),this.filters.forEach(function(e){e&&e.applyTo(r)}),i.onload=function(){s._element=i,e&&e(),i.onload=r=n=null},i.width=n.width,i.height=n.height;if(t){var o=r.toDataURL("image/png").substring(22);i.src=new Buffer(o,"base64"),s._element=i,e&&e()}else i.src=r.toDataURL("image/png");return this},_render:function(e){e.drawImage(this._element,-this.width/2,-this.height/2,this.width,this.height)},_resetWidthHeight:function(){var e=this.getElement();this.set("width",e.width),this.set("height",e.height)},_initElement:function(e){this.setElement(fabric.util.getById(e)),fabric.util.addClass(this.getElement(),fabric.Image.CSS_CANVAS)},_initConfig:function(e){e||(e={}),this.setOptions(e),this._setWidthHeight(e)},_initFilters:function(e){e.filters&&e.filters.length&&(this.filters=e.filters.map(function(e){return e&&fabric.Image.filters[e.type].fromObject(e)}))},_setWidthHeight:function(e){this.width="width"in e?e.width:this.getElement().width||0,this.height="height"in e?e.height:this.getElement().height||0},complexity:function(){return 1}}),fabric.Image.CSS_CANVAS="canvas-img",fabric.Image.prototype.getSvgSrc=fabric.Image.prototype.getSrc,fabric.Image.fromObject=function(e,t){var n=fabric.document.createElement("img"),r=e.src;e.width&&(n.width=e.width),e.height&&(n.height=e.height),n.onload=function(){fabric.Image.prototype._initFilters.call(e,e);var r=new fabric.Image(n,e);t&&t(r),n=n.onload=n.onerror=null},n.onerror=function(){fabric.log("Error loading "+n.src),t&&t(null,!0),n=n.onload=n.onerror=null},n.src=r},fabric.Image.fromURL=function(e,t,n){var r=fabric.document.createElement("img");r.onload=function(){t&&t(new fabric.Image(r,n)),r=r.onload=null},r.src=e},fabric.Image.ATTRIBUTE_NAMES="x y width height fill fill-opacity opacity stroke stroke-width transform xlink:href".split(" "),fabric.Image.fromElement=function(e,n,r){var i=fabric.parseAttributes(e,fabric.Image.ATTRIBUTE_NAMES);fabric.Image.fromURL(i["xlink:href"],n,t(r?fabric.util.object.clone(r):{},i))},fabric.Image.async=!0}(typeof exports!="undefined"?exports:this),fabric.util.object.extend(fabric.Object.prototype,{_getAngleValueForStraighten:function(){var e=this.getAngle()%360;return e>0?Math.round((e-1)/90)*90:Math.round(e/90)*90},straighten:function(){return this.setAngle(this._getAngleValueForStraighten()),this},fxStraighten:function(e){e=e||{};var t=function(){},n=e.onComplete||t,r=e.onChange||t,i=this;return fabric.util.animate({startValue:this.get("angle"),endValue:this._getAngleValueForStraighten(),duration:this.FX_DURATION,onChange:function(e){i.setAngle(e),r()},onComplete:function(){i.setCoords(),n()},onStart:function(){i.setActive(!1)}}),this}}),fabric.util.object.extend(fabric.StaticCanvas.prototype,{straightenObject:function(e){return e.straighten(),this.renderAll(),this},fxStraightenObject:function(e){return e.fxStraighten({onChange:this.renderAll.bind(this)}),this}}),fabric.Image.filters={},fabric.Image.filters.Grayscale=fabric.util.createClass({type:"Grayscale",applyTo:function(e){var t=e.getContext("2d"),n=t.getImageData(0,0,e.width,e.height),r=n.data,i=n.width,s=n.height,o,u,a,f;for(a=0;ao&&f>o&&l>o&&u(a-f)0&&(r[s]=a,r[s+1]=f,r[s+2]=l);t.putImageData(n,0,0)},toJSON:function(){return{type:this.type,color:this.color}}}),fabric.Image.filters.Tint.fromObject=function(e){return new fabric.Image.filters.Tint(e)},fabric.Image.filters.Convolute=fabric.util.createClass({type:"Convolute",initialize:function(e){e||(e={}),this.opaque=e.opaque,this.matrix=e.matrix||[0,0,0,0,1,0,0,0,0];var t=fabric.util.createCanvasElement();this.tmpCtx=t.getContext("2d")},_createImageData:function(e,t){return this.tmpCtx.createImageData(e,t)},applyTo:function(e){var t=this.matrix,n=e.getContext("2d"),r=n.getImageData(0,0,e.width,e.height),i=Math.round(Math.sqrt(t.length)),s=Math.floor(i/2),o=r.data,u=r.width,a=r.height,f=u,l=a,c=this._createImageData(f,l),h=c.data,p=this.opaque?1:0;for(var d=0;d=0&&N=0&&C'},_render:function(e){typeof Cufon=="undefined"||this.useNative===!0?this._renderViaNative(e):this._renderViaCufon(e)},_renderViaCufon:function(e){var t=Cufon.textOptions||(Cufon.textOptions={});t.left=this.left,t.top=this.top,t.context=e,t.color=this.fill;var n=this._initDummyElementForCufon();this.transform(e),Cufon.replaceElement(n,{engine:"canvas",separate:"none",fontFamily:this.fontFamily,fontWeight:this.fontWeight,textDecoration:this.textDecoration,textShadow:this.textShadow,textAlign:this.textAlign,fontStyle:this.fontStyle,lineHeight:this.lineHeight,strokeStyle:this.strokeStyle,strokeWidth:this.strokeWidth,backgroundColor:this.backgroundColor,textBackgroundColor:this.textBackgroundColor}),this.width=t.width,this.height=t.height,this._totalLineHeight=t.totalLineHeight,this._fontAscent=t.fontAscent,this._boundaries=t.boundaries,this._shadowOffsets=t.shadowOffsets,this._shadows=t.shadows||[],n=null,this.setCoords()},_renderViaNative:function(e){this.transform(e),this._setTextStyles(e);var n=this.text.split(/\r?\n/);this.width=this._getTextWidth(e,n),this.height=this._getTextHeight(e,n),this._renderTextBackground(e,n),this.textAlign!=="left"&&this.textAlign!=="justify"&&(e.save(),e.translate(this.textAlign==="center"?this.width/2:this.width,0)),this._setTextShadow(e),this.clipTo&&t.util.clipContext(this,e),this._renderTextFill(e,n),this._renderTextStroke(e,n),this.clipTo&&e.restore(),this.textShadow&&e.restore(),this.textAlign!=="left"&&this.textAlign!=="justify"&&e.restore(),this._renderTextDecoration(e,n),this._setBoundaries(e,n),this._totalLineHeight=0,this.setCoords()},_setBoundaries:function(e,t){this._boundaries=[];for(var n=0,r=t.length;nn&&(n=s)}return n},_setTextShadow:function(e){if(this.textShadow){var t=/\s+(-?\d+)(?:px)?\s+(-?\d+)(?:px)?\s+(\d+)(?:px)?\s*/,n=this.textShadow,r=t.exec(this.textShadow),i=n.replace(t,"");e.save(),e.shadowColor=i,e.shadowOffsetX=parseInt(r[1],10),e.shadowOffsetY=parseInt(r[2],10),e.shadowBlur=parseInt(r[3],10),this._shadows=[{blur:e.shadowBlur,color:e.shadowColor,offX:e.shadowOffsetX,offY:e.shadowOffsetY}],this._shadowOffsets=[[parseInt(e.shadowOffsetX,10),parseInt(e.shadowOffsetY,10)]]}},_drawTextLine:function(e,t,n,r,i){if(this.textAlign!=="justify"){t[e](n,r,i);return}var s=t.measureText(n).width,o=this.width;if(o>s){var u=n.split(/\s+/),a=t.measureText(n.replace(/\s+/g,"")).width,f=o-a,l=u.length-1,c=f/l,h=0;for(var p=0,d=u.length;p-1&&i(this.fontSize),this.textDecoration.indexOf("line-through")>-1&&i(this.fontSize/2),this.textDecoration.indexOf("overline")>-1&&i(0)},_getFontDeclaration:function(){return[t.isLikelyNode?this.fontWeight:this.fontStyle +,t.isLikelyNode?this.fontStyle:this.fontWeight,this.fontSize+"px",t.isLikelyNode?'"'+this.fontFamily+'"':this.fontFamily].join(" ")},_initDummyElementForCufon:function(){var e=t.document.createElement("pre"),n=t.document.createElement("div");return n.appendChild(e),typeof G_vmlCanvasManager=="undefined"?e.innerHTML=this.text:e.innerText=this.text.replace(/\r?\n/gi,"\r"),e.style.fontSize=this.fontSize+"px",e.style.letterSpacing="normal",e},render:function(e,t){e.save(),this._render(e),!t&&this.active&&(this.drawBorders(e),this.drawControls(e)),e.restore()},toObject:function(e){return n(this.callSuper("toObject",e),{text:this.text,fontSize:this.fontSize,fontWeight:this.fontWeight,fontFamily:this.fontFamily,fontStyle:this.fontStyle,lineHeight:this.lineHeight,textDecoration:this.textDecoration,textShadow:this.textShadow,textAlign:this.textAlign,path:this.path,strokeStyle:this.strokeStyle,strokeWidth:this.strokeWidth,backgroundColor:this.backgroundColor,textBackgroundColor:this.textBackgroundColor,useNative:this.useNative})},toSVG:function(){var e=this.text.split(/\r?\n/),t=this.useNative?this.fontSize*this.lineHeight:-this._fontAscent-this._fontAscent/5*this.lineHeight,n=-(this.width/2),r=this.useNative?this.fontSize-1:this.height/2-e.length*this.fontSize-this._totalLineHeight,s=this._getSVGTextAndBg(t,n,e),o=this._getSVGShadows(t,e);return r+=this._fontAscent?this._fontAscent/5*this.lineHeight:0,['',s.textBgRects.join(""),"',o.join(""),s.textSpans.join(""),"",""].join("")},_getSVGShadows:function(e,n){var r=[],s,o,u,a,f=1;if(!this._shadows||!this._boundaries)return r;for(s=0,u=this._shadows.length;s",t.util.string.escapeXml(n[o]),""),f=1}else f++;return r},_getSVGTextAndBg:function(e,n,r){var s=[],o=[],u,a,f,l=1;this.backgroundColor&&this._boundaries&&o.push("');for(u=0,f=r.length;u",t.util.string.escapeXml(r[u]),""),l=1):l++;if(!this.textBackgroundColor||!this._boundaries)continue;o.push("')}return{textSpans:s,textBgRects:o}},_getFillAttributes:function(e){var n=e?new t.Color(e):"";return!n||!n.getSource()||n.getAlpha()===1?'fill="'+e+'"':'opacity="'+n.getAlpha()+'" fill="'+n.setAlpha(1).toRgb()+'"'},setColor:function(e){return this.set("fill",e),this},getText:function(){return this.text},_set:function(e,t){e==="fontFamily"&&this.path&&(this.path=this.path.replace(/(.*?)([^\/]*)(\.font\.js)/,"$1"+t+"$3")),this.callSuper("_set",e,t),e in s&&(this._initDimensions(),this.setCoords())}}),t.Text.ATTRIBUTE_NAMES="x y fill fill-opacity opacity stroke stroke-width transform font-family font-style font-weight font-size text-decoration".split(" "),t.Text.fromObject=function(e){return new t.Text(e.text,r(e))},t.Text.fromElement=function(e,n){if(!e)return null;var r=t.parseAttributes(e,t.Text.ATTRIBUTE_NAMES);n=t.util.object.extend(n?t.util.object.clone(n):{},r);var i=new t.Text(e.textContent,n);return i.set({left:i.getLeft()+i.getWidth()/2,top:i.getTop()-i.getHeight()/2}),i},t.util.createAccessors(t.Text)}(typeof exports!="undefined"?exports:this),function(){function request(e,t,n){var r=URL.parse(e),i=HTTP.request({hostname:r.hostname,port:r.port,path:r.pathname,method:"GET"},function(e){var r="";t&&e.setEncoding(t),e.on("end",function(){n(r)}),e.on("data",function(t){e.statusCode===200&&(r+=t)})});i.on("error",function(e){e.errno===process.ECONNREFUSED?fabric.log("ECONNREFUSED: connection refused to "+r.hostname+":"+r.port):fabric.log(e.message)})}function request_fs(e,t){var n=require("fs"),r=n.createReadStream(e),i="";r.on("data",function(e){i+=e}),r.on("end",function(){t(i)})}if(typeof document!="undefined"&&typeof window!="undefined")return;var DOMParser=(new require("xmldom")).DOMParser,URL=require("url"),HTTP=require("http"),Canvas=require("canvas"),Image=require("canvas").Image;fabric.util.loadImage=function(e,t,n){var r=function(r){i.src=new Buffer(r,"binary"),i._src=e,t&&t.call(n,i)},i=new Image;e&&e.indexOf("data")===0?(i.src=i._src=e,t&&t.call(n,i)):e&&e.indexOf("http")!==0?request_fs(e,r):e&&request(e,"binary",r)},fabric.loadSVGFromURL=function(e,t){e=e.replace(/^\n\s*/,"").replace(/\?.*$/,"").trim(),request(e,"",function(e){fabric.loadSVGFromString(e,t)})},fabric.loadSVGFromString=function(e,t){var n=(new DOMParser).parseFromString(e);fabric.parseSVGDocument(n.documentElement,function(e,n){t(e,n)})},fabric.util.getScript=function(url,callback){request(url,"",function(body){eval(body),callback&&callback()})},fabric.Image.fromObject=function(e,t){fabric.util.loadImage(e.src,function(n){var r=new fabric.Image(n);r._initConfig(e),r._initFilters(e),t(r)})},fabric.createCanvasForNode=function(e,t){var n=fabric.document.createElement("canvas"),r=new Canvas(e||600,t||600);n.style={},n.width=r.width,n.height=r.height;var i=fabric.Canvas||fabric.StaticCanvas,s=new i(n);return s.contextContainer=r.getContext("2d"),s.nodeCanvas=r,s.Font=Canvas.Font,s},fabric.StaticCanvas.prototype.createPNGStream=function(){return this.nodeCanvas.createPNGStream()},fabric.StaticCanvas.prototype.createJPEGStream=function(e){return this.nodeCanvas.createJPEGStream(e)};var origSetWidth=fabric.StaticCanvas.prototype.setWidth;fabric.StaticCanvas.prototype.setWidth=function(e){return origSetWidth.call(this,e),this.nodeCanvas.width=e,this},fabric.Canvas&&(fabric.Canvas.prototype.setWidth=fabric.StaticCanvas.prototype.setWidth);var origSetHeight=fabric.StaticCanvas.prototype.setHeight;fabric.StaticCanvas.prototype.setHeight=function(e){return origSetHeight.call(this,e),this.nodeCanvas.height=e,this},fabric.Canvas&&(fabric.Canvas.prototype.setHeight=fabric.StaticCanvas.prototype.setHeight)}(); \ No newline at end of file diff --git a/dist/all.min.js.gz b/dist/all.min.js.gz index 7a6804f731e857a9be6ce37c1d55addbc5c37f94..8de6219a93ce1f374f513760b117fd3828f0b334 100644 GIT binary patch delta 40259 zcmV(vKcq-yRL@~C2n z1Rpxb30O%{J6ov*IQheFCJ&oguT-3jdZ<1WR*noqu1u z2`~?^`)adP+#jTGMmZP%<$7W_-G0ODR(UR*JE$h%zx+v6lqFeiP`R+TPsz{s@*) z?D%!NIinaJ|2ZRCatB%r^3hE^i}Kbi8SyO7CPizM%>vB#q>aSaMgnC6Ab%xu)PYM| zAdnGmqT3|nA@nhI|1ypz(PCQs<-_Y&oGQYkECi9K-of%zC@4*0|7KEUw{}c72rV)Zmql)TI&c91Smk12L%UyuC89LgH$Wi zB_M_N9g)nav-~qUe4`yx>3>}BpA>hkP8_^I@PXwpDf28rEx~$i>CBDZ z_G}e+GaMD=_xkXF7WL?{$1EEwVeL&CW+9aolBMlV@X#~NkdO4Fx+FHlw1m!sV1VNn zQc6Qp>RKWli!LO=;mu}X0%=%J)nHuy@)c_8Iko_}drrb!xP^{Qc2 zK>Y1DTTbEt*o~)TLpBz?`aH})NX%-y`g}`XeZGlTCjv1iM!kR@wrg!%=d4Tgr{)ZP zc}%n~uX6FXTXONY8@Tw}-^0bD9lZ_Jt+$R=tN9jD z?>6#8xyQ~GdP{{Wh^(9BboiJ}`TQBMMnW(rT7S&W*y}Ji)Ek;_y@XQF;s3Yc8^uUn z9=-)e>e4&b&e#1n{Y&AgYKq+K7(T&ge)uZ-Q+Y{ouoP>Z^5Sr|j3z;g0{pchWqaI5Zp>iiUmpHQ;HJ zJTCPGlb(A9xHLk9MAXgu&xh>H`0gJ)I2Cn%=Cz;}KZdW-2;vL;bby^V@Q<2ve^k8lNA_Xc2>|p1 z`to5vOM%01*avAi`IGpCcOhM2D22% z&vV@T_F*$CPSHvlh+UaVLR0MZ&@`{KHq-g6Zt**di>M!$hQc+QxLy%BgTcb_T?hF- z0B|2|E1v;TIWF9`ryV-n&QlMFHkn7ZzVX%`ntuic1PMMFe(D7`47ZeeoszF9|}2zEl|A+Wolj`YDuJSAo38^`=ZsIW6q=dp@U9~k=i41zrjPe^f2$H ze%SFA=oyR)mBRF3L=fs+4K-Y7+vpImwm)}n$6m|Me zSpez!&|y#pSW^<2VQut6i?x%}fe_=uZGVEftb@QC=8xzIK#44&F>x3ZOCCL12<5q0 zR_^&O4I;>S@MI3P#;D2d3 z{=_x%UIWu|0~wu$JOsi;f$F@H@k0h8CglXx=70eLI@p-^9*BQB7J2_IeO#FQR%$~P z$1U~r@5Oh#)!f)qvKG6==q^0y4;DyH@ozMSzfark7X5q!f4^-{28+(OSKrXze+(8+ z+U-$`ekS<$$v^4k3B5dR)5}wMnSaC+{5zRo68ubt2iN89fSnEo&fpHay6a2^ci&Fn z;k(KI0}x2uCDp8n2jE{i!0`aW zA#?MY{3K5}2bdju5*+lUGv|&JtxfYr8HOb{@KP}Gw+XOYh7S01H2qZB-9rp;Ku2&I z`oy5>M8`$Qovo;A0!u|SoqxK*H^z5O$Gil|KM%$+dSdS+rl*C3R|WS#F_R?lUr4p4 zJZ16OW1~BZ$%0p*lEzHbCt(HBxGFYlbjRux;1BXnBy=A9+#d{Cuv`yv^wur=H(col zZZGKLcW`huNqI3`E&A=&cTsC{+M$#PmsJ`&*RyzbmB;*+wvJ^+&yC*amzS{_H6TYH)TVS4iYVSg#qmAF*cjDdK-d6< z8H?%r6$G`ZRS|?}QxEak^B6XW4Wrd?mtVG#;Bi{9-D^c9j#( zD8Cdl!wjmUrhg@_hXRW6tXx)1#eR1@9>?SItAI%^9rm#xk5Th+mO?o?kAYpZOg<(9 zISQ2pEDH>+I4*)l#zs3wi(Y{V){bsHj;>g7z?FMr!N}OY2~L%~HBjjFk+ z=i9Tr=ZuglM#jSazNw2m!LV;YjD>DC%i*mH;4ZET^oKtAbpgDdGNHhDw0C<+E8f4~ z<1C{$?&Dh`N9-ccB}wF4Jk516_?Snbf>cwL5PyB8188ZoAuShU=nZv1SpX+>Qe(R*wG(N8|QrIvYTgb}99`RR&N@Z^a1 z(jaLS-P~Qc6Be;42Dc=E?1-;cnd^yIna^bKD$%}r)7!-Q#vLJ#Z3e-U_(y@QRGdoa z{&W^yW4w?o#mGk{Ct9F0G7(IiPKFUWWPc%{i-8@8kHT2!-OR#f@V&8gCvA$dDR8xK za#=#wg@$JF6wmA%^X6or^@YNv49)M^TlzkRkj(%X_|KIRqjWTG6F#ZEU6G&)sY8}2 zro$Z5<|hv!Tcma|;_rPr>H!f0W>8YF*ovy*EmO2gpp9CDr1ApsYFDB>D@5h3t$*LZ z#ZqB+I@;-WKhI{d+prl35K)1QvYUe}e9sljEGP0M&lYpHk6bGGtz+z+SR8aOnal} zEe^CIYb8h#+-NWICwmhNyNFSVBQz{g+F~YL0CwBmRM`ophK(ggV}Jzh27)dO`!Fu@ z(ZWx$ExDTM5%;(sF8Xud{~N|pJerce1s!$ztJAce-G%p)vJ5)fmZA6IuEJaR*eTC)w17G$unFH!!yb5}D zRrF)Qx%|otCM{5+B1)fh4ML5Pi3FumTW#l`ZKkeDP!VeI+5$ko<20EOQ}6BY$O5JMy5R*6BW= zcnDKw=8ofQ9>@84_AVMHKt96U%H|^VJbNz6g_)gAB!!s8aAD<0-Y<--RKVAF#2269 z#S>N*=_M6nh7&6uD&Q8Ew5Hh{Rxy#Mf0 zIlhOtR`xubFQ#;TMSpQqe*NLho>CrtejepF7@IJS!)q&3P(MMgRJ@n_h7!l4QJm)) z&%-M_7rrG)BE!#X*K3q*3fB-7q|mC-gFW#mbV|h&TnD&8Pw*VJt^^5)^3m-fIRPrC zv?1^YJYAqtg;2lKEINd$p3UWCK@f<1vsD>EfkyCYex*@K4$t$!8uNwQ=yNF>$SqjCa!R zR+VH&;!*}FG=G+gvCdE&_3$3l3h)UE;*UJ3eS7x)^!)V0$>r&r7pHGd&o8XpHzzNT zE4k2#%a34m=wehA)}yN&_ctLa@uM)c0f(*qC~Wt5psk_OmQhbRb9a-&w430k1L79y zwvmhJC+IV%qhKjvyM^~URF_9`(G3eHb1I>sD$&Sr^M5uL0b}i?sF@{DAQOc>sldWl z3iZjv4GnczX3@L>4oI!QAo@4RiQt5*z$k{8m%zBl5{EWOq*f!4NH%*kMlm`;J-F5?XC|)%Hhspm7uzd}*c2_Gn8Za!G7BO!^Fv{4lwv6l5 z6|pd@kbfqJxj=klb;Wo9{h5Xs1s;O+(IXkal|Q`BLYvqCuE?Bg9LVxE0}D57Jb-IDL8M`6)K9M^)F?<$gz9v0P)(A9e~Svd3B zLY7qDv)Lfx-=7kiW8%7QjKq@}AbVr_ zrhgdPWyn^HZ+&;%9{LA(l3r%$^uJO@1*wEqELSkO7jBNm2Z9HmxJs13U=` zcZ!!cvWR(P_Njcgq1+YlDKHNka?0xZS}MAYD6g}+Aa7?1#dYlUtT8C4v^T+);2Qz? zJ{^%pi7eaTGb0z>5yo4ubOKz%I{0I4nt!(s7^4(KOuw?s$fC=4SSBqX8ooBXG0Z$@ zu+O;A2B6>zj7Ete^FS{#xbSv)%CRn3M*AanTV!rS}~-b5a|Y}-CNSngg5+)Gz%;$b z@q#G7ct~zwh4mrY-=#j*2E<(|MJQfICZcACWk}@)mWa+ztpgQawkUW6!73O!IIZwA z(ujAq))m=l-!Y%rNwSOBFU=;%P;D^zDATQ)nHb5ixW(^)UGx{% ztE>(C5}>sSUT9^F21ifmT4>!g)ZeJLCPjNaIV@|Vc1~KXHZ>%(D(%SBP*?RT8Yija zpiyQIas`5CYsAh5QZ6hEwW6Z5$`qo-GFA6|;{AktDC}1bes+8M6nQ0>mw(kF{gh^( zQ%@P%r6ps()>v$iRD&~F-bCqm8gtkhKXde`8UG*?M2K4Jl0K88F?TI>)I~=)Ro$Vy zc&rvuwc3t2xR{c$5&lJmg4FrQ*9zCJ@7z-CI>*bkG{I)+CP*sBfa;{Ssj$|J6m(%A zDx%eAo%4~@c##I5RsaJfmw)MGq)oJ=;jWg|YMIkrEw3n~AQLa=*&HvxNNQE8*TW*^ z&qPEw7Rl3(l;jZOqJ!PYOG7h>p%p--Y3)O=RGP92eVw8>DVm`EQ@EgDaQ~)ua!A~^ zIpvt`^jtX%*loj2jbb67HhR8RtHgT422?%;$4JZO z@iTTG+~UJR#JjOJ7#W_kc5$7-^Y33?E>gTY^z=C*j`4~JBc3iV9X|%#C1w;TLbray z2{4t$US{4YPz=}R&LplFq|nsswI^eJEW)@c_OFFZPWAdEhdDyeZl{8v8&@v~+O{f- zwgRNQ;Sd@c$K_jN-+!A+W3bLO!^0OgVmIAI&mGl_<~LuxXdP7O(hcL%6}%v-bdj=L ztY8+3ixu4r4bvv#a14Khs~tShEwrwDLc347atTyHn>>-B*fZ8}5hSvKHvO)S!MOF7 zP7!l*s|Sh+A1wSu^{gVV;)9f_ipXY%i*5#pnyU-|ih=l_?|;i31U_C)TdT1S3b?!q z94i|Uidi%X7(D=QcM26?lJG}a{dOK+x)E7MuyE*PANjZNx%%92(Gcv+o zTLr#0b6wh{lA&%_#m<+nU3(hy+63a5X|8f*ij~pzTNUldc&v~t990gA5Dj(a4GnqR z#2f0pYBWt?HGe+Z8)p%s@|w- zh;0)};gxUNjPJyTLzQ{=MkThAj7RQ=P8YA}Ee(Sm>Ax;yJL0F+#db0W-B8@YxHs7E zp%cr2hbKotY0<%@v^jA(IgG3Js4cu-Tm(gtr#!^Bp%tUETG0zYMplhZPgxiVkSQ@V z4N-b!*?+((%Qyk=rb2e(!?o77ZWTUhoZLEew5Hs^#B3>Fe?6UebYK^e+WfLa5*|d; z`AvjQJ1+c@ZNO7Vw>$kj@Z{}IdE@s5991v3c6j64v%xA@ybd^BzTR}2pzx&B-5LS9 z#L0^pvFj$vUq$!XqCln2{+BG9g&h$@9mO^|P=Bw7H=!Mc``^Jox}ksu>ne}{srEYU zHaa6QRVP#rT2Y$N)jBE}o%=So5?8gT@*c7<-h3us-zW^v`^~}kzrR2IpZ4Coy=^SH z8~s0@LdGOEAc7Prw`U;*^SbTc^4f04R`;~8tZ^U`lrT*J900V%NXlowwVWLXq-=N3 zn}0md&7>{j?0eOzQ}rukuE$yHV#x!#eGz4myA^m{CpOd>s>oXex{+_K4TTXC8S-eVM>~_a#rHuQw1c~h z0#G(yl8O(kmu=Zepc+Hly}QuqUbIl^1dQ6xdG@i5O=m>1Y9Iq+(N3E#yu!UtD1QMt zRpg`x68!9Tyzul|Ap?q3Qp`!Z+4kWTwg3lZCR{~bW(aNmu`JkS6e*FnfJyA=#5{&9 zB`Tn^n^jCR&|73R8 zR@^gEz0ql^JMn6t=;_5HkaL08W>vmIAp*GqtxRu6e@{Q8B08=dH#OC|NKp_$Mt~^t zP!*k& zZnYwU!GPNeosPINS?pMX$`~v>csD&zFh;?B*a%ak^XB8c`IcFcTKjd5rV+|Ys7~_1 zW!7Aj^Qrvd>J5DN&2bQykbh1ax;S=1>jbT9QvEcyZSh6dYipq;U%|;#qL|5>uRxPy z&f6B@|hLyOSAyKoBMKW5)h_+XXKNHzK3s{irh$3CL*_16_pbAR;DfWXsO4BQUW zNIWEZa;HtzW21piTI_s-03YVFOs$fl_mqU-T@{R-Aa;RJEhuJ|= zMf;h#CmN4|nn)LB{eMGe|F~sh!h^#&I~q-kgTws{%O3afXV~v&Tta_j6;f?!nBBD8 zmofy__n<${~4m*ybmHX10yP7t=0`iA_ql7*bf%QA1f8JTYE-7>-#BCS1 zis#0y5_V}sGi2Lbwb!(=vk6Cixx(DRI_sPunNKY>E8oX$OU#%nQA{Rl9=D?8(sPIL z8(jm7=0<}*4Sz?E{w&Ne6(YDCT#^fC^!{i>fw`>K$G8Yj=Rcz*LgqAylYXz}jo z1@2|D8&{vx4O|oOedu;%e}wL+KD#rt&W3|W`=2#GuzwI+qj9H<`-4aBs2s~tA^+Dx zc_*>4zSU4gv2ogmVcx@?1(ld9|K%qaXc7cjXfJnn)YDHZ*F!TxD10AMJUV<7>6SYr zq?HI;VpEh~+ow+dd06$ccu1jU+UIUs9=@Z|!QtRfkEX@`p9YWqc=$+Av+U?lhKC}8 z=5_Fhf`73!_=i)9Kqu|t;Lu3?mxr9(P4h=9(VxHKWV+c;+6Uwj4CfTOzJDmXiHoTj zKgW=MWrP(JVOnfy2g(m*A0C&F-OVoLVQ16pXIZ0CDZa}t`l=W z9jk&X*ce91@VT~%hJaM1&WmQe(5dlrX{N@2nSTg)g8;r4GBJIvbXxkJi|=o)R^|AE zOiEvuIw^gh%l_rnY`jt3!>===cliBLmWuFh(AjTP!6M*|QML%W5<%!Tb9^i_(AP_y zn!caPq$SLJHvUy5=I`f5at?W7>riK1aKRQ12+Hm2DS`!=j{wNYR>EA(#2P@G@-^zf z*nd**gTI|CS1XnTynugD;DbPSa1myVH6^5}t;BI9ybPpC)q;94mph^ioLdhDX!&fQ zgyaO28uF_gVtmUNH--|&ODvvFEVQJf38j51b-!9KMK~oxSxh;{SGYNJFfZs{+edil zV4RD5%5@><6FpTx^t!EiggHuVGnpvm^#jZFWs@m1AXCmGQX4+So;!w_$9DqM_75cn zibkeEfY--0LY)p%? zfH4u%2BTs0tcuXKKP>Rslkqeh0>7w}4>cWsqTmh|K$h!j`7RWKJvcAq+qy8tc@%5E zzvvX`98JvOczKpBYElxSLTgnhY^v`>62d-_GUrxKMh~>KRcEA(l%rmmvGJnoet(^i zK`F4DrFif4;-TDQ>1`A*!xHy!DZF@;-nX!|y%89aXNc-_M#K^Phr4hFqqjH}?mU}+ z6Le+Uu;e`=#pTug`zy1YcNOVDey|^_F zXG_4NPejQ_kasrwRAz01C~k2DL5^Z(#G=$nfTX2>DnYM-#MiR5s8E7??saw!JYX37 z?cKXU(1YWJ&zUm1xyjume+Uq2T_><(gI=K{amTHdK4)sT;iNo`Y8(bD2m<7g)VBPI z7$HL{noF9SBVx`9-$H+R@qBWBuXbN45d%v+E?M$y;DuDqV*^>i}#-W`1JVgt8e6b4d0!JpYKki{psU_oDqMC$hP_*Sy9Og z{rufCksxfP)rS_{O6PR!XYsXw*&H{9-RpqOULj@Bls^hQ>9}M^kVrazV=e^_3^;ZY z!vT@E%+$f>~rD6ljO2BAvO~&~Rwz`=FT_{qP*9MHuJsQE+-<$*&U(+) zde1&*iF;OY-o1*6^zt8ChNgs8E~Oxt*jE3Vvl8b11hI!qkkV;IFt(eUdlZOHlQh%U z^pca{{~_;u=*)EQ8hCl}h5k>+djYXUFHxANxJVd3bgd8&a81!g!K&W z*5~9x>nS=vLPZ-VXiyWVn`{&`9$2_y? zW(P>|gJ4fMm)e$pRyg;9#G)xb6?sz&Z4>ma`D5`DEJqlp2S+)A5?M|C9h-Bt%!^;g z7ge^{ngNyrq<(yKK#haHq8pDN*fS@28kSC>6`1%*rWuF=)7CCV_0$doMl$C!a}bsQ zG6b`$aez8;L9BkvHe)#YS3xZQR^tG#0P7kTJqiV+cJEj_>G{Tnv|voXk$mI&Cow~x z29*?c@ss=l!}66Pfw7huyhx$#R{)Hyc+Lz4_T zCV#IuCN`@?g|U-Ir^H+HwXIH0MsQsj#`NzgBJiQpgMROH`cAk)csF=Qt`E?ev5JVM za4fDV@w<0*FNVN+|0c$NAtI%Su>Ljs_)COg@7{&@CnPUDA|!%@3!U)o)`Uw=$mnXG zln@#8*1bS{n!lr|E@md`LnP$grID^ZE6#mMTgH>MtL=CD9q5YYR8i1d z^@5wAcR~No=-(y%o6^4v(%AkW($0HA~;U78GpoX z7gzux1$wCj7im(W`$NPeVEM~oL~Nv%6Dfyi(i57R^v$0{?hU&u<24zKvsMf( zvtZn`BXDB`i7NbH}AUQ}lu!Ey#E(mjCAkLeRek?KN941g+)lfs^bzClK*?IEd~g59$x+4^9K= zt=W?!JS756N0UlCCPw$taQ(P!#W9Bw;Ys4eFq0P0p@J%bXZ+`5{LSP8EZYys2O&DD zB7B?q$gX^1dbW4v4cUh#Io&2 z70+`Eo3x-DHO?o6_4t1f9fSw}rtvkVqv3Eoip2XAGhU98(evz2f2)i0a zhMBN75mt{8KygpXPI;!3`>HwV_9E!&+ zS=>eyx7l6@A2_O%TW@=)fc~~-930-E30);{8>ooe)|JIG@*NHAeQ^W3N-!Gu`4ff_ z2XfYUw0pt71)qO4Z=x(QdAhJ$>t46(B?uX+w30+cpFy6a1XaB>k`lZ=J}o$yL6aO$ zjf&Bf>XXXzBmo!GiGk*C<|?-5(k}wiVFI_u8Y2TBDZJL`PnLfk*BJ`*gHhAw+Pf8r zOy0j==ks2VJt2`?j%C3&H)8aH7;;~Y&_KcB}?D=8+m3qZV7kGj5MytlK(v+Kyh&%jdbzMHhP~mG!Du9CNnC za+;ErBQ4?Q*7gjIR>C4Pry5q6^@+<1ZB`KmT}U>q)Q8cyYoV#iUt1gg6DqIVwm5a$ zi4P5UKlVZGE(j^Vmv5_8;-nymbo`RQ0?2lg5kM<{^!P=qtV7F`(3*n{%uZ{I)WB?Z z_y7|f>NnyC`cM>hc=kDvw4~?Lu!5OI<7!DSE0|jRR@4s?96AXO%>FDkMt`8qmY%|- z?%Gx4ih$4D;0PIL>;Nwv)kI^*)N;o#RKvfaAL%{1z?iK5*qf2JsINrcpwnPta`0mW zG3ZP@4klRl!Q%(oCxUQ7>RV93(Sg039tUH82(#zzF+Fgqr#T0M!VBplv&PqkGSAqM z{U~+*E|Cs)nUpjNB`wnpSM1hQ_GB!VAKC;sOp>*fg2+$W*Qm;vBEM6c1C$aE*98+uqC-y3zUDd#Fez5vkgA7NE)xhHUAH2vYG&^P{4 zO`;I-p;~7IzP)WRfG7{Wi;;rh?0ha=e-ywsE5mG68z7k=dmKdxFnTP9^U?4_x|i2` z>5?q#_muXL^i(NwCWVEderpx z?XIHfz(I4>=ikwOBXEfD&*@xhmAI>w2Zz2^!p-%T{JnG*#jdGxStjrk zS5a&SZerZYSWtSktDyACQ;-Z)1u4e>ZDbA6wICLkqzyf~{qlDAF$~FYf7EFBtY*rz z>UiO$P=8EUos*^}Y~sz0y+g!8_$qF1KkE%`8+qJG9PdOLe?a`sI-^os6w-{`K`70n zKrih8lXyDhQj9#J+N^6iRV#Y!gu5D$Kms)Cm@iHzE)e4kyBJve%?up;n@FpKn)haQrK)s*3#5=QimH`$vpFJgAq3Bv-Fq^EPnPNLfXn}=$OciZCJs12q zwx1B$uMn;yGKz>RPptGh6!RUId_?1&dcBnC80W=oxt?dwgckvHcUfa$ z1n|6AFY$K;>n5vyES}8g1b~fUvt_*(Dc19>_?`81B6Z<1O4E@(r#4C;zu_BCxSmP`>O9EKN_K-ok%{K zVrQQ$m*k0={rqBa&baFmzqTX7R?@qcD=fj=GLO;XsQ9S7wH<8o=Gb!BdU@A9DMF^>oQAvdiscdqq8ZKcu?9P94 ziJ3@b-tpkn5-Jm7XE^$1@{+m3p9E7vAb`R{2#JMQi%+^TL{*8Z{J57}S4=wSth(_G z%*0{Z(Wp#u6{gOIQ;30wlCdk90!=(^FgDR7QJpw&@2c*>FH{T!q1oovStHb?ft4m5 zdyE%|5Zf{dL=@r6?(>x4Nf-z8*_W$S=+L5sm02r6rrwiNaL&aZhq@>SK5|Lu zvNT60m7d|$i!KZf=K)KS2(qG!WYP3cvhUewvm+f(3!O|(d6_GJ%$jF#K`wu4j1;!5 zF==SD>)4)GSij25DrV<)aSCc;w$iWBYRcPsp4;VTN zc%l}0g;uvb#3_~@#MkU;eVmb6DyQHmvnj9XHtK1NRV3e8?LukJeiVNoVx7D(#{(a| z%+g96Q@*1BJ^Mild=w-lN_|e5q|8``t+MQz-GfuKU{^z>z(zD+p4YRqnj0%q9O3N< zxo6CdhTf*wM?3J%qRh^m%v$S7;prb!dh*B9u~}6}hvfVO7549G#S=xRrh%?G7zb_# zg42n=2aM$a_1vjPnIM1Ab}Flz)V~LPUFF zr<}ed1J*a5Zi$0Nj(yQFm%VEZN3p57?A~Rh&5?9MMkgNL3(U*11b0?X2Ie}{jy(y4 z*|)w4i@DdUqVQgEb0eoqCOWB3@87>y&}6}c3s%R7McfJ9IH`X)Z6;tBNa7{`M64G9 zhAL3{%r$A$g(w_aEeLL4MAzj>R0nY_c{fpaVcAfs)qy8(-N5RR8`F_&3^2PGPB*%p z0dL6dP`xpI&=F&hkzdu;uL4El8X_;r4UVpiVz9RXAUkXX%pOi`=zrUSr*@ zU|vP1nL7}!9A=OGn+7osgQ@#ak=VvVbmvtJRY3WXVN}2q&Ukxf8JwLR_q2* z35jTY-^i2-P~E?kG|Hhx`P=KMH4cwO|U|L z-3W7lTHvs&Z*E3}5-N1j^Q?jprIT=vyaZ9T?^RXUz85Na$eu{XZYn-gVptUG^=*u(ZUS-po?!u}dE;`>h+Snd4}?rjiFQGr4>F(5Flg8(fcqOlS4FGiGg z`THz>%jBslYe?*&Y)Lc?b8mSWrx$%0!gu139{TnRMB|2k*Ush@gc9}Jyt^9Vw?5&> zl(%?As2r(zH4y<(rCPvL@uK(3fC1FEMJ)1 zG%O^lEcsOK4z^rT%cQk7GtyKP@?z2M(LoWze~Ji*ZdPVDbKNtsjh$}&ShPA-+Y{jr zMF*e1$@*FvXTpxvWiD$yG}nAojI&rD3F9Uf$Hln7E888W)nPWuDnI|;xY%aqH8)-$mf~SXBq_~$f>Q> zwjDj$o_C%hAoyM@LfpBZW_VNcL4=@_c;|pQIE=}KymJ&C90CcNQ9<0m@BNo@V!at= zSC+ulhtXh3uSOkrPqXZwx0FqQy{)1f?+$-ym)t2-w7Q1W+-eU=V|e2%v%3EGH$T4Y zEJ-KR=;FguDwqvu;JnS~uMDVKm0^1N~r z##!Nwiv7XKy^(;9Pta{d*w|#bqmquYD%PsMz*jSU*YMuP#VOpr!t+RVUGOE*^_G8m zYc;*~xE;10{JhsPLe=hibKH87>v~Z1X3~$1?dwWtKi(#-B%+P2hhzUuru7uuPDez~ z6xpoG)f&-ck=DJcN?;nBJQL!Z0tGll8-b?HAfKG#WdK-5INa-3RhC|!;j^I7e|&H> zy}DfPK{HU`p9G`95K%wUVxA&g4Z4333-+djzAmBv_v#Pld#`@_`uPt}_k#Yx!CxOf zJvexF{A>?evNsxx4i3I~NyzNMMboUt2L~TNejI#!2xs;A!FN@^w2v0Z<98iBOr8c@d zvO(mHd;9~6(U|cDL&kCbJ$28!ZTP`>`al4x=x70}viG3p%h$t-SQ`erIIa=XCkb#a zv+6^}?gQpoJ$w9=-tgvoA7QcVeaoxp?==jdSW%+O=vjc$2b6J9KUOKa05n5Me1s?) zA(GrIEnrPn7~$Hmk}hfEmcf5QiGo<82ocS!sr!308fU)o& zeWp8svAs~7RkE`+SHD?n1gNaDI8n-)1n8yW4}MP$5i}LO7U0NwW=F{Y#RP2kys%Ar zrpL*p7krBD9>R8UW}n^i41W@0lRT+c_>6--26mOsP7}ugtl6vz+FpMkI%$=LN|GQ( z{=||@86G1ZbVy&_k$=!3BYQwI;)w-%f|2$tSrn{m?5#vy9x?m`(dyX5Bk3~F5%SWd zBwjh;z=@7mo`4pm{duu~sX1Ul-F%c^pvu6Raj;v}ABLtyRGuIY~^ z`Qv0b>GzdQWTx#6Yvh~6+}Ps9{4_!k#k`jCpE)MYi|)j3P-lN$R(Gn=k!a4q{I|C| z$51!~L|?|4{Z_Mk?!GN69MCOtZoS>`CEpm=9I;v#Axc6Ug&nO28153iQC#{3)aVkg z*HcdBx`zFv{*rN{|+RJjITWU*T<! zB7Ez>6G$04Q39MOR@EgLNL;w$*@I?+C|gRAZQsHX^DCw+gTSOUrokVM6VczCkUhgM@a;U*d(pZl$r+02<8xt<_#hefdU1! zMT7G+UJwCI;e<!;9KsKDgtRsqT970V@rwAJ!PDPe+McXo+TaV7F*25;W~pK14xH_In34+j zDw%MvVvcGswxQb!Ys@XP8TO2#q`+>@Mhl3yWiww|#^_O2@g%J`m%p#F^8lZ9?+t}x z*DAWcmEKV%bC%bPjh^1#WgFqT^}Y+4iFijC2!4NGLodFrfJomFoox^QKMG=I*++3r z&~9HdS{r{T`x5^AQ9-zw-w5P}`r24E>5|l4&)M7wE%_(aWyF3nR8VF@WQ>@We|5BI zMex&fmGG~B2c8gaTC|nf;G5d@iLKzL4Apx&_w;AtM8`6cMb<_v1*m5y?uIpRW?~WK zBzb?^PVzRgkmeliaKriMWnMV8St2~Wl4|j&9qGJL>la;*CN7 zJO=o1WkY{Mz|%ad(vRfoQu0c(bOqZb6X9@+Wl$W0HhRkQW{Rx|Z$Ck~D?zqEXg72u zQcd~E(%ayyaH7yiJt^i-=5uNX%A{M}^_+jWruBh@t054niENdjj`}{GGrWaTqiHpC zfSko~88(RKMDTPflW#&C3?iowdGl$&aporU&Nksd9GyAmK%wLK+&B?AA@4p<{Rl=!{G-?J8$3`A&N($ zwRsQ<B z^LCr)wN0Vq?mD)Z0BLa+iD^l?--wNAvO6-Y#qc!x5DiT@+b)Jf1Kb)6iv@FQa~~Gi zt;KaX*t|oOhrvnGrf;8c@XnTSBHR&h-D_5?@)vZn3f$-sBky|zp{su_Jn@?qa+Jk9@v&<8Jy*-Y( z@hCH;PxRT2F4na0le|HGDzhnWBf~B%Xb;!9i|Mpc7H!Vu6UJxqzxxu=$v_)BQ889o zB-xC1PYcs(fPUj!yymIk3m3oSWSRjxpmz5GBs0!~m`e@2xa;=VyO;u#ZIKDw#+98M z%zcrxm&Bwwfm6?8M&i#uCOhtau{>bjs7jp2 zq;S_I|Bjje83#vuq`aqxkqnL3^@G;X1Z~Za>PfEAN{vNM=2K$9RQMRhT%mXsH$wQ_ z!SAcyhz}q9*uV#!K*rI3@;~MjDuG}4gk$JSSQu$)^9j7FV;QGNG1*#dUlOl&QWZBX zAseuex{}V3ED<%a6Q+riO2!7Q!qN^Y4^o{or_~*Q2+YXN+xM2_RM7J$ z8jER^5fk3H*KmW6H^91!4J*7+TBkSOO6AmbH`<_6?lJz#phl&jX zJ3&lsldrgS>cpt|Z6NKjd}Rxo&yGRBSw~D=g=K1)`6AGEg4v!>n=+yLpEA zn)Pu>&N_?Q#mM8(qH)VahePs$>*QXLdVmg zKWH@w^$a1Oh7|;dasS_fq_;3ortb!j=Y;d@3d^YLb&(T9+_5xuL?)Td9IPNik%J)W zlpHd%CV_%*&b~_^%xzo|R>w_zdC&ED!OpBI9ONSpy@M!+BC6d>(eM9W|52adhsF z#p&Ev!9fiB?Nxr2Esse%?%TYW<8U_W>$qIPz~XIxWf;3_rTvC9TUWr3HEL>vV3cKn zrkS!Cfu;Uc0=U@7MZ5@q(#ka!rqMSaP+3_i?dd_XsGmXQ?%y|$4jnEuo#ioPAmj04 z*;A)motkfM|0m6Whm!4pNCoAW01*hQ{2T?YY~1$?synq3zHKLb>n0RdOFEgbSF#eZ z`H@b4LxxA$AYC^9C)>z-fxV}up-lhFy(9@ZmR((oVA6yp6r*V~AbqD_-sI;+(jSej z?@^?xe(NvlEf#fFHcfe{%6jXR_0}!x7gdrjUIj&Cqn$>_MUauB6^ZgR3De-pL$sNZ zqAYyw3k^qF0tMP9;ssvDp)n(A$zIXbaD(c9cqAET{a@IIHMaJt@F%>+ShyR^pW-$a zjt=q|sDL7b>-+cD|8|Ht>}Uf*iFx}zEvo`sBNfSL8AsE5L)g=>mffap?V4?bi)x2g zctyY$%%ngl06eU5LTO*4$6yoQLb-xRwYok%(=D1f$6vJifTON}qt0&;Ew1L))8fN_ z$8=}V9aCdz_luN?+=Li7N2om7=wf(0>WP`gn}Se}Xv_$2ql(EC-pGX46i+ts4(d5B z$pc06xGQ?v^pmc*G2K18vld&j7KyMbF3}Ek4eQO)W5b(XSKj?YG`8Ow8yT;!4=3r- zn$+La6KpT}NOfxVvItw z=sJD%J}{)*9bgxz-`2pIbs%6O2trj_2u8_!zQ7Zb5!KeKEmT0i)CRDC&I8=83A%r* zB&TdCh(;4U33hJWxF#>w4pk(4&@WqDsUN)uP$ zD>Zc-k8V49s%Ttt?XP)fx7$6Eb$R(C)-&S0`+Zu>m%RI)m**`sXCKj##u(a%t=x*z z*u&k`1n)#UH*!(BpdlCAn;@Q|y#=G3t97`<2;Cr*WSaqyFQ9~>po39=)PAA%0o4?d zb?!_54}Xf((?Dte5Ih?NMq=#U@YP*0rfVn$mq+<-kQP*D2`RdpH0 zsFz}~mx?$e3!B1h*^ohVt|e^Y`_u-UxF-hR3O7B3nNU9ANjq(f7?|>P!t83*Ne6Bl zyM?#7fJg`|pWo5o97h0u&3D`0y6vUg-f}!16Ow@en_kX-#itLv-2B46&kgoH>v!#2 zK5lS0TgALJieUzSdns>eOX7a^bjD$^T4iX2HFgDnE=u!CU5|X^duW!DV{w>HKeA0d|pC5oUZ+5+0VtX z2S11h^%XR!JolRg`nZL=h!v;rF%(@Hcb@%2RC79F*Ky|6$oz_Q1FQ?s0^R5umA!Q< z+o;Oks>(KIWpAy@-g0FVsTU`X_?i6qmQEwABtsCDVM&L>9XwMVB$oPr*t7htteg?n?#wEa7Ac-W zQyn5#^w_t|t-O>o5;OU#tm%>P>kXd+Vd~weD4HRr_LGlh>1|4!WwiXIxJ1qAYavrp z^juu3a!8wP`gDu!*Tg(Qz*V0wxcyqlU)GSYu~KDDl8LI5-9uL4x?iIEG-LuJzH$hG zUh5st1E@TIm{D5vd*>zLF1R8snPe1;pKtjm5JYTDh!#XPg5XXZL#57aiTTKqicVb= zAmBK_bp|;Xpc+7&+pn>M z2GiU|mj01YGtu`yAE_~r5wu8nD@?l>ySu}GYf80WQ#LIHMt3hI`s8|di>Z{oXYz?f z$Azgf?YkxCh{e;<^W3O77e$dui*}Xm-5F)SKZ(>;RBns%blU(M$sz;Lwf%S|v4e~Z zo>b9wk+{j^n!`Jg81AGHHu3d|Z2f5~->u;pGsc^gYo*~`nk=OiPibxWJ2}#fh0+m! z%Q_a=XbRra&|74t=pwC-0X0diyXt%Y#Jgag)-1$oFV_7=AW(kAszeoQ~b5sq(XRlPRYtJO-qpwmXk>hC&HV7YNo< zPvR-Z)7$oAa;v*)ZY*sK4DEK069@DB0}zRTrac&&M}>G@zqPp`)RWaSsp^zk!g5av zSO)g3VuB(W@Rl685*MR!Kzk1k%D}1eGW}I5V*OO;9q6=x%tf8$wgq}bG!TJ*B|bWk z60&_5$4#GjM<9!@b>q{sx?IA%OY`)`>UzOnOZG{K66zs&_7G?l3Vb0c?$q;4_!ZZ; zio5vJfW2jB+u;qy+Jfw|+F)e1c;Imbp{+1SzS~ZaWa8dtFj)@oV)8x0(@8D3VgnT^ z&XDs_K2(ep9D#-0#nDZ>iG;|1;vy~GDd*>nhoW}*##>#39y;ee7(uIYZp8RFJx zbh-0smF|p1E1&Iz+>6rBF#H)_h&G|0^~DiDARH5#y1N#QEyOy{%FYuR3#H_Yex~fP zw@^a6UBz_6Y&k7NF7a6o3<&xxz1x^*6~B&$Be8-$9UII+^|lN00E2OVhi)ewN^J&$ z&YggEH2O_TZEk5?|Ija(&rk3S^)gfz5*wSP!5z@o4hU9GcY!A?*RzW^3?q}x-6D)O zYe^N_|B_CYi4&x0lsH8bs~|EfbSL||sm4K(^(8LS8GP2p=Mp|Ys?P>K3;lTspT<`M zk@^b?(&b#9K{@j4)`i%An9r5_VxQ+@71>fz7d);-3oZT8&bhrd)Y|-8K;R@8#y&|a z#PIgoMxRPrA)U#8S|!f6FDYYHCHAM4@Q!F#amUh|hK(0vtHD$??A*o+%(W#`Coq?= z)SwA)tTfQ87CusoXrGygsVm*F&ged=grRvYl(b)zbLA^GuZ0TH zawB5p@@&T_T}@Zvd!Sdcb?KoA7~?v^n&zrOw=%k0u{0UG%Cb*)})LvJA+WhZ=5@t5Ce zIw04K=Xpm;HajKCs82aiucNhk8eo8qKn`~h>$|1mZbNZ1FibSmpmo_cw65VEX4y2x z(Uk>4Nt16_pc9BV&M&iaZ8%wpuDi>-jUNrWHi29QLRE|0z8Q)1MlrT@i%}4EqY0vH zvY+^Dnhod!pLE8+0h|5IgU_p}lj&v#UTi6U`IMu2mx44suyqU#nF8@Cibe%s4{xitHrFo=`Aed)0imN8Mp zBB}h3VKJ*PCf=v8evT>&q}!PI-o!9|V=mw0awXkaY8RD$Ua0oHHPNU{e8v~79Iau0 z$hW=3+8hu*!?s^gB|>*A!WKx@))ZNkS~x1-MuI8Hb?4X%lL;95IK}auY+u@%a~oQZ ztu1Y|B?6Izivimp;5ooH8aFqsuwQ(EZ%OG;TJw>HXxnfP^R;d8qMMt0I^)8t-Ma9o zp(;kRQ~Mu#HS9cBbPt4GiahvDjlOVy9jCsx3$}Je9!)Va+a^LXIa?=-D^MjzQCFGn zBuztYn;?YIEsN!87XvKL`i|PqBac#P`P_coDDmZYKYt$ofGm2ZTLp$0sEU0 zD?Q=JH$CD8^xMylE|~J%b&7sbi>uX-tKfe_2i|sfVDo>u1EO7yl|4@`PYtUhyF~_^fi~B}=cr64%uec4W%yIy6C5ryqCnBb zYjN5Ve|E=i+tD`efduCt+E|r;-LEeluoTzd{__6WPp_XG|M26>@uT4|UR*uxa3M+{ z8%c9>bA2mZBAD-9r1Fd^2j~c+$!=~6vY&6#um$S>qL z6YA-tfgeLpI9RR%%VlXiUsp6Z9BuR|mJKjgC#i%RZ~~}`Z(eb724RzbT`}c=nT1%2 zXl+Vaz#h1t|E~`mSs82@H`LGlykTSetKVwWUb|kf{_hNzz_K!jY`ArN-e3`}UTXgQ zcIz0*>ON^4Yw;LM01U<`-hRRUUzX_{kMIu1xx!-fUS`U6;JV3AhZ&M>dcqH;m~pU5 zs~Vd(76&|8s=^5)qAxQl_)gVEtb@-4S+_tg2ErJI zVL(T~b(mXijO0xfDek|x!x5R)<3gtC4=dfXLIM>Sdi0#A5IEIu2tA7|F{*9bC`XWt zTpJB#(rg{!O4P`I?OBtC+I3Ivt#FNB4fjkkeq=A$$)@A!r{)WAS0>e4qy5tjbp?TU?7t6Y)4T z=%p2!j!uVs^JA4nqN1O_lm1y@JEJgik^{%Z=v%N;41junVg+w*!X1+*&n%ueN8!OU zvwCU`>vq__LxN$En5Qs;LwOKP(94qY5+AYwP$WDmt>K`N!*LE@x3{r8dw;7lR|t(Q zRW*48e)cIU2(>3crxhZ?YsQE}r1;bAMK*|<)x+O1qWU23;-h={nbNiaRD z+`nJnzhCix2_KCqEVJB)s_vMh6546(jgf zPJ3p60jSMHcAL#QDm^f{tb@YtwMLdOWo!?zRw6|_V`qhSt}5%aaaOfW%=8wt%d!Z2 zgM?k&b3^79lwUNL8)bH-EV9r%xf-;jRj$-f)5t1+1mB!qz=bYfEprEb3h&3hLMv!v zSPeRgpvF)ol+B~XPUit14*6ok8fg<<5f%r>I$L@3_JjZ}G;5mN15oPs8FI%DLKb@6POua1S_oqzMS-aUcB!gv1o zl9F?O;Le?(hNXSj$m7XZ=*|<$mr2CI0WT^w!8~E$17I%paMou{Fp*v!d5nN6%AW*{ zi3Z9ZgwIL_H|4kaRW_$9m7l4@+m#>hli1jS&D$~mk}=OkO!k+P%EX+2B(qdyM z(St@3HfR(tV7>i~!lpN+K);~5Quz$f*$n4T0m*aX>s z{4KFP`AcJlauP;kr{COqvDE*1krn(lG#-2QL9YiVvNJ_U@O__9QA7*?49tk5<7YS@7dnisR>dY%cj zF%k?=!FdwQ+x z;cV?0bF(K_ulW0Rk0)c#n4vvqe)i;y@3jVh&l&nXJ;r-Hp?hMS19DFc=QsI}@_TKN zFP6vzZ(!(vySNu}pvmz!16hhT#fBDtVX`1b zvY-=)+>xxlg*Dx-op(c5&7y$LiX||!tXJ9eWBL5cszFTK&N?_t{bLsuF6spZ ziu!mqt@=2VQJwJ5B~vqQwwOw*Y~?k8Mc}Hr=!;BYQ(5zF=rHN&umff7P_0^)PLE8- z0jzq%JH~Xv0w6@F2Qfa6&@#mBI_;0fQdLf%^yt{P z9ELB{TNK8gu#sc~$4L3%;9%j<8N#*84c;p1r*hkWJ8cJrkhE$kR*mjQ|uPw!>Pmxl+|#sMWT#w#z1i?mXSaODpWvo?r{(#I-n8$7Q>mcR~n&@ zga;9g8!-fW*$Bo!uN1`~i0q|g3nP=viG3x%EkegLr2|Z|C*vecY>NiU1XiezDdDBl z3ipvpO4<&Wi~;vWoJhuhhdar3pqgX~Rz#n|#K)~A?eI}+;DMzQ5{u8R*f7U8Qsx?0 zA^W(iBHrA%O?#Dp^SFa!r zCXhxX@AGc9Gtr8lx&h;0=;WQl!Y9AVPJXo^roKSo(Ga+RF_%VvM}#Z^KlF)UpBK;J zx;_oo)iV6Uo1ee?;o1A3r=#I=UFicPL*p$IX52csFpFN+~IyoLzkv4r+baauaXi4y(&cIsyyn!Xwt`qK7d7s z3)8(M8BT*eL8LH$J`=I%#eAI@XOw|{DZs4|V}^RpvL3oeN( z4ErPURZ0Iwd(?u3PWM)&<7Awg8Y;HtNgbCls&FjKVfSsuZ3I(`wM%A6lzSCLH7qW? zEd#>WH{efTdW zWUyNXiv@(|&>AwB(4Ri0FN|MOs z>-rtbP=qNJm06MpN0v|u6cRiNxMv>7QY@tWj~PmTLe5<-RMFS{Psxe_&bo9|qSiL8k37I^_T z5JbxR_I$; zO$yFCyp|H0$YkUX+&gnH_>&=CiW#^U1 zOe9~7U!4WATtwVB62^hf%?^^Yu4?j<+3(8*4YMH^odWX?oeqqp@J= z_#0QKW60VCq~o%)b$OYE-JGB_3X>>*(o_X;h!~8rJZa$8P4;&&(9#IWt;6I=M18T4 zd|D-Xg1)R0#nh}eB-g?;(6IGGrXL*|bYJ6HmnXxm^d0aA#6ou85rtT|g~`K8 zf0}v+u{dAE^LvB}nX3FyxOEN{_|lBj0k7~9+g>kd@>n`bBwK_L&=!w89?xrk;F`h$ z9}4Bkre*Tulha$+9_+J@{$SccH9}ba>Tnv6f4?PM`;dJ~(ax@dy@48Y$@SF;@eD`t z2LEnG@zo)IAI2N}yE(jNRBBmPBr`%tg2Ay4IK%+$t`${+_6pCuY)eu`@qZV( zh9rolMN;-iL+e}M8yfO^BAlcqK^z2xvTw#Ks^!yF=4!NtauJ_xWX#zn&e9qs4Ap>t zX!T_v$>OJ9DY>5JC)m$_Q|@O18$m8^^4lQtpiQs*-L0jZ+uGiSvbM-CzDR-jR=BtP zzKaY>*Q=&cLTH};9P{%hb1jBxo9E!&SaPk7 zTpJ#B45_?jlV%Wq5Asgg3^q!Jti6O#Y)_u_;=*xo$j(rdj}S`LZ>7Q;kMs>f6{v#b zr36Z=T&W43tHkM%n)I`HCBr-vco|GPTm4C zu^2b;o?;Gvgn=BRrc?S_pOq-(*sr9!b>I^DyKL#o>Fuh-lY4FCPTRSyE{dYe97 zu{}5*wGSmuZM59wx>=6fUio-@GBG|)$fhkA|QQIF~k zwnBfLRgtHL|3S-K4iIE|oDHtf9_{L=!5@$xLN@pB*Mkj&Y>0ztiNrfEEp}SC#*%Ek zRS1*nyO+Y!_f|1&`6~~id}=k&9{C(QF;nq>sM;Zw8*d-61s#%`}Zd4?n zI++RnN7b;Z&#L^`P7M6^Vbt@+e=lED57E3>R0w>DFHyS@aBe83yzW)eelCv-WXnZ} z!KkA_yUtM|PMQC9IZLju#&C@G%XkBSH~sZ(e1Tyzc{w!OvA=*+GkMXoV$$1xc!l{c zMIruhiG?iMa};H za?KmeJ>OFEyu0SJ&u_K0@deRJkYSx6OL~DE% zHNdKb9h!M8-r?G!!73fv{af6BXId~%4mg$4(lJ!%rLGz)2MNU;fj&j2mN-XPfa^k4 zCcu{nr?=!UTzJhz%~$nWnc_p5#e&n5oJK=cZL;B_l3~hr5a~>UTjBset;(7`2O?5`LLIN!-}%2C zvQBb|TFjBT*51G8f|4{&C4$vR_%1aH^UGrpQ$Q*bC&PGYJBEQ&%cKzgK4G08w|xIT ztS0?I=_#050sFk&}@637S! z%9*2mbJ(Wcy5>6nWb&~I!gsqf+--7I|O=*=Ri7d;S z(Cu5SLp=2080C98Q9r($_fd7K(owxyN0qmDHtJkDs)tc#E?r;`&P2Y{w`#6*&6QJg zrE9K4&1RI&)vJw0Rk~3XHR_gS1#Zn}y3c2#&u3;-t)k41o#~F9amQ49&-6&0@krgW z2tw5?6Y7qgRrZj7p6S+~RZh*i&u5~~jhRbF^?9@}+kL*&eZF+&`BJz3(wXN=Jsg+L za9rx)xYYA}*|ckJbj^)ZbE9i+oSGY5bK}(9=$ac{b9;qd>cP2mR@kMUh)ZW8F7-rQ zIumiJC*rcwHJ`O>KGQXyIW?c@n$Mh?&veaaPR(b!<}+h|v^|~Xebrm@ZNOvmEk=$; zq@Q*sGpC70>uyDsTZ=riT6wo3dpnA>T6wpQ_qKK%#@0}a_G>w7GeZ;dp|S6LaQee7 zth(EUQ5grs9)n+rGtK$BfCffBulEL~g1F0#4!j}+H~KHti0LO-r!M8@oQiFTNz*W3g9@bK0@f) z34I%BYYCSfRdyMY1AQ%!Ndsw1ZZOr%4Wx-_CcU<+>cQd|_t$+Zun&Pi=n+FI!}qk5 z#wQ~*+~YDFA}h+H&R;#Vg02-k?svtIa{p{u)|sk*iHAK@`qZvz0dEdvklVF8)IhYi zhr!jr4mt4c5PG`n8xj$G0?I1w@fVduB7zTe8rzu1&k(pgv3+xQ|WtnZce z{R>>$!=m3rR@jGD*ju<{8%>65v+h#7F&LbP6sJ4BUXuP=ze!C;6WuRlAw;=c0U-hg05)Od6e*wQ{@fl)0 z5=18Ld~xrA7M*NP^%vyqo%dJ0s`puWb*;V2-UleW3z z44LywI|SuieBMCbJ*OCn_5o`Rf^o26uey$ZFmt!{7YB#f`ElKO;3#m{vs?2r&=_?&bAfx`b=d`d20U?$I`CO?LfA_2@Kkw!hn>D&WmOpH5(4G+iqt!e!G#%Mr9rB{N8r|HC%tV&w z`i)4naZ|B23;z**viR|e%k0^-Oy?to7y4J^!nZC_Mb9R8Uen^19WAM?EB|TEASqbO zmSHQJ!kIh=A6C)^b*pJ4H*UmaGwU=2CWn(~SYk&(p=|U(Zq-GS;0Q;5elLh0 zT#b_8LG1M5L9n-R!Z#xP>d;AlDAGIO8xc;P7tAPyNfKiG!Q%(mCWqA8pTG1}WGz>J=`X>vkbxp@3Svu3_l52~HXf>EJtqJOny!ToUcMrLnb!6~W>KY0qbVKmlnr z3xzSd0R9wT3C)kc~PZ!G%_%ELN}nv1IZNMzxgszTqkAJ9T?4=BQae^&pwm&(%cNEJx8 z^S!i~@6A#mCS|jCmOZ^Q#L85k4nxT_a|+Td*0%eYLP#5hO)RxP ztdIysN(ZPMz$Q2B5Xmcw>UjuL5kwJERYbdvAaRI_WnAfL6r85dQ4-i&z9mc(OQ%zMLKp ze*=1K-4a%;c#Q;kMQRdANUPtE^wQBR*Z7^buuS~V*~E8$=4`)NF7s90-sU2F7jG+) z-DQ_&oHU55D_|O`4gB+4ZTISmSl}zo{&Mh!f;UdEDbG0<*@64*l;)g^vLd3{U&Q`i zjqO@-80|ySI%5itU(S921%}ln9{bmD_Spd$|a$x{4+t{#UBND@kZXbxTAlUo6GWb`D zx$huM+gN&sv{_(bcj1D?In&7oU%@K-jaXq>)m?evE}2Y6lTj>_OCwKm(XH9o91VrH zvay_^i;Z0iHda&(d~9y=v1{aGQAQB2kx?z_*R9ikpq| z-UkpCq#4cC_j}r`&fIc%<4*NL{tKkxDqeg zk``8f8lU$|n3 zzjj^-DfzbK&)q9yQG@x*Dno^|OW<5whx}`Q=9TU7<&3H1SoQadC0q`ixLD{In$6!Z zQOztQfBPEfN$wK7gQ!>UA5K1Ai0&Cd{ zd}Xqwp{Bx~d9bXJA;Ukzc!YoY>a#yG6|7pCS0>160Xv`Q0Q$x|E?2&@-KD7}^=iEw2Jp zWyd`rxBZarA(HD>*|@L$(WFkQu(pNJq+V2n`P2v2mq%k@7i&{Ez2zK$qFL5|ta`GG zy?-r$F#jncD%-Ihv*!q*u=Hs#$%q{cx=eN#CVeH+c4{+`FG``$q)#!HFly#|hfdRb zh@U;nVFA@SI{qr~?6$+aNDc#mCSd@UIoULpTAb|=P5DZb>08Bgi;v+nl$K>|=f$Lu z21Js)>L{O7yY`{7 zvp%GLVd(n!X^%o!>suyGL>bL%g{Cd+yvqX zVP+F<ss#MQ~Q;3;k?-N^sS3R*MOzfIoc4#`wqxGbO>C8_`qPmqy zbt!Ozfm^9ABFO=D4G}Egq_A>OcHQM<8Is<9AzfASL_uA&QZo58f-@ey8Ug2levK9h zc{W-mu?rd5N5?9UdAQSDm9YxWH^~0t>j3~VHByJ4@qib zL z+7I9Kj-&o_QP__Zbk%zq^`3KG@e2(Abr@dte~jPspG5I{GxQ~d9%JaU-}d3ui|gvSNL^r6yew8`;)IvlanX$kMZB*Z)p{-;`!;VvBr|` zBooI@|IoWSf3xu)<9hs6 z{15oAf$((vr`wpEZshn+orw1fC7MBIBrYedtIVSFDzi)$?ww`k1i_ukJq z#+Qym2yh4eu3P{GaIQ2Exb;56`DB&mWoF@CW>Qqi+G$fLWpKjrI(pe+9-x1vSNxw? z;(sd7ET%%SaBx*5E8bICg!6gABeF*`aTaSSQYh z7Iihwq$MC}+IP;w=BYnvCXXu$Ci@VK>$?>9Go-sivP)0jPwv5TM245( z;)474(lRcFm8Be(fkGKa^k*LO7iKxP0$W>PYYXyB-FQ4x3;6JVf41jmS9G@BclER#x`M{KgdD?i46?jLKHT1QGc(MTK7c_3v=m zNdodK8<=9r4x#2fsl+5bRe!FRYI((Ji#&rr9GQ2VFc4tDN=h0=y$8{F?|P58C>jzT6U z%)6l>yL6nq%<8(cGh#TDXVq@mKp%rRsBi7zQytN1}| zUy5L$Vn<~%hypI2A5LAt*7 z1Gxl`GFL}^w5F%>>%zDd)u(uA8`R5umW87THbf3Xsa%yFgzx52|KL0h{&n<+Km4H| ze?;OH740kWMZ#b9=kR!^F680l4-LQ59|B^1dXn=Tgb09?z7|+KXfamq-~kxj0%)E_%sK zZi*8u@l?K0mZIku@kMVIMZ#mPNLp$He?U10zUN_Qlk#*V_eSKoP0vE>F_zSp*WxPl zJ+gvDLW11sJX}ZPxv_uK{^%5ThfMr4Cay%{519CaKQT(DTLVb``e3)Asm`?MQDti_ z_bbL2f*j?v>U}UHzYnI>7(;}xjz;7M@~<`;MiZXIMTAIVG=2+oLZA|rm?+kXe;S!c zJVFZ_ACy?dDg0?L_YA)-;7@~+fd%lYm&rvxMeu#J-bxX3jlinMz^uYghO{1I`u-(D zUyrej{z^gLp9{gwDn6H@n#=ec-~3phcZbI(PKYm0cxknS@eS$R=6X)(jf zl?PP$CRc|gr6G6ZxNYG#91HoWF?*E2*uuYsvP@olKn5`P`CFCzfL5KUi2(zi=Q2ZK zC0;b0h*jQ@98+l5!03O6M6Ru0BV%@H*vNE#9UEdZ454(NNNNz{QXB_&e-%+<&Kga- zERIA+sTu9}Cy@@u={o1OL70N$(b8@u0M{NRK2b945lkvk^@qI9(buhzR{svyJOABo z%blp{yc2o#P|dMLHPl|OGKaT19mrb~GEF>aj3^2M&_+;u^K@F?uqLMeVr)b>1V|tp|=J0A?Hb*j-HWgZRPS zG>(w*eH^%#mDV{g=s%z0bPdpI|4L1&%{t%pTFa-U_ih`|-4^+Wy+Ge=gMWCB7zr6> z-fN9@d51woj*Ap}X~o+!Xr>!vunRVtAvB;Y&HS)mvfDdf8qodxd<`tE7b7$4g}B#@ z@t8K&;EYibhm>*3?||SrPS~t2d$wd|Z^;a2RuyBr9V5UhF%(<-Beb#Plx|nPT??kH zjvR#}nf*6J>icIX-hIU9Iph~BR&yx#?-%01*r4|U75s+<9)BBQi?O+<5LnlO;P_zN>cI4CA9Cw}f zc!uvjZsa0DzuV*}_J1duk4{Il?*-!{ilz0XmWy1fOytPeUaiYdUSxD$GQ;+T?czeX zK`=c}h~Enp?#ZXN>3u1@^*));v$=z%tUGKZd`%6olL}#|$Z<=;(Q~MCZrJ=@(;Wql zCW%AIdcdHP~8w(gmRfrMi1a=Ge=1Aa;Ixg@SqS-wn59R=$lT%1l>0|Ee>|MzFq+rGj@25}yieM_KJP8- zqz%+h8c@2g%72TTCx24K?ffJj9Oy?bU%t|pZ++W&t-DwJCND>=TR18Fv<{SAhp3Ww zdX6M2fKPXMjl^6e;>6xl`F)Iltmd4|%`&YO^*1m4D);p$$$1_#t$adw(xsm^Dt zKyDw5#tWOyZK>v7(yBqsgUnlQwZd?DTM%Zf>KAQq~j^Nh5V9nfclF zx}#i?qE2Hnj4%A;2C30xc62f6^=8p^>d>3nX`GrPuZY(QIfqoai4{*ND&S;widvG5 zCwLRxqETYTR*0FfOB9BP_?SYrhlr3v7KcLv^?xE+SQd%PSY0xbqPJkP9(mVD>fVw< zP$E$@X*GcmmG#^JqKvcyEc=4uEO&XLR{iEELnp0OuX#*A@_qp!8~D*H zAY`)*??euC)4_k?ozi?jS5wxs@7e0;lD`2ozAC8Ji!%r!07j%L5q)iswwB%;l#sE8#u zTckE*!^`|!RxIJ1DCCyU29oP_oSF-w3^|Lr6` zoldDITQH~P_kf)EM%UuYdgP&~?U=M?N`I>%mid9{8(WHDa?G+#41;Ru+BeWH`)Ldm zFOd4BLlP@)p4<#FnVA(x{~|wEZ$5ChYk)tcLsovs6I#Zp2=P*Zrf}bK2pM_mnmTE2 z#_>cpTWQ@(v`8!s%FSj=T81=A3YV-Abt#z|0x^%*bRLd{?LaJm%B01>muMt%jennx zk#`4hJTh_kP1GH?sR^2E+M_EdxjRcc@G~E|?loVcUAF~|X2(Ulu4ZG;h8aM(%l2`^ zdx(j}>K~h%V!NUJXAr3eM|4i?T`lwC*YQP_Eu0*0su`u-gS7I+$ch&)Mk0w{v#Pge zsa6pL`<|^^)q4<80TQCiSgfLGg@4jzu2P75&zQD) z=OJL^&{IVLq8M2KP`z`yzhnIqVWloHVq$5a zuJBntRjQt zqyy}I6I?1413hmKq2jzxu-_b^u~2Y5Mxme%mdn(0S!bxxil9bwJY=lmK1*QG zB@wW%;(GnZ*YBm||7Ua&_H9`KTbbgFWJNdC5>EyH_VAAiPbYgkoYE5nJxhjR)*nR& ze;G#me;JOA@PAB%!PVDWkELWLD`H~N-B4-71S5FmYrggXASEZd!dnvCmc>&#OB+bl z&;bM?7in=$-??DhxNR1}EP&B~o5Xe9q*X&LGhmO|-4>iy#oUP6+L3s^7B9e*_S;|H zKl|zRlj9$Ld>P9Y+1$19r~|tZZ-lxp=D_B*5(FoFgMY1VrP2=|w^CYudxy1!ZyWiH z8E12a>51;XsggOG9t7$;Gipziot-_q+sZQ2h1Y7_>{173a6zD@6}5Y5u?48A;|m`s zjj~P&n2>p?gh4FWZ;y~VYw`S~y9I$%E3&pBGX7Fnqv;)L)XX88RB1S})^`c%1 zG#O6Pqko*tU+{YY-;1MqvViY0N%z0nuX~IAui|w=2u(fsr#Iq1ho{lO!kL+Oq}vVebo^W)3*4(Ea4n6fRgu4MZXOEOZ=SPd0e{5GpEoy$!`t6`mDp{QQ2Vk8XqNrx zQ6CM+B~lZ=GAWTizcwj@Dtug;^^&imG^y}G2~o*rus#TvYzFHiP9LL44gXoX>riZ7=DEh)x6{{|eogT}sj;)S&uR>$$?_!p-qX@d_coY3le8{S1 z*MCCfRKNRKBIh@*Y2s@*D{449YMg0Aw53&2k>%b=jmLrb#+k=IhdSi&^mjWTcrZTm zbl}V#lkp~7<>{`uphW+~sff$=WR%I^;XY18Z}8|Z`#b}^!DzJ4Lr?I-2^`qNp`59* z_h=~R2oCT^kAAo5q4D|5*`d7KCg<=@vww5=Pn{m5w!SH%jj~R}{zwyZZo+bZ@bE7W zd+YtdpZ@rlUb;UR{rNA^!D#UC(MV1irTOYFnC6dv{v)ONQyD8>|vt`vtd#j-2KS0Y6RvjVFvE`JfzHzXD% zm3+uTG8@Y;zMfI9$9e#|*B#F6=dLr%+r6$}T0fM__3qohN_f{5R<6>2tdZXE58+FJ zF@G}gXuU-2@Xn(`Aj93F(H)78aVmt*emL;s#9F>5OQ=+}Kmay;0RZFSY zB3Z-IPZ6YrgsyJS5bzlRJ-7&=JWofn0%0!)R)N|;ltxi z63+J*y${j;SMeDf)bT$5Cb})`eLwre zea{PKY%HGcov*gt=YMX0RY3O{@G8H`P$6j75g^mu`I3Rwt2HFTJBIvybMw{jPHVcQ zzzly&i*XH$ZViiW-AnA&Mp{x_PtsQGb(yS5P@KYgLs4JJf_$vzxi(snD871jL#>LywALVwDlmr@oziv_QAar>p0 zBU$~}ZcX=Ul`G_P7pu(AYxVar_%>f3wavHXUFjI|w4h%wa4YHyUtzCZgGbvGQkzM( zEgrX+M;Zu-`jZqgWKm=US^DsBI-F}q6M^v+=ynBhpqnf{-jKqvz)laaD)C1*UIegu zr}!XaO<4rC8-IT5KEa34CH3`JR{aSa15Z)p*R4=k6)#hKts`&>oT2SLt<>CnWz9{% zzAXcDhJc&C%<8?DuvA}{mnn3`nXn)*O;p7fo2UxgF+HCUYs}|p@X(r2h&3m4)Ut0C zg@4@+CbUMU3=hxNPlz0L}d5bE81y159&MFJEdaW zq6>F4NT+SP6|xi_>t zbN`&D9HpRLbp(~idSZ5%hmuk_bw^Ac9F(mvGK**o$a@Af(D?Z9BSvJBLM{h!bCe2a zOH&D+=YM;BdASj@_-$EnlO?lms-SaY1j3=5_9DIpmKTOgaRo~X$=S`yntdqcqWK3K4 zU|_mz2YQbR)oLd~vTCef*0j|*Axv;kJi|a!(tqW1)t3a9iWMT#;Xpj8XQ*=24D^SH zJ;Mg16&yzpt3RY#B#k+H8NdYAx0Oc6)`(LQvvRKAa@yKkZ3RZZbp)OsLX|$V?L8nu zL2y>ncg2C_UQlVeU;*sx9IdSEku}pu6;PE(wD{PXGb3ItK?I^CdL!(>tcbs_>n2}p z0)K{4mOkRO34omg5y5blvMQLGn!jU1)mI_Rs^R%mOtn`35Pi(wbB2jF;yNu%^j__V z{FJfs*{{eZ>GQ&DGK|I7Y8jgm?tU5i7N?clXNh2Lm^S>di|BQ2f-k`OdM-h-u|&jT zlo}5*5^bNQ`w~fab&bp=USBxpD)LeL?tjt7D!(~Hf!4RtE%#1uqqa`-XCbG@ouJ@+ zita!L=aaC`$c1;1E>{=nS=QvUK*aHGaE|(nx~)grN9zZd9 z?nvsgm=yT5iL=3Fme%VkJEq-*-c)##8hA}3y5cxKvjy^oo4-=|>&FGb;MNMkuYWKm zl1Ze`$VKl$$%P!et9xO8`flEf!s&Q*6-~VX*602~Yz)4jz_`w{t8CV)i0=CmC%K7( zAetCQ9a9IQb!atV(UM=ZXqcP|A}+3-;;otD&`$C7a$T9x4>{Tqw&{4#c0hkD3{(E+ zGU1py$xcH~YTt(&YmpUVh2c$A(G-G^ek|a4)`)^Fp{;ud_z2(>p+T`R!8y*jEER3* zQ#7nsfYj)o>|hyR7!t@8oSJi$L`h(%2kVp7XB$T^ESHH<}gOt(Bf%(vR;^osqh=XKADwY$Kyw+*S}p0#+48-61`r%znk@71e` z?P|p8q-L$Wvt=YKuS_Z>|-T5tCeTFQQFwy7{p;{Eg9pEZC50}_Hvko zYg^~1v2}iWk`z>)39e5gdg$`Z?%JMR%-Baalk4*fe*yUPx3vg@bT;cB z3dYpoSKC6flV*_D&+}ii<>qBMmmIi9q(YndU*fLhjy&YAhFn1Qq8F^L0=Iw%ULo59 zSIT4fP>~`=kI2ah}GhsG_imiZyM=kPPI9^T_C}Bsf{n6N> z|NYFmo2z7A!H&suz);|Bep1Z8J`eE%MNnX7G_QghA~mplC0?41PEB|Bay*PrI=nRb z{W6KUJ%3F=Reur+D-Mn@crS>Zy)mU{kp6-`l6S#_pmjtC58lC9OpjFNI87f=PI~`0 z4|Y1I5IV%pfh$^OvG7b(Y&#S0Y?14ujYFd2?R@qgoj$DfKLfGhzjq%&9rRQ02nv)PF$Xx7U*c1c&YoRx*$4$_kUA=4J|)ccr&6DZ_)DzM}T8QfFx3xN|K@b0talz-sZs={+(}N^0+7` zNw!})cYlM9deBvSFQj^=-ARTK%|0#`ElmWr)iAxbh8wc+vs;879b(&gO;*p+Rrbr} zlE#^r3yumpY=8-8ImM#aQ|F9YHR_PE){V3ZCls&}{}Gxquz378)%J8s&4Qx}ot+2U zd+C%110yHYzRdEFZOkZjv*kDmQY0skueuzkV1J5aqf=I!s$1 zEhcNclvF2cUdYohy~`qApH4+(b|}BH9!79@*PfM}^3qs)S8K3=qjtUtI#=r29-48s zzr5ROV~?cU78v&5USO~&qVWRB@g*=9UIhmTnZ_H-SyVnevxET23uqgJy`^lNrFfgFxsSZ%HEm6 z=;nq#pWq`$h`6gGAec}AQo4-pR}UokDukG6k?6^ktF}grp7)cNb^dY<^)*{E{j}j$V-1M8}PAL3AKSdOD zT&}{XPd|lt2%-^8>^8RanV!sMSzVV^Ej0>13;Wa%oFVucT&8VUo1b1k=b^+qc%FQJ zeEe!46JB4GbyFa=b2X4ZW2^rx<4DxZHDX!Z(4@_}ep=3PQy&h=)}n_9&=F#_a+wJF z6U6qTF$5OKVy&tYM|kkf(;r{HeErS0KfU?pnFN|)m?0x#yayzw$mB>afPZAp_nLAq z=;^WP0cq{=&?rPZEC|J(b&WW8&@^{C-Y;tNQC1=3Eo!0v&#U2emd@Wa@bi)<3Qug` z$lz;g4;@X#m3LH8h7GMii8wDNDYDuI18BvWPK%!X_~I2Vo+=@PBh~n;%jLYh#D_JN zB1UK>m0(>hp?kR6bl64HAb;>WOTdyARA9_-v>gzF6I1yd0hI){t{=Xtrb4Eqcb)mkPXXrDXJB{~l(_p&>=DnEZC z_>W|Jy%L*oa<^o@W|_6w9yi?v3nW4bNoCGC&~NM8Tlbxs7@0#LH0O5akcrD(d7RFzMO*1kDCGjR&2kT delta 40186 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 KNsJr!n*snWFls^o diff --git a/src/collection.mixin.js b/src/collection.mixin.js new file mode 100644 index 00000000..b742ca9f --- /dev/null +++ b/src/collection.mixin.js @@ -0,0 +1,145 @@ +fabric.Collection = { + + /** + * Adds objects to collection, then renders canvas (if `renderOnAddition` is not `false`) + * Objects should be instances of (or inherit from) fabric.Object + * @method add + * @param [...] Zero or more fabric instances + * @chainable + */ + add: function () { + this._objects.push.apply(this._objects, arguments); + for (var i = arguments.length; i--; ) { + this._onObjectAdded(arguments[i]); + } + this.renderOnAddition && this.renderAll(); + return this; + }, + + /** + * Inserts an object into collection at specified index and renders canvas + * An object should be an instance of (or inherit from) fabric.Object + * @method insertAt + * @param object {Object} Object to insert + * @param index {Number} index to insert object at + * @param nonSplicing {Boolean} when `true`, no splicing (shifting) of objects occurs + * @chainable + */ + insertAt: function (object, index, nonSplicing) { + var objects = this.getObjects(); + if (nonSplicing) { + objects[index] = object; + } + else { + objects.splice(index, 0, object); + } + this._onObjectAdded(object); + this.renderOnAddition && this.renderAll(); + return this; + }, + + /** + * Removes an object from a group + * @method remove + * @param {Object} object + * @return {fabric.Group} thisArg + * @chainable + */ + remove: function(object) { + + var objects = this.getObjects(); + var index = objects.indexOf(object); + + // only call onObjectRemoved if an object was actually removed + if (index !== -1) { + objects.splice(index, 1); + this._onObjectRemoved(object); + } + + this.renderAll && this.renderAll(); + return object; + }, + + /** + * Executes given function for each object in this group + * @method forEachObject + * @param {Function} callback + * Callback invoked with current object as first argument, + * index - as second and an array of all objects - as third. + * Iteration happens in reverse order (for performance reasons). + * Callback is invoked in a context of Global Object (e.g. `window`) + * when no `context` argument is given + * + * @param {Object} context Context (aka thisObject) + * @chainable + */ + forEachObject: function(callback, context) { + var objects = this.getObjects(), + i = objects.length; + while (i--) { + callback.call(context, objects[i], i, objects); + } + return this; + }, + + /** + * Returns object at specified index + * @method item + * @param {Number} index + * @return {fabric.Object} + */ + item: function (index) { + return this.getObjects()[index]; + }, + + /** + * Returns true if collection contains no objects + * @method isEmpty + * @return {Boolean} true if collection is empty + */ + isEmpty: function () { + return this.getObjects().length === 0; + }, + + /** + * Returns a size of a collection (i.e: length of an array containing its objects) + * @return {Number} Collection size + */ + size: function() { + return this.getObjects().length; + }, + + /** + * Returns true if collection contains an object + * @method contains + * @param {Object} object Object to check against + * @return {Boolean} `true` if collection contains an object + */ + contains: function(object) { + return this.getObjects().indexOf(object) > -1; + }, + + /** + * Returns number representation of a collection complexity + * @method complexity + * @return {Number} complexity + */ + complexity: function () { + return this.getObjects().reduce(function (memo, current) { + memo += current.complexity ? current.complexity() : 0; + return memo; + }, 0); + }, + + /** + * Makes all of the collection objects grayscale (i.e. calling `toGrayscale` on them) + * @method toGrayscale + * @return {fabric.Group} thisArg + * @chainable + */ + toGrayscale: function() { + return this.forEachObject(function(obj) { + obj.toGrayscale(); + }); + } +}; \ No newline at end of file diff --git a/src/group.class.js b/src/group.class.js index cfee71e5..cd73739c 100644 --- a/src/group.class.js +++ b/src/group.class.js @@ -6,8 +6,7 @@ extend = fabric.util.object.extend, min = fabric.util.array.min, max = fabric.util.array.max, - invoke = fabric.util.array.invoke, - removeFromArray = fabric.util.removeFromArray; + invoke = fabric.util.array.invoke; if (fabric.Group) { return; @@ -30,7 +29,7 @@ * @class Group * @extends fabric.Object */ - fabric.Group = fabric.util.createClass(fabric.Object, /** @scope fabric.Group.prototype */ { + fabric.Group = fabric.util.createClass(fabric.Object, fabric.Collection, /** @scope fabric.Group.prototype */ { /** * Type of an object @@ -142,8 +141,7 @@ */ removeWithUpdate: function(object) { this._restoreObjectsState(); - removeFromArray(this._objects, object); - delete object.group; + this.remove(object); object.setActive(false); this._calcBounds(); this._updateObjectsCoords(); @@ -151,37 +149,17 @@ }, /** - * Adds an object to a group - * @method add - * @param {Object} object - * @return {fabric.Group} thisArg - * @chainable + * @private */ - add: function(object) { - this._objects.push(object); + _onObjectAdded: function(object) { object.group = this; - return this; }, /** - * Removes an object from a group - * @method remove - * @param {Object} object - * @return {fabric.Group} thisArg - * @chainable + * @private */ - remove: function(object) { - removeFromArray(this._objects, object); + _onObjectRemoved: function(object) { delete object.group; - return this; - }, - - /** - * Returns a size of a group (i.e: length of an array containing its objects) - * @return {Number} Group size - */ - size: function() { - return this.getObjects().length; }, /** @@ -219,16 +197,6 @@ } }, - /** - * Returns true if a group contains an object - * @method contains - * @param {Object} object Object to check against - * @return {Boolean} `true` if group contains an object - */ - contains: function(object) { - return this._objects.indexOf(object) > -1; - }, - /** * Returns object representation of an instance * @method toObject @@ -285,28 +253,6 @@ this.setCoords(); }, - /** - * Returns object from the group at the specified index - * @method item - * @param index {Number} index of item to get - * @return {fabric.Object} - */ - item: function(index) { - return this.getObjects()[index]; - }, - - /** - * Returns complexity of an instance - * @method complexity - * @return {Number} complexity - */ - complexity: function() { - return this.getObjects().reduce(function(total, object) { - total += (typeof object.complexity === 'function') ? object.complexity() : 0; - return total; - }, 0); - }, - /** * Retores original state of each of group objects (original state is that which was before group was created). * @private @@ -410,23 +356,6 @@ return this; }, - /** - * Executes given function for each object in this group - * @method forEachObject - * @param {Function} callback - * Callback invoked with current object as first argument, - * index - as second and an array of all objects - as third. - * Iteration happens in reverse order (for performance reasons). - * Callback is invoked in a context of Global Object (e.g. `window`) - * when no `context` argument is given - * - * @param {Object} context Context (aka thisObject) - * - * @return {fabric.Group} thisArg - * @chainable - */ - forEachObject: fabric.StaticCanvas.prototype.forEachObject, - /** * @private * @method _setOpacityIfSame @@ -498,20 +427,6 @@ centerY + halfHeight > point.y; }, - /** - * Makes all of this group's objects grayscale (i.e. calling `toGrayscale` on them) - * @method toGrayscale - * @return {fabric.Group} thisArg - * @chainable - */ - toGrayscale: function() { - var i = this._objects.length; - while (i--) { - this._objects[i].toGrayscale(); - } - return this; - }, - /** * Returns svg representation of an instance * @method toSVG diff --git a/src/static_canvas.class.js b/src/static_canvas.class.js index 40764bac..8e6bc24f 100644 --- a/src/static_canvas.class.js +++ b/src/static_canvas.class.js @@ -30,6 +30,7 @@ }; extend(fabric.StaticCanvas.prototype, fabric.Observable); + extend(fabric.StaticCanvas.prototype, fabric.Collection); extend(fabric.StaticCanvas.prototype, /** @scope fabric.StaticCanvas.prototype */ { @@ -440,28 +441,11 @@ } }, - /** - * Adds objects to canvas, then renders canvas (if `renderOnAddition` is not `false`). - * Objects should be instances of (or inherit from) fabric.Object - * @method add - * @param [...] Zero or more fabric instances - * @return {fabric.Canvas} thisArg - * @chainable - */ - add: function () { - this._objects.push.apply(this._objects, arguments); - for (var i = arguments.length; i--; ) { - this._initObject(arguments[i]); - } - this.renderOnAddition && this.renderAll(); - return this; - }, - /** * @private * @method _initObject */ - _initObject: function(obj) { + _onObjectAdded: function(obj) { this.stateful && obj.setupState(); obj.setCoords(); obj.canvas = this; @@ -470,25 +454,10 @@ }, /** - * Inserts an object to canvas at specified index and renders canvas. - * An object should be an instance of (or inherit from) fabric.Object - * @method insertAt - * @param object {Object} Object to insert - * @param index {Number} index to insert object at - * @param nonSplicing {Boolean} when `true`, no splicing (shifting) of objects occurs - * @return {fabric.Canvas} thisArg - * @chainable + * @method private */ - insertAt: function (object, index, nonSplicing) { - if (nonSplicing) { - this._objects[index] = object; - } - else { - this._objects.splice(index, 0, object); - } - this._initObject(object); - this.renderOnAddition && this.renderAll(); - return this; + _onObjectRemoved: function(obj) { + this.fire('object:removed', { target: obj }); }, /** @@ -1022,15 +991,6 @@ return markup.join(''); }, - /** - * Returns true if canvas contains no objects - * @method isEmpty - * @return {Boolean} true if canvas is empty - */ - isEmpty: function () { - return this._objects.length === 0; - }, - /** * Removes an object from canvas and returns it * @method remove @@ -1045,17 +1005,7 @@ this.fire('selection:cleared'); } - var objects = this._objects; - var index = objects.indexOf(object); - - // removing any object should fire "objct:removed" events - if (index !== -1) { - objects.splice(index,1); - this.fire('object:removed', { target: object }); - } - - this.renderAll(); - return object; + return fabric.Collection.remove.call(this, object); }, /** @@ -1150,42 +1100,6 @@ return this.renderAll && this.renderAll(); }, - /** - * Returns object at specified index - * @method item - * @param {Number} index - * @return {fabric.Object} - */ - item: function (index) { - return this.getObjects()[index]; - }, - - /** - * Returns number representation of an instance complexity - * @method complexity - * @return {Number} complexity - */ - complexity: function () { - return this.getObjects().reduce(function (memo, current) { - memo += current.complexity ? current.complexity() : 0; - return memo; - }, 0); - }, - - /** - * Iterates over all objects, invoking callback for each one of them - * @method forEachObject - * @return {fabric.Canvas} thisArg - */ - forEachObject: function(callback, context) { - var objects = this.getObjects(), - i = objects.length; - while (i--) { - callback.call(context, objects[i], i, objects); - } - return this; - }, - /** * Clears a canvas element and removes all event handlers. * @method dispose diff --git a/test/unit/group.js b/test/unit/group.js index a942dc4f..2321316f 100644 --- a/test/unit/group.js +++ b/test/unit/group.js @@ -63,7 +63,7 @@ group = new fabric.Group([ rect1, rect2, rect3 ]); ok(typeof group.remove == 'function'); - equal(group.remove(rect2), group, 'should be chainable'); + equal(group.remove(rect2), rect2, 'should return removed object'); deepEqual([rect1, rect3], group.getObjects(), 'should remove object properly'); }); @@ -74,7 +74,8 @@ equal(group.size(), 2); group.add(new fabric.Rect()); equal(group.size(), 3); - group.remove(group.getObjects()[0]).remove(group.getObjects()[0]); + group.remove(group.getObjects()[0]); + group.remove(group.getObjects()[0]); equal(group.size(), 1); }); @@ -367,6 +368,22 @@ ok(typeof firstObjInGroup.group == 'undefined'); }); + test('insertAt', function() { + var rect1 = new fabric.Rect(), + rect2 = new fabric.Rect(), + group = new fabric.Group(); + + group.add(rect1, rect2); + + ok(typeof group.insertAt == 'function', 'should respond to `insertAt` method'); + + group.insertAt(rect1, 1); + equal(group.item(1), rect1); + group.insertAt(rect2, 2); + equal(group.item(2), rect2); + equal(group, group.insertAt(rect1, 2), 'should be chainable'); + }); + // asyncTest('cloning group with image', function() { // var rect = new fabric.Rect({ top: 100, left: 100, width: 30, height: 10 }), // img = new fabric.Image(_createImageElement()),