(function(window){"use strict";function Matrix(t){var e=this;e._t=e.transform,e.a=e.d=1,e.b=e.c=e.e=e.f=0,e.props=[1,0,0,1,0,0],e.cssParts=["matrix(","",")"],e.a1=e.b1=e.c1=e.d1=e.e1=e.f1=0,e.context=t,e.cos=e.sin=0,t&&t.setTransform(1,0,0,1,0,0)}function matrixManagerFunction(){var t=new Matrix,e=function(t,e,a,i,r,n,s,o,h){var m,p,l,d,c,u,f;return m=$M([[1,0,0,0],[0,Math.cos(t),Math.sin(-t),0],[0,Math.sin(t),Math.cos(t),0],[0,0,0,1]]),p=$M([[Math.cos(e),0,Math.sin(e),0],[0,1,0,0],[Math.sin(-e),0,Math.cos(e),0],[0,0,0,1]]),l=$M([[Math.cos(a),Math.sin(-a),0,0],[Math.sin(a),Math.cos(a),0,0],[0,0,1,0],[0,0,0,1]]),c=$M([[i,0,0,0],[0,r,0,0],[0,0,n,0],[0,0,0,1]]),u=m.x(p).x(l).x(c),u=u.transpose(),f=$M([[1,0,0,0],[0,1,0,0],[0,0,1,0],[s,o,h,1]]),u=u.x(f),d="matrix3d(",d+=u.e(1,1).toFixed(5)+","+u.e(1,2).toFixed(5)+","+u.e(1,3).toFixed(5)+","+u.e(1,4).toFixed(5)+",",d+=u.e(2,1).toFixed(5)+","+u.e(2,2).toFixed(5)+","+u.e(2,3).toFixed(5)+","+u.e(2,4).toFixed(5)+",",d+=u.e(3,1).toFixed(5)+","+u.e(3,2).toFixed(5)+","+u.e(3,3).toFixed(5)+","+u.e(3,4).toFixed(5)+",",d+=u.e(4,1).toFixed(5)+","+u.e(4,2).toFixed(5)+","+u.e(4,3).toFixed(5)+","+u.e(4,4).toFixed(5),d+=")"},a=function(e,a,i,r,n){return t.reset().translate(r,n).rotate(e).scale(a,i).toCSS()},i=function(e,a,i,r,n){return t.reset().translate(r,n).rotate(e).scale(a,i).toArray()},r=function(t){return a(t.r,t.s[0],t.s[1],t.p[0],t.p[1])},n=function(t,i){return i?e(-t.tr.r[0],t.tr.r[1],t.tr.r[2],t.tr.s[0],t.tr.s[1],t.tr.s[2],t.tr.p[0],t.tr.p[1],t.tr.p[2]):a(t.tr.r[2],t.tr.s[0],t.tr.s[1],t.tr.p[0],t.tr.p[1])},s=function(t,i){return i?e(-t.r[0],t.r[1],t.r[2],t.s[0],t.s[1],t.s[2],t.p[0],t.p[1],t.p[2]):a(t.r[2],t.s[0],t.s[1],t.p[0],t.p[1])},o=function(t,e){return e?null:i(t.r[2],t.s[0],t.s[1],t.p[0],t.p[1])};return{get2DMatrix:r,getMatrix:n,getMatrix2:s,getMatrixArray:o,getMatrixArrayFromParams:i,getMatrix2FromParams:a}}function styleDiv(t){t.style.position="absolute",t.style.top=0,t.style.left=0,t.style.display="block",t.style.verticalAlign="top",t.style.backfaceVisibility=t.style.webkitBackfaceVisibility="hidden",styleUnselectableDiv(t)}function styleUnselectableDiv(t){t.style.userSelect="none",t.style.MozUserSelect="none",t.style.webkitUserSelect="none",t.style.oUserSelect="none"}function randomString(t,e){void 0===e&&(e="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890");var a,i="";for(a=t;a>0;--a)i+=e[Math.round(Math.random()*(e.length-1))];return i}function componentToHex(t){var e=t.toString(16);return 1==e.length?"0"+e:e}function rgbToHex(t,e,a){return 0>t&&(t=0),0>e&&(e=0),0>a&&(a=0),"#"+colorMap[t]+colorMap[e]+colorMap[a]}function fillToRgba(t,e){if(!cachedColors[t]){var a=/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(t);cachedColors[t]=parseInt(a[1],16)+","+parseInt(a[2],16)+","+parseInt(a[3],16)}return"rgba("+cachedColors[t]+","+e+")"}function createColorMap(){var t,e;for(t=0;256>t;t+=1)e=t.toString(16),colorMap[t]=1==e.length?"0"+e:e}function createElement(t,e,a){if(!e){var i=Object.create(t.prototype,a),r={};return i&&"[object Function]"===r.toString.call(i.init)&&i.init(),i}e.prototype=Object.create(t.prototype),e.prototype.constructor=e,e.prototype.parent=t.prototype}function defineDescriptor(t,e,a,i){var r={writable:!1,configurable:!1,enumerable:!1,value:a};if(i)for(var n in i)r[n]=i[n];var s={};t&&"[object Function]"===s.toString.call(t)&&(t=t.prototype),Object.defineProperty(t,e,r)}function defineAccessor(t,e,a){var i,r={enumerable:!1,configurable:!1,get:function(){return i},set:function(t){i=t}};if(a)for(var n in a)r[n]=a[n];var s={};t&&"[object Function]"===s.toString.call(t)&&(t=t.prototype),Object.defineProperty(t,e,r)}function bezFunction(){function t(t,e,a,i,r,n){return o.abs((a-t)*(n-e)-(r-t)*(i-e))<1e-5}function e(t){return n[t].fnc}function a(t,e,a,i,r){if(r||(r=("bez_"+t+"_"+e+"_"+a+"_"+i).replace(/\./g,"p")),n[r])return n[r];var s,o,h,m,p,l;return n[r]=function(r,n,d,c,u){for(var f,y=n/u,r=y,g=0;++g<14&&(h=3*t,o=3*(a-t)-h,s=1-h-o,f=r*(h+r*(o+r*s))-y,!(Math.abs(f)<.001));)r-=f/(h+r*(2*o+3*s*r));l=3*e,p=3*(i-e)-l,m=1-l-p;var v=r*(l+r*(p+r*m));return c*v+d},n[r]}function i(e,a,i,r){var n=(e.join("_")+"_"+a.join("_")+"_"+i.join("_")+"_"+r.join("_")).replace(/\./g,"p");if(s[n])return s[n];var o,h,m,p,l,d,c,u,f,y,g,v,x=500,C=0,E=null,b={points:[],segmentLength:0};for(t(e[0],e[1],a[0],a[1],i[0],i[1])&&t(e[0],e[1],a[0],a[1],r[0],r[1])&&(x=2),m=i.length,o=0;x>o;o+=1){for(v=[],y=o/(x-1),g=0,h=0;m>h;h+=1)p=e[h]+(i[h]-e[h])*y,l=i[h]+(r[h]-i[h])*y,d=r[h]+(a[h]-r[h])*y,c=p+(l-p)*y,u=l+(d-l)*y,f=c+(u-c)*y,v.push(f),null!==E&&(g+=Math.pow(v[h]-E[h],2));g=Math.sqrt(g),C+=g,b.points.push({partialLength:g,cumulatedLength:C,point:v}),E=v}return b.segmentLength=C,s[n]=b,b}function r(e){var a,i,r,n,s,o,h,m,p,l,d,c,u=e.s,f=e.e,y=e.to,g=e.ti,v=500,x=0,C=null,E={points:[],segmentLength:0};for(t(u[0],u[1],f[0],f[1],u[0]+y[0],u[1]+y[1])&&t(u[0],u[1],f[0],f[1],f[0]+g[0],f[1]+g[1])&&(v=2),r=y.length,a=0;v>a;a+=1){for(c=[],l=a/(v-1),d=0,i=0;r>i;i+=1)n=u[i]+y[i]*l,s=u[i]+y[i]+(f[i]+g[i]-(u[i]+y[i]))*l,o=f[i]+g[i]+-g[i]*l,h=n+(s-n)*l,m=s+(o-s)*l,p=h+(m-h)*l,c.push(p),null!==C&&(d+=Math.pow(c[i]-C[i],2));d=Math.sqrt(d),x+=d,E.points.push({partialLength:d,cumulatedLength:x,point:c}),C=c}E.segmentLength=x,e.bezierData=E}var n=[],s={},o=Math,h={getEasingCurve:a,getEasingCurveByIndex:e,drawBezierCurve:i,buildBezierData:r};return h}function dataFunctionManager(){function t(t,e,a){var i,r=s(t,e,a),n=[];for(i=0;e>i;i+=1)n.push(Math.floor(r[i]*u));return n}function e(t,e){var a,i,r,n=t.length;for(a=0;n>a;a+=1)if(void 0!==t[a].t)if(t[a].s instanceof Array)for(r=t[a].s.length,i=0;r>i;i+=1)t[a].s[i]*=e,t[a].e[i]*=e;else t[a].s&&(t[a].s*=e,t[a].e*=e);else t[a]=t[a]*e}function a(r){var s,o,h,m,p,l,d,c,u,f,y,v=r.length;for(d=0;v>d;d+=1){if(h=r[d],s=h.outPoint-h.startTime,o=h.startTime,h.layerName=n(h.layerName),h.parent&&(h.parent=n(h.parent)),h.renderedFrame={},h.renderedData={},m=[],p=-1,h.tm&&(h.tm=t(h.tm,s,o)),h.ks.o instanceof Array?e(h.ks.o,.01):h.ks.o/=100,h.ks.s instanceof Array?e(h.ks.s,.01):h.ks.s/=100,h.ks.r instanceof Array?e(h.ks.r,g):h.ks.r*=g,h.hasMask){var x=h.masksProperties;for(u=x.length,c=0;u>c;c+=1)if(x[c].pt.i)i(x[c].pt);else for(y=x[c].pt.length,f=0;y>f;f+=1)x[c].pt[f].s&&(i(x[c].pt[f].s[0]),i(x[c].pt[f].e[0]))}if("PreCompLayer"==h.type)a(h.layers);else if("ShapeLayer"==h.type)for(u=h.shapes.length,c=0;u>c;c+=1)if(l=h.shapes[c],l.renderedData={},l.tr.o instanceof Array?e(l.tr.o,.01):l.tr.o/=100,l.tr.s instanceof Array?e(l.tr.s,.01):l.tr.s/=100,l.tr.r instanceof Array?e(l.tr.r,g):l.tr.r*=g,l.fl&&(l.fl.o instanceof Array?e(l.fl.o,.01):l.fl.o*=.01),l.st&&(l.st.o instanceof Array?e(l.st.o,.01):l.st.o*=.01),l.ks)if(l.ks.i)i(l.ks);else for(y=l.ks.length,f=0;y>f;f+=1)l.ks[f].s&&(i(l.ks[f].s[0]),i(l.ks[f].e[0]))}}function i(t){var e,a=t.i.length;for(e=0;a>e;e+=1)t.i[e][0]+=t.v[e][0],t.i[e][1]+=t.v[e][1],t.o[e][0]+=t.v[e][0],t.o[e][1]+=t.v[e][1]}function r(t){y[t._id]={data:t,renderedFrames:[]},u=t.animation.frameRate,a(t.animation.layers)}function n(t){return t=t.replace(/ /g,"_"),t=t.replace(/-/g,"_"),t=t.replace(/\./g,"_"),t=t.replace(/\//g,"_")}function s(t,e,a){var i,r,n=[];if(!(t instanceof Array)||null==t[0].t)return n.push(t),n;var s,o;n=[];var h,m,p,l=[];r=t.length;var d,c=1e3,u=[],f=[];for(i=0;r>i;i+=1)if(s=t[i],s.t-=a,s.to){var y,g,v,x,C,E,b,d,S,F,A=0,w=null,I={points:[],length:0};for(y=0;c>y;y+=1)F=[],d=y/(c-1),S=0,u=[],f=[],s.to.forEach(function(t,e){null==u[e]&&(u[e]=s.s[e]+s.to[e],f[e]=s.e[e]+s.ti[e]),g=s.s[e]+(u[e]-s.s[e])*d,v=u[e]+(f[e]-u[e])*d,x=f[e]+(s.e[e]-f[e])*d,C=g+(v-g)*d,E=v+(x-v)*d,b=C+(E-C)*d,F.push(b),null!==w&&(S+=Math.pow(F[e]-w[e],2))}),S=Math.sqrt(S),A+=S,I.points.push({partialLength:A,point:F}),w=F,s.bezierData=I;I.segmentLength=A}var k=0,M=0;for(i=0;e>i;i+=1){h=k;for(var D=!1;r-1>h;){if(s=t[h],o=t[h+1],i<s.t&&0==h){for(p=s.s.length,l=[],m=0;p>m;m+=1)l.push(s.s[m]);n.push(l),D=!0,k!=h&&(k=h,M=0);break}if(i>=s.t&&i<o.t){if(l=[],s.to){d=bez.getEasingCurve(s.o.x,s.o.y,s.i.x,s.i.y)("",i-s.t,0,1,o.t-s.t);var y,T,P,I=s.bezierData,z=I.segmentLength*d;for(m=M;m<I.points.length;){if(0==i||0==z||0==d){l=I.points[m].point,M=m;break}if(m==I.points.length-1)l=I.points[m].point;else if(z>I.points[m].partialLength&&z<I.points[m+1].partialLength){for(T=I.points[m].point.length,P=(z-I.points[m].partialLength)/(I.points[m+1].partialLength-I.points[m].partialLength),y=0;T>y;y+=1)l.push(I.points[m].point[y]+(I.points[m+1].point[y]-I.points[m].point[y])*P);M=m;break}m+=1}}else{var N,V,L,_;s.s.forEach(function(t,e){if(1!==s.h&&(s.o.x instanceof Array?(N=s.o.x[e],V=s.o.y[e],L=s.i.x[e],_=s.i.y[e]):(N=s.o.x,V=s.o.y,L=s.i.x,_=s.i.y),d=bez.getEasingCurve(N,V,L,_)("",i-s.t,0,1,o.t-s.t)),t.i){var a={i:[],o:[],v:[]};t.i.forEach(function(i,r){var n=[],o=[],h=[];i.forEach(function(a,i){1===s.h?(n.push(a),o.push(t.o[r][i]),h.push(t.v[r][i])):(n.push(a+(s.e[e].i[r][i]-a)*d),o.push(t.o[r][i]+(s.e[e].o[r][i]-t.o[r][i])*d),h.push(t.v[r][i]+(s.e[e].v[r][i]-t.v[r][i])*d))}),a.i.push(n),a.o.push(o),a.v.push(h)}),l.push(a)}else l.push(1===s.h?t:t+(s.e[e]-t)*d)})}n.push(l),D=!0,k!=h&&(k=h,M=0);break}h+=1}0==D&&(s=t[t.length-2],l=[],s.e.forEach(function(t){l.push(t)}),n.push(l))}for(h=n.length;e>h;)n.push(l),h+=1;return n}function o(t,e,a,i){var r,n,s,o,h,m;if(!t.length)return"p"==i.type?(x.px=t,x.py=t):"s"==i.type?(x.sx=t,x.sy=t):"r"==i.type&&(x.r=t),i.toArray?[t]:t;if(null==t[0].t)return"p"==i.type?(x.px=t[0],x.py=t[1]):"s"==i.type?(x.sx=t[0],x.sy=t[1]):"r"==i.type&&(x.r=t[0]),t;h=0,m=t.length-1;for(var p=1,l=!0;!(!l||(r=t[h],n=t[h+1],h==m-1&&e>=n.t-a)||n.t-a>e&&1==p);){if(n.t-a<e&&-1==p){h+=1,r=t[h],n=t[h+1];break}m-1>h&&1==p||h>0&&-1==p?h+=p:l=!1}r.to&&!r.bezierData&&bez.buildBezierData(r);var d,c,u,f=0;if("default"==i.type&&(s=[]),r.to){if(o=r.bezierData,e>=n.t-a)return"p"==i.type?(x.px=o.points[o.points.length-1].point[0],x.py=o.points[o.points.length-1].point[1]):"s"==i.type?(x.sx=o.points[o.points.length-1].point[0],x.sy=o.points[o.points.length-1].point[1]):"r"==i.type&&(x.r=o.points[o.points.length-1].point[0]),o.points[o.points.length-1].point;if(e<r.t-a)return"p"==i.type?(x.px=o.points[0].point[0],x.py=o.points[0].point[1]):"s"==i.type?(x.sx=o.points[0].point[0],x.sy=o.points[0].point[1]):"r"==i.type&&(x.r=o.points[0].point[0]),o.points[0].point;var y;r.__fnct?y=r.__fnct:(y=bez.getEasingCurve(r.o.x,r.o.y,r.i.x,r.i.y,r.n),r.__fnct=y),u=y("",e-(r.t-a),0,1,n.t-a-(r.t-a));var g,v=o.segmentLength*u,C=0;for(p=1,l=!0,I=o.points.length;l;){if(C+=o.points[f].partialLength*p,0==v||0==u){"p"==i.type?(x.px=o.points[f].point[0],x.py=o.points[f].point[1]):"s"==i.type?(x.sx=o.points[f].point[0],x.sy=o.points[f].point[1]):"r"==i.type?x.r=o.points[f].point[0]:s=o.points[f].point;break}if(f==o.points.length-1){"p"==i.type?(x.px=o.points[f].point[0],x.py=o.points[f].point[1]):"s"==i.type?(x.sx=o.points[f].point[0],x.sy=o.points[f].point[1]):"r"==i.type?x.r=o.points[f].point[0]:s=o.points[f].point;break}if(v>C&&v<C+o.points[f+1].partialLength){if(g=(v-C)/o.points[f+1].partialLength,"p"==i.type)x.px=o.points[f].point[0]+(o.points[f+1].point[0]-o.points[f].point[0])*g,x.py=o.points[f].point[1]+(o.points[f+1].point[1]-o.points[f].point[1])*g;else if("s"==i.type)x.sx=o.points[f].point[0]+(o.points[f+1].point[0]-o.points[f].point[0])*g,x.sy=o.points[f].point[1]+(o.points[f+1].point[1]-o.points[f].point[1])*g;else if("r"==i.type)x.r=o.points[f].point[0]+(o.points[f+1].point[0]-o.points[f].point[0])*g;else for(c=o.points[f].point.length,d=0;c>d;d+=1)s.push(o.points[f].point[d]+(o.points[f+1].point[d]-o.points[f].point[d])*g);break}I-1>f&&1==p||f>0&&-1==p?f+=p:l=!1}}else{var E,b,S,F,A=!1;for(m=r.s.length,h=0;m>h;h+=1){if(1!==r.h){r.o.x instanceof Array?(A=!0,E=r.o.x[h]?r.o.x[h]:r.o.x[0],b=r.o.y[h]?r.o.y[h]:r.o.y[0],S=r.i.x[h]?r.i.x[h]:r.i.x[0],F=r.i.y[h]?r.i.y[h]:r.i.y[0],r.__fnct||(r.__fnct=[])):(A=!1,E=r.o.x,b=r.o.y,S=r.i.x,F=r.i.y);var y;A?r.__fnct[h]?y=r.__fnct[h]:(y=bez.getEasingCurve(E,b,S,F),r.__fnct[h]=y):r.__fnct?y=r.__fnct:(y=bez.getEasingCurve(E,b,S,F),r.__fnct=y),u=y("",e-(r.t-a),0,1,n.t-a-(r.t-a)),e>=n.t-a?u=1:e<r.t-a&&(u=0)}if(r.s[h].i){var w={i:[],o:[],v:[]},I=r.s[h].i.length;for(f=0;I>f;f+=1){var k=[],M=[],D=[];for(c=r.s[h].i[f].length,d=0;c>d;d+=1)1===r.h?(k.push(r.s[h].i[f][d]),M.push(r.s[h].o[f][d]),D.push(r.s[h].v[f][d])):(k.push(r.s[h].i[f][d]+(r.e[h].i[f][d]-r.s[h].i[f][d])*u),M.push(r.s[h].o[f][d]+(r.e[h].o[f][d]-r.s[h].o[f][d])*u),D.push(r.s[h].v[f][d]+(r.e[h].v[f][d]-r.s[h].v[f][d])*u));w.i.push(k),w.o.push(M),w.v.push(D)}s.push(w)}else 1===r.h?"p"==i.type?0==h?x.px=r.s[h]:1==h&&(x.py=r.s[h]):"s"==i.type?0==h?x.sx=r.s[h]:1==h&&(x.sy=r.s[h]):"r"==i.type?x.r=r.s[h]:s.push(r.s[h]):"p"==i.type?0==h?x.px=r.s[h]+(r.e[h]-r.s[h])*u:1==h&&(x.py=r.s[h]+(r.e[h]-r.s[h])*u):"s"==i.type?0==h?x.sx=r.s[h]+(r.e[h]-r.s[h])*u:1==h&&(x.sy=r.s[h]+(r.e[h]-r.s[h])*u):"r"==i.type?x.r=r.s[h]+(r.e[h]-r.s[h])*u:s.push(r.s[h]+(r.e[h]-r.s[h])*u)}}return s}function h(t,e){var a,i,r,n,s,o,h="";if(!(t instanceof Array)){for(a=t.v,i=t.o,r=t.i,o=a.length,h+="M"+a[0].join(","),s=1;o>s;s++)h+=" C"+i[s-1].join(",")+" "+r[s].join(",")+" "+a[s].join(",");return e!==!1&&(h+=" C"+i[s-1].join(",")+" "+r[0].join(",")+" "+a[0].join(",")),h}var m,p=t.length;for(h="",m=0;p>m;m+=1){for(n=t[m],a=n.v,i=n.o,r=n.i,o=a.length,h+="M"+a[0].join(","),s=1;o>s;s++)h+=" C"+i[s-1].join(",")+" "+r[s].join(",")+" "+a[s].join(",");e!==!1&&(h+=" C"+i[s-1].join(",")+" "+r[0].join(",")+" "+a[0].join(","))}return h}function m(t,e,a){var i,r,n,s,l,d,c,u,y,g,C,E,b,S,F,A,w,I,k,M,D,T={},P=t.length;for(M=0;P>M;M+=1)if(D=t[M],F=e-D.startTime,!D.an[F]){if(i={},v.arrayFlag=!1,v.type="default",i.a=o(D.ks.a,F,D.startTime,v),i.o=o(D.ks.o,F,D.startTime,v),v.arrayFlag=!1,v.type="p",o(D.ks.p,F,D.startTime,v),v.arrayFlag=!0,v.type="r",o(D.ks.r,F,D.startTime,v),v.arrayFlag=!0,v.type="s",o(D.ks.s,F,D.startTime,v),I={},I.an={tr:i},v.arrayFlag=!1,v.type="default","canvas"==a?I.an.matrixArray=f.getMatrixArrayFromParams(x.r,x.sx,x.sy,x.px,x.py):I.an.matrixValue=f.getMatrix2FromParams(x.r,x.sx,x.sy,x.px,x.py)+"translate("+-i.a[0]+" "+-i.a[1]+")",D.renderedData[F]=I,D.hasMask)for(r=D.masksProperties,w=r.length,A=0;w>A;A+=1)r[A].pathStrings||(r[A].pathStrings=[],r[A].pathVertices=[],r[A].opacity=[]),n=o(r[A].pt,F,D.startTime,v),r[A].pathVertices[F]=n instanceof Array?n:[n],"svg"==a&&(r[A].pathStrings[F]=h(n,r[A].cl)),r[A].opacity[F]=o(r[A].o,F,D.startTime,v),r[A].opacity[F]=r[A].opacity[F]instanceof Array?r[A].opacity[F][0]/100:r[A].opacity[F]/100;if("PreCompLayer"==D.type)e<D.inPoint||e>D.outPoint||(s=D.tm?D.tm[F]<0?0:D.tm[F]:F,m(D.layers,s,a));else if("ShapeLayer"==D.type)for(w=D.shapes.length,A=0;w>A;A+=1){if(k={},l=D.shapes[A],l.renderedData[F]=k,l._created||(l.an.tr=[],l.an.renderedFrame={},l.ks?l.an.path=[]:l.el?l.an.ell=[]:l.rc&&(l.an.rect=[]),l.fl&&(l.an.fill=[]),l.st&&(l.an.stroke=[])),l.trim&&!l._created&&(l.trim.an=[]),l.fl&&(c=o(l.fl.c,F,D.startTime,v),d=o(l.fl.o,F,D.startTime,v),k.fill={opacity:d instanceof Array?d[0]:d},"canvas"==a?(p(c),k.fill.color=c):k.fill.color=rgbToHex(Math.round(c[0]),Math.round(c[1]),Math.round(c[2]))),l.ks?(u=o(l.ks,F,D.startTime,v),k.path={pathNodes:u,closed:l.closed},"svg"==a&&(k.path.pathString=h(u,l.closed))):l.el?(E=o(l.el.p,F,D.startTime,v),b=o(l.el.s,F,D.startTime,v),k.ell={p:E,size:b}):l.rc&&(E=o(l.rc.p,F,D.startTime,v),b=o(l.rc.s,F,D.startTime,v),S=o(l.rc.r,F,D.startTime,v),k.rect={position:E,size:b,roundness:S}),l.st&&(y=o(l.st.c,F,D.startTime,v),g=o(l.st.o,F,D.startTime,v),C=o(l.st.w,F,D.startTime,v),k.stroke={opacity:g instanceof Array?g[0]:g,width:C instanceof Array?C[0]:C},"canvas"==a?(p(y),k.stroke.color=y):k.stroke.color=rgbToHex(Math.round(y[0]),Math.round(y[1]),Math.round(y[2]))),T={},T.a=o(l.tr.a,F,D.startTime,v),T.o=o(l.tr.o,F,D.startTime,v),v.arrayFlag=!0,v.type="s",o(l.tr.s,F,D.startTime,v),v.arrayFlag=!0,v.type="r",o(l.tr.r,F,D.startTime,v),v.arrayFlag=!1,v.type="p",o(l.tr.p,F,D.startTime,v),v.arrayFlag=!1,v.type="default","canvas"==a?T.mtArr=f.getMatrixArrayFromParams(x.r,x.sx,x.sy,x.px,x.py):T.mt=f.getMatrix2FromParams(x.r,x.sx,x.sy,x.px,x.py),l.an.tr[F]=T,k.tr=T,l.trim){var z=o(l.trim.s,F,D.startTime,v),N=o(l.trim.e,F,D.startTime,v),V=o(l.trim.o,F,D.startTime,v);k.trim={s:z,e:N,o:V}}l._created||(l._created=!0)}}}function p(t){var e,a=t.length;for(e=0;a>e;e+=1)t[e]=Math.round(t[e])}function l(t,e){for(var a=1;a>0;){if(e+=1,e>=t.data.animation.totalFrames){t.renderFinished=!0;break}t.renderedFrames[e]||(d(t.data._id,e),a-=1)}}function d(t,e){return 2==y[t].renderedFrames[e]?void(y[t].renderFinished||l(y[t],e)):(y[t].renderedFrames[e]=2,void m(y[t].data.animation.layers,e,y[t].data._animType))}function c(t){var e,a=y[t].data,i=a.animation.totalFrames,r=[];for(e=0;i>e;e+=1)r.push({num:e,data:d(t,e)})}var u=0,f=new MatrixManager,y={},g=Math.PI/180,v={arrayFlag:!1},x={r:0,sx:1,sy:1,px:1,py:1},C={};return C.completeData=r,C.renderFrame=d,C.renderAllFrames=c,C}function SVGRenderer(t){this.animationItem=t,this.layers=null,this.lastFrame=-1}function CanvasRenderer(t,e){this.animationItem=t,this.renderConfig=e?e:{clearCanvas:!0,context:null,scaleMode:"fit"},this.lastFrame=-1}function MaskElement(){}function ICompElement(t,e){this.parent.constructor.call(this,t,e),this.layers=t.layers}function IImageElement(t,e){this.animationItem=e,this.assets=this.animationItem.getAssets(),this.path=this.animationItem.getPath(),this.parent.constructor.call(this,t,e)}function IShapeElement(t,e){this.shapes=[],this.parent.constructor.call(this,t,e)}function ShapeItemElement(t){this.data=t,this.shapeG=document.createElementNS(svgNS,"g"),this.pathLength=0,this.cachedData=[],this.renderedFrame={path:"",stroke:{},fill:{},tr:{a:[]},trim:{},ellipse:{},rect:{}},"pathShape"===this.data.type?this.shape=document.createElementNS(svgNS,"path"):"rectShape"===this.data.type?this.shape=document.createElementNS(svgNS,"rect"):"ellipseShape"===this.data.type?(this.shape=document.createElementNS(svgNS,"ellipse"),this.data.trim&&this.adjustTrim()):this.shape=document.createElementNS(svgNS,"path"),this.data.trim?this.shape.setAttribute("stroke-linecap","round"):(this.shape.setAttribute("stroke-linejoin","round"),this.shape.setAttribute("stroke-linecap","round")),this.data.renderedData||(this.data.renderedData={}),this.shape.setAttribute("name",this.data.name),styleUnselectableDiv(this.shapeG),styleUnselectableDiv(this.shape),this.shapeG.appendChild(this.shape)}function ISolidElement(t,e){this.parent.constructor.call(this,t,e)}function ITextElement(t,e){this.parent.constructor.call(this,t,e)}function CVBaseElement(t,e){this.renderer=e,this.data=t,this.currentAnimData=null,this.renderFrame=!1,this.init()}function CVCompElement(t,e){this.parent.constructor.call(this,t,e),this.layers=t.layers}function CVImageElement(t,e){this.renderer=e,this.animationItem=e.animationItem,this.assets=this.animationItem.getAssets(),this.path=this.animationItem.getPath(),this.parent.constructor.call(this,t,e),this.animationItem.pendingElements+=1}function CVShapeElement(t,e){this.shapes=[],this.parent.constructor.call(this,t,e)}function CVShapeItemElement(t,e){this.data=t,this.renderer=e,this.frameNum=-1,this.renderedPaths={},this.trims=[]}function CVSolidElement(t,e){this.parent.constructor.call(this,t,e)}function CVTextElement(t,e){this.parent.constructor.call(this,t,e)}function CVMaskElement(){}var svgNS="http://www.w3.org/2000/svg";Matrix.prototype={concat:function(t){return this.clone()._t(t.a,t.b,t.c,t.d,t.e,t.f)},flipX:function(){return this._t(-1,0,0,1,0,0)},flipY:function(){return this._t(1,0,0,-1,0,0)},reflectVector:function(t,e){var a=this.applyToPoint(0,1),i=2*(a.x*t+a.y*e);return t-=i*a.x,e-=i*a.y,{x:t,y:e}},reset:function(){return this.setTransform(1,0,0,1,0,0)},rotate:function(t){return 0==t?this:(this.cos=Math.cos(t),this.sin=Math.sin(t),this._t(this.cos,this.sin,-this.sin,this.cos,0,0))},rotateFromVector:function(t,e){return this.rotate(Math.atan2(e,t))},rotateDeg:function(t){return this.rotate(t*Math.PI/180)},scaleU:function(t){return this._t(t,0,0,t,0,0)},scale:function(t,e){return 1==t&&1==e?this:this._t(t,0,0,e,0,0)},scaleX:function(t){return this._t(t,0,0,1,0,0)},scaleY:function(t){return this._t(1,0,0,t,0,0)},shear:function(t,e){return this._t(1,e,t,1,0,0)},shearX:function(t){return this._t(1,0,t,1,0,0)},shearY:function(t){return this._t(1,t,0,1,0,0)},skew:function(t,e){return this.shear(Math.tan(t),Math.tan(e))},skewX:function(t){return this.shearX(Math.tan(t))},skewY:function(t){return this.shearY(Math.tan(t))},setTransform:function(t,e,a,i,r,n){return this.props[0]=t,this.props[1]=e,this.props[2]=a,this.props[3]=i,this.props[4]=r,this.props[5]=n,this._x()},translate:function(t,e){return this._t(1,0,0,1,t,e)},translateX:function(t){return this._t(1,0,0,1,t,0)},translateY:function(t){return this._t(1,0,0,1,0,t)},transform:function(t,e,a,i,r,n){return this.a1=this.props[0],this.b1=this.props[1],this.c1=this.props[2],this.d1=this.props[3],this.e1=this.props[4],this.f1=this.props[5],this.props[0]=this.a1*t+this.c1*e,this.props[1]=this.b1*t+this.d1*e,this.props[2]=this.a1*a+this.c1*i,this.props[3]=this.b1*a+this.d1*i,this.props[4]=this.a1*r+this.c1*n+this.e1,this.props[5]=this.b1*r+this.d1*n+this.f1,this._x()},divide:function(t){if(!t.isInvertible())throw"Input matrix is not invertible";var e=t.inverse();return this._t(e.a,e.b,e.c,e.d,e.e,e.f)},divideScalar:function(t){var e=this;return e.a/=t,e.b/=t,e.c/=t,e.d/=t,e.e/=t,e.f/=t,e._x()},inverse:function(){if(this.isIdentity())return new Matrix;if(this.isInvertible()){var t=this,e=t.a,a=t.b,i=t.c,r=t.d,n=t.e,s=t.f,o=new Matrix,h=e*r-a*i;return o.a=r/h,o.b=-a/h,o.c=-i/h,o.d=e/h,o.e=(i*s-r*n)/h,o.f=-(e*s-a*n)/h,o}throw"Matrix is not invertible."},interpolate:function(t,e,a){var i=this,r=a?new Matrix(a):new Matrix;return r.a=i.a+(t.a-i.a)*e,r.b=i.b+(t.b-i.b)*e,r.c=i.c+(t.c-i.c)*e,r.d=i.d+(t.d-i.d)*e,r.e=i.e+(t.e-i.e)*e,r.f=i.f+(t.f-i.f)*e,r._x()},interpolateAnim:function(t,e,a){var i=this,r=a?new Matrix(a):new Matrix,n=i.decompose(),s=t.decompose(),o=n.rotation+(s.rotation-n.rotation)*e,h=n.translate.x+(s.translate.x-n.translate.x)*e,m=n.translate.y+(s.translate.y-n.translate.y)*e,p=n.scale.x+(s.scale.x-n.scale.x)*e,l=n.scale.y+(s.scale.y-n.scale.y)*e;return r.translate(h,m),r.rotate(o),r.scale(p,l),r._x()},decompose:function(t){var e=this,a=e.a,i=e.b,r=e.c,n=e.d,s=Math.acos,o=Math.atan,h=Math.sqrt,m=Math.PI,p={x:e.e,y:e.f},l=0,d={x:1,y:1},c={x:0,y:0},u=a*n-i*r;if(t)a?(c={x:o(r/a),y:o(i/a)},d={x:a,y:u/a}):i?(l=.5*m,d={x:i,y:u/i},c.x=o(n/i)):(d={x:r,y:n},c.x=.25*m);else if(a||i){var f=h(a*a+i*i);l=i>0?s(a/f):-s(a/f),d={x:f,y:u/f},c.x=o((a*r+i*n)/(f*f))}else if(r||n){var y=h(r*r+n*n);l=.5*m-(n>0?s(-r/y):-s(r/y)),d={x:u/y,y:y},c.y=o((a*r+i*n)/(y*y))}else d={x:0,y:0};return{scale:d,translate:p,rotation:l,skew:c}},determinant:function(){return this.a*this.d-this.b*this.c},applyToPoint:function(t,e){var a=this;return{x:t*a.a+e*a.c+a.e,y:t*a.b+e*a.d+a.f}},applyToArray:function(t){var e,a,i=0,r=[];if("number"==typeof t[0])for(a=t.length;a>i;)e=this.applyToPoint(t[i++],t[i++]),r.push(e.x,e.y);else for(;e=t[i];i++)r.push(this.applyToPoint(e.x,e.y));return r},applyToTypedArray:function(t,e){for(var a,i=0,r=t.length,n=e?new Float64Array(r):new Float32Array(r);r>i;)a=this.applyToPoint(t[i],t[i+1]),n[i++]=a.x,n[i++]=a.y;return n},applyToContext:function(t){var e=this;return t.setTransform(e.a,e.b,e.c,e.d,e.e,e.f),e},isIdentity:function(){var t=this;return t._q(t.a,1)&&t._q(t.b,0)&&t._q(t.c,0)&&t._q(t.d,1)&&t._q(t.e,0)&&t._q(t.f,0)},isInvertible:function(){return!this._q(this.determinant(),0)},isValid:function(){return!this._q(this.a*this.d,0)},clone:function(t){var e=this,a=new Matrix;return a.a=e.a,a.b=e.b,a.c=e.c,a.d=e.d,a.e=e.e,a.f=e.f,t||(a.context=e.context),a},isEqual:function(t){var e=this,a=e._q;return a(e.a,t.a)&&a(e.b,t.b)&&a(e.c,t.c)&&a(e.d,t.d)&&a(e.e,t.e)&&a(e.f,t.f)},toArray:function(){return[this.props[0],this.props[1],this.props[2],this.props[3],this.props[4],this.props[5]]},toCSS:function(){return this.cssParts[1]=this.props.join(","),this.cssParts.join("")},toJSON:function(){var t=this;return'{"a":'+t.a+',"b":'+t.b+',"c":'+t.c+',"d":'+t.d+',"e":'+t.e+',"f":'+t.f+"}"},toString:function(){return""+this.toArray()},_q:function(t,e){return Math.abs(t-e)<1e-14},_x:function(){return this.context&&this.context.setTransform(this.a,this.b,this.c,this.d,this.e,this.f),this}};var MatrixManager=matrixManagerFunction;!function(){for(var t=0,e=["ms","moz","webkit","o"],a=0;a<e.length&&!window.requestAnimationFrame;++a)window.requestAnimationFrame=window[e[a]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[e[a]+"CancelAnimationFrame"]||window[e[a]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(e){var a=(new Date).getTime(),i=Math.max(0,16-(a-t)),r=window.setTimeout(function(){e(a+i)},i);return t=a+i,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)})}();var subframeEnabled=!1,supportsPath2D="function"==typeof Path2D,cachedColors={},colorMap=[],body,fillColorToString=function(){var t=[];return function(e,a){return t[e[0]]||(t[e[0]]=[]),t[e[0]][e[1]]||(t[e[0]][e[1]]=[]),t[e[0]][e[1]][e[2]]||(void 0!=a&&(e[3]=a),t[e[0]][e[1]][e[2]]="rgba("+e.join(",")+")"),t[e[0]][e[1]][e[2]]}}();createColorMap(),function(t){function e(){this.commandArrays=[]}void 0==CanvasRenderingContext2D.prototype.ellipse&&(CanvasRenderingContext2D.prototype.ellipse=function(t,e,a,i,r,n,s,o){this.save(),this.translate(t,e),this.rotate(r),this.scale(a,i),this.arc(0,0,1,n,s,o),this.restore()}),supportsPath2D||(e.prototype.moveTo=function(t,e){this.commandArrays.push({type:"move",coord:[t,e]})},e.prototype.lineTo=function(t,e){this.commandArrays.push({type:"line",coord:[t,e]})},e.prototype.bezierCurveTo=function(t,e,a,i,r,n){this.commandArrays.push({type:"bezierCurve",coord:[t,e,a,i,r,n]})},e.prototype.drawToContext=function(t){var e,a,i=this.commandArrays.length;for(t.beginPath(),a=0;i>a;a+=1)switch(e=this.commandArrays[a],e.type){case"move":t.moveTo(e.coord[0],e.coord[1]);break;case"line":t.lineTo(e.coord[0],e.coord[1]);break;case"bezierCurve":t.bezierCurveTo(e.coord[0],e.coord[1],e.coord[2],e.coord[3],e.coord[4],e.coord[5])}},t.Path2D=e)}(window);var bez=bezFunction(),dataManager=dataFunctionManager();SVGRenderer.prototype.buildItems=function(t){var e,a=0,i=t.length;for(e=0;i>e;e++)"StillLayer"==t[e].type?(a++,this.createImage(t[e])):"PreCompLayer"==t[e].type?this.createComp(t[e]):"SolidLayer"==t[e].type?this.createSolid(t[e]):"ShapeLayer"==t[e].type?this.createShape(t[e]):"TextLayer"==t[e].type?this.createText(t[e]):console.log("NO TYPE: ",t[e])},SVGRenderer.prototype.createShape=function(t){t.element=new IShapeElement(t,this.animationItem)},SVGRenderer.prototype.createText=function(t){t.element=new ITextElement(t,this.animationItem)},SVGRenderer.prototype.createImage=function(t){t.element=new IImageElement(t,this.animationItem)},SVGRenderer.prototype.createComp=function(t){t.element=new ICompElement(t,this.animationItem),this.buildItems(t.layers,t.element.getType())},SVGRenderer.prototype.createSolid=function(t){t.element=new ISolidElement(t,this.animationItem)},SVGRenderer.prototype.configAnimation=function(t){this.animationItem.container=document.createElementNS(svgNS,"svg"),this.animationItem.container.setAttribute("xmlns","http://www.w3.org/2000/svg"),this.animationItem.container.setAttribute("width",t.animation.compWidth),this.animationItem.container.setAttribute("height",t.animation.compHeight),this.animationItem.container.setAttribute("viewBox","0 0 "+t.animation.compWidth+" "+t.animation.compHeight),this.animationItem.container.setAttribute("preserveAspectRatio","xMidYMid meet"),this.animationItem.container.style.width="100%",this.animationItem.container.style.height="100%",this.animationItem.container.style.transformOrigin=this.animationItem.container.style.mozTransformOrigin=this.animationItem.container.style.webkitTransformOrigin=this.animationItem.container.style["-webkit-transform"]="0px 0px 0px",this.animationItem.wrapper.appendChild(this.animationItem.container);var e=document.createElementNS(svgNS,"defs");this.animationItem.container.appendChild(e);var a=document.createElementNS(svgNS,"clipPath"),i=document.createElementNS(svgNS,"rect");i.setAttribute("width",t.animation.compWidth),i.setAttribute("height",t.animation.compHeight),i.setAttribute("x",0),i.setAttribute("y",0),a.setAttribute("id","animationMask"),a.appendChild(i);var r=document.createElementNS(svgNS,"g");r.setAttribute("clip-path","url(#animationMask)"),this.animationItem.container.appendChild(r),e.appendChild(a),this.animationItem.container=r,this.layers=t.animation.layers},SVGRenderer.prototype.buildStage=function(t,e){var a,i,r=e.length;for(a=r-1;a>=0;a--){if(i=e[a],i.parent){this.buildItemParenting(i,e,i.parent);var n=i.element.getDomElement();n.setAttribute("data-layer-name",i.layerName),t.appendChild(n),i.element.setMainElement(n)}else i.element.getDomElement().setAttribute("data-layer-name",i.layerName),t.appendChild(i.element.getDomElement()),i.element.setMainElement(i.element.getDomElement());"PreCompLayer"==i.type&&this.buildStage(i.element.getComposingElement(),i.layers,i.element.getType())}},SVGRenderer.prototype.buildItemParenting=function(t,e,a){t.parents||(t.parents=[]);for(var i=0,r=e.length;r>i;){if(e[i].layerName==a){t.parents.push({elem:e[i]}),e[i].parent&&this.buildItemParenting(t,e,e[i].parent);break}i+=1}},SVGRenderer.prototype.updateContainerSize=function(){},SVGRenderer.prototype.renderFrame=function(t){if(this.lastFrame!=t){this.lastFrame=t;var e,a=this.layers.length;for(e=0;a>e;e++)this.layers[e].element.prepareFrame(t-this.layers[e].startTime);for(e=0;a>e;e++)this.layers[e].element.renderFrame(t-this.layers[e].startTime)}},CanvasRenderer.prototype.buildItems=function(t){var e,a=0,i=t.length;for(e=0;i>e;e++)"StillLayer"==t[e].type?(a++,this.createImage(t[e])):"PreCompLayer"==t[e].type?this.createComp(t[e]):"SolidLayer"==t[e].type?this.createSolid(t[e]):"ShapeLayer"==t[e].type?this.createShape(t[e]):"TextLayer"==t[e].type?this.createText(t[e]):(this.createBase(t[e]),console.log("NO TYPE: ",t[e]))},CanvasRenderer.prototype.createBase=function(t){t.element=new CVBaseElement(t,this)},CanvasRenderer.prototype.createShape=function(t){t.element=new CVShapeElement(t,this)},CanvasRenderer.prototype.createText=function(t){t.element=new CVTextElement(t,this)},CanvasRenderer.prototype.createImage=function(t){t.element=new CVImageElement(t,this)},CanvasRenderer.prototype.createComp=function(t){t.element=new CVCompElement(t,this),this.buildItems(t.layers)},CanvasRenderer.prototype.createSolid=function(t){t.element=new CVSolidElement(t,this)},CanvasRenderer.prototype.configAnimation=function(t){this.animationItem.wrapper?(this.animationItem.container=document.createElement("canvas"),this.animationItem.container.style.width="100%",this.animationItem.container.style.height="100%",this.animationItem.container.style.transformOrigin=this.animationItem.container.style.mozTransformOrigin=this.animationItem.container.style.webkitTransformOrigin=this.animationItem.container.style["-webkit-transform"]="0px 0px 0px",this.animationItem.wrapper.appendChild(this.animationItem.container),this.canvasContext=this.animationItem.container.getContext("2d")):this.canvasContext=this.renderConfig.context,this.layers=t.animation.layers,this.transformCanvas={},this.transformCanvas.w=t.animation.compWidth,this.transformCanvas.h=t.animation.compHeight,this.updateContainerSize()},CanvasRenderer.prototype.updateContainerSize=function(){if(this.animationItem.wrapper&&this.animationItem.container){var t=this.animationItem.wrapper.offsetWidth,e=this.animationItem.wrapper.offsetHeight;this.animationItem.container.setAttribute("width",t),this.animationItem.container.setAttribute("height",e)}else var t=this.canvasContext.canvas.width,e=this.canvasContext.canvas.height;if("fit"==this.renderConfig.scaleMode){var a=t/e,i=this.transformCanvas.w/this.transformCanvas.h;i>a?(this.transformCanvas.sx=t/this.transformCanvas.w,this.transformCanvas.sy=t/this.transformCanvas.w,this.transformCanvas.tx=0,this.transformCanvas.ty=(e-this.transformCanvas.h*(t/this.transformCanvas.w))/2):(this.transformCanvas.sx=e/this.transformCanvas.h,this.transformCanvas.sy=e/this.transformCanvas.h,this.transformCanvas.tx=(t-this.transformCanvas.w*(e/this.transformCanvas.h))/2,this.transformCanvas.ty=0)
}else this.transformCanvas.sx=1,this.transformCanvas.sy=1,this.transformCanvas.tx=0,this.transformCanvas.ty=0},CanvasRenderer.prototype.buildStage=function(t,e){var a,i,r=e.length;for(a=r-1;a>=0;a--)i=e[a],i.parent&&(i.parentHierarchy=[],this.buildItemHierarchy(i,e,i.parent)),"PreCompLayer"==i.type&&this.buildStage(null,i.layers)},CanvasRenderer.prototype.buildItemHierarchy=function(t,e,a){for(var i=0,r=e.length;r>i;){if(e[i].layerName==a){t.parentHierarchy.push(e[i]),void 0==e[i].parent||this.buildItemHierarchy(t,e,e[i].parent);break}i+=1}},CanvasRenderer.prototype.prepareFrame=function(t){var e,a=this.layers.length;for(e=0;a>e;e++)this.layers[e].element.prepareFrame(t-this.layers[e].startTime)},CanvasRenderer.prototype.draw=function(){var t,e=this.layers.length;for(t=e-1;t>=0;t-=1)this.layers[t].element.draw()},CanvasRenderer.prototype.renderFrame=function(t){this.lastFrame!=t&&(this.lastFrame=t,this.renderConfig.clearCanvas===!0?this.canvasContext.canvas.width=this.canvasContext.canvas.width:this.canvasContext.save(),this.canvasContext.transform(this.transformCanvas.sx,0,0,this.transformCanvas.sy,this.transformCanvas.tx,this.transformCanvas.ty),this.canvasContext.beginPath(),this.canvasContext.rect(0,0,this.transformCanvas.w,this.transformCanvas.h),this.canvasContext.clip(),this.prepareFrame(t),this.draw(),this.renderConfig.clearCanvas!==!0&&this.canvasContext.restore())},MaskElement.prototype.init=function(){this.registeredEffects=[],this.masksProperties=this.data.masksProperties,this.totalMasks=this.masksProperties.length;var t=this.element.maskingGroup,e=this.element.maskedElement,a=document.createElementNS(svgNS,"defs");t.appendChild(a);var i,r=this.masksProperties.length;if(this.layerSize=this.element.getLayerSize(),this.usePaths){this.maskElement=document.createElementNS(svgNS,"clipPath");var n,s=this.data.masksProperties;for(i=0;r>i;i++)n=document.createElementNS(svgNS,"path"),s[i].cl?n.setAttribute("fill","#ffffff"):(n.setAttribute("fill","none"),n.setAttribute("stroke","#ffffff"),n.setAttribute("stroke-width","1"),n.setAttribute("stroke-miterlimit","10")),n.setAttribute("clip-rule","nonezero"),this.maskElement.appendChild(n),s[i].elem=n,s[i].lastPath="";var o=randomString(10);this.maskElement.setAttribute("id",o),e.setAttribute("clip-path","url(#"+o+")")}else{this.maskElement=document.createElementNS(svgNS,"mask"),this.canvas=document.createElement("canvas"),this.imageElement=document.createElementNS(svgNS,"image"),this.imageElement.setAttribute("width",this.layerSize.w),this.imageElement.setAttribute("height",this.layerSize.h),this.imageElement.setAttribute("x","0"),this.imageElement.setAttribute("y","0"),this.canvasContext=this.canvas.getContext("2d"),this.canvas.width=this.layerSize.w,this.canvas.height=this.layerSize.h,this.maskElement.appendChild(this.imageElement);var o=randomString(10);this.maskElement.setAttribute("id",o),e.setAttribute("mask","url(#"+o+")")}a.appendChild(this.maskElement)},MaskElement.prototype.createInvertedMask=function(t,e){this.helperCanvas.width=this.layerSize.w,this.helperCanvas.height=this.layerSize.h;var a=this.invertedContext;a.globalCompositeOperation="source-over";var i=t.o[e];if("a"==t.mode)a.fillStyle="rgba(255, 255, 255, "+t.o[e]+")",this.canvasContext.globalCompositeOperation="source-over";else if("s"==t.mode)a.fillStyle="rgba(0, 0, 0, "+i+")",this.canvasContext.globalCompositeOperation="source-over";else if("f"==t.mode)a.fillStyle="rgba(255, 255, 255, "+i+")",this.canvasContext.globalCompositeOperation="xor";else{if("i"!=t.mode)return;a.fillStyle="rgba(255, 255, 255, "+i+")",this.canvasContext.globalCompositeOperation="destination-in"}a.fillRect(0,0,this.helperCanvas.width,this.helperCanvas.height),a.fillStyle="rgba(255, 255, 255, 1)",a.globalCompositeOperation="destination-out",a.beginPath(),this.drawShape(a,t.pathVertices[e][0]),this.canvasContext.drawImage(this.helperCanvas,0,0)},MaskElement.prototype.renderFrame=function(t){var e,a=this.data.masksProperties.length;if(this.usePaths===!0){if("fullSvg"!==this.element.animationItem.animType)for(e=0;a>e;e++)this.drawPath(this.data.masksProperties[e],this.data.masksProperties[e].pathStrings[t])}else{this.canvas.width=this.canvas.width;var i=this.canvasContext;for(e=0;a>e;e++){var r=this.data.masksProperties[e].opacity[t];if(this.masksProperties[e].inv)this.createInvertedMask(this.masksProperties[e],t);else{if("a"==this.masksProperties[e].mode)i.globalCompositeOperation="source-over",i.fillStyle="rgba(255, 255, 255, "+r+")";else if("s"==this.masksProperties[e].mode)i.globalCompositeOperation="source-over",i.fillStyle="rgba(0, 0, 0, "+r+")";else if("f"==this.masksProperties[e].mode)i.globalCompositeOperation="xor",i.fillStyle="rgba(255, 255, 255, "+r+")";else{if("i"!=this.masksProperties[e].mode)continue;i.globalCompositeOperation="destination-in",i.fillStyle="rgba(255, 255, 255, "+r+")"}this.drawShape(i,this.data.masksProperties[e].pathVertices[t][0])}}var n=this.canvas.toDataURL("image/png");this.imageElement.setAttributeNS("http://www.w3.org/1999/xlink","href",n)}},MaskElement.prototype.processMaskFromEffects=function(t,e){var a,i=this.registeredEffects.length;for(a=0;i>a;a++)this.registeredEffects[a].renderMask(t,e)},MaskElement.prototype.registerEffect=function(t){this.registeredEffects.push(t)},MaskElement.prototype.getMaskelement=function(){return this.maskElement},MaskElement.prototype.createLayerSolidPath=function(){var t="M0,0 ";return t+="h"+this.layerSize.w,t+="v"+this.layerSize.h,t+="h"+-this.layerSize.w,t+="v"+-this.layerSize.h},MaskElement.prototype.drawPath=function(t,e){t.lastPath!==e&&(t.inv?t.elem.setAttribute("d",this.createLayerSolidPath()+e):t.elem.setAttribute("d",e),t.lastPath=e)},MaskElement.prototype.drawShape=function(t,e){t.beginPath();var a,i=e.v.length;for(a=0;i>a;a++)0==a?t.moveTo(e.v[a][0],e.v[a][1]):t.bezierCurveTo(e.o[a-1][0]+e.v[a-1][0],e.o[a-1][1]+e.v[a-1][1],e.i[a][0]+e.v[a][0],e.i[a][1]+e.v[a][1],e.v[a][0],e.v[a][1]);t.bezierCurveTo(e.o[a-1][0]+e.v[a-1][0],e.o[a-1][1]+e.v[a-1][1],e.i[0][0]+e.v[0][0],e.i[0][1]+e.v[0][1],e.v[0][0],e.v[0][1]),t.closePath(),t.fill()},defineDescriptor(MaskElement,"helperCanvas",document.createElement("canvas")),defineDescriptor(MaskElement,"helperContext",MaskElement.prototype.helperCanvas.getContext("2d")),defineDescriptor(MaskElement,"data",null,{writable:!0}),defineDescriptor(MaskElement,"element",null),defineDescriptor(MaskElement,"usePaths",!0,{writable:!0}),defineDescriptor(MaskElement,"paths",[],{writable:!0});var BaseElement=function(t,e){this.animationItem=e,this.data=t,this.transformChanged=!1,this.forceRender=!1,this.init()};BaseElement.prototype.init=function(){this.createElements(),this.data.hasMask&&this.addMasks(this.data),this.data.eff&&this.createEffectsManager(this.data)},BaseElement.prototype.createElements=function(){this.layerElement=document.createElementNS(svgNS,"g"),this.layerElement.setAttribute("id",this.data.layerName),this.maskingGroup=this.layerElement,this.maskedElement=this.layerElement},BaseElement.prototype.prepareFrame=function(t){this.currentAnimData=this.data.renderedData[t].an,this.data.renderedFrame.tr!==this.currentAnimData.matrixValue?(this.transformChanged=!0,this.data.renderedFrame.tr=this.currentAnimData.matrixValue):this.transformChanged=!1},BaseElement.prototype.renderFrame=function(t){if(this.data.inPoint-this.data.startTime<=t&&this.data.outPoint-this.data.startTime>t?this.isVisible!==!0&&(this.isVisible=!0,this.forceRender=!0,this.mainElement.setAttribute("opacity",1)):this.isVisible!==!1&&(this.isVisible=!1,this.mainElement.setAttribute("opacity",0)),this.data.eff&&this.effectsManager.renderFrame(t,this.currentAnimData.mk),t===this.data.renderedFrame.num)return this.isVisible;this.data.hasMask&&this.maskManager.renderFrame(t),this.data.renderedFrame.o!==this.currentAnimData.tr.o&&(this.data.renderedFrame.o=this.currentAnimData.tr.o,this.isVisible&&this.layerElement.setAttribute("opacity",this.currentAnimData.tr.o));var e="";if(this.data.parents){var a,i=!1,r=0,n=this.data.parents.length;if(this.transformChanged)i=!0;else for(;n>r;){if(this.data.parents[r].elem.element.transformChanged){i=!0;break}r+=1}if(i){for(r=n-1;r>=0;r-=1)a=this.data.parents[r].elem.element.currentAnimData,e+=a.matrixValue+" ";e+=this.currentAnimData.matrixValue,this.isVisible&&this.layerElement.setAttribute("transform",e),this.fullTransform=e}}else this.transformChanged&&(e+=this.currentAnimData.matrixValue,this.isVisible&&this.layerElement.setAttribute("transform",e),this.fullTransform=e);return this.forceRender&&(this.forceRender=!1,this.layerElement.setAttribute("opacity",this.currentAnimData.tr.o),this.layerElement.setAttribute("transform",this.fullTransform)),this.isVisible},BaseElement.prototype.getDomElement=function(){return this.layerElement},BaseElement.prototype.setMainElement=function(t){this.mainElement=t},BaseElement.prototype.getMaskManager=function(){return this.maskManager},BaseElement.prototype.addMasks=function(t){var e={data:{value:t},element:{value:this}};this.maskManager=createElement(MaskElement,null,e)},BaseElement.prototype.createEffectsManager=function(t){var e={effects:{value:t.eff},element:{value:this}};this.effectsManager=createElement(EffectsManager,null,e)},BaseElement.prototype.getType=function(){return this.type},BaseElement.prototype.getLayerSize=function(){return"TextLayer"==this.data.type?{w:this.data.textData.width,h:this.data.textData.height}:{w:this.data.width,h:this.data.height}},createElement(BaseElement,ICompElement),ICompElement.prototype.createElements=function(){this.svgElem=document.createElementNS(svgNS,"g"),this.parent.createElements.call(this)},ICompElement.prototype.getComposingElement=function(){return this.layerElement},ICompElement.prototype.renderFrame=function(t){var e=this.parent.renderFrame.call(this,t);if(e!==!1){var a,i=this.layers.length,r=this.data.tm?this.data.tm[t]<0?0:this.data.tm[t]:t;for(a=0;i>a;a+=1)this.layers[a].element.prepareFrame(r-this.layers[a].startTime);for(a=0;i>a;a+=1)this.layers[a].element.renderFrame(r-this.layers[a].startTime)}},createElement(BaseElement,IImageElement),IImageElement.prototype.createElements=function(){var t=this,e=function(){t.image.setAttributeNS("http://www.w3.org/1999/xlink","href",t.path+t.assets[t.data.assetId].path),t.maskedElement=t.image,t.animationItem.elementLoaded()},a=new Image;a.addEventListener("load",e,!1),a.src=this.path+this.assets[this.data.assetId].path,this.svgElem=document.createElementNS(svgNS,"g"),this.parent.createElements.call(this),this.image=document.createElementNS(svgNS,"image"),this.image.setAttribute("width",this.data.width+"px"),this.image.setAttribute("height",this.data.height+"px"),this.svgElem.appendChild(this.image),this.layerElement.appendChild(this.svgElem),this.maskingGroup=this.svgElem,styleUnselectableDiv(this.image)},createElement(BaseElement,IShapeElement),IShapeElement.prototype.createElements=function(){this.parent.createElements.call(this);var t,e,a=this.data.shapes.length;for(t=a-1;t>=0;t--)this.data.trim&&(this.data.shapes[t].trim=this.data.trim),e=new ShapeItemElement(this.data.shapes[t]),this.layerElement.appendChild(e.getElement()),this.shapes.push(e)},IShapeElement.prototype.renderFrame=function(t){var e=this.parent.renderFrame.call(this,t);e!==!1&&this.renderShapes(t)},IShapeElement.prototype.renderShapes=function(t){var e,a,i,r=this.data.shapes.length;for(e=r-1;e>=0;e--)a=this.data.shapes[e],i=this.shapes[r-1-e],i.renderShape(t)},ShapeItemElement.prototype.adjustTrim=function(){var t,e=this.data.trim,a=e.length;for(t=0;a>t;t+=1)e[t].o&&(e[t].o-=90)},ShapeItemElement.prototype.getElement=function(){return this.shapeG},ShapeItemElement.prototype.renderShape=function(t){this.currentData=this.data.renderedData[t],"pathShape"==this.data.type?this.pathLength=this.renderPath(t):"rectShape"==this.data.type?this.renderRect(t):"ellipseShape"==this.data.type&&(this.pathLength=this.renderEllipse(t)),this.data.trim&&this.renderTrim(t),this.renderFill(t),this.renderStroke(t),this.renderTransform(t)},ShapeItemElement.prototype.renderPath=function(){var t=this.currentData,e=t.path;return e.pathString!=this.renderedFrame.path?(this.renderedFrame.path=e.pathString,this.shape.setAttribute("d",e.pathString),this.data.trim?(null==this.cachedData.pathLengths&&(this.cachedData.pathLengths={}),null==this.cachedData.pathLengths[e.pathString]&&(this.cachedData.pathLengths[e.pathString]=this.shape.getTotalLength()),this.cachedData.pathLengths[e.pathString]):void 0):this.data.trim?this.cachedData.pathLengths[e.pathString]:void 0},ShapeItemElement.prototype.renderEllipse=function(t){var e=this.currentData.ell;if(this.renderedFrame.ellipse.rx!=e.size[0]&&(this.shape.setAttribute("rx",e.size[0]/2),this.renderedFrame.ellipse.rx=e.size[0]),this.renderedFrame.ellipse.ry!=e.size[1]&&(this.shape.setAttribute("ry",e.size[1]/2),this.renderedFrame.ellipse.ry=e.size[1]),this.renderedFrame.ellipse.cx!=e.p[0]&&(this.shape.setAttribute("cx",e.p[0]),this.renderedFrame.ellipse.ry=e.p[0]),this.renderedFrame.ellipse.cy!=e.p[1]&&(this.shape.setAttribute("cy",e.p[1]),this.renderedFrame.ellipse.ry=e.p[1]),this.data.trim){if(null==this.cachedData.pathLengths&&(this.cachedData.pathLengths={}),null==this.cachedData.pathLengths["ellipse_"+t])if(e.size[0]==e.size[1])this.cachedData.pathLengths["ellipse_"+t]=Math.PI*e.size[0];else{var a=Math.max(e.size[0],e.size[1])/2,i=Math.max(e.size[0],e.size[1])/2,r=(a-i)/(a+i),n=(a+i)*Math.PI*(1+.25*r+1/64*Math.pow(r,2)+1/256*Math.pow(r,3));this.cachedData.pathLengths["ellipse_"+t]=n}return this.cachedData.pathLengths["ellipse_"+t]}},ShapeItemElement.prototype.renderRect=function(){var t=this.currentData;if(t.rect){var e=t.rect;this.renderedFrame.rect.rx!=e.roundness&&(this.shape.setAttribute("rx",e.roundness),this.shape.setAttribute("ry",e.roundness),this.renderedFrame.rect.rx=e.roundness),this.renderedFrame.rect.width!=e.size[0]&&(this.shape.setAttribute("width",e.size[0]),this.renderedFrame.rect.width=e.size[0]),this.renderedFrame.rect.height!=e.size[1]&&(this.shape.setAttribute("height",e.size[1]),this.renderedFrame.rect.height=e.size[1]),this.renderedFrame.rect.x!=e.position[0]-e.size[0]&&(this.shape.setAttribute("x",e.position[0]-e.size[0]/2),this.renderedFrame.rect.x=e.position[0]-e.size[0]),this.renderedFrame.rect.y!=e.position[1]-e.size[1]&&(this.shape.setAttribute("y",e.position[1]-e.size[1]/2),this.renderedFrame.rect.y=e.position[1]-e.size[1])}},ShapeItemElement.prototype.renderFill=function(){var t=this.currentData;if(t.fill){var e=t.fill;this.renderedFrame.fill.color!==e.color&&(this.shape.setAttribute("fill",e.color),this.renderedFrame.fill.color=e.color),this.data.fillEnabled!==!1?this.renderedFrame.fill.opacity!==e.opacity&&(this.shape.setAttribute("fill-opacity",e.opacity),this.renderedFrame.fill.opacity=e.opacity):0!==this.renderedFrame.fill.opacity&&(this.shape.setAttribute("fill-opacity",0),this.renderedFrame.fill.opacity=0)}else 0!==this.renderedFrame.fill.opacity&&(this.shape.setAttribute("fill-opacity",0),this.renderedFrame.fill.opacity=0)},ShapeItemElement.prototype.renderStroke=function(){var t=this.currentData;if(t.stroke){var e=t.stroke;this.renderedFrame.stroke.color!==e.color&&(this.renderedFrame.stroke.color=e.color,this.shape.setAttribute("stroke",e.color)),this.renderedFrame.stroke.width!==e.width&&(this.renderedFrame.stroke.width=e.width,this.shape.setAttribute("stroke-width",e.width)),this.data.strokeEnabled!==!1?this.renderedFrame.stroke.opacity!==e.opacity&&(this.renderedFrame.stroke.opacity=e.opacity,this.shape.setAttribute("stroke-opacity",e.opacity)):0!==this.renderedFrame.stroke.opacity&&(this.renderedFrame.stroke.opacity=0,this.shape.setAttribute("stroke-opacity",0))}},ShapeItemElement.prototype.renderTransform=function(){var t=this.currentData;if(t.tr){var e=t.tr;this.renderedFrame.tr.o!==e.o&&(this.renderedFrame.tr.o=e.o,this.shapeG.setAttribute("opacity",e.o)),this.renderedFrame.tr.mt!==e.mt&&(this.renderedFrame.tr.mt=e.mt,this.shapeG.setAttribute("transform",e.mt)),(this.renderedFrame.tr.a[0]!==e.a[0]||this.renderedFrame.tr.a[1]!==e.a[1])&&(this.renderedFrame.tr.a[0]=e.a[0],this.renderedFrame.tr.a[1]=e.a[1],this.shape.setAttribute("transform","translate("+-e.a[0]+", "+-e.a[1]+")"))}},ShapeItemElement.prototype.renderTrim=function(){var t=this.currentData.trim;if(0==this.pathLength)this.shape.setAttribute("stroke-opacity",0);else{this.renderedFrame.trim.e==t.e&&this.renderedFrame.trim.s==t.s&&this.renderedFrame.trim.o==t.o,this.renderedFrame.trim.e=t.e,this.renderedFrame.trim.s=t.s,this.renderedFrame.trim.o=t.o;var e=this.pathLength*(t.e-t.s)/100,a=this.pathLength-e,i=this.pathLength*t.s/100+this.pathLength*t.o/360,r=e+" , "+a;this.shape.setAttribute("stroke-dasharray",r),this.shape.setAttribute("stroke-dashoffset",this.pathLength-i),t.e==t.s?this.shape.setAttribute("stroke-opacity",0):this.currentData.stroke&&(this.data.strokeEnabled!==!1?this.shape.setAttribute("stroke-opacity",this.currentData.stroke.opacity):this.shape.setAttribute("stroke-opacity",0))}},createElement(BaseElement,ISolidElement),ISolidElement.prototype.createElements=function(){this.svgElem=document.createElementNS(svgNS,"g"),this.parent.createElements.call(this),this.layerElement.appendChild(this.svgElem);var t=document.createElementNS(svgNS,"rect");t.setAttribute("width",this.data.width),t.setAttribute("height",this.data.height),t.setAttribute("fill",this.data.color),this.svgElem.appendChild(t),styleUnselectableDiv(this.svgElem),styleUnselectableDiv(t),this.maskingGroup=this.svgElem,this.maskedElement=t},createElement(BaseElement,ITextElement),ITextElement.prototype.createElements=function(){this.svgElem=document.createElementNS(svgNS,"g");var t=document.createElementNS(svgNS,"text");t.textContent=this.data.textData.text,t.setAttribute("fill",this.data.textData.fillColor),t.setAttribute("x","0"),t.setAttribute("y",this.data.textData.height-(this.data.textData.fontSize-this.data.textData.height)/2),this.svgElem.setAttribute("width",this.data.textData.width),this.svgElem.setAttribute("height",this.data.textData.height),this.svgElem.style.transform="translate("+this.data.textData.xOffset+"px,"+this.data.textData.yOffset+"px)",this.svgElem.style["-webkit-transform"]="translate("+this.data.textData.xOffset+"px,"+this.data.textData.yOffset+"px)",t.setAttribute("font-size",this.data.textData.fontSize),t.setAttribute("font-family","Arial, sans-serif"),this.svgElem.appendChild(t),this.parent.createElements.call(this),this.anchorElement.appendChild(this.svgElem),this.maskingGroup=this.svgElem,this.maskedElement=t},CVBaseElement.prototype.init=function(){this.createElements(),this.data.hasMask&&this.addMasks(this.data),this.data.eff&&this.createEffectsManager(this.data)},CVBaseElement.prototype.createElements=function(){},CVBaseElement.prototype.prepareFrame=function(t){return this.data.inPoint-this.data.startTime<=t&&this.data.outPoint-this.data.startTime>t?(this.renderFrame=!0,this.currentAnimData=this.data.renderedData[t].an,void(this.data.hasMask&&this.maskManager.prepareFrame(t))):(this.renderFrame=!1,this.currentAnimData=this.data.renderedData[t].an,!1)},CVBaseElement.prototype.draw=function(t){if(t!==!1&&this.renderer.canvasContext.save(),!this.renderFrame)return!1;var e,a=this.renderer.canvasContext;if(this.data.parentHierarchy){var i,r,n=this.data.parentHierarchy.length;for(i=n-1;i>=0;i-=1)r=this.data.parentHierarchy[i].element.getCurrentAnimData(),e=r.matrixArray,a.transform(e[0],e[1],e[2],e[3],e[4],e[5]),a.translate(-r.tr.a[0],-r.tr.a[1])}a.globalAlpha=a.globalAlpha*this.currentAnimData.tr.o,e=this.currentAnimData.matrixArray,a.transform(e[0],e[1],e[2],e[3],e[4],e[5]),a.translate(-this.currentAnimData.tr.a[0],-this.currentAnimData.tr.a[1]),this.data.hasMask&&this.maskManager.draw(),t!==!1&&this.renderer.canvasContext.restore()},CVBaseElement.prototype.getCurrentAnimData=function(){return this.currentAnimData},CVBaseElement.prototype.addMasks=function(t){var e={data:{value:t},element:{value:this}};this.maskManager=createElement(CVMaskElement,null,e)},CVBaseElement.prototype.createEffectsManager=function(t){var e={effects:{value:t.eff},element:{value:this}};this.effectsManager=createElement(EffectsManager,null,e)},CVBaseElement.prototype.getType=function(){return this.type},CVBaseElement.prototype.getLayerSize=function(){return"TextLayer"==this.data.type?{w:this.data.textData.width,h:this.data.textData.height}:{w:this.data.width,h:this.data.height}},createElement(CVBaseElement,CVCompElement),CVCompElement.prototype.prepareFrame=function(t){var e=this.parent.prepareFrame.call(this,t);if(e!==!1){var a,i=this.layers.length,r=this.data.tm?this.data.tm[t]<0?0:this.data.tm[t]:t;for(a=0;i>a;a+=1)this.layers[a].element.prepareFrame(r-this.layers[a].startTime)}},CVCompElement.prototype.draw=function(){if(this.renderer.canvasContext.save(),this.parent.draw.call(this,!1)===!1)return void this.renderer.canvasContext.restore();var t,e=this.layers.length;for(t=e-1;t>=0;t-=1)this.layers[t].element.draw();this.renderer.canvasContext.restore()},createElement(CVBaseElement,CVImageElement),CVImageElement.prototype.createElements=function(){var t=this,e=function(){t.animationItem.elementLoaded()};this.img=new Image,this.img.addEventListener("load",e,!1),this.img.src=this.path+this.assets[this.data.assetId].path,this.parent.createElements.call(this)},CVImageElement.prototype.draw=function(){if(this.renderer.canvasContext.save(),this.parent.draw.call(this,!1)===!1)return void this.renderer.canvasContext.restore();var t=this.renderer.canvasContext;t.drawImage(this.img,0,0),this.renderer.canvasContext.restore()},createElement(CVBaseElement,CVShapeElement),CVShapeElement.prototype.createElements=function(){this.parent.createElements.call(this);var t,e,a=this.data.shapes.length;for(t=a-1;t>=0;t--)this.data.trim&&(this.data.shapes[t].trim=this.data.trim),e=new CVShapeItemElement(this.data.shapes[t],this.renderer),this.shapes.push(e)},CVShapeElement.prototype.prepareFrame=function(t){var e=this.parent.prepareFrame.call(this,t);if(e!==!1){var a,i=this.data.shapes.length;for(a=i-1;a>=0;a--)this.shapes[i-1-a].prepareFrame(t)}},CVShapeElement.prototype.draw=function(){return this.renderer.canvasContext.save(),this.parent.draw.call(this,!1)===!1?void this.renderer.canvasContext.restore():(this.drawShapes(),void this.renderer.canvasContext.restore())},CVShapeElement.prototype.drawShapes=function(){var t,e=this.data.shapes.length;for(t=e-1;t>=0;t--)this.shapes[e-1-t].renderShape()},CVShapeItemElement.prototype.adjustTrim=function(){var t,e=this.data.trim,a=e.length;for(t=0;a>t;t+=1)e[t].o&&(e[t].o-=90)},CVShapeItemElement.prototype.renderShape=function(){if(""!==this.data.type){var t=this.frameNum;this.currentData=this.data.renderedData[t];var e=this.renderer.canvasContext,a=this.renderTransform(t);"pathShape"==this.data.type?this.data.trim?this.renderTrimPath(t):this.renderPath(t):"rectShape"==this.data.type?this.renderRect(t):"ellipseShape"==this.data.type&&(this.pathLength=this.renderEllipse(t)),this.renderFill(t),this.renderStroke(t),this.renderer.canvasContext.lineCap="round",this.renderer.canvasContext.lineJoin="round",this.renderedPaths[t]?supportsPath2D?(this.renderer.canvasContext.fill(this.renderedPaths[t]),this.renderer.canvasContext.stroke(this.renderedPaths[t])):(this.renderedPaths[t].drawToContext(this.renderer.canvasContext),this.renderer.canvasContext.fill(),this.renderer.canvasContext.stroke()):(this.renderer.canvasContext.fill(),this.renderer.canvasContext.stroke()),a&&e.restore()}},CVShapeItemElement.prototype.prepareFrame=function(t){this.frameNum=t},CVShapeItemElement.prototype.renderTransform=function(){var t=this.currentData;if(t.tr){var e=!1,a=this.renderer.canvasContext,i=t.tr,r=i.mtArr;return(1!==r[0]||0!==r[1]||0!==r[2]||1!==r[3]||0!==r[4]||0!==r[5])&&(a.save(),a.transform(r[0],r[1],r[2],r[3],r[4],r[5]),e=!0),(0!=i.a[0]||0!=i.a[1])&&(e||(a.save(),e=!0),a.translate(-i.a[0],-i.a[1])),i.o<1&&(e||(a.save(),e=!0),a.globalAlpha*=i.o),e}},CVShapeItemElement.prototype.addToTrim=function(t,e,a){this.trims[t]||this.trims.push({}),this.trims[t].s=e,this.trims[t].e=a,this.trims[t].ended=!1},CVShapeItemElement.prototype.renderTrimPath=function(t){var e=this.currentData.trim;if(e.e!=e.s&&!this.renderedPaths[t]){var a,i=new Path2D,r=this.currentData.path,n=r.pathNodes,s=[],o=0,h=n.v.length;for(a=0;h-1>a;a+=1)s.push(bez.drawBezierCurve(n.v[a],n.v[a+1],n.o[a],n.i[a+1])),o+=s[a].segmentLength;r.closed&&(s.push(bez.drawBezierCurve(n.v[a],n.v[0],n.o[a],n.i[0])),o+=s[a].segmentLength),h=s.length;var m=o*(e.e-e.s)/100;e.o=e.o%360,e.o<0&&(e.o+=360);var p=(e.s/100+e.o/360)%1*o,l=0;if(p+m-o>1e-5){var d=p+m-o;this.addToTrim(0,p,p+m-d),this.addToTrim(1,0,p+m-o),l+=2}else this.addToTrim(0,p,p+m),l+=1;var c,u,f,y,g,v=0,x=!1,C=this.trims.length;for(a=0;h>a&&!x;a+=1){for(u=s[a].points.length,y=!0,g=0;C>g;g+=1)v+s[a].segmentLength>this.trims[g].s&&(y=!1);if(y)v+=s[a].segmentLength;else{var E,b;for(c=0;u-1>c&&!x;c+=1)for(C=this.trims.length,E=s[a].points[c],b=s[a].points[c+1],v+=E.partialLength,g=0;C>g;g+=1)if(!this.trims[g].ended)if(this.trims[g].s>=v&&this.trims[g].s<v+b.partialLength&&(f=(this.trims[g].s-v)/b.partialLength,i.moveTo(E.point[0]+(b.point[0]-E.point[0])*f,E.point[1]+(b.point[1]-E.point[1])*f)),this.trims[g].e>v&&this.trims[g].e<=v+b.partialLength){if(f=(this.trims[g].e-v)/b.partialLength,i.lineTo(E.point[0]+(b.point[0]-E.point[0])*f,E.point[1]+(b.point[1]-E.point[1])*f),l-=1,this.trims[g].ended=!0,0==l){x=!0;break}}else v>this.trims[g].s&&v<this.trims[g].e&&i.lineTo(E.point[0],E.point[1]);this.renderedPaths[t]=i}}}},CVShapeItemElement.prototype.renderPath=function(t){var e=this.currentData,a=e.path;if(!this.renderedPaths[t]){var i=new Path2D,r=this.renderer.canvasContext,n=a.pathNodes;n instanceof Array&&(n=n[0]);var s,o=n.i.length;for(r.beginPath(),i.moveTo(n.v[0][0],n.v[0][1]),s=1;o>s;s+=1)i.bezierCurveTo(n.o[s-1][0],n.o[s-1][1],n.i[s][0],n.i[s][1],n.v[s][0],n.v[s][1]);a.closed&&i.bezierCurveTo(n.o[s-1][0],n.o[s-1][1],n.i[0][0],n.i[0][1],n.v[0][0],n.v[0][1]),this.renderedPaths[t]=i}},CVShapeItemElement.prototype.renderEllipse=function(){var t=this.currentData.ell,e=this.renderer.canvasContext;e.beginPath(),e.ellipse(t.p[0],t.p[1],t.size[0]/2,t.size[1]/2,0,0,2*Math.PI,!0),e.closePath()},CVShapeItemElement.prototype.renderRect=function(){var t=this.currentData.rect,e=t.roundness,a=this.renderer.canvasContext;if(a.beginPath(),0==e)a.rect(t.position[0]-t.size[0]/2,t.position[1]-t.size[1]/2,t.size[0],t.size[1]);else{var i=t.position[0]-t.size[0]/2,r=t.position[1]-t.size[1]/2,n=t.size[0],s=t.size[1];e instanceof Array&&(e=e[0]),a.moveTo(i+e,r),a.lineTo(i+n-e,r),a.quadraticCurveTo(i+n,r,i+n,r+e),a.lineTo(i+n,r+s-e),a.quadraticCurveTo(i+n,r+s,i+n-e,r+s),a.lineTo(i+e,r+s),a.quadraticCurveTo(i,r+s,i,r+s-e),a.lineTo(i,r+e),a.quadraticCurveTo(i,r,i+e,r)}},CVShapeItemElement.prototype.renderFill=function(){var t=this.currentData;if(t.fill){var e=t.fill;if(this.data.fillEnabled!==!1)return void(this.renderer.canvasContext.fillStyle=e.opacity<1?fillColorToString(e.color,e.opacity):fillColorToString(e.color))}this.renderer.canvasContext.fillStyle="rgba(0,0,0,0)"},CVShapeItemElement.prototype.renderStroke=function(){var t=this.currentData;if(t.stroke){var e=t.stroke;if(this.renderer.canvasContext.lineWidth=e.width,this.data.strokeEnabled!==!1)return void(this.renderer.canvasContext.strokeStyle=e.opacity<1?fillColorToString(e.color,e.opacity):fillColorToString(e.color))}this.renderer.canvasContext.strokeStyle="rgba(0,0,0,0)"},createElement(CVBaseElement,CVSolidElement),CVSolidElement.prototype.draw=function(){if(this.renderer.canvasContext.save(),this.parent.draw.call(this,!1)===!1)return void this.renderer.canvasContext.restore();var t=this.renderer.canvasContext;t.fillStyle=this.data.color,t.fillRect(0,0,this.data.width,this.data.height),this.renderer.canvasContext.restore()},createElement(CVBaseElement,CVTextElement),CVTextElement.prototype.createElements=function(){this.svgElem=document.createElementNS(svgNS,"g");var t=document.createElementNS(svgNS,"text");t.textContent=this.data.textData.text,t.setAttribute("fill",this.data.textData.fillColor),t.setAttribute("x","0"),t.setAttribute("y",this.data.textData.height-(this.data.textData.fontSize-this.data.textData.height)/2),this.svgElem.setAttribute("width",this.data.textData.width),this.svgElem.setAttribute("height",this.data.textData.height),this.svgElem.style.transform="translate("+this.data.textData.xOffset+"px,"+this.data.textData.yOffset+"px)",this.svgElem.style["-webkit-transform"]="translate("+this.data.textData.xOffset+"px,"+this.data.textData.yOffset+"px)",t.setAttribute("font-size",this.data.textData.fontSize),t.setAttribute("font-family","Arial, sans-serif"),this.svgElem.appendChild(t),this.parent.createElements.call(this),this.anchorElement.appendChild(this.svgElem),this.maskingGroup=this.svgElem,this.maskedElement=t},CVMaskElement.prototype.init=function(){this.registeredEffects=[],this.masksProperties=this.data.masksProperties,this.totalMasks=this.masksProperties.length,this.ctx=this.element.renderer.canvasContext,this.layerSize=this.element.getLayerSize()},CVMaskElement.prototype.prepareFrame=function(t){this.frameNum=t},CVMaskElement.prototype.draw=function(){var t,e=this.data.masksProperties.length;for(t=0;e>t;t++)this.masksProperties[t].inv?this.createInvertedMask(this.masksProperties[t],this.frameNum):this.drawShape(this.ctx,this.data.masksProperties[t].pathVertices[this.frameNum][0])},CVMaskElement.prototype.drawShape=function(t,e){t.beginPath();var a,i=e.v.length;for(t.moveTo(e.v[0][0],e.v[0][1]),a=1;i>a;a++)t.bezierCurveTo(e.o[a-1][0],e.o[a-1][1],e.i[a][0],e.i[a][1],e.v[a][0],e.v[a][1]);t.bezierCurveTo(e.o[a-1][0],e.o[a-1][1],e.i[0][0],e.i[0][1],e.v[0][0],e.v[0][1]),t.closePath(),t.clip()};var animationManager=function(){function t(t){if(!t)return null;for(var e=0;v>e;){if(f[e].elem==t&&null!==f[e].elem)return f[e].animation;e+=1}var a=new AnimationItem;return a.setData(t),f.push({elem:t,animation:a}),v+=1,a}function e(t){var e=new AnimationItem;return e.setParams(t),f.push({elem:null,animation:e}),v+=1,e}function a(t,e){var a;for(a=0;v>a;a+=1)f[a].animation.setSpeed(t,e)}function i(t,e){var a;for(a=0;v>a;a+=1)f[a].animation.setDirection(t,e)}function r(t){var e;for(e=0;v>e;e+=1)f[e].animation.play(t)}function n(t,e){g=!1,y=Date.now();var a;for(a=0;v>a;a+=1)f[a].animation.moveFrame(t,e)}function s(){var t,e=Date.now(),a=e-y;for(t=0;v>t;t+=1)f[t].animation.advanceTime(a);y=e,requestAnimationFrame(s)}function o(t){var e;for(e=0;v>e;e+=1)f[e].animation.pause(t)}function h(t,e,a){var i;for(i=0;v>i;i+=1)f[i].animation.goToAndStop(t,e,a)}function m(t){var e;for(e=0;v>e;e+=1)f[e].animation.stop(t)}function p(t){var e;for(e=0;v>e;e+=1)f[e].animation.togglePause(t)}function l(){var e=document.getElementsByClassName("bodymovin");Array.prototype.forEach.call(e,t)}function d(){var t;for(t=0;v>t;t+=1)f[t].animation.resize()}function c(){y=Date.now(),requestAnimationFrame(s)}var u={},f=[],y=0,g=!0,v=0;return setTimeout(c,0),u.registerAnimation=t,u.loadAnimation=e,u.setSpeed=a,u.setDirection=i,u.play=r,u.moveFrame=n,u.pause=o,u.stop=m,u.togglePause=p,u.searchAnimations=l,u.resize=d,u.start=c,u.goToAndStop=h,u}(),AnimationItem=function(){this.name="",this.path="",this.isLoaded=!1,this.currentFrame=0,this.currentRawFrame=0,this.totalFrames=0,this.frameRate=0,this.frameMult=0,this.playSpeed=1,this.playDirection=1,this.pendingElements=0,this.playCount=0,this.prerenderFramesFlag=!0,this.repeat="indefinite",this.animationData={},this.layers=[],this.assets=[],this.isPaused=!0,this.isScrolling=!1,this.autoplay=!1,this.loop=!0,this.renderer=null,this.animationID=randomString(10),this.renderedFrameCount=0,this.scaleMode="fit",this.math=Math};AnimationItem.prototype.setParams=function(t){var e=this;t.context&&(this.context=t.context),t.wrapper&&(this.wrapper=t.wrapper);var a=t.animType?t.animType:"canvas";switch(a){case"canvas":this.renderer=new CanvasRenderer(this,t.renderer);
break;case"svg":this.renderer=new SVGRenderer(this,t.renderer)}if(this.animType=a,""===t.loop||null===t.loop||(this.loop=t.loop===!1?!1:t.loop===!0?!0:parseInt(t.loop)),this.autoplay="autoplay"in t?t.autoplay:!0,this.name=t.name?t.name:"",this.prerenderFramesFlag="prerender"in t?t.prerender:!0,t.animationData)e.configAnimation(t.animationData);else if(t.path){"json"!=t.path.substr(-4)&&("/"!=t.path.substr(-1,1)&&(t.path+="/"),t.path+="data.json");var i=new XMLHttpRequest;this.path=t.path.substr(0,t.path.lastIndexOf("/")+1),i.open("GET",t.path,!0),i.send(),i.onreadystatechange=function(){if(4==i.readyState)if(200==i.status)e.configAnimation(JSON.parse(i.responseText));else try{var t=JSON.parse(i.responseText);e.configAnimation(t)}catch(a){}}}},AnimationItem.prototype.setData=function(t){var e={wrapper:t},a=t.attributes;e.path=a.getNamedItem("data-animation-path")?a.getNamedItem("data-animation-path").value:a.getNamedItem("data-bm-path")?a.getNamedItem("data-bm-path").value:a.getNamedItem("bm-path")?a.getNamedItem("bm-path").value:"",e.animType=a.getNamedItem("data-anim-type")?a.getNamedItem("data-anim-type").value:a.getNamedItem("data-bm-type")?a.getNamedItem("data-bm-type").value:a.getNamedItem("bm-type")?a.getNamedItem("bm-type").value:"canvas";var i=a.getNamedItem("data-anim-loop")?a.getNamedItem("data-anim-loop").value:a.getNamedItem("data-bm-loop")?a.getNamedItem("data-bm-loop").value:a.getNamedItem("bm-loop")?a.getNamedItem("bm-loop").value:"";""==i||(e.loop="false"===i?!1:"true"===i?!0:parseInt(i)),e.name=a.getNamedItem("data-name")?a.getNamedItem("data-name").value:a.getNamedItem("data-bm-name")?a.getNamedItem("data-bm-name").value:a.getNamedItem("bm-name")?a.getNamedItem("bm-name").value:"";var r=a.getNamedItem("data-anim-prerender")?a.getNamedItem("data-anim-prerender").value:a.getNamedItem("data-bm-prerender")?a.getNamedItem("data-bm-prerender").value:a.getNamedItem("bm-prerender")?a.getNamedItem("bm-prerender").value:"";"false"===r&&(e.prerender=!1),this.setParams(e)},AnimationItem.prototype.configAnimation=function(t){this.renderer.configAnimation(t),this.animationData=t,this.animationData._id=this.animationID,this.animationData._animType=this.animType,this.layers=this.animationData.animation.layers,this.assets=this.animationData.assets,this.totalFrames=this.animationData.animation.totalFrames,this.frameRate=this.animationData.animation.frameRate,this.frameMult=this.animationData.animation.frameRate/1e3,dataManager.completeData(this.animationData),this.renderer.buildItems(this.animationData.animation.layers),this.updaFrameModifier(),this.checkLoaded()},AnimationItem.prototype.elementLoaded=function(){this.pendingElements--,this.checkLoaded()},AnimationItem.prototype.checkLoaded=function(){this.renderer.buildStage(this.container,this.layers),0==this.pendingElements&&(this.prerenderFramesFlag?(this.prerenderFrames(0),dataManager.renderFrame(this.animationID,this.currentFrame),this.renderer.renderFrame(this.currentFrame)):(this.isLoaded=!0,this.gotoFrame(),this.autoplay&&this.play()))},AnimationItem.prototype.prerenderFrames=function(t){t||(t=0),this.renderedFrameCount===this.totalFrames?(this.isLoaded=!0,this.gotoFrame(),this.autoplay&&this.play()):(dataManager.renderFrame(this.animationID,this.renderedFrameCount),this.renderedFrameCount+=1,t>5?setTimeout(this.prerenderFrames.bind(this),0):(t+=1,this.prerenderFrames(t)))},AnimationItem.prototype.resize=function(){this.renderer.updateContainerSize()},AnimationItem.prototype.gotoFrame=function(){this.currentFrame=subframeEnabled?this.math.round(100*this.currentRawFrame)/100:this.math.floor(this.currentRawFrame),this.renderFrame()},AnimationItem.prototype.renderFrame=function(){this.isLoaded!==!1&&(dataManager.renderFrame(this.animationID,this.currentFrame),this.renderer.renderFrame(this.currentFrame))},AnimationItem.prototype.play=function(t){t&&this.name!=t||this.isPaused===!0&&(this.isPaused=!1)},AnimationItem.prototype.pause=function(t){t&&this.name!=t||this.isPaused===!1&&(this.isPaused=!0)},AnimationItem.prototype.togglePause=function(t){t&&this.name!=t||(this.isPaused===!0?(this.isPaused=!1,this.play()):(this.isPaused=!0,this.pause()))},AnimationItem.prototype.stop=function(t){t&&this.name!=t||(this.isPaused=!0,this.currentFrame=this.currentRawFrame=0,this.playCount=0,this.gotoFrame())},AnimationItem.prototype.goToAndStop=function(t,e,a){a&&this.name!=a||(this.setCurrentRawFrameValue(e?t:t*this.frameModifier),this.isPaused=!0)},AnimationItem.prototype.advanceTime=function(t){this.isPaused!==!0&&this.isScrolling!==!0&&this.isLoaded!==!1&&this.setCurrentRawFrameValue(this.currentRawFrame+t*this.frameModifier)},AnimationItem.prototype.updateAnimation=function(t){this.setCurrentRawFrameValue(this.totalFrames*t)},AnimationItem.prototype.moveFrame=function(t,e){e&&this.name!=e||this.setCurrentRawFrameValue(this.currentRawFrame+t)},AnimationItem.prototype.setCurrentRawFrameValue=function(t){if(this.currentRawFrame=t,this.currentRawFrame>=this.totalFrames){if(this.loop===!1)return this.currentRawFrame=this.totalFrames-1,this.gotoFrame(),void this.pause();if(this.playCount+=1,this.loop!==!0&&this.playCount==this.loop)return this.currentRawFrame=this.totalFrames-1,this.gotoFrame(),void this.pause()}else if(this.currentRawFrame<0)return this.playCount-=1,this.playCount<0&&(this.playCount=0),this.loop===!1?(this.currentRawFrame=0,this.gotoFrame(),void this.pause()):(this.currentRawFrame=this.totalFrames+this.currentRawFrame,void this.gotoFrame());this.currentRawFrame=this.currentRawFrame%this.totalFrames,this.gotoFrame()},AnimationItem.prototype.setSpeed=function(t){this.playSpeed=t,this.updaFrameModifier()},AnimationItem.prototype.setDirection=function(t){this.playDirection=0>t?-1:1,this.updaFrameModifier()},AnimationItem.prototype.updaFrameModifier=function(){this.frameModifier=this.frameMult*this.playSpeed*this.playDirection},AnimationItem.prototype.getPath=function(){return this.path},AnimationItem.prototype.getAssets=function(){return this.assets},function(t){function e(t){animationManager.play(t)}function a(t){animationManager.pause(t)}function i(t){animationManager.togglePause(t)}function r(t,e){animationManager.setSpeed(t,e)}function n(t,e){animationManager.setDirection(t,e)}function s(t){animationManager.stop(t)}function o(t){animationManager.moveFrame(t)}function h(){animationManager.searchAnimations()}function m(t){return animationManager.registerAnimation(t)}function p(){animationManager.resize()}function l(){animationManager.start()}function d(t,e,a){animationManager.goToAndStop(t,e,a)}function c(t){subframeEnabled=t}function u(t){return animationManager.loadAnimation(t)}function f(){"complete"===document.readyState&&(clearInterval(g),h())}var y={};y.play=e,y.pause=a,y.togglePause=i,y.setSpeed=r,y.setDirection=n,y.stop=s,y.moveFrame=o,y.searchAnimations=h,y.registerAnimation=m,y.loadAnimation=u,y.setSubframeRendering=c,y.resize=p,y.start=l,y.goToAndStop=d,y.checkReady=f,t.bodymovin=y;var g=setInterval(f,100)}(window);}(window));