Small fix to glow and animation.
authorDmitry Baranovskiy <Dmitry@Baranovskiy.com>
Wed, 23 Mar 2011 01:36:40 +0000 (12:36 +1100)
committerDmitry Baranovskiy <Dmitry@Baranovskiy.com>
Wed, 23 Mar 2011 01:36:40 +0000 (12:36 +1100)
Added renderfix() method for subpixel rendering fix in Firefox and IE9. Special thanks to Mariusz Nowak.

raphael-min.js
raphael-src.html
raphael.js
reference.html

index 2ddda5f..b2a9353 100644 (file)
@@ -5,4 +5,4 @@
  * Copyright (c) 2011 Sencha Labs (http://sencha.com)
  * Licensed under the MIT (http://raphaeljs.com/license.html) license.
  */
-(function(){function c$(c,d,e,g,h){e=P(e);var i,j,k,l=[],m,n,o,p=c.ms,r={},s={},t={};if(g)for(v=0,w=cU.length;v<w;v++){var u=cU[v];if(u.el.id==d.id&&u.anim==c){u.percent!=e?(cU.splice(v,1),k=1):j=u,d.attr(u.totalOrigin);break}}else g=NaN;for(var v=0,w=c.percents.length;v<w;v++){if(c.percents[v]==e||c.percents[v]>g*c.top){e=c.percents[v],n=c.percents[v-1]||0,p=p/c.top*(e-n),m=c.percents[v+1],i=c.anim[e];break}g&&d.attr(c.anim[c.percents[v]])}if(!!i){if(!j){for(attr in i)if(i[f](attr))if(U[f](attr)||d.paper.customAttributes[f](attr)){r[attr]=d.attr(attr),r[attr]==null&&(r[attr]=T[attr]),s[attr]=i[attr];switch(U[attr]){case B:t[attr]=(s[attr]-r[attr])/p;break;case"colour":r[attr]=a.getRGB(r[attr]);var x=a.getRGB(s[attr]);t[attr]={r:(x.r-r[attr].r)/p,g:(x.g-r[attr].g)/p,b:(x.b-r[attr].b)/p};break;case"path":var y=bC(r[attr],s[attr]),z=y[1];r[attr]=y[0],t[attr]=[];for(v=0,w=r[attr].length;v<w;v++){t[attr][v]=[0];for(var A=1,C=r[attr][v].length;A<C;A++)t[attr][v][A]=(z[v][A]-r[attr][v][A])/p}break;case"transform":var D=d._,E=bO(D[attr],s[attr]);if(E){r[attr]=E.from,s[attr]=E.to,t[attr]=[],t[attr].real=!0;for(v=0,w=r[attr].length;v<w;v++){t[attr][v]=[r[attr][v][0]];for(A=1,C=r[attr][v].length;A<C;A++)t[attr][v][A]=(s[attr][v][A]-r[attr][v][A])/p}}else{var F=(d.matrix||new bP).m,G={_:{transform:D.transform},getBBox:function(){return d.getBBox()}};r[attr]=[F[0][0],F[1][0],F[0][1],F[1][1],F[0][2],F[1][2]],bM(G,s[attr]),s[attr]=G._.transform,t[attr]=[(G.matrix.m[0][0]-F[0][0])/p,(G.matrix.m[1][0]-F[1][0])/p,(G.matrix.m[0][1]-F[0][1])/p,(G.matrix.m[1][1]-F[1][1])/p,(G.matrix.m[0][2]-F[0][2])/p,(G.matrix.m[1][2]-F[1][2])/p]}break;case"csv":var H=q(i[attr]).split(b),I=q(r[attr]).split(b);if(attr=="clip-rect"){r[attr]=I,t[attr]=[],v=I.length;while(v--)t[attr][v]=(H[v]-r[attr][v])/p}s[attr]=H;break;default:H=[].concat(i[attr]),I=[].concat(r[attr]),t[attr]=[],v=d.paper.customAttributes[attr].length;while(v--)t[attr][v]=((H[v]||0)-(I[v]||0))/p}}var J=i.easing,K=a.easing_formulas[J];if(!K){K=q(J).match(M);if(K&&K.length==5){var L=K;K=function(a){return cY(a,+L[1],+L[2],+L[3],+L[4],p)}}else K=bd}o=i.start||c.start||+(new Date),u={anim:c,percent:e,timestamp:o,start:o+(c.del||0),status:0,initstatus:g||0,stop:!1,ms:p,easing:K,from:r,diff:t,to:s,el:d,callback:i.callback,prev:n,next:m,repeat:c.times,origin:d.attr(),totalOrigin:h},cU.push(u);if(g&&!j){u.stop=!0,u.start=new Date-p*g;if(cU.length==1)return cW()}cU.length==1&&cV(cW)}else j.initstatus=g,j.start=new Date-j.ms*g;dc("anim.start."+d.id,d,c)}}function cZ(a,b){var c=[];this.anim=a,this.ms=b,this.times=1;if(this.anim){for(var d in this.anim)this.anim[f](d)&&c.push(+d);c.sort(bb)}this.top=c[c.length-1],this.percents=c}function cY(a,b,c,d,e,f){function o(a,b){var c,d,e,f,j,k;for(e=a,k=0;k<8;k++){f=m(e)-a;if(y(f)<b)return e;j=(3*i*e+2*h)*e+g;if(y(j)<1e-6)break;e=e-f/j}c=0,d=1,e=a;if(e<c)return c;if(e>d)return d;while(c<d){f=m(e);if(y(f-a)<b)return e;a>f?c=e:d=e,e=(d-c)/2+c}return e}function n(a,b){var c=o(a,b);return((l*c+k)*c+j)*c}function m(a){return((i*a+h)*a+g)*a}var g=3*b,h=3*(d-b)-g,i=1-g-h,j=3*c,k=3*(e-c)-j,l=1-j-k;return n(a,1/(200*f))}function cM(){return this.x+p+this.y+p+this.width+"×"+this.height}function cL(){return this.x+p+this.y}function bP(a,b,c,d,e,f){a!=null?this.m=[[a,c,e],[b,d,f],[0,0,1]]:this.m=[[1,0,0],[0,1,0],[0,0,1]]}function bs(a,b){var c=g.doc.createElement("img");c.style.cssText="position:absolute;left:-9999em;top-9999em",c.onload=function(){b.call(this),this.onload=null,g.doc.body.removeChild(this)},c.onerror=function(){g.doc.body.removeChild(this)},g.doc.body.appendChild(c),c.src=a}function br(a,b,c){function d(){var e=Array.prototype.slice.call(arguments,0),g=e.join("␀"),h=d.cache=d.cache||{},i=d.count=d.count||[];if(h[f](g))return c?c(h[g]):h[g];i.length>=1e3&&delete h[i.shift()],i.push(g),h[g]=a[l](b,e);return c?c(h[g]):h[g]}return d}function a(b){if(a.is(b,"function"))return dc.on("DOMload",b);if(a.is(b,D)){var d=b,e=cl[l](a,d.splice(0,3+a.is(d[0],B))),g=e.set(),h=0,i=d.length,j;for(;h<i;h++)j=d[h]||{},c[f](j.type)&&g.push(e[j.type]().attr(j));return g}return cl[l](a,arguments)}a.version="2.0.0";var b=/[, ]+/,c={circle:1,rect:1,path:1,ellipse:1,text:1,image:1},d=/\{(\d+)\}/g,e="prototype",f="hasOwnProperty",g={doc:document,win:window},h={was:Object.prototype[f].call(g.win,"Raphael"),is:g.win.Raphael},i=function(){},j,k="appendChild",l="apply",m="concat",n="createTouch"in g.doc,o="",p=" ",q=String,r="split",s="click dblclick mousedown mousemove mouseout mouseover mouseup touchstart touchmove touchend orientationchange touchcancel gesturestart gesturechange gestureend".split(p),t={mousedown:"touchstart",mousemove:"touchmove",mouseup:"touchend"},u=q.prototype.toLowerCase,v=Math,w=v.max,x=v.min,y=v.abs,z=v.pow,A=v.PI,B="number",C="string",D="array",E="toString",F="fill",G=Object.prototype.toString,H={},I="push",J=/^url\(['"]?([^\)]+?)['"]?\)$/i,K=/^\s*((#[a-f\d]{6})|(#[a-f\d]{3})|rgba?\(\s*([\d\.]+%?\s*,\s*[\d\.]+%?\s*,\s*[\d\.]+(?:%?\s*,\s*[\d\.]+)?)%?\s*\)|hsba?\(\s*([\d\.]+(?:deg|\xb0|%)?\s*,\s*[\d\.]+%?\s*,\s*[\d\.]+(?:%?\s*,\s*[\d\.]+)?)%?\s*\)|hsla?\(\s*([\d\.]+(?:deg|\xb0|%)?\s*,\s*[\d\.]+%?\s*,\s*[\d\.]+(?:%?\s*,\s*[\d\.]+)?)%?\s*\))\s*$/i,L={NaN:1,Infinity:1,"-Infinity":1},M=/^(?:cubic-)?bezier\(([^,]+),([^,]+),([^,]+),([^\)]+)\)/,N=v.round,O="setAttribute",P=parseFloat,Q=parseInt,R=" progid:DXImageTransform.Microsoft",S=q.prototype.toUpperCase,T={"arrow-end":"none","arrow-start":"none",blur:0,"clip-rect":"0 0 1e9 1e9",cursor:"default",cx:0,cy:0,fill:"#fff","fill-opacity":1,font:'10px "Arial"',"font-family":'"Arial"',"font-size":"10","font-style":"normal","font-weight":400,gradient:0,height:0,href:"http://raphaeljs.com/",opacity:1,path:"M0,0",r:0,rx:0,ry:0,src:"",stroke:"#000","stroke-dasharray":"","stroke-linecap":"butt","stroke-linejoin":"butt","stroke-miterlimit":0,"stroke-opacity":1,"stroke-width":1,target:"_blank","text-anchor":"middle",title:"Raphael",transform:"",width:0,x:0,y:0},U={blur:B,"clip-rect":"csv",cx:B,cy:B,fill:"colour","fill-opacity":B,"font-size":B,height:B,opacity:B,path:"path",r:B,rx:B,ry:B,stroke:"colour","stroke-opacity":B,"stroke-width":B,transform:"transform",width:B,x:B,y:B},V=/\s*,\s*/,W={hs:1,rg:1},X=/,?([achlmqrstvxz]),?/gi,Y=/([achlmqstvz])[\s,]*((-?\d*\.?\d*(?:e[-+]?\d+)?\s*,?\s*)+)/ig,Z=/([rstm])[\s,]*((-?\d*\.?\d*(?:e[-+]?\d+)?\s*,?\s*)+)/ig,$=/(-?\d*\.?\d*(?:e[-+]?\d+)?)\s*,?\s*/ig,_=/^r(?:\(([^,]+?)\s*,\s*([^\)]+?)\))?/,ba=function(a,b){return a.key-b.key},bb=function(a,b){return a-b},bc=function(){},bd=function(a){return a},be=function(a,b,c,d,e){if(e)return[["M",a+e,b],["l",c-e*2,0],["a",e,e,0,0,1,e,e],["l",0,d-e*2],["a",e,e,0,0,1,-e,e],["l",e*2-c,0],["a",e,e,0,0,1,-e,-e],["l",0,e*2-d],["a",e,e,0,0,1,e,-e],["z"]];return[["M",a,b],["l",c,0],["l",0,d],["l",-c,0],["z"]]},bf=function(a,b,c,d){d==null&&(d=c);return[["M",a,b],["m",0,-d],["a",c,d,0,1,1,0,2*d],["a",c,d,0,1,1,0,-2*d],["z"]]},bg={path:function(a){return a.attr("path")},circle:function(a){var b=a.attrs;return bf(b.cx,b.cy,b.r)},ellipse:function(a){var b=a.attrs;return bf(b.cx,b.cy,b.rx,b.ry)},rect:function(a){var b=a.attrs;return be(b.x,b.y,b.width,b.height,b.r)},image:function(a){var b=a.attrs;return be(b.x,b.y,b.width,b.height)},text:function(a){var b=a._getBBox();return be(b.x,b.y,b.width,b.height)}},bh=function(a,b){if(!b)return a;var c,d,e,f,g;a=bC(a);for(e=0,ii=a.length;e<ii;e++){g=a[e];for(f=1,jj=g.length;f<jj;f+=2)c=b.x(g[f],g[f+1]),d=b.y(g[f],g[f+1]),g[f]=c,g[f+1]=d}return a};a.type=g.win.SVGAngle||g.doc.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#BasicStructure","1.1")?"SVG":"VML";if(a.type=="VML"){var bi=g.doc.createElement("div"),bj;bi.innerHTML='<v:shape adj="1"/>',bj=bi.firstChild,bj.style.behavior="url(#default#VML)";if(!bj||typeof bj.adj!="object")return a.type=o;bi=null}a.svg=!(a.vml=a.type=="VML"),j=i.prototype=a.prototype,j.customAttributes={},a._id=0,a._oid=0,a.fn={},a.is=function(a,b){b=u.call(b);if(b=="finite")return!L[f](+a);return b=="null"&&a===null||b==typeof a||b=="object"&&a===Object(a)||b=="array"&&Array.isArray&&Array.isArray(a)||G.call(a).slice(8,-1).toLowerCase()==b},a.angle=function(b,c,d,e,f,g){if(f==null){var h=b-d,i=c-e;if(!h&&!i)return 0;return(180+v.atan2(-i,-h)*180/A+360)%360}return a.angle(b,c,f,g)-a.angle(d,e,f,g)},a.rad=function(a){return a%360*A/180},a.deg=function(a){return a*180/A%360},a.snapTo=function(b,c,d){d=a.is(d,"finite")?d:10;if(a.is(b,D)){var e=b.length;while(e--)if(y(b[e]-c)<=d)return b[e]}else{b=+b;var f=c%b;if(f<d)return c-f;if(f>b-d)return c-f+b}return c};var bk=function(a,b){return function(){return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(a,b).toUpperCase()}}(/[xy]/g,function(a){var b=v.random()*16|0,c=a=="x"?b:b&3|8;return c.toString(16)});a.setWindow=function(b){dc("setWindow",a,g.win,b),g.win=b,g.doc=g.win.document,cz&&cz(g.win)};var bl=function(b){if(a.vml){var c=/^\s+|\s+$/g,d;try{var e=new ActiveXObject("htmlfile");e.write("<body>"),e.close(),d=e.body}catch(f){d=createPopup().document.body}var h=d.createTextRange();bl=br(function(a){try{d.style.color=q(a).replace(c,o);var b=h.queryCommandValue("ForeColor");b=(b&255)<<16|b&65280|(b&16711680)>>>16;return"#"+("000000"+b.toString(16)).slice(-6)}catch(e){return"none"}})}else{var i=g.doc.createElement("i");i.title="Raphaël Colour Picker",i.style.display="none",g.doc.body.appendChild(i),bl=br(function(a){i.style.color=a;return g.doc.defaultView.getComputedStyle(i,o).getPropertyValue("color")})}return bl(b)},bm=function(){return"hsb("+[this.h,this.s,this.b]+")"},bn=function(){return"hsl("+[this.h,this.s,this.l]+")"},bo=function(){return this.hex},bp=function(b,c,d){c==null&&a.is(b,"object")&&"r"in b&&"g"in b&&"b"in b&&(d=b.b,c=b.g,b=b.r);if(c==null&&a.is(b,C)){var e=a.getRGB(b);b=e.r,c=e.g,d=e.b}if(b>1||c>1||d>1)b/=255,c/=255,d/=255;return[b,c,d]},bq=function(b,c,d,e){b*=255,c*=255,d*=255;var f={r:b,g:c,b:d,hex:a.rgb(b,c,d),toString:bo};a.is(e,"finite")&&(f.opacity=e);return f};a.hsb2rgb=function(a,b,c,d){this.is(a,"object")&&"h"in a&&"s"in a&&"b"in a&&(c=a.b,b=a.s,a=a.h,d=a.o),a*=360;var e,f,g,h,i;a=a%360/60,i=c*b,h=i*(1-y(a%2-1)),e=f=g=c-i,a=~~a,e+=[i,h,0,0,h,i][a],f+=[h,i,i,h,0,0][a],g+=[0,0,h,i,i,h][a];return bq(e,f,g,d)},a.hsl2rgb=function(a,b,c,d){this.is(a,"object")&&"h"in a&&"s"in a&&"l"in a&&(c=a.l,b=a.s,a=a.h);if(a>1||b>1||c>1)a/=360,b/=100,c/=100;a*=360;var e,f,g,h,i;a=a%360/60,i=2*b*(c<.5?c:1-c),h=i*(1-y(a%2-1)),e=f=g=c-i/2,a=~~a,e+=[i,h,0,0,h,i][a],f+=[h,i,i,h,0,0][a],g+=[0,0,h,i,i,h][a];return bq(e,f,g,d)},a.rgb2hsb=function(a,b,c){c=bp(a,b,c),a=c[0],b=c[1],c=c[2];var d,e,f,g;f=w(a,b,c),g=f-x(a,b,c),d=g==0?null:f==a?(b-c)/g:f==b?(c-a)/g+2:(a-b)/g+4,d=d%6*60,e=g==0?0:g/f;return{h:d,s:e,b:f,toString:bm}},a.rgb2hsl=function(a,b,c){c=bp(a,b,c),a=c[0],b=c[1],c=c[2];var d,e,f,g,h,i;g=w(a,b,c),h=x(a,b,c),i=g-h,d=i==0?null:g==a?(b-c)/i:g==b?(c-a)/i+2:(a-b)/i+4,d=d%6*60,f=(g+h)/2,e=i==0?0:f<.5?i/(2*f):i/(2-2*f);return{h:d,s:e,l:f,toString:bn}},a._path2string=function(){return this.join(",").replace(X,"$1")},a.getRGB=br(function(b){if(!b||!!((b=q(b)).indexOf("-")+1))return{r:-1,g:-1,b:-1,hex:"none",error:1};if(b=="none")return{r:-1,g:-1,b:-1,hex:"none"};!W[f](b.toLowerCase().substring(0,2))&&b.charAt()!="#"&&(b=bl(b));var c,d,e,g,h,i,j,k=b.match(K);if(k){k[2]&&(g=Q(k[2].substring(5),16),e=Q(k[2].substring(3,5),16),d=Q(k[2].substring(1,3),16)),k[3]&&(g=Q((i=k[3].charAt(3))+i,16),e=Q((i=k[3].charAt(2))+i,16),d=Q((i=k[3].charAt(1))+i,16)),k[4]&&(j=k[4].split(V),d=P(j[0]),j[0].slice(-1)=="%"&&(d*=2.55),e=P(j[1]),j[1].slice(-1)=="%"&&(e*=2.55),g=P(j[2]),j[2].slice(-1)=="%"&&(g*=2.55),k[1].toLowerCase().slice(0,4)=="rgba"&&(h=P(j[3])),j[3]&&j[3].slice(-1)=="%"&&(h/=100));if(k[5]){j=k[5].split(V),d=P(j[0]),j[0].slice(-1)=="%"&&(d*=2.55),e=P(j[1]),j[1].slice(-1)=="%"&&(e*=2.55),g=P(j[2]),j[2].slice(-1)=="%"&&(g*=2.55),(j[0].slice(-3)=="deg"||j[0].slice(-1)=="°")&&(d/=360),k[1].toLowerCase().slice(0,4)=="hsba"&&(h=P(j[3])),j[3]&&j[3].slice(-1)=="%"&&(h/=100);return a.hsb2rgb(d,e,g,h)}if(k[6]){j=k[6].split(V),d=P(j[0]),j[0].slice(-1)=="%"&&(d*=2.55),e=P(j[1]),j[1].slice(-1)=="%"&&(e*=2.55),g=P(j[2]),j[2].slice(-1)=="%"&&(g*=2.55),(j[0].slice(-3)=="deg"||j[0].slice(-1)=="°")&&(d/=360),k[1].toLowerCase().slice(0,4)=="hsla"&&(h=P(j[3])),j[3]&&j[3].slice(-1)=="%"&&(h/=100);return a.hsl2rgb(d,e,g,h)}k={r:d,g:e,b:g},k.hex="#"+(16777216|g|e<<8|d<<16).toString(16).slice(1),a.is(h,"finite")&&(k.opacity=h);return k}return{r:-1,g:-1,b:-1,hex:"none",error:1}},a),a.hsb=br(function(b,c,d){return a.hsb2rgb(b,c,d).hex}),a.hsl=br(function(b,c,d){return a.hsl2rgb(b,c,d).hex}),a.rgb=br(function(a,b,c){return"#"+(16777216|c|b<<8|a<<16).toString(16).slice(1)}),a.getColor=function(a){var b=this.getColor.start=this.getColor.start||{h:0,s:1,b:a||.75},c=this.hsb2rgb(b.h,b.s,b.b);b.h+=.075,b.h>1&&(b.h=0,b.s-=.2,b.s<=0&&(this.getColor.start={h:0,s:1,b:b.b}));return c.hex},a.getColor.reset=function(){delete this.start},a.parsePathString=br(function(b){if(!b)return null;var c={a:7,c:6,h:1,l:2,m:2,q:4,s:4,t:2,v:1,z:0},d=[];a.is(b,D)&&a.is(b[0],D)&&(d=bu(b)),d.length||q(b).replace(Y,function(a,b,e){var f=[],g=u.call(b);e.replace($,function(a,b){b&&f.push(+b)}),g=="m"&&f.length>2&&(d.push([b][m](f.splice(0,2))),g="l",b=b=="m"?"l":"L");while(f.length>=c[g]){d.push([b][m](f.splice(0,c[g])));if(!c[g])break}}),d.toString=a._path2string;return d}),a.parseTransformString=br(function(b){if(!b)return null;var c={r:3,s:4,t:2,m:6},d=[];a.is(b,D)&&a.is(b[0],D)&&(d=bu(b)),d.length||q(b).replace(Z,function(a,b,c){var e=[],f=u.call(b);c.replace($,function(a,b){b&&e.push(+b)}),d.push([f][m](e))}),d.toString=a._path2string;return d}),a.findDotsAtSegment=function(a,b,c,d,e,f,g,h,i){var j=1-i,k=z(j,3)*a+z(j,2)*3*i*c+j*3*i*i*e+z(i,3)*g,l=z(j,3)*b+z(j,2)*3*i*d+j*3*i*i*f+z(i,3)*h,m=a+2*i*(c-a)+i*i*(e-2*c+a),n=b+2*i*(d-b)+i*i*(f-2*d+b),o=c+2*i*(e-c)+i*i*(g-2*e+c),p=d+2*i*(f-d)+i*i*(h-2*f+d),q=(1-i)*a+i*c,r=(1-i)*b+i*d,s=(1-i)*e+i*g,t=(1-i)*f+i*h,u=90-v.atan2(m-o,n-p)*180/A;(m>o||n<p)&&(u+=180);return{x:k,y:l,m:{x:m,y:n},n:{x:o,y:p},start:{x:q,y:r},end:{x:s,y:t},alpha:u}};var bt=br(function(a){if(!a)return{x:0,y:0,width:0,height:0};a=bC(a);var b=0,c=0,d=[],e=[],f;for(var g=0,h=a.length;g<h;g++){f=a[g];if(f[0]=="M")b=f[1],c=f[2],d.push(b),e.push(c);else{var i=bB(b,c,f[1],f[2],f[3],f[4],f[5],f[6]);d=d[m](i.min.x,i.max.x),e=e[m](i.min.y,i.max.y),b=f[5],c=f[6]}}var j=x[l](0,d),k=x[l](0,e);return{x:j,y:k,width:w[l](0,d)-j,height:w[l](0,e)-k}}),bu=function(b){var c=[];if(!a.is(b,D)||!a.is(b&&b[0],D))b=a.parsePathString(b);for(var d=0,e=b.length;d<e;d++){c[d]=[];for(var f=0,g=b[d].length;f<g;f++)c[d][f]=b[d][f]}c.toString=a._path2string;return c},bv=br(function(b){if(!a.is(b,D)||!a.is(b&&b[0],D))b=a.parsePathString(b);var c=[],d=0,e=0,f=0,g=0,h=0;b[0][0]=="M"&&(d=b[0][1],e=b[0][2],f=d,g=e,h++,c.push(["M",d,e]));for(var i=h,j=b.length;i<j;i++){var k=c[i]=[],l=b[i];if(l[0]!=u.call(l[0])){k[0]=u.call(l[0]);switch(k[0]){case"a":k[1]=l[1],k[2]=l[2],k[3]=l[3],k[4]=l[4],k[5]=l[5],k[6]=+(l[6]-d).toFixed(3),k[7]=+(l[7]-e).toFixed(3);break;case"v":k[1]=+(l[1]-e).toFixed(3);break;case"m":f=l[1],g=l[2];default:for(var m=1,n=l.length;m<n;m++)k[m]=+(l[m]-(m%2?d:e)).toFixed(3)}}else{k=c[i]=[],l[0]=="m"&&(f=l[1]+d,g=l[2]+e);for(var o=0,p=l.length;o<p;o++)c[i][o]=l[o]}var q=c[i].length;switch(c[i][0]){case"z":d=f,e=g;break;case"h":d+=+c[i][q-1];break;case"v":e+=+c[i][q-1];break;default:d+=+c[i][q-2],e+=+c[i][q-1]}}c.toString=a._path2string;return c},0,bu),bw=br(function(b){if(!a.is(b,D)||!a.is(b&&b[0],D))b=a.parsePathString(b);var c=[],d=0,e=0,f=0,g=0,h=0;b[0][0]=="M"&&(d=+b[0][1],e=+b[0][2],f=d,g=e,h++,c[0]=["M",d,e]);for(var i=h,j=b.length;i<j;i++){var k=c[i]=[],l=b[i];if(l[0]!=S.call(l[0])){k[0]=S.call(l[0]);switch(k[0]){case"A":k[1]=l[1],k[2]=l[2],k[3]=l[3],k[4]=l[4],k[5]=l[5],k[6]=+(l[6]+d),k[7]=+(l[7]+e);break;case"V":k[1]=+l[1]+e;break;case"H":k[1]=+l[1]+d;break;case"M":f=+l[1]+d,g=+l[2]+e;default:for(var m=1,n=l.length;m<n;m++)k[m]=+l[m]+(m%2?d:e)}}else for(var o=0,p=l.length;o<p;o++)c[i][o]=l[o];switch(k[0]){case"Z":d=f,e=g;break;case"H":d=k[1];break;case"V":e=k[1];break;case"M":f=c[i][c[i].length-2],g=c[i][c[i].length-1];default:d=c[i][c[i].length-2],e=c[i][c[i].length-1]}}c.toString=a._path2string;return c},null,bu),bx=function(a,b,c,d){return[a,b,c,d,c,d]},by=function(a,b,c,d,e,f){var g=1/3,h=2/3;return[g*a+h*c,g*b+h*d,g*e+h*c,g*f+h*d,e,f]},bz=function(a,b,c,d,e,f,g,h,i,j){var k=A*120/180,l=A/180*(+e||0),n=[],o,p=br(function(a,b,c){var d=a*v.cos(c)-b*v.sin(c),e=a*v.sin(c)+b*v.cos(c);return{x:d,y:e}});if(!j){o=p(a,b,-l),a=o.x,b=o.y,o=p(h,i,-l),h=o.x,i=o.y;var q=v.cos(A/180*e),r=v.sin(A/180*e),s=(a-h)/2,t=(b-i)/2,u=s*s/(c*c)+t*t/(d*d);u>1&&(u=v.sqrt(u),c=u*c,d=u*d);var w=c*c,x=d*d,z=(f==g?-1:1)*v.sqrt(y((w*x-w*t*t-x*s*s)/(w*t*t+x*s*s))),B=z*c*t/d+(a+h)/2,C=z*-d*s/c+(b+i)/2,D=v.asin(((b-C)/d).toFixed(9)),E=v.asin(((i-C)/d).toFixed(9));D=a<B?A-D:D,E=h<B?A-E:E,D<0&&(D=A*2+D),E<0&&(E=A*2+E),g&&D>E&&(D=D-A*2),!g&&E>D&&(E=E-A*2)}else D=j[0],E=j[1],B=j[2],C=j[3];var F=E-D;if(y(F)>k){var G=E,H=h,I=i;E=D+k*(g&&E>D?1:-1),h=B+c*v.cos(E),i=C+d*v.sin(E),n=bz(h,i,c,d,e,0,g,H,I,[E,G,B,C])}F=E-D;var J=v.cos(D),K=v.sin(D),L=v.cos(E),M=v.sin(E),N=v.tan(F/4),O=4/3*c*N,P=4/3*d*N,Q=[a,b],R=[a+O*K,b-P*J],S=[h+O*M,i-P*L],T=[h,i];R[0]=2*Q[0]-R[0],R[1]=2*Q[1]-R[1];if(j)return[R,S,T][m](n);n=[R,S,T][m](n).join().split(",");var U=[];for(var V=0,W=n.length;V<W;V++)U[V]=V%2?p(n[V-1],n[V],l).y:p(n[V],n[V+1],l).x;return U},bA=function(a,b,c,d,e,f,g,h,i){var j=1-i;return{x:z(j,3)*a+z(j,2)*3*i*c+j*3*i*i*e+z(i,3)*g,y:z(j,3)*b+z(j,2)*3*i*d+j*3*i*i*f+z(i,3)*h}},bB=br(function(a,b,c,d,e,f,g,h){var i=e-2*c+a-(g-2*e+c),j=2*(c-a)-2*(e-c),k=a-c,m=(-j+v.sqrt(j*j-4*i*k))/2/i,n=(-j-v.sqrt(j*j-4*i*k))/2/i,o=[b,h],p=[a,g],q;y(m)>"1e12"&&(m=.5),y(n)>"1e12"&&(n=.5),m>0&&m<1&&(q=bA(a,b,c,d,e,f,g,h,m),p.push(q.x),o.push(q.y)),n>0&&n<1&&(q=bA(a,b,c,d,e,f,g,h,n),p.push(q.x),o.push(q.y)),i=f-2*d+b-(h-2*f+d),j=2*(d-b)-2*(f-d),k=b-d,m=(-j+v.sqrt(j*j-4*i*k))/2/i,n=(-j-v.sqrt(j*j-4*i*k))/2/i,y(m)>"1e12"&&(m=.5),y(n)>"1e12"&&(n=.5),m>0&&m<1&&(q=bA(a,b,c,d,e,f,g,h,m),p.push(q.x),o.push(q.y)),n>0&&n<1&&(q=bA(a,b,c,d,e,f,g,h,n),p.push(q.x),o.push(q.y));return{min:{x:x[l](0,p),y:x[l](0,o)},max:{x:w[l](0,p),y:w[l](0,o)}}}),bC=br(function(a,b){var c=bw(a),d=b&&bw(b),e={x:0,y:0,bx:0,by:0,X:0,Y:0,qx:null,qy:null},f={x:0,y:0,bx:0,by:0,X:0,Y:0,qx:null,qy:null},g=function(a,b){var c,d;if(!a)return["C",b.x,b.y,b.x,b.y,b.x,b.y];!(a[0]in{T:1,Q:1})&&(b.qx=b.qy=null);switch(a[0]){case"M":b.X=a[1],b.Y=a[2];break;case"A":a=["C"][m](bz[l](0,[b.x,b.y][m](a.slice(1))));break;case"S":c=b.x+(b.x-(b.bx||b.x)),d=b.y+(b.y-(b.by||b.y)),a=["C",c,d][m](a.slice(1));break;case"T":b.qx=b.x+(b.x-(b.qx||b.x)),b.qy=b.y+(b.y-(b.qy||b.y)),a=["C"][m](by(b.x,b.y,b.qx,b.qy,a[1],a[2]));break;case"Q":b.qx=a[1],b.qy=a[2],a=["C"][m](by(b.x,b.y,a[1],a[2],a[3],a[4]));break;case"L":a=["C"][m](bx(b.x,b.y,a[1],a[2]));break;case"H":a=["C"][m](bx(b.x,b.y,a[1],b.y));break;case"V":a=["C"][m](bx(b.x,b.y,b.x,a[1]));break;case"Z":a=["C"][m](bx(b.x,b.y,b.X,b.Y))}return a},h=function(a,b){if(a[b].length>7){a[b].shift();var e=a[b];while(e.length)a.splice(b++,0,["C"][m](e.splice(0,6)));a.splice(b,1),k=w(c.length,d&&d.length||0)}},i=function(a,b,e,f,g){a&&b&&a[g][0]=="M"&&b[g][0]!="M"&&(b.splice(g,0,["M",f.x,f.y]),e.bx=0,e.by=0,e.x=a[g][1],e.y=a[g][2],k=w(c.length,d&&d.length||0))};for(var j=0,k=w(c.length,d&&d.length||0);j<k;j++){c[j]=g(c[j],e),h(c,j),d&&(d[j]=g(d[j],f)),d&&h(d,j),i(c,d,e,f,j),i(d,c,f,e,j);var n=c[j],o=d&&d[j],p=n.length,q=d&&o.length;e.x=n[p-2],e.y=n[p-1],e.bx=P(n[p-4])||e.x,e.by=P(n[p-3])||e.y,f.bx=d&&(P(o[q-4])||f.x),f.by=d&&(P(o[q-3])||f.y),f.x=d&&o[q-2],f.y=d&&o[q-1]}return d?[c,d]:c},null,bu),bD=br(function(b){var c=[];for(var d=0,e=b.length;d<e;d++){var f={},g=b[d].match(/^([^:]*):?([\d\.]*)/);f.color=a.getRGB(g[1]);if(f.color.error)return null;f.color=f.color.hex,g[2]&&(f.offset=g[2]+"%"),c.push(f)}for(d=1,e=c.length-1;d<e;d++)if(!c[d].offset){var h=P(c[d-1].offset||0),i=0;for(var j=d+1;j<e;j++)if(c[j].offset){i=c[j].offset;break}i||(i=100,j=e),i=P(i);var k=(i-h)/(j-d+1);for(;d<j;d++)h+=k,c[d].offset=h+"%"}return c}),bE=function(b,c,d,e){var f;f=e==null&&!a.is(b,"object")?g.doc.getElementById(b):b;if(f!=null){if(f.tagName)return c==null?{container:f,width:f.style.pixelWidth||f.offsetWidth,height:f.style.pixelHeight||f.offsetHeight}:{container:f,width:c,height:d};return{container:1,x:b,y:c,width:d,height:e}}},bF=function(a,b){var c=this;for(var d in b)if(b[f](d)&&!(d in a))switch(typeof b[d]){case"function":(function(b){a[d]=a===c?b:function(){return b[l](c,arguments)}})(b[d]);break;case"object":a[d]=a[d]||{},bF.call(this,a[d],b[d]);break;default:a[d]=b[d]}},bG=function(a,b){a==b.top&&(b.top=a.prev),a==b.bottom&&(b.bottom=a.next),a.next&&(a.next.prev=a.prev),a.prev&&(a.prev.next=a.next)},bH=function(a,b){b.top!==a&&(bG(a,b),a.next=null,a.prev=b.top,b.top.next=a,b.top=a)},bI=function(a,b){b.bottom!==a&&(bG(a,b),a.next=b.bottom,a.prev=null,b.bottom.prev=a,b.bottom=a)},bJ=function(a,b,c){bG(a,c),b==c.top&&(c.top=a),b.next&&(b.next.prev=a),a.next=b.next,a.prev=b,b.next=a},bK=function(a,b,c){bG(a,c),b==c.bottom&&(c.bottom=a),b.prev&&(b.prev.next=a),a.prev=b.prev,b.prev=a,a.next=b},bL=function(a){return function(){throw new Error("Raphaël: you are calling to method “"+a+"” of removed object")}},bM=function(b,c){if(c==null)return b._.transform;c=q(c).replace(/\.{3}|\u2026/g,b._.transform||o);var d=a.parseTransformString(c),e=0,f=0,g=0,h=1,i=1,j=b._,k=new bP;j.transform=d||[];if(d)for(var l=0,m=d.length;l<m;l++){var n=d[l],p=n.length,r;n[0]=q(n[0]).toLowerCase(),n[0]=="t"&&p==3?k.translate(n[1],n[2]):n[0]=="r"?p==2?(r=r||b.getBBox(1),k.rotate(n[1],r.x+r.width/2,r.y+r.height/2),e+=n[1]):p==4&&(k.rotate(n[1],n[2],n[3]),e+=n[1]):n[0]=="s"?p==2||p==3?(r=r||b.getBBox(1),k.scale(n[1],n[p-1],r.x+r.width/2,r.y+r.height/2),h*=n[1],i*=n[p-1]):p==5&&(k.scale(n[1],n[2],n[3],n[4]),h*=n[1],i*=n[2]):n[0]=="m"&&p==7&&k.add(n[1],n[2],n[3],n[4],n[5],n[6]),j.dirtyT=1,b.matrix=k}b.matrix=k,j.sx=h,j.sy=i,j.deg=e,j.dx=f=k.m[0][2],j.dy=g=k.m[1][2],h==1&&i==1&&!e&&j.bbox?(j.bbox.x+=+f,j.bbox.y+=+g):j.dirtyT=1},bN=function(a){switch(a[0]){case"t":return["t",0,0];case"m":return["m",1,0,0,1,0,0];case"r":return a.length==4?["r",0,a[2],a[3]]:["r",0];case"s":return a.length==5?["s",1,1,a[3],a[4]]:a.length==3?["s",1,1]:["s",1]}},bO=function(b,c){b=a.parseTransformString(b)||[],c=a.parseTransformString(c)||[];var d=w(b.length,c.length),e=[],f=[],g=0,h,i,j,k;for(;g<d;g++){j=b[g]||bN(c[g]),k=c[g]||bN(j);if(j[0]!=k[0]||j[0]=="r"&&(j[2]!=k[2]||j[3]!=k[3])||j[0]=="s"&&(j[3]!=k[3]||j[4]!=k[4]))return;e[g]=[],f[g]=[];for(h=0,i=w(j.length,k.length);h<i;h++)h in j&&(e[g][h]=j[h]),h in k&&(f[g][h]=k[h])}return{from:e,to:f}};a.pathToRelative=bv,a.path2curve=bC;var bQ=bP.prototype;bQ.add=function(a,b,c,d,e,f){var g=[[],[],[]],h=[[a,c,e],[b,d,f],[0,0,1]],i,j,k,l;for(i=0;i<3;i++)for(j=0;j<3;j++){l=0;for(k=0;k<3;k++)l+=this.m[i][k]*h[k][j];g[i][j]=l}this.m=g},bQ.invert=function(){var a=this.m[0][0],b=this.m[1][0],c=this.m[0][1],d=this.m[1][1],e=this.m[0][2],f=this.m[1][2],g=a*d-b*c;return new bP(d/g,-b/g,-c/g,a/g,(c*f-d*e)/g,(b*e-a*f)/g)},bQ.clone=function(){var a=this.m[0][0],b=this.m[1][0],c=this.m[0][1],d=this.m[1][1],e=this.m[0][2],f=this.m[1][2];return new bP(a,b,c,d,e,f)},bQ.translate=function(a,b){this.add(1,0,0,1,a,b)},bQ.scale=function(a,b,c,d){b==null&&(b=a),this.add(1,0,0,1,c,d),this.add(a,0,0,b,0,0),this.add(1,0,0,1,-c,-d)},bQ.rotate=function(b,c,d){b=a.rad(b);var e=+v.cos(b).toFixed(9),f=+v.sin(b).toFixed(9);this.add(e,f,-f,e,c,d),this.add(1,0,0,1,-c,-d)},bQ.x=function(a,b){return a*this.m[0][0]+b*this.m[0][1]+this.m[0][2]},bQ.y=function(a,b){return a*this.m[1][0]+b*this.m[1][1]+this.m[1][2]},bQ.get=function(a,b){return+this.m[a][b].toFixed(4)},bQ.toString=function(){return a.svg?"matrix("+[this.get(0,0),this.get(1,0),this.get(0,1),this.get(1,1),this.get(0,2),this.get(1,2)].join()+")":[this.get(0,0),this.get(0,1),this.get(1,0),this.get(1,1),0,0].join()},bQ.toFilter=function(){return"progid:DXImageTransform.Microsoft.Matrix(M11="+this.get(0,0)+", M12="+this.get(0,1)+", M21="+this.get(1,0)+", M22="+this.get(1,1)+", Dx="+this.get(0,2)+", Dy="+this.get(1,2)+", sizingmedthod='auto expand')"},bQ.offset=function(){return[this.m[0][2].toFixed(4),this.m[1][2].toFixed(4)]},a.Matrix=bP;if(a.svg){var bR="http://www.w3.org/1999/xlink",bS={block:"M5,0 0,2.5 5,5z",classic:"M5,0 0,2.5 5,5 3.5,3 3.5,2z",diamond:"M2.5,0 5,2.5 2.5,5 0,2.5z",open:"M6,1 1,3.5 6,6",oval:"M2.5,0A2.5,2.5,0,0,1,2.5,5 2.5,2.5,0,0,1,2.5,0z"},bT={};a.toString=function(){return"Your browser supports SVG.\nYou are running Raphaël "+this.version};var bU=function(a,b){if(b){typeof a=="string"&&(a=bU(a));for(var c in b)b[f](c)&&(c.substring(0,6)=="xlink:"?a.setAttributeNS(bR,c.substring(6),q(b[c])):a[O](c,q(b[c])))}else a=g.doc.createElementNS("http://www.w3.org/2000/svg",a),a.style&&(a.style.webkitTapHighlightColor="rgba(0,0,0,0)");return a},bV=function(a,b){var c=bU("path");b.canvas&&b.canvas.appendChild(c);var d=new cd(c,b);d.type="path",ca(d,{fill:"none",stroke:"#000",path:a});return d},bW={},bX=/^url\(#(.*)\)$/,bY=function(a,b){var c=a.getAttribute(F);c=c&&c.match(bX),c&&!--bW[c[1]]&&(delete bW[c[1]],b.defs.removeChild(g.doc.getElementById(c[1])))},bZ=function(b,c){var d="linear",e=b.id+c,f=.5,h=.5,i=b.node,j=b.paper,k=i.style,l=g.doc.getElementById(e);if(!l){c=q(c).replace(_,function(a,b,c){d="radial";if(b&&c){f=P(b),h=P(c);var e=(h>.5)*2-1;z(f-.5,2)+z(h-.5,2)>.25&&(h=v.sqrt(.25-z(f-.5,2))*e+.5)&&h!=.5&&(h=h.toFixed(5)-1e-5*e)}return o}),c=c.split(/\s*\-\s*/);if(d=="linear"){var m=c.shift();m=-P(m);if(isNaN(m))return null;var n=[0,0,v.cos(a.rad(m)),v.sin(a.rad(m))],p=1/(w(y(n[2]),y(n[3]))||1);n[2]*=p,n[3]*=p,n[2]<0&&(n[0]=-n[2],n[2]=0),n[3]<0&&(n[1]=-n[3],n[3]=0)}var r=bD(c);if(!r)return null;b.gradient&&(j.defs.removeChild(b.gradient),delete b.gradient),l=bU(d+"Gradient",{id:e}),b.gradient=l,bU(l,d=="radial"?{fx:f,fy:h}:{x1:n[0],y1:n[1],x2:n[2],y2:n[3],gradientTransform:b.matrix.invert()}),j.defs.appendChild(l);for(var s=0,t=r.length;s<t;s++)l.appendChild(bU("stop",{offset:r[s].offset?r[s].offset:s?"100%":"0%","stop-color":r[s].color||"#fff"}))}bU(i,{fill:"url(#"+e+")",opacity:1,"fill-opacity":1}),k.fill=o,k.opacity=1,k.fillOpacity=1;return 1},b$=function(a){var b=a.getBBox(1);bU(a.pattern,{patternTransform:a.matrix.invert()+" translate("+b.x+","+b.y+")"})},b_=function(b,c,d){if(b.type=="path"){var e=q(c).toLowerCase().split("-"),h=b.paper,i=d?"end":"start",j=b.node,k=b.attrs,l=k["stroke-width"],m=e.length,n="classic",o,r,s,t,u,v=3,w=3,x=5;while(m--)switch(e[m]){case"block":case"classic":case"oval":case"diamond":case"open":case"none":n=e[m];break;case"wide":w=5;break;case"narrow":w=2;break;case"long":v=5;break;case"short":v=2}n=="open"?(v+=2,w+=2,x+=2,s=1,t=d?4:1,u={fill:"none",stroke:k.stroke}):(t=s=v/2,u={fill:k.stroke,stroke:"none"}),b._.arrows?d?(b._.arrows.endPath&&bT[b._.arrows.endPath]--,b._.arrows.endMarker&&bT[b._.arrows.endMarker]--):(b._.arrows.startPath&&bT[b._.arrows.startPath]--,b._.arrows.startMarker&&bT[b._.arrows.startMarker]--):b._.arrows={};if(n!="none"){var y="raphael-marker-"+n,z="raphael-marker-"+i+n+v+w;g.doc.getElementById(y)?bT[y]++:(h.defs.appendChild(bU(bU("path"),{"stroke-linecap":"round",d:bS[n],id:y})),bT[y]=1);var A=g.doc.getElementById(z),B;A?(bT[z]++,B=A.getElementsByTagName("use")[0]):(A=bU(bU("marker"),{id:z,markerHeight:w,markerWidth:v,orient:"auto",refX:t,refY:w/2}),B=bU(bU("use"),{"xlink:href":"#"+y,transform:(d?" rotate(180 "+v/2+" "+w/2+") ":p)+"scale("+v/x+","+w/x+")","stroke-width":1/((v/x+w/x)/2)}),A.appendChild(B),h.defs.appendChild(A),bT[z]=1),bU(B,u);var C=s*(n!="diamond"&&n!="oval");d?(o=b._.arrows.startdx*l||0,r=a.getTotalLength(k.path)-C*l):(o=C*l,r=a.getTotalLength(k.path)-(b._.arrows.enddx*l||0)),u={},u["marker-"+i]="url(#"+z+")";if(r||o)u.d=Raphael.getSubpath(k.path,o,r);bU(j,u),b._.arrows[i+"Path"]=y,b._.arrows[i+"Marker"]=z,b._.arrows[i+"dx"]=C,b._.arrows[i+"Type"]=n,b._.arrows[i+"String"]=c}else d?(o=b._.arrows.startdx*l||0,r=a.getTotalLength(k.path)-o):(o=0,r=a.getTotalLength(k.path)-(b._.arrows.enddx*l||0)),b._.arrows[i+"Path"]&&bU(j,{d:Raphael.getSubpath(k.path,o,r)}),delete b._.arrows[i+"Path"],delete b._.arrows[i+"Marker"],delete b._.arrows[i+"dx"],delete b._.arrows[i+"Type"],delete b._.arrows[i+"String"];for(u in bT)if(bT[f](u)&&!bT[u]){var D=g.doc.getElementById(u);D&&D.parentNode.removeChild(D)}}},ca=function(c,d){var e={"":[0],none:[0],"-":[3,1],".":[1,1],"-.":[3,1,1,1],"-..":[3,1,1,1,1,1],". ":[1,3],"- ":[4,3],"--":[8,3],"- .":[4,3,1,3],"--.":[8,3,1,3],"--..":[8,3,1,3,1,3]},h=c.node,i=c.attrs,j=function(a,b){b=e[u.call(b)];if(b){var c=a.attrs["stroke-width"]||"1",f=({round:c,square:c,butt:0})[a.attrs["stroke-linecap"]||d["stroke-linecap"]]||0,g=[],i=b.length;while(i--)g[i]=b[i]*c+(i%2?1:-1)*f;bU(h,{"stroke-dasharray":g.join(",")})}};for(var k in d)if(d[f](k)){if(!T[f](k))continue;var l=d[k];i[k]=l;switch(k){case"blur":c.blur(l);break;case"href":case"title":case"target":var m=h.parentNode;if(u.call(m.tagName)!="a"){var n=bU("a");m.insertBefore(n,h),n.appendChild(h),m=n}k=="target"&&l=="blank"?m.setAttributeNS(bR,"show","new"):m.setAttributeNS(bR,k,l);break;case"cursor":h.style.cursor=l;break;case"transform":c.transform(l);break;case"arrow-start":b_(c,l);break;case"arrow-end":b_(c,l,1);break;case"clip-rect":var p=q(l).split(b);if(p.length==4){c.clip&&c.clip.parentNode.parentNode.removeChild(c.clip.parentNode);var r=bU("clipPath"),s=bU("rect");r.id=bk(),bU(s,{x:p[0],y:p[1],width:p[2],height:p[3]}),r.appendChild(s),c.paper.defs.appendChild(r),bU(h,{"clip-path":"url(#"+r.id+")"}),c.clip=s}if(!l){var t=g.doc.getElementById(h.getAttribute("clip-path").replace(/(^url\(#|\)$)/g,o));t&&t.parentNode.removeChild(t),bU(h,{"clip-path":o}),delete c.clip}break;case"path":c.type=="path"&&(bU(h,{d:l?i.path=bw(l):"M0,0"}),c._.dirty=1,c._.arrows&&("startString"in c._.arrows&&b_(c,c._.arrows.startString),"endString"in c._.arrows&&b_(c,c._.arrows.endString,1)));break;case"width":h[O](k,l),c._.dirty=1;if(i.fx)k="x",l=i.x;else break;case"x":i.fx&&(l=-i.x-(i.width||0));case"rx":if(k=="rx"&&c.type=="rect")break;case"cx":h[O](k,l),c.pattern&&b$(c),c._.dirty=1;break;case"height":h[O](k,l),c._.dirty=1;if(i.fy)k="y",l=i.y;else break;case"y":i.fy&&(l=-i.y-(i.height||0));case"ry":if(k=="ry"&&c.type=="rect")break;case"cy":h[O](k,l),c.pattern&&b$(c),c._.dirty=1;break;case"r":c.type=="rect"?bU(h,{rx:l,ry:l}):h[O](k,l),c._.dirty=1;break;case"src":c.type=="image"&&h.setAttributeNS(bR,"href",l);break;case"stroke-width":if(c._.sx!=1||c._.sy!=1)l/=w(y(c._.sx),y(c._.sy))||1;c.paper._vbSize&&(l*=c.paper._vbSize),h[O](k,l),i["stroke-dasharray"]&&j(c,i["stroke-dasharray"]),c._.arrows&&("startString"in c._.arrows&&b_(c,c._.arrows.startString),"endString"in c._.arrows&&b_(c,c._.arrows.endString,1));break;case"stroke-dasharray":j(c,l);break;case F:var v=q(l).match(J);if(v){r=bU("pattern");var x=bU("image");r.id=bk(),bU(r,{x:0,y:0,patternUnits:"userSpaceOnUse",height:1,width:1}),bU(x,{x:0,y:0,"xlink:href":v[1]}),r.appendChild(x),function(a){bs(v[1],function(){var b=this.offsetWidth,d=this.offsetHeight;bU(a,{width:b,height:d}),bU(x,{width:b,height:d}),c.paper.safari()})}(r),c.paper.defs.appendChild(r),h.style.fill="url(#"+r.id+")",bU(h,{fill:"url(#"+r.id+")"}),c.pattern=r,c.pattern&&b$(c);break}var z=a.getRGB(l);if(!z.error)delete d.gradient,delete i.gradient,!a.is(i.opacity,"undefined")&&a.is(d.opacity,"undefined")&&bU(h,{opacity:i.opacity}),!a.is(i["fill-opacity"],"undefined")&&a.is(d["fill-opacity"],"undefined")&&bU(h,{"fill-opacity":i["fill-opacity"]});else if((c.type=="circle"||c.type=="ellipse"||q(l).charAt()!="r")&&bZ(c,l)){if("opacity"in i||"fill-opacity"in i){var A=g.doc.getElementById(h.getAttribute(F).replace(/^url\(#|\)$/g,o));if(A){var B=A.getElementsByTagName("stop");bU(B[B.length-1],{"stop-opacity":("opacity"in i?i.opacity:1)*("fill-opacity"in i?i["fill-opacity"]:1)})}}i.gradient=l,i.fill="none";break}z[f]("opacity")&&bU(h,{"fill-opacity":z.opacity>1?z.opacity/100:z.opacity});case"stroke":z=a.getRGB(l),h[O](k,z.hex),k=="stroke"&&z[f]("opacity")&&bU(h,{"stroke-opacity":z.opacity>1?z.opacity/100:z.opacity}),k=="stroke"&&c._.arrows&&("startString"in c._.arrows&&b_(c,c._.arrows.startString),"endString"in c._.arrows&&b_(c,c._.arrows.endString,1));break;case"gradient":(c.type=="circle"||c.type=="ellipse"||q(l).charAt()!="r")&&bZ(c,l);break;case"opacity":i.gradient&&!i[f]("stroke-opacity")&&bU(h,{"stroke-opacity":l>1?l/100:l});case"fill-opacity":if(i.gradient){A=g.doc.getElementById(h.getAttribute(F).replace(/^url\(#|\)$/g,o)),A&&(B=A.getElementsByTagName("stop"),bU(B[B.length-1],{"stop-opacity":l}));break};default:k=="font-size"&&(l=Q(l,10)+"px");var C=k.replace(/(\-.)/g,function(a){return S.call(a.substring(1))});h.style[C]=l,c._.dirty=1,h[O](k,l)}}cc(c,d)},cb=1.2,cc=function(b,c){if(b.type=="text"&&!!(c[f]("text")||c[f]("font")||c[f]("font-size")||c[f]("x")||c[f]("y"))){var d=b.attrs,e=b.node,h=e.firstChild?Q(g.doc.defaultView.getComputedStyle(e.firstChild,o).getPropertyValue("font-size"),10):10;if(c[f]("text")){d.text=c.text;while(e.firstChild)e.removeChild(e.firstChild);var i=q(c.text).split("\n"),j=[],k;for(var l=0,m=i.length;l<m;l++)i[l]&&(k=bU("tspan"),l&&bU(k,{dy:h*cb,x:d.x}),k.appendChild(g.doc.createTextNode(i[l])),e.appendChild(k),j[l]=k)}else{j=e.getElementsByTagName("tspan");for(l=0,m=j.length;l<m;l++)l&&bU(j[l],{dy:h*cb,x:d.x})}bU(e,{y:d.y}),b._.dirty=1;var n=b._getBBox(),p=d.y-(n.y+n.height/2);p&&a.is(p,"finite")&&bU(j[0],{dy:d.y+p})}},cd=function(b,c){var d=0,e=0;this[0]=this.node=b,b.raphael=!0,this.id=a._oid++,b.raphaelid=this.id,this.matrix=new bP,this.realPath=null,this.paper=c,this.attrs=this.attrs||{},this._={transform:[],sx:1,sy:1,deg:0,dx:0,dy:0,dirty:1},!c.bottom&&(c.bottom=this),this.prev=c.top,c.top&&(c.top.next=this),c.top=this,this.next=null},ce=cd.prototype;ce.rotate=function(a,c,d){if(this.removed)return this;a=q(a).split(b),a.length-1&&(c=P(a[1]),d=P(a[2])),a=P(a[0]),d==null&&(c=d);if(c==null||d==null){var e=this.getBBox(1);c=e.x+e.width/2,d=e.y+e.height/2}this.transform(this._.transform.concat([["r",a,c,d]]));return this},ce.scale=function(a,c,d,e){if(this.removed)return this;a=q(a).split(b),a.length-1&&(c=P(a[1]),d=P(a[2]),e=P(a[3])),a=P(a[0]),c==null&&(c=a),e==null&&(d=e);if(d==null||e==null)var f=this.getBBox(1);d=d==null?f.x+f.width/2:d,e=e==null?f.y+f.height/2:e,this.transform(this._.transform.concat([["s",a,c,d,e]]));return this},ce.translate=function(a,c){if(this.removed)return this;a=q(a).split(b),a.length-1&&(c=P(a[1])),a=P(a[0])||0,c=+c||0,this.transform(this._.transform.concat([["t",a,c]]));return this},ce.transform=function(a){var b=this._;if(!a)return b.transform;bM(this,a),this.clip&&bU(this.clip,{transform:this.matrix.invert()}),this.pattern&&b$(this),this.node&&bU(this.node,{transform:this.matrix});if(b.sx!=1||b.sy!=1){var c=this.attrs[f]("stroke-width")?this.attrs["stroke-width"]:1;this.attr({"stroke-width":c})}return this},ce.hide=function(){!this.removed&&this.paper.safari(this.node.style.display="none");return this},ce.show=function(){!this.removed&&this.paper.safari(this.node.style.display="");return this},ce.remove=function(){if(!this.removed){dc.unbind("*.*."+this.id),bG(this,this.paper),this.node.parentNode.removeChild(this.node);for(var a in this)delete this[a];this.removed=!0}},ce._getBBox=function(){if(this.node.style.display=="none"){this.show();var a=!0}var b={};try{b=this.node.getBBox()}catch(c){}finally{b=b||{}}a&&this.hide();return b},ce.attr=function(b,c){if(this.removed)return this;if(b==null){var d={};for(var e in this.attrs)this.attrs[f](e)&&(d[e]=this.attrs[e]);d.gradient&&d.fill=="none"&&(d.fill=d.gradient)&&delete d.gradient,d.transform=this._.transform;return d}if(c==null&&a.is(b,C)){if(b==F&&this.attrs.fill=="none"&&this.attrs.gradient)return this.attrs.gradient;if(b=="transform")return this._.transform;return b in this.attrs?this.attrs[b]:a.is(this.paper.customAttributes[b],"function")?this.paper.customAttributes[b].def:T[b]}if(c==null&&a.is(b,D)){var g={};for(var h=0,i=b.length;h<i;h++)g[b[h]]=this.attr(b[h]);return g}if(c!=null){var j={};j[b]=c}else b!=null&&a.is(b,"object")&&(j=b);for(var k in this.paper.customAttributes)if(this.paper.customAttributes[f](k)&&j[f](k)&&a.is(this.paper.customAttributes[k],"function")){var l=this.paper.customAttributes[k].apply(this,[][m](j[k]));this.attrs[k]=j[k];for(var n in l)l[f](n)&&(j[n]=l[n])}ca(this,j);return this},ce.toFront=function(){if(this.removed)return this;this.node.parentNode.appendChild(this.node);var a=this.paper;a.top!=this&&bH(this,a);return this},ce.toBack=function(){if(this.removed)return this;if(this.node.parentNode.firstChild!=this.node){this.node.parentNode.insertBefore(this.node,this.node.parentNode.firstChild),bI(this,this.paper);var a=this.paper}return this},ce.insertAfter=function(a){if(this.removed)return this;var b=a.node||a[a.length-1].node;b.nextSibling?b.parentNode.insertBefore(this.node,b.nextSibling):b.parentNode.appendChild(this.node),bJ(this,a,this.paper);return this},ce.insertBefore=function(a){if(this.removed)return this;var b=a.node||a[0].node;b.parentNode.insertBefore(this.node,b),bK(this,a,this.paper);return this},ce.blur=function(a){var b=this;if(+a!==0){var c=bU("filter"),d=bU("feGaussianBlur");b.attrs.blur=a,c.id=bk(),bU(d,{stdDeviation:+a||1.5}),c.appendChild(d),b.paper.defs.appendChild(c),b._blur=c,bU(b.node,{filter:"url(#"+c.id+")"})}else b._blur&&(b._blur.parentNode.removeChild(b._blur),delete b._blur,delete b.attrs.blur),b.node.removeAttribute("filter")};var cf=function(a,b,c,d){var e=bU("circle");a.canvas&&a.canvas.appendChild(e);var f=new cd(e,a);f.attrs={cx:b,cy:c,r:d,fill:"none",stroke:"#000"},f.type="circle",bU(e,f.attrs);return f},cg=function(a,b,c,d,e,f){var g=bU("rect");a.canvas&&a.canvas.appendChild(g);var h=new cd(g,a);h.attrs={x:b,y:c,width:d,height:e,r:f||0,rx:f||0,ry:f||0,fill:"none",stroke:"#000"},h.type="rect",bU(g,h.attrs);return h},ch=function(a,b,c,d,e){var f=bU("ellipse");a.canvas&&a.canvas.appendChild(f);var g=new cd(f,a);g.attrs={cx:b,cy:c,rx:d,ry:e,fill:"none",stroke:"#000"},g.type="ellipse",bU(f,g.attrs);return g},ci=function(a,b,c,d,e,f){var g=bU("image");bU(g,{x:c,y:d,width:e,height:f,preserveAspectRatio:"none"}),g.setAttributeNS(bR,"href",b),a.canvas&&a.canvas.appendChild(g);var h=new cd(g,a);h.attrs={x:c,y:d,width:e,height:f,src:b},h.type="image";return h},cj=function(a,b,c,d){var e=bU("text");bU(e,{x:b,y:c,"text-anchor":"middle"}),a.canvas&&a.canvas.appendChild(e);var f=new cd(e,a);f.attrs={x:b,y:c,"text-anchor":"middle",text:d,font:T.font,stroke:"none",fill:"#000"},f.type="text",ca(f,f.attrs);return f},ck=function(a,b){this.width=a||this.width,this.height=b||this.height,this.canvas[O]("width",this.width),this.canvas[O]("height",this.height),this._viewBox&&this.setViewBox.apply(this,this._viewBox);return this},cl=function(){var b=bE[l](0,arguments),c=b&&b.container,d=b.x,e=b.y,f=b.width,h=b.height;if(!c)throw new Error("SVG container not found.");var j=bU("svg"),k="overflow:hidden;";d=d||0,e=e||0,f=f||512,h=h||342,bU(j,{height:h,version:1.1,width:f,xmlns:"http://www.w3.org/2000/svg"}),c==1?(j.style.cssText=k+"position:absolute;left:"+d+"px;top:"+e+"px",g.doc.body.appendChild(j)):(j.style.cssText=k,c.firstChild?c.insertBefore(j,c.firstChild):c.appendChild(j)),c=new i,c.width=f,c.height=h,c.canvas=j,bF.call(c,c,a.fn),c.clear();return c},cm=function(a,b,c,d,e){dc("setViewBox",this,this._viewBox,[a,b,c,d,e]);var f=w(c/this.width,d/this.height),g=this.top,h=e?"meet":"xMinYMin",i,j;a==null?(this._vbSize&&(f=1),delete this._vbSize,i="0 0 "+this.width+p+this.height):(this._vbSize=f,i=a+p+b+p+c+p+d),bU(this.canvas,{viewBox:i,preserveAspectRatio:h});while(f&&g)j="stroke-width"in g.attrs?g.attrs["stroke-width"]:1,g.attr({"stroke-width":j}),g._.dirty=1,g._.dirtyT=1,g=g.prev;this._viewBox=[a,b,c,d,!!e];return this};j.clear=function(){dc("clear",this);var b=this.canvas;while(b.firstChild)b.removeChild(b.firstChild);this.bottom=this.top=null,(this.desc=bU("desc")).appendChild(g.doc.createTextNode("Created with Raphaël "+a.version)),b.appendChild(this.desc),b.appendChild(this.defs=bU("defs"))},j.remove=function(){dc("remove",this),this.canvas.parentNode&&this.canvas.parentNode.removeChild(this.canvas);for(var a in this)this[a]=bL(a)}}if(a.vml){var cn={M:"m",L:"l",C:"c",Z:"x",m:"t",l:"r",c:"v",z:"x"},co=/([clmz]),?([^clmz]*)/gi,cp=/ progid:\S+Blur\([^\)]+\)/g,cq=/-?[^,\s-]+/g,cr="position:absolute;left:0;top:0;width:1px;height:1px",cs=21600,ct={path:1,rect:1},cu={circle:1,ellipse:1},cv=function(a){var b=/[ahqstv]/ig,c=bw;q(a).match(b)&&(c=bC),b=/[clmz]/g;if(c==bw&&!q(a).match(b)){var d=q(a).replace(co,function(a,b,c){var d=[],e=u.call(b)=="m",f=cn[b];c.replace(cq,function(a){e&&d.length==2&&(f+=d+cn[b=="m"?"l":"L"],d=[]),d.push(N(a*cs))});return f+d});return d}var e=c(a),f,g;d=[];for(var h=0,i=e.length;h<i;h++){f=e[h],g=u.call(e[h][0]),g=="z"&&(g="x");for(var j=1,k=f.length;j<k;j++)g+=N(f[j]*cs)+(j!=k-1?",":o);d.push(g)}return d.join(p)},cw=function(a,b,c){var d=new bP;d.rotate(-a,.5,.5);return{dx:d.x(b,c),dy:d.y(b,c)}},cx=function(a){var b=a._,c=b.sx,d=b.sy,e=b.deg,f=b.dx,g=b.dy,h=b.fillpos,i=a.node,j=i.style,k=1,l=a.matrix,m="",n,o=cs/c,q=cs/d;j.visibility="hidden",i.coordsize=y(o)+p+y(q),j.rotation=e*(c*d<0?-1:1);if(e){var r=cw(e,f,g);f=r.dx,g=r.dy}c<0&&(m+="x"),d<0&&(m+=" y")&&(k=-1),j.flip=m,i.coordorigin=f*-o+p+g*-q;if(h||b.fillsize){var s=i.getElementsByTagName(F);s=s&&s[0],i.removeChild(s),h&&(r=cw(e,l.x(h[0],h[1]),l.y(h[0],h[1])),s.position=r.dx*k+p+r.dy*k),b.fillsize&&(s.size=b.fillsize[0]*y(c)+p+b.fillsize[1]*y(d)),i.appendChild(s)}j.visibility="visible"};a.toString=function(){return"Your browser doesn’t support SVG. Falling down to VML.\nYou are running Raphaël "+this.version},b_=function(a,b,c){var d=q(b).toLowerCase().split("-"),e=c?"end":"start",f=d.length,g="classic",h="medium",i="medium";while(f--)switch(d[f]){case"block":case"classic":case"oval":case"diamond":case"open":case"none":g=d[f];break;case"wide":case"narrow":i=d[f];break;case"long":case"short":h=d[f]}var j=a.node.getElementsByTagName("stroke")[0];j[e+"arrow"]=g,j[e+"arrowlength"]=h,j[e+"arrowwidth"]=i},ca=function(c,d){c.paper.canvas.style.display="none",c.attrs=c.attrs||{};var e=c.node,h=c.attrs,i=e.style,j,k=ct[c.type]&&(d.x!=h.x||d.y!=h.y||d.width!=h.width||d.height!=h.height||d.cx!=h.cx||d.cy!=h.cy||d.rx!=h.rx||d.ry!=h.ry||d.r!=h.r),l=cu[c.type]&&(h.cx!=d.cx||h.cy!=d.cy||h.r!=d.r||h.rx!=d.rx||h.ry!=d.ry),m=c;for(var n in d)d[f](n)&&(h[n]=d[n]);k&&(h.path=bg[c.type](c),c._.dirty=1),d.href&&(e.href=d.href),d.title&&(e.title=d.title),d.target&&(e.target=d.target),d.cursor&&(i.cursor=d.cursor),"blur"in d&&c.blur(d.blur),"transform"in d&&c.transform(d.transform);if(d.path&&c.type=="path"||k)e.path=cv(h.path);if(l){var r=h.cx,s=h.cy,t=h.rx||h.r||0,u=h.ry||h.r||0;e.path=a.format("ar{0},{1},{2},{3},{4},{1},{4},{1}x",N((r-t)*cs),N((s-u)*cs),N((r+t)*cs),N((s+u)*cs),N(r*cs))}if("clip-rect"in d){var v=q(d["clip-rect"]).split(b);if(v.length==4){v[2]=+v[2]+ +v[0],v[3]=+v[3]+ +v[1];var y=e.clipRect||g.doc.createElement("div"),z=y.style,A=e.parentNode;z.clip=a.format("rect({1}px {2}px {3}px {0}px)",v),e.clipRect||(z.position="absolute",z.top=0,z.left=0,z.width=c.paper.width+"px",z.height=c.paper.height+"px",A.parentNode.insertBefore(y,A),y.appendChild(A),e.clipRect=y)}d["clip-rect"]||e.clipRect&&(e.clipRect.style.clip=o)}if(c.textpath){var B=c.textpath.style;d.font&&(B.font=d.font),d["font-family"]&&(B.fontFamily='"'+d["font-family"].split(",")[0].replace(/^['"]+|['"]+$/g,o)+'"'),d["font-size"]&&(B.fontSize=d["font-size"]),d["font-weight"]&&(B.fontWeight=d["font-weight"]),d["font-style"]&&(B.fontStyle=d["font-style"])}"arrow-start"in d&&b_(m,d["arrow-start"]),"arrow-end"in d&&b_(m,d["arrow-end"],1);if(d.opacity!=null||d["stroke-width"]!=null||d.fill!=null||d.src!=null||d.stroke!=null||d["stroke-width"]!=null||d["stroke-opacity"]!=null||d["fill-opacity"]!=null||d["stroke-dasharray"]!=null||d["stroke-miterlimit"]!=null||d["stroke-linejoin"]!=null||d["stroke-linecap"]!=null){var C=e.getElementsByTagName(F),D=!1;C=C&&C[0],!C&&(D=C=cy(F)),c.type=="image"&&d.src&&(C.src=d.src);if("fill-opacity"in d||"opacity"in d){var E=((+h["fill-opacity"]+1||2)-1)*((+h.opacity+1||2)-1)*((+a.getRGB(d.fill).o+1||2)-1);E=x(w(E,0),1),C.opacity=E}d.fill&&(C.on=!0);if(C.on==null||d.fill=="none"||d.fill===null)C.on=!1;if(C.on&&d.fill){var G=d.fill.match(J);if(G){C.parentNode==e&&e.removeChild(C),C.rotate=!0,C.src=G[1],C.type="tile";var H=c.getBBox(1);C.position=H.x+p+H.y,c._.fillpos=[H.x,H.y],bs(G[1],function(){c._.fillsize=[this.offsetWidth,this.offsetHeight]})}else C.color=a.getRGB(d.fill).hex,C.src=o,C.type="solid",a.getRGB(d.fill).error&&(m.type in{circle:1,ellipse:1}||q(d.fill).charAt()!="r")&&bZ(m,d.fill,C)&&(h.fill="none",h.gradient=d.fill,C.rotate=!1)}e.appendChild(C);var I=e.getElementsByTagName("stroke")&&e.getElementsByTagName("stroke")[0],K=!1;!I&&(K=I=cy("stroke"));if(d.stroke&&d.stroke!="none"||d["stroke-width"]||d["stroke-opacity"]!=null||d["stroke-dasharray"]||d["stroke-miterlimit"]||d["stroke-linejoin"]||d["stroke-linecap"])I.on=!0;(d.stroke=="none"||d.stroke===null||I.on==null||d.stroke==0||d["stroke-width"]==0)&&(I.on=!1);var L=a.getRGB(d.stroke);I.on&&d.stroke&&(I.color=L.hex),E=((+h["stroke-opacity"]+1||2)-1)*((+h.opacity+1||2)-1)*((+L.o+1||2)-1);var M=(P(d["stroke-width"])||1)*.75;E=x(w(E,0),1),d["stroke-width"]==null&&(M=h["stroke-width"]),d["stroke-width"]&&(I.weight=M),M&&M<1&&(E*=M)&&(I.weight=1),I.opacity=E,d["stroke-linejoin"]&&(I.joinstyle=d["stroke-linejoin"]||"miter"),I.miterlimit=d["stroke-miterlimit"]||8,d["stroke-linecap"]&&(I.endcap=d["stroke-linecap"]=="butt"?"flat":d["stroke-linecap"]=="square"?"square":"round");if(d["stroke-dasharray"]){var O={"-":"shortdash",".":"shortdot","-.":"shortdashdot","-..":"shortdashdotdot",". ":"dot","- ":"dash","--":"longdash","- .":"dashdot","--.":"longdashdot","--..":"longdashdotdot"};I.dashstyle=O[f](d["stroke-dasharray"])?O[d["stroke-dasharray"]]:o}K&&e.appendChild(I)}if(m.type=="text"){m.paper.canvas.style.display=o;var Q=m.paper.span,R=100,S=h.font&&h.font.match(/\d+(?:\.\d*)?(?=px)/);i=Q.style,h.font&&(i.font=h.font),h["font-family"]&&(i.fontFamily=h["font-family"]),h["font-weight"]&&(i.fontWeight=h["font-weight"]),h["font-style"]&&(i.fontStyle=h["font-style"]),S=P(S?S[0]:h["font-size"]),i.fontSize=S*R+"px",m.textpath.string&&(Q.innerHTML=q(m.textpath.string).replace(/</g,"&#60;").replace(/&/g,"&#38;").replace(/\n/g,"<br>"));var T=Q.getBoundingClientRect();m.W=h.w=(T.right-T.left)/R,m.H=h.h=(T.bottom-T.top)/R,m.paper.canvas.style.display="none",m.X=h.x,m.Y=h.y+m.H/2,("x"in d||"y"in d)&&(m.path.v=a.format("m{0},{1}l{2},{1}",N(h.x*cs),N(h.y*cs),N(h.x*cs)+1));var U=["x","y","text","font","font-family","font-weight","font-style","font-size"];for(var V=0,W=U.length;V<W;V++)if(U[V]in d){m._.dirty=1;break}switch(h["text-anchor"]){case"start":m.textpath.style["v-text-align"]="left",m.bbx=m.W/2;break;case"end":m.textpath.style["v-text-align"]="right",m.bbx=-m.W/2;break;default:m.textpath.style["v-text-align"]="center",m.bbx=0}m.textpath.style["v-text-kern"]=!0}m.paper.canvas.style.display=o},bZ=function(a,b,c){a.attrs=a.attrs||{};var d=a.attrs,e="linear",f=".5 .5";a.attrs.gradient=b,b=q(b).replace(_,function(a,b,c){e="radial",b&&c&&(b=P(b),c=P(c),z(b-.5,2)+z(c-.5,2)>.25&&(c=v.sqrt(.25-z(b-.5,2))*((c>.5)*2-1)+.5),f=b+p+c);return o}),b=b.split(/\s*\-\s*/);if(e=="linear"){var g=b.shift();g=-P(g);if(isNaN(g))return null}var h=bD(b);if(!h)return null;a=a.shape||a.node;if(h.length){a.removeChild(c),c.on=!0,c.method="none",c.color=h[0].color,c.color2=h[h.length-1].color;var i=[];for(var j=0,k=h.length;j<k;j++)h[j].offset&&i.push(h[j].offset+p+h[j].color);c.colors&&(c.colors.value=i.length?i.join():"0% "+c.color),e=="radial"?(c.type="gradientTitle",c.focus="100%",c.focussize="0 0",c.focusposition=f,c.angle=0):(c.type="gradient",c.angle=(270-g)%360),a.appendChild(c)}return 1},cd=function(b,c){this[0]=this.node=b,b.raphael=!0,this.id=a._oid++,b.raphaelid=this.id,this.X=0,this.Y=0,this.attrs={},this.paper=c,this.matrix=new bP,this._={transform:[],sx:1,sy:1,dx:0,dy:0,deg:0,dirty:1,dirtyT:1},!c.bottom&&(c.bottom=this),this.prev=c.top,c.top&&(c.top.next=this),c.top=this,this.next=null},ce=cd.prototype,ce.transform=function(a){if(a==null)return this._.transform;bM(this,a);var b=this.matrix.clone(),c=this.skew;b.translate(-0.5,-0.5);if(this.type=="image")if(q(a).indexOf("m")+1){this.node.style.filter=b.toFilter();var d=this.getBBox(),e=this.getBBox(1),f=b.invert(),g=f.x(d.x,d.y)-f.x(e.x,e.y),h=f.y(d.x,d.y)-f.y(e.x,e.y)}else this.node.style.filter=o,cx(this);else this.node.style.filter=o,c.matrix=b,c.offset=b.offset();return this},ce.rotate=function(a,c,d){if(this.removed)return this;if(a!=null){a=q(a).split(b),a.length-1&&(c=P(a[1]),d=P(a[2])),a=P(a[0]),d==null&&(c=d);if(c==null||d==null){var e=this.getBBox(1);c=e.x+e.width/2,d=e.y+e.height/2}this._.dirtyT=1,this.transform(this._.transform.concat([["r",a,c,d]]));return this}},ce.translate=function(a,c){if(this.removed)return this;a=q(a).split(b),a.length-1&&(c=P(a[1])),a=P(a[0])||0,c=+c||0,this._.bbox&&(this._.bbox.x+=a,this._.bbox.y+=c),this.transform(this._.transform.concat([["t",a,c]]));return this},ce.scale=function(a,c,d,e){if(this.removed)return this;a=q(a).split(b),a.length-1&&(c=P(a[1]),d=P(a[2]),e=P(a[3]),isNaN(d)&&(d=null),isNaN(e)&&(e=null)),a=P(a[0]),c==null&&(c=a),e==null&&(d=e);if(d==null||e==null)var f=this.getBBox(1);d=d==null?f.x+f.width/2:d,e=e==null?f.y+f.height/2:e,this.transform(this._.transform.concat([["s",a,c,d,e]])),this._.dirtyT=1;return this},ce.hide=function(){!this.removed&&(this.node.style.display="none");return this},ce.show=function(){!this.removed&&(this.node.style.display=o);return this},ce._getBBox=function(){if(this.removed)return{};return this.type=="text"?{x:this.X+(this.bbx||0)-this.W/2,y:this.Y-this.H,width:this.W,height:this.H}:bt(this.attrs.path)},ce.remove=function(){if(!this.removed){dc.unbind("*.*."+this.id),bG(this,this.paper),this.node.parentNode.removeChild(this.node),this.shape&&this.shape.parentNode.removeChild(this.shape);for(var a in this)delete this[a];this.removed=!0}},ce.attr=function(b,c){if(this.removed)return this;if(b==null){var d={};for(var e in this.attrs)this.attrs[f](e)&&(d[e]=this.attrs[e]);d.gradient&&d.fill=="none"&&(d.fill=d.gradient)&&delete d.gradient;return d}if(c==null&&a.is(b,"string")){if(b==F&&this.attrs.fill=="none"&&this.attrs.gradient)return this.attrs.gradient;return b in this.attrs?this.attrs[b]:a.is(this.paper.customAttributes[b],"function")?this.paper.customAttributes[b].def:T[b]}if(this.attrs&&c==null&&a.is(b,D)){var g,h={};for(e=0,g=b.length;e<g;e++)h[b[e]]=this.attr(b[e]);return h}var i;c!=null&&(i={},i[b]=c),c==null&&a.is(b,"object")&&(i=b);for(var j in i)dc("attr."+j+"."+this.id,this,i[j]);if(i){for(j in this.paper.customAttributes)if(this.paper.customAttributes[f](j)&&i[f](j)&&a.is(this.paper.customAttributes[j],"function")){var k=this.paper.customAttributes[j].apply(this,[][m](i[j]));this.attrs[j]=i[j];for(var l in k)k[f](l)&&(i[l]=k[l])}i.text&&this.type=="text"&&(this.textpath.string=i.text),ca(this,i)}return this},ce.toFront=function(){!this.removed&&this.node.parentNode.appendChild(this.node),this.paper.top!=this&&bH(this,this.paper);return this},ce.toBack=function(){if(this.removed)return this;this.node.parentNode.firstChild!=this.node&&(this.node.parentNode.insertBefore(this.node,this.node.parentNode.firstChild),bI(this,this.paper));return this},ce.insertAfter=function(a){if(this.removed)return this;a.constructor==c_&&(a=a[a.length-1]),a.node.nextSibling?a.node.parentNode.insertBefore(this.node,a.node.nextSibling):a.node.parentNode.appendChild(this.node),bJ(this,a,this.paper);return this},ce.insertBefore=function(a){if(this.removed)return this;a.constructor==c_&&(a=a[0]),a.node.parentNode.insertBefore(this.node,a.node),bK(this,a,this.paper);return this},ce.blur=function(b){var c=this.node.runtimeStyle,d=c.filter;d=d.replace(cp,o),+b!==0?(this.attrs.blur=b,c.filter=d+p+R+".Blur(pixelradius="+(+b||1.5)+")",c.margin=a.format("-{0}px 0 0 -{0}px",N(+b||1.5))):(c.filter=d,c.margin=0,delete this.attrs.blur)},bV=function(a,b){var c=cy("shape");c.style.cssText=cr,c.coordsize=cs+p+cs,c.coordorigin=b.coordorigin;var d=new cd(c,b),e={fill:"none",stroke:"#000"};a&&(e.path=a),d.type="path",d.path=[],d.Path=o,ca(d,e),b.canvas.appendChild(c);var f=cy("skew");f.on=!0,c.appendChild(f),d.skew=f,d.transform(o);return d},cg=function(a,b,c,d,e,f){var g=be(b,c,d,e,f),h=a.path(g),i=h.attrs;h.X=i.x=b,h.Y=i.y=c,h.W=i.width=d,h.H=i.height=e,i.r=f,i.path=g,h.type="rect";return h},ch=function(a,b,c,d,e){var f=a.path(),g=f.attrs;f.X=b-d,f.Y=c-e,f.W=d*2,f.H=e*2,f.type="ellipse",ca(f,{cx:b,cy:c,rx:d,ry:e});return f},cf=function(a,b,c,d){var e=a.path(),f=e.attrs;e.X=b-d,e.Y=c-d,e.W=e.H=d*2,e.type="circle",ca(e,{cx:b,cy:c,r:d});return e},ci=function(a,b,c,d,e,f){var g=be(c,d,e,f),h=a.path(g).attr({stroke:"none"}),i=h.attrs,j=h.node,k=j.getElementsByTagName(F)[0];i.src=b,h.X=i.x=c,h.Y=i.y=d,h.W=i.width=e,h.H=i.height=f,i.path=g,h.type="image",k.parentNode==j&&j.removeChild(k),k.rotate=!0,k.src=b,k.type="tile",h._.fillpos=[c,d],h._.fillsize=[e,f],j.appendChild(k),cx(h);return h},cj=function(b,c,d,e){var f=cy("shape"),g=cy("path"),h=cy("textpath");c=c||0,d=d||0,e=e||"",g.v=a.format("m{0},{1}l{2},{1}",N(c*cs),N(d*cs),N(c*cs)+1),g.textpathok=!0,h.string=q(e),h.on=!0,f.style.cssText="position:absolute;left:0;top:0;width:1;height:1",f.coordsize=cs+p+cs,f.coordorigin="0 0";var i=new cd(f,b),j={fill:"#000",stroke:"none",font:T.font,text:e};i.shape=f,i.path=g,i.textpath=h,i.type="text",i.attrs.text=q(e),i.attrs.x=c,i.attrs.y=d,i.attrs.w=1,i.attrs.h=1,ca(i,j),f.appendChild(h),f.appendChild(g),b.canvas.appendChild(f);var k=cy("skew");k.on=!0,f.appendChild(k),i.skew=k,i.transform(o);return i},ck=function(a,b){var c=this.canvas.style;this.width=a,this.height=b,a==+a&&(a+="px"),b==+b&&(b+="px"),c.width=a,c.height=b,c.clip="rect(0 "+a+" "+b+" 0)",this._viewBox&&cm.apply(this,this._viewBox);return this},cm=function(a,b,c,d,e){dc("setViewBox",this,this._viewBox,[a,b,c,d,e]);var f=this.width,g=this.height,h=1e3*w(c/f,d/g),i,j;e&&(i=g/d,j=f/c,c*i<f&&(a-=(f-c*i)/2/i),d*j<g&&(b-=(g-d*j)/2/j)),this._viewBox=[a,b,c,d,!!e],this.forEach(function(a){a.transform("...")});return this};var cy,cz=function(a){var b=a.document;b.createStyleSheet().addRule(".rvml","behavior:url(#default#VML)");try{!b.namespaces.rvml&&b.namespaces.add("rvml","urn:schemas-microsoft-com:vml"),cy=function(a){return b.createElement("<rvml:"+a+' class="rvml">')}}catch(c){cy=function(a){return b.createElement("<"+a+' xmlns="urn:schemas-microsoft.com:vml" class="rvml">')}}};cz(g.win),cl=function(){var b=bE[l](0,arguments),c=b.container,d=b.height,e,f=b.width,h=b.x,j=b.y;if(!c)throw new Error("VML container not found.");var k=new i,m=k.canvas=g.doc.createElement("div"),n=m.style;h=h||0,j=j||0,f=f||512,d=d||342,k.width=f,k.height=d,f==+f&&(f+="px"),d==+d&&(d+="px"),k.coordsize=cs*1e3+p+cs*1e3,k.coordorigin="0 0",k.span=g.doc.createElement("span"),k.span.style.cssText="position:absolute;left:-9999em;top:-9999em;padding:0;margin:0;line-height:1;",m.appendChild(k.span),n.cssText=a.format("top:0;left:0;width:{0};height:{1};display:inline-block;position:relative;clip:rect(0 {0} {1} 0);overflow:hidden",f,d),c==1?(g.doc.body.appendChild(m),n.left=h+"px",n.top=j+"px",n.position="absolute"):c.firstChild?c.insertBefore(m,c.firstChild):c.appendChild(m),bF.call(k,k,a.fn);return k},j.clear=function(){dc("clear",this),this.canvas.innerHTML=o,this.span=g.doc.createElement("span"),this.span.style.cssText="position:absolute;left:-9999em;top:-9999em;padding:0;margin:0;line-height:1;display:inline;",this.canvas.appendChild(this.span),this.bottom=this.top=null},j.remove=function(){dc("remove",this),this.canvas.parentNode.removeChild(this.canvas);for(var a in this)this[a]=bL(a);return!0}}var cA=navigator.userAgent.match(/Version\/(.*?)\s/)||navigator.userAgent.match(/Chrome\/(\d+)/);navigator.vendor=="Apple Computer, Inc."&&(cA&&cA[1]<4||navigator.platform.slice(0,2)=="iP")||navigator.vendor=="Google Inc."&&cA&&cA[1]<8?j.safari=function(){var a=this.rect(-99,-99,this.width+99,this.height+99).attr({stroke:"none"});setTimeout(function(){a.remove()})}:j.safari=bc;var cB=function(){this.returnValue=!1},cC=function(){return this.originalEvent.preventDefault()},cD=function(){this.cancelBubble=!0},cE=function(){return this.originalEvent.stopPropagation()},cF=function(){if(g.doc.addEventListener)return function(a,b,c,d){var e=n&&t[b]?t[b]:b,g=function(e){if(n&&t[f](b))for(var g=0,h=e.targetTouches&&e.targetTouches.length;g<h;g++)if(e.targetTouches[g].target==a){var i=e;e=e.targetTouches[g],e.originalEvent=i,e.preventDefault=cC,e.stopPropagation=cE;break}return c.call(d,e)};a.addEventListener(e,g,!1);return function(){a.removeEventListener(e,g,!1);return!0}};if(g.doc.attachEvent)return function(a,b,c,d){var e=function(a){a=a||g.win.event,a.preventDefault=a.preventDefault||cB,a.stopPropagation=a.stopPropagation||cD;return c.call(d,a)};a.attachEvent("on"+b,e);var f=function(){a.detachEvent("on"+b,e);return!0};return f}}(),cG=[],cH=function(a){var b=a.clientX,c=a.clientY,d=g.doc.documentElement.scrollTop||g.doc.body.scrollTop,e=g.doc.documentElement.scrollLeft||g.doc.body.scrollLeft,f,h=cG.length;while(h--){f=cG[h];if(n){var i=a.touches.length,j;while(i--){j=a.touches[i];if(j.identifier==f.el._drag.id){b=j.clientX,c=j.clientY,(a.originalEvent?a.originalEvent:a).preventDefault();break}}}else a.preventDefault();var k=f.el.node,l,m=k.nextSibling,o=k.parentNode,p=k.style.display;g.win.opera&&o.removeChild(k),k.style.display="none",l=f.el.paper.getElementByPoint(b,c),k.style.display=p,g.win.opera&&(m?o.insertBefore(k,m):o.appendChild(k)),l&&dc("drag.over."+f.el.id,f.el,l),b+=e,c+=d,dc("drag.move."+f.el.id,f.move_scope||f.el,b-f.el._drag.x,c-f.el._drag.y,b,c,a)}},cI=function(b){a.unmousemove(cH).unmouseup(cI);var c=cG.length,d;while(c--)d=cG[c],d.el._drag={},dc("drag.end."+d.el.id,d.end_scope||d.start_scope||d.move_scope||d.el,b);cG=[]};for(var cJ=s.length;cJ--;)(function(b){a[b]=cd.prototype[b]=function(c,d){a.is(c,"function")&&(this.events=this.events||[],this.events.push({name:b,f:c,unbind:cF(this.shape||this.node||g.doc,b,c,d||this)}));return this},a["un"+b]=cd.prototype["un"+b]=function(a){var c=this.events,d=c.length;while(d--)if(c[d].name==b&&c[d].f==a){c[d].unbind(),c.splice(d,1),!c.length&&delete this.events;return this}return this}})(s[cJ]);ce.hover=function(a,b,c,d){return this.mouseover(a,c).mouseout(b,d||c)},ce.unhover=function(a,b){return this.unmouseover(a).unmouseout(b)},ce.drag=function(b,c,d,e,f,h){function i(i){(i.originalEvent||i).preventDefault();var j=g.doc.documentElement.scrollTop||g.doc.body.scrollTop,k=g.doc.documentElement.scrollLeft||g.doc.body.scrollLeft;this._drag.x=i.clientX+k,this._drag.y=i.clientY+j,this._drag.id=i.identifier,!cG.length&&a.mousemove(cH).mouseup(cI),cG.push({el:this,move_scope:e,start_scope:f,end_scope:h}),c&&dc.on("drag.start."+this.id,c),b&&dc.on("drag.move."+this.id,b),d&&dc.on("drag.end."+this.id,d),dc("drag.start."+this.id,f||e||this,i.clientX+k,i.clientY+j,i)}this._drag={},this.mousedown(i);return this},ce.onDragOver=function(a){a?dc.on("drag.over."+this.id,a):dc.unbind("drag.over."+this.id)},ce.undrag=function(){var b=cG.length;while(b--)cG[b].el==this&&(a.unmousedown(cG[b].start),cG.splice(b++,1),dc.unbind("drag.*."+this.id));!cG.length&&a.unmousemove(cH).unmouseup(cI)},j.circle=function(a,b,c){return cf(this,a||0,b||0,c||0)},j.rect=function(a,b,c,d,e){return cg(this,a||0,b||0,c||0,d||0,e||0)},j.ellipse=function(a,b,c,d){return ch(this,a||0,b||0,c||0,d||0)},j.path=function(b){b&&!a.is(b,C)&&!a.is(b[0],D)&&(b+=o);return bV(a.format[l](a,arguments),this)},j.image=function(a,b,c,d,e){return ci(this,a||"about:blank",b||0,c||0,d||0,e||0)},j.text=function(a,b,c){return cj(this,a||0,b||0,q(c))},j.set=function(a){arguments.length>1&&(a=Array.prototype.splice.call(arguments,0,arguments.length));return new c_(a)},j.setSize=ck,j.setViewBox=cm,j.top=j.bottom=null,j.raphael=a;var cK=function(a){var b=a.getBoundingClientRect(),c=a.ownerDocument,d=c.body,e=c.documentElement,f=e.clientTop||d.clientTop||0,h=e.clientLeft||d.clientLeft||0,i=b.top+(g.win.pageYOffset||e.scrollTop||d.scrollTop)-f,j=b.left+(g.win.pageXOffset||e.scrollLeft||d.scrollLeft)-h;return{y:i,x:j}};j.getElementByPoint=function(a,b){var c=this,d=c.canvas,e=g.doc.elementFromPoint(a,b);if(g.win.opera&&e.tagName=="svg"){var f=cK(d),h=d.createSVGRect();h.x=a-f.x,h.y=b-f.y,h.width=h.height=1;var i=d.getIntersectionList(h,null);i.length&&(e=i[i.length-1])}if(!e)return null;while(e.parentNode&&e!=d.parentNode&&!e.raphael)e=e.parentNode;e==c.canvas.parentNode&&(e=d),e=e&&e.raphael?c.getById(e.raphaelid):null;return e},j.getById=function(a){var b=this.bottom;while(b){if(b.id==a)return b;b=b.next}return null},j.forEach=function(a,b){var c=this.bottom;while(c){if(a.call(b,c)===!1)return this;c=c.next}return this},ce.getBBox=function(a){if(this.removed)return{};var b=this._;if(a){if(b.dirty||!b.bboxwt)this.realPath=bg[this.type](this),b.bboxwt=bt(this.realPath),b.bboxwt.toString=cM,b.dirty=0;return b.bboxwt}if(b.dirty||b.dirtyT||!b.bbox){if(b.dirty||!this.realPath)b.bboxwt=0,this.realPath=bg[this.type](this);b.bbox=bt(bh(this.realPath,this.matrix)),b.bbox.toString=cM,b.dirty=b.dirtyT=0}return b.bbox},ce.clone=function(){if(this.removed)return null;var a=this.attr();delete a.scale,delete a.translation;return this.paper[this.type]().attr(a)},ce.glow=function(a){if(this.type=="text")return null;a=a||{};var b={width:a.width||10,fill:a.fill||!1,opacity:a.opacity||.5,offsetx:a.offsetx||0,offsety:a.offsety||0,color:a.color||"#000"},c=b.width/2,d=this.paper,e=d.set(),f=this.realPath||bg[this.type](this);f=this.matrix?bh(f,this.matrix):f;for(var g=1;g<c+1;g++)e.push(d.path(f).attr({stroke:b.color,fill:b.fill?b.color:"none","stroke-linejoin":"round","stroke-linecap":"round","stroke-width":+(b.width/c*g).toFixed(3),opacity:+(b.opacity/c).toFixed(3)}));return e.insertBefore(this).translate(b.offsetx,b.offsety)};var cN={},cO=function(b,c,d,e,f,g,h,i,j){var k=0,l=100,m=[b,c,d,e,f,g,h,i].join(),n=cN[m],o,p;!n&&(cN[m]=n={data:[]}),n.timer&&clearTimeout(n.timer),n.timer=setTimeout(function(){delete cN[m]},2e3);if(j!=null&&!n.precision){var q=cO(b,c,d,e,f,g,h,i);n.precision=~~q*10,n.data=[]}l=n.precision||l;for(var r=0;r<l+1;r++){n.data[r*l]?p=n.data[r*l]:(p=a.findDotsAtSegment(b,c,d,e,f,g,h,i,r/l),n.data[r*l]=p),r&&(k+=z(z(o.x-p.x,2)+z(o.y-p.y,2),.5));if(j!=null&&k>=j)return p;o=p}if(j==null)return k},cP=function(b,c){return function(d,e,f){d=bC(d);var g,h,i,j,k="",l={},m,n=0;for(var o=0,p=d.length;o<p;o++){i=d[o];if(i[0]=="M")g=+i[1],h=+i[2];else{j=cO(g,h,i[1],i[2],i[3],i[4],i[5],i[6]);if(n+j>e){if(c&&!l.start){m=cO(g,h,i[1],i[2],i[3],i[4],i[5],i[6],e-n),k+=["C"+m.start.x,m.start.y,m.m.x,m.m.y,m.x,m.y];if(f)return k;l.start=k,k=["M"+m.x,m.y+"C"+m.n.x,m.n.y,m.end.x,m.end.y,i[5],i[6]].join(),n+=j,g=+i[5],h=+i[6];continue}if(!b&&!c){m=cO(g,h,i[1],i[2],i[3],i[4],i[5],i[6],e-n);return{x:m.x,y:m.y,alpha:m.alpha}}}n+=j,g=+i[5],h=+i[6]}k+=i.shift()+i}l.end=k,m=b?n:c?l:a.findDotsAtSegment(g,h,i[1],i[2],i[3],i[4],i[5],i[6],1),m.alpha&&(m={x:m.x,y:m.y,alpha:m.alpha});return m}},cQ=cP(1),cR=cP(),cS=cP(0,1);a.getTotalLength=cQ,a.getPointAtLength=cR,a.getSubpath=function(a,b,c){if(y(this.getTotalLength(a)-c)<1e-6)return cS(a,b).end;var d=cS(a,c,1);return b?cS(d,b).end:d},ce.getTotalLength=function(){if(this.type=="path"){if(this.node.getTotalLength)return this.node.getTotalLength();return cQ(this.attrs.path)}},ce.getPointAtLength=function(a){if(this.type=="path")return cR(this.attrs.path,a)},ce.getSubpath=function(b,c){if(this.type=="path")return a.getSubpath(this.attrs.path,b,c)};var cT=a.easing_formulas={linear:function(a){return a},"<":function(a){return z(a,1.7)},">":function(a){return z(a,.48)},"<>":function(a){var b=.48-a/1.04,c=v.sqrt(.1734+b*b),d=c-b,e=z(y(d),1/3)*(d<0?-1:1),f=-c-b,g=z(y(f),1/3)*(f<0?-1:1),h=e+g+.5;return(1-h)*3*h*h+h*h*h},backIn:function(a){var b=1.70158;return a*a*((b+1)*a-b)},backOut:function(a){a=a-1;var b=1.70158;return a*a*((b+1)*a+b)+1},elastic:function(a){if(a==!!a)return a;return z(2,-10*a)*v.sin((a-.075)*2*A/.3)+1},bounce:function(a){var b=7.5625,c=2.75,d;a<1/c?d=b*a*a:a<2/c?(a-=1.5/c,d=b*a*a+.75):a<2.5/c?(a-=2.25/c,d=b*a*a+.9375):(a-=2.625/c,d=b*a*a+.984375);return d}};cT.easeIn=cT["ease-in"]=cT["<"],cT.easeOut=cT["ease-out"]=cT[">"],cT.easeInOut=cT["ease-in-out"]=cT["<>"],cT["back-in"]=cT.backIn,cT["back-out"]=cT.backOut;var cU=[],cV=window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(a){setTimeout(a,16)},cW=function(){var b=+(new Date),c=0;for(;c<cU.length;c++){var d=cU[c];if(d.el.removed||d.paused)continue;var e=b-d.start,g=d.ms,h=d.easing,i=d.from,j=d.diff,k=d.to,l=d.t,m=d.el,n={},o;d.initstatus?(e=(d.initstatus*d.anim.top-d.prev)/(d.percent-d.prev)*g,d.status=d.initstatus,delete d.initstatus,d.stop&&cU.splice(c--,1)):d.status=(d.prev+(d.percent-d.prev)*(e/g))/d.anim.top;if(e<0)continue;if(e<g){var q=h(e/g);for(var r in i)if(i[f](r)){switch(U[r]){case B:o=+i[r]+q*g*j[r];break;case"colour":o="rgb("+[cX(N(i[r].r+q*g*j[r].r)),cX(N(i[r].g+q*g*j[r].g)),cX(N(i[r].b+q*g*j[r].b))].join(",")+")";break;case"path":o=[];for(var s=0,t=i[r].length;s<t;s++){o[s]=[i[r][s][0]];for(var u=1,v=i[r][s].length;u<v;u++)o[s][u]=+i[r][s][u]+q*g*j[r][s][u];o[s]=o[s].join(p)}o=o.join(p);break;case"transform":if(j[r].real){o=[];for(s=0,t=i[r].length;s<t;s++){o[s]=[i[r][s][0]];for(u=1,v=i[r][s].length;u<v;u++)o[s][u]=i[r][s][u]+q*g*j[r][s][u]}}else{var w=function(a){return+i[r][a]+q*g*j[r][a]};o=[["m",w(0),w(1),w(2),w(3),w(4),w(5)]]}break;case"csv":if(r=="clip-rect"){o=[],s=4;while(s--)o[s]=+i[r][s]+q*g*j[r][s]}break;default:var x=[].concat(i[r]);o=[],s=m.paper.customAttributes[r].length;while(s--)o[s]=+x[s]+q*g*j[r][s]}n[r]=o}m.attr(n),function(a,b,c){setTimeout(function(){dc("anim.frame."+a,b,c)})}(m.id,m,d.anim)}else(function(b,c,d){setTimeout(function(){dc("anim.finish."+c.id,c,d),a.is(b,"function")&&b.call(c)})})(d.callback,m,d.anim),--d.repeat?(m.attr(d.origin),d.start=b):(m.attr(k),cU.splice(c--,1)),d.next&&!d.stop&&c$(d.anim,d.el,d.next,null,d.totalOrigin)}a.svg&&m&&m.paper&&m.paper.safari(),cU.length&&cV(cW)},cX=function(a){return w(x(a,255),0)};ce.animateWith=function(a,b,c,d,e){for(var f=0,g=cU.length;f<g;f++)if(cU[f].el.id==a.id){b.start=cU[f].timestamp;break}return this.animate(b,c,d,e)},ce.onAnimation=function(a){a?dc.on("anim.frame."+this.id,a):dc.unbind("anim.frame."+this.id);return this},cZ.prototype.delay=function(a){var b=new cZ(this.anim,this.ms);b.times=this.times,b.del=+a||0;return b},cZ.prototype.repeat=function(a){var b=new cZ(this.anim,this.ms);b.del=this.del,b.times=v.floor(w(a,0))||1;return b},a.animation=function(b,c,d,e){if(a.is(d,"function")||!d)e=e||d||null,d=null;b=Object(b),c=+c||0;var g={},h,i;for(i in b)b[f](i)&&P(i)!=i&&(h=!0,g[i]=b[i]);if(!h)return new cZ(b,c);d&&(g.easing=d),e&&(g.callback=e);return new cZ({100:g},c)},ce.animate=function(b,c,d,e){var f=this;if(f.removed){e&&e.call(f);return f}var g=b instanceof cZ?b:a.animation(b,c,d,e);c$(g,f,g.percents[0],null,f.attr());return f},ce.setTime=function(a,b){a&&b!=null&&this.status(a,x(b,a.ms)/a.ms);return this},ce.status=function(a,b){var c=[],d=0,e,f;if(b!=null){c$(a,this,-1,x(b,1));return this}e=cU.length;for(;d<e;d++){f=cU[d];if(f.el.id==this.id&&(!a||f.anim==a)){if(a)return f.status;c.push({anim:f.anim,status:f.status})}}if(a)return 0;return c},ce.pause=function(a){for(var b=0;b<cU.length;b++)cU[b].el.id==this.id&&(!a||cU[b].anim==a)&&dc("anim.pause."+this.id,this,cU[b].anim)!==!1&&(cU[b].paused=!0);return this},ce.resume=function(a){for(var b=0;b<cU.length;b++)if(cU[b].el.id==this.id&&(!a||cU[b].anim==a)){var c=cU[b];dc("anim.resume."+this.id,this,c.anim)!==!1&&(delete c.paused,this.status(c.anim,c.status))}return this},ce.stop=function(a){for(var b=0;b<cU.length;b++)cU[b].el.id==this.id&&(!a||cU[b].anim==a)&&dc("anim.stop."+this.id,this,cU[b].anim)!==!1&&cU.splice(b--,1);return this},ce.toString=function(){return"Raphaël’s object"};var c_=function(a){this.items=[],this.length=0,this.type="set";if(a)for(var b=0,c=a.length;b<c;b++)a[b]&&(a[b].constructor==cd||a[b].constructor==c_)&&(this[this.items.length]=this.items[this.items.length]=a[b],this.length++)},da=c_.prototype;da.push=function(){var a,b;for(var c=0,d=arguments.length;c<d;c++)a=arguments[c],a&&(a.constructor==cd||a.constructor==c_)&&(b=this.items.length,this[b]=this.items[b]=a,this.length++);return this},da.pop=function(){this.length&&delete this[this.length--];return this.items.pop()},da.forEach=function(a,b){for(var c=0,d=this.items.length;c<d;c++)if(a.call(b,this.items[c])===!1)return this;return this};for(var db in ce)ce[f](db)&&(da[db]=function(a){return function(){var b=arguments;return this.forEach(function(c){c[a][l](c,b)})}}(db));da.attr=function(b,c){if(b&&a.is(b,D)&&a.is(b[0],"object"))for(var d=0,e=b.length;d<e;d++)this.items[d].attr(b[d]);else for(var f=0,g=this.items.length;f<g;f++)this.items[f].attr(b,c);return this},da.animate=function(b,c,d,e){(a.is(d,"function")||!d)&&(e=d||null);var f=this.items.length,g=f,h,i=this,j;e&&(j=function(){!--f&&e.call(i)}),d=a.is(d,C)?d:j;var k=b instanceof cZ?b:a.animation(b,c,d,j);h=this.items[--g].animate(k);while(g--)this.items[g]&&!this.items[g].removed&&this.items[g].animateWith(h,k);return this},da.insertAfter=function(a){var b=this.items.length;while(b--)this.items[b].insertAfter(a);return this},da.getBBox=function(){var a=[],b=[],c=[],d=[];for(var e=this.items.length;e--;)if(!this.items[e].removed){var f=this.items[e].getBBox();a.push(f.x),b.push(f.y),c.push(f.x+f.width),d.push(f.y+f.height)}a=x[l](0,a),b=x[l](0,b);return{x:a,y:b,width:w[l](0,c)-a,height:w[l](0,d)-b}},da.clone=function(a){a=new c_;for(var b=0,c=this.items.length;b<c;b++)a.push(this.items[b].clone());return a},da.toString=function(){return"Raphaël‘s set"},a.registerFont=function(a){if(!a.face)return a;this.fonts=this.fonts||{};var b={w:a.w,face:{},glyphs:{}},c=a.face["font-family"];for(var d in a.face)a.face[f](d)&&(b.face[d]=a.face[d]);this.fonts[c]?this.fonts[c].push(b):this.fonts[c]=[b];if(!a.svg){b.face["units-per-em"]=Q(a.face["units-per-em"],10);for(var e in a.glyphs)if(a.glyphs[f](e)){var g=a.glyphs[e];b.glyphs[e]={w:g.w,k:{},d:g.d&&"M"+g.d.replace(/[mlcxtrv]/g,function(a){return({l:"L",c:"C",x:"z",t:"m",r:"l",v:"c"})[a]||"M"})+"z"};if(g.k)for(var h in g.k)g[f](h)&&(b.glyphs[e].k[h]=g.k[h])}}return a},j.getFont=function(b,c,d,e){e=e||"normal",d=d||"normal",c=+c||({normal:400,bold:700,lighter:300,bolder:800})[c]||400;if(!!a.fonts){var g=a.fonts[b];if(!g){var h=new RegExp("(^|\\s)"+b.replace(/[^\w\d\s+!~.:_-]/g,o)+"(\\s|$)","i");for(var i in a.fonts)if(a.fonts[f](i)&&h.test(i)){g=a.fonts[i];break}}var j;if(g)for(var k=0,l=g.length;k<l;k++){j=g[k];if(j.face["font-weight"]==c&&(j.face["font-style"]==d||!j.face["font-style"])&&j.face["font-stretch"]==e)break}return j}},j.print=function(c,d,e,f,g,h,i){h=h||"middle",i=w(x(i||0,1),-1);var j=this.set(),k=q(e).split(o),l=0,m=o,n;a.is(f,e)&&(f=this.getFont(f));if(f){n=(g||16)/f.face["units-per-em"];var p=f.face.bbox.split(b),r=+p[0],s=+p[1]+(h=="baseline"?p[3]-p[1]+ +f.face.descent:(p[3]-p[1])/2);for(var t=0,u=k.length;t<u;t++){var v=t&&f.glyphs[k[t-1]]||{},y=f.glyphs[k[t]];l+=t?(v.w||f.w)+(v.k&&v.k[k[t]]||0)+f.w*i:0,y&&y.d&&j.push(this.path(y.d).attr({fill:"#000",stroke:"none",transform:[["t",l,0]]}))}j.scale(n,n,r,s).translate(c-r,d-s)}return j},a.format=function(b,c){var e=a.is(c,D)?[0][m](c):arguments;b&&a.is(b,C)&&e.length-1&&(b=b.replace(d,function(a,b){return e[++b]==null?o:e[b]}));return b||o},a.ninja=function(){h.was?g.win.Raphael=h.is:delete Raphael;return a},a.el=ce,a.st=da,function(a,b,c){function d(){/in/.test(a.readyState)?setTimeout(d,9):dc("DOMload")}a.readyState==null&&a.addEventListener&&(a.addEventListener(b,c=function(){a.removeEventListener(b,c,!1),a.readyState="complete"},!1),a.readyState="loading"),d()}(document,"DOMContentLoaded"),h.was?g.win.Raphael=a:Raphael=a;var dc=a.eve=function(){var a="0.2.1",b="hasOwnProperty",c=/[\.\/]/,d="*",e={n:{}},f=function(a,b){var c=e,d=Array.prototype.slice.call(arguments,2),g=f.listeners(a),h=[];for(var i=0,j=g.length;i<j;i++)try{g[i].apply(b,d)}catch(k){h.push({error:k&&k.message||k,func:g[i]})}if(h.length)return h};f.listeners=function(a){var b=a.split(c),f=e,g,h,i,j,k,l,m,n,o=[f],p=[];for(j=0,k=b.length;j<k;j++){n=[];for(l=0,m=o.length;l<m;l++){f=o[l].n,h=[f[b[j]],f[d]],i=2;while(i--)g=h[i],g&&(n.push(g),p=p.concat(g.f||[]))}o=n}return p},f.on=function(a,b){var d=a.split(c),f=e;for(var g=0,h=d.length;g<h;g++)f=f.n,!f[d[g]]&&(f[d[g]]={n:{}}),f=f[d[g]];f.f=f.f||[];for(g=0,h=f.f.length;g<h;g++)if(f.f[g]==b)return!1;f.f.push(b)},f.unbind=function(a,f){var g=a.split(c),h,i,j,k=[e];for(var l=0,m=g.length;l<m;l++)for(var n=0;n<k.length;n+=j.length-2){j=[n,1],h=k[n].n;if(g[l]!=d)h[g[l]]&&j.push(h[g[l]]);else for(i in h)h[b](i)&&j.push(h[i]);k.splice.apply(k,j)}for(l=0,m=k.length;l<m;l++){h=k[l];while(h.n){if(f){if(h.f){for(l=0,m=h.f.length;l<m;l++)if(h.f[l]==f){h.f.splice(l,1);break}!h.f.length&&delete h.f}for(i in h.n)if(h.n[b](i)&&h.n[i].f){var o=h.n[i].f;for(l=0,m=o.length;l<m;l++)if(o[l]==f){o.splice(l,1);break}!o.length&&delete h.n[i].f}}else{delete h.f;for(i in h.n)h.n[b](i)&&h.n[i].f&&delete h.n[i].f}h=h.n}}return!0},f.version=a,f.toString=function(){return"You are running Eve "+a};return f}()})()
\ No newline at end of file
+(function(){function c$(c,d,e,g,h){e=P(e);var i,j,k,l=[],m,n,o,p=c.ms,r={},s={},t={};if(g)for(v=0,w=cU.length;v<w;v++){var u=cU[v];if(u.el.id==d.id&&u.anim==c){u.percent!=e?(cU.splice(v,1),k=1):j=u,d.attr(u.totalOrigin);break}}else g=+s;for(var v=0,w=c.percents.length;v<w;v++){if(c.percents[v]==e||c.percents[v]>g*c.top){e=c.percents[v],n=c.percents[v-1]||0,p=p/c.top*(e-n),m=c.percents[v+1],i=c.anim[e];break}g&&d.attr(c.anim[c.percents[v]])}if(!!i){if(!j){for(attr in i)if(i[f](attr))if(U[f](attr)||d.paper.customAttributes[f](attr)){r[attr]=d.attr(attr),r[attr]==null&&(r[attr]=T[attr]),s[attr]=i[attr];switch(U[attr]){case B:t[attr]=(s[attr]-r[attr])/p;break;case"colour":r[attr]=a.getRGB(r[attr]);var x=a.getRGB(s[attr]);t[attr]={r:(x.r-r[attr].r)/p,g:(x.g-r[attr].g)/p,b:(x.b-r[attr].b)/p};break;case"path":var y=bC(r[attr],s[attr]),z=y[1];r[attr]=y[0],t[attr]=[];for(v=0,w=r[attr].length;v<w;v++){t[attr][v]=[0];for(var A=1,C=r[attr][v].length;A<C;A++)t[attr][v][A]=(z[v][A]-r[attr][v][A])/p}break;case"transform":var D=d._,E=bO(D[attr],s[attr]);if(E){r[attr]=E.from,s[attr]=E.to,t[attr]=[],t[attr].real=!0;for(v=0,w=r[attr].length;v<w;v++){t[attr][v]=[r[attr][v][0]];for(A=1,C=r[attr][v].length;A<C;A++)t[attr][v][A]=(s[attr][v][A]-r[attr][v][A])/p}}else{var F=(d.matrix||new bP).m,G={_:{transform:D.transform},getBBox:function(){return d.getBBox()}};r[attr]=[F[0][0],F[1][0],F[0][1],F[1][1],F[0][2],F[1][2]],bM(G,s[attr]),s[attr]=G._.transform,t[attr]=[(G.matrix.m[0][0]-F[0][0])/p,(G.matrix.m[1][0]-F[1][0])/p,(G.matrix.m[0][1]-F[0][1])/p,(G.matrix.m[1][1]-F[1][1])/p,(G.matrix.m[0][2]-F[0][2])/p,(G.matrix.m[1][2]-F[1][2])/p]}break;case"csv":var H=q(i[attr]).split(b),I=q(r[attr]).split(b);if(attr=="clip-rect"){r[attr]=I,t[attr]=[],v=I.length;while(v--)t[attr][v]=(H[v]-r[attr][v])/p}s[attr]=H;break;default:H=[].concat(i[attr]),I=[].concat(r[attr]),t[attr]=[],v=d.paper.customAttributes[attr].length;while(v--)t[attr][v]=((H[v]||0)-(I[v]||0))/p}}var J=i.easing,K=a.easing_formulas[J];if(!K){K=q(J).match(M);if(K&&K.length==5){var L=K;K=function(a){return cY(a,+L[1],+L[2],+L[3],+L[4],p)}}else K=bd}o=i.start||c.start||+(new Date),u={anim:c,percent:e,timestamp:o,start:o+(c.del||0),status:0,initstatus:g||0,stop:!1,ms:p,easing:K,from:r,diff:t,to:s,el:d,callback:i.callback,prev:n,next:m,repeat:c.times,origin:d.attr(),totalOrigin:h},cU.push(u);if(g&&!j){u.stop=!0,u.start=new Date-p*g;if(cU.length==1)return cW()}cU.length==1&&cV(cW)}else j.initstatus=g,j.start=new Date-j.ms*g;dc("anim.start."+d.id,d,c)}}function cZ(a,b){var c=[];this.anim=a,this.ms=b,this.times=1;if(this.anim){for(var d in this.anim)this.anim[f](d)&&c.push(+d);c.sort(bb)}this.top=c[c.length-1],this.percents=c}function cY(a,b,c,d,e,f){function o(a,b){var c,d,e,f,j,k;for(e=a,k=0;k<8;k++){f=m(e)-a;if(y(f)<b)return e;j=(3*i*e+2*h)*e+g;if(y(j)<1e-6)break;e=e-f/j}c=0,d=1,e=a;if(e<c)return c;if(e>d)return d;while(c<d){f=m(e);if(y(f-a)<b)return e;a>f?c=e:d=e,e=(d-c)/2+c}return e}function n(a,b){var c=o(a,b);return((l*c+k)*c+j)*c}function m(a){return((i*a+h)*a+g)*a}var g=3*b,h=3*(d-b)-g,i=1-g-h,j=3*c,k=3*(e-c)-j,l=1-j-k;return n(a,1/(200*f))}function cM(){return this.x+p+this.y+p+this.width+"×"+this.height}function cL(){return this.x+p+this.y}function bP(a,b,c,d,e,f){a!=null?this.m=[[a,c,e],[b,d,f],[0,0,1]]:this.m=[[1,0,0],[0,1,0],[0,0,1]]}function bs(a,b){var c=g.doc.createElement("img");c.style.cssText="position:absolute;left:-9999em;top-9999em",c.onload=function(){b.call(this),this.onload=null,g.doc.body.removeChild(this)},c.onerror=function(){g.doc.body.removeChild(this)},g.doc.body.appendChild(c),c.src=a}function br(a,b,c){function d(){var e=Array.prototype.slice.call(arguments,0),g=e.join("␀"),h=d.cache=d.cache||{},i=d.count=d.count||[];if(h[f](g))return c?c(h[g]):h[g];i.length>=1e3&&delete h[i.shift()],i.push(g),h[g]=a[l](b,e);return c?c(h[g]):h[g]}return d}function a(b){if(a.is(b,"function"))return dc.on("DOMload",b);if(a.is(b,D)){var d=b,e=cl[l](a,d.splice(0,3+a.is(d[0],B))),g=e.set(),h=0,i=d.length,j;for(;h<i;h++)j=d[h]||{},c[f](j.type)&&g.push(e[j.type]().attr(j));return g}return cl[l](a,arguments)}a.version="2.0.0";var b=/[, ]+/,c={circle:1,rect:1,path:1,ellipse:1,text:1,image:1},d=/\{(\d+)\}/g,e="prototype",f="hasOwnProperty",g={doc:document,win:window},h={was:Object.prototype[f].call(g.win,"Raphael"),is:g.win.Raphael},i=function(){},j,k="appendChild",l="apply",m="concat",n="createTouch"in g.doc,o="",p=" ",q=String,r="split",s="click dblclick mousedown mousemove mouseout mouseover mouseup touchstart touchmove touchend orientationchange touchcancel gesturestart gesturechange gestureend".split(p),t={mousedown:"touchstart",mousemove:"touchmove",mouseup:"touchend"},u=q.prototype.toLowerCase,v=Math,w=v.max,x=v.min,y=v.abs,z=v.pow,A=v.PI,B="number",C="string",D="array",E="toString",F="fill",G=Object.prototype.toString,H={},I="push",J=/^url\(['"]?([^\)]+?)['"]?\)$/i,K=/^\s*((#[a-f\d]{6})|(#[a-f\d]{3})|rgba?\(\s*([\d\.]+%?\s*,\s*[\d\.]+%?\s*,\s*[\d\.]+(?:%?\s*,\s*[\d\.]+)?)%?\s*\)|hsba?\(\s*([\d\.]+(?:deg|\xb0|%)?\s*,\s*[\d\.]+%?\s*,\s*[\d\.]+(?:%?\s*,\s*[\d\.]+)?)%?\s*\)|hsla?\(\s*([\d\.]+(?:deg|\xb0|%)?\s*,\s*[\d\.]+%?\s*,\s*[\d\.]+(?:%?\s*,\s*[\d\.]+)?)%?\s*\))\s*$/i,L={NaN:1,Infinity:1,"-Infinity":1},M=/^(?:cubic-)?bezier\(([^,]+),([^,]+),([^,]+),([^\)]+)\)/,N=v.round,O="setAttribute",P=parseFloat,Q=parseInt,R=" progid:DXImageTransform.Microsoft",S=q.prototype.toUpperCase,T={"arrow-end":"none","arrow-start":"none",blur:0,"clip-rect":"0 0 1e9 1e9",cursor:"default",cx:0,cy:0,fill:"#fff","fill-opacity":1,font:'10px "Arial"',"font-family":'"Arial"',"font-size":"10","font-style":"normal","font-weight":400,gradient:0,height:0,href:"http://raphaeljs.com/",opacity:1,path:"M0,0",r:0,rx:0,ry:0,src:"",stroke:"#000","stroke-dasharray":"","stroke-linecap":"butt","stroke-linejoin":"butt","stroke-miterlimit":0,"stroke-opacity":1,"stroke-width":1,target:"_blank","text-anchor":"middle",title:"Raphael",transform:"",width:0,x:0,y:0},U={blur:B,"clip-rect":"csv",cx:B,cy:B,fill:"colour","fill-opacity":B,"font-size":B,height:B,opacity:B,path:"path",r:B,rx:B,ry:B,stroke:"colour","stroke-opacity":B,"stroke-width":B,transform:"transform",width:B,x:B,y:B},V=/\s*,\s*/,W={hs:1,rg:1},X=/,?([achlmqrstvxz]),?/gi,Y=/([achlmqstvz])[\s,]*((-?\d*\.?\d*(?:e[-+]?\d+)?\s*,?\s*)+)/ig,Z=/([rstm])[\s,]*((-?\d*\.?\d*(?:e[-+]?\d+)?\s*,?\s*)+)/ig,$=/(-?\d*\.?\d*(?:e[-+]?\d+)?)\s*,?\s*/ig,_=/^r(?:\(([^,]+?)\s*,\s*([^\)]+?)\))?/,ba=function(a,b){return a.key-b.key},bb=function(a,b){return a-b},bc=function(){},bd=function(a){return a},be=function(a,b,c,d,e){if(e)return[["M",a+e,b],["l",c-e*2,0],["a",e,e,0,0,1,e,e],["l",0,d-e*2],["a",e,e,0,0,1,-e,e],["l",e*2-c,0],["a",e,e,0,0,1,-e,-e],["l",0,e*2-d],["a",e,e,0,0,1,e,-e],["z"]];return[["M",a,b],["l",c,0],["l",0,d],["l",-c,0],["z"]]},bf=function(a,b,c,d){d==null&&(d=c);return[["M",a,b],["m",0,-d],["a",c,d,0,1,1,0,2*d],["a",c,d,0,1,1,0,-2*d],["z"]]},bg={path:function(a){return a.attr("path")},circle:function(a){var b=a.attrs;return bf(b.cx,b.cy,b.r)},ellipse:function(a){var b=a.attrs;return bf(b.cx,b.cy,b.rx,b.ry)},rect:function(a){var b=a.attrs;return be(b.x,b.y,b.width,b.height,b.r)},image:function(a){var b=a.attrs;return be(b.x,b.y,b.width,b.height)},text:function(a){var b=a._getBBox();return be(b.x,b.y,b.width,b.height)}},bh=function(a,b){if(!b)return a;var c,d,e,f,g;a=bC(a);for(e=0,ii=a.length;e<ii;e++){g=a[e];for(f=1,jj=g.length;f<jj;f+=2)c=b.x(g[f],g[f+1]),d=b.y(g[f],g[f+1]),g[f]=c,g[f+1]=d}return a};a.type=g.win.SVGAngle||g.doc.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#BasicStructure","1.1")?"SVG":"VML";if(a.type=="VML"){var bi=g.doc.createElement("div"),bj;bi.innerHTML='<v:shape adj="1"/>',bj=bi.firstChild,bj.style.behavior="url(#default#VML)";if(!bj||typeof bj.adj!="object")return a.type=o;bi=null}a.svg=!(a.vml=a.type=="VML"),j=i.prototype=a.prototype,j.customAttributes={},a._id=0,a._oid=0,a.fn={},a.is=function(a,b){b=u.call(b);if(b=="finite")return!L[f](+a);return b=="null"&&a===null||b==typeof a||b=="object"&&a===Object(a)||b=="array"&&Array.isArray&&Array.isArray(a)||G.call(a).slice(8,-1).toLowerCase()==b},a.angle=function(b,c,d,e,f,g){if(f==null){var h=b-d,i=c-e;if(!h&&!i)return 0;return(180+v.atan2(-i,-h)*180/A+360)%360}return a.angle(b,c,f,g)-a.angle(d,e,f,g)},a.rad=function(a){return a%360*A/180},a.deg=function(a){return a*180/A%360},a.snapTo=function(b,c,d){d=a.is(d,"finite")?d:10;if(a.is(b,D)){var e=b.length;while(e--)if(y(b[e]-c)<=d)return b[e]}else{b=+b;var f=c%b;if(f<d)return c-f;if(f>b-d)return c-f+b}return c};var bk=function(a,b){return function(){return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(a,b).toUpperCase()}}(/[xy]/g,function(a){var b=v.random()*16|0,c=a=="x"?b:b&3|8;return c.toString(16)});a.setWindow=function(b){dc("setWindow",a,g.win,b),g.win=b,g.doc=g.win.document,cz&&cz(g.win)};var bl=function(b){if(a.vml){var c=/^\s+|\s+$/g,d;try{var e=new ActiveXObject("htmlfile");e.write("<body>"),e.close(),d=e.body}catch(f){d=createPopup().document.body}var h=d.createTextRange();bl=br(function(a){try{d.style.color=q(a).replace(c,o);var b=h.queryCommandValue("ForeColor");b=(b&255)<<16|b&65280|(b&16711680)>>>16;return"#"+("000000"+b.toString(16)).slice(-6)}catch(e){return"none"}})}else{var i=g.doc.createElement("i");i.title="Raphaël Colour Picker",i.style.display="none",g.doc.body.appendChild(i),bl=br(function(a){i.style.color=a;return g.doc.defaultView.getComputedStyle(i,o).getPropertyValue("color")})}return bl(b)},bm=function(){return"hsb("+[this.h,this.s,this.b]+")"},bn=function(){return"hsl("+[this.h,this.s,this.l]+")"},bo=function(){return this.hex},bp=function(b,c,d){c==null&&a.is(b,"object")&&"r"in b&&"g"in b&&"b"in b&&(d=b.b,c=b.g,b=b.r);if(c==null&&a.is(b,C)){var e=a.getRGB(b);b=e.r,c=e.g,d=e.b}if(b>1||c>1||d>1)b/=255,c/=255,d/=255;return[b,c,d]},bq=function(b,c,d,e){b*=255,c*=255,d*=255;var f={r:b,g:c,b:d,hex:a.rgb(b,c,d),toString:bo};a.is(e,"finite")&&(f.opacity=e);return f};a.hsb2rgb=function(a,b,c,d){this.is(a,"object")&&"h"in a&&"s"in a&&"b"in a&&(c=a.b,b=a.s,a=a.h,d=a.o),a*=360;var e,f,g,h,i;a=a%360/60,i=c*b,h=i*(1-y(a%2-1)),e=f=g=c-i,a=~~a,e+=[i,h,0,0,h,i][a],f+=[h,i,i,h,0,0][a],g+=[0,0,h,i,i,h][a];return bq(e,f,g,d)},a.hsl2rgb=function(a,b,c,d){this.is(a,"object")&&"h"in a&&"s"in a&&"l"in a&&(c=a.l,b=a.s,a=a.h);if(a>1||b>1||c>1)a/=360,b/=100,c/=100;a*=360;var e,f,g,h,i;a=a%360/60,i=2*b*(c<.5?c:1-c),h=i*(1-y(a%2-1)),e=f=g=c-i/2,a=~~a,e+=[i,h,0,0,h,i][a],f+=[h,i,i,h,0,0][a],g+=[0,0,h,i,i,h][a];return bq(e,f,g,d)},a.rgb2hsb=function(a,b,c){c=bp(a,b,c),a=c[0],b=c[1],c=c[2];var d,e,f,g;f=w(a,b,c),g=f-x(a,b,c),d=g==0?null:f==a?(b-c)/g:f==b?(c-a)/g+2:(a-b)/g+4,d=d%6*60,e=g==0?0:g/f;return{h:d,s:e,b:f,toString:bm}},a.rgb2hsl=function(a,b,c){c=bp(a,b,c),a=c[0],b=c[1],c=c[2];var d,e,f,g,h,i;g=w(a,b,c),h=x(a,b,c),i=g-h,d=i==0?null:g==a?(b-c)/i:g==b?(c-a)/i+2:(a-b)/i+4,d=d%6*60,f=(g+h)/2,e=i==0?0:f<.5?i/(2*f):i/(2-2*f);return{h:d,s:e,l:f,toString:bn}},a._path2string=function(){return this.join(",").replace(X,"$1")},a.getRGB=br(function(b){if(!b||!!((b=q(b)).indexOf("-")+1))return{r:-1,g:-1,b:-1,hex:"none",error:1};if(b=="none")return{r:-1,g:-1,b:-1,hex:"none"};!W[f](b.toLowerCase().substring(0,2))&&b.charAt()!="#"&&(b=bl(b));var c,d,e,g,h,i,j,k=b.match(K);if(k){k[2]&&(g=Q(k[2].substring(5),16),e=Q(k[2].substring(3,5),16),d=Q(k[2].substring(1,3),16)),k[3]&&(g=Q((i=k[3].charAt(3))+i,16),e=Q((i=k[3].charAt(2))+i,16),d=Q((i=k[3].charAt(1))+i,16)),k[4]&&(j=k[4].split(V),d=P(j[0]),j[0].slice(-1)=="%"&&(d*=2.55),e=P(j[1]),j[1].slice(-1)=="%"&&(e*=2.55),g=P(j[2]),j[2].slice(-1)=="%"&&(g*=2.55),k[1].toLowerCase().slice(0,4)=="rgba"&&(h=P(j[3])),j[3]&&j[3].slice(-1)=="%"&&(h/=100));if(k[5]){j=k[5].split(V),d=P(j[0]),j[0].slice(-1)=="%"&&(d*=2.55),e=P(j[1]),j[1].slice(-1)=="%"&&(e*=2.55),g=P(j[2]),j[2].slice(-1)=="%"&&(g*=2.55),(j[0].slice(-3)=="deg"||j[0].slice(-1)=="°")&&(d/=360),k[1].toLowerCase().slice(0,4)=="hsba"&&(h=P(j[3])),j[3]&&j[3].slice(-1)=="%"&&(h/=100);return a.hsb2rgb(d,e,g,h)}if(k[6]){j=k[6].split(V),d=P(j[0]),j[0].slice(-1)=="%"&&(d*=2.55),e=P(j[1]),j[1].slice(-1)=="%"&&(e*=2.55),g=P(j[2]),j[2].slice(-1)=="%"&&(g*=2.55),(j[0].slice(-3)=="deg"||j[0].slice(-1)=="°")&&(d/=360),k[1].toLowerCase().slice(0,4)=="hsla"&&(h=P(j[3])),j[3]&&j[3].slice(-1)=="%"&&(h/=100);return a.hsl2rgb(d,e,g,h)}k={r:d,g:e,b:g},k.hex="#"+(16777216|g|e<<8|d<<16).toString(16).slice(1),a.is(h,"finite")&&(k.opacity=h);return k}return{r:-1,g:-1,b:-1,hex:"none",error:1}},a),a.hsb=br(function(b,c,d){return a.hsb2rgb(b,c,d).hex}),a.hsl=br(function(b,c,d){return a.hsl2rgb(b,c,d).hex}),a.rgb=br(function(a,b,c){return"#"+(16777216|c|b<<8|a<<16).toString(16).slice(1)}),a.getColor=function(a){var b=this.getColor.start=this.getColor.start||{h:0,s:1,b:a||.75},c=this.hsb2rgb(b.h,b.s,b.b);b.h+=.075,b.h>1&&(b.h=0,b.s-=.2,b.s<=0&&(this.getColor.start={h:0,s:1,b:b.b}));return c.hex},a.getColor.reset=function(){delete this.start},a.parsePathString=br(function(b){if(!b)return null;var c={a:7,c:6,h:1,l:2,m:2,q:4,s:4,t:2,v:1,z:0},d=[];a.is(b,D)&&a.is(b[0],D)&&(d=bu(b)),d.length||q(b).replace(Y,function(a,b,e){var f=[],g=u.call(b);e.replace($,function(a,b){b&&f.push(+b)}),g=="m"&&f.length>2&&(d.push([b][m](f.splice(0,2))),g="l",b=b=="m"?"l":"L");while(f.length>=c[g]){d.push([b][m](f.splice(0,c[g])));if(!c[g])break}}),d.toString=a._path2string;return d}),a.parseTransformString=br(function(b){if(!b)return null;var c={r:3,s:4,t:2,m:6},d=[];a.is(b,D)&&a.is(b[0],D)&&(d=bu(b)),d.length||q(b).replace(Z,function(a,b,c){var e=[],f=u.call(b);c.replace($,function(a,b){b&&e.push(+b)}),d.push([f][m](e))}),d.toString=a._path2string;return d}),a.findDotsAtSegment=function(a,b,c,d,e,f,g,h,i){var j=1-i,k=z(j,3)*a+z(j,2)*3*i*c+j*3*i*i*e+z(i,3)*g,l=z(j,3)*b+z(j,2)*3*i*d+j*3*i*i*f+z(i,3)*h,m=a+2*i*(c-a)+i*i*(e-2*c+a),n=b+2*i*(d-b)+i*i*(f-2*d+b),o=c+2*i*(e-c)+i*i*(g-2*e+c),p=d+2*i*(f-d)+i*i*(h-2*f+d),q=(1-i)*a+i*c,r=(1-i)*b+i*d,s=(1-i)*e+i*g,t=(1-i)*f+i*h,u=90-v.atan2(m-o,n-p)*180/A;(m>o||n<p)&&(u+=180);return{x:k,y:l,m:{x:m,y:n},n:{x:o,y:p},start:{x:q,y:r},end:{x:s,y:t},alpha:u}};var bt=br(function(a){if(!a)return{x:0,y:0,width:0,height:0};a=bC(a);var b=0,c=0,d=[],e=[],f;for(var g=0,h=a.length;g<h;g++){f=a[g];if(f[0]=="M")b=f[1],c=f[2],d.push(b),e.push(c);else{var i=bB(b,c,f[1],f[2],f[3],f[4],f[5],f[6]);d=d[m](i.min.x,i.max.x),e=e[m](i.min.y,i.max.y),b=f[5],c=f[6]}}var j=x[l](0,d),k=x[l](0,e);return{x:j,y:k,width:w[l](0,d)-j,height:w[l](0,e)-k}}),bu=function(b){var c=[];if(!a.is(b,D)||!a.is(b&&b[0],D))b=a.parsePathString(b);for(var d=0,e=b.length;d<e;d++){c[d]=[];for(var f=0,g=b[d].length;f<g;f++)c[d][f]=b[d][f]}c.toString=a._path2string;return c},bv=br(function(b){if(!a.is(b,D)||!a.is(b&&b[0],D))b=a.parsePathString(b);var c=[],d=0,e=0,f=0,g=0,h=0;b[0][0]=="M"&&(d=b[0][1],e=b[0][2],f=d,g=e,h++,c.push(["M",d,e]));for(var i=h,j=b.length;i<j;i++){var k=c[i]=[],l=b[i];if(l[0]!=u.call(l[0])){k[0]=u.call(l[0]);switch(k[0]){case"a":k[1]=l[1],k[2]=l[2],k[3]=l[3],k[4]=l[4],k[5]=l[5],k[6]=+(l[6]-d).toFixed(3),k[7]=+(l[7]-e).toFixed(3);break;case"v":k[1]=+(l[1]-e).toFixed(3);break;case"m":f=l[1],g=l[2];default:for(var m=1,n=l.length;m<n;m++)k[m]=+(l[m]-(m%2?d:e)).toFixed(3)}}else{k=c[i]=[],l[0]=="m"&&(f=l[1]+d,g=l[2]+e);for(var o=0,p=l.length;o<p;o++)c[i][o]=l[o]}var q=c[i].length;switch(c[i][0]){case"z":d=f,e=g;break;case"h":d+=+c[i][q-1];break;case"v":e+=+c[i][q-1];break;default:d+=+c[i][q-2],e+=+c[i][q-1]}}c.toString=a._path2string;return c},0,bu),bw=br(function(b){if(!a.is(b,D)||!a.is(b&&b[0],D))b=a.parsePathString(b);var c=[],d=0,e=0,f=0,g=0,h=0;b[0][0]=="M"&&(d=+b[0][1],e=+b[0][2],f=d,g=e,h++,c[0]=["M",d,e]);for(var i=h,j=b.length;i<j;i++){var k=c[i]=[],l=b[i];if(l[0]!=S.call(l[0])){k[0]=S.call(l[0]);switch(k[0]){case"A":k[1]=l[1],k[2]=l[2],k[3]=l[3],k[4]=l[4],k[5]=l[5],k[6]=+(l[6]+d),k[7]=+(l[7]+e);break;case"V":k[1]=+l[1]+e;break;case"H":k[1]=+l[1]+d;break;case"M":f=+l[1]+d,g=+l[2]+e;default:for(var m=1,n=l.length;m<n;m++)k[m]=+l[m]+(m%2?d:e)}}else for(var o=0,p=l.length;o<p;o++)c[i][o]=l[o];switch(k[0]){case"Z":d=f,e=g;break;case"H":d=k[1];break;case"V":e=k[1];break;case"M":f=c[i][c[i].length-2],g=c[i][c[i].length-1];default:d=c[i][c[i].length-2],e=c[i][c[i].length-1]}}c.toString=a._path2string;return c},null,bu),bx=function(a,b,c,d){return[a,b,c,d,c,d]},by=function(a,b,c,d,e,f){var g=1/3,h=2/3;return[g*a+h*c,g*b+h*d,g*e+h*c,g*f+h*d,e,f]},bz=function(a,b,c,d,e,f,g,h,i,j){var k=A*120/180,l=A/180*(+e||0),n=[],o,p=br(function(a,b,c){var d=a*v.cos(c)-b*v.sin(c),e=a*v.sin(c)+b*v.cos(c);return{x:d,y:e}});if(!j){o=p(a,b,-l),a=o.x,b=o.y,o=p(h,i,-l),h=o.x,i=o.y;var q=v.cos(A/180*e),r=v.sin(A/180*e),s=(a-h)/2,t=(b-i)/2,u=s*s/(c*c)+t*t/(d*d);u>1&&(u=v.sqrt(u),c=u*c,d=u*d);var w=c*c,x=d*d,z=(f==g?-1:1)*v.sqrt(y((w*x-w*t*t-x*s*s)/(w*t*t+x*s*s))),B=z*c*t/d+(a+h)/2,C=z*-d*s/c+(b+i)/2,D=v.asin(((b-C)/d).toFixed(9)),E=v.asin(((i-C)/d).toFixed(9));D=a<B?A-D:D,E=h<B?A-E:E,D<0&&(D=A*2+D),E<0&&(E=A*2+E),g&&D>E&&(D=D-A*2),!g&&E>D&&(E=E-A*2)}else D=j[0],E=j[1],B=j[2],C=j[3];var F=E-D;if(y(F)>k){var G=E,H=h,I=i;E=D+k*(g&&E>D?1:-1),h=B+c*v.cos(E),i=C+d*v.sin(E),n=bz(h,i,c,d,e,0,g,H,I,[E,G,B,C])}F=E-D;var J=v.cos(D),K=v.sin(D),L=v.cos(E),M=v.sin(E),N=v.tan(F/4),O=4/3*c*N,P=4/3*d*N,Q=[a,b],R=[a+O*K,b-P*J],S=[h+O*M,i-P*L],T=[h,i];R[0]=2*Q[0]-R[0],R[1]=2*Q[1]-R[1];if(j)return[R,S,T][m](n);n=[R,S,T][m](n).join().split(",");var U=[];for(var V=0,W=n.length;V<W;V++)U[V]=V%2?p(n[V-1],n[V],l).y:p(n[V],n[V+1],l).x;return U},bA=function(a,b,c,d,e,f,g,h,i){var j=1-i;return{x:z(j,3)*a+z(j,2)*3*i*c+j*3*i*i*e+z(i,3)*g,y:z(j,3)*b+z(j,2)*3*i*d+j*3*i*i*f+z(i,3)*h}},bB=br(function(a,b,c,d,e,f,g,h){var i=e-2*c+a-(g-2*e+c),j=2*(c-a)-2*(e-c),k=a-c,m=(-j+v.sqrt(j*j-4*i*k))/2/i,n=(-j-v.sqrt(j*j-4*i*k))/2/i,o=[b,h],p=[a,g],q;y(m)>"1e12"&&(m=.5),y(n)>"1e12"&&(n=.5),m>0&&m<1&&(q=bA(a,b,c,d,e,f,g,h,m),p.push(q.x),o.push(q.y)),n>0&&n<1&&(q=bA(a,b,c,d,e,f,g,h,n),p.push(q.x),o.push(q.y)),i=f-2*d+b-(h-2*f+d),j=2*(d-b)-2*(f-d),k=b-d,m=(-j+v.sqrt(j*j-4*i*k))/2/i,n=(-j-v.sqrt(j*j-4*i*k))/2/i,y(m)>"1e12"&&(m=.5),y(n)>"1e12"&&(n=.5),m>0&&m<1&&(q=bA(a,b,c,d,e,f,g,h,m),p.push(q.x),o.push(q.y)),n>0&&n<1&&(q=bA(a,b,c,d,e,f,g,h,n),p.push(q.x),o.push(q.y));return{min:{x:x[l](0,p),y:x[l](0,o)},max:{x:w[l](0,p),y:w[l](0,o)}}}),bC=br(function(a,b){var c=bw(a),d=b&&bw(b),e={x:0,y:0,bx:0,by:0,X:0,Y:0,qx:null,qy:null},f={x:0,y:0,bx:0,by:0,X:0,Y:0,qx:null,qy:null},g=function(a,b){var c,d;if(!a)return["C",b.x,b.y,b.x,b.y,b.x,b.y];!(a[0]in{T:1,Q:1})&&(b.qx=b.qy=null);switch(a[0]){case"M":b.X=a[1],b.Y=a[2];break;case"A":a=["C"][m](bz[l](0,[b.x,b.y][m](a.slice(1))));break;case"S":c=b.x+(b.x-(b.bx||b.x)),d=b.y+(b.y-(b.by||b.y)),a=["C",c,d][m](a.slice(1));break;case"T":b.qx=b.x+(b.x-(b.qx||b.x)),b.qy=b.y+(b.y-(b.qy||b.y)),a=["C"][m](by(b.x,b.y,b.qx,b.qy,a[1],a[2]));break;case"Q":b.qx=a[1],b.qy=a[2],a=["C"][m](by(b.x,b.y,a[1],a[2],a[3],a[4]));break;case"L":a=["C"][m](bx(b.x,b.y,a[1],a[2]));break;case"H":a=["C"][m](bx(b.x,b.y,a[1],b.y));break;case"V":a=["C"][m](bx(b.x,b.y,b.x,a[1]));break;case"Z":a=["C"][m](bx(b.x,b.y,b.X,b.Y))}return a},h=function(a,b){if(a[b].length>7){a[b].shift();var e=a[b];while(e.length)a.splice(b++,0,["C"][m](e.splice(0,6)));a.splice(b,1),k=w(c.length,d&&d.length||0)}},i=function(a,b,e,f,g){a&&b&&a[g][0]=="M"&&b[g][0]!="M"&&(b.splice(g,0,["M",f.x,f.y]),e.bx=0,e.by=0,e.x=a[g][1],e.y=a[g][2],k=w(c.length,d&&d.length||0))};for(var j=0,k=w(c.length,d&&d.length||0);j<k;j++){c[j]=g(c[j],e),h(c,j),d&&(d[j]=g(d[j],f)),d&&h(d,j),i(c,d,e,f,j),i(d,c,f,e,j);var n=c[j],o=d&&d[j],p=n.length,q=d&&o.length;e.x=n[p-2],e.y=n[p-1],e.bx=P(n[p-4])||e.x,e.by=P(n[p-3])||e.y,f.bx=d&&(P(o[q-4])||f.x),f.by=d&&(P(o[q-3])||f.y),f.x=d&&o[q-2],f.y=d&&o[q-1]}return d?[c,d]:c},null,bu),bD=br(function(b){var c=[];for(var d=0,e=b.length;d<e;d++){var f={},g=b[d].match(/^([^:]*):?([\d\.]*)/);f.color=a.getRGB(g[1]);if(f.color.error)return null;f.color=f.color.hex,g[2]&&(f.offset=g[2]+"%"),c.push(f)}for(d=1,e=c.length-1;d<e;d++)if(!c[d].offset){var h=P(c[d-1].offset||0),i=0;for(var j=d+1;j<e;j++)if(c[j].offset){i=c[j].offset;break}i||(i=100,j=e),i=P(i);var k=(i-h)/(j-d+1);for(;d<j;d++)h+=k,c[d].offset=h+"%"}return c}),bE=function(b,c,d,e){var f;f=e==null&&!a.is(b,"object")?g.doc.getElementById(b):b;if(f!=null){if(f.tagName)return c==null?{container:f,width:f.style.pixelWidth||f.offsetWidth,height:f.style.pixelHeight||f.offsetHeight}:{container:f,width:c,height:d};return{container:1,x:b,y:c,width:d,height:e}}},bF=function(a,b){var c=this;for(var d in b)if(b[f](d)&&!(d in a))switch(typeof b[d]){case"function":(function(b){a[d]=a===c?b:function(){return b[l](c,arguments)}})(b[d]);break;case"object":a[d]=a[d]||{},bF.call(this,a[d],b[d]);break;default:a[d]=b[d]}},bG=function(a,b){a==b.top&&(b.top=a.prev),a==b.bottom&&(b.bottom=a.next),a.next&&(a.next.prev=a.prev),a.prev&&(a.prev.next=a.next)},bH=function(a,b){b.top!==a&&(bG(a,b),a.next=null,a.prev=b.top,b.top.next=a,b.top=a)},bI=function(a,b){b.bottom!==a&&(bG(a,b),a.next=b.bottom,a.prev=null,b.bottom.prev=a,b.bottom=a)},bJ=function(a,b,c){bG(a,c),b==c.top&&(c.top=a),b.next&&(b.next.prev=a),a.next=b.next,a.prev=b,b.next=a},bK=function(a,b,c){bG(a,c),b==c.bottom&&(c.bottom=a),b.prev&&(b.prev.next=a),a.prev=b.prev,b.prev=a,a.next=b},bL=function(a){return function(){throw new Error("Raphaël: you are calling to method “"+a+"” of removed object")}},bM=function(b,c){if(c==null)return b._.transform;c=q(c).replace(/\.{3}|\u2026/g,b._.transform||o);var d=a.parseTransformString(c),e=0,f=0,g=0,h=1,i=1,j=b._,k=new bP;j.transform=d||[];if(d)for(var l=0,m=d.length;l<m;l++){var n=d[l],p=n.length,r;n[0]=q(n[0]).toLowerCase(),n[0]=="t"&&p==3?k.translate(n[1],n[2]):n[0]=="r"?p==2?(r=r||b.getBBox(1),k.rotate(n[1],r.x+r.width/2,r.y+r.height/2),e+=n[1]):p==4&&(k.rotate(n[1],n[2],n[3]),e+=n[1]):n[0]=="s"?p==2||p==3?(r=r||b.getBBox(1),k.scale(n[1],n[p-1],r.x+r.width/2,r.y+r.height/2),h*=n[1],i*=n[p-1]):p==5&&(k.scale(n[1],n[2],n[3],n[4]),h*=n[1],i*=n[2]):n[0]=="m"&&p==7&&k.add(n[1],n[2],n[3],n[4],n[5],n[6]),j.dirtyT=1,b.matrix=k}b.matrix=k,j.sx=h,j.sy=i,j.deg=e,j.dx=f=k.m[0][2],j.dy=g=k.m[1][2],h==1&&i==1&&!e&&j.bbox?(j.bbox.x+=+f,j.bbox.y+=+g):j.dirtyT=1},bN=function(a){switch(a[0]){case"t":return["t",0,0];case"m":return["m",1,0,0,1,0,0];case"r":return a.length==4?["r",0,a[2],a[3]]:["r",0];case"s":return a.length==5?["s",1,1,a[3],a[4]]:a.length==3?["s",1,1]:["s",1]}},bO=function(b,c){b=a.parseTransformString(b)||[],c=a.parseTransformString(c)||[];var d=w(b.length,c.length),e=[],f=[],g=0,h,i,j,k;for(;g<d;g++){j=b[g]||bN(c[g]),k=c[g]||bN(j);if(j[0]!=k[0]||j[0]=="r"&&(j[2]!=k[2]||j[3]!=k[3])||j[0]=="s"&&(j[3]!=k[3]||j[4]!=k[4]))return;e[g]=[],f[g]=[];for(h=0,i=w(j.length,k.length);h<i;h++)h in j&&(e[g][h]=j[h]),h in k&&(f[g][h]=k[h])}return{from:e,to:f}};a.pathToRelative=bv,a.path2curve=bC;var bQ=bP.prototype;bQ.add=function(a,b,c,d,e,f){var g=[[],[],[]],h=[[a,c,e],[b,d,f],[0,0,1]],i,j,k,l;for(i=0;i<3;i++)for(j=0;j<3;j++){l=0;for(k=0;k<3;k++)l+=this.m[i][k]*h[k][j];g[i][j]=l}this.m=g},bQ.invert=function(){var a=this.m[0][0],b=this.m[1][0],c=this.m[0][1],d=this.m[1][1],e=this.m[0][2],f=this.m[1][2],g=a*d-b*c;return new bP(d/g,-b/g,-c/g,a/g,(c*f-d*e)/g,(b*e-a*f)/g)},bQ.clone=function(){var a=this.m[0][0],b=this.m[1][0],c=this.m[0][1],d=this.m[1][1],e=this.m[0][2],f=this.m[1][2];return new bP(a,b,c,d,e,f)},bQ.translate=function(a,b){this.add(1,0,0,1,a,b)},bQ.scale=function(a,b,c,d){b==null&&(b=a),this.add(1,0,0,1,c,d),this.add(a,0,0,b,0,0),this.add(1,0,0,1,-c,-d)},bQ.rotate=function(b,c,d){b=a.rad(b);var e=+v.cos(b).toFixed(9),f=+v.sin(b).toFixed(9);this.add(e,f,-f,e,c,d),this.add(1,0,0,1,-c,-d)},bQ.x=function(a,b){return a*this.m[0][0]+b*this.m[0][1]+this.m[0][2]},bQ.y=function(a,b){return a*this.m[1][0]+b*this.m[1][1]+this.m[1][2]},bQ.get=function(a,b){return+this.m[a][b].toFixed(4)},bQ.toString=function(){return a.svg?"matrix("+[this.get(0,0),this.get(1,0),this.get(0,1),this.get(1,1),this.get(0,2),this.get(1,2)].join()+")":[this.get(0,0),this.get(0,1),this.get(1,0),this.get(1,1),0,0].join()},bQ.toFilter=function(){return"progid:DXImageTransform.Microsoft.Matrix(M11="+this.get(0,0)+", M12="+this.get(0,1)+", M21="+this.get(1,0)+", M22="+this.get(1,1)+", Dx="+this.get(0,2)+", Dy="+this.get(1,2)+", sizingmedthod='auto expand')"},bQ.offset=function(){return[this.m[0][2].toFixed(4),this.m[1][2].toFixed(4)]},a.Matrix=bP;if(a.svg){var bR="http://www.w3.org/1999/xlink",bS={block:"M5,0 0,2.5 5,5z",classic:"M5,0 0,2.5 5,5 3.5,3 3.5,2z",diamond:"M2.5,0 5,2.5 2.5,5 0,2.5z",open:"M6,1 1,3.5 6,6",oval:"M2.5,0A2.5,2.5,0,0,1,2.5,5 2.5,2.5,0,0,1,2.5,0z"},bT={};a.toString=function(){return"Your browser supports SVG.\nYou are running Raphaël "+this.version};var bU=function(a,b){if(b){typeof a=="string"&&(a=bU(a));for(var c in b)b[f](c)&&(c.substring(0,6)=="xlink:"?a.setAttributeNS(bR,c.substring(6),q(b[c])):a[O](c,q(b[c])))}else a=g.doc.createElementNS("http://www.w3.org/2000/svg",a),a.style&&(a.style.webkitTapHighlightColor="rgba(0,0,0,0)");return a},bV=function(a,b){var c=bU("path");b.canvas&&b.canvas.appendChild(c);var d=new cd(c,b);d.type="path",ca(d,{fill:"none",stroke:"#000",path:a});return d},bW={},bX=/^url\(#(.*)\)$/,bY=function(a,b){var c=a.getAttribute(F);c=c&&c.match(bX),c&&!--bW[c[1]]&&(delete bW[c[1]],b.defs.removeChild(g.doc.getElementById(c[1])))},bZ=function(b,c){var d="linear",e=b.id+c,f=.5,h=.5,i=b.node,j=b.paper,k=i.style,l=g.doc.getElementById(e);if(!l){c=q(c).replace(_,function(a,b,c){d="radial";if(b&&c){f=P(b),h=P(c);var e=(h>.5)*2-1;z(f-.5,2)+z(h-.5,2)>.25&&(h=v.sqrt(.25-z(f-.5,2))*e+.5)&&h!=.5&&(h=h.toFixed(5)-1e-5*e)}return o}),c=c.split(/\s*\-\s*/);if(d=="linear"){var m=c.shift();m=-P(m);if(isNaN(m))return null;var n=[0,0,v.cos(a.rad(m)),v.sin(a.rad(m))],p=1/(w(y(n[2]),y(n[3]))||1);n[2]*=p,n[3]*=p,n[2]<0&&(n[0]=-n[2],n[2]=0),n[3]<0&&(n[1]=-n[3],n[3]=0)}var r=bD(c);if(!r)return null;b.gradient&&(j.defs.removeChild(b.gradient),delete b.gradient),l=bU(d+"Gradient",{id:e}),b.gradient=l,bU(l,d=="radial"?{fx:f,fy:h}:{x1:n[0],y1:n[1],x2:n[2],y2:n[3],gradientTransform:b.matrix.invert()}),j.defs.appendChild(l);for(var s=0,t=r.length;s<t;s++)l.appendChild(bU("stop",{offset:r[s].offset?r[s].offset:s?"100%":"0%","stop-color":r[s].color||"#fff"}))}bU(i,{fill:"url(#"+e+")",opacity:1,"fill-opacity":1}),k.fill=o,k.opacity=1,k.fillOpacity=1;return 1},b$=function(a){var b=a.getBBox(1);bU(a.pattern,{patternTransform:a.matrix.invert()+" translate("+b.x+","+b.y+")"})},b_=function(b,c,d){if(b.type=="path"){var e=q(c).toLowerCase().split("-"),h=b.paper,i=d?"end":"start",j=b.node,k=b.attrs,l=k["stroke-width"],m=e.length,n="classic",o,r,s,t,u,v=3,w=3,x=5;while(m--)switch(e[m]){case"block":case"classic":case"oval":case"diamond":case"open":case"none":n=e[m];break;case"wide":w=5;break;case"narrow":w=2;break;case"long":v=5;break;case"short":v=2}n=="open"?(v+=2,w+=2,x+=2,s=1,t=d?4:1,u={fill:"none",stroke:k.stroke}):(t=s=v/2,u={fill:k.stroke,stroke:"none"}),b._.arrows?d?(b._.arrows.endPath&&bT[b._.arrows.endPath]--,b._.arrows.endMarker&&bT[b._.arrows.endMarker]--):(b._.arrows.startPath&&bT[b._.arrows.startPath]--,b._.arrows.startMarker&&bT[b._.arrows.startMarker]--):b._.arrows={};if(n!="none"){var y="raphael-marker-"+n,z="raphael-marker-"+i+n+v+w;g.doc.getElementById(y)?bT[y]++:(h.defs.appendChild(bU(bU("path"),{"stroke-linecap":"round",d:bS[n],id:y})),bT[y]=1);var A=g.doc.getElementById(z),B;A?(bT[z]++,B=A.getElementsByTagName("use")[0]):(A=bU(bU("marker"),{id:z,markerHeight:w,markerWidth:v,orient:"auto",refX:t,refY:w/2}),B=bU(bU("use"),{"xlink:href":"#"+y,transform:(d?" rotate(180 "+v/2+" "+w/2+") ":p)+"scale("+v/x+","+w/x+")","stroke-width":1/((v/x+w/x)/2)}),A.appendChild(B),h.defs.appendChild(A),bT[z]=1),bU(B,u);var C=s*(n!="diamond"&&n!="oval");d?(o=b._.arrows.startdx*l||0,r=a.getTotalLength(k.path)-C*l):(o=C*l,r=a.getTotalLength(k.path)-(b._.arrows.enddx*l||0)),u={},u["marker-"+i]="url(#"+z+")";if(r||o)u.d=Raphael.getSubpath(k.path,o,r);bU(j,u),b._.arrows[i+"Path"]=y,b._.arrows[i+"Marker"]=z,b._.arrows[i+"dx"]=C,b._.arrows[i+"Type"]=n,b._.arrows[i+"String"]=c}else d?(o=b._.arrows.startdx*l||0,r=a.getTotalLength(k.path)-o):(o=0,r=a.getTotalLength(k.path)-(b._.arrows.enddx*l||0)),b._.arrows[i+"Path"]&&bU(j,{d:Raphael.getSubpath(k.path,o,r)}),delete b._.arrows[i+"Path"],delete b._.arrows[i+"Marker"],delete b._.arrows[i+"dx"],delete b._.arrows[i+"Type"],delete b._.arrows[i+"String"];for(u in bT)if(bT[f](u)&&!bT[u]){var D=g.doc.getElementById(u);D&&D.parentNode.removeChild(D)}}},ca=function(c,d){var e={"":[0],none:[0],"-":[3,1],".":[1,1],"-.":[3,1,1,1],"-..":[3,1,1,1,1,1],". ":[1,3],"- ":[4,3],"--":[8,3],"- .":[4,3,1,3],"--.":[8,3,1,3],"--..":[8,3,1,3,1,3]},h=c.node,i=c.attrs,j=function(a,b){b=e[u.call(b)];if(b){var c=a.attrs["stroke-width"]||"1",f=({round:c,square:c,butt:0})[a.attrs["stroke-linecap"]||d["stroke-linecap"]]||0,g=[],i=b.length;while(i--)g[i]=b[i]*c+(i%2?1:-1)*f;bU(h,{"stroke-dasharray":g.join(",")})}};for(var k in d)if(d[f](k)){if(!T[f](k))continue;var l=d[k];i[k]=l;switch(k){case"blur":c.blur(l);break;case"href":case"title":case"target":var m=h.parentNode;if(u.call(m.tagName)!="a"){var n=bU("a");m.insertBefore(n,h),n.appendChild(h),m=n}k=="target"&&l=="blank"?m.setAttributeNS(bR,"show","new"):m.setAttributeNS(bR,k,l);break;case"cursor":h.style.cursor=l;break;case"transform":c.transform(l);break;case"arrow-start":b_(c,l);break;case"arrow-end":b_(c,l,1);break;case"clip-rect":var p=q(l).split(b);if(p.length==4){c.clip&&c.clip.parentNode.parentNode.removeChild(c.clip.parentNode);var r=bU("clipPath"),s=bU("rect");r.id=bk(),bU(s,{x:p[0],y:p[1],width:p[2],height:p[3]}),r.appendChild(s),c.paper.defs.appendChild(r),bU(h,{"clip-path":"url(#"+r.id+")"}),c.clip=s}if(!l){var t=g.doc.getElementById(h.getAttribute("clip-path").replace(/(^url\(#|\)$)/g,o));t&&t.parentNode.removeChild(t),bU(h,{"clip-path":o}),delete c.clip}break;case"path":c.type=="path"&&(bU(h,{d:l?i.path=bw(l):"M0,0"}),c._.dirty=1,c._.arrows&&("startString"in c._.arrows&&b_(c,c._.arrows.startString),"endString"in c._.arrows&&b_(c,c._.arrows.endString,1)));break;case"width":h[O](k,l),c._.dirty=1;if(i.fx)k="x",l=i.x;else break;case"x":i.fx&&(l=-i.x-(i.width||0));case"rx":if(k=="rx"&&c.type=="rect")break;case"cx":h[O](k,l),c.pattern&&b$(c),c._.dirty=1;break;case"height":h[O](k,l),c._.dirty=1;if(i.fy)k="y",l=i.y;else break;case"y":i.fy&&(l=-i.y-(i.height||0));case"ry":if(k=="ry"&&c.type=="rect")break;case"cy":h[O](k,l),c.pattern&&b$(c),c._.dirty=1;break;case"r":c.type=="rect"?bU(h,{rx:l,ry:l}):h[O](k,l),c._.dirty=1;break;case"src":c.type=="image"&&h.setAttributeNS(bR,"href",l);break;case"stroke-width":if(c._.sx!=1||c._.sy!=1)l/=w(y(c._.sx),y(c._.sy))||1;c.paper._vbSize&&(l*=c.paper._vbSize),h[O](k,l),i["stroke-dasharray"]&&j(c,i["stroke-dasharray"]),c._.arrows&&("startString"in c._.arrows&&b_(c,c._.arrows.startString),"endString"in c._.arrows&&b_(c,c._.arrows.endString,1));break;case"stroke-dasharray":j(c,l);break;case F:var v=q(l).match(J);if(v){r=bU("pattern");var x=bU("image");r.id=bk(),bU(r,{x:0,y:0,patternUnits:"userSpaceOnUse",height:1,width:1}),bU(x,{x:0,y:0,"xlink:href":v[1]}),r.appendChild(x),function(a){bs(v[1],function(){var b=this.offsetWidth,d=this.offsetHeight;bU(a,{width:b,height:d}),bU(x,{width:b,height:d}),c.paper.safari()})}(r),c.paper.defs.appendChild(r),h.style.fill="url(#"+r.id+")",bU(h,{fill:"url(#"+r.id+")"}),c.pattern=r,c.pattern&&b$(c);break}var z=a.getRGB(l);if(!z.error)delete d.gradient,delete i.gradient,!a.is(i.opacity,"undefined")&&a.is(d.opacity,"undefined")&&bU(h,{opacity:i.opacity}),!a.is(i["fill-opacity"],"undefined")&&a.is(d["fill-opacity"],"undefined")&&bU(h,{"fill-opacity":i["fill-opacity"]});else if((c.type=="circle"||c.type=="ellipse"||q(l).charAt()!="r")&&bZ(c,l)){if("opacity"in i||"fill-opacity"in i){var A=g.doc.getElementById(h.getAttribute(F).replace(/^url\(#|\)$/g,o));if(A){var B=A.getElementsByTagName("stop");bU(B[B.length-1],{"stop-opacity":("opacity"in i?i.opacity:1)*("fill-opacity"in i?i["fill-opacity"]:1)})}}i.gradient=l,i.fill="none";break}z[f]("opacity")&&bU(h,{"fill-opacity":z.opacity>1?z.opacity/100:z.opacity});case"stroke":z=a.getRGB(l),h[O](k,z.hex),k=="stroke"&&z[f]("opacity")&&bU(h,{"stroke-opacity":z.opacity>1?z.opacity/100:z.opacity}),k=="stroke"&&c._.arrows&&("startString"in c._.arrows&&b_(c,c._.arrows.startString),"endString"in c._.arrows&&b_(c,c._.arrows.endString,1));break;case"gradient":(c.type=="circle"||c.type=="ellipse"||q(l).charAt()!="r")&&bZ(c,l);break;case"opacity":i.gradient&&!i[f]("stroke-opacity")&&bU(h,{"stroke-opacity":l>1?l/100:l});case"fill-opacity":if(i.gradient){A=g.doc.getElementById(h.getAttribute(F).replace(/^url\(#|\)$/g,o)),A&&(B=A.getElementsByTagName("stop"),bU(B[B.length-1],{"stop-opacity":l}));break};default:k=="font-size"&&(l=Q(l,10)+"px");var C=k.replace(/(\-.)/g,function(a){return S.call(a.substring(1))});h.style[C]=l,c._.dirty=1,h[O](k,l)}}cc(c,d)},cb=1.2,cc=function(b,c){if(b.type=="text"&&!!(c[f]("text")||c[f]("font")||c[f]("font-size")||c[f]("x")||c[f]("y"))){var d=b.attrs,e=b.node,h=e.firstChild?Q(g.doc.defaultView.getComputedStyle(e.firstChild,o).getPropertyValue("font-size"),10):10;if(c[f]("text")){d.text=c.text;while(e.firstChild)e.removeChild(e.firstChild);var i=q(c.text).split("\n"),j=[],k;for(var l=0,m=i.length;l<m;l++)i[l]&&(k=bU("tspan"),l&&bU(k,{dy:h*cb,x:d.x}),k.appendChild(g.doc.createTextNode(i[l])),e.appendChild(k),j[l]=k)}else{j=e.getElementsByTagName("tspan");for(l=0,m=j.length;l<m;l++)l&&bU(j[l],{dy:h*cb,x:d.x})}bU(e,{y:d.y}),b._.dirty=1;var n=b._getBBox(),p=d.y-(n.y+n.height/2);p&&a.is(p,"finite")&&bU(j[0],{dy:d.y+p})}},cd=function(b,c){var d=0,e=0;this[0]=this.node=b,b.raphael=!0,this.id=a._oid++,b.raphaelid=this.id,this.matrix=new bP,this.realPath=null,this.paper=c,this.attrs=this.attrs||{},this._={transform:[],sx:1,sy:1,deg:0,dx:0,dy:0,dirty:1},!c.bottom&&(c.bottom=this),this.prev=c.top,c.top&&(c.top.next=this),c.top=this,this.next=null},ce=cd.prototype;ce.rotate=function(a,c,d){if(this.removed)return this;a=q(a).split(b),a.length-1&&(c=P(a[1]),d=P(a[2])),a=P(a[0]),d==null&&(c=d);if(c==null||d==null){var e=this.getBBox(1);c=e.x+e.width/2,d=e.y+e.height/2}this.transform(this._.transform.concat([["r",a,c,d]]));return this},ce.scale=function(a,c,d,e){if(this.removed)return this;a=q(a).split(b),a.length-1&&(c=P(a[1]),d=P(a[2]),e=P(a[3])),a=P(a[0]),c==null&&(c=a),e==null&&(d=e);if(d==null||e==null)var f=this.getBBox(1);d=d==null?f.x+f.width/2:d,e=e==null?f.y+f.height/2:e,this.transform(this._.transform.concat([["s",a,c,d,e]]));return this},ce.translate=function(a,c){if(this.removed)return this;a=q(a).split(b),a.length-1&&(c=P(a[1])),a=P(a[0])||0,c=+c||0,this.transform(this._.transform.concat([["t",a,c]]));return this},ce.transform=function(a){var b=this._;if(!a)return b.transform;bM(this,a),this.clip&&bU(this.clip,{transform:this.matrix.invert()}),this.pattern&&b$(this),this.node&&bU(this.node,{transform:this.matrix});if(b.sx!=1||b.sy!=1){var c=this.attrs[f]("stroke-width")?this.attrs["stroke-width"]:1;this.attr({"stroke-width":c})}return this},ce.hide=function(){!this.removed&&this.paper.safari(this.node.style.display="none");return this},ce.show=function(){!this.removed&&this.paper.safari(this.node.style.display="");return this},ce.remove=function(){if(!this.removed){dc.unbind("*.*."+this.id),bG(this,this.paper),this.node.parentNode.removeChild(this.node);for(var a in this)delete this[a];this.removed=!0}},ce._getBBox=function(){if(this.node.style.display=="none"){this.show();var a=!0}var b={};try{b=this.node.getBBox()}catch(c){}finally{b=b||{}}a&&this.hide();return b},ce.attr=function(b,c){if(this.removed)return this;if(b==null){var d={};for(var e in this.attrs)this.attrs[f](e)&&(d[e]=this.attrs[e]);d.gradient&&d.fill=="none"&&(d.fill=d.gradient)&&delete d.gradient,d.transform=this._.transform;return d}if(c==null&&a.is(b,C)){if(b==F&&this.attrs.fill=="none"&&this.attrs.gradient)return this.attrs.gradient;if(b=="transform")return this._.transform;return b in this.attrs?this.attrs[b]:a.is(this.paper.customAttributes[b],"function")?this.paper.customAttributes[b].def:T[b]}if(c==null&&a.is(b,D)){var g={};for(var h=0,i=b.length;h<i;h++)g[b[h]]=this.attr(b[h]);return g}if(c!=null){var j={};j[b]=c}else b!=null&&a.is(b,"object")&&(j=b);for(var k in this.paper.customAttributes)if(this.paper.customAttributes[f](k)&&j[f](k)&&a.is(this.paper.customAttributes[k],"function")){var l=this.paper.customAttributes[k].apply(this,[][m](j[k]));this.attrs[k]=j[k];for(var n in l)l[f](n)&&(j[n]=l[n])}ca(this,j);return this},ce.toFront=function(){if(this.removed)return this;this.node.parentNode.appendChild(this.node);var a=this.paper;a.top!=this&&bH(this,a);return this},ce.toBack=function(){if(this.removed)return this;if(this.node.parentNode.firstChild!=this.node){this.node.parentNode.insertBefore(this.node,this.node.parentNode.firstChild),bI(this,this.paper);var a=this.paper}return this},ce.insertAfter=function(a){if(this.removed)return this;var b=a.node||a[a.length-1].node;b.nextSibling?b.parentNode.insertBefore(this.node,b.nextSibling):b.parentNode.appendChild(this.node),bJ(this,a,this.paper);return this},ce.insertBefore=function(a){if(this.removed)return this;var b=a.node||a[0].node;b.parentNode.insertBefore(this.node,b),bK(this,a,this.paper);return this},ce.blur=function(a){var b=this;if(+a!==0){var c=bU("filter"),d=bU("feGaussianBlur");b.attrs.blur=a,c.id=bk(),bU(d,{stdDeviation:+a||1.5}),c.appendChild(d),b.paper.defs.appendChild(c),b._blur=c,bU(b.node,{filter:"url(#"+c.id+")"})}else b._blur&&(b._blur.parentNode.removeChild(b._blur),delete b._blur,delete b.attrs.blur),b.node.removeAttribute("filter")};var cf=function(a,b,c,d){var e=bU("circle");a.canvas&&a.canvas.appendChild(e);var f=new cd(e,a);f.attrs={cx:b,cy:c,r:d,fill:"none",stroke:"#000"},f.type="circle",bU(e,f.attrs);return f},cg=function(a,b,c,d,e,f){var g=bU("rect");a.canvas&&a.canvas.appendChild(g);var h=new cd(g,a);h.attrs={x:b,y:c,width:d,height:e,r:f||0,rx:f||0,ry:f||0,fill:"none",stroke:"#000"},h.type="rect",bU(g,h.attrs);return h},ch=function(a,b,c,d,e){var f=bU("ellipse");a.canvas&&a.canvas.appendChild(f);var g=new cd(f,a);g.attrs={cx:b,cy:c,rx:d,ry:e,fill:"none",stroke:"#000"},g.type="ellipse",bU(f,g.attrs);return g},ci=function(a,b,c,d,e,f){var g=bU("image");bU(g,{x:c,y:d,width:e,height:f,preserveAspectRatio:"none"}),g.setAttributeNS(bR,"href",b),a.canvas&&a.canvas.appendChild(g);var h=new cd(g,a);h.attrs={x:c,y:d,width:e,height:f,src:b},h.type="image";return h},cj=function(a,b,c,d){var e=bU("text");bU(e,{x:b,y:c,"text-anchor":"middle"}),a.canvas&&a.canvas.appendChild(e);var f=new cd(e,a);f.attrs={x:b,y:c,"text-anchor":"middle",text:d,font:T.font,stroke:"none",fill:"#000"},f.type="text",ca(f,f.attrs);return f},ck=function(a,b){this.width=a||this.width,this.height=b||this.height,this.canvas[O]("width",this.width),this.canvas[O]("height",this.height),this._viewBox&&this.setViewBox.apply(this,this._viewBox);return this},cl=function(){var b=bE[l](0,arguments),c=b&&b.container,d=b.x,e=b.y,f=b.width,h=b.height;if(!c)throw new Error("SVG container not found.");var j=bU("svg"),k="overflow:hidden;",m;d=d||0,e=e||0,f=f||512,h=h||342,bU(j,{height:h,version:1.1,width:f,xmlns:"http://www.w3.org/2000/svg"}),c==1?(j.style.cssText=k+"position:absolute;left:"+d+"px;top:"+e+"px",g.doc.body.appendChild(j),m=1):(j.style.cssText=k+"position:relative",c.firstChild?c.insertBefore(j,c.firstChild):c.appendChild(j)),c=new i,c.width=f,c.height=h,c.canvas=j,bF.call(c,c,a.fn),c.clear(),c._left=c._top=0,m&&(c.renderfix=bc),c.renderfix();return c},cm=function(a,b,c,d,e){dc("setViewBox",this,this._viewBox,[a,b,c,d,e]);var f=w(c/this.width,d/this.height),g=this.top,h=e?"meet":"xMinYMin",i,j;a==null?(this._vbSize&&(f=1),delete this._vbSize,i="0 0 "+this.width+p+this.height):(this._vbSize=f,i=a+p+b+p+c+p+d),bU(this.canvas,{viewBox:i,preserveAspectRatio:h});while(f&&g)j="stroke-width"in g.attrs?g.attrs["stroke-width"]:1,g.attr({"stroke-width":j}),g._.dirty=1,g._.dirtyT=1,g=g.prev;this._viewBox=[a,b,c,d,!!e];return this};j.renderfix=function(){var a=this.canvas,b=a.style,c=a.getScreenCTM(),d=-c.e%1,e=-c.f%1;if(d||e)d&&(this._left=(this._left+d)%1,b.left=this._left+"px"),e&&(this._top=(this._top+e)%1,b.top=this._top+"px")},j.clear=function(){dc("clear",this);var b=this.canvas;while(b.firstChild)b.removeChild(b.firstChild);this.bottom=this.top=null,(this.desc=bU("desc")).appendChild(g.doc.createTextNode("Created with Raphaël "+a.version)),b.appendChild(this.desc),b.appendChild(this.defs=bU("defs"))},j.remove=function(){dc("remove",this),this.canvas.parentNode&&this.canvas.parentNode.removeChild(this.canvas);for(var a in this)this[a]=bL(a)}}if(a.vml){var cn={M:"m",L:"l",C:"c",Z:"x",m:"t",l:"r",c:"v",z:"x"},co=/([clmz]),?([^clmz]*)/gi,cp=/ progid:\S+Blur\([^\)]+\)/g,cq=/-?[^,\s-]+/g,cr="position:absolute;left:0;top:0;width:1px;height:1px",cs=21600,ct={path:1,rect:1},cu={circle:1,ellipse:1},cv=function(a){var b=/[ahqstv]/ig,c=bw;q(a).match(b)&&(c=bC),b=/[clmz]/g;if(c==bw&&!q(a).match(b)){var d=q(a).replace(co,function(a,b,c){var d=[],e=u.call(b)=="m",f=cn[b];c.replace(cq,function(a){e&&d.length==2&&(f+=d+cn[b=="m"?"l":"L"],d=[]),d.push(N(a*cs))});return f+d});return d}var e=c(a),f,g;d=[];for(var h=0,i=e.length;h<i;h++){f=e[h],g=u.call(e[h][0]),g=="z"&&(g="x");for(var j=1,k=f.length;j<k;j++)g+=N(f[j]*cs)+(j!=k-1?",":o);d.push(g)}return d.join(p)},cw=function(a,b,c){var d=new bP;d.rotate(-a,.5,.5);return{dx:d.x(b,c),dy:d.y(b,c)}},cx=function(a){var b=a._,c=b.sx,d=b.sy,e=b.deg,f=b.dx,g=b.dy,h=b.fillpos,i=a.node,j=i.style,k=1,l=a.matrix,m="",n,o=cs/c,q=cs/d;j.visibility="hidden",i.coordsize=y(o)+p+y(q),j.rotation=e*(c*d<0?-1:1);if(e){var r=cw(e,f,g);f=r.dx,g=r.dy}c<0&&(m+="x"),d<0&&(m+=" y")&&(k=-1),j.flip=m,i.coordorigin=f*-o+p+g*-q;if(h||b.fillsize){var s=i.getElementsByTagName(F);s=s&&s[0],i.removeChild(s),h&&(r=cw(e,l.x(h[0],h[1]),l.y(h[0],h[1])),s.position=r.dx*k+p+r.dy*k),b.fillsize&&(s.size=b.fillsize[0]*y(c)+p+b.fillsize[1]*y(d)),i.appendChild(s)}j.visibility="visible"};a.toString=function(){return"Your browser doesn’t support SVG. Falling down to VML.\nYou are running Raphaël "+this.version},b_=function(a,b,c){var d=q(b).toLowerCase().split("-"),e=c?"end":"start",f=d.length,g="classic",h="medium",i="medium";while(f--)switch(d[f]){case"block":case"classic":case"oval":case"diamond":case"open":case"none":g=d[f];break;case"wide":case"narrow":i=d[f];break;case"long":case"short":h=d[f]}var j=a.node.getElementsByTagName("stroke")[0];j[e+"arrow"]=g,j[e+"arrowlength"]=h,j[e+"arrowwidth"]=i},ca=function(c,d){c.paper.canvas.style.display="none",c.attrs=c.attrs||{};var e=c.node,h=c.attrs,i=e.style,j,k=ct[c.type]&&(d.x!=h.x||d.y!=h.y||d.width!=h.width||d.height!=h.height||d.cx!=h.cx||d.cy!=h.cy||d.rx!=h.rx||d.ry!=h.ry||d.r!=h.r),l=cu[c.type]&&(h.cx!=d.cx||h.cy!=d.cy||h.r!=d.r||h.rx!=d.rx||h.ry!=d.ry),m=c;for(var n in d)d[f](n)&&(h[n]=d[n]);k&&(h.path=bg[c.type](c),c._.dirty=1),d.href&&(e.href=d.href),d.title&&(e.title=d.title),d.target&&(e.target=d.target),d.cursor&&(i.cursor=d.cursor),"blur"in d&&c.blur(d.blur),"transform"in d&&c.transform(d.transform);if(d.path&&c.type=="path"||k)e.path=cv(h.path);if(l){var r=h.cx,s=h.cy,t=h.rx||h.r||0,u=h.ry||h.r||0;e.path=a.format("ar{0},{1},{2},{3},{4},{1},{4},{1}x",N((r-t)*cs),N((s-u)*cs),N((r+t)*cs),N((s+u)*cs),N(r*cs))}if("clip-rect"in d){var v=q(d["clip-rect"]).split(b);if(v.length==4){v[2]=+v[2]+ +v[0],v[3]=+v[3]+ +v[1];var y=e.clipRect||g.doc.createElement("div"),z=y.style,A=e.parentNode;z.clip=a.format("rect({1}px {2}px {3}px {0}px)",v),e.clipRect||(z.position="absolute",z.top=0,z.left=0,z.width=c.paper.width+"px",z.height=c.paper.height+"px",A.parentNode.insertBefore(y,A),y.appendChild(A),e.clipRect=y)}d["clip-rect"]||e.clipRect&&(e.clipRect.style.clip=o)}if(c.textpath){var B=c.textpath.style;d.font&&(B.font=d.font),d["font-family"]&&(B.fontFamily='"'+d["font-family"].split(",")[0].replace(/^['"]+|['"]+$/g,o)+'"'),d["font-size"]&&(B.fontSize=d["font-size"]),d["font-weight"]&&(B.fontWeight=d["font-weight"]),d["font-style"]&&(B.fontStyle=d["font-style"])}"arrow-start"in d&&b_(m,d["arrow-start"]),"arrow-end"in d&&b_(m,d["arrow-end"],1);if(d.opacity!=null||d["stroke-width"]!=null||d.fill!=null||d.src!=null||d.stroke!=null||d["stroke-width"]!=null||d["stroke-opacity"]!=null||d["fill-opacity"]!=null||d["stroke-dasharray"]!=null||d["stroke-miterlimit"]!=null||d["stroke-linejoin"]!=null||d["stroke-linecap"]!=null){var C=e.getElementsByTagName(F),D=!1;C=C&&C[0],!C&&(D=C=cy(F)),c.type=="image"&&d.src&&(C.src=d.src);if("fill-opacity"in d||"opacity"in d){var E=((+h["fill-opacity"]+1||2)-1)*((+h.opacity+1||2)-1)*((+a.getRGB(d.fill).o+1||2)-1);E=x(w(E,0),1),C.opacity=E}d.fill&&(C.on=!0);if(C.on==null||d.fill=="none"||d.fill===null)C.on=!1;if(C.on&&d.fill){var G=d.fill.match(J);if(G){C.parentNode==e&&e.removeChild(C),C.rotate=!0,C.src=G[1],C.type="tile";var H=c.getBBox(1);C.position=H.x+p+H.y,c._.fillpos=[H.x,H.y],bs(G[1],function(){c._.fillsize=[this.offsetWidth,this.offsetHeight]})}else C.color=a.getRGB(d.fill).hex,C.src=o,C.type="solid",a.getRGB(d.fill).error&&(m.type in{circle:1,ellipse:1}||q(d.fill).charAt()!="r")&&bZ(m,d.fill,C)&&(h.fill="none",h.gradient=d.fill,C.rotate=!1)}e.appendChild(C);var I=e.getElementsByTagName("stroke")&&e.getElementsByTagName("stroke")[0],K=!1;!I&&(K=I=cy("stroke"));if(d.stroke&&d.stroke!="none"||d["stroke-width"]||d["stroke-opacity"]!=null||d["stroke-dasharray"]||d["stroke-miterlimit"]||d["stroke-linejoin"]||d["stroke-linecap"])I.on=!0;(d.stroke=="none"||d.stroke===null||I.on==null||d.stroke==0||d["stroke-width"]==0)&&(I.on=!1);var L=a.getRGB(d.stroke);I.on&&d.stroke&&(I.color=L.hex),E=((+h["stroke-opacity"]+1||2)-1)*((+h.opacity+1||2)-1)*((+L.o+1||2)-1);var M=(P(d["stroke-width"])||1)*.75;E=x(w(E,0),1),d["stroke-width"]==null&&(M=h["stroke-width"]),d["stroke-width"]&&(I.weight=M),M&&M<1&&(E*=M)&&(I.weight=1),I.opacity=E,d["stroke-linejoin"]&&(I.joinstyle=d["stroke-linejoin"]||"miter"),I.miterlimit=d["stroke-miterlimit"]||8,d["stroke-linecap"]&&(I.endcap=d["stroke-linecap"]=="butt"?"flat":d["stroke-linecap"]=="square"?"square":"round");if(d["stroke-dasharray"]){var O={"-":"shortdash",".":"shortdot","-.":"shortdashdot","-..":"shortdashdotdot",". ":"dot","- ":"dash","--":"longdash","- .":"dashdot","--.":"longdashdot","--..":"longdashdotdot"};I.dashstyle=O[f](d["stroke-dasharray"])?O[d["stroke-dasharray"]]:o}K&&e.appendChild(I)}if(m.type=="text"){m.paper.canvas.style.display=o;var Q=m.paper.span,R=100,S=h.font&&h.font.match(/\d+(?:\.\d*)?(?=px)/);i=Q.style,h.font&&(i.font=h.font),h["font-family"]&&(i.fontFamily=h["font-family"]),h["font-weight"]&&(i.fontWeight=h["font-weight"]),h["font-style"]&&(i.fontStyle=h["font-style"]),S=P(S?S[0]:h["font-size"]),i.fontSize=S*R+"px",m.textpath.string&&(Q.innerHTML=q(m.textpath.string).replace(/</g,"&#60;").replace(/&/g,"&#38;").replace(/\n/g,"<br>"));var T=Q.getBoundingClientRect();m.W=h.w=(T.right-T.left)/R,m.H=h.h=(T.bottom-T.top)/R,m.paper.canvas.style.display="none",m.X=h.x,m.Y=h.y+m.H/2,("x"in d||"y"in d)&&(m.path.v=a.format("m{0},{1}l{2},{1}",N(h.x*cs),N(h.y*cs),N(h.x*cs)+1));var U=["x","y","text","font","font-family","font-weight","font-style","font-size"];for(var V=0,W=U.length;V<W;V++)if(U[V]in d){m._.dirty=1;break}switch(h["text-anchor"]){case"start":m.textpath.style["v-text-align"]="left",m.bbx=m.W/2;break;case"end":m.textpath.style["v-text-align"]="right",m.bbx=-m.W/2;break;default:m.textpath.style["v-text-align"]="center",m.bbx=0}m.textpath.style["v-text-kern"]=!0}m.paper.canvas.style.display=o},bZ=function(a,b,c){a.attrs=a.attrs||{};var d=a.attrs,e="linear",f=".5 .5";a.attrs.gradient=b,b=q(b).replace(_,function(a,b,c){e="radial",b&&c&&(b=P(b),c=P(c),z(b-.5,2)+z(c-.5,2)>.25&&(c=v.sqrt(.25-z(b-.5,2))*((c>.5)*2-1)+.5),f=b+p+c);return o}),b=b.split(/\s*\-\s*/);if(e=="linear"){var g=b.shift();g=-P(g);if(isNaN(g))return null}var h=bD(b);if(!h)return null;a=a.shape||a.node;if(h.length){a.removeChild(c),c.on=!0,c.method="none",c.color=h[0].color,c.color2=h[h.length-1].color;var i=[];for(var j=0,k=h.length;j<k;j++)h[j].offset&&i.push(h[j].offset+p+h[j].color);c.colors&&(c.colors.value=i.length?i.join():"0% "+c.color),e=="radial"?(c.type="gradientTitle",c.focus="100%",c.focussize="0 0",c.focusposition=f,c.angle=0):(c.type="gradient",c.angle=(270-g)%360),a.appendChild(c)}return 1},cd=function(b,c){this[0]=this.node=b,b.raphael=!0,this.id=a._oid++,b.raphaelid=this.id,this.X=0,this.Y=0,this.attrs={},this.paper=c,this.matrix=new bP,this._={transform:[],sx:1,sy:1,dx:0,dy:0,deg:0,dirty:1,dirtyT:1},!c.bottom&&(c.bottom=this),this.prev=c.top,c.top&&(c.top.next=this),c.top=this,this.next=null},ce=cd.prototype,ce.transform=function(a){if(a==null)return this._.transform;bM(this,a);var b=this.matrix.clone(),c=this.skew;b.translate(-0.5,-0.5);if(this.type=="image")if(q(a).indexOf("m")+1){this.node.style.filter=b.toFilter();var d=this.getBBox(),e=this.getBBox(1),f=b.invert(),g=f.x(d.x,d.y)-f.x(e.x,e.y),h=f.y(d.x,d.y)-f.y(e.x,e.y)}else this.node.style.filter=o,cx(this);else this.node.style.filter=o,c.matrix=b,c.offset=b.offset();return this},ce.rotate=function(a,c,d){if(this.removed)return this;if(a!=null){a=q(a).split(b),a.length-1&&(c=P(a[1]),d=P(a[2])),a=P(a[0]),d==null&&(c=d);if(c==null||d==null){var e=this.getBBox(1);c=e.x+e.width/2,d=e.y+e.height/2}this._.dirtyT=1,this.transform(this._.transform.concat([["r",a,c,d]]));return this}},ce.translate=function(a,c){if(this.removed)return this;a=q(a).split(b),a.length-1&&(c=P(a[1])),a=P(a[0])||0,c=+c||0,this._.bbox&&(this._.bbox.x+=a,this._.bbox.y+=c),this.transform(this._.transform.concat([["t",a,c]]));return this},ce.scale=function(a,c,d,e){if(this.removed)return this;a=q(a).split(b),a.length-1&&(c=P(a[1]),d=P(a[2]),e=P(a[3]),isNaN(d)&&(d=null),isNaN(e)&&(e=null)),a=P(a[0]),c==null&&(c=a),e==null&&(d=e);if(d==null||e==null)var f=this.getBBox(1);d=d==null?f.x+f.width/2:d,e=e==null?f.y+f.height/2:e,this.transform(this._.transform.concat([["s",a,c,d,e]])),this._.dirtyT=1;return this},ce.hide=function(){!this.removed&&(this.node.style.display="none");return this},ce.show=function(){!this.removed&&(this.node.style.display=o);return this},ce._getBBox=function(){if(this.removed)return{};return this.type=="text"?{x:this.X+(this.bbx||0)-this.W/2,y:this.Y-this.H,width:this.W,height:this.H}:bt(this.attrs.path)},ce.remove=function(){if(!this.removed){dc.unbind("*.*."+this.id),bG(this,this.paper),this.node.parentNode.removeChild(this.node),this.shape&&this.shape.parentNode.removeChild(this.shape);for(var a in this)delete this[a];this.removed=!0}},ce.attr=function(b,c){if(this.removed)return this;if(b==null){var d={};for(var e in this.attrs)this.attrs[f](e)&&(d[e]=this.attrs[e]);d.gradient&&d.fill=="none"&&(d.fill=d.gradient)&&delete d.gradient;return d}if(c==null&&a.is(b,"string")){if(b==F&&this.attrs.fill=="none"&&this.attrs.gradient)return this.attrs.gradient;return b in this.attrs?this.attrs[b]:a.is(this.paper.customAttributes[b],"function")?this.paper.customAttributes[b].def:T[b]}if(this.attrs&&c==null&&a.is(b,D)){var g,h={};for(e=0,g=b.length;e<g;e++)h[b[e]]=this.attr(b[e]);return h}var i;c!=null&&(i={},i[b]=c),c==null&&a.is(b,"object")&&(i=b);for(var j in i)dc("attr."+j+"."+this.id,this,i[j]);if(i){for(j in this.paper.customAttributes)if(this.paper.customAttributes[f](j)&&i[f](j)&&a.is(this.paper.customAttributes[j],"function")){var k=this.paper.customAttributes[j].apply(this,[][m](i[j]));this.attrs[j]=i[j];for(var l in k)k[f](l)&&(i[l]=k[l])}i.text&&this.type=="text"&&(this.textpath.string=i.text),ca(this,i)}return this},ce.toFront=function(){!this.removed&&this.node.parentNode.appendChild(this.node),this.paper.top!=this&&bH(this,this.paper);return this},ce.toBack=function(){if(this.removed)return this;this.node.parentNode.firstChild!=this.node&&(this.node.parentNode.insertBefore(this.node,this.node.parentNode.firstChild),bI(this,this.paper));return this},ce.insertAfter=function(a){if(this.removed)return this;a.constructor==c_&&(a=a[a.length-1]),a.node.nextSibling?a.node.parentNode.insertBefore(this.node,a.node.nextSibling):a.node.parentNode.appendChild(this.node),bJ(this,a,this.paper);return this},ce.insertBefore=function(a){if(this.removed)return this;a.constructor==c_&&(a=a[0]),a.node.parentNode.insertBefore(this.node,a.node),bK(this,a,this.paper);return this},ce.blur=function(b){var c=this.node.runtimeStyle,d=c.filter;d=d.replace(cp,o),+b!==0?(this.attrs.blur=b,c.filter=d+p+R+".Blur(pixelradius="+(+b||1.5)+")",c.margin=a.format("-{0}px 0 0 -{0}px",N(+b||1.5))):(c.filter=d,c.margin=0,delete this.attrs.blur)},bV=function(a,b){var c=cy("shape");c.style.cssText=cr,c.coordsize=cs+p+cs,c.coordorigin=b.coordorigin;var d=new cd(c,b),e={fill:"none",stroke:"#000"};a&&(e.path=a),d.type="path",d.path=[],d.Path=o,ca(d,e),b.canvas.appendChild(c);var f=cy("skew");f.on=!0,c.appendChild(f),d.skew=f,d.transform(o);return d},cg=function(a,b,c,d,e,f){var g=be(b,c,d,e,f),h=a.path(g),i=h.attrs;h.X=i.x=b,h.Y=i.y=c,h.W=i.width=d,h.H=i.height=e,i.r=f,i.path=g,h.type="rect";return h},ch=function(a,b,c,d,e){var f=a.path(),g=f.attrs;f.X=b-d,f.Y=c-e,f.W=d*2,f.H=e*2,f.type="ellipse",ca(f,{cx:b,cy:c,rx:d,ry:e});return f},cf=function(a,b,c,d){var e=a.path(),f=e.attrs;e.X=b-d,e.Y=c-d,e.W=e.H=d*2,e.type="circle",ca(e,{cx:b,cy:c,r:d});return e},ci=function(a,b,c,d,e,f){var g=be(c,d,e,f),h=a.path(g).attr({stroke:"none"}),i=h.attrs,j=h.node,k=j.getElementsByTagName(F)[0];i.src=b,h.X=i.x=c,h.Y=i.y=d,h.W=i.width=e,h.H=i.height=f,i.path=g,h.type="image",k.parentNode==j&&j.removeChild(k),k.rotate=!0,k.src=b,k.type="tile",h._.fillpos=[c,d],h._.fillsize=[e,f],j.appendChild(k),cx(h);return h},cj=function(b,c,d,e){var f=cy("shape"),g=cy("path"),h=cy("textpath");c=c||0,d=d||0,e=e||"",g.v=a.format("m{0},{1}l{2},{1}",N(c*cs),N(d*cs),N(c*cs)+1),g.textpathok=!0,h.string=q(e),h.on=!0,f.style.cssText="position:absolute;left:0;top:0;width:1;height:1",f.coordsize=cs+p+cs,f.coordorigin="0 0";var i=new cd(f,b),j={fill:"#000",stroke:"none",font:T.font,text:e};i.shape=f,i.path=g,i.textpath=h,i.type="text",i.attrs.text=q(e),i.attrs.x=c,i.attrs.y=d,i.attrs.w=1,i.attrs.h=1,ca(i,j),f.appendChild(h),f.appendChild(g),b.canvas.appendChild(f);var k=cy("skew");k.on=!0,f.appendChild(k),i.skew=k,i.transform(o);return i},ck=function(a,b){var c=this.canvas.style;this.width=a,this.height=b,a==+a&&(a+="px"),b==+b&&(b+="px"),c.width=a,c.height=b,c.clip="rect(0 "+a+" "+b+" 0)",this._viewBox&&cm.apply(this,this._viewBox);return this},cm=function(a,b,c,d,e){dc("setViewBox",this,this._viewBox,[a,b,c,d,e]);var f=this.width,g=this.height,h=1e3*w(c/f,d/g),i,j;e&&(i=g/d,j=f/c,c*i<f&&(a-=(f-c*i)/2/i),d*j<g&&(b-=(g-d*j)/2/j)),this._viewBox=[a,b,c,d,!!e],this.forEach(function(a){a.transform("...")});return this};var cy,cz=function(a){var b=a.document;b.createStyleSheet().addRule(".rvml","behavior:url(#default#VML)");try{!b.namespaces.rvml&&b.namespaces.add("rvml","urn:schemas-microsoft-com:vml"),cy=function(a){return b.createElement("<rvml:"+a+' class="rvml">')}}catch(c){cy=function(a){return b.createElement("<"+a+' xmlns="urn:schemas-microsoft.com:vml" class="rvml">')}}};cz(g.win),cl=function(){var b=bE[l](0,arguments),c=b.container,d=b.height,e,f=b.width,h=b.x,j=b.y;if(!c)throw new Error("VML container not found.");var k=new i,m=k.canvas=g.doc.createElement("div"),n=m.style;h=h||0,j=j||0,f=f||512,d=d||342,k.width=f,k.height=d,f==+f&&(f+="px"),d==+d&&(d+="px"),k.coordsize=cs*1e3+p+cs*1e3,k.coordorigin="0 0",k.span=g.doc.createElement("span"),k.span.style.cssText="position:absolute;left:-9999em;top:-9999em;padding:0;margin:0;line-height:1;",m.appendChild(k.span),n.cssText=a.format("top:0;left:0;width:{0};height:{1};display:inline-block;position:relative;clip:rect(0 {0} {1} 0);overflow:hidden",f,d),c==1?(g.doc.body.appendChild(m),n.left=h+"px",n.top=j+"px",n.position="absolute"):c.firstChild?c.insertBefore(m,c.firstChild):c.appendChild(m),bF.call(k,k,a.fn),k.renderfix=bc;return k},j.clear=function(){dc("clear",this),this.canvas.innerHTML=o,this.span=g.doc.createElement("span"),this.span.style.cssText="position:absolute;left:-9999em;top:-9999em;padding:0;margin:0;line-height:1;display:inline;",this.canvas.appendChild(this.span),this.bottom=this.top=null},j.remove=function(){dc("remove",this),this.canvas.parentNode.removeChild(this.canvas);for(var a in this)this[a]=bL(a);return!0}}var cA=navigator.userAgent.match(/Version\/(.*?)\s/)||navigator.userAgent.match(/Chrome\/(\d+)/);navigator.vendor=="Apple Computer, Inc."&&(cA&&cA[1]<4||navigator.platform.slice(0,2)=="iP")||navigator.vendor=="Google Inc."&&cA&&cA[1]<8?j.safari=function(){var a=this.rect(-99,-99,this.width+99,this.height+99).attr({stroke:"none"});setTimeout(function(){a.remove()})}:j.safari=bc;var cB=function(){this.returnValue=!1},cC=function(){return this.originalEvent.preventDefault()},cD=function(){this.cancelBubble=!0},cE=function(){return this.originalEvent.stopPropagation()},cF=function(){if(g.doc.addEventListener)return function(a,b,c,d){var e=n&&t[b]?t[b]:b,g=function(e){if(n&&t[f](b))for(var g=0,h=e.targetTouches&&e.targetTouches.length;g<h;g++)if(e.targetTouches[g].target==a){var i=e;e=e.targetTouches[g],e.originalEvent=i,e.preventDefault=cC,e.stopPropagation=cE;break}return c.call(d,e)};a.addEventListener(e,g,!1);return function(){a.removeEventListener(e,g,!1);return!0}};if(g.doc.attachEvent)return function(a,b,c,d){var e=function(a){a=a||g.win.event,a.preventDefault=a.preventDefault||cB,a.stopPropagation=a.stopPropagation||cD;return c.call(d,a)};a.attachEvent("on"+b,e);var f=function(){a.detachEvent("on"+b,e);return!0};return f}}(),cG=[],cH=function(a){var b=a.clientX,c=a.clientY,d=g.doc.documentElement.scrollTop||g.doc.body.scrollTop,e=g.doc.documentElement.scrollLeft||g.doc.body.scrollLeft,f,h=cG.length;while(h--){f=cG[h];if(n){var i=a.touches.length,j;while(i--){j=a.touches[i];if(j.identifier==f.el._drag.id){b=j.clientX,c=j.clientY,(a.originalEvent?a.originalEvent:a).preventDefault();break}}}else a.preventDefault();var k=f.el.node,l,m=k.nextSibling,o=k.parentNode,p=k.style.display;g.win.opera&&o.removeChild(k),k.style.display="none",l=f.el.paper.getElementByPoint(b,c),k.style.display=p,g.win.opera&&(m?o.insertBefore(k,m):o.appendChild(k)),l&&dc("drag.over."+f.el.id,f.el,l),b+=e,c+=d,dc("drag.move."+f.el.id,f.move_scope||f.el,b-f.el._drag.x,c-f.el._drag.y,b,c,a)}},cI=function(b){a.unmousemove(cH).unmouseup(cI);var c=cG.length,d;while(c--)d=cG[c],d.el._drag={},dc("drag.end."+d.el.id,d.end_scope||d.start_scope||d.move_scope||d.el,b);cG=[]};for(var cJ=s.length;cJ--;)(function(b){a[b]=cd.prototype[b]=function(c,d){a.is(c,"function")&&(this.events=this.events||[],this.events.push({name:b,f:c,unbind:cF(this.shape||this.node||g.doc,b,c,d||this)}));return this},a["un"+b]=cd.prototype["un"+b]=function(a){var c=this.events,d=c.length;while(d--)if(c[d].name==b&&c[d].f==a){c[d].unbind(),c.splice(d,1),!c.length&&delete this.events;return this}return this}})(s[cJ]);ce.hover=function(a,b,c,d){return this.mouseover(a,c).mouseout(b,d||c)},ce.unhover=function(a,b){return this.unmouseover(a).unmouseout(b)},ce.drag=function(b,c,d,e,f,h){function i(i){(i.originalEvent||i).preventDefault();var j=g.doc.documentElement.scrollTop||g.doc.body.scrollTop,k=g.doc.documentElement.scrollLeft||g.doc.body.scrollLeft;this._drag.x=i.clientX+k,this._drag.y=i.clientY+j,this._drag.id=i.identifier,!cG.length&&a.mousemove(cH).mouseup(cI),cG.push({el:this,move_scope:e,start_scope:f,end_scope:h}),c&&dc.on("drag.start."+this.id,c),b&&dc.on("drag.move."+this.id,b),d&&dc.on("drag.end."+this.id,d),dc("drag.start."+this.id,f||e||this,i.clientX+k,i.clientY+j,i)}this._drag={},this.mousedown(i);return this},ce.onDragOver=function(a){a?dc.on("drag.over."+this.id,a):dc.unbind("drag.over."+this.id)},ce.undrag=function(){var b=cG.length;while(b--)cG[b].el==this&&(a.unmousedown(cG[b].start),cG.splice(b++,1),dc.unbind("drag.*."+this.id));!cG.length&&a.unmousemove(cH).unmouseup(cI)},j.circle=function(a,b,c){return cf(this,a||0,b||0,c||0)},j.rect=function(a,b,c,d,e){return cg(this,a||0,b||0,c||0,d||0,e||0)},j.ellipse=function(a,b,c,d){return ch(this,a||0,b||0,c||0,d||0)},j.path=function(b){b&&!a.is(b,C)&&!a.is(b[0],D)&&(b+=o);return bV(a.format[l](a,arguments),this)},j.image=function(a,b,c,d,e){return ci(this,a||"about:blank",b||0,c||0,d||0,e||0)},j.text=function(a,b,c){return cj(this,a||0,b||0,q(c))},j.set=function(a){arguments.length>1&&(a=Array.prototype.splice.call(arguments,0,arguments.length));return new c_(a)},j.setSize=ck,j.setViewBox=cm,j.top=j.bottom=null,j.raphael=a;var cK=function(a){var b=a.getBoundingClientRect(),c=a.ownerDocument,d=c.body,e=c.documentElement,f=e.clientTop||d.clientTop||0,h=e.clientLeft||d.clientLeft||0,i=b.top+(g.win.pageYOffset||e.scrollTop||d.scrollTop)-f,j=b.left+(g.win.pageXOffset||e.scrollLeft||d.scrollLeft)-h;return{y:i,x:j}};j.getElementByPoint=function(a,b){var c=this,d=c.canvas,e=g.doc.elementFromPoint(a,b);if(g.win.opera&&e.tagName=="svg"){var f=cK(d),h=d.createSVGRect();h.x=a-f.x,h.y=b-f.y,h.width=h.height=1;var i=d.getIntersectionList(h,null);i.length&&(e=i[i.length-1])}if(!e)return null;while(e.parentNode&&e!=d.parentNode&&!e.raphael)e=e.parentNode;e==c.canvas.parentNode&&(e=d),e=e&&e.raphael?c.getById(e.raphaelid):null;return e},j.getById=function(a){var b=this.bottom;while(b){if(b.id==a)return b;b=b.next}return null},j.forEach=function(a,b){var c=this.bottom;while(c){if(a.call(b,c)===!1)return this;c=c.next}return this},ce.getBBox=function(a){if(this.removed)return{};var b=this._;if(a){if(b.dirty||!b.bboxwt)this.realPath=bg[this.type](this),b.bboxwt=bt(this.realPath),b.bboxwt.toString=cM,b.dirty=0;return b.bboxwt}if(b.dirty||b.dirtyT||!b.bbox){if(b.dirty||!this.realPath)b.bboxwt=0,this.realPath=bg[this.type](this);b.bbox=bt(bh(this.realPath,this.matrix)),b.bbox.toString=cM,b.dirty=b.dirtyT=0}return b.bbox},ce.clone=function(){if(this.removed)return null;var a=this.attr();delete a.scale,delete a.translation;return this.paper[this.type]().attr(a)},ce.glow=function(a){if(this.type=="text")return null;a=a||{};var b={width:(a.width||10)+(+this.attr("stroke-width")||1),fill:a.fill||!1,opacity:a.opacity||.5,offsetx:a.offsetx||0,offsety:a.offsety||0,color:a.color||"#000"},c=b.width/2,d=this.paper,e=d.set(),f=this.realPath||bg[this.type](this);f=this.matrix?bh(f,this.matrix):f;for(var g=1;g<c+1;g++)e.push(d.path(f).attr({stroke:b.color,fill:b.fill?b.color:"none","stroke-linejoin":"round","stroke-linecap":"round","stroke-width":+(b.width/c*g).toFixed(3),opacity:+(b.opacity/c).toFixed(3)}));return e.insertBefore(this).translate(b.offsetx,b.offsety)};var cN={},cO=function(b,c,d,e,f,g,h,i,j){var k=0,l=100,m=[b,c,d,e,f,g,h,i].join(),n=cN[m],o,p;!n&&(cN[m]=n={data:[]}),n.timer&&clearTimeout(n.timer),n.timer=setTimeout(function(){delete cN[m]},2e3);if(j!=null&&!n.precision){var q=cO(b,c,d,e,f,g,h,i);n.precision=~~q*10,n.data=[]}l=n.precision||l;for(var r=0;r<l+1;r++){n.data[r*l]?p=n.data[r*l]:(p=a.findDotsAtSegment(b,c,d,e,f,g,h,i,r/l),n.data[r*l]=p),r&&(k+=z(z(o.x-p.x,2)+z(o.y-p.y,2),.5));if(j!=null&&k>=j)return p;o=p}if(j==null)return k},cP=function(b,c){return function(d,e,f){d=bC(d);var g,h,i,j,k="",l={},m,n=0;for(var o=0,p=d.length;o<p;o++){i=d[o];if(i[0]=="M")g=+i[1],h=+i[2];else{j=cO(g,h,i[1],i[2],i[3],i[4],i[5],i[6]);if(n+j>e){if(c&&!l.start){m=cO(g,h,i[1],i[2],i[3],i[4],i[5],i[6],e-n),k+=["C"+m.start.x,m.start.y,m.m.x,m.m.y,m.x,m.y];if(f)return k;l.start=k,k=["M"+m.x,m.y+"C"+m.n.x,m.n.y,m.end.x,m.end.y,i[5],i[6]].join(),n+=j,g=+i[5],h=+i[6];continue}if(!b&&!c){m=cO(g,h,i[1],i[2],i[3],i[4],i[5],i[6],e-n);return{x:m.x,y:m.y,alpha:m.alpha}}}n+=j,g=+i[5],h=+i[6]}k+=i.shift()+i}l.end=k,m=b?n:c?l:a.findDotsAtSegment(g,h,i[1],i[2],i[3],i[4],i[5],i[6],1),m.alpha&&(m={x:m.x,y:m.y,alpha:m.alpha});return m}},cQ=cP(1),cR=cP(),cS=cP(0,1);a.getTotalLength=cQ,a.getPointAtLength=cR,a.getSubpath=function(a,b,c){if(y(this.getTotalLength(a)-c)<1e-6)return cS(a,b).end;var d=cS(a,c,1);return b?cS(d,b).end:d},ce.getTotalLength=function(){if(this.type=="path"){if(this.node.getTotalLength)return this.node.getTotalLength();return cQ(this.attrs.path)}},ce.getPointAtLength=function(a){if(this.type=="path")return cR(this.attrs.path,a)},ce.getSubpath=function(b,c){if(this.type=="path")return a.getSubpath(this.attrs.path,b,c)};var cT=a.easing_formulas={linear:function(a){return a},"<":function(a){return z(a,1.7)},">":function(a){return z(a,.48)},"<>":function(a){var b=.48-a/1.04,c=v.sqrt(.1734+b*b),d=c-b,e=z(y(d),1/3)*(d<0?-1:1),f=-c-b,g=z(y(f),1/3)*(f<0?-1:1),h=e+g+.5;return(1-h)*3*h*h+h*h*h},backIn:function(a){var b=1.70158;return a*a*((b+1)*a-b)},backOut:function(a){a=a-1;var b=1.70158;return a*a*((b+1)*a+b)+1},elastic:function(a){if(a==!!a)return a;return z(2,-10*a)*v.sin((a-.075)*2*A/.3)+1},bounce:function(a){var b=7.5625,c=2.75,d;a<1/c?d=b*a*a:a<2/c?(a-=1.5/c,d=b*a*a+.75):a<2.5/c?(a-=2.25/c,d=b*a*a+.9375):(a-=2.625/c,d=b*a*a+.984375);return d}};cT.easeIn=cT["ease-in"]=cT["<"],cT.easeOut=cT["ease-out"]=cT[">"],cT.easeInOut=cT["ease-in-out"]=cT["<>"],cT["back-in"]=cT.backIn,cT["back-out"]=cT.backOut;var cU=[],cV=window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(a){setTimeout(a,16)},cW=function(){var b=+(new Date),c=0;for(;c<cU.length;c++){var d=cU[c];if(d.el.removed||d.paused)continue;var e=b-d.start,g=d.ms,h=d.easing,i=d.from,j=d.diff,k=d.to,l=d.t,m=d.el,n={},o;d.initstatus?(e=(d.initstatus*d.anim.top-d.prev)/(d.percent-d.prev)*g,d.status=d.initstatus,delete d.initstatus,d.stop&&cU.splice(c--,1)):d.status=(d.prev+(d.percent-d.prev)*(e/g))/d.anim.top;if(e<0)continue;if(e<g){var q=h(e/g);for(var r in i)if(i[f](r)){switch(U[r]){case B:o=+i[r]+q*g*j[r];break;case"colour":o="rgb("+[cX(N(i[r].r+q*g*j[r].r)),cX(N(i[r].g+q*g*j[r].g)),cX(N(i[r].b+q*g*j[r].b))].join(",")+")";break;case"path":o=[];for(var s=0,t=i[r].length;s<t;s++){o[s]=[i[r][s][0]];for(var u=1,v=i[r][s].length;u<v;u++)o[s][u]=+i[r][s][u]+q*g*j[r][s][u];o[s]=o[s].join(p)}o=o.join(p);break;case"transform":if(j[r].real){o=[];for(s=0,t=i[r].length;s<t;s++){o[s]=[i[r][s][0]];for(u=1,v=i[r][s].length;u<v;u++)o[s][u]=i[r][s][u]+q*g*j[r][s][u]}}else{var w=function(a){return+i[r][a]+q*g*j[r][a]};o=[["m",w(0),w(1),w(2),w(3),w(4),w(5)]]}break;case"csv":if(r=="clip-rect"){o=[],s=4;while(s--)o[s]=+i[r][s]+q*g*j[r][s]}break;default:var x=[].concat(i[r]);o=[],s=m.paper.customAttributes[r].length;while(s--)o[s]=+x[s]+q*g*j[r][s]}n[r]=o}m.attr(n),function(a,b,c){setTimeout(function(){dc("anim.frame."+a,b,c)})}(m.id,m,d.anim)}else(function(b,c,d){setTimeout(function(){dc("anim.finish."+c.id,c,d),a.is(b,"function")&&b.call(c)})})(d.callback,m,d.anim),console.log(d.repeat),--d.repeat?(m.attr(d.origin),d.start=b):(m.attr(k),cU.splice(c--,1)),d.next&&!d.stop&&c$(d.anim,d.el,d.next,null,d.totalOrigin)}a.svg&&m&&m.paper&&m.paper.safari(),cU.length&&cV(cW)},cX=function(a){return w(x(a,255),0)};ce.animateWith=function(a,b,c,d,e){this.animate(b,c,d,e);var f,g;for(var h=0,i=cU.length;h<i;h++)g=cU[h],g.el.id==a.id?f=g.timestamp:g.el.id==this.id&&(g.start=f);return this.animate(b,c,d,e)},ce.onAnimation=function(a){a?dc.on("anim.frame."+this.id,a):dc.unbind("anim.frame."+this.id);return this},cZ.prototype.delay=function(a){var b=new cZ(this.anim,this.ms);b.times=this.times,b.del=+a||0;return b},cZ.prototype.repeat=function(a){var b=new cZ(this.anim,this.ms);b.del=this.del,b.times=v.floor(w(a,0))||1;return b},a.animation=function(b,c,d,e){if(a.is(d,"function")||!d)e=e||d||null,d=null;b=Object(b),c=+c||0;var g={},h,i;for(i in b)b[f](i)&&P(i)!=i&&(h=!0,g[i]=b[i]);if(!h)return new cZ(b,c);d&&(g.easing=d),e&&(g.callback=e);return new cZ({100:g},c)},ce.animate=function(b,c,d,e){var f=this;if(f.removed){e&&e.call(f);return f}var g=b instanceof cZ?b:a.animation(b,c,d,e);c$(g,f,g.percents[0],null,f.attr());return f},ce.setTime=function(a,b){a&&b!=null&&this.status(a,x(b,a.ms)/a.ms);return this},ce.status=function(a,b){var c=[],d=0,e,f;if(b!=null){c$(a,this,-1,x(b,1));return this}e=cU.length;for(;d<e;d++){f=cU[d];if(f.el.id==this.id&&(!a||f.anim==a)){if(a)return f.status;c.push({anim:f.anim,status:f.status})}}if(a)return 0;return c},ce.pause=function(a){for(var b=0;b<cU.length;b++)cU[b].el.id==this.id&&(!a||cU[b].anim==a)&&dc("anim.pause."+this.id,this,cU[b].anim)!==!1&&(cU[b].paused=!0);return this},ce.resume=function(a){for(var b=0;b<cU.length;b++)if(cU[b].el.id==this.id&&(!a||cU[b].anim==a)){var c=cU[b];dc("anim.resume."+this.id,this,c.anim)!==!1&&(delete c.paused,this.status(c.anim,c.status))}return this},ce.stop=function(a){for(var b=0;b<cU.length;b++)cU[b].el.id==this.id&&(!a||cU[b].anim==a)&&dc("anim.stop."+this.id,this,cU[b].anim)!==!1&&cU.splice(b--,1);return this},ce.toString=function(){return"Raphaël’s object"};var c_=function(a){this.items=[],this.length=0,this.type="set";if(a)for(var b=0,c=a.length;b<c;b++)a[b]&&(a[b].constructor==cd||a[b].constructor==c_)&&(this[this.items.length]=this.items[this.items.length]=a[b],this.length++)},da=c_.prototype;da.push=function(){var a,b;for(var c=0,d=arguments.length;c<d;c++)a=arguments[c],a&&(a.constructor==cd||a.constructor==c_)&&(b=this.items.length,this[b]=this.items[b]=a,this.length++);return this},da.pop=function(){this.length&&delete this[this.length--];return this.items.pop()},da.forEach=function(a,b){for(var c=0,d=this.items.length;c<d;c++)if(a.call(b,this.items[c])===!1)return this;return this};for(var db in ce)ce[f](db)&&(da[db]=function(a){return function(){var b=arguments;return this.forEach(function(c){c[a][l](c,b)})}}(db));da.attr=function(b,c){if(b&&a.is(b,D)&&a.is(b[0],"object"))for(var d=0,e=b.length;d<e;d++)this.items[d].attr(b[d]);else for(var f=0,g=this.items.length;f<g;f++)this.items[f].attr(b,c);return this},da.animate=function(b,c,d,e){(a.is(d,"function")||!d)&&(e=d||null);var f=this.items.length,g=f,h,i=this,j;e&&(j=function(){!--f&&e.call(i)}),d=a.is(d,C)?d:j;var k=b instanceof cZ?b:a.animation(b,c,d,j);h=this.items[--g].animate(k);while(g--)this.items[g]&&!this.items[g].removed&&this.items[g].animateWith(h,k);return this},da.insertAfter=function(a){var b=this.items.length;while(b--)this.items[b].insertAfter(a);return this},da.getBBox=function(){var a=[],b=[],c=[],d=[];for(var e=this.items.length;e--;)if(!this.items[e].removed){var f=this.items[e].getBBox();a.push(f.x),b.push(f.y),c.push(f.x+f.width),d.push(f.y+f.height)}a=x[l](0,a),b=x[l](0,b);return{x:a,y:b,width:w[l](0,c)-a,height:w[l](0,d)-b}},da.clone=function(a){a=new c_;for(var b=0,c=this.items.length;b<c;b++)a.push(this.items[b].clone());return a},da.toString=function(){return"Raphaël‘s set"},a.registerFont=function(a){if(!a.face)return a;this.fonts=this.fonts||{};var b={w:a.w,face:{},glyphs:{}},c=a.face["font-family"];for(var d in a.face)a.face[f](d)&&(b.face[d]=a.face[d]);this.fonts[c]?this.fonts[c].push(b):this.fonts[c]=[b];if(!a.svg){b.face["units-per-em"]=Q(a.face["units-per-em"],10);for(var e in a.glyphs)if(a.glyphs[f](e)){var g=a.glyphs[e];b.glyphs[e]={w:g.w,k:{},d:g.d&&"M"+g.d.replace(/[mlcxtrv]/g,function(a){return({l:"L",c:"C",x:"z",t:"m",r:"l",v:"c"})[a]||"M"})+"z"};if(g.k)for(var h in g.k)g[f](h)&&(b.glyphs[e].k[h]=g.k[h])}}return a},j.getFont=function(b,c,d,e){e=e||"normal",d=d||"normal",c=+c||({normal:400,bold:700,lighter:300,bolder:800})[c]||400;if(!!a.fonts){var g=a.fonts[b];if(!g){var h=new RegExp("(^|\\s)"+b.replace(/[^\w\d\s+!~.:_-]/g,o)+"(\\s|$)","i");for(var i in a.fonts)if(a.fonts[f](i)&&h.test(i)){g=a.fonts[i];break}}var j;if(g)for(var k=0,l=g.length;k<l;k++){j=g[k];if(j.face["font-weight"]==c&&(j.face["font-style"]==d||!j.face["font-style"])&&j.face["font-stretch"]==e)break}return j}},j.print=function(c,d,e,f,g,h,i){h=h||"middle",i=w(x(i||0,1),-1);var j=this.set(),k=q(e).split(o),l=0,m=o,n;a.is(f,e)&&(f=this.getFont(f));if(f){n=(g||16)/f.face["units-per-em"];var p=f.face.bbox.split(b),r=+p[0],s=+p[1]+(h=="baseline"?p[3]-p[1]+ +f.face.descent:(p[3]-p[1])/2);for(var t=0,u=k.length;t<u;t++){var v=t&&f.glyphs[k[t-1]]||{},y=f.glyphs[k[t]];l+=t?(v.w||f.w)+(v.k&&v.k[k[t]]||0)+f.w*i:0,y&&y.d&&j.push(this.path(y.d).attr({fill:"#000",stroke:"none",transform:[["t",l,0]]}))}j.scale(n,n,r,s).translate(c-r,d-s)}return j},a.format=function(b,c){var e=a.is(c,D)?[0][m](c):arguments;b&&a.is(b,C)&&e.length-1&&(b=b.replace(d,function(a,b){return e[++b]==null?o:e[b]}));return b||o},a.ninja=function(){h.was?g.win.Raphael=h.is:delete Raphael;return a},a.el=ce,a.st=da,function(a,b,c){function d(){/in/.test(a.readyState)?setTimeout(d,9):dc("DOMload")}a.readyState==null&&a.addEventListener&&(a.addEventListener(b,c=function(){a.removeEventListener(b,c,!1),a.readyState="complete"},!1),a.readyState="loading"),d()}(document,"DOMContentLoaded"),h.was?g.win.Raphael=a:Raphael=a;var dc=a.eve=function(){var a="0.2.1",b="hasOwnProperty",c=/[\.\/]/,d="*",e={n:{}},f=function(a,b){var c=e,d=Array.prototype.slice.call(arguments,2),g=f.listeners(a),h=[];for(var i=0,j=g.length;i<j;i++)try{g[i].apply(b,d)}catch(k){h.push({error:k&&k.message||k,func:g[i]})}if(h.length)return h};f.listeners=function(a){var b=a.split(c),f=e,g,h,i,j,k,l,m,n,o=[f],p=[];for(j=0,k=b.length;j<k;j++){n=[];for(l=0,m=o.length;l<m;l++){f=o[l].n,h=[f[b[j]],f[d]],i=2;while(i--)g=h[i],g&&(n.push(g),p=p.concat(g.f||[]))}o=n}return p},f.on=function(a,b){var d=a.split(c),f=e;for(var g=0,h=d.length;g<h;g++)f=f.n,!f[d[g]]&&(f[d[g]]={n:{}}),f=f[d[g]];f.f=f.f||[];for(g=0,h=f.f.length;g<h;g++)if(f.f[g]==b)return!1;f.f.push(b)},f.unbind=function(a,f){var g=a.split(c),h,i,j,k=[e];for(var l=0,m=g.length;l<m;l++)for(var n=0;n<k.length;n+=j.length-2){j=[n,1],h=k[n].n;if(g[l]!=d)h[g[l]]&&j.push(h[g[l]]);else for(i in h)h[b](i)&&j.push(h[i]);k.splice.apply(k,j)}for(l=0,m=k.length;l<m;l++){h=k[l];while(h.n){if(f){if(h.f){for(l=0,m=h.f.length;l<m;l++)if(h.f[l]==f){h.f.splice(l,1);break}!h.f.length&&delete h.f}for(i in h.n)if(h.n[b](i)&&h.n[i].f){var o=h.n[i].f;for(l=0,m=o.length;l<m;l++)if(o[l]==f){o.splice(l,1);break}!o.length&&delete h.n[i].f}}else{delete h.f;for(i in h.n)h.n[b](i)&&h.n[i].f&&delete h.n[i].f}h=h.n}}return!0},f.version=a,f.toString=function(){return"You are running Eve "+a};return f}()})()
\ No newline at end of file
index a54e890..8dbcd91 100644 (file)
 </code><code id="L2922"><span class="ln">2922</span>                <b>throw</b> <b>new</b> Error(<i>"SVG container not found."</i>);
 </code><code id="L2923"><span class="ln">2923</span>            }
 </code><code id="L2924"><span class="ln">2924</span>            <b>var</b> cnvs<span class="s"> = </span>$(<i>"svg"</i>),
-</code><code id="L2925"><span class="ln">2925</span>                css<span class="s"> = </span><i>"overflow:hidden;"</i>;
-</code><code id="L2926"><span class="ln">2926</span>            x<span class="s"> = </span>x<span class="s"> || </span><span class="d">0</span>;
-</code><code id="L2927"><span class="ln">2927</span>            y<span class="s"> = </span>y<span class="s"> || </span><span class="d">0</span>;
-</code><code id="L2928"><span class="ln">2928</span>            width<span class="s"> = </span>width<span class="s"> || </span><span class="d">512</span>;
-</code><code id="L2929"><span class="ln">2929</span>            height<span class="s"> = </span>height<span class="s"> || </span><span class="d">342</span>;
-</code><code id="L2930"><span class="ln">2930</span>            $(cnvs, {
-</code><code id="L2931"><span class="ln">2931</span>                height: height,
-</code><code id="L2932"><span class="ln">2932</span>                version: <span class="d">1.1</span>,
-</code><code id="L2933"><span class="ln">2933</span>                width: width,
-</code><code id="L2934"><span class="ln">2934</span>                xmlns: <i>"http:<span class="c">//www.w3.org/<span class="d">2000</span>/svg"</i></span>
-</code><code id="L2935"><span class="ln">2935</span>            });
-</code><code id="L2936"><span class="ln">2936</span>            <b>if</b> (container<span class="s"> == </span><span class="d">1</span>) {
-</code><code id="L2937"><span class="ln">2937</span>                cnvs.style.cssText<span class="s"> = </span>css<span class="s"> + </span><i>"position:absolute;left:"</i><span class="s"> + </span>x<span class="s"> + </span><i>"px;top:"</i><span class="s"> + </span>y<span class="s"> + </span><i>"px"</i>;
-</code><code id="L2938"><span class="ln">2938</span>                g.doc.body.appendChild(cnvs);
-</code><code id="L2939"><span class="ln">2939</span>            } <b>else</b> {
-</code><code id="L2940"><span class="ln">2940</span>                cnvs.style.cssText<span class="s"> = </span>css;
-</code><code id="L2941"><span class="ln">2941</span>                <b>if</b> (container.firstChild) {
-</code><code id="L2942"><span class="ln">2942</span>                    container.insertBefore(cnvs, container.firstChild);
-</code><code id="L2943"><span class="ln">2943</span>                } <b>else</b> {
-</code><code id="L2944"><span class="ln">2944</span>                    container.appendChild(cnvs);
-</code><code id="L2945"><span class="ln">2945</span>                }
-</code><code id="L2946"><span class="ln">2946</span>            }
-</code><code id="L2947"><span class="ln">2947</span>            container<span class="s"> = </span><b>new</b> Paper;
-</code><code id="L2948"><span class="ln">2948</span>            container.width<span class="s"> = </span>width;
-</code><code id="L2949"><span class="ln">2949</span>            container.height<span class="s"> = </span>height;
-</code><code id="L2950"><span class="ln">2950</span>            container.canvas<span class="s"> = </span>cnvs;
-</code><code id="L2951"><span class="ln">2951</span>            plugins.call(container, container, R.fn);
-</code><code id="L2952"><span class="ln">2952</span>            container.clear();
-</code><code id="L2953"><span class="ln">2953</span>            <b>return</b> container;
-</code><code id="L2954"><span class="ln">2954</span>        },
-</code><code id="L2955"><span class="ln">2955</span>        setViewBox<span class="s"> = </span><b>function</b> (x, y, w, h, fit) {
-</code><code id="L2956"><span class="ln">2956</span>            eve(<i>"setViewBox"</i>, <b>this</b>, <b>this</b>._viewBox, [x, y, w, h, fit]);
-</code><code id="L2957"><span class="ln">2957</span>            <b>var</b> size<span class="s"> = </span>mmax(w<span class="s"> / </span><b>this</b>.width, h<span class="s"> / </span><b>this</b>.height),
-</code><code id="L2958"><span class="ln">2958</span>                top<span class="s"> = </span><b>this</b>.top,
-</code><code id="L2959"><span class="ln">2959</span>                aspectRatio<span class="s"> = </span>fit ? <i>"meet"</i> : <i>"xMinYMin"</i>,
-</code><code id="L2960"><span class="ln">2960</span>                vb,
-</code><code id="L2961"><span class="ln">2961</span>                sw;
-</code><code id="L2962"><span class="ln">2962</span>            <b>if</b> (x<span class="s"> == </span><b>null</b>) {
-</code><code id="L2963"><span class="ln">2963</span>                <b>if</b> (<b>this</b>._vbSize) {
-</code><code id="L2964"><span class="ln">2964</span>                    size<span class="s"> = </span><span class="d">1</span>;
-</code><code id="L2965"><span class="ln">2965</span>                }
-</code><code id="L2966"><span class="ln">2966</span>                <b>delete</b> <b>this</b>._vbSize;
-</code><code id="L2967"><span class="ln">2967</span>                vb<span class="s"> = </span><i>"<span class="d">0</span> <span class="d">0</span> "</i><span class="s"> + </span><b>this</b>.width<span class="s"> + </span>S<span class="s"> + </span><b>this</b>.height;
-</code><code id="L2968"><span class="ln">2968</span>            } <b>else</b> {
-</code><code id="L2969"><span class="ln">2969</span>                <b>this</b>._vbSize<span class="s"> = </span>size;
-</code><code id="L2970"><span class="ln">2970</span>                vb<span class="s"> = </span>x<span class="s"> + </span>S<span class="s"> + </span>y<span class="s"> + </span>S<span class="s"> + </span>w<span class="s"> + </span>S<span class="s"> + </span>h;
-</code><code id="L2971"><span class="ln">2971</span>            }
-</code><code id="L2972"><span class="ln">2972</span>            $(<b>this</b>.canvas, {
-</code><code id="L2973"><span class="ln">2973</span>                viewBox: vb,
-</code><code id="L2974"><span class="ln">2974</span>                preserveAspectRatio: aspectRatio
-</code><code id="L2975"><span class="ln">2975</span>            });
-</code><code id="L2976"><span class="ln">2976</span>            <b>while</b> (size<span class="s"> &amp;&amp; </span>top) {
-</code><code id="L2977"><span class="ln">2977</span>                sw<span class="s"> = </span><i>"stroke-width"</i> <b>in</b> top.attrs ? top.attrs[<i>"stroke-width"</i>] : <span class="d">1</span>;
-</code><code id="L2978"><span class="ln">2978</span>                top.attr({<i>"stroke-width"</i>: sw});
-</code><code id="L2979"><span class="ln">2979</span>                top._.dirty<span class="s"> = </span><span class="d">1</span>;
-</code><code id="L2980"><span class="ln">2980</span>                top._.dirtyT<span class="s"> = </span><span class="d">1</span>;
-</code><code id="L2981"><span class="ln">2981</span>                top<span class="s"> = </span>top.prev;
-</code><code id="L2982"><span class="ln">2982</span>            }
-</code><code id="L2983"><span class="ln">2983</span>            <b>this</b>._viewBox<span class="s"> = </span>[x, y, w, h, !!fit];
-</code><code id="L2984"><span class="ln">2984</span>            <b>return</b> <b>this</b>;
-</code><code id="L2985"><span class="ln">2985</span>        };
-</code><code id="L2986"><span class="ln">2986</span><span class="c">        <span class="c">/*\</span>
-</span></code><code id="L2987"><span class="ln">2987</span><span class="c">        <span class="s"> * </span>Paper.clear
-</span></code><code id="L2988"><span class="ln">2988</span><span class="c">         [ method ]
-</span></code><code id="L2989"><span class="ln">2989</span><span class="c">         **
-</span></code><code id="L2990"><span class="ln">2990</span><span class="c">        <span class="s"> * </span>Clears the paper, i.e. removes all the elements.
-</span></code><code id="L2991"><span class="ln">2991</span><span class="c">        \*/</span>
-</code><code id="L2992"><span class="ln">2992</span>        paperproto.clear<span class="s"> = </span><b>function</b> () {
-</code><code id="L2993"><span class="ln">2993</span>            eve(<i>"clear"</i>, <b>this</b>);
-</code><code id="L2994"><span class="ln">2994</span>            <b>var</b> c<span class="s"> = </span><b>this</b>.canvas;
-</code><code id="L2995"><span class="ln">2995</span>            <b>while</b> (c.firstChild) {
-</code><code id="L2996"><span class="ln">2996</span>                c.removeChild(c.firstChild);
-</code><code id="L2997"><span class="ln">2997</span>            }
-</code><code id="L2998"><span class="ln">2998</span>            <b>this</b>.bottom<span class="s"> = </span><b>this</b>.top<span class="s"> = </span><b>null</b>;
-</code><code id="L2999"><span class="ln">2999</span>            (<b>this</b>.desc<span class="s"> = </span>$(<i>"desc"</i>)).appendChild(g.doc.createTextNode(<i>"Created <b>with</b> Rapha\xebl "</i><span class="s"> + </span>R.version));
-</code><code id="L3000"><span class="ln">3000</span>            c.appendChild(<b>this</b>.desc);
-</code><code id="L3001"><span class="ln">3001</span>            c.appendChild(<b>this</b>.defs<span class="s"> = </span>$(<i>"defs"</i>));
-</code><code id="L3002"><span class="ln">3002</span>        };
-</code><code id="L3003"><span class="ln">3003</span><span class="c">        <span class="c">/*\</span>
-</span></code><code id="L3004"><span class="ln">3004</span><span class="c">        <span class="s"> * </span>Paper.remove
-</span></code><code id="L3005"><span class="ln">3005</span><span class="c">         [ method ]
-</span></code><code id="L3006"><span class="ln">3006</span><span class="c">         **
-</span></code><code id="L3007"><span class="ln">3007</span><span class="c">        <span class="s"> * </span>Removes the paper from the DOM.
-</span></code><code id="L3008"><span class="ln">3008</span><span class="c">        \*/</span>
-</code><code id="L3009"><span class="ln">3009</span>        paperproto.remove<span class="s"> = </span><b>function</b> () {
-</code><code id="L3010"><span class="ln">3010</span>            eve(<i>"remove"</i>, <b>this</b>);
-</code><code id="L3011"><span class="ln">3011</span>            <b>this</b>.canvas.parentNode<span class="s"> &amp;&amp; </span><b>this</b>.canvas.parentNode.removeChild(<b>this</b>.canvas);
-</code><code id="L3012"><span class="ln">3012</span>            <b>for</b> (<b>var</b> i <b>in</b> <b>this</b>) {
-</code><code id="L3013"><span class="ln">3013</span>                <b>this</b>[i]<span class="s"> = </span>removed(i);
-</code><code id="L3014"><span class="ln">3014</span>            }
-</code><code id="L3015"><span class="ln">3015</span>        };
-</code><code id="L3016"><span class="ln">3016</span>    }
-</code><code id="L3017"><span class="ln">3017</span>
-</code><code id="L3018"><span class="ln">3018</span>    <span class="c">// VML</span>
-</code><code id="L3019"><span class="ln">3019</span>    <b>if</b> (R.vml) {
-</code><code id="L3020"><span class="ln">3020</span>        <b>var</b> map<span class="s"> = </span>{M: <i>"m"</i>, L: <i>"l"</i>, C: <i>"c"</i>, Z: <i>"x"</i>, m: <i>"t"</i>, l: <i>"r"</i>, c: <i>"v"</i>, z: <i>"x"</i>},
-</code><code id="L3021"><span class="ln">3021</span>            bites<span class="s"> = </span>/([clmz]),?([^clmz]*)/gi,
-</code><code id="L3022"><span class="ln">3022</span>            blurregexp<span class="s"> = </span>/ progid:\S+Blur\([^\)]+\)/g,
-</code><code id="L3023"><span class="ln">3023</span>            val<span class="s"> = </span>/-?[^,\s-]+/g,
-</code><code id="L3024"><span class="ln">3024</span>            cssDot<span class="s"> = </span><i>"position:absolute;left:<span class="d">0</span>;top:<span class="d">0</span>;width:1px;height:1px"</i>,
-</code><code id="L3025"><span class="ln">3025</span>            zoom<span class="s"> = </span><span class="d">21600</span>,
-</code><code id="L3026"><span class="ln">3026</span>            pathTypes<span class="s"> = </span>{path: <span class="d">1</span>, rect: <span class="d">1</span>},
-</code><code id="L3027"><span class="ln">3027</span>            ovalTypes<span class="s"> = </span>{circle: <span class="d">1</span>, ellipse: <span class="d">1</span>},
-</code><code id="L3028"><span class="ln">3028</span>            path2vml<span class="s"> = </span><b>function</b> (path) {
-</code><code id="L3029"><span class="ln">3029</span>                <b>var</b> total<span class="s"> = </span> /[ahqstv]/ig,
-</code><code id="L3030"><span class="ln">3030</span>                    command<span class="s"> = </span>pathToAbsolute;
-</code><code id="L3031"><span class="ln">3031</span>                Str(path).match(total)<span class="s"> &amp;&amp; </span>(command<span class="s"> = </span>path2curve);
-</code><code id="L3032"><span class="ln">3032</span>                total<span class="s"> = </span>/[clmz]/g;
-</code><code id="L3033"><span class="ln">3033</span>                <b>if</b> (command<span class="s"> == </span>pathToAbsolute<span class="s"> &amp;&amp; </span>!Str(path).match(total)) {
-</code><code id="L3034"><span class="ln">3034</span>                    <b>var</b> res<span class="s"> = </span>Str(path).replace(bites, <b>function</b> (all, command, args) {
-</code><code id="L3035"><span class="ln">3035</span>                        <b>var</b> vals<span class="s"> = </span>[],
-</code><code id="L3036"><span class="ln">3036</span>                            isMove<span class="s"> = </span>lowerCase.call(command)<span class="s"> == </span><i>"m"</i>,
-</code><code id="L3037"><span class="ln">3037</span>                            res<span class="s"> = </span>map[command];
-</code><code id="L3038"><span class="ln">3038</span>                        args.replace(val, <b>function</b> (value) {
-</code><code id="L3039"><span class="ln">3039</span>                            <b>if</b> (isMove<span class="s"> &amp;&amp; </span>vals.length<span class="s"> == </span><span class="d">2</span>) {
-</code><code id="L3040"><span class="ln">3040</span>                                res += vals<span class="s"> + </span>map[command<span class="s"> == </span><i>"m"</i> ? <i>"l"</i> : <i>"L"</i>];
-</code><code id="L3041"><span class="ln">3041</span>                                vals<span class="s"> = </span>[];
-</code><code id="L3042"><span class="ln">3042</span>                            }
-</code><code id="L3043"><span class="ln">3043</span>                            vals.push(round(value<span class="s"> * </span>zoom));
-</code><code id="L3044"><span class="ln">3044</span>                        });
-</code><code id="L3045"><span class="ln">3045</span>                        <b>return</b> res<span class="s"> + </span>vals;
-</code><code id="L3046"><span class="ln">3046</span>                    });
-</code><code id="L3047"><span class="ln">3047</span>                    <b>return</b> res;
-</code><code id="L3048"><span class="ln">3048</span>                }
-</code><code id="L3049"><span class="ln">3049</span>                <b>var</b> pa<span class="s"> = </span>command(path), p, r;
-</code><code id="L3050"><span class="ln">3050</span>                res<span class="s"> = </span>[];
-</code><code id="L3051"><span class="ln">3051</span>                <b>for</b> (<b>var</b> i<span class="s"> = </span><span class="d">0</span>, ii<span class="s"> = </span>pa.length; i &lt; ii; i++) {
-</code><code id="L3052"><span class="ln">3052</span>                    p<span class="s"> = </span>pa[i];
-</code><code id="L3053"><span class="ln">3053</span>                    r<span class="s"> = </span>lowerCase.call(pa[i][<span class="d">0</span>]);
-</code><code id="L3054"><span class="ln">3054</span>                    r<span class="s"> == </span><i>"z"</i><span class="s"> &amp;&amp; </span>(r<span class="s"> = </span><i>"x"</i>);
-</code><code id="L3055"><span class="ln">3055</span>                    <b>for</b> (<b>var</b> j<span class="s"> = </span><span class="d">1</span>, jj<span class="s"> = </span>p.length; j &lt; jj; j++) {
-</code><code id="L3056"><span class="ln">3056</span>                        r += round(p[j]<span class="s"> * </span>zoom)<span class="s"> + </span>(j != jj<span class="s"> - </span><span class="d">1</span> ? <i>","</i> : E);
-</code><code id="L3057"><span class="ln">3057</span>                    }
-</code><code id="L3058"><span class="ln">3058</span>                    res.push(r);
-</code><code id="L3059"><span class="ln">3059</span>                }
-</code><code id="L3060"><span class="ln">3060</span>                <b>return</b> res.join(S);
-</code><code id="L3061"><span class="ln">3061</span>            },
-</code><code id="L3062"><span class="ln">3062</span>            compensation<span class="s"> = </span><b>function</b> (deg, dx, dy) {
-</code><code id="L3063"><span class="ln">3063</span>                <b>var</b> m<span class="s"> = </span><b>new</b> Matrix;
-</code><code id="L3064"><span class="ln">3064</span>                m.rotate(-deg, <span class="d">.5</span>, <span class="d">.5</span>);
-</code><code id="L3065"><span class="ln">3065</span>                <b>return</b> {
-</code><code id="L3066"><span class="ln">3066</span>                    dx: m.x(dx, dy),
-</code><code id="L3067"><span class="ln">3067</span>                    dy: m.y(dx, dy)
-</code><code id="L3068"><span class="ln">3068</span>                };
-</code><code id="L3069"><span class="ln">3069</span>            },
-</code><code id="L3070"><span class="ln">3070</span>            setCoords<span class="s"> = </span><b>function</b> (p) {
-</code><code id="L3071"><span class="ln">3071</span>                <b>var</b> _<span class="s"> = </span>p._,
-</code><code id="L3072"><span class="ln">3072</span>                    sx<span class="s"> = </span>_.sx,
-</code><code id="L3073"><span class="ln">3073</span>                    sy<span class="s"> = </span>_.sy,
-</code><code id="L3074"><span class="ln">3074</span>                    deg<span class="s"> = </span>_.deg,
-</code><code id="L3075"><span class="ln">3075</span>                    dx<span class="s"> = </span>_.dx,
-</code><code id="L3076"><span class="ln">3076</span>                    dy<span class="s"> = </span>_.dy,
-</code><code id="L3077"><span class="ln">3077</span>                    fillpos<span class="s"> = </span>_.fillpos,
-</code><code id="L3078"><span class="ln">3078</span>                    o<span class="s"> = </span>p.node,
-</code><code id="L3079"><span class="ln">3079</span>                    s<span class="s"> = </span>o.style,
-</code><code id="L3080"><span class="ln">3080</span>                    y<span class="s"> = </span><span class="d">1</span>,
-</code><code id="L3081"><span class="ln">3081</span>                    m<span class="s"> = </span>p.matrix,
-</code><code id="L3082"><span class="ln">3082</span>                    flip<span class="s"> = </span><i>""</i>,
-</code><code id="L3083"><span class="ln">3083</span>                    dxdy,
-</code><code id="L3084"><span class="ln">3084</span>                    kx<span class="s"> = </span>zoom<span class="s"> / </span>sx,
-</code><code id="L3085"><span class="ln">3085</span>                    ky<span class="s"> = </span>zoom<span class="s"> / </span>sy;
-</code><code id="L3086"><span class="ln">3086</span>                s.visibility<span class="s"> = </span><i>"hidden"</i>;
-</code><code id="L3087"><span class="ln">3087</span>                o.coordsize<span class="s"> = </span>abs(kx)<span class="s"> + </span>S<span class="s"> + </span>abs(ky);
-</code><code id="L3088"><span class="ln">3088</span>                s.rotation<span class="s"> = </span>deg<span class="s"> * </span>(sx<span class="s"> * </span>sy &lt; <span class="d">0</span> ? -<span class="d">1</span> : <span class="d">1</span>);
-</code><code id="L3089"><span class="ln">3089</span>                <b>if</b> (deg) {
-</code><code id="L3090"><span class="ln">3090</span>                    <b>var</b> c<span class="s"> = </span>compensation(deg, dx, dy);
-</code><code id="L3091"><span class="ln">3091</span>                    dx<span class="s"> = </span>c.dx;
-</code><code id="L3092"><span class="ln">3092</span>                    dy<span class="s"> = </span>c.dy;
-</code><code id="L3093"><span class="ln">3093</span>                }
-</code><code id="L3094"><span class="ln">3094</span>                sx &lt; <span class="d">0</span><span class="s"> &amp;&amp; </span>(flip += <i>"x"</i>);
-</code><code id="L3095"><span class="ln">3095</span>                sy &lt; <span class="d">0</span><span class="s"> &amp;&amp; </span>(flip += <i>" y"</i>)<span class="s"> &amp;&amp; </span>(y<span class="s"> = </span>-<span class="d">1</span>);
-</code><code id="L3096"><span class="ln">3096</span>                s.flip<span class="s"> = </span>flip;
-</code><code id="L3097"><span class="ln">3097</span>                o.coordorigin<span class="s"> = </span>(dx<span class="s"> * </span>-kx)<span class="s"> + </span>S<span class="s"> + </span>(dy<span class="s"> * </span>-ky);
-</code><code id="L3098"><span class="ln">3098</span>                <b>if</b> (fillpos<span class="s"> || </span>_.fillsize) {
-</code><code id="L3099"><span class="ln">3099</span>                    <b>var</b> fill<span class="s"> = </span>o.getElementsByTagName(fillString);
-</code><code id="L3100"><span class="ln">3100</span>                    fill<span class="s"> = </span>fill<span class="s"> &amp;&amp; </span>fill[<span class="d">0</span>];
-</code><code id="L3101"><span class="ln">3101</span>                    o.removeChild(fill);
-</code><code id="L3102"><span class="ln">3102</span>                    <b>if</b> (fillpos) {
-</code><code id="L3103"><span class="ln">3103</span>                        c<span class="s"> = </span>compensation(deg, m.x(fillpos[<span class="d">0</span>], fillpos[<span class="d">1</span>]), m.y(fillpos[<span class="d">0</span>], fillpos[<span class="d">1</span>]));
-</code><code id="L3104"><span class="ln">3104</span>                        fill.position<span class="s"> = </span>c.dx<span class="s"> * </span>y<span class="s"> + </span>S<span class="s"> + </span>c.dy<span class="s"> * </span>y;
-</code><code id="L3105"><span class="ln">3105</span>                    }
-</code><code id="L3106"><span class="ln">3106</span>                    <b>if</b> (_.fillsize) {
-</code><code id="L3107"><span class="ln">3107</span>                        fill.size<span class="s"> = </span>_.fillsize[<span class="d">0</span>]<span class="s"> * </span>abs(sx)<span class="s"> + </span>S<span class="s"> + </span>_.fillsize[<span class="d">1</span>]<span class="s"> * </span>abs(sy);
-</code><code id="L3108"><span class="ln">3108</span>                    }
-</code><code id="L3109"><span class="ln">3109</span>                    o.appendChild(fill);
-</code><code id="L3110"><span class="ln">3110</span>                }
-</code><code id="L3111"><span class="ln">3111</span>                s.visibility<span class="s"> = </span><i>"visible"</i>;
-</code><code id="L3112"><span class="ln">3112</span>            };
-</code><code id="L3113"><span class="ln">3113</span>        R.toString<span class="s"> = </span><b>function</b> () {
-</code><code id="L3114"><span class="ln">3114</span>            <b>return</b>  <i>"Your browser doesn\u2019t support SVG. Falling down to VML.\nYou are running Rapha\xebl "</i><span class="s"> + </span><b>this</b>.version;
-</code><code id="L3115"><span class="ln">3115</span>        };
-</code><code id="L3116"><span class="ln">3116</span>        addArrow<span class="s"> = </span><b>function</b> (o, value, isEnd) {
-</code><code id="L3117"><span class="ln">3117</span>            <b>var</b> values<span class="s"> = </span>Str(value).toLowerCase().split(<i>"-"</i>),
-</code><code id="L3118"><span class="ln">3118</span>                se<span class="s"> = </span>isEnd ? <i>"end"</i> : <i>"start"</i>,
-</code><code id="L3119"><span class="ln">3119</span>                i<span class="s"> = </span>values.length,
-</code><code id="L3120"><span class="ln">3120</span>                type<span class="s"> = </span><i>"classic"</i>,
-</code><code id="L3121"><span class="ln">3121</span>                w<span class="s"> = </span><i>"medium"</i>,
-</code><code id="L3122"><span class="ln">3122</span>                h<span class="s"> = </span><i>"medium"</i>;
-</code><code id="L3123"><span class="ln">3123</span>            <b>while</b> (i--) {
-</code><code id="L3124"><span class="ln">3124</span>                <b>switch</b> (values[i]) {
-</code><code id="L3125"><span class="ln">3125</span>                    <b>case</b> <i>"block"</i>:
-</code><code id="L3126"><span class="ln">3126</span>                    <b>case</b> <i>"classic"</i>:
-</code><code id="L3127"><span class="ln">3127</span>                    <b>case</b> <i>"oval"</i>:
-</code><code id="L3128"><span class="ln">3128</span>                    <b>case</b> <i>"diamond"</i>:
-</code><code id="L3129"><span class="ln">3129</span>                    <b>case</b> <i>"open"</i>:
-</code><code id="L3130"><span class="ln">3130</span>                    <b>case</b> <i>"none"</i>:
-</code><code id="L3131"><span class="ln">3131</span>                        type<span class="s"> = </span>values[i];
-</code><code id="L3132"><span class="ln">3132</span>                        <b>break</b>;
-</code><code id="L3133"><span class="ln">3133</span>                    <b>case</b> <i>"wide"</i>:
-</code><code id="L3134"><span class="ln">3134</span>                    <b>case</b> <i>"narrow"</i>: h<span class="s"> = </span>values[i]; <b>break</b>;
-</code><code id="L3135"><span class="ln">3135</span>                    <b>case</b> <i>"<b>long</b>"</i>:
-</code><code id="L3136"><span class="ln">3136</span>                    <b>case</b> <i>"<b>short</b>"</i>: w<span class="s"> = </span>values[i]; <b>break</b>;
-</code><code id="L3137"><span class="ln">3137</span>                }
-</code><code id="L3138"><span class="ln">3138</span>            }
-</code><code id="L3139"><span class="ln">3139</span>            <b>var</b> stroke<span class="s"> = </span>o.node.getElementsByTagName(<i>"stroke"</i>)[<span class="d">0</span>];
-</code><code id="L3140"><span class="ln">3140</span>            stroke[se<span class="s"> + </span><i>"arrow"</i>]<span class="s"> = </span>type;
-</code><code id="L3141"><span class="ln">3141</span>            stroke[se<span class="s"> + </span><i>"arrowlength"</i>]<span class="s"> = </span>w;
-</code><code id="L3142"><span class="ln">3142</span>            stroke[se<span class="s"> + </span><i>"arrowwidth"</i>]<span class="s"> = </span>h;
-</code><code id="L3143"><span class="ln">3143</span>        };
-</code><code id="L3144"><span class="ln">3144</span>        setFillAndStroke<span class="s"> = </span><b>function</b> (o, params) {
-</code><code id="L3145"><span class="ln">3145</span>            o.paper.canvas.style.display<span class="s"> = </span><i>"none"</i>;
-</code><code id="L3146"><span class="ln">3146</span>            o.attrs<span class="s"> = </span>o.attrs<span class="s"> || </span>{};
-</code><code id="L3147"><span class="ln">3147</span>            <b>var</b> node<span class="s"> = </span>o.node,
-</code><code id="L3148"><span class="ln">3148</span>                a<span class="s"> = </span>o.attrs,
-</code><code id="L3149"><span class="ln">3149</span>                s<span class="s"> = </span>node.style,
-</code><code id="L3150"><span class="ln">3150</span>                xy,
-</code><code id="L3151"><span class="ln">3151</span>                newpath<span class="s"> = </span>pathTypes[o.type]<span class="s"> &amp;&amp; </span>(params.x != a.x<span class="s"> || </span>params.y != a.y<span class="s"> || </span>params.width != a.width<span class="s"> || </span>params.height != a.height<span class="s"> || </span>params.cx != a.cx<span class="s"> || </span>params.cy != a.cy<span class="s"> || </span>params.rx != a.rx<span class="s"> || </span>params.ry != a.ry<span class="s"> || </span>params.r != a.r),
-</code><code id="L3152"><span class="ln">3152</span>                isOval<span class="s"> = </span>ovalTypes[o.type]<span class="s"> &amp;&amp; </span>(a.cx != params.cx<span class="s"> || </span>a.cy != params.cy<span class="s"> || </span>a.r != params.r<span class="s"> || </span>a.rx != params.rx<span class="s"> || </span>a.ry != params.ry),
-</code><code id="L3153"><span class="ln">3153</span>                res<span class="s"> = </span>o;
-</code><code id="L3154"><span class="ln">3154</span>
-</code><code id="L3155"><span class="ln">3155</span>
-</code><code id="L3156"><span class="ln">3156</span>            <b>for</b> (<b>var</b> par <b>in</b> params) <b>if</b> (params[has](par)) {
-</code><code id="L3157"><span class="ln">3157</span>                a[par]<span class="s"> = </span>params[par];
-</code><code id="L3158"><span class="ln">3158</span>            }
-</code><code id="L3159"><span class="ln">3159</span>            <b>if</b> (newpath) {
-</code><code id="L3160"><span class="ln">3160</span>                a.path<span class="s"> = </span>getPath[o.type](o);
-</code><code id="L3161"><span class="ln">3161</span>                o._.dirty<span class="s"> = </span><span class="d">1</span>;
-</code><code id="L3162"><span class="ln">3162</span>            }
-</code><code id="L3163"><span class="ln">3163</span>            params.href<span class="s"> &amp;&amp; </span>(node.href<span class="s"> = </span>params.href);
-</code><code id="L3164"><span class="ln">3164</span>            params.title<span class="s"> &amp;&amp; </span>(node.title<span class="s"> = </span>params.title);
-</code><code id="L3165"><span class="ln">3165</span>            params.target<span class="s"> &amp;&amp; </span>(node.target<span class="s"> = </span>params.target);
-</code><code id="L3166"><span class="ln">3166</span>            params.cursor<span class="s"> &amp;&amp; </span>(s.cursor<span class="s"> = </span>params.cursor);
-</code><code id="L3167"><span class="ln">3167</span>            <i>"blur"</i> <b>in</b> params<span class="s"> &amp;&amp; </span>o.blur(params.blur);
-</code><code id="L3168"><span class="ln">3168</span>            <i>"transform"</i> <b>in</b> params<span class="s"> &amp;&amp; </span>o.transform(params.transform);
-</code><code id="L3169"><span class="ln">3169</span>            <b>if</b> (params.path<span class="s"> &amp;&amp; </span>o.type<span class="s"> == </span><i>"path"</i><span class="s"> || </span>newpath) {
-</code><code id="L3170"><span class="ln">3170</span>                node.path<span class="s"> = </span>path2vml(a.path);
-</code><code id="L3171"><span class="ln">3171</span>            }
-</code><code id="L3172"><span class="ln">3172</span>            <b>if</b> (isOval) {
-</code><code id="L3173"><span class="ln">3173</span>                <b>var</b> cx<span class="s"> = </span>a.cx,
-</code><code id="L3174"><span class="ln">3174</span>                    cy<span class="s"> = </span>a.cy,
-</code><code id="L3175"><span class="ln">3175</span>                    rx<span class="s"> = </span>a.rx<span class="s"> || </span>a.r<span class="s"> || </span><span class="d">0</span>,
-</code><code id="L3176"><span class="ln">3176</span>                    ry<span class="s"> = </span>a.ry<span class="s"> || </span>a.r<span class="s"> || </span><span class="d">0</span>;
-</code><code id="L3177"><span class="ln">3177</span>                node.path<span class="s"> = </span>R.format(<i>"ar{<span class="d">0</span>},{<span class="d">1</span>},{<span class="d">2</span>},{<span class="d">3</span>},{<span class="d">4</span>},{<span class="d">1</span>},{<span class="d">4</span>},{<span class="d">1</span>}x"</i>, round((cx<span class="s"> - </span>rx)<span class="s"> * </span>zoom), round((cy<span class="s"> - </span>ry)<span class="s"> * </span>zoom), round((cx<span class="s"> + </span>rx)<span class="s"> * </span>zoom), round((cy<span class="s"> + </span>ry)<span class="s"> * </span>zoom), round(cx<span class="s"> * </span>zoom));
-</code><code id="L3178"><span class="ln">3178</span>            }
-</code><code id="L3179"><span class="ln">3179</span>            <b>if</b> (<i>"clip-rect"</i> <b>in</b> params) {
-</code><code id="L3180"><span class="ln">3180</span>                <b>var</b> rect<span class="s"> = </span>Str(params[<i>"clip-rect"</i>]).split(separator);
-</code><code id="L3181"><span class="ln">3181</span>                <b>if</b> (rect.length<span class="s"> == </span><span class="d">4</span>) {
-</code><code id="L3182"><span class="ln">3182</span>                    rect[<span class="d">2</span>]<span class="s"> = </span>+rect[<span class="d">2</span>]<span class="s"> + </span>(+rect[<span class="d">0</span>]);
-</code><code id="L3183"><span class="ln">3183</span>                    rect[<span class="d">3</span>]<span class="s"> = </span>+rect[<span class="d">3</span>]<span class="s"> + </span>(+rect[<span class="d">1</span>]);
-</code><code id="L3184"><span class="ln">3184</span>                    <b>var</b> div<span class="s"> = </span>node.clipRect<span class="s"> || </span>g.doc.createElement(<i>"div"</i>),
-</code><code id="L3185"><span class="ln">3185</span>                        dstyle<span class="s"> = </span>div.style,
-</code><code id="L3186"><span class="ln">3186</span>                        group<span class="s"> = </span>node.parentNode;
-</code><code id="L3187"><span class="ln">3187</span>                    dstyle.clip<span class="s"> = </span>R.format(<i>"rect({<span class="d">1</span>}px {<span class="d">2</span>}px {<span class="d">3</span>}px {<span class="d">0</span>}px)"</i>, rect);
-</code><code id="L3188"><span class="ln">3188</span>                    <b>if</b> (!node.clipRect) {
-</code><code id="L3189"><span class="ln">3189</span>                        dstyle.position<span class="s"> = </span><i>"absolute"</i>;
-</code><code id="L3190"><span class="ln">3190</span>                        dstyle.top<span class="s"> = </span><span class="d">0</span>;
-</code><code id="L3191"><span class="ln">3191</span>                        dstyle.left<span class="s"> = </span><span class="d">0</span>;
-</code><code id="L3192"><span class="ln">3192</span>                        dstyle.width<span class="s"> = </span>o.paper.width<span class="s"> + </span><i>"px"</i>;
-</code><code id="L3193"><span class="ln">3193</span>                        dstyle.height<span class="s"> = </span>o.paper.height<span class="s"> + </span><i>"px"</i>;
-</code><code id="L3194"><span class="ln">3194</span>                        group.parentNode.insertBefore(div, group);
-</code><code id="L3195"><span class="ln">3195</span>                        div.appendChild(group);
-</code><code id="L3196"><span class="ln">3196</span>                        node.clipRect<span class="s"> = </span>div;
-</code><code id="L3197"><span class="ln">3197</span>                    }
-</code><code id="L3198"><span class="ln">3198</span>                }
-</code><code id="L3199"><span class="ln">3199</span>                <b>if</b> (!params[<i>"clip-rect"</i>]) {
-</code><code id="L3200"><span class="ln">3200</span>                    node.clipRect<span class="s"> &amp;&amp; </span>(node.clipRect.style.clip<span class="s"> = </span>E);
-</code><code id="L3201"><span class="ln">3201</span>                }
-</code><code id="L3202"><span class="ln">3202</span>            }
-</code><code id="L3203"><span class="ln">3203</span>            <b>if</b> (o.textpath) {
-</code><code id="L3204"><span class="ln">3204</span>                <b>var</b> textpathStyle<span class="s"> = </span>o.textpath.style;
-</code><code id="L3205"><span class="ln">3205</span>                params.font<span class="s"> &amp;&amp; </span>(textpathStyle.font<span class="s"> = </span>params.font);
-</code><code id="L3206"><span class="ln">3206</span>                params[<i>"font-family"</i>]<span class="s"> &amp;&amp; </span>(textpathStyle.fontFamily<span class="s"> = </span><i>'"'</i><span class="s"> + </span>params[<i>"font-family"</i>].split(<i>","</i>)[<span class="d">0</span>].replace(/^[<i>'"]+|['</i><i>"]+$/g, E)<span class="s"> + </span>'"</i>');
-</code><code id="L3207"><span class="ln">3207</span>                params[<i>"font-size"</i>]<span class="s"> &amp;&amp; </span>(textpathStyle.fontSize<span class="s"> = </span>params[<i>"font-size"</i>]);
-</code><code id="L3208"><span class="ln">3208</span>                params[<i>"font-weight"</i>]<span class="s"> &amp;&amp; </span>(textpathStyle.fontWeight<span class="s"> = </span>params[<i>"font-weight"</i>]);
-</code><code id="L3209"><span class="ln">3209</span>                params[<i>"font-style"</i>]<span class="s"> &amp;&amp; </span>(textpathStyle.fontStyle<span class="s"> = </span>params[<i>"font-style"</i>]);
+</code><code id="L2925"><span class="ln">2925</span>                css<span class="s"> = </span><i>"overflow:hidden;"</i>,
+</code><code id="L2926"><span class="ln">2926</span>                isFloating;
+</code><code id="L2927"><span class="ln">2927</span>            x<span class="s"> = </span>x<span class="s"> || </span><span class="d">0</span>;
+</code><code id="L2928"><span class="ln">2928</span>            y<span class="s"> = </span>y<span class="s"> || </span><span class="d">0</span>;
+</code><code id="L2929"><span class="ln">2929</span>            width<span class="s"> = </span>width<span class="s"> || </span><span class="d">512</span>;
+</code><code id="L2930"><span class="ln">2930</span>            height<span class="s"> = </span>height<span class="s"> || </span><span class="d">342</span>;
+</code><code id="L2931"><span class="ln">2931</span>            $(cnvs, {
+</code><code id="L2932"><span class="ln">2932</span>                height: height,
+</code><code id="L2933"><span class="ln">2933</span>                version: <span class="d">1.1</span>,
+</code><code id="L2934"><span class="ln">2934</span>                width: width,
+</code><code id="L2935"><span class="ln">2935</span>                xmlns: <i>"http:<span class="c">//www.w3.org/<span class="d">2000</span>/svg"</i></span>
+</code><code id="L2936"><span class="ln">2936</span>            });
+</code><code id="L2937"><span class="ln">2937</span>            <b>if</b> (container<span class="s"> == </span><span class="d">1</span>) {
+</code><code id="L2938"><span class="ln">2938</span>                cnvs.style.cssText<span class="s"> = </span>css<span class="s"> + </span><i>"position:absolute;left:"</i><span class="s"> + </span>x<span class="s"> + </span><i>"px;top:"</i><span class="s"> + </span>y<span class="s"> + </span><i>"px"</i>;
+</code><code id="L2939"><span class="ln">2939</span>                g.doc.body.appendChild(cnvs);
+</code><code id="L2940"><span class="ln">2940</span>                isFloating<span class="s"> = </span><span class="d">1</span>;
+</code><code id="L2941"><span class="ln">2941</span>            } <b>else</b> {
+</code><code id="L2942"><span class="ln">2942</span>                cnvs.style.cssText<span class="s"> = </span>css<span class="s"> + </span><i>"position:relative"</i>;
+</code><code id="L2943"><span class="ln">2943</span>                <b>if</b> (container.firstChild) {
+</code><code id="L2944"><span class="ln">2944</span>                    container.insertBefore(cnvs, container.firstChild);
+</code><code id="L2945"><span class="ln">2945</span>                } <b>else</b> {
+</code><code id="L2946"><span class="ln">2946</span>                    container.appendChild(cnvs);
+</code><code id="L2947"><span class="ln">2947</span>                }
+</code><code id="L2948"><span class="ln">2948</span>            }
+</code><code id="L2949"><span class="ln">2949</span>            container<span class="s"> = </span><b>new</b> Paper;
+</code><code id="L2950"><span class="ln">2950</span>            container.width<span class="s"> = </span>width;
+</code><code id="L2951"><span class="ln">2951</span>            container.height<span class="s"> = </span>height;
+</code><code id="L2952"><span class="ln">2952</span>            container.canvas<span class="s"> = </span>cnvs;
+</code><code id="L2953"><span class="ln">2953</span>            plugins.call(container, container, R.fn);
+</code><code id="L2954"><span class="ln">2954</span>            container.clear();
+</code><code id="L2955"><span class="ln">2955</span>            container._left<span class="s"> = </span>container._top<span class="s"> = </span><span class="d">0</span>;
+</code><code id="L2956"><span class="ln">2956</span>            isFloating<span class="s"> &amp;&amp; </span>(container.renderfix<span class="s"> = </span>fun);
+</code><code id="L2957"><span class="ln">2957</span>            container.renderfix();
+</code><code id="L2958"><span class="ln">2958</span>            <b>return</b> container;
+</code><code id="L2959"><span class="ln">2959</span>        },
+</code><code id="L2960"><span class="ln">2960</span>        setViewBox<span class="s"> = </span><b>function</b> (x, y, w, h, fit) {
+</code><code id="L2961"><span class="ln">2961</span>            eve(<i>"setViewBox"</i>, <b>this</b>, <b>this</b>._viewBox, [x, y, w, h, fit]);
+</code><code id="L2962"><span class="ln">2962</span>            <b>var</b> size<span class="s"> = </span>mmax(w<span class="s"> / </span><b>this</b>.width, h<span class="s"> / </span><b>this</b>.height),
+</code><code id="L2963"><span class="ln">2963</span>                top<span class="s"> = </span><b>this</b>.top,
+</code><code id="L2964"><span class="ln">2964</span>                aspectRatio<span class="s"> = </span>fit ? <i>"meet"</i> : <i>"xMinYMin"</i>,
+</code><code id="L2965"><span class="ln">2965</span>                vb,
+</code><code id="L2966"><span class="ln">2966</span>                sw;
+</code><code id="L2967"><span class="ln">2967</span>            <b>if</b> (x<span class="s"> == </span><b>null</b>) {
+</code><code id="L2968"><span class="ln">2968</span>                <b>if</b> (<b>this</b>._vbSize) {
+</code><code id="L2969"><span class="ln">2969</span>                    size<span class="s"> = </span><span class="d">1</span>;
+</code><code id="L2970"><span class="ln">2970</span>                }
+</code><code id="L2971"><span class="ln">2971</span>                <b>delete</b> <b>this</b>._vbSize;
+</code><code id="L2972"><span class="ln">2972</span>                vb<span class="s"> = </span><i>"<span class="d">0</span> <span class="d">0</span> "</i><span class="s"> + </span><b>this</b>.width<span class="s"> + </span>S<span class="s"> + </span><b>this</b>.height;
+</code><code id="L2973"><span class="ln">2973</span>            } <b>else</b> {
+</code><code id="L2974"><span class="ln">2974</span>                <b>this</b>._vbSize<span class="s"> = </span>size;
+</code><code id="L2975"><span class="ln">2975</span>                vb<span class="s"> = </span>x<span class="s"> + </span>S<span class="s"> + </span>y<span class="s"> + </span>S<span class="s"> + </span>w<span class="s"> + </span>S<span class="s"> + </span>h;
+</code><code id="L2976"><span class="ln">2976</span>            }
+</code><code id="L2977"><span class="ln">2977</span>            $(<b>this</b>.canvas, {
+</code><code id="L2978"><span class="ln">2978</span>                viewBox: vb,
+</code><code id="L2979"><span class="ln">2979</span>                preserveAspectRatio: aspectRatio
+</code><code id="L2980"><span class="ln">2980</span>            });
+</code><code id="L2981"><span class="ln">2981</span>            <b>while</b> (size<span class="s"> &amp;&amp; </span>top) {
+</code><code id="L2982"><span class="ln">2982</span>                sw<span class="s"> = </span><i>"stroke-width"</i> <b>in</b> top.attrs ? top.attrs[<i>"stroke-width"</i>] : <span class="d">1</span>;
+</code><code id="L2983"><span class="ln">2983</span>                top.attr({<i>"stroke-width"</i>: sw});
+</code><code id="L2984"><span class="ln">2984</span>                top._.dirty<span class="s"> = </span><span class="d">1</span>;
+</code><code id="L2985"><span class="ln">2985</span>                top._.dirtyT<span class="s"> = </span><span class="d">1</span>;
+</code><code id="L2986"><span class="ln">2986</span>                top<span class="s"> = </span>top.prev;
+</code><code id="L2987"><span class="ln">2987</span>            }
+</code><code id="L2988"><span class="ln">2988</span>            <b>this</b>._viewBox<span class="s"> = </span>[x, y, w, h, !!fit];
+</code><code id="L2989"><span class="ln">2989</span>            <b>return</b> <b>this</b>;
+</code><code id="L2990"><span class="ln">2990</span>        };
+</code><code id="L2991"><span class="ln">2991</span><span class="c">        <span class="c">/*\</span>
+</span></code><code id="L2992"><span class="ln">2992</span><span class="c">        <span class="s"> * </span>Paper.renderfix
+</span></code><code id="L2993"><span class="ln">2993</span><span class="c">         [ method ]
+</span></code><code id="L2994"><span class="ln">2994</span><span class="c">         **
+</span></code><code id="L2995"><span class="ln">2995</span><span class="c">        <span class="s"> * </span>Fixes the issue of Firefox and IE9 regarding subpixel rendering. If paper is dependant
+</span></code><code id="L2996"><span class="ln">2996</span><span class="c">        <span class="s"> * </span>on other elements after reflow it could shift half pixel which cause <b>for</b> lines to lost their crispness.
+</span></code><code id="L2997"><span class="ln">2997</span><span class="c">        <span class="s"> * </span>This method fixes the issue.
+</span></code><code id="L2998"><span class="ln">2998</span><span class="c">         **
+</span></code><code id="L2999"><span class="ln">2999</span><span class="c">           Special thanks to Mariusz Nowak (http:<span class="c">//www.medikoo.com/) <b>for</b> <b>this</b> method.</span>
+</span></code><code id="L3000"><span class="ln">3000</span><span class="c">        \*/</span>
+</code><code id="L3001"><span class="ln">3001</span>        paperproto.renderfix<span class="s"> = </span><b>function</b> () {
+</code><code id="L3002"><span class="ln">3002</span>            <b>var</b> cnvs<span class="s"> = </span><b>this</b>.canvas,
+</code><code id="L3003"><span class="ln">3003</span>                s<span class="s"> = </span>cnvs.style,
+</code><code id="L3004"><span class="ln">3004</span>                pos<span class="s"> = </span>cnvs.getScreenCTM(),
+</code><code id="L3005"><span class="ln">3005</span>                left<span class="s"> = </span>-pos.e<span class="s"> % </span><span class="d">1</span>,
+</code><code id="L3006"><span class="ln">3006</span>                top<span class="s"> = </span>-pos.f<span class="s"> % </span><span class="d">1</span>;
+</code><code id="L3007"><span class="ln">3007</span>            <b>if</b> (left<span class="s"> || </span>top) {
+</code><code id="L3008"><span class="ln">3008</span>                <b>if</b> (left) {
+</code><code id="L3009"><span class="ln">3009</span>                    <b>this</b>._left<span class="s"> = </span>(<b>this</b>._left<span class="s"> + </span>left)<span class="s"> % </span><span class="d">1</span>;
+</code><code id="L3010"><span class="ln">3010</span>                    s.left<span class="s"> = </span><b>this</b>._left<span class="s"> + </span><i>"px"</i>;
+</code><code id="L3011"><span class="ln">3011</span>                }
+</code><code id="L3012"><span class="ln">3012</span>                <b>if</b> (top) {
+</code><code id="L3013"><span class="ln">3013</span>                    <b>this</b>._top<span class="s"> = </span>(<b>this</b>._top<span class="s"> + </span>top)<span class="s"> % </span><span class="d">1</span>;
+</code><code id="L3014"><span class="ln">3014</span>                    s.top<span class="s"> = </span><b>this</b>._top<span class="s"> + </span><i>"px"</i>;
+</code><code id="L3015"><span class="ln">3015</span>                }
+</code><code id="L3016"><span class="ln">3016</span>            }
+</code><code id="L3017"><span class="ln">3017</span>        };
+</code><code id="L3018"><span class="ln">3018</span><span class="c">        <span class="c">/*\</span>
+</span></code><code id="L3019"><span class="ln">3019</span><span class="c">        <span class="s"> * </span>Paper.clear
+</span></code><code id="L3020"><span class="ln">3020</span><span class="c">         [ method ]
+</span></code><code id="L3021"><span class="ln">3021</span><span class="c">         **
+</span></code><code id="L3022"><span class="ln">3022</span><span class="c">        <span class="s"> * </span>Clears the paper, i.e. removes all the elements.
+</span></code><code id="L3023"><span class="ln">3023</span><span class="c">        \*/</span>
+</code><code id="L3024"><span class="ln">3024</span>        paperproto.clear<span class="s"> = </span><b>function</b> () {
+</code><code id="L3025"><span class="ln">3025</span>            eve(<i>"clear"</i>, <b>this</b>);
+</code><code id="L3026"><span class="ln">3026</span>            <b>var</b> c<span class="s"> = </span><b>this</b>.canvas;
+</code><code id="L3027"><span class="ln">3027</span>            <b>while</b> (c.firstChild) {
+</code><code id="L3028"><span class="ln">3028</span>                c.removeChild(c.firstChild);
+</code><code id="L3029"><span class="ln">3029</span>            }
+</code><code id="L3030"><span class="ln">3030</span>            <b>this</b>.bottom<span class="s"> = </span><b>this</b>.top<span class="s"> = </span><b>null</b>;
+</code><code id="L3031"><span class="ln">3031</span>            (<b>this</b>.desc<span class="s"> = </span>$(<i>"desc"</i>)).appendChild(g.doc.createTextNode(<i>"Created <b>with</b> Rapha\xebl "</i><span class="s"> + </span>R.version));
+</code><code id="L3032"><span class="ln">3032</span>            c.appendChild(<b>this</b>.desc);
+</code><code id="L3033"><span class="ln">3033</span>            c.appendChild(<b>this</b>.defs<span class="s"> = </span>$(<i>"defs"</i>));
+</code><code id="L3034"><span class="ln">3034</span>        };
+</code><code id="L3035"><span class="ln">3035</span><span class="c">        <span class="c">/*\</span>
+</span></code><code id="L3036"><span class="ln">3036</span><span class="c">        <span class="s"> * </span>Paper.remove
+</span></code><code id="L3037"><span class="ln">3037</span><span class="c">         [ method ]
+</span></code><code id="L3038"><span class="ln">3038</span><span class="c">         **
+</span></code><code id="L3039"><span class="ln">3039</span><span class="c">        <span class="s"> * </span>Removes the paper from the DOM.
+</span></code><code id="L3040"><span class="ln">3040</span><span class="c">        \*/</span>
+</code><code id="L3041"><span class="ln">3041</span>        paperproto.remove<span class="s"> = </span><b>function</b> () {
+</code><code id="L3042"><span class="ln">3042</span>            eve(<i>"remove"</i>, <b>this</b>);
+</code><code id="L3043"><span class="ln">3043</span>            <b>this</b>.canvas.parentNode<span class="s"> &amp;&amp; </span><b>this</b>.canvas.parentNode.removeChild(<b>this</b>.canvas);
+</code><code id="L3044"><span class="ln">3044</span>            <b>for</b> (<b>var</b> i <b>in</b> <b>this</b>) {
+</code><code id="L3045"><span class="ln">3045</span>                <b>this</b>[i]<span class="s"> = </span>removed(i);
+</code><code id="L3046"><span class="ln">3046</span>            }
+</code><code id="L3047"><span class="ln">3047</span>        };
+</code><code id="L3048"><span class="ln">3048</span>    }
+</code><code id="L3049"><span class="ln">3049</span>
+</code><code id="L3050"><span class="ln">3050</span>    <span class="c">// VML</span>
+</code><code id="L3051"><span class="ln">3051</span>    <b>if</b> (R.vml) {
+</code><code id="L3052"><span class="ln">3052</span>        <b>var</b> map<span class="s"> = </span>{M: <i>"m"</i>, L: <i>"l"</i>, C: <i>"c"</i>, Z: <i>"x"</i>, m: <i>"t"</i>, l: <i>"r"</i>, c: <i>"v"</i>, z: <i>"x"</i>},
+</code><code id="L3053"><span class="ln">3053</span>            bites<span class="s"> = </span>/([clmz]),?([^clmz]*)/gi,
+</code><code id="L3054"><span class="ln">3054</span>            blurregexp<span class="s"> = </span>/ progid:\S+Blur\([^\)]+\)/g,
+</code><code id="L3055"><span class="ln">3055</span>            val<span class="s"> = </span>/-?[^,\s-]+/g,
+</code><code id="L3056"><span class="ln">3056</span>            cssDot<span class="s"> = </span><i>"position:absolute;left:<span class="d">0</span>;top:<span class="d">0</span>;width:1px;height:1px"</i>,
+</code><code id="L3057"><span class="ln">3057</span>            zoom<span class="s"> = </span><span class="d">21600</span>,
+</code><code id="L3058"><span class="ln">3058</span>            pathTypes<span class="s"> = </span>{path: <span class="d">1</span>, rect: <span class="d">1</span>},
+</code><code id="L3059"><span class="ln">3059</span>            ovalTypes<span class="s"> = </span>{circle: <span class="d">1</span>, ellipse: <span class="d">1</span>},
+</code><code id="L3060"><span class="ln">3060</span>            path2vml<span class="s"> = </span><b>function</b> (path) {
+</code><code id="L3061"><span class="ln">3061</span>                <b>var</b> total<span class="s"> = </span> /[ahqstv]/ig,
+</code><code id="L3062"><span class="ln">3062</span>                    command<span class="s"> = </span>pathToAbsolute;
+</code><code id="L3063"><span class="ln">3063</span>                Str(path).match(total)<span class="s"> &amp;&amp; </span>(command<span class="s"> = </span>path2curve);
+</code><code id="L3064"><span class="ln">3064</span>                total<span class="s"> = </span>/[clmz]/g;
+</code><code id="L3065"><span class="ln">3065</span>                <b>if</b> (command<span class="s"> == </span>pathToAbsolute<span class="s"> &amp;&amp; </span>!Str(path).match(total)) {
+</code><code id="L3066"><span class="ln">3066</span>                    <b>var</b> res<span class="s"> = </span>Str(path).replace(bites, <b>function</b> (all, command, args) {
+</code><code id="L3067"><span class="ln">3067</span>                        <b>var</b> vals<span class="s"> = </span>[],
+</code><code id="L3068"><span class="ln">3068</span>                            isMove<span class="s"> = </span>lowerCase.call(command)<span class="s"> == </span><i>"m"</i>,
+</code><code id="L3069"><span class="ln">3069</span>                            res<span class="s"> = </span>map[command];
+</code><code id="L3070"><span class="ln">3070</span>                        args.replace(val, <b>function</b> (value) {
+</code><code id="L3071"><span class="ln">3071</span>                            <b>if</b> (isMove<span class="s"> &amp;&amp; </span>vals.length<span class="s"> == </span><span class="d">2</span>) {
+</code><code id="L3072"><span class="ln">3072</span>                                res += vals<span class="s"> + </span>map[command<span class="s"> == </span><i>"m"</i> ? <i>"l"</i> : <i>"L"</i>];
+</code><code id="L3073"><span class="ln">3073</span>                                vals<span class="s"> = </span>[];
+</code><code id="L3074"><span class="ln">3074</span>                            }
+</code><code id="L3075"><span class="ln">3075</span>                            vals.push(round(value<span class="s"> * </span>zoom));
+</code><code id="L3076"><span class="ln">3076</span>                        });
+</code><code id="L3077"><span class="ln">3077</span>                        <b>return</b> res<span class="s"> + </span>vals;
+</code><code id="L3078"><span class="ln">3078</span>                    });
+</code><code id="L3079"><span class="ln">3079</span>                    <b>return</b> res;
+</code><code id="L3080"><span class="ln">3080</span>                }
+</code><code id="L3081"><span class="ln">3081</span>                <b>var</b> pa<span class="s"> = </span>command(path), p, r;
+</code><code id="L3082"><span class="ln">3082</span>                res<span class="s"> = </span>[];
+</code><code id="L3083"><span class="ln">3083</span>                <b>for</b> (<b>var</b> i<span class="s"> = </span><span class="d">0</span>, ii<span class="s"> = </span>pa.length; i &lt; ii; i++) {
+</code><code id="L3084"><span class="ln">3084</span>                    p<span class="s"> = </span>pa[i];
+</code><code id="L3085"><span class="ln">3085</span>                    r<span class="s"> = </span>lowerCase.call(pa[i][<span class="d">0</span>]);
+</code><code id="L3086"><span class="ln">3086</span>                    r<span class="s"> == </span><i>"z"</i><span class="s"> &amp;&amp; </span>(r<span class="s"> = </span><i>"x"</i>);
+</code><code id="L3087"><span class="ln">3087</span>                    <b>for</b> (<b>var</b> j<span class="s"> = </span><span class="d">1</span>, jj<span class="s"> = </span>p.length; j &lt; jj; j++) {
+</code><code id="L3088"><span class="ln">3088</span>                        r += round(p[j]<span class="s"> * </span>zoom)<span class="s"> + </span>(j != jj<span class="s"> - </span><span class="d">1</span> ? <i>","</i> : E);
+</code><code id="L3089"><span class="ln">3089</span>                    }
+</code><code id="L3090"><span class="ln">3090</span>                    res.push(r);
+</code><code id="L3091"><span class="ln">3091</span>                }
+</code><code id="L3092"><span class="ln">3092</span>                <b>return</b> res.join(S);
+</code><code id="L3093"><span class="ln">3093</span>            },
+</code><code id="L3094"><span class="ln">3094</span>            compensation<span class="s"> = </span><b>function</b> (deg, dx, dy) {
+</code><code id="L3095"><span class="ln">3095</span>                <b>var</b> m<span class="s"> = </span><b>new</b> Matrix;
+</code><code id="L3096"><span class="ln">3096</span>                m.rotate(-deg, <span class="d">.5</span>, <span class="d">.5</span>);
+</code><code id="L3097"><span class="ln">3097</span>                <b>return</b> {
+</code><code id="L3098"><span class="ln">3098</span>                    dx: m.x(dx, dy),
+</code><code id="L3099"><span class="ln">3099</span>                    dy: m.y(dx, dy)
+</code><code id="L3100"><span class="ln">3100</span>                };
+</code><code id="L3101"><span class="ln">3101</span>            },
+</code><code id="L3102"><span class="ln">3102</span>            setCoords<span class="s"> = </span><b>function</b> (p) {
+</code><code id="L3103"><span class="ln">3103</span>                <b>var</b> _<span class="s"> = </span>p._,
+</code><code id="L3104"><span class="ln">3104</span>                    sx<span class="s"> = </span>_.sx,
+</code><code id="L3105"><span class="ln">3105</span>                    sy<span class="s"> = </span>_.sy,
+</code><code id="L3106"><span class="ln">3106</span>                    deg<span class="s"> = </span>_.deg,
+</code><code id="L3107"><span class="ln">3107</span>                    dx<span class="s"> = </span>_.dx,
+</code><code id="L3108"><span class="ln">3108</span>                    dy<span class="s"> = </span>_.dy,
+</code><code id="L3109"><span class="ln">3109</span>                    fillpos<span class="s"> = </span>_.fillpos,
+</code><code id="L3110"><span class="ln">3110</span>                    o<span class="s"> = </span>p.node,
+</code><code id="L3111"><span class="ln">3111</span>                    s<span class="s"> = </span>o.style,
+</code><code id="L3112"><span class="ln">3112</span>                    y<span class="s"> = </span><span class="d">1</span>,
+</code><code id="L3113"><span class="ln">3113</span>                    m<span class="s"> = </span>p.matrix,
+</code><code id="L3114"><span class="ln">3114</span>                    flip<span class="s"> = </span><i>""</i>,
+</code><code id="L3115"><span class="ln">3115</span>                    dxdy,
+</code><code id="L3116"><span class="ln">3116</span>                    kx<span class="s"> = </span>zoom<span class="s"> / </span>sx,
+</code><code id="L3117"><span class="ln">3117</span>                    ky<span class="s"> = </span>zoom<span class="s"> / </span>sy;
+</code><code id="L3118"><span class="ln">3118</span>                s.visibility<span class="s"> = </span><i>"hidden"</i>;
+</code><code id="L3119"><span class="ln">3119</span>                o.coordsize<span class="s"> = </span>abs(kx)<span class="s"> + </span>S<span class="s"> + </span>abs(ky);
+</code><code id="L3120"><span class="ln">3120</span>                s.rotation<span class="s"> = </span>deg<span class="s"> * </span>(sx<span class="s"> * </span>sy &lt; <span class="d">0</span> ? -<span class="d">1</span> : <span class="d">1</span>);
+</code><code id="L3121"><span class="ln">3121</span>                <b>if</b> (deg) {
+</code><code id="L3122"><span class="ln">3122</span>                    <b>var</b> c<span class="s"> = </span>compensation(deg, dx, dy);
+</code><code id="L3123"><span class="ln">3123</span>                    dx<span class="s"> = </span>c.dx;
+</code><code id="L3124"><span class="ln">3124</span>                    dy<span class="s"> = </span>c.dy;
+</code><code id="L3125"><span class="ln">3125</span>                }
+</code><code id="L3126"><span class="ln">3126</span>                sx &lt; <span class="d">0</span><span class="s"> &amp;&amp; </span>(flip += <i>"x"</i>);
+</code><code id="L3127"><span class="ln">3127</span>                sy &lt; <span class="d">0</span><span class="s"> &amp;&amp; </span>(flip += <i>" y"</i>)<span class="s"> &amp;&amp; </span>(y<span class="s"> = </span>-<span class="d">1</span>);
+</code><code id="L3128"><span class="ln">3128</span>                s.flip<span class="s"> = </span>flip;
+</code><code id="L3129"><span class="ln">3129</span>                o.coordorigin<span class="s"> = </span>(dx<span class="s"> * </span>-kx)<span class="s"> + </span>S<span class="s"> + </span>(dy<span class="s"> * </span>-ky);
+</code><code id="L3130"><span class="ln">3130</span>                <b>if</b> (fillpos<span class="s"> || </span>_.fillsize) {
+</code><code id="L3131"><span class="ln">3131</span>                    <b>var</b> fill<span class="s"> = </span>o.getElementsByTagName(fillString);
+</code><code id="L3132"><span class="ln">3132</span>                    fill<span class="s"> = </span>fill<span class="s"> &amp;&amp; </span>fill[<span class="d">0</span>];
+</code><code id="L3133"><span class="ln">3133</span>                    o.removeChild(fill);
+</code><code id="L3134"><span class="ln">3134</span>                    <b>if</b> (fillpos) {
+</code><code id="L3135"><span class="ln">3135</span>                        c<span class="s"> = </span>compensation(deg, m.x(fillpos[<span class="d">0</span>], fillpos[<span class="d">1</span>]), m.y(fillpos[<span class="d">0</span>], fillpos[<span class="d">1</span>]));
+</code><code id="L3136"><span class="ln">3136</span>                        fill.position<span class="s"> = </span>c.dx<span class="s"> * </span>y<span class="s"> + </span>S<span class="s"> + </span>c.dy<span class="s"> * </span>y;
+</code><code id="L3137"><span class="ln">3137</span>                    }
+</code><code id="L3138"><span class="ln">3138</span>                    <b>if</b> (_.fillsize) {
+</code><code id="L3139"><span class="ln">3139</span>                        fill.size<span class="s"> = </span>_.fillsize[<span class="d">0</span>]<span class="s"> * </span>abs(sx)<span class="s"> + </span>S<span class="s"> + </span>_.fillsize[<span class="d">1</span>]<span class="s"> * </span>abs(sy);
+</code><code id="L3140"><span class="ln">3140</span>                    }
+</code><code id="L3141"><span class="ln">3141</span>                    o.appendChild(fill);
+</code><code id="L3142"><span class="ln">3142</span>                }
+</code><code id="L3143"><span class="ln">3143</span>                s.visibility<span class="s"> = </span><i>"visible"</i>;
+</code><code id="L3144"><span class="ln">3144</span>            };
+</code><code id="L3145"><span class="ln">3145</span>        R.toString<span class="s"> = </span><b>function</b> () {
+</code><code id="L3146"><span class="ln">3146</span>            <b>return</b>  <i>"Your browser doesn\u2019t support SVG. Falling down to VML.\nYou are running Rapha\xebl "</i><span class="s"> + </span><b>this</b>.version;
+</code><code id="L3147"><span class="ln">3147</span>        };
+</code><code id="L3148"><span class="ln">3148</span>        addArrow<span class="s"> = </span><b>function</b> (o, value, isEnd) {
+</code><code id="L3149"><span class="ln">3149</span>            <b>var</b> values<span class="s"> = </span>Str(value).toLowerCase().split(<i>"-"</i>),
+</code><code id="L3150"><span class="ln">3150</span>                se<span class="s"> = </span>isEnd ? <i>"end"</i> : <i>"start"</i>,
+</code><code id="L3151"><span class="ln">3151</span>                i<span class="s"> = </span>values.length,
+</code><code id="L3152"><span class="ln">3152</span>                type<span class="s"> = </span><i>"classic"</i>,
+</code><code id="L3153"><span class="ln">3153</span>                w<span class="s"> = </span><i>"medium"</i>,
+</code><code id="L3154"><span class="ln">3154</span>                h<span class="s"> = </span><i>"medium"</i>;
+</code><code id="L3155"><span class="ln">3155</span>            <b>while</b> (i--) {
+</code><code id="L3156"><span class="ln">3156</span>                <b>switch</b> (values[i]) {
+</code><code id="L3157"><span class="ln">3157</span>                    <b>case</b> <i>"block"</i>:
+</code><code id="L3158"><span class="ln">3158</span>                    <b>case</b> <i>"classic"</i>:
+</code><code id="L3159"><span class="ln">3159</span>                    <b>case</b> <i>"oval"</i>:
+</code><code id="L3160"><span class="ln">3160</span>                    <b>case</b> <i>"diamond"</i>:
+</code><code id="L3161"><span class="ln">3161</span>                    <b>case</b> <i>"open"</i>:
+</code><code id="L3162"><span class="ln">3162</span>                    <b>case</b> <i>"none"</i>:
+</code><code id="L3163"><span class="ln">3163</span>                        type<span class="s"> = </span>values[i];
+</code><code id="L3164"><span class="ln">3164</span>                        <b>break</b>;
+</code><code id="L3165"><span class="ln">3165</span>                    <b>case</b> <i>"wide"</i>:
+</code><code id="L3166"><span class="ln">3166</span>                    <b>case</b> <i>"narrow"</i>: h<span class="s"> = </span>values[i]; <b>break</b>;
+</code><code id="L3167"><span class="ln">3167</span>                    <b>case</b> <i>"<b>long</b>"</i>:
+</code><code id="L3168"><span class="ln">3168</span>                    <b>case</b> <i>"<b>short</b>"</i>: w<span class="s"> = </span>values[i]; <b>break</b>;
+</code><code id="L3169"><span class="ln">3169</span>                }
+</code><code id="L3170"><span class="ln">3170</span>            }
+</code><code id="L3171"><span class="ln">3171</span>            <b>var</b> stroke<span class="s"> = </span>o.node.getElementsByTagName(<i>"stroke"</i>)[<span class="d">0</span>];
+</code><code id="L3172"><span class="ln">3172</span>            stroke[se<span class="s"> + </span><i>"arrow"</i>]<span class="s"> = </span>type;
+</code><code id="L3173"><span class="ln">3173</span>            stroke[se<span class="s"> + </span><i>"arrowlength"</i>]<span class="s"> = </span>w;
+</code><code id="L3174"><span class="ln">3174</span>            stroke[se<span class="s"> + </span><i>"arrowwidth"</i>]<span class="s"> = </span>h;
+</code><code id="L3175"><span class="ln">3175</span>        };
+</code><code id="L3176"><span class="ln">3176</span>        setFillAndStroke<span class="s"> = </span><b>function</b> (o, params) {
+</code><code id="L3177"><span class="ln">3177</span>            o.paper.canvas.style.display<span class="s"> = </span><i>"none"</i>;
+</code><code id="L3178"><span class="ln">3178</span>            o.attrs<span class="s"> = </span>o.attrs<span class="s"> || </span>{};
+</code><code id="L3179"><span class="ln">3179</span>            <b>var</b> node<span class="s"> = </span>o.node,
+</code><code id="L3180"><span class="ln">3180</span>                a<span class="s"> = </span>o.attrs,
+</code><code id="L3181"><span class="ln">3181</span>                s<span class="s"> = </span>node.style,
+</code><code id="L3182"><span class="ln">3182</span>                xy,
+</code><code id="L3183"><span class="ln">3183</span>                newpath<span class="s"> = </span>pathTypes[o.type]<span class="s"> &amp;&amp; </span>(params.x != a.x<span class="s"> || </span>params.y != a.y<span class="s"> || </span>params.width != a.width<span class="s"> || </span>params.height != a.height<span class="s"> || </span>params.cx != a.cx<span class="s"> || </span>params.cy != a.cy<span class="s"> || </span>params.rx != a.rx<span class="s"> || </span>params.ry != a.ry<span class="s"> || </span>params.r != a.r),
+</code><code id="L3184"><span class="ln">3184</span>                isOval<span class="s"> = </span>ovalTypes[o.type]<span class="s"> &amp;&amp; </span>(a.cx != params.cx<span class="s"> || </span>a.cy != params.cy<span class="s"> || </span>a.r != params.r<span class="s"> || </span>a.rx != params.rx<span class="s"> || </span>a.ry != params.ry),
+</code><code id="L3185"><span class="ln">3185</span>                res<span class="s"> = </span>o;
+</code><code id="L3186"><span class="ln">3186</span>
+</code><code id="L3187"><span class="ln">3187</span>
+</code><code id="L3188"><span class="ln">3188</span>            <b>for</b> (<b>var</b> par <b>in</b> params) <b>if</b> (params[has](par)) {
+</code><code id="L3189"><span class="ln">3189</span>                a[par]<span class="s"> = </span>params[par];
+</code><code id="L3190"><span class="ln">3190</span>            }
+</code><code id="L3191"><span class="ln">3191</span>            <b>if</b> (newpath) {
+</code><code id="L3192"><span class="ln">3192</span>                a.path<span class="s"> = </span>getPath[o.type](o);
+</code><code id="L3193"><span class="ln">3193</span>                o._.dirty<span class="s"> = </span><span class="d">1</span>;
+</code><code id="L3194"><span class="ln">3194</span>            }
+</code><code id="L3195"><span class="ln">3195</span>            params.href<span class="s"> &amp;&amp; </span>(node.href<span class="s"> = </span>params.href);
+</code><code id="L3196"><span class="ln">3196</span>            params.title<span class="s"> &amp;&amp; </span>(node.title<span class="s"> = </span>params.title);
+</code><code id="L3197"><span class="ln">3197</span>            params.target<span class="s"> &amp;&amp; </span>(node.target<span class="s"> = </span>params.target);
+</code><code id="L3198"><span class="ln">3198</span>            params.cursor<span class="s"> &amp;&amp; </span>(s.cursor<span class="s"> = </span>params.cursor);
+</code><code id="L3199"><span class="ln">3199</span>            <i>"blur"</i> <b>in</b> params<span class="s"> &amp;&amp; </span>o.blur(params.blur);
+</code><code id="L3200"><span class="ln">3200</span>            <i>"transform"</i> <b>in</b> params<span class="s"> &amp;&amp; </span>o.transform(params.transform);
+</code><code id="L3201"><span class="ln">3201</span>            <b>if</b> (params.path<span class="s"> &amp;&amp; </span>o.type<span class="s"> == </span><i>"path"</i><span class="s"> || </span>newpath) {
+</code><code id="L3202"><span class="ln">3202</span>                node.path<span class="s"> = </span>path2vml(a.path);
+</code><code id="L3203"><span class="ln">3203</span>            }
+</code><code id="L3204"><span class="ln">3204</span>            <b>if</b> (isOval) {
+</code><code id="L3205"><span class="ln">3205</span>                <b>var</b> cx<span class="s"> = </span>a.cx,
+</code><code id="L3206"><span class="ln">3206</span>                    cy<span class="s"> = </span>a.cy,
+</code><code id="L3207"><span class="ln">3207</span>                    rx<span class="s"> = </span>a.rx<span class="s"> || </span>a.r<span class="s"> || </span><span class="d">0</span>,
+</code><code id="L3208"><span class="ln">3208</span>                    ry<span class="s"> = </span>a.ry<span class="s"> || </span>a.r<span class="s"> || </span><span class="d">0</span>;
+</code><code id="L3209"><span class="ln">3209</span>                node.path<span class="s"> = </span>R.format(<i>"ar{<span class="d">0</span>},{<span class="d">1</span>},{<span class="d">2</span>},{<span class="d">3</span>},{<span class="d">4</span>},{<span class="d">1</span>},{<span class="d">4</span>},{<span class="d">1</span>}x"</i>, round((cx<span class="s"> - </span>rx)<span class="s"> * </span>zoom), round((cy<span class="s"> - </span>ry)<span class="s"> * </span>zoom), round((cx<span class="s"> + </span>rx)<span class="s"> * </span>zoom), round((cy<span class="s"> + </span>ry)<span class="s"> * </span>zoom), round(cx<span class="s"> * </span>zoom));
 </code><code id="L3210"><span class="ln">3210</span>            }
-</code><code id="L3211"><span class="ln">3211</span>            <b>if</b> (<i>"arrow-start"</i> <b>in</b> params) {
-</code><code id="L3212"><span class="ln">3212</span>                addArrow(res, params[<i>"arrow-start"</i>]);
-</code><code id="L3213"><span class="ln">3213</span>            }
-</code><code id="L3214"><span class="ln">3214</span>            <b>if</b> (<i>"arrow-end"</i> <b>in</b> params) {
-</code><code id="L3215"><span class="ln">3215</span>                addArrow(res, params[<i>"arrow-end"</i>], <span class="d">1</span>);
-</code><code id="L3216"><span class="ln">3216</span>            }
-</code><code id="L3217"><span class="ln">3217</span>            <b>if</b> (params.opacity != <b>null</b><span class="s"> || </span>
-</code><code id="L3218"><span class="ln">3218</span>                params[<i>"stroke-width"</i>] != <b>null</b> ||
-</code><code id="L3219"><span class="ln">3219</span>                params.fill != <b>null</b> ||
-</code><code id="L3220"><span class="ln">3220</span>                params.src != <b>null</b> ||
-</code><code id="L3221"><span class="ln">3221</span>                params.stroke != <b>null</b> ||
-</code><code id="L3222"><span class="ln">3222</span>                params[<i>"stroke-width"</i>] != <b>null</b> ||
-</code><code id="L3223"><span class="ln">3223</span>                params[<i>"stroke-opacity"</i>] != <b>null</b> ||
-</code><code id="L3224"><span class="ln">3224</span>                params[<i>"fill-opacity"</i>] != <b>null</b> ||
-</code><code id="L3225"><span class="ln">3225</span>                params[<i>"stroke-dasharray"</i>] != <b>null</b> ||
-</code><code id="L3226"><span class="ln">3226</span>                params[<i>"stroke-miterlimit"</i>] != <b>null</b> ||
-</code><code id="L3227"><span class="ln">3227</span>                params[<i>"stroke-linejoin"</i>] != <b>null</b> ||
-</code><code id="L3228"><span class="ln">3228</span>                params[<i>"stroke-linecap"</i>] != <b>null</b>) {
-</code><code id="L3229"><span class="ln">3229</span>                <b>var</b> fill<span class="s"> = </span>node.getElementsByTagName(fillString),
-</code><code id="L3230"><span class="ln">3230</span>                    newfill<span class="s"> = </span><b>false</b>;
-</code><code id="L3231"><span class="ln">3231</span>                fill<span class="s"> = </span>fill<span class="s"> &amp;&amp; </span>fill[<span class="d">0</span>];
-</code><code id="L3232"><span class="ln">3232</span>                !fill<span class="s"> &amp;&amp; </span>(newfill<span class="s"> = </span>fill<span class="s"> = </span>createNode(fillString));
-</code><code id="L3233"><span class="ln">3233</span>                <b>if</b> (o.type<span class="s"> == </span><i>"image"</i><span class="s"> &amp;&amp; </span>params.src) {
-</code><code id="L3234"><span class="ln">3234</span>                    fill.src<span class="s"> = </span>params.src;
-</code><code id="L3235"><span class="ln">3235</span>                }
-</code><code id="L3236"><span class="ln">3236</span>                <b>if</b> (<i>"fill-opacity"</i> <b>in</b> params<span class="s"> || </span><i>"opacity"</i> <b>in</b> params) {
-</code><code id="L3237"><span class="ln">3237</span>                    <b>var</b> opacity<span class="s"> = </span>((+a[<i>"fill-opacity"</i>]<span class="s"> + </span><span class="d">1</span><span class="s"> || </span><span class="d">2</span>)<span class="s"> - </span><span class="d">1</span>)<span class="s"> * </span>((+a.opacity<span class="s"> + </span><span class="d">1</span><span class="s"> || </span><span class="d">2</span>)<span class="s"> - </span><span class="d">1</span>)<span class="s"> * </span>((+R.getRGB(params.fill).o<span class="s"> + </span><span class="d">1</span><span class="s"> || </span><span class="d">2</span>)<span class="s"> - </span><span class="d">1</span>);
-</code><code id="L3238"><span class="ln">3238</span>                    opacity<span class="s"> = </span>mmin(mmax(opacity, <span class="d">0</span>), <span class="d">1</span>);
-</code><code id="L3239"><span class="ln">3239</span>                    fill.opacity<span class="s"> = </span>opacity;
-</code><code id="L3240"><span class="ln">3240</span>                }
-</code><code id="L3241"><span class="ln">3241</span>                params.fill<span class="s"> &amp;&amp; </span>(fill.on<span class="s"> = </span><b>true</b>);
-</code><code id="L3242"><span class="ln">3242</span>                <b>if</b> (fill.on<span class="s"> == </span><b>null</b><span class="s"> || </span>params.fill<span class="s"> == </span><i>"none"</i><span class="s"> || </span>params.fill<span class="s"> === </span><b>null</b>) {
-</code><code id="L3243"><span class="ln">3243</span>                    fill.on<span class="s"> = </span><b>false</b>;
-</code><code id="L3244"><span class="ln">3244</span>                }
-</code><code id="L3245"><span class="ln">3245</span>                <b>if</b> (fill.on<span class="s"> &amp;&amp; </span>params.fill) {
-</code><code id="L3246"><span class="ln">3246</span>                    <b>var</b> isURL<span class="s"> = </span>params.fill.match(ISURL);
-</code><code id="L3247"><span class="ln">3247</span>                    <b>if</b> (isURL) {
-</code><code id="L3248"><span class="ln">3248</span>                        fill.parentNode<span class="s"> == </span>node<span class="s"> &amp;&amp; </span>node.removeChild(fill);
-</code><code id="L3249"><span class="ln">3249</span>                        fill.rotate<span class="s"> = </span><b>true</b>;
-</code><code id="L3250"><span class="ln">3250</span>                        fill.src<span class="s"> = </span>isURL[<span class="d">1</span>];
-</code><code id="L3251"><span class="ln">3251</span>                        fill.type<span class="s"> = </span><i>"tile"</i>;
-</code><code id="L3252"><span class="ln">3252</span>                        <b>var</b> bbox<span class="s"> = </span>o.getBBox(<span class="d">1</span>);
-</code><code id="L3253"><span class="ln">3253</span>                        fill.position<span class="s"> = </span>bbox.x<span class="s"> + </span>S<span class="s"> + </span>bbox.y;
-</code><code id="L3254"><span class="ln">3254</span>                        o._.fillpos<span class="s"> = </span>[bbox.x, bbox.y];
-</code><code id="L3255"><span class="ln">3255</span>
-</code><code id="L3256"><span class="ln">3256</span>                        preload(isURL[<span class="d">1</span>], <b>function</b> () {
-</code><code id="L3257"><span class="ln">3257</span>                            o._.fillsize<span class="s"> = </span>[<b>this</b>.offsetWidth, <b>this</b>.offsetHeight];
-</code><code id="L3258"><span class="ln">3258</span>                        });
-</code><code id="L3259"><span class="ln">3259</span>                    } <b>else</b> {
-</code><code id="L3260"><span class="ln">3260</span>                        fill.color<span class="s"> = </span>R.getRGB(params.fill).hex;
-</code><code id="L3261"><span class="ln">3261</span>                        fill.src<span class="s"> = </span>E;
-</code><code id="L3262"><span class="ln">3262</span>                        fill.type<span class="s"> = </span><i>"solid"</i>;
-</code><code id="L3263"><span class="ln">3263</span>                        <b>if</b> (R.getRGB(params.fill).error<span class="s"> &amp;&amp; </span>(res.type <b>in</b> {circle: <span class="d">1</span>, ellipse: <span class="d">1</span>}<span class="s"> || </span>Str(params.fill).charAt() != <i>"r"</i>)<span class="s"> &amp;&amp; </span>addGradientFill(res, params.fill, fill)) {
-</code><code id="L3264"><span class="ln">3264</span>                            a.fill<span class="s"> = </span><i>"none"</i>;
-</code><code id="L3265"><span class="ln">3265</span>                            a.gradient<span class="s"> = </span>params.fill;
-</code><code id="L3266"><span class="ln">3266</span>                            fill.rotate<span class="s"> = </span><b>false</b>;
-</code><code id="L3267"><span class="ln">3267</span>                        }
-</code><code id="L3268"><span class="ln">3268</span>                    }
-</code><code id="L3269"><span class="ln">3269</span>                }
-</code><code id="L3270"><span class="ln">3270</span>                node.appendChild(fill);
-</code><code id="L3271"><span class="ln">3271</span>                <b>var</b> stroke<span class="s"> = </span>(node.getElementsByTagName(<i>"stroke"</i>)<span class="s"> &amp;&amp; </span>node.getElementsByTagName(<i>"stroke"</i>)[<span class="d">0</span>]),
-</code><code id="L3272"><span class="ln">3272</span>                newstroke<span class="s"> = </span><b>false</b>;
-</code><code id="L3273"><span class="ln">3273</span>                !stroke<span class="s"> &amp;&amp; </span>(newstroke<span class="s"> = </span>stroke<span class="s"> = </span>createNode(<i>"stroke"</i>));
-</code><code id="L3274"><span class="ln">3274</span>                <b>if</b> ((params.stroke<span class="s"> &amp;&amp; </span>params.stroke != <i>"none"</i>) ||
-</code><code id="L3275"><span class="ln">3275</span>                    params[<i>"stroke-width"</i>] ||
-</code><code id="L3276"><span class="ln">3276</span>                    params[<i>"stroke-opacity"</i>] != <b>null</b> ||
-</code><code id="L3277"><span class="ln">3277</span>                    params[<i>"stroke-dasharray"</i>] ||
-</code><code id="L3278"><span class="ln">3278</span>                    params[<i>"stroke-miterlimit"</i>] ||
-</code><code id="L3279"><span class="ln">3279</span>                    params[<i>"stroke-linejoin"</i>] ||
-</code><code id="L3280"><span class="ln">3280</span>                    params[<i>"stroke-linecap"</i>]) {
-</code><code id="L3281"><span class="ln">3281</span>                    stroke.on<span class="s"> = </span><b>true</b>;
-</code><code id="L3282"><span class="ln">3282</span>                }
-</code><code id="L3283"><span class="ln">3283</span>                (params.stroke<span class="s"> == </span><i>"none"</i><span class="s"> || </span>params.stroke<span class="s"> === </span><b>null</b><span class="s"> || </span>stroke.on<span class="s"> == </span><b>null</b><span class="s"> || </span>params.stroke<span class="s"> == </span><span class="d">0</span><span class="s"> || </span>params[<i>"stroke-width"</i>]<span class="s"> == </span><span class="d">0</span>)<span class="s"> &amp;&amp; </span>(stroke.on<span class="s"> = </span><b>false</b>);
-</code><code id="L3284"><span class="ln">3284</span>                <b>var</b> strokeColor<span class="s"> = </span>R.getRGB(params.stroke);
-</code><code id="L3285"><span class="ln">3285</span>                stroke.on<span class="s"> &amp;&amp; </span>params.stroke<span class="s"> &amp;&amp; </span>(stroke.color<span class="s"> = </span>strokeColor.hex);
-</code><code id="L3286"><span class="ln">3286</span>                opacity<span class="s"> = </span>((+a[<i>"stroke-opacity"</i>]<span class="s"> + </span><span class="d">1</span><span class="s"> || </span><span class="d">2</span>)<span class="s"> - </span><span class="d">1</span>)<span class="s"> * </span>((+a.opacity<span class="s"> + </span><span class="d">1</span><span class="s"> || </span><span class="d">2</span>)<span class="s"> - </span><span class="d">1</span>)<span class="s"> * </span>((+strokeColor.o<span class="s"> + </span><span class="d">1</span><span class="s"> || </span><span class="d">2</span>)<span class="s"> - </span><span class="d">1</span>);
-</code><code id="L3287"><span class="ln">3287</span>                <b>var</b> width<span class="s"> = </span>(toFloat(params[<i>"stroke-width"</i>])<span class="s"> || </span><span class="d">1</span>)<span class="s"> * </span><span class="d">.75</span>;
-</code><code id="L3288"><span class="ln">3288</span>                opacity<span class="s"> = </span>mmin(mmax(opacity, <span class="d">0</span>), <span class="d">1</span>);
-</code><code id="L3289"><span class="ln">3289</span>                params[<i>"stroke-width"</i>]<span class="s"> == </span><b>null</b><span class="s"> &amp;&amp; </span>(width<span class="s"> = </span>a[<i>"stroke-width"</i>]);
-</code><code id="L3290"><span class="ln">3290</span>                params[<i>"stroke-width"</i>]<span class="s"> &amp;&amp; </span>(stroke.weight<span class="s"> = </span>width);
-</code><code id="L3291"><span class="ln">3291</span>                width<span class="s"> &amp;&amp; </span>width &lt; <span class="d">1</span><span class="s"> &amp;&amp; </span>(opacity *= width)<span class="s"> &amp;&amp; </span>(stroke.weight<span class="s"> = </span><span class="d">1</span>);
-</code><code id="L3292"><span class="ln">3292</span>                stroke.opacity<span class="s"> = </span>opacity;
-</code><code id="L3293"><span class="ln">3293</span>                
-</code><code id="L3294"><span class="ln">3294</span>                params[<i>"stroke-linejoin"</i>]<span class="s"> &amp;&amp; </span>(stroke.joinstyle<span class="s"> = </span>params[<i>"stroke-linejoin"</i>]<span class="s"> || </span><i>"miter"</i>);
-</code><code id="L3295"><span class="ln">3295</span>                stroke.miterlimit<span class="s"> = </span>params[<i>"stroke-miterlimit"</i>]<span class="s"> || </span><span class="d">8</span>;
-</code><code id="L3296"><span class="ln">3296</span>                params[<i>"stroke-linecap"</i>]<span class="s"> &amp;&amp; </span>(stroke.endcap<span class="s"> = </span>params[<i>"stroke-linecap"</i>]<span class="s"> == </span><i>"butt"</i> ? <i>"flat"</i> : params[<i>"stroke-linecap"</i>]<span class="s"> == </span><i>"square"</i> ? <i>"square"</i> : <i>"round"</i>);
-</code><code id="L3297"><span class="ln">3297</span>                <b>if</b> (params[<i>"stroke-dasharray"</i>]) {
-</code><code id="L3298"><span class="ln">3298</span>                    <b>var</b> dasharray<span class="s"> = </span>{
-</code><code id="L3299"><span class="ln">3299</span>                        <i>"-"</i>: <i>"shortdash"</i>,
-</code><code id="L3300"><span class="ln">3300</span>                        <i>"."</i>: <i>"shortdot"</i>,
-</code><code id="L3301"><span class="ln">3301</span>                        <i>"-."</i>: <i>"shortdashdot"</i>,
-</code><code id="L3302"><span class="ln">3302</span>                        <i>"-.."</i>: <i>"shortdashdotdot"</i>,
-</code><code id="L3303"><span class="ln">3303</span>                        <i>". "</i>: <i>"dot"</i>,
-</code><code id="L3304"><span class="ln">3304</span>                        <i>"- "</i>: <i>"dash"</i>,
-</code><code id="L3305"><span class="ln">3305</span>                        <i>"--"</i>: <i>"longdash"</i>,
-</code><code id="L3306"><span class="ln">3306</span>                        <i>"- ."</i>: <i>"dashdot"</i>,
-</code><code id="L3307"><span class="ln">3307</span>                        <i>"--."</i>: <i>"longdashdot"</i>,
-</code><code id="L3308"><span class="ln">3308</span>                        <i>"--.."</i>: <i>"longdashdotdot"</i>
-</code><code id="L3309"><span class="ln">3309</span>                    };
-</code><code id="L3310"><span class="ln">3310</span>                    stroke.dashstyle<span class="s"> = </span>dasharray[has](params[<i>"stroke-dasharray"</i>]) ? dasharray[params[<i>"stroke-dasharray"</i>]] : E;
-</code><code id="L3311"><span class="ln">3311</span>                }
-</code><code id="L3312"><span class="ln">3312</span>                newstroke<span class="s"> &amp;&amp; </span>node.appendChild(stroke);
-</code><code id="L3313"><span class="ln">3313</span>            }
-</code><code id="L3314"><span class="ln">3314</span>            <b>if</b> (res.type<span class="s"> == </span><i>"text"</i>) {
-</code><code id="L3315"><span class="ln">3315</span>                res.paper.canvas.style.display<span class="s"> = </span>E;
-</code><code id="L3316"><span class="ln">3316</span>                <b>var</b> span<span class="s"> = </span>res.paper.span,
-</code><code id="L3317"><span class="ln">3317</span>                    m<span class="s"> = </span><span class="d">100</span>,
-</code><code id="L3318"><span class="ln">3318</span>                    fontSize<span class="s"> = </span>a.font<span class="s"> &amp;&amp; </span>a.font.match(/\d+(?:\.\d*)?(?=px)/);
-</code><code id="L3319"><span class="ln">3319</span>                s<span class="s"> = </span>span.style;
-</code><code id="L3320"><span class="ln">3320</span>                a.font<span class="s"> &amp;&amp; </span>(s.font<span class="s"> = </span>a.font);
-</code><code id="L3321"><span class="ln">3321</span>                a[<i>"font-family"</i>]<span class="s"> &amp;&amp; </span>(s.fontFamily<span class="s"> = </span>a[<i>"font-family"</i>]);
-</code><code id="L3322"><span class="ln">3322</span>                a[<i>"font-weight"</i>]<span class="s"> &amp;&amp; </span>(s.fontWeight<span class="s"> = </span>a[<i>"font-weight"</i>]);
-</code><code id="L3323"><span class="ln">3323</span>                a[<i>"font-style"</i>]<span class="s"> &amp;&amp; </span>(s.fontStyle<span class="s"> = </span>a[<i>"font-style"</i>]);
-</code><code id="L3324"><span class="ln">3324</span>                fontSize<span class="s"> = </span>toFloat(fontSize ? fontSize[<span class="d">0</span>] : a[<i>"font-size"</i>]);
-</code><code id="L3325"><span class="ln">3325</span>                s.fontSize<span class="s"> = </span>fontSize<span class="s"> * </span>m<span class="s"> + </span><i>"px"</i>;
-</code><code id="L3326"><span class="ln">3326</span>                res.textpath.string<span class="s"> &amp;&amp; </span>(span.innerHTML<span class="s"> = </span>Str(res.textpath.string).replace(/&lt;/g, <i>"&#<span class="d">60</span>;"</i>).replace(/&amp;/g, <i>"&#<span class="d">38</span>;"</i>).replace(/\n/g, <i>"&lt;br>"</i>));
-</code><code id="L3327"><span class="ln">3327</span>                <b>var</b> brect<span class="s"> = </span>span.getBoundingClientRect();
-</code><code id="L3328"><span class="ln">3328</span>                res.W<span class="s"> = </span>a.w<span class="s"> = </span>(brect.right<span class="s"> - </span>brect.left)<span class="s"> / </span>m;
-</code><code id="L3329"><span class="ln">3329</span>                res.H<span class="s"> = </span>a.h<span class="s"> = </span>(brect.bottom<span class="s"> - </span>brect.top)<span class="s"> / </span>m;
-</code><code id="L3330"><span class="ln">3330</span>                res.paper.canvas.style.display<span class="s"> = </span><i>"none"</i>;
-</code><code id="L3331"><span class="ln">3331</span>                res.X<span class="s"> = </span>a.x;
-</code><code id="L3332"><span class="ln">3332</span>                res.Y<span class="s"> = </span>a.y<span class="s"> + </span>res.H<span class="s"> / </span><span class="d">2</span>;
-</code><code id="L3333"><span class="ln">3333</span>
-</code><code id="L3334"><span class="ln">3334</span>                (<i>"x"</i> <b>in</b> params<span class="s"> || </span><i>"y"</i> <b>in</b> params)<span class="s"> &amp;&amp; </span>(res.path.v<span class="s"> = </span>R.format(<i>"m{<span class="d">0</span>},{<span class="d">1</span>}l{<span class="d">2</span>},{<span class="d">1</span>}"</i>, round(a.x<span class="s"> * </span>zoom), round(a.y<span class="s"> * </span>zoom), round(a.x<span class="s"> * </span>zoom)<span class="s"> + </span><span class="d">1</span>));
-</code><code id="L3335"><span class="ln">3335</span>                <b>var</b> dirtyattrs<span class="s"> = </span>[<i>"x"</i>, <i>"y"</i>, <i>"text"</i>, <i>"font"</i>, <i>"font-family"</i>, <i>"font-weight"</i>, <i>"font-style"</i>, <i>"font-size"</i>];
-</code><code id="L3336"><span class="ln">3336</span>                <b>for</b> (<b>var</b> d<span class="s"> = </span><span class="d">0</span>, dd<span class="s"> = </span>dirtyattrs.length; d &lt; dd; d++) <b>if</b> (dirtyattrs[d] <b>in</b> params) {
-</code><code id="L3337"><span class="ln">3337</span>                    res._.dirty<span class="s"> = </span><span class="d">1</span>;
-</code><code id="L3338"><span class="ln">3338</span>                    <b>break</b>;
-</code><code id="L3339"><span class="ln">3339</span>                }
-</code><code id="L3340"><span class="ln">3340</span>                
-</code><code id="L3341"><span class="ln">3341</span>                <span class="c">// text-anchor emulation</span>
-</code><code id="L3342"><span class="ln">3342</span>                <b>switch</b> (a[<i>"text-anchor"</i>]) {
-</code><code id="L3343"><span class="ln">3343</span>                    <b>case</b> <i>"start"</i>:
-</code><code id="L3344"><span class="ln">3344</span>                        res.textpath.style[<i>"v-text-align"</i>]<span class="s"> = </span><i>"left"</i>;
-</code><code id="L3345"><span class="ln">3345</span>                        res.bbx<span class="s"> = </span>res.W<span class="s"> / </span><span class="d">2</span>;
-</code><code id="L3346"><span class="ln">3346</span>                    <b>break</b>;
-</code><code id="L3347"><span class="ln">3347</span>                    <b>case</b> <i>"end"</i>:
-</code><code id="L3348"><span class="ln">3348</span>                        res.textpath.style[<i>"v-text-align"</i>]<span class="s"> = </span><i>"right"</i>;
-</code><code id="L3349"><span class="ln">3349</span>                        res.bbx<span class="s"> = </span>-res.W<span class="s"> / </span><span class="d">2</span>;
-</code><code id="L3350"><span class="ln">3350</span>                    <b>break</b>;
-</code><code id="L3351"><span class="ln">3351</span>                    <b>default</b>:
-</code><code id="L3352"><span class="ln">3352</span>                        res.textpath.style[<i>"v-text-align"</i>]<span class="s"> = </span><i>"center"</i>;
-</code><code id="L3353"><span class="ln">3353</span>                        res.bbx<span class="s"> = </span><span class="d">0</span>;
-</code><code id="L3354"><span class="ln">3354</span>                    <b>break</b>;
-</code><code id="L3355"><span class="ln">3355</span>                }
-</code><code id="L3356"><span class="ln">3356</span>                res.textpath.style[<i>"v-text-kern"</i>]<span class="s"> = </span><b>true</b>;
-</code><code id="L3357"><span class="ln">3357</span>            }
-</code><code id="L3358"><span class="ln">3358</span>            res.paper.canvas.style.display<span class="s"> = </span>E;
-</code><code id="L3359"><span class="ln">3359</span>        };
-</code><code id="L3360"><span class="ln">3360</span>        addGradientFill<span class="s"> = </span><b>function</b> (o, gradient, fill) {
-</code><code id="L3361"><span class="ln">3361</span>            o.attrs<span class="s"> = </span>o.attrs<span class="s"> || </span>{};
-</code><code id="L3362"><span class="ln">3362</span>            <b>var</b> attrs<span class="s"> = </span>o.attrs,
-</code><code id="L3363"><span class="ln">3363</span>                type<span class="s"> = </span><i>"linear"</i>,
-</code><code id="L3364"><span class="ln">3364</span>                fxfy<span class="s"> = </span><i>"<span class="d">.5</span> <span class="d">.5</span>"</i>;
-</code><code id="L3365"><span class="ln">3365</span>            o.attrs.gradient<span class="s"> = </span>gradient;
-</code><code id="L3366"><span class="ln">3366</span>            gradient<span class="s"> = </span>Str(gradient).replace(radial_gradient, <b>function</b> (all, fx, fy) {
-</code><code id="L3367"><span class="ln">3367</span>                type<span class="s"> = </span><i>"radial"</i>;
-</code><code id="L3368"><span class="ln">3368</span>                <b>if</b> (fx<span class="s"> &amp;&amp; </span>fy) {
-</code><code id="L3369"><span class="ln">3369</span>                    fx<span class="s"> = </span>toFloat(fx);
-</code><code id="L3370"><span class="ln">3370</span>                    fy<span class="s"> = </span>toFloat(fy);
-</code><code id="L3371"><span class="ln">3371</span>                    pow(fx<span class="s"> - </span><span class="d">.5</span>, <span class="d">2</span>)<span class="s"> + </span>pow(fy<span class="s"> - </span><span class="d">.5</span>, <span class="d">2</span>) > <span class="d">.25</span><span class="s"> &amp;&amp; </span>(fy<span class="s"> = </span>math.sqrt(<span class="d">.25</span><span class="s"> - </span>pow(fx<span class="s"> - </span><span class="d">.5</span>, <span class="d">2</span>))<span class="s"> * </span>((fy > <span class="d">.5</span>)<span class="s"> * </span><span class="d">2</span><span class="s"> - </span><span class="d">1</span>)<span class="s"> + </span><span class="d">.5</span>);
-</code><code id="L3372"><span class="ln">3372</span>                    fxfy<span class="s"> = </span>fx<span class="s"> + </span>S<span class="s"> + </span>fy;
-</code><code id="L3373"><span class="ln">3373</span>                }
-</code><code id="L3374"><span class="ln">3374</span>                <b>return</b> E;
-</code><code id="L3375"><span class="ln">3375</span>            });
-</code><code id="L3376"><span class="ln">3376</span>            gradient<span class="s"> = </span>gradient.split(/\s*\-\s*/);
-</code><code id="L3377"><span class="ln">3377</span>            <b>if</b> (type<span class="s"> == </span><i>"linear"</i>) {
-</code><code id="L3378"><span class="ln">3378</span>                <b>var</b> angle<span class="s"> = </span>gradient.shift();
-</code><code id="L3379"><span class="ln">3379</span>                angle<span class="s"> = </span>-toFloat(angle);
-</code><code id="L3380"><span class="ln">3380</span>                <b>if</b> (isNaN(angle)) {
-</code><code id="L3381"><span class="ln">3381</span>                    <b>return</b> <b>null</b>;
-</code><code id="L3382"><span class="ln">3382</span>                }
-</code><code id="L3383"><span class="ln">3383</span>            }
-</code><code id="L3384"><span class="ln">3384</span>            <b>var</b> dots<span class="s"> = </span>parseDots(gradient);
-</code><code id="L3385"><span class="ln">3385</span>            <b>if</b> (!dots) {
-</code><code id="L3386"><span class="ln">3386</span>                <b>return</b> <b>null</b>;
-</code><code id="L3387"><span class="ln">3387</span>            }
-</code><code id="L3388"><span class="ln">3388</span>            o<span class="s"> = </span>o.shape<span class="s"> || </span>o.node;
-</code><code id="L3389"><span class="ln">3389</span>            <b>if</b> (dots.length) {
-</code><code id="L3390"><span class="ln">3390</span>                o.removeChild(fill);
-</code><code id="L3391"><span class="ln">3391</span>                fill.on<span class="s"> = </span><b>true</b>;
-</code><code id="L3392"><span class="ln">3392</span>                fill.method<span class="s"> = </span><i>"none"</i>;
-</code><code id="L3393"><span class="ln">3393</span>                fill.color<span class="s"> = </span>dots[<span class="d">0</span>].color;
-</code><code id="L3394"><span class="ln">3394</span>                fill.color2<span class="s"> = </span>dots[dots.length<span class="s"> - </span><span class="d">1</span>].color;
-</code><code id="L3395"><span class="ln">3395</span>                <b>var</b> clrs<span class="s"> = </span>[];
-</code><code id="L3396"><span class="ln">3396</span>                <b>for</b> (<b>var</b> i<span class="s"> = </span><span class="d">0</span>, ii<span class="s"> = </span>dots.length; i &lt; ii; i++) {
-</code><code id="L3397"><span class="ln">3397</span>                    dots[i].offset<span class="s"> &amp;&amp; </span>clrs.push(dots[i].offset<span class="s"> + </span>S<span class="s"> + </span>dots[i].color);
-</code><code id="L3398"><span class="ln">3398</span>                }
-</code><code id="L3399"><span class="ln">3399</span>                fill.colors<span class="s"> &amp;&amp; </span>(fill.colors.value<span class="s"> = </span>clrs.length ? clrs.join() : <i>"<span class="d">0</span>% "</i><span class="s"> + </span>fill.color);
-</code><code id="L3400"><span class="ln">3400</span>                <b>if</b> (type<span class="s"> == </span><i>"radial"</i>) {
-</code><code id="L3401"><span class="ln">3401</span>                    fill.type<span class="s"> = </span><i>"gradientTitle"</i>;
-</code><code id="L3402"><span class="ln">3402</span>                    fill.focus<span class="s"> = </span><i>"<span class="d">100</span>%"</i>;
-</code><code id="L3403"><span class="ln">3403</span>                    fill.focussize<span class="s"> = </span><i>"<span class="d">0</span> <span class="d">0</span>"</i>;
-</code><code id="L3404"><span class="ln">3404</span>                    fill.focusposition<span class="s"> = </span>fxfy;
-</code><code id="L3405"><span class="ln">3405</span>                    fill.angle<span class="s"> = </span><span class="d">0</span>;
-</code><code id="L3406"><span class="ln">3406</span>                } <b>else</b> {
-</code><code id="L3407"><span class="ln">3407</span>                    <span class="c">// fill.rotate= <b>true</b>;</span>
-</code><code id="L3408"><span class="ln">3408</span>                    fill.type<span class="s"> = </span><i>"gradient"</i>;
-</code><code id="L3409"><span class="ln">3409</span>                    fill.angle<span class="s"> = </span>(<span class="d">270</span><span class="s"> - </span>angle)<span class="s"> % </span><span class="d">360</span>;
-</code><code id="L3410"><span class="ln">3410</span>                }
-</code><code id="L3411"><span class="ln">3411</span>                o.appendChild(fill);
-</code><code id="L3412"><span class="ln">3412</span>                <span class="c">// alert(fill.outerHTML);</span>
-</code><code id="L3413"><span class="ln">3413</span>            }
-</code><code id="L3414"><span class="ln">3414</span>            <b>return</b> <span class="d">1</span>;
-</code><code id="L3415"><span class="ln">3415</span>        };
-</code><code id="L3416"><span class="ln">3416</span>        Element<span class="s"> = </span><b>function</b> (node, vml) {
-</code><code id="L3417"><span class="ln">3417</span>            <b>this</b>[<span class="d">0</span>]<span class="s"> = </span><b>this</b>.node<span class="s"> = </span>node;
-</code><code id="L3418"><span class="ln">3418</span>            node.raphael<span class="s"> = </span><b>true</b>;
-</code><code id="L3419"><span class="ln">3419</span>            <b>this</b>.id<span class="s"> = </span>R._oid++;
-</code><code id="L3420"><span class="ln">3420</span>            node.raphaelid<span class="s"> = </span><b>this</b>.id;
-</code><code id="L3421"><span class="ln">3421</span>            <b>this</b>.X<span class="s"> = </span><span class="d">0</span>;
-</code><code id="L3422"><span class="ln">3422</span>            <b>this</b>.Y<span class="s"> = </span><span class="d">0</span>;
-</code><code id="L3423"><span class="ln">3423</span>            <b>this</b>.attrs<span class="s"> = </span>{};
-</code><code id="L3424"><span class="ln">3424</span>            <b>this</b>.paper<span class="s"> = </span>vml;
-</code><code id="L3425"><span class="ln">3425</span>            <b>this</b>.matrix<span class="s"> = </span><b>new</b> Matrix;
-</code><code id="L3426"><span class="ln">3426</span>            <b>this</b>._<span class="s"> = </span>{
-</code><code id="L3427"><span class="ln">3427</span>                transform: [],
-</code><code id="L3428"><span class="ln">3428</span>                sx: <span class="d">1</span>,
-</code><code id="L3429"><span class="ln">3429</span>                sy: <span class="d">1</span>,
-</code><code id="L3430"><span class="ln">3430</span>                dx: <span class="d">0</span>,
-</code><code id="L3431"><span class="ln">3431</span>                dy: <span class="d">0</span>,
-</code><code id="L3432"><span class="ln">3432</span>                deg: <span class="d">0</span>,
-</code><code id="L3433"><span class="ln">3433</span>                dirty: <span class="d">1</span>,
-</code><code id="L3434"><span class="ln">3434</span>                dirtyT: <span class="d">1</span>
-</code><code id="L3435"><span class="ln">3435</span>            };
-</code><code id="L3436"><span class="ln">3436</span>            !vml.bottom<span class="s"> &amp;&amp; </span>(vml.bottom<span class="s"> = </span><b>this</b>);
-</code><code id="L3437"><span class="ln">3437</span>            <b>this</b>.prev<span class="s"> = </span>vml.top;
-</code><code id="L3438"><span class="ln">3438</span>            vml.top<span class="s"> &amp;&amp; </span>(vml.top.next<span class="s"> = </span><b>this</b>);
-</code><code id="L3439"><span class="ln">3439</span>            vml.top<span class="s"> = </span><b>this</b>;
-</code><code id="L3440"><span class="ln">3440</span>            <b>this</b>.next<span class="s"> = </span><b>null</b>;
-</code><code id="L3441"><span class="ln">3441</span>        };
-</code><code id="L3442"><span class="ln">3442</span>        elproto<span class="s"> = </span>Element.prototype;
-</code><code id="L3443"><span class="ln">3443</span>        elproto.transform<span class="s"> = </span><b>function</b> (tstr) {
-</code><code id="L3444"><span class="ln">3444</span>            <b>if</b> (tstr<span class="s"> == </span><b>null</b>) {
-</code><code id="L3445"><span class="ln">3445</span>                <b>return</b> <b>this</b>._.transform;
-</code><code id="L3446"><span class="ln">3446</span>            }
-</code><code id="L3447"><span class="ln">3447</span>            extractTransform(<b>this</b>, tstr);
-</code><code id="L3448"><span class="ln">3448</span>            <b>var</b> matrix<span class="s"> = </span><b>this</b>.matrix.clone(),
-</code><code id="L3449"><span class="ln">3449</span>                skew<span class="s"> = </span><b>this</b>.skew;
-</code><code id="L3450"><span class="ln">3450</span>            matrix.translate(-<span class="d">.5</span>, -<span class="d">.5</span>);
-</code><code id="L3451"><span class="ln">3451</span>            <b>if</b> (<b>this</b>.type<span class="s"> == </span><i>"image"</i>) {
-</code><code id="L3452"><span class="ln">3452</span>                <b>if</b> (Str(tstr).indexOf(<i>"m"</i>)<span class="s"> + </span><span class="d">1</span>) {
-</code><code id="L3453"><span class="ln">3453</span>                    <b>this</b>.node.style.filter<span class="s"> = </span>matrix.toFilter();
-</code><code id="L3454"><span class="ln">3454</span>                    <b>var</b> bb<span class="s"> = </span><b>this</b>.getBBox(),
-</code><code id="L3455"><span class="ln">3455</span>                        bbt<span class="s"> = </span><b>this</b>.getBBox(<span class="d">1</span>),
-</code><code id="L3456"><span class="ln">3456</span>                        im<span class="s"> = </span>matrix.invert(),
-</code><code id="L3457"><span class="ln">3457</span>                        dx<span class="s"> = </span>im.x(bb.x, bb.y)<span class="s"> - </span>im.x(bbt.x, bbt.y),
-</code><code id="L3458"><span class="ln">3458</span>                        dy<span class="s"> = </span>im.y(bb.x, bb.y)<span class="s"> - </span>im.y(bbt.x, bbt.y);
-</code><code id="L3459"><span class="ln">3459</span>                    <span class="c">// skew.offset<span class="s"> = </span>dx<span class="s"> + </span>S<span class="s"> + </span>dy;</span>
-</code><code id="L3460"><span class="ln">3460</span>                    <span class="c">// <b>this</b>.node.getElementsByTagName(fillString)[<span class="d">0</span>].position<span class="s"> = </span>skew.offset;</span>
-</code><code id="L3461"><span class="ln">3461</span>                } <b>else</b> {
-</code><code id="L3462"><span class="ln">3462</span>                    <b>this</b>.node.style.filter<span class="s"> = </span>E;
-</code><code id="L3463"><span class="ln">3463</span>                    setCoords(<b>this</b>);
-</code><code id="L3464"><span class="ln">3464</span>                }
-</code><code id="L3465"><span class="ln">3465</span>            } <b>else</b> {
-</code><code id="L3466"><span class="ln">3466</span>                    <span class="c">// o<span class="s"> = </span><b>this</b>.node,</span>
-</code><code id="L3467"><span class="ln">3467</span>                    <span class="c">// _<span class="s"> = </span><b>this</b>._,</span>
-</code><code id="L3468"><span class="ln">3468</span>                    <span class="c">// fillpos<span class="s"> = </span>_.fillpos,</span>
-</code><code id="L3469"><span class="ln">3469</span>                    <span class="c">// deg,</span>
-</code><code id="L3470"><span class="ln">3470</span>                    <span class="c">// matrix<span class="s"> = </span><b>this</b>.matrix;</span>
-</code><code id="L3471"><span class="ln">3471</span>                    <span class="c">// fill<span class="s"> = </span>o.getElementsByTagName(fillString)[<span class="d">0</span>],</span>
-</code><code id="L3472"><span class="ln">3472</span>                    <span class="c">// angle<span class="s"> = </span>fill.angle;</span>
-</code><code id="L3473"><span class="ln">3473</span>
-</code><code id="L3474"><span class="ln">3474</span>                <b>this</b>.node.style.filter<span class="s"> = </span>E;
-</code><code id="L3475"><span class="ln">3475</span>                skew.matrix<span class="s"> = </span>matrix;
-</code><code id="L3476"><span class="ln">3476</span>                skew.offset<span class="s"> = </span>matrix.offset();
-</code><code id="L3477"><span class="ln">3477</span>                
-</code><code id="L3478"><span class="ln">3478</span>                <span class="c">// <b>if</b> (<span class="d">0</span>&amp;&amp;angle) {</span>
-</code><code id="L3479"><span class="ln">3479</span>                <span class="c">//     angle<span class="s"> = </span>R.rad(<span class="d">270</span><span class="s"> - </span>angle);</span>
-</code><code id="L3480"><span class="ln">3480</span>                <span class="c">//     <b>var</b> dx<span class="s"> = </span><span class="d">100</span><span class="s"> * </span>math.cos(angle),</span>
-</code><code id="L3481"><span class="ln">3481</span>                <span class="c">//         dy<span class="s"> = </span><span class="d">100</span><span class="s"> * </span>math.sin(angle),</span>
-</code><code id="L3482"><span class="ln">3482</span>                <span class="c">//         zx<span class="s"> = </span>matrix.x(<span class="d">0</span>, <span class="d">0</span>),</span>
-</code><code id="L3483"><span class="ln">3483</span>                <span class="c">//         zy<span class="s"> = </span>matrix.y(<span class="d">0</span>, <span class="d">0</span>),</span>
-</code><code id="L3484"><span class="ln">3484</span>                <span class="c">//         mx<span class="s"> = </span>matrix.x(dx, dy),</span>
-</code><code id="L3485"><span class="ln">3485</span>                <span class="c">//         my<span class="s"> = </span>matrix.y(dx, dy);</span>
-</code><code id="L3486"><span class="ln">3486</span>                <span class="c">//     angle<span class="s"> = </span>R.angle(zx, zy, mx, my);</span>
-</code><code id="L3487"><span class="ln">3487</span>                <span class="c">//     fill.angle<span class="s"> = </span>(<span class="d">270</span><span class="s"> - </span>angle)<span class="s"> % </span><span class="d">360</span>;</span>
-</code><code id="L3488"><span class="ln">3488</span>                <span class="c">// }</span>
-</code><code id="L3489"><span class="ln">3489</span>            }
-</code><code id="L3490"><span class="ln">3490</span>            <b>return</b> <b>this</b>;
-</code><code id="L3491"><span class="ln">3491</span>        };
-</code><code id="L3492"><span class="ln">3492</span>        elproto.rotate<span class="s"> = </span><b>function</b> (deg, cx, cy) {
-</code><code id="L3493"><span class="ln">3493</span>            <b>if</b> (<b>this</b>.removed) {
-</code><code id="L3494"><span class="ln">3494</span>                <b>return</b> <b>this</b>;
-</code><code id="L3495"><span class="ln">3495</span>            }
-</code><code id="L3496"><span class="ln">3496</span>            <b>if</b> (deg<span class="s"> == </span><b>null</b>) {
-</code><code id="L3497"><span class="ln">3497</span>                <b>return</b>;
-</code><code id="L3498"><span class="ln">3498</span>            }
-</code><code id="L3499"><span class="ln">3499</span>            deg<span class="s"> = </span>Str(deg).split(separator);
-</code><code id="L3500"><span class="ln">3500</span>            <b>if</b> (deg.length<span class="s"> - </span><span class="d">1</span>) {
-</code><code id="L3501"><span class="ln">3501</span>                cx<span class="s"> = </span>toFloat(deg[<span class="d">1</span>]);
-</code><code id="L3502"><span class="ln">3502</span>                cy<span class="s"> = </span>toFloat(deg[<span class="d">2</span>]);
-</code><code id="L3503"><span class="ln">3503</span>            }
-</code><code id="L3504"><span class="ln">3504</span>            deg<span class="s"> = </span>toFloat(deg[<span class="d">0</span>]);
-</code><code id="L3505"><span class="ln">3505</span>            (cy<span class="s"> == </span><b>null</b>)<span class="s"> &amp;&amp; </span>(cx<span class="s"> = </span>cy);
-</code><code id="L3506"><span class="ln">3506</span>            <b>if</b> (cx<span class="s"> == </span><b>null</b><span class="s"> || </span>cy<span class="s"> == </span><b>null</b>) {
-</code><code id="L3507"><span class="ln">3507</span>                <b>var</b> bbox<span class="s"> = </span><b>this</b>.getBBox(<span class="d">1</span>);
-</code><code id="L3508"><span class="ln">3508</span>                cx<span class="s"> = </span>bbox.x<span class="s"> + </span>bbox.width<span class="s"> / </span><span class="d">2</span>;
-</code><code id="L3509"><span class="ln">3509</span>                cy<span class="s"> = </span>bbox.y<span class="s"> + </span>bbox.height<span class="s"> / </span><span class="d">2</span>;
-</code><code id="L3510"><span class="ln">3510</span>            }
-</code><code id="L3511"><span class="ln">3511</span>            <b>this</b>._.dirtyT<span class="s"> = </span><span class="d">1</span>;
-</code><code id="L3512"><span class="ln">3512</span>            <b>this</b>.transform(<b>this</b>._.transform.concat([[<i>"r"</i>, deg, cx, cy]]));
-</code><code id="L3513"><span class="ln">3513</span>            <b>return</b> <b>this</b>;
-</code><code id="L3514"><span class="ln">3514</span>        };
-</code><code id="L3515"><span class="ln">3515</span>        elproto.translate<span class="s"> = </span><b>function</b> (dx, dy) {
-</code><code id="L3516"><span class="ln">3516</span>            <b>if</b> (<b>this</b>.removed) {
-</code><code id="L3517"><span class="ln">3517</span>                <b>return</b> <b>this</b>;
-</code><code id="L3518"><span class="ln">3518</span>            }
-</code><code id="L3519"><span class="ln">3519</span>            dx<span class="s"> = </span>Str(dx).split(separator);
-</code><code id="L3520"><span class="ln">3520</span>            <b>if</b> (dx.length<span class="s"> - </span><span class="d">1</span>) {
-</code><code id="L3521"><span class="ln">3521</span>                dy<span class="s"> = </span>toFloat(dx[<span class="d">1</span>]);
-</code><code id="L3522"><span class="ln">3522</span>            }
-</code><code id="L3523"><span class="ln">3523</span>            dx<span class="s"> = </span>toFloat(dx[<span class="d">0</span>])<span class="s"> || </span><span class="d">0</span>;
-</code><code id="L3524"><span class="ln">3524</span>            dy<span class="s"> = </span>+dy<span class="s"> || </span><span class="d">0</span>;
-</code><code id="L3525"><span class="ln">3525</span>            <b>if</b> (<b>this</b>._.bbox) {
-</code><code id="L3526"><span class="ln">3526</span>                <b>this</b>._.bbox.x += dx;
-</code><code id="L3527"><span class="ln">3527</span>                <b>this</b>._.bbox.y += dy;
-</code><code id="L3528"><span class="ln">3528</span>            }
-</code><code id="L3529"><span class="ln">3529</span>            <b>this</b>.transform(<b>this</b>._.transform.concat([[<i>"t"</i>, dx, dy]]));
-</code><code id="L3530"><span class="ln">3530</span>            <b>return</b> <b>this</b>;
-</code><code id="L3531"><span class="ln">3531</span>        };
-</code><code id="L3532"><span class="ln">3532</span>        elproto.scale<span class="s"> = </span><b>function</b> (sx, sy, cx, cy) {
-</code><code id="L3533"><span class="ln">3533</span>            <b>if</b> (<b>this</b>.removed) {
-</code><code id="L3534"><span class="ln">3534</span>                <b>return</b> <b>this</b>;
+</code><code id="L3211"><span class="ln">3211</span>            <b>if</b> (<i>"clip-rect"</i> <b>in</b> params) {
+</code><code id="L3212"><span class="ln">3212</span>                <b>var</b> rect<span class="s"> = </span>Str(params[<i>"clip-rect"</i>]).split(separator);
+</code><code id="L3213"><span class="ln">3213</span>                <b>if</b> (rect.length<span class="s"> == </span><span class="d">4</span>) {
+</code><code id="L3214"><span class="ln">3214</span>                    rect[<span class="d">2</span>]<span class="s"> = </span>+rect[<span class="d">2</span>]<span class="s"> + </span>(+rect[<span class="d">0</span>]);
+</code><code id="L3215"><span class="ln">3215</span>                    rect[<span class="d">3</span>]<span class="s"> = </span>+rect[<span class="d">3</span>]<span class="s"> + </span>(+rect[<span class="d">1</span>]);
+</code><code id="L3216"><span class="ln">3216</span>                    <b>var</b> div<span class="s"> = </span>node.clipRect<span class="s"> || </span>g.doc.createElement(<i>"div"</i>),
+</code><code id="L3217"><span class="ln">3217</span>                        dstyle<span class="s"> = </span>div.style,
+</code><code id="L3218"><span class="ln">3218</span>                        group<span class="s"> = </span>node.parentNode;
+</code><code id="L3219"><span class="ln">3219</span>                    dstyle.clip<span class="s"> = </span>R.format(<i>"rect({<span class="d">1</span>}px {<span class="d">2</span>}px {<span class="d">3</span>}px {<span class="d">0</span>}px)"</i>, rect);
+</code><code id="L3220"><span class="ln">3220</span>                    <b>if</b> (!node.clipRect) {
+</code><code id="L3221"><span class="ln">3221</span>                        dstyle.position<span class="s"> = </span><i>"absolute"</i>;
+</code><code id="L3222"><span class="ln">3222</span>                        dstyle.top<span class="s"> = </span><span class="d">0</span>;
+</code><code id="L3223"><span class="ln">3223</span>                        dstyle.left<span class="s"> = </span><span class="d">0</span>;
+</code><code id="L3224"><span class="ln">3224</span>                        dstyle.width<span class="s"> = </span>o.paper.width<span class="s"> + </span><i>"px"</i>;
+</code><code id="L3225"><span class="ln">3225</span>                        dstyle.height<span class="s"> = </span>o.paper.height<span class="s"> + </span><i>"px"</i>;
+</code><code id="L3226"><span class="ln">3226</span>                        group.parentNode.insertBefore(div, group);
+</code><code id="L3227"><span class="ln">3227</span>                        div.appendChild(group);
+</code><code id="L3228"><span class="ln">3228</span>                        node.clipRect<span class="s"> = </span>div;
+</code><code id="L3229"><span class="ln">3229</span>                    }
+</code><code id="L3230"><span class="ln">3230</span>                }
+</code><code id="L3231"><span class="ln">3231</span>                <b>if</b> (!params[<i>"clip-rect"</i>]) {
+</code><code id="L3232"><span class="ln">3232</span>                    node.clipRect<span class="s"> &amp;&amp; </span>(node.clipRect.style.clip<span class="s"> = </span>E);
+</code><code id="L3233"><span class="ln">3233</span>                }
+</code><code id="L3234"><span class="ln">3234</span>            }
+</code><code id="L3235"><span class="ln">3235</span>            <b>if</b> (o.textpath) {
+</code><code id="L3236"><span class="ln">3236</span>                <b>var</b> textpathStyle<span class="s"> = </span>o.textpath.style;
+</code><code id="L3237"><span class="ln">3237</span>                params.font<span class="s"> &amp;&amp; </span>(textpathStyle.font<span class="s"> = </span>params.font);
+</code><code id="L3238"><span class="ln">3238</span>                params[<i>"font-family"</i>]<span class="s"> &amp;&amp; </span>(textpathStyle.fontFamily<span class="s"> = </span><i>'"'</i><span class="s"> + </span>params[<i>"font-family"</i>].split(<i>","</i>)[<span class="d">0</span>].replace(/^[<i>'"]+|['</i><i>"]+$/g, E)<span class="s"> + </span>'"</i>');
+</code><code id="L3239"><span class="ln">3239</span>                params[<i>"font-size"</i>]<span class="s"> &amp;&amp; </span>(textpathStyle.fontSize<span class="s"> = </span>params[<i>"font-size"</i>]);
+</code><code id="L3240"><span class="ln">3240</span>                params[<i>"font-weight"</i>]<span class="s"> &amp;&amp; </span>(textpathStyle.fontWeight<span class="s"> = </span>params[<i>"font-weight"</i>]);
+</code><code id="L3241"><span class="ln">3241</span>                params[<i>"font-style"</i>]<span class="s"> &amp;&amp; </span>(textpathStyle.fontStyle<span class="s"> = </span>params[<i>"font-style"</i>]);
+</code><code id="L3242"><span class="ln">3242</span>            }
+</code><code id="L3243"><span class="ln">3243</span>            <b>if</b> (<i>"arrow-start"</i> <b>in</b> params) {
+</code><code id="L3244"><span class="ln">3244</span>                addArrow(res, params[<i>"arrow-start"</i>]);
+</code><code id="L3245"><span class="ln">3245</span>            }
+</code><code id="L3246"><span class="ln">3246</span>            <b>if</b> (<i>"arrow-end"</i> <b>in</b> params) {
+</code><code id="L3247"><span class="ln">3247</span>                addArrow(res, params[<i>"arrow-end"</i>], <span class="d">1</span>);
+</code><code id="L3248"><span class="ln">3248</span>            }
+</code><code id="L3249"><span class="ln">3249</span>            <b>if</b> (params.opacity != <b>null</b><span class="s"> || </span>
+</code><code id="L3250"><span class="ln">3250</span>                params[<i>"stroke-width"</i>] != <b>null</b> ||
+</code><code id="L3251"><span class="ln">3251</span>                params.fill != <b>null</b> ||
+</code><code id="L3252"><span class="ln">3252</span>                params.src != <b>null</b> ||
+</code><code id="L3253"><span class="ln">3253</span>                params.stroke != <b>null</b> ||
+</code><code id="L3254"><span class="ln">3254</span>                params[<i>"stroke-width"</i>] != <b>null</b> ||
+</code><code id="L3255"><span class="ln">3255</span>                params[<i>"stroke-opacity"</i>] != <b>null</b> ||
+</code><code id="L3256"><span class="ln">3256</span>                params[<i>"fill-opacity"</i>] != <b>null</b> ||
+</code><code id="L3257"><span class="ln">3257</span>                params[<i>"stroke-dasharray"</i>] != <b>null</b> ||
+</code><code id="L3258"><span class="ln">3258</span>                params[<i>"stroke-miterlimit"</i>] != <b>null</b> ||
+</code><code id="L3259"><span class="ln">3259</span>                params[<i>"stroke-linejoin"</i>] != <b>null</b> ||
+</code><code id="L3260"><span class="ln">3260</span>                params[<i>"stroke-linecap"</i>] != <b>null</b>) {
+</code><code id="L3261"><span class="ln">3261</span>                <b>var</b> fill<span class="s"> = </span>node.getElementsByTagName(fillString),
+</code><code id="L3262"><span class="ln">3262</span>                    newfill<span class="s"> = </span><b>false</b>;
+</code><code id="L3263"><span class="ln">3263</span>                fill<span class="s"> = </span>fill<span class="s"> &amp;&amp; </span>fill[<span class="d">0</span>];
+</code><code id="L3264"><span class="ln">3264</span>                !fill<span class="s"> &amp;&amp; </span>(newfill<span class="s"> = </span>fill<span class="s"> = </span>createNode(fillString));
+</code><code id="L3265"><span class="ln">3265</span>                <b>if</b> (o.type<span class="s"> == </span><i>"image"</i><span class="s"> &amp;&amp; </span>params.src) {
+</code><code id="L3266"><span class="ln">3266</span>                    fill.src<span class="s"> = </span>params.src;
+</code><code id="L3267"><span class="ln">3267</span>                }
+</code><code id="L3268"><span class="ln">3268</span>                <b>if</b> (<i>"fill-opacity"</i> <b>in</b> params<span class="s"> || </span><i>"opacity"</i> <b>in</b> params) {
+</code><code id="L3269"><span class="ln">3269</span>                    <b>var</b> opacity<span class="s"> = </span>((+a[<i>"fill-opacity"</i>]<span class="s"> + </span><span class="d">1</span><span class="s"> || </span><span class="d">2</span>)<span class="s"> - </span><span class="d">1</span>)<span class="s"> * </span>((+a.opacity<span class="s"> + </span><span class="d">1</span><span class="s"> || </span><span class="d">2</span>)<span class="s"> - </span><span class="d">1</span>)<span class="s"> * </span>((+R.getRGB(params.fill).o<span class="s"> + </span><span class="d">1</span><span class="s"> || </span><span class="d">2</span>)<span class="s"> - </span><span class="d">1</span>);
+</code><code id="L3270"><span class="ln">3270</span>                    opacity<span class="s"> = </span>mmin(mmax(opacity, <span class="d">0</span>), <span class="d">1</span>);
+</code><code id="L3271"><span class="ln">3271</span>                    fill.opacity<span class="s"> = </span>opacity;
+</code><code id="L3272"><span class="ln">3272</span>                }
+</code><code id="L3273"><span class="ln">3273</span>                params.fill<span class="s"> &amp;&amp; </span>(fill.on<span class="s"> = </span><b>true</b>);
+</code><code id="L3274"><span class="ln">3274</span>                <b>if</b> (fill.on<span class="s"> == </span><b>null</b><span class="s"> || </span>params.fill<span class="s"> == </span><i>"none"</i><span class="s"> || </span>params.fill<span class="s"> === </span><b>null</b>) {
+</code><code id="L3275"><span class="ln">3275</span>                    fill.on<span class="s"> = </span><b>false</b>;
+</code><code id="L3276"><span class="ln">3276</span>                }
+</code><code id="L3277"><span class="ln">3277</span>                <b>if</b> (fill.on<span class="s"> &amp;&amp; </span>params.fill) {
+</code><code id="L3278"><span class="ln">3278</span>                    <b>var</b> isURL<span class="s"> = </span>params.fill.match(ISURL);
+</code><code id="L3279"><span class="ln">3279</span>                    <b>if</b> (isURL) {
+</code><code id="L3280"><span class="ln">3280</span>                        fill.parentNode<span class="s"> == </span>node<span class="s"> &amp;&amp; </span>node.removeChild(fill);
+</code><code id="L3281"><span class="ln">3281</span>                        fill.rotate<span class="s"> = </span><b>true</b>;
+</code><code id="L3282"><span class="ln">3282</span>                        fill.src<span class="s"> = </span>isURL[<span class="d">1</span>];
+</code><code id="L3283"><span class="ln">3283</span>                        fill.type<span class="s"> = </span><i>"tile"</i>;
+</code><code id="L3284"><span class="ln">3284</span>                        <b>var</b> bbox<span class="s"> = </span>o.getBBox(<span class="d">1</span>);
+</code><code id="L3285"><span class="ln">3285</span>                        fill.position<span class="s"> = </span>bbox.x<span class="s"> + </span>S<span class="s"> + </span>bbox.y;
+</code><code id="L3286"><span class="ln">3286</span>                        o._.fillpos<span class="s"> = </span>[bbox.x, bbox.y];
+</code><code id="L3287"><span class="ln">3287</span>
+</code><code id="L3288"><span class="ln">3288</span>                        preload(isURL[<span class="d">1</span>], <b>function</b> () {
+</code><code id="L3289"><span class="ln">3289</span>                            o._.fillsize<span class="s"> = </span>[<b>this</b>.offsetWidth, <b>this</b>.offsetHeight];
+</code><code id="L3290"><span class="ln">3290</span>                        });
+</code><code id="L3291"><span class="ln">3291</span>                    } <b>else</b> {
+</code><code id="L3292"><span class="ln">3292</span>                        fill.color<span class="s"> = </span>R.getRGB(params.fill).hex;
+</code><code id="L3293"><span class="ln">3293</span>                        fill.src<span class="s"> = </span>E;
+</code><code id="L3294"><span class="ln">3294</span>                        fill.type<span class="s"> = </span><i>"solid"</i>;
+</code><code id="L3295"><span class="ln">3295</span>                        <b>if</b> (R.getRGB(params.fill).error<span class="s"> &amp;&amp; </span>(res.type <b>in</b> {circle: <span class="d">1</span>, ellipse: <span class="d">1</span>}<span class="s"> || </span>Str(params.fill).charAt() != <i>"r"</i>)<span class="s"> &amp;&amp; </span>addGradientFill(res, params.fill, fill)) {
+</code><code id="L3296"><span class="ln">3296</span>                            a.fill<span class="s"> = </span><i>"none"</i>;
+</code><code id="L3297"><span class="ln">3297</span>                            a.gradient<span class="s"> = </span>params.fill;
+</code><code id="L3298"><span class="ln">3298</span>                            fill.rotate<span class="s"> = </span><b>false</b>;
+</code><code id="L3299"><span class="ln">3299</span>                        }
+</code><code id="L3300"><span class="ln">3300</span>                    }
+</code><code id="L3301"><span class="ln">3301</span>                }
+</code><code id="L3302"><span class="ln">3302</span>                node.appendChild(fill);
+</code><code id="L3303"><span class="ln">3303</span>                <b>var</b> stroke<span class="s"> = </span>(node.getElementsByTagName(<i>"stroke"</i>)<span class="s"> &amp;&amp; </span>node.getElementsByTagName(<i>"stroke"</i>)[<span class="d">0</span>]),
+</code><code id="L3304"><span class="ln">3304</span>                newstroke<span class="s"> = </span><b>false</b>;
+</code><code id="L3305"><span class="ln">3305</span>                !stroke<span class="s"> &amp;&amp; </span>(newstroke<span class="s"> = </span>stroke<span class="s"> = </span>createNode(<i>"stroke"</i>));
+</code><code id="L3306"><span class="ln">3306</span>                <b>if</b> ((params.stroke<span class="s"> &amp;&amp; </span>params.stroke != <i>"none"</i>) ||
+</code><code id="L3307"><span class="ln">3307</span>                    params[<i>"stroke-width"</i>] ||
+</code><code id="L3308"><span class="ln">3308</span>                    params[<i>"stroke-opacity"</i>] != <b>null</b> ||
+</code><code id="L3309"><span class="ln">3309</span>                    params[<i>"stroke-dasharray"</i>] ||
+</code><code id="L3310"><span class="ln">3310</span>                    params[<i>"stroke-miterlimit"</i>] ||
+</code><code id="L3311"><span class="ln">3311</span>                    params[<i>"stroke-linejoin"</i>] ||
+</code><code id="L3312"><span class="ln">3312</span>                    params[<i>"stroke-linecap"</i>]) {
+</code><code id="L3313"><span class="ln">3313</span>                    stroke.on<span class="s"> = </span><b>true</b>;
+</code><code id="L3314"><span class="ln">3314</span>                }
+</code><code id="L3315"><span class="ln">3315</span>                (params.stroke<span class="s"> == </span><i>"none"</i><span class="s"> || </span>params.stroke<span class="s"> === </span><b>null</b><span class="s"> || </span>stroke.on<span class="s"> == </span><b>null</b><span class="s"> || </span>params.stroke<span class="s"> == </span><span class="d">0</span><span class="s"> || </span>params[<i>"stroke-width"</i>]<span class="s"> == </span><span class="d">0</span>)<span class="s"> &amp;&amp; </span>(stroke.on<span class="s"> = </span><b>false</b>);
+</code><code id="L3316"><span class="ln">3316</span>                <b>var</b> strokeColor<span class="s"> = </span>R.getRGB(params.stroke);
+</code><code id="L3317"><span class="ln">3317</span>                stroke.on<span class="s"> &amp;&amp; </span>params.stroke<span class="s"> &amp;&amp; </span>(stroke.color<span class="s"> = </span>strokeColor.hex);
+</code><code id="L3318"><span class="ln">3318</span>                opacity<span class="s"> = </span>((+a[<i>"stroke-opacity"</i>]<span class="s"> + </span><span class="d">1</span><span class="s"> || </span><span class="d">2</span>)<span class="s"> - </span><span class="d">1</span>)<span class="s"> * </span>((+a.opacity<span class="s"> + </span><span class="d">1</span><span class="s"> || </span><span class="d">2</span>)<span class="s"> - </span><span class="d">1</span>)<span class="s"> * </span>((+strokeColor.o<span class="s"> + </span><span class="d">1</span><span class="s"> || </span><span class="d">2</span>)<span class="s"> - </span><span class="d">1</span>);
+</code><code id="L3319"><span class="ln">3319</span>                <b>var</b> width<span class="s"> = </span>(toFloat(params[<i>"stroke-width"</i>])<span class="s"> || </span><span class="d">1</span>)<span class="s"> * </span><span class="d">.75</span>;
+</code><code id="L3320"><span class="ln">3320</span>                opacity<span class="s"> = </span>mmin(mmax(opacity, <span class="d">0</span>), <span class="d">1</span>);
+</code><code id="L3321"><span class="ln">3321</span>                params[<i>"stroke-width"</i>]<span class="s"> == </span><b>null</b><span class="s"> &amp;&amp; </span>(width<span class="s"> = </span>a[<i>"stroke-width"</i>]);
+</code><code id="L3322"><span class="ln">3322</span>                params[<i>"stroke-width"</i>]<span class="s"> &amp;&amp; </span>(stroke.weight<span class="s"> = </span>width);
+</code><code id="L3323"><span class="ln">3323</span>                width<span class="s"> &amp;&amp; </span>width &lt; <span class="d">1</span><span class="s"> &amp;&amp; </span>(opacity *= width)<span class="s"> &amp;&amp; </span>(stroke.weight<span class="s"> = </span><span class="d">1</span>);
+</code><code id="L3324"><span class="ln">3324</span>                stroke.opacity<span class="s"> = </span>opacity;
+</code><code id="L3325"><span class="ln">3325</span>                
+</code><code id="L3326"><span class="ln">3326</span>                params[<i>"stroke-linejoin"</i>]<span class="s"> &amp;&amp; </span>(stroke.joinstyle<span class="s"> = </span>params[<i>"stroke-linejoin"</i>]<span class="s"> || </span><i>"miter"</i>);
+</code><code id="L3327"><span class="ln">3327</span>                stroke.miterlimit<span class="s"> = </span>params[<i>"stroke-miterlimit"</i>]<span class="s"> || </span><span class="d">8</span>;
+</code><code id="L3328"><span class="ln">3328</span>                params[<i>"stroke-linecap"</i>]<span class="s"> &amp;&amp; </span>(stroke.endcap<span class="s"> = </span>params[<i>"stroke-linecap"</i>]<span class="s"> == </span><i>"butt"</i> ? <i>"flat"</i> : params[<i>"stroke-linecap"</i>]<span class="s"> == </span><i>"square"</i> ? <i>"square"</i> : <i>"round"</i>);
+</code><code id="L3329"><span class="ln">3329</span>                <b>if</b> (params[<i>"stroke-dasharray"</i>]) {
+</code><code id="L3330"><span class="ln">3330</span>                    <b>var</b> dasharray<span class="s"> = </span>{
+</code><code id="L3331"><span class="ln">3331</span>                        <i>"-"</i>: <i>"shortdash"</i>,
+</code><code id="L3332"><span class="ln">3332</span>                        <i>"."</i>: <i>"shortdot"</i>,
+</code><code id="L3333"><span class="ln">3333</span>                        <i>"-."</i>: <i>"shortdashdot"</i>,
+</code><code id="L3334"><span class="ln">3334</span>                        <i>"-.."</i>: <i>"shortdashdotdot"</i>,
+</code><code id="L3335"><span class="ln">3335</span>                        <i>". "</i>: <i>"dot"</i>,
+</code><code id="L3336"><span class="ln">3336</span>                        <i>"- "</i>: <i>"dash"</i>,
+</code><code id="L3337"><span class="ln">3337</span>                        <i>"--"</i>: <i>"longdash"</i>,
+</code><code id="L3338"><span class="ln">3338</span>                        <i>"- ."</i>: <i>"dashdot"</i>,
+</code><code id="L3339"><span class="ln">3339</span>                        <i>"--."</i>: <i>"longdashdot"</i>,
+</code><code id="L3340"><span class="ln">3340</span>                        <i>"--.."</i>: <i>"longdashdotdot"</i>
+</code><code id="L3341"><span class="ln">3341</span>                    };
+</code><code id="L3342"><span class="ln">3342</span>                    stroke.dashstyle<span class="s"> = </span>dasharray[has](params[<i>"stroke-dasharray"</i>]) ? dasharray[params[<i>"stroke-dasharray"</i>]] : E;
+</code><code id="L3343"><span class="ln">3343</span>                }
+</code><code id="L3344"><span class="ln">3344</span>                newstroke<span class="s"> &amp;&amp; </span>node.appendChild(stroke);
+</code><code id="L3345"><span class="ln">3345</span>            }
+</code><code id="L3346"><span class="ln">3346</span>            <b>if</b> (res.type<span class="s"> == </span><i>"text"</i>) {
+</code><code id="L3347"><span class="ln">3347</span>                res.paper.canvas.style.display<span class="s"> = </span>E;
+</code><code id="L3348"><span class="ln">3348</span>                <b>var</b> span<span class="s"> = </span>res.paper.span,
+</code><code id="L3349"><span class="ln">3349</span>                    m<span class="s"> = </span><span class="d">100</span>,
+</code><code id="L3350"><span class="ln">3350</span>                    fontSize<span class="s"> = </span>a.font<span class="s"> &amp;&amp; </span>a.font.match(/\d+(?:\.\d*)?(?=px)/);
+</code><code id="L3351"><span class="ln">3351</span>                s<span class="s"> = </span>span.style;
+</code><code id="L3352"><span class="ln">3352</span>                a.font<span class="s"> &amp;&amp; </span>(s.font<span class="s"> = </span>a.font);
+</code><code id="L3353"><span class="ln">3353</span>                a[<i>"font-family"</i>]<span class="s"> &amp;&amp; </span>(s.fontFamily<span class="s"> = </span>a[<i>"font-family"</i>]);
+</code><code id="L3354"><span class="ln">3354</span>                a[<i>"font-weight"</i>]<span class="s"> &amp;&amp; </span>(s.fontWeight<span class="s"> = </span>a[<i>"font-weight"</i>]);
+</code><code id="L3355"><span class="ln">3355</span>                a[<i>"font-style"</i>]<span class="s"> &amp;&amp; </span>(s.fontStyle<span class="s"> = </span>a[<i>"font-style"</i>]);
+</code><code id="L3356"><span class="ln">3356</span>                fontSize<span class="s"> = </span>toFloat(fontSize ? fontSize[<span class="d">0</span>] : a[<i>"font-size"</i>]);
+</code><code id="L3357"><span class="ln">3357</span>                s.fontSize<span class="s"> = </span>fontSize<span class="s"> * </span>m<span class="s"> + </span><i>"px"</i>;
+</code><code id="L3358"><span class="ln">3358</span>                res.textpath.string<span class="s"> &amp;&amp; </span>(span.innerHTML<span class="s"> = </span>Str(res.textpath.string).replace(/&lt;/g, <i>"&#<span class="d">60</span>;"</i>).replace(/&amp;/g, <i>"&#<span class="d">38</span>;"</i>).replace(/\n/g, <i>"&lt;br>"</i>));
+</code><code id="L3359"><span class="ln">3359</span>                <b>var</b> brect<span class="s"> = </span>span.getBoundingClientRect();
+</code><code id="L3360"><span class="ln">3360</span>                res.W<span class="s"> = </span>a.w<span class="s"> = </span>(brect.right<span class="s"> - </span>brect.left)<span class="s"> / </span>m;
+</code><code id="L3361"><span class="ln">3361</span>                res.H<span class="s"> = </span>a.h<span class="s"> = </span>(brect.bottom<span class="s"> - </span>brect.top)<span class="s"> / </span>m;
+</code><code id="L3362"><span class="ln">3362</span>                res.paper.canvas.style.display<span class="s"> = </span><i>"none"</i>;
+</code><code id="L3363"><span class="ln">3363</span>                res.X<span class="s"> = </span>a.x;
+</code><code id="L3364"><span class="ln">3364</span>                res.Y<span class="s"> = </span>a.y<span class="s"> + </span>res.H<span class="s"> / </span><span class="d">2</span>;
+</code><code id="L3365"><span class="ln">3365</span>
+</code><code id="L3366"><span class="ln">3366</span>                (<i>"x"</i> <b>in</b> params<span class="s"> || </span><i>"y"</i> <b>in</b> params)<span class="s"> &amp;&amp; </span>(res.path.v<span class="s"> = </span>R.format(<i>"m{<span class="d">0</span>},{<span class="d">1</span>}l{<span class="d">2</span>},{<span class="d">1</span>}"</i>, round(a.x<span class="s"> * </span>zoom), round(a.y<span class="s"> * </span>zoom), round(a.x<span class="s"> * </span>zoom)<span class="s"> + </span><span class="d">1</span>));
+</code><code id="L3367"><span class="ln">3367</span>                <b>var</b> dirtyattrs<span class="s"> = </span>[<i>"x"</i>, <i>"y"</i>, <i>"text"</i>, <i>"font"</i>, <i>"font-family"</i>, <i>"font-weight"</i>, <i>"font-style"</i>, <i>"font-size"</i>];
+</code><code id="L3368"><span class="ln">3368</span>                <b>for</b> (<b>var</b> d<span class="s"> = </span><span class="d">0</span>, dd<span class="s"> = </span>dirtyattrs.length; d &lt; dd; d++) <b>if</b> (dirtyattrs[d] <b>in</b> params) {
+</code><code id="L3369"><span class="ln">3369</span>                    res._.dirty<span class="s"> = </span><span class="d">1</span>;
+</code><code id="L3370"><span class="ln">3370</span>                    <b>break</b>;
+</code><code id="L3371"><span class="ln">3371</span>                }
+</code><code id="L3372"><span class="ln">3372</span>                
+</code><code id="L3373"><span class="ln">3373</span>                <span class="c">// text-anchor emulation</span>
+</code><code id="L3374"><span class="ln">3374</span>                <b>switch</b> (a[<i>"text-anchor"</i>]) {
+</code><code id="L3375"><span class="ln">3375</span>                    <b>case</b> <i>"start"</i>:
+</code><code id="L3376"><span class="ln">3376</span>                        res.textpath.style[<i>"v-text-align"</i>]<span class="s"> = </span><i>"left"</i>;
+</code><code id="L3377"><span class="ln">3377</span>                        res.bbx<span class="s"> = </span>res.W<span class="s"> / </span><span class="d">2</span>;
+</code><code id="L3378"><span class="ln">3378</span>                    <b>break</b>;
+</code><code id="L3379"><span class="ln">3379</span>                    <b>case</b> <i>"end"</i>:
+</code><code id="L3380"><span class="ln">3380</span>                        res.textpath.style[<i>"v-text-align"</i>]<span class="s"> = </span><i>"right"</i>;
+</code><code id="L3381"><span class="ln">3381</span>                        res.bbx<span class="s"> = </span>-res.W<span class="s"> / </span><span class="d">2</span>;
+</code><code id="L3382"><span class="ln">3382</span>                    <b>break</b>;
+</code><code id="L3383"><span class="ln">3383</span>                    <b>default</b>:
+</code><code id="L3384"><span class="ln">3384</span>                        res.textpath.style[<i>"v-text-align"</i>]<span class="s"> = </span><i>"center"</i>;
+</code><code id="L3385"><span class="ln">3385</span>                        res.bbx<span class="s"> = </span><span class="d">0</span>;
+</code><code id="L3386"><span class="ln">3386</span>                    <b>break</b>;
+</code><code id="L3387"><span class="ln">3387</span>                }
+</code><code id="L3388"><span class="ln">3388</span>                res.textpath.style[<i>"v-text-kern"</i>]<span class="s"> = </span><b>true</b>;
+</code><code id="L3389"><span class="ln">3389</span>            }
+</code><code id="L3390"><span class="ln">3390</span>            res.paper.canvas.style.display<span class="s"> = </span>E;
+</code><code id="L3391"><span class="ln">3391</span>        };
+</code><code id="L3392"><span class="ln">3392</span>        addGradientFill<span class="s"> = </span><b>function</b> (o, gradient, fill) {
+</code><code id="L3393"><span class="ln">3393</span>            o.attrs<span class="s"> = </span>o.attrs<span class="s"> || </span>{};
+</code><code id="L3394"><span class="ln">3394</span>            <b>var</b> attrs<span class="s"> = </span>o.attrs,
+</code><code id="L3395"><span class="ln">3395</span>                type<span class="s"> = </span><i>"linear"</i>,
+</code><code id="L3396"><span class="ln">3396</span>                fxfy<span class="s"> = </span><i>"<span class="d">.5</span> <span class="d">.5</span>"</i>;
+</code><code id="L3397"><span class="ln">3397</span>            o.attrs.gradient<span class="s"> = </span>gradient;
+</code><code id="L3398"><span class="ln">3398</span>            gradient<span class="s"> = </span>Str(gradient).replace(radial_gradient, <b>function</b> (all, fx, fy) {
+</code><code id="L3399"><span class="ln">3399</span>                type<span class="s"> = </span><i>"radial"</i>;
+</code><code id="L3400"><span class="ln">3400</span>                <b>if</b> (fx<span class="s"> &amp;&amp; </span>fy) {
+</code><code id="L3401"><span class="ln">3401</span>                    fx<span class="s"> = </span>toFloat(fx);
+</code><code id="L3402"><span class="ln">3402</span>                    fy<span class="s"> = </span>toFloat(fy);
+</code><code id="L3403"><span class="ln">3403</span>                    pow(fx<span class="s"> - </span><span class="d">.5</span>, <span class="d">2</span>)<span class="s"> + </span>pow(fy<span class="s"> - </span><span class="d">.5</span>, <span class="d">2</span>) > <span class="d">.25</span><span class="s"> &amp;&amp; </span>(fy<span class="s"> = </span>math.sqrt(<span class="d">.25</span><span class="s"> - </span>pow(fx<span class="s"> - </span><span class="d">.5</span>, <span class="d">2</span>))<span class="s"> * </span>((fy > <span class="d">.5</span>)<span class="s"> * </span><span class="d">2</span><span class="s"> - </span><span class="d">1</span>)<span class="s"> + </span><span class="d">.5</span>);
+</code><code id="L3404"><span class="ln">3404</span>                    fxfy<span class="s"> = </span>fx<span class="s"> + </span>S<span class="s"> + </span>fy;
+</code><code id="L3405"><span class="ln">3405</span>                }
+</code><code id="L3406"><span class="ln">3406</span>                <b>return</b> E;
+</code><code id="L3407"><span class="ln">3407</span>            });
+</code><code id="L3408"><span class="ln">3408</span>            gradient<span class="s"> = </span>gradient.split(/\s*\-\s*/);
+</code><code id="L3409"><span class="ln">3409</span>            <b>if</b> (type<span class="s"> == </span><i>"linear"</i>) {
+</code><code id="L3410"><span class="ln">3410</span>                <b>var</b> angle<span class="s"> = </span>gradient.shift();
+</code><code id="L3411"><span class="ln">3411</span>                angle<span class="s"> = </span>-toFloat(angle);
+</code><code id="L3412"><span class="ln">3412</span>                <b>if</b> (isNaN(angle)) {
+</code><code id="L3413"><span class="ln">3413</span>                    <b>return</b> <b>null</b>;
+</code><code id="L3414"><span class="ln">3414</span>                }
+</code><code id="L3415"><span class="ln">3415</span>            }
+</code><code id="L3416"><span class="ln">3416</span>            <b>var</b> dots<span class="s"> = </span>parseDots(gradient);
+</code><code id="L3417"><span class="ln">3417</span>            <b>if</b> (!dots) {
+</code><code id="L3418"><span class="ln">3418</span>                <b>return</b> <b>null</b>;
+</code><code id="L3419"><span class="ln">3419</span>            }
+</code><code id="L3420"><span class="ln">3420</span>            o<span class="s"> = </span>o.shape<span class="s"> || </span>o.node;
+</code><code id="L3421"><span class="ln">3421</span>            <b>if</b> (dots.length) {
+</code><code id="L3422"><span class="ln">3422</span>                o.removeChild(fill);
+</code><code id="L3423"><span class="ln">3423</span>                fill.on<span class="s"> = </span><b>true</b>;
+</code><code id="L3424"><span class="ln">3424</span>                fill.method<span class="s"> = </span><i>"none"</i>;
+</code><code id="L3425"><span class="ln">3425</span>                fill.color<span class="s"> = </span>dots[<span class="d">0</span>].color;
+</code><code id="L3426"><span class="ln">3426</span>                fill.color2<span class="s"> = </span>dots[dots.length<span class="s"> - </span><span class="d">1</span>].color;
+</code><code id="L3427"><span class="ln">3427</span>                <b>var</b> clrs<span class="s"> = </span>[];
+</code><code id="L3428"><span class="ln">3428</span>                <b>for</b> (<b>var</b> i<span class="s"> = </span><span class="d">0</span>, ii<span class="s"> = </span>dots.length; i &lt; ii; i++) {
+</code><code id="L3429"><span class="ln">3429</span>                    dots[i].offset<span class="s"> &amp;&amp; </span>clrs.push(dots[i].offset<span class="s"> + </span>S<span class="s"> + </span>dots[i].color);
+</code><code id="L3430"><span class="ln">3430</span>                }
+</code><code id="L3431"><span class="ln">3431</span>                fill.colors<span class="s"> &amp;&amp; </span>(fill.colors.value<span class="s"> = </span>clrs.length ? clrs.join() : <i>"<span class="d">0</span>% "</i><span class="s"> + </span>fill.color);
+</code><code id="L3432"><span class="ln">3432</span>                <b>if</b> (type<span class="s"> == </span><i>"radial"</i>) {
+</code><code id="L3433"><span class="ln">3433</span>                    fill.type<span class="s"> = </span><i>"gradientTitle"</i>;
+</code><code id="L3434"><span class="ln">3434</span>                    fill.focus<span class="s"> = </span><i>"<span class="d">100</span>%"</i>;
+</code><code id="L3435"><span class="ln">3435</span>                    fill.focussize<span class="s"> = </span><i>"<span class="d">0</span> <span class="d">0</span>"</i>;
+</code><code id="L3436"><span class="ln">3436</span>                    fill.focusposition<span class="s"> = </span>fxfy;
+</code><code id="L3437"><span class="ln">3437</span>                    fill.angle<span class="s"> = </span><span class="d">0</span>;
+</code><code id="L3438"><span class="ln">3438</span>                } <b>else</b> {
+</code><code id="L3439"><span class="ln">3439</span>                    <span class="c">// fill.rotate= <b>true</b>;</span>
+</code><code id="L3440"><span class="ln">3440</span>                    fill.type<span class="s"> = </span><i>"gradient"</i>;
+</code><code id="L3441"><span class="ln">3441</span>                    fill.angle<span class="s"> = </span>(<span class="d">270</span><span class="s"> - </span>angle)<span class="s"> % </span><span class="d">360</span>;
+</code><code id="L3442"><span class="ln">3442</span>                }
+</code><code id="L3443"><span class="ln">3443</span>                o.appendChild(fill);
+</code><code id="L3444"><span class="ln">3444</span>                <span class="c">// alert(fill.outerHTML);</span>
+</code><code id="L3445"><span class="ln">3445</span>            }
+</code><code id="L3446"><span class="ln">3446</span>            <b>return</b> <span class="d">1</span>;
+</code><code id="L3447"><span class="ln">3447</span>        };
+</code><code id="L3448"><span class="ln">3448</span>        Element<span class="s"> = </span><b>function</b> (node, vml) {
+</code><code id="L3449"><span class="ln">3449</span>            <b>this</b>[<span class="d">0</span>]<span class="s"> = </span><b>this</b>.node<span class="s"> = </span>node;
+</code><code id="L3450"><span class="ln">3450</span>            node.raphael<span class="s"> = </span><b>true</b>;
+</code><code id="L3451"><span class="ln">3451</span>            <b>this</b>.id<span class="s"> = </span>R._oid++;
+</code><code id="L3452"><span class="ln">3452</span>            node.raphaelid<span class="s"> = </span><b>this</b>.id;
+</code><code id="L3453"><span class="ln">3453</span>            <b>this</b>.X<span class="s"> = </span><span class="d">0</span>;
+</code><code id="L3454"><span class="ln">3454</span>            <b>this</b>.Y<span class="s"> = </span><span class="d">0</span>;
+</code><code id="L3455"><span class="ln">3455</span>            <b>this</b>.attrs<span class="s"> = </span>{};
+</code><code id="L3456"><span class="ln">3456</span>            <b>this</b>.paper<span class="s"> = </span>vml;
+</code><code id="L3457"><span class="ln">3457</span>            <b>this</b>.matrix<span class="s"> = </span><b>new</b> Matrix;
+</code><code id="L3458"><span class="ln">3458</span>            <b>this</b>._<span class="s"> = </span>{
+</code><code id="L3459"><span class="ln">3459</span>                transform: [],
+</code><code id="L3460"><span class="ln">3460</span>                sx: <span class="d">1</span>,
+</code><code id="L3461"><span class="ln">3461</span>                sy: <span class="d">1</span>,
+</code><code id="L3462"><span class="ln">3462</span>                dx: <span class="d">0</span>,
+</code><code id="L3463"><span class="ln">3463</span>                dy: <span class="d">0</span>,
+</code><code id="L3464"><span class="ln">3464</span>                deg: <span class="d">0</span>,
+</code><code id="L3465"><span class="ln">3465</span>                dirty: <span class="d">1</span>,
+</code><code id="L3466"><span class="ln">3466</span>                dirtyT: <span class="d">1</span>
+</code><code id="L3467"><span class="ln">3467</span>            };
+</code><code id="L3468"><span class="ln">3468</span>            !vml.bottom<span class="s"> &amp;&amp; </span>(vml.bottom<span class="s"> = </span><b>this</b>);
+</code><code id="L3469"><span class="ln">3469</span>            <b>this</b>.prev<span class="s"> = </span>vml.top;
+</code><code id="L3470"><span class="ln">3470</span>            vml.top<span class="s"> &amp;&amp; </span>(vml.top.next<span class="s"> = </span><b>this</b>);
+</code><code id="L3471"><span class="ln">3471</span>            vml.top<span class="s"> = </span><b>this</b>;
+</code><code id="L3472"><span class="ln">3472</span>            <b>this</b>.next<span class="s"> = </span><b>null</b>;
+</code><code id="L3473"><span class="ln">3473</span>        };
+</code><code id="L3474"><span class="ln">3474</span>        elproto<span class="s"> = </span>Element.prototype;
+</code><code id="L3475"><span class="ln">3475</span>        elproto.transform<span class="s"> = </span><b>function</b> (tstr) {
+</code><code id="L3476"><span class="ln">3476</span>            <b>if</b> (tstr<span class="s"> == </span><b>null</b>) {
+</code><code id="L3477"><span class="ln">3477</span>                <b>return</b> <b>this</b>._.transform;
+</code><code id="L3478"><span class="ln">3478</span>            }
+</code><code id="L3479"><span class="ln">3479</span>            extractTransform(<b>this</b>, tstr);
+</code><code id="L3480"><span class="ln">3480</span>            <b>var</b> matrix<span class="s"> = </span><b>this</b>.matrix.clone(),
+</code><code id="L3481"><span class="ln">3481</span>                skew<span class="s"> = </span><b>this</b>.skew;
+</code><code id="L3482"><span class="ln">3482</span>            matrix.translate(-<span class="d">.5</span>, -<span class="d">.5</span>);
+</code><code id="L3483"><span class="ln">3483</span>            <b>if</b> (<b>this</b>.type<span class="s"> == </span><i>"image"</i>) {
+</code><code id="L3484"><span class="ln">3484</span>                <b>if</b> (Str(tstr).indexOf(<i>"m"</i>)<span class="s"> + </span><span class="d">1</span>) {
+</code><code id="L3485"><span class="ln">3485</span>                    <b>this</b>.node.style.filter<span class="s"> = </span>matrix.toFilter();
+</code><code id="L3486"><span class="ln">3486</span>                    <b>var</b> bb<span class="s"> = </span><b>this</b>.getBBox(),
+</code><code id="L3487"><span class="ln">3487</span>                        bbt<span class="s"> = </span><b>this</b>.getBBox(<span class="d">1</span>),
+</code><code id="L3488"><span class="ln">3488</span>                        im<span class="s"> = </span>matrix.invert(),
+</code><code id="L3489"><span class="ln">3489</span>                        dx<span class="s"> = </span>im.x(bb.x, bb.y)<span class="s"> - </span>im.x(bbt.x, bbt.y),
+</code><code id="L3490"><span class="ln">3490</span>                        dy<span class="s"> = </span>im.y(bb.x, bb.y)<span class="s"> - </span>im.y(bbt.x, bbt.y);
+</code><code id="L3491"><span class="ln">3491</span>                    <span class="c">// skew.offset<span class="s"> = </span>dx<span class="s"> + </span>S<span class="s"> + </span>dy;</span>
+</code><code id="L3492"><span class="ln">3492</span>                    <span class="c">// <b>this</b>.node.getElementsByTagName(fillString)[<span class="d">0</span>].position<span class="s"> = </span>skew.offset;</span>
+</code><code id="L3493"><span class="ln">3493</span>                } <b>else</b> {
+</code><code id="L3494"><span class="ln">3494</span>                    <b>this</b>.node.style.filter<span class="s"> = </span>E;
+</code><code id="L3495"><span class="ln">3495</span>                    setCoords(<b>this</b>);
+</code><code id="L3496"><span class="ln">3496</span>                }
+</code><code id="L3497"><span class="ln">3497</span>            } <b>else</b> {
+</code><code id="L3498"><span class="ln">3498</span>                    <span class="c">// o<span class="s"> = </span><b>this</b>.node,</span>
+</code><code id="L3499"><span class="ln">3499</span>                    <span class="c">// _<span class="s"> = </span><b>this</b>._,</span>
+</code><code id="L3500"><span class="ln">3500</span>                    <span class="c">// fillpos<span class="s"> = </span>_.fillpos,</span>
+</code><code id="L3501"><span class="ln">3501</span>                    <span class="c">// deg,</span>
+</code><code id="L3502"><span class="ln">3502</span>                    <span class="c">// matrix<span class="s"> = </span><b>this</b>.matrix;</span>
+</code><code id="L3503"><span class="ln">3503</span>                    <span class="c">// fill<span class="s"> = </span>o.getElementsByTagName(fillString)[<span class="d">0</span>],</span>
+</code><code id="L3504"><span class="ln">3504</span>                    <span class="c">// angle<span class="s"> = </span>fill.angle;</span>
+</code><code id="L3505"><span class="ln">3505</span>
+</code><code id="L3506"><span class="ln">3506</span>                <b>this</b>.node.style.filter<span class="s"> = </span>E;
+</code><code id="L3507"><span class="ln">3507</span>                skew.matrix<span class="s"> = </span>matrix;
+</code><code id="L3508"><span class="ln">3508</span>                skew.offset<span class="s"> = </span>matrix.offset();
+</code><code id="L3509"><span class="ln">3509</span>                
+</code><code id="L3510"><span class="ln">3510</span>                <span class="c">// <b>if</b> (<span class="d">0</span>&amp;&amp;angle) {</span>
+</code><code id="L3511"><span class="ln">3511</span>                <span class="c">//     angle<span class="s"> = </span>R.rad(<span class="d">270</span><span class="s"> - </span>angle);</span>
+</code><code id="L3512"><span class="ln">3512</span>                <span class="c">//     <b>var</b> dx<span class="s"> = </span><span class="d">100</span><span class="s"> * </span>math.cos(angle),</span>
+</code><code id="L3513"><span class="ln">3513</span>                <span class="c">//         dy<span class="s"> = </span><span class="d">100</span><span class="s"> * </span>math.sin(angle),</span>
+</code><code id="L3514"><span class="ln">3514</span>                <span class="c">//         zx<span class="s"> = </span>matrix.x(<span class="d">0</span>, <span class="d">0</span>),</span>
+</code><code id="L3515"><span class="ln">3515</span>                <span class="c">//         zy<span class="s"> = </span>matrix.y(<span class="d">0</span>, <span class="d">0</span>),</span>
+</code><code id="L3516"><span class="ln">3516</span>                <span class="c">//         mx<span class="s"> = </span>matrix.x(dx, dy),</span>
+</code><code id="L3517"><span class="ln">3517</span>                <span class="c">//         my<span class="s"> = </span>matrix.y(dx, dy);</span>
+</code><code id="L3518"><span class="ln">3518</span>                <span class="c">//     angle<span class="s"> = </span>R.angle(zx, zy, mx, my);</span>
+</code><code id="L3519"><span class="ln">3519</span>                <span class="c">//     fill.angle<span class="s"> = </span>(<span class="d">270</span><span class="s"> - </span>angle)<span class="s"> % </span><span class="d">360</span>;</span>
+</code><code id="L3520"><span class="ln">3520</span>                <span class="c">// }</span>
+</code><code id="L3521"><span class="ln">3521</span>            }
+</code><code id="L3522"><span class="ln">3522</span>            <b>return</b> <b>this</b>;
+</code><code id="L3523"><span class="ln">3523</span>        };
+</code><code id="L3524"><span class="ln">3524</span>        elproto.rotate<span class="s"> = </span><b>function</b> (deg, cx, cy) {
+</code><code id="L3525"><span class="ln">3525</span>            <b>if</b> (<b>this</b>.removed) {
+</code><code id="L3526"><span class="ln">3526</span>                <b>return</b> <b>this</b>;
+</code><code id="L3527"><span class="ln">3527</span>            }
+</code><code id="L3528"><span class="ln">3528</span>            <b>if</b> (deg<span class="s"> == </span><b>null</b>) {
+</code><code id="L3529"><span class="ln">3529</span>                <b>return</b>;
+</code><code id="L3530"><span class="ln">3530</span>            }
+</code><code id="L3531"><span class="ln">3531</span>            deg<span class="s"> = </span>Str(deg).split(separator);
+</code><code id="L3532"><span class="ln">3532</span>            <b>if</b> (deg.length<span class="s"> - </span><span class="d">1</span>) {
+</code><code id="L3533"><span class="ln">3533</span>                cx<span class="s"> = </span>toFloat(deg[<span class="d">1</span>]);
+</code><code id="L3534"><span class="ln">3534</span>                cy<span class="s"> = </span>toFloat(deg[<span class="d">2</span>]);
 </code><code id="L3535"><span class="ln">3535</span>            }
-</code><code id="L3536"><span class="ln">3536</span>            sx<span class="s"> = </span>Str(sx).split(separator);
-</code><code id="L3537"><span class="ln">3537</span>            <b>if</b> (sx.length<span class="s"> - </span><span class="d">1</span>) {
-</code><code id="L3538"><span class="ln">3538</span>                sy<span class="s"> = </span>toFloat(sx[<span class="d">1</span>]);
-</code><code id="L3539"><span class="ln">3539</span>                cx<span class="s"> = </span>toFloat(sx[<span class="d">2</span>]);
-</code><code id="L3540"><span class="ln">3540</span>                cy<span class="s"> = </span>toFloat(sx[<span class="d">3</span>]);
-</code><code id="L3541"><span class="ln">3541</span>                isNaN(cx)<span class="s"> &amp;&amp; </span>(cx<span class="s"> = </span><b>null</b>);
-</code><code id="L3542"><span class="ln">3542</span>                isNaN(cy)<span class="s"> &amp;&amp; </span>(cy<span class="s"> = </span><b>null</b>);
-</code><code id="L3543"><span class="ln">3543</span>            }
-</code><code id="L3544"><span class="ln">3544</span>            sx<span class="s"> = </span>toFloat(sx[<span class="d">0</span>]);
-</code><code id="L3545"><span class="ln">3545</span>            (sy<span class="s"> == </span><b>null</b>)<span class="s"> &amp;&amp; </span>(sy<span class="s"> = </span>sx);
-</code><code id="L3546"><span class="ln">3546</span>            (cy<span class="s"> == </span><b>null</b>)<span class="s"> &amp;&amp; </span>(cx<span class="s"> = </span>cy);
-</code><code id="L3547"><span class="ln">3547</span>            <b>if</b> (cx<span class="s"> == </span><b>null</b><span class="s"> || </span>cy<span class="s"> == </span><b>null</b>) {
-</code><code id="L3548"><span class="ln">3548</span>                <b>var</b> bbox<span class="s"> = </span><b>this</b>.getBBox(<span class="d">1</span>);
-</code><code id="L3549"><span class="ln">3549</span>            }
-</code><code id="L3550"><span class="ln">3550</span>            cx<span class="s"> = </span>cx<span class="s"> == </span><b>null</b> ? bbox.x<span class="s"> + </span>bbox.width<span class="s"> / </span><span class="d">2</span> : cx;
-</code><code id="L3551"><span class="ln">3551</span>            cy<span class="s"> = </span>cy<span class="s"> == </span><b>null</b> ? bbox.y<span class="s"> + </span>bbox.height<span class="s"> / </span><span class="d">2</span> : cy;
-</code><code id="L3552"><span class="ln">3552</span>            
-</code><code id="L3553"><span class="ln">3553</span>            <b>this</b>.transform(<b>this</b>._.transform.concat([[<i>"s"</i>, sx, sy, cx, cy]]));
-</code><code id="L3554"><span class="ln">3554</span>            <b>this</b>._.dirtyT<span class="s"> = </span><span class="d">1</span>;
-</code><code id="L3555"><span class="ln">3555</span>            <b>return</b> <b>this</b>;
-</code><code id="L3556"><span class="ln">3556</span>        };
-</code><code id="L3557"><span class="ln">3557</span>        elproto.hide<span class="s"> = </span><b>function</b> () {
-</code><code id="L3558"><span class="ln">3558</span>            !<b>this</b>.removed<span class="s"> &amp;&amp; </span>(<b>this</b>.node.style.display<span class="s"> = </span><i>"none"</i>);
-</code><code id="L3559"><span class="ln">3559</span>            <b>return</b> <b>this</b>;
-</code><code id="L3560"><span class="ln">3560</span>        };
-</code><code id="L3561"><span class="ln">3561</span>        elproto.show<span class="s"> = </span><b>function</b> () {
-</code><code id="L3562"><span class="ln">3562</span>            !<b>this</b>.removed<span class="s"> &amp;&amp; </span>(<b>this</b>.node.style.display<span class="s"> = </span>E);
-</code><code id="L3563"><span class="ln">3563</span>            <b>return</b> <b>this</b>;
-</code><code id="L3564"><span class="ln">3564</span>        };
-</code><code id="L3565"><span class="ln">3565</span>        elproto._getBBox<span class="s"> = </span><b>function</b> () {
-</code><code id="L3566"><span class="ln">3566</span>            <b>if</b> (<b>this</b>.removed) {
-</code><code id="L3567"><span class="ln">3567</span>                <b>return</b> {};
-</code><code id="L3568"><span class="ln">3568</span>            }
-</code><code id="L3569"><span class="ln">3569</span>            <b>if</b> (<b>this</b>.type<span class="s"> == </span><i>"text"</i>) {
-</code><code id="L3570"><span class="ln">3570</span>                <b>return</b> {
-</code><code id="L3571"><span class="ln">3571</span>                    x: <b>this</b>.X<span class="s"> + </span>(<b>this</b>.bbx<span class="s"> || </span><span class="d">0</span>)<span class="s"> - </span><b>this</b>.W<span class="s"> / </span><span class="d">2</span>,
-</code><code id="L3572"><span class="ln">3572</span>                    y: <b>this</b>.Y<span class="s"> - </span><b>this</b>.H,
-</code><code id="L3573"><span class="ln">3573</span>                    width: <b>this</b>.W,
-</code><code id="L3574"><span class="ln">3574</span>                    height: <b>this</b>.H
-</code><code id="L3575"><span class="ln">3575</span>                };
-</code><code id="L3576"><span class="ln">3576</span>            } <b>else</b> {
-</code><code id="L3577"><span class="ln">3577</span>                <b>return</b> pathDimensions(<b>this</b>.attrs.path);
-</code><code id="L3578"><span class="ln">3578</span>            }
-</code><code id="L3579"><span class="ln">3579</span>        };
-</code><code id="L3580"><span class="ln">3580</span>        elproto.remove<span class="s"> = </span><b>function</b> () {
-</code><code id="L3581"><span class="ln">3581</span>            <b>if</b> (<b>this</b>.removed) {
-</code><code id="L3582"><span class="ln">3582</span>                <b>return</b>;
-</code><code id="L3583"><span class="ln">3583</span>            }
-</code><code id="L3584"><span class="ln">3584</span>            eve.unbind(<i>"*.*."</i><span class="s"> + </span><b>this</b>.id);
-</code><code id="L3585"><span class="ln">3585</span>            tear(<b>this</b>, <b>this</b>.paper);
-</code><code id="L3586"><span class="ln">3586</span>            <b>this</b>.node.parentNode.removeChild(<b>this</b>.node);
-</code><code id="L3587"><span class="ln">3587</span>            <b>this</b>.shape<span class="s"> &amp;&amp; </span><b>this</b>.shape.parentNode.removeChild(<b>this</b>.shape);
-</code><code id="L3588"><span class="ln">3588</span>            <b>for</b> (<b>var</b> i <b>in</b> <b>this</b>) {
-</code><code id="L3589"><span class="ln">3589</span>                <b>delete</b> <b>this</b>[i];
-</code><code id="L3590"><span class="ln">3590</span>            }
-</code><code id="L3591"><span class="ln">3591</span>            <b>this</b>.removed<span class="s"> = </span><b>true</b>;
+</code><code id="L3536"><span class="ln">3536</span>            deg<span class="s"> = </span>toFloat(deg[<span class="d">0</span>]);
+</code><code id="L3537"><span class="ln">3537</span>            (cy<span class="s"> == </span><b>null</b>)<span class="s"> &amp;&amp; </span>(cx<span class="s"> = </span>cy);
+</code><code id="L3538"><span class="ln">3538</span>            <b>if</b> (cx<span class="s"> == </span><b>null</b><span class="s"> || </span>cy<span class="s"> == </span><b>null</b>) {
+</code><code id="L3539"><span class="ln">3539</span>                <b>var</b> bbox<span class="s"> = </span><b>this</b>.getBBox(<span class="d">1</span>);
+</code><code id="L3540"><span class="ln">3540</span>                cx<span class="s"> = </span>bbox.x<span class="s"> + </span>bbox.width<span class="s"> / </span><span class="d">2</span>;
+</code><code id="L3541"><span class="ln">3541</span>                cy<span class="s"> = </span>bbox.y<span class="s"> + </span>bbox.height<span class="s"> / </span><span class="d">2</span>;
+</code><code id="L3542"><span class="ln">3542</span>            }
+</code><code id="L3543"><span class="ln">3543</span>            <b>this</b>._.dirtyT<span class="s"> = </span><span class="d">1</span>;
+</code><code id="L3544"><span class="ln">3544</span>            <b>this</b>.transform(<b>this</b>._.transform.concat([[<i>"r"</i>, deg, cx, cy]]));
+</code><code id="L3545"><span class="ln">3545</span>            <b>return</b> <b>this</b>;
+</code><code id="L3546"><span class="ln">3546</span>        };
+</code><code id="L3547"><span class="ln">3547</span>        elproto.translate<span class="s"> = </span><b>function</b> (dx, dy) {
+</code><code id="L3548"><span class="ln">3548</span>            <b>if</b> (<b>this</b>.removed) {
+</code><code id="L3549"><span class="ln">3549</span>                <b>return</b> <b>this</b>;
+</code><code id="L3550"><span class="ln">3550</span>            }
+</code><code id="L3551"><span class="ln">3551</span>            dx<span class="s"> = </span>Str(dx).split(separator);
+</code><code id="L3552"><span class="ln">3552</span>            <b>if</b> (dx.length<span class="s"> - </span><span class="d">1</span>) {
+</code><code id="L3553"><span class="ln">3553</span>                dy<span class="s"> = </span>toFloat(dx[<span class="d">1</span>]);
+</code><code id="L3554"><span class="ln">3554</span>            }
+</code><code id="L3555"><span class="ln">3555</span>            dx<span class="s"> = </span>toFloat(dx[<span class="d">0</span>])<span class="s"> || </span><span class="d">0</span>;
+</code><code id="L3556"><span class="ln">3556</span>            dy<span class="s"> = </span>+dy<span class="s"> || </span><span class="d">0</span>;
+</code><code id="L3557"><span class="ln">3557</span>            <b>if</b> (<b>this</b>._.bbox) {
+</code><code id="L3558"><span class="ln">3558</span>                <b>this</b>._.bbox.x += dx;
+</code><code id="L3559"><span class="ln">3559</span>                <b>this</b>._.bbox.y += dy;
+</code><code id="L3560"><span class="ln">3560</span>            }
+</code><code id="L3561"><span class="ln">3561</span>            <b>this</b>.transform(<b>this</b>._.transform.concat([[<i>"t"</i>, dx, dy]]));
+</code><code id="L3562"><span class="ln">3562</span>            <b>return</b> <b>this</b>;
+</code><code id="L3563"><span class="ln">3563</span>        };
+</code><code id="L3564"><span class="ln">3564</span>        elproto.scale<span class="s"> = </span><b>function</b> (sx, sy, cx, cy) {
+</code><code id="L3565"><span class="ln">3565</span>            <b>if</b> (<b>this</b>.removed) {
+</code><code id="L3566"><span class="ln">3566</span>                <b>return</b> <b>this</b>;
+</code><code id="L3567"><span class="ln">3567</span>            }
+</code><code id="L3568"><span class="ln">3568</span>            sx<span class="s"> = </span>Str(sx).split(separator);
+</code><code id="L3569"><span class="ln">3569</span>            <b>if</b> (sx.length<span class="s"> - </span><span class="d">1</span>) {
+</code><code id="L3570"><span class="ln">3570</span>                sy<span class="s"> = </span>toFloat(sx[<span class="d">1</span>]);
+</code><code id="L3571"><span class="ln">3571</span>                cx<span class="s"> = </span>toFloat(sx[<span class="d">2</span>]);
+</code><code id="L3572"><span class="ln">3572</span>                cy<span class="s"> = </span>toFloat(sx[<span class="d">3</span>]);
+</code><code id="L3573"><span class="ln">3573</span>                isNaN(cx)<span class="s"> &amp;&amp; </span>(cx<span class="s"> = </span><b>null</b>);
+</code><code id="L3574"><span class="ln">3574</span>                isNaN(cy)<span class="s"> &amp;&amp; </span>(cy<span class="s"> = </span><b>null</b>);
+</code><code id="L3575"><span class="ln">3575</span>            }
+</code><code id="L3576"><span class="ln">3576</span>            sx<span class="s"> = </span>toFloat(sx[<span class="d">0</span>]);
+</code><code id="L3577"><span class="ln">3577</span>            (sy<span class="s"> == </span><b>null</b>)<span class="s"> &amp;&amp; </span>(sy<span class="s"> = </span>sx);
+</code><code id="L3578"><span class="ln">3578</span>            (cy<span class="s"> == </span><b>null</b>)<span class="s"> &amp;&amp; </span>(cx<span class="s"> = </span>cy);
+</code><code id="L3579"><span class="ln">3579</span>            <b>if</b> (cx<span class="s"> == </span><b>null</b><span class="s"> || </span>cy<span class="s"> == </span><b>null</b>) {
+</code><code id="L3580"><span class="ln">3580</span>                <b>var</b> bbox<span class="s"> = </span><b>this</b>.getBBox(<span class="d">1</span>);
+</code><code id="L3581"><span class="ln">3581</span>            }
+</code><code id="L3582"><span class="ln">3582</span>            cx<span class="s"> = </span>cx<span class="s"> == </span><b>null</b> ? bbox.x<span class="s"> + </span>bbox.width<span class="s"> / </span><span class="d">2</span> : cx;
+</code><code id="L3583"><span class="ln">3583</span>            cy<span class="s"> = </span>cy<span class="s"> == </span><b>null</b> ? bbox.y<span class="s"> + </span>bbox.height<span class="s"> / </span><span class="d">2</span> : cy;
+</code><code id="L3584"><span class="ln">3584</span>            
+</code><code id="L3585"><span class="ln">3585</span>            <b>this</b>.transform(<b>this</b>._.transform.concat([[<i>"s"</i>, sx, sy, cx, cy]]));
+</code><code id="L3586"><span class="ln">3586</span>            <b>this</b>._.dirtyT<span class="s"> = </span><span class="d">1</span>;
+</code><code id="L3587"><span class="ln">3587</span>            <b>return</b> <b>this</b>;
+</code><code id="L3588"><span class="ln">3588</span>        };
+</code><code id="L3589"><span class="ln">3589</span>        elproto.hide<span class="s"> = </span><b>function</b> () {
+</code><code id="L3590"><span class="ln">3590</span>            !<b>this</b>.removed<span class="s"> &amp;&amp; </span>(<b>this</b>.node.style.display<span class="s"> = </span><i>"none"</i>);
+</code><code id="L3591"><span class="ln">3591</span>            <b>return</b> <b>this</b>;
 </code><code id="L3592"><span class="ln">3592</span>        };
-</code><code id="L3593"><span class="ln">3593</span>        elproto.attr<span class="s"> = </span><b>function</b> (name, value) {
-</code><code id="L3594"><span class="ln">3594</span>            <b>if</b> (<b>this</b>.removed) {
-</code><code id="L3595"><span class="ln">3595</span>                <b>return</b> <b>this</b>;
-</code><code id="L3596"><span class="ln">3596</span>            }
-</code><code id="L3597"><span class="ln">3597</span>            <b>if</b> (name<span class="s"> == </span><b>null</b>) {
-</code><code id="L3598"><span class="ln">3598</span>                <b>var</b> res<span class="s"> = </span>{};
-</code><code id="L3599"><span class="ln">3599</span>                <b>for</b> (<b>var</b> i <b>in</b> <b>this</b>.attrs) <b>if</b> (<b>this</b>.attrs[has](i)) {
-</code><code id="L3600"><span class="ln">3600</span>                    res[i]<span class="s"> = </span><b>this</b>.attrs[i];
-</code><code id="L3601"><span class="ln">3601</span>                }
-</code><code id="L3602"><span class="ln">3602</span>                res.gradient<span class="s"> &amp;&amp; </span>res.fill<span class="s"> == </span><i>"none"</i><span class="s"> &amp;&amp; </span>(res.fill<span class="s"> = </span>res.gradient)<span class="s"> &amp;&amp; </span><b>delete</b> res.gradient;
-</code><code id="L3603"><span class="ln">3603</span>                <b>return</b> res;
-</code><code id="L3604"><span class="ln">3604</span>            }
-</code><code id="L3605"><span class="ln">3605</span>            <b>if</b> (value<span class="s"> == </span><b>null</b><span class="s"> &amp;&amp; </span>R.is(name, <i>"string"</i>)) {
-</code><code id="L3606"><span class="ln">3606</span>                <b>if</b> (name<span class="s"> == </span>fillString<span class="s"> &amp;&amp; </span><b>this</b>.attrs.fill<span class="s"> == </span><i>"none"</i><span class="s"> &amp;&amp; </span><b>this</b>.attrs.gradient) {
-</code><code id="L3607"><span class="ln">3607</span>                    <b>return</b> <b>this</b>.attrs.gradient;
-</code><code id="L3608"><span class="ln">3608</span>                }
-</code><code id="L3609"><span class="ln">3609</span>                <b>if</b> (name <b>in</b> <b>this</b>.attrs) {
-</code><code id="L3610"><span class="ln">3610</span>                    <b>return</b> <b>this</b>.attrs[name];
-</code><code id="L3611"><span class="ln">3611</span>                } <b>else</b> <b>if</b> (R.is(<b>this</b>.paper.customAttributes[name], <i>"<b>function</b>"</i>)) {
-</code><code id="L3612"><span class="ln">3612</span>                    <b>return</b> <b>this</b>.paper.customAttributes[name].def;
-</code><code id="L3613"><span class="ln">3613</span>                } <b>else</b> {
-</code><code id="L3614"><span class="ln">3614</span>                    <b>return</b> availableAttrs[name];
-</code><code id="L3615"><span class="ln">3615</span>                }
-</code><code id="L3616"><span class="ln">3616</span>            }
-</code><code id="L3617"><span class="ln">3617</span>            <b>if</b> (<b>this</b>.attrs<span class="s"> &amp;&amp; </span>value<span class="s"> == </span><b>null</b><span class="s"> &amp;&amp; </span>R.is(name, array)) {
-</code><code id="L3618"><span class="ln">3618</span>                <b>var</b> ii, values<span class="s"> = </span>{};
-</code><code id="L3619"><span class="ln">3619</span>                <b>for</b> (i<span class="s"> = </span><span class="d">0</span>, ii<span class="s"> = </span>name.length; i &lt; ii; i++) {
-</code><code id="L3620"><span class="ln">3620</span>                    values[name[i]]<span class="s"> = </span><b>this</b>.attr(name[i]);
-</code><code id="L3621"><span class="ln">3621</span>                }
-</code><code id="L3622"><span class="ln">3622</span>                <b>return</b> values;
-</code><code id="L3623"><span class="ln">3623</span>            }
-</code><code id="L3624"><span class="ln">3624</span>            <b>var</b> params;
-</code><code id="L3625"><span class="ln">3625</span>            <b>if</b> (value != <b>null</b>) {
-</code><code id="L3626"><span class="ln">3626</span>                params<span class="s"> = </span>{};
-</code><code id="L3627"><span class="ln">3627</span>                params[name]<span class="s"> = </span>value;
+</code><code id="L3593"><span class="ln">3593</span>        elproto.show<span class="s"> = </span><b>function</b> () {
+</code><code id="L3594"><span class="ln">3594</span>            !<b>this</b>.removed<span class="s"> &amp;&amp; </span>(<b>this</b>.node.style.display<span class="s"> = </span>E);
+</code><code id="L3595"><span class="ln">3595</span>            <b>return</b> <b>this</b>;
+</code><code id="L3596"><span class="ln">3596</span>        };
+</code><code id="L3597"><span class="ln">3597</span>        elproto._getBBox<span class="s"> = </span><b>function</b> () {
+</code><code id="L3598"><span class="ln">3598</span>            <b>if</b> (<b>this</b>.removed) {
+</code><code id="L3599"><span class="ln">3599</span>                <b>return</b> {};
+</code><code id="L3600"><span class="ln">3600</span>            }
+</code><code id="L3601"><span class="ln">3601</span>            <b>if</b> (<b>this</b>.type<span class="s"> == </span><i>"text"</i>) {
+</code><code id="L3602"><span class="ln">3602</span>                <b>return</b> {
+</code><code id="L3603"><span class="ln">3603</span>                    x: <b>this</b>.X<span class="s"> + </span>(<b>this</b>.bbx<span class="s"> || </span><span class="d">0</span>)<span class="s"> - </span><b>this</b>.W<span class="s"> / </span><span class="d">2</span>,
+</code><code id="L3604"><span class="ln">3604</span>                    y: <b>this</b>.Y<span class="s"> - </span><b>this</b>.H,
+</code><code id="L3605"><span class="ln">3605</span>                    width: <b>this</b>.W,
+</code><code id="L3606"><span class="ln">3606</span>                    height: <b>this</b>.H
+</code><code id="L3607"><span class="ln">3607</span>                };
+</code><code id="L3608"><span class="ln">3608</span>            } <b>else</b> {
+</code><code id="L3609"><span class="ln">3609</span>                <b>return</b> pathDimensions(<b>this</b>.attrs.path);
+</code><code id="L3610"><span class="ln">3610</span>            }
+</code><code id="L3611"><span class="ln">3611</span>        };
+</code><code id="L3612"><span class="ln">3612</span>        elproto.remove<span class="s"> = </span><b>function</b> () {
+</code><code id="L3613"><span class="ln">3613</span>            <b>if</b> (<b>this</b>.removed) {
+</code><code id="L3614"><span class="ln">3614</span>                <b>return</b>;
+</code><code id="L3615"><span class="ln">3615</span>            }
+</code><code id="L3616"><span class="ln">3616</span>            eve.unbind(<i>"*.*."</i><span class="s"> + </span><b>this</b>.id);
+</code><code id="L3617"><span class="ln">3617</span>            tear(<b>this</b>, <b>this</b>.paper);
+</code><code id="L3618"><span class="ln">3618</span>            <b>this</b>.node.parentNode.removeChild(<b>this</b>.node);
+</code><code id="L3619"><span class="ln">3619</span>            <b>this</b>.shape<span class="s"> &amp;&amp; </span><b>this</b>.shape.parentNode.removeChild(<b>this</b>.shape);
+</code><code id="L3620"><span class="ln">3620</span>            <b>for</b> (<b>var</b> i <b>in</b> <b>this</b>) {
+</code><code id="L3621"><span class="ln">3621</span>                <b>delete</b> <b>this</b>[i];
+</code><code id="L3622"><span class="ln">3622</span>            }
+</code><code id="L3623"><span class="ln">3623</span>            <b>this</b>.removed<span class="s"> = </span><b>true</b>;
+</code><code id="L3624"><span class="ln">3624</span>        };
+</code><code id="L3625"><span class="ln">3625</span>        elproto.attr<span class="s"> = </span><b>function</b> (name, value) {
+</code><code id="L3626"><span class="ln">3626</span>            <b>if</b> (<b>this</b>.removed) {
+</code><code id="L3627"><span class="ln">3627</span>                <b>return</b> <b>this</b>;
 </code><code id="L3628"><span class="ln">3628</span>            }
-</code><code id="L3629"><span class="ln">3629</span>            value<span class="s"> == </span><b>null</b><span class="s"> &amp;&amp; </span>R.is(name, <i>"object"</i>)<span class="s"> &amp;&amp; </span>(params<span class="s"> = </span>name);
-</code><code id="L3630"><span class="ln">3630</span>            <b>for</b> (<b>var</b> key <b>in</b> params) {
-</code><code id="L3631"><span class="ln">3631</span>                eve(<i>"attr."</i><span class="s"> + </span>key<span class="s"> + </span><i>"."</i><span class="s"> + </span><b>this</b>.id, <b>this</b>, params[key]);
-</code><code id="L3632"><span class="ln">3632</span>            }
-</code><code id="L3633"><span class="ln">3633</span>            <b>if</b> (params) {
-</code><code id="L3634"><span class="ln">3634</span>                <b>for</b> (key <b>in</b> <b>this</b>.paper.customAttributes) <b>if</b> (<b>this</b>.paper.customAttributes[has](key)<span class="s"> &amp;&amp; </span>params[has](key)<span class="s"> &amp;&amp; </span>R.is(<b>this</b>.paper.customAttributes[key], <i>"<b>function</b>"</i>)) {
-</code><code id="L3635"><span class="ln">3635</span>                    <b>var</b> par<span class="s"> = </span><b>this</b>.paper.customAttributes[key].apply(<b>this</b>, [][concat](params[key]));
-</code><code id="L3636"><span class="ln">3636</span>                    <b>this</b>.attrs[key]<span class="s"> = </span>params[key];
-</code><code id="L3637"><span class="ln">3637</span>                    <b>for</b> (<b>var</b> subkey <b>in</b> par) <b>if</b> (par[has](subkey)) {
-</code><code id="L3638"><span class="ln">3638</span>                        params[subkey]<span class="s"> = </span>par[subkey];
-</code><code id="L3639"><span class="ln">3639</span>                    }
+</code><code id="L3629"><span class="ln">3629</span>            <b>if</b> (name<span class="s"> == </span><b>null</b>) {
+</code><code id="L3630"><span class="ln">3630</span>                <b>var</b> res<span class="s"> = </span>{};
+</code><code id="L3631"><span class="ln">3631</span>                <b>for</b> (<b>var</b> i <b>in</b> <b>this</b>.attrs) <b>if</b> (<b>this</b>.attrs[has](i)) {
+</code><code id="L3632"><span class="ln">3632</span>                    res[i]<span class="s"> = </span><b>this</b>.attrs[i];
+</code><code id="L3633"><span class="ln">3633</span>                }
+</code><code id="L3634"><span class="ln">3634</span>                res.gradient<span class="s"> &amp;&amp; </span>res.fill<span class="s"> == </span><i>"none"</i><span class="s"> &amp;&amp; </span>(res.fill<span class="s"> = </span>res.gradient)<span class="s"> &amp;&amp; </span><b>delete</b> res.gradient;
+</code><code id="L3635"><span class="ln">3635</span>                <b>return</b> res;
+</code><code id="L3636"><span class="ln">3636</span>            }
+</code><code id="L3637"><span class="ln">3637</span>            <b>if</b> (value<span class="s"> == </span><b>null</b><span class="s"> &amp;&amp; </span>R.is(name, <i>"string"</i>)) {
+</code><code id="L3638"><span class="ln">3638</span>                <b>if</b> (name<span class="s"> == </span>fillString<span class="s"> &amp;&amp; </span><b>this</b>.attrs.fill<span class="s"> == </span><i>"none"</i><span class="s"> &amp;&amp; </span><b>this</b>.attrs.gradient) {
+</code><code id="L3639"><span class="ln">3639</span>                    <b>return</b> <b>this</b>.attrs.gradient;
 </code><code id="L3640"><span class="ln">3640</span>                }
-</code><code id="L3641"><span class="ln">3641</span>                <span class="c">// <b>this</b>.paper.canvas.style.display<span class="s"> = </span><i>"none"</i>;</span>
-</code><code id="L3642"><span class="ln">3642</span>                <b>if</b> (params.text<span class="s"> &amp;&amp; </span><b>this</b>.type<span class="s"> == </span><i>"text"</i>) {
-</code><code id="L3643"><span class="ln">3643</span>                    <b>this</b>.textpath.string<span class="s"> = </span>params.text;
-</code><code id="L3644"><span class="ln">3644</span>                }
-</code><code id="L3645"><span class="ln">3645</span>                setFillAndStroke(<b>this</b>, params);
-</code><code id="L3646"><span class="ln">3646</span>                <span class="c">// <b>this</b>.paper.canvas.style.display<span class="s"> = </span>E;</span>
-</code><code id="L3647"><span class="ln">3647</span>            }
-</code><code id="L3648"><span class="ln">3648</span>            <b>return</b> <b>this</b>;
-</code><code id="L3649"><span class="ln">3649</span>        };
-</code><code id="L3650"><span class="ln">3650</span>        elproto.toFront<span class="s"> = </span><b>function</b> () {
-</code><code id="L3651"><span class="ln">3651</span>            !<b>this</b>.removed<span class="s"> &amp;&amp; </span><b>this</b>.node.parentNode.appendChild(<b>this</b>.node);
-</code><code id="L3652"><span class="ln">3652</span>            <b>this</b>.paper.top != <b>this</b><span class="s"> &amp;&amp; </span>tofront(<b>this</b>, <b>this</b>.paper);
-</code><code id="L3653"><span class="ln">3653</span>            <b>return</b> <b>this</b>;
-</code><code id="L3654"><span class="ln">3654</span>        };
-</code><code id="L3655"><span class="ln">3655</span>        elproto.toBack<span class="s"> = </span><b>function</b> () {
-</code><code id="L3656"><span class="ln">3656</span>            <b>if</b> (<b>this</b>.removed) {
-</code><code id="L3657"><span class="ln">3657</span>                <b>return</b> <b>this</b>;
-</code><code id="L3658"><span class="ln">3658</span>            }
-</code><code id="L3659"><span class="ln">3659</span>            <b>if</b> (<b>this</b>.node.parentNode.firstChild != <b>this</b>.node) {
-</code><code id="L3660"><span class="ln">3660</span>                <b>this</b>.node.parentNode.insertBefore(<b>this</b>.node, <b>this</b>.node.parentNode.firstChild);
-</code><code id="L3661"><span class="ln">3661</span>                toback(<b>this</b>, <b>this</b>.paper);
-</code><code id="L3662"><span class="ln">3662</span>            }
-</code><code id="L3663"><span class="ln">3663</span>            <b>return</b> <b>this</b>;
-</code><code id="L3664"><span class="ln">3664</span>        };
-</code><code id="L3665"><span class="ln">3665</span>        elproto.insertAfter<span class="s"> = </span><b>function</b> (element) {
-</code><code id="L3666"><span class="ln">3666</span>            <b>if</b> (<b>this</b>.removed) {
-</code><code id="L3667"><span class="ln">3667</span>                <b>return</b> <b>this</b>;
-</code><code id="L3668"><span class="ln">3668</span>            }
-</code><code id="L3669"><span class="ln">3669</span>            <b>if</b> (element.constructor<span class="s"> == </span>Set) {
-</code><code id="L3670"><span class="ln">3670</span>                element<span class="s"> = </span>element[element.length<span class="s"> - </span><span class="d">1</span>];
-</code><code id="L3671"><span class="ln">3671</span>            }
-</code><code id="L3672"><span class="ln">3672</span>            <b>if</b> (element.node.nextSibling) {
-</code><code id="L3673"><span class="ln">3673</span>                element.node.parentNode.insertBefore(<b>this</b>.node, element.node.nextSibling);
-</code><code id="L3674"><span class="ln">3674</span>            } <b>else</b> {
-</code><code id="L3675"><span class="ln">3675</span>                element.node.parentNode.appendChild(<b>this</b>.node);
-</code><code id="L3676"><span class="ln">3676</span>            }
-</code><code id="L3677"><span class="ln">3677</span>            insertafter(<b>this</b>, element, <b>this</b>.paper);
-</code><code id="L3678"><span class="ln">3678</span>            <b>return</b> <b>this</b>;
-</code><code id="L3679"><span class="ln">3679</span>        };
-</code><code id="L3680"><span class="ln">3680</span>        elproto.insertBefore<span class="s"> = </span><b>function</b> (element) {
-</code><code id="L3681"><span class="ln">3681</span>            <b>if</b> (<b>this</b>.removed) {
-</code><code id="L3682"><span class="ln">3682</span>                <b>return</b> <b>this</b>;
-</code><code id="L3683"><span class="ln">3683</span>            }
-</code><code id="L3684"><span class="ln">3684</span>            <b>if</b> (element.constructor<span class="s"> == </span>Set) {
-</code><code id="L3685"><span class="ln">3685</span>                element<span class="s"> = </span>element[<span class="d">0</span>];
-</code><code id="L3686"><span class="ln">3686</span>            }
-</code><code id="L3687"><span class="ln">3687</span>            element.node.parentNode.insertBefore(<b>this</b>.node, element.node);
-</code><code id="L3688"><span class="ln">3688</span>            insertbefore(<b>this</b>, element, <b>this</b>.paper);
-</code><code id="L3689"><span class="ln">3689</span>            <b>return</b> <b>this</b>;
-</code><code id="L3690"><span class="ln">3690</span>        };
-</code><code id="L3691"><span class="ln">3691</span>        elproto.blur<span class="s"> = </span><b>function</b> (size) {
-</code><code id="L3692"><span class="ln">3692</span>            <b>var</b> s<span class="s"> = </span><b>this</b>.node.runtimeStyle,
-</code><code id="L3693"><span class="ln">3693</span>                f<span class="s"> = </span>s.filter;
-</code><code id="L3694"><span class="ln">3694</span>            f<span class="s"> = </span>f.replace(blurregexp, E);
-</code><code id="L3695"><span class="ln">3695</span>            <b>if</b> (+size !== <span class="d">0</span>) {
-</code><code id="L3696"><span class="ln">3696</span>                <b>this</b>.attrs.blur<span class="s"> = </span>size;
-</code><code id="L3697"><span class="ln">3697</span>                s.filter<span class="s"> = </span>f<span class="s"> + </span>S<span class="s"> + </span>ms<span class="s"> + </span><i>".Blur(pixelradius="</i><span class="s"> + </span>(+size<span class="s"> || </span><span class="d">1.5</span>)<span class="s"> + </span><i>")"</i>;
-</code><code id="L3698"><span class="ln">3698</span>                s.margin<span class="s"> = </span>R.format(<i>"-{<span class="d">0</span>}px <span class="d">0</span> <span class="d">0</span> -{<span class="d">0</span>}px"</i>, round(+size<span class="s"> || </span><span class="d">1.5</span>));
-</code><code id="L3699"><span class="ln">3699</span>            } <b>else</b> {
-</code><code id="L3700"><span class="ln">3700</span>                s.filter<span class="s"> = </span>f;
-</code><code id="L3701"><span class="ln">3701</span>                s.margin<span class="s"> = </span><span class="d">0</span>;
-</code><code id="L3702"><span class="ln">3702</span>                <b>delete</b> <b>this</b>.attrs.blur;
+</code><code id="L3641"><span class="ln">3641</span>                <b>if</b> (name <b>in</b> <b>this</b>.attrs) {
+</code><code id="L3642"><span class="ln">3642</span>                    <b>return</b> <b>this</b>.attrs[name];
+</code><code id="L3643"><span class="ln">3643</span>                } <b>else</b> <b>if</b> (R.is(<b>this</b>.paper.customAttributes[name], <i>"<b>function</b>"</i>)) {
+</code><code id="L3644"><span class="ln">3644</span>                    <b>return</b> <b>this</b>.paper.customAttributes[name].def;
+</code><code id="L3645"><span class="ln">3645</span>                } <b>else</b> {
+</code><code id="L3646"><span class="ln">3646</span>                    <b>return</b> availableAttrs[name];
+</code><code id="L3647"><span class="ln">3647</span>                }
+</code><code id="L3648"><span class="ln">3648</span>            }
+</code><code id="L3649"><span class="ln">3649</span>            <b>if</b> (<b>this</b>.attrs<span class="s"> &amp;&amp; </span>value<span class="s"> == </span><b>null</b><span class="s"> &amp;&amp; </span>R.is(name, array)) {
+</code><code id="L3650"><span class="ln">3650</span>                <b>var</b> ii, values<span class="s"> = </span>{};
+</code><code id="L3651"><span class="ln">3651</span>                <b>for</b> (i<span class="s"> = </span><span class="d">0</span>, ii<span class="s"> = </span>name.length; i &lt; ii; i++) {
+</code><code id="L3652"><span class="ln">3652</span>                    values[name[i]]<span class="s"> = </span><b>this</b>.attr(name[i]);
+</code><code id="L3653"><span class="ln">3653</span>                }
+</code><code id="L3654"><span class="ln">3654</span>                <b>return</b> values;
+</code><code id="L3655"><span class="ln">3655</span>            }
+</code><code id="L3656"><span class="ln">3656</span>            <b>var</b> params;
+</code><code id="L3657"><span class="ln">3657</span>            <b>if</b> (value != <b>null</b>) {
+</code><code id="L3658"><span class="ln">3658</span>                params<span class="s"> = </span>{};
+</code><code id="L3659"><span class="ln">3659</span>                params[name]<span class="s"> = </span>value;
+</code><code id="L3660"><span class="ln">3660</span>            }
+</code><code id="L3661"><span class="ln">3661</span>            value<span class="s"> == </span><b>null</b><span class="s"> &amp;&amp; </span>R.is(name, <i>"object"</i>)<span class="s"> &amp;&amp; </span>(params<span class="s"> = </span>name);
+</code><code id="L3662"><span class="ln">3662</span>            <b>for</b> (<b>var</b> key <b>in</b> params) {
+</code><code id="L3663"><span class="ln">3663</span>                eve(<i>"attr."</i><span class="s"> + </span>key<span class="s"> + </span><i>"."</i><span class="s"> + </span><b>this</b>.id, <b>this</b>, params[key]);
+</code><code id="L3664"><span class="ln">3664</span>            }
+</code><code id="L3665"><span class="ln">3665</span>            <b>if</b> (params) {
+</code><code id="L3666"><span class="ln">3666</span>                <b>for</b> (key <b>in</b> <b>this</b>.paper.customAttributes) <b>if</b> (<b>this</b>.paper.customAttributes[has](key)<span class="s"> &amp;&amp; </span>params[has](key)<span class="s"> &amp;&amp; </span>R.is(<b>this</b>.paper.customAttributes[key], <i>"<b>function</b>"</i>)) {
+</code><code id="L3667"><span class="ln">3667</span>                    <b>var</b> par<span class="s"> = </span><b>this</b>.paper.customAttributes[key].apply(<b>this</b>, [][concat](params[key]));
+</code><code id="L3668"><span class="ln">3668</span>                    <b>this</b>.attrs[key]<span class="s"> = </span>params[key];
+</code><code id="L3669"><span class="ln">3669</span>                    <b>for</b> (<b>var</b> subkey <b>in</b> par) <b>if</b> (par[has](subkey)) {
+</code><code id="L3670"><span class="ln">3670</span>                        params[subkey]<span class="s"> = </span>par[subkey];
+</code><code id="L3671"><span class="ln">3671</span>                    }
+</code><code id="L3672"><span class="ln">3672</span>                }
+</code><code id="L3673"><span class="ln">3673</span>                <span class="c">// <b>this</b>.paper.canvas.style.display<span class="s"> = </span><i>"none"</i>;</span>
+</code><code id="L3674"><span class="ln">3674</span>                <b>if</b> (params.text<span class="s"> &amp;&amp; </span><b>this</b>.type<span class="s"> == </span><i>"text"</i>) {
+</code><code id="L3675"><span class="ln">3675</span>                    <b>this</b>.textpath.string<span class="s"> = </span>params.text;
+</code><code id="L3676"><span class="ln">3676</span>                }
+</code><code id="L3677"><span class="ln">3677</span>                setFillAndStroke(<b>this</b>, params);
+</code><code id="L3678"><span class="ln">3678</span>                <span class="c">// <b>this</b>.paper.canvas.style.display<span class="s"> = </span>E;</span>
+</code><code id="L3679"><span class="ln">3679</span>            }
+</code><code id="L3680"><span class="ln">3680</span>            <b>return</b> <b>this</b>;
+</code><code id="L3681"><span class="ln">3681</span>        };
+</code><code id="L3682"><span class="ln">3682</span>        elproto.toFront<span class="s"> = </span><b>function</b> () {
+</code><code id="L3683"><span class="ln">3683</span>            !<b>this</b>.removed<span class="s"> &amp;&amp; </span><b>this</b>.node.parentNode.appendChild(<b>this</b>.node);
+</code><code id="L3684"><span class="ln">3684</span>            <b>this</b>.paper.top != <b>this</b><span class="s"> &amp;&amp; </span>tofront(<b>this</b>, <b>this</b>.paper);
+</code><code id="L3685"><span class="ln">3685</span>            <b>return</b> <b>this</b>;
+</code><code id="L3686"><span class="ln">3686</span>        };
+</code><code id="L3687"><span class="ln">3687</span>        elproto.toBack<span class="s"> = </span><b>function</b> () {
+</code><code id="L3688"><span class="ln">3688</span>            <b>if</b> (<b>this</b>.removed) {
+</code><code id="L3689"><span class="ln">3689</span>                <b>return</b> <b>this</b>;
+</code><code id="L3690"><span class="ln">3690</span>            }
+</code><code id="L3691"><span class="ln">3691</span>            <b>if</b> (<b>this</b>.node.parentNode.firstChild != <b>this</b>.node) {
+</code><code id="L3692"><span class="ln">3692</span>                <b>this</b>.node.parentNode.insertBefore(<b>this</b>.node, <b>this</b>.node.parentNode.firstChild);
+</code><code id="L3693"><span class="ln">3693</span>                toback(<b>this</b>, <b>this</b>.paper);
+</code><code id="L3694"><span class="ln">3694</span>            }
+</code><code id="L3695"><span class="ln">3695</span>            <b>return</b> <b>this</b>;
+</code><code id="L3696"><span class="ln">3696</span>        };
+</code><code id="L3697"><span class="ln">3697</span>        elproto.insertAfter<span class="s"> = </span><b>function</b> (element) {
+</code><code id="L3698"><span class="ln">3698</span>            <b>if</b> (<b>this</b>.removed) {
+</code><code id="L3699"><span class="ln">3699</span>                <b>return</b> <b>this</b>;
+</code><code id="L3700"><span class="ln">3700</span>            }
+</code><code id="L3701"><span class="ln">3701</span>            <b>if</b> (element.constructor<span class="s"> == </span>Set) {
+</code><code id="L3702"><span class="ln">3702</span>                element<span class="s"> = </span>element[element.length<span class="s"> - </span><span class="d">1</span>];
 </code><code id="L3703"><span class="ln">3703</span>            }
-</code><code id="L3704"><span class="ln">3704</span>        };
-</code><code id="L3705"><span class="ln">3705</span>
-</code><code id="L3706"><span class="ln">3706</span>        thePath<span class="s"> = </span><b>function</b> (pathString, vml) {
-</code><code id="L3707"><span class="ln">3707</span>            <b>var</b> el<span class="s"> = </span>createNode(<i>"shape"</i>);
-</code><code id="L3708"><span class="ln">3708</span>            el.style.cssText<span class="s"> = </span>cssDot;
-</code><code id="L3709"><span class="ln">3709</span>            el.coordsize<span class="s"> = </span>zoom<span class="s"> + </span>S<span class="s"> + </span>zoom;
-</code><code id="L3710"><span class="ln">3710</span>            el.coordorigin<span class="s"> = </span>vml.coordorigin;
-</code><code id="L3711"><span class="ln">3711</span>            <b>var</b> p<span class="s"> = </span><b>new</b> Element(el, vml),
-</code><code id="L3712"><span class="ln">3712</span>                attr<span class="s"> = </span>{fill: <i>"none"</i>, stroke: <i>"#<span class="d">000</span>"</i>};
-</code><code id="L3713"><span class="ln">3713</span>            pathString<span class="s"> &amp;&amp; </span>(attr.path<span class="s"> = </span>pathString);
-</code><code id="L3714"><span class="ln">3714</span>            p.type<span class="s"> = </span><i>"path"</i>;
-</code><code id="L3715"><span class="ln">3715</span>            p.path<span class="s"> = </span>[];
-</code><code id="L3716"><span class="ln">3716</span>            p.Path<span class="s"> = </span>E;
-</code><code id="L3717"><span class="ln">3717</span>            setFillAndStroke(p, attr);
-</code><code id="L3718"><span class="ln">3718</span>            vml.canvas.appendChild(el);
-</code><code id="L3719"><span class="ln">3719</span>            <b>var</b> skew<span class="s"> = </span>createNode(<i>"skew"</i>);
-</code><code id="L3720"><span class="ln">3720</span>            skew.on<span class="s"> = </span><b>true</b>;
-</code><code id="L3721"><span class="ln">3721</span>            el.appendChild(skew);
-</code><code id="L3722"><span class="ln">3722</span>            p.skew<span class="s"> = </span>skew;
-</code><code id="L3723"><span class="ln">3723</span>            p.transform(E);
-</code><code id="L3724"><span class="ln">3724</span>            <b>return</b> p;
-</code><code id="L3725"><span class="ln">3725</span>        };
-</code><code id="L3726"><span class="ln">3726</span>        theRect<span class="s"> = </span><b>function</b> (vml, x, y, w, h, r) {
-</code><code id="L3727"><span class="ln">3727</span>            <b>var</b> path<span class="s"> = </span>rectPath(x, y, w, h, r),
-</code><code id="L3728"><span class="ln">3728</span>                res<span class="s"> = </span>vml.path(path),
-</code><code id="L3729"><span class="ln">3729</span>                a<span class="s"> = </span>res.attrs;
-</code><code id="L3730"><span class="ln">3730</span>            res.X<span class="s"> = </span>a.x<span class="s"> = </span>x;
-</code><code id="L3731"><span class="ln">3731</span>            res.Y<span class="s"> = </span>a.y<span class="s"> = </span>y;
-</code><code id="L3732"><span class="ln">3732</span>            res.W<span class="s"> = </span>a.width<span class="s"> = </span>w;
-</code><code id="L3733"><span class="ln">3733</span>            res.H<span class="s"> = </span>a.height<span class="s"> = </span>h;
-</code><code id="L3734"><span class="ln">3734</span>            a.r<span class="s"> = </span>r;
-</code><code id="L3735"><span class="ln">3735</span>            a.path<span class="s"> = </span>path;
-</code><code id="L3736"><span class="ln">3736</span>            res.type<span class="s"> = </span><i>"rect"</i>;
-</code><code id="L3737"><span class="ln">3737</span>            <b>return</b> res;
-</code><code id="L3738"><span class="ln">3738</span>        };
-</code><code id="L3739"><span class="ln">3739</span>        theEllipse<span class="s"> = </span><b>function</b> (vml, x, y, rx, ry) {
-</code><code id="L3740"><span class="ln">3740</span>            <b>var</b> res<span class="s"> = </span>vml.path(),
-</code><code id="L3741"><span class="ln">3741</span>                a<span class="s"> = </span>res.attrs;
-</code><code id="L3742"><span class="ln">3742</span>            res.X<span class="s"> = </span>x<span class="s"> - </span>rx;
-</code><code id="L3743"><span class="ln">3743</span>            res.Y<span class="s"> = </span>y<span class="s"> - </span>ry;
-</code><code id="L3744"><span class="ln">3744</span>            res.W<span class="s"> = </span>rx<span class="s"> * </span><span class="d">2</span>;
-</code><code id="L3745"><span class="ln">3745</span>            res.H<span class="s"> = </span>ry<span class="s"> * </span><span class="d">2</span>;
-</code><code id="L3746"><span class="ln">3746</span>            res.type<span class="s"> = </span><i>"ellipse"</i>;
-</code><code id="L3747"><span class="ln">3747</span>            setFillAndStroke(res, {
-</code><code id="L3748"><span class="ln">3748</span>                cx: x,
-</code><code id="L3749"><span class="ln">3749</span>                cy: y,
-</code><code id="L3750"><span class="ln">3750</span>                rx: rx,
-</code><code id="L3751"><span class="ln">3751</span>                ry: ry
-</code><code id="L3752"><span class="ln">3752</span>            });
-</code><code id="L3753"><span class="ln">3753</span>            <b>return</b> res;
-</code><code id="L3754"><span class="ln">3754</span>        };
-</code><code id="L3755"><span class="ln">3755</span>        theCircle<span class="s"> = </span><b>function</b> (vml, x, y, r) {
-</code><code id="L3756"><span class="ln">3756</span>            <b>var</b> res<span class="s"> = </span>vml.path(),
-</code><code id="L3757"><span class="ln">3757</span>                a<span class="s"> = </span>res.attrs;
-</code><code id="L3758"><span class="ln">3758</span>            res.X<span class="s"> = </span>x<span class="s"> - </span>r;
-</code><code id="L3759"><span class="ln">3759</span>            res.Y<span class="s"> = </span>y<span class="s"> - </span>r;
-</code><code id="L3760"><span class="ln">3760</span>            res.W<span class="s"> = </span>res.H<span class="s"> = </span>r<span class="s"> * </span><span class="d">2</span>;
-</code><code id="L3761"><span class="ln">3761</span>            res.type<span class="s"> = </span><i>"circle"</i>;
-</code><code id="L3762"><span class="ln">3762</span>            setFillAndStroke(res, {
-</code><code id="L3763"><span class="ln">3763</span>                cx: x,
-</code><code id="L3764"><span class="ln">3764</span>                cy: y,
-</code><code id="L3765"><span class="ln">3765</span>                r: r
-</code><code id="L3766"><span class="ln">3766</span>            });
-</code><code id="L3767"><span class="ln">3767</span>            <b>return</b> res;
-</code><code id="L3768"><span class="ln">3768</span>        };
-</code><code id="L3769"><span class="ln">3769</span>        theImage<span class="s"> = </span><b>function</b> (vml, src, x, y, w, h) {
-</code><code id="L3770"><span class="ln">3770</span>            <b>var</b> path<span class="s"> = </span>rectPath(x, y, w, h),
-</code><code id="L3771"><span class="ln">3771</span>                res<span class="s"> = </span>vml.path(path).attr({stroke: <i>"none"</i>}),
-</code><code id="L3772"><span class="ln">3772</span>                a<span class="s"> = </span>res.attrs,
-</code><code id="L3773"><span class="ln">3773</span>                node<span class="s"> = </span>res.node,
-</code><code id="L3774"><span class="ln">3774</span>                fill<span class="s"> = </span>node.getElementsByTagName(fillString)[<span class="d">0</span>];
-</code><code id="L3775"><span class="ln">3775</span>            a.src<span class="s"> = </span>src;
-</code><code id="L3776"><span class="ln">3776</span>            res.X<span class="s"> = </span>a.x<span class="s"> = </span>x;
-</code><code id="L3777"><span class="ln">3777</span>            res.Y<span class="s"> = </span>a.y<span class="s"> = </span>y;
-</code><code id="L3778"><span class="ln">3778</span>            res.W<span class="s"> = </span>a.width<span class="s"> = </span>w;
-</code><code id="L3779"><span class="ln">3779</span>            res.H<span class="s"> = </span>a.height<span class="s"> = </span>h;
-</code><code id="L3780"><span class="ln">3780</span>            a.path<span class="s"> = </span>path;
-</code><code id="L3781"><span class="ln">3781</span>            res.type<span class="s"> = </span><i>"image"</i>;
-</code><code id="L3782"><span class="ln">3782</span>            fill.parentNode<span class="s"> == </span>node<span class="s"> &amp;&amp; </span>node.removeChild(fill);
-</code><code id="L3783"><span class="ln">3783</span>            fill.rotate<span class="s"> = </span><b>true</b>;
-</code><code id="L3784"><span class="ln">3784</span>            fill.src<span class="s"> = </span>src;
-</code><code id="L3785"><span class="ln">3785</span>            fill.type<span class="s"> = </span><i>"tile"</i>;
-</code><code id="L3786"><span class="ln">3786</span>            res._.fillpos<span class="s"> = </span>[x, y];
-</code><code id="L3787"><span class="ln">3787</span>            res._.fillsize<span class="s"> = </span>[w, h];
-</code><code id="L3788"><span class="ln">3788</span>            node.appendChild(fill);
-</code><code id="L3789"><span class="ln">3789</span>            setCoords(res);
-</code><code id="L3790"><span class="ln">3790</span>            <b>return</b> res;
-</code><code id="L3791"><span class="ln">3791</span>        };
-</code><code id="L3792"><span class="ln">3792</span>        theText<span class="s"> = </span><b>function</b> (vml, x, y, text) {
-</code><code id="L3793"><span class="ln">3793</span>            <b>var</b> el<span class="s"> = </span>createNode(<i>"shape"</i>),
-</code><code id="L3794"><span class="ln">3794</span>                path<span class="s"> = </span>createNode(<i>"path"</i>),
-</code><code id="L3795"><span class="ln">3795</span>                o<span class="s"> = </span>createNode(<i>"textpath"</i>);
-</code><code id="L3796"><span class="ln">3796</span>            x<span class="s"> = </span>x<span class="s"> || </span><span class="d">0</span>;
-</code><code id="L3797"><span class="ln">3797</span>            y<span class="s"> = </span>y<span class="s"> || </span><span class="d">0</span>;
-</code><code id="L3798"><span class="ln">3798</span>            text<span class="s"> = </span>text<span class="s"> || </span><i>""</i>;
-</code><code id="L3799"><span class="ln">3799</span>            path.v<span class="s"> = </span>R.format(<i>"m{<span class="d">0</span>},{<span class="d">1</span>}l{<span class="d">2</span>},{<span class="d">1</span>}"</i>, round(x<span class="s"> * </span>zoom), round(y<span class="s"> * </span>zoom), round(x<span class="s"> * </span>zoom)<span class="s"> + </span><span class="d">1</span>);
-</code><code id="L3800"><span class="ln">3800</span>            path.textpathok<span class="s"> = </span><b>true</b>;
-</code><code id="L3801"><span class="ln">3801</span>            o.string<span class="s"> = </span>Str(text);
-</code><code id="L3802"><span class="ln">3802</span>            o.on<span class="s"> = </span><b>true</b>;
-</code><code id="L3803"><span class="ln">3803</span>            el.style.cssText<span class="s"> = </span><i>"position:absolute;left:<span class="d">0</span>;top:<span class="d">0</span>;width:<span class="d">1</span>;height:<span class="d">1</span>"</i>;
-</code><code id="L3804"><span class="ln">3804</span>            el.coordsize<span class="s"> = </span>zoom<span class="s"> + </span>S<span class="s"> + </span>zoom;
-</code><code id="L3805"><span class="ln">3805</span>            el.coordorigin<span class="s"> = </span><i>"<span class="d">0</span> <span class="d">0</span>"</i>;
-</code><code id="L3806"><span class="ln">3806</span>            <b>var</b> p<span class="s"> = </span><b>new</b> Element(el, vml),
-</code><code id="L3807"><span class="ln">3807</span>                attr<span class="s"> = </span>{fill: <i>"#<span class="d">000</span>"</i>, stroke: <i>"none"</i>, font: availableAttrs.font, text: text};
-</code><code id="L3808"><span class="ln">3808</span>            p.shape<span class="s"> = </span>el;
-</code><code id="L3809"><span class="ln">3809</span>            p.path<span class="s"> = </span>path;
-</code><code id="L3810"><span class="ln">3810</span>            p.textpath<span class="s"> = </span>o;
-</code><code id="L3811"><span class="ln">3811</span>            p.type<span class="s"> = </span><i>"text"</i>;
-</code><code id="L3812"><span class="ln">3812</span>            p.attrs.text<span class="s"> = </span>Str(text);
-</code><code id="L3813"><span class="ln">3813</span>            p.attrs.x<span class="s"> = </span>x;
-</code><code id="L3814"><span class="ln">3814</span>            p.attrs.y<span class="s"> = </span>y;
-</code><code id="L3815"><span class="ln">3815</span>            p.attrs.w<span class="s"> = </span><span class="d">1</span>;
-</code><code id="L3816"><span class="ln">3816</span>            p.attrs.h<span class="s"> = </span><span class="d">1</span>;
-</code><code id="L3817"><span class="ln">3817</span>            setFillAndStroke(p, attr);
-</code><code id="L3818"><span class="ln">3818</span>            el.appendChild(o);
-</code><code id="L3819"><span class="ln">3819</span>            el.appendChild(path);
-</code><code id="L3820"><span class="ln">3820</span>            vml.canvas.appendChild(el);
-</code><code id="L3821"><span class="ln">3821</span>            <b>var</b> skew<span class="s"> = </span>createNode(<i>"skew"</i>);
-</code><code id="L3822"><span class="ln">3822</span>            skew.on<span class="s"> = </span><b>true</b>;
-</code><code id="L3823"><span class="ln">3823</span>            el.appendChild(skew);
-</code><code id="L3824"><span class="ln">3824</span>            p.skew<span class="s"> = </span>skew;
-</code><code id="L3825"><span class="ln">3825</span>            p.transform(E);
-</code><code id="L3826"><span class="ln">3826</span>            <b>return</b> p;
-</code><code id="L3827"><span class="ln">3827</span>        };
-</code><code id="L3828"><span class="ln">3828</span>        setSize<span class="s"> = </span><b>function</b> (width, height) {
-</code><code id="L3829"><span class="ln">3829</span>            <b>var</b> cs<span class="s"> = </span><b>this</b>.canvas.style;
-</code><code id="L3830"><span class="ln">3830</span>            <b>this</b>.width<span class="s"> = </span>width;
-</code><code id="L3831"><span class="ln">3831</span>            <b>this</b>.height<span class="s"> = </span>height;
-</code><code id="L3832"><span class="ln">3832</span>            width<span class="s"> == </span>+width<span class="s"> &amp;&amp; </span>(width += <i>"px"</i>);
-</code><code id="L3833"><span class="ln">3833</span>            height<span class="s"> == </span>+height<span class="s"> &amp;&amp; </span>(height += <i>"px"</i>);
-</code><code id="L3834"><span class="ln">3834</span>            cs.width<span class="s"> = </span>width;
-</code><code id="L3835"><span class="ln">3835</span>            cs.height<span class="s"> = </span>height;
-</code><code id="L3836"><span class="ln">3836</span>            cs.clip<span class="s"> = </span><i>"rect(<span class="d">0</span> "</i><span class="s"> + </span>width<span class="s"> + </span><i>" "</i><span class="s"> + </span>height<span class="s"> + </span><i>" <span class="d">0</span>)"</i>;
-</code><code id="L3837"><span class="ln">3837</span>            <b>if</b> (<b>this</b>._viewBox) {
-</code><code id="L3838"><span class="ln">3838</span>                setViewBox.apply(<b>this</b>, <b>this</b>._viewBox);
-</code><code id="L3839"><span class="ln">3839</span>            }
-</code><code id="L3840"><span class="ln">3840</span>            <b>return</b> <b>this</b>;
-</code><code id="L3841"><span class="ln">3841</span>        };
-</code><code id="L3842"><span class="ln">3842</span>        setViewBox<span class="s"> = </span><b>function</b> (x, y, w, h, fit) {
-</code><code id="L3843"><span class="ln">3843</span>            eve(<i>"setViewBox"</i>, <b>this</b>, <b>this</b>._viewBox, [x, y, w, h, fit]);
-</code><code id="L3844"><span class="ln">3844</span>            <b>var</b> width<span class="s"> = </span><b>this</b>.width,
-</code><code id="L3845"><span class="ln">3845</span>                height<span class="s"> = </span><b>this</b>.height,
-</code><code id="L3846"><span class="ln">3846</span>                size<span class="s"> = </span><span class="d">1e3</span><span class="s"> * </span>mmax(w<span class="s"> / </span>width, h<span class="s"> / </span>height),
-</code><code id="L3847"><span class="ln">3847</span>                H, W;
-</code><code id="L3848"><span class="ln">3848</span>            <b>if</b> (fit) {
-</code><code id="L3849"><span class="ln">3849</span>                H<span class="s"> = </span>height<span class="s"> / </span>h;
-</code><code id="L3850"><span class="ln">3850</span>                W<span class="s"> = </span>width<span class="s"> / </span>w;
-</code><code id="L3851"><span class="ln">3851</span>                <b>if</b> (w<span class="s"> * </span>H &lt; width) {
-</code><code id="L3852"><span class="ln">3852</span>                    x -= (width<span class="s"> - </span>w<span class="s"> * </span>H)<span class="s"> / </span><span class="d">2</span><span class="s"> / </span>H;
-</code><code id="L3853"><span class="ln">3853</span>                }
-</code><code id="L3854"><span class="ln">3854</span>                <b>if</b> (h<span class="s"> * </span>W &lt; height) {
-</code><code id="L3855"><span class="ln">3855</span>                    y -= (height<span class="s"> - </span>h<span class="s"> * </span>W)<span class="s"> / </span><span class="d">2</span><span class="s"> / </span>W;
-</code><code id="L3856"><span class="ln">3856</span>                }
-</code><code id="L3857"><span class="ln">3857</span>            }
-</code><code id="L3858"><span class="ln">3858</span>            <b>this</b>._viewBox<span class="s"> = </span>[x, y, w, h, !!fit];
-</code><code id="L3859"><span class="ln">3859</span>            <b>this</b>.forEach(<b>function</b> (el) {
-</code><code id="L3860"><span class="ln">3860</span>                el.transform(<i>"..."</i>);
-</code><code id="L3861"><span class="ln">3861</span>            });
-</code><code id="L3862"><span class="ln">3862</span>            <b>return</b> <b>this</b>;
-</code><code id="L3863"><span class="ln">3863</span>        };
-</code><code id="L3864"><span class="ln">3864</span>        <b>var</b> createNode,
-</code><code id="L3865"><span class="ln">3865</span>            initWin<span class="s"> = </span><b>function</b> (win) {
-</code><code id="L3866"><span class="ln">3866</span>                <b>var</b> doc<span class="s"> = </span>win.document;
-</code><code id="L3867"><span class="ln">3867</span>                doc.createStyleSheet().addRule(<i>".rvml"</i>, <i>"behavior:url(#<b>default</b>#VML)"</i>);
-</code><code id="L3868"><span class="ln">3868</span>                <b>try</b> {
-</code><code id="L3869"><span class="ln">3869</span>                    !doc.namespaces.rvml<span class="s"> &amp;&amp; </span>doc.namespaces.add(<i>"rvml"</i>, <i>"urn:schemas-microsoft-com:vml"</i>);
-</code><code id="L3870"><span class="ln">3870</span>                    createNode<span class="s"> = </span><b>function</b> (tagName) {
-</code><code id="L3871"><span class="ln">3871</span>                        <b>return</b> doc.createElement(<i>'&lt;rvml:'</i><span class="s"> + </span>tagName<span class="s"> + </span><i>' <b>class</b>="rvml">'</i>);
-</code><code id="L3872"><span class="ln">3872</span>                    };
-</code><code id="L3873"><span class="ln">3873</span>                } <b>catch</b> (e) {
-</code><code id="L3874"><span class="ln">3874</span>                    createNode<span class="s"> = </span><b>function</b> (tagName) {
-</code><code id="L3875"><span class="ln">3875</span>                        <b>return</b> doc.createElement(<i>'&lt;'</i><span class="s"> + </span>tagName<span class="s"> + </span><i>' xmlns="urn:schemas-microsoft.com:vml" <b>class</b>="rvml">'</i>);
-</code><code id="L3876"><span class="ln">3876</span>                    };
-</code><code id="L3877"><span class="ln">3877</span>                }
-</code><code id="L3878"><span class="ln">3878</span>            };
-</code><code id="L3879"><span class="ln">3879</span>        initWin(g.win);
-</code><code id="L3880"><span class="ln">3880</span>        create<span class="s"> = </span><b>function</b> () {
-</code><code id="L3881"><span class="ln">3881</span>            <b>var</b> con<span class="s"> = </span>getContainer[apply](<span class="d">0</span>, arguments),
-</code><code id="L3882"><span class="ln">3882</span>                container<span class="s"> = </span>con.container,
-</code><code id="L3883"><span class="ln">3883</span>                height<span class="s"> = </span>con.height,
-</code><code id="L3884"><span class="ln">3884</span>                s,
-</code><code id="L3885"><span class="ln">3885</span>                width<span class="s"> = </span>con.width,
-</code><code id="L3886"><span class="ln">3886</span>                x<span class="s"> = </span>con.x,
-</code><code id="L3887"><span class="ln">3887</span>                y<span class="s"> = </span>con.y;
-</code><code id="L3888"><span class="ln">3888</span>            <b>if</b> (!container) {
-</code><code id="L3889"><span class="ln">3889</span>                <b>throw</b> <b>new</b> Error(<i>"VML container not found."</i>);
-</code><code id="L3890"><span class="ln">3890</span>            }
-</code><code id="L3891"><span class="ln">3891</span>            <b>var</b> res<span class="s"> = </span><b>new</b> Paper,
-</code><code id="L3892"><span class="ln">3892</span>                c<span class="s"> = </span>res.canvas<span class="s"> = </span>g.doc.createElement(<i>"div"</i>),
-</code><code id="L3893"><span class="ln">3893</span>                cs<span class="s"> = </span>c.style;
-</code><code id="L3894"><span class="ln">3894</span>            x<span class="s"> = </span>x<span class="s"> || </span><span class="d">0</span>;
-</code><code id="L3895"><span class="ln">3895</span>            y<span class="s"> = </span>y<span class="s"> || </span><span class="d">0</span>;
-</code><code id="L3896"><span class="ln">3896</span>            width<span class="s"> = </span>width<span class="s"> || </span><span class="d">512</span>;
-</code><code id="L3897"><span class="ln">3897</span>            height<span class="s"> = </span>height<span class="s"> || </span><span class="d">342</span>;
-</code><code id="L3898"><span class="ln">3898</span>            res.width<span class="s"> = </span>width;
-</code><code id="L3899"><span class="ln">3899</span>            res.height<span class="s"> = </span>height;
-</code><code id="L3900"><span class="ln">3900</span>            width<span class="s"> == </span>+width<span class="s"> &amp;&amp; </span>(width += <i>"px"</i>);
-</code><code id="L3901"><span class="ln">3901</span>            height<span class="s"> == </span>+height<span class="s"> &amp;&amp; </span>(height += <i>"px"</i>);
-</code><code id="L3902"><span class="ln">3902</span>            res.coordsize<span class="s"> = </span>zoom<span class="s"> * </span><span class="d">1e3</span><span class="s"> + </span>S<span class="s"> + </span>zoom<span class="s"> * </span><span class="d">1e3</span>;
-</code><code id="L3903"><span class="ln">3903</span>            res.coordorigin<span class="s"> = </span><i>"<span class="d">0</span> <span class="d">0</span>"</i>;
-</code><code id="L3904"><span class="ln">3904</span>            res.span<span class="s"> = </span>g.doc.createElement(<i>"span"</i>);
-</code><code id="L3905"><span class="ln">3905</span>            res.span.style.cssText<span class="s"> = </span><i>"position:absolute;left:-9999em;top:-9999em;padding:<span class="d">0</span>;margin:<span class="d">0</span>;line-height:<span class="d">1</span>;"</i>;
-</code><code id="L3906"><span class="ln">3906</span>            c.appendChild(res.span);
-</code><code id="L3907"><span class="ln">3907</span>            cs.cssText<span class="s"> = </span>R.format(<i>"top:<span class="d">0</span>;left:<span class="d">0</span>;width:{<span class="d">0</span>};height:{<span class="d">1</span>};display:inline-block;position:relative;clip:rect(<span class="d">0</span> {<span class="d">0</span>} {<span class="d">1</span>} <span class="d">0</span>);overflow:hidden"</i>, width, height);
-</code><code id="L3908"><span class="ln">3908</span>            <b>if</b> (container<span class="s"> == </span><span class="d">1</span>) {
-</code><code id="L3909"><span class="ln">3909</span>                g.doc.body.appendChild(c);
-</code><code id="L3910"><span class="ln">3910</span>                cs.left<span class="s"> = </span>x<span class="s"> + </span><i>"px"</i>;
-</code><code id="L3911"><span class="ln">3911</span>                cs.top<span class="s"> = </span>y<span class="s"> + </span><i>"px"</i>;
-</code><code id="L3912"><span class="ln">3912</span>                cs.position<span class="s"> = </span><i>"absolute"</i>;
-</code><code id="L3913"><span class="ln">3913</span>            } <b>else</b> {
-</code><code id="L3914"><span class="ln">3914</span>                <b>if</b> (container.firstChild) {
-</code><code id="L3915"><span class="ln">3915</span>                    container.insertBefore(c, container.firstChild);
-</code><code id="L3916"><span class="ln">3916</span>                } <b>else</b> {
-</code><code id="L3917"><span class="ln">3917</span>                    container.appendChild(c);
-</code><code id="L3918"><span class="ln">3918</span>                }
-</code><code id="L3919"><span class="ln">3919</span>            }
-</code><code id="L3920"><span class="ln">3920</span>            plugins.call(res, res, R.fn);
-</code><code id="L3921"><span class="ln">3921</span>            <b>return</b> res;
-</code><code id="L3922"><span class="ln">3922</span>        };
-</code><code id="L3923"><span class="ln">3923</span>        paperproto.clear<span class="s"> = </span><b>function</b> () {
-</code><code id="L3924"><span class="ln">3924</span>            eve(<i>"clear"</i>, <b>this</b>);
-</code><code id="L3925"><span class="ln">3925</span>            <b>this</b>.canvas.innerHTML<span class="s"> = </span>E;
-</code><code id="L3926"><span class="ln">3926</span>            <b>this</b>.span<span class="s"> = </span>g.doc.createElement(<i>"span"</i>);
-</code><code id="L3927"><span class="ln">3927</span>            <b>this</b>.span.style.cssText<span class="s"> = </span><i>"position:absolute;left:-9999em;top:-9999em;padding:<span class="d">0</span>;margin:<span class="d">0</span>;line-height:<span class="d">1</span>;display:inline;"</i>;
-</code><code id="L3928"><span class="ln">3928</span>            <b>this</b>.canvas.appendChild(<b>this</b>.span);
-</code><code id="L3929"><span class="ln">3929</span>            <b>this</b>.bottom<span class="s"> = </span><b>this</b>.top<span class="s"> = </span><b>null</b>;
-</code><code id="L3930"><span class="ln">3930</span>        };
-</code><code id="L3931"><span class="ln">3931</span>        paperproto.remove<span class="s"> = </span><b>function</b> () {
-</code><code id="L3932"><span class="ln">3932</span>            eve(<i>"remove"</i>, <b>this</b>);
-</code><code id="L3933"><span class="ln">3933</span>            <b>this</b>.canvas.parentNode.removeChild(<b>this</b>.canvas);
-</code><code id="L3934"><span class="ln">3934</span>            <b>for</b> (<b>var</b> i <b>in</b> <b>this</b>) {
-</code><code id="L3935"><span class="ln">3935</span>                <b>this</b>[i]<span class="s"> = </span>removed(i);
-</code><code id="L3936"><span class="ln">3936</span>            }
-</code><code id="L3937"><span class="ln">3937</span>            <b>return</b> <b>true</b>;
-</code><code id="L3938"><span class="ln">3938</span>        };
-</code><code id="L3939"><span class="ln">3939</span>    }
-</code><code id="L3940"><span class="ln">3940</span> 
-</code><code id="L3941"><span class="ln">3941</span>    <span class="c">// WebKit rendering bug workaround method</span>
-</code><code id="L3942"><span class="ln">3942</span>    <b>var</b> version<span class="s"> = </span>navigator.userAgent.match(/Version\/(.*?)\s/)<span class="s"> || </span>navigator.userAgent.match(/Chrome\/(\d+)/);
-</code><code id="L3943"><span class="ln">3943</span>    <b>if</b> ((navigator.vendor<span class="s"> == </span><i>"Apple Computer, Inc."</i>)<span class="s"> &amp;&amp; </span>(version<span class="s"> &amp;&amp; </span>version[<span class="d">1</span>] &lt; <span class="d">4</span><span class="s"> || </span>navigator.platform.slice(<span class="d">0</span>, <span class="d">2</span>)<span class="s"> == </span><i>"iP"</i>) ||
-</code><code id="L3944"><span class="ln">3944</span>        (navigator.vendor<span class="s"> == </span><i>"Google Inc."</i><span class="s"> &amp;&amp; </span>version<span class="s"> &amp;&amp; </span>version[<span class="d">1</span>] &lt; <span class="d">8</span>)) {
-</code><code id="L3945"><span class="ln">3945</span><span class="c">        <span class="c">/*\</span>
-</span></code><code id="L3946"><span class="ln">3946</span><span class="c">        <span class="s"> * </span>Paper.safari
-</span></code><code id="L3947"><span class="ln">3947</span><span class="c">         [ method ]
-</span></code><code id="L3948"><span class="ln">3948</span><span class="c">         **
-</span></code><code id="L3949"><span class="ln">3949</span><span class="c">        <span class="s"> * </span>There is an inconvenient rendering bug <b>in</b> Safari (WebKit):
-</span></code><code id="L3950"><span class="ln">3950</span><span class="c">        <span class="s"> * </span>sometimes the rendering should be forced.
-</span></code><code id="L3951"><span class="ln">3951</span><span class="c">        <span class="s"> * </span>This method should help <b>with</b> dealing <b>with</b> <b>this</b> bug.
-</span></code><code id="L3952"><span class="ln">3952</span><span class="c">        \*/</span>
-</code><code id="L3953"><span class="ln">3953</span>        paperproto.safari<span class="s"> = </span><b>function</b> () {
-</code><code id="L3954"><span class="ln">3954</span>            <b>var</b> rect<span class="s"> = </span><b>this</b>.rect(-<span class="d">99</span>, -<span class="d">99</span>, <b>this</b>.width<span class="s"> + </span><span class="d">99</span>, <b>this</b>.height<span class="s"> + </span><span class="d">99</span>).attr({stroke: <i>"none"</i>});
-</code><code id="L3955"><span class="ln">3955</span>            setTimeout(<b>function</b> () {rect.remove();});
-</code><code id="L3956"><span class="ln">3956</span>        };
-</code><code id="L3957"><span class="ln">3957</span>    } <b>else</b> {
-</code><code id="L3958"><span class="ln">3958</span>        paperproto.safari<span class="s"> = </span>fun;
-</code><code id="L3959"><span class="ln">3959</span>    }
-</code><code id="L3960"><span class="ln">3960</span> 
-</code><code id="L3961"><span class="ln">3961</span>    <span class="c">// Events</span>
-</code><code id="L3962"><span class="ln">3962</span>    <b>var</b> preventDefault<span class="s"> = </span><b>function</b> () {
-</code><code id="L3963"><span class="ln">3963</span>        <b>this</b>.returnValue<span class="s"> = </span><b>false</b>;
-</code><code id="L3964"><span class="ln">3964</span>    },
-</code><code id="L3965"><span class="ln">3965</span>    preventTouch<span class="s"> = </span><b>function</b> () {
-</code><code id="L3966"><span class="ln">3966</span>        <b>return</b> <b>this</b>.originalEvent.preventDefault();
-</code><code id="L3967"><span class="ln">3967</span>    },
-</code><code id="L3968"><span class="ln">3968</span>    stopPropagation<span class="s"> = </span><b>function</b> () {
-</code><code id="L3969"><span class="ln">3969</span>        <b>this</b>.cancelBubble<span class="s"> = </span><b>true</b>;
-</code><code id="L3970"><span class="ln">3970</span>    },
-</code><code id="L3971"><span class="ln">3971</span>    stopTouch<span class="s"> = </span><b>function</b> () {
-</code><code id="L3972"><span class="ln">3972</span>        <b>return</b> <b>this</b>.originalEvent.stopPropagation();
-</code><code id="L3973"><span class="ln">3973</span>    },
-</code><code id="L3974"><span class="ln">3974</span>    addEvent<span class="s"> = </span>(<b>function</b> () {
-</code><code id="L3975"><span class="ln">3975</span>        <b>if</b> (g.doc.addEventListener) {
-</code><code id="L3976"><span class="ln">3976</span>            <b>return</b> <b>function</b> (obj, type, fn, element) {
-</code><code id="L3977"><span class="ln">3977</span>                <b>var</b> realName<span class="s"> = </span>supportsTouch<span class="s"> &amp;&amp; </span>touchMap[type] ? touchMap[type] : type;
-</code><code id="L3978"><span class="ln">3978</span>                <b>var</b> f<span class="s"> = </span><b>function</b> (e) {
-</code><code id="L3979"><span class="ln">3979</span>                    <b>if</b> (supportsTouch<span class="s"> &amp;&amp; </span>touchMap[has](type)) {
-</code><code id="L3980"><span class="ln">3980</span>                        <b>for</b> (<b>var</b> i<span class="s"> = </span><span class="d">0</span>, ii<span class="s"> = </span>e.targetTouches<span class="s"> &amp;&amp; </span>e.targetTouches.length; i &lt; ii; i++) {
-</code><code id="L3981"><span class="ln">3981</span>                            <b>if</b> (e.targetTouches[i].target<span class="s"> == </span>obj) {
-</code><code id="L3982"><span class="ln">3982</span>                                <b>var</b> olde<span class="s"> = </span>e;
-</code><code id="L3983"><span class="ln">3983</span>                                e<span class="s"> = </span>e.targetTouches[i];
-</code><code id="L3984"><span class="ln">3984</span>                                e.originalEvent<span class="s"> = </span>olde;
-</code><code id="L3985"><span class="ln">3985</span>                                e.preventDefault<span class="s"> = </span>preventTouch;
-</code><code id="L3986"><span class="ln">3986</span>                                e.stopPropagation<span class="s"> = </span>stopTouch;
-</code><code id="L3987"><span class="ln">3987</span>                                <b>break</b>;
-</code><code id="L3988"><span class="ln">3988</span>                            }
-</code><code id="L3989"><span class="ln">3989</span>                        }
-</code><code id="L3990"><span class="ln">3990</span>                    }
-</code><code id="L3991"><span class="ln">3991</span>                    <b>return</b> fn.call(element, e);
-</code><code id="L3992"><span class="ln">3992</span>                };
-</code><code id="L3993"><span class="ln">3993</span>                obj.addEventListener(realName, f, <b>false</b>);
-</code><code id="L3994"><span class="ln">3994</span>                <b>return</b> <b>function</b> () {
-</code><code id="L3995"><span class="ln">3995</span>                    obj.removeEventListener(realName, f, <b>false</b>);
-</code><code id="L3996"><span class="ln">3996</span>                    <b>return</b> <b>true</b>;
-</code><code id="L3997"><span class="ln">3997</span>                };
-</code><code id="L3998"><span class="ln">3998</span>            };
-</code><code id="L3999"><span class="ln">3999</span>        } <b>else</b> <b>if</b> (g.doc.attachEvent) {
-</code><code id="L4000"><span class="ln">4000</span>            <b>return</b> <b>function</b> (obj, type, fn, element) {
-</code><code id="L4001"><span class="ln">4001</span>                <b>var</b> f<span class="s"> = </span><b>function</b> (e) {
-</code><code id="L4002"><span class="ln">4002</span>                    e<span class="s"> = </span>e<span class="s"> || </span>g.win.event;
-</code><code id="L4003"><span class="ln">4003</span>                    e.preventDefault<span class="s"> = </span>e.preventDefault<span class="s"> || </span>preventDefault;
-</code><code id="L4004"><span class="ln">4004</span>                    e.stopPropagation<span class="s"> = </span>e.stopPropagation<span class="s"> || </span>stopPropagation;
-</code><code id="L4005"><span class="ln">4005</span>                    <b>return</b> fn.call(element, e);
-</code><code id="L4006"><span class="ln">4006</span>                };
-</code><code id="L4007"><span class="ln">4007</span>                obj.attachEvent(<i>"on"</i><span class="s"> + </span>type, f);
-</code><code id="L4008"><span class="ln">4008</span>                <b>var</b> detacher<span class="s"> = </span><b>function</b> () {
-</code><code id="L4009"><span class="ln">4009</span>                    obj.detachEvent(<i>"on"</i><span class="s"> + </span>type, f);
-</code><code id="L4010"><span class="ln">4010</span>                    <b>return</b> <b>true</b>;
-</code><code id="L4011"><span class="ln">4011</span>                };
-</code><code id="L4012"><span class="ln">4012</span>                <b>return</b> detacher;
-</code><code id="L4013"><span class="ln">4013</span>            };
-</code><code id="L4014"><span class="ln">4014</span>        }
-</code><code id="L4015"><span class="ln">4015</span>    })(),
-</code><code id="L4016"><span class="ln">4016</span>    drag<span class="s"> = </span>[],
-</code><code id="L4017"><span class="ln">4017</span>    dragMove<span class="s"> = </span><b>function</b> (e) {
-</code><code id="L4018"><span class="ln">4018</span>        <b>var</b> x<span class="s"> = </span>e.clientX,
-</code><code id="L4019"><span class="ln">4019</span>            y<span class="s"> = </span>e.clientY,
-</code><code id="L4020"><span class="ln">4020</span>            scrollY<span class="s"> = </span>g.doc.documentElement.scrollTop<span class="s"> || </span>g.doc.body.scrollTop,
-</code><code id="L4021"><span class="ln">4021</span>            scrollX<span class="s"> = </span>g.doc.documentElement.scrollLeft<span class="s"> || </span>g.doc.body.scrollLeft,
-</code><code id="L4022"><span class="ln">4022</span>            dragi,
-</code><code id="L4023"><span class="ln">4023</span>            j<span class="s"> = </span>drag.length;
-</code><code id="L4024"><span class="ln">4024</span>        <b>while</b> (j--) {
-</code><code id="L4025"><span class="ln">4025</span>            dragi<span class="s"> = </span>drag[j];
-</code><code id="L4026"><span class="ln">4026</span>            <b>if</b> (supportsTouch) {
-</code><code id="L4027"><span class="ln">4027</span>                <b>var</b> i<span class="s"> = </span>e.touches.length,
-</code><code id="L4028"><span class="ln">4028</span>                    touch;
-</code><code id="L4029"><span class="ln">4029</span>                <b>while</b> (i--) {
-</code><code id="L4030"><span class="ln">4030</span>                    touch<span class="s"> = </span>e.touches[i];
-</code><code id="L4031"><span class="ln">4031</span>                    <b>if</b> (touch.identifier<span class="s"> == </span>dragi.el._drag.id) {
-</code><code id="L4032"><span class="ln">4032</span>                        x<span class="s"> = </span>touch.clientX;
-</code><code id="L4033"><span class="ln">4033</span>                        y<span class="s"> = </span>touch.clientY;
-</code><code id="L4034"><span class="ln">4034</span>                        (e.originalEvent ? e.originalEvent : e).preventDefault();
-</code><code id="L4035"><span class="ln">4035</span>                        <b>break</b>;
-</code><code id="L4036"><span class="ln">4036</span>                    }
-</code><code id="L4037"><span class="ln">4037</span>                }
-</code><code id="L4038"><span class="ln">4038</span>            } <b>else</b> {
-</code><code id="L4039"><span class="ln">4039</span>                e.preventDefault();
-</code><code id="L4040"><span class="ln">4040</span>            }
-</code><code id="L4041"><span class="ln">4041</span>            <b>var</b> node<span class="s"> = </span>dragi.el.node,
-</code><code id="L4042"><span class="ln">4042</span>                o,
-</code><code id="L4043"><span class="ln">4043</span>                next<span class="s"> = </span>node.nextSibling,
-</code><code id="L4044"><span class="ln">4044</span>                parent<span class="s"> = </span>node.parentNode,
-</code><code id="L4045"><span class="ln">4045</span>                display<span class="s"> = </span>node.style.display;
-</code><code id="L4046"><span class="ln">4046</span>            g.win.opera<span class="s"> &amp;&amp; </span>parent.removeChild(node);
-</code><code id="L4047"><span class="ln">4047</span>            node.style.display<span class="s"> = </span><i>"none"</i>;
-</code><code id="L4048"><span class="ln">4048</span>            o<span class="s"> = </span>dragi.el.paper.getElementByPoint(x, y);
-</code><code id="L4049"><span class="ln">4049</span>            node.style.display<span class="s"> = </span>display;
-</code><code id="L4050"><span class="ln">4050</span>            g.win.opera<span class="s"> &amp;&amp; </span>(next ? parent.insertBefore(node, next) : parent.appendChild(node));
-</code><code id="L4051"><span class="ln">4051</span>            o<span class="s"> &amp;&amp; </span>eve(<i>"drag.over."</i><span class="s"> + </span>dragi.el.id, dragi.el, o);
-</code><code id="L4052"><span class="ln">4052</span>            x += scrollX;
-</code><code id="L4053"><span class="ln">4053</span>            y += scrollY;
-</code><code id="L4054"><span class="ln">4054</span>            eve(<i>"drag.move."</i><span class="s"> + </span>dragi.el.id, dragi.move_scope<span class="s"> || </span>dragi.el, x<span class="s"> - </span>dragi.el._drag.x, y<span class="s"> - </span>dragi.el._drag.y, x, y, e);
-</code><code id="L4055"><span class="ln">4055</span>        }
-</code><code id="L4056"><span class="ln">4056</span>    },
-</code><code id="L4057"><span class="ln">4057</span>    dragUp<span class="s"> = </span><b>function</b> (e) {
-</code><code id="L4058"><span class="ln">4058</span>        R.unmousemove(dragMove).unmouseup(dragUp);
-</code><code id="L4059"><span class="ln">4059</span>        <b>var</b> i<span class="s"> = </span>drag.length,
-</code><code id="L4060"><span class="ln">4060</span>            dragi;
-</code><code id="L4061"><span class="ln">4061</span>        <b>while</b> (i--) {
-</code><code id="L4062"><span class="ln">4062</span>            dragi<span class="s"> = </span>drag[i];
-</code><code id="L4063"><span class="ln">4063</span>            dragi.el._drag<span class="s"> = </span>{};
-</code><code id="L4064"><span class="ln">4064</span>            eve(<i>"drag.end."</i><span class="s"> + </span>dragi.el.id, dragi.end_scope<span class="s"> || </span>dragi.start_scope<span class="s"> || </span>dragi.move_scope<span class="s"> || </span>dragi.el, e);
-</code><code id="L4065"><span class="ln">4065</span>        }
-</code><code id="L4066"><span class="ln">4066</span>        drag<span class="s"> = </span>[];
-</code><code id="L4067"><span class="ln">4067</span>    };
-</code><code id="L4068"><span class="ln">4068</span>    <b>for</b> (<b>var</b> i<span class="s"> = </span>events.length; i--;) {
-</code><code id="L4069"><span class="ln">4069</span>        (<b>function</b> (eventName) {
-</code><code id="L4070"><span class="ln">4070</span>            R[eventName]<span class="s"> = </span>Element.prototype[eventName]<span class="s"> = </span><b>function</b> (fn, scope) {
-</code><code id="L4071"><span class="ln">4071</span>                <b>if</b> (R.is(fn, <i>"<b>function</b>"</i>)) {
-</code><code id="L4072"><span class="ln">4072</span>                    <b>this</b>.events<span class="s"> = </span><b>this</b>.events<span class="s"> || </span>[];
-</code><code id="L4073"><span class="ln">4073</span>                    <b>this</b>.events.push({name: eventName, f: fn, unbind: addEvent(<b>this</b>.shape<span class="s"> || </span><b>this</b>.node<span class="s"> || </span>g.doc, eventName, fn, scope<span class="s"> || </span><b>this</b>)});
-</code><code id="L4074"><span class="ln">4074</span>                }
-</code><code id="L4075"><span class="ln">4075</span>                <b>return</b> <b>this</b>;
-</code><code id="L4076"><span class="ln">4076</span>            };
-</code><code id="L4077"><span class="ln">4077</span>            R[<i>"un"</i><span class="s"> + </span>eventName]<span class="s"> = </span>Element.prototype[<i>"un"</i><span class="s"> + </span>eventName]<span class="s"> = </span><b>function</b> (fn) {
-</code><code id="L4078"><span class="ln">4078</span>                <b>var</b> events<span class="s"> = </span><b>this</b>.events,
-</code><code id="L4079"><span class="ln">4079</span>                    l<span class="s"> = </span>events.length;
-</code><code id="L4080"><span class="ln">4080</span>                <b>while</b> (l--) <b>if</b> (events[l].name<span class="s"> == </span>eventName<span class="s"> &amp;&amp; </span>events[l].f<span class="s"> == </span>fn) {
-</code><code id="L4081"><span class="ln">4081</span>                    events[l].unbind();
-</code><code id="L4082"><span class="ln">4082</span>                    events.splice(l, <span class="d">1</span>);
-</code><code id="L4083"><span class="ln">4083</span>                    !events.length<span class="s"> &amp;&amp; </span><b>delete</b> <b>this</b>.events;
-</code><code id="L4084"><span class="ln">4084</span>                    <b>return</b> <b>this</b>;
-</code><code id="L4085"><span class="ln">4085</span>                }
-</code><code id="L4086"><span class="ln">4086</span>                <b>return</b> <b>this</b>;
-</code><code id="L4087"><span class="ln">4087</span>            };
-</code><code id="L4088"><span class="ln">4088</span>        })(events[i]);
-</code><code id="L4089"><span class="ln">4089</span>    }
-</code><code id="L4090"><span class="ln">4090</span><span class="c">    <span class="c">/*\</span>
-</span></code><code id="L4091"><span class="ln">4091</span><span class="c">    <span class="s"> * </span>Element.hover
-</span></code><code id="L4092"><span class="ln">4092</span><span class="c">     [ method ]
-</span></code><code id="L4093"><span class="ln">4093</span><span class="c">     **
-</span></code><code id="L4094"><span class="ln">4094</span><span class="c">    <span class="s"> * </span>Adds event handlers <b>for</b> hover <b>for</b> the element.
-</span></code><code id="L4095"><span class="ln">4095</span><span class="c">     > Parameters
-</span></code><code id="L4096"><span class="ln">4096</span><span class="c">    <span class="s"> - </span>f_in (<b>function</b>) handler <b>for</b> hover <b>in</b>
-</span></code><code id="L4097"><span class="ln">4097</span><span class="c">    <span class="s"> - </span>f_out (<b>function</b>) handler <b>for</b> hover out
-</span></code><code id="L4098"><span class="ln">4098</span><span class="c">    <span class="s"> - </span>icontext (object) #optional context <b>for</b> hover <b>in</b> handler
-</span></code><code id="L4099"><span class="ln">4099</span><span class="c">    <span class="s"> - </span>ocontext (object) #optional context <b>for</b> hover out handler
-</span></code><code id="L4100"><span class="ln">4100</span><span class="c">    <span class="s"> = </span>(object) @Element
-</span></code><code id="L4101"><span class="ln">4101</span><span class="c">    \*/</span>
-</code><code id="L4102"><span class="ln">4102</span>    elproto.hover<span class="s"> = </span><b>function</b> (f_in, f_out, scope_in, scope_out) {
-</code><code id="L4103"><span class="ln">4103</span>        <b>return</b> <b>this</b>.mouseover(f_in, scope_in).mouseout(f_out, scope_out<span class="s"> || </span>scope_in);
-</code><code id="L4104"><span class="ln">4104</span>    };
-</code><code id="L4105"><span class="ln">4105</span><span class="c">    <span class="c">/*\</span>
-</span></code><code id="L4106"><span class="ln">4106</span><span class="c">    <span class="s"> * </span>Element.unhover
-</span></code><code id="L4107"><span class="ln">4107</span><span class="c">     [ method ]
-</span></code><code id="L4108"><span class="ln">4108</span><span class="c">     **
-</span></code><code id="L4109"><span class="ln">4109</span><span class="c">    <span class="s"> * </span>Removes event handlers <b>for</b> hover <b>for</b> the element.
-</span></code><code id="L4110"><span class="ln">4110</span><span class="c">     > Parameters
-</span></code><code id="L4111"><span class="ln">4111</span><span class="c">    <span class="s"> - </span>f_in (<b>function</b>) handler <b>for</b> hover <b>in</b>
-</span></code><code id="L4112"><span class="ln">4112</span><span class="c">    <span class="s"> - </span>f_out (<b>function</b>) handler <b>for</b> hover out
-</span></code><code id="L4113"><span class="ln">4113</span><span class="c">    <span class="s"> = </span>(object) @Element
-</span></code><code id="L4114"><span class="ln">4114</span><span class="c">    \*/</span>
-</code><code id="L4115"><span class="ln">4115</span>    elproto.unhover<span class="s"> = </span><b>function</b> (f_in, f_out) {
-</code><code id="L4116"><span class="ln">4116</span>        <b>return</b> <b>this</b>.unmouseover(f_in).unmouseout(f_out);
-</code><code id="L4117"><span class="ln">4117</span>    };
-</code><code id="L4118"><span class="ln">4118</span><span class="c">    <span class="c">/*\</span>
-</span></code><code id="L4119"><span class="ln">4119</span><span class="c">    <span class="s"> * </span>Element.drag
-</span></code><code id="L4120"><span class="ln">4120</span><span class="c">     [ method ]
-</span></code><code id="L4121"><span class="ln">4121</span><span class="c">     **
-</span></code><code id="L4122"><span class="ln">4122</span><span class="c">    <span class="s"> * </span>Adds event handlers <b>for</b> drag of the element.
-</span></code><code id="L4123"><span class="ln">4123</span><span class="c">     > Parameters
-</span></code><code id="L4124"><span class="ln">4124</span><span class="c">    <span class="s"> - </span>onmove (<b>function</b>) handler <b>for</b> moving
-</span></code><code id="L4125"><span class="ln">4125</span><span class="c">    <span class="s"> - </span>onstart (<b>function</b>) handler <b>for</b> drag start
-</span></code><code id="L4126"><span class="ln">4126</span><span class="c">    <span class="s"> - </span>onend (<b>function</b>) handler <b>for</b> drag end
-</span></code><code id="L4127"><span class="ln">4127</span><span class="c">    <span class="s"> - </span>mcontext (object) #optional context <b>for</b> moving handler
-</span></code><code id="L4128"><span class="ln">4128</span><span class="c">    <span class="s"> - </span>scontext (object) #optional context <b>for</b> drag start handler
-</span></code><code id="L4129"><span class="ln">4129</span><span class="c">    <span class="s"> - </span>econtext (object) #optional context <b>for</b> drag end handler
-</span></code><code id="L4130"><span class="ln">4130</span><span class="c">    <span class="s"> * </span>Additionaly following `drag` events will be triggered: `drag.start.&lt;id>` on start, 
-</span></code><code id="L4131"><span class="ln">4131</span><span class="c">    <span class="s"> * </span>`drag.end.&lt;id>` on end and `drag.move.&lt;id>` on every move. When element will be dragged over another element 
-</span></code><code id="L4132"><span class="ln">4132</span><span class="c">    <span class="s"> * </span>`drag.over.&lt;id>` will be fired as well.
-</span></code><code id="L4133"><span class="ln">4133</span><span class="c">     *
-</span></code><code id="L4134"><span class="ln">4134</span><span class="c">    <span class="s"> * </span>Start event and start handler will be called <b>in</b> specified context or <b>in</b> context of the element <b>with</b> following parameters:
-</span></code><code id="L4135"><span class="ln">4135</span><span class="c">     o x (number) x position of the mouse
-</span></code><code id="L4136"><span class="ln">4136</span><span class="c">     o y (number) y position of the mouse
-</span></code><code id="L4137"><span class="ln">4137</span><span class="c">     o event (object) DOM event object
-</span></code><code id="L4138"><span class="ln">4138</span><span class="c">    <span class="s"> * </span>Move event and move handler will be called <b>in</b> specified context or <b>in</b> context of the element <b>with</b> following parameters:
-</span></code><code id="L4139"><span class="ln">4139</span><span class="c">     o dx (number) shift by x from the start point
-</span></code><code id="L4140"><span class="ln">4140</span><span class="c">     o dy (number) shift by y from the start point
-</span></code><code id="L4141"><span class="ln">4141</span><span class="c">     o x (number) x position of the mouse
-</span></code><code id="L4142"><span class="ln">4142</span><span class="c">     o y (number) y position of the mouse
-</span></code><code id="L4143"><span class="ln">4143</span><span class="c">     o event (object) DOM event object
-</span></code><code id="L4144"><span class="ln">4144</span><span class="c">    <span class="s"> * </span>End event and end handler will be called <b>in</b> specified context or <b>in</b> context of the element <b>with</b> following parameters:
-</span></code><code id="L4145"><span class="ln">4145</span><span class="c">     o event (object) DOM event object
+</code><code id="L3704"><span class="ln">3704</span>            <b>if</b> (element.node.nextSibling) {
+</code><code id="L3705"><span class="ln">3705</span>                element.node.parentNode.insertBefore(<b>this</b>.node, element.node.nextSibling);
+</code><code id="L3706"><span class="ln">3706</span>            } <b>else</b> {
+</code><code id="L3707"><span class="ln">3707</span>                element.node.parentNode.appendChild(<b>this</b>.node);
+</code><code id="L3708"><span class="ln">3708</span>            }
+</code><code id="L3709"><span class="ln">3709</span>            insertafter(<b>this</b>, element, <b>this</b>.paper);
+</code><code id="L3710"><span class="ln">3710</span>            <b>return</b> <b>this</b>;
+</code><code id="L3711"><span class="ln">3711</span>        };
+</code><code id="L3712"><span class="ln">3712</span>        elproto.insertBefore<span class="s"> = </span><b>function</b> (element) {
+</code><code id="L3713"><span class="ln">3713</span>            <b>if</b> (<b>this</b>.removed) {
+</code><code id="L3714"><span class="ln">3714</span>                <b>return</b> <b>this</b>;
+</code><code id="L3715"><span class="ln">3715</span>            }
+</code><code id="L3716"><span class="ln">3716</span>            <b>if</b> (element.constructor<span class="s"> == </span>Set) {
+</code><code id="L3717"><span class="ln">3717</span>                element<span class="s"> = </span>element[<span class="d">0</span>];
+</code><code id="L3718"><span class="ln">3718</span>            }
+</code><code id="L3719"><span class="ln">3719</span>            element.node.parentNode.insertBefore(<b>this</b>.node, element.node);
+</code><code id="L3720"><span class="ln">3720</span>            insertbefore(<b>this</b>, element, <b>this</b>.paper);
+</code><code id="L3721"><span class="ln">3721</span>            <b>return</b> <b>this</b>;
+</code><code id="L3722"><span class="ln">3722</span>        };
+</code><code id="L3723"><span class="ln">3723</span>        elproto.blur<span class="s"> = </span><b>function</b> (size) {
+</code><code id="L3724"><span class="ln">3724</span>            <b>var</b> s<span class="s"> = </span><b>this</b>.node.runtimeStyle,
+</code><code id="L3725"><span class="ln">3725</span>                f<span class="s"> = </span>s.filter;
+</code><code id="L3726"><span class="ln">3726</span>            f<span class="s"> = </span>f.replace(blurregexp, E);
+</code><code id="L3727"><span class="ln">3727</span>            <b>if</b> (+size !== <span class="d">0</span>) {
+</code><code id="L3728"><span class="ln">3728</span>                <b>this</b>.attrs.blur<span class="s"> = </span>size;
+</code><code id="L3729"><span class="ln">3729</span>                s.filter<span class="s"> = </span>f<span class="s"> + </span>S<span class="s"> + </span>ms<span class="s"> + </span><i>".Blur(pixelradius="</i><span class="s"> + </span>(+size<span class="s"> || </span><span class="d">1.5</span>)<span class="s"> + </span><i>")"</i>;
+</code><code id="L3730"><span class="ln">3730</span>                s.margin<span class="s"> = </span>R.format(<i>"-{<span class="d">0</span>}px <span class="d">0</span> <span class="d">0</span> -{<span class="d">0</span>}px"</i>, round(+size<span class="s"> || </span><span class="d">1.5</span>));
+</code><code id="L3731"><span class="ln">3731</span>            } <b>else</b> {
+</code><code id="L3732"><span class="ln">3732</span>                s.filter<span class="s"> = </span>f;
+</code><code id="L3733"><span class="ln">3733</span>                s.margin<span class="s"> = </span><span class="d">0</span>;
+</code><code id="L3734"><span class="ln">3734</span>                <b>delete</b> <b>this</b>.attrs.blur;
+</code><code id="L3735"><span class="ln">3735</span>            }
+</code><code id="L3736"><span class="ln">3736</span>        };
+</code><code id="L3737"><span class="ln">3737</span>
+</code><code id="L3738"><span class="ln">3738</span>        thePath<span class="s"> = </span><b>function</b> (pathString, vml) {
+</code><code id="L3739"><span class="ln">3739</span>            <b>var</b> el<span class="s"> = </span>createNode(<i>"shape"</i>);
+</code><code id="L3740"><span class="ln">3740</span>            el.style.cssText<span class="s"> = </span>cssDot;
+</code><code id="L3741"><span class="ln">3741</span>            el.coordsize<span class="s"> = </span>zoom<span class="s"> + </span>S<span class="s"> + </span>zoom;
+</code><code id="L3742"><span class="ln">3742</span>            el.coordorigin<span class="s"> = </span>vml.coordorigin;
+</code><code id="L3743"><span class="ln">3743</span>            <b>var</b> p<span class="s"> = </span><b>new</b> Element(el, vml),
+</code><code id="L3744"><span class="ln">3744</span>                attr<span class="s"> = </span>{fill: <i>"none"</i>, stroke: <i>"#<span class="d">000</span>"</i>};
+</code><code id="L3745"><span class="ln">3745</span>            pathString<span class="s"> &amp;&amp; </span>(attr.path<span class="s"> = </span>pathString);
+</code><code id="L3746"><span class="ln">3746</span>            p.type<span class="s"> = </span><i>"path"</i>;
+</code><code id="L3747"><span class="ln">3747</span>            p.path<span class="s"> = </span>[];
+</code><code id="L3748"><span class="ln">3748</span>            p.Path<span class="s"> = </span>E;
+</code><code id="L3749"><span class="ln">3749</span>            setFillAndStroke(p, attr);
+</code><code id="L3750"><span class="ln">3750</span>            vml.canvas.appendChild(el);
+</code><code id="L3751"><span class="ln">3751</span>            <b>var</b> skew<span class="s"> = </span>createNode(<i>"skew"</i>);
+</code><code id="L3752"><span class="ln">3752</span>            skew.on<span class="s"> = </span><b>true</b>;
+</code><code id="L3753"><span class="ln">3753</span>            el.appendChild(skew);
+</code><code id="L3754"><span class="ln">3754</span>            p.skew<span class="s"> = </span>skew;
+</code><code id="L3755"><span class="ln">3755</span>            p.transform(E);
+</code><code id="L3756"><span class="ln">3756</span>            <b>return</b> p;
+</code><code id="L3757"><span class="ln">3757</span>        };
+</code><code id="L3758"><span class="ln">3758</span>        theRect<span class="s"> = </span><b>function</b> (vml, x, y, w, h, r) {
+</code><code id="L3759"><span class="ln">3759</span>            <b>var</b> path<span class="s"> = </span>rectPath(x, y, w, h, r),
+</code><code id="L3760"><span class="ln">3760</span>                res<span class="s"> = </span>vml.path(path),
+</code><code id="L3761"><span class="ln">3761</span>                a<span class="s"> = </span>res.attrs;
+</code><code id="L3762"><span class="ln">3762</span>            res.X<span class="s"> = </span>a.x<span class="s"> = </span>x;
+</code><code id="L3763"><span class="ln">3763</span>            res.Y<span class="s"> = </span>a.y<span class="s"> = </span>y;
+</code><code id="L3764"><span class="ln">3764</span>            res.W<span class="s"> = </span>a.width<span class="s"> = </span>w;
+</code><code id="L3765"><span class="ln">3765</span>            res.H<span class="s"> = </span>a.height<span class="s"> = </span>h;
+</code><code id="L3766"><span class="ln">3766</span>            a.r<span class="s"> = </span>r;
+</code><code id="L3767"><span class="ln">3767</span>            a.path<span class="s"> = </span>path;
+</code><code id="L3768"><span class="ln">3768</span>            res.type<span class="s"> = </span><i>"rect"</i>;
+</code><code id="L3769"><span class="ln">3769</span>            <b>return</b> res;
+</code><code id="L3770"><span class="ln">3770</span>        };
+</code><code id="L3771"><span class="ln">3771</span>        theEllipse<span class="s"> = </span><b>function</b> (vml, x, y, rx, ry) {
+</code><code id="L3772"><span class="ln">3772</span>            <b>var</b> res<span class="s"> = </span>vml.path(),
+</code><code id="L3773"><span class="ln">3773</span>                a<span class="s"> = </span>res.attrs;
+</code><code id="L3774"><span class="ln">3774</span>            res.X<span class="s"> = </span>x<span class="s"> - </span>rx;
+</code><code id="L3775"><span class="ln">3775</span>            res.Y<span class="s"> = </span>y<span class="s"> - </span>ry;
+</code><code id="L3776"><span class="ln">3776</span>            res.W<span class="s"> = </span>rx<span class="s"> * </span><span class="d">2</span>;
+</code><code id="L3777"><span class="ln">3777</span>            res.H<span class="s"> = </span>ry<span class="s"> * </span><span class="d">2</span>;
+</code><code id="L3778"><span class="ln">3778</span>            res.type<span class="s"> = </span><i>"ellipse"</i>;
+</code><code id="L3779"><span class="ln">3779</span>            setFillAndStroke(res, {
+</code><code id="L3780"><span class="ln">3780</span>                cx: x,
+</code><code id="L3781"><span class="ln">3781</span>                cy: y,
+</code><code id="L3782"><span class="ln">3782</span>                rx: rx,
+</code><code id="L3783"><span class="ln">3783</span>                ry: ry
+</code><code id="L3784"><span class="ln">3784</span>            });
+</code><code id="L3785"><span class="ln">3785</span>            <b>return</b> res;
+</code><code id="L3786"><span class="ln">3786</span>        };
+</code><code id="L3787"><span class="ln">3787</span>        theCircle<span class="s"> = </span><b>function</b> (vml, x, y, r) {
+</code><code id="L3788"><span class="ln">3788</span>            <b>var</b> res<span class="s"> = </span>vml.path(),
+</code><code id="L3789"><span class="ln">3789</span>                a<span class="s"> = </span>res.attrs;
+</code><code id="L3790"><span class="ln">3790</span>            res.X<span class="s"> = </span>x<span class="s"> - </span>r;
+</code><code id="L3791"><span class="ln">3791</span>            res.Y<span class="s"> = </span>y<span class="s"> - </span>r;
+</code><code id="L3792"><span class="ln">3792</span>            res.W<span class="s"> = </span>res.H<span class="s"> = </span>r<span class="s"> * </span><span class="d">2</span>;
+</code><code id="L3793"><span class="ln">3793</span>            res.type<span class="s"> = </span><i>"circle"</i>;
+</code><code id="L3794"><span class="ln">3794</span>            setFillAndStroke(res, {
+</code><code id="L3795"><span class="ln">3795</span>                cx: x,
+</code><code id="L3796"><span class="ln">3796</span>                cy: y,
+</code><code id="L3797"><span class="ln">3797</span>                r: r
+</code><code id="L3798"><span class="ln">3798</span>            });
+</code><code id="L3799"><span class="ln">3799</span>            <b>return</b> res;
+</code><code id="L3800"><span class="ln">3800</span>        };
+</code><code id="L3801"><span class="ln">3801</span>        theImage<span class="s"> = </span><b>function</b> (vml, src, x, y, w, h) {
+</code><code id="L3802"><span class="ln">3802</span>            <b>var</b> path<span class="s"> = </span>rectPath(x, y, w, h),
+</code><code id="L3803"><span class="ln">3803</span>                res<span class="s"> = </span>vml.path(path).attr({stroke: <i>"none"</i>}),
+</code><code id="L3804"><span class="ln">3804</span>                a<span class="s"> = </span>res.attrs,
+</code><code id="L3805"><span class="ln">3805</span>                node<span class="s"> = </span>res.node,
+</code><code id="L3806"><span class="ln">3806</span>                fill<span class="s"> = </span>node.getElementsByTagName(fillString)[<span class="d">0</span>];
+</code><code id="L3807"><span class="ln">3807</span>            a.src<span class="s"> = </span>src;
+</code><code id="L3808"><span class="ln">3808</span>            res.X<span class="s"> = </span>a.x<span class="s"> = </span>x;
+</code><code id="L3809"><span class="ln">3809</span>            res.Y<span class="s"> = </span>a.y<span class="s"> = </span>y;
+</code><code id="L3810"><span class="ln">3810</span>            res.W<span class="s"> = </span>a.width<span class="s"> = </span>w;
+</code><code id="L3811"><span class="ln">3811</span>            res.H<span class="s"> = </span>a.height<span class="s"> = </span>h;
+</code><code id="L3812"><span class="ln">3812</span>            a.path<span class="s"> = </span>path;
+</code><code id="L3813"><span class="ln">3813</span>            res.type<span class="s"> = </span><i>"image"</i>;
+</code><code id="L3814"><span class="ln">3814</span>            fill.parentNode<span class="s"> == </span>node<span class="s"> &amp;&amp; </span>node.removeChild(fill);
+</code><code id="L3815"><span class="ln">3815</span>            fill.rotate<span class="s"> = </span><b>true</b>;
+</code><code id="L3816"><span class="ln">3816</span>            fill.src<span class="s"> = </span>src;
+</code><code id="L3817"><span class="ln">3817</span>            fill.type<span class="s"> = </span><i>"tile"</i>;
+</code><code id="L3818"><span class="ln">3818</span>            res._.fillpos<span class="s"> = </span>[x, y];
+</code><code id="L3819"><span class="ln">3819</span>            res._.fillsize<span class="s"> = </span>[w, h];
+</code><code id="L3820"><span class="ln">3820</span>            node.appendChild(fill);
+</code><code id="L3821"><span class="ln">3821</span>            setCoords(res);
+</code><code id="L3822"><span class="ln">3822</span>            <b>return</b> res;
+</code><code id="L3823"><span class="ln">3823</span>        };
+</code><code id="L3824"><span class="ln">3824</span>        theText<span class="s"> = </span><b>function</b> (vml, x, y, text) {
+</code><code id="L3825"><span class="ln">3825</span>            <b>var</b> el<span class="s"> = </span>createNode(<i>"shape"</i>),
+</code><code id="L3826"><span class="ln">3826</span>                path<span class="s"> = </span>createNode(<i>"path"</i>),
+</code><code id="L3827"><span class="ln">3827</span>                o<span class="s"> = </span>createNode(<i>"textpath"</i>);
+</code><code id="L3828"><span class="ln">3828</span>            x<span class="s"> = </span>x<span class="s"> || </span><span class="d">0</span>;
+</code><code id="L3829"><span class="ln">3829</span>            y<span class="s"> = </span>y<span class="s"> || </span><span class="d">0</span>;
+</code><code id="L3830"><span class="ln">3830</span>            text<span class="s"> = </span>text<span class="s"> || </span><i>""</i>;
+</code><code id="L3831"><span class="ln">3831</span>            path.v<span class="s"> = </span>R.format(<i>"m{<span class="d">0</span>},{<span class="d">1</span>}l{<span class="d">2</span>},{<span class="d">1</span>}"</i>, round(x<span class="s"> * </span>zoom), round(y<span class="s"> * </span>zoom), round(x<span class="s"> * </span>zoom)<span class="s"> + </span><span class="d">1</span>);
+</code><code id="L3832"><span class="ln">3832</span>            path.textpathok<span class="s"> = </span><b>true</b>;
+</code><code id="L3833"><span class="ln">3833</span>            o.string<span class="s"> = </span>Str(text);
+</code><code id="L3834"><span class="ln">3834</span>            o.on<span class="s"> = </span><b>true</b>;
+</code><code id="L3835"><span class="ln">3835</span>            el.style.cssText<span class="s"> = </span><i>"position:absolute;left:<span class="d">0</span>;top:<span class="d">0</span>;width:<span class="d">1</span>;height:<span class="d">1</span>"</i>;
+</code><code id="L3836"><span class="ln">3836</span>            el.coordsize<span class="s"> = </span>zoom<span class="s"> + </span>S<span class="s"> + </span>zoom;
+</code><code id="L3837"><span class="ln">3837</span>            el.coordorigin<span class="s"> = </span><i>"<span class="d">0</span> <span class="d">0</span>"</i>;
+</code><code id="L3838"><span class="ln">3838</span>            <b>var</b> p<span class="s"> = </span><b>new</b> Element(el, vml),
+</code><code id="L3839"><span class="ln">3839</span>                attr<span class="s"> = </span>{fill: <i>"#<span class="d">000</span>"</i>, stroke: <i>"none"</i>, font: availableAttrs.font, text: text};
+</code><code id="L3840"><span class="ln">3840</span>            p.shape<span class="s"> = </span>el;
+</code><code id="L3841"><span class="ln">3841</span>            p.path<span class="s"> = </span>path;
+</code><code id="L3842"><span class="ln">3842</span>            p.textpath<span class="s"> = </span>o;
+</code><code id="L3843"><span class="ln">3843</span>            p.type<span class="s"> = </span><i>"text"</i>;
+</code><code id="L3844"><span class="ln">3844</span>            p.attrs.text<span class="s"> = </span>Str(text);
+</code><code id="L3845"><span class="ln">3845</span>            p.attrs.x<span class="s"> = </span>x;
+</code><code id="L3846"><span class="ln">3846</span>            p.attrs.y<span class="s"> = </span>y;
+</code><code id="L3847"><span class="ln">3847</span>            p.attrs.w<span class="s"> = </span><span class="d">1</span>;
+</code><code id="L3848"><span class="ln">3848</span>            p.attrs.h<span class="s"> = </span><span class="d">1</span>;
+</code><code id="L3849"><span class="ln">3849</span>            setFillAndStroke(p, attr);
+</code><code id="L3850"><span class="ln">3850</span>            el.appendChild(o);
+</code><code id="L3851"><span class="ln">3851</span>            el.appendChild(path);
+</code><code id="L3852"><span class="ln">3852</span>            vml.canvas.appendChild(el);
+</code><code id="L3853"><span class="ln">3853</span>            <b>var</b> skew<span class="s"> = </span>createNode(<i>"skew"</i>);
+</code><code id="L3854"><span class="ln">3854</span>            skew.on<span class="s"> = </span><b>true</b>;
+</code><code id="L3855"><span class="ln">3855</span>            el.appendChild(skew);
+</code><code id="L3856"><span class="ln">3856</span>            p.skew<span class="s"> = </span>skew;
+</code><code id="L3857"><span class="ln">3857</span>            p.transform(E);
+</code><code id="L3858"><span class="ln">3858</span>            <b>return</b> p;
+</code><code id="L3859"><span class="ln">3859</span>        };
+</code><code id="L3860"><span class="ln">3860</span>        setSize<span class="s"> = </span><b>function</b> (width, height) {
+</code><code id="L3861"><span class="ln">3861</span>            <b>var</b> cs<span class="s"> = </span><b>this</b>.canvas.style;
+</code><code id="L3862"><span class="ln">3862</span>            <b>this</b>.width<span class="s"> = </span>width;
+</code><code id="L3863"><span class="ln">3863</span>            <b>this</b>.height<span class="s"> = </span>height;
+</code><code id="L3864"><span class="ln">3864</span>            width<span class="s"> == </span>+width<span class="s"> &amp;&amp; </span>(width += <i>"px"</i>);
+</code><code id="L3865"><span class="ln">3865</span>            height<span class="s"> == </span>+height<span class="s"> &amp;&amp; </span>(height += <i>"px"</i>);
+</code><code id="L3866"><span class="ln">3866</span>            cs.width<span class="s"> = </span>width;
+</code><code id="L3867"><span class="ln">3867</span>            cs.height<span class="s"> = </span>height;
+</code><code id="L3868"><span class="ln">3868</span>            cs.clip<span class="s"> = </span><i>"rect(<span class="d">0</span> "</i><span class="s"> + </span>width<span class="s"> + </span><i>" "</i><span class="s"> + </span>height<span class="s"> + </span><i>" <span class="d">0</span>)"</i>;
+</code><code id="L3869"><span class="ln">3869</span>            <b>if</b> (<b>this</b>._viewBox) {
+</code><code id="L3870"><span class="ln">3870</span>                setViewBox.apply(<b>this</b>, <b>this</b>._viewBox);
+</code><code id="L3871"><span class="ln">3871</span>            }
+</code><code id="L3872"><span class="ln">3872</span>            <b>return</b> <b>this</b>;
+</code><code id="L3873"><span class="ln">3873</span>        };
+</code><code id="L3874"><span class="ln">3874</span>        setViewBox<span class="s"> = </span><b>function</b> (x, y, w, h, fit) {
+</code><code id="L3875"><span class="ln">3875</span>            eve(<i>"setViewBox"</i>, <b>this</b>, <b>this</b>._viewBox, [x, y, w, h, fit]);
+</code><code id="L3876"><span class="ln">3876</span>            <b>var</b> width<span class="s"> = </span><b>this</b>.width,
+</code><code id="L3877"><span class="ln">3877</span>                height<span class="s"> = </span><b>this</b>.height,
+</code><code id="L3878"><span class="ln">3878</span>                size<span class="s"> = </span><span class="d">1e3</span><span class="s"> * </span>mmax(w<span class="s"> / </span>width, h<span class="s"> / </span>height),
+</code><code id="L3879"><span class="ln">3879</span>                H, W;
+</code><code id="L3880"><span class="ln">3880</span>            <b>if</b> (fit) {
+</code><code id="L3881"><span class="ln">3881</span>                H<span class="s"> = </span>height<span class="s"> / </span>h;
+</code><code id="L3882"><span class="ln">3882</span>                W<span class="s"> = </span>width<span class="s"> / </span>w;
+</code><code id="L3883"><span class="ln">3883</span>                <b>if</b> (w<span class="s"> * </span>H &lt; width) {
+</code><code id="L3884"><span class="ln">3884</span>                    x -= (width<span class="s"> - </span>w<span class="s"> * </span>H)<span class="s"> / </span><span class="d">2</span><span class="s"> / </span>H;
+</code><code id="L3885"><span class="ln">3885</span>                }
+</code><code id="L3886"><span class="ln">3886</span>                <b>if</b> (h<span class="s"> * </span>W &lt; height) {
+</code><code id="L3887"><span class="ln">3887</span>                    y -= (height<span class="s"> - </span>h<span class="s"> * </span>W)<span class="s"> / </span><span class="d">2</span><span class="s"> / </span>W;
+</code><code id="L3888"><span class="ln">3888</span>                }
+</code><code id="L3889"><span class="ln">3889</span>            }
+</code><code id="L3890"><span class="ln">3890</span>            <b>this</b>._viewBox<span class="s"> = </span>[x, y, w, h, !!fit];
+</code><code id="L3891"><span class="ln">3891</span>            <b>this</b>.forEach(<b>function</b> (el) {
+</code><code id="L3892"><span class="ln">3892</span>                el.transform(<i>"..."</i>);
+</code><code id="L3893"><span class="ln">3893</span>            });
+</code><code id="L3894"><span class="ln">3894</span>            <b>return</b> <b>this</b>;
+</code><code id="L3895"><span class="ln">3895</span>        };
+</code><code id="L3896"><span class="ln">3896</span>        <b>var</b> createNode,
+</code><code id="L3897"><span class="ln">3897</span>            initWin<span class="s"> = </span><b>function</b> (win) {
+</code><code id="L3898"><span class="ln">3898</span>                <b>var</b> doc<span class="s"> = </span>win.document;
+</code><code id="L3899"><span class="ln">3899</span>                doc.createStyleSheet().addRule(<i>".rvml"</i>, <i>"behavior:url(#<b>default</b>#VML)"</i>);
+</code><code id="L3900"><span class="ln">3900</span>                <b>try</b> {
+</code><code id="L3901"><span class="ln">3901</span>                    !doc.namespaces.rvml<span class="s"> &amp;&amp; </span>doc.namespaces.add(<i>"rvml"</i>, <i>"urn:schemas-microsoft-com:vml"</i>);
+</code><code id="L3902"><span class="ln">3902</span>                    createNode<span class="s"> = </span><b>function</b> (tagName) {
+</code><code id="L3903"><span class="ln">3903</span>                        <b>return</b> doc.createElement(<i>'&lt;rvml:'</i><span class="s"> + </span>tagName<span class="s"> + </span><i>' <b>class</b>="rvml">'</i>);
+</code><code id="L3904"><span class="ln">3904</span>                    };
+</code><code id="L3905"><span class="ln">3905</span>                } <b>catch</b> (e) {
+</code><code id="L3906"><span class="ln">3906</span>                    createNode<span class="s"> = </span><b>function</b> (tagName) {
+</code><code id="L3907"><span class="ln">3907</span>                        <b>return</b> doc.createElement(<i>'&lt;'</i><span class="s"> + </span>tagName<span class="s"> + </span><i>' xmlns="urn:schemas-microsoft.com:vml" <b>class</b>="rvml">'</i>);
+</code><code id="L3908"><span class="ln">3908</span>                    };
+</code><code id="L3909"><span class="ln">3909</span>                }
+</code><code id="L3910"><span class="ln">3910</span>            };
+</code><code id="L3911"><span class="ln">3911</span>        initWin(g.win);
+</code><code id="L3912"><span class="ln">3912</span>        create<span class="s"> = </span><b>function</b> () {
+</code><code id="L3913"><span class="ln">3913</span>            <b>var</b> con<span class="s"> = </span>getContainer[apply](<span class="d">0</span>, arguments),
+</code><code id="L3914"><span class="ln">3914</span>                container<span class="s"> = </span>con.container,
+</code><code id="L3915"><span class="ln">3915</span>                height<span class="s"> = </span>con.height,
+</code><code id="L3916"><span class="ln">3916</span>                s,
+</code><code id="L3917"><span class="ln">3917</span>                width<span class="s"> = </span>con.width,
+</code><code id="L3918"><span class="ln">3918</span>                x<span class="s"> = </span>con.x,
+</code><code id="L3919"><span class="ln">3919</span>                y<span class="s"> = </span>con.y;
+</code><code id="L3920"><span class="ln">3920</span>            <b>if</b> (!container) {
+</code><code id="L3921"><span class="ln">3921</span>                <b>throw</b> <b>new</b> Error(<i>"VML container not found."</i>);
+</code><code id="L3922"><span class="ln">3922</span>            }
+</code><code id="L3923"><span class="ln">3923</span>            <b>var</b> res<span class="s"> = </span><b>new</b> Paper,
+</code><code id="L3924"><span class="ln">3924</span>                c<span class="s"> = </span>res.canvas<span class="s"> = </span>g.doc.createElement(<i>"div"</i>),
+</code><code id="L3925"><span class="ln">3925</span>                cs<span class="s"> = </span>c.style;
+</code><code id="L3926"><span class="ln">3926</span>            x<span class="s"> = </span>x<span class="s"> || </span><span class="d">0</span>;
+</code><code id="L3927"><span class="ln">3927</span>            y<span class="s"> = </span>y<span class="s"> || </span><span class="d">0</span>;
+</code><code id="L3928"><span class="ln">3928</span>            width<span class="s"> = </span>width<span class="s"> || </span><span class="d">512</span>;
+</code><code id="L3929"><span class="ln">3929</span>            height<span class="s"> = </span>height<span class="s"> || </span><span class="d">342</span>;
+</code><code id="L3930"><span class="ln">3930</span>            res.width<span class="s"> = </span>width;
+</code><code id="L3931"><span class="ln">3931</span>            res.height<span class="s"> = </span>height;
+</code><code id="L3932"><span class="ln">3932</span>            width<span class="s"> == </span>+width<span class="s"> &amp;&amp; </span>(width += <i>"px"</i>);
+</code><code id="L3933"><span class="ln">3933</span>            height<span class="s"> == </span>+height<span class="s"> &amp;&amp; </span>(height += <i>"px"</i>);
+</code><code id="L3934"><span class="ln">3934</span>            res.coordsize<span class="s"> = </span>zoom<span class="s"> * </span><span class="d">1e3</span><span class="s"> + </span>S<span class="s"> + </span>zoom<span class="s"> * </span><span class="d">1e3</span>;
+</code><code id="L3935"><span class="ln">3935</span>            res.coordorigin<span class="s"> = </span><i>"<span class="d">0</span> <span class="d">0</span>"</i>;
+</code><code id="L3936"><span class="ln">3936</span>            res.span<span class="s"> = </span>g.doc.createElement(<i>"span"</i>);
+</code><code id="L3937"><span class="ln">3937</span>            res.span.style.cssText<span class="s"> = </span><i>"position:absolute;left:-9999em;top:-9999em;padding:<span class="d">0</span>;margin:<span class="d">0</span>;line-height:<span class="d">1</span>;"</i>;
+</code><code id="L3938"><span class="ln">3938</span>            c.appendChild(res.span);
+</code><code id="L3939"><span class="ln">3939</span>            cs.cssText<span class="s"> = </span>R.format(<i>"top:<span class="d">0</span>;left:<span class="d">0</span>;width:{<span class="d">0</span>};height:{<span class="d">1</span>};display:inline-block;position:relative;clip:rect(<span class="d">0</span> {<span class="d">0</span>} {<span class="d">1</span>} <span class="d">0</span>);overflow:hidden"</i>, width, height);
+</code><code id="L3940"><span class="ln">3940</span>            <b>if</b> (container<span class="s"> == </span><span class="d">1</span>) {
+</code><code id="L3941"><span class="ln">3941</span>                g.doc.body.appendChild(c);
+</code><code id="L3942"><span class="ln">3942</span>                cs.left<span class="s"> = </span>x<span class="s"> + </span><i>"px"</i>;
+</code><code id="L3943"><span class="ln">3943</span>                cs.top<span class="s"> = </span>y<span class="s"> + </span><i>"px"</i>;
+</code><code id="L3944"><span class="ln">3944</span>                cs.position<span class="s"> = </span><i>"absolute"</i>;
+</code><code id="L3945"><span class="ln">3945</span>            } <b>else</b> {
+</code><code id="L3946"><span class="ln">3946</span>                <b>if</b> (container.firstChild) {
+</code><code id="L3947"><span class="ln">3947</span>                    container.insertBefore(c, container.firstChild);
+</code><code id="L3948"><span class="ln">3948</span>                } <b>else</b> {
+</code><code id="L3949"><span class="ln">3949</span>                    container.appendChild(c);
+</code><code id="L3950"><span class="ln">3950</span>                }
+</code><code id="L3951"><span class="ln">3951</span>            }
+</code><code id="L3952"><span class="ln">3952</span>            plugins.call(res, res, R.fn);
+</code><code id="L3953"><span class="ln">3953</span>            res.renderfix<span class="s"> = </span>fun;
+</code><code id="L3954"><span class="ln">3954</span>            <b>return</b> res;
+</code><code id="L3955"><span class="ln">3955</span>        };
+</code><code id="L3956"><span class="ln">3956</span>        paperproto.clear<span class="s"> = </span><b>function</b> () {
+</code><code id="L3957"><span class="ln">3957</span>            eve(<i>"clear"</i>, <b>this</b>);
+</code><code id="L3958"><span class="ln">3958</span>            <b>this</b>.canvas.innerHTML<span class="s"> = </span>E;
+</code><code id="L3959"><span class="ln">3959</span>            <b>this</b>.span<span class="s"> = </span>g.doc.createElement(<i>"span"</i>);
+</code><code id="L3960"><span class="ln">3960</span>            <b>this</b>.span.style.cssText<span class="s"> = </span><i>"position:absolute;left:-9999em;top:-9999em;padding:<span class="d">0</span>;margin:<span class="d">0</span>;line-height:<span class="d">1</span>;display:inline;"</i>;
+</code><code id="L3961"><span class="ln">3961</span>            <b>this</b>.canvas.appendChild(<b>this</b>.span);
+</code><code id="L3962"><span class="ln">3962</span>            <b>this</b>.bottom<span class="s"> = </span><b>this</b>.top<span class="s"> = </span><b>null</b>;
+</code><code id="L3963"><span class="ln">3963</span>        };
+</code><code id="L3964"><span class="ln">3964</span>        paperproto.remove<span class="s"> = </span><b>function</b> () {
+</code><code id="L3965"><span class="ln">3965</span>            eve(<i>"remove"</i>, <b>this</b>);
+</code><code id="L3966"><span class="ln">3966</span>            <b>this</b>.canvas.parentNode.removeChild(<b>this</b>.canvas);
+</code><code id="L3967"><span class="ln">3967</span>            <b>for</b> (<b>var</b> i <b>in</b> <b>this</b>) {
+</code><code id="L3968"><span class="ln">3968</span>                <b>this</b>[i]<span class="s"> = </span>removed(i);
+</code><code id="L3969"><span class="ln">3969</span>            }
+</code><code id="L3970"><span class="ln">3970</span>            <b>return</b> <b>true</b>;
+</code><code id="L3971"><span class="ln">3971</span>        };
+</code><code id="L3972"><span class="ln">3972</span>    }
+</code><code id="L3973"><span class="ln">3973</span> 
+</code><code id="L3974"><span class="ln">3974</span>    <span class="c">// WebKit rendering bug workaround method</span>
+</code><code id="L3975"><span class="ln">3975</span>    <b>var</b> version<span class="s"> = </span>navigator.userAgent.match(/Version\/(.*?)\s/)<span class="s"> || </span>navigator.userAgent.match(/Chrome\/(\d+)/);
+</code><code id="L3976"><span class="ln">3976</span>    <b>if</b> ((navigator.vendor<span class="s"> == </span><i>"Apple Computer, Inc."</i>)<span class="s"> &amp;&amp; </span>(version<span class="s"> &amp;&amp; </span>version[<span class="d">1</span>] &lt; <span class="d">4</span><span class="s"> || </span>navigator.platform.slice(<span class="d">0</span>, <span class="d">2</span>)<span class="s"> == </span><i>"iP"</i>) ||
+</code><code id="L3977"><span class="ln">3977</span>        (navigator.vendor<span class="s"> == </span><i>"Google Inc."</i><span class="s"> &amp;&amp; </span>version<span class="s"> &amp;&amp; </span>version[<span class="d">1</span>] &lt; <span class="d">8</span>)) {
+</code><code id="L3978"><span class="ln">3978</span><span class="c">        <span class="c">/*\</span>
+</span></code><code id="L3979"><span class="ln">3979</span><span class="c">        <span class="s"> * </span>Paper.safari
+</span></code><code id="L3980"><span class="ln">3980</span><span class="c">         [ method ]
+</span></code><code id="L3981"><span class="ln">3981</span><span class="c">         **
+</span></code><code id="L3982"><span class="ln">3982</span><span class="c">        <span class="s"> * </span>There is an inconvenient rendering bug <b>in</b> Safari (WebKit):
+</span></code><code id="L3983"><span class="ln">3983</span><span class="c">        <span class="s"> * </span>sometimes the rendering should be forced.
+</span></code><code id="L3984"><span class="ln">3984</span><span class="c">        <span class="s"> * </span>This method should help <b>with</b> dealing <b>with</b> <b>this</b> bug.
+</span></code><code id="L3985"><span class="ln">3985</span><span class="c">        \*/</span>
+</code><code id="L3986"><span class="ln">3986</span>        paperproto.safari<span class="s"> = </span><b>function</b> () {
+</code><code id="L3987"><span class="ln">3987</span>            <b>var</b> rect<span class="s"> = </span><b>this</b>.rect(-<span class="d">99</span>, -<span class="d">99</span>, <b>this</b>.width<span class="s"> + </span><span class="d">99</span>, <b>this</b>.height<span class="s"> + </span><span class="d">99</span>).attr({stroke: <i>"none"</i>});
+</code><code id="L3988"><span class="ln">3988</span>            setTimeout(<b>function</b> () {rect.remove();});
+</code><code id="L3989"><span class="ln">3989</span>        };
+</code><code id="L3990"><span class="ln">3990</span>    } <b>else</b> {
+</code><code id="L3991"><span class="ln">3991</span>        paperproto.safari<span class="s"> = </span>fun;
+</code><code id="L3992"><span class="ln">3992</span>    }
+</code><code id="L3993"><span class="ln">3993</span> 
+</code><code id="L3994"><span class="ln">3994</span>    <span class="c">// Events</span>
+</code><code id="L3995"><span class="ln">3995</span>    <b>var</b> preventDefault<span class="s"> = </span><b>function</b> () {
+</code><code id="L3996"><span class="ln">3996</span>        <b>this</b>.returnValue<span class="s"> = </span><b>false</b>;
+</code><code id="L3997"><span class="ln">3997</span>    },
+</code><code id="L3998"><span class="ln">3998</span>    preventTouch<span class="s"> = </span><b>function</b> () {
+</code><code id="L3999"><span class="ln">3999</span>        <b>return</b> <b>this</b>.originalEvent.preventDefault();
+</code><code id="L4000"><span class="ln">4000</span>    },
+</code><code id="L4001"><span class="ln">4001</span>    stopPropagation<span class="s"> = </span><b>function</b> () {
+</code><code id="L4002"><span class="ln">4002</span>        <b>this</b>.cancelBubble<span class="s"> = </span><b>true</b>;
+</code><code id="L4003"><span class="ln">4003</span>    },
+</code><code id="L4004"><span class="ln">4004</span>    stopTouch<span class="s"> = </span><b>function</b> () {
+</code><code id="L4005"><span class="ln">4005</span>        <b>return</b> <b>this</b>.originalEvent.stopPropagation();
+</code><code id="L4006"><span class="ln">4006</span>    },
+</code><code id="L4007"><span class="ln">4007</span>    addEvent<span class="s"> = </span>(<b>function</b> () {
+</code><code id="L4008"><span class="ln">4008</span>        <b>if</b> (g.doc.addEventListener) {
+</code><code id="L4009"><span class="ln">4009</span>            <b>return</b> <b>function</b> (obj, type, fn, element) {
+</code><code id="L4010"><span class="ln">4010</span>                <b>var</b> realName<span class="s"> = </span>supportsTouch<span class="s"> &amp;&amp; </span>touchMap[type] ? touchMap[type] : type;
+</code><code id="L4011"><span class="ln">4011</span>                <b>var</b> f<span class="s"> = </span><b>function</b> (e) {
+</code><code id="L4012"><span class="ln">4012</span>                    <b>if</b> (supportsTouch<span class="s"> &amp;&amp; </span>touchMap[has](type)) {
+</code><code id="L4013"><span class="ln">4013</span>                        <b>for</b> (<b>var</b> i<span class="s"> = </span><span class="d">0</span>, ii<span class="s"> = </span>e.targetTouches<span class="s"> &amp;&amp; </span>e.targetTouches.length; i &lt; ii; i++) {
+</code><code id="L4014"><span class="ln">4014</span>                            <b>if</b> (e.targetTouches[i].target<span class="s"> == </span>obj) {
+</code><code id="L4015"><span class="ln">4015</span>                                <b>var</b> olde<span class="s"> = </span>e;
+</code><code id="L4016"><span class="ln">4016</span>                                e<span class="s"> = </span>e.targetTouches[i];
+</code><code id="L4017"><span class="ln">4017</span>                                e.originalEvent<span class="s"> = </span>olde;
+</code><code id="L4018"><span class="ln">4018</span>                                e.preventDefault<span class="s"> = </span>preventTouch;
+</code><code id="L4019"><span class="ln">4019</span>                                e.stopPropagation<span class="s"> = </span>stopTouch;
+</code><code id="L4020"><span class="ln">4020</span>                                <b>break</b>;
+</code><code id="L4021"><span class="ln">4021</span>                            }
+</code><code id="L4022"><span class="ln">4022</span>                        }
+</code><code id="L4023"><span class="ln">4023</span>                    }
+</code><code id="L4024"><span class="ln">4024</span>                    <b>return</b> fn.call(element, e);
+</code><code id="L4025"><span class="ln">4025</span>                };
+</code><code id="L4026"><span class="ln">4026</span>                obj.addEventListener(realName, f, <b>false</b>);
+</code><code id="L4027"><span class="ln">4027</span>                <b>return</b> <b>function</b> () {
+</code><code id="L4028"><span class="ln">4028</span>                    obj.removeEventListener(realName, f, <b>false</b>);
+</code><code id="L4029"><span class="ln">4029</span>                    <b>return</b> <b>true</b>;
+</code><code id="L4030"><span class="ln">4030</span>                };
+</code><code id="L4031"><span class="ln">4031</span>            };
+</code><code id="L4032"><span class="ln">4032</span>        } <b>else</b> <b>if</b> (g.doc.attachEvent) {
+</code><code id="L4033"><span class="ln">4033</span>            <b>return</b> <b>function</b> (obj, type, fn, element) {
+</code><code id="L4034"><span class="ln">4034</span>                <b>var</b> f<span class="s"> = </span><b>function</b> (e) {
+</code><code id="L4035"><span class="ln">4035</span>                    e<span class="s"> = </span>e<span class="s"> || </span>g.win.event;
+</code><code id="L4036"><span class="ln">4036</span>                    e.preventDefault<span class="s"> = </span>e.preventDefault<span class="s"> || </span>preventDefault;
+</code><code id="L4037"><span class="ln">4037</span>                    e.stopPropagation<span class="s"> = </span>e.stopPropagation<span class="s"> || </span>stopPropagation;
+</code><code id="L4038"><span class="ln">4038</span>                    <b>return</b> fn.call(element, e);
+</code><code id="L4039"><span class="ln">4039</span>                };
+</code><code id="L4040"><span class="ln">4040</span>                obj.attachEvent(<i>"on"</i><span class="s"> + </span>type, f);
+</code><code id="L4041"><span class="ln">4041</span>                <b>var</b> detacher<span class="s"> = </span><b>function</b> () {
+</code><code id="L4042"><span class="ln">4042</span>                    obj.detachEvent(<i>"on"</i><span class="s"> + </span>type, f);
+</code><code id="L4043"><span class="ln">4043</span>                    <b>return</b> <b>true</b>;
+</code><code id="L4044"><span class="ln">4044</span>                };
+</code><code id="L4045"><span class="ln">4045</span>                <b>return</b> detacher;
+</code><code id="L4046"><span class="ln">4046</span>            };
+</code><code id="L4047"><span class="ln">4047</span>        }
+</code><code id="L4048"><span class="ln">4048</span>    })(),
+</code><code id="L4049"><span class="ln">4049</span>    drag<span class="s"> = </span>[],
+</code><code id="L4050"><span class="ln">4050</span>    dragMove<span class="s"> = </span><b>function</b> (e) {
+</code><code id="L4051"><span class="ln">4051</span>        <b>var</b> x<span class="s"> = </span>e.clientX,
+</code><code id="L4052"><span class="ln">4052</span>            y<span class="s"> = </span>e.clientY,
+</code><code id="L4053"><span class="ln">4053</span>            scrollY<span class="s"> = </span>g.doc.documentElement.scrollTop<span class="s"> || </span>g.doc.body.scrollTop,
+</code><code id="L4054"><span class="ln">4054</span>            scrollX<span class="s"> = </span>g.doc.documentElement.scrollLeft<span class="s"> || </span>g.doc.body.scrollLeft,
+</code><code id="L4055"><span class="ln">4055</span>            dragi,
+</code><code id="L4056"><span class="ln">4056</span>            j<span class="s"> = </span>drag.length;
+</code><code id="L4057"><span class="ln">4057</span>        <b>while</b> (j--) {
+</code><code id="L4058"><span class="ln">4058</span>            dragi<span class="s"> = </span>drag[j];
+</code><code id="L4059"><span class="ln">4059</span>            <b>if</b> (supportsTouch) {
+</code><code id="L4060"><span class="ln">4060</span>                <b>var</b> i<span class="s"> = </span>e.touches.length,
+</code><code id="L4061"><span class="ln">4061</span>                    touch;
+</code><code id="L4062"><span class="ln">4062</span>                <b>while</b> (i--) {
+</code><code id="L4063"><span class="ln">4063</span>                    touch<span class="s"> = </span>e.touches[i];
+</code><code id="L4064"><span class="ln">4064</span>                    <b>if</b> (touch.identifier<span class="s"> == </span>dragi.el._drag.id) {
+</code><code id="L4065"><span class="ln">4065</span>                        x<span class="s"> = </span>touch.clientX;
+</code><code id="L4066"><span class="ln">4066</span>                        y<span class="s"> = </span>touch.clientY;
+</code><code id="L4067"><span class="ln">4067</span>                        (e.originalEvent ? e.originalEvent : e).preventDefault();
+</code><code id="L4068"><span class="ln">4068</span>                        <b>break</b>;
+</code><code id="L4069"><span class="ln">4069</span>                    }
+</code><code id="L4070"><span class="ln">4070</span>                }
+</code><code id="L4071"><span class="ln">4071</span>            } <b>else</b> {
+</code><code id="L4072"><span class="ln">4072</span>                e.preventDefault();
+</code><code id="L4073"><span class="ln">4073</span>            }
+</code><code id="L4074"><span class="ln">4074</span>            <b>var</b> node<span class="s"> = </span>dragi.el.node,
+</code><code id="L4075"><span class="ln">4075</span>                o,
+</code><code id="L4076"><span class="ln">4076</span>                next<span class="s"> = </span>node.nextSibling,
+</code><code id="L4077"><span class="ln">4077</span>                parent<span class="s"> = </span>node.parentNode,
+</code><code id="L4078"><span class="ln">4078</span>                display<span class="s"> = </span>node.style.display;
+</code><code id="L4079"><span class="ln">4079</span>            g.win.opera<span class="s"> &amp;&amp; </span>parent.removeChild(node);
+</code><code id="L4080"><span class="ln">4080</span>            node.style.display<span class="s"> = </span><i>"none"</i>;
+</code><code id="L4081"><span class="ln">4081</span>            o<span class="s"> = </span>dragi.el.paper.getElementByPoint(x, y);
+</code><code id="L4082"><span class="ln">4082</span>            node.style.display<span class="s"> = </span>display;
+</code><code id="L4083"><span class="ln">4083</span>            g.win.opera<span class="s"> &amp;&amp; </span>(next ? parent.insertBefore(node, next) : parent.appendChild(node));
+</code><code id="L4084"><span class="ln">4084</span>            o<span class="s"> &amp;&amp; </span>eve(<i>"drag.over."</i><span class="s"> + </span>dragi.el.id, dragi.el, o);
+</code><code id="L4085"><span class="ln">4085</span>            x += scrollX;
+</code><code id="L4086"><span class="ln">4086</span>            y += scrollY;
+</code><code id="L4087"><span class="ln">4087</span>            eve(<i>"drag.move."</i><span class="s"> + </span>dragi.el.id, dragi.move_scope<span class="s"> || </span>dragi.el, x<span class="s"> - </span>dragi.el._drag.x, y<span class="s"> - </span>dragi.el._drag.y, x, y, e);
+</code><code id="L4088"><span class="ln">4088</span>        }
+</code><code id="L4089"><span class="ln">4089</span>    },
+</code><code id="L4090"><span class="ln">4090</span>    dragUp<span class="s"> = </span><b>function</b> (e) {
+</code><code id="L4091"><span class="ln">4091</span>        R.unmousemove(dragMove).unmouseup(dragUp);
+</code><code id="L4092"><span class="ln">4092</span>        <b>var</b> i<span class="s"> = </span>drag.length,
+</code><code id="L4093"><span class="ln">4093</span>            dragi;
+</code><code id="L4094"><span class="ln">4094</span>        <b>while</b> (i--) {
+</code><code id="L4095"><span class="ln">4095</span>            dragi<span class="s"> = </span>drag[i];
+</code><code id="L4096"><span class="ln">4096</span>            dragi.el._drag<span class="s"> = </span>{};
+</code><code id="L4097"><span class="ln">4097</span>            eve(<i>"drag.end."</i><span class="s"> + </span>dragi.el.id, dragi.end_scope<span class="s"> || </span>dragi.start_scope<span class="s"> || </span>dragi.move_scope<span class="s"> || </span>dragi.el, e);
+</code><code id="L4098"><span class="ln">4098</span>        }
+</code><code id="L4099"><span class="ln">4099</span>        drag<span class="s"> = </span>[];
+</code><code id="L4100"><span class="ln">4100</span>    };
+</code><code id="L4101"><span class="ln">4101</span>    <b>for</b> (<b>var</b> i<span class="s"> = </span>events.length; i--;) {
+</code><code id="L4102"><span class="ln">4102</span>        (<b>function</b> (eventName) {
+</code><code id="L4103"><span class="ln">4103</span>            R[eventName]<span class="s"> = </span>Element.prototype[eventName]<span class="s"> = </span><b>function</b> (fn, scope) {
+</code><code id="L4104"><span class="ln">4104</span>                <b>if</b> (R.is(fn, <i>"<b>function</b>"</i>)) {
+</code><code id="L4105"><span class="ln">4105</span>                    <b>this</b>.events<span class="s"> = </span><b>this</b>.events<span class="s"> || </span>[];
+</code><code id="L4106"><span class="ln">4106</span>                    <b>this</b>.events.push({name: eventName, f: fn, unbind: addEvent(<b>this</b>.shape<span class="s"> || </span><b>this</b>.node<span class="s"> || </span>g.doc, eventName, fn, scope<span class="s"> || </span><b>this</b>)});
+</code><code id="L4107"><span class="ln">4107</span>                }
+</code><code id="L4108"><span class="ln">4108</span>                <b>return</b> <b>this</b>;
+</code><code id="L4109"><span class="ln">4109</span>            };
+</code><code id="L4110"><span class="ln">4110</span>            R[<i>"un"</i><span class="s"> + </span>eventName]<span class="s"> = </span>Element.prototype[<i>"un"</i><span class="s"> + </span>eventName]<span class="s"> = </span><b>function</b> (fn) {
+</code><code id="L4111"><span class="ln">4111</span>                <b>var</b> events<span class="s"> = </span><b>this</b>.events,
+</code><code id="L4112"><span class="ln">4112</span>                    l<span class="s"> = </span>events.length;
+</code><code id="L4113"><span class="ln">4113</span>                <b>while</b> (l--) <b>if</b> (events[l].name<span class="s"> == </span>eventName<span class="s"> &amp;&amp; </span>events[l].f<span class="s"> == </span>fn) {
+</code><code id="L4114"><span class="ln">4114</span>                    events[l].unbind();
+</code><code id="L4115"><span class="ln">4115</span>                    events.splice(l, <span class="d">1</span>);
+</code><code id="L4116"><span class="ln">4116</span>                    !events.length<span class="s"> &amp;&amp; </span><b>delete</b> <b>this</b>.events;
+</code><code id="L4117"><span class="ln">4117</span>                    <b>return</b> <b>this</b>;
+</code><code id="L4118"><span class="ln">4118</span>                }
+</code><code id="L4119"><span class="ln">4119</span>                <b>return</b> <b>this</b>;
+</code><code id="L4120"><span class="ln">4120</span>            };
+</code><code id="L4121"><span class="ln">4121</span>        })(events[i]);
+</code><code id="L4122"><span class="ln">4122</span>    }
+</code><code id="L4123"><span class="ln">4123</span><span class="c">    <span class="c">/*\</span>
+</span></code><code id="L4124"><span class="ln">4124</span><span class="c">    <span class="s"> * </span>Element.hover
+</span></code><code id="L4125"><span class="ln">4125</span><span class="c">     [ method ]
+</span></code><code id="L4126"><span class="ln">4126</span><span class="c">     **
+</span></code><code id="L4127"><span class="ln">4127</span><span class="c">    <span class="s"> * </span>Adds event handlers <b>for</b> hover <b>for</b> the element.
+</span></code><code id="L4128"><span class="ln">4128</span><span class="c">     > Parameters
+</span></code><code id="L4129"><span class="ln">4129</span><span class="c">    <span class="s"> - </span>f_in (<b>function</b>) handler <b>for</b> hover <b>in</b>
+</span></code><code id="L4130"><span class="ln">4130</span><span class="c">    <span class="s"> - </span>f_out (<b>function</b>) handler <b>for</b> hover out
+</span></code><code id="L4131"><span class="ln">4131</span><span class="c">    <span class="s"> - </span>icontext (object) #optional context <b>for</b> hover <b>in</b> handler
+</span></code><code id="L4132"><span class="ln">4132</span><span class="c">    <span class="s"> - </span>ocontext (object) #optional context <b>for</b> hover out handler
+</span></code><code id="L4133"><span class="ln">4133</span><span class="c">    <span class="s"> = </span>(object) @Element
+</span></code><code id="L4134"><span class="ln">4134</span><span class="c">    \*/</span>
+</code><code id="L4135"><span class="ln">4135</span>    elproto.hover<span class="s"> = </span><b>function</b> (f_in, f_out, scope_in, scope_out) {
+</code><code id="L4136"><span class="ln">4136</span>        <b>return</b> <b>this</b>.mouseover(f_in, scope_in).mouseout(f_out, scope_out<span class="s"> || </span>scope_in);
+</code><code id="L4137"><span class="ln">4137</span>    };
+</code><code id="L4138"><span class="ln">4138</span><span class="c">    <span class="c">/*\</span>
+</span></code><code id="L4139"><span class="ln">4139</span><span class="c">    <span class="s"> * </span>Element.unhover
+</span></code><code id="L4140"><span class="ln">4140</span><span class="c">     [ method ]
+</span></code><code id="L4141"><span class="ln">4141</span><span class="c">     **
+</span></code><code id="L4142"><span class="ln">4142</span><span class="c">    <span class="s"> * </span>Removes event handlers <b>for</b> hover <b>for</b> the element.
+</span></code><code id="L4143"><span class="ln">4143</span><span class="c">     > Parameters
+</span></code><code id="L4144"><span class="ln">4144</span><span class="c">    <span class="s"> - </span>f_in (<b>function</b>) handler <b>for</b> hover <b>in</b>
+</span></code><code id="L4145"><span class="ln">4145</span><span class="c">    <span class="s"> - </span>f_out (<b>function</b>) handler <b>for</b> hover out
 </span></code><code id="L4146"><span class="ln">4146</span><span class="c">    <span class="s"> = </span>(object) @Element
 </span></code><code id="L4147"><span class="ln">4147</span><span class="c">    \*/</span>
-</code><code id="L4148"><span class="ln">4148</span>    elproto.drag<span class="s"> = </span><b>function</b> (onmove, onstart, onend, move_scope, start_scope, end_scope) {
-</code><code id="L4149"><span class="ln">4149</span>        <b>function</b> start(e) {
-</code><code id="L4150"><span class="ln">4150</span>            (e.originalEvent<span class="s"> || </span>e).preventDefault();
-</code><code id="L4151"><span class="ln">4151</span>            <b>var</b> scrollY<span class="s"> = </span>g.doc.documentElement.scrollTop<span class="s"> || </span>g.doc.body.scrollTop,
-</code><code id="L4152"><span class="ln">4152</span>                scrollX<span class="s"> = </span>g.doc.documentElement.scrollLeft<span class="s"> || </span>g.doc.body.scrollLeft;
-</code><code id="L4153"><span class="ln">4153</span>            <b>this</b>._drag.x<span class="s"> = </span>e.clientX<span class="s"> + </span>scrollX;
-</code><code id="L4154"><span class="ln">4154</span>            <b>this</b>._drag.y<span class="s"> = </span>e.clientY<span class="s"> + </span>scrollY;
-</code><code id="L4155"><span class="ln">4155</span>            <b>this</b>._drag.id<span class="s"> = </span>e.identifier;
-</code><code id="L4156"><span class="ln">4156</span>            !drag.length<span class="s"> &amp;&amp; </span>R.mousemove(dragMove).mouseup(dragUp);
-</code><code id="L4157"><span class="ln">4157</span>            drag.push({el: <b>this</b>, move_scope: move_scope, start_scope: start_scope, end_scope: end_scope});
-</code><code id="L4158"><span class="ln">4158</span>            onstart<span class="s"> &amp;&amp; </span>eve.on(<i>"drag.start."</i><span class="s"> + </span><b>this</b>.id, onstart);
-</code><code id="L4159"><span class="ln">4159</span>            onmove<span class="s"> &amp;&amp; </span>eve.on(<i>"drag.move."</i><span class="s"> + </span><b>this</b>.id, onmove);
-</code><code id="L4160"><span class="ln">4160</span>            onend<span class="s"> &amp;&amp; </span>eve.on(<i>"drag.end."</i><span class="s"> + </span><b>this</b>.id, onend);
-</code><code id="L4161"><span class="ln">4161</span>            eve(<i>"drag.start."</i><span class="s"> + </span><b>this</b>.id, start_scope<span class="s"> || </span>move_scope<span class="s"> || </span><b>this</b>, e.clientX<span class="s"> + </span>scrollX, e.clientY<span class="s"> + </span>scrollY, e);
-</code><code id="L4162"><span class="ln">4162</span>        }
-</code><code id="L4163"><span class="ln">4163</span>        <b>this</b>._drag<span class="s"> = </span>{};
-</code><code id="L4164"><span class="ln">4164</span>        <b>this</b>.mousedown(start);
-</code><code id="L4165"><span class="ln">4165</span>        <b>return</b> <b>this</b>;
-</code><code id="L4166"><span class="ln">4166</span>    };
-</code><code id="L4167"><span class="ln">4167</span><span class="c">    <span class="c">/*\</span>
-</span></code><code id="L4168"><span class="ln">4168</span><span class="c">    <span class="s"> * </span>Element.onDragOver
-</span></code><code id="L4169"><span class="ln">4169</span><span class="c">     [ method ]
-</span></code><code id="L4170"><span class="ln">4170</span><span class="c">     **
-</span></code><code id="L4171"><span class="ln">4171</span><span class="c">    <span class="s"> * </span>Shortcut <b>for</b> assigning event handler <b>for</b> `drag.over.&lt;id>` event, where id is id of the element (see @Element.id).
-</span></code><code id="L4172"><span class="ln">4172</span><span class="c">     > Parameters
-</span></code><code id="L4173"><span class="ln">4173</span><span class="c">    <span class="s"> - </span>f (<b>function</b>) handler <b>for</b> event
-</span></code><code id="L4174"><span class="ln">4174</span><span class="c">    \*/</span>
-</code><code id="L4175"><span class="ln">4175</span>    elproto.onDragOver<span class="s"> = </span><b>function</b> (f) {
-</code><code id="L4176"><span class="ln">4176</span>        f ? eve.on(<i>"drag.over."</i><span class="s"> + </span><b>this</b>.id, f) : eve.unbind(<i>"drag.over."</i><span class="s"> + </span><b>this</b>.id);
-</code><code id="L4177"><span class="ln">4177</span>    };
-</code><code id="L4178"><span class="ln">4178</span><span class="c">    <span class="c">/*\</span>
-</span></code><code id="L4179"><span class="ln">4179</span><span class="c">    <span class="s"> * </span>Element.undrag
-</span></code><code id="L4180"><span class="ln">4180</span><span class="c">     [ method ]
-</span></code><code id="L4181"><span class="ln">4181</span><span class="c">     **
-</span></code><code id="L4182"><span class="ln">4182</span><span class="c">    <span class="s"> * </span>Removes all drag event handlers from given element.
-</span></code><code id="L4183"><span class="ln">4183</span><span class="c">    \*/</span>
-</code><code id="L4184"><span class="ln">4184</span>    elproto.undrag<span class="s"> = </span><b>function</b> () {
-</code><code id="L4185"><span class="ln">4185</span>        <b>var</b> i<span class="s"> = </span>drag.length;
-</code><code id="L4186"><span class="ln">4186</span>        <b>while</b> (i--) <b>if</b> (drag[i].el<span class="s"> == </span><b>this</b>) {
-</code><code id="L4187"><span class="ln">4187</span>            R.unmousedown(drag[i].start);
-</code><code id="L4188"><span class="ln">4188</span>            drag.splice(i++, <span class="d">1</span>);
-</code><code id="L4189"><span class="ln">4189</span>            eve.unbind(<i>"drag.*."</i><span class="s"> + </span><b>this</b>.id);
-</code><code id="L4190"><span class="ln">4190</span>        }
-</code><code id="L4191"><span class="ln">4191</span>        !drag.length<span class="s"> &amp;&amp; </span>R.unmousemove(dragMove).unmouseup(dragUp);
-</code><code id="L4192"><span class="ln">4192</span>    };
-</code><code id="L4193"><span class="ln">4193</span><span class="c">    <span class="c">/*\</span>
-</span></code><code id="L4194"><span class="ln">4194</span><span class="c">    <span class="s"> * </span>Paper.circle
-</span></code><code id="L4195"><span class="ln">4195</span><span class="c">     [ method ]
-</span></code><code id="L4196"><span class="ln">4196</span><span class="c">     **
-</span></code><code id="L4197"><span class="ln">4197</span><span class="c">    <span class="s"> * </span>Draws a circle.
-</span></code><code id="L4198"><span class="ln">4198</span><span class="c">     **
-</span></code><code id="L4199"><span class="ln">4199</span><span class="c">     > Parameters
-</span></code><code id="L4200"><span class="ln">4200</span><span class="c">     **
-</span></code><code id="L4201"><span class="ln">4201</span><span class="c">    <span class="s"> - </span>x (number) x coordinate of the centre
-</span></code><code id="L4202"><span class="ln">4202</span><span class="c">    <span class="s"> - </span>y (number) y coordinate of the centre
-</span></code><code id="L4203"><span class="ln">4203</span><span class="c">    <span class="s"> - </span>r (number) radius
-</span></code><code id="L4204"><span class="ln">4204</span><span class="c">    <span class="s"> = </span>(object) Raphaël element object <b>with</b> type “circle”
-</span></code><code id="L4205"><span class="ln">4205</span><span class="c">     **
-</span></code><code id="L4206"><span class="ln">4206</span><span class="c">     > Usage
-</span></code><code id="L4207"><span class="ln">4207</span><span class="c">    <span class="s"> | </span><b>var</b> c<span class="s"> = </span>paper.circle(<span class="d">50</span>, <span class="d">50</span>, <span class="d">40</span>);
-</span></code><code id="L4208"><span class="ln">4208</span><span class="c">    \*/</span>
-</code><code id="L4209"><span class="ln">4209</span>    paperproto.circle<span class="s"> = </span><b>function</b> (x, y, r) {
-</code><code id="L4210"><span class="ln">4210</span>        <b>return</b> theCircle(<b>this</b>, x<span class="s"> || </span><span class="d">0</span>, y<span class="s"> || </span><span class="d">0</span>, r<span class="s"> || </span><span class="d">0</span>);
-</code><code id="L4211"><span class="ln">4211</span>    };
-</code><code id="L4212"><span class="ln">4212</span><span class="c">    <span class="c">/*\</span>
-</span></code><code id="L4213"><span class="ln">4213</span><span class="c">    <span class="s"> * </span>Paper.rect
-</span></code><code id="L4214"><span class="ln">4214</span><span class="c">     [ method ]
-</span></code><code id="L4215"><span class="ln">4215</span><span class="c">     *
-</span></code><code id="L4216"><span class="ln">4216</span><span class="c">    <span class="s"> * </span>Draws a rectangle.
-</span></code><code id="L4217"><span class="ln">4217</span><span class="c">     **
-</span></code><code id="L4218"><span class="ln">4218</span><span class="c">     > Parameters
-</span></code><code id="L4219"><span class="ln">4219</span><span class="c">     **
-</span></code><code id="L4220"><span class="ln">4220</span><span class="c">    <span class="s"> - </span>x (number) x coordinate of the top left corner
-</span></code><code id="L4221"><span class="ln">4221</span><span class="c">    <span class="s"> - </span>y (number) y coordinate of the top left corner
-</span></code><code id="L4222"><span class="ln">4222</span><span class="c">    <span class="s"> - </span>width (number) width
-</span></code><code id="L4223"><span class="ln">4223</span><span class="c">    <span class="s"> - </span>height (number) height
-</span></code><code id="L4224"><span class="ln">4224</span><span class="c">    <span class="s"> - </span>r (number) #optional radius <b>for</b> rounded corners, <b>default</b> is <span class="d">0</span>
-</span></code><code id="L4225"><span class="ln">4225</span><span class="c">    <span class="s"> = </span>(object) Raphaël element object <b>with</b> type “rect”
-</span></code><code id="L4226"><span class="ln">4226</span><span class="c">     **
-</span></code><code id="L4227"><span class="ln">4227</span><span class="c">     > Usage
-</span></code><code id="L4228"><span class="ln">4228</span><span class="c">    <span class="s"> | </span><span class="c">// regular rectangle</span>
-</span></code><code id="L4229"><span class="ln">4229</span><span class="c">    <span class="s"> | </span><b>var</b> c<span class="s"> = </span>paper.rect(<span class="d">10</span>, <span class="d">10</span>, <span class="d">50</span>, <span class="d">50</span>);
-</span></code><code id="L4230"><span class="ln">4230</span><span class="c">    <span class="s"> | </span><span class="c">// rectangle <b>with</b> rounded corners</span>
-</span></code><code id="L4231"><span class="ln">4231</span><span class="c">    <span class="s"> | </span><b>var</b> c<span class="s"> = </span>paper.rect(<span class="d">40</span>, <span class="d">40</span>, <span class="d">50</span>, <span class="d">50</span>, <span class="d">10</span>);
-</span></code><code id="L4232"><span class="ln">4232</span><span class="c">    \*/</span>
-</code><code id="L4233"><span class="ln">4233</span>    paperproto.rect<span class="s"> = </span><b>function</b> (x, y, w, h, r) {
-</code><code id="L4234"><span class="ln">4234</span>        <b>return</b> theRect(<b>this</b>, x<span class="s"> || </span><span class="d">0</span>, y<span class="s"> || </span><span class="d">0</span>, w<span class="s"> || </span><span class="d">0</span>, h<span class="s"> || </span><span class="d">0</span>, r<span class="s"> || </span><span class="d">0</span>);
-</code><code id="L4235"><span class="ln">4235</span>    };
-</code><code id="L4236"><span class="ln">4236</span><span class="c">    <span class="c">/*\</span>
-</span></code><code id="L4237"><span class="ln">4237</span><span class="c">    <span class="s"> * </span>Paper.ellipse
-</span></code><code id="L4238"><span class="ln">4238</span><span class="c">     [ method ]
-</span></code><code id="L4239"><span class="ln">4239</span><span class="c">     **
-</span></code><code id="L4240"><span class="ln">4240</span><span class="c">    <span class="s"> * </span>Draws an ellipse.
-</span></code><code id="L4241"><span class="ln">4241</span><span class="c">     **
-</span></code><code id="L4242"><span class="ln">4242</span><span class="c">     > Parameters
-</span></code><code id="L4243"><span class="ln">4243</span><span class="c">     **
-</span></code><code id="L4244"><span class="ln">4244</span><span class="c">    <span class="s"> - </span>x (number) x coordinate of the centre
-</span></code><code id="L4245"><span class="ln">4245</span><span class="c">    <span class="s"> - </span>y (number) y coordinate of the centre
-</span></code><code id="L4246"><span class="ln">4246</span><span class="c">    <span class="s"> - </span>rx (number) horizontal radius
-</span></code><code id="L4247"><span class="ln">4247</span><span class="c">    <span class="s"> - </span>ry (number) vertical radius
-</span></code><code id="L4248"><span class="ln">4248</span><span class="c">    <span class="s"> = </span>(object) Raphaël element object <b>with</b> type “ellipse”
-</span></code><code id="L4249"><span class="ln">4249</span><span class="c">     **
-</span></code><code id="L4250"><span class="ln">4250</span><span class="c">     > Usage
-</span></code><code id="L4251"><span class="ln">4251</span><span class="c">    <span class="s"> | </span><b>var</b> c<span class="s"> = </span>paper.ellipse(<span class="d">50</span>, <span class="d">50</span>, <span class="d">40</span>, <span class="d">20</span>);
-</span></code><code id="L4252"><span class="ln">4252</span><span class="c">    \*/</span>
-</code><code id="L4253"><span class="ln">4253</span>    paperproto.ellipse<span class="s"> = </span><b>function</b> (x, y, rx, ry) {
-</code><code id="L4254"><span class="ln">4254</span>        <b>return</b> theEllipse(<b>this</b>, x<span class="s"> || </span><span class="d">0</span>, y<span class="s"> || </span><span class="d">0</span>, rx<span class="s"> || </span><span class="d">0</span>, ry<span class="s"> || </span><span class="d">0</span>);
-</code><code id="L4255"><span class="ln">4255</span>    };
-</code><code id="L4256"><span class="ln">4256</span><span class="c">    <span class="c">/*\</span>
-</span></code><code id="L4257"><span class="ln">4257</span><span class="c">    <span class="s"> * </span>Paper.path
-</span></code><code id="L4258"><span class="ln">4258</span><span class="c">     [ method ]
+</code><code id="L4148"><span class="ln">4148</span>    elproto.unhover<span class="s"> = </span><b>function</b> (f_in, f_out) {
+</code><code id="L4149"><span class="ln">4149</span>        <b>return</b> <b>this</b>.unmouseover(f_in).unmouseout(f_out);
+</code><code id="L4150"><span class="ln">4150</span>    };
+</code><code id="L4151"><span class="ln">4151</span><span class="c">    <span class="c">/*\</span>
+</span></code><code id="L4152"><span class="ln">4152</span><span class="c">    <span class="s"> * </span>Element.drag
+</span></code><code id="L4153"><span class="ln">4153</span><span class="c">     [ method ]
+</span></code><code id="L4154"><span class="ln">4154</span><span class="c">     **
+</span></code><code id="L4155"><span class="ln">4155</span><span class="c">    <span class="s"> * </span>Adds event handlers <b>for</b> drag of the element.
+</span></code><code id="L4156"><span class="ln">4156</span><span class="c">     > Parameters
+</span></code><code id="L4157"><span class="ln">4157</span><span class="c">    <span class="s"> - </span>onmove (<b>function</b>) handler <b>for</b> moving
+</span></code><code id="L4158"><span class="ln">4158</span><span class="c">    <span class="s"> - </span>onstart (<b>function</b>) handler <b>for</b> drag start
+</span></code><code id="L4159"><span class="ln">4159</span><span class="c">    <span class="s"> - </span>onend (<b>function</b>) handler <b>for</b> drag end
+</span></code><code id="L4160"><span class="ln">4160</span><span class="c">    <span class="s"> - </span>mcontext (object) #optional context <b>for</b> moving handler
+</span></code><code id="L4161"><span class="ln">4161</span><span class="c">    <span class="s"> - </span>scontext (object) #optional context <b>for</b> drag start handler
+</span></code><code id="L4162"><span class="ln">4162</span><span class="c">    <span class="s"> - </span>econtext (object) #optional context <b>for</b> drag end handler
+</span></code><code id="L4163"><span class="ln">4163</span><span class="c">    <span class="s"> * </span>Additionaly following `drag` events will be triggered: `drag.start.&lt;id>` on start, 
+</span></code><code id="L4164"><span class="ln">4164</span><span class="c">    <span class="s"> * </span>`drag.end.&lt;id>` on end and `drag.move.&lt;id>` on every move. When element will be dragged over another element 
+</span></code><code id="L4165"><span class="ln">4165</span><span class="c">    <span class="s"> * </span>`drag.over.&lt;id>` will be fired as well.
+</span></code><code id="L4166"><span class="ln">4166</span><span class="c">     *
+</span></code><code id="L4167"><span class="ln">4167</span><span class="c">    <span class="s"> * </span>Start event and start handler will be called <b>in</b> specified context or <b>in</b> context of the element <b>with</b> following parameters:
+</span></code><code id="L4168"><span class="ln">4168</span><span class="c">     o x (number) x position of the mouse
+</span></code><code id="L4169"><span class="ln">4169</span><span class="c">     o y (number) y position of the mouse
+</span></code><code id="L4170"><span class="ln">4170</span><span class="c">     o event (object) DOM event object
+</span></code><code id="L4171"><span class="ln">4171</span><span class="c">    <span class="s"> * </span>Move event and move handler will be called <b>in</b> specified context or <b>in</b> context of the element <b>with</b> following parameters:
+</span></code><code id="L4172"><span class="ln">4172</span><span class="c">     o dx (number) shift by x from the start point
+</span></code><code id="L4173"><span class="ln">4173</span><span class="c">     o dy (number) shift by y from the start point
+</span></code><code id="L4174"><span class="ln">4174</span><span class="c">     o x (number) x position of the mouse
+</span></code><code id="L4175"><span class="ln">4175</span><span class="c">     o y (number) y position of the mouse
+</span></code><code id="L4176"><span class="ln">4176</span><span class="c">     o event (object) DOM event object
+</span></code><code id="L4177"><span class="ln">4177</span><span class="c">    <span class="s"> * </span>End event and end handler will be called <b>in</b> specified context or <b>in</b> context of the element <b>with</b> following parameters:
+</span></code><code id="L4178"><span class="ln">4178</span><span class="c">     o event (object) DOM event object
+</span></code><code id="L4179"><span class="ln">4179</span><span class="c">    <span class="s"> = </span>(object) @Element
+</span></code><code id="L4180"><span class="ln">4180</span><span class="c">    \*/</span>
+</code><code id="L4181"><span class="ln">4181</span>    elproto.drag<span class="s"> = </span><b>function</b> (onmove, onstart, onend, move_scope, start_scope, end_scope) {
+</code><code id="L4182"><span class="ln">4182</span>        <b>function</b> start(e) {
+</code><code id="L4183"><span class="ln">4183</span>            (e.originalEvent<span class="s"> || </span>e).preventDefault();
+</code><code id="L4184"><span class="ln">4184</span>            <b>var</b> scrollY<span class="s"> = </span>g.doc.documentElement.scrollTop<span class="s"> || </span>g.doc.body.scrollTop,
+</code><code id="L4185"><span class="ln">4185</span>                scrollX<span class="s"> = </span>g.doc.documentElement.scrollLeft<span class="s"> || </span>g.doc.body.scrollLeft;
+</code><code id="L4186"><span class="ln">4186</span>            <b>this</b>._drag.x<span class="s"> = </span>e.clientX<span class="s"> + </span>scrollX;
+</code><code id="L4187"><span class="ln">4187</span>            <b>this</b>._drag.y<span class="s"> = </span>e.clientY<span class="s"> + </span>scrollY;
+</code><code id="L4188"><span class="ln">4188</span>            <b>this</b>._drag.id<span class="s"> = </span>e.identifier;
+</code><code id="L4189"><span class="ln">4189</span>            !drag.length<span class="s"> &amp;&amp; </span>R.mousemove(dragMove).mouseup(dragUp);
+</code><code id="L4190"><span class="ln">4190</span>            drag.push({el: <b>this</b>, move_scope: move_scope, start_scope: start_scope, end_scope: end_scope});
+</code><code id="L4191"><span class="ln">4191</span>            onstart<span class="s"> &amp;&amp; </span>eve.on(<i>"drag.start."</i><span class="s"> + </span><b>this</b>.id, onstart);
+</code><code id="L4192"><span class="ln">4192</span>            onmove<span class="s"> &amp;&amp; </span>eve.on(<i>"drag.move."</i><span class="s"> + </span><b>this</b>.id, onmove);
+</code><code id="L4193"><span class="ln">4193</span>            onend<span class="s"> &amp;&amp; </span>eve.on(<i>"drag.end."</i><span class="s"> + </span><b>this</b>.id, onend);
+</code><code id="L4194"><span class="ln">4194</span>            eve(<i>"drag.start."</i><span class="s"> + </span><b>this</b>.id, start_scope<span class="s"> || </span>move_scope<span class="s"> || </span><b>this</b>, e.clientX<span class="s"> + </span>scrollX, e.clientY<span class="s"> + </span>scrollY, e);
+</code><code id="L4195"><span class="ln">4195</span>        }
+</code><code id="L4196"><span class="ln">4196</span>        <b>this</b>._drag<span class="s"> = </span>{};
+</code><code id="L4197"><span class="ln">4197</span>        <b>this</b>.mousedown(start);
+</code><code id="L4198"><span class="ln">4198</span>        <b>return</b> <b>this</b>;
+</code><code id="L4199"><span class="ln">4199</span>    };
+</code><code id="L4200"><span class="ln">4200</span><span class="c">    <span class="c">/*\</span>
+</span></code><code id="L4201"><span class="ln">4201</span><span class="c">    <span class="s"> * </span>Element.onDragOver
+</span></code><code id="L4202"><span class="ln">4202</span><span class="c">     [ method ]
+</span></code><code id="L4203"><span class="ln">4203</span><span class="c">     **
+</span></code><code id="L4204"><span class="ln">4204</span><span class="c">    <span class="s"> * </span>Shortcut <b>for</b> assigning event handler <b>for</b> `drag.over.&lt;id>` event, where id is id of the element (see @Element.id).
+</span></code><code id="L4205"><span class="ln">4205</span><span class="c">     > Parameters
+</span></code><code id="L4206"><span class="ln">4206</span><span class="c">    <span class="s"> - </span>f (<b>function</b>) handler <b>for</b> event
+</span></code><code id="L4207"><span class="ln">4207</span><span class="c">    \*/</span>
+</code><code id="L4208"><span class="ln">4208</span>    elproto.onDragOver<span class="s"> = </span><b>function</b> (f) {
+</code><code id="L4209"><span class="ln">4209</span>        f ? eve.on(<i>"drag.over."</i><span class="s"> + </span><b>this</b>.id, f) : eve.unbind(<i>"drag.over."</i><span class="s"> + </span><b>this</b>.id);
+</code><code id="L4210"><span class="ln">4210</span>    };
+</code><code id="L4211"><span class="ln">4211</span><span class="c">    <span class="c">/*\</span>
+</span></code><code id="L4212"><span class="ln">4212</span><span class="c">    <span class="s"> * </span>Element.undrag
+</span></code><code id="L4213"><span class="ln">4213</span><span class="c">     [ method ]
+</span></code><code id="L4214"><span class="ln">4214</span><span class="c">     **
+</span></code><code id="L4215"><span class="ln">4215</span><span class="c">    <span class="s"> * </span>Removes all drag event handlers from given element.
+</span></code><code id="L4216"><span class="ln">4216</span><span class="c">    \*/</span>
+</code><code id="L4217"><span class="ln">4217</span>    elproto.undrag<span class="s"> = </span><b>function</b> () {
+</code><code id="L4218"><span class="ln">4218</span>        <b>var</b> i<span class="s"> = </span>drag.length;
+</code><code id="L4219"><span class="ln">4219</span>        <b>while</b> (i--) <b>if</b> (drag[i].el<span class="s"> == </span><b>this</b>) {
+</code><code id="L4220"><span class="ln">4220</span>            R.unmousedown(drag[i].start);
+</code><code id="L4221"><span class="ln">4221</span>            drag.splice(i++, <span class="d">1</span>);
+</code><code id="L4222"><span class="ln">4222</span>            eve.unbind(<i>"drag.*."</i><span class="s"> + </span><b>this</b>.id);
+</code><code id="L4223"><span class="ln">4223</span>        }
+</code><code id="L4224"><span class="ln">4224</span>        !drag.length<span class="s"> &amp;&amp; </span>R.unmousemove(dragMove).unmouseup(dragUp);
+</code><code id="L4225"><span class="ln">4225</span>    };
+</code><code id="L4226"><span class="ln">4226</span><span class="c">    <span class="c">/*\</span>
+</span></code><code id="L4227"><span class="ln">4227</span><span class="c">    <span class="s"> * </span>Paper.circle
+</span></code><code id="L4228"><span class="ln">4228</span><span class="c">     [ method ]
+</span></code><code id="L4229"><span class="ln">4229</span><span class="c">     **
+</span></code><code id="L4230"><span class="ln">4230</span><span class="c">    <span class="s"> * </span>Draws a circle.
+</span></code><code id="L4231"><span class="ln">4231</span><span class="c">     **
+</span></code><code id="L4232"><span class="ln">4232</span><span class="c">     > Parameters
+</span></code><code id="L4233"><span class="ln">4233</span><span class="c">     **
+</span></code><code id="L4234"><span class="ln">4234</span><span class="c">    <span class="s"> - </span>x (number) x coordinate of the centre
+</span></code><code id="L4235"><span class="ln">4235</span><span class="c">    <span class="s"> - </span>y (number) y coordinate of the centre
+</span></code><code id="L4236"><span class="ln">4236</span><span class="c">    <span class="s"> - </span>r (number) radius
+</span></code><code id="L4237"><span class="ln">4237</span><span class="c">    <span class="s"> = </span>(object) Raphaël element object <b>with</b> type “circle”
+</span></code><code id="L4238"><span class="ln">4238</span><span class="c">     **
+</span></code><code id="L4239"><span class="ln">4239</span><span class="c">     > Usage
+</span></code><code id="L4240"><span class="ln">4240</span><span class="c">    <span class="s"> | </span><b>var</b> c<span class="s"> = </span>paper.circle(<span class="d">50</span>, <span class="d">50</span>, <span class="d">40</span>);
+</span></code><code id="L4241"><span class="ln">4241</span><span class="c">    \*/</span>
+</code><code id="L4242"><span class="ln">4242</span>    paperproto.circle<span class="s"> = </span><b>function</b> (x, y, r) {
+</code><code id="L4243"><span class="ln">4243</span>        <b>return</b> theCircle(<b>this</b>, x<span class="s"> || </span><span class="d">0</span>, y<span class="s"> || </span><span class="d">0</span>, r<span class="s"> || </span><span class="d">0</span>);
+</code><code id="L4244"><span class="ln">4244</span>    };
+</code><code id="L4245"><span class="ln">4245</span><span class="c">    <span class="c">/*\</span>
+</span></code><code id="L4246"><span class="ln">4246</span><span class="c">    <span class="s"> * </span>Paper.rect
+</span></code><code id="L4247"><span class="ln">4247</span><span class="c">     [ method ]
+</span></code><code id="L4248"><span class="ln">4248</span><span class="c">     *
+</span></code><code id="L4249"><span class="ln">4249</span><span class="c">    <span class="s"> * </span>Draws a rectangle.
+</span></code><code id="L4250"><span class="ln">4250</span><span class="c">     **
+</span></code><code id="L4251"><span class="ln">4251</span><span class="c">     > Parameters
+</span></code><code id="L4252"><span class="ln">4252</span><span class="c">     **
+</span></code><code id="L4253"><span class="ln">4253</span><span class="c">    <span class="s"> - </span>x (number) x coordinate of the top left corner
+</span></code><code id="L4254"><span class="ln">4254</span><span class="c">    <span class="s"> - </span>y (number) y coordinate of the top left corner
+</span></code><code id="L4255"><span class="ln">4255</span><span class="c">    <span class="s"> - </span>width (number) width
+</span></code><code id="L4256"><span class="ln">4256</span><span class="c">    <span class="s"> - </span>height (number) height
+</span></code><code id="L4257"><span class="ln">4257</span><span class="c">    <span class="s"> - </span>r (number) #optional radius <b>for</b> rounded corners, <b>default</b> is <span class="d">0</span>
+</span></code><code id="L4258"><span class="ln">4258</span><span class="c">    <span class="s"> = </span>(object) Raphaël element object <b>with</b> type “rect”
 </span></code><code id="L4259"><span class="ln">4259</span><span class="c">     **
-</span></code><code id="L4260"><span class="ln">4260</span><span class="c">    <span class="s"> * </span>Creates a path element by given path data string.
-</span></code><code id="L4261"><span class="ln">4261</span><span class="c">     **
-</span></code><code id="L4262"><span class="ln">4262</span><span class="c">     > Parameters
-</span></code><code id="L4263"><span class="ln">4263</span><span class="c">     **
-</span></code><code id="L4264"><span class="ln">4264</span><span class="c">    <span class="s"> - </span>pathString (string) path data <b>in</b> SVG path string format.
-</span></code><code id="L4265"><span class="ln">4265</span><span class="c">    <span class="s"> = </span>(object) Raphaël element object <b>with</b> type “ellipse”
-</span></code><code id="L4266"><span class="ln">4266</span><span class="c">     # Details of a path<i>'s data attribute'</i>s format are described <b>in</b> the &lt;a href=<i>"http:<span class="c">//www.w3.org/TR/SVG/paths.html#PathData"</i>>SVG specification&lt;/a>.</span>
-</span></code><code id="L4267"><span class="ln">4267</span><span class="c">     **
-</span></code><code id="L4268"><span class="ln">4268</span><span class="c">     > Usage
-</span></code><code id="L4269"><span class="ln">4269</span><span class="c">    <span class="s"> | </span><b>var</b> c<span class="s"> = </span>paper.path(<i>"M10 10L90 <span class="d">90</span>"</i>);
-</span></code><code id="L4270"><span class="ln">4270</span><span class="c">    <span class="s"> | </span><span class="c">// draw a diagonal line:</span>
-</span></code><code id="L4271"><span class="ln">4271</span><span class="c">    <span class="s"> | </span><span class="c">// move to <span class="d">10</span>,<span class="d">10</span>, line to <span class="d">90</span>,<span class="d">90</span></span>
-</span></code><code id="L4272"><span class="ln">4272</span><span class="c">    \*/</span>
-</code><code id="L4273"><span class="ln">4273</span>    paperproto.path<span class="s"> = </span><b>function</b> (pathString) {
-</code><code id="L4274"><span class="ln">4274</span>        pathString<span class="s"> &amp;&amp; </span>!R.is(pathString, string)<span class="s"> &amp;&amp; </span>!R.is(pathString[<span class="d">0</span>], array)<span class="s"> &amp;&amp; </span>(pathString += E);
-</code><code id="L4275"><span class="ln">4275</span>        <b>return</b> thePath(R.format[apply](R, arguments), <b>this</b>);
-</code><code id="L4276"><span class="ln">4276</span>    };
-</code><code id="L4277"><span class="ln">4277</span><span class="c">    <span class="c">/*\</span>
-</span></code><code id="L4278"><span class="ln">4278</span><span class="c">    <span class="s"> * </span>Paper.image
-</span></code><code id="L4279"><span class="ln">4279</span><span class="c">     [ method ]
-</span></code><code id="L4280"><span class="ln">4280</span><span class="c">     **
-</span></code><code id="L4281"><span class="ln">4281</span><span class="c">    <span class="s"> * </span>Embeds an image into the surface.
+</span></code><code id="L4260"><span class="ln">4260</span><span class="c">     > Usage
+</span></code><code id="L4261"><span class="ln">4261</span><span class="c">    <span class="s"> | </span><span class="c">// regular rectangle</span>
+</span></code><code id="L4262"><span class="ln">4262</span><span class="c">    <span class="s"> | </span><b>var</b> c<span class="s"> = </span>paper.rect(<span class="d">10</span>, <span class="d">10</span>, <span class="d">50</span>, <span class="d">50</span>);
+</span></code><code id="L4263"><span class="ln">4263</span><span class="c">    <span class="s"> | </span><span class="c">// rectangle <b>with</b> rounded corners</span>
+</span></code><code id="L4264"><span class="ln">4264</span><span class="c">    <span class="s"> | </span><b>var</b> c<span class="s"> = </span>paper.rect(<span class="d">40</span>, <span class="d">40</span>, <span class="d">50</span>, <span class="d">50</span>, <span class="d">10</span>);
+</span></code><code id="L4265"><span class="ln">4265</span><span class="c">    \*/</span>
+</code><code id="L4266"><span class="ln">4266</span>    paperproto.rect<span class="s"> = </span><b>function</b> (x, y, w, h, r) {
+</code><code id="L4267"><span class="ln">4267</span>        <b>return</b> theRect(<b>this</b>, x<span class="s"> || </span><span class="d">0</span>, y<span class="s"> || </span><span class="d">0</span>, w<span class="s"> || </span><span class="d">0</span>, h<span class="s"> || </span><span class="d">0</span>, r<span class="s"> || </span><span class="d">0</span>);
+</code><code id="L4268"><span class="ln">4268</span>    };
+</code><code id="L4269"><span class="ln">4269</span><span class="c">    <span class="c">/*\</span>
+</span></code><code id="L4270"><span class="ln">4270</span><span class="c">    <span class="s"> * </span>Paper.ellipse
+</span></code><code id="L4271"><span class="ln">4271</span><span class="c">     [ method ]
+</span></code><code id="L4272"><span class="ln">4272</span><span class="c">     **
+</span></code><code id="L4273"><span class="ln">4273</span><span class="c">    <span class="s"> * </span>Draws an ellipse.
+</span></code><code id="L4274"><span class="ln">4274</span><span class="c">     **
+</span></code><code id="L4275"><span class="ln">4275</span><span class="c">     > Parameters
+</span></code><code id="L4276"><span class="ln">4276</span><span class="c">     **
+</span></code><code id="L4277"><span class="ln">4277</span><span class="c">    <span class="s"> - </span>x (number) x coordinate of the centre
+</span></code><code id="L4278"><span class="ln">4278</span><span class="c">    <span class="s"> - </span>y (number) y coordinate of the centre
+</span></code><code id="L4279"><span class="ln">4279</span><span class="c">    <span class="s"> - </span>rx (number) horizontal radius
+</span></code><code id="L4280"><span class="ln">4280</span><span class="c">    <span class="s"> - </span>ry (number) vertical radius
+</span></code><code id="L4281"><span class="ln">4281</span><span class="c">    <span class="s"> = </span>(object) Raphaël element object <b>with</b> type “ellipse”
 </span></code><code id="L4282"><span class="ln">4282</span><span class="c">     **
-</span></code><code id="L4283"><span class="ln">4283</span><span class="c">     > Parameters
-</span></code><code id="L4284"><span class="ln">4284</span><span class="c">     **
-</span></code><code id="L4285"><span class="ln">4285</span><span class="c">    <span class="s"> - </span>src (string) URI of the source image
-</span></code><code id="L4286"><span class="ln">4286</span><span class="c">    <span class="s"> - </span>x (number) x coordinate position
-</span></code><code id="L4287"><span class="ln">4287</span><span class="c">    <span class="s"> - </span>y (number) y coordinate position
-</span></code><code id="L4288"><span class="ln">4288</span><span class="c">    <span class="s"> - </span>width (number) width of the image
-</span></code><code id="L4289"><span class="ln">4289</span><span class="c">    <span class="s"> - </span>height (number) height of the image
-</span></code><code id="L4290"><span class="ln">4290</span><span class="c">    <span class="s"> = </span>(object) Raphaël element object <b>with</b> type “image”
-</span></code><code id="L4291"><span class="ln">4291</span><span class="c">     **
-</span></code><code id="L4292"><span class="ln">4292</span><span class="c">     > Usage
-</span></code><code id="L4293"><span class="ln">4293</span><span class="c">    <span class="s"> | </span><b>var</b> c<span class="s"> = </span>paper.image(<i>"apple.png"</i>, <span class="d">10</span>, <span class="d">10</span>, <span class="d">80</span>, <span class="d">80</span>);
-</span></code><code id="L4294"><span class="ln">4294</span><span class="c">    \*/</span>
-</code><code id="L4295"><span class="ln">4295</span>    paperproto.image<span class="s"> = </span><b>function</b> (src, x, y, w, h) {
-</code><code id="L4296"><span class="ln">4296</span>        <b>return</b> theImage(<b>this</b>, src<span class="s"> || </span><i>"about:blank"</i>, x<span class="s"> || </span><span class="d">0</span>, y<span class="s"> || </span><span class="d">0</span>, w<span class="s"> || </span><span class="d">0</span>, h<span class="s"> || </span><span class="d">0</span>);
-</code><code id="L4297"><span class="ln">4297</span>    };
-</code><code id="L4298"><span class="ln">4298</span><span class="c">    <span class="c">/*\</span>
-</span></code><code id="L4299"><span class="ln">4299</span><span class="c">    <span class="s"> * </span>Paper.text
-</span></code><code id="L4300"><span class="ln">4300</span><span class="c">     [ method ]
-</span></code><code id="L4301"><span class="ln">4301</span><span class="c">     **
-</span></code><code id="L4302"><span class="ln">4302</span><span class="c">    <span class="s"> * </span>Draws a text string. If you need line breaks, put “\n” <b>in</b> the string.
-</span></code><code id="L4303"><span class="ln">4303</span><span class="c">     **
-</span></code><code id="L4304"><span class="ln">4304</span><span class="c">     > Parameters
-</span></code><code id="L4305"><span class="ln">4305</span><span class="c">     **
-</span></code><code id="L4306"><span class="ln">4306</span><span class="c">    <span class="s"> - </span>x (number) x coordinate position
-</span></code><code id="L4307"><span class="ln">4307</span><span class="c">    <span class="s"> - </span>y (number) y coordinate position
-</span></code><code id="L4308"><span class="ln">4308</span><span class="c">    <span class="s"> - </span>text (string) The text string to draw
-</span></code><code id="L4309"><span class="ln">4309</span><span class="c">    <span class="s"> = </span>(object) Raphaël element object <b>with</b> type “text”
-</span></code><code id="L4310"><span class="ln">4310</span><span class="c">     **
-</span></code><code id="L4311"><span class="ln">4311</span><span class="c">     > Usage
-</span></code><code id="L4312"><span class="ln">4312</span><span class="c">    <span class="s"> | </span><b>var</b> t<span class="s"> = </span>paper.text(<span class="d">50</span>, <span class="d">50</span>, <i>"Raphaël\nkicks\nbutt!"</i>);
-</span></code><code id="L4313"><span class="ln">4313</span><span class="c">    \*/</span>
-</code><code id="L4314"><span class="ln">4314</span>    paperproto.text<span class="s"> = </span><b>function</b> (x, y, text) {
-</code><code id="L4315"><span class="ln">4315</span>        <b>return</b> theText(<b>this</b>, x<span class="s"> || </span><span class="d">0</span>, y<span class="s"> || </span><span class="d">0</span>, Str(text));
-</code><code id="L4316"><span class="ln">4316</span>    };
-</code><code id="L4317"><span class="ln">4317</span><span class="c">    <span class="c">/*\</span>
-</span></code><code id="L4318"><span class="ln">4318</span><span class="c">    <span class="s"> * </span>Paper.set
-</span></code><code id="L4319"><span class="ln">4319</span><span class="c">     [ method ]
-</span></code><code id="L4320"><span class="ln">4320</span><span class="c">     **
-</span></code><code id="L4321"><span class="ln">4321</span><span class="c">    <span class="s"> * </span>Creates array-like object to keep and operate several elements at once.
-</span></code><code id="L4322"><span class="ln">4322</span><span class="c">    <span class="s"> * </span>Warning: it doesn’t create any elements <b>for</b> itself <b>in</b> the page, it just groups existing elements.
-</span></code><code id="L4323"><span class="ln">4323</span><span class="c">    <span class="s"> * </span>Sets act as pseudo elements — all methods available to an element can be used on a set.
-</span></code><code id="L4324"><span class="ln">4324</span><span class="c">    <span class="s"> = </span>(object) array-like object that represents set of elements
-</span></code><code id="L4325"><span class="ln">4325</span><span class="c">     **
-</span></code><code id="L4326"><span class="ln">4326</span><span class="c">     > Usage
-</span></code><code id="L4327"><span class="ln">4327</span><span class="c">    <span class="s"> | </span><b>var</b> st<span class="s"> = </span>paper.set();
-</span></code><code id="L4328"><span class="ln">4328</span><span class="c">    <span class="s"> | </span>st.push(
-</span></code><code id="L4329"><span class="ln">4329</span><span class="c">    <span class="s"> | </span>    paper.circle(<span class="d">10</span>, <span class="d">10</span>, <span class="d">5</span>),
-</span></code><code id="L4330"><span class="ln">4330</span><span class="c">    <span class="s"> | </span>    paper.circle(<span class="d">30</span>, <span class="d">10</span>, <span class="d">5</span>)
-</span></code><code id="L4331"><span class="ln">4331</span><span class="c">    <span class="s"> | </span>);
-</span></code><code id="L4332"><span class="ln">4332</span><span class="c">    <span class="s"> | </span>st.attr({fill: <i>"red"</i>});
-</span></code><code id="L4333"><span class="ln">4333</span><span class="c">    \*/</span>
-</code><code id="L4334"><span class="ln">4334</span>    paperproto.set<span class="s"> = </span><b>function</b> (itemsArray) {
-</code><code id="L4335"><span class="ln">4335</span>        arguments.length > <span class="d">1</span><span class="s"> &amp;&amp; </span>(itemsArray<span class="s"> = </span>Array.prototype.splice.call(arguments, <span class="d">0</span>, arguments.length));
-</code><code id="L4336"><span class="ln">4336</span>        <b>return</b> <b>new</b> Set(itemsArray);
-</code><code id="L4337"><span class="ln">4337</span>    };
-</code><code id="L4338"><span class="ln">4338</span><span class="c">    <span class="c">/*\</span>
-</span></code><code id="L4339"><span class="ln">4339</span><span class="c">    <span class="s"> * </span>Paper.setSize
-</span></code><code id="L4340"><span class="ln">4340</span><span class="c">     [ method ]
-</span></code><code id="L4341"><span class="ln">4341</span><span class="c">     **
-</span></code><code id="L4342"><span class="ln">4342</span><span class="c">    <span class="s"> * </span>If you need to change dimensions of the canvas call <b>this</b> method
+</span></code><code id="L4283"><span class="ln">4283</span><span class="c">     > Usage
+</span></code><code id="L4284"><span class="ln">4284</span><span class="c">    <span class="s"> | </span><b>var</b> c<span class="s"> = </span>paper.ellipse(<span class="d">50</span>, <span class="d">50</span>, <span class="d">40</span>, <span class="d">20</span>);
+</span></code><code id="L4285"><span class="ln">4285</span><span class="c">    \*/</span>
+</code><code id="L4286"><span class="ln">4286</span>    paperproto.ellipse<span class="s"> = </span><b>function</b> (x, y, rx, ry) {
+</code><code id="L4287"><span class="ln">4287</span>        <b>return</b> theEllipse(<b>this</b>, x<span class="s"> || </span><span class="d">0</span>, y<span class="s"> || </span><span class="d">0</span>, rx<span class="s"> || </span><span class="d">0</span>, ry<span class="s"> || </span><span class="d">0</span>);
+</code><code id="L4288"><span class="ln">4288</span>    };
+</code><code id="L4289"><span class="ln">4289</span><span class="c">    <span class="c">/*\</span>
+</span></code><code id="L4290"><span class="ln">4290</span><span class="c">    <span class="s"> * </span>Paper.path
+</span></code><code id="L4291"><span class="ln">4291</span><span class="c">     [ method ]
+</span></code><code id="L4292"><span class="ln">4292</span><span class="c">     **
+</span></code><code id="L4293"><span class="ln">4293</span><span class="c">    <span class="s"> * </span>Creates a path element by given path data string.
+</span></code><code id="L4294"><span class="ln">4294</span><span class="c">     **
+</span></code><code id="L4295"><span class="ln">4295</span><span class="c">     > Parameters
+</span></code><code id="L4296"><span class="ln">4296</span><span class="c">     **
+</span></code><code id="L4297"><span class="ln">4297</span><span class="c">    <span class="s"> - </span>pathString (string) path data <b>in</b> SVG path string format.
+</span></code><code id="L4298"><span class="ln">4298</span><span class="c">    <span class="s"> = </span>(object) Raphaël element object <b>with</b> type “ellipse”
+</span></code><code id="L4299"><span class="ln">4299</span><span class="c">     # Details of a path<i>'s data attribute'</i>s format are described <b>in</b> the &lt;a href=<i>"http:<span class="c">//www.w3.org/TR/SVG/paths.html#PathData"</i>>SVG specification&lt;/a>.</span>
+</span></code><code id="L4300"><span class="ln">4300</span><span class="c">     **
+</span></code><code id="L4301"><span class="ln">4301</span><span class="c">     > Usage
+</span></code><code id="L4302"><span class="ln">4302</span><span class="c">    <span class="s"> | </span><b>var</b> c<span class="s"> = </span>paper.path(<i>"M10 10L90 <span class="d">90</span>"</i>);
+</span></code><code id="L4303"><span class="ln">4303</span><span class="c">    <span class="s"> | </span><span class="c">// draw a diagonal line:</span>
+</span></code><code id="L4304"><span class="ln">4304</span><span class="c">    <span class="s"> | </span><span class="c">// move to <span class="d">10</span>,<span class="d">10</span>, line to <span class="d">90</span>,<span class="d">90</span></span>
+</span></code><code id="L4305"><span class="ln">4305</span><span class="c">    \*/</span>
+</code><code id="L4306"><span class="ln">4306</span>    paperproto.path<span class="s"> = </span><b>function</b> (pathString) {
+</code><code id="L4307"><span class="ln">4307</span>        pathString<span class="s"> &amp;&amp; </span>!R.is(pathString, string)<span class="s"> &amp;&amp; </span>!R.is(pathString[<span class="d">0</span>], array)<span class="s"> &amp;&amp; </span>(pathString += E);
+</code><code id="L4308"><span class="ln">4308</span>        <b>return</b> thePath(R.format[apply](R, arguments), <b>this</b>);
+</code><code id="L4309"><span class="ln">4309</span>    };
+</code><code id="L4310"><span class="ln">4310</span><span class="c">    <span class="c">/*\</span>
+</span></code><code id="L4311"><span class="ln">4311</span><span class="c">    <span class="s"> * </span>Paper.image
+</span></code><code id="L4312"><span class="ln">4312</span><span class="c">     [ method ]
+</span></code><code id="L4313"><span class="ln">4313</span><span class="c">     **
+</span></code><code id="L4314"><span class="ln">4314</span><span class="c">    <span class="s"> * </span>Embeds an image into the surface.
+</span></code><code id="L4315"><span class="ln">4315</span><span class="c">     **
+</span></code><code id="L4316"><span class="ln">4316</span><span class="c">     > Parameters
+</span></code><code id="L4317"><span class="ln">4317</span><span class="c">     **
+</span></code><code id="L4318"><span class="ln">4318</span><span class="c">    <span class="s"> - </span>src (string) URI of the source image
+</span></code><code id="L4319"><span class="ln">4319</span><span class="c">    <span class="s"> - </span>x (number) x coordinate position
+</span></code><code id="L4320"><span class="ln">4320</span><span class="c">    <span class="s"> - </span>y (number) y coordinate position
+</span></code><code id="L4321"><span class="ln">4321</span><span class="c">    <span class="s"> - </span>width (number) width of the image
+</span></code><code id="L4322"><span class="ln">4322</span><span class="c">    <span class="s"> - </span>height (number) height of the image
+</span></code><code id="L4323"><span class="ln">4323</span><span class="c">    <span class="s"> = </span>(object) Raphaël element object <b>with</b> type “image”
+</span></code><code id="L4324"><span class="ln">4324</span><span class="c">     **
+</span></code><code id="L4325"><span class="ln">4325</span><span class="c">     > Usage
+</span></code><code id="L4326"><span class="ln">4326</span><span class="c">    <span class="s"> | </span><b>var</b> c<span class="s"> = </span>paper.image(<i>"apple.png"</i>, <span class="d">10</span>, <span class="d">10</span>, <span class="d">80</span>, <span class="d">80</span>);
+</span></code><code id="L4327"><span class="ln">4327</span><span class="c">    \*/</span>
+</code><code id="L4328"><span class="ln">4328</span>    paperproto.image<span class="s"> = </span><b>function</b> (src, x, y, w, h) {
+</code><code id="L4329"><span class="ln">4329</span>        <b>return</b> theImage(<b>this</b>, src<span class="s"> || </span><i>"about:blank"</i>, x<span class="s"> || </span><span class="d">0</span>, y<span class="s"> || </span><span class="d">0</span>, w<span class="s"> || </span><span class="d">0</span>, h<span class="s"> || </span><span class="d">0</span>);
+</code><code id="L4330"><span class="ln">4330</span>    };
+</code><code id="L4331"><span class="ln">4331</span><span class="c">    <span class="c">/*\</span>
+</span></code><code id="L4332"><span class="ln">4332</span><span class="c">    <span class="s"> * </span>Paper.text
+</span></code><code id="L4333"><span class="ln">4333</span><span class="c">     [ method ]
+</span></code><code id="L4334"><span class="ln">4334</span><span class="c">     **
+</span></code><code id="L4335"><span class="ln">4335</span><span class="c">    <span class="s"> * </span>Draws a text string. If you need line breaks, put “\n” <b>in</b> the string.
+</span></code><code id="L4336"><span class="ln">4336</span><span class="c">     **
+</span></code><code id="L4337"><span class="ln">4337</span><span class="c">     > Parameters
+</span></code><code id="L4338"><span class="ln">4338</span><span class="c">     **
+</span></code><code id="L4339"><span class="ln">4339</span><span class="c">    <span class="s"> - </span>x (number) x coordinate position
+</span></code><code id="L4340"><span class="ln">4340</span><span class="c">    <span class="s"> - </span>y (number) y coordinate position
+</span></code><code id="L4341"><span class="ln">4341</span><span class="c">    <span class="s"> - </span>text (string) The text string to draw
+</span></code><code id="L4342"><span class="ln">4342</span><span class="c">    <span class="s"> = </span>(object) Raphaël element object <b>with</b> type “text”
 </span></code><code id="L4343"><span class="ln">4343</span><span class="c">     **
-</span></code><code id="L4344"><span class="ln">4344</span><span class="c">     > Parameters
-</span></code><code id="L4345"><span class="ln">4345</span><span class="c">     **
-</span></code><code id="L4346"><span class="ln">4346</span><span class="c">    <span class="s"> - </span>width (number) <b>new</b> width of the canvas
-</span></code><code id="L4347"><span class="ln">4347</span><span class="c">    <span class="s"> - </span>height (number) <b>new</b> height of the canvas
-</span></code><code id="L4348"><span class="ln">4348</span><span class="c">     > Usage
-</span></code><code id="L4349"><span class="ln">4349</span><span class="c">    <span class="s"> | </span><b>var</b> st<span class="s"> = </span>paper.set();
-</span></code><code id="L4350"><span class="ln">4350</span><span class="c">    <span class="s"> | </span>st.push(
-</span></code><code id="L4351"><span class="ln">4351</span><span class="c">    <span class="s"> | </span>    paper.circle(<span class="d">10</span>, <span class="d">10</span>, <span class="d">5</span>),
-</span></code><code id="L4352"><span class="ln">4352</span><span class="c">    <span class="s"> | </span>    paper.circle(<span class="d">30</span>, <span class="d">10</span>, <span class="d">5</span>)
-</span></code><code id="L4353"><span class="ln">4353</span><span class="c">    <span class="s"> | </span>);
-</span></code><code id="L4354"><span class="ln">4354</span><span class="c">    <span class="s"> | </span>st.attr({fill: <i>"red"</i>});
-</span></code><code id="L4355"><span class="ln">4355</span><span class="c">    \*/</span>
-</code><code id="L4356"><span class="ln">4356</span>    paperproto.setSize<span class="s"> = </span>setSize;
-</code><code id="L4357"><span class="ln">4357</span><span class="c">    <span class="c">/*\</span>
-</span></code><code id="L4358"><span class="ln">4358</span><span class="c">    <span class="s"> * </span>Paper.setViewBox
-</span></code><code id="L4359"><span class="ln">4359</span><span class="c">     [ method ]
-</span></code><code id="L4360"><span class="ln">4360</span><span class="c">     **
-</span></code><code id="L4361"><span class="ln">4361</span><span class="c">    <span class="s"> * </span>Sets the view box of the paper. Practically it gives you ability to zoom and pan whole paper surface by 
-</span></code><code id="L4362"><span class="ln">4362</span><span class="c">    <span class="s"> * </span>specifying <b>new</b> boundaries.
-</span></code><code id="L4363"><span class="ln">4363</span><span class="c">     **
-</span></code><code id="L4364"><span class="ln">4364</span><span class="c">     > Parameters
-</span></code><code id="L4365"><span class="ln">4365</span><span class="c">     **
-</span></code><code id="L4366"><span class="ln">4366</span><span class="c">     x, y, w, h, fit
-</span></code><code id="L4367"><span class="ln">4367</span><span class="c">    <span class="s"> - </span>x (number) <b>new</b> x position, <b>default</b> is `<span class="d">0</span>`
-</span></code><code id="L4368"><span class="ln">4368</span><span class="c">    <span class="s"> - </span>y (number) <b>new</b> y position, <b>default</b> is `<span class="d">0</span>`
-</span></code><code id="L4369"><span class="ln">4369</span><span class="c">    <span class="s"> - </span>w (number) <b>new</b> width of the canvas
-</span></code><code id="L4370"><span class="ln">4370</span><span class="c">    <span class="s"> - </span>h (number) <b>new</b> height of the canvas
-</span></code><code id="L4371"><span class="ln">4371</span><span class="c">    <span class="s"> - </span>fit (<b>boolean</b>) `<b>true</b>` <b>if</b> you want graphics to fit into <b>new</b> boundary box
-</span></code><code id="L4372"><span class="ln">4372</span><span class="c">    \*/</span>
-</code><code id="L4373"><span class="ln">4373</span>    paperproto.setViewBox<span class="s"> = </span>setViewBox;
-</code><code id="L4374"><span class="ln">4374</span><span class="c">    <span class="c">/*\</span>
-</span></code><code id="L4375"><span class="ln">4375</span><span class="c">    <span class="s"> * </span>Paper.top
-</span></code><code id="L4376"><span class="ln">4376</span><span class="c">     [ property ]
-</span></code><code id="L4377"><span class="ln">4377</span><span class="c">     **
-</span></code><code id="L4378"><span class="ln">4378</span><span class="c">    <span class="s"> * </span>Points to the topmost element on the paper
-</span></code><code id="L4379"><span class="ln">4379</span><span class="c">    \*/</span>
-</code><code id="L4380"><span class="ln">4380</span><span class="c">    <span class="c">/*\</span>
-</span></code><code id="L4381"><span class="ln">4381</span><span class="c">    <span class="s"> * </span>Paper.bottom
-</span></code><code id="L4382"><span class="ln">4382</span><span class="c">     [ property ]
-</span></code><code id="L4383"><span class="ln">4383</span><span class="c">     **
-</span></code><code id="L4384"><span class="ln">4384</span><span class="c">    <span class="s"> * </span>Points to the bottom element on the paper
-</span></code><code id="L4385"><span class="ln">4385</span><span class="c">    \*/</span>
-</code><code id="L4386"><span class="ln">4386</span>    paperproto.top<span class="s"> = </span>paperproto.bottom<span class="s"> = </span><b>null</b>;
-</code><code id="L4387"><span class="ln">4387</span><span class="c">    <span class="c">/*\</span>
-</span></code><code id="L4388"><span class="ln">4388</span><span class="c">    <span class="s"> * </span>Paper.raphael
-</span></code><code id="L4389"><span class="ln">4389</span><span class="c">     [ property ]
-</span></code><code id="L4390"><span class="ln">4390</span><span class="c">     **
-</span></code><code id="L4391"><span class="ln">4391</span><span class="c">    <span class="s"> * </span>Points to the @Raphael object/<b>function</b>
-</span></code><code id="L4392"><span class="ln">4392</span><span class="c">    \*/</span>
-</code><code id="L4393"><span class="ln">4393</span>    paperproto.raphael<span class="s"> = </span>R;
-</code><code id="L4394"><span class="ln">4394</span>    <b>var</b> getOffset<span class="s"> = </span><b>function</b> (elem) {
-</code><code id="L4395"><span class="ln">4395</span>        <b>var</b> box<span class="s"> = </span>elem.getBoundingClientRect(),
-</code><code id="L4396"><span class="ln">4396</span>            doc<span class="s"> = </span>elem.ownerDocument,
-</code><code id="L4397"><span class="ln">4397</span>            body<span class="s"> = </span>doc.body,
-</code><code id="L4398"><span class="ln">4398</span>            docElem<span class="s"> = </span>doc.documentElement,
-</code><code id="L4399"><span class="ln">4399</span>            clientTop<span class="s"> = </span>docElem.clientTop<span class="s"> || </span>body.clientTop<span class="s"> || </span><span class="d">0</span>, clientLeft<span class="s"> = </span>docElem.clientLeft<span class="s"> || </span>body.clientLeft<span class="s"> || </span><span class="d">0</span>,
-</code><code id="L4400"><span class="ln">4400</span>            top <span class="s"> = </span>box.top <span class="s"> + </span>(g.win.pageYOffset<span class="s"> || </span>docElem.scrollTop<span class="s"> || </span>body.scrollTop )<span class="s"> - </span>clientTop,
-</code><code id="L4401"><span class="ln">4401</span>            left<span class="s"> = </span>box.left<span class="s"> + </span>(g.win.pageXOffset<span class="s"> || </span>docElem.scrollLeft<span class="s"> || </span>body.scrollLeft)<span class="s"> - </span>clientLeft;
-</code><code id="L4402"><span class="ln">4402</span>        <b>return</b> {
-</code><code id="L4403"><span class="ln">4403</span>            y: top,
-</code><code id="L4404"><span class="ln">4404</span>            x: left
-</code><code id="L4405"><span class="ln">4405</span>        };
-</code><code id="L4406"><span class="ln">4406</span>    };
+</span></code><code id="L4344"><span class="ln">4344</span><span class="c">     > Usage
+</span></code><code id="L4345"><span class="ln">4345</span><span class="c">    <span class="s"> | </span><b>var</b> t<span class="s"> = </span>paper.text(<span class="d">50</span>, <span class="d">50</span>, <i>"Raphaël\nkicks\nbutt!"</i>);
+</span></code><code id="L4346"><span class="ln">4346</span><span class="c">    \*/</span>
+</code><code id="L4347"><span class="ln">4347</span>    paperproto.text<span class="s"> = </span><b>function</b> (x, y, text) {
+</code><code id="L4348"><span class="ln">4348</span>        <b>return</b> theText(<b>this</b>, x<span class="s"> || </span><span class="d">0</span>, y<span class="s"> || </span><span class="d">0</span>, Str(text));
+</code><code id="L4349"><span class="ln">4349</span>    };
+</code><code id="L4350"><span class="ln">4350</span><span class="c">    <span class="c">/*\</span>
+</span></code><code id="L4351"><span class="ln">4351</span><span class="c">    <span class="s"> * </span>Paper.set
+</span></code><code id="L4352"><span class="ln">4352</span><span class="c">     [ method ]
+</span></code><code id="L4353"><span class="ln">4353</span><span class="c">     **
+</span></code><code id="L4354"><span class="ln">4354</span><span class="c">    <span class="s"> * </span>Creates array-like object to keep and operate several elements at once.
+</span></code><code id="L4355"><span class="ln">4355</span><span class="c">    <span class="s"> * </span>Warning: it doesn’t create any elements <b>for</b> itself <b>in</b> the page, it just groups existing elements.
+</span></code><code id="L4356"><span class="ln">4356</span><span class="c">    <span class="s"> * </span>Sets act as pseudo elements — all methods available to an element can be used on a set.
+</span></code><code id="L4357"><span class="ln">4357</span><span class="c">    <span class="s"> = </span>(object) array-like object that represents set of elements
+</span></code><code id="L4358"><span class="ln">4358</span><span class="c">     **
+</span></code><code id="L4359"><span class="ln">4359</span><span class="c">     > Usage
+</span></code><code id="L4360"><span class="ln">4360</span><span class="c">    <span class="s"> | </span><b>var</b> st<span class="s"> = </span>paper.set();
+</span></code><code id="L4361"><span class="ln">4361</span><span class="c">    <span class="s"> | </span>st.push(
+</span></code><code id="L4362"><span class="ln">4362</span><span class="c">    <span class="s"> | </span>    paper.circle(<span class="d">10</span>, <span class="d">10</span>, <span class="d">5</span>),
+</span></code><code id="L4363"><span class="ln">4363</span><span class="c">    <span class="s"> | </span>    paper.circle(<span class="d">30</span>, <span class="d">10</span>, <span class="d">5</span>)
+</span></code><code id="L4364"><span class="ln">4364</span><span class="c">    <span class="s"> | </span>);
+</span></code><code id="L4365"><span class="ln">4365</span><span class="c">    <span class="s"> | </span>st.attr({fill: <i>"red"</i>});
+</span></code><code id="L4366"><span class="ln">4366</span><span class="c">    \*/</span>
+</code><code id="L4367"><span class="ln">4367</span>    paperproto.set<span class="s"> = </span><b>function</b> (itemsArray) {
+</code><code id="L4368"><span class="ln">4368</span>        arguments.length > <span class="d">1</span><span class="s"> &amp;&amp; </span>(itemsArray<span class="s"> = </span>Array.prototype.splice.call(arguments, <span class="d">0</span>, arguments.length));
+</code><code id="L4369"><span class="ln">4369</span>        <b>return</b> <b>new</b> Set(itemsArray);
+</code><code id="L4370"><span class="ln">4370</span>    };
+</code><code id="L4371"><span class="ln">4371</span><span class="c">    <span class="c">/*\</span>
+</span></code><code id="L4372"><span class="ln">4372</span><span class="c">    <span class="s"> * </span>Paper.setSize
+</span></code><code id="L4373"><span class="ln">4373</span><span class="c">     [ method ]
+</span></code><code id="L4374"><span class="ln">4374</span><span class="c">     **
+</span></code><code id="L4375"><span class="ln">4375</span><span class="c">    <span class="s"> * </span>If you need to change dimensions of the canvas call <b>this</b> method
+</span></code><code id="L4376"><span class="ln">4376</span><span class="c">     **
+</span></code><code id="L4377"><span class="ln">4377</span><span class="c">     > Parameters
+</span></code><code id="L4378"><span class="ln">4378</span><span class="c">     **
+</span></code><code id="L4379"><span class="ln">4379</span><span class="c">    <span class="s"> - </span>width (number) <b>new</b> width of the canvas
+</span></code><code id="L4380"><span class="ln">4380</span><span class="c">    <span class="s"> - </span>height (number) <b>new</b> height of the canvas
+</span></code><code id="L4381"><span class="ln">4381</span><span class="c">     > Usage
+</span></code><code id="L4382"><span class="ln">4382</span><span class="c">    <span class="s"> | </span><b>var</b> st<span class="s"> = </span>paper.set();
+</span></code><code id="L4383"><span class="ln">4383</span><span class="c">    <span class="s"> | </span>st.push(
+</span></code><code id="L4384"><span class="ln">4384</span><span class="c">    <span class="s"> | </span>    paper.circle(<span class="d">10</span>, <span class="d">10</span>, <span class="d">5</span>),
+</span></code><code id="L4385"><span class="ln">4385</span><span class="c">    <span class="s"> | </span>    paper.circle(<span class="d">30</span>, <span class="d">10</span>, <span class="d">5</span>)
+</span></code><code id="L4386"><span class="ln">4386</span><span class="c">    <span class="s"> | </span>);
+</span></code><code id="L4387"><span class="ln">4387</span><span class="c">    <span class="s"> | </span>st.attr({fill: <i>"red"</i>});
+</span></code><code id="L4388"><span class="ln">4388</span><span class="c">    \*/</span>
+</code><code id="L4389"><span class="ln">4389</span>    paperproto.setSize<span class="s"> = </span>setSize;
+</code><code id="L4390"><span class="ln">4390</span><span class="c">    <span class="c">/*\</span>
+</span></code><code id="L4391"><span class="ln">4391</span><span class="c">    <span class="s"> * </span>Paper.setViewBox
+</span></code><code id="L4392"><span class="ln">4392</span><span class="c">     [ method ]
+</span></code><code id="L4393"><span class="ln">4393</span><span class="c">     **
+</span></code><code id="L4394"><span class="ln">4394</span><span class="c">    <span class="s"> * </span>Sets the view box of the paper. Practically it gives you ability to zoom and pan whole paper surface by 
+</span></code><code id="L4395"><span class="ln">4395</span><span class="c">    <span class="s"> * </span>specifying <b>new</b> boundaries.
+</span></code><code id="L4396"><span class="ln">4396</span><span class="c">     **
+</span></code><code id="L4397"><span class="ln">4397</span><span class="c">     > Parameters
+</span></code><code id="L4398"><span class="ln">4398</span><span class="c">     **
+</span></code><code id="L4399"><span class="ln">4399</span><span class="c">     x, y, w, h, fit
+</span></code><code id="L4400"><span class="ln">4400</span><span class="c">    <span class="s"> - </span>x (number) <b>new</b> x position, <b>default</b> is `<span class="d">0</span>`
+</span></code><code id="L4401"><span class="ln">4401</span><span class="c">    <span class="s"> - </span>y (number) <b>new</b> y position, <b>default</b> is `<span class="d">0</span>`
+</span></code><code id="L4402"><span class="ln">4402</span><span class="c">    <span class="s"> - </span>w (number) <b>new</b> width of the canvas
+</span></code><code id="L4403"><span class="ln">4403</span><span class="c">    <span class="s"> - </span>h (number) <b>new</b> height of the canvas
+</span></code><code id="L4404"><span class="ln">4404</span><span class="c">    <span class="s"> - </span>fit (<b>boolean</b>) `<b>true</b>` <b>if</b> you want graphics to fit into <b>new</b> boundary box
+</span></code><code id="L4405"><span class="ln">4405</span><span class="c">    \*/</span>
+</code><code id="L4406"><span class="ln">4406</span>    paperproto.setViewBox<span class="s"> = </span>setViewBox;
 </code><code id="L4407"><span class="ln">4407</span><span class="c">    <span class="c">/*\</span>
-</span></code><code id="L4408"><span class="ln">4408</span><span class="c">    <span class="s"> * </span>Paper.getElementByPoint
-</span></code><code id="L4409"><span class="ln">4409</span><span class="c">     [ method ]
+</span></code><code id="L4408"><span class="ln">4408</span><span class="c">    <span class="s"> * </span>Paper.top
+</span></code><code id="L4409"><span class="ln">4409</span><span class="c">     [ property ]
 </span></code><code id="L4410"><span class="ln">4410</span><span class="c">     **
-</span></code><code id="L4411"><span class="ln">4411</span><span class="c">    <span class="s"> * </span>Returns you topmost element under given point.
-</span></code><code id="L4412"><span class="ln">4412</span><span class="c">     **
-</span></code><code id="L4413"><span class="ln">4413</span><span class="c">    <span class="s"> = </span>(object) Raphaël element object
-</span></code><code id="L4414"><span class="ln">4414</span><span class="c">     > Parameters
-</span></code><code id="L4415"><span class="ln">4415</span><span class="c">     **
-</span></code><code id="L4416"><span class="ln">4416</span><span class="c">    <span class="s"> - </span>x (number) x coordinate from the top left corner of the window
-</span></code><code id="L4417"><span class="ln">4417</span><span class="c">    <span class="s"> - </span>y (number) y coordinate from the top left corner of the window
-</span></code><code id="L4418"><span class="ln">4418</span><span class="c">     > Usage
-</span></code><code id="L4419"><span class="ln">4419</span><span class="c">    <span class="s"> | </span>paper.getElementByPoint(mouseX, mouseY).attr({stroke: <i>"#f00"</i>});
-</span></code><code id="L4420"><span class="ln">4420</span><span class="c">    \*/</span>
-</code><code id="L4421"><span class="ln">4421</span>    paperproto.getElementByPoint<span class="s"> = </span><b>function</b> (x, y) {
-</code><code id="L4422"><span class="ln">4422</span>        <b>var</b> paper<span class="s"> = </span><b>this</b>,
-</code><code id="L4423"><span class="ln">4423</span>            svg<span class="s"> = </span>paper.canvas,
-</code><code id="L4424"><span class="ln">4424</span>            target<span class="s"> = </span>g.doc.elementFromPoint(x, y);
-</code><code id="L4425"><span class="ln">4425</span>        <b>if</b> (g.win.opera<span class="s"> &amp;&amp; </span>target.tagName<span class="s"> == </span><i>"svg"</i>) {
-</code><code id="L4426"><span class="ln">4426</span>            <b>var</b> so<span class="s"> = </span>getOffset(svg),
-</code><code id="L4427"><span class="ln">4427</span>                sr<span class="s"> = </span>svg.createSVGRect();
-</code><code id="L4428"><span class="ln">4428</span>            sr.x<span class="s"> = </span>x<span class="s"> - </span>so.x;
-</code><code id="L4429"><span class="ln">4429</span>            sr.y<span class="s"> = </span>y<span class="s"> - </span>so.y;
-</code><code id="L4430"><span class="ln">4430</span>            sr.width<span class="s"> = </span>sr.height<span class="s"> = </span><span class="d">1</span>;
-</code><code id="L4431"><span class="ln">4431</span>            <b>var</b> hits<span class="s"> = </span>svg.getIntersectionList(sr, <b>null</b>);
-</code><code id="L4432"><span class="ln">4432</span>            <b>if</b> (hits.length) {
-</code><code id="L4433"><span class="ln">4433</span>                target<span class="s"> = </span>hits[hits.length<span class="s"> - </span><span class="d">1</span>];
-</code><code id="L4434"><span class="ln">4434</span>            }
-</code><code id="L4435"><span class="ln">4435</span>        }
-</code><code id="L4436"><span class="ln">4436</span>        <b>if</b> (!target) {
-</code><code id="L4437"><span class="ln">4437</span>            <b>return</b> <b>null</b>;
-</code><code id="L4438"><span class="ln">4438</span>        }
-</code><code id="L4439"><span class="ln">4439</span>        <b>while</b> (target.parentNode<span class="s"> &amp;&amp; </span>target != svg.parentNode<span class="s"> &amp;&amp; </span>!target.raphael) {
-</code><code id="L4440"><span class="ln">4440</span>            target<span class="s"> = </span>target.parentNode;
-</code><code id="L4441"><span class="ln">4441</span>        }
-</code><code id="L4442"><span class="ln">4442</span>        target<span class="s"> == </span>paper.canvas.parentNode<span class="s"> &amp;&amp; </span>(target<span class="s"> = </span>svg);
-</code><code id="L4443"><span class="ln">4443</span>        target<span class="s"> = </span>target<span class="s"> &amp;&amp; </span>target.raphael ? paper.getById(target.raphaelid) : <b>null</b>;
-</code><code id="L4444"><span class="ln">4444</span>        <b>return</b> target;
-</code><code id="L4445"><span class="ln">4445</span>    };
-</code><code id="L4446"><span class="ln">4446</span><span class="c">    <span class="c">/*\</span>
-</span></code><code id="L4447"><span class="ln">4447</span><span class="c">    <span class="s"> * </span>Paper.getById
-</span></code><code id="L4448"><span class="ln">4448</span><span class="c">     [ method ]
-</span></code><code id="L4449"><span class="ln">4449</span><span class="c">     **
-</span></code><code id="L4450"><span class="ln">4450</span><span class="c">    <span class="s"> * </span>Returns you element by its internal ID.
-</span></code><code id="L4451"><span class="ln">4451</span><span class="c">     **
-</span></code><code id="L4452"><span class="ln">4452</span><span class="c">     > Parameters
-</span></code><code id="L4453"><span class="ln">4453</span><span class="c">     **
-</span></code><code id="L4454"><span class="ln">4454</span><span class="c">    <span class="s"> - </span>id (number) id
-</span></code><code id="L4455"><span class="ln">4455</span><span class="c">    <span class="s"> = </span>(object) Raphaël element object
-</span></code><code id="L4456"><span class="ln">4456</span><span class="c">    \*/</span>
-</code><code id="L4457"><span class="ln">4457</span>    paperproto.getById<span class="s"> = </span><b>function</b> (id) {
-</code><code id="L4458"><span class="ln">4458</span>        <b>var</b> bot<span class="s"> = </span><b>this</b>.bottom;
-</code><code id="L4459"><span class="ln">4459</span>        <b>while</b> (bot) {
-</code><code id="L4460"><span class="ln">4460</span>            <b>if</b> (bot.id<span class="s"> == </span>id) {
-</code><code id="L4461"><span class="ln">4461</span>                <b>return</b> bot;
-</code><code id="L4462"><span class="ln">4462</span>            }
-</code><code id="L4463"><span class="ln">4463</span>            bot<span class="s"> = </span>bot.next;
-</code><code id="L4464"><span class="ln">4464</span>        }
-</code><code id="L4465"><span class="ln">4465</span>        <b>return</b> <b>null</b>;
-</code><code id="L4466"><span class="ln">4466</span>    };
-</code><code id="L4467"><span class="ln">4467</span><span class="c">    <span class="c">/*\</span>
-</span></code><code id="L4468"><span class="ln">4468</span><span class="c">    <span class="s"> * </span>Paper.forEach
-</span></code><code id="L4469"><span class="ln">4469</span><span class="c">     [ method ]
-</span></code><code id="L4470"><span class="ln">4470</span><span class="c">     **
-</span></code><code id="L4471"><span class="ln">4471</span><span class="c">    <span class="s"> * </span>Executes given <b>function</b> <b>for</b> each element on the paper
-</span></code><code id="L4472"><span class="ln">4472</span><span class="c">     *
-</span></code><code id="L4473"><span class="ln">4473</span><span class="c">    <span class="s"> * </span>If callback <b>function</b> returns `<b>false</b>` it will stop loop running.
-</span></code><code id="L4474"><span class="ln">4474</span><span class="c">     **
-</span></code><code id="L4475"><span class="ln">4475</span><span class="c">     > Parameters
-</span></code><code id="L4476"><span class="ln">4476</span><span class="c">     **
-</span></code><code id="L4477"><span class="ln">4477</span><span class="c">    <span class="s"> - </span>callback (<b>function</b>) <b>function</b> to run
-</span></code><code id="L4478"><span class="ln">4478</span><span class="c">    <span class="s"> - </span>thisArg (object) context object <b>for</b> the callback
-</span></code><code id="L4479"><span class="ln">4479</span><span class="c">    <span class="s"> = </span>(object) Paper object
-</span></code><code id="L4480"><span class="ln">4480</span><span class="c">    \*/</span>
-</code><code id="L4481"><span class="ln">4481</span>    paperproto.forEach<span class="s"> = </span><b>function</b> (callback, thisArg) {
-</code><code id="L4482"><span class="ln">4482</span>        <b>var</b> bot<span class="s"> = </span><b>this</b>.bottom;
-</code><code id="L4483"><span class="ln">4483</span>        <b>while</b> (bot) {
-</code><code id="L4484"><span class="ln">4484</span>            <b>if</b> (callback.call(thisArg, bot)<span class="s"> === </span><b>false</b>) {
-</code><code id="L4485"><span class="ln">4485</span>                <b>return</b> <b>this</b>;
-</code><code id="L4486"><span class="ln">4486</span>            }
-</code><code id="L4487"><span class="ln">4487</span>            bot<span class="s"> = </span>bot.next;
-</code><code id="L4488"><span class="ln">4488</span>        }
-</code><code id="L4489"><span class="ln">4489</span>        <b>return</b> <b>this</b>;
-</code><code id="L4490"><span class="ln">4490</span>    };
-</code><code id="L4491"><span class="ln">4491</span>    <b>function</b> x_y() {
-</code><code id="L4492"><span class="ln">4492</span>        <b>return</b> <b>this</b>.x<span class="s"> + </span>S<span class="s"> + </span><b>this</b>.y;
-</code><code id="L4493"><span class="ln">4493</span>    }
-</code><code id="L4494"><span class="ln">4494</span>    <b>function</b> x_y_w_h() {
-</code><code id="L4495"><span class="ln">4495</span>        <b>return</b> <b>this</b>.x<span class="s"> + </span>S<span class="s"> + </span><b>this</b>.y<span class="s"> + </span>S<span class="s"> + </span><b>this</b>.width<span class="s"> + </span><i>"\xd7"</i><span class="s"> + </span><b>this</b>.height;
-</code><code id="L4496"><span class="ln">4496</span>    }
-</code><code id="L4497"><span class="ln">4497</span><span class="c">    <span class="c">/*\</span>
-</span></code><code id="L4498"><span class="ln">4498</span><span class="c">    <span class="s"> * </span>Element.getBBox
-</span></code><code id="L4499"><span class="ln">4499</span><span class="c">     [ method ]
-</span></code><code id="L4500"><span class="ln">4500</span><span class="c">     **
-</span></code><code id="L4501"><span class="ln">4501</span><span class="c">    <span class="s"> * </span>Return bounding box <b>for</b> a given element
-</span></code><code id="L4502"><span class="ln">4502</span><span class="c">     **
-</span></code><code id="L4503"><span class="ln">4503</span><span class="c">     > Parameters
-</span></code><code id="L4504"><span class="ln">4504</span><span class="c">     **
-</span></code><code id="L4505"><span class="ln">4505</span><span class="c">    <span class="s"> - </span>isWithoutTransform (<b>boolean</b>) flag, `<b>true</b>` <b>if</b> you want to have bounding box before transformations. Default is `<b>false</b>`.
-</span></code><code id="L4506"><span class="ln">4506</span><span class="c">    <span class="s"> = </span>(object) Bounding box object:
-</span></code><code id="L4507"><span class="ln">4507</span><span class="c">     o {
-</span></code><code id="L4508"><span class="ln">4508</span><span class="c">     o     x: (number) top left corner x
-</span></code><code id="L4509"><span class="ln">4509</span><span class="c">     o     y: (number) top left corner y
-</span></code><code id="L4510"><span class="ln">4510</span><span class="c">     o     width: (number) width
-</span></code><code id="L4511"><span class="ln">4511</span><span class="c">     o     height: (number) height
-</span></code><code id="L4512"><span class="ln">4512</span><span class="c">     o }
+</span></code><code id="L4411"><span class="ln">4411</span><span class="c">    <span class="s"> * </span>Points to the topmost element on the paper
+</span></code><code id="L4412"><span class="ln">4412</span><span class="c">    \*/</span>
+</code><code id="L4413"><span class="ln">4413</span><span class="c">    <span class="c">/*\</span>
+</span></code><code id="L4414"><span class="ln">4414</span><span class="c">    <span class="s"> * </span>Paper.bottom
+</span></code><code id="L4415"><span class="ln">4415</span><span class="c">     [ property ]
+</span></code><code id="L4416"><span class="ln">4416</span><span class="c">     **
+</span></code><code id="L4417"><span class="ln">4417</span><span class="c">    <span class="s"> * </span>Points to the bottom element on the paper
+</span></code><code id="L4418"><span class="ln">4418</span><span class="c">    \*/</span>
+</code><code id="L4419"><span class="ln">4419</span>    paperproto.top<span class="s"> = </span>paperproto.bottom<span class="s"> = </span><b>null</b>;
+</code><code id="L4420"><span class="ln">4420</span><span class="c">    <span class="c">/*\</span>
+</span></code><code id="L4421"><span class="ln">4421</span><span class="c">    <span class="s"> * </span>Paper.raphael
+</span></code><code id="L4422"><span class="ln">4422</span><span class="c">     [ property ]
+</span></code><code id="L4423"><span class="ln">4423</span><span class="c">     **
+</span></code><code id="L4424"><span class="ln">4424</span><span class="c">    <span class="s"> * </span>Points to the @Raphael object/<b>function</b>
+</span></code><code id="L4425"><span class="ln">4425</span><span class="c">    \*/</span>
+</code><code id="L4426"><span class="ln">4426</span>    paperproto.raphael<span class="s"> = </span>R;
+</code><code id="L4427"><span class="ln">4427</span>    <b>var</b> getOffset<span class="s"> = </span><b>function</b> (elem) {
+</code><code id="L4428"><span class="ln">4428</span>        <b>var</b> box<span class="s"> = </span>elem.getBoundingClientRect(),
+</code><code id="L4429"><span class="ln">4429</span>            doc<span class="s"> = </span>elem.ownerDocument,
+</code><code id="L4430"><span class="ln">4430</span>            body<span class="s"> = </span>doc.body,
+</code><code id="L4431"><span class="ln">4431</span>            docElem<span class="s"> = </span>doc.documentElement,
+</code><code id="L4432"><span class="ln">4432</span>            clientTop<span class="s"> = </span>docElem.clientTop<span class="s"> || </span>body.clientTop<span class="s"> || </span><span class="d">0</span>, clientLeft<span class="s"> = </span>docElem.clientLeft<span class="s"> || </span>body.clientLeft<span class="s"> || </span><span class="d">0</span>,
+</code><code id="L4433"><span class="ln">4433</span>            top <span class="s"> = </span>box.top <span class="s"> + </span>(g.win.pageYOffset<span class="s"> || </span>docElem.scrollTop<span class="s"> || </span>body.scrollTop )<span class="s"> - </span>clientTop,
+</code><code id="L4434"><span class="ln">4434</span>            left<span class="s"> = </span>box.left<span class="s"> + </span>(g.win.pageXOffset<span class="s"> || </span>docElem.scrollLeft<span class="s"> || </span>body.scrollLeft)<span class="s"> - </span>clientLeft;
+</code><code id="L4435"><span class="ln">4435</span>        <b>return</b> {
+</code><code id="L4436"><span class="ln">4436</span>            y: top,
+</code><code id="L4437"><span class="ln">4437</span>            x: left
+</code><code id="L4438"><span class="ln">4438</span>        };
+</code><code id="L4439"><span class="ln">4439</span>    };
+</code><code id="L4440"><span class="ln">4440</span><span class="c">    <span class="c">/*\</span>
+</span></code><code id="L4441"><span class="ln">4441</span><span class="c">    <span class="s"> * </span>Paper.getElementByPoint
+</span></code><code id="L4442"><span class="ln">4442</span><span class="c">     [ method ]
+</span></code><code id="L4443"><span class="ln">4443</span><span class="c">     **
+</span></code><code id="L4444"><span class="ln">4444</span><span class="c">    <span class="s"> * </span>Returns you topmost element under given point.
+</span></code><code id="L4445"><span class="ln">4445</span><span class="c">     **
+</span></code><code id="L4446"><span class="ln">4446</span><span class="c">    <span class="s"> = </span>(object) Raphaël element object
+</span></code><code id="L4447"><span class="ln">4447</span><span class="c">     > Parameters
+</span></code><code id="L4448"><span class="ln">4448</span><span class="c">     **
+</span></code><code id="L4449"><span class="ln">4449</span><span class="c">    <span class="s"> - </span>x (number) x coordinate from the top left corner of the window
+</span></code><code id="L4450"><span class="ln">4450</span><span class="c">    <span class="s"> - </span>y (number) y coordinate from the top left corner of the window
+</span></code><code id="L4451"><span class="ln">4451</span><span class="c">     > Usage
+</span></code><code id="L4452"><span class="ln">4452</span><span class="c">    <span class="s"> | </span>paper.getElementByPoint(mouseX, mouseY).attr({stroke: <i>"#f00"</i>});
+</span></code><code id="L4453"><span class="ln">4453</span><span class="c">    \*/</span>
+</code><code id="L4454"><span class="ln">4454</span>    paperproto.getElementByPoint<span class="s"> = </span><b>function</b> (x, y) {
+</code><code id="L4455"><span class="ln">4455</span>        <b>var</b> paper<span class="s"> = </span><b>this</b>,
+</code><code id="L4456"><span class="ln">4456</span>            svg<span class="s"> = </span>paper.canvas,
+</code><code id="L4457"><span class="ln">4457</span>            target<span class="s"> = </span>g.doc.elementFromPoint(x, y);
+</code><code id="L4458"><span class="ln">4458</span>        <b>if</b> (g.win.opera<span class="s"> &amp;&amp; </span>target.tagName<span class="s"> == </span><i>"svg"</i>) {
+</code><code id="L4459"><span class="ln">4459</span>            <b>var</b> so<span class="s"> = </span>getOffset(svg),
+</code><code id="L4460"><span class="ln">4460</span>                sr<span class="s"> = </span>svg.createSVGRect();
+</code><code id="L4461"><span class="ln">4461</span>            sr.x<span class="s"> = </span>x<span class="s"> - </span>so.x;
+</code><code id="L4462"><span class="ln">4462</span>            sr.y<span class="s"> = </span>y<span class="s"> - </span>so.y;
+</code><code id="L4463"><span class="ln">4463</span>            sr.width<span class="s"> = </span>sr.height<span class="s"> = </span><span class="d">1</span>;
+</code><code id="L4464"><span class="ln">4464</span>            <b>var</b> hits<span class="s"> = </span>svg.getIntersectionList(sr, <b>null</b>);
+</code><code id="L4465"><span class="ln">4465</span>            <b>if</b> (hits.length) {
+</code><code id="L4466"><span class="ln">4466</span>                target<span class="s"> = </span>hits[hits.length<span class="s"> - </span><span class="d">1</span>];
+</code><code id="L4467"><span class="ln">4467</span>            }
+</code><code id="L4468"><span class="ln">4468</span>        }
+</code><code id="L4469"><span class="ln">4469</span>        <b>if</b> (!target) {
+</code><code id="L4470"><span class="ln">4470</span>            <b>return</b> <b>null</b>;
+</code><code id="L4471"><span class="ln">4471</span>        }
+</code><code id="L4472"><span class="ln">4472</span>        <b>while</b> (target.parentNode<span class="s"> &amp;&amp; </span>target != svg.parentNode<span class="s"> &amp;&amp; </span>!target.raphael) {
+</code><code id="L4473"><span class="ln">4473</span>            target<span class="s"> = </span>target.parentNode;
+</code><code id="L4474"><span class="ln">4474</span>        }
+</code><code id="L4475"><span class="ln">4475</span>        target<span class="s"> == </span>paper.canvas.parentNode<span class="s"> &amp;&amp; </span>(target<span class="s"> = </span>svg);
+</code><code id="L4476"><span class="ln">4476</span>        target<span class="s"> = </span>target<span class="s"> &amp;&amp; </span>target.raphael ? paper.getById(target.raphaelid) : <b>null</b>;
+</code><code id="L4477"><span class="ln">4477</span>        <b>return</b> target;
+</code><code id="L4478"><span class="ln">4478</span>    };
+</code><code id="L4479"><span class="ln">4479</span><span class="c">    <span class="c">/*\</span>
+</span></code><code id="L4480"><span class="ln">4480</span><span class="c">    <span class="s"> * </span>Paper.getById
+</span></code><code id="L4481"><span class="ln">4481</span><span class="c">     [ method ]
+</span></code><code id="L4482"><span class="ln">4482</span><span class="c">     **
+</span></code><code id="L4483"><span class="ln">4483</span><span class="c">    <span class="s"> * </span>Returns you element by its internal ID.
+</span></code><code id="L4484"><span class="ln">4484</span><span class="c">     **
+</span></code><code id="L4485"><span class="ln">4485</span><span class="c">     > Parameters
+</span></code><code id="L4486"><span class="ln">4486</span><span class="c">     **
+</span></code><code id="L4487"><span class="ln">4487</span><span class="c">    <span class="s"> - </span>id (number) id
+</span></code><code id="L4488"><span class="ln">4488</span><span class="c">    <span class="s"> = </span>(object) Raphaël element object
+</span></code><code id="L4489"><span class="ln">4489</span><span class="c">    \*/</span>
+</code><code id="L4490"><span class="ln">4490</span>    paperproto.getById<span class="s"> = </span><b>function</b> (id) {
+</code><code id="L4491"><span class="ln">4491</span>        <b>var</b> bot<span class="s"> = </span><b>this</b>.bottom;
+</code><code id="L4492"><span class="ln">4492</span>        <b>while</b> (bot) {
+</code><code id="L4493"><span class="ln">4493</span>            <b>if</b> (bot.id<span class="s"> == </span>id) {
+</code><code id="L4494"><span class="ln">4494</span>                <b>return</b> bot;
+</code><code id="L4495"><span class="ln">4495</span>            }
+</code><code id="L4496"><span class="ln">4496</span>            bot<span class="s"> = </span>bot.next;
+</code><code id="L4497"><span class="ln">4497</span>        }
+</code><code id="L4498"><span class="ln">4498</span>        <b>return</b> <b>null</b>;
+</code><code id="L4499"><span class="ln">4499</span>    };
+</code><code id="L4500"><span class="ln">4500</span><span class="c">    <span class="c">/*\</span>
+</span></code><code id="L4501"><span class="ln">4501</span><span class="c">    <span class="s"> * </span>Paper.forEach
+</span></code><code id="L4502"><span class="ln">4502</span><span class="c">     [ method ]
+</span></code><code id="L4503"><span class="ln">4503</span><span class="c">     **
+</span></code><code id="L4504"><span class="ln">4504</span><span class="c">    <span class="s"> * </span>Executes given <b>function</b> <b>for</b> each element on the paper
+</span></code><code id="L4505"><span class="ln">4505</span><span class="c">     *
+</span></code><code id="L4506"><span class="ln">4506</span><span class="c">    <span class="s"> * </span>If callback <b>function</b> returns `<b>false</b>` it will stop loop running.
+</span></code><code id="L4507"><span class="ln">4507</span><span class="c">     **
+</span></code><code id="L4508"><span class="ln">4508</span><span class="c">     > Parameters
+</span></code><code id="L4509"><span class="ln">4509</span><span class="c">     **
+</span></code><code id="L4510"><span class="ln">4510</span><span class="c">    <span class="s"> - </span>callback (<b>function</b>) <b>function</b> to run
+</span></code><code id="L4511"><span class="ln">4511</span><span class="c">    <span class="s"> - </span>thisArg (object) context object <b>for</b> the callback
+</span></code><code id="L4512"><span class="ln">4512</span><span class="c">    <span class="s"> = </span>(object) Paper object
 </span></code><code id="L4513"><span class="ln">4513</span><span class="c">    \*/</span>
-</code><code id="L4514"><span class="ln">4514</span>    elproto.getBBox<span class="s"> = </span><b>function</b> (isWithoutTransform) {
-</code><code id="L4515"><span class="ln">4515</span>        <b>if</b> (<b>this</b>.removed) {
-</code><code id="L4516"><span class="ln">4516</span>            <b>return</b> {};
-</code><code id="L4517"><span class="ln">4517</span>        }
-</code><code id="L4518"><span class="ln">4518</span>        <b>var</b> _<span class="s"> = </span><b>this</b>._;
-</code><code id="L4519"><span class="ln">4519</span>        <b>if</b> (isWithoutTransform) {
-</code><code id="L4520"><span class="ln">4520</span>            <b>if</b> (_.dirty<span class="s"> || </span>!_.bboxwt) {
-</code><code id="L4521"><span class="ln">4521</span>                <b>this</b>.realPath<span class="s"> = </span>getPath[<b>this</b>.type](<b>this</b>);
-</code><code id="L4522"><span class="ln">4522</span>                _.bboxwt<span class="s"> = </span>pathDimensions(<b>this</b>.realPath);
-</code><code id="L4523"><span class="ln">4523</span>                _.bboxwt.toString<span class="s"> = </span>x_y_w_h;
-</code><code id="L4524"><span class="ln">4524</span>                _.dirty<span class="s"> = </span><span class="d">0</span>;
-</code><code id="L4525"><span class="ln">4525</span>            }
-</code><code id="L4526"><span class="ln">4526</span>            <b>return</b> _.bboxwt;
-</code><code id="L4527"><span class="ln">4527</span>        }
-</code><code id="L4528"><span class="ln">4528</span>        <b>if</b> (_.dirty<span class="s"> || </span>_.dirtyT<span class="s"> || </span>!_.bbox) {
-</code><code id="L4529"><span class="ln">4529</span>            <b>if</b> (_.dirty<span class="s"> || </span>!<b>this</b>.realPath) {
-</code><code id="L4530"><span class="ln">4530</span>                _.bboxwt<span class="s"> = </span><span class="d">0</span>;
-</code><code id="L4531"><span class="ln">4531</span>                <b>this</b>.realPath<span class="s"> = </span>getPath[<b>this</b>.type](<b>this</b>);
-</code><code id="L4532"><span class="ln">4532</span>            }
-</code><code id="L4533"><span class="ln">4533</span>            _.bbox<span class="s"> = </span>pathDimensions(mapPath(<b>this</b>.realPath, <b>this</b>.matrix));
-</code><code id="L4534"><span class="ln">4534</span>            _.bbox.toString<span class="s"> = </span>x_y_w_h;
-</code><code id="L4535"><span class="ln">4535</span>            _.dirty<span class="s"> = </span>_.dirtyT<span class="s"> = </span><span class="d">0</span>;
-</code><code id="L4536"><span class="ln">4536</span>        }
-</code><code id="L4537"><span class="ln">4537</span>        <b>return</b> _.bbox;
-</code><code id="L4538"><span class="ln">4538</span>    };
-</code><code id="L4539"><span class="ln">4539</span><span class="c">    <span class="c">/*\</span>
-</span></code><code id="L4540"><span class="ln">4540</span><span class="c">    <span class="s"> * </span>Element.clone
-</span></code><code id="L4541"><span class="ln">4541</span><span class="c">     [ method ]
-</span></code><code id="L4542"><span class="ln">4542</span><span class="c">     **
-</span></code><code id="L4543"><span class="ln">4543</span><span class="c">    <span class="s"> = </span>(object) clone of a given element
-</span></code><code id="L4544"><span class="ln">4544</span><span class="c">     **
-</span></code><code id="L4545"><span class="ln">4545</span><span class="c">    \*/</span>
-</code><code id="L4546"><span class="ln">4546</span>    elproto.clone<span class="s"> = </span><b>function</b> () {
-</code><code id="L4547"><span class="ln">4547</span>        <b>if</b> (<b>this</b>.removed) {
-</code><code id="L4548"><span class="ln">4548</span>            <b>return</b> <b>null</b>;
-</code><code id="L4549"><span class="ln">4549</span>        }
-</code><code id="L4550"><span class="ln">4550</span>        <b>var</b> attr<span class="s"> = </span><b>this</b>.attr();
-</code><code id="L4551"><span class="ln">4551</span>        <b>delete</b> attr.scale;
-</code><code id="L4552"><span class="ln">4552</span>        <b>delete</b> attr.translation;
-</code><code id="L4553"><span class="ln">4553</span>        <b>return</b> <b>this</b>.paper[<b>this</b>.type]().attr(attr);
-</code><code id="L4554"><span class="ln">4554</span>    };
-</code><code id="L4555"><span class="ln">4555</span><span class="c">    <span class="c">/*\</span>
-</span></code><code id="L4556"><span class="ln">4556</span><span class="c">    <span class="s"> * </span>Element.glow
-</span></code><code id="L4557"><span class="ln">4557</span><span class="c">     [ method ]
-</span></code><code id="L4558"><span class="ln">4558</span><span class="c">     **
-</span></code><code id="L4559"><span class="ln">4559</span><span class="c">    <span class="s"> * </span>Return set of elements that create glow-like effect around given element. See @Paper.set.
-</span></code><code id="L4560"><span class="ln">4560</span><span class="c">     *
-</span></code><code id="L4561"><span class="ln">4561</span><span class="c">    <span class="s"> * </span>Note: Glow is not connected to the element. If you change element attributes it won’t adjust itself.
-</span></code><code id="L4562"><span class="ln">4562</span><span class="c">     **
-</span></code><code id="L4563"><span class="ln">4563</span><span class="c">    <span class="s"> = </span>(object) @Paper.set of elements that represents glow
-</span></code><code id="L4564"><span class="ln">4564</span><span class="c">    \*/</span>
-</code><code id="L4565"><span class="ln">4565</span>    elproto.glow<span class="s"> = </span><b>function</b> (glow) {
-</code><code id="L4566"><span class="ln">4566</span>        <b>if</b> (<b>this</b>.type<span class="s"> == </span><i>"text"</i>) {
-</code><code id="L4567"><span class="ln">4567</span>            <b>return</b> <b>null</b>;
-</code><code id="L4568"><span class="ln">4568</span>        }
-</code><code id="L4569"><span class="ln">4569</span>        glow<span class="s"> = </span>glow<span class="s"> || </span>{};
-</code><code id="L4570"><span class="ln">4570</span>        <b>var</b> s<span class="s"> = </span>{
-</code><code id="L4571"><span class="ln">4571</span>            width: glow.width<span class="s"> || </span><span class="d">10</span>,
-</code><code id="L4572"><span class="ln">4572</span>            fill: glow.fill<span class="s"> || </span><b>false</b>,
-</code><code id="L4573"><span class="ln">4573</span>            opacity: glow.opacity<span class="s"> || </span><span class="d">.5</span>,
-</code><code id="L4574"><span class="ln">4574</span>            offsetx: glow.offsetx<span class="s"> || </span><span class="d">0</span>,
-</code><code id="L4575"><span class="ln">4575</span>            offsety: glow.offsety<span class="s"> || </span><span class="d">0</span>,
-</code><code id="L4576"><span class="ln">4576</span>            color: glow.color<span class="s"> || </span><i>"#<span class="d">000</span>"</i>
-</code><code id="L4577"><span class="ln">4577</span>        },
-</code><code id="L4578"><span class="ln">4578</span>            c<span class="s"> = </span>s.width<span class="s"> / </span><span class="d">2</span>,
-</code><code id="L4579"><span class="ln">4579</span>            r<span class="s"> = </span><b>this</b>.paper,
-</code><code id="L4580"><span class="ln">4580</span>            out<span class="s"> = </span>r.set(),
-</code><code id="L4581"><span class="ln">4581</span>            path<span class="s"> = </span><b>this</b>.realPath<span class="s"> || </span>getPath[<b>this</b>.type](<b>this</b>);
-</code><code id="L4582"><span class="ln">4582</span>        path<span class="s"> = </span><b>this</b>.matrix ? mapPath(path, <b>this</b>.matrix) : path;
-</code><code id="L4583"><span class="ln">4583</span>        <b>for</b> (<b>var</b> i<span class="s"> = </span><span class="d">1</span>; i &lt; c<span class="s"> + </span><span class="d">1</span>; i++) {
-</code><code id="L4584"><span class="ln">4584</span>            out.push(r.path(path).attr({stroke: s.color, fill: s.fill ? s.color : <i>"none"</i>, <i>"stroke-linejoin"</i>: <i>"round"</i>, <i>"stroke-linecap"</i>: <i>"round"</i>, <i>"stroke-width"</i>: +(s.width<span class="s"> / </span>c<span class="s"> * </span>i).toFixed(<span class="d">3</span>), opacity: +(s.opacity<span class="s"> / </span>c).toFixed(<span class="d">3</span>)}));
-</code><code id="L4585"><span class="ln">4585</span>        }
-</code><code id="L4586"><span class="ln">4586</span>        <b>return</b> out.insertBefore(<b>this</b>).translate(s.offsetx, s.offsety);
+</code><code id="L4514"><span class="ln">4514</span>    paperproto.forEach<span class="s"> = </span><b>function</b> (callback, thisArg) {
+</code><code id="L4515"><span class="ln">4515</span>        <b>var</b> bot<span class="s"> = </span><b>this</b>.bottom;
+</code><code id="L4516"><span class="ln">4516</span>        <b>while</b> (bot) {
+</code><code id="L4517"><span class="ln">4517</span>            <b>if</b> (callback.call(thisArg, bot)<span class="s"> === </span><b>false</b>) {
+</code><code id="L4518"><span class="ln">4518</span>                <b>return</b> <b>this</b>;
+</code><code id="L4519"><span class="ln">4519</span>            }
+</code><code id="L4520"><span class="ln">4520</span>            bot<span class="s"> = </span>bot.next;
+</code><code id="L4521"><span class="ln">4521</span>        }
+</code><code id="L4522"><span class="ln">4522</span>        <b>return</b> <b>this</b>;
+</code><code id="L4523"><span class="ln">4523</span>    };
+</code><code id="L4524"><span class="ln">4524</span>    <b>function</b> x_y() {
+</code><code id="L4525"><span class="ln">4525</span>        <b>return</b> <b>this</b>.x<span class="s"> + </span>S<span class="s"> + </span><b>this</b>.y;
+</code><code id="L4526"><span class="ln">4526</span>    }
+</code><code id="L4527"><span class="ln">4527</span>    <b>function</b> x_y_w_h() {
+</code><code id="L4528"><span class="ln">4528</span>        <b>return</b> <b>this</b>.x<span class="s"> + </span>S<span class="s"> + </span><b>this</b>.y<span class="s"> + </span>S<span class="s"> + </span><b>this</b>.width<span class="s"> + </span><i>"\xd7"</i><span class="s"> + </span><b>this</b>.height;
+</code><code id="L4529"><span class="ln">4529</span>    }
+</code><code id="L4530"><span class="ln">4530</span><span class="c">    <span class="c">/*\</span>
+</span></code><code id="L4531"><span class="ln">4531</span><span class="c">    <span class="s"> * </span>Element.getBBox
+</span></code><code id="L4532"><span class="ln">4532</span><span class="c">     [ method ]
+</span></code><code id="L4533"><span class="ln">4533</span><span class="c">     **
+</span></code><code id="L4534"><span class="ln">4534</span><span class="c">    <span class="s"> * </span>Return bounding box <b>for</b> a given element
+</span></code><code id="L4535"><span class="ln">4535</span><span class="c">     **
+</span></code><code id="L4536"><span class="ln">4536</span><span class="c">     > Parameters
+</span></code><code id="L4537"><span class="ln">4537</span><span class="c">     **
+</span></code><code id="L4538"><span class="ln">4538</span><span class="c">    <span class="s"> - </span>isWithoutTransform (<b>boolean</b>) flag, `<b>true</b>` <b>if</b> you want to have bounding box before transformations. Default is `<b>false</b>`.
+</span></code><code id="L4539"><span class="ln">4539</span><span class="c">    <span class="s"> = </span>(object) Bounding box object:
+</span></code><code id="L4540"><span class="ln">4540</span><span class="c">     o {
+</span></code><code id="L4541"><span class="ln">4541</span><span class="c">     o     x: (number) top left corner x
+</span></code><code id="L4542"><span class="ln">4542</span><span class="c">     o     y: (number) top left corner y
+</span></code><code id="L4543"><span class="ln">4543</span><span class="c">     o     width: (number) width
+</span></code><code id="L4544"><span class="ln">4544</span><span class="c">     o     height: (number) height
+</span></code><code id="L4545"><span class="ln">4545</span><span class="c">     o }
+</span></code><code id="L4546"><span class="ln">4546</span><span class="c">    \*/</span>
+</code><code id="L4547"><span class="ln">4547</span>    elproto.getBBox<span class="s"> = </span><b>function</b> (isWithoutTransform) {
+</code><code id="L4548"><span class="ln">4548</span>        <b>if</b> (<b>this</b>.removed) {
+</code><code id="L4549"><span class="ln">4549</span>            <b>return</b> {};
+</code><code id="L4550"><span class="ln">4550</span>        }
+</code><code id="L4551"><span class="ln">4551</span>        <b>var</b> _<span class="s"> = </span><b>this</b>._;
+</code><code id="L4552"><span class="ln">4552</span>        <b>if</b> (isWithoutTransform) {
+</code><code id="L4553"><span class="ln">4553</span>            <b>if</b> (_.dirty<span class="s"> || </span>!_.bboxwt) {
+</code><code id="L4554"><span class="ln">4554</span>                <b>this</b>.realPath<span class="s"> = </span>getPath[<b>this</b>.type](<b>this</b>);
+</code><code id="L4555"><span class="ln">4555</span>                _.bboxwt<span class="s"> = </span>pathDimensions(<b>this</b>.realPath);
+</code><code id="L4556"><span class="ln">4556</span>                _.bboxwt.toString<span class="s"> = </span>x_y_w_h;
+</code><code id="L4557"><span class="ln">4557</span>                _.dirty<span class="s"> = </span><span class="d">0</span>;
+</code><code id="L4558"><span class="ln">4558</span>            }
+</code><code id="L4559"><span class="ln">4559</span>            <b>return</b> _.bboxwt;
+</code><code id="L4560"><span class="ln">4560</span>        }
+</code><code id="L4561"><span class="ln">4561</span>        <b>if</b> (_.dirty<span class="s"> || </span>_.dirtyT<span class="s"> || </span>!_.bbox) {
+</code><code id="L4562"><span class="ln">4562</span>            <b>if</b> (_.dirty<span class="s"> || </span>!<b>this</b>.realPath) {
+</code><code id="L4563"><span class="ln">4563</span>                _.bboxwt<span class="s"> = </span><span class="d">0</span>;
+</code><code id="L4564"><span class="ln">4564</span>                <b>this</b>.realPath<span class="s"> = </span>getPath[<b>this</b>.type](<b>this</b>);
+</code><code id="L4565"><span class="ln">4565</span>            }
+</code><code id="L4566"><span class="ln">4566</span>            _.bbox<span class="s"> = </span>pathDimensions(mapPath(<b>this</b>.realPath, <b>this</b>.matrix));
+</code><code id="L4567"><span class="ln">4567</span>            _.bbox.toString<span class="s"> = </span>x_y_w_h;
+</code><code id="L4568"><span class="ln">4568</span>            _.dirty<span class="s"> = </span>_.dirtyT<span class="s"> = </span><span class="d">0</span>;
+</code><code id="L4569"><span class="ln">4569</span>        }
+</code><code id="L4570"><span class="ln">4570</span>        <b>return</b> _.bbox;
+</code><code id="L4571"><span class="ln">4571</span>    };
+</code><code id="L4572"><span class="ln">4572</span><span class="c">    <span class="c">/*\</span>
+</span></code><code id="L4573"><span class="ln">4573</span><span class="c">    <span class="s"> * </span>Element.clone
+</span></code><code id="L4574"><span class="ln">4574</span><span class="c">     [ method ]
+</span></code><code id="L4575"><span class="ln">4575</span><span class="c">     **
+</span></code><code id="L4576"><span class="ln">4576</span><span class="c">    <span class="s"> = </span>(object) clone of a given element
+</span></code><code id="L4577"><span class="ln">4577</span><span class="c">     **
+</span></code><code id="L4578"><span class="ln">4578</span><span class="c">    \*/</span>
+</code><code id="L4579"><span class="ln">4579</span>    elproto.clone<span class="s"> = </span><b>function</b> () {
+</code><code id="L4580"><span class="ln">4580</span>        <b>if</b> (<b>this</b>.removed) {
+</code><code id="L4581"><span class="ln">4581</span>            <b>return</b> <b>null</b>;
+</code><code id="L4582"><span class="ln">4582</span>        }
+</code><code id="L4583"><span class="ln">4583</span>        <b>var</b> attr<span class="s"> = </span><b>this</b>.attr();
+</code><code id="L4584"><span class="ln">4584</span>        <b>delete</b> attr.scale;
+</code><code id="L4585"><span class="ln">4585</span>        <b>delete</b> attr.translation;
+</code><code id="L4586"><span class="ln">4586</span>        <b>return</b> <b>this</b>.paper[<b>this</b>.type]().attr(attr);
 </code><code id="L4587"><span class="ln">4587</span>    };
-</code><code id="L4588"><span class="ln">4588</span>    <b>var</b> curveslengths<span class="s"> = </span>{},
-</code><code id="L4589"><span class="ln">4589</span>    getPointAtSegmentLength<span class="s"> = </span><b>function</b> (p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, length) {
-</code><code id="L4590"><span class="ln">4590</span>        <b>var</b> len<span class="s"> = </span><span class="d">0</span>,
-</code><code id="L4591"><span class="ln">4591</span>            precision<span class="s"> = </span><span class="d">100</span>,
-</code><code id="L4592"><span class="ln">4592</span>            name<span class="s"> = </span>[p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y].join(),
-</code><code id="L4593"><span class="ln">4593</span>            cache<span class="s"> = </span>curveslengths[name],
-</code><code id="L4594"><span class="ln">4594</span>            old, dot;
-</code><code id="L4595"><span class="ln">4595</span>        !cache<span class="s"> &amp;&amp; </span>(curveslengths[name]<span class="s"> = </span>cache<span class="s"> = </span>{data: []});
-</code><code id="L4596"><span class="ln">4596</span>        cache.timer<span class="s"> &amp;&amp; </span>clearTimeout(cache.timer);
-</code><code id="L4597"><span class="ln">4597</span>        cache.timer<span class="s"> = </span>setTimeout(<b>function</b> () {<b>delete</b> curveslengths[name];}, <span class="d">2e3</span>);
-</code><code id="L4598"><span class="ln">4598</span>        <b>if</b> (length != <b>null</b><span class="s"> &amp;&amp; </span>!cache.precision) {
-</code><code id="L4599"><span class="ln">4599</span>            <b>var</b> total<span class="s"> = </span>getPointAtSegmentLength(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y);
-</code><code id="L4600"><span class="ln">4600</span>            cache.precision<span class="s"> = </span>~~total<span class="s"> * </span><span class="d">10</span>;
-</code><code id="L4601"><span class="ln">4601</span>            cache.data<span class="s"> = </span>[];
-</code><code id="L4602"><span class="ln">4602</span>        }
-</code><code id="L4603"><span class="ln">4603</span>        precision<span class="s"> = </span>cache.precision<span class="s"> || </span>precision;
-</code><code id="L4604"><span class="ln">4604</span>        <b>for</b> (<b>var</b> i<span class="s"> = </span><span class="d">0</span>; i &lt; precision<span class="s"> + </span><span class="d">1</span>; i++) {
-</code><code id="L4605"><span class="ln">4605</span>            <b>if</b> (cache.data[i<span class="s"> * </span>precision]) {
-</code><code id="L4606"><span class="ln">4606</span>                dot<span class="s"> = </span>cache.data[i<span class="s"> * </span>precision];
-</code><code id="L4607"><span class="ln">4607</span>            } <b>else</b> {
-</code><code id="L4608"><span class="ln">4608</span>                dot<span class="s"> = </span>R.findDotsAtSegment(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, i<span class="s"> / </span>precision);
-</code><code id="L4609"><span class="ln">4609</span>                cache.data[i<span class="s"> * </span>precision]<span class="s"> = </span>dot;
-</code><code id="L4610"><span class="ln">4610</span>            }
-</code><code id="L4611"><span class="ln">4611</span>            i<span class="s"> &amp;&amp; </span>(len += pow(pow(old.x<span class="s"> - </span>dot.x, <span class="d">2</span>)<span class="s"> + </span>pow(old.y<span class="s"> - </span>dot.y, <span class="d">2</span>), <span class="d">.5</span>));
-</code><code id="L4612"><span class="ln">4612</span>            <b>if</b> (length != <b>null</b><span class="s"> &amp;&amp; </span>len >= length) {
-</code><code id="L4613"><span class="ln">4613</span>                <b>return</b> dot;
-</code><code id="L4614"><span class="ln">4614</span>            }
-</code><code id="L4615"><span class="ln">4615</span>            old<span class="s"> = </span>dot;
-</code><code id="L4616"><span class="ln">4616</span>        }
-</code><code id="L4617"><span class="ln">4617</span>        <b>if</b> (length<span class="s"> == </span><b>null</b>) {
-</code><code id="L4618"><span class="ln">4618</span>            <b>return</b> len;
-</code><code id="L4619"><span class="ln">4619</span>        }
-</code><code id="L4620"><span class="ln">4620</span>    },
-</code><code id="L4621"><span class="ln">4621</span>    getLengthFactory<span class="s"> = </span><b>function</b> (istotal, subpath) {
-</code><code id="L4622"><span class="ln">4622</span>        <b>return</b> <b>function</b> (path, length, onlystart) {
-</code><code id="L4623"><span class="ln">4623</span>            path<span class="s"> = </span>path2curve(path);
-</code><code id="L4624"><span class="ln">4624</span>            <b>var</b> x, y, p, l, sp<span class="s"> = </span><i>""</i>, subpaths<span class="s"> = </span>{}, point,
-</code><code id="L4625"><span class="ln">4625</span>                len<span class="s"> = </span><span class="d">0</span>;
-</code><code id="L4626"><span class="ln">4626</span>            <b>for</b> (<b>var</b> i<span class="s"> = </span><span class="d">0</span>, ii<span class="s"> = </span>path.length; i &lt; ii; i++) {
-</code><code id="L4627"><span class="ln">4627</span>                p<span class="s"> = </span>path[i];
-</code><code id="L4628"><span class="ln">4628</span>                <b>if</b> (p[<span class="d">0</span>]<span class="s"> == </span><i>"M"</i>) {
-</code><code id="L4629"><span class="ln">4629</span>                    x<span class="s"> = </span>+p[<span class="d">1</span>];
-</code><code id="L4630"><span class="ln">4630</span>                    y<span class="s"> = </span>+p[<span class="d">2</span>];
-</code><code id="L4631"><span class="ln">4631</span>                } <b>else</b> {
-</code><code id="L4632"><span class="ln">4632</span>                    l<span class="s"> = </span>getPointAtSegmentLength(x, y, p[<span class="d">1</span>], p[<span class="d">2</span>], p[<span class="d">3</span>], p[<span class="d">4</span>], p[<span class="d">5</span>], p[<span class="d">6</span>]);
-</code><code id="L4633"><span class="ln">4633</span>                    <b>if</b> (len<span class="s"> + </span>l > length) {
-</code><code id="L4634"><span class="ln">4634</span>                        <b>if</b> (subpath<span class="s"> &amp;&amp; </span>!subpaths.start) {
-</code><code id="L4635"><span class="ln">4635</span>                            point<span class="s"> = </span>getPointAtSegmentLength(x, y, p[<span class="d">1</span>], p[<span class="d">2</span>], p[<span class="d">3</span>], p[<span class="d">4</span>], p[<span class="d">5</span>], p[<span class="d">6</span>], length<span class="s"> - </span>len);
-</code><code id="L4636"><span class="ln">4636</span>                            sp += [<i>"C"</i><span class="s"> + </span>point.start.x, point.start.y, point.m.x, point.m.y, point.x, point.y];
-</code><code id="L4637"><span class="ln">4637</span>                            <b>if</b> (onlystart) {<b>return</b> sp;}
-</code><code id="L4638"><span class="ln">4638</span>                            subpaths.start<span class="s"> = </span>sp;
-</code><code id="L4639"><span class="ln">4639</span>                            sp<span class="s"> = </span>[<i>"M"</i><span class="s"> + </span>point.x, point.y<span class="s"> + </span><i>"C"</i><span class="s"> + </span>point.n.x, point.n.y, point.end.x, point.end.y, p[<span class="d">5</span>], p[<span class="d">6</span>]].join();
-</code><code id="L4640"><span class="ln">4640</span>                            len += l;
-</code><code id="L4641"><span class="ln">4641</span>                            x<span class="s"> = </span>+p[<span class="d">5</span>];
-</code><code id="L4642"><span class="ln">4642</span>                            y<span class="s"> = </span>+p[<span class="d">6</span>];
-</code><code id="L4643"><span class="ln">4643</span>                            <b>continue</b>;
-</code><code id="L4644"><span class="ln">4644</span>                        }
-</code><code id="L4645"><span class="ln">4645</span>                        <b>if</b> (!istotal<span class="s"> &amp;&amp; </span>!subpath) {
-</code><code id="L4646"><span class="ln">4646</span>                            point<span class="s"> = </span>getPointAtSegmentLength(x, y, p[<span class="d">1</span>], p[<span class="d">2</span>], p[<span class="d">3</span>], p[<span class="d">4</span>], p[<span class="d">5</span>], p[<span class="d">6</span>], length<span class="s"> - </span>len);
-</code><code id="L4647"><span class="ln">4647</span>                            <b>return</b> {x: point.x, y: point.y, alpha: point.alpha};
-</code><code id="L4648"><span class="ln">4648</span>                        }
-</code><code id="L4649"><span class="ln">4649</span>                    }
-</code><code id="L4650"><span class="ln">4650</span>                    len += l;
-</code><code id="L4651"><span class="ln">4651</span>                    x<span class="s"> = </span>+p[<span class="d">5</span>];
-</code><code id="L4652"><span class="ln">4652</span>                    y<span class="s"> = </span>+p[<span class="d">6</span>];
-</code><code id="L4653"><span class="ln">4653</span>                }
-</code><code id="L4654"><span class="ln">4654</span>                sp += p.shift()<span class="s"> + </span>p;
-</code><code id="L4655"><span class="ln">4655</span>            }
-</code><code id="L4656"><span class="ln">4656</span>            subpaths.end<span class="s"> = </span>sp;
-</code><code id="L4657"><span class="ln">4657</span>            point<span class="s"> = </span>istotal ? len : subpath ? subpaths : R.findDotsAtSegment(x, y, p[<span class="d">1</span>], p[<span class="d">2</span>], p[<span class="d">3</span>], p[<span class="d">4</span>], p[<span class="d">5</span>], p[<span class="d">6</span>], <span class="d">1</span>);
-</code><code id="L4658"><span class="ln">4658</span>            point.alpha<span class="s"> &amp;&amp; </span>(point<span class="s"> = </span>{x: point.x, y: point.y, alpha: point.alpha});
-</code><code id="L4659"><span class="ln">4659</span>            <b>return</b> point;
-</code><code id="L4660"><span class="ln">4660</span>        };
-</code><code id="L4661"><span class="ln">4661</span>    };
-</code><code id="L4662"><span class="ln">4662</span>    <b>var</b> getTotalLength<span class="s"> = </span>getLengthFactory(<span class="d">1</span>),
-</code><code id="L4663"><span class="ln">4663</span>        getPointAtLength<span class="s"> = </span>getLengthFactory(),
-</code><code id="L4664"><span class="ln">4664</span>        getSubpathsAtLength<span class="s"> = </span>getLengthFactory(<span class="d">0</span>, <span class="d">1</span>);
-</code><code id="L4665"><span class="ln">4665</span><span class="c">    <span class="c">/*\</span>
-</span></code><code id="L4666"><span class="ln">4666</span><span class="c">    <span class="s"> * </span>Raphael.getTotalLength
-</span></code><code id="L4667"><span class="ln">4667</span><span class="c">     [ method ]
-</span></code><code id="L4668"><span class="ln">4668</span><span class="c">     **
-</span></code><code id="L4669"><span class="ln">4669</span><span class="c">    <span class="s"> * </span>Returns length of the given path <b>in</b> pixels.
-</span></code><code id="L4670"><span class="ln">4670</span><span class="c">     **
-</span></code><code id="L4671"><span class="ln">4671</span><span class="c">     > Parameters
-</span></code><code id="L4672"><span class="ln">4672</span><span class="c">     **
-</span></code><code id="L4673"><span class="ln">4673</span><span class="c">    <span class="s"> - </span>path (string) SVG path string.
-</span></code><code id="L4674"><span class="ln">4674</span><span class="c">     **
-</span></code><code id="L4675"><span class="ln">4675</span><span class="c">    <span class="s"> = </span>(number) length.
-</span></code><code id="L4676"><span class="ln">4676</span><span class="c">    \*/</span>
-</code><code id="L4677"><span class="ln">4677</span>    R.getTotalLength<span class="s"> = </span>getTotalLength;
-</code><code id="L4678"><span class="ln">4678</span><span class="c">    <span class="c">/*\</span>
-</span></code><code id="L4679"><span class="ln">4679</span><span class="c">    <span class="s"> * </span>Raphael.getPointAtLength
-</span></code><code id="L4680"><span class="ln">4680</span><span class="c">     [ method ]
-</span></code><code id="L4681"><span class="ln">4681</span><span class="c">     **
-</span></code><code id="L4682"><span class="ln">4682</span><span class="c">    <span class="s"> * </span>Return coordinates of the point located at the given length on the given path.
-</span></code><code id="L4683"><span class="ln">4683</span><span class="c">     **
-</span></code><code id="L4684"><span class="ln">4684</span><span class="c">     > Parameters
-</span></code><code id="L4685"><span class="ln">4685</span><span class="c">     **
-</span></code><code id="L4686"><span class="ln">4686</span><span class="c">    <span class="s"> - </span>path (string) SVG path string
-</span></code><code id="L4687"><span class="ln">4687</span><span class="c">    <span class="s"> - </span>length (number)
-</span></code><code id="L4688"><span class="ln">4688</span><span class="c">     **
-</span></code><code id="L4689"><span class="ln">4689</span><span class="c">    <span class="s"> = </span>(object) representation of the point:
-</span></code><code id="L4690"><span class="ln">4690</span><span class="c">     o {
-</span></code><code id="L4691"><span class="ln">4691</span><span class="c">     o     x: (number) x coordinate
-</span></code><code id="L4692"><span class="ln">4692</span><span class="c">     o     y: (number) y coordinate
-</span></code><code id="L4693"><span class="ln">4693</span><span class="c">     o     alpha: (number) angle of derivative
-</span></code><code id="L4694"><span class="ln">4694</span><span class="c">     o }
-</span></code><code id="L4695"><span class="ln">4695</span><span class="c">    \*/</span>
-</code><code id="L4696"><span class="ln">4696</span>    R.getPointAtLength<span class="s"> = </span>getPointAtLength;
-</code><code id="L4697"><span class="ln">4697</span><span class="c">    <span class="c">/*\</span>
-</span></code><code id="L4698"><span class="ln">4698</span><span class="c">    <span class="s"> * </span>Raphael.getSubpath
-</span></code><code id="L4699"><span class="ln">4699</span><span class="c">     [ method ]
-</span></code><code id="L4700"><span class="ln">4700</span><span class="c">     **
-</span></code><code id="L4701"><span class="ln">4701</span><span class="c">    <span class="s"> * </span>Return subpath of a given path from given length to given length.
-</span></code><code id="L4702"><span class="ln">4702</span><span class="c">     **
-</span></code><code id="L4703"><span class="ln">4703</span><span class="c">     > Parameters
-</span></code><code id="L4704"><span class="ln">4704</span><span class="c">     **
-</span></code><code id="L4705"><span class="ln">4705</span><span class="c">    <span class="s"> - </span>path (string) SVG path string
-</span></code><code id="L4706"><span class="ln">4706</span><span class="c">    <span class="s"> - </span>from (number) position of the start of the segment
-</span></code><code id="L4707"><span class="ln">4707</span><span class="c">    <span class="s"> - </span>to (number) position of the end of the segment
-</span></code><code id="L4708"><span class="ln">4708</span><span class="c">     **
-</span></code><code id="L4709"><span class="ln">4709</span><span class="c">    <span class="s"> = </span>(string) pathstring <b>for</b> the segment
-</span></code><code id="L4710"><span class="ln">4710</span><span class="c">    \*/</span>
-</code><code id="L4711"><span class="ln">4711</span>    R.getSubpath<span class="s"> = </span><b>function</b> (path, from, to) {
-</code><code id="L4712"><span class="ln">4712</span>        <b>if</b> (abs(<b>this</b>.getTotalLength(path)<span class="s"> - </span>to) &lt; <span class="d">1e-6</span>) {
-</code><code id="L4713"><span class="ln">4713</span>            <b>return</b> getSubpathsAtLength(path, from).end;
-</code><code id="L4714"><span class="ln">4714</span>        }
-</code><code id="L4715"><span class="ln">4715</span>        <b>var</b> a<span class="s"> = </span>getSubpathsAtLength(path, to, <span class="d">1</span>);
-</code><code id="L4716"><span class="ln">4716</span>        <b>return</b> from ? getSubpathsAtLength(a, from).end : a;
-</code><code id="L4717"><span class="ln">4717</span>    };
-</code><code id="L4718"><span class="ln">4718</span><span class="c">    <span class="c">/*\</span>
-</span></code><code id="L4719"><span class="ln">4719</span><span class="c">    <span class="s"> * </span>Element.getTotalLength
-</span></code><code id="L4720"><span class="ln">4720</span><span class="c">     [ method ]
+</code><code id="L4588"><span class="ln">4588</span><span class="c">    <span class="c">/*\</span>
+</span></code><code id="L4589"><span class="ln">4589</span><span class="c">    <span class="s"> * </span>Element.glow
+</span></code><code id="L4590"><span class="ln">4590</span><span class="c">     [ method ]
+</span></code><code id="L4591"><span class="ln">4591</span><span class="c">     **
+</span></code><code id="L4592"><span class="ln">4592</span><span class="c">    <span class="s"> * </span>Return set of elements that create glow-like effect around given element. See @Paper.set.
+</span></code><code id="L4593"><span class="ln">4593</span><span class="c">     *
+</span></code><code id="L4594"><span class="ln">4594</span><span class="c">    <span class="s"> * </span>Note: Glow is not connected to the element. If you change element attributes it won’t adjust itself.
+</span></code><code id="L4595"><span class="ln">4595</span><span class="c">     **
+</span></code><code id="L4596"><span class="ln">4596</span><span class="c">     > Parameters
+</span></code><code id="L4597"><span class="ln">4597</span><span class="c">     **
+</span></code><code id="L4598"><span class="ln">4598</span><span class="c">    <span class="s"> - </span>glow (object) #optional parameters object <b>with</b> all properties optional:
+</span></code><code id="L4599"><span class="ln">4599</span><span class="c">     o {
+</span></code><code id="L4600"><span class="ln">4600</span><span class="c">     o     width (number) size of the glow, <b>default</b> is `<span class="d">10</span>`
+</span></code><code id="L4601"><span class="ln">4601</span><span class="c">     o     fill (<b>boolean</b>) will it be filled, <b>default</b> is `<b>false</b>`
+</span></code><code id="L4602"><span class="ln">4602</span><span class="c">     o     opacity: opacity, <b>default</b> is `<span class="d">0.5</span>`
+</span></code><code id="L4603"><span class="ln">4603</span><span class="c">     o     offsetx: horizontal offset, <b>default</b> is `<span class="d">0</span>`
+</span></code><code id="L4604"><span class="ln">4604</span><span class="c">     o     offsety: vertical offset, <b>default</b> is `<span class="d">0</span>`
+</span></code><code id="L4605"><span class="ln">4605</span><span class="c">     o     color: glow colour, <b>default</b> is `black`
+</span></code><code id="L4606"><span class="ln">4606</span><span class="c">     o }
+</span></code><code id="L4607"><span class="ln">4607</span><span class="c">    <span class="s"> = </span>(object) @Paper.set of elements that represents glow
+</span></code><code id="L4608"><span class="ln">4608</span><span class="c">    \*/</span>
+</code><code id="L4609"><span class="ln">4609</span>    elproto.glow<span class="s"> = </span><b>function</b> (glow) {
+</code><code id="L4610"><span class="ln">4610</span>        <b>if</b> (<b>this</b>.type<span class="s"> == </span><i>"text"</i>) {
+</code><code id="L4611"><span class="ln">4611</span>            <b>return</b> <b>null</b>;
+</code><code id="L4612"><span class="ln">4612</span>        }
+</code><code id="L4613"><span class="ln">4613</span>        glow<span class="s"> = </span>glow<span class="s"> || </span>{};
+</code><code id="L4614"><span class="ln">4614</span>        <b>var</b> s<span class="s"> = </span>{
+</code><code id="L4615"><span class="ln">4615</span>            width: (glow.width<span class="s"> || </span><span class="d">10</span>)<span class="s"> + </span>(+<b>this</b>.attr(<i>"stroke-width"</i>)<span class="s"> || </span><span class="d">1</span>),
+</code><code id="L4616"><span class="ln">4616</span>            fill: glow.fill<span class="s"> || </span><b>false</b>,
+</code><code id="L4617"><span class="ln">4617</span>            opacity: glow.opacity<span class="s"> || </span><span class="d">.5</span>,
+</code><code id="L4618"><span class="ln">4618</span>            offsetx: glow.offsetx<span class="s"> || </span><span class="d">0</span>,
+</code><code id="L4619"><span class="ln">4619</span>            offsety: glow.offsety<span class="s"> || </span><span class="d">0</span>,
+</code><code id="L4620"><span class="ln">4620</span>            color: glow.color<span class="s"> || </span><i>"#<span class="d">000</span>"</i>
+</code><code id="L4621"><span class="ln">4621</span>        },
+</code><code id="L4622"><span class="ln">4622</span>            c<span class="s"> = </span>s.width<span class="s"> / </span><span class="d">2</span>,
+</code><code id="L4623"><span class="ln">4623</span>            r<span class="s"> = </span><b>this</b>.paper,
+</code><code id="L4624"><span class="ln">4624</span>            out<span class="s"> = </span>r.set(),
+</code><code id="L4625"><span class="ln">4625</span>            path<span class="s"> = </span><b>this</b>.realPath<span class="s"> || </span>getPath[<b>this</b>.type](<b>this</b>);
+</code><code id="L4626"><span class="ln">4626</span>        path<span class="s"> = </span><b>this</b>.matrix ? mapPath(path, <b>this</b>.matrix) : path;
+</code><code id="L4627"><span class="ln">4627</span>        <b>for</b> (<b>var</b> i<span class="s"> = </span><span class="d">1</span>; i &lt; c<span class="s"> + </span><span class="d">1</span>; i++) {
+</code><code id="L4628"><span class="ln">4628</span>            out.push(r.path(path).attr({
+</code><code id="L4629"><span class="ln">4629</span>                stroke: s.color,
+</code><code id="L4630"><span class="ln">4630</span>                fill: s.fill ? s.color : <i>"none"</i>,
+</code><code id="L4631"><span class="ln">4631</span>                <i>"stroke-linejoin"</i>: <i>"round"</i>,
+</code><code id="L4632"><span class="ln">4632</span>                <i>"stroke-linecap"</i>: <i>"round"</i>,
+</code><code id="L4633"><span class="ln">4633</span>                <i>"stroke-width"</i>: +(s.width<span class="s"> / </span>c<span class="s"> * </span>i).toFixed(<span class="d">3</span>),
+</code><code id="L4634"><span class="ln">4634</span>                opacity: +(s.opacity<span class="s"> / </span>c).toFixed(<span class="d">3</span>)
+</code><code id="L4635"><span class="ln">4635</span>            }));
+</code><code id="L4636"><span class="ln">4636</span>        }
+</code><code id="L4637"><span class="ln">4637</span>        <b>return</b> out.insertBefore(<b>this</b>).translate(s.offsetx, s.offsety);
+</code><code id="L4638"><span class="ln">4638</span>    };
+</code><code id="L4639"><span class="ln">4639</span>    <b>var</b> curveslengths<span class="s"> = </span>{},
+</code><code id="L4640"><span class="ln">4640</span>    getPointAtSegmentLength<span class="s"> = </span><b>function</b> (p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, length) {
+</code><code id="L4641"><span class="ln">4641</span>        <b>var</b> len<span class="s"> = </span><span class="d">0</span>,
+</code><code id="L4642"><span class="ln">4642</span>            precision<span class="s"> = </span><span class="d">100</span>,
+</code><code id="L4643"><span class="ln">4643</span>            name<span class="s"> = </span>[p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y].join(),
+</code><code id="L4644"><span class="ln">4644</span>            cache<span class="s"> = </span>curveslengths[name],
+</code><code id="L4645"><span class="ln">4645</span>            old, dot;
+</code><code id="L4646"><span class="ln">4646</span>        !cache<span class="s"> &amp;&amp; </span>(curveslengths[name]<span class="s"> = </span>cache<span class="s"> = </span>{data: []});
+</code><code id="L4647"><span class="ln">4647</span>        cache.timer<span class="s"> &amp;&amp; </span>clearTimeout(cache.timer);
+</code><code id="L4648"><span class="ln">4648</span>        cache.timer<span class="s"> = </span>setTimeout(<b>function</b> () {<b>delete</b> curveslengths[name];}, <span class="d">2e3</span>);
+</code><code id="L4649"><span class="ln">4649</span>        <b>if</b> (length != <b>null</b><span class="s"> &amp;&amp; </span>!cache.precision) {
+</code><code id="L4650"><span class="ln">4650</span>            <b>var</b> total<span class="s"> = </span>getPointAtSegmentLength(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y);
+</code><code id="L4651"><span class="ln">4651</span>            cache.precision<span class="s"> = </span>~~total<span class="s"> * </span><span class="d">10</span>;
+</code><code id="L4652"><span class="ln">4652</span>            cache.data<span class="s"> = </span>[];
+</code><code id="L4653"><span class="ln">4653</span>        }
+</code><code id="L4654"><span class="ln">4654</span>        precision<span class="s"> = </span>cache.precision<span class="s"> || </span>precision;
+</code><code id="L4655"><span class="ln">4655</span>        <b>for</b> (<b>var</b> i<span class="s"> = </span><span class="d">0</span>; i &lt; precision<span class="s"> + </span><span class="d">1</span>; i++) {
+</code><code id="L4656"><span class="ln">4656</span>            <b>if</b> (cache.data[i<span class="s"> * </span>precision]) {
+</code><code id="L4657"><span class="ln">4657</span>                dot<span class="s"> = </span>cache.data[i<span class="s"> * </span>precision];
+</code><code id="L4658"><span class="ln">4658</span>            } <b>else</b> {
+</code><code id="L4659"><span class="ln">4659</span>                dot<span class="s"> = </span>R.findDotsAtSegment(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, i<span class="s"> / </span>precision);
+</code><code id="L4660"><span class="ln">4660</span>                cache.data[i<span class="s"> * </span>precision]<span class="s"> = </span>dot;
+</code><code id="L4661"><span class="ln">4661</span>            }
+</code><code id="L4662"><span class="ln">4662</span>            i<span class="s"> &amp;&amp; </span>(len += pow(pow(old.x<span class="s"> - </span>dot.x, <span class="d">2</span>)<span class="s"> + </span>pow(old.y<span class="s"> - </span>dot.y, <span class="d">2</span>), <span class="d">.5</span>));
+</code><code id="L4663"><span class="ln">4663</span>            <b>if</b> (length != <b>null</b><span class="s"> &amp;&amp; </span>len >= length) {
+</code><code id="L4664"><span class="ln">4664</span>                <b>return</b> dot;
+</code><code id="L4665"><span class="ln">4665</span>            }
+</code><code id="L4666"><span class="ln">4666</span>            old<span class="s"> = </span>dot;
+</code><code id="L4667"><span class="ln">4667</span>        }
+</code><code id="L4668"><span class="ln">4668</span>        <b>if</b> (length<span class="s"> == </span><b>null</b>) {
+</code><code id="L4669"><span class="ln">4669</span>            <b>return</b> len;
+</code><code id="L4670"><span class="ln">4670</span>        }
+</code><code id="L4671"><span class="ln">4671</span>    },
+</code><code id="L4672"><span class="ln">4672</span>    getLengthFactory<span class="s"> = </span><b>function</b> (istotal, subpath) {
+</code><code id="L4673"><span class="ln">4673</span>        <b>return</b> <b>function</b> (path, length, onlystart) {
+</code><code id="L4674"><span class="ln">4674</span>            path<span class="s"> = </span>path2curve(path);
+</code><code id="L4675"><span class="ln">4675</span>            <b>var</b> x, y, p, l, sp<span class="s"> = </span><i>""</i>, subpaths<span class="s"> = </span>{}, point,
+</code><code id="L4676"><span class="ln">4676</span>                len<span class="s"> = </span><span class="d">0</span>;
+</code><code id="L4677"><span class="ln">4677</span>            <b>for</b> (<b>var</b> i<span class="s"> = </span><span class="d">0</span>, ii<span class="s"> = </span>path.length; i &lt; ii; i++) {
+</code><code id="L4678"><span class="ln">4678</span>                p<span class="s"> = </span>path[i];
+</code><code id="L4679"><span class="ln">4679</span>                <b>if</b> (p[<span class="d">0</span>]<span class="s"> == </span><i>"M"</i>) {
+</code><code id="L4680"><span class="ln">4680</span>                    x<span class="s"> = </span>+p[<span class="d">1</span>];
+</code><code id="L4681"><span class="ln">4681</span>                    y<span class="s"> = </span>+p[<span class="d">2</span>];
+</code><code id="L4682"><span class="ln">4682</span>                } <b>else</b> {
+</code><code id="L4683"><span class="ln">4683</span>                    l<span class="s"> = </span>getPointAtSegmentLength(x, y, p[<span class="d">1</span>], p[<span class="d">2</span>], p[<span class="d">3</span>], p[<span class="d">4</span>], p[<span class="d">5</span>], p[<span class="d">6</span>]);
+</code><code id="L4684"><span class="ln">4684</span>                    <b>if</b> (len<span class="s"> + </span>l > length) {
+</code><code id="L4685"><span class="ln">4685</span>                        <b>if</b> (subpath<span class="s"> &amp;&amp; </span>!subpaths.start) {
+</code><code id="L4686"><span class="ln">4686</span>                            point<span class="s"> = </span>getPointAtSegmentLength(x, y, p[<span class="d">1</span>], p[<span class="d">2</span>], p[<span class="d">3</span>], p[<span class="d">4</span>], p[<span class="d">5</span>], p[<span class="d">6</span>], length<span class="s"> - </span>len);
+</code><code id="L4687"><span class="ln">4687</span>                            sp += [<i>"C"</i><span class="s"> + </span>point.start.x, point.start.y, point.m.x, point.m.y, point.x, point.y];
+</code><code id="L4688"><span class="ln">4688</span>                            <b>if</b> (onlystart) {<b>return</b> sp;}
+</code><code id="L4689"><span class="ln">4689</span>                            subpaths.start<span class="s"> = </span>sp;
+</code><code id="L4690"><span class="ln">4690</span>                            sp<span class="s"> = </span>[<i>"M"</i><span class="s"> + </span>point.x, point.y<span class="s"> + </span><i>"C"</i><span class="s"> + </span>point.n.x, point.n.y, point.end.x, point.end.y, p[<span class="d">5</span>], p[<span class="d">6</span>]].join();
+</code><code id="L4691"><span class="ln">4691</span>                            len += l;
+</code><code id="L4692"><span class="ln">4692</span>                            x<span class="s"> = </span>+p[<span class="d">5</span>];
+</code><code id="L4693"><span class="ln">4693</span>                            y<span class="s"> = </span>+p[<span class="d">6</span>];
+</code><code id="L4694"><span class="ln">4694</span>                            <b>continue</b>;
+</code><code id="L4695"><span class="ln">4695</span>                        }
+</code><code id="L4696"><span class="ln">4696</span>                        <b>if</b> (!istotal<span class="s"> &amp;&amp; </span>!subpath) {
+</code><code id="L4697"><span class="ln">4697</span>                            point<span class="s"> = </span>getPointAtSegmentLength(x, y, p[<span class="d">1</span>], p[<span class="d">2</span>], p[<span class="d">3</span>], p[<span class="d">4</span>], p[<span class="d">5</span>], p[<span class="d">6</span>], length<span class="s"> - </span>len);
+</code><code id="L4698"><span class="ln">4698</span>                            <b>return</b> {x: point.x, y: point.y, alpha: point.alpha};
+</code><code id="L4699"><span class="ln">4699</span>                        }
+</code><code id="L4700"><span class="ln">4700</span>                    }
+</code><code id="L4701"><span class="ln">4701</span>                    len += l;
+</code><code id="L4702"><span class="ln">4702</span>                    x<span class="s"> = </span>+p[<span class="d">5</span>];
+</code><code id="L4703"><span class="ln">4703</span>                    y<span class="s"> = </span>+p[<span class="d">6</span>];
+</code><code id="L4704"><span class="ln">4704</span>                }
+</code><code id="L4705"><span class="ln">4705</span>                sp += p.shift()<span class="s"> + </span>p;
+</code><code id="L4706"><span class="ln">4706</span>            }
+</code><code id="L4707"><span class="ln">4707</span>            subpaths.end<span class="s"> = </span>sp;
+</code><code id="L4708"><span class="ln">4708</span>            point<span class="s"> = </span>istotal ? len : subpath ? subpaths : R.findDotsAtSegment(x, y, p[<span class="d">1</span>], p[<span class="d">2</span>], p[<span class="d">3</span>], p[<span class="d">4</span>], p[<span class="d">5</span>], p[<span class="d">6</span>], <span class="d">1</span>);
+</code><code id="L4709"><span class="ln">4709</span>            point.alpha<span class="s"> &amp;&amp; </span>(point<span class="s"> = </span>{x: point.x, y: point.y, alpha: point.alpha});
+</code><code id="L4710"><span class="ln">4710</span>            <b>return</b> point;
+</code><code id="L4711"><span class="ln">4711</span>        };
+</code><code id="L4712"><span class="ln">4712</span>    };
+</code><code id="L4713"><span class="ln">4713</span>    <b>var</b> getTotalLength<span class="s"> = </span>getLengthFactory(<span class="d">1</span>),
+</code><code id="L4714"><span class="ln">4714</span>        getPointAtLength<span class="s"> = </span>getLengthFactory(),
+</code><code id="L4715"><span class="ln">4715</span>        getSubpathsAtLength<span class="s"> = </span>getLengthFactory(<span class="d">0</span>, <span class="d">1</span>);
+</code><code id="L4716"><span class="ln">4716</span><span class="c">    <span class="c">/*\</span>
+</span></code><code id="L4717"><span class="ln">4717</span><span class="c">    <span class="s"> * </span>Raphael.getTotalLength
+</span></code><code id="L4718"><span class="ln">4718</span><span class="c">     [ method ]
+</span></code><code id="L4719"><span class="ln">4719</span><span class="c">     **
+</span></code><code id="L4720"><span class="ln">4720</span><span class="c">    <span class="s"> * </span>Returns length of the given path <b>in</b> pixels.
 </span></code><code id="L4721"><span class="ln">4721</span><span class="c">     **
-</span></code><code id="L4722"><span class="ln">4722</span><span class="c">    <span class="s"> * </span>Returns length of the path <b>in</b> pixels. Only works <b>for</b> element of “path” type.
-</span></code><code id="L4723"><span class="ln">4723</span><span class="c">    <span class="s"> = </span>(number) length.
-</span></code><code id="L4724"><span class="ln">4724</span><span class="c">    \*/</span>
-</code><code id="L4725"><span class="ln">4725</span>    elproto.getTotalLength<span class="s"> = </span><b>function</b> () {
-</code><code id="L4726"><span class="ln">4726</span>        <b>if</b> (<b>this</b>.type != <i>"path"</i>) {<b>return</b>;}
-</code><code id="L4727"><span class="ln">4727</span>        <b>if</b> (<b>this</b>.node.getTotalLength) {
-</code><code id="L4728"><span class="ln">4728</span>            <b>return</b> <b>this</b>.node.getTotalLength();
-</code><code id="L4729"><span class="ln">4729</span>        }
-</code><code id="L4730"><span class="ln">4730</span>        <b>return</b> getTotalLength(<b>this</b>.attrs.path);
-</code><code id="L4731"><span class="ln">4731</span>    };
-</code><code id="L4732"><span class="ln">4732</span><span class="c">    <span class="c">/*\</span>
-</span></code><code id="L4733"><span class="ln">4733</span><span class="c">    <span class="s"> * </span>Element.getPointAtLength
-</span></code><code id="L4734"><span class="ln">4734</span><span class="c">     [ method ]
-</span></code><code id="L4735"><span class="ln">4735</span><span class="c">     **
-</span></code><code id="L4736"><span class="ln">4736</span><span class="c">    <span class="s"> * </span>Return coordinates of the point located at the given length on the given path. Only works <b>for</b> element of “path” type.
-</span></code><code id="L4737"><span class="ln">4737</span><span class="c">     **
-</span></code><code id="L4738"><span class="ln">4738</span><span class="c">     > Parameters
+</span></code><code id="L4722"><span class="ln">4722</span><span class="c">     > Parameters
+</span></code><code id="L4723"><span class="ln">4723</span><span class="c">     **
+</span></code><code id="L4724"><span class="ln">4724</span><span class="c">    <span class="s"> - </span>path (string) SVG path string.
+</span></code><code id="L4725"><span class="ln">4725</span><span class="c">     **
+</span></code><code id="L4726"><span class="ln">4726</span><span class="c">    <span class="s"> = </span>(number) length.
+</span></code><code id="L4727"><span class="ln">4727</span><span class="c">    \*/</span>
+</code><code id="L4728"><span class="ln">4728</span>    R.getTotalLength<span class="s"> = </span>getTotalLength;
+</code><code id="L4729"><span class="ln">4729</span><span class="c">    <span class="c">/*\</span>
+</span></code><code id="L4730"><span class="ln">4730</span><span class="c">    <span class="s"> * </span>Raphael.getPointAtLength
+</span></code><code id="L4731"><span class="ln">4731</span><span class="c">     [ method ]
+</span></code><code id="L4732"><span class="ln">4732</span><span class="c">     **
+</span></code><code id="L4733"><span class="ln">4733</span><span class="c">    <span class="s"> * </span>Return coordinates of the point located at the given length on the given path.
+</span></code><code id="L4734"><span class="ln">4734</span><span class="c">     **
+</span></code><code id="L4735"><span class="ln">4735</span><span class="c">     > Parameters
+</span></code><code id="L4736"><span class="ln">4736</span><span class="c">     **
+</span></code><code id="L4737"><span class="ln">4737</span><span class="c">    <span class="s"> - </span>path (string) SVG path string
+</span></code><code id="L4738"><span class="ln">4738</span><span class="c">    <span class="s"> - </span>length (number)
 </span></code><code id="L4739"><span class="ln">4739</span><span class="c">     **
-</span></code><code id="L4740"><span class="ln">4740</span><span class="c">    <span class="s"> - </span>length (number)
-</span></code><code id="L4741"><span class="ln">4741</span><span class="c">     **
-</span></code><code id="L4742"><span class="ln">4742</span><span class="c">    <span class="s"> = </span>(object) representation of the point:
-</span></code><code id="L4743"><span class="ln">4743</span><span class="c">     o {
-</span></code><code id="L4744"><span class="ln">4744</span><span class="c">     o     x: (number) x coordinate
-</span></code><code id="L4745"><span class="ln">4745</span><span class="c">     o     y: (number) y coordinate
-</span></code><code id="L4746"><span class="ln">4746</span><span class="c">     o     alpha: (number) angle of derivative
-</span></code><code id="L4747"><span class="ln">4747</span><span class="c">     o }
-</span></code><code id="L4748"><span class="ln">4748</span><span class="c">    \*/</span>
-</code><code id="L4749"><span class="ln">4749</span>    elproto.getPointAtLength<span class="s"> = </span><b>function</b> (length) {
-</code><code id="L4750"><span class="ln">4750</span>        <b>if</b> (<b>this</b>.type != <i>"path"</i>) {<b>return</b>;}
-</code><code id="L4751"><span class="ln">4751</span>        <b>return</b> getPointAtLength(<b>this</b>.attrs.path, length);
-</code><code id="L4752"><span class="ln">4752</span>    };
-</code><code id="L4753"><span class="ln">4753</span><span class="c">    <span class="c">/*\</span>
-</span></code><code id="L4754"><span class="ln">4754</span><span class="c">    <span class="s"> * </span>Element.getSubpath
-</span></code><code id="L4755"><span class="ln">4755</span><span class="c">     [ method ]
-</span></code><code id="L4756"><span class="ln">4756</span><span class="c">     **
-</span></code><code id="L4757"><span class="ln">4757</span><span class="c">    <span class="s"> * </span>Return subpath of a given element from given length to given length. Only works <b>for</b> element of “path” type.
-</span></code><code id="L4758"><span class="ln">4758</span><span class="c">     **
-</span></code><code id="L4759"><span class="ln">4759</span><span class="c">     > Parameters
-</span></code><code id="L4760"><span class="ln">4760</span><span class="c">     **
-</span></code><code id="L4761"><span class="ln">4761</span><span class="c">    <span class="s"> - </span>from (number) position of the start of the segment
-</span></code><code id="L4762"><span class="ln">4762</span><span class="c">    <span class="s"> - </span>to (number) position of the end of the segment
-</span></code><code id="L4763"><span class="ln">4763</span><span class="c">     **
-</span></code><code id="L4764"><span class="ln">4764</span><span class="c">    <span class="s"> = </span>(string) pathstring <b>for</b> the segment
-</span></code><code id="L4765"><span class="ln">4765</span><span class="c">    \*/</span>
-</code><code id="L4766"><span class="ln">4766</span>    elproto.getSubpath<span class="s"> = </span><b>function</b> (from, to) {
-</code><code id="L4767"><span class="ln">4767</span>        <b>if</b> (<b>this</b>.type != <i>"path"</i>) {<b>return</b>;}
-</code><code id="L4768"><span class="ln">4768</span>        <b>return</b> R.getSubpath(<b>this</b>.attrs.path, from, to);
-</code><code id="L4769"><span class="ln">4769</span>    };
-</code><code id="L4770"><span class="ln">4770</span><span class="c">    <span class="c">/*\</span>
-</span></code><code id="L4771"><span class="ln">4771</span><span class="c">    <span class="s"> * </span>Raphael.easing_formulas
-</span></code><code id="L4772"><span class="ln">4772</span><span class="c">     [ property ]
-</span></code><code id="L4773"><span class="ln">4773</span><span class="c">     **
-</span></code><code id="L4774"><span class="ln">4774</span><span class="c">    <span class="s"> * </span>Object that contains easing formulas <b>for</b> animation. You could extend it <b>with</b> your own. By <b>default</b> it has following list of easing:
-</span></code><code id="L4775"><span class="ln">4775</span><span class="c">     # &lt;ul>
-</span></code><code id="L4776"><span class="ln">4776</span><span class="c">     #     &lt;li>“linear”&lt;/li>
-</span></code><code id="L4777"><span class="ln">4777</span><span class="c">     #     &lt;li>“&lt;” or “easeIn” or “ease-<b>in</b>”&lt;/li>
-</span></code><code id="L4778"><span class="ln">4778</span><span class="c">     #     &lt;li>“>” or “easeOut” or “ease-out”&lt;/li>
-</span></code><code id="L4779"><span class="ln">4779</span><span class="c">     #     &lt;li>“&lt;>” or “easeInOut” or “ease-<b>in</b>-out”&lt;/li>
-</span></code><code id="L4780"><span class="ln">4780</span><span class="c">     #     &lt;li>“backIn” or “back-<b>in</b>”&lt;/li>
-</span></code><code id="L4781"><span class="ln">4781</span><span class="c">     #     &lt;li>“backOut” or “back-out”&lt;/li>
-</span></code><code id="L4782"><span class="ln">4782</span><span class="c">     #     &lt;li>“elastic”&lt;/li>
-</span></code><code id="L4783"><span class="ln">4783</span><span class="c">     #     &lt;li>“bounce”&lt;/li>
-</span></code><code id="L4784"><span class="ln">4784</span><span class="c">     # &lt;/ul>
-</span></code><code id="L4785"><span class="ln">4785</span><span class="c">     # &lt;p>See also &lt;a href=<i>"http:<span class="c">//raphaeljs.com/easing.html"</i>>Easing demo&lt;/a>.&lt;/p></span>
-</span></code><code id="L4786"><span class="ln">4786</span><span class="c">    \*/</span>
-</code><code id="L4787"><span class="ln">4787</span>    <b>var</b> ef<span class="s"> = </span>R.easing_formulas<span class="s"> = </span>{
-</code><code id="L4788"><span class="ln">4788</span>        linear: <b>function</b> (n) {
-</code><code id="L4789"><span class="ln">4789</span>            <b>return</b> n;
-</code><code id="L4790"><span class="ln">4790</span>        },
-</code><code id="L4791"><span class="ln">4791</span>        <i>"&lt;"</i>: <b>function</b> (n) {
-</code><code id="L4792"><span class="ln">4792</span>            <b>return</b> pow(n, <span class="d">1.7</span>);
-</code><code id="L4793"><span class="ln">4793</span>        },
-</code><code id="L4794"><span class="ln">4794</span>        <i>">"</i>: <b>function</b> (n) {
-</code><code id="L4795"><span class="ln">4795</span>            <b>return</b> pow(n, <span class="d">.48</span>);
-</code><code id="L4796"><span class="ln">4796</span>        },
-</code><code id="L4797"><span class="ln">4797</span>        <i>"&lt;>"</i>: <b>function</b> (n) {
-</code><code id="L4798"><span class="ln">4798</span>            <b>var</b> q<span class="s"> = </span><span class="d">.48</span><span class="s"> - </span>n<span class="s"> / </span><span class="d">1.04</span>,
-</code><code id="L4799"><span class="ln">4799</span>                Q<span class="s"> = </span>math.sqrt(<span class="d">.1734</span><span class="s"> + </span>q<span class="s"> * </span>q),
-</code><code id="L4800"><span class="ln">4800</span>                x<span class="s"> = </span>Q<span class="s"> - </span>q,
-</code><code id="L4801"><span class="ln">4801</span>                X<span class="s"> = </span>pow(abs(x), <span class="d">1</span><span class="s"> / </span><span class="d">3</span>)<span class="s"> * </span>(x &lt; <span class="d">0</span> ? -<span class="d">1</span> : <span class="d">1</span>),
-</code><code id="L4802"><span class="ln">4802</span>                y<span class="s"> = </span>-Q<span class="s"> - </span>q,
-</code><code id="L4803"><span class="ln">4803</span>                Y<span class="s"> = </span>pow(abs(y), <span class="d">1</span><span class="s"> / </span><span class="d">3</span>)<span class="s"> * </span>(y &lt; <span class="d">0</span> ? -<span class="d">1</span> : <span class="d">1</span>),
-</code><code id="L4804"><span class="ln">4804</span>                t<span class="s"> = </span>X<span class="s"> + </span>Y<span class="s"> + </span><span class="d">.5</span>;
-</code><code id="L4805"><span class="ln">4805</span>            <b>return</b> (<span class="d">1</span><span class="s"> - </span>t)<span class="s"> * </span><span class="d">3</span><span class="s"> * </span>t<span class="s"> * </span>t<span class="s"> + </span>t<span class="s"> * </span>t<span class="s"> * </span>t;
-</code><code id="L4806"><span class="ln">4806</span>        },
-</code><code id="L4807"><span class="ln">4807</span>        backIn: <b>function</b> (n) {
-</code><code id="L4808"><span class="ln">4808</span>            <b>var</b> s<span class="s"> = </span><span class="d">1.70158</span>;
-</code><code id="L4809"><span class="ln">4809</span>            <b>return</b> n<span class="s"> * </span>n<span class="s"> * </span>((s<span class="s"> + </span><span class="d">1</span>)<span class="s"> * </span>n<span class="s"> - </span>s);
-</code><code id="L4810"><span class="ln">4810</span>        },
-</code><code id="L4811"><span class="ln">4811</span>        backOut: <b>function</b> (n) {
-</code><code id="L4812"><span class="ln">4812</span>            n<span class="s"> = </span>n<span class="s"> - </span><span class="d">1</span>;
-</code><code id="L4813"><span class="ln">4813</span>            <b>var</b> s<span class="s"> = </span><span class="d">1.70158</span>;
-</code><code id="L4814"><span class="ln">4814</span>            <b>return</b> n<span class="s"> * </span>n<span class="s"> * </span>((s<span class="s"> + </span><span class="d">1</span>)<span class="s"> * </span>n<span class="s"> + </span>s)<span class="s"> + </span><span class="d">1</span>;
-</code><code id="L4815"><span class="ln">4815</span>        },
-</code><code id="L4816"><span class="ln">4816</span>        elastic: <b>function</b> (n) {
-</code><code id="L4817"><span class="ln">4817</span>            <b>if</b> (n<span class="s"> == </span>!!n) {
-</code><code id="L4818"><span class="ln">4818</span>                <b>return</b> n;
-</code><code id="L4819"><span class="ln">4819</span>            }
-</code><code id="L4820"><span class="ln">4820</span>            <b>return</b> pow(<span class="d">2</span>, -<span class="d">10</span><span class="s"> * </span>n)<span class="s"> * </span>math.sin((n<span class="s"> - </span><span class="d">.075</span>)<span class="s"> * </span>(<span class="d">2</span><span class="s"> * </span>PI)<span class="s"> / </span><span class="d">.3</span>)<span class="s"> + </span><span class="d">1</span>;
-</code><code id="L4821"><span class="ln">4821</span>        },
-</code><code id="L4822"><span class="ln">4822</span>        bounce: <b>function</b> (n) {
-</code><code id="L4823"><span class="ln">4823</span>            <b>var</b> s<span class="s"> = </span><span class="d">7.5625</span>,
-</code><code id="L4824"><span class="ln">4824</span>                p<span class="s"> = </span><span class="d">2.75</span>,
-</code><code id="L4825"><span class="ln">4825</span>                l;
-</code><code id="L4826"><span class="ln">4826</span>            <b>if</b> (n &lt; (<span class="d">1</span><span class="s"> / </span>p)) {
-</code><code id="L4827"><span class="ln">4827</span>                l<span class="s"> = </span>s<span class="s"> * </span>n<span class="s"> * </span>n;
-</code><code id="L4828"><span class="ln">4828</span>            } <b>else</b> {
-</code><code id="L4829"><span class="ln">4829</span>                <b>if</b> (n &lt; (<span class="d">2</span><span class="s"> / </span>p)) {
-</code><code id="L4830"><span class="ln">4830</span>                    n -= (<span class="d">1.5</span><span class="s"> / </span>p);
-</code><code id="L4831"><span class="ln">4831</span>                    l<span class="s"> = </span>s<span class="s"> * </span>n<span class="s"> * </span>n<span class="s"> + </span><span class="d">.75</span>;
-</code><code id="L4832"><span class="ln">4832</span>                } <b>else</b> {
-</code><code id="L4833"><span class="ln">4833</span>                    <b>if</b> (n &lt; (<span class="d">2.5</span><span class="s"> / </span>p)) {
-</code><code id="L4834"><span class="ln">4834</span>                        n -= (<span class="d">2.25</span><span class="s"> / </span>p);
-</code><code id="L4835"><span class="ln">4835</span>                        l<span class="s"> = </span>s<span class="s"> * </span>n<span class="s"> * </span>n<span class="s"> + </span><span class="d">.9375</span>;
-</code><code id="L4836"><span class="ln">4836</span>                    } <b>else</b> {
-</code><code id="L4837"><span class="ln">4837</span>                        n -= (<span class="d">2.625</span><span class="s"> / </span>p);
-</code><code id="L4838"><span class="ln">4838</span>                        l<span class="s"> = </span>s<span class="s"> * </span>n<span class="s"> * </span>n<span class="s"> + </span><span class="d">.984375</span>;
-</code><code id="L4839"><span class="ln">4839</span>                    }
-</code><code id="L4840"><span class="ln">4840</span>                }
-</code><code id="L4841"><span class="ln">4841</span>            }
-</code><code id="L4842"><span class="ln">4842</span>            <b>return</b> l;
-</code><code id="L4843"><span class="ln">4843</span>        }
-</code><code id="L4844"><span class="ln">4844</span>    };
-</code><code id="L4845"><span class="ln">4845</span>    ef.easeIn<span class="s"> = </span>ef[<i>"ease-<b>in</b>"</i>]<span class="s"> = </span>ef[<i>"&lt;"</i>];
-</code><code id="L4846"><span class="ln">4846</span>    ef.easeOut<span class="s"> = </span>ef[<i>"ease-out"</i>]<span class="s"> = </span>ef[<i>">"</i>];
-</code><code id="L4847"><span class="ln">4847</span>    ef.easeInOut<span class="s"> = </span>ef[<i>"ease-<b>in</b>-out"</i>]<span class="s"> = </span>ef[<i>"&lt;>"</i>];
-</code><code id="L4848"><span class="ln">4848</span>    ef[<i>"back-<b>in</b>"</i>]<span class="s"> = </span>ef.backIn;
-</code><code id="L4849"><span class="ln">4849</span>    ef[<i>"back-out"</i>]<span class="s"> = </span>ef.backOut;
-</code><code id="L4850"><span class="ln">4850</span>
-</code><code id="L4851"><span class="ln">4851</span>    <b>var</b> animationElements<span class="s"> = </span>[],
-</code><code id="L4852"><span class="ln">4852</span>        requestAnimFrame<span class="s"> = </span>window.requestAnimationFrame       ||
-</code><code id="L4853"><span class="ln">4853</span>                           window.webkitRequestAnimationFrame ||
-</code><code id="L4854"><span class="ln">4854</span>                           window.mozRequestAnimationFrame    ||
-</code><code id="L4855"><span class="ln">4855</span>                           window.oRequestAnimationFrame      ||
-</code><code id="L4856"><span class="ln">4856</span>                           window.msRequestAnimationFrame     ||
-</code><code id="L4857"><span class="ln">4857</span>                           <b>function</b> (callback) {
-</code><code id="L4858"><span class="ln">4858</span>                               setTimeout(callback, <span class="d">16</span>);
-</code><code id="L4859"><span class="ln">4859</span>                           },
-</code><code id="L4860"><span class="ln">4860</span>        animation<span class="s"> = </span><b>function</b> () {
-</code><code id="L4861"><span class="ln">4861</span>            <b>var</b> Now<span class="s"> = </span>+<b>new</b> Date,
-</code><code id="L4862"><span class="ln">4862</span>                l<span class="s"> = </span><span class="d">0</span>;
-</code><code id="L4863"><span class="ln">4863</span>            <b>for</b> (; l &lt; animationElements.length; l++) {
-</code><code id="L4864"><span class="ln">4864</span>                <b>var</b> e<span class="s"> = </span>animationElements[l];
-</code><code id="L4865"><span class="ln">4865</span>                <b>if</b> (e.el.removed<span class="s"> || </span>e.paused) {
-</code><code id="L4866"><span class="ln">4866</span>                    <b>continue</b>;
-</code><code id="L4867"><span class="ln">4867</span>                }
-</code><code id="L4868"><span class="ln">4868</span>                <b>var</b> time<span class="s"> = </span>Now<span class="s"> - </span>e.start,
-</code><code id="L4869"><span class="ln">4869</span>                    ms<span class="s"> = </span>e.ms,
-</code><code id="L4870"><span class="ln">4870</span>                    easing<span class="s"> = </span>e.easing,
-</code><code id="L4871"><span class="ln">4871</span>                    from<span class="s"> = </span>e.from,
-</code><code id="L4872"><span class="ln">4872</span>                    diff<span class="s"> = </span>e.diff,
-</code><code id="L4873"><span class="ln">4873</span>                    to<span class="s"> = </span>e.to,
-</code><code id="L4874"><span class="ln">4874</span>                    t<span class="s"> = </span>e.t,
-</code><code id="L4875"><span class="ln">4875</span>                    that<span class="s"> = </span>e.el,
-</code><code id="L4876"><span class="ln">4876</span>                    set<span class="s"> = </span>{},
-</code><code id="L4877"><span class="ln">4877</span>                    now;
-</code><code id="L4878"><span class="ln">4878</span>                <b>if</b> (e.initstatus) {
-</code><code id="L4879"><span class="ln">4879</span>                    time<span class="s"> = </span>(e.initstatus<span class="s"> * </span>e.anim.top<span class="s"> - </span>e.prev)<span class="s"> / </span>(e.percent<span class="s"> - </span>e.prev)<span class="s"> * </span>ms;
-</code><code id="L4880"><span class="ln">4880</span>                    e.status<span class="s"> = </span>e.initstatus;
-</code><code id="L4881"><span class="ln">4881</span>                    <b>delete</b> e.initstatus;
-</code><code id="L4882"><span class="ln">4882</span>                    e.stop<span class="s"> &amp;&amp; </span>animationElements.splice(l--, <span class="d">1</span>);
+</span></code><code id="L4740"><span class="ln">4740</span><span class="c">    <span class="s"> = </span>(object) representation of the point:
+</span></code><code id="L4741"><span class="ln">4741</span><span class="c">     o {
+</span></code><code id="L4742"><span class="ln">4742</span><span class="c">     o     x: (number) x coordinate
+</span></code><code id="L4743"><span class="ln">4743</span><span class="c">     o     y: (number) y coordinate
+</span></code><code id="L4744"><span class="ln">4744</span><span class="c">     o     alpha: (number) angle of derivative
+</span></code><code id="L4745"><span class="ln">4745</span><span class="c">     o }
+</span></code><code id="L4746"><span class="ln">4746</span><span class="c">    \*/</span>
+</code><code id="L4747"><span class="ln">4747</span>    R.getPointAtLength<span class="s"> = </span>getPointAtLength;
+</code><code id="L4748"><span class="ln">4748</span><span class="c">    <span class="c">/*\</span>
+</span></code><code id="L4749"><span class="ln">4749</span><span class="c">    <span class="s"> * </span>Raphael.getSubpath
+</span></code><code id="L4750"><span class="ln">4750</span><span class="c">     [ method ]
+</span></code><code id="L4751"><span class="ln">4751</span><span class="c">     **
+</span></code><code id="L4752"><span class="ln">4752</span><span class="c">    <span class="s"> * </span>Return subpath of a given path from given length to given length.
+</span></code><code id="L4753"><span class="ln">4753</span><span class="c">     **
+</span></code><code id="L4754"><span class="ln">4754</span><span class="c">     > Parameters
+</span></code><code id="L4755"><span class="ln">4755</span><span class="c">     **
+</span></code><code id="L4756"><span class="ln">4756</span><span class="c">    <span class="s"> - </span>path (string) SVG path string
+</span></code><code id="L4757"><span class="ln">4757</span><span class="c">    <span class="s"> - </span>from (number) position of the start of the segment
+</span></code><code id="L4758"><span class="ln">4758</span><span class="c">    <span class="s"> - </span>to (number) position of the end of the segment
+</span></code><code id="L4759"><span class="ln">4759</span><span class="c">     **
+</span></code><code id="L4760"><span class="ln">4760</span><span class="c">    <span class="s"> = </span>(string) pathstring <b>for</b> the segment
+</span></code><code id="L4761"><span class="ln">4761</span><span class="c">    \*/</span>
+</code><code id="L4762"><span class="ln">4762</span>    R.getSubpath<span class="s"> = </span><b>function</b> (path, from, to) {
+</code><code id="L4763"><span class="ln">4763</span>        <b>if</b> (abs(<b>this</b>.getTotalLength(path)<span class="s"> - </span>to) &lt; <span class="d">1e-6</span>) {
+</code><code id="L4764"><span class="ln">4764</span>            <b>return</b> getSubpathsAtLength(path, from).end;
+</code><code id="L4765"><span class="ln">4765</span>        }
+</code><code id="L4766"><span class="ln">4766</span>        <b>var</b> a<span class="s"> = </span>getSubpathsAtLength(path, to, <span class="d">1</span>);
+</code><code id="L4767"><span class="ln">4767</span>        <b>return</b> from ? getSubpathsAtLength(a, from).end : a;
+</code><code id="L4768"><span class="ln">4768</span>    };
+</code><code id="L4769"><span class="ln">4769</span><span class="c">    <span class="c">/*\</span>
+</span></code><code id="L4770"><span class="ln">4770</span><span class="c">    <span class="s"> * </span>Element.getTotalLength
+</span></code><code id="L4771"><span class="ln">4771</span><span class="c">     [ method ]
+</span></code><code id="L4772"><span class="ln">4772</span><span class="c">     **
+</span></code><code id="L4773"><span class="ln">4773</span><span class="c">    <span class="s"> * </span>Returns length of the path <b>in</b> pixels. Only works <b>for</b> element of “path” type.
+</span></code><code id="L4774"><span class="ln">4774</span><span class="c">    <span class="s"> = </span>(number) length.
+</span></code><code id="L4775"><span class="ln">4775</span><span class="c">    \*/</span>
+</code><code id="L4776"><span class="ln">4776</span>    elproto.getTotalLength<span class="s"> = </span><b>function</b> () {
+</code><code id="L4777"><span class="ln">4777</span>        <b>if</b> (<b>this</b>.type != <i>"path"</i>) {<b>return</b>;}
+</code><code id="L4778"><span class="ln">4778</span>        <b>if</b> (<b>this</b>.node.getTotalLength) {
+</code><code id="L4779"><span class="ln">4779</span>            <b>return</b> <b>this</b>.node.getTotalLength();
+</code><code id="L4780"><span class="ln">4780</span>        }
+</code><code id="L4781"><span class="ln">4781</span>        <b>return</b> getTotalLength(<b>this</b>.attrs.path);
+</code><code id="L4782"><span class="ln">4782</span>    };
+</code><code id="L4783"><span class="ln">4783</span><span class="c">    <span class="c">/*\</span>
+</span></code><code id="L4784"><span class="ln">4784</span><span class="c">    <span class="s"> * </span>Element.getPointAtLength
+</span></code><code id="L4785"><span class="ln">4785</span><span class="c">     [ method ]
+</span></code><code id="L4786"><span class="ln">4786</span><span class="c">     **
+</span></code><code id="L4787"><span class="ln">4787</span><span class="c">    <span class="s"> * </span>Return coordinates of the point located at the given length on the given path. Only works <b>for</b> element of “path” type.
+</span></code><code id="L4788"><span class="ln">4788</span><span class="c">     **
+</span></code><code id="L4789"><span class="ln">4789</span><span class="c">     > Parameters
+</span></code><code id="L4790"><span class="ln">4790</span><span class="c">     **
+</span></code><code id="L4791"><span class="ln">4791</span><span class="c">    <span class="s"> - </span>length (number)
+</span></code><code id="L4792"><span class="ln">4792</span><span class="c">     **
+</span></code><code id="L4793"><span class="ln">4793</span><span class="c">    <span class="s"> = </span>(object) representation of the point:
+</span></code><code id="L4794"><span class="ln">4794</span><span class="c">     o {
+</span></code><code id="L4795"><span class="ln">4795</span><span class="c">     o     x: (number) x coordinate
+</span></code><code id="L4796"><span class="ln">4796</span><span class="c">     o     y: (number) y coordinate
+</span></code><code id="L4797"><span class="ln">4797</span><span class="c">     o     alpha: (number) angle of derivative
+</span></code><code id="L4798"><span class="ln">4798</span><span class="c">     o }
+</span></code><code id="L4799"><span class="ln">4799</span><span class="c">    \*/</span>
+</code><code id="L4800"><span class="ln">4800</span>    elproto.getPointAtLength<span class="s"> = </span><b>function</b> (length) {
+</code><code id="L4801"><span class="ln">4801</span>        <b>if</b> (<b>this</b>.type != <i>"path"</i>) {<b>return</b>;}
+</code><code id="L4802"><span class="ln">4802</span>        <b>return</b> getPointAtLength(<b>this</b>.attrs.path, length);
+</code><code id="L4803"><span class="ln">4803</span>    };
+</code><code id="L4804"><span class="ln">4804</span><span class="c">    <span class="c">/*\</span>
+</span></code><code id="L4805"><span class="ln">4805</span><span class="c">    <span class="s"> * </span>Element.getSubpath
+</span></code><code id="L4806"><span class="ln">4806</span><span class="c">     [ method ]
+</span></code><code id="L4807"><span class="ln">4807</span><span class="c">     **
+</span></code><code id="L4808"><span class="ln">4808</span><span class="c">    <span class="s"> * </span>Return subpath of a given element from given length to given length. Only works <b>for</b> element of “path” type.
+</span></code><code id="L4809"><span class="ln">4809</span><span class="c">     **
+</span></code><code id="L4810"><span class="ln">4810</span><span class="c">     > Parameters
+</span></code><code id="L4811"><span class="ln">4811</span><span class="c">     **
+</span></code><code id="L4812"><span class="ln">4812</span><span class="c">    <span class="s"> - </span>from (number) position of the start of the segment
+</span></code><code id="L4813"><span class="ln">4813</span><span class="c">    <span class="s"> - </span>to (number) position of the end of the segment
+</span></code><code id="L4814"><span class="ln">4814</span><span class="c">     **
+</span></code><code id="L4815"><span class="ln">4815</span><span class="c">    <span class="s"> = </span>(string) pathstring <b>for</b> the segment
+</span></code><code id="L4816"><span class="ln">4816</span><span class="c">    \*/</span>
+</code><code id="L4817"><span class="ln">4817</span>    elproto.getSubpath<span class="s"> = </span><b>function</b> (from, to) {
+</code><code id="L4818"><span class="ln">4818</span>        <b>if</b> (<b>this</b>.type != <i>"path"</i>) {<b>return</b>;}
+</code><code id="L4819"><span class="ln">4819</span>        <b>return</b> R.getSubpath(<b>this</b>.attrs.path, from, to);
+</code><code id="L4820"><span class="ln">4820</span>    };
+</code><code id="L4821"><span class="ln">4821</span><span class="c">    <span class="c">/*\</span>
+</span></code><code id="L4822"><span class="ln">4822</span><span class="c">    <span class="s"> * </span>Raphael.easing_formulas
+</span></code><code id="L4823"><span class="ln">4823</span><span class="c">     [ property ]
+</span></code><code id="L4824"><span class="ln">4824</span><span class="c">     **
+</span></code><code id="L4825"><span class="ln">4825</span><span class="c">    <span class="s"> * </span>Object that contains easing formulas <b>for</b> animation. You could extend it <b>with</b> your own. By <b>default</b> it has following list of easing:
+</span></code><code id="L4826"><span class="ln">4826</span><span class="c">     # &lt;ul>
+</span></code><code id="L4827"><span class="ln">4827</span><span class="c">     #     &lt;li>“linear”&lt;/li>
+</span></code><code id="L4828"><span class="ln">4828</span><span class="c">     #     &lt;li>“&lt;” or “easeIn” or “ease-<b>in</b>”&lt;/li>
+</span></code><code id="L4829"><span class="ln">4829</span><span class="c">     #     &lt;li>“>” or “easeOut” or “ease-out”&lt;/li>
+</span></code><code id="L4830"><span class="ln">4830</span><span class="c">     #     &lt;li>“&lt;>” or “easeInOut” or “ease-<b>in</b>-out”&lt;/li>
+</span></code><code id="L4831"><span class="ln">4831</span><span class="c">     #     &lt;li>“backIn” or “back-<b>in</b>”&lt;/li>
+</span></code><code id="L4832"><span class="ln">4832</span><span class="c">     #     &lt;li>“backOut” or “back-out”&lt;/li>
+</span></code><code id="L4833"><span class="ln">4833</span><span class="c">     #     &lt;li>“elastic”&lt;/li>
+</span></code><code id="L4834"><span class="ln">4834</span><span class="c">     #     &lt;li>“bounce”&lt;/li>
+</span></code><code id="L4835"><span class="ln">4835</span><span class="c">     # &lt;/ul>
+</span></code><code id="L4836"><span class="ln">4836</span><span class="c">     # &lt;p>See also &lt;a href=<i>"http:<span class="c">//raphaeljs.com/easing.html"</i>>Easing demo&lt;/a>.&lt;/p></span>
+</span></code><code id="L4837"><span class="ln">4837</span><span class="c">    \*/</span>
+</code><code id="L4838"><span class="ln">4838</span>    <b>var</b> ef<span class="s"> = </span>R.easing_formulas<span class="s"> = </span>{
+</code><code id="L4839"><span class="ln">4839</span>        linear: <b>function</b> (n) {
+</code><code id="L4840"><span class="ln">4840</span>            <b>return</b> n;
+</code><code id="L4841"><span class="ln">4841</span>        },
+</code><code id="L4842"><span class="ln">4842</span>        <i>"&lt;"</i>: <b>function</b> (n) {
+</code><code id="L4843"><span class="ln">4843</span>            <b>return</b> pow(n, <span class="d">1.7</span>);
+</code><code id="L4844"><span class="ln">4844</span>        },
+</code><code id="L4845"><span class="ln">4845</span>        <i>">"</i>: <b>function</b> (n) {
+</code><code id="L4846"><span class="ln">4846</span>            <b>return</b> pow(n, <span class="d">.48</span>);
+</code><code id="L4847"><span class="ln">4847</span>        },
+</code><code id="L4848"><span class="ln">4848</span>        <i>"&lt;>"</i>: <b>function</b> (n) {
+</code><code id="L4849"><span class="ln">4849</span>            <b>var</b> q<span class="s"> = </span><span class="d">.48</span><span class="s"> - </span>n<span class="s"> / </span><span class="d">1.04</span>,
+</code><code id="L4850"><span class="ln">4850</span>                Q<span class="s"> = </span>math.sqrt(<span class="d">.1734</span><span class="s"> + </span>q<span class="s"> * </span>q),
+</code><code id="L4851"><span class="ln">4851</span>                x<span class="s"> = </span>Q<span class="s"> - </span>q,
+</code><code id="L4852"><span class="ln">4852</span>                X<span class="s"> = </span>pow(abs(x), <span class="d">1</span><span class="s"> / </span><span class="d">3</span>)<span class="s"> * </span>(x &lt; <span class="d">0</span> ? -<span class="d">1</span> : <span class="d">1</span>),
+</code><code id="L4853"><span class="ln">4853</span>                y<span class="s"> = </span>-Q<span class="s"> - </span>q,
+</code><code id="L4854"><span class="ln">4854</span>                Y<span class="s"> = </span>pow(abs(y), <span class="d">1</span><span class="s"> / </span><span class="d">3</span>)<span class="s"> * </span>(y &lt; <span class="d">0</span> ? -<span class="d">1</span> : <span class="d">1</span>),
+</code><code id="L4855"><span class="ln">4855</span>                t<span class="s"> = </span>X<span class="s"> + </span>Y<span class="s"> + </span><span class="d">.5</span>;
+</code><code id="L4856"><span class="ln">4856</span>            <b>return</b> (<span class="d">1</span><span class="s"> - </span>t)<span class="s"> * </span><span class="d">3</span><span class="s"> * </span>t<span class="s"> * </span>t<span class="s"> + </span>t<span class="s"> * </span>t<span class="s"> * </span>t;
+</code><code id="L4857"><span class="ln">4857</span>        },
+</code><code id="L4858"><span class="ln">4858</span>        backIn: <b>function</b> (n) {
+</code><code id="L4859"><span class="ln">4859</span>            <b>var</b> s<span class="s"> = </span><span class="d">1.70158</span>;
+</code><code id="L4860"><span class="ln">4860</span>            <b>return</b> n<span class="s"> * </span>n<span class="s"> * </span>((s<span class="s"> + </span><span class="d">1</span>)<span class="s"> * </span>n<span class="s"> - </span>s);
+</code><code id="L4861"><span class="ln">4861</span>        },
+</code><code id="L4862"><span class="ln">4862</span>        backOut: <b>function</b> (n) {
+</code><code id="L4863"><span class="ln">4863</span>            n<span class="s"> = </span>n<span class="s"> - </span><span class="d">1</span>;
+</code><code id="L4864"><span class="ln">4864</span>            <b>var</b> s<span class="s"> = </span><span class="d">1.70158</span>;
+</code><code id="L4865"><span class="ln">4865</span>            <b>return</b> n<span class="s"> * </span>n<span class="s"> * </span>((s<span class="s"> + </span><span class="d">1</span>)<span class="s"> * </span>n<span class="s"> + </span>s)<span class="s"> + </span><span class="d">1</span>;
+</code><code id="L4866"><span class="ln">4866</span>        },
+</code><code id="L4867"><span class="ln">4867</span>        elastic: <b>function</b> (n) {
+</code><code id="L4868"><span class="ln">4868</span>            <b>if</b> (n<span class="s"> == </span>!!n) {
+</code><code id="L4869"><span class="ln">4869</span>                <b>return</b> n;
+</code><code id="L4870"><span class="ln">4870</span>            }
+</code><code id="L4871"><span class="ln">4871</span>            <b>return</b> pow(<span class="d">2</span>, -<span class="d">10</span><span class="s"> * </span>n)<span class="s"> * </span>math.sin((n<span class="s"> - </span><span class="d">.075</span>)<span class="s"> * </span>(<span class="d">2</span><span class="s"> * </span>PI)<span class="s"> / </span><span class="d">.3</span>)<span class="s"> + </span><span class="d">1</span>;
+</code><code id="L4872"><span class="ln">4872</span>        },
+</code><code id="L4873"><span class="ln">4873</span>        bounce: <b>function</b> (n) {
+</code><code id="L4874"><span class="ln">4874</span>            <b>var</b> s<span class="s"> = </span><span class="d">7.5625</span>,
+</code><code id="L4875"><span class="ln">4875</span>                p<span class="s"> = </span><span class="d">2.75</span>,
+</code><code id="L4876"><span class="ln">4876</span>                l;
+</code><code id="L4877"><span class="ln">4877</span>            <b>if</b> (n &lt; (<span class="d">1</span><span class="s"> / </span>p)) {
+</code><code id="L4878"><span class="ln">4878</span>                l<span class="s"> = </span>s<span class="s"> * </span>n<span class="s"> * </span>n;
+</code><code id="L4879"><span class="ln">4879</span>            } <b>else</b> {
+</code><code id="L4880"><span class="ln">4880</span>                <b>if</b> (n &lt; (<span class="d">2</span><span class="s"> / </span>p)) {
+</code><code id="L4881"><span class="ln">4881</span>                    n -= (<span class="d">1.5</span><span class="s"> / </span>p);
+</code><code id="L4882"><span class="ln">4882</span>                    l<span class="s"> = </span>s<span class="s"> * </span>n<span class="s"> * </span>n<span class="s"> + </span><span class="d">.75</span>;
 </code><code id="L4883"><span class="ln">4883</span>                } <b>else</b> {
-</code><code id="L4884"><span class="ln">4884</span>                    e.status<span class="s"> = </span>(e.prev<span class="s"> + </span>(e.percent<span class="s"> - </span>e.prev)<span class="s"> * </span>(time<span class="s"> / </span>ms))<span class="s"> / </span>e.anim.top;
-</code><code id="L4885"><span class="ln">4885</span>                }
-</code><code id="L4886"><span class="ln">4886</span>                <b>if</b> (time &lt; <span class="d">0</span>) {
-</code><code id="L4887"><span class="ln">4887</span>                    <b>continue</b>;
-</code><code id="L4888"><span class="ln">4888</span>                }
-</code><code id="L4889"><span class="ln">4889</span>                <b>if</b> (time &lt; ms) {
-</code><code id="L4890"><span class="ln">4890</span>                    <b>var</b> pos<span class="s"> = </span>easing(time<span class="s"> / </span>ms);
-</code><code id="L4891"><span class="ln">4891</span>                    <b>for</b> (<b>var</b> attr <b>in</b> from) <b>if</b> (from[has](attr)) {
-</code><code id="L4892"><span class="ln">4892</span>                        <b>switch</b> (availableAnimAttrs[attr]) {
-</code><code id="L4893"><span class="ln">4893</span>                            <b>case</b> nu:
-</code><code id="L4894"><span class="ln">4894</span>                                now<span class="s"> = </span>+from[attr]<span class="s"> + </span>pos<span class="s"> * </span>ms<span class="s"> * </span>diff[attr];
-</code><code id="L4895"><span class="ln">4895</span>                                <b>break</b>;
-</code><code id="L4896"><span class="ln">4896</span>                            <b>case</b> <i>"colour"</i>:
-</code><code id="L4897"><span class="ln">4897</span>                                now<span class="s"> = </span><i>"rgb("</i><span class="s"> + </span>[
-</code><code id="L4898"><span class="ln">4898</span>                                    upto255(round(from[attr].r<span class="s"> + </span>pos<span class="s"> * </span>ms<span class="s"> * </span>diff[attr].r)),
-</code><code id="L4899"><span class="ln">4899</span>                                    upto255(round(from[attr].g<span class="s"> + </span>pos<span class="s"> * </span>ms<span class="s"> * </span>diff[attr].g)),
-</code><code id="L4900"><span class="ln">4900</span>                                    upto255(round(from[attr].b<span class="s"> + </span>pos<span class="s"> * </span>ms<span class="s"> * </span>diff[attr].b))
-</code><code id="L4901"><span class="ln">4901</span>                                ].join(<i>","</i>)<span class="s"> + </span><i>")"</i>;
-</code><code id="L4902"><span class="ln">4902</span>                                <b>break</b>;
-</code><code id="L4903"><span class="ln">4903</span>                            <b>case</b> <i>"path"</i>:
-</code><code id="L4904"><span class="ln">4904</span>                                now<span class="s"> = </span>[];
-</code><code id="L4905"><span class="ln">4905</span>                                <b>for</b> (<b>var</b> i<span class="s"> = </span><span class="d">0</span>, ii<span class="s"> = </span>from[attr].length; i &lt; ii; i++) {
-</code><code id="L4906"><span class="ln">4906</span>                                    now[i]<span class="s"> = </span>[from[attr][i][<span class="d">0</span>]];
-</code><code id="L4907"><span class="ln">4907</span>                                    <b>for</b> (<b>var</b> j<span class="s"> = </span><span class="d">1</span>, jj<span class="s"> = </span>from[attr][i].length; j &lt; jj; j++) {
-</code><code id="L4908"><span class="ln">4908</span>                                        now[i][j]<span class="s"> = </span>+from[attr][i][j]<span class="s"> + </span>pos<span class="s"> * </span>ms<span class="s"> * </span>diff[attr][i][j];
-</code><code id="L4909"><span class="ln">4909</span>                                    }
-</code><code id="L4910"><span class="ln">4910</span>                                    now[i]<span class="s"> = </span>now[i].join(S);
-</code><code id="L4911"><span class="ln">4911</span>                                }
-</code><code id="L4912"><span class="ln">4912</span>                                now<span class="s"> = </span>now.join(S);
-</code><code id="L4913"><span class="ln">4913</span>                                <b>break</b>;
-</code><code id="L4914"><span class="ln">4914</span>                            <b>case</b> <i>"transform"</i>:
-</code><code id="L4915"><span class="ln">4915</span>                                <b>if</b> (diff[attr].real) {
-</code><code id="L4916"><span class="ln">4916</span>                                    now<span class="s"> = </span>[];
-</code><code id="L4917"><span class="ln">4917</span>                                    <b>for</b> (i<span class="s"> = </span><span class="d">0</span>, ii<span class="s"> = </span>from[attr].length; i &lt; ii; i++) {
-</code><code id="L4918"><span class="ln">4918</span>                                        now[i]<span class="s"> = </span>[from[attr][i][<span class="d">0</span>]];
-</code><code id="L4919"><span class="ln">4919</span>                                        <b>for</b> (j<span class="s"> = </span><span class="d">1</span>, jj<span class="s"> = </span>from[attr][i].length; j &lt; jj; j++) {
-</code><code id="L4920"><span class="ln">4920</span>                                            now[i][j]<span class="s"> = </span>from[attr][i][j]<span class="s"> + </span>pos<span class="s"> * </span>ms<span class="s"> * </span>diff[attr][i][j];
-</code><code id="L4921"><span class="ln">4921</span>                                        }
-</code><code id="L4922"><span class="ln">4922</span>                                    }
-</code><code id="L4923"><span class="ln">4923</span>                                } <b>else</b> {
-</code><code id="L4924"><span class="ln">4924</span>                                    <b>var</b> get<span class="s"> = </span><b>function</b> (i) {
-</code><code id="L4925"><span class="ln">4925</span>                                        <b>return</b> +from[attr][i]<span class="s"> + </span>pos<span class="s"> * </span>ms<span class="s"> * </span>diff[attr][i];
-</code><code id="L4926"><span class="ln">4926</span>                                    };
-</code><code id="L4927"><span class="ln">4927</span>                                    <span class="c">// now<span class="s"> = </span>[[<i>"r"</i>, get(<span class="d">2</span>), <span class="d">0</span>, <span class="d">0</span>], [<i>"t"</i>, get(<span class="d">3</span>), get(<span class="d">4</span>)], [<i>"s"</i>, get(<span class="d">0</span>), get(<span class="d">1</span>), <span class="d">0</span>, <span class="d">0</span>]];</span>
-</code><code id="L4928"><span class="ln">4928</span>                                    now<span class="s"> = </span>[[<i>"m"</i>, get(<span class="d">0</span>), get(<span class="d">1</span>), get(<span class="d">2</span>), get(<span class="d">3</span>), get(<span class="d">4</span>), get(<span class="d">5</span>)]];
-</code><code id="L4929"><span class="ln">4929</span>                                }
-</code><code id="L4930"><span class="ln">4930</span>                                <b>break</b>;
-</code><code id="L4931"><span class="ln">4931</span>                            <b>case</b> <i>"csv"</i>:
-</code><code id="L4932"><span class="ln">4932</span>                                <b>if</b> (attr<span class="s"> == </span><i>"clip-rect"</i>) {
-</code><code id="L4933"><span class="ln">4933</span>                                    now<span class="s"> = </span>[];
-</code><code id="L4934"><span class="ln">4934</span>                                    i<span class="s"> = </span><span class="d">4</span>;
-</code><code id="L4935"><span class="ln">4935</span>                                    <b>while</b> (i--) {
-</code><code id="L4936"><span class="ln">4936</span>                                        now[i]<span class="s"> = </span>+from[attr][i]<span class="s"> + </span>pos<span class="s"> * </span>ms<span class="s"> * </span>diff[attr][i];
-</code><code id="L4937"><span class="ln">4937</span>                                    }
-</code><code id="L4938"><span class="ln">4938</span>                                }
-</code><code id="L4939"><span class="ln">4939</span>                                <b>break</b>;
-</code><code id="L4940"><span class="ln">4940</span>                            <b>default</b>:
-</code><code id="L4941"><span class="ln">4941</span>                                <b>var</b> from2<span class="s"> = </span>[].concat(from[attr]);
-</code><code id="L4942"><span class="ln">4942</span>                                now<span class="s"> = </span>[];
-</code><code id="L4943"><span class="ln">4943</span>                                i<span class="s"> = </span>that.paper.customAttributes[attr].length;
-</code><code id="L4944"><span class="ln">4944</span>                                <b>while</b> (i--) {
-</code><code id="L4945"><span class="ln">4945</span>                                    now[i]<span class="s"> = </span>+from2[i]<span class="s"> + </span>pos<span class="s"> * </span>ms<span class="s"> * </span>diff[attr][i];
-</code><code id="L4946"><span class="ln">4946</span>                                }
-</code><code id="L4947"><span class="ln">4947</span>                                <b>break</b>;
-</code><code id="L4948"><span class="ln">4948</span>                        }
-</code><code id="L4949"><span class="ln">4949</span>                        set[attr]<span class="s"> = </span>now;
-</code><code id="L4950"><span class="ln">4950</span>                    }
-</code><code id="L4951"><span class="ln">4951</span>                    that.attr(set);
-</code><code id="L4952"><span class="ln">4952</span>                    (<b>function</b> (id, that, anim) {
-</code><code id="L4953"><span class="ln">4953</span>                        setTimeout(<b>function</b> () {
-</code><code id="L4954"><span class="ln">4954</span>                            eve(<i>"anim.frame."</i><span class="s"> + </span>id, that, anim);
-</code><code id="L4955"><span class="ln">4955</span>                        });
-</code><code id="L4956"><span class="ln">4956</span>                    })(that.id, that, e.anim);
-</code><code id="L4957"><span class="ln">4957</span>                } <b>else</b> {
-</code><code id="L4958"><span class="ln">4958</span>                    (<b>function</b>(f, el, a) {
-</code><code id="L4959"><span class="ln">4959</span>                        setTimeout(<b>function</b>() {
-</code><code id="L4960"><span class="ln">4960</span>                            eve(<i>"anim.finish."</i><span class="s"> + </span>el.id, el, a);
-</code><code id="L4961"><span class="ln">4961</span>                            R.is(f, <i>"<b>function</b>"</i>)<span class="s"> &amp;&amp; </span>f.call(el);
-</code><code id="L4962"><span class="ln">4962</span>                        });
-</code><code id="L4963"><span class="ln">4963</span>                    })(e.callback, that, e.anim);
-</code><code id="L4964"><span class="ln">4964</span>                    <b>if</b> (--e.repeat) {
-</code><code id="L4965"><span class="ln">4965</span>                        that.attr(e.origin);
-</code><code id="L4966"><span class="ln">4966</span>                        e.start<span class="s"> = </span>Now;
-</code><code id="L4967"><span class="ln">4967</span>                    } <b>else</b> {
-</code><code id="L4968"><span class="ln">4968</span>                        that.attr(to);
-</code><code id="L4969"><span class="ln">4969</span>                        animationElements.splice(l--, <span class="d">1</span>);
-</code><code id="L4970"><span class="ln">4970</span>                    }
-</code><code id="L4971"><span class="ln">4971</span>                    <b>if</b> (e.next<span class="s"> &amp;&amp; </span>!e.stop) {
-</code><code id="L4972"><span class="ln">4972</span>                        runAnimation(e.anim, e.el, e.next, <b>null</b>, e.totalOrigin);
-</code><code id="L4973"><span class="ln">4973</span>                    }
-</code><code id="L4974"><span class="ln">4974</span>                }
-</code><code id="L4975"><span class="ln">4975</span>            }
-</code><code id="L4976"><span class="ln">4976</span>            R.svg<span class="s"> &amp;&amp; </span>that<span class="s"> &amp;&amp; </span>that.paper<span class="s"> &amp;&amp; </span>that.paper.safari();
-</code><code id="L4977"><span class="ln">4977</span>            animationElements.length<span class="s"> &amp;&amp; </span>requestAnimFrame(animation);
-</code><code id="L4978"><span class="ln">4978</span>        },
-</code><code id="L4979"><span class="ln">4979</span>        upto255<span class="s"> = </span><b>function</b> (color) {
-</code><code id="L4980"><span class="ln">4980</span>            <b>return</b> mmax(mmin(color, <span class="d">255</span>), <span class="d">0</span>);
-</code><code id="L4981"><span class="ln">4981</span>        };
-</code><code id="L4982"><span class="ln">4982</span><span class="c">    <span class="c">/*\</span>
-</span></code><code id="L4983"><span class="ln">4983</span><span class="c">    <span class="s"> * </span>Element.animateWith
-</span></code><code id="L4984"><span class="ln">4984</span><span class="c">     [ method ]
-</span></code><code id="L4985"><span class="ln">4985</span><span class="c">     **
-</span></code><code id="L4986"><span class="ln">4986</span><span class="c">    <span class="s"> * </span>Acts similar to @Element.animate, but ensure that given animation runs <b>in</b> sync <b>with</b> another given element.
-</span></code><code id="L4987"><span class="ln">4987</span><span class="c">     **
-</span></code><code id="L4988"><span class="ln">4988</span><span class="c">     > Parameters
-</span></code><code id="L4989"><span class="ln">4989</span><span class="c">     **
-</span></code><code id="L4990"><span class="ln">4990</span><span class="c">    <span class="s"> - </span>params (object) <b>final</b> attributes <b>for</b> the element, see also @Element.attr
-</span></code><code id="L4991"><span class="ln">4991</span><span class="c">    <span class="s"> - </span>ms (number) number of milliseconds <b>for</b> animation to run
-</span></code><code id="L4992"><span class="ln">4992</span><span class="c">    <span class="s"> - </span>easing (string) #optional easing type. Accept on of @Raphael.easing_formulas or CSS format: `cubic&#x2010;bezier(XX,&#<span class="d">160</span>;XX,&#<span class="d">160</span>;XX,&#<span class="d">160</span>;XX)`
-</span></code><code id="L4993"><span class="ln">4993</span><span class="c">    <span class="s"> - </span>callback (<b>function</b>) #optional callback <b>function</b>. Will be called at the end of animation.
-</span></code><code id="L4994"><span class="ln">4994</span><span class="c">    <span class="s"> * </span>or
-</span></code><code id="L4995"><span class="ln">4995</span><span class="c">    <span class="s"> - </span>animation (object) animation object, see @Raphael.animation
-</span></code><code id="L4996"><span class="ln">4996</span><span class="c">     **
-</span></code><code id="L4997"><span class="ln">4997</span><span class="c">    <span class="s"> = </span>(object) original element
-</span></code><code id="L4998"><span class="ln">4998</span><span class="c">    \*/</span>
-</code><code id="L4999"><span class="ln">4999</span>    elproto.animateWith<span class="s"> = </span><b>function</b> (element, params, ms, easing, callback) {
-</code><code id="L5000"><span class="ln">5000</span>        <b>for</b> (<b>var</b> i<span class="s"> = </span><span class="d">0</span>, ii<span class="s"> = </span>animationElements.length; i &lt; ii; i++) {
-</code><code id="L5001"><span class="ln">5001</span>            <b>if</b> (animationElements[i].el.id<span class="s"> == </span>element.id) {
-</code><code id="L5002"><span class="ln">5002</span>                params.start<span class="s"> = </span>animationElements[i].timestamp;
-</code><code id="L5003"><span class="ln">5003</span>                <b>break</b>;
-</code><code id="L5004"><span class="ln">5004</span>            }
-</code><code id="L5005"><span class="ln">5005</span>        }
-</code><code id="L5006"><span class="ln">5006</span>        <b>return</b> <b>this</b>.animate(params, ms, easing, callback);
-</code><code id="L5007"><span class="ln">5007</span>    };
-</code><code id="L5008"><span class="ln">5008</span>    <b>function</b> CubicBezierAtTime(t, p1x, p1y, p2x, p2y, duration) {
-</code><code id="L5009"><span class="ln">5009</span>        <b>var</b> cx<span class="s"> = </span><span class="d">3</span><span class="s"> * </span>p1x,
-</code><code id="L5010"><span class="ln">5010</span>            bx<span class="s"> = </span><span class="d">3</span><span class="s"> * </span>(p2x<span class="s"> - </span>p1x)<span class="s"> - </span>cx,
-</code><code id="L5011"><span class="ln">5011</span>            ax<span class="s"> = </span><span class="d">1</span><span class="s"> - </span>cx<span class="s"> - </span>bx,
-</code><code id="L5012"><span class="ln">5012</span>            cy<span class="s"> = </span><span class="d">3</span><span class="s"> * </span>p1y,
-</code><code id="L5013"><span class="ln">5013</span>            by<span class="s"> = </span><span class="d">3</span><span class="s"> * </span>(p2y<span class="s"> - </span>p1y)<span class="s"> - </span>cy,
-</code><code id="L5014"><span class="ln">5014</span>            ay<span class="s"> = </span><span class="d">1</span><span class="s"> - </span>cy<span class="s"> - </span>by;
-</code><code id="L5015"><span class="ln">5015</span>        <b>function</b> sampleCurveX(t) {
-</code><code id="L5016"><span class="ln">5016</span>            <b>return</b> ((ax<span class="s"> * </span>t<span class="s"> + </span>bx)<span class="s"> * </span>t<span class="s"> + </span>cx)<span class="s"> * </span>t;
-</code><code id="L5017"><span class="ln">5017</span>        }
-</code><code id="L5018"><span class="ln">5018</span>        <b>function</b> solve(x, epsilon) {
-</code><code id="L5019"><span class="ln">5019</span>            <b>var</b> t<span class="s"> = </span>solveCurveX(x, epsilon);
-</code><code id="L5020"><span class="ln">5020</span>            <b>return</b> ((ay<span class="s"> * </span>t<span class="s"> + </span>by)<span class="s"> * </span>t<span class="s"> + </span>cy)<span class="s"> * </span>t;
-</code><code id="L5021"><span class="ln">5021</span>        }
-</code><code id="L5022"><span class="ln">5022</span>        <b>function</b> solveCurveX(x, epsilon) {
-</code><code id="L5023"><span class="ln">5023</span>            <b>var</b> t0, t1, t2, x2, d2, i;
-</code><code id="L5024"><span class="ln">5024</span>            <b>for</b>(t2<span class="s"> = </span>x, i<span class="s"> = </span><span class="d">0</span>; i &lt; <span class="d">8</span>; i++) {
-</code><code id="L5025"><span class="ln">5025</span>                x2<span class="s"> = </span>sampleCurveX(t2)<span class="s"> - </span>x;
-</code><code id="L5026"><span class="ln">5026</span>                <b>if</b> (abs(x2) &lt; epsilon) {
-</code><code id="L5027"><span class="ln">5027</span>                    <b>return</b> t2;
-</code><code id="L5028"><span class="ln">5028</span>                }
-</code><code id="L5029"><span class="ln">5029</span>                d2<span class="s"> = </span>(<span class="d">3</span><span class="s"> * </span>ax<span class="s"> * </span>t2<span class="s"> + </span><span class="d">2</span><span class="s"> * </span>bx)<span class="s"> * </span>t2<span class="s"> + </span>cx;
-</code><code id="L5030"><span class="ln">5030</span>                <b>if</b> (abs(d2) &lt; <span class="d">1e-6</span>) {
-</code><code id="L5031"><span class="ln">5031</span>                    <b>break</b>;
-</code><code id="L5032"><span class="ln">5032</span>                }
-</code><code id="L5033"><span class="ln">5033</span>                t2<span class="s"> = </span>t2<span class="s"> - </span>x2<span class="s"> / </span>d2;
-</code><code id="L5034"><span class="ln">5034</span>            }
-</code><code id="L5035"><span class="ln">5035</span>            t0<span class="s"> = </span><span class="d">0</span>;
-</code><code id="L5036"><span class="ln">5036</span>            t1<span class="s"> = </span><span class="d">1</span>;
-</code><code id="L5037"><span class="ln">5037</span>            t2<span class="s"> = </span>x;
-</code><code id="L5038"><span class="ln">5038</span>            <b>if</b> (t2 &lt; t0) {
-</code><code id="L5039"><span class="ln">5039</span>                <b>return</b> t0;
-</code><code id="L5040"><span class="ln">5040</span>            }
-</code><code id="L5041"><span class="ln">5041</span>            <b>if</b> (t2 > t1) {
-</code><code id="L5042"><span class="ln">5042</span>                <b>return</b> t1;
-</code><code id="L5043"><span class="ln">5043</span>            }
-</code><code id="L5044"><span class="ln">5044</span>            <b>while</b> (t0 &lt; t1) {
-</code><code id="L5045"><span class="ln">5045</span>                x2<span class="s"> = </span>sampleCurveX(t2);
-</code><code id="L5046"><span class="ln">5046</span>                <b>if</b> (abs(x2<span class="s"> - </span>x) &lt; epsilon) {
-</code><code id="L5047"><span class="ln">5047</span>                    <b>return</b> t2;
-</code><code id="L5048"><span class="ln">5048</span>                }
-</code><code id="L5049"><span class="ln">5049</span>                <b>if</b> (x > x2) {
-</code><code id="L5050"><span class="ln">5050</span>                    t0<span class="s"> = </span>t2;
-</code><code id="L5051"><span class="ln">5051</span>                } <b>else</b> {
-</code><code id="L5052"><span class="ln">5052</span>                    t1<span class="s"> = </span>t2;
-</code><code id="L5053"><span class="ln">5053</span>                }
-</code><code id="L5054"><span class="ln">5054</span>                t2<span class="s"> = </span>(t1<span class="s"> - </span>t0)<span class="s"> / </span><span class="d">2</span><span class="s"> + </span>t0;
-</code><code id="L5055"><span class="ln">5055</span>            }
-</code><code id="L5056"><span class="ln">5056</span>            <b>return</b> t2;
-</code><code id="L5057"><span class="ln">5057</span>        }
-</code><code id="L5058"><span class="ln">5058</span>        <b>return</b> solve(t, <span class="d">1</span><span class="s"> / </span>(<span class="d">200</span><span class="s"> * </span>duration));
-</code><code id="L5059"><span class="ln">5059</span>    }
-</code><code id="L5060"><span class="ln">5060</span>    elproto.onAnimation<span class="s"> = </span><b>function</b> (f) {
-</code><code id="L5061"><span class="ln">5061</span>        f ? eve.on(<i>"anim.frame."</i><span class="s"> + </span><b>this</b>.id, f) : eve.unbind(<i>"anim.frame."</i><span class="s"> + </span><b>this</b>.id);
-</code><code id="L5062"><span class="ln">5062</span>        <b>return</b> <b>this</b>;
+</code><code id="L4884"><span class="ln">4884</span>                    <b>if</b> (n &lt; (<span class="d">2.5</span><span class="s"> / </span>p)) {
+</code><code id="L4885"><span class="ln">4885</span>                        n -= (<span class="d">2.25</span><span class="s"> / </span>p);
+</code><code id="L4886"><span class="ln">4886</span>                        l<span class="s"> = </span>s<span class="s"> * </span>n<span class="s"> * </span>n<span class="s"> + </span><span class="d">.9375</span>;
+</code><code id="L4887"><span class="ln">4887</span>                    } <b>else</b> {
+</code><code id="L4888"><span class="ln">4888</span>                        n -= (<span class="d">2.625</span><span class="s"> / </span>p);
+</code><code id="L4889"><span class="ln">4889</span>                        l<span class="s"> = </span>s<span class="s"> * </span>n<span class="s"> * </span>n<span class="s"> + </span><span class="d">.984375</span>;
+</code><code id="L4890"><span class="ln">4890</span>                    }
+</code><code id="L4891"><span class="ln">4891</span>                }
+</code><code id="L4892"><span class="ln">4892</span>            }
+</code><code id="L4893"><span class="ln">4893</span>            <b>return</b> l;
+</code><code id="L4894"><span class="ln">4894</span>        }
+</code><code id="L4895"><span class="ln">4895</span>    };
+</code><code id="L4896"><span class="ln">4896</span>    ef.easeIn<span class="s"> = </span>ef[<i>"ease-<b>in</b>"</i>]<span class="s"> = </span>ef[<i>"&lt;"</i>];
+</code><code id="L4897"><span class="ln">4897</span>    ef.easeOut<span class="s"> = </span>ef[<i>"ease-out"</i>]<span class="s"> = </span>ef[<i>">"</i>];
+</code><code id="L4898"><span class="ln">4898</span>    ef.easeInOut<span class="s"> = </span>ef[<i>"ease-<b>in</b>-out"</i>]<span class="s"> = </span>ef[<i>"&lt;>"</i>];
+</code><code id="L4899"><span class="ln">4899</span>    ef[<i>"back-<b>in</b>"</i>]<span class="s"> = </span>ef.backIn;
+</code><code id="L4900"><span class="ln">4900</span>    ef[<i>"back-out"</i>]<span class="s"> = </span>ef.backOut;
+</code><code id="L4901"><span class="ln">4901</span>
+</code><code id="L4902"><span class="ln">4902</span>    <b>var</b> animationElements<span class="s"> = </span>[],
+</code><code id="L4903"><span class="ln">4903</span>        requestAnimFrame<span class="s"> = </span>window.requestAnimationFrame       ||
+</code><code id="L4904"><span class="ln">4904</span>                           window.webkitRequestAnimationFrame ||
+</code><code id="L4905"><span class="ln">4905</span>                           window.mozRequestAnimationFrame    ||
+</code><code id="L4906"><span class="ln">4906</span>                           window.oRequestAnimationFrame      ||
+</code><code id="L4907"><span class="ln">4907</span>                           window.msRequestAnimationFrame     ||
+</code><code id="L4908"><span class="ln">4908</span>                           <b>function</b> (callback) {
+</code><code id="L4909"><span class="ln">4909</span>                               setTimeout(callback, <span class="d">16</span>);
+</code><code id="L4910"><span class="ln">4910</span>                           },
+</code><code id="L4911"><span class="ln">4911</span>        animation<span class="s"> = </span><b>function</b> () {
+</code><code id="L4912"><span class="ln">4912</span>            <b>var</b> Now<span class="s"> = </span>+<b>new</b> Date,
+</code><code id="L4913"><span class="ln">4913</span>                l<span class="s"> = </span><span class="d">0</span>;
+</code><code id="L4914"><span class="ln">4914</span>            <b>for</b> (; l &lt; animationElements.length; l++) {
+</code><code id="L4915"><span class="ln">4915</span>                <b>var</b> e<span class="s"> = </span>animationElements[l];
+</code><code id="L4916"><span class="ln">4916</span>                <b>if</b> (e.el.removed<span class="s"> || </span>e.paused) {
+</code><code id="L4917"><span class="ln">4917</span>                    <b>continue</b>;
+</code><code id="L4918"><span class="ln">4918</span>                }
+</code><code id="L4919"><span class="ln">4919</span>                <b>var</b> time<span class="s"> = </span>Now<span class="s"> - </span>e.start,
+</code><code id="L4920"><span class="ln">4920</span>                    ms<span class="s"> = </span>e.ms,
+</code><code id="L4921"><span class="ln">4921</span>                    easing<span class="s"> = </span>e.easing,
+</code><code id="L4922"><span class="ln">4922</span>                    from<span class="s"> = </span>e.from,
+</code><code id="L4923"><span class="ln">4923</span>                    diff<span class="s"> = </span>e.diff,
+</code><code id="L4924"><span class="ln">4924</span>                    to<span class="s"> = </span>e.to,
+</code><code id="L4925"><span class="ln">4925</span>                    t<span class="s"> = </span>e.t,
+</code><code id="L4926"><span class="ln">4926</span>                    that<span class="s"> = </span>e.el,
+</code><code id="L4927"><span class="ln">4927</span>                    set<span class="s"> = </span>{},
+</code><code id="L4928"><span class="ln">4928</span>                    now;
+</code><code id="L4929"><span class="ln">4929</span>                <b>if</b> (e.initstatus) {
+</code><code id="L4930"><span class="ln">4930</span>                    time<span class="s"> = </span>(e.initstatus<span class="s"> * </span>e.anim.top<span class="s"> - </span>e.prev)<span class="s"> / </span>(e.percent<span class="s"> - </span>e.prev)<span class="s"> * </span>ms;
+</code><code id="L4931"><span class="ln">4931</span>                    e.status<span class="s"> = </span>e.initstatus;
+</code><code id="L4932"><span class="ln">4932</span>                    <b>delete</b> e.initstatus;
+</code><code id="L4933"><span class="ln">4933</span>                    e.stop<span class="s"> &amp;&amp; </span>animationElements.splice(l--, <span class="d">1</span>);
+</code><code id="L4934"><span class="ln">4934</span>                } <b>else</b> {
+</code><code id="L4935"><span class="ln">4935</span>                    e.status<span class="s"> = </span>(e.prev<span class="s"> + </span>(e.percent<span class="s"> - </span>e.prev)<span class="s"> * </span>(time<span class="s"> / </span>ms))<span class="s"> / </span>e.anim.top;
+</code><code id="L4936"><span class="ln">4936</span>                }
+</code><code id="L4937"><span class="ln">4937</span>                <b>if</b> (time &lt; <span class="d">0</span>) {
+</code><code id="L4938"><span class="ln">4938</span>                    <b>continue</b>;
+</code><code id="L4939"><span class="ln">4939</span>                }
+</code><code id="L4940"><span class="ln">4940</span>                <b>if</b> (time &lt; ms) {
+</code><code id="L4941"><span class="ln">4941</span>                    <b>var</b> pos<span class="s"> = </span>easing(time<span class="s"> / </span>ms);
+</code><code id="L4942"><span class="ln">4942</span>                    <b>for</b> (<b>var</b> attr <b>in</b> from) <b>if</b> (from[has](attr)) {
+</code><code id="L4943"><span class="ln">4943</span>                        <b>switch</b> (availableAnimAttrs[attr]) {
+</code><code id="L4944"><span class="ln">4944</span>                            <b>case</b> nu:
+</code><code id="L4945"><span class="ln">4945</span>                                now<span class="s"> = </span>+from[attr]<span class="s"> + </span>pos<span class="s"> * </span>ms<span class="s"> * </span>diff[attr];
+</code><code id="L4946"><span class="ln">4946</span>                                <b>break</b>;
+</code><code id="L4947"><span class="ln">4947</span>                            <b>case</b> <i>"colour"</i>:
+</code><code id="L4948"><span class="ln">4948</span>                                now<span class="s"> = </span><i>"rgb("</i><span class="s"> + </span>[
+</code><code id="L4949"><span class="ln">4949</span>                                    upto255(round(from[attr].r<span class="s"> + </span>pos<span class="s"> * </span>ms<span class="s"> * </span>diff[attr].r)),
+</code><code id="L4950"><span class="ln">4950</span>                                    upto255(round(from[attr].g<span class="s"> + </span>pos<span class="s"> * </span>ms<span class="s"> * </span>diff[attr].g)),
+</code><code id="L4951"><span class="ln">4951</span>                                    upto255(round(from[attr].b<span class="s"> + </span>pos<span class="s"> * </span>ms<span class="s"> * </span>diff[attr].b))
+</code><code id="L4952"><span class="ln">4952</span>                                ].join(<i>","</i>)<span class="s"> + </span><i>")"</i>;
+</code><code id="L4953"><span class="ln">4953</span>                                <b>break</b>;
+</code><code id="L4954"><span class="ln">4954</span>                            <b>case</b> <i>"path"</i>:
+</code><code id="L4955"><span class="ln">4955</span>                                now<span class="s"> = </span>[];
+</code><code id="L4956"><span class="ln">4956</span>                                <b>for</b> (<b>var</b> i<span class="s"> = </span><span class="d">0</span>, ii<span class="s"> = </span>from[attr].length; i &lt; ii; i++) {
+</code><code id="L4957"><span class="ln">4957</span>                                    now[i]<span class="s"> = </span>[from[attr][i][<span class="d">0</span>]];
+</code><code id="L4958"><span class="ln">4958</span>                                    <b>for</b> (<b>var</b> j<span class="s"> = </span><span class="d">1</span>, jj<span class="s"> = </span>from[attr][i].length; j &lt; jj; j++) {
+</code><code id="L4959"><span class="ln">4959</span>                                        now[i][j]<span class="s"> = </span>+from[attr][i][j]<span class="s"> + </span>pos<span class="s"> * </span>ms<span class="s"> * </span>diff[attr][i][j];
+</code><code id="L4960"><span class="ln">4960</span>                                    }
+</code><code id="L4961"><span class="ln">4961</span>                                    now[i]<span class="s"> = </span>now[i].join(S);
+</code><code id="L4962"><span class="ln">4962</span>                                }
+</code><code id="L4963"><span class="ln">4963</span>                                now<span class="s"> = </span>now.join(S);
+</code><code id="L4964"><span class="ln">4964</span>                                <b>break</b>;
+</code><code id="L4965"><span class="ln">4965</span>                            <b>case</b> <i>"transform"</i>:
+</code><code id="L4966"><span class="ln">4966</span>                                <b>if</b> (diff[attr].real) {
+</code><code id="L4967"><span class="ln">4967</span>                                    now<span class="s"> = </span>[];
+</code><code id="L4968"><span class="ln">4968</span>                                    <b>for</b> (i<span class="s"> = </span><span class="d">0</span>, ii<span class="s"> = </span>from[attr].length; i &lt; ii; i++) {
+</code><code id="L4969"><span class="ln">4969</span>                                        now[i]<span class="s"> = </span>[from[attr][i][<span class="d">0</span>]];
+</code><code id="L4970"><span class="ln">4970</span>                                        <b>for</b> (j<span class="s"> = </span><span class="d">1</span>, jj<span class="s"> = </span>from[attr][i].length; j &lt; jj; j++) {
+</code><code id="L4971"><span class="ln">4971</span>                                            now[i][j]<span class="s"> = </span>from[attr][i][j]<span class="s"> + </span>pos<span class="s"> * </span>ms<span class="s"> * </span>diff[attr][i][j];
+</code><code id="L4972"><span class="ln">4972</span>                                        }
+</code><code id="L4973"><span class="ln">4973</span>                                    }
+</code><code id="L4974"><span class="ln">4974</span>                                } <b>else</b> {
+</code><code id="L4975"><span class="ln">4975</span>                                    <b>var</b> get<span class="s"> = </span><b>function</b> (i) {
+</code><code id="L4976"><span class="ln">4976</span>                                        <b>return</b> +from[attr][i]<span class="s"> + </span>pos<span class="s"> * </span>ms<span class="s"> * </span>diff[attr][i];
+</code><code id="L4977"><span class="ln">4977</span>                                    };
+</code><code id="L4978"><span class="ln">4978</span>                                    <span class="c">// now<span class="s"> = </span>[[<i>"r"</i>, get(<span class="d">2</span>), <span class="d">0</span>, <span class="d">0</span>], [<i>"t"</i>, get(<span class="d">3</span>), get(<span class="d">4</span>)], [<i>"s"</i>, get(<span class="d">0</span>), get(<span class="d">1</span>), <span class="d">0</span>, <span class="d">0</span>]];</span>
+</code><code id="L4979"><span class="ln">4979</span>                                    now<span class="s"> = </span>[[<i>"m"</i>, get(<span class="d">0</span>), get(<span class="d">1</span>), get(<span class="d">2</span>), get(<span class="d">3</span>), get(<span class="d">4</span>), get(<span class="d">5</span>)]];
+</code><code id="L4980"><span class="ln">4980</span>                                }
+</code><code id="L4981"><span class="ln">4981</span>                                <b>break</b>;
+</code><code id="L4982"><span class="ln">4982</span>                            <b>case</b> <i>"csv"</i>:
+</code><code id="L4983"><span class="ln">4983</span>                                <b>if</b> (attr<span class="s"> == </span><i>"clip-rect"</i>) {
+</code><code id="L4984"><span class="ln">4984</span>                                    now<span class="s"> = </span>[];
+</code><code id="L4985"><span class="ln">4985</span>                                    i<span class="s"> = </span><span class="d">4</span>;
+</code><code id="L4986"><span class="ln">4986</span>                                    <b>while</b> (i--) {
+</code><code id="L4987"><span class="ln">4987</span>                                        now[i]<span class="s"> = </span>+from[attr][i]<span class="s"> + </span>pos<span class="s"> * </span>ms<span class="s"> * </span>diff[attr][i];
+</code><code id="L4988"><span class="ln">4988</span>                                    }
+</code><code id="L4989"><span class="ln">4989</span>                                }
+</code><code id="L4990"><span class="ln">4990</span>                                <b>break</b>;
+</code><code id="L4991"><span class="ln">4991</span>                            <b>default</b>:
+</code><code id="L4992"><span class="ln">4992</span>                                <b>var</b> from2<span class="s"> = </span>[].concat(from[attr]);
+</code><code id="L4993"><span class="ln">4993</span>                                now<span class="s"> = </span>[];
+</code><code id="L4994"><span class="ln">4994</span>                                i<span class="s"> = </span>that.paper.customAttributes[attr].length;
+</code><code id="L4995"><span class="ln">4995</span>                                <b>while</b> (i--) {
+</code><code id="L4996"><span class="ln">4996</span>                                    now[i]<span class="s"> = </span>+from2[i]<span class="s"> + </span>pos<span class="s"> * </span>ms<span class="s"> * </span>diff[attr][i];
+</code><code id="L4997"><span class="ln">4997</span>                                }
+</code><code id="L4998"><span class="ln">4998</span>                                <b>break</b>;
+</code><code id="L4999"><span class="ln">4999</span>                        }
+</code><code id="L5000"><span class="ln">5000</span>                        set[attr]<span class="s"> = </span>now;
+</code><code id="L5001"><span class="ln">5001</span>                    }
+</code><code id="L5002"><span class="ln">5002</span>                    that.attr(set);
+</code><code id="L5003"><span class="ln">5003</span>                    (<b>function</b> (id, that, anim) {
+</code><code id="L5004"><span class="ln">5004</span>                        setTimeout(<b>function</b> () {
+</code><code id="L5005"><span class="ln">5005</span>                            eve(<i>"anim.frame."</i><span class="s"> + </span>id, that, anim);
+</code><code id="L5006"><span class="ln">5006</span>                        });
+</code><code id="L5007"><span class="ln">5007</span>                    })(that.id, that, e.anim);
+</code><code id="L5008"><span class="ln">5008</span>                } <b>else</b> {
+</code><code id="L5009"><span class="ln">5009</span>                    (<b>function</b>(f, el, a) {
+</code><code id="L5010"><span class="ln">5010</span>                        setTimeout(<b>function</b>() {
+</code><code id="L5011"><span class="ln">5011</span>                            eve(<i>"anim.finish."</i><span class="s"> + </span>el.id, el, a);
+</code><code id="L5012"><span class="ln">5012</span>                            R.is(f, <i>"<b>function</b>"</i>)<span class="s"> &amp;&amp; </span>f.call(el);
+</code><code id="L5013"><span class="ln">5013</span>                        });
+</code><code id="L5014"><span class="ln">5014</span>                    })(e.callback, that, e.anim);
+</code><code id="L5015"><span class="ln">5015</span>                    console.log(e.repeat);
+</code><code id="L5016"><span class="ln">5016</span>                    <b>if</b> (--e.repeat) {
+</code><code id="L5017"><span class="ln">5017</span>                        that.attr(e.origin);
+</code><code id="L5018"><span class="ln">5018</span>                        e.start<span class="s"> = </span>Now;
+</code><code id="L5019"><span class="ln">5019</span>                    } <b>else</b> {
+</code><code id="L5020"><span class="ln">5020</span>                        that.attr(to);
+</code><code id="L5021"><span class="ln">5021</span>                        animationElements.splice(l--, <span class="d">1</span>);
+</code><code id="L5022"><span class="ln">5022</span>                    }
+</code><code id="L5023"><span class="ln">5023</span>                    <b>if</b> (e.next<span class="s"> &amp;&amp; </span>!e.stop) {
+</code><code id="L5024"><span class="ln">5024</span>                        runAnimation(e.anim, e.el, e.next, <b>null</b>, e.totalOrigin);
+</code><code id="L5025"><span class="ln">5025</span>                    }
+</code><code id="L5026"><span class="ln">5026</span>                }
+</code><code id="L5027"><span class="ln">5027</span>            }
+</code><code id="L5028"><span class="ln">5028</span>            R.svg<span class="s"> &amp;&amp; </span>that<span class="s"> &amp;&amp; </span>that.paper<span class="s"> &amp;&amp; </span>that.paper.safari();
+</code><code id="L5029"><span class="ln">5029</span>            animationElements.length<span class="s"> &amp;&amp; </span>requestAnimFrame(animation);
+</code><code id="L5030"><span class="ln">5030</span>        },
+</code><code id="L5031"><span class="ln">5031</span>        upto255<span class="s"> = </span><b>function</b> (color) {
+</code><code id="L5032"><span class="ln">5032</span>            <b>return</b> mmax(mmin(color, <span class="d">255</span>), <span class="d">0</span>);
+</code><code id="L5033"><span class="ln">5033</span>        };
+</code><code id="L5034"><span class="ln">5034</span><span class="c">    <span class="c">/*\</span>
+</span></code><code id="L5035"><span class="ln">5035</span><span class="c">    <span class="s"> * </span>Element.animateWith
+</span></code><code id="L5036"><span class="ln">5036</span><span class="c">     [ method ]
+</span></code><code id="L5037"><span class="ln">5037</span><span class="c">     **
+</span></code><code id="L5038"><span class="ln">5038</span><span class="c">    <span class="s"> * </span>Acts similar to @Element.animate, but ensure that given animation runs <b>in</b> sync <b>with</b> another given element.
+</span></code><code id="L5039"><span class="ln">5039</span><span class="c">     **
+</span></code><code id="L5040"><span class="ln">5040</span><span class="c">     > Parameters
+</span></code><code id="L5041"><span class="ln">5041</span><span class="c">     **
+</span></code><code id="L5042"><span class="ln">5042</span><span class="c">    <span class="s"> - </span>params (object) <b>final</b> attributes <b>for</b> the element, see also @Element.attr
+</span></code><code id="L5043"><span class="ln">5043</span><span class="c">    <span class="s"> - </span>ms (number) number of milliseconds <b>for</b> animation to run
+</span></code><code id="L5044"><span class="ln">5044</span><span class="c">    <span class="s"> - </span>easing (string) #optional easing type. Accept on of @Raphael.easing_formulas or CSS format: `cubic&#x2010;bezier(XX,&#<span class="d">160</span>;XX,&#<span class="d">160</span>;XX,&#<span class="d">160</span>;XX)`
+</span></code><code id="L5045"><span class="ln">5045</span><span class="c">    <span class="s"> - </span>callback (<b>function</b>) #optional callback <b>function</b>. Will be called at the end of animation.
+</span></code><code id="L5046"><span class="ln">5046</span><span class="c">    <span class="s"> * </span>or
+</span></code><code id="L5047"><span class="ln">5047</span><span class="c">    <span class="s"> - </span>animation (object) animation object, see @Raphael.animation
+</span></code><code id="L5048"><span class="ln">5048</span><span class="c">     **
+</span></code><code id="L5049"><span class="ln">5049</span><span class="c">    <span class="s"> = </span>(object) original element
+</span></code><code id="L5050"><span class="ln">5050</span><span class="c">    \*/</span>
+</code><code id="L5051"><span class="ln">5051</span>    elproto.animateWith<span class="s"> = </span><b>function</b> (element, params, ms, easing, callback) {
+</code><code id="L5052"><span class="ln">5052</span>        <b>this</b>.animate(params, ms, easing, callback);
+</code><code id="L5053"><span class="ln">5053</span>        <b>var</b> start, el;
+</code><code id="L5054"><span class="ln">5054</span>        <b>for</b> (<b>var</b> i<span class="s"> = </span><span class="d">0</span>, ii<span class="s"> = </span>animationElements.length; i &lt; ii; i++) {
+</code><code id="L5055"><span class="ln">5055</span>            el<span class="s"> = </span>animationElements[i];
+</code><code id="L5056"><span class="ln">5056</span>            <b>if</b> (el.el.id<span class="s"> == </span>element.id) {
+</code><code id="L5057"><span class="ln">5057</span>                start<span class="s"> = </span>el.timestamp;
+</code><code id="L5058"><span class="ln">5058</span>            } <b>else</b> <b>if</b> (el.el.id<span class="s"> == </span><b>this</b>.id) {
+</code><code id="L5059"><span class="ln">5059</span>                el.start<span class="s"> = </span>start;
+</code><code id="L5060"><span class="ln">5060</span>            }
+</code><code id="L5061"><span class="ln">5061</span>        }
+</code><code id="L5062"><span class="ln">5062</span>        <b>return</b> <b>this</b>.animate(params, ms, easing, callback);
 </code><code id="L5063"><span class="ln">5063</span>    };
-</code><code id="L5064"><span class="ln">5064</span>    <b>function</b> Animation(anim, ms) {
-</code><code id="L5065"><span class="ln">5065</span>        <b>var</b> percents<span class="s"> = </span>[];
-</code><code id="L5066"><span class="ln">5066</span>        <b>this</b>.anim<span class="s"> = </span>anim;
-</code><code id="L5067"><span class="ln">5067</span>        <b>this</b>.ms<span class="s"> = </span>ms;
-</code><code id="L5068"><span class="ln">5068</span>        <b>this</b>.times<span class="s"> = </span><span class="d">1</span>;
-</code><code id="L5069"><span class="ln">5069</span>        <b>if</b> (<b>this</b>.anim) {
-</code><code id="L5070"><span class="ln">5070</span>            <b>for</b> (<b>var</b> attr <b>in</b> <b>this</b>.anim) <b>if</b> (<b>this</b>.anim[has](attr)) {
-</code><code id="L5071"><span class="ln">5071</span>                percents.push(+attr);
-</code><code id="L5072"><span class="ln">5072</span>            }
-</code><code id="L5073"><span class="ln">5073</span>            percents.sort(sortByNumber);
-</code><code id="L5074"><span class="ln">5074</span>        }
-</code><code id="L5075"><span class="ln">5075</span>        <b>this</b>.top<span class="s"> = </span>percents[percents.length<span class="s"> - </span><span class="d">1</span>];
-</code><code id="L5076"><span class="ln">5076</span>        <b>this</b>.percents<span class="s"> = </span>percents;
-</code><code id="L5077"><span class="ln">5077</span>    }
-</code><code id="L5078"><span class="ln">5078</span><span class="c">    <span class="c">/*\</span>
-</span></code><code id="L5079"><span class="ln">5079</span><span class="c">    <span class="s"> * </span>Animation.delay
-</span></code><code id="L5080"><span class="ln">5080</span><span class="c">     [ method ]
-</span></code><code id="L5081"><span class="ln">5081</span><span class="c">     **
-</span></code><code id="L5082"><span class="ln">5082</span><span class="c">    <span class="s"> * </span>Creates a copy of existing animation object <b>with</b> given delay.
-</span></code><code id="L5083"><span class="ln">5083</span><span class="c">     **
-</span></code><code id="L5084"><span class="ln">5084</span><span class="c">     > Parameters
-</span></code><code id="L5085"><span class="ln">5085</span><span class="c">     **
-</span></code><code id="L5086"><span class="ln">5086</span><span class="c">    <span class="s"> - </span>delay (number) number of ms to pass between animation start and actual animation
-</span></code><code id="L5087"><span class="ln">5087</span><span class="c">     **
-</span></code><code id="L5088"><span class="ln">5088</span><span class="c">    <span class="s"> = </span>(object) <b>new</b> altered Animation object
-</span></code><code id="L5089"><span class="ln">5089</span><span class="c">    \*/</span>
-</code><code id="L5090"><span class="ln">5090</span>    Animation.prototype.delay<span class="s"> = </span><b>function</b> (delay) {
-</code><code id="L5091"><span class="ln">5091</span>        <b>var</b> a<span class="s"> = </span><b>new</b> Animation(<b>this</b>.anim, <b>this</b>.ms);
-</code><code id="L5092"><span class="ln">5092</span>        a.times<span class="s"> = </span><b>this</b>.times;
-</code><code id="L5093"><span class="ln">5093</span>        a.del<span class="s"> = </span>+delay<span class="s"> || </span><span class="d">0</span>;
-</code><code id="L5094"><span class="ln">5094</span>        <b>return</b> a;
-</code><code id="L5095"><span class="ln">5095</span>    };
-</code><code id="L5096"><span class="ln">5096</span><span class="c">    <span class="c">/*\</span>
-</span></code><code id="L5097"><span class="ln">5097</span><span class="c">    <span class="s"> * </span>Animation.repeat
-</span></code><code id="L5098"><span class="ln">5098</span><span class="c">     [ method ]
-</span></code><code id="L5099"><span class="ln">5099</span><span class="c">     **
-</span></code><code id="L5100"><span class="ln">5100</span><span class="c">    <span class="s"> * </span>Creates a copy of existing animation object <b>with</b> given repetition.
-</span></code><code id="L5101"><span class="ln">5101</span><span class="c">     **
-</span></code><code id="L5102"><span class="ln">5102</span><span class="c">     > Parameters
-</span></code><code id="L5103"><span class="ln">5103</span><span class="c">     **
-</span></code><code id="L5104"><span class="ln">5104</span><span class="c">    <span class="s"> - </span>repeat (number) number iterations of animation. For infinite animation pass `Infinity`
-</span></code><code id="L5105"><span class="ln">5105</span><span class="c">     **
-</span></code><code id="L5106"><span class="ln">5106</span><span class="c">    <span class="s"> = </span>(object) <b>new</b> altered Animation object
-</span></code><code id="L5107"><span class="ln">5107</span><span class="c">    \*/</span>
-</code><code id="L5108"><span class="ln">5108</span>    Animation.prototype.repeat<span class="s"> = </span><b>function</b> (times) { 
-</code><code id="L5109"><span class="ln">5109</span>        <b>var</b> a<span class="s"> = </span><b>new</b> Animation(<b>this</b>.anim, <b>this</b>.ms);
-</code><code id="L5110"><span class="ln">5110</span>        a.del<span class="s"> = </span><b>this</b>.del;
-</code><code id="L5111"><span class="ln">5111</span>        a.times<span class="s"> = </span>math.floor(mmax(times, <span class="d">0</span>))<span class="s"> || </span><span class="d">1</span>;
-</code><code id="L5112"><span class="ln">5112</span>        <b>return</b> a;
-</code><code id="L5113"><span class="ln">5113</span>    };
-</code><code id="L5114"><span class="ln">5114</span>    <b>function</b> runAnimation(anim, element, percent, status, totalOrigin) {
-</code><code id="L5115"><span class="ln">5115</span>        percent<span class="s"> = </span>toFloat(percent);
-</code><code id="L5116"><span class="ln">5116</span>        <b>var</b> params,
-</code><code id="L5117"><span class="ln">5117</span>            isInAnim,
-</code><code id="L5118"><span class="ln">5118</span>            isInAnimSet,
-</code><code id="L5119"><span class="ln">5119</span>            percents<span class="s"> = </span>[],
-</code><code id="L5120"><span class="ln">5120</span>            next,
-</code><code id="L5121"><span class="ln">5121</span>            prev,
-</code><code id="L5122"><span class="ln">5122</span>            timestamp,
-</code><code id="L5123"><span class="ln">5123</span>            ms<span class="s"> = </span>anim.ms,
-</code><code id="L5124"><span class="ln">5124</span>            from<span class="s"> = </span>{},
-</code><code id="L5125"><span class="ln">5125</span>            to<span class="s"> = </span>{},
-</code><code id="L5126"><span class="ln">5126</span>            diff<span class="s"> = </span>{};
-</code><code id="L5127"><span class="ln">5127</span>        <b>if</b> (status) {
-</code><code id="L5128"><span class="ln">5128</span>            <b>for</b> (i<span class="s"> = </span><span class="d">0</span>, ii<span class="s"> = </span>animationElements.length; i &lt; ii; i++) {
-</code><code id="L5129"><span class="ln">5129</span>                <b>var</b> e<span class="s"> = </span>animationElements[i];
-</code><code id="L5130"><span class="ln">5130</span>                <b>if</b> (e.el.id<span class="s"> == </span>element.id<span class="s"> &amp;&amp; </span>e.anim<span class="s"> == </span>anim) {
-</code><code id="L5131"><span class="ln">5131</span>                    <b>if</b> (e.percent != percent) {
-</code><code id="L5132"><span class="ln">5132</span>                        animationElements.splice(i, <span class="d">1</span>);
-</code><code id="L5133"><span class="ln">5133</span>                        isInAnimSet<span class="s"> = </span><span class="d">1</span>;
-</code><code id="L5134"><span class="ln">5134</span>                    } <b>else</b> {
-</code><code id="L5135"><span class="ln">5135</span>                        isInAnim<span class="s"> = </span>e;
-</code><code id="L5136"><span class="ln">5136</span>                    }
-</code><code id="L5137"><span class="ln">5137</span>                    element.attr(e.totalOrigin);
-</code><code id="L5138"><span class="ln">5138</span>                    <b>break</b>;
-</code><code id="L5139"><span class="ln">5139</span>                }
-</code><code id="L5140"><span class="ln">5140</span>            }
-</code><code id="L5141"><span class="ln">5141</span>        } <b>else</b> {
-</code><code id="L5142"><span class="ln">5142</span>            status<span class="s"> = </span><span class="d">0</span><span class="s"> / </span><span class="d">0</span>;
-</code><code id="L5143"><span class="ln">5143</span>        }
-</code><code id="L5144"><span class="ln">5144</span>        <b>for</b> (<b>var</b> i<span class="s"> = </span><span class="d">0</span>, ii<span class="s"> = </span>anim.percents.length; i &lt; ii; i++) {
-</code><code id="L5145"><span class="ln">5145</span>            <b>if</b> (anim.percents[i]<span class="s"> == </span>percent<span class="s"> || </span>anim.percents[i] > status<span class="s"> * </span>anim.top) {
-</code><code id="L5146"><span class="ln">5146</span>                percent<span class="s"> = </span>anim.percents[i];
-</code><code id="L5147"><span class="ln">5147</span>                prev<span class="s"> = </span>anim.percents[i<span class="s"> - </span><span class="d">1</span>]<span class="s"> || </span><span class="d">0</span>;
-</code><code id="L5148"><span class="ln">5148</span>                ms<span class="s"> = </span>ms<span class="s"> / </span>anim.top<span class="s"> * </span>(percent<span class="s"> - </span>prev);
-</code><code id="L5149"><span class="ln">5149</span>                next<span class="s"> = </span>anim.percents[i<span class="s"> + </span><span class="d">1</span>];
-</code><code id="L5150"><span class="ln">5150</span>                params<span class="s"> = </span>anim.anim[percent];
-</code><code id="L5151"><span class="ln">5151</span>                <b>break</b>;
-</code><code id="L5152"><span class="ln">5152</span>            } <b>else</b> <b>if</b> (status) {
-</code><code id="L5153"><span class="ln">5153</span>                element.attr(anim.anim[anim.percents[i]]);
-</code><code id="L5154"><span class="ln">5154</span>            }
-</code><code id="L5155"><span class="ln">5155</span>        }
-</code><code id="L5156"><span class="ln">5156</span>        <b>if</b> (!params) {
-</code><code id="L5157"><span class="ln">5157</span>            <b>return</b>;
-</code><code id="L5158"><span class="ln">5158</span>        }
-</code><code id="L5159"><span class="ln">5159</span>        <b>if</b> (!isInAnim) {
-</code><code id="L5160"><span class="ln">5160</span>            <b>for</b> (attr <b>in</b> params) <b>if</b> (params[has](attr)) {
-</code><code id="L5161"><span class="ln">5161</span>                <b>if</b> (availableAnimAttrs[has](attr)<span class="s"> || </span>element.paper.customAttributes[has](attr)) {
-</code><code id="L5162"><span class="ln">5162</span>                    from[attr]<span class="s"> = </span>element.attr(attr);
-</code><code id="L5163"><span class="ln">5163</span>                    (from[attr]<span class="s"> == </span><b>null</b>)<span class="s"> &amp;&amp; </span>(from[attr]<span class="s"> = </span>availableAttrs[attr]);
-</code><code id="L5164"><span class="ln">5164</span>                    to[attr]<span class="s"> = </span>params[attr];
-</code><code id="L5165"><span class="ln">5165</span>                    <b>switch</b> (availableAnimAttrs[attr]) {
-</code><code id="L5166"><span class="ln">5166</span>                        <b>case</b> nu:
-</code><code id="L5167"><span class="ln">5167</span>                            diff[attr]<span class="s"> = </span>(to[attr]<span class="s"> - </span>from[attr])<span class="s"> / </span>ms;
-</code><code id="L5168"><span class="ln">5168</span>                            <b>break</b>;
-</code><code id="L5169"><span class="ln">5169</span>                        <b>case</b> <i>"colour"</i>:
-</code><code id="L5170"><span class="ln">5170</span>                            from[attr]<span class="s"> = </span>R.getRGB(from[attr]);
-</code><code id="L5171"><span class="ln">5171</span>                            <b>var</b> toColour<span class="s"> = </span>R.getRGB(to[attr]);
-</code><code id="L5172"><span class="ln">5172</span>                            diff[attr]<span class="s"> = </span>{
-</code><code id="L5173"><span class="ln">5173</span>                                r: (toColour.r<span class="s"> - </span>from[attr].r)<span class="s"> / </span>ms,
-</code><code id="L5174"><span class="ln">5174</span>                                g: (toColour.g<span class="s"> - </span>from[attr].g)<span class="s"> / </span>ms,
-</code><code id="L5175"><span class="ln">5175</span>                                b: (toColour.b<span class="s"> - </span>from[attr].b)<span class="s"> / </span>ms
-</code><code id="L5176"><span class="ln">5176</span>                            };
-</code><code id="L5177"><span class="ln">5177</span>                            <b>break</b>;
-</code><code id="L5178"><span class="ln">5178</span>                        <b>case</b> <i>"path"</i>:
-</code><code id="L5179"><span class="ln">5179</span>                            <b>var</b> pathes<span class="s"> = </span>path2curve(from[attr], to[attr]),
-</code><code id="L5180"><span class="ln">5180</span>                                toPath<span class="s"> = </span>pathes[<span class="d">1</span>];
-</code><code id="L5181"><span class="ln">5181</span>                            from[attr]<span class="s"> = </span>pathes[<span class="d">0</span>];
-</code><code id="L5182"><span class="ln">5182</span>                            diff[attr]<span class="s"> = </span>[];
-</code><code id="L5183"><span class="ln">5183</span>                            <b>for</b> (i<span class="s"> = </span><span class="d">0</span>, ii<span class="s"> = </span>from[attr].length; i &lt; ii; i++) {
-</code><code id="L5184"><span class="ln">5184</span>                                diff[attr][i]<span class="s"> = </span>[<span class="d">0</span>];
-</code><code id="L5185"><span class="ln">5185</span>                                <b>for</b> (<b>var</b> j<span class="s"> = </span><span class="d">1</span>, jj<span class="s"> = </span>from[attr][i].length; j &lt; jj; j++) {
-</code><code id="L5186"><span class="ln">5186</span>                                    diff[attr][i][j]<span class="s"> = </span>(toPath[i][j]<span class="s"> - </span>from[attr][i][j])<span class="s"> / </span>ms;
-</code><code id="L5187"><span class="ln">5187</span>                                }
-</code><code id="L5188"><span class="ln">5188</span>                            }
-</code><code id="L5189"><span class="ln">5189</span>                            <b>break</b>;
-</code><code id="L5190"><span class="ln">5190</span>                        <b>case</b> <i>"transform"</i>:
-</code><code id="L5191"><span class="ln">5191</span>                            <b>var</b> _<span class="s"> = </span>element._,
-</code><code id="L5192"><span class="ln">5192</span>                                eq<span class="s"> = </span>equaliseTransform(_[attr], to[attr]);
-</code><code id="L5193"><span class="ln">5193</span>                            <b>if</b> (eq) {
-</code><code id="L5194"><span class="ln">5194</span>                                from[attr]<span class="s"> = </span>eq.from;
-</code><code id="L5195"><span class="ln">5195</span>                                to[attr]<span class="s"> = </span>eq.to;
-</code><code id="L5196"><span class="ln">5196</span>                                diff[attr]<span class="s"> = </span>[];
-</code><code id="L5197"><span class="ln">5197</span>                                diff[attr].real<span class="s"> = </span><b>true</b>;
-</code><code id="L5198"><span class="ln">5198</span>                                <b>for</b> (i<span class="s"> = </span><span class="d">0</span>, ii<span class="s"> = </span>from[attr].length; i &lt; ii; i++) {
-</code><code id="L5199"><span class="ln">5199</span>                                    diff[attr][i]<span class="s"> = </span>[from[attr][i][<span class="d">0</span>]];
-</code><code id="L5200"><span class="ln">5200</span>                                    <b>for</b> (j<span class="s"> = </span><span class="d">1</span>, jj<span class="s"> = </span>from[attr][i].length; j &lt; jj; j++) {
-</code><code id="L5201"><span class="ln">5201</span>                                        diff[attr][i][j]<span class="s"> = </span>(to[attr][i][j]<span class="s"> - </span>from[attr][i][j])<span class="s"> / </span>ms;
-</code><code id="L5202"><span class="ln">5202</span>                                    }
-</code><code id="L5203"><span class="ln">5203</span>                                }
-</code><code id="L5204"><span class="ln">5204</span>                            } <b>else</b> {
-</code><code id="L5205"><span class="ln">5205</span>                                <b>var</b> m<span class="s"> = </span>(element.matrix<span class="s"> || </span><b>new</b> Matrix).m,
-</code><code id="L5206"><span class="ln">5206</span>                                    to2<span class="s"> = </span>{_:{transform: _.transform}, getBBox: <b>function</b> () { <b>return</b> element.getBBox(); }};
-</code><code id="L5207"><span class="ln">5207</span>                                from[attr]<span class="s"> = </span>[
-</code><code id="L5208"><span class="ln">5208</span>                                    m[<span class="d">0</span>][<span class="d">0</span>],
-</code><code id="L5209"><span class="ln">5209</span>                                    m[<span class="d">1</span>][<span class="d">0</span>],
-</code><code id="L5210"><span class="ln">5210</span>                                    m[<span class="d">0</span>][<span class="d">1</span>],
-</code><code id="L5211"><span class="ln">5211</span>                                    m[<span class="d">1</span>][<span class="d">1</span>],
-</code><code id="L5212"><span class="ln">5212</span>                                    m[<span class="d">0</span>][<span class="d">2</span>],
-</code><code id="L5213"><span class="ln">5213</span>                                    m[<span class="d">1</span>][<span class="d">2</span>]
-</code><code id="L5214"><span class="ln">5214</span>                                ];
-</code><code id="L5215"><span class="ln">5215</span>                                extractTransform(to2, to[attr]);
-</code><code id="L5216"><span class="ln">5216</span>                                to[attr]<span class="s"> = </span>to2._.transform;
-</code><code id="L5217"><span class="ln">5217</span>                                diff[attr]<span class="s"> = </span>[
-</code><code id="L5218"><span class="ln">5218</span>                                    (to2.matrix.m[<span class="d">0</span>][<span class="d">0</span>]<span class="s"> - </span>m[<span class="d">0</span>][<span class="d">0</span>])<span class="s"> / </span>ms,
-</code><code id="L5219"><span class="ln">5219</span>                                    (to2.matrix.m[<span class="d">1</span>][<span class="d">0</span>]<span class="s"> - </span>m[<span class="d">1</span>][<span class="d">0</span>])<span class="s"> / </span>ms,
-</code><code id="L5220"><span class="ln">5220</span>                                    (to2.matrix.m[<span class="d">0</span>][<span class="d">1</span>]<span class="s"> - </span>m[<span class="d">0</span>][<span class="d">1</span>])<span class="s"> / </span>ms,
-</code><code id="L5221"><span class="ln">5221</span>                                    (to2.matrix.m[<span class="d">1</span>][<span class="d">1</span>]<span class="s"> - </span>m[<span class="d">1</span>][<span class="d">1</span>])<span class="s"> / </span>ms,
-</code><code id="L5222"><span class="ln">5222</span>                                    (to2.matrix.m[<span class="d">0</span>][<span class="d">2</span>]<span class="s"> - </span>m[<span class="d">0</span>][<span class="d">2</span>])<span class="s"> / </span>ms,
-</code><code id="L5223"><span class="ln">5223</span>                                    (to2.matrix.m[<span class="d">1</span>][<span class="d">2</span>]<span class="s"> - </span>m[<span class="d">1</span>][<span class="d">2</span>])<span class="s"> / </span>ms
-</code><code id="L5224"><span class="ln">5224</span>                                ];
-</code><code id="L5225"><span class="ln">5225</span>                                <span class="c">// from[attr]<span class="s"> = </span>[_.sx, _.sy, _.deg, _.dx, _.dy];</span>
-</code><code id="L5226"><span class="ln">5226</span>                                <span class="c">// <b>var</b> to2<span class="s"> = </span>{_:{}, getBBox: <b>function</b> () { <b>return</b> element.getBBox(); }};</span>
-</code><code id="L5227"><span class="ln">5227</span>                                <span class="c">// extractTransform(to2, to[attr]);</span>
-</code><code id="L5228"><span class="ln">5228</span>                                <span class="c">// diff[attr]<span class="s"> = </span>[</span>
-</code><code id="L5229"><span class="ln">5229</span>                                <span class="c">//     (to2._.sx<span class="s"> - </span>_.sx)<span class="s"> / </span>ms,</span>
-</code><code id="L5230"><span class="ln">5230</span>                                <span class="c">//     (to2._.sy<span class="s"> - </span>_.sy)<span class="s"> / </span>ms,</span>
-</code><code id="L5231"><span class="ln">5231</span>                                <span class="c">//     (to2._.deg<span class="s"> - </span>_.deg)<span class="s"> / </span>ms,</span>
-</code><code id="L5232"><span class="ln">5232</span>                                <span class="c">//     (to2._.dx<span class="s"> - </span>_.dx)<span class="s"> / </span>ms,</span>
-</code><code id="L5233"><span class="ln">5233</span>                                <span class="c">//     (to2._.dy<span class="s"> - </span>_.dy)<span class="s"> / </span>ms</span>
-</code><code id="L5234"><span class="ln">5234</span>                                <span class="c">// ];</span>
-</code><code id="L5235"><span class="ln">5235</span>                            }
-</code><code id="L5236"><span class="ln">5236</span>                            <b>break</b>;
-</code><code id="L5237"><span class="ln">5237</span>                        <b>case</b> <i>"csv"</i>:
-</code><code id="L5238"><span class="ln">5238</span>                            <b>var</b> values<span class="s"> = </span>Str(params[attr]).split(separator),
-</code><code id="L5239"><span class="ln">5239</span>                                from2<span class="s"> = </span>Str(from[attr]).split(separator);
-</code><code id="L5240"><span class="ln">5240</span>                            <b>if</b> (attr<span class="s"> == </span><i>"clip-rect"</i>) {
-</code><code id="L5241"><span class="ln">5241</span>                                from[attr]<span class="s"> = </span>from2;
-</code><code id="L5242"><span class="ln">5242</span>                                diff[attr]<span class="s"> = </span>[];
-</code><code id="L5243"><span class="ln">5243</span>                                i<span class="s"> = </span>from2.length;
-</code><code id="L5244"><span class="ln">5244</span>                                <b>while</b> (i--) {
-</code><code id="L5245"><span class="ln">5245</span>                                    diff[attr][i]<span class="s"> = </span>(values[i]<span class="s"> - </span>from[attr][i])<span class="s"> / </span>ms;
-</code><code id="L5246"><span class="ln">5246</span>                                }
-</code><code id="L5247"><span class="ln">5247</span>                            }
-</code><code id="L5248"><span class="ln">5248</span>                            to[attr]<span class="s"> = </span>values;
-</code><code id="L5249"><span class="ln">5249</span>                            <b>break</b>;
-</code><code id="L5250"><span class="ln">5250</span>                        <b>default</b>:
-</code><code id="L5251"><span class="ln">5251</span>                            values<span class="s"> = </span>[].concat(params[attr]);
-</code><code id="L5252"><span class="ln">5252</span>                            from2<span class="s"> = </span>[].concat(from[attr]);
-</code><code id="L5253"><span class="ln">5253</span>                            diff[attr]<span class="s"> = </span>[];
-</code><code id="L5254"><span class="ln">5254</span>                            i<span class="s"> = </span>element.paper.customAttributes[attr].length;
-</code><code id="L5255"><span class="ln">5255</span>                            <b>while</b> (i--) {
-</code><code id="L5256"><span class="ln">5256</span>                                diff[attr][i]<span class="s"> = </span>((values[i]<span class="s"> || </span><span class="d">0</span>)<span class="s"> - </span>(from2[i]<span class="s"> || </span><span class="d">0</span>))<span class="s"> / </span>ms;
-</code><code id="L5257"><span class="ln">5257</span>                            }
-</code><code id="L5258"><span class="ln">5258</span>                            <b>break</b>;
-</code><code id="L5259"><span class="ln">5259</span>                    }
-</code><code id="L5260"><span class="ln">5260</span>                }
-</code><code id="L5261"><span class="ln">5261</span>            }
-</code><code id="L5262"><span class="ln">5262</span>            <b>var</b> easing<span class="s"> = </span>params.easing,
-</code><code id="L5263"><span class="ln">5263</span>                easyeasy<span class="s"> = </span>R.easing_formulas[easing];
-</code><code id="L5264"><span class="ln">5264</span>            <b>if</b> (!easyeasy) {
-</code><code id="L5265"><span class="ln">5265</span>                easyeasy<span class="s"> = </span>Str(easing).match(bezierrg);
-</code><code id="L5266"><span class="ln">5266</span>                <b>if</b> (easyeasy<span class="s"> &amp;&amp; </span>easyeasy.length<span class="s"> == </span><span class="d">5</span>) {
-</code><code id="L5267"><span class="ln">5267</span>                    <b>var</b> curve<span class="s"> = </span>easyeasy;
-</code><code id="L5268"><span class="ln">5268</span>                    easyeasy<span class="s"> = </span><b>function</b> (t) {
-</code><code id="L5269"><span class="ln">5269</span>                        <b>return</b> CubicBezierAtTime(t, +curve[<span class="d">1</span>], +curve[<span class="d">2</span>], +curve[<span class="d">3</span>], +curve[<span class="d">4</span>], ms);
-</code><code id="L5270"><span class="ln">5270</span>                    };
-</code><code id="L5271"><span class="ln">5271</span>                } <b>else</b> {
-</code><code id="L5272"><span class="ln">5272</span>                    easyeasy<span class="s"> = </span>pipe;
-</code><code id="L5273"><span class="ln">5273</span>                }
-</code><code id="L5274"><span class="ln">5274</span>            }
-</code><code id="L5275"><span class="ln">5275</span>            timestamp<span class="s"> = </span>params.start<span class="s"> || </span>anim.start<span class="s"> || </span>+<b>new</b> Date;
-</code><code id="L5276"><span class="ln">5276</span>            e<span class="s"> = </span>{
-</code><code id="L5277"><span class="ln">5277</span>                anim: anim,
-</code><code id="L5278"><span class="ln">5278</span>                percent: percent,
-</code><code id="L5279"><span class="ln">5279</span>                timestamp: timestamp,
-</code><code id="L5280"><span class="ln">5280</span>                start: timestamp<span class="s"> + </span>(anim.del<span class="s"> || </span><span class="d">0</span>),
-</code><code id="L5281"><span class="ln">5281</span>                status: <span class="d">0</span>,
-</code><code id="L5282"><span class="ln">5282</span>                initstatus: status<span class="s"> || </span><span class="d">0</span>,
-</code><code id="L5283"><span class="ln">5283</span>                stop: <b>false</b>,
-</code><code id="L5284"><span class="ln">5284</span>                ms: ms,
-</code><code id="L5285"><span class="ln">5285</span>                easing: easyeasy,
-</code><code id="L5286"><span class="ln">5286</span>                from: from,
-</code><code id="L5287"><span class="ln">5287</span>                diff: diff,
-</code><code id="L5288"><span class="ln">5288</span>                to: to,
-</code><code id="L5289"><span class="ln">5289</span>                el: element,
-</code><code id="L5290"><span class="ln">5290</span>                callback: params.callback,
-</code><code id="L5291"><span class="ln">5291</span>                prev: prev,
-</code><code id="L5292"><span class="ln">5292</span>                next: next,
-</code><code id="L5293"><span class="ln">5293</span>                repeat: anim.times,
-</code><code id="L5294"><span class="ln">5294</span>                origin: element.attr(),
-</code><code id="L5295"><span class="ln">5295</span>                totalOrigin: totalOrigin
-</code><code id="L5296"><span class="ln">5296</span>            };
-</code><code id="L5297"><span class="ln">5297</span>            animationElements.push(e);
-</code><code id="L5298"><span class="ln">5298</span>            <b>if</b> (status<span class="s"> &amp;&amp; </span>!isInAnim) {
-</code><code id="L5299"><span class="ln">5299</span>                e.stop<span class="s"> = </span><b>true</b>;
-</code><code id="L5300"><span class="ln">5300</span>                e.start<span class="s"> = </span><b>new</b> Date<span class="s"> - </span>ms<span class="s"> * </span>status;
-</code><code id="L5301"><span class="ln">5301</span>                <b>if</b> (animationElements.length<span class="s"> == </span><span class="d">1</span>) {
-</code><code id="L5302"><span class="ln">5302</span>                    <b>return</b> animation();
-</code><code id="L5303"><span class="ln">5303</span>                }
-</code><code id="L5304"><span class="ln">5304</span>            }
-</code><code id="L5305"><span class="ln">5305</span>            animationElements.length<span class="s"> == </span><span class="d">1</span><span class="s"> &amp;&amp; </span>requestAnimFrame(animation);
-</code><code id="L5306"><span class="ln">5306</span>        } <b>else</b> {
-</code><code id="L5307"><span class="ln">5307</span>            isInAnim.initstatus<span class="s"> = </span>status;
-</code><code id="L5308"><span class="ln">5308</span>            isInAnim.start<span class="s"> = </span><b>new</b> Date<span class="s"> - </span>isInAnim.ms<span class="s"> * </span>status;
-</code><code id="L5309"><span class="ln">5309</span>        }
-</code><code id="L5310"><span class="ln">5310</span>        eve(<i>"anim.start."</i><span class="s"> + </span>element.id, element, anim);
-</code><code id="L5311"><span class="ln">5311</span>    }
-</code><code id="L5312"><span class="ln">5312</span><span class="c">    <span class="c">/*\</span>
-</span></code><code id="L5313"><span class="ln">5313</span><span class="c">    <span class="s"> * </span>Raphael.animation
-</span></code><code id="L5314"><span class="ln">5314</span><span class="c">     [ method ]
-</span></code><code id="L5315"><span class="ln">5315</span><span class="c">     **
-</span></code><code id="L5316"><span class="ln">5316</span><span class="c">    <span class="s"> * </span>Creates an animation object that can be passed to the @Element.animate or @Element.animateWith methods.
-</span></code><code id="L5317"><span class="ln">5317</span><span class="c">    <span class="s"> * </span>See also @Animation.delay and @Animation.repeat methods.
-</span></code><code id="L5318"><span class="ln">5318</span><span class="c">     **
-</span></code><code id="L5319"><span class="ln">5319</span><span class="c">     > Parameters
-</span></code><code id="L5320"><span class="ln">5320</span><span class="c">     **
-</span></code><code id="L5321"><span class="ln">5321</span><span class="c">    <span class="s"> - </span>params (object) <b>final</b> attributes <b>for</b> the element, see also @Element.attr
-</span></code><code id="L5322"><span class="ln">5322</span><span class="c">    <span class="s"> - </span>ms (number) number of milliseconds <b>for</b> animation to run
-</span></code><code id="L5323"><span class="ln">5323</span><span class="c">    <span class="s"> - </span>easing (string) #optional easing type. Accept one of @Raphael.easing_formulas or CSS format: `cubic&#x2010;bezier(XX,&#<span class="d">160</span>;XX,&#<span class="d">160</span>;XX,&#<span class="d">160</span>;XX)`
-</span></code><code id="L5324"><span class="ln">5324</span><span class="c">    <span class="s"> - </span>callback (<b>function</b>) #optional callback <b>function</b>. Will be called at the end of animation.
-</span></code><code id="L5325"><span class="ln">5325</span><span class="c">     **
-</span></code><code id="L5326"><span class="ln">5326</span><span class="c">    <span class="s"> = </span>(object) @Animation
-</span></code><code id="L5327"><span class="ln">5327</span><span class="c">    \*/</span>
-</code><code id="L5328"><span class="ln">5328</span>    R.animation<span class="s"> = </span><b>function</b> (params, ms, easing, callback) {
-</code><code id="L5329"><span class="ln">5329</span>        <b>if</b> (R.is(easing, <i>"<b>function</b>"</i>)<span class="s"> || </span>!easing) {
-</code><code id="L5330"><span class="ln">5330</span>            callback<span class="s"> = </span>callback<span class="s"> || </span>easing<span class="s"> || </span><b>null</b>;
-</code><code id="L5331"><span class="ln">5331</span>            easing<span class="s"> = </span><b>null</b>;
-</code><code id="L5332"><span class="ln">5332</span>        }
-</code><code id="L5333"><span class="ln">5333</span>        params<span class="s"> = </span>Object(params);
-</code><code id="L5334"><span class="ln">5334</span>        ms<span class="s"> = </span>+ms<span class="s"> || </span><span class="d">0</span>;
-</code><code id="L5335"><span class="ln">5335</span>        <b>var</b> p<span class="s"> = </span>{},
-</code><code id="L5336"><span class="ln">5336</span>            json,
-</code><code id="L5337"><span class="ln">5337</span>            attr;
-</code><code id="L5338"><span class="ln">5338</span>        <b>for</b> (attr <b>in</b> params) <b>if</b> (params[has](attr)<span class="s"> &amp;&amp; </span>toFloat(attr) != attr) {
-</code><code id="L5339"><span class="ln">5339</span>            json<span class="s"> = </span><b>true</b>;
-</code><code id="L5340"><span class="ln">5340</span>            p[attr]<span class="s"> = </span>params[attr];
-</code><code id="L5341"><span class="ln">5341</span>        }
-</code><code id="L5342"><span class="ln">5342</span>        <b>if</b> (!json) {
-</code><code id="L5343"><span class="ln">5343</span>            <b>return</b> <b>new</b> Animation(params, ms);
-</code><code id="L5344"><span class="ln">5344</span>        } <b>else</b> {
-</code><code id="L5345"><span class="ln">5345</span>            easing<span class="s"> &amp;&amp; </span>(p.easing<span class="s"> = </span>easing);
-</code><code id="L5346"><span class="ln">5346</span>            callback<span class="s"> &amp;&amp; </span>(p.callback<span class="s"> = </span>callback);
-</code><code id="L5347"><span class="ln">5347</span>            <b>return</b> <b>new</b> Animation({<span class="d">100</span>: p}, ms);
-</code><code id="L5348"><span class="ln">5348</span>        }
-</code><code id="L5349"><span class="ln">5349</span>    };
-</code><code id="L5350"><span class="ln">5350</span><span class="c">    <span class="c">/*\</span>
-</span></code><code id="L5351"><span class="ln">5351</span><span class="c">    <span class="s"> * </span>Element.animate
-</span></code><code id="L5352"><span class="ln">5352</span><span class="c">     [ method ]
-</span></code><code id="L5353"><span class="ln">5353</span><span class="c">     **
-</span></code><code id="L5354"><span class="ln">5354</span><span class="c">    <span class="s"> * </span>Creates and starts animation <b>for</b> given element.
-</span></code><code id="L5355"><span class="ln">5355</span><span class="c">     **
-</span></code><code id="L5356"><span class="ln">5356</span><span class="c">     > Parameters
-</span></code><code id="L5357"><span class="ln">5357</span><span class="c">     **
-</span></code><code id="L5358"><span class="ln">5358</span><span class="c">    <span class="s"> - </span>params (object) <b>final</b> attributes <b>for</b> the element, see also @Element.attr
-</span></code><code id="L5359"><span class="ln">5359</span><span class="c">    <span class="s"> - </span>ms (number) number of milliseconds <b>for</b> animation to run
-</span></code><code id="L5360"><span class="ln">5360</span><span class="c">    <span class="s"> - </span>easing (string) #optional easing type. Accept one of @Raphael.easing_formulas or CSS format: `cubic&#x2010;bezier(XX,&#<span class="d">160</span>;XX,&#<span class="d">160</span>;XX,&#<span class="d">160</span>;XX)`
-</span></code><code id="L5361"><span class="ln">5361</span><span class="c">    <span class="s"> - </span>callback (<b>function</b>) #optional callback <b>function</b>. Will be called at the end of animation.
-</span></code><code id="L5362"><span class="ln">5362</span><span class="c">    <span class="s"> * </span>or
-</span></code><code id="L5363"><span class="ln">5363</span><span class="c">    <span class="s"> - </span>animation (object) animation object, see @Raphael.animation
-</span></code><code id="L5364"><span class="ln">5364</span><span class="c">     **
-</span></code><code id="L5365"><span class="ln">5365</span><span class="c">    <span class="s"> = </span>(object) original element
-</span></code><code id="L5366"><span class="ln">5366</span><span class="c">    \*/</span>
-</code><code id="L5367"><span class="ln">5367</span>    elproto.animate<span class="s"> = </span><b>function</b> (params, ms, easing, callback) {
-</code><code id="L5368"><span class="ln">5368</span>        <b>var</b> element<span class="s"> = </span><b>this</b>;
-</code><code id="L5369"><span class="ln">5369</span>        <b>if</b> (element.removed) {
-</code><code id="L5370"><span class="ln">5370</span>            callback<span class="s"> &amp;&amp; </span>callback.call(element);
-</code><code id="L5371"><span class="ln">5371</span>            <b>return</b> element;
-</code><code id="L5372"><span class="ln">5372</span>        }
-</code><code id="L5373"><span class="ln">5373</span>        <b>var</b> anim<span class="s"> = </span>params <b>instanceof</b> Animation ? params : R.animation(params, ms, easing, callback);
-</code><code id="L5374"><span class="ln">5374</span>        runAnimation(anim, element, anim.percents[<span class="d">0</span>], <b>null</b>, element.attr());
-</code><code id="L5375"><span class="ln">5375</span>        <b>return</b> element;
-</code><code id="L5376"><span class="ln">5376</span>    };
-</code><code id="L5377"><span class="ln">5377</span><span class="c">    <span class="c">/*\</span>
-</span></code><code id="L5378"><span class="ln">5378</span><span class="c">    <span class="s"> * </span>Element.setTime
-</span></code><code id="L5379"><span class="ln">5379</span><span class="c">     [ method ]
-</span></code><code id="L5380"><span class="ln">5380</span><span class="c">     **
-</span></code><code id="L5381"><span class="ln">5381</span><span class="c">    <span class="s"> * </span>Sets the status of animation of the element <b>in</b> milliseconds. Similar to @Element.status method.
-</span></code><code id="L5382"><span class="ln">5382</span><span class="c">     **
-</span></code><code id="L5383"><span class="ln">5383</span><span class="c">     > Parameters
-</span></code><code id="L5384"><span class="ln">5384</span><span class="c">     **
-</span></code><code id="L5385"><span class="ln">5385</span><span class="c">    <span class="s"> - </span>anim (object) animation object
-</span></code><code id="L5386"><span class="ln">5386</span><span class="c">    <span class="s"> - </span>value (number) number of milliseconds from the beginning of the animation
-</span></code><code id="L5387"><span class="ln">5387</span><span class="c">     **
-</span></code><code id="L5388"><span class="ln">5388</span><span class="c">    <span class="s"> = </span>(object) original element <b>if</b> `value` is specified
-</span></code><code id="L5389"><span class="ln">5389</span><span class="c">    <span class="s"> * </span>Note, that during animation following events are triggered:
-</span></code><code id="L5390"><span class="ln">5390</span><span class="c">     *
-</span></code><code id="L5391"><span class="ln">5391</span><span class="c">    <span class="s"> * </span>On each animation frame event `anim.frame.&lt;id>`, on start `anim.start.&lt;id>` and on end `anim.finish.&lt;id>`.
-</span></code><code id="L5392"><span class="ln">5392</span><span class="c">    \*/</span>
-</code><code id="L5393"><span class="ln">5393</span>    elproto.setTime<span class="s"> = </span><b>function</b> (anim, value) {
-</code><code id="L5394"><span class="ln">5394</span>        <b>if</b> (anim<span class="s"> &amp;&amp; </span>value != <b>null</b>) {
-</code><code id="L5395"><span class="ln">5395</span>            <b>this</b>.status(anim, mmin(value, anim.ms)<span class="s"> / </span>anim.ms);
-</code><code id="L5396"><span class="ln">5396</span>        }
-</code><code id="L5397"><span class="ln">5397</span>        <b>return</b> <b>this</b>;
-</code><code id="L5398"><span class="ln">5398</span>    };
-</code><code id="L5399"><span class="ln">5399</span><span class="c">    <span class="c">/*\</span>
-</span></code><code id="L5400"><span class="ln">5400</span><span class="c">    <span class="s"> * </span>Element.status
-</span></code><code id="L5401"><span class="ln">5401</span><span class="c">     [ method ]
-</span></code><code id="L5402"><span class="ln">5402</span><span class="c">     **
-</span></code><code id="L5403"><span class="ln">5403</span><span class="c">    <span class="s"> * </span>Gets or sets the status of animation of the element.
-</span></code><code id="L5404"><span class="ln">5404</span><span class="c">     **
-</span></code><code id="L5405"><span class="ln">5405</span><span class="c">     > Parameters
-</span></code><code id="L5406"><span class="ln">5406</span><span class="c">     **
-</span></code><code id="L5407"><span class="ln">5407</span><span class="c">    <span class="s"> - </span>anim (object) #optional animation object
-</span></code><code id="L5408"><span class="ln">5408</span><span class="c">    <span class="s"> - </span>value (number) #optional <span class="d">0</span> – <span class="d">1</span>. If specified, method works like a setter and sets the status of a given animation to the value. This will cause animation to jump to the given position.
+</code><code id="L5064"><span class="ln">5064</span>    <b>function</b> CubicBezierAtTime(t, p1x, p1y, p2x, p2y, duration) {
+</code><code id="L5065"><span class="ln">5065</span>        <b>var</b> cx<span class="s"> = </span><span class="d">3</span><span class="s"> * </span>p1x,
+</code><code id="L5066"><span class="ln">5066</span>            bx<span class="s"> = </span><span class="d">3</span><span class="s"> * </span>(p2x<span class="s"> - </span>p1x)<span class="s"> - </span>cx,
+</code><code id="L5067"><span class="ln">5067</span>            ax<span class="s"> = </span><span class="d">1</span><span class="s"> - </span>cx<span class="s"> - </span>bx,
+</code><code id="L5068"><span class="ln">5068</span>            cy<span class="s"> = </span><span class="d">3</span><span class="s"> * </span>p1y,
+</code><code id="L5069"><span class="ln">5069</span>            by<span class="s"> = </span><span class="d">3</span><span class="s"> * </span>(p2y<span class="s"> - </span>p1y)<span class="s"> - </span>cy,
+</code><code id="L5070"><span class="ln">5070</span>            ay<span class="s"> = </span><span class="d">1</span><span class="s"> - </span>cy<span class="s"> - </span>by;
+</code><code id="L5071"><span class="ln">5071</span>        <b>function</b> sampleCurveX(t) {
+</code><code id="L5072"><span class="ln">5072</span>            <b>return</b> ((ax<span class="s"> * </span>t<span class="s"> + </span>bx)<span class="s"> * </span>t<span class="s"> + </span>cx)<span class="s"> * </span>t;
+</code><code id="L5073"><span class="ln">5073</span>        }
+</code><code id="L5074"><span class="ln">5074</span>        <b>function</b> solve(x, epsilon) {
+</code><code id="L5075"><span class="ln">5075</span>            <b>var</b> t<span class="s"> = </span>solveCurveX(x, epsilon);
+</code><code id="L5076"><span class="ln">5076</span>            <b>return</b> ((ay<span class="s"> * </span>t<span class="s"> + </span>by)<span class="s"> * </span>t<span class="s"> + </span>cy)<span class="s"> * </span>t;
+</code><code id="L5077"><span class="ln">5077</span>        }
+</code><code id="L5078"><span class="ln">5078</span>        <b>function</b> solveCurveX(x, epsilon) {
+</code><code id="L5079"><span class="ln">5079</span>            <b>var</b> t0, t1, t2, x2, d2, i;
+</code><code id="L5080"><span class="ln">5080</span>            <b>for</b>(t2<span class="s"> = </span>x, i<span class="s"> = </span><span class="d">0</span>; i &lt; <span class="d">8</span>; i++) {
+</code><code id="L5081"><span class="ln">5081</span>                x2<span class="s"> = </span>sampleCurveX(t2)<span class="s"> - </span>x;
+</code><code id="L5082"><span class="ln">5082</span>                <b>if</b> (abs(x2) &lt; epsilon) {
+</code><code id="L5083"><span class="ln">5083</span>                    <b>return</b> t2;
+</code><code id="L5084"><span class="ln">5084</span>                }
+</code><code id="L5085"><span class="ln">5085</span>                d2<span class="s"> = </span>(<span class="d">3</span><span class="s"> * </span>ax<span class="s"> * </span>t2<span class="s"> + </span><span class="d">2</span><span class="s"> * </span>bx)<span class="s"> * </span>t2<span class="s"> + </span>cx;
+</code><code id="L5086"><span class="ln">5086</span>                <b>if</b> (abs(d2) &lt; <span class="d">1e-6</span>) {
+</code><code id="L5087"><span class="ln">5087</span>                    <b>break</b>;
+</code><code id="L5088"><span class="ln">5088</span>                }
+</code><code id="L5089"><span class="ln">5089</span>                t2<span class="s"> = </span>t2<span class="s"> - </span>x2<span class="s"> / </span>d2;
+</code><code id="L5090"><span class="ln">5090</span>            }
+</code><code id="L5091"><span class="ln">5091</span>            t0<span class="s"> = </span><span class="d">0</span>;
+</code><code id="L5092"><span class="ln">5092</span>            t1<span class="s"> = </span><span class="d">1</span>;
+</code><code id="L5093"><span class="ln">5093</span>            t2<span class="s"> = </span>x;
+</code><code id="L5094"><span class="ln">5094</span>            <b>if</b> (t2 &lt; t0) {
+</code><code id="L5095"><span class="ln">5095</span>                <b>return</b> t0;
+</code><code id="L5096"><span class="ln">5096</span>            }
+</code><code id="L5097"><span class="ln">5097</span>            <b>if</b> (t2 > t1) {
+</code><code id="L5098"><span class="ln">5098</span>                <b>return</b> t1;
+</code><code id="L5099"><span class="ln">5099</span>            }
+</code><code id="L5100"><span class="ln">5100</span>            <b>while</b> (t0 &lt; t1) {
+</code><code id="L5101"><span class="ln">5101</span>                x2<span class="s"> = </span>sampleCurveX(t2);
+</code><code id="L5102"><span class="ln">5102</span>                <b>if</b> (abs(x2<span class="s"> - </span>x) &lt; epsilon) {
+</code><code id="L5103"><span class="ln">5103</span>                    <b>return</b> t2;
+</code><code id="L5104"><span class="ln">5104</span>                }
+</code><code id="L5105"><span class="ln">5105</span>                <b>if</b> (x > x2) {
+</code><code id="L5106"><span class="ln">5106</span>                    t0<span class="s"> = </span>t2;
+</code><code id="L5107"><span class="ln">5107</span>                } <b>else</b> {
+</code><code id="L5108"><span class="ln">5108</span>                    t1<span class="s"> = </span>t2;
+</code><code id="L5109"><span class="ln">5109</span>                }
+</code><code id="L5110"><span class="ln">5110</span>                t2<span class="s"> = </span>(t1<span class="s"> - </span>t0)<span class="s"> / </span><span class="d">2</span><span class="s"> + </span>t0;
+</code><code id="L5111"><span class="ln">5111</span>            }
+</code><code id="L5112"><span class="ln">5112</span>            <b>return</b> t2;
+</code><code id="L5113"><span class="ln">5113</span>        }
+</code><code id="L5114"><span class="ln">5114</span>        <b>return</b> solve(t, <span class="d">1</span><span class="s"> / </span>(<span class="d">200</span><span class="s"> * </span>duration));
+</code><code id="L5115"><span class="ln">5115</span>    }
+</code><code id="L5116"><span class="ln">5116</span>    elproto.onAnimation<span class="s"> = </span><b>function</b> (f) {
+</code><code id="L5117"><span class="ln">5117</span>        f ? eve.on(<i>"anim.frame."</i><span class="s"> + </span><b>this</b>.id, f) : eve.unbind(<i>"anim.frame."</i><span class="s"> + </span><b>this</b>.id);
+</code><code id="L5118"><span class="ln">5118</span>        <b>return</b> <b>this</b>;
+</code><code id="L5119"><span class="ln">5119</span>    };
+</code><code id="L5120"><span class="ln">5120</span>    <b>function</b> Animation(anim, ms) {
+</code><code id="L5121"><span class="ln">5121</span>        <b>var</b> percents<span class="s"> = </span>[];
+</code><code id="L5122"><span class="ln">5122</span>        <b>this</b>.anim<span class="s"> = </span>anim;
+</code><code id="L5123"><span class="ln">5123</span>        <b>this</b>.ms<span class="s"> = </span>ms;
+</code><code id="L5124"><span class="ln">5124</span>        <b>this</b>.times<span class="s"> = </span><span class="d">1</span>;
+</code><code id="L5125"><span class="ln">5125</span>        <b>if</b> (<b>this</b>.anim) {
+</code><code id="L5126"><span class="ln">5126</span>            <b>for</b> (<b>var</b> attr <b>in</b> <b>this</b>.anim) <b>if</b> (<b>this</b>.anim[has](attr)) {
+</code><code id="L5127"><span class="ln">5127</span>                percents.push(+attr);
+</code><code id="L5128"><span class="ln">5128</span>            }
+</code><code id="L5129"><span class="ln">5129</span>            percents.sort(sortByNumber);
+</code><code id="L5130"><span class="ln">5130</span>        }
+</code><code id="L5131"><span class="ln">5131</span>        <b>this</b>.top<span class="s"> = </span>percents[percents.length<span class="s"> - </span><span class="d">1</span>];
+</code><code id="L5132"><span class="ln">5132</span>        <b>this</b>.percents<span class="s"> = </span>percents;
+</code><code id="L5133"><span class="ln">5133</span>    }
+</code><code id="L5134"><span class="ln">5134</span><span class="c">    <span class="c">/*\</span>
+</span></code><code id="L5135"><span class="ln">5135</span><span class="c">    <span class="s"> * </span>Animation.delay
+</span></code><code id="L5136"><span class="ln">5136</span><span class="c">     [ method ]
+</span></code><code id="L5137"><span class="ln">5137</span><span class="c">     **
+</span></code><code id="L5138"><span class="ln">5138</span><span class="c">    <span class="s"> * </span>Creates a copy of existing animation object <b>with</b> given delay.
+</span></code><code id="L5139"><span class="ln">5139</span><span class="c">     **
+</span></code><code id="L5140"><span class="ln">5140</span><span class="c">     > Parameters
+</span></code><code id="L5141"><span class="ln">5141</span><span class="c">     **
+</span></code><code id="L5142"><span class="ln">5142</span><span class="c">    <span class="s"> - </span>delay (number) number of ms to pass between animation start and actual animation
+</span></code><code id="L5143"><span class="ln">5143</span><span class="c">     **
+</span></code><code id="L5144"><span class="ln">5144</span><span class="c">    <span class="s"> = </span>(object) <b>new</b> altered Animation object
+</span></code><code id="L5145"><span class="ln">5145</span><span class="c">    \*/</span>
+</code><code id="L5146"><span class="ln">5146</span>    Animation.prototype.delay<span class="s"> = </span><b>function</b> (delay) {
+</code><code id="L5147"><span class="ln">5147</span>        <b>var</b> a<span class="s"> = </span><b>new</b> Animation(<b>this</b>.anim, <b>this</b>.ms);
+</code><code id="L5148"><span class="ln">5148</span>        a.times<span class="s"> = </span><b>this</b>.times;
+</code><code id="L5149"><span class="ln">5149</span>        a.del<span class="s"> = </span>+delay<span class="s"> || </span><span class="d">0</span>;
+</code><code id="L5150"><span class="ln">5150</span>        <b>return</b> a;
+</code><code id="L5151"><span class="ln">5151</span>    };
+</code><code id="L5152"><span class="ln">5152</span><span class="c">    <span class="c">/*\</span>
+</span></code><code id="L5153"><span class="ln">5153</span><span class="c">    <span class="s"> * </span>Animation.repeat
+</span></code><code id="L5154"><span class="ln">5154</span><span class="c">     [ method ]
+</span></code><code id="L5155"><span class="ln">5155</span><span class="c">     **
+</span></code><code id="L5156"><span class="ln">5156</span><span class="c">    <span class="s"> * </span>Creates a copy of existing animation object <b>with</b> given repetition.
+</span></code><code id="L5157"><span class="ln">5157</span><span class="c">     **
+</span></code><code id="L5158"><span class="ln">5158</span><span class="c">     > Parameters
+</span></code><code id="L5159"><span class="ln">5159</span><span class="c">     **
+</span></code><code id="L5160"><span class="ln">5160</span><span class="c">    <span class="s"> - </span>repeat (number) number iterations of animation. For infinite animation pass `Infinity`
+</span></code><code id="L5161"><span class="ln">5161</span><span class="c">     **
+</span></code><code id="L5162"><span class="ln">5162</span><span class="c">    <span class="s"> = </span>(object) <b>new</b> altered Animation object
+</span></code><code id="L5163"><span class="ln">5163</span><span class="c">    \*/</span>
+</code><code id="L5164"><span class="ln">5164</span>    Animation.prototype.repeat<span class="s"> = </span><b>function</b> (times) { 
+</code><code id="L5165"><span class="ln">5165</span>        <b>var</b> a<span class="s"> = </span><b>new</b> Animation(<b>this</b>.anim, <b>this</b>.ms);
+</code><code id="L5166"><span class="ln">5166</span>        a.del<span class="s"> = </span><b>this</b>.del;
+</code><code id="L5167"><span class="ln">5167</span>        a.times<span class="s"> = </span>math.floor(mmax(times, <span class="d">0</span>))<span class="s"> || </span><span class="d">1</span>;
+</code><code id="L5168"><span class="ln">5168</span>        <b>return</b> a;
+</code><code id="L5169"><span class="ln">5169</span>    };
+</code><code id="L5170"><span class="ln">5170</span>    <b>function</b> runAnimation(anim, element, percent, status, totalOrigin) {
+</code><code id="L5171"><span class="ln">5171</span>        percent<span class="s"> = </span>toFloat(percent);
+</code><code id="L5172"><span class="ln">5172</span>        <b>var</b> params,
+</code><code id="L5173"><span class="ln">5173</span>            isInAnim,
+</code><code id="L5174"><span class="ln">5174</span>            isInAnimSet,
+</code><code id="L5175"><span class="ln">5175</span>            percents<span class="s"> = </span>[],
+</code><code id="L5176"><span class="ln">5176</span>            next,
+</code><code id="L5177"><span class="ln">5177</span>            prev,
+</code><code id="L5178"><span class="ln">5178</span>            timestamp,
+</code><code id="L5179"><span class="ln">5179</span>            ms<span class="s"> = </span>anim.ms,
+</code><code id="L5180"><span class="ln">5180</span>            from<span class="s"> = </span>{},
+</code><code id="L5181"><span class="ln">5181</span>            to<span class="s"> = </span>{},
+</code><code id="L5182"><span class="ln">5182</span>            diff<span class="s"> = </span>{};
+</code><code id="L5183"><span class="ln">5183</span>        <b>if</b> (status) {
+</code><code id="L5184"><span class="ln">5184</span>            <b>for</b> (i<span class="s"> = </span><span class="d">0</span>, ii<span class="s"> = </span>animationElements.length; i &lt; ii; i++) {
+</code><code id="L5185"><span class="ln">5185</span>                <b>var</b> e<span class="s"> = </span>animationElements[i];
+</code><code id="L5186"><span class="ln">5186</span>                <b>if</b> (e.el.id<span class="s"> == </span>element.id<span class="s"> &amp;&amp; </span>e.anim<span class="s"> == </span>anim) {
+</code><code id="L5187"><span class="ln">5187</span>                    <b>if</b> (e.percent != percent) {
+</code><code id="L5188"><span class="ln">5188</span>                        animationElements.splice(i, <span class="d">1</span>);
+</code><code id="L5189"><span class="ln">5189</span>                        isInAnimSet<span class="s"> = </span><span class="d">1</span>;
+</code><code id="L5190"><span class="ln">5190</span>                    } <b>else</b> {
+</code><code id="L5191"><span class="ln">5191</span>                        isInAnim<span class="s"> = </span>e;
+</code><code id="L5192"><span class="ln">5192</span>                    }
+</code><code id="L5193"><span class="ln">5193</span>                    element.attr(e.totalOrigin);
+</code><code id="L5194"><span class="ln">5194</span>                    <b>break</b>;
+</code><code id="L5195"><span class="ln">5195</span>                }
+</code><code id="L5196"><span class="ln">5196</span>            }
+</code><code id="L5197"><span class="ln">5197</span>        } <b>else</b> {
+</code><code id="L5198"><span class="ln">5198</span>            status<span class="s"> = </span>+to; <span class="c">// NaN</span>
+</code><code id="L5199"><span class="ln">5199</span>        }
+</code><code id="L5200"><span class="ln">5200</span>        <b>for</b> (<b>var</b> i<span class="s"> = </span><span class="d">0</span>, ii<span class="s"> = </span>anim.percents.length; i &lt; ii; i++) {
+</code><code id="L5201"><span class="ln">5201</span>            <b>if</b> (anim.percents[i]<span class="s"> == </span>percent<span class="s"> || </span>anim.percents[i] > status<span class="s"> * </span>anim.top) {
+</code><code id="L5202"><span class="ln">5202</span>                percent<span class="s"> = </span>anim.percents[i];
+</code><code id="L5203"><span class="ln">5203</span>                prev<span class="s"> = </span>anim.percents[i<span class="s"> - </span><span class="d">1</span>]<span class="s"> || </span><span class="d">0</span>;
+</code><code id="L5204"><span class="ln">5204</span>                ms<span class="s"> = </span>ms<span class="s"> / </span>anim.top<span class="s"> * </span>(percent<span class="s"> - </span>prev);
+</code><code id="L5205"><span class="ln">5205</span>                next<span class="s"> = </span>anim.percents[i<span class="s"> + </span><span class="d">1</span>];
+</code><code id="L5206"><span class="ln">5206</span>                params<span class="s"> = </span>anim.anim[percent];
+</code><code id="L5207"><span class="ln">5207</span>                <b>break</b>;
+</code><code id="L5208"><span class="ln">5208</span>            } <b>else</b> <b>if</b> (status) {
+</code><code id="L5209"><span class="ln">5209</span>                element.attr(anim.anim[anim.percents[i]]);
+</code><code id="L5210"><span class="ln">5210</span>            }
+</code><code id="L5211"><span class="ln">5211</span>        }
+</code><code id="L5212"><span class="ln">5212</span>        <b>if</b> (!params) {
+</code><code id="L5213"><span class="ln">5213</span>            <b>return</b>;
+</code><code id="L5214"><span class="ln">5214</span>        }
+</code><code id="L5215"><span class="ln">5215</span>        <b>if</b> (!isInAnim) {
+</code><code id="L5216"><span class="ln">5216</span>            <b>for</b> (attr <b>in</b> params) <b>if</b> (params[has](attr)) {
+</code><code id="L5217"><span class="ln">5217</span>                <b>if</b> (availableAnimAttrs[has](attr)<span class="s"> || </span>element.paper.customAttributes[has](attr)) {
+</code><code id="L5218"><span class="ln">5218</span>                    from[attr]<span class="s"> = </span>element.attr(attr);
+</code><code id="L5219"><span class="ln">5219</span>                    (from[attr]<span class="s"> == </span><b>null</b>)<span class="s"> &amp;&amp; </span>(from[attr]<span class="s"> = </span>availableAttrs[attr]);
+</code><code id="L5220"><span class="ln">5220</span>                    to[attr]<span class="s"> = </span>params[attr];
+</code><code id="L5221"><span class="ln">5221</span>                    <b>switch</b> (availableAnimAttrs[attr]) {
+</code><code id="L5222"><span class="ln">5222</span>                        <b>case</b> nu:
+</code><code id="L5223"><span class="ln">5223</span>                            diff[attr]<span class="s"> = </span>(to[attr]<span class="s"> - </span>from[attr])<span class="s"> / </span>ms;
+</code><code id="L5224"><span class="ln">5224</span>                            <b>break</b>;
+</code><code id="L5225"><span class="ln">5225</span>                        <b>case</b> <i>"colour"</i>:
+</code><code id="L5226"><span class="ln">5226</span>                            from[attr]<span class="s"> = </span>R.getRGB(from[attr]);
+</code><code id="L5227"><span class="ln">5227</span>                            <b>var</b> toColour<span class="s"> = </span>R.getRGB(to[attr]);
+</code><code id="L5228"><span class="ln">5228</span>                            diff[attr]<span class="s"> = </span>{
+</code><code id="L5229"><span class="ln">5229</span>                                r: (toColour.r<span class="s"> - </span>from[attr].r)<span class="s"> / </span>ms,
+</code><code id="L5230"><span class="ln">5230</span>                                g: (toColour.g<span class="s"> - </span>from[attr].g)<span class="s"> / </span>ms,
+</code><code id="L5231"><span class="ln">5231</span>                                b: (toColour.b<span class="s"> - </span>from[attr].b)<span class="s"> / </span>ms
+</code><code id="L5232"><span class="ln">5232</span>                            };
+</code><code id="L5233"><span class="ln">5233</span>                            <b>break</b>;
+</code><code id="L5234"><span class="ln">5234</span>                        <b>case</b> <i>"path"</i>:
+</code><code id="L5235"><span class="ln">5235</span>                            <b>var</b> pathes<span class="s"> = </span>path2curve(from[attr], to[attr]),
+</code><code id="L5236"><span class="ln">5236</span>                                toPath<span class="s"> = </span>pathes[<span class="d">1</span>];
+</code><code id="L5237"><span class="ln">5237</span>                            from[attr]<span class="s"> = </span>pathes[<span class="d">0</span>];
+</code><code id="L5238"><span class="ln">5238</span>                            diff[attr]<span class="s"> = </span>[];
+</code><code id="L5239"><span class="ln">5239</span>                            <b>for</b> (i<span class="s"> = </span><span class="d">0</span>, ii<span class="s"> = </span>from[attr].length; i &lt; ii; i++) {
+</code><code id="L5240"><span class="ln">5240</span>                                diff[attr][i]<span class="s"> = </span>[<span class="d">0</span>];
+</code><code id="L5241"><span class="ln">5241</span>                                <b>for</b> (<b>var</b> j<span class="s"> = </span><span class="d">1</span>, jj<span class="s"> = </span>from[attr][i].length; j &lt; jj; j++) {
+</code><code id="L5242"><span class="ln">5242</span>                                    diff[attr][i][j]<span class="s"> = </span>(toPath[i][j]<span class="s"> - </span>from[attr][i][j])<span class="s"> / </span>ms;
+</code><code id="L5243"><span class="ln">5243</span>                                }
+</code><code id="L5244"><span class="ln">5244</span>                            }
+</code><code id="L5245"><span class="ln">5245</span>                            <b>break</b>;
+</code><code id="L5246"><span class="ln">5246</span>                        <b>case</b> <i>"transform"</i>:
+</code><code id="L5247"><span class="ln">5247</span>                            <b>var</b> _<span class="s"> = </span>element._,
+</code><code id="L5248"><span class="ln">5248</span>                                eq<span class="s"> = </span>equaliseTransform(_[attr], to[attr]);
+</code><code id="L5249"><span class="ln">5249</span>                            <b>if</b> (eq) {
+</code><code id="L5250"><span class="ln">5250</span>                                from[attr]<span class="s"> = </span>eq.from;
+</code><code id="L5251"><span class="ln">5251</span>                                to[attr]<span class="s"> = </span>eq.to;
+</code><code id="L5252"><span class="ln">5252</span>                                diff[attr]<span class="s"> = </span>[];
+</code><code id="L5253"><span class="ln">5253</span>                                diff[attr].real<span class="s"> = </span><b>true</b>;
+</code><code id="L5254"><span class="ln">5254</span>                                <b>for</b> (i<span class="s"> = </span><span class="d">0</span>, ii<span class="s"> = </span>from[attr].length; i &lt; ii; i++) {
+</code><code id="L5255"><span class="ln">5255</span>                                    diff[attr][i]<span class="s"> = </span>[from[attr][i][<span class="d">0</span>]];
+</code><code id="L5256"><span class="ln">5256</span>                                    <b>for</b> (j<span class="s"> = </span><span class="d">1</span>, jj<span class="s"> = </span>from[attr][i].length; j &lt; jj; j++) {
+</code><code id="L5257"><span class="ln">5257</span>                                        diff[attr][i][j]<span class="s"> = </span>(to[attr][i][j]<span class="s"> - </span>from[attr][i][j])<span class="s"> / </span>ms;
+</code><code id="L5258"><span class="ln">5258</span>                                    }
+</code><code id="L5259"><span class="ln">5259</span>                                }
+</code><code id="L5260"><span class="ln">5260</span>                            } <b>else</b> {
+</code><code id="L5261"><span class="ln">5261</span>                                <b>var</b> m<span class="s"> = </span>(element.matrix<span class="s"> || </span><b>new</b> Matrix).m,
+</code><code id="L5262"><span class="ln">5262</span>                                    to2<span class="s"> = </span>{_:{transform: _.transform}, getBBox: <b>function</b> () { <b>return</b> element.getBBox(); }};
+</code><code id="L5263"><span class="ln">5263</span>                                from[attr]<span class="s"> = </span>[
+</code><code id="L5264"><span class="ln">5264</span>                                    m[<span class="d">0</span>][<span class="d">0</span>],
+</code><code id="L5265"><span class="ln">5265</span>                                    m[<span class="d">1</span>][<span class="d">0</span>],
+</code><code id="L5266"><span class="ln">5266</span>                                    m[<span class="d">0</span>][<span class="d">1</span>],
+</code><code id="L5267"><span class="ln">5267</span>                                    m[<span class="d">1</span>][<span class="d">1</span>],
+</code><code id="L5268"><span class="ln">5268</span>                                    m[<span class="d">0</span>][<span class="d">2</span>],
+</code><code id="L5269"><span class="ln">5269</span>                                    m[<span class="d">1</span>][<span class="d">2</span>]
+</code><code id="L5270"><span class="ln">5270</span>                                ];
+</code><code id="L5271"><span class="ln">5271</span>                                extractTransform(to2, to[attr]);
+</code><code id="L5272"><span class="ln">5272</span>                                to[attr]<span class="s"> = </span>to2._.transform;
+</code><code id="L5273"><span class="ln">5273</span>                                diff[attr]<span class="s"> = </span>[
+</code><code id="L5274"><span class="ln">5274</span>                                    (to2.matrix.m[<span class="d">0</span>][<span class="d">0</span>]<span class="s"> - </span>m[<span class="d">0</span>][<span class="d">0</span>])<span class="s"> / </span>ms,
+</code><code id="L5275"><span class="ln">5275</span>                                    (to2.matrix.m[<span class="d">1</span>][<span class="d">0</span>]<span class="s"> - </span>m[<span class="d">1</span>][<span class="d">0</span>])<span class="s"> / </span>ms,
+</code><code id="L5276"><span class="ln">5276</span>                                    (to2.matrix.m[<span class="d">0</span>][<span class="d">1</span>]<span class="s"> - </span>m[<span class="d">0</span>][<span class="d">1</span>])<span class="s"> / </span>ms,
+</code><code id="L5277"><span class="ln">5277</span>                                    (to2.matrix.m[<span class="d">1</span>][<span class="d">1</span>]<span class="s"> - </span>m[<span class="d">1</span>][<span class="d">1</span>])<span class="s"> / </span>ms,
+</code><code id="L5278"><span class="ln">5278</span>                                    (to2.matrix.m[<span class="d">0</span>][<span class="d">2</span>]<span class="s"> - </span>m[<span class="d">0</span>][<span class="d">2</span>])<span class="s"> / </span>ms,
+</code><code id="L5279"><span class="ln">5279</span>                                    (to2.matrix.m[<span class="d">1</span>][<span class="d">2</span>]<span class="s"> - </span>m[<span class="d">1</span>][<span class="d">2</span>])<span class="s"> / </span>ms
+</code><code id="L5280"><span class="ln">5280</span>                                ];
+</code><code id="L5281"><span class="ln">5281</span>                                <span class="c">// from[attr]<span class="s"> = </span>[_.sx, _.sy, _.deg, _.dx, _.dy];</span>
+</code><code id="L5282"><span class="ln">5282</span>                                <span class="c">// <b>var</b> to2<span class="s"> = </span>{_:{}, getBBox: <b>function</b> () { <b>return</b> element.getBBox(); }};</span>
+</code><code id="L5283"><span class="ln">5283</span>                                <span class="c">// extractTransform(to2, to[attr]);</span>
+</code><code id="L5284"><span class="ln">5284</span>                                <span class="c">// diff[attr]<span class="s"> = </span>[</span>
+</code><code id="L5285"><span class="ln">5285</span>                                <span class="c">//     (to2._.sx<span class="s"> - </span>_.sx)<span class="s"> / </span>ms,</span>
+</code><code id="L5286"><span class="ln">5286</span>                                <span class="c">//     (to2._.sy<span class="s"> - </span>_.sy)<span class="s"> / </span>ms,</span>
+</code><code id="L5287"><span class="ln">5287</span>                                <span class="c">//     (to2._.deg<span class="s"> - </span>_.deg)<span class="s"> / </span>ms,</span>
+</code><code id="L5288"><span class="ln">5288</span>                                <span class="c">//     (to2._.dx<span class="s"> - </span>_.dx)<span class="s"> / </span>ms,</span>
+</code><code id="L5289"><span class="ln">5289</span>                                <span class="c">//     (to2._.dy<span class="s"> - </span>_.dy)<span class="s"> / </span>ms</span>
+</code><code id="L5290"><span class="ln">5290</span>                                <span class="c">// ];</span>
+</code><code id="L5291"><span class="ln">5291</span>                            }
+</code><code id="L5292"><span class="ln">5292</span>                            <b>break</b>;
+</code><code id="L5293"><span class="ln">5293</span>                        <b>case</b> <i>"csv"</i>:
+</code><code id="L5294"><span class="ln">5294</span>                            <b>var</b> values<span class="s"> = </span>Str(params[attr]).split(separator),
+</code><code id="L5295"><span class="ln">5295</span>                                from2<span class="s"> = </span>Str(from[attr]).split(separator);
+</code><code id="L5296"><span class="ln">5296</span>                            <b>if</b> (attr<span class="s"> == </span><i>"clip-rect"</i>) {
+</code><code id="L5297"><span class="ln">5297</span>                                from[attr]<span class="s"> = </span>from2;
+</code><code id="L5298"><span class="ln">5298</span>                                diff[attr]<span class="s"> = </span>[];
+</code><code id="L5299"><span class="ln">5299</span>                                i<span class="s"> = </span>from2.length;
+</code><code id="L5300"><span class="ln">5300</span>                                <b>while</b> (i--) {
+</code><code id="L5301"><span class="ln">5301</span>                                    diff[attr][i]<span class="s"> = </span>(values[i]<span class="s"> - </span>from[attr][i])<span class="s"> / </span>ms;
+</code><code id="L5302"><span class="ln">5302</span>                                }
+</code><code id="L5303"><span class="ln">5303</span>                            }
+</code><code id="L5304"><span class="ln">5304</span>                            to[attr]<span class="s"> = </span>values;
+</code><code id="L5305"><span class="ln">5305</span>                            <b>break</b>;
+</code><code id="L5306"><span class="ln">5306</span>                        <b>default</b>:
+</code><code id="L5307"><span class="ln">5307</span>                            values<span class="s"> = </span>[].concat(params[attr]);
+</code><code id="L5308"><span class="ln">5308</span>                            from2<span class="s"> = </span>[].concat(from[attr]);
+</code><code id="L5309"><span class="ln">5309</span>                            diff[attr]<span class="s"> = </span>[];
+</code><code id="L5310"><span class="ln">5310</span>                            i<span class="s"> = </span>element.paper.customAttributes[attr].length;
+</code><code id="L5311"><span class="ln">5311</span>                            <b>while</b> (i--) {
+</code><code id="L5312"><span class="ln">5312</span>                                diff[attr][i]<span class="s"> = </span>((values[i]<span class="s"> || </span><span class="d">0</span>)<span class="s"> - </span>(from2[i]<span class="s"> || </span><span class="d">0</span>))<span class="s"> / </span>ms;
+</code><code id="L5313"><span class="ln">5313</span>                            }
+</code><code id="L5314"><span class="ln">5314</span>                            <b>break</b>;
+</code><code id="L5315"><span class="ln">5315</span>                    }
+</code><code id="L5316"><span class="ln">5316</span>                }
+</code><code id="L5317"><span class="ln">5317</span>            }
+</code><code id="L5318"><span class="ln">5318</span>            <b>var</b> easing<span class="s"> = </span>params.easing,
+</code><code id="L5319"><span class="ln">5319</span>                easyeasy<span class="s"> = </span>R.easing_formulas[easing];
+</code><code id="L5320"><span class="ln">5320</span>            <b>if</b> (!easyeasy) {
+</code><code id="L5321"><span class="ln">5321</span>                easyeasy<span class="s"> = </span>Str(easing).match(bezierrg);
+</code><code id="L5322"><span class="ln">5322</span>                <b>if</b> (easyeasy<span class="s"> &amp;&amp; </span>easyeasy.length<span class="s"> == </span><span class="d">5</span>) {
+</code><code id="L5323"><span class="ln">5323</span>                    <b>var</b> curve<span class="s"> = </span>easyeasy;
+</code><code id="L5324"><span class="ln">5324</span>                    easyeasy<span class="s"> = </span><b>function</b> (t) {
+</code><code id="L5325"><span class="ln">5325</span>                        <b>return</b> CubicBezierAtTime(t, +curve[<span class="d">1</span>], +curve[<span class="d">2</span>], +curve[<span class="d">3</span>], +curve[<span class="d">4</span>], ms);
+</code><code id="L5326"><span class="ln">5326</span>                    };
+</code><code id="L5327"><span class="ln">5327</span>                } <b>else</b> {
+</code><code id="L5328"><span class="ln">5328</span>                    easyeasy<span class="s"> = </span>pipe;
+</code><code id="L5329"><span class="ln">5329</span>                }
+</code><code id="L5330"><span class="ln">5330</span>            }
+</code><code id="L5331"><span class="ln">5331</span>            timestamp<span class="s"> = </span>params.start<span class="s"> || </span>anim.start<span class="s"> || </span>+<b>new</b> Date;
+</code><code id="L5332"><span class="ln">5332</span>            e<span class="s"> = </span>{
+</code><code id="L5333"><span class="ln">5333</span>                anim: anim,
+</code><code id="L5334"><span class="ln">5334</span>                percent: percent,
+</code><code id="L5335"><span class="ln">5335</span>                timestamp: timestamp,
+</code><code id="L5336"><span class="ln">5336</span>                start: timestamp<span class="s"> + </span>(anim.del<span class="s"> || </span><span class="d">0</span>),
+</code><code id="L5337"><span class="ln">5337</span>                status: <span class="d">0</span>,
+</code><code id="L5338"><span class="ln">5338</span>                initstatus: status<span class="s"> || </span><span class="d">0</span>,
+</code><code id="L5339"><span class="ln">5339</span>                stop: <b>false</b>,
+</code><code id="L5340"><span class="ln">5340</span>                ms: ms,
+</code><code id="L5341"><span class="ln">5341</span>                easing: easyeasy,
+</code><code id="L5342"><span class="ln">5342</span>                from: from,
+</code><code id="L5343"><span class="ln">5343</span>                diff: diff,
+</code><code id="L5344"><span class="ln">5344</span>                to: to,
+</code><code id="L5345"><span class="ln">5345</span>                el: element,
+</code><code id="L5346"><span class="ln">5346</span>                callback: params.callback,
+</code><code id="L5347"><span class="ln">5347</span>                prev: prev,
+</code><code id="L5348"><span class="ln">5348</span>                next: next,
+</code><code id="L5349"><span class="ln">5349</span>                repeat: anim.times,
+</code><code id="L5350"><span class="ln">5350</span>                origin: element.attr(),
+</code><code id="L5351"><span class="ln">5351</span>                totalOrigin: totalOrigin
+</code><code id="L5352"><span class="ln">5352</span>            };
+</code><code id="L5353"><span class="ln">5353</span>            animationElements.push(e);
+</code><code id="L5354"><span class="ln">5354</span>            <b>if</b> (status<span class="s"> &amp;&amp; </span>!isInAnim) {
+</code><code id="L5355"><span class="ln">5355</span>                e.stop<span class="s"> = </span><b>true</b>;
+</code><code id="L5356"><span class="ln">5356</span>                e.start<span class="s"> = </span><b>new</b> Date<span class="s"> - </span>ms<span class="s"> * </span>status;
+</code><code id="L5357"><span class="ln">5357</span>                <b>if</b> (animationElements.length<span class="s"> == </span><span class="d">1</span>) {
+</code><code id="L5358"><span class="ln">5358</span>                    <b>return</b> animation();
+</code><code id="L5359"><span class="ln">5359</span>                }
+</code><code id="L5360"><span class="ln">5360</span>            }
+</code><code id="L5361"><span class="ln">5361</span>            animationElements.length<span class="s"> == </span><span class="d">1</span><span class="s"> &amp;&amp; </span>requestAnimFrame(animation);
+</code><code id="L5362"><span class="ln">5362</span>        } <b>else</b> {
+</code><code id="L5363"><span class="ln">5363</span>            isInAnim.initstatus<span class="s"> = </span>status;
+</code><code id="L5364"><span class="ln">5364</span>            isInAnim.start<span class="s"> = </span><b>new</b> Date<span class="s"> - </span>isInAnim.ms<span class="s"> * </span>status;
+</code><code id="L5365"><span class="ln">5365</span>        }
+</code><code id="L5366"><span class="ln">5366</span>        eve(<i>"anim.start."</i><span class="s"> + </span>element.id, element, anim);
+</code><code id="L5367"><span class="ln">5367</span>    }
+</code><code id="L5368"><span class="ln">5368</span><span class="c">    <span class="c">/*\</span>
+</span></code><code id="L5369"><span class="ln">5369</span><span class="c">    <span class="s"> * </span>Raphael.animation
+</span></code><code id="L5370"><span class="ln">5370</span><span class="c">     [ method ]
+</span></code><code id="L5371"><span class="ln">5371</span><span class="c">     **
+</span></code><code id="L5372"><span class="ln">5372</span><span class="c">    <span class="s"> * </span>Creates an animation object that can be passed to the @Element.animate or @Element.animateWith methods.
+</span></code><code id="L5373"><span class="ln">5373</span><span class="c">    <span class="s"> * </span>See also @Animation.delay and @Animation.repeat methods.
+</span></code><code id="L5374"><span class="ln">5374</span><span class="c">     **
+</span></code><code id="L5375"><span class="ln">5375</span><span class="c">     > Parameters
+</span></code><code id="L5376"><span class="ln">5376</span><span class="c">     **
+</span></code><code id="L5377"><span class="ln">5377</span><span class="c">    <span class="s"> - </span>params (object) <b>final</b> attributes <b>for</b> the element, see also @Element.attr
+</span></code><code id="L5378"><span class="ln">5378</span><span class="c">    <span class="s"> - </span>ms (number) number of milliseconds <b>for</b> animation to run
+</span></code><code id="L5379"><span class="ln">5379</span><span class="c">    <span class="s"> - </span>easing (string) #optional easing type. Accept one of @Raphael.easing_formulas or CSS format: `cubic&#x2010;bezier(XX,&#<span class="d">160</span>;XX,&#<span class="d">160</span>;XX,&#<span class="d">160</span>;XX)`
+</span></code><code id="L5380"><span class="ln">5380</span><span class="c">    <span class="s"> - </span>callback (<b>function</b>) #optional callback <b>function</b>. Will be called at the end of animation.
+</span></code><code id="L5381"><span class="ln">5381</span><span class="c">     **
+</span></code><code id="L5382"><span class="ln">5382</span><span class="c">    <span class="s"> = </span>(object) @Animation
+</span></code><code id="L5383"><span class="ln">5383</span><span class="c">    \*/</span>
+</code><code id="L5384"><span class="ln">5384</span>    R.animation<span class="s"> = </span><b>function</b> (params, ms, easing, callback) {
+</code><code id="L5385"><span class="ln">5385</span>        <b>if</b> (R.is(easing, <i>"<b>function</b>"</i>)<span class="s"> || </span>!easing) {
+</code><code id="L5386"><span class="ln">5386</span>            callback<span class="s"> = </span>callback<span class="s"> || </span>easing<span class="s"> || </span><b>null</b>;
+</code><code id="L5387"><span class="ln">5387</span>            easing<span class="s"> = </span><b>null</b>;
+</code><code id="L5388"><span class="ln">5388</span>        }
+</code><code id="L5389"><span class="ln">5389</span>        params<span class="s"> = </span>Object(params);
+</code><code id="L5390"><span class="ln">5390</span>        ms<span class="s"> = </span>+ms<span class="s"> || </span><span class="d">0</span>;
+</code><code id="L5391"><span class="ln">5391</span>        <b>var</b> p<span class="s"> = </span>{},
+</code><code id="L5392"><span class="ln">5392</span>            json,
+</code><code id="L5393"><span class="ln">5393</span>            attr;
+</code><code id="L5394"><span class="ln">5394</span>        <b>for</b> (attr <b>in</b> params) <b>if</b> (params[has](attr)<span class="s"> &amp;&amp; </span>toFloat(attr) != attr) {
+</code><code id="L5395"><span class="ln">5395</span>            json<span class="s"> = </span><b>true</b>;
+</code><code id="L5396"><span class="ln">5396</span>            p[attr]<span class="s"> = </span>params[attr];
+</code><code id="L5397"><span class="ln">5397</span>        }
+</code><code id="L5398"><span class="ln">5398</span>        <b>if</b> (!json) {
+</code><code id="L5399"><span class="ln">5399</span>            <b>return</b> <b>new</b> Animation(params, ms);
+</code><code id="L5400"><span class="ln">5400</span>        } <b>else</b> {
+</code><code id="L5401"><span class="ln">5401</span>            easing<span class="s"> &amp;&amp; </span>(p.easing<span class="s"> = </span>easing);
+</code><code id="L5402"><span class="ln">5402</span>            callback<span class="s"> &amp;&amp; </span>(p.callback<span class="s"> = </span>callback);
+</code><code id="L5403"><span class="ln">5403</span>            <b>return</b> <b>new</b> Animation({<span class="d">100</span>: p}, ms);
+</code><code id="L5404"><span class="ln">5404</span>        }
+</code><code id="L5405"><span class="ln">5405</span>    };
+</code><code id="L5406"><span class="ln">5406</span><span class="c">    <span class="c">/*\</span>
+</span></code><code id="L5407"><span class="ln">5407</span><span class="c">    <span class="s"> * </span>Element.animate
+</span></code><code id="L5408"><span class="ln">5408</span><span class="c">     [ method ]
 </span></code><code id="L5409"><span class="ln">5409</span><span class="c">     **
-</span></code><code id="L5410"><span class="ln">5410</span><span class="c">    <span class="s"> = </span>(number) status
-</span></code><code id="L5411"><span class="ln">5411</span><span class="c">    <span class="s"> * </span>or
-</span></code><code id="L5412"><span class="ln">5412</span><span class="c">    <span class="s"> = </span>(array) status <b>if</b> `anim` is not specified. Array of objects <b>in</b> format:
-</span></code><code id="L5413"><span class="ln">5413</span><span class="c">     o {
-</span></code><code id="L5414"><span class="ln">5414</span><span class="c">     o     anim: (object) animation object
-</span></code><code id="L5415"><span class="ln">5415</span><span class="c">     o     status: (number) status
-</span></code><code id="L5416"><span class="ln">5416</span><span class="c">     o }
-</span></code><code id="L5417"><span class="ln">5417</span><span class="c">    <span class="s"> * </span>or
-</span></code><code id="L5418"><span class="ln">5418</span><span class="c">    <span class="s"> = </span>(object) original element <b>if</b> `value` is specified
-</span></code><code id="L5419"><span class="ln">5419</span><span class="c">    \*/</span>
-</code><code id="L5420"><span class="ln">5420</span>    elproto.status<span class="s"> = </span><b>function</b> (anim, value) {
-</code><code id="L5421"><span class="ln">5421</span>        <b>var</b> out<span class="s"> = </span>[],
-</code><code id="L5422"><span class="ln">5422</span>            i<span class="s"> = </span><span class="d">0</span>,
-</code><code id="L5423"><span class="ln">5423</span>            len,
-</code><code id="L5424"><span class="ln">5424</span>            e;
-</code><code id="L5425"><span class="ln">5425</span>        <b>if</b> (value != <b>null</b>) {
-</code><code id="L5426"><span class="ln">5426</span>            runAnimation(anim, <b>this</b>, -<span class="d">1</span>, mmin(value, <span class="d">1</span>));
-</code><code id="L5427"><span class="ln">5427</span>            <b>return</b> <b>this</b>;
-</code><code id="L5428"><span class="ln">5428</span>        } <b>else</b> {
-</code><code id="L5429"><span class="ln">5429</span>            len<span class="s"> = </span>animationElements.length;
-</code><code id="L5430"><span class="ln">5430</span>            <b>for</b> (; i &lt; len; i++) {
-</code><code id="L5431"><span class="ln">5431</span>                e<span class="s"> = </span>animationElements[i];
-</code><code id="L5432"><span class="ln">5432</span>                <b>if</b> (e.el.id<span class="s"> == </span><b>this</b>.id<span class="s"> &amp;&amp; </span>(!anim<span class="s"> || </span>e.anim<span class="s"> == </span>anim)) {
-</code><code id="L5433"><span class="ln">5433</span>                    <b>if</b> (anim) {
-</code><code id="L5434"><span class="ln">5434</span>                        <b>return</b> e.status;
-</code><code id="L5435"><span class="ln">5435</span>                    }
-</code><code id="L5436"><span class="ln">5436</span>                    out.push({anim: e.anim, status: e.status});
-</code><code id="L5437"><span class="ln">5437</span>                }
-</code><code id="L5438"><span class="ln">5438</span>            }
-</code><code id="L5439"><span class="ln">5439</span>            <b>if</b> (anim) {
-</code><code id="L5440"><span class="ln">5440</span>                <b>return</b> <span class="d">0</span>;
-</code><code id="L5441"><span class="ln">5441</span>            }
-</code><code id="L5442"><span class="ln">5442</span>            <b>return</b> out;
-</code><code id="L5443"><span class="ln">5443</span>        }
-</code><code id="L5444"><span class="ln">5444</span>    };
-</code><code id="L5445"><span class="ln">5445</span><span class="c">    <span class="c">/*\</span>
-</span></code><code id="L5446"><span class="ln">5446</span><span class="c">    <span class="s"> * </span>Element.pause
-</span></code><code id="L5447"><span class="ln">5447</span><span class="c">     [ method ]
-</span></code><code id="L5448"><span class="ln">5448</span><span class="c">     **
-</span></code><code id="L5449"><span class="ln">5449</span><span class="c">    <span class="s"> * </span>Stops animation of the element <b>with</b> ability to resume it later on.
-</span></code><code id="L5450"><span class="ln">5450</span><span class="c">     **
-</span></code><code id="L5451"><span class="ln">5451</span><span class="c">     > Parameters
-</span></code><code id="L5452"><span class="ln">5452</span><span class="c">     **
-</span></code><code id="L5453"><span class="ln">5453</span><span class="c">    <span class="s"> - </span>anim (object) #optional animation object
-</span></code><code id="L5454"><span class="ln">5454</span><span class="c">     **
-</span></code><code id="L5455"><span class="ln">5455</span><span class="c">    <span class="s"> = </span>(object) original element
-</span></code><code id="L5456"><span class="ln">5456</span><span class="c">    \*/</span>
-</code><code id="L5457"><span class="ln">5457</span>    elproto.pause<span class="s"> = </span><b>function</b> (anim) {
-</code><code id="L5458"><span class="ln">5458</span>        <b>for</b> (<b>var</b> i<span class="s"> = </span><span class="d">0</span>; i &lt; animationElements.length; i++) <b>if</b> (animationElements[i].el.id<span class="s"> == </span><b>this</b>.id<span class="s"> &amp;&amp; </span>(!anim<span class="s"> || </span>animationElements[i].anim<span class="s"> == </span>anim)) {
-</code><code id="L5459"><span class="ln">5459</span>            <b>if</b> (eve(<i>"anim.pause."</i><span class="s"> + </span><b>this</b>.id, <b>this</b>, animationElements[i].anim) !== <b>false</b>) {
-</code><code id="L5460"><span class="ln">5460</span>                animationElements[i].paused<span class="s"> = </span><b>true</b>;
-</code><code id="L5461"><span class="ln">5461</span>            }
-</code><code id="L5462"><span class="ln">5462</span>        }
-</code><code id="L5463"><span class="ln">5463</span>        <b>return</b> <b>this</b>;
-</code><code id="L5464"><span class="ln">5464</span>    };
-</code><code id="L5465"><span class="ln">5465</span><span class="c">    <span class="c">/*\</span>
-</span></code><code id="L5466"><span class="ln">5466</span><span class="c">    <span class="s"> * </span>Element.resume
-</span></code><code id="L5467"><span class="ln">5467</span><span class="c">     [ method ]
-</span></code><code id="L5468"><span class="ln">5468</span><span class="c">     **
-</span></code><code id="L5469"><span class="ln">5469</span><span class="c">    <span class="s"> * </span>Resumes animation <b>if</b> it was paused <b>with</b> @Element.pause method.
-</span></code><code id="L5470"><span class="ln">5470</span><span class="c">     **
-</span></code><code id="L5471"><span class="ln">5471</span><span class="c">     > Parameters
-</span></code><code id="L5472"><span class="ln">5472</span><span class="c">     **
-</span></code><code id="L5473"><span class="ln">5473</span><span class="c">    <span class="s"> - </span>anim (object) #optional animation object
-</span></code><code id="L5474"><span class="ln">5474</span><span class="c">     **
-</span></code><code id="L5475"><span class="ln">5475</span><span class="c">    <span class="s"> = </span>(object) original element
-</span></code><code id="L5476"><span class="ln">5476</span><span class="c">    \*/</span>
-</code><code id="L5477"><span class="ln">5477</span>    elproto.resume<span class="s"> = </span><b>function</b> (anim) {
-</code><code id="L5478"><span class="ln">5478</span>        <b>for</b> (<b>var</b> i<span class="s"> = </span><span class="d">0</span>; i &lt; animationElements.length; i++) <b>if</b> (animationElements[i].el.id<span class="s"> == </span><b>this</b>.id<span class="s"> &amp;&amp; </span>(!anim<span class="s"> || </span>animationElements[i].anim<span class="s"> == </span>anim)) {
-</code><code id="L5479"><span class="ln">5479</span>            <b>var</b> e<span class="s"> = </span>animationElements[i];
-</code><code id="L5480"><span class="ln">5480</span>            <b>if</b> (eve(<i>"anim.resume."</i><span class="s"> + </span><b>this</b>.id, <b>this</b>, e.anim) !== <b>false</b>) {
-</code><code id="L5481"><span class="ln">5481</span>                <b>delete</b> e.paused;
-</code><code id="L5482"><span class="ln">5482</span>                <b>this</b>.status(e.anim, e.status);
-</code><code id="L5483"><span class="ln">5483</span>            }
-</code><code id="L5484"><span class="ln">5484</span>        }
-</code><code id="L5485"><span class="ln">5485</span>        <b>return</b> <b>this</b>;
-</code><code id="L5486"><span class="ln">5486</span>    };
-</code><code id="L5487"><span class="ln">5487</span><span class="c">    <span class="c">/*\</span>
-</span></code><code id="L5488"><span class="ln">5488</span><span class="c">    <span class="s"> * </span>Element.stop
-</span></code><code id="L5489"><span class="ln">5489</span><span class="c">     [ method ]
-</span></code><code id="L5490"><span class="ln">5490</span><span class="c">     **
-</span></code><code id="L5491"><span class="ln">5491</span><span class="c">    <span class="s"> * </span>Stops animation of the element.
-</span></code><code id="L5492"><span class="ln">5492</span><span class="c">     **
-</span></code><code id="L5493"><span class="ln">5493</span><span class="c">     > Parameters
-</span></code><code id="L5494"><span class="ln">5494</span><span class="c">     **
-</span></code><code id="L5495"><span class="ln">5495</span><span class="c">    <span class="s"> - </span>anim (object) #optional animation object
-</span></code><code id="L5496"><span class="ln">5496</span><span class="c">     **
-</span></code><code id="L5497"><span class="ln">5497</span><span class="c">    <span class="s"> = </span>(object) original element
-</span></code><code id="L5498"><span class="ln">5498</span><span class="c">    \*/</span>
-</code><code id="L5499"><span class="ln">5499</span>    elproto.stop<span class="s"> = </span><b>function</b> (anim) {
-</code><code id="L5500"><span class="ln">5500</span>        <b>for</b> (<b>var</b> i<span class="s"> = </span><span class="d">0</span>; i &lt; animationElements.length; i++) <b>if</b> (animationElements[i].el.id<span class="s"> == </span><b>this</b>.id<span class="s"> &amp;&amp; </span>(!anim<span class="s"> || </span>animationElements[i].anim<span class="s"> == </span>anim)) {
-</code><code id="L5501"><span class="ln">5501</span>            <b>if</b> (eve(<i>"anim.stop."</i><span class="s"> + </span><b>this</b>.id, <b>this</b>, animationElements[i].anim) !== <b>false</b>) {
-</code><code id="L5502"><span class="ln">5502</span>                animationElements.splice(i--, <span class="d">1</span>);
-</code><code id="L5503"><span class="ln">5503</span>            }
-</code><code id="L5504"><span class="ln">5504</span>        }
-</code><code id="L5505"><span class="ln">5505</span>        <b>return</b> <b>this</b>;
-</code><code id="L5506"><span class="ln">5506</span>    };
-</code><code id="L5507"><span class="ln">5507</span>    elproto.toString<span class="s"> = </span><b>function</b> () {
-</code><code id="L5508"><span class="ln">5508</span>        <b>return</b> <i>"Rapha\xebl\u2019s object"</i>;
-</code><code id="L5509"><span class="ln">5509</span>    };
-</code><code id="L5510"><span class="ln">5510</span>
-</code><code id="L5511"><span class="ln">5511</span>    <span class="c">// Set</span>
-</code><code id="L5512"><span class="ln">5512</span>    <b>var</b> Set<span class="s"> = </span><b>function</b> (items) {
-</code><code id="L5513"><span class="ln">5513</span>        <b>this</b>.items<span class="s"> = </span>[];
-</code><code id="L5514"><span class="ln">5514</span>        <b>this</b>.length<span class="s"> = </span><span class="d">0</span>;
-</code><code id="L5515"><span class="ln">5515</span>        <b>this</b>.type<span class="s"> = </span><i>"set"</i>;
-</code><code id="L5516"><span class="ln">5516</span>        <b>if</b> (items) {
-</code><code id="L5517"><span class="ln">5517</span>            <b>for</b> (<b>var</b> i<span class="s"> = </span><span class="d">0</span>, ii<span class="s"> = </span>items.length; i &lt; ii; i++) {
-</code><code id="L5518"><span class="ln">5518</span>                <b>if</b> (items[i]<span class="s"> &amp;&amp; </span>(items[i].constructor<span class="s"> == </span>Element<span class="s"> || </span>items[i].constructor<span class="s"> == </span>Set)) {
-</code><code id="L5519"><span class="ln">5519</span>                    <b>this</b>[<b>this</b>.items.length]<span class="s"> = </span><b>this</b>.items[<b>this</b>.items.length]<span class="s"> = </span>items[i];
-</code><code id="L5520"><span class="ln">5520</span>                    <b>this</b>.length++;
-</code><code id="L5521"><span class="ln">5521</span>                }
-</code><code id="L5522"><span class="ln">5522</span>            }
-</code><code id="L5523"><span class="ln">5523</span>        }
-</code><code id="L5524"><span class="ln">5524</span>    },
-</code><code id="L5525"><span class="ln">5525</span>    setproto<span class="s"> = </span>Set.prototype;
-</code><code id="L5526"><span class="ln">5526</span><span class="c">    <span class="c">/*\</span>
-</span></code><code id="L5527"><span class="ln">5527</span><span class="c">    <span class="s"> * </span>Set.push
-</span></code><code id="L5528"><span class="ln">5528</span><span class="c">     [ method ]
-</span></code><code id="L5529"><span class="ln">5529</span><span class="c">     **
-</span></code><code id="L5530"><span class="ln">5530</span><span class="c">    <span class="s"> * </span>Adds each argument to the current set.
+</span></code><code id="L5410"><span class="ln">5410</span><span class="c">    <span class="s"> * </span>Creates and starts animation <b>for</b> given element.
+</span></code><code id="L5411"><span class="ln">5411</span><span class="c">     **
+</span></code><code id="L5412"><span class="ln">5412</span><span class="c">     > Parameters
+</span></code><code id="L5413"><span class="ln">5413</span><span class="c">     **
+</span></code><code id="L5414"><span class="ln">5414</span><span class="c">    <span class="s"> - </span>params (object) <b>final</b> attributes <b>for</b> the element, see also @Element.attr
+</span></code><code id="L5415"><span class="ln">5415</span><span class="c">    <span class="s"> - </span>ms (number) number of milliseconds <b>for</b> animation to run
+</span></code><code id="L5416"><span class="ln">5416</span><span class="c">    <span class="s"> - </span>easing (string) #optional easing type. Accept one of @Raphael.easing_formulas or CSS format: `cubic&#x2010;bezier(XX,&#<span class="d">160</span>;XX,&#<span class="d">160</span>;XX,&#<span class="d">160</span>;XX)`
+</span></code><code id="L5417"><span class="ln">5417</span><span class="c">    <span class="s"> - </span>callback (<b>function</b>) #optional callback <b>function</b>. Will be called at the end of animation.
+</span></code><code id="L5418"><span class="ln">5418</span><span class="c">    <span class="s"> * </span>or
+</span></code><code id="L5419"><span class="ln">5419</span><span class="c">    <span class="s"> - </span>animation (object) animation object, see @Raphael.animation
+</span></code><code id="L5420"><span class="ln">5420</span><span class="c">     **
+</span></code><code id="L5421"><span class="ln">5421</span><span class="c">    <span class="s"> = </span>(object) original element
+</span></code><code id="L5422"><span class="ln">5422</span><span class="c">    \*/</span>
+</code><code id="L5423"><span class="ln">5423</span>    elproto.animate<span class="s"> = </span><b>function</b> (params, ms, easing, callback) {
+</code><code id="L5424"><span class="ln">5424</span>        <b>var</b> element<span class="s"> = </span><b>this</b>;
+</code><code id="L5425"><span class="ln">5425</span>        <b>if</b> (element.removed) {
+</code><code id="L5426"><span class="ln">5426</span>            callback<span class="s"> &amp;&amp; </span>callback.call(element);
+</code><code id="L5427"><span class="ln">5427</span>            <b>return</b> element;
+</code><code id="L5428"><span class="ln">5428</span>        }
+</code><code id="L5429"><span class="ln">5429</span>        <b>var</b> anim<span class="s"> = </span>params <b>instanceof</b> Animation ? params : R.animation(params, ms, easing, callback);
+</code><code id="L5430"><span class="ln">5430</span>        runAnimation(anim, element, anim.percents[<span class="d">0</span>], <b>null</b>, element.attr());
+</code><code id="L5431"><span class="ln">5431</span>        <b>return</b> element;
+</code><code id="L5432"><span class="ln">5432</span>    };
+</code><code id="L5433"><span class="ln">5433</span><span class="c">    <span class="c">/*\</span>
+</span></code><code id="L5434"><span class="ln">5434</span><span class="c">    <span class="s"> * </span>Element.setTime
+</span></code><code id="L5435"><span class="ln">5435</span><span class="c">     [ method ]
+</span></code><code id="L5436"><span class="ln">5436</span><span class="c">     **
+</span></code><code id="L5437"><span class="ln">5437</span><span class="c">    <span class="s"> * </span>Sets the status of animation of the element <b>in</b> milliseconds. Similar to @Element.status method.
+</span></code><code id="L5438"><span class="ln">5438</span><span class="c">     **
+</span></code><code id="L5439"><span class="ln">5439</span><span class="c">     > Parameters
+</span></code><code id="L5440"><span class="ln">5440</span><span class="c">     **
+</span></code><code id="L5441"><span class="ln">5441</span><span class="c">    <span class="s"> - </span>anim (object) animation object
+</span></code><code id="L5442"><span class="ln">5442</span><span class="c">    <span class="s"> - </span>value (number) number of milliseconds from the beginning of the animation
+</span></code><code id="L5443"><span class="ln">5443</span><span class="c">     **
+</span></code><code id="L5444"><span class="ln">5444</span><span class="c">    <span class="s"> = </span>(object) original element <b>if</b> `value` is specified
+</span></code><code id="L5445"><span class="ln">5445</span><span class="c">    <span class="s"> * </span>Note, that during animation following events are triggered:
+</span></code><code id="L5446"><span class="ln">5446</span><span class="c">     *
+</span></code><code id="L5447"><span class="ln">5447</span><span class="c">    <span class="s"> * </span>On each animation frame event `anim.frame.&lt;id>`, on start `anim.start.&lt;id>` and on end `anim.finish.&lt;id>`.
+</span></code><code id="L5448"><span class="ln">5448</span><span class="c">    \*/</span>
+</code><code id="L5449"><span class="ln">5449</span>    elproto.setTime<span class="s"> = </span><b>function</b> (anim, value) {
+</code><code id="L5450"><span class="ln">5450</span>        <b>if</b> (anim<span class="s"> &amp;&amp; </span>value != <b>null</b>) {
+</code><code id="L5451"><span class="ln">5451</span>            <b>this</b>.status(anim, mmin(value, anim.ms)<span class="s"> / </span>anim.ms);
+</code><code id="L5452"><span class="ln">5452</span>        }
+</code><code id="L5453"><span class="ln">5453</span>        <b>return</b> <b>this</b>;
+</code><code id="L5454"><span class="ln">5454</span>    };
+</code><code id="L5455"><span class="ln">5455</span><span class="c">    <span class="c">/*\</span>
+</span></code><code id="L5456"><span class="ln">5456</span><span class="c">    <span class="s"> * </span>Element.status
+</span></code><code id="L5457"><span class="ln">5457</span><span class="c">     [ method ]
+</span></code><code id="L5458"><span class="ln">5458</span><span class="c">     **
+</span></code><code id="L5459"><span class="ln">5459</span><span class="c">    <span class="s"> * </span>Gets or sets the status of animation of the element.
+</span></code><code id="L5460"><span class="ln">5460</span><span class="c">     **
+</span></code><code id="L5461"><span class="ln">5461</span><span class="c">     > Parameters
+</span></code><code id="L5462"><span class="ln">5462</span><span class="c">     **
+</span></code><code id="L5463"><span class="ln">5463</span><span class="c">    <span class="s"> - </span>anim (object) #optional animation object
+</span></code><code id="L5464"><span class="ln">5464</span><span class="c">    <span class="s"> - </span>value (number) #optional <span class="d">0</span> – <span class="d">1</span>. If specified, method works like a setter and sets the status of a given animation to the value. This will cause animation to jump to the given position.
+</span></code><code id="L5465"><span class="ln">5465</span><span class="c">     **
+</span></code><code id="L5466"><span class="ln">5466</span><span class="c">    <span class="s"> = </span>(number) status
+</span></code><code id="L5467"><span class="ln">5467</span><span class="c">    <span class="s"> * </span>or
+</span></code><code id="L5468"><span class="ln">5468</span><span class="c">    <span class="s"> = </span>(array) status <b>if</b> `anim` is not specified. Array of objects <b>in</b> format:
+</span></code><code id="L5469"><span class="ln">5469</span><span class="c">     o {
+</span></code><code id="L5470"><span class="ln">5470</span><span class="c">     o     anim: (object) animation object
+</span></code><code id="L5471"><span class="ln">5471</span><span class="c">     o     status: (number) status
+</span></code><code id="L5472"><span class="ln">5472</span><span class="c">     o }
+</span></code><code id="L5473"><span class="ln">5473</span><span class="c">    <span class="s"> * </span>or
+</span></code><code id="L5474"><span class="ln">5474</span><span class="c">    <span class="s"> = </span>(object) original element <b>if</b> `value` is specified
+</span></code><code id="L5475"><span class="ln">5475</span><span class="c">    \*/</span>
+</code><code id="L5476"><span class="ln">5476</span>    elproto.status<span class="s"> = </span><b>function</b> (anim, value) {
+</code><code id="L5477"><span class="ln">5477</span>        <b>var</b> out<span class="s"> = </span>[],
+</code><code id="L5478"><span class="ln">5478</span>            i<span class="s"> = </span><span class="d">0</span>,
+</code><code id="L5479"><span class="ln">5479</span>            len,
+</code><code id="L5480"><span class="ln">5480</span>            e;
+</code><code id="L5481"><span class="ln">5481</span>        <b>if</b> (value != <b>null</b>) {
+</code><code id="L5482"><span class="ln">5482</span>            runAnimation(anim, <b>this</b>, -<span class="d">1</span>, mmin(value, <span class="d">1</span>));
+</code><code id="L5483"><span class="ln">5483</span>            <b>return</b> <b>this</b>;
+</code><code id="L5484"><span class="ln">5484</span>        } <b>else</b> {
+</code><code id="L5485"><span class="ln">5485</span>            len<span class="s"> = </span>animationElements.length;
+</code><code id="L5486"><span class="ln">5486</span>            <b>for</b> (; i &lt; len; i++) {
+</code><code id="L5487"><span class="ln">5487</span>                e<span class="s"> = </span>animationElements[i];
+</code><code id="L5488"><span class="ln">5488</span>                <b>if</b> (e.el.id<span class="s"> == </span><b>this</b>.id<span class="s"> &amp;&amp; </span>(!anim<span class="s"> || </span>e.anim<span class="s"> == </span>anim)) {
+</code><code id="L5489"><span class="ln">5489</span>                    <b>if</b> (anim) {
+</code><code id="L5490"><span class="ln">5490</span>                        <b>return</b> e.status;
+</code><code id="L5491"><span class="ln">5491</span>                    }
+</code><code id="L5492"><span class="ln">5492</span>                    out.push({anim: e.anim, status: e.status});
+</code><code id="L5493"><span class="ln">5493</span>                }
+</code><code id="L5494"><span class="ln">5494</span>            }
+</code><code id="L5495"><span class="ln">5495</span>            <b>if</b> (anim) {
+</code><code id="L5496"><span class="ln">5496</span>                <b>return</b> <span class="d">0</span>;
+</code><code id="L5497"><span class="ln">5497</span>            }
+</code><code id="L5498"><span class="ln">5498</span>            <b>return</b> out;
+</code><code id="L5499"><span class="ln">5499</span>        }
+</code><code id="L5500"><span class="ln">5500</span>    };
+</code><code id="L5501"><span class="ln">5501</span><span class="c">    <span class="c">/*\</span>
+</span></code><code id="L5502"><span class="ln">5502</span><span class="c">    <span class="s"> * </span>Element.pause
+</span></code><code id="L5503"><span class="ln">5503</span><span class="c">     [ method ]
+</span></code><code id="L5504"><span class="ln">5504</span><span class="c">     **
+</span></code><code id="L5505"><span class="ln">5505</span><span class="c">    <span class="s"> * </span>Stops animation of the element <b>with</b> ability to resume it later on.
+</span></code><code id="L5506"><span class="ln">5506</span><span class="c">     **
+</span></code><code id="L5507"><span class="ln">5507</span><span class="c">     > Parameters
+</span></code><code id="L5508"><span class="ln">5508</span><span class="c">     **
+</span></code><code id="L5509"><span class="ln">5509</span><span class="c">    <span class="s"> - </span>anim (object) #optional animation object
+</span></code><code id="L5510"><span class="ln">5510</span><span class="c">     **
+</span></code><code id="L5511"><span class="ln">5511</span><span class="c">    <span class="s"> = </span>(object) original element
+</span></code><code id="L5512"><span class="ln">5512</span><span class="c">    \*/</span>
+</code><code id="L5513"><span class="ln">5513</span>    elproto.pause<span class="s"> = </span><b>function</b> (anim) {
+</code><code id="L5514"><span class="ln">5514</span>        <b>for</b> (<b>var</b> i<span class="s"> = </span><span class="d">0</span>; i &lt; animationElements.length; i++) <b>if</b> (animationElements[i].el.id<span class="s"> == </span><b>this</b>.id<span class="s"> &amp;&amp; </span>(!anim<span class="s"> || </span>animationElements[i].anim<span class="s"> == </span>anim)) {
+</code><code id="L5515"><span class="ln">5515</span>            <b>if</b> (eve(<i>"anim.pause."</i><span class="s"> + </span><b>this</b>.id, <b>this</b>, animationElements[i].anim) !== <b>false</b>) {
+</code><code id="L5516"><span class="ln">5516</span>                animationElements[i].paused<span class="s"> = </span><b>true</b>;
+</code><code id="L5517"><span class="ln">5517</span>            }
+</code><code id="L5518"><span class="ln">5518</span>        }
+</code><code id="L5519"><span class="ln">5519</span>        <b>return</b> <b>this</b>;
+</code><code id="L5520"><span class="ln">5520</span>    };
+</code><code id="L5521"><span class="ln">5521</span><span class="c">    <span class="c">/*\</span>
+</span></code><code id="L5522"><span class="ln">5522</span><span class="c">    <span class="s"> * </span>Element.resume
+</span></code><code id="L5523"><span class="ln">5523</span><span class="c">     [ method ]
+</span></code><code id="L5524"><span class="ln">5524</span><span class="c">     **
+</span></code><code id="L5525"><span class="ln">5525</span><span class="c">    <span class="s"> * </span>Resumes animation <b>if</b> it was paused <b>with</b> @Element.pause method.
+</span></code><code id="L5526"><span class="ln">5526</span><span class="c">     **
+</span></code><code id="L5527"><span class="ln">5527</span><span class="c">     > Parameters
+</span></code><code id="L5528"><span class="ln">5528</span><span class="c">     **
+</span></code><code id="L5529"><span class="ln">5529</span><span class="c">    <span class="s"> - </span>anim (object) #optional animation object
+</span></code><code id="L5530"><span class="ln">5530</span><span class="c">     **
 </span></code><code id="L5531"><span class="ln">5531</span><span class="c">    <span class="s"> = </span>(object) original element
 </span></code><code id="L5532"><span class="ln">5532</span><span class="c">    \*/</span>
-</code><code id="L5533"><span class="ln">5533</span>    setproto.push<span class="s"> = </span><b>function</b> () {
-</code><code id="L5534"><span class="ln">5534</span>        <b>var</b> item,
-</code><code id="L5535"><span class="ln">5535</span>            len;
-</code><code id="L5536"><span class="ln">5536</span>        <b>for</b> (<b>var</b> i<span class="s"> = </span><span class="d">0</span>, ii<span class="s"> = </span>arguments.length; i &lt; ii; i++) {
-</code><code id="L5537"><span class="ln">5537</span>            item<span class="s"> = </span>arguments[i];
-</code><code id="L5538"><span class="ln">5538</span>            <b>if</b> (item<span class="s"> &amp;&amp; </span>(item.constructor<span class="s"> == </span>Element<span class="s"> || </span>item.constructor<span class="s"> == </span>Set)) {
-</code><code id="L5539"><span class="ln">5539</span>                len<span class="s"> = </span><b>this</b>.items.length;
-</code><code id="L5540"><span class="ln">5540</span>                <b>this</b>[len]<span class="s"> = </span><b>this</b>.items[len]<span class="s"> = </span>item;
-</code><code id="L5541"><span class="ln">5541</span>                <b>this</b>.length++;
-</code><code id="L5542"><span class="ln">5542</span>            }
-</code><code id="L5543"><span class="ln">5543</span>        }
-</code><code id="L5544"><span class="ln">5544</span>        <b>return</b> <b>this</b>;
-</code><code id="L5545"><span class="ln">5545</span>    };
-</code><code id="L5546"><span class="ln">5546</span><span class="c">    <span class="c">/*\</span>
-</span></code><code id="L5547"><span class="ln">5547</span><span class="c">    <span class="s"> * </span>Set.pop
-</span></code><code id="L5548"><span class="ln">5548</span><span class="c">     [ method ]
-</span></code><code id="L5549"><span class="ln">5549</span><span class="c">     **
-</span></code><code id="L5550"><span class="ln">5550</span><span class="c">    <span class="s"> * </span>Removes last element and returns it.
-</span></code><code id="L5551"><span class="ln">5551</span><span class="c">    <span class="s"> = </span>(object) element
-</span></code><code id="L5552"><span class="ln">5552</span><span class="c">    \*/</span>
-</code><code id="L5553"><span class="ln">5553</span>    setproto.pop<span class="s"> = </span><b>function</b> () {
-</code><code id="L5554"><span class="ln">5554</span>        <b>this</b>.length<span class="s"> &amp;&amp; </span><b>delete</b> <b>this</b>[<b>this</b>.length--];
-</code><code id="L5555"><span class="ln">5555</span>        <b>return</b> <b>this</b>.items.pop();
-</code><code id="L5556"><span class="ln">5556</span>    };
-</code><code id="L5557"><span class="ln">5557</span><span class="c">    <span class="c">/*\</span>
-</span></code><code id="L5558"><span class="ln">5558</span><span class="c">    <span class="s"> * </span>Set.forEach
-</span></code><code id="L5559"><span class="ln">5559</span><span class="c">     [ method ]
-</span></code><code id="L5560"><span class="ln">5560</span><span class="c">     **
-</span></code><code id="L5561"><span class="ln">5561</span><span class="c">    <span class="s"> * </span>Executes given <b>function</b> <b>for</b> each element <b>in</b> the set.
-</span></code><code id="L5562"><span class="ln">5562</span><span class="c">     *
-</span></code><code id="L5563"><span class="ln">5563</span><span class="c">    <span class="s"> * </span>If <b>function</b> returns `<b>false</b>` it will stop loop running.
-</span></code><code id="L5564"><span class="ln">5564</span><span class="c">     **
-</span></code><code id="L5565"><span class="ln">5565</span><span class="c">     > Parameters
-</span></code><code id="L5566"><span class="ln">5566</span><span class="c">     **
-</span></code><code id="L5567"><span class="ln">5567</span><span class="c">    <span class="s"> - </span>callback (<b>function</b>) <b>function</b> to run
-</span></code><code id="L5568"><span class="ln">5568</span><span class="c">    <span class="s"> - </span>thisArg (object) context object <b>for</b> the callback
-</span></code><code id="L5569"><span class="ln">5569</span><span class="c">    <span class="s"> = </span>(object) Set object
-</span></code><code id="L5570"><span class="ln">5570</span><span class="c">    \*/</span>
-</code><code id="L5571"><span class="ln">5571</span>    setproto.forEach<span class="s"> = </span><b>function</b> (callback, thisArg) {
-</code><code id="L5572"><span class="ln">5572</span>        <b>for</b> (<b>var</b> i<span class="s"> = </span><span class="d">0</span>, ii<span class="s"> = </span><b>this</b>.items.length; i &lt; ii; i++) {
-</code><code id="L5573"><span class="ln">5573</span>            <b>if</b> (callback.call(thisArg, <b>this</b>.items[i])<span class="s"> === </span><b>false</b>) {
-</code><code id="L5574"><span class="ln">5574</span>                <b>return</b> <b>this</b>;
-</code><code id="L5575"><span class="ln">5575</span>            }
-</code><code id="L5576"><span class="ln">5576</span>        }
-</code><code id="L5577"><span class="ln">5577</span>        <b>return</b> <b>this</b>;
-</code><code id="L5578"><span class="ln">5578</span>    };
-</code><code id="L5579"><span class="ln">5579</span>    <b>for</b> (<b>var</b> method <b>in</b> elproto) <b>if</b> (elproto[has](method)) {
-</code><code id="L5580"><span class="ln">5580</span>        setproto[method]<span class="s"> = </span>(<b>function</b> (methodname) {
-</code><code id="L5581"><span class="ln">5581</span>            <b>return</b> <b>function</b> () {
-</code><code id="L5582"><span class="ln">5582</span>                <b>var</b> arg<span class="s"> = </span>arguments;
-</code><code id="L5583"><span class="ln">5583</span>                <b>return</b> <b>this</b>.forEach(<b>function</b> (el) {
-</code><code id="L5584"><span class="ln">5584</span>                    el[methodname][apply](el, arg);
-</code><code id="L5585"><span class="ln">5585</span>                });
-</code><code id="L5586"><span class="ln">5586</span>            };
-</code><code id="L5587"><span class="ln">5587</span>        })(method);
-</code><code id="L5588"><span class="ln">5588</span>    }
-</code><code id="L5589"><span class="ln">5589</span>    setproto.attr<span class="s"> = </span><b>function</b> (name, value) {
-</code><code id="L5590"><span class="ln">5590</span>        <b>if</b> (name<span class="s"> &amp;&amp; </span>R.is(name, array)<span class="s"> &amp;&amp; </span>R.is(name[<span class="d">0</span>], <i>"object"</i>)) {
-</code><code id="L5591"><span class="ln">5591</span>            <b>for</b> (<b>var</b> j<span class="s"> = </span><span class="d">0</span>, jj<span class="s"> = </span>name.length; j &lt; jj; j++) {
-</code><code id="L5592"><span class="ln">5592</span>                <b>this</b>.items[j].attr(name[j]);
-</code><code id="L5593"><span class="ln">5593</span>            }
-</code><code id="L5594"><span class="ln">5594</span>        } <b>else</b> {
-</code><code id="L5595"><span class="ln">5595</span>            <b>for</b> (<b>var</b> i<span class="s"> = </span><span class="d">0</span>, ii<span class="s"> = </span><b>this</b>.items.length; i &lt; ii; i++) {
-</code><code id="L5596"><span class="ln">5596</span>                <b>this</b>.items[i].attr(name, value);
-</code><code id="L5597"><span class="ln">5597</span>            }
-</code><code id="L5598"><span class="ln">5598</span>        }
-</code><code id="L5599"><span class="ln">5599</span>        <b>return</b> <b>this</b>;
-</code><code id="L5600"><span class="ln">5600</span>    };
-</code><code id="L5601"><span class="ln">5601</span>    setproto.animate<span class="s"> = </span><b>function</b> (params, ms, easing, callback) {
-</code><code id="L5602"><span class="ln">5602</span>        (R.is(easing, <i>"<b>function</b>"</i>)<span class="s"> || </span>!easing)<span class="s"> &amp;&amp; </span>(callback<span class="s"> = </span>easing<span class="s"> || </span><b>null</b>);
-</code><code id="L5603"><span class="ln">5603</span>        <b>var</b> len<span class="s"> = </span><b>this</b>.items.length,
-</code><code id="L5604"><span class="ln">5604</span>            i<span class="s"> = </span>len,
-</code><code id="L5605"><span class="ln">5605</span>            item,
-</code><code id="L5606"><span class="ln">5606</span>            set<span class="s"> = </span><b>this</b>,
-</code><code id="L5607"><span class="ln">5607</span>            collector;
-</code><code id="L5608"><span class="ln">5608</span>        callback<span class="s"> &amp;&amp; </span>(collector<span class="s"> = </span><b>function</b> () {
-</code><code id="L5609"><span class="ln">5609</span>            !--len<span class="s"> &amp;&amp; </span>callback.call(set);
-</code><code id="L5610"><span class="ln">5610</span>        });
-</code><code id="L5611"><span class="ln">5611</span>        easing<span class="s"> = </span>R.is(easing, string) ? easing : collector;
-</code><code id="L5612"><span class="ln">5612</span>        <b>var</b> anim<span class="s"> = </span>params <b>instanceof</b> Animation ? params : R.animation(params, ms, easing, collector);
-</code><code id="L5613"><span class="ln">5613</span>        item<span class="s"> = </span><b>this</b>.items[--i].animate(anim);
-</code><code id="L5614"><span class="ln">5614</span>        <b>while</b> (i--) {
-</code><code id="L5615"><span class="ln">5615</span>            <b>this</b>.items[i]<span class="s"> &amp;&amp; </span>!<b>this</b>.items[i].removed<span class="s"> &amp;&amp; </span><b>this</b>.items[i].animateWith(item, anim);
-</code><code id="L5616"><span class="ln">5616</span>        }
-</code><code id="L5617"><span class="ln">5617</span>        <b>return</b> <b>this</b>;
-</code><code id="L5618"><span class="ln">5618</span>    };
-</code><code id="L5619"><span class="ln">5619</span>    setproto.insertAfter<span class="s"> = </span><b>function</b> (el) {
-</code><code id="L5620"><span class="ln">5620</span>        <b>var</b> i<span class="s"> = </span><b>this</b>.items.length;
-</code><code id="L5621"><span class="ln">5621</span>        <b>while</b> (i--) {
-</code><code id="L5622"><span class="ln">5622</span>            <b>this</b>.items[i].insertAfter(el);
-</code><code id="L5623"><span class="ln">5623</span>        }
-</code><code id="L5624"><span class="ln">5624</span>        <b>return</b> <b>this</b>;
-</code><code id="L5625"><span class="ln">5625</span>    };
-</code><code id="L5626"><span class="ln">5626</span>    setproto.getBBox<span class="s"> = </span><b>function</b> () {
-</code><code id="L5627"><span class="ln">5627</span>        <b>var</b> x<span class="s"> = </span>[],
-</code><code id="L5628"><span class="ln">5628</span>            y<span class="s"> = </span>[],
-</code><code id="L5629"><span class="ln">5629</span>            w<span class="s"> = </span>[],
-</code><code id="L5630"><span class="ln">5630</span>            h<span class="s"> = </span>[];
-</code><code id="L5631"><span class="ln">5631</span>        <b>for</b> (<b>var</b> i<span class="s"> = </span><b>this</b>.items.length; i--;) <b>if</b> (!<b>this</b>.items[i].removed) {
-</code><code id="L5632"><span class="ln">5632</span>            <b>var</b> box<span class="s"> = </span><b>this</b>.items[i].getBBox();
-</code><code id="L5633"><span class="ln">5633</span>            x.push(box.x);
-</code><code id="L5634"><span class="ln">5634</span>            y.push(box.y);
-</code><code id="L5635"><span class="ln">5635</span>            w.push(box.x<span class="s"> + </span>box.width);
-</code><code id="L5636"><span class="ln">5636</span>            h.push(box.y<span class="s"> + </span>box.height);
-</code><code id="L5637"><span class="ln">5637</span>        }
-</code><code id="L5638"><span class="ln">5638</span>        x<span class="s"> = </span>mmin[apply](<span class="d">0</span>, x);
-</code><code id="L5639"><span class="ln">5639</span>        y<span class="s"> = </span>mmin[apply](<span class="d">0</span>, y);
-</code><code id="L5640"><span class="ln">5640</span>        <b>return</b> {
-</code><code id="L5641"><span class="ln">5641</span>            x: x,
-</code><code id="L5642"><span class="ln">5642</span>            y: y,
-</code><code id="L5643"><span class="ln">5643</span>            width: mmax[apply](<span class="d">0</span>, w)<span class="s"> - </span>x,
-</code><code id="L5644"><span class="ln">5644</span>            height: mmax[apply](<span class="d">0</span>, h)<span class="s"> - </span>y
-</code><code id="L5645"><span class="ln">5645</span>        };
-</code><code id="L5646"><span class="ln">5646</span>    };
-</code><code id="L5647"><span class="ln">5647</span>    setproto.clone<span class="s"> = </span><b>function</b> (s) {
-</code><code id="L5648"><span class="ln">5648</span>        s<span class="s"> = </span><b>new</b> Set;
-</code><code id="L5649"><span class="ln">5649</span>        <b>for</b> (<b>var</b> i<span class="s"> = </span><span class="d">0</span>, ii<span class="s"> = </span><b>this</b>.items.length; i &lt; ii; i++) {
-</code><code id="L5650"><span class="ln">5650</span>            s.push(<b>this</b>.items[i].clone());
-</code><code id="L5651"><span class="ln">5651</span>        }
-</code><code id="L5652"><span class="ln">5652</span>        <b>return</b> s;
-</code><code id="L5653"><span class="ln">5653</span>    };
-</code><code id="L5654"><span class="ln">5654</span>    setproto.toString<span class="s"> = </span><b>function</b> () {
-</code><code id="L5655"><span class="ln">5655</span>        <b>return</b> <i>"Rapha\xebl\u2018s set"</i>;
+</code><code id="L5533"><span class="ln">5533</span>    elproto.resume<span class="s"> = </span><b>function</b> (anim) {
+</code><code id="L5534"><span class="ln">5534</span>        <b>for</b> (<b>var</b> i<span class="s"> = </span><span class="d">0</span>; i &lt; animationElements.length; i++) <b>if</b> (animationElements[i].el.id<span class="s"> == </span><b>this</b>.id<span class="s"> &amp;&amp; </span>(!anim<span class="s"> || </span>animationElements[i].anim<span class="s"> == </span>anim)) {
+</code><code id="L5535"><span class="ln">5535</span>            <b>var</b> e<span class="s"> = </span>animationElements[i];
+</code><code id="L5536"><span class="ln">5536</span>            <b>if</b> (eve(<i>"anim.resume."</i><span class="s"> + </span><b>this</b>.id, <b>this</b>, e.anim) !== <b>false</b>) {
+</code><code id="L5537"><span class="ln">5537</span>                <b>delete</b> e.paused;
+</code><code id="L5538"><span class="ln">5538</span>                <b>this</b>.status(e.anim, e.status);
+</code><code id="L5539"><span class="ln">5539</span>            }
+</code><code id="L5540"><span class="ln">5540</span>        }
+</code><code id="L5541"><span class="ln">5541</span>        <b>return</b> <b>this</b>;
+</code><code id="L5542"><span class="ln">5542</span>    };
+</code><code id="L5543"><span class="ln">5543</span><span class="c">    <span class="c">/*\</span>
+</span></code><code id="L5544"><span class="ln">5544</span><span class="c">    <span class="s"> * </span>Element.stop
+</span></code><code id="L5545"><span class="ln">5545</span><span class="c">     [ method ]
+</span></code><code id="L5546"><span class="ln">5546</span><span class="c">     **
+</span></code><code id="L5547"><span class="ln">5547</span><span class="c">    <span class="s"> * </span>Stops animation of the element.
+</span></code><code id="L5548"><span class="ln">5548</span><span class="c">     **
+</span></code><code id="L5549"><span class="ln">5549</span><span class="c">     > Parameters
+</span></code><code id="L5550"><span class="ln">5550</span><span class="c">     **
+</span></code><code id="L5551"><span class="ln">5551</span><span class="c">    <span class="s"> - </span>anim (object) #optional animation object
+</span></code><code id="L5552"><span class="ln">5552</span><span class="c">     **
+</span></code><code id="L5553"><span class="ln">5553</span><span class="c">    <span class="s"> = </span>(object) original element
+</span></code><code id="L5554"><span class="ln">5554</span><span class="c">    \*/</span>
+</code><code id="L5555"><span class="ln">5555</span>    elproto.stop<span class="s"> = </span><b>function</b> (anim) {
+</code><code id="L5556"><span class="ln">5556</span>        <b>for</b> (<b>var</b> i<span class="s"> = </span><span class="d">0</span>; i &lt; animationElements.length; i++) <b>if</b> (animationElements[i].el.id<span class="s"> == </span><b>this</b>.id<span class="s"> &amp;&amp; </span>(!anim<span class="s"> || </span>animationElements[i].anim<span class="s"> == </span>anim)) {
+</code><code id="L5557"><span class="ln">5557</span>            <b>if</b> (eve(<i>"anim.stop."</i><span class="s"> + </span><b>this</b>.id, <b>this</b>, animationElements[i].anim) !== <b>false</b>) {
+</code><code id="L5558"><span class="ln">5558</span>                animationElements.splice(i--, <span class="d">1</span>);
+</code><code id="L5559"><span class="ln">5559</span>            }
+</code><code id="L5560"><span class="ln">5560</span>        }
+</code><code id="L5561"><span class="ln">5561</span>        <b>return</b> <b>this</b>;
+</code><code id="L5562"><span class="ln">5562</span>    };
+</code><code id="L5563"><span class="ln">5563</span>    elproto.toString<span class="s"> = </span><b>function</b> () {
+</code><code id="L5564"><span class="ln">5564</span>        <b>return</b> <i>"Rapha\xebl\u2019s object"</i>;
+</code><code id="L5565"><span class="ln">5565</span>    };
+</code><code id="L5566"><span class="ln">5566</span>
+</code><code id="L5567"><span class="ln">5567</span>    <span class="c">// Set</span>
+</code><code id="L5568"><span class="ln">5568</span>    <b>var</b> Set<span class="s"> = </span><b>function</b> (items) {
+</code><code id="L5569"><span class="ln">5569</span>        <b>this</b>.items<span class="s"> = </span>[];
+</code><code id="L5570"><span class="ln">5570</span>        <b>this</b>.length<span class="s"> = </span><span class="d">0</span>;
+</code><code id="L5571"><span class="ln">5571</span>        <b>this</b>.type<span class="s"> = </span><i>"set"</i>;
+</code><code id="L5572"><span class="ln">5572</span>        <b>if</b> (items) {
+</code><code id="L5573"><span class="ln">5573</span>            <b>for</b> (<b>var</b> i<span class="s"> = </span><span class="d">0</span>, ii<span class="s"> = </span>items.length; i &lt; ii; i++) {
+</code><code id="L5574"><span class="ln">5574</span>                <b>if</b> (items[i]<span class="s"> &amp;&amp; </span>(items[i].constructor<span class="s"> == </span>Element<span class="s"> || </span>items[i].constructor<span class="s"> == </span>Set)) {
+</code><code id="L5575"><span class="ln">5575</span>                    <b>this</b>[<b>this</b>.items.length]<span class="s"> = </span><b>this</b>.items[<b>this</b>.items.length]<span class="s"> = </span>items[i];
+</code><code id="L5576"><span class="ln">5576</span>                    <b>this</b>.length++;
+</code><code id="L5577"><span class="ln">5577</span>                }
+</code><code id="L5578"><span class="ln">5578</span>            }
+</code><code id="L5579"><span class="ln">5579</span>        }
+</code><code id="L5580"><span class="ln">5580</span>    },
+</code><code id="L5581"><span class="ln">5581</span>    setproto<span class="s"> = </span>Set.prototype;
+</code><code id="L5582"><span class="ln">5582</span><span class="c">    <span class="c">/*\</span>
+</span></code><code id="L5583"><span class="ln">5583</span><span class="c">    <span class="s"> * </span>Set.push
+</span></code><code id="L5584"><span class="ln">5584</span><span class="c">     [ method ]
+</span></code><code id="L5585"><span class="ln">5585</span><span class="c">     **
+</span></code><code id="L5586"><span class="ln">5586</span><span class="c">    <span class="s"> * </span>Adds each argument to the current set.
+</span></code><code id="L5587"><span class="ln">5587</span><span class="c">    <span class="s"> = </span>(object) original element
+</span></code><code id="L5588"><span class="ln">5588</span><span class="c">    \*/</span>
+</code><code id="L5589"><span class="ln">5589</span>    setproto.push<span class="s"> = </span><b>function</b> () {
+</code><code id="L5590"><span class="ln">5590</span>        <b>var</b> item,
+</code><code id="L5591"><span class="ln">5591</span>            len;
+</code><code id="L5592"><span class="ln">5592</span>        <b>for</b> (<b>var</b> i<span class="s"> = </span><span class="d">0</span>, ii<span class="s"> = </span>arguments.length; i &lt; ii; i++) {
+</code><code id="L5593"><span class="ln">5593</span>            item<span class="s"> = </span>arguments[i];
+</code><code id="L5594"><span class="ln">5594</span>            <b>if</b> (item<span class="s"> &amp;&amp; </span>(item.constructor<span class="s"> == </span>Element<span class="s"> || </span>item.constructor<span class="s"> == </span>Set)) {
+</code><code id="L5595"><span class="ln">5595</span>                len<span class="s"> = </span><b>this</b>.items.length;
+</code><code id="L5596"><span class="ln">5596</span>                <b>this</b>[len]<span class="s"> = </span><b>this</b>.items[len]<span class="s"> = </span>item;
+</code><code id="L5597"><span class="ln">5597</span>                <b>this</b>.length++;
+</code><code id="L5598"><span class="ln">5598</span>            }
+</code><code id="L5599"><span class="ln">5599</span>        }
+</code><code id="L5600"><span class="ln">5600</span>        <b>return</b> <b>this</b>;
+</code><code id="L5601"><span class="ln">5601</span>    };
+</code><code id="L5602"><span class="ln">5602</span><span class="c">    <span class="c">/*\</span>
+</span></code><code id="L5603"><span class="ln">5603</span><span class="c">    <span class="s"> * </span>Set.pop
+</span></code><code id="L5604"><span class="ln">5604</span><span class="c">     [ method ]
+</span></code><code id="L5605"><span class="ln">5605</span><span class="c">     **
+</span></code><code id="L5606"><span class="ln">5606</span><span class="c">    <span class="s"> * </span>Removes last element and returns it.
+</span></code><code id="L5607"><span class="ln">5607</span><span class="c">    <span class="s"> = </span>(object) element
+</span></code><code id="L5608"><span class="ln">5608</span><span class="c">    \*/</span>
+</code><code id="L5609"><span class="ln">5609</span>    setproto.pop<span class="s"> = </span><b>function</b> () {
+</code><code id="L5610"><span class="ln">5610</span>        <b>this</b>.length<span class="s"> &amp;&amp; </span><b>delete</b> <b>this</b>[<b>this</b>.length--];
+</code><code id="L5611"><span class="ln">5611</span>        <b>return</b> <b>this</b>.items.pop();
+</code><code id="L5612"><span class="ln">5612</span>    };
+</code><code id="L5613"><span class="ln">5613</span><span class="c">    <span class="c">/*\</span>
+</span></code><code id="L5614"><span class="ln">5614</span><span class="c">    <span class="s"> * </span>Set.forEach
+</span></code><code id="L5615"><span class="ln">5615</span><span class="c">     [ method ]
+</span></code><code id="L5616"><span class="ln">5616</span><span class="c">     **
+</span></code><code id="L5617"><span class="ln">5617</span><span class="c">    <span class="s"> * </span>Executes given <b>function</b> <b>for</b> each element <b>in</b> the set.
+</span></code><code id="L5618"><span class="ln">5618</span><span class="c">     *
+</span></code><code id="L5619"><span class="ln">5619</span><span class="c">    <span class="s"> * </span>If <b>function</b> returns `<b>false</b>` it will stop loop running.
+</span></code><code id="L5620"><span class="ln">5620</span><span class="c">     **
+</span></code><code id="L5621"><span class="ln">5621</span><span class="c">     > Parameters
+</span></code><code id="L5622"><span class="ln">5622</span><span class="c">     **
+</span></code><code id="L5623"><span class="ln">5623</span><span class="c">    <span class="s"> - </span>callback (<b>function</b>) <b>function</b> to run
+</span></code><code id="L5624"><span class="ln">5624</span><span class="c">    <span class="s"> - </span>thisArg (object) context object <b>for</b> the callback
+</span></code><code id="L5625"><span class="ln">5625</span><span class="c">    <span class="s"> = </span>(object) Set object
+</span></code><code id="L5626"><span class="ln">5626</span><span class="c">    \*/</span>
+</code><code id="L5627"><span class="ln">5627</span>    setproto.forEach<span class="s"> = </span><b>function</b> (callback, thisArg) {
+</code><code id="L5628"><span class="ln">5628</span>        <b>for</b> (<b>var</b> i<span class="s"> = </span><span class="d">0</span>, ii<span class="s"> = </span><b>this</b>.items.length; i &lt; ii; i++) {
+</code><code id="L5629"><span class="ln">5629</span>            <b>if</b> (callback.call(thisArg, <b>this</b>.items[i])<span class="s"> === </span><b>false</b>) {
+</code><code id="L5630"><span class="ln">5630</span>                <b>return</b> <b>this</b>;
+</code><code id="L5631"><span class="ln">5631</span>            }
+</code><code id="L5632"><span class="ln">5632</span>        }
+</code><code id="L5633"><span class="ln">5633</span>        <b>return</b> <b>this</b>;
+</code><code id="L5634"><span class="ln">5634</span>    };
+</code><code id="L5635"><span class="ln">5635</span>    <b>for</b> (<b>var</b> method <b>in</b> elproto) <b>if</b> (elproto[has](method)) {
+</code><code id="L5636"><span class="ln">5636</span>        setproto[method]<span class="s"> = </span>(<b>function</b> (methodname) {
+</code><code id="L5637"><span class="ln">5637</span>            <b>return</b> <b>function</b> () {
+</code><code id="L5638"><span class="ln">5638</span>                <b>var</b> arg<span class="s"> = </span>arguments;
+</code><code id="L5639"><span class="ln">5639</span>                <b>return</b> <b>this</b>.forEach(<b>function</b> (el) {
+</code><code id="L5640"><span class="ln">5640</span>                    el[methodname][apply](el, arg);
+</code><code id="L5641"><span class="ln">5641</span>                });
+</code><code id="L5642"><span class="ln">5642</span>            };
+</code><code id="L5643"><span class="ln">5643</span>        })(method);
+</code><code id="L5644"><span class="ln">5644</span>    }
+</code><code id="L5645"><span class="ln">5645</span>    setproto.attr<span class="s"> = </span><b>function</b> (name, value) {
+</code><code id="L5646"><span class="ln">5646</span>        <b>if</b> (name<span class="s"> &amp;&amp; </span>R.is(name, array)<span class="s"> &amp;&amp; </span>R.is(name[<span class="d">0</span>], <i>"object"</i>)) {
+</code><code id="L5647"><span class="ln">5647</span>            <b>for</b> (<b>var</b> j<span class="s"> = </span><span class="d">0</span>, jj<span class="s"> = </span>name.length; j &lt; jj; j++) {
+</code><code id="L5648"><span class="ln">5648</span>                <b>this</b>.items[j].attr(name[j]);
+</code><code id="L5649"><span class="ln">5649</span>            }
+</code><code id="L5650"><span class="ln">5650</span>        } <b>else</b> {
+</code><code id="L5651"><span class="ln">5651</span>            <b>for</b> (<b>var</b> i<span class="s"> = </span><span class="d">0</span>, ii<span class="s"> = </span><b>this</b>.items.length; i &lt; ii; i++) {
+</code><code id="L5652"><span class="ln">5652</span>                <b>this</b>.items[i].attr(name, value);
+</code><code id="L5653"><span class="ln">5653</span>            }
+</code><code id="L5654"><span class="ln">5654</span>        }
+</code><code id="L5655"><span class="ln">5655</span>        <b>return</b> <b>this</b>;
 </code><code id="L5656"><span class="ln">5656</span>    };
-</code><code id="L5657"><span class="ln">5657</span>
-</code><code id="L5658"><span class="ln">5658</span>    R.registerFont<span class="s"> = </span><b>function</b> (font) {
-</code><code id="L5659"><span class="ln">5659</span>        <b>if</b> (!font.face) {
-</code><code id="L5660"><span class="ln">5660</span>            <b>return</b> font;
-</code><code id="L5661"><span class="ln">5661</span>        }
-</code><code id="L5662"><span class="ln">5662</span>        <b>this</b>.fonts<span class="s"> = </span><b>this</b>.fonts<span class="s"> || </span>{};
-</code><code id="L5663"><span class="ln">5663</span>        <b>var</b> fontcopy<span class="s"> = </span>{
-</code><code id="L5664"><span class="ln">5664</span>                w: font.w,
-</code><code id="L5665"><span class="ln">5665</span>                face: {},
-</code><code id="L5666"><span class="ln">5666</span>                glyphs: {}
-</code><code id="L5667"><span class="ln">5667</span>            },
-</code><code id="L5668"><span class="ln">5668</span>            family<span class="s"> = </span>font.face[<i>"font-family"</i>];
-</code><code id="L5669"><span class="ln">5669</span>        <b>for</b> (<b>var</b> prop <b>in</b> font.face) <b>if</b> (font.face[has](prop)) {
-</code><code id="L5670"><span class="ln">5670</span>            fontcopy.face[prop]<span class="s"> = </span>font.face[prop];
-</code><code id="L5671"><span class="ln">5671</span>        }
-</code><code id="L5672"><span class="ln">5672</span>        <b>if</b> (<b>this</b>.fonts[family]) {
-</code><code id="L5673"><span class="ln">5673</span>            <b>this</b>.fonts[family].push(fontcopy);
-</code><code id="L5674"><span class="ln">5674</span>        } <b>else</b> {
-</code><code id="L5675"><span class="ln">5675</span>            <b>this</b>.fonts[family]<span class="s"> = </span>[fontcopy];
-</code><code id="L5676"><span class="ln">5676</span>        }
-</code><code id="L5677"><span class="ln">5677</span>        <b>if</b> (!font.svg) {
-</code><code id="L5678"><span class="ln">5678</span>            fontcopy.face[<i>"units-per-em"</i>]<span class="s"> = </span>toInt(font.face[<i>"units-per-em"</i>], <span class="d">10</span>);
-</code><code id="L5679"><span class="ln">5679</span>            <b>for</b> (<b>var</b> glyph <b>in</b> font.glyphs) <b>if</b> (font.glyphs[has](glyph)) {
-</code><code id="L5680"><span class="ln">5680</span>                <b>var</b> path<span class="s"> = </span>font.glyphs[glyph];
-</code><code id="L5681"><span class="ln">5681</span>                fontcopy.glyphs[glyph]<span class="s"> = </span>{
-</code><code id="L5682"><span class="ln">5682</span>                    w: path.w,
-</code><code id="L5683"><span class="ln">5683</span>                    k: {},
-</code><code id="L5684"><span class="ln">5684</span>                    d: path.d<span class="s"> &amp;&amp; </span><i>"M"</i><span class="s"> + </span>path.d.replace(/[mlcxtrv]/g, <b>function</b> (command) {
-</code><code id="L5685"><span class="ln">5685</span>                            <b>return</b> {l: <i>"L"</i>, c: <i>"C"</i>, x: <i>"z"</i>, t: <i>"m"</i>, r: <i>"l"</i>, v: <i>"c"</i>}[command]<span class="s"> || </span><i>"M"</i>;
-</code><code id="L5686"><span class="ln">5686</span>                        })<span class="s"> + </span><i>"z"</i>
-</code><code id="L5687"><span class="ln">5687</span>                };
-</code><code id="L5688"><span class="ln">5688</span>                <b>if</b> (path.k) {
-</code><code id="L5689"><span class="ln">5689</span>                    <b>for</b> (<b>var</b> k <b>in</b> path.k) <b>if</b> (path[has](k)) {
-</code><code id="L5690"><span class="ln">5690</span>                        fontcopy.glyphs[glyph].k[k]<span class="s"> = </span>path.k[k];
-</code><code id="L5691"><span class="ln">5691</span>                    }
-</code><code id="L5692"><span class="ln">5692</span>                }
-</code><code id="L5693"><span class="ln">5693</span>            }
-</code><code id="L5694"><span class="ln">5694</span>        }
-</code><code id="L5695"><span class="ln">5695</span>        <b>return</b> font;
-</code><code id="L5696"><span class="ln">5696</span>    };
-</code><code id="L5697"><span class="ln">5697</span>    paperproto.getFont<span class="s"> = </span><b>function</b> (family, weight, style, stretch) {
-</code><code id="L5698"><span class="ln">5698</span>        stretch<span class="s"> = </span>stretch<span class="s"> || </span><i>"normal"</i>;
-</code><code id="L5699"><span class="ln">5699</span>        style<span class="s"> = </span>style<span class="s"> || </span><i>"normal"</i>;
-</code><code id="L5700"><span class="ln">5700</span>        weight<span class="s"> = </span>+weight<span class="s"> || </span>{normal: <span class="d">400</span>, bold: <span class="d">700</span>, lighter: <span class="d">300</span>, bolder: <span class="d">800</span>}[weight]<span class="s"> || </span><span class="d">400</span>;
-</code><code id="L5701"><span class="ln">5701</span>        <b>if</b> (!R.fonts) {
-</code><code id="L5702"><span class="ln">5702</span>            <b>return</b>;
-</code><code id="L5703"><span class="ln">5703</span>        }
-</code><code id="L5704"><span class="ln">5704</span>        <b>var</b> font<span class="s"> = </span>R.fonts[family];
-</code><code id="L5705"><span class="ln">5705</span>        <b>if</b> (!font) {
-</code><code id="L5706"><span class="ln">5706</span>            <b>var</b> name<span class="s"> = </span><b>new</b> RegExp(<i>"(^|\\s)"</i><span class="s"> + </span>family.replace(/[^\w\d\s+!~.:_-]/g, E)<span class="s"> + </span><i>"(\\s|$)"</i>, <i>"i"</i>);
-</code><code id="L5707"><span class="ln">5707</span>            <b>for</b> (<b>var</b> fontName <b>in</b> R.fonts) <b>if</b> (R.fonts[has](fontName)) {
-</code><code id="L5708"><span class="ln">5708</span>                <b>if</b> (name.test(fontName)) {
-</code><code id="L5709"><span class="ln">5709</span>                    font<span class="s"> = </span>R.fonts[fontName];
-</code><code id="L5710"><span class="ln">5710</span>                    <b>break</b>;
-</code><code id="L5711"><span class="ln">5711</span>                }
-</code><code id="L5712"><span class="ln">5712</span>            }
-</code><code id="L5713"><span class="ln">5713</span>        }
-</code><code id="L5714"><span class="ln">5714</span>        <b>var</b> thefont;
-</code><code id="L5715"><span class="ln">5715</span>        <b>if</b> (font) {
-</code><code id="L5716"><span class="ln">5716</span>            <b>for</b> (<b>var</b> i<span class="s"> = </span><span class="d">0</span>, ii<span class="s"> = </span>font.length; i &lt; ii; i++) {
-</code><code id="L5717"><span class="ln">5717</span>                thefont<span class="s"> = </span>font[i];
-</code><code id="L5718"><span class="ln">5718</span>                <b>if</b> (thefont.face[<i>"font-weight"</i>]<span class="s"> == </span>weight<span class="s"> &amp;&amp; </span>(thefont.face[<i>"font-style"</i>]<span class="s"> == </span>style<span class="s"> || </span>!thefont.face[<i>"font-style"</i>])<span class="s"> &amp;&amp; </span>thefont.face[<i>"font-stretch"</i>]<span class="s"> == </span>stretch) {
-</code><code id="L5719"><span class="ln">5719</span>                    <b>break</b>;
-</code><code id="L5720"><span class="ln">5720</span>                }
-</code><code id="L5721"><span class="ln">5721</span>            }
-</code><code id="L5722"><span class="ln">5722</span>        }
-</code><code id="L5723"><span class="ln">5723</span>        <b>return</b> thefont;
-</code><code id="L5724"><span class="ln">5724</span>    };
-</code><code id="L5725"><span class="ln">5725</span>    paperproto.print<span class="s"> = </span><b>function</b> (x, y, string, font, size, origin, letter_spacing) {
-</code><code id="L5726"><span class="ln">5726</span>        origin<span class="s"> = </span>origin<span class="s"> || </span><i>"middle"</i>; <span class="c">// baseline|middle</span>
-</code><code id="L5727"><span class="ln">5727</span>        letter_spacing<span class="s"> = </span>mmax(mmin(letter_spacing<span class="s"> || </span><span class="d">0</span>, <span class="d">1</span>), -<span class="d">1</span>);
-</code><code id="L5728"><span class="ln">5728</span>        <b>var</b> out<span class="s"> = </span><b>this</b>.set(),
-</code><code id="L5729"><span class="ln">5729</span>            letters<span class="s"> = </span>Str(string).split(E),
-</code><code id="L5730"><span class="ln">5730</span>            shift<span class="s"> = </span><span class="d">0</span>,
-</code><code id="L5731"><span class="ln">5731</span>            path<span class="s"> = </span>E,
-</code><code id="L5732"><span class="ln">5732</span>            scale;
-</code><code id="L5733"><span class="ln">5733</span>        R.is(font, string)<span class="s"> &amp;&amp; </span>(font<span class="s"> = </span><b>this</b>.getFont(font));
-</code><code id="L5734"><span class="ln">5734</span>        <b>if</b> (font) {
-</code><code id="L5735"><span class="ln">5735</span>            scale<span class="s"> = </span>(size<span class="s"> || </span><span class="d">16</span>)<span class="s"> / </span>font.face[<i>"units-per-em"</i>];
-</code><code id="L5736"><span class="ln">5736</span>            <b>var</b> bb<span class="s"> = </span>font.face.bbox.split(separator),
-</code><code id="L5737"><span class="ln">5737</span>                top<span class="s"> = </span>+bb[<span class="d">0</span>],
-</code><code id="L5738"><span class="ln">5738</span>                height<span class="s"> = </span>+bb[<span class="d">1</span>]<span class="s"> + </span>(origin<span class="s"> == </span><i>"baseline"</i> ? bb[<span class="d">3</span>]<span class="s"> - </span>bb[<span class="d">1</span>]<span class="s"> + </span>(+font.face.descent) : (bb[<span class="d">3</span>]<span class="s"> - </span>bb[<span class="d">1</span>])<span class="s"> / </span><span class="d">2</span>);
-</code><code id="L5739"><span class="ln">5739</span>            <b>for</b> (<b>var</b> i<span class="s"> = </span><span class="d">0</span>, ii<span class="s"> = </span>letters.length; i &lt; ii; i++) {
-</code><code id="L5740"><span class="ln">5740</span>                <b>var</b> prev<span class="s"> = </span>i<span class="s"> &amp;&amp; </span>font.glyphs[letters[i<span class="s"> - </span><span class="d">1</span>]]<span class="s"> || </span>{},
-</code><code id="L5741"><span class="ln">5741</span>                    curr<span class="s"> = </span>font.glyphs[letters[i]];
-</code><code id="L5742"><span class="ln">5742</span>                shift += i ? (prev.w<span class="s"> || </span>font.w)<span class="s"> + </span>(prev.k<span class="s"> &amp;&amp; </span>prev.k[letters[i]]<span class="s"> || </span><span class="d">0</span>)<span class="s"> + </span>(font.w<span class="s"> * </span>letter_spacing) : <span class="d">0</span>;
-</code><code id="L5743"><span class="ln">5743</span>                curr<span class="s"> &amp;&amp; </span>curr.d<span class="s"> &amp;&amp; </span>out.push(<b>this</b>.path(curr.d).attr({fill: <i>"#<span class="d">000</span>"</i>, stroke: <i>"none"</i>, transform: [[<i>"t"</i>, shift, <span class="d">0</span>]]}));
-</code><code id="L5744"><span class="ln">5744</span>            }
-</code><code id="L5745"><span class="ln">5745</span>            out.scale(scale, scale, top, height).translate(x<span class="s"> - </span>top, y<span class="s"> - </span>height);
-</code><code id="L5746"><span class="ln">5746</span>        }
-</code><code id="L5747"><span class="ln">5747</span>        <b>return</b> out;
-</code><code id="L5748"><span class="ln">5748</span>    };
-</code><code id="L5749"><span class="ln">5749</span>
-</code><code id="L5750"><span class="ln">5750</span>    R.format<span class="s"> = </span><b>function</b> (token, params) {
-</code><code id="L5751"><span class="ln">5751</span>        <b>var</b> args<span class="s"> = </span>R.is(params, array) ? [<span class="d">0</span>][concat](params) : arguments;
-</code><code id="L5752"><span class="ln">5752</span>        token<span class="s"> &amp;&amp; </span>R.is(token, string)<span class="s"> &amp;&amp; </span>args.length<span class="s"> - </span><span class="d">1</span><span class="s"> &amp;&amp; </span>(token<span class="s"> = </span>token.replace(formatrg, <b>function</b> (str, i) {
-</code><code id="L5753"><span class="ln">5753</span>            <b>return</b> args[++i]<span class="s"> == </span><b>null</b> ? E : args[i];
-</code><code id="L5754"><span class="ln">5754</span>        }));
-</code><code id="L5755"><span class="ln">5755</span>        <b>return</b> token<span class="s"> || </span>E;
-</code><code id="L5756"><span class="ln">5756</span>    };
-</code><code id="L5757"><span class="ln">5757</span>    R.ninja<span class="s"> = </span><b>function</b> () {
-</code><code id="L5758"><span class="ln">5758</span>        oldRaphael.was ? (g.win.Raphael<span class="s"> = </span>oldRaphael.is) : <b>delete</b> Raphael;
-</code><code id="L5759"><span class="ln">5759</span>        <b>return</b> R;
-</code><code id="L5760"><span class="ln">5760</span>    };
-</code><code id="L5761"><span class="ln">5761</span><span class="c">    <span class="c">/*\</span>
-</span></code><code id="L5762"><span class="ln">5762</span><span class="c">    <span class="s"> * </span>Raphael.el
-</span></code><code id="L5763"><span class="ln">5763</span><span class="c">     [ property (object) ]
-</span></code><code id="L5764"><span class="ln">5764</span><span class="c">     **
-</span></code><code id="L5765"><span class="ln">5765</span><span class="c">    <span class="s"> * </span>You can add your own method to elements. This is usefull when you want to hack <b>default</b> functionality or
-</span></code><code id="L5766"><span class="ln">5766</span><span class="c">    <span class="s"> * </span>want to wrap some common transformation or attributes <b>in</b> one method. In difference to canvas methods,
-</span></code><code id="L5767"><span class="ln">5767</span><span class="c">    <span class="s"> * </span>you can redefine element method at any time. Expending element methods wouldn’t affect set.
-</span></code><code id="L5768"><span class="ln">5768</span><span class="c">     > Usage
-</span></code><code id="L5769"><span class="ln">5769</span><span class="c">    <span class="s"> | </span>Raphael.el.red<span class="s"> = </span><b>function</b> () {
-</span></code><code id="L5770"><span class="ln">5770</span><span class="c">    <span class="s"> | </span>    <b>this</b>.attr({fill: <i>"#f00"</i>});
-</span></code><code id="L5771"><span class="ln">5771</span><span class="c">    <span class="s"> | </span>};
-</span></code><code id="L5772"><span class="ln">5772</span><span class="c">    <span class="s"> | </span><span class="c">// then use it</span>
-</span></code><code id="L5773"><span class="ln">5773</span><span class="c">    <span class="s"> | </span>paper.circle(<span class="d">100</span>, <span class="d">100</span>, <span class="d">20</span>).red();
-</span></code><code id="L5774"><span class="ln">5774</span><span class="c">    \*/</span>
-</code><code id="L5775"><span class="ln">5775</span>    R.el<span class="s"> = </span>elproto;
-</code><code id="L5776"><span class="ln">5776</span>    R.st<span class="s"> = </span>setproto;
-</code><code id="L5777"><span class="ln">5777</span>    <span class="c">// Firefox &lt;<span class="d">3.6</span> fix: http://webreflection.blogspot.com/<span class="d">2009</span>/<span class="d">11</span>/<span class="d">195</span>-chars-to-help-lazy-loading.html</span>
-</code><code id="L5778"><span class="ln">5778</span>    (<b>function</b> (doc, loaded, f) {
-</code><code id="L5779"><span class="ln">5779</span>        <b>if</b> (doc.readyState<span class="s"> == </span><b>null</b><span class="s"> &amp;&amp; </span>doc.addEventListener){
-</code><code id="L5780"><span class="ln">5780</span>            doc.addEventListener(loaded, f<span class="s"> = </span><b>function</b> () {
-</code><code id="L5781"><span class="ln">5781</span>                doc.removeEventListener(loaded, f, <b>false</b>);
-</code><code id="L5782"><span class="ln">5782</span>                doc.readyState<span class="s"> = </span><i>"complete"</i>;
-</code><code id="L5783"><span class="ln">5783</span>            }, <b>false</b>);
-</code><code id="L5784"><span class="ln">5784</span>            doc.readyState<span class="s"> = </span><i>"loading"</i>;
-</code><code id="L5785"><span class="ln">5785</span>        }
-</code><code id="L5786"><span class="ln">5786</span>        <b>function</b> isLoaded() {
-</code><code id="L5787"><span class="ln">5787</span>            (/<b>in</b>/).test(doc.readyState) ? setTimeout(isLoaded, <span class="d">9</span>) : eve(<i>"DOMload"</i>);
-</code><code id="L5788"><span class="ln">5788</span>        }
-</code><code id="L5789"><span class="ln">5789</span>        isLoaded();
-</code><code id="L5790"><span class="ln">5790</span>    })(document, <i>"DOMContentLoaded"</i>);
-</code><code id="L5791"><span class="ln">5791</span>
-</code><code id="L5792"><span class="ln">5792</span>    oldRaphael.was ? (g.win.Raphael<span class="s"> = </span>R) : (Raphael<span class="s"> = </span>R);
-</code><code id="L5793"><span class="ln">5793</span>
-</code><code id="L5794"><span class="ln">5794</span><span class="c">    /*
-</span></code><code id="L5795"><span class="ln">5795</span><span class="c">    <span class="s"> * </span>Eve <span class="d">0.2</span><span class="d">.1</span><span class="s"> - </span>JavaScript Events Library
-</span></code><code id="L5796"><span class="ln">5796</span><span class="c">     *
-</span></code><code id="L5797"><span class="ln">5797</span><span class="c">    <span class="s"> * </span>Copyright (c) <span class="d">2010</span> Dmitry Baranovskiy (http:<span class="c">//dmitry.baranovskiy.com/)</span>
-</span></code><code id="L5798"><span class="ln">5798</span><span class="c">    <span class="s"> * </span>Licensed under the MIT (http:<span class="c">//www.opensource.org/licenses/mit-license.php) license.</span>
-</span></code><code id="L5799"><span class="ln">5799</span><span class="c">     */</span>
-</code><code id="L5800"><span class="ln">5800</span>
-</code><code id="L5801"><span class="ln">5801</span>    <b>var</b> eve<span class="s"> = </span>R.eve<span class="s"> = </span>(<b>function</b> () {
-</code><code id="L5802"><span class="ln">5802</span>        <b>var</b> version<span class="s"> = </span><i>"<span class="d">0.2</span><span class="d">.1</span>"</i>,
-</code><code id="L5803"><span class="ln">5803</span>            has<span class="s"> = </span><i>"hasOwnProperty"</i>,
-</code><code id="L5804"><span class="ln">5804</span>            separator<span class="s"> = </span>/[\.\/]/,
-</code><code id="L5805"><span class="ln">5805</span>            wildcard<span class="s"> = </span><i>"*"</i>,
-</code><code id="L5806"><span class="ln">5806</span>            events<span class="s"> = </span>{n: {}},
-</code><code id="L5807"><span class="ln">5807</span>            eve<span class="s"> = </span><b>function</b> (name, scope) {
-</code><code id="L5808"><span class="ln">5808</span>                <b>var</b> e<span class="s"> = </span>events,
-</code><code id="L5809"><span class="ln">5809</span>                    args<span class="s"> = </span>Array.prototype.slice.call(arguments, <span class="d">2</span>),
-</code><code id="L5810"><span class="ln">5810</span>                    listeners<span class="s"> = </span>eve.listeners(name),
-</code><code id="L5811"><span class="ln">5811</span>                    errors<span class="s"> = </span>[];
-</code><code id="L5812"><span class="ln">5812</span>                <b>for</b> (<b>var</b> i<span class="s"> = </span><span class="d">0</span>, ii<span class="s"> = </span>listeners.length; i &lt; ii; i++) {
-</code><code id="L5813"><span class="ln">5813</span>                    <b>try</b> {
-</code><code id="L5814"><span class="ln">5814</span>                        listeners[i].apply(scope, args);
-</code><code id="L5815"><span class="ln">5815</span>                    } <b>catch</b> (ex) {
-</code><code id="L5816"><span class="ln">5816</span>                        errors.push({error: ex<span class="s"> &amp;&amp; </span>ex.message<span class="s"> || </span>ex, func: listeners[i]});
-</code><code id="L5817"><span class="ln">5817</span>                    }
-</code><code id="L5818"><span class="ln">5818</span>                }
-</code><code id="L5819"><span class="ln">5819</span>                <b>if</b> (errors.length) {
-</code><code id="L5820"><span class="ln">5820</span>                    <b>return</b> errors;
-</code><code id="L5821"><span class="ln">5821</span>                }
-</code><code id="L5822"><span class="ln">5822</span>            };
-</code><code id="L5823"><span class="ln">5823</span>        eve.listeners<span class="s"> = </span><b>function</b> (name) {
-</code><code id="L5824"><span class="ln">5824</span>            <b>var</b> names<span class="s"> = </span>name.split(separator),
-</code><code id="L5825"><span class="ln">5825</span>                e<span class="s"> = </span>events,
-</code><code id="L5826"><span class="ln">5826</span>                item,
-</code><code id="L5827"><span class="ln">5827</span>                items,
-</code><code id="L5828"><span class="ln">5828</span>                k,
-</code><code id="L5829"><span class="ln">5829</span>                i,
-</code><code id="L5830"><span class="ln">5830</span>                ii,
-</code><code id="L5831"><span class="ln">5831</span>                j,
-</code><code id="L5832"><span class="ln">5832</span>                jj,
-</code><code id="L5833"><span class="ln">5833</span>                nes,
-</code><code id="L5834"><span class="ln">5834</span>                es<span class="s"> = </span>[e],
-</code><code id="L5835"><span class="ln">5835</span>                out<span class="s"> = </span>[];
-</code><code id="L5836"><span class="ln">5836</span>            <b>for</b> (i<span class="s"> = </span><span class="d">0</span>, ii<span class="s"> = </span>names.length; i &lt; ii; i++) {
-</code><code id="L5837"><span class="ln">5837</span>                nes<span class="s"> = </span>[];
-</code><code id="L5838"><span class="ln">5838</span>                <b>for</b> (j<span class="s"> = </span><span class="d">0</span>, jj<span class="s"> = </span>es.length; j &lt; jj; j++) {
-</code><code id="L5839"><span class="ln">5839</span>                    e<span class="s"> = </span>es[j].n;
-</code><code id="L5840"><span class="ln">5840</span>                    items<span class="s"> = </span>[e[names[i]], e[wildcard]];
-</code><code id="L5841"><span class="ln">5841</span>                    k<span class="s"> = </span><span class="d">2</span>;
-</code><code id="L5842"><span class="ln">5842</span>                    <b>while</b> (k--) {
-</code><code id="L5843"><span class="ln">5843</span>                        item<span class="s"> = </span>items[k];
-</code><code id="L5844"><span class="ln">5844</span>                        <b>if</b> (item) {
-</code><code id="L5845"><span class="ln">5845</span>                            nes.push(item);
-</code><code id="L5846"><span class="ln">5846</span>                            out<span class="s"> = </span>out.concat(item.f<span class="s"> || </span>[]);
-</code><code id="L5847"><span class="ln">5847</span>                        }
-</code><code id="L5848"><span class="ln">5848</span>                    }
-</code><code id="L5849"><span class="ln">5849</span>                }
-</code><code id="L5850"><span class="ln">5850</span>                es<span class="s"> = </span>nes;
-</code><code id="L5851"><span class="ln">5851</span>            }
-</code><code id="L5852"><span class="ln">5852</span>            <b>return</b> out;
-</code><code id="L5853"><span class="ln">5853</span>        };
-</code><code id="L5854"><span class="ln">5854</span>        eve.on<span class="s"> = </span><b>function</b> (name, f) {
-</code><code id="L5855"><span class="ln">5855</span>            <b>var</b> names<span class="s"> = </span>name.split(separator),
-</code><code id="L5856"><span class="ln">5856</span>                e<span class="s"> = </span>events;
-</code><code id="L5857"><span class="ln">5857</span>            <b>for</b> (<b>var</b> i<span class="s"> = </span><span class="d">0</span>, ii<span class="s"> = </span>names.length; i &lt; ii; i++) {
-</code><code id="L5858"><span class="ln">5858</span>                e<span class="s"> = </span>e.n;
-</code><code id="L5859"><span class="ln">5859</span>                !e[names[i]]<span class="s"> &amp;&amp; </span>(e[names[i]]<span class="s"> = </span>{n: {}});
-</code><code id="L5860"><span class="ln">5860</span>                e<span class="s"> = </span>e[names[i]];
-</code><code id="L5861"><span class="ln">5861</span>            }
-</code><code id="L5862"><span class="ln">5862</span>            e.f<span class="s"> = </span>e.f<span class="s"> || </span>[];
-</code><code id="L5863"><span class="ln">5863</span>            <b>for</b> (i<span class="s"> = </span><span class="d">0</span>, ii<span class="s"> = </span>e.f.length; i &lt; ii; i++) <b>if</b> (e.f[i]<span class="s"> == </span>f) {
-</code><code id="L5864"><span class="ln">5864</span>                <b>return</b> <b>false</b>;
-</code><code id="L5865"><span class="ln">5865</span>            }
-</code><code id="L5866"><span class="ln">5866</span>            e.f.push(f);
-</code><code id="L5867"><span class="ln">5867</span>        };
-</code><code id="L5868"><span class="ln">5868</span>        eve.unbind<span class="s"> = </span><b>function</b> (name, f) {
-</code><code id="L5869"><span class="ln">5869</span>            <b>var</b> names<span class="s"> = </span>name.split(separator),
-</code><code id="L5870"><span class="ln">5870</span>                e,
-</code><code id="L5871"><span class="ln">5871</span>                key,
-</code><code id="L5872"><span class="ln">5872</span>                splice,
-</code><code id="L5873"><span class="ln">5873</span>                cur<span class="s"> = </span>[events];
-</code><code id="L5874"><span class="ln">5874</span>            <b>for</b> (<b>var</b> i<span class="s"> = </span><span class="d">0</span>, ii<span class="s"> = </span>names.length; i &lt; ii; i++) {
-</code><code id="L5875"><span class="ln">5875</span>                <b>for</b> (<b>var</b> j<span class="s"> = </span><span class="d">0</span>; j &lt; cur.length; j += splice.length<span class="s"> - </span><span class="d">2</span>) {
-</code><code id="L5876"><span class="ln">5876</span>                    splice<span class="s"> = </span>[j, <span class="d">1</span>];
-</code><code id="L5877"><span class="ln">5877</span>                    e<span class="s"> = </span>cur[j].n;
-</code><code id="L5878"><span class="ln">5878</span>                    <b>if</b> (names[i] != wildcard) {
-</code><code id="L5879"><span class="ln">5879</span>                        <b>if</b> (e[names[i]]) {
-</code><code id="L5880"><span class="ln">5880</span>                            splice.push(e[names[i]]);
-</code><code id="L5881"><span class="ln">5881</span>                        }
-</code><code id="L5882"><span class="ln">5882</span>                    } <b>else</b> {
-</code><code id="L5883"><span class="ln">5883</span>                        <b>for</b> (key <b>in</b> e) <b>if</b> (e[has](key)) {
-</code><code id="L5884"><span class="ln">5884</span>                            splice.push(e[key]);
-</code><code id="L5885"><span class="ln">5885</span>                        }
-</code><code id="L5886"><span class="ln">5886</span>                    }
-</code><code id="L5887"><span class="ln">5887</span>                    cur.splice.apply(cur, splice);
-</code><code id="L5888"><span class="ln">5888</span>                }
-</code><code id="L5889"><span class="ln">5889</span>            }
-</code><code id="L5890"><span class="ln">5890</span>            <b>for</b> (i<span class="s"> = </span><span class="d">0</span>, ii<span class="s"> = </span>cur.length; i &lt; ii; i++) {
-</code><code id="L5891"><span class="ln">5891</span>                e<span class="s"> = </span>cur[i];
-</code><code id="L5892"><span class="ln">5892</span>                <b>while</b> (e.n) {
-</code><code id="L5893"><span class="ln">5893</span>                    <b>if</b> (f) {
-</code><code id="L5894"><span class="ln">5894</span>                        <b>if</b> (e.f) {
-</code><code id="L5895"><span class="ln">5895</span>                            <b>for</b> (i<span class="s"> = </span><span class="d">0</span>, ii<span class="s"> = </span>e.f.length; i &lt; ii; i++) <b>if</b> (e.f[i]<span class="s"> == </span>f) {
-</code><code id="L5896"><span class="ln">5896</span>                                e.f.splice(i, <span class="d">1</span>);
-</code><code id="L5897"><span class="ln">5897</span>                                <b>break</b>;
-</code><code id="L5898"><span class="ln">5898</span>                            }
-</code><code id="L5899"><span class="ln">5899</span>                            !e.f.length<span class="s"> &amp;&amp; </span><b>delete</b> e.f;
-</code><code id="L5900"><span class="ln">5900</span>                        }
-</code><code id="L5901"><span class="ln">5901</span>                        <b>for</b> (key <b>in</b> e.n) <b>if</b> (e.n[has](key)<span class="s"> &amp;&amp; </span>e.n[key].f) {
-</code><code id="L5902"><span class="ln">5902</span>                            <b>var</b> funcs<span class="s"> = </span>e.n[key].f;
-</code><code id="L5903"><span class="ln">5903</span>                            <b>for</b> (i<span class="s"> = </span><span class="d">0</span>, ii<span class="s"> = </span>funcs.length; i &lt; ii; i++) <b>if</b> (funcs[i]<span class="s"> == </span>f) {
-</code><code id="L5904"><span class="ln">5904</span>                                funcs.splice(i, <span class="d">1</span>);
-</code><code id="L5905"><span class="ln">5905</span>                                <b>break</b>;
-</code><code id="L5906"><span class="ln">5906</span>                            }
-</code><code id="L5907"><span class="ln">5907</span>                            !funcs.length<span class="s"> &amp;&amp; </span><b>delete</b> e.n[key].f;
-</code><code id="L5908"><span class="ln">5908</span>                        }
-</code><code id="L5909"><span class="ln">5909</span>                    } <b>else</b> {
-</code><code id="L5910"><span class="ln">5910</span>                        <b>delete</b> e.f;
-</code><code id="L5911"><span class="ln">5911</span>                        <b>for</b> (key <b>in</b> e.n) <b>if</b> (e.n[has](key)<span class="s"> &amp;&amp; </span>e.n[key].f) {
-</code><code id="L5912"><span class="ln">5912</span>                            <b>delete</b> e.n[key].f;
-</code><code id="L5913"><span class="ln">5913</span>                        }
-</code><code id="L5914"><span class="ln">5914</span>                    }
-</code><code id="L5915"><span class="ln">5915</span>                    e<span class="s"> = </span>e.n;
-</code><code id="L5916"><span class="ln">5916</span>                }
+</code><code id="L5657"><span class="ln">5657</span>    setproto.animate<span class="s"> = </span><b>function</b> (params, ms, easing, callback) {
+</code><code id="L5658"><span class="ln">5658</span>        (R.is(easing, <i>"<b>function</b>"</i>)<span class="s"> || </span>!easing)<span class="s"> &amp;&amp; </span>(callback<span class="s"> = </span>easing<span class="s"> || </span><b>null</b>);
+</code><code id="L5659"><span class="ln">5659</span>        <b>var</b> len<span class="s"> = </span><b>this</b>.items.length,
+</code><code id="L5660"><span class="ln">5660</span>            i<span class="s"> = </span>len,
+</code><code id="L5661"><span class="ln">5661</span>            item,
+</code><code id="L5662"><span class="ln">5662</span>            set<span class="s"> = </span><b>this</b>,
+</code><code id="L5663"><span class="ln">5663</span>            collector;
+</code><code id="L5664"><span class="ln">5664</span>        callback<span class="s"> &amp;&amp; </span>(collector<span class="s"> = </span><b>function</b> () {
+</code><code id="L5665"><span class="ln">5665</span>            !--len<span class="s"> &amp;&amp; </span>callback.call(set);
+</code><code id="L5666"><span class="ln">5666</span>        });
+</code><code id="L5667"><span class="ln">5667</span>        easing<span class="s"> = </span>R.is(easing, string) ? easing : collector;
+</code><code id="L5668"><span class="ln">5668</span>        <b>var</b> anim<span class="s"> = </span>params <b>instanceof</b> Animation ? params : R.animation(params, ms, easing, collector);
+</code><code id="L5669"><span class="ln">5669</span>        item<span class="s"> = </span><b>this</b>.items[--i].animate(anim);
+</code><code id="L5670"><span class="ln">5670</span>        <b>while</b> (i--) {
+</code><code id="L5671"><span class="ln">5671</span>            <b>this</b>.items[i]<span class="s"> &amp;&amp; </span>!<b>this</b>.items[i].removed<span class="s"> &amp;&amp; </span><b>this</b>.items[i].animateWith(item, anim);
+</code><code id="L5672"><span class="ln">5672</span>        }
+</code><code id="L5673"><span class="ln">5673</span>        <b>return</b> <b>this</b>;
+</code><code id="L5674"><span class="ln">5674</span>    };
+</code><code id="L5675"><span class="ln">5675</span>    setproto.insertAfter<span class="s"> = </span><b>function</b> (el) {
+</code><code id="L5676"><span class="ln">5676</span>        <b>var</b> i<span class="s"> = </span><b>this</b>.items.length;
+</code><code id="L5677"><span class="ln">5677</span>        <b>while</b> (i--) {
+</code><code id="L5678"><span class="ln">5678</span>            <b>this</b>.items[i].insertAfter(el);
+</code><code id="L5679"><span class="ln">5679</span>        }
+</code><code id="L5680"><span class="ln">5680</span>        <b>return</b> <b>this</b>;
+</code><code id="L5681"><span class="ln">5681</span>    };
+</code><code id="L5682"><span class="ln">5682</span>    setproto.getBBox<span class="s"> = </span><b>function</b> () {
+</code><code id="L5683"><span class="ln">5683</span>        <b>var</b> x<span class="s"> = </span>[],
+</code><code id="L5684"><span class="ln">5684</span>            y<span class="s"> = </span>[],
+</code><code id="L5685"><span class="ln">5685</span>            w<span class="s"> = </span>[],
+</code><code id="L5686"><span class="ln">5686</span>            h<span class="s"> = </span>[];
+</code><code id="L5687"><span class="ln">5687</span>        <b>for</b> (<b>var</b> i<span class="s"> = </span><b>this</b>.items.length; i--;) <b>if</b> (!<b>this</b>.items[i].removed) {
+</code><code id="L5688"><span class="ln">5688</span>            <b>var</b> box<span class="s"> = </span><b>this</b>.items[i].getBBox();
+</code><code id="L5689"><span class="ln">5689</span>            x.push(box.x);
+</code><code id="L5690"><span class="ln">5690</span>            y.push(box.y);
+</code><code id="L5691"><span class="ln">5691</span>            w.push(box.x<span class="s"> + </span>box.width);
+</code><code id="L5692"><span class="ln">5692</span>            h.push(box.y<span class="s"> + </span>box.height);
+</code><code id="L5693"><span class="ln">5693</span>        }
+</code><code id="L5694"><span class="ln">5694</span>        x<span class="s"> = </span>mmin[apply](<span class="d">0</span>, x);
+</code><code id="L5695"><span class="ln">5695</span>        y<span class="s"> = </span>mmin[apply](<span class="d">0</span>, y);
+</code><code id="L5696"><span class="ln">5696</span>        <b>return</b> {
+</code><code id="L5697"><span class="ln">5697</span>            x: x,
+</code><code id="L5698"><span class="ln">5698</span>            y: y,
+</code><code id="L5699"><span class="ln">5699</span>            width: mmax[apply](<span class="d">0</span>, w)<span class="s"> - </span>x,
+</code><code id="L5700"><span class="ln">5700</span>            height: mmax[apply](<span class="d">0</span>, h)<span class="s"> - </span>y
+</code><code id="L5701"><span class="ln">5701</span>        };
+</code><code id="L5702"><span class="ln">5702</span>    };
+</code><code id="L5703"><span class="ln">5703</span>    setproto.clone<span class="s"> = </span><b>function</b> (s) {
+</code><code id="L5704"><span class="ln">5704</span>        s<span class="s"> = </span><b>new</b> Set;
+</code><code id="L5705"><span class="ln">5705</span>        <b>for</b> (<b>var</b> i<span class="s"> = </span><span class="d">0</span>, ii<span class="s"> = </span><b>this</b>.items.length; i &lt; ii; i++) {
+</code><code id="L5706"><span class="ln">5706</span>            s.push(<b>this</b>.items[i].clone());
+</code><code id="L5707"><span class="ln">5707</span>        }
+</code><code id="L5708"><span class="ln">5708</span>        <b>return</b> s;
+</code><code id="L5709"><span class="ln">5709</span>    };
+</code><code id="L5710"><span class="ln">5710</span>    setproto.toString<span class="s"> = </span><b>function</b> () {
+</code><code id="L5711"><span class="ln">5711</span>        <b>return</b> <i>"Rapha\xebl\u2018s set"</i>;
+</code><code id="L5712"><span class="ln">5712</span>    };
+</code><code id="L5713"><span class="ln">5713</span>
+</code><code id="L5714"><span class="ln">5714</span>    R.registerFont<span class="s"> = </span><b>function</b> (font) {
+</code><code id="L5715"><span class="ln">5715</span>        <b>if</b> (!font.face) {
+</code><code id="L5716"><span class="ln">5716</span>            <b>return</b> font;
+</code><code id="L5717"><span class="ln">5717</span>        }
+</code><code id="L5718"><span class="ln">5718</span>        <b>this</b>.fonts<span class="s"> = </span><b>this</b>.fonts<span class="s"> || </span>{};
+</code><code id="L5719"><span class="ln">5719</span>        <b>var</b> fontcopy<span class="s"> = </span>{
+</code><code id="L5720"><span class="ln">5720</span>                w: font.w,
+</code><code id="L5721"><span class="ln">5721</span>                face: {},
+</code><code id="L5722"><span class="ln">5722</span>                glyphs: {}
+</code><code id="L5723"><span class="ln">5723</span>            },
+</code><code id="L5724"><span class="ln">5724</span>            family<span class="s"> = </span>font.face[<i>"font-family"</i>];
+</code><code id="L5725"><span class="ln">5725</span>        <b>for</b> (<b>var</b> prop <b>in</b> font.face) <b>if</b> (font.face[has](prop)) {
+</code><code id="L5726"><span class="ln">5726</span>            fontcopy.face[prop]<span class="s"> = </span>font.face[prop];
+</code><code id="L5727"><span class="ln">5727</span>        }
+</code><code id="L5728"><span class="ln">5728</span>        <b>if</b> (<b>this</b>.fonts[family]) {
+</code><code id="L5729"><span class="ln">5729</span>            <b>this</b>.fonts[family].push(fontcopy);
+</code><code id="L5730"><span class="ln">5730</span>        } <b>else</b> {
+</code><code id="L5731"><span class="ln">5731</span>            <b>this</b>.fonts[family]<span class="s"> = </span>[fontcopy];
+</code><code id="L5732"><span class="ln">5732</span>        }
+</code><code id="L5733"><span class="ln">5733</span>        <b>if</b> (!font.svg) {
+</code><code id="L5734"><span class="ln">5734</span>            fontcopy.face[<i>"units-per-em"</i>]<span class="s"> = </span>toInt(font.face[<i>"units-per-em"</i>], <span class="d">10</span>);
+</code><code id="L5735"><span class="ln">5735</span>            <b>for</b> (<b>var</b> glyph <b>in</b> font.glyphs) <b>if</b> (font.glyphs[has](glyph)) {
+</code><code id="L5736"><span class="ln">5736</span>                <b>var</b> path<span class="s"> = </span>font.glyphs[glyph];
+</code><code id="L5737"><span class="ln">5737</span>                fontcopy.glyphs[glyph]<span class="s"> = </span>{
+</code><code id="L5738"><span class="ln">5738</span>                    w: path.w,
+</code><code id="L5739"><span class="ln">5739</span>                    k: {},
+</code><code id="L5740"><span class="ln">5740</span>                    d: path.d<span class="s"> &amp;&amp; </span><i>"M"</i><span class="s"> + </span>path.d.replace(/[mlcxtrv]/g, <b>function</b> (command) {
+</code><code id="L5741"><span class="ln">5741</span>                            <b>return</b> {l: <i>"L"</i>, c: <i>"C"</i>, x: <i>"z"</i>, t: <i>"m"</i>, r: <i>"l"</i>, v: <i>"c"</i>}[command]<span class="s"> || </span><i>"M"</i>;
+</code><code id="L5742"><span class="ln">5742</span>                        })<span class="s"> + </span><i>"z"</i>
+</code><code id="L5743"><span class="ln">5743</span>                };
+</code><code id="L5744"><span class="ln">5744</span>                <b>if</b> (path.k) {
+</code><code id="L5745"><span class="ln">5745</span>                    <b>for</b> (<b>var</b> k <b>in</b> path.k) <b>if</b> (path[has](k)) {
+</code><code id="L5746"><span class="ln">5746</span>                        fontcopy.glyphs[glyph].k[k]<span class="s"> = </span>path.k[k];
+</code><code id="L5747"><span class="ln">5747</span>                    }
+</code><code id="L5748"><span class="ln">5748</span>                }
+</code><code id="L5749"><span class="ln">5749</span>            }
+</code><code id="L5750"><span class="ln">5750</span>        }
+</code><code id="L5751"><span class="ln">5751</span>        <b>return</b> font;
+</code><code id="L5752"><span class="ln">5752</span>    };
+</code><code id="L5753"><span class="ln">5753</span>    paperproto.getFont<span class="s"> = </span><b>function</b> (family, weight, style, stretch) {
+</code><code id="L5754"><span class="ln">5754</span>        stretch<span class="s"> = </span>stretch<span class="s"> || </span><i>"normal"</i>;
+</code><code id="L5755"><span class="ln">5755</span>        style<span class="s"> = </span>style<span class="s"> || </span><i>"normal"</i>;
+</code><code id="L5756"><span class="ln">5756</span>        weight<span class="s"> = </span>+weight<span class="s"> || </span>{normal: <span class="d">400</span>, bold: <span class="d">700</span>, lighter: <span class="d">300</span>, bolder: <span class="d">800</span>}[weight]<span class="s"> || </span><span class="d">400</span>;
+</code><code id="L5757"><span class="ln">5757</span>        <b>if</b> (!R.fonts) {
+</code><code id="L5758"><span class="ln">5758</span>            <b>return</b>;
+</code><code id="L5759"><span class="ln">5759</span>        }
+</code><code id="L5760"><span class="ln">5760</span>        <b>var</b> font<span class="s"> = </span>R.fonts[family];
+</code><code id="L5761"><span class="ln">5761</span>        <b>if</b> (!font) {
+</code><code id="L5762"><span class="ln">5762</span>            <b>var</b> name<span class="s"> = </span><b>new</b> RegExp(<i>"(^|\\s)"</i><span class="s"> + </span>family.replace(/[^\w\d\s+!~.:_-]/g, E)<span class="s"> + </span><i>"(\\s|$)"</i>, <i>"i"</i>);
+</code><code id="L5763"><span class="ln">5763</span>            <b>for</b> (<b>var</b> fontName <b>in</b> R.fonts) <b>if</b> (R.fonts[has](fontName)) {
+</code><code id="L5764"><span class="ln">5764</span>                <b>if</b> (name.test(fontName)) {
+</code><code id="L5765"><span class="ln">5765</span>                    font<span class="s"> = </span>R.fonts[fontName];
+</code><code id="L5766"><span class="ln">5766</span>                    <b>break</b>;
+</code><code id="L5767"><span class="ln">5767</span>                }
+</code><code id="L5768"><span class="ln">5768</span>            }
+</code><code id="L5769"><span class="ln">5769</span>        }
+</code><code id="L5770"><span class="ln">5770</span>        <b>var</b> thefont;
+</code><code id="L5771"><span class="ln">5771</span>        <b>if</b> (font) {
+</code><code id="L5772"><span class="ln">5772</span>            <b>for</b> (<b>var</b> i<span class="s"> = </span><span class="d">0</span>, ii<span class="s"> = </span>font.length; i &lt; ii; i++) {
+</code><code id="L5773"><span class="ln">5773</span>                thefont<span class="s"> = </span>font[i];
+</code><code id="L5774"><span class="ln">5774</span>                <b>if</b> (thefont.face[<i>"font-weight"</i>]<span class="s"> == </span>weight<span class="s"> &amp;&amp; </span>(thefont.face[<i>"font-style"</i>]<span class="s"> == </span>style<span class="s"> || </span>!thefont.face[<i>"font-style"</i>])<span class="s"> &amp;&amp; </span>thefont.face[<i>"font-stretch"</i>]<span class="s"> == </span>stretch) {
+</code><code id="L5775"><span class="ln">5775</span>                    <b>break</b>;
+</code><code id="L5776"><span class="ln">5776</span>                }
+</code><code id="L5777"><span class="ln">5777</span>            }
+</code><code id="L5778"><span class="ln">5778</span>        }
+</code><code id="L5779"><span class="ln">5779</span>        <b>return</b> thefont;
+</code><code id="L5780"><span class="ln">5780</span>    };
+</code><code id="L5781"><span class="ln">5781</span>    paperproto.print<span class="s"> = </span><b>function</b> (x, y, string, font, size, origin, letter_spacing) {
+</code><code id="L5782"><span class="ln">5782</span>        origin<span class="s"> = </span>origin<span class="s"> || </span><i>"middle"</i>; <span class="c">// baseline|middle</span>
+</code><code id="L5783"><span class="ln">5783</span>        letter_spacing<span class="s"> = </span>mmax(mmin(letter_spacing<span class="s"> || </span><span class="d">0</span>, <span class="d">1</span>), -<span class="d">1</span>);
+</code><code id="L5784"><span class="ln">5784</span>        <b>var</b> out<span class="s"> = </span><b>this</b>.set(),
+</code><code id="L5785"><span class="ln">5785</span>            letters<span class="s"> = </span>Str(string).split(E),
+</code><code id="L5786"><span class="ln">5786</span>            shift<span class="s"> = </span><span class="d">0</span>,
+</code><code id="L5787"><span class="ln">5787</span>            path<span class="s"> = </span>E,
+</code><code id="L5788"><span class="ln">5788</span>            scale;
+</code><code id="L5789"><span class="ln">5789</span>        R.is(font, string)<span class="s"> &amp;&amp; </span>(font<span class="s"> = </span><b>this</b>.getFont(font));
+</code><code id="L5790"><span class="ln">5790</span>        <b>if</b> (font) {
+</code><code id="L5791"><span class="ln">5791</span>            scale<span class="s"> = </span>(size<span class="s"> || </span><span class="d">16</span>)<span class="s"> / </span>font.face[<i>"units-per-em"</i>];
+</code><code id="L5792"><span class="ln">5792</span>            <b>var</b> bb<span class="s"> = </span>font.face.bbox.split(separator),
+</code><code id="L5793"><span class="ln">5793</span>                top<span class="s"> = </span>+bb[<span class="d">0</span>],
+</code><code id="L5794"><span class="ln">5794</span>                height<span class="s"> = </span>+bb[<span class="d">1</span>]<span class="s"> + </span>(origin<span class="s"> == </span><i>"baseline"</i> ? bb[<span class="d">3</span>]<span class="s"> - </span>bb[<span class="d">1</span>]<span class="s"> + </span>(+font.face.descent) : (bb[<span class="d">3</span>]<span class="s"> - </span>bb[<span class="d">1</span>])<span class="s"> / </span><span class="d">2</span>);
+</code><code id="L5795"><span class="ln">5795</span>            <b>for</b> (<b>var</b> i<span class="s"> = </span><span class="d">0</span>, ii<span class="s"> = </span>letters.length; i &lt; ii; i++) {
+</code><code id="L5796"><span class="ln">5796</span>                <b>var</b> prev<span class="s"> = </span>i<span class="s"> &amp;&amp; </span>font.glyphs[letters[i<span class="s"> - </span><span class="d">1</span>]]<span class="s"> || </span>{},
+</code><code id="L5797"><span class="ln">5797</span>                    curr<span class="s"> = </span>font.glyphs[letters[i]];
+</code><code id="L5798"><span class="ln">5798</span>                shift += i ? (prev.w<span class="s"> || </span>font.w)<span class="s"> + </span>(prev.k<span class="s"> &amp;&amp; </span>prev.k[letters[i]]<span class="s"> || </span><span class="d">0</span>)<span class="s"> + </span>(font.w<span class="s"> * </span>letter_spacing) : <span class="d">0</span>;
+</code><code id="L5799"><span class="ln">5799</span>                curr<span class="s"> &amp;&amp; </span>curr.d<span class="s"> &amp;&amp; </span>out.push(<b>this</b>.path(curr.d).attr({fill: <i>"#<span class="d">000</span>"</i>, stroke: <i>"none"</i>, transform: [[<i>"t"</i>, shift, <span class="d">0</span>]]}));
+</code><code id="L5800"><span class="ln">5800</span>            }
+</code><code id="L5801"><span class="ln">5801</span>            out.scale(scale, scale, top, height).translate(x<span class="s"> - </span>top, y<span class="s"> - </span>height);
+</code><code id="L5802"><span class="ln">5802</span>        }
+</code><code id="L5803"><span class="ln">5803</span>        <b>return</b> out;
+</code><code id="L5804"><span class="ln">5804</span>    };
+</code><code id="L5805"><span class="ln">5805</span>
+</code><code id="L5806"><span class="ln">5806</span>    R.format<span class="s"> = </span><b>function</b> (token, params) {
+</code><code id="L5807"><span class="ln">5807</span>        <b>var</b> args<span class="s"> = </span>R.is(params, array) ? [<span class="d">0</span>][concat](params) : arguments;
+</code><code id="L5808"><span class="ln">5808</span>        token<span class="s"> &amp;&amp; </span>R.is(token, string)<span class="s"> &amp;&amp; </span>args.length<span class="s"> - </span><span class="d">1</span><span class="s"> &amp;&amp; </span>(token<span class="s"> = </span>token.replace(formatrg, <b>function</b> (str, i) {
+</code><code id="L5809"><span class="ln">5809</span>            <b>return</b> args[++i]<span class="s"> == </span><b>null</b> ? E : args[i];
+</code><code id="L5810"><span class="ln">5810</span>        }));
+</code><code id="L5811"><span class="ln">5811</span>        <b>return</b> token<span class="s"> || </span>E;
+</code><code id="L5812"><span class="ln">5812</span>    };
+</code><code id="L5813"><span class="ln">5813</span>    R.ninja<span class="s"> = </span><b>function</b> () {
+</code><code id="L5814"><span class="ln">5814</span>        oldRaphael.was ? (g.win.Raphael<span class="s"> = </span>oldRaphael.is) : <b>delete</b> Raphael;
+</code><code id="L5815"><span class="ln">5815</span>        <b>return</b> R;
+</code><code id="L5816"><span class="ln">5816</span>    };
+</code><code id="L5817"><span class="ln">5817</span><span class="c">    <span class="c">/*\</span>
+</span></code><code id="L5818"><span class="ln">5818</span><span class="c">    <span class="s"> * </span>Raphael.el
+</span></code><code id="L5819"><span class="ln">5819</span><span class="c">     [ property (object) ]
+</span></code><code id="L5820"><span class="ln">5820</span><span class="c">     **
+</span></code><code id="L5821"><span class="ln">5821</span><span class="c">    <span class="s"> * </span>You can add your own method to elements. This is usefull when you want to hack <b>default</b> functionality or
+</span></code><code id="L5822"><span class="ln">5822</span><span class="c">    <span class="s"> * </span>want to wrap some common transformation or attributes <b>in</b> one method. In difference to canvas methods,
+</span></code><code id="L5823"><span class="ln">5823</span><span class="c">    <span class="s"> * </span>you can redefine element method at any time. Expending element methods wouldn’t affect set.
+</span></code><code id="L5824"><span class="ln">5824</span><span class="c">     > Usage
+</span></code><code id="L5825"><span class="ln">5825</span><span class="c">    <span class="s"> | </span>Raphael.el.red<span class="s"> = </span><b>function</b> () {
+</span></code><code id="L5826"><span class="ln">5826</span><span class="c">    <span class="s"> | </span>    <b>this</b>.attr({fill: <i>"#f00"</i>});
+</span></code><code id="L5827"><span class="ln">5827</span><span class="c">    <span class="s"> | </span>};
+</span></code><code id="L5828"><span class="ln">5828</span><span class="c">    <span class="s"> | </span><span class="c">// then use it</span>
+</span></code><code id="L5829"><span class="ln">5829</span><span class="c">    <span class="s"> | </span>paper.circle(<span class="d">100</span>, <span class="d">100</span>, <span class="d">20</span>).red();
+</span></code><code id="L5830"><span class="ln">5830</span><span class="c">    \*/</span>
+</code><code id="L5831"><span class="ln">5831</span>    R.el<span class="s"> = </span>elproto;
+</code><code id="L5832"><span class="ln">5832</span>    R.st<span class="s"> = </span>setproto;
+</code><code id="L5833"><span class="ln">5833</span>    <span class="c">// Firefox &lt;<span class="d">3.6</span> fix: http://webreflection.blogspot.com/<span class="d">2009</span>/<span class="d">11</span>/<span class="d">195</span>-chars-to-help-lazy-loading.html</span>
+</code><code id="L5834"><span class="ln">5834</span>    (<b>function</b> (doc, loaded, f) {
+</code><code id="L5835"><span class="ln">5835</span>        <b>if</b> (doc.readyState<span class="s"> == </span><b>null</b><span class="s"> &amp;&amp; </span>doc.addEventListener){
+</code><code id="L5836"><span class="ln">5836</span>            doc.addEventListener(loaded, f<span class="s"> = </span><b>function</b> () {
+</code><code id="L5837"><span class="ln">5837</span>                doc.removeEventListener(loaded, f, <b>false</b>);
+</code><code id="L5838"><span class="ln">5838</span>                doc.readyState<span class="s"> = </span><i>"complete"</i>;
+</code><code id="L5839"><span class="ln">5839</span>            }, <b>false</b>);
+</code><code id="L5840"><span class="ln">5840</span>            doc.readyState<span class="s"> = </span><i>"loading"</i>;
+</code><code id="L5841"><span class="ln">5841</span>        }
+</code><code id="L5842"><span class="ln">5842</span>        <b>function</b> isLoaded() {
+</code><code id="L5843"><span class="ln">5843</span>            (/<b>in</b>/).test(doc.readyState) ? setTimeout(isLoaded, <span class="d">9</span>) : eve(<i>"DOMload"</i>);
+</code><code id="L5844"><span class="ln">5844</span>        }
+</code><code id="L5845"><span class="ln">5845</span>        isLoaded();
+</code><code id="L5846"><span class="ln">5846</span>    })(document, <i>"DOMContentLoaded"</i>);
+</code><code id="L5847"><span class="ln">5847</span>
+</code><code id="L5848"><span class="ln">5848</span>    oldRaphael.was ? (g.win.Raphael<span class="s"> = </span>R) : (Raphael<span class="s"> = </span>R);
+</code><code id="L5849"><span class="ln">5849</span>
+</code><code id="L5850"><span class="ln">5850</span><span class="c">    /*
+</span></code><code id="L5851"><span class="ln">5851</span><span class="c">    <span class="s"> * </span>Eve <span class="d">0.2</span><span class="d">.1</span><span class="s"> - </span>JavaScript Events Library
+</span></code><code id="L5852"><span class="ln">5852</span><span class="c">     *
+</span></code><code id="L5853"><span class="ln">5853</span><span class="c">    <span class="s"> * </span>Copyright (c) <span class="d">2010</span> Dmitry Baranovskiy (http:<span class="c">//dmitry.baranovskiy.com/)</span>
+</span></code><code id="L5854"><span class="ln">5854</span><span class="c">    <span class="s"> * </span>Licensed under the MIT (http:<span class="c">//www.opensource.org/licenses/mit-license.php) license.</span>
+</span></code><code id="L5855"><span class="ln">5855</span><span class="c">     */</span>
+</code><code id="L5856"><span class="ln">5856</span>
+</code><code id="L5857"><span class="ln">5857</span>    <b>var</b> eve<span class="s"> = </span>R.eve<span class="s"> = </span>(<b>function</b> () {
+</code><code id="L5858"><span class="ln">5858</span>        <b>var</b> version<span class="s"> = </span><i>"<span class="d">0.2</span><span class="d">.1</span>"</i>,
+</code><code id="L5859"><span class="ln">5859</span>            has<span class="s"> = </span><i>"hasOwnProperty"</i>,
+</code><code id="L5860"><span class="ln">5860</span>            separator<span class="s"> = </span>/[\.\/]/,
+</code><code id="L5861"><span class="ln">5861</span>            wildcard<span class="s"> = </span><i>"*"</i>,
+</code><code id="L5862"><span class="ln">5862</span>            events<span class="s"> = </span>{n: {}},
+</code><code id="L5863"><span class="ln">5863</span>            eve<span class="s"> = </span><b>function</b> (name, scope) {
+</code><code id="L5864"><span class="ln">5864</span>                <b>var</b> e<span class="s"> = </span>events,
+</code><code id="L5865"><span class="ln">5865</span>                    args<span class="s"> = </span>Array.prototype.slice.call(arguments, <span class="d">2</span>),
+</code><code id="L5866"><span class="ln">5866</span>                    listeners<span class="s"> = </span>eve.listeners(name),
+</code><code id="L5867"><span class="ln">5867</span>                    errors<span class="s"> = </span>[];
+</code><code id="L5868"><span class="ln">5868</span>                <b>for</b> (<b>var</b> i<span class="s"> = </span><span class="d">0</span>, ii<span class="s"> = </span>listeners.length; i &lt; ii; i++) {
+</code><code id="L5869"><span class="ln">5869</span>                    <b>try</b> {
+</code><code id="L5870"><span class="ln">5870</span>                        listeners[i].apply(scope, args);
+</code><code id="L5871"><span class="ln">5871</span>                    } <b>catch</b> (ex) {
+</code><code id="L5872"><span class="ln">5872</span>                        errors.push({error: ex<span class="s"> &amp;&amp; </span>ex.message<span class="s"> || </span>ex, func: listeners[i]});
+</code><code id="L5873"><span class="ln">5873</span>                    }
+</code><code id="L5874"><span class="ln">5874</span>                }
+</code><code id="L5875"><span class="ln">5875</span>                <b>if</b> (errors.length) {
+</code><code id="L5876"><span class="ln">5876</span>                    <b>return</b> errors;
+</code><code id="L5877"><span class="ln">5877</span>                }
+</code><code id="L5878"><span class="ln">5878</span>            };
+</code><code id="L5879"><span class="ln">5879</span>        eve.listeners<span class="s"> = </span><b>function</b> (name) {
+</code><code id="L5880"><span class="ln">5880</span>            <b>var</b> names<span class="s"> = </span>name.split(separator),
+</code><code id="L5881"><span class="ln">5881</span>                e<span class="s"> = </span>events,
+</code><code id="L5882"><span class="ln">5882</span>                item,
+</code><code id="L5883"><span class="ln">5883</span>                items,
+</code><code id="L5884"><span class="ln">5884</span>                k,
+</code><code id="L5885"><span class="ln">5885</span>                i,
+</code><code id="L5886"><span class="ln">5886</span>                ii,
+</code><code id="L5887"><span class="ln">5887</span>                j,
+</code><code id="L5888"><span class="ln">5888</span>                jj,
+</code><code id="L5889"><span class="ln">5889</span>                nes,
+</code><code id="L5890"><span class="ln">5890</span>                es<span class="s"> = </span>[e],
+</code><code id="L5891"><span class="ln">5891</span>                out<span class="s"> = </span>[];
+</code><code id="L5892"><span class="ln">5892</span>            <b>for</b> (i<span class="s"> = </span><span class="d">0</span>, ii<span class="s"> = </span>names.length; i &lt; ii; i++) {
+</code><code id="L5893"><span class="ln">5893</span>                nes<span class="s"> = </span>[];
+</code><code id="L5894"><span class="ln">5894</span>                <b>for</b> (j<span class="s"> = </span><span class="d">0</span>, jj<span class="s"> = </span>es.length; j &lt; jj; j++) {
+</code><code id="L5895"><span class="ln">5895</span>                    e<span class="s"> = </span>es[j].n;
+</code><code id="L5896"><span class="ln">5896</span>                    items<span class="s"> = </span>[e[names[i]], e[wildcard]];
+</code><code id="L5897"><span class="ln">5897</span>                    k<span class="s"> = </span><span class="d">2</span>;
+</code><code id="L5898"><span class="ln">5898</span>                    <b>while</b> (k--) {
+</code><code id="L5899"><span class="ln">5899</span>                        item<span class="s"> = </span>items[k];
+</code><code id="L5900"><span class="ln">5900</span>                        <b>if</b> (item) {
+</code><code id="L5901"><span class="ln">5901</span>                            nes.push(item);
+</code><code id="L5902"><span class="ln">5902</span>                            out<span class="s"> = </span>out.concat(item.f<span class="s"> || </span>[]);
+</code><code id="L5903"><span class="ln">5903</span>                        }
+</code><code id="L5904"><span class="ln">5904</span>                    }
+</code><code id="L5905"><span class="ln">5905</span>                }
+</code><code id="L5906"><span class="ln">5906</span>                es<span class="s"> = </span>nes;
+</code><code id="L5907"><span class="ln">5907</span>            }
+</code><code id="L5908"><span class="ln">5908</span>            <b>return</b> out;
+</code><code id="L5909"><span class="ln">5909</span>        };
+</code><code id="L5910"><span class="ln">5910</span>        eve.on<span class="s"> = </span><b>function</b> (name, f) {
+</code><code id="L5911"><span class="ln">5911</span>            <b>var</b> names<span class="s"> = </span>name.split(separator),
+</code><code id="L5912"><span class="ln">5912</span>                e<span class="s"> = </span>events;
+</code><code id="L5913"><span class="ln">5913</span>            <b>for</b> (<b>var</b> i<span class="s"> = </span><span class="d">0</span>, ii<span class="s"> = </span>names.length; i &lt; ii; i++) {
+</code><code id="L5914"><span class="ln">5914</span>                e<span class="s"> = </span>e.n;
+</code><code id="L5915"><span class="ln">5915</span>                !e[names[i]]<span class="s"> &amp;&amp; </span>(e[names[i]]<span class="s"> = </span>{n: {}});
+</code><code id="L5916"><span class="ln">5916</span>                e<span class="s"> = </span>e[names[i]];
 </code><code id="L5917"><span class="ln">5917</span>            }
-</code><code id="L5918"><span class="ln">5918</span>            <b>return</b> <b>true</b>;
-</code><code id="L5919"><span class="ln">5919</span>        };
-</code><code id="L5920"><span class="ln">5920</span>        eve.version<span class="s"> = </span>version;
-</code><code id="L5921"><span class="ln">5921</span>        eve.toString<span class="s"> = </span><b>function</b> () {
-</code><code id="L5922"><span class="ln">5922</span>            <b>return</b> <i>"You are running Eve "</i><span class="s"> + </span>version;
+</code><code id="L5918"><span class="ln">5918</span>            e.f<span class="s"> = </span>e.f<span class="s"> || </span>[];
+</code><code id="L5919"><span class="ln">5919</span>            <b>for</b> (i<span class="s"> = </span><span class="d">0</span>, ii<span class="s"> = </span>e.f.length; i &lt; ii; i++) <b>if</b> (e.f[i]<span class="s"> == </span>f) {
+</code><code id="L5920"><span class="ln">5920</span>                <b>return</b> <b>false</b>;
+</code><code id="L5921"><span class="ln">5921</span>            }
+</code><code id="L5922"><span class="ln">5922</span>            e.f.push(f);
 </code><code id="L5923"><span class="ln">5923</span>        };
-</code><code id="L5924"><span class="ln">5924</span>        <b>return</b> eve;
-</code><code id="L5925"><span class="ln">5925</span>    })();
-</code><code id="L5926"><span class="ln">5926</span>})();
+</code><code id="L5924"><span class="ln">5924</span>        eve.unbind<span class="s"> = </span><b>function</b> (name, f) {
+</code><code id="L5925"><span class="ln">5925</span>            <b>var</b> names<span class="s"> = </span>name.split(separator),
+</code><code id="L5926"><span class="ln">5926</span>                e,
+</code><code id="L5927"><span class="ln">5927</span>                key,
+</code><code id="L5928"><span class="ln">5928</span>                splice,
+</code><code id="L5929"><span class="ln">5929</span>                cur<span class="s"> = </span>[events];
+</code><code id="L5930"><span class="ln">5930</span>            <b>for</b> (<b>var</b> i<span class="s"> = </span><span class="d">0</span>, ii<span class="s"> = </span>names.length; i &lt; ii; i++) {
+</code><code id="L5931"><span class="ln">5931</span>                <b>for</b> (<b>var</b> j<span class="s"> = </span><span class="d">0</span>; j &lt; cur.length; j += splice.length<span class="s"> - </span><span class="d">2</span>) {
+</code><code id="L5932"><span class="ln">5932</span>                    splice<span class="s"> = </span>[j, <span class="d">1</span>];
+</code><code id="L5933"><span class="ln">5933</span>                    e<span class="s"> = </span>cur[j].n;
+</code><code id="L5934"><span class="ln">5934</span>                    <b>if</b> (names[i] != wildcard) {
+</code><code id="L5935"><span class="ln">5935</span>                        <b>if</b> (e[names[i]]) {
+</code><code id="L5936"><span class="ln">5936</span>                            splice.push(e[names[i]]);
+</code><code id="L5937"><span class="ln">5937</span>                        }
+</code><code id="L5938"><span class="ln">5938</span>                    } <b>else</b> {
+</code><code id="L5939"><span class="ln">5939</span>                        <b>for</b> (key <b>in</b> e) <b>if</b> (e[has](key)) {
+</code><code id="L5940"><span class="ln">5940</span>                            splice.push(e[key]);
+</code><code id="L5941"><span class="ln">5941</span>                        }
+</code><code id="L5942"><span class="ln">5942</span>                    }
+</code><code id="L5943"><span class="ln">5943</span>                    cur.splice.apply(cur, splice);
+</code><code id="L5944"><span class="ln">5944</span>                }
+</code><code id="L5945"><span class="ln">5945</span>            }
+</code><code id="L5946"><span class="ln">5946</span>            <b>for</b> (i<span class="s"> = </span><span class="d">0</span>, ii<span class="s"> = </span>cur.length; i &lt; ii; i++) {
+</code><code id="L5947"><span class="ln">5947</span>                e<span class="s"> = </span>cur[i];
+</code><code id="L5948"><span class="ln">5948</span>                <b>while</b> (e.n) {
+</code><code id="L5949"><span class="ln">5949</span>                    <b>if</b> (f) {
+</code><code id="L5950"><span class="ln">5950</span>                        <b>if</b> (e.f) {
+</code><code id="L5951"><span class="ln">5951</span>                            <b>for</b> (i<span class="s"> = </span><span class="d">0</span>, ii<span class="s"> = </span>e.f.length; i &lt; ii; i++) <b>if</b> (e.f[i]<span class="s"> == </span>f) {
+</code><code id="L5952"><span class="ln">5952</span>                                e.f.splice(i, <span class="d">1</span>);
+</code><code id="L5953"><span class="ln">5953</span>                                <b>break</b>;
+</code><code id="L5954"><span class="ln">5954</span>                            }
+</code><code id="L5955"><span class="ln">5955</span>                            !e.f.length<span class="s"> &amp;&amp; </span><b>delete</b> e.f;
+</code><code id="L5956"><span class="ln">5956</span>                        }
+</code><code id="L5957"><span class="ln">5957</span>                        <b>for</b> (key <b>in</b> e.n) <b>if</b> (e.n[has](key)<span class="s"> &amp;&amp; </span>e.n[key].f) {
+</code><code id="L5958"><span class="ln">5958</span>                            <b>var</b> funcs<span class="s"> = </span>e.n[key].f;
+</code><code id="L5959"><span class="ln">5959</span>                            <b>for</b> (i<span class="s"> = </span><span class="d">0</span>, ii<span class="s"> = </span>funcs.length; i &lt; ii; i++) <b>if</b> (funcs[i]<span class="s"> == </span>f) {
+</code><code id="L5960"><span class="ln">5960</span>                                funcs.splice(i, <span class="d">1</span>);
+</code><code id="L5961"><span class="ln">5961</span>                                <b>break</b>;
+</code><code id="L5962"><span class="ln">5962</span>                            }
+</code><code id="L5963"><span class="ln">5963</span>                            !funcs.length<span class="s"> &amp;&amp; </span><b>delete</b> e.n[key].f;
+</code><code id="L5964"><span class="ln">5964</span>                        }
+</code><code id="L5965"><span class="ln">5965</span>                    } <b>else</b> {
+</code><code id="L5966"><span class="ln">5966</span>                        <b>delete</b> e.f;
+</code><code id="L5967"><span class="ln">5967</span>                        <b>for</b> (key <b>in</b> e.n) <b>if</b> (e.n[has](key)<span class="s"> &amp;&amp; </span>e.n[key].f) {
+</code><code id="L5968"><span class="ln">5968</span>                            <b>delete</b> e.n[key].f;
+</code><code id="L5969"><span class="ln">5969</span>                        }
+</code><code id="L5970"><span class="ln">5970</span>                    }
+</code><code id="L5971"><span class="ln">5971</span>                    e<span class="s"> = </span>e.n;
+</code><code id="L5972"><span class="ln">5972</span>                }
+</code><code id="L5973"><span class="ln">5973</span>            }
+</code><code id="L5974"><span class="ln">5974</span>            <b>return</b> <b>true</b>;
+</code><code id="L5975"><span class="ln">5975</span>        };
+</code><code id="L5976"><span class="ln">5976</span>        eve.version<span class="s"> = </span>version;
+</code><code id="L5977"><span class="ln">5977</span>        eve.toString<span class="s"> = </span><b>function</b> () {
+</code><code id="L5978"><span class="ln">5978</span>            <b>return</b> <i>"You are running Eve "</i><span class="s"> + </span>version;
+</code><code id="L5979"><span class="ln">5979</span>        };
+</code><code id="L5980"><span class="ln">5980</span>        <b>return</b> eve;
+</code><code id="L5981"><span class="ln">5981</span>    })();
+</code><code id="L5982"><span class="ln">5982</span>})();
 </code></body></html>
\ No newline at end of file
index 9f39b0c..15e1dcf 100644 (file)
                 throw new Error("SVG container not found.");
             }
             var cnvs = $("svg"),
-                css = "overflow:hidden;";
+                css = "overflow:hidden;",
+                isFloating;
             x = x || 0;
             y = y || 0;
             width = width || 512;
             if (container == 1) {
                 cnvs.style.cssText = css + "position:absolute;left:" + x + "px;top:" + y + "px";
                 g.doc.body.appendChild(cnvs);
+                isFloating = 1;
             } else {
-                cnvs.style.cssText = css;
+                cnvs.style.cssText = css + "position:relative";
                 if (container.firstChild) {
                     container.insertBefore(cnvs, container.firstChild);
                 } else {
             container.canvas = cnvs;
             plugins.call(container, container, R.fn);
             container.clear();
+            container._left = container._top = 0;
+            isFloating && (container.renderfix = fun);
+            container.renderfix();
             return container;
         },
         setViewBox = function (x, y, w, h, fit) {
             this._viewBox = [x, y, w, h, !!fit];
             return this;
         };
+        /*\
+         * Paper.renderfix
+         [ method ]
+         **
+         * Fixes the issue of Firefox and IE9 regarding subpixel rendering. If paper is dependant
+         * on other elements after reflow it could shift half pixel which cause for lines to lost their crispness.
+         * This method fixes the issue.
+         **
+           Special thanks to Mariusz Nowak (http://www.medikoo.com/) for this method.
+        \*/
+        paperproto.renderfix = function () {
+            var cnvs = this.canvas,
+                s = cnvs.style,
+                pos = cnvs.getScreenCTM(),
+                left = -pos.e % 1,
+                top = -pos.f % 1;
+            if (left || top) {
+                if (left) {
+                    this._left = (this._left + left) % 1;
+                    s.left = this._left + "px";
+                }
+                if (top) {
+                    this._top = (this._top + top) % 1;
+                    s.top = this._top + "px";
+                }
+            }
+        };
         /*\
          * Paper.clear
          [ method ]
                 }
             }
             plugins.call(res, res, R.fn);
+            res.renderfix = fun;
             return res;
         };
         paperproto.clear = function () {
      *
      * Note: Glow is not connected to the element. If you change element attributes it won’t adjust itself.
      **
+     > Parameters
+     **
+     - glow (object) #optional parameters object with all properties optional:
+     o {
+     o     width (number) size of the glow, default is `10`
+     o     fill (boolean) will it be filled, default is `false`
+     o     opacity: opacity, default is `0.5`
+     o     offsetx: horizontal offset, default is `0`
+     o     offsety: vertical offset, default is `0`
+     o     color: glow colour, default is `black`
+     o }
      = (object) @Paper.set of elements that represents glow
     \*/
     elproto.glow = function (glow) {
         }
         glow = glow || {};
         var s = {
-            width: glow.width || 10,
+            width: (glow.width || 10) + (+this.attr("stroke-width") || 1),
             fill: glow.fill || false,
             opacity: glow.opacity || .5,
             offsetx: glow.offsetx || 0,
             path = this.realPath || getPath[this.type](this);
         path = this.matrix ? mapPath(path, this.matrix) : path;
         for (var i = 1; i < c + 1; i++) {
-            out.push(r.path(path).attr({stroke: s.color, fill: s.fill ? s.color : "none", "stroke-linejoin": "round", "stroke-linecap": "round", "stroke-width": +(s.width / c * i).toFixed(3), opacity: +(s.opacity / c).toFixed(3)}));
+            out.push(r.path(path).attr({
+                stroke: s.color,
+                fill: s.fill ? s.color : "none",
+                "stroke-linejoin": "round",
+                "stroke-linecap": "round",
+                "stroke-width": +(s.width / c * i).toFixed(3),
+                opacity: +(s.opacity / c).toFixed(3)
+            }));
         }
         return out.insertBefore(this).translate(s.offsetx, s.offsety);
     };
                             R.is(f, "function") && f.call(el);
                         });
                     })(e.callback, that, e.anim);
+                    console.log(e.repeat);
                     if (--e.repeat) {
                         that.attr(e.origin);
                         e.start = Now;
      = (object) original element
     \*/
     elproto.animateWith = function (element, params, ms, easing, callback) {
+        this.animate(params, ms, easing, callback);
+        var start, el;
         for (var i = 0, ii = animationElements.length; i < ii; i++) {
-            if (animationElements[i].el.id == element.id) {
-                params.start = animationElements[i].timestamp;
-                break;
+            el = animationElements[i];
+            if (el.el.id == element.id) {
+                start = el.timestamp;
+            } else if (el.el.id == this.id) {
+                el.start = start;
             }
         }
         return this.animate(params, ms, easing, callback);
                 }
             }
         } else {
-            status = 0 / 0;
+            status = +to; // NaN
         }
         for (var i = 0, ii = anim.percents.length; i < ii; i++) {
             if (anim.percents[i] == percent || anim.percents[i] > status * anim.top) {
index 6ccc661..d715e93 100644 (file)
@@ -1,7 +1,7 @@
 <!DOCTYPE html>
 <!-- Generated with Dr.js -->
-<html lang="en"><head><meta charset="utf-8"><title>Raphaël Reference</title><link rel="stylesheet" href="dr.css"></head><body id="dr-js"><div id="dr"><ol class="dr-toc"><li class="dr-lvl0"><a href="#Animation" class="undefined"><span>Animation</span></a></li><li class="dr-lvl1"><a href="#Animation.delay" class="dr-method"><span>Animation.delay()</span></a></li><li class="dr-lvl1"><a href="#Animation.repeat" class="dr-method"><span>Animation.repeat()</span></a></li><li class="dr-lvl0"><a href="#Element" class="undefined"><span>Element</span></a></li><li class="dr-lvl1"><a href="#Element.animate" class="dr-method"><span>Element.animate()</span></a></li><li class="dr-lvl1"><a href="#Element.animateWith" class="dr-method"><span>Element.animateWith()</span></a></li><li class="dr-lvl1"><a href="#Element.attr" class="dr-method"><span>Element.attr()</span></a></li><li class="dr-lvl1"><a href="#Element.clone" class="dr-method"><span>Element.clone()</span></a></li><li class="dr-lvl1"><a href="#Element.drag" class="dr-method"><span>Element.drag()</span></a></li><li class="dr-lvl1"><a href="#Element.getBBox" class="dr-method"><span>Element.getBBox()</span></a></li><li class="dr-lvl1"><a href="#Element.getPointAtLength" class="dr-method"><span>Element.getPointAtLength()</span></a></li><li class="dr-lvl1"><a href="#Element.getSubpath" class="dr-method"><span>Element.getSubpath()</span></a></li><li class="dr-lvl1"><a href="#Element.getTotalLength" class="dr-method"><span>Element.getTotalLength()</span></a></li><li class="dr-lvl1"><a href="#Element.glow" class="dr-method"><span>Element.glow()</span></a></li><li class="dr-lvl1"><a href="#Element.hide" class="dr-method"><span>Element.hide()</span></a></li><li class="dr-lvl1"><a href="#Element.hover" class="dr-method"><span>Element.hover()</span></a></li><li class="dr-lvl1"><a href="#Element.id" class="dr-property"><span>Element.id</span></a></li><li class="dr-lvl1"><a href="#Element.insertAfter" class="dr-method"><span>Element.insertAfter()</span></a></li><li class="dr-lvl1"><a href="#Element.insertBefore" class="dr-method"><span>Element.insertBefore()</span></a></li><li class="dr-lvl1"><a href="#Element.next" class="dr-property"><span>Element.next</span></a></li><li class="dr-lvl1"><a href="#Element.node" class="dr-property"><span>Element.node</span></a></li><li class="dr-lvl1"><a href="#Element.onDragOver" class="dr-method"><span>Element.onDragOver()</span></a></li><li class="dr-lvl1"><a href="#Element.paper" class="dr-property"><span>Element.paper</span></a></li><li class="dr-lvl1"><a href="#Element.pause" class="dr-method"><span>Element.pause()</span></a></li><li class="dr-lvl1"><a href="#Element.prev" class="dr-property"><span>Element.prev</span></a></li><li class="dr-lvl1"><a href="#Element.raphael" class="dr-property"><span>Element.raphael</span></a></li><li class="dr-lvl1"><a href="#Element.remove" class="dr-method"><span>Element.remove()</span></a></li><li class="dr-lvl1"><a href="#Element.resume" class="dr-method"><span>Element.resume()</span></a></li><li class="dr-lvl1"><a href="#Element.rotate" class="dr-method"><span>Element.rotate()</span></a></li><li class="dr-lvl1"><a href="#Element.scale" class="dr-method"><span>Element.scale()</span></a></li><li class="dr-lvl1"><a href="#Element.setTime" class="dr-method"><span>Element.setTime()</span></a></li><li class="dr-lvl1"><a href="#Element.show" class="dr-method"><span>Element.show()</span></a></li><li class="dr-lvl1"><a href="#Element.status" class="dr-method"><span>Element.status()</span></a></li><li class="dr-lvl1"><a href="#Element.stop" class="dr-method"><span>Element.stop()</span></a></li><li class="dr-lvl1"><a href="#Element.toBack" class="dr-method"><span>Element.toBack()</span></a></li><li class="dr-lvl1"><a href="#Element.toFront" class="dr-method"><span>Element.toFront()</span></a></li><li class="dr-lvl1"><a href="#Element.transform" class="dr-method"><span>Element.transform()</span></a></li><li class="dr-lvl1"><a href="#Element.translate" class="dr-method"><span>Element.translate()</span></a></li><li class="dr-lvl1"><a href="#Element.undrag" class="dr-method"><span>Element.undrag()</span></a></li><li class="dr-lvl1"><a href="#Element.unhover" class="dr-method"><span>Element.unhover()</span></a></li><li class="dr-lvl0"><a href="#Paper" class="undefined"><span>Paper</span></a></li><li class="dr-lvl1"><a href="#Paper.bottom" class="dr-property"><span>Paper.bottom</span></a></li><li class="dr-lvl1"><a href="#Paper.circle" class="dr-method"><span>Paper.circle()</span></a></li><li class="dr-lvl1"><a href="#Paper.clear" class="dr-method"><span>Paper.clear()</span></a></li><li class="dr-lvl1"><a href="#Paper.customAttributes" class="dr-property"><span>Paper.customAttributes</span></a></li><li class="dr-lvl1"><a href="#Paper.ellipse" class="dr-method"><span>Paper.ellipse()</span></a></li><li class="dr-lvl1"><a href="#Paper.forEach" class="dr-method"><span>Paper.forEach()</span></a></li><li class="dr-lvl1"><a href="#Paper.getById" class="dr-method"><span>Paper.getById()</span></a></li><li class="dr-lvl1"><a href="#Paper.getElementByPoint" class="dr-method"><span>Paper.getElementByPoint()</span></a></li><li class="dr-lvl1"><a href="#Paper.image" class="dr-method"><span>Paper.image()</span></a></li><li class="dr-lvl1"><a href="#Paper.path" class="dr-method"><span>Paper.path()</span></a></li><li class="dr-lvl1"><a href="#Paper.raphael" class="dr-property"><span>Paper.raphael</span></a></li><li class="dr-lvl1"><a href="#Paper.rect" class="dr-method"><span>Paper.rect()</span></a></li><li class="dr-lvl1"><a href="#Paper.remove" class="dr-method"><span>Paper.remove()</span></a></li><li class="dr-lvl1"><a href="#Paper.safari" class="dr-method"><span>Paper.safari()</span></a></li><li class="dr-lvl1"><a href="#Paper.set" class="dr-method"><span>Paper.set()</span></a></li><li class="dr-lvl1"><a href="#Paper.setSize" class="dr-method"><span>Paper.setSize()</span></a></li><li class="dr-lvl1"><a href="#Paper.setViewBox" class="dr-method"><span>Paper.setViewBox()</span></a></li><li class="dr-lvl1"><a href="#Paper.text" class="dr-method"><span>Paper.text()</span></a></li><li class="dr-lvl1"><a href="#Paper.top" class="dr-property"><span>Paper.top</span></a></li><li class="dr-lvl0"><a href="#Raphael" class="dr-method"><span>Raphael()</span></a></li><li class="dr-lvl1"><a href="#Raphael.angle" class="dr-method"><span>Raphael.angle()</span></a></li><li class="dr-lvl1"><a href="#Raphael.animation" class="dr-method"><span>Raphael.animation()</span></a></li><li class="dr-lvl1"><a href="#Raphael.deg" class="dr-method"><span>Raphael.deg()</span></a></li><li class="dr-lvl1"><a href="#Raphael.easing_formulas" class="dr-property"><span>Raphael.easing_formulas</span></a></li><li class="dr-lvl1"><a href="#Raphael.el" class="dr-property"><span>Raphael.el</span></a></li><li class="dr-lvl1"><a href="#Raphael.findDotsAtSegment" class="dr-method"><span>Raphael.findDotsAtSegment()</span></a></li><li class="dr-lvl1"><a href="#Raphael.fn" class="dr-property"><span>Raphael.fn</span></a></li><li class="dr-lvl1"><a href="#Raphael.getColor" class="dr-method"><span>Raphael.getColor()</span></a></li><li class="dr-lvl2"><a href="#Raphael.getColor.reset" class="dr-method"><span>Raphael.getColor.reset()</span></a></li><li class="dr-lvl1"><a href="#Raphael.getPointAtLength" class="dr-method"><span>Raphael.getPointAtLength()</span></a></li><li class="dr-lvl1"><a href="#Raphael.getRGB" class="dr-method"><span>Raphael.getRGB()</span></a></li><li class="dr-lvl1"><a href="#Raphael.getSubpath" class="dr-method"><span>Raphael.getSubpath()</span></a></li><li class="dr-lvl1"><a href="#Raphael.getTotalLength" class="dr-method"><span>Raphael.getTotalLength()</span></a></li><li class="dr-lvl1"><a href="#Raphael.hsb" class="dr-method"><span>Raphael.hsb()</span></a></li><li class="dr-lvl1"><a href="#Raphael.hsb2rgb" class="dr-method"><span>Raphael.hsb2rgb()</span></a></li><li class="dr-lvl1"><a href="#Raphael.hsl" class="dr-method"><span>Raphael.hsl()</span></a></li><li class="dr-lvl1"><a href="#Raphael.hsl2rgb" class="dr-method"><span>Raphael.hsl2rgb()</span></a></li><li class="dr-lvl1"><a href="#Raphael.is" class="dr-method"><span>Raphael.is()</span></a></li><li class="dr-lvl1"><a href="#Raphael.parsePathString" class="dr-method"><span>Raphael.parsePathString()</span></a></li><li class="dr-lvl1"><a href="#Raphael.parseTransformString" class="dr-method"><span>Raphael.parseTransformString()</span></a></li><li class="dr-lvl1"><a href="#Raphael.path2curve" class="dr-method"><span>Raphael.path2curve()</span></a></li><li class="dr-lvl1"><a href="#Raphael.pathToRelative" class="dr-method"><span>Raphael.pathToRelative()</span></a></li><li class="dr-lvl1"><a href="#Raphael.rad" class="dr-method"><span>Raphael.rad()</span></a></li><li class="dr-lvl1"><a href="#Raphael.rgb" class="dr-method"><span>Raphael.rgb()</span></a></li><li class="dr-lvl1"><a href="#Raphael.rgb2hsb" class="dr-method"><span>Raphael.rgb2hsb()</span></a></li><li class="dr-lvl1"><a href="#Raphael.rgb2hsl" class="dr-method"><span>Raphael.rgb2hsl()</span></a></li><li class="dr-lvl1"><a href="#Raphael.setWindow" class="dr-method"><span>Raphael.setWindow()</span></a></li><li class="dr-lvl1"><a href="#Raphael.snapTo" class="dr-method"><span>Raphael.snapTo()</span></a></li><li class="dr-lvl1"><a href="#Raphael.svg" class="dr-property"><span>Raphael.svg</span></a></li><li class="dr-lvl1"><a href="#Raphael.type" class="dr-property"><span>Raphael.type</span></a></li><li class="dr-lvl1"><a href="#Raphael.vml" class="dr-property"><span>Raphael.vml</span></a></li><li class="dr-lvl0"><a href="#Set" class="undefined"><span>Set</span></a></li><li class="dr-lvl1"><a href="#Set.forEach" class="dr-method"><span>Set.forEach()</span></a></li><li class="dr-lvl1"><a href="#Set.pop" class="dr-method"><span>Set.pop()</span></a></li><li class="dr-lvl1"><a href="#Set.push" class="dr-method"><span>Set.push()</span></a></li></ol><div class="dr-doc"><h1>Raphaël Reference</h1><p class="dr-source">Check out the source: <a href="raphael-src.html">raphael.js</a></p><h2 id="Animation" class="undefined"><i class="dr-trixie">&#160;</i>Animation<a href="#Animation" title="Link to this section" class="dr-hash">&#x2693;</a></h2>
-<h3 id="Animation.delay" class="dr-method"><i class="dr-trixie">&#160;</i>Animation.delay(delay)<a href="#Animation.delay" title="Link to this section" class="dr-hash">&#x2693;</a><a class="dr-sourceline" title="Go to source" href="raphael-src.html#L5090">&#x27ad;</a></h3>
+<html lang="en"><head><meta charset="utf-8"><title>Raphaël Reference</title><link rel="stylesheet" href="dr.css"></head><body id="dr-js"><div id="dr"><ol class="dr-toc"><li class="dr-lvl0"><a href="#Animation" class="undefined"><span>Animation</span></a></li><li class="dr-lvl1"><a href="#Animation.delay" class="dr-method"><span>Animation.delay()</span></a></li><li class="dr-lvl1"><a href="#Animation.repeat" class="dr-method"><span>Animation.repeat()</span></a></li><li class="dr-lvl0"><a href="#Element" class="undefined"><span>Element</span></a></li><li class="dr-lvl1"><a href="#Element.animate" class="dr-method"><span>Element.animate()</span></a></li><li class="dr-lvl1"><a href="#Element.animateWith" class="dr-method"><span>Element.animateWith()</span></a></li><li class="dr-lvl1"><a href="#Element.attr" class="dr-method"><span>Element.attr()</span></a></li><li class="dr-lvl1"><a href="#Element.clone" class="dr-method"><span>Element.clone()</span></a></li><li class="dr-lvl1"><a href="#Element.drag" class="dr-method"><span>Element.drag()</span></a></li><li class="dr-lvl1"><a href="#Element.getBBox" class="dr-method"><span>Element.getBBox()</span></a></li><li class="dr-lvl1"><a href="#Element.getPointAtLength" class="dr-method"><span>Element.getPointAtLength()</span></a></li><li class="dr-lvl1"><a href="#Element.getSubpath" class="dr-method"><span>Element.getSubpath()</span></a></li><li class="dr-lvl1"><a href="#Element.getTotalLength" class="dr-method"><span>Element.getTotalLength()</span></a></li><li class="dr-lvl1"><a href="#Element.glow" class="dr-method"><span>Element.glow()</span></a></li><li class="dr-lvl1"><a href="#Element.hide" class="dr-method"><span>Element.hide()</span></a></li><li class="dr-lvl1"><a href="#Element.hover" class="dr-method"><span>Element.hover()</span></a></li><li class="dr-lvl1"><a href="#Element.id" class="dr-property"><span>Element.id</span></a></li><li class="dr-lvl1"><a href="#Element.insertAfter" class="dr-method"><span>Element.insertAfter()</span></a></li><li class="dr-lvl1"><a href="#Element.insertBefore" class="dr-method"><span>Element.insertBefore()</span></a></li><li class="dr-lvl1"><a href="#Element.next" class="dr-property"><span>Element.next</span></a></li><li class="dr-lvl1"><a href="#Element.node" class="dr-property"><span>Element.node</span></a></li><li class="dr-lvl1"><a href="#Element.onDragOver" class="dr-method"><span>Element.onDragOver()</span></a></li><li class="dr-lvl1"><a href="#Element.paper" class="dr-property"><span>Element.paper</span></a></li><li class="dr-lvl1"><a href="#Element.pause" class="dr-method"><span>Element.pause()</span></a></li><li class="dr-lvl1"><a href="#Element.prev" class="dr-property"><span>Element.prev</span></a></li><li class="dr-lvl1"><a href="#Element.raphael" class="dr-property"><span>Element.raphael</span></a></li><li class="dr-lvl1"><a href="#Element.remove" class="dr-method"><span>Element.remove()</span></a></li><li class="dr-lvl1"><a href="#Element.resume" class="dr-method"><span>Element.resume()</span></a></li><li class="dr-lvl1"><a href="#Element.rotate" class="dr-method"><span>Element.rotate()</span></a></li><li class="dr-lvl1"><a href="#Element.scale" class="dr-method"><span>Element.scale()</span></a></li><li class="dr-lvl1"><a href="#Element.setTime" class="dr-method"><span>Element.setTime()</span></a></li><li class="dr-lvl1"><a href="#Element.show" class="dr-method"><span>Element.show()</span></a></li><li class="dr-lvl1"><a href="#Element.status" class="dr-method"><span>Element.status()</span></a></li><li class="dr-lvl1"><a href="#Element.stop" class="dr-method"><span>Element.stop()</span></a></li><li class="dr-lvl1"><a href="#Element.toBack" class="dr-method"><span>Element.toBack()</span></a></li><li class="dr-lvl1"><a href="#Element.toFront" class="dr-method"><span>Element.toFront()</span></a></li><li class="dr-lvl1"><a href="#Element.transform" class="dr-method"><span>Element.transform()</span></a></li><li class="dr-lvl1"><a href="#Element.translate" class="dr-method"><span>Element.translate()</span></a></li><li class="dr-lvl1"><a href="#Element.undrag" class="dr-method"><span>Element.undrag()</span></a></li><li class="dr-lvl1"><a href="#Element.unhover" class="dr-method"><span>Element.unhover()</span></a></li><li class="dr-lvl0"><a href="#Paper" class="undefined"><span>Paper</span></a></li><li class="dr-lvl1"><a href="#Paper.bottom" class="dr-property"><span>Paper.bottom</span></a></li><li class="dr-lvl1"><a href="#Paper.circle" class="dr-method"><span>Paper.circle()</span></a></li><li class="dr-lvl1"><a href="#Paper.clear" class="dr-method"><span>Paper.clear()</span></a></li><li class="dr-lvl1"><a href="#Paper.customAttributes" class="dr-property"><span>Paper.customAttributes</span></a></li><li class="dr-lvl1"><a href="#Paper.ellipse" class="dr-method"><span>Paper.ellipse()</span></a></li><li class="dr-lvl1"><a href="#Paper.forEach" class="dr-method"><span>Paper.forEach()</span></a></li><li class="dr-lvl1"><a href="#Paper.getById" class="dr-method"><span>Paper.getById()</span></a></li><li class="dr-lvl1"><a href="#Paper.getElementByPoint" class="dr-method"><span>Paper.getElementByPoint()</span></a></li><li class="dr-lvl1"><a href="#Paper.image" class="dr-method"><span>Paper.image()</span></a></li><li class="dr-lvl1"><a href="#Paper.path" class="dr-method"><span>Paper.path()</span></a></li><li class="dr-lvl1"><a href="#Paper.raphael" class="dr-property"><span>Paper.raphael</span></a></li><li class="dr-lvl1"><a href="#Paper.rect" class="dr-method"><span>Paper.rect()</span></a></li><li class="dr-lvl1"><a href="#Paper.remove" class="dr-method"><span>Paper.remove()</span></a></li><li class="dr-lvl1"><a href="#Paper.renderfix" class="dr-method"><span>Paper.renderfix()</span></a></li><li class="dr-lvl1"><a href="#Paper.safari" class="dr-method"><span>Paper.safari()</span></a></li><li class="dr-lvl1"><a href="#Paper.set" class="dr-method"><span>Paper.set()</span></a></li><li class="dr-lvl1"><a href="#Paper.setSize" class="dr-method"><span>Paper.setSize()</span></a></li><li class="dr-lvl1"><a href="#Paper.setViewBox" class="dr-method"><span>Paper.setViewBox()</span></a></li><li class="dr-lvl1"><a href="#Paper.text" class="dr-method"><span>Paper.text()</span></a></li><li class="dr-lvl1"><a href="#Paper.top" class="dr-property"><span>Paper.top</span></a></li><li class="dr-lvl0"><a href="#Raphael" class="dr-method"><span>Raphael()</span></a></li><li class="dr-lvl1"><a href="#Raphael.angle" class="dr-method"><span>Raphael.angle()</span></a></li><li class="dr-lvl1"><a href="#Raphael.animation" class="dr-method"><span>Raphael.animation()</span></a></li><li class="dr-lvl1"><a href="#Raphael.deg" class="dr-method"><span>Raphael.deg()</span></a></li><li class="dr-lvl1"><a href="#Raphael.easing_formulas" class="dr-property"><span>Raphael.easing_formulas</span></a></li><li class="dr-lvl1"><a href="#Raphael.el" class="dr-property"><span>Raphael.el</span></a></li><li class="dr-lvl1"><a href="#Raphael.findDotsAtSegment" class="dr-method"><span>Raphael.findDotsAtSegment()</span></a></li><li class="dr-lvl1"><a href="#Raphael.fn" class="dr-property"><span>Raphael.fn</span></a></li><li class="dr-lvl1"><a href="#Raphael.getColor" class="dr-method"><span>Raphael.getColor()</span></a></li><li class="dr-lvl2"><a href="#Raphael.getColor.reset" class="dr-method"><span>Raphael.getColor.reset()</span></a></li><li class="dr-lvl1"><a href="#Raphael.getPointAtLength" class="dr-method"><span>Raphael.getPointAtLength()</span></a></li><li class="dr-lvl1"><a href="#Raphael.getRGB" class="dr-method"><span>Raphael.getRGB()</span></a></li><li class="dr-lvl1"><a href="#Raphael.getSubpath" class="dr-method"><span>Raphael.getSubpath()</span></a></li><li class="dr-lvl1"><a href="#Raphael.getTotalLength" class="dr-method"><span>Raphael.getTotalLength()</span></a></li><li class="dr-lvl1"><a href="#Raphael.hsb" class="dr-method"><span>Raphael.hsb()</span></a></li><li class="dr-lvl1"><a href="#Raphael.hsb2rgb" class="dr-method"><span>Raphael.hsb2rgb()</span></a></li><li class="dr-lvl1"><a href="#Raphael.hsl" class="dr-method"><span>Raphael.hsl()</span></a></li><li class="dr-lvl1"><a href="#Raphael.hsl2rgb" class="dr-method"><span>Raphael.hsl2rgb()</span></a></li><li class="dr-lvl1"><a href="#Raphael.is" class="dr-method"><span>Raphael.is()</span></a></li><li class="dr-lvl1"><a href="#Raphael.parsePathString" class="dr-method"><span>Raphael.parsePathString()</span></a></li><li class="dr-lvl1"><a href="#Raphael.parseTransformString" class="dr-method"><span>Raphael.parseTransformString()</span></a></li><li class="dr-lvl1"><a href="#Raphael.path2curve" class="dr-method"><span>Raphael.path2curve()</span></a></li><li class="dr-lvl1"><a href="#Raphael.pathToRelative" class="dr-method"><span>Raphael.pathToRelative()</span></a></li><li class="dr-lvl1"><a href="#Raphael.rad" class="dr-method"><span>Raphael.rad()</span></a></li><li class="dr-lvl1"><a href="#Raphael.rgb" class="dr-method"><span>Raphael.rgb()</span></a></li><li class="dr-lvl1"><a href="#Raphael.rgb2hsb" class="dr-method"><span>Raphael.rgb2hsb()</span></a></li><li class="dr-lvl1"><a href="#Raphael.rgb2hsl" class="dr-method"><span>Raphael.rgb2hsl()</span></a></li><li class="dr-lvl1"><a href="#Raphael.setWindow" class="dr-method"><span>Raphael.setWindow()</span></a></li><li class="dr-lvl1"><a href="#Raphael.snapTo" class="dr-method"><span>Raphael.snapTo()</span></a></li><li class="dr-lvl1"><a href="#Raphael.svg" class="dr-property"><span>Raphael.svg</span></a></li><li class="dr-lvl1"><a href="#Raphael.type" class="dr-property"><span>Raphael.type</span></a></li><li class="dr-lvl1"><a href="#Raphael.vml" class="dr-property"><span>Raphael.vml</span></a></li><li class="dr-lvl0"><a href="#Set" class="undefined"><span>Set</span></a></li><li class="dr-lvl1"><a href="#Set.forEach" class="dr-method"><span>Set.forEach()</span></a></li><li class="dr-lvl1"><a href="#Set.pop" class="dr-method"><span>Set.pop()</span></a></li><li class="dr-lvl1"><a href="#Set.push" class="dr-method"><span>Set.push()</span></a></li></ol><div class="dr-doc"><h1>Raphaël Reference</h1><p class="dr-source">Check out the source: <a href="raphael-src.html">raphael.js</a></p><h2 id="Animation" class="undefined"><i class="dr-trixie">&#160;</i>Animation<a href="#Animation" title="Link to this section" class="dr-hash">&#x2693;</a></h2>
+<h3 id="Animation.delay" class="dr-method"><i class="dr-trixie">&#160;</i>Animation.delay(delay)<a href="#Animation.delay" title="Link to this section" class="dr-hash">&#x2693;</a><a class="dr-sourceline" title="Go to source" href="raphael-src.html#L5146">&#x27ad;</a></h3>
 <div class="dr-method"><p>Creates a copy of existing animation object with given delay.
 </p>
 <p class="header">Parameters
@@ -11,7 +11,7 @@
 <dd class="dr-description">number of ms to pass between animation start and actual animation</dd>
 </dl>
 <p class="dr-returns"><strong class="dr-title">Returns:</strong> <em class="dr-type-object">object</em> <span class="dr-description">new altered Animation object</span></p>
-</div><h3 id="Animation.repeat" class="dr-method"><i class="dr-trixie">&#160;</i>Animation.repeat(repeat)<a href="#Animation.repeat" title="Link to this section" class="dr-hash">&#x2693;</a><a class="dr-sourceline" title="Go to source" href="raphael-src.html#L5108">&#x27ad;</a></h3>
+</div><h3 id="Animation.repeat" class="dr-method"><i class="dr-trixie">&#160;</i>Animation.repeat(repeat)<a href="#Animation.repeat" title="Link to this section" class="dr-hash">&#x2693;</a><a class="dr-sourceline" title="Go to source" href="raphael-src.html#L5164">&#x27ad;</a></h3>
 <div class="dr-method"><p>Creates a copy of existing animation object with given repetition.
 </p>
 <p class="header">Parameters
@@ -22,7 +22,7 @@
 </dl>
 <p class="dr-returns"><strong class="dr-title">Returns:</strong> <em class="dr-type-object">object</em> <span class="dr-description">new altered Animation object</span></p>
 </div><h2 id="Element" class="undefined"><i class="dr-trixie">&#160;</i>Element<a href="#Element" title="Link to this section" class="dr-hash">&#x2693;</a></h2>
-<h3 id="Element.animate" class="dr-method"><i class="dr-trixie">&#160;</i>Element.animate(…)<a href="#Element.animate" title="Link to this section" class="dr-hash">&#x2693;</a><a class="dr-sourceline" title="Go to source" href="raphael-src.html#L5367">&#x27ad;</a></h3>
+<h3 id="Element.animate" class="dr-method"><i class="dr-trixie">&#160;</i>Element.animate(…)<a href="#Element.animate" title="Link to this section" class="dr-hash">&#x2693;</a><a class="dr-sourceline" title="Go to source" href="raphael-src.html#L5423">&#x27ad;</a></h3>
 <div class="dr-method"><p>Creates and starts animation for given element.
 </p>
 <p class="header">Parameters
@@ -49,7 +49,7 @@
 <dd class="dr-description">animation object, see <a href="#Raphael.animation" class="dr-link">Raphael.animation</a></dd>
 </dl>
 <p class="dr-returns"><strong class="dr-title">Returns:</strong> <em class="dr-type-object">object</em> <span class="dr-description">original element</span></p>
-</div><h3 id="Element.animateWith" class="dr-method"><i class="dr-trixie">&#160;</i>Element.animateWith(…)<a href="#Element.animateWith" title="Link to this section" class="dr-hash">&#x2693;</a><a class="dr-sourceline" title="Go to source" href="raphael-src.html#L4999">&#x27ad;</a></h3>
+</div><h3 id="Element.animateWith" class="dr-method"><i class="dr-trixie">&#160;</i>Element.animateWith(…)<a href="#Element.animateWith" title="Link to this section" class="dr-hash">&#x2693;</a><a class="dr-sourceline" title="Go to source" href="raphael-src.html#L5051">&#x27ad;</a></h3>
 <div class="dr-method"><p>Acts similar to <a href="#Element.animate" class="dr-link">Element.animate</a>, but ensure that given animation runs in sync with another given element.
 </p>
 <p class="header">Parameters
@@ -177,9 +177,9 @@ at 0.25, 0.75. Focus point coordinates are in 0..1 range. Radial gradients can o
     <li>hsla(•••, •••, •••) — same as above, but with opacity</li>
     <li>Optionally for hsb and hsl you could specify hue as a degree: “<code>hsl(240deg,&nbsp;1,&nbsp;.5)</code>” or, if you want to go fancy, “<code>hsl(240°,&nbsp;1,&nbsp;.5)</code>”</li>
 </ul>
-</div><h3 id="Element.clone" class="dr-method"><i class="dr-trixie">&#160;</i>Element.clone()<a href="#Element.clone" title="Link to this section" class="dr-hash">&#x2693;</a><a class="dr-sourceline" title="Go to source" href="raphael-src.html#L4546">&#x27ad;</a></h3>
+</div><h3 id="Element.clone" class="dr-method"><i class="dr-trixie">&#160;</i>Element.clone()<a href="#Element.clone" title="Link to this section" class="dr-hash">&#x2693;</a><a class="dr-sourceline" title="Go to source" href="raphael-src.html#L4579">&#x27ad;</a></h3>
 <div class="dr-method"><p class="dr-returns"><strong class="dr-title">Returns:</strong> <em class="dr-type-object">object</em> <span class="dr-description">clone of a given element</span></p>
-</div><h3 id="Element.drag" class="dr-method"><i class="dr-trixie">&#160;</i>Element.drag(onmove, onstart, onend, [mcontext], [scontext], [econtext])<a href="#Element.drag" title="Link to this section" class="dr-hash">&#x2693;</a><a class="dr-sourceline" title="Go to source" href="raphael-src.html#L4148">&#x27ad;</a></h3>
+</div><h3 id="Element.drag" class="dr-method"><i class="dr-trixie">&#160;</i>Element.drag(onmove, onstart, onend, [mcontext], [scontext], [econtext])<a href="#Element.drag" title="Link to this section" class="dr-hash">&#x2693;</a><a class="dr-sourceline" title="Go to source" href="raphael-src.html#L4181">&#x27ad;</a></h3>
 <div class="dr-method"><p>Adds event handlers for drag of the element.
 </p>
 <p class="header">Parameters
@@ -229,7 +229,7 @@ at 0.25, 0.75. Focus point coordinates are in 0..1 range. Radial gradients can o
 <ol class="dr-json"><li><span class="dr-json-key">event</span><span class="dr-type"><em class="dr-type-object">object</em></span><span class="dr-json-description">DOM event object</span>
 </ol>
 <p class="dr-returns"><strong class="dr-title">Returns:</strong> <em class="dr-type-object">object</em> <span class="dr-description"><a href="#Element" class="dr-link">Element</a></span></p>
-</div><h3 id="Element.getBBox" class="dr-method"><i class="dr-trixie">&#160;</i>Element.getBBox(isWithoutTransform)<a href="#Element.getBBox" title="Link to this section" class="dr-hash">&#x2693;</a><a class="dr-sourceline" title="Go to source" href="raphael-src.html#L4514">&#x27ad;</a></h3>
+</div><h3 id="Element.getBBox" class="dr-method"><i class="dr-trixie">&#160;</i>Element.getBBox(isWithoutTransform)<a href="#Element.getBBox" title="Link to this section" class="dr-hash">&#x2693;</a><a class="dr-sourceline" title="Go to source" href="raphael-src.html#L4547">&#x27ad;</a></h3>
 <div class="dr-method"><p>Return bounding box for a given element
 </p>
 <p class="header">Parameters
@@ -244,7 +244,7 @@ at 0.25, 0.75. Focus point coordinates are in 0..1 range. Radial gradients can o
 <li><span class="dr-json-key">width:</span><span class="dr-type"><em class="dr-type-number">number</em></span><span class="dr-json-description">width</span>
 <li><span class="dr-json-key">height:</span><span class="dr-type"><em class="dr-type-number">number</em></span><span class="dr-json-description">height</span>
 </ol></li><li>}</li></ol>
-</div><h3 id="Element.getPointAtLength" class="dr-method"><i class="dr-trixie">&#160;</i>Element.getPointAtLength(length)<a href="#Element.getPointAtLength" title="Link to this section" class="dr-hash">&#x2693;</a><a class="dr-sourceline" title="Go to source" href="raphael-src.html#L4749">&#x27ad;</a></h3>
+</div><h3 id="Element.getPointAtLength" class="dr-method"><i class="dr-trixie">&#160;</i>Element.getPointAtLength(length)<a href="#Element.getPointAtLength" title="Link to this section" class="dr-hash">&#x2693;</a><a class="dr-sourceline" title="Go to source" href="raphael-src.html#L4800">&#x27ad;</a></h3>
 <div class="dr-method"><p>Return coordinates of the point located at the given length on the given path. Only works for element of “path” type.
 </p>
 <p class="header">Parameters
@@ -258,7 +258,7 @@ at 0.25, 0.75. Focus point coordinates are in 0..1 range. Radial gradients can o
 <li><span class="dr-json-key">y:</span><span class="dr-type"><em class="dr-type-number">number</em></span><span class="dr-json-description">y coordinate</span>
 <li><span class="dr-json-key">alpha:</span><span class="dr-type"><em class="dr-type-number">number</em></span><span class="dr-json-description">angle of derivative</span>
 </ol></li><li>}</li></ol>
-</div><h3 id="Element.getSubpath" class="dr-method"><i class="dr-trixie">&#160;</i>Element.getSubpath(from, to)<a href="#Element.getSubpath" title="Link to this section" class="dr-hash">&#x2693;</a><a class="dr-sourceline" title="Go to source" href="raphael-src.html#L4766">&#x27ad;</a></h3>
+</div><h3 id="Element.getSubpath" class="dr-method"><i class="dr-trixie">&#160;</i>Element.getSubpath(from, to)<a href="#Element.getSubpath" title="Link to this section" class="dr-hash">&#x2693;</a><a class="dr-sourceline" title="Go to source" href="raphael-src.html#L4817">&#x27ad;</a></h3>
 <div class="dr-method"><p>Return subpath of a given element from given length to given length. Only works for element of “path” type.
 </p>
 <p class="header">Parameters
@@ -271,21 +271,31 @@ at 0.25, 0.75. Focus point coordinates are in 0..1 range. Radial gradients can o
 <dd class="dr-description">position of the end of the segment</dd>
 </dl>
 <p class="dr-returns"><strong class="dr-title">Returns:</strong> <em class="dr-type-string">string</em> <span class="dr-description">pathstring for the segment</span></p>
-</div><h3 id="Element.getTotalLength" class="dr-method"><i class="dr-trixie">&#160;</i>Element.getTotalLength()<a href="#Element.getTotalLength" title="Link to this section" class="dr-hash">&#x2693;</a><a class="dr-sourceline" title="Go to source" href="raphael-src.html#L4725">&#x27ad;</a></h3>
+</div><h3 id="Element.getTotalLength" class="dr-method"><i class="dr-trixie">&#160;</i>Element.getTotalLength()<a href="#Element.getTotalLength" title="Link to this section" class="dr-hash">&#x2693;</a><a class="dr-sourceline" title="Go to source" href="raphael-src.html#L4776">&#x27ad;</a></h3>
 <div class="dr-method"><p>Returns length of the path in pixels. Only works for element of “path” type.
 </p>
 <p class="dr-returns"><strong class="dr-title">Returns:</strong> <em class="dr-type-number">number</em> <span class="dr-description">length.</span></p>
-</div><h3 id="Element.glow" class="dr-method"><i class="dr-trixie">&#160;</i>Element.glow()<a href="#Element.glow" title="Link to this section" class="dr-hash">&#x2693;</a><a class="dr-sourceline" title="Go to source" href="raphael-src.html#L4565">&#x27ad;</a></h3>
+</div><h3 id="Element.glow" class="dr-method"><i class="dr-trixie">&#160;</i>Element.glow([glow])<a href="#Element.glow" title="Link to this section" class="dr-hash">&#x2693;</a><a class="dr-sourceline" title="Go to source" href="raphael-src.html#L4609">&#x27ad;</a></h3>
 <div class="dr-method"><p>Return set of elements that create glow-like effect around given element. See <a href="#Paper.set" class="dr-link">Paper.set</a>.
 </p>
 <p>Note: Glow is not connected to the element. If you change element attributes it won’t adjust itself.
 </p>
+<p class="header">Parameters
+</p>
+<dl class="dr-parameters"><dt class="dr-param optional">glow</dt>
+<dd class="dr-optional">optional</dd>
+<dd class="dr-type"><em class="dr-type-object">object</em></dd>
+<dd class="dr-description">parameters object with all properties optional:</dd>
+</dl>
+<ol class="dr-json"><li>{<ol class="dr-json"><li><span class="dr-json-key">width</span><span class="dr-type"><em class="dr-type-number">number</em></span><span class="dr-json-description">size of the glow, default is <code>10</code></span>
+<li><span class="dr-json-key">fill</span><span class="dr-type"><em class="dr-type-boolean">boolean</em></span><span class="dr-json-description">will it be filled, default is <code>false</code></span>
+<li>    opacity: opacity, default is `0.5`<li>    offsetx: horizontal offset, default is `0`<li>    offsety: vertical offset, default is `0`<li>    color: glow colour, default is `black`</ol></li><li>}</li></ol>
 <p class="dr-returns"><strong class="dr-title">Returns:</strong> <em class="dr-type-object">object</em> <span class="dr-description"><a href="#Paper.set" class="dr-link">Paper.set</a> of elements that represents glow</span></p>
 </div><h3 id="Element.hide" class="dr-method"><i class="dr-trixie">&#160;</i>Element.hide()<a href="#Element.hide" title="Link to this section" class="dr-hash">&#x2693;</a><a class="dr-sourceline" title="Go to source" href="raphael-src.html#L2584">&#x27ad;</a></h3>
 <div class="dr-method"><p>Makes element invisible. See <a href="#Element.show" class="dr-link">Element.show</a>.
 </p>
 <p class="dr-returns"><strong class="dr-title">Returns:</strong> <em class="dr-type-object">object</em> <span class="dr-description"><a href="#Element" class="dr-link">Element</a></span></p>
-</div><h3 id="Element.hover" class="dr-method"><i class="dr-trixie">&#160;</i>Element.hover(f_in, f_out, [icontext], [ocontext])<a href="#Element.hover" title="Link to this section" class="dr-hash">&#x2693;</a><a class="dr-sourceline" title="Go to source" href="raphael-src.html#L4102">&#x27ad;</a></h3>
+</div><h3 id="Element.hover" class="dr-method"><i class="dr-trixie">&#160;</i>Element.hover(f_in, f_out, [icontext], [ocontext])<a href="#Element.hover" title="Link to this section" class="dr-hash">&#x2693;</a><a class="dr-sourceline" title="Go to source" href="raphael-src.html#L4135">&#x27ad;</a></h3>
 <div class="dr-method"><p>Adds event handlers for hover for the element.
 </p>
 <p class="header">Parameters
@@ -332,7 +342,7 @@ c.node.onclick<span class="s"> = </span><b>function</b> () {
     c.attr(<i>"fill"</i>, <i>"red"</i>);
 };
 </code></pre>
-</div><h3 id="Element.onDragOver" class="dr-method"><i class="dr-trixie">&#160;</i>Element.onDragOver(f)<a href="#Element.onDragOver" title="Link to this section" class="dr-hash">&#x2693;</a><a class="dr-sourceline" title="Go to source" href="raphael-src.html#L4175">&#x27ad;</a></h3>
+</div><h3 id="Element.onDragOver" class="dr-method"><i class="dr-trixie">&#160;</i>Element.onDragOver(f)<a href="#Element.onDragOver" title="Link to this section" class="dr-hash">&#x2693;</a><a class="dr-sourceline" title="Go to source" href="raphael-src.html#L4208">&#x27ad;</a></h3>
 <div class="dr-method"><p>Shortcut for assigning event handler for <code>drag.over.&lt;id></code> event, where id is id of the element (see <a href="#Element.id" class="dr-link">Element.id</a>).
 </p>
 <p class="header">Parameters
@@ -352,7 +362,7 @@ c.node.onclick<span class="s"> = </span><b>function</b> () {
         .attr({stroke: <i>"red"</i>});
 }
 </code></pre>
-</div><h3 id="Element.pause" class="dr-method"><i class="dr-trixie">&#160;</i>Element.pause([anim])<a href="#Element.pause" title="Link to this section" class="dr-hash">&#x2693;</a><a class="dr-sourceline" title="Go to source" href="raphael-src.html#L5457">&#x27ad;</a></h3>
+</div><h3 id="Element.pause" class="dr-method"><i class="dr-trixie">&#160;</i>Element.pause([anim])<a href="#Element.pause" title="Link to this section" class="dr-hash">&#x2693;</a><a class="dr-sourceline" title="Go to source" href="raphael-src.html#L5513">&#x27ad;</a></h3>
 <div class="dr-method"><p>Stops animation of the element with ability to resume it later on.
 </p>
 <p class="header">Parameters
@@ -380,7 +390,7 @@ c.node.onclick<span class="s"> = </span><b>function</b> () {
 </div><h3 id="Element.remove" class="dr-method"><i class="dr-trixie">&#160;</i>Element.remove()<a href="#Element.remove" title="Link to this section" class="dr-hash">&#x2693;</a><a class="dr-sourceline" title="Go to source" href="raphael-src.html#L2605">&#x27ad;</a></h3>
 <div class="dr-method"><p>Removes element form the paper.
 </p>
-</div><h3 id="Element.resume" class="dr-method"><i class="dr-trixie">&#160;</i>Element.resume([anim])<a href="#Element.resume" title="Link to this section" class="dr-hash">&#x2693;</a><a class="dr-sourceline" title="Go to source" href="raphael-src.html#L5477">&#x27ad;</a></h3>
+</div><h3 id="Element.resume" class="dr-method"><i class="dr-trixie">&#160;</i>Element.resume([anim])<a href="#Element.resume" title="Link to this section" class="dr-hash">&#x2693;</a><a class="dr-sourceline" title="Go to source" href="raphael-src.html#L5533">&#x27ad;</a></h3>
 <div class="dr-method"><p>Resumes animation if it was paused with <a href="#Element.pause" class="dr-link">Element.pause</a> method.
 </p>
 <p class="header">Parameters
@@ -436,7 +446,7 @@ transformations of the element.
 <p>If cx <em class="amp">&amp;</em> cy aren’t specified centre of the shape is used instead.
 </p>
 <p class="dr-returns"><strong class="dr-title">Returns:</strong> <em class="dr-type-object">object</em> <span class="dr-description"><a href="#Element" class="dr-link">Element</a></span></p>
-</div><h3 id="Element.setTime" class="dr-method"><i class="dr-trixie">&#160;</i>Element.setTime(anim, value)<a href="#Element.setTime" title="Link to this section" class="dr-hash">&#x2693;</a><a class="dr-sourceline" title="Go to source" href="raphael-src.html#L5393">&#x27ad;</a></h3>
+</div><h3 id="Element.setTime" class="dr-method"><i class="dr-trixie">&#160;</i>Element.setTime(anim, value)<a href="#Element.setTime" title="Link to this section" class="dr-hash">&#x2693;</a><a class="dr-sourceline" title="Go to source" href="raphael-src.html#L5449">&#x27ad;</a></h3>
 <div class="dr-method"><p>Sets the status of animation of the element in milliseconds. Similar to <a href="#Element.status" class="dr-link">Element.status</a> method.
 </p>
 <p class="header">Parameters
@@ -457,7 +467,7 @@ transformations of the element.
 <div class="dr-method"><p>Makes element visible. See <a href="#Element.hide" class="dr-link">Element.hide</a>.
 </p>
 <p class="dr-returns"><strong class="dr-title">Returns:</strong> <em class="dr-type-object">object</em> <span class="dr-description"><a href="#Element" class="dr-link">Element</a></span></p>
-</div><h3 id="Element.status" class="dr-method"><i class="dr-trixie">&#160;</i>Element.status([anim], [value])<a href="#Element.status" title="Link to this section" class="dr-hash">&#x2693;</a><a class="dr-sourceline" title="Go to source" href="raphael-src.html#L5420">&#x27ad;</a></h3>
+</div><h3 id="Element.status" class="dr-method"><i class="dr-trixie">&#160;</i>Element.status([anim], [value])<a href="#Element.status" title="Link to this section" class="dr-hash">&#x2693;</a><a class="dr-sourceline" title="Go to source" href="raphael-src.html#L5476">&#x27ad;</a></h3>
 <div class="dr-method"><p>Gets or sets the status of animation of the element.
 </p>
 <p class="header">Parameters
@@ -481,7 +491,7 @@ transformations of the element.
 <p>or
 </p>
 <p class="dr-returns"><strong class="dr-title">Returns:</strong> <em class="dr-type-object">object</em> <span class="dr-description">original element if <code>value</code> is specified</span></p>
-</div><h3 id="Element.stop" class="dr-method"><i class="dr-trixie">&#160;</i>Element.stop([anim])<a href="#Element.stop" title="Link to this section" class="dr-hash">&#x2693;</a><a class="dr-sourceline" title="Go to source" href="raphael-src.html#L5499">&#x27ad;</a></h3>
+</div><h3 id="Element.stop" class="dr-method"><i class="dr-trixie">&#160;</i>Element.stop([anim])<a href="#Element.stop" title="Link to this section" class="dr-hash">&#x2693;</a><a class="dr-sourceline" title="Go to source" href="raphael-src.html#L5555">&#x27ad;</a></h3>
 <div class="dr-method"><p>Stops animation of the element.
 </p>
 <p class="header">Parameters
@@ -556,10 +566,10 @@ console.log(el.transform());
 <dd class="dr-description">vertical shift</dd>
 </dl>
 <p class="dr-returns"><strong class="dr-title">Returns:</strong> <em class="dr-type-object">object</em> <span class="dr-description"><a href="#Element" class="dr-link">Element</a></span></p>
-</div><h3 id="Element.undrag" class="dr-method"><i class="dr-trixie">&#160;</i>Element.undrag()<a href="#Element.undrag" title="Link to this section" class="dr-hash">&#x2693;</a><a class="dr-sourceline" title="Go to source" href="raphael-src.html#L4184">&#x27ad;</a></h3>
+</div><h3 id="Element.undrag" class="dr-method"><i class="dr-trixie">&#160;</i>Element.undrag()<a href="#Element.undrag" title="Link to this section" class="dr-hash">&#x2693;</a><a class="dr-sourceline" title="Go to source" href="raphael-src.html#L4217">&#x27ad;</a></h3>
 <div class="dr-method"><p>Removes all drag event handlers from given element.
 </p>
-</div><h3 id="Element.unhover" class="dr-method"><i class="dr-trixie">&#160;</i>Element.unhover(f_in, f_out)<a href="#Element.unhover" title="Link to this section" class="dr-hash">&#x2693;</a><a class="dr-sourceline" title="Go to source" href="raphael-src.html#L4115">&#x27ad;</a></h3>
+</div><h3 id="Element.unhover" class="dr-method"><i class="dr-trixie">&#160;</i>Element.unhover(f_in, f_out)<a href="#Element.unhover" title="Link to this section" class="dr-hash">&#x2693;</a><a class="dr-sourceline" title="Go to source" href="raphael-src.html#L4148">&#x27ad;</a></h3>
 <div class="dr-method"><p>Removes event handlers for hover for the element.
 </p>
 <p class="header">Parameters
@@ -573,10 +583,10 @@ console.log(el.transform());
 </dl>
 <p class="dr-returns"><strong class="dr-title">Returns:</strong> <em class="dr-type-object">object</em> <span class="dr-description"><a href="#Element" class="dr-link">Element</a></span></p>
 </div><h2 id="Paper" class="undefined"><i class="dr-trixie">&#160;</i>Paper<a href="#Paper" title="Link to this section" class="dr-hash">&#x2693;</a></h2>
-<h3 id="Paper.bottom" class="dr-property"><i class="dr-trixie">&#160;</i>Paper.bottom<a href="#Paper.bottom" title="Link to this section" class="dr-hash">&#x2693;</a><a class="dr-sourceline" title="Go to source" href="raphael-src.html#L4386">&#x27ad;</a></h3>
+<h3 id="Paper.bottom" class="dr-property"><i class="dr-trixie">&#160;</i>Paper.bottom<a href="#Paper.bottom" title="Link to this section" class="dr-hash">&#x2693;</a><a class="dr-sourceline" title="Go to source" href="raphael-src.html#L4419">&#x27ad;</a></h3>
 <div class="dr-property"><p>Points to the bottom element on the paper
 </p>
-</div><h3 id="Paper.circle" class="dr-method"><i class="dr-trixie">&#160;</i>Paper.circle(x, y, r)<a href="#Paper.circle" title="Link to this section" class="dr-hash">&#x2693;</a><a class="dr-sourceline" title="Go to source" href="raphael-src.html#L4209">&#x27ad;</a></h3>
+</div><h3 id="Paper.circle" class="dr-method"><i class="dr-trixie">&#160;</i>Paper.circle(x, y, r)<a href="#Paper.circle" title="Link to this section" class="dr-hash">&#x2693;</a><a class="dr-sourceline" title="Go to source" href="raphael-src.html#L4242">&#x27ad;</a></h3>
 <div class="dr-method"><p>Draws a circle.
 </p>
 <p class="header">Parameters
@@ -596,7 +606,7 @@ console.log(el.transform());
 </p>
 <pre class="javascript code"><code><b>var</b> c<span class="s"> = </span>paper.circle(<span class="d">50</span>, <span class="d">50</span>, <span class="d">40</span>);
 </code></pre>
-</div><h3 id="Paper.clear" class="dr-method"><i class="dr-trixie">&#160;</i>Paper.clear()<a href="#Paper.clear" title="Link to this section" class="dr-hash">&#x2693;</a><a class="dr-sourceline" title="Go to source" href="raphael-src.html#L2992">&#x27ad;</a></h3>
+</div><h3 id="Paper.clear" class="dr-method"><i class="dr-trixie">&#160;</i>Paper.clear()<a href="#Paper.clear" title="Link to this section" class="dr-hash">&#x2693;</a><a class="dr-sourceline" title="Go to source" href="raphael-src.html#L3024">&#x27ad;</a></h3>
 <div class="dr-method"><p>Clears the paper, i.e. removes all the elements.
 </p>
 </div><h3 id="Paper.customAttributes" class="dr-property"><i class="dr-trixie">&#160;</i>Paper.customAttributes<a href="#Paper.customAttributes" title="Link to this section" class="dr-hash">&#x2693;</a><a class="dr-sourceline" title="Go to source" href="raphael-src.html#L261">&#x27ad;</a></h3>
@@ -624,7 +634,7 @@ paper.customAttributes.hsb<span class="s"> = </span><b>function</b> (h, s, b) {
 c.attr({hsb: <i>"<span class="d">.5</span> <span class="d">.8</span> <span class="d">1</span>"</i>});
 c.animate({hsb: <i>"<span class="d">1</span> <span class="d">0</span> <span class="d">.5</span>"</i>}, <span class="d">1e3</span>);
 </code></pre>
-</div><h3 id="Paper.ellipse" class="dr-method"><i class="dr-trixie">&#160;</i>Paper.ellipse(x, y, rx, ry)<a href="#Paper.ellipse" title="Link to this section" class="dr-hash">&#x2693;</a><a class="dr-sourceline" title="Go to source" href="raphael-src.html#L4253">&#x27ad;</a></h3>
+</div><h3 id="Paper.ellipse" class="dr-method"><i class="dr-trixie">&#160;</i>Paper.ellipse(x, y, rx, ry)<a href="#Paper.ellipse" title="Link to this section" class="dr-hash">&#x2693;</a><a class="dr-sourceline" title="Go to source" href="raphael-src.html#L4286">&#x27ad;</a></h3>
 <div class="dr-method"><p>Draws an ellipse.
 </p>
 <p class="header">Parameters
@@ -647,7 +657,7 @@ c.animate({hsb: <i>"<span class="d">1</span> <span class="d">0</span> <span clas
 </p>
 <pre class="javascript code"><code><b>var</b> c<span class="s"> = </span>paper.ellipse(<span class="d">50</span>, <span class="d">50</span>, <span class="d">40</span>, <span class="d">20</span>);
 </code></pre>
-</div><h3 id="Paper.forEach" class="dr-method"><i class="dr-trixie">&#160;</i>Paper.forEach(callback, thisArg)<a href="#Paper.forEach" title="Link to this section" class="dr-hash">&#x2693;</a><a class="dr-sourceline" title="Go to source" href="raphael-src.html#L4481">&#x27ad;</a></h3>
+</div><h3 id="Paper.forEach" class="dr-method"><i class="dr-trixie">&#160;</i>Paper.forEach(callback, thisArg)<a href="#Paper.forEach" title="Link to this section" class="dr-hash">&#x2693;</a><a class="dr-sourceline" title="Go to source" href="raphael-src.html#L4514">&#x27ad;</a></h3>
 <div class="dr-method"><p>Executes given function for each element on the paper
 </p>
 <p>If callback function returns <code>false</code> it will stop loop running.
@@ -662,7 +672,7 @@ c.animate({hsb: <i>"<span class="d">1</span> <span class="d">0</span> <span clas
 <dd class="dr-description">context object for the callback</dd>
 </dl>
 <p class="dr-returns"><strong class="dr-title">Returns:</strong> <em class="dr-type-object">object</em> <span class="dr-description">Paper object</span></p>
-</div><h3 id="Paper.getById" class="dr-method"><i class="dr-trixie">&#160;</i>Paper.getById(id)<a href="#Paper.getById" title="Link to this section" class="dr-hash">&#x2693;</a><a class="dr-sourceline" title="Go to source" href="raphael-src.html#L4457">&#x27ad;</a></h3>
+</div><h3 id="Paper.getById" class="dr-method"><i class="dr-trixie">&#160;</i>Paper.getById(id)<a href="#Paper.getById" title="Link to this section" class="dr-hash">&#x2693;</a><a class="dr-sourceline" title="Go to source" href="raphael-src.html#L4490">&#x27ad;</a></h3>
 <div class="dr-method"><p>Returns you element by its internal ID.
 </p>
 <p class="header">Parameters
@@ -672,7 +682,7 @@ c.animate({hsb: <i>"<span class="d">1</span> <span class="d">0</span> <span clas
 <dd class="dr-description">id</dd>
 </dl>
 <p class="dr-returns"><strong class="dr-title">Returns:</strong> <em class="dr-type-object">object</em> <span class="dr-description">Raphaël element object</span></p>
-</div><h3 id="Paper.getElementByPoint" class="dr-method"><i class="dr-trixie">&#160;</i>Paper.getElementByPoint(x, y)<a href="#Paper.getElementByPoint" title="Link to this section" class="dr-hash">&#x2693;</a><a class="dr-sourceline" title="Go to source" href="raphael-src.html#L4421">&#x27ad;</a></h3>
+</div><h3 id="Paper.getElementByPoint" class="dr-method"><i class="dr-trixie">&#160;</i>Paper.getElementByPoint(x, y)<a href="#Paper.getElementByPoint" title="Link to this section" class="dr-hash">&#x2693;</a><a class="dr-sourceline" title="Go to source" href="raphael-src.html#L4454">&#x27ad;</a></h3>
 <div class="dr-method"><p>Returns you topmost element under given point.
 </p>
 <p class="dr-returns"><strong class="dr-title">Returns:</strong> <em class="dr-type-object">object</em> <span class="dr-description">Raphaël element object</span></p>
@@ -689,7 +699,7 @@ c.animate({hsb: <i>"<span class="d">1</span> <span class="d">0</span> <span clas
 </p>
 <pre class="javascript code"><code>paper.getElementByPoint(mouseX, mouseY).attr({stroke: <i>"#f00"</i>});
 </code></pre>
-</div><h3 id="Paper.image" class="dr-method"><i class="dr-trixie">&#160;</i>Paper.image(src, x, y, width, height)<a href="#Paper.image" title="Link to this section" class="dr-hash">&#x2693;</a><a class="dr-sourceline" title="Go to source" href="raphael-src.html#L4295">&#x27ad;</a></h3>
+</div><h3 id="Paper.image" class="dr-method"><i class="dr-trixie">&#160;</i>Paper.image(src, x, y, width, height)<a href="#Paper.image" title="Link to this section" class="dr-hash">&#x2693;</a><a class="dr-sourceline" title="Go to source" href="raphael-src.html#L4328">&#x27ad;</a></h3>
 <div class="dr-method"><p>Embeds an image into the surface.
 </p>
 <p class="header">Parameters
@@ -715,7 +725,7 @@ c.animate({hsb: <i>"<span class="d">1</span> <span class="d">0</span> <span clas
 </p>
 <pre class="javascript code"><code><b>var</b> c<span class="s"> = </span>paper.image(<i>"apple.png"</i>, <span class="d">10</span>, <span class="d">10</span>, <span class="d">80</span>, <span class="d">80</span>);
 </code></pre>
-</div><h3 id="Paper.path" class="dr-method"><i class="dr-trixie">&#160;</i>Paper.path(pathString)<a href="#Paper.path" title="Link to this section" class="dr-hash">&#x2693;</a><a class="dr-sourceline" title="Go to source" href="raphael-src.html#L4273">&#x27ad;</a></h3>
+</div><h3 id="Paper.path" class="dr-method"><i class="dr-trixie">&#160;</i>Paper.path(pathString)<a href="#Paper.path" title="Link to this section" class="dr-hash">&#x2693;</a><a class="dr-sourceline" title="Go to source" href="raphael-src.html#L4306">&#x27ad;</a></h3>
 <div class="dr-method"><p>Creates a path element by given path data string.
 </p>
 <p class="header">Parameters
@@ -732,10 +742,10 @@ Details of a path's data attribute's format are described in the <a href="http:/
 <span class="c">// draw a diagonal line:</span>
 <span class="c">// move to <span class="d">10</span>,<span class="d">10</span>, line to <span class="d">90</span>,<span class="d">90</span></span>
 </code></pre>
-</div><h3 id="Paper.raphael" class="dr-property"><i class="dr-trixie">&#160;</i>Paper.raphael<a href="#Paper.raphael" title="Link to this section" class="dr-hash">&#x2693;</a><a class="dr-sourceline" title="Go to source" href="raphael-src.html#L4393">&#x27ad;</a></h3>
+</div><h3 id="Paper.raphael" class="dr-property"><i class="dr-trixie">&#160;</i>Paper.raphael<a href="#Paper.raphael" title="Link to this section" class="dr-hash">&#x2693;</a><a class="dr-sourceline" title="Go to source" href="raphael-src.html#L4426">&#x27ad;</a></h3>
 <div class="dr-property"><p>Points to the <a href="#Raphael" class="dr-link">Raphael</a> object/function
 </p>
-</div><h3 id="Paper.rect" class="dr-method"><i class="dr-trixie">&#160;</i>Paper.rect(x, y, width, height, [r])<a href="#Paper.rect" title="Link to this section" class="dr-hash">&#x2693;</a><a class="dr-sourceline" title="Go to source" href="raphael-src.html#L4233">&#x27ad;</a></h3>
+</div><h3 id="Paper.rect" class="dr-method"><i class="dr-trixie">&#160;</i>Paper.rect(x, y, width, height, [r])<a href="#Paper.rect" title="Link to this section" class="dr-hash">&#x2693;</a><a class="dr-sourceline" title="Go to source" href="raphael-src.html#L4266">&#x27ad;</a></h3>
 <div class="dr-method"><p></p>
 <p>Draws a rectangle.
 </p>
@@ -766,15 +776,20 @@ Details of a path's data attribute's format are described in the <a href="http:/
 <span class="c">// rectangle <b>with</b> rounded corners</span>
 <b>var</b> c<span class="s"> = </span>paper.rect(<span class="d">40</span>, <span class="d">40</span>, <span class="d">50</span>, <span class="d">50</span>, <span class="d">10</span>);
 </code></pre>
-</div><h3 id="Paper.remove" class="dr-method"><i class="dr-trixie">&#160;</i>Paper.remove()<a href="#Paper.remove" title="Link to this section" class="dr-hash">&#x2693;</a><a class="dr-sourceline" title="Go to source" href="raphael-src.html#L3009">&#x27ad;</a></h3>
+</div><h3 id="Paper.remove" class="dr-method"><i class="dr-trixie">&#160;</i>Paper.remove()<a href="#Paper.remove" title="Link to this section" class="dr-hash">&#x2693;</a><a class="dr-sourceline" title="Go to source" href="raphael-src.html#L3041">&#x27ad;</a></h3>
 <div class="dr-method"><p>Removes the paper from the DOM.
 </p>
-</div><h3 id="Paper.safari" class="dr-method"><i class="dr-trixie">&#160;</i>Paper.safari()<a href="#Paper.safari" title="Link to this section" class="dr-hash">&#x2693;</a><a class="dr-sourceline" title="Go to source" href="raphael-src.html#L3953">&#x27ad;</a></h3>
+</div><h3 id="Paper.renderfix" class="dr-method"><i class="dr-trixie">&#160;</i>Paper.renderfix()<a href="#Paper.renderfix" title="Link to this section" class="dr-hash">&#x2693;</a><a class="dr-sourceline" title="Go to source" href="raphael-src.html#L3001">&#x27ad;</a></h3>
+<div class="dr-method"><p>Fixes the issue of Firefox and IE9 regarding subpixel rendering. If paper is dependant
+on other elements after reflow it could shift half pixel which cause for lines to lost their crispness.
+This method fixes the issue.
+</p>
+</div><h3 id="Paper.safari" class="dr-method"><i class="dr-trixie">&#160;</i>Paper.safari()<a href="#Paper.safari" title="Link to this section" class="dr-hash">&#x2693;</a><a class="dr-sourceline" title="Go to source" href="raphael-src.html#L3986">&#x27ad;</a></h3>
 <div class="dr-method"><p>There is an inconvenient rendering bug in Safari (WebKit):
 sometimes the rendering should be forced.
 This method should help with dealing with this bug.
 </p>
-</div><h3 id="Paper.set" class="dr-method"><i class="dr-trixie">&#160;</i>Paper.set()<a href="#Paper.set" title="Link to this section" class="dr-hash">&#x2693;</a><a class="dr-sourceline" title="Go to source" href="raphael-src.html#L4334">&#x27ad;</a></h3>
+</div><h3 id="Paper.set" class="dr-method"><i class="dr-trixie">&#160;</i>Paper.set()<a href="#Paper.set" title="Link to this section" class="dr-hash">&#x2693;</a><a class="dr-sourceline" title="Go to source" href="raphael-src.html#L4367">&#x27ad;</a></h3>
 <div class="dr-method"><p>Creates array-like object to keep and operate several elements at once.
 Warning: it doesn’t create any elements for itself in the page, it just groups existing elements.
 Sets act as pseudo elements — all methods available to an element can be used on a set.
@@ -789,7 +804,7 @@ st.push(
 );
 st.attr({fill: <i>"red"</i>});
 </code></pre>
-</div><h3 id="Paper.setSize" class="dr-method"><i class="dr-trixie">&#160;</i>Paper.setSize(width, height)<a href="#Paper.setSize" title="Link to this section" class="dr-hash">&#x2693;</a><a class="dr-sourceline" title="Go to source" href="raphael-src.html#L4356">&#x27ad;</a></h3>
+</div><h3 id="Paper.setSize" class="dr-method"><i class="dr-trixie">&#160;</i>Paper.setSize(width, height)<a href="#Paper.setSize" title="Link to this section" class="dr-hash">&#x2693;</a><a class="dr-sourceline" title="Go to source" href="raphael-src.html#L4389">&#x27ad;</a></h3>
 <div class="dr-method"><p>If you need to change dimensions of the canvas call this method
 </p>
 <p class="header">Parameters
@@ -810,7 +825,7 @@ st.push(
 );
 st.attr({fill: <i>"red"</i>});
 </code></pre>
-</div><h3 id="Paper.setViewBox" class="dr-method"><i class="dr-trixie">&#160;</i>Paper.setViewBox(x, y, w, h, fit)<a href="#Paper.setViewBox" title="Link to this section" class="dr-hash">&#x2693;</a><a class="dr-sourceline" title="Go to source" href="raphael-src.html#L4373">&#x27ad;</a></h3>
+</div><h3 id="Paper.setViewBox" class="dr-method"><i class="dr-trixie">&#160;</i>Paper.setViewBox(x, y, w, h, fit)<a href="#Paper.setViewBox" title="Link to this section" class="dr-hash">&#x2693;</a><a class="dr-sourceline" title="Go to source" href="raphael-src.html#L4406">&#x27ad;</a></h3>
 <div class="dr-method"><p>Sets the view box of the paper. Practically it gives you ability to zoom and pan whole paper surface by 
 specifying new boundaries.
 </p>
@@ -832,7 +847,7 @@ specifying new boundaries.
 <dd class="dr-type"><em class="dr-type-boolean">boolean</em></dd>
 <dd class="dr-description"><code>true</code> if you want graphics to fit into new boundary box</dd>
 </dl>
-</div><h3 id="Paper.text" class="dr-method"><i class="dr-trixie">&#160;</i>Paper.text(x, y, text)<a href="#Paper.text" title="Link to this section" class="dr-hash">&#x2693;</a><a class="dr-sourceline" title="Go to source" href="raphael-src.html#L4314">&#x27ad;</a></h3>
+</div><h3 id="Paper.text" class="dr-method"><i class="dr-trixie">&#160;</i>Paper.text(x, y, text)<a href="#Paper.text" title="Link to this section" class="dr-hash">&#x2693;</a><a class="dr-sourceline" title="Go to source" href="raphael-src.html#L4347">&#x27ad;</a></h3>
 <div class="dr-method"><p>Draws a text string. If you need line breaks, put “\n” in the string.
 </p>
 <p class="header">Parameters
@@ -852,7 +867,7 @@ specifying new boundaries.
 </p>
 <pre class="javascript code"><code><b>var</b> t<span class="s"> = </span>paper.text(<span class="d">50</span>, <span class="d">50</span>, <i>"Raphaël\nkicks\nbutt!"</i>);
 </code></pre>
-</div><h3 id="Paper.top" class="dr-property"><i class="dr-trixie">&#160;</i>Paper.top<a href="#Paper.top" title="Link to this section" class="dr-hash">&#x2693;</a><a class="dr-sourceline" title="Go to source" href="raphael-src.html#L4380">&#x27ad;</a></h3>
+</div><h3 id="Paper.top" class="dr-property"><i class="dr-trixie">&#160;</i>Paper.top<a href="#Paper.top" title="Link to this section" class="dr-hash">&#x2693;</a><a class="dr-sourceline" title="Go to source" href="raphael-src.html#L4413">&#x27ad;</a></h3>
 <div class="dr-property"><p>Points to the topmost element on the paper
 </p>
 </div><h2 id="Raphael" class="dr-method"><i class="dr-trixie">&#160;</i>Raphael(…)<a href="#Raphael" title="Link to this section" class="dr-hash">&#x2693;</a><a class="dr-sourceline" title="Go to source" href="raphael-src.html#L56">&#x27ad;</a></h2>
@@ -953,7 +968,7 @@ from this instance will be bound to this canvas.
 <dd class="dr-description">y coord of third point</dd>
 </dl>
 <p class="dr-returns"><strong class="dr-title">Returns:</strong> <em class="dr-type-number">number</em> <span class="dr-description">angle in degrees.</span></p>
-</div><h3 id="Raphael.animation" class="dr-method"><i class="dr-trixie">&#160;</i>Raphael.animation(params, ms, [easing], [callback])<a href="#Raphael.animation" title="Link to this section" class="dr-hash">&#x2693;</a><a class="dr-sourceline" title="Go to source" href="raphael-src.html#L5328">&#x27ad;</a></h3>
+</div><h3 id="Raphael.animation" class="dr-method"><i class="dr-trixie">&#160;</i>Raphael.animation(params, ms, [easing], [callback])<a href="#Raphael.animation" title="Link to this section" class="dr-hash">&#x2693;</a><a class="dr-sourceline" title="Go to source" href="raphael-src.html#L5384">&#x27ad;</a></h3>
 <div class="dr-method"><p>Creates an animation object that can be passed to the <a href="#Element.animate" class="dr-link">Element.animate</a> or <a href="#Element.animateWith" class="dr-link">Element.animateWith</a> methods.
 See also <a href="#Animation.delay" class="dr-link">Animation.delay</a> and <a href="#Animation.repeat" class="dr-link">Animation.repeat</a> methods.
 </p>
@@ -985,7 +1000,7 @@ See also <a href="#Animation.delay" class="dr-link">Animation.delay</a> and <a h
 <dd class="dr-description">angle in radians</dd>
 </dl>
 <p class="dr-returns"><strong class="dr-title">Returns:</strong> <em class="dr-type-number">number</em> <span class="dr-description">angle in degrees.</span></p>
-</div><h3 id="Raphael.easing_formulas" class="dr-property"><i class="dr-trixie">&#160;</i>Raphael.easing_formulas<a href="#Raphael.easing_formulas" title="Link to this section" class="dr-hash">&#x2693;</a><a class="dr-sourceline" title="Go to source" href="raphael-src.html#L4787">&#x27ad;</a></h3>
+</div><h3 id="Raphael.easing_formulas" class="dr-property"><i class="dr-trixie">&#160;</i>Raphael.easing_formulas<a href="#Raphael.easing_formulas" title="Link to this section" class="dr-hash">&#x2693;</a><a class="dr-sourceline" title="Go to source" href="raphael-src.html#L4838">&#x27ad;</a></h3>
 <div class="dr-property"><p>Object that contains easing formulas for animation. You could extend it with your own. By default it has following list of easing:
 </p>
 <ul>
@@ -999,7 +1014,7 @@ See also <a href="#Animation.delay" class="dr-link">Animation.delay</a> and <a h
     <li>“bounce”</li>
 </ul>
 <p>See also <a href="http://raphaeljs.com/easing.html">Easing demo</a>.</p>
-</div><h3 id="Raphael.el" class="dr-property"><i class="dr-trixie">&#160;</i>Raphael.el<a href="#Raphael.el" title="Link to this section" class="dr-hash">&#x2693;</a><a class="dr-sourceline" title="Go to source" href="raphael-src.html#L5775">&#x27ad;</a></h3>
+</div><h3 id="Raphael.el" class="dr-property"><i class="dr-trixie">&#160;</i>Raphael.el<a href="#Raphael.el" title="Link to this section" class="dr-hash">&#x2693;</a><a class="dr-sourceline" title="Go to source" href="raphael-src.html#L5831">&#x27ad;</a></h3>
 <div class="dr-property"><em class="dr-type dr-type-object">object</em><p>You can add your own method to elements. This is usefull when you want to hack default functionality or
 want to wrap some common transformation or attributes in one method. In difference to canvas methods,
 you can redefine element method at any time. Expending element methods wouldn’t affect set.
@@ -1097,7 +1112,7 @@ paper.mystuff.star();
 </div><h4 id="Raphael.getColor.reset" class="dr-method"><i class="dr-trixie">&#160;</i>Raphael.getColor.reset()<a href="#Raphael.getColor.reset" title="Link to this section" class="dr-hash">&#x2693;</a><a class="dr-sourceline" title="Go to source" href="raphael-src.html#L847">&#x27ad;</a></h4>
 <div class="dr-method"><p>Resets spectrum position for <a href="#Raphael.getColor" class="dr-link">Raphael.getColor</a> back to red.
 </p>
-</div><h3 id="Raphael.getPointAtLength" class="dr-method"><i class="dr-trixie">&#160;</i>Raphael.getPointAtLength(path, length)<a href="#Raphael.getPointAtLength" title="Link to this section" class="dr-hash">&#x2693;</a><a class="dr-sourceline" title="Go to source" href="raphael-src.html#L4696">&#x27ad;</a></h3>
+</div><h3 id="Raphael.getPointAtLength" class="dr-method"><i class="dr-trixie">&#160;</i>Raphael.getPointAtLength(path, length)<a href="#Raphael.getPointAtLength" title="Link to this section" class="dr-hash">&#x2693;</a><a class="dr-sourceline" title="Go to source" href="raphael-src.html#L4747">&#x27ad;</a></h3>
 <div class="dr-method"><p>Return coordinates of the point located at the given length on the given path.
 </p>
 <p class="header">Parameters
@@ -1141,7 +1156,7 @@ paper.mystuff.star();
 <li><span class="dr-json-key">hex</span><span class="dr-type"><em class="dr-type-string">string</em></span><span class="dr-json-description">color in HTML/CSS format: #••••••,</span>
 <li><span class="dr-json-key">error</span><span class="dr-type"><em class="dr-type-boolean">boolean</em></span><span class="dr-json-description">true if string can’t be parsed</span>
 </ol></li><li>}</li></ol>
-</div><h3 id="Raphael.getSubpath" class="dr-method"><i class="dr-trixie">&#160;</i>Raphael.getSubpath(path, from, to)<a href="#Raphael.getSubpath" title="Link to this section" class="dr-hash">&#x2693;</a><a class="dr-sourceline" title="Go to source" href="raphael-src.html#L4711">&#x27ad;</a></h3>
+</div><h3 id="Raphael.getSubpath" class="dr-method"><i class="dr-trixie">&#160;</i>Raphael.getSubpath(path, from, to)<a href="#Raphael.getSubpath" title="Link to this section" class="dr-hash">&#x2693;</a><a class="dr-sourceline" title="Go to source" href="raphael-src.html#L4762">&#x27ad;</a></h3>
 <div class="dr-method"><p>Return subpath of a given path from given length to given length.
 </p>
 <p class="header">Parameters
@@ -1157,7 +1172,7 @@ paper.mystuff.star();
 <dd class="dr-description">position of the end of the segment</dd>
 </dl>
 <p class="dr-returns"><strong class="dr-title">Returns:</strong> <em class="dr-type-string">string</em> <span class="dr-description">pathstring for the segment</span></p>
-</div><h3 id="Raphael.getTotalLength" class="dr-method"><i class="dr-trixie">&#160;</i>Raphael.getTotalLength(path)<a href="#Raphael.getTotalLength" title="Link to this section" class="dr-hash">&#x2693;</a><a class="dr-sourceline" title="Go to source" href="raphael-src.html#L4677">&#x27ad;</a></h3>
+</div><h3 id="Raphael.getTotalLength" class="dr-method"><i class="dr-trixie">&#160;</i>Raphael.getTotalLength(path)<a href="#Raphael.getTotalLength" title="Link to this section" class="dr-hash">&#x2693;</a><a class="dr-sourceline" title="Go to source" href="raphael-src.html#L4728">&#x27ad;</a></h3>
 <div class="dr-method"><p>Returns length of the given path in pixels.
 </p>
 <p class="header">Parameters
@@ -1400,7 +1415,7 @@ Converts path to relative form
 <div class="dr-property"><em class="dr-type dr-type-boolean">boolean</em><p><code>true</code> if browser supports VML.
 </p>
 </div><h2 id="Set" class="undefined"><i class="dr-trixie">&#160;</i>Set<a href="#Set" title="Link to this section" class="dr-hash">&#x2693;</a></h2>
-<h3 id="Set.forEach" class="dr-method"><i class="dr-trixie">&#160;</i>Set.forEach(callback, thisArg)<a href="#Set.forEach" title="Link to this section" class="dr-hash">&#x2693;</a><a class="dr-sourceline" title="Go to source" href="raphael-src.html#L5571">&#x27ad;</a></h3>
+<h3 id="Set.forEach" class="dr-method"><i class="dr-trixie">&#160;</i>Set.forEach(callback, thisArg)<a href="#Set.forEach" title="Link to this section" class="dr-hash">&#x2693;</a><a class="dr-sourceline" title="Go to source" href="raphael-src.html#L5627">&#x27ad;</a></h3>
 <div class="dr-method"><p>Executes given function for each element in the set.
 </p>
 <p>If function returns <code>false</code> it will stop loop running.
@@ -1415,11 +1430,11 @@ Converts path to relative form
 <dd class="dr-description">context object for the callback</dd>
 </dl>
 <p class="dr-returns"><strong class="dr-title">Returns:</strong> <em class="dr-type-object">object</em> <span class="dr-description">Set object</span></p>
-</div><h3 id="Set.pop" class="dr-method"><i class="dr-trixie">&#160;</i>Set.pop()<a href="#Set.pop" title="Link to this section" class="dr-hash">&#x2693;</a><a class="dr-sourceline" title="Go to source" href="raphael-src.html#L5553">&#x27ad;</a></h3>
+</div><h3 id="Set.pop" class="dr-method"><i class="dr-trixie">&#160;</i>Set.pop()<a href="#Set.pop" title="Link to this section" class="dr-hash">&#x2693;</a><a class="dr-sourceline" title="Go to source" href="raphael-src.html#L5609">&#x27ad;</a></h3>
 <div class="dr-method"><p>Removes last element and returns it.
 </p>
 <p class="dr-returns"><strong class="dr-title">Returns:</strong> <em class="dr-type-object">object</em> <span class="dr-description">element</span></p>
-</div><h3 id="Set.push" class="dr-method"><i class="dr-trixie">&#160;</i>Set.push()<a href="#Set.push" title="Link to this section" class="dr-hash">&#x2693;</a><a class="dr-sourceline" title="Go to source" href="raphael-src.html#L5533">&#x27ad;</a></h3>
+</div><h3 id="Set.push" class="dr-method"><i class="dr-trixie">&#160;</i>Set.push()<a href="#Set.push" title="Link to this section" class="dr-hash">&#x2693;</a><a class="dr-sourceline" title="Go to source" href="raphael-src.html#L5589">&#x27ad;</a></h3>
 <div class="dr-method"><p>Adds each argument to the current set.
 </p>
 <p class="dr-returns"><strong class="dr-title">Returns:</strong> <em class="dr-type-object">object</em> <span class="dr-description">original element</span></p>