(function(window){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 BM_CanvasRenderingContext2D(t){this.renderer=t}function matrixManagerFunction(){var t=new Matrix,e=function(t,e,a,r,i,s,n,o,h){var l,m,p,d,c,f,u;return l=$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]]),m=$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]]),p=$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([[r,0,0,0],[0,i,0,0],[0,0,s,0],[0,0,0,1]]),f=l.x(m).x(p).x(c),f=f.transpose(),u=$M([[1,0,0,0],[0,1,0,0],[0,0,1,0],[n,o,h,1]]),f=f.x(u),d="matrix3d(",d+=f.e(1,1).toFixed(5)+","+f.e(1,2).toFixed(5)+","+f.e(1,3).toFixed(5)+","+f.e(1,4).toFixed(5)+",",d+=f.e(2,1).toFixed(5)+","+f.e(2,2).toFixed(5)+","+f.e(2,3).toFixed(5)+","+f.e(2,4).toFixed(5)+",",d+=f.e(3,1).toFixed(5)+","+f.e(3,2).toFixed(5)+","+f.e(3,3).toFixed(5)+","+f.e(3,4).toFixed(5)+",",d+=f.e(4,1).toFixed(5)+","+f.e(4,2).toFixed(5)+","+f.e(4,3).toFixed(5)+","+f.e(4,4).toFixed(5),d+=")"},a=function(e,a,r,i,s){return t.reset().translate(i,s).rotate(e).scale(a,r).toCSS()},r=function(e,a,r,i,s){return t.reset().translate(i,s).rotate(e).scale(a,r).toArray()},i=function(t){return a(t.r,t.s[0],t.s[1],t.p[0],t.p[1])},s=function(t,r){return r?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])},n=function(t,r){return r?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:r(t.r[2],t.s[0],t.s[1],t.p[0],t.p[1])};return{get2DMatrix:i,getMatrix:s,getMatrix2:n,getMatrixArray:o,getMatrixArrayFromParams:r,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,r="";for(a=t;a>0;--a)r+=e[Math.round(Math.random()*(e.length-1))];return r}function componentToHex(t){var e=t.toString(16);return 1==e.length?"0"+e:e}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 createElement(t,e,a){if(!e){var r=Object.create(t.prototype,a),i={};return r&&"[object Function]"===i.toString.call(r.init)&&r.init(),r}e.prototype=Object.create(t.prototype),e.prototype.constructor=e,e.prototype.parent=t.prototype}function defineDescriptor(t,e,a,r){var i={writable:!1,configurable:!1,enumerable:!1,value:a};if(r)for(var s in r)i[s]=r[s];var n={};t&&"[object Function]"===n.toString.call(t)&&(t=t.prototype),Object.defineProperty(t,e,i)}function defineAccessor(t,e,a){var r,i={enumerable:!1,configurable:!1,get:function(){return r},set:function(t){r=t}};if(a)for(var s in a)i[s]=a[s];var n={};t&&"[object Function]"===n.toString.call(t)&&(t=t.prototype),Object.defineProperty(t,e,i)}function bezFunction(){function t(t,e,a,r,i,s){return m.abs((a-t)*(s-e)-(i-t)*(r-e))<1e-5}function e(t){return l[t].fnc}function a(t,e,a,r,i){if(i||(i=("bez_"+t+"_"+e+"_"+a+"_"+r).replace(/\./g,"p")),l[i])return l[i];var s,n,o,h,p,d;return l[i]=function(i,l,c,f,u){var y=l/u;i=y;for(var g,v=0;++v<14&&(o=3*t,n=3*(a-t)-o,s=1-o-n,g=i*(o+i*(n+i*s))-y,!(m.abs(g)<.001));)i-=g/(o+i*(2*n+3*s*i));d=3*e,p=3*(r-e)-d,h=1-d-p;var b=i*(d+i*(p+i*h));return f*b+c},l[i]}function r(t){this.segmentLength=0,this.points=new Array(t)}function i(t,e){this.partialLength=t,this.point=e}function s(e){var a,s,n,o,h,l,p,d=e.s,c=e.e,f=e.to,u=e.ti,y=100,g=0,v=null;(d[0]!=c[0]||d[1]!=c[1])&&t(d[0],d[1],c[0],c[1],d[0]+f[0],d[1]+f[1])&&t(d[0],d[1],c[0],c[1],c[0]+u[0],c[1]+u[1])&&(y=2);var b=new r(y);for(n=f.length,a=0;y>a;a+=1){for(p=[],h=a/(y-1),l=0,s=0;n>s;s+=1)o=m.pow(1-h,3)*d[s]+3*m.pow(1-h,2)*h*(d[s]+f[s])+3*(1-h)*m.pow(h,2)*(c[s]+u[s])+m.pow(h,3)*c[s],p.push(o),null!==v&&(l+=m.pow(p[s]-v[s],2));l=m.sqrt(l),g+=l,b.points[a]=new i(l,p),v=p}b.segmentLength=g,e.bezierData=b}function n(t,e){var a=e.segments,r=a.length,i=m.floor((r-1)*t),s=t*e.addedLength,n=0;if(s==a[i].l)return a[i].p;for(var o=a[i].l>s?-1:1,h=!0;h;)a[i].l<=s&&a[i+1].l>s?(n=(s-a[i].l)/(a[i+1].l-a[i].l),h=!1):i+=o,(0>i||i>=r-1)&&(h=!1);return a[i].p+(a[i+1].p-a[i].p)*n}function o(){this.pt1=new Array(2),this.pt2=new Array(2),this.pt3=new Array(2),this.pt4=new Array(2)}function h(t,e,a,r,i,s,h){var l=new o;i=0>i?0:i;var m=n(i,h);s=s>1?1:s;var p,d=n(s,h),c=t.length,f=1-m,u=1-d;for(p=0;c>p;p+=1)l.pt1[p]=f*f*f*t[p]+(m*f*f+f*m*f+f*f*m)*a[p]+(m*m*f+f*m*m+m*f*m)*r[p]+m*m*m*e[p],l.pt3[p]=f*f*u*t[p]+(m*f*u+f*m*u+f*f*d)*a[p]+(m*m*u+f*m*d+m*f*d)*r[p]+m*m*d*e[p],l.pt4[p]=f*u*u*t[p]+(m*u*u+f*d*u+f*u*d)*a[p]+(m*d*u+f*d*d+m*u*d)*r[p]+m*d*d*e[p],l.pt2[p]=u*u*u*t[p]+(d*u*u+u*d*u+u*u*d)*a[p]+(d*d*u+u*d*d+d*u*d)*r[p]+d*d*d*e[p];return l}var l=[],m=Math,p=function(){var e={};return function(a,r,i,s){var n=(a.join("_")+"_"+r.join("_")+"_"+i.join("_")+"_"+s.join("_")).replace(/\./g,"p");if(e[n])return e[n];var o,h,l,p,d,c,f=100,u=0,y=[],g=[],v={addedLength:0,segments:[]};for((a[0]!=r[0]||a[1]!=r[1])&&t(a[0],a[1],r[0],r[1],i[0],i[1])&&t(a[0],a[1],r[0],r[1],s[0],s[1])&&(f=2),l=i.length,o=0;f>o;o+=1){for(d=o/(f-1),c=0,h=0;l>h;h+=1)p=m.pow(1-d,3)*a[h]+3*m.pow(1-d,2)*d*i[h]+3*(1-d)*m.pow(d,2)*s[h]+m.pow(d,3)*r[h],y[h]=p,null!==g[h]&&(c+=m.pow(y[h]-g[h],2)),g[h]=y[h];c&&(c=m.sqrt(c),u+=c),v.segments.push({l:u,p:d})}return v.addedLength=u,e[n]=v,v}}();return{getEasingCurve:a,getEasingCurveByIndex:e,getBezierLength:p,getNewSegment:h,buildBezierData:s}}function dataFunctionManager(){function t(t,e){var a,r,i,s=t.length;for(a=0;s>a;a+=1)if(void 0!==t[a].t)if(t[a].s instanceof Array)for(i=t[a].s.length,r=0;i>r;r+=1)t[a].s[r]*=e,void 0!==t[a].e&&(t[a].e[r]*=e);else t[a].s&&(t[a].s*=e,t[a].e&&(t[a].e*=e));else t[a]=t[a]*e}function e(s,o){o||(o=s);var h,l,m,p,d,c,f,y,v,b,C=s.length;for(c=0;C>c;c+=1){if(m=s[c],h=m.outPoint-m.startTime,l=m.startTime,m.tt&&(s[c-1].td=m.tt),m.renderedFrame={},m.renderedData={},p=[],d=-1,m.tm){m.trmp=m.tm;var E=new Array(h);for(f=0;h>f;f+=1)E.push(Math.floor(n(m.tm,f,l)*u));m.tm=E}if(m.ks.o instanceof Array?t(m.ks.o,.01):m.ks.o/=100,m.ks.s instanceof Array?t(m.ks.s,.01):m.ks.s/=100,m.ks.r instanceof Array?t(m.ks.r,g):m.ks.r*=g,m.hasMask){var D=m.masksProperties;for(y=D.length,f=0;y>f;f+=1)if(D[f].pt.i)i(D[f].pt);else for(b=D[f].pt.length,v=0;b>v;v+=1)D[f].pt[v].s&&i(D[f].pt[v].s[0]),D[f].pt[v].e&&i(D[f].pt[v].e[0])}"PreCompLayer"==m.ty?m.refId&&!m.layers?m.layers=a(m.refId,o):e(m.layers,o):"ShapeLayer"==m.ty&&r(m.shapes)}}function a(t,e,r){r||(r=e);var i,s=e.length;for(i=0;s>i;i+=1){if(e[i].compId==t)return e[i].layers||(e[i].layers=a(e[i].refId,r)),e[i].layers;if("PreCompLayer"==e[i].ty){var n=a(t,e[i].layers,r);if(n)return n}}return null}function r(e,a){var s,n,o,h,l=e.length,m=a?a:!1;for(s=l-1;s>=0;s-=1)if(e[s].renderedData=[],"tm"==e[s].ty&&(m=!0),"fl"==e[s].ty||"st"==e[s].ty)e[s].o instanceof Array?t(e[s].o,.01):e[s].o*=.01;else if("sh"==e[s].ty)if(e[s].trimmed=m,e[s].ks.i)i(e[s].ks);else for(o=e[s].ks.length,n=0;o>n;n+=1)e[s].ks[n].s&&(i(e[s].ks[n].s[0]),i(e[s].ks[n].e[0]));else"gr"==e[s].ty?r(e[s].it,m):"tr"==e[s].ty?(h=e[s],h.renderedData=[],h.o instanceof Array?t(h.o,.01):h.o/=100,h.s instanceof Array?t(h.s,.01):h.s/=100,h.r instanceof Array?t(h.r,g):h.r*=g):("rc"==e[s].ty||"el"==e[s].ty)&&(e[s].trimmed=m,e[s].trimmed=!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 s(t){t.__renderedFrames=new Array(Math.floor(t.animation.totalFrames)),t.__renderFinished=!1,u=t.animation.frameRate,e(t.animation.layers)}function n(t,e,a,r,i,s){var n,o,h,l,m,p,d=0;if(!t.length){if(r)for(;s>0;)r[i+d]=t,d+=1,s-=1;return t}if(void 0===t[0].t){if(r)for(;s>0;)r[i+d]=t[d],d+=1,s-=1;return t}m=0,p=t.length-1;for(var c=1,f=!0;!(!f||(n=t[m],o=t[m+1],m==p-1&&e>=o.t-a)||o.t-a>e&&1==c);){if(o.t-a<e&&-1==c){m+=1,n=t[m],o=t[m+1];break}p-1>m&&1==c||m>0&&-1==c?m+=c:f=!1}n.to&&!n.bezierData&&bez.buildBezierData(n);var u,y,g,v,b,C=0;if(r||(h=[]),n.to){if(l=n.bezierData,e>=o.t-a||e<n.t-a){var E=e>=o.t-a?l.points.length-1:0;if(r)for(;s>0;)r[i+d]=l.points[E].point[d],d+=1,s-=1;return l.points[E].point}n.__fnct?b=n.__fnct:(b=bez.getEasingCurve(n.o.x,n.o.y,n.i.x,n.i.y,n.n),n.__fnct=b),g=b("",e-(n.t-a),0,1,o.t-a-(n.t-a));var D,w=l.segmentLength*g,x=0;for(c=1,f=!0,v=l.points.length;f;){if(x+=l.points[C].partialLength*c,0===w||0===g||C==l.points.length-1){if(r)for(;s>0;)r[i+d]=l.points[C].point[d],d+=1,s-=1;else h=l.points[C].point;break}if(w>x&&w<x+l.points[C+1].partialLength){if(D=(w-x)/l.points[C+1].partialLength,r)for(;s>0;)r[i+d]=l.points[C].point[d]+(l.points[C+1].point[d]-l.points[C].point[d])*D,d+=1,s-=1;else for(y=l.points[C].point.length,u=0;y>u;u+=1)h.push(l.points[C].point[u]+(l.points[C+1].point[u]-l.points[C].point[u])*D);break}v-1>C&&1==c||C>0&&-1==c?C+=c:f=!1}}else{var S,A,I,M,F,P=!1;for(p=n.s.length,m=0;p>m;m+=1)1!==n.h&&(n.o.x instanceof Array?(P=!0,n.__fnct||(n.__fnct=[]),n.__fnct[m]||(S=n.o.x[m]?n.o.x[m]:n.o.x[0],A=n.o.y[m]?n.o.y[m]:n.o.y[0],I=n.i.x[m]?n.i.x[m]:n.i.x[0],M=n.i.y[m]?n.i.y[m]:n.i.y[0])):(P=!1,n.__fnct||(S=n.o.x,A=n.o.y,I=n.i.x,M=n.i.y)),P?n.__fnct[m]?b=n.__fnct[m]:(b=bez.getEasingCurve(S,A,I,M),n.__fnct[m]=b):n.__fnct?b=n.__fnct:(b=bez.getEasingCurve(S,A,I,M),n.__fnct=b),g=e>=o.t-a?1:e<n.t-a?0:b("",e-(n.t-a),0,1,o.t-a-(n.t-a))),F=1===n.h?n.s[m]:n.s[m]+(n.e[m]-n.s[m])*g,r?s>0&&(r[i+d]=F,d+=1,s-=1):h.push(F)}return h}function o(t,e){if(!t.__lengths){t.__lengths=[],t.__totalLength=0;var a,r=t.v,i=t.o,s=t.i,n=r.length;for(a=0;n-1>a;a+=1)t.__lengths.push(bez.getBezierLength(r[a],r[a+1],i[a],s[a+1])),t.__totalLength+=t.__lengths[a].addedLength;e&&(t.__lengths.push(bez.getBezierLength(r[a],r[0],i[a],s[0])),t.__totalLength+=t.__lengths[a].addedLength)}}function h(t,e,a,r,i,s){var n=s&&s.length>0,o={};o.closed=i?t.cl:t.closed;var h=i?t.pt:t.ks;if(h.v)return o.pathNodes=n?v(h,o.closed,s,!1):h,o;var l,m,p,d,c,f,u;if(e<h[0].t-a||e>h[h.length-1].t-a){var y,g,b,C;if(e<h[0].t-a?(C="__minValue",g=0,b=h.__minValue,y=h[g].s):(C="__maxValue",g=h.length-2,b=h.__maxValue,y=h[g].e),!b){for(m=h[g].s[0].i.length,t={i:new Array(m),o:new Array(m),v:new Array(m)},l=0;m>l;l+=1){for(d=h[g].s[0].i[l].length,c=new Array(d),f=new Array(d),u=new Array(d),p=0;d>p;p+=1)c[p]=y[0].i[l][p],f[p]=y[0].o[l][p],u[p]=y[0].v[l][p];t.i[l]=c,t.o[l]=f,t.v[l]=u}h[C]=t,b=t}return o.pathNodes=n?v(b,o.closed,s,!1):b,o}for(var E,D,w=0,x=h.length-1,S=1,A=!0;A&&(E=h[w],D=h[w+1],!(D.t-a>e&&1==S));)x-1>w&&1==S||w>0&&-1==S?w+=S:A=!1;var I;if(1!==E.h){var M;E.__fnct?M=E.__fnct:(M=bez.getEasingCurve(E.o.x,E.o.y,E.i.x,E.i.y),E.__fnct=M),I=e>=D.t-a?1:e<E.t-a?0:M("",e-(E.t-a),0,1,D.t-a-(E.t-a))}if(1===E.h&&E.__hValue)t=E.__hValue;else for(m=E.s[0].i.length,t={i:new Array(m),o:new Array(m),v:new Array(m)},l=0;m>l;l+=1){for(d=E.s[0].i[l].length,c=new Array(d),f=new Array(d),u=new Array(d),p=0;d>p;p+=1)1===E.h?(c[p]=E.s[0].i[l][p],f[p]=E.s[0].o[l][p],u[p]=E.s[0].v[l][p]):(c[p]=E.s[0].i[l][p]+(E.e[0].i[l][p]-E.s[0].i[l][p])*I,f[p]=E.s[0].o[l][p]+(E.e[0].o[l][p]-E.s[0].o[l][p])*I,u[p]=E.s[0].v[l][p]+(E.e[0].v[l][p]-E.s[0].v[l][p])*I);t.i[l]=c,t.o[l]=f,t.v[l]=u,1===E.h&&(E.__hValue=t)}return o.pathNodes=n?v(t,o.closed,s,!1):t,o}function l(t,e,a){var r,i,s,o,m,d,c,f,g,v=t.length;for(f=0;v>f;f+=1){if(g=t[f],o=e-g.startTime,r={},r.a=n(g.ks.a,o,g.startTime),r.o=n(g.ks.o,o,g.startTime),g.ks.p.s?(n(g.ks.p.x,o,g.startTime,b,3,1),n(g.ks.p.y,o,g.startTime,b,4,1)):n(g.ks.p,o,g.startTime,b,3,2),n(g.ks.r,o,g.startTime,b,0,1),n(g.ks.s,o,g.startTime,b,1,2),c={},c.an={tr:r},c.an.matrixArray=y.getMatrixArrayFromParams(b[0],b[1],b[2],b[3],b[4]),g.renderedData[o]=c,g.hasMask)for(i=g.masksProperties,d=i.length,m=0;d>m;m+=1)i[m].paths||(i[m].paths=[],i[m].opacity=[]),i[m].paths[o]=h(i[m],o,g.startTime,a,!0),i[m].opacity[o]=n(i[m].o,o,g.startTime),i[m].opacity[o]=i[m].opacity[o]instanceof Array?i[m].opacity[o][0]/100:i[m].opacity[o]/100;e<g.inPoint||e>g.outPoint||("PreCompLayer"==g.ty?(s=g.tm?g.tm[o]<0?0:o>=g.tm.length?g.tm[g.tm.length-1]:g.tm[o]:o,void 0===s&&(s=n(g.trmp,o,0)[0]*u,g.tm[o]=s),l(g.layers,s,a)):"ShapeLayer"==g.ty&&p(g.shapes,o,g.startTime,a))}}function m(t,e,a,r){a=Math.min(e[0],e[1],a/2);var i=new Array(8),s=new Array(8),n=new Array(8),o=a/2;return 2===r?(i[0]=[t[0]+e[0]/2,t[1]-e[1]/2+a],n[0]=i[0],s[0]=[t[0]+e[0]/2,t[1]-e[1]/2+o],i[1]=[t[0]+e[0]/2,t[1]+e[1]/2-a],n[1]=[t[0]+e[0]/2,t[1]+e[1]/2-o],s[1]=i[1],i[2]=[t[0]+e[0]/2-a,t[1]+e[1]/2],n[2]=i[2],s[2]=[t[0]+e[0]/2-o,t[1]+e[1]/2],i[3]=[t[0]-e[0]/2+a,t[1]+e[1]/2],n[3]=[t[0]-e[0]/2+o,t[1]+e[1]/2],s[3]=i[3],i[4]=[t[0]-e[0]/2,t[1]+e[1]/2-a],n[4]=i[4],s[4]=[t[0]-e[0]/2,t[1]+e[1]/2-o],i[5]=[t[0]-e[0]/2,t[1]-e[1]/2+a],n[5]=[t[0]-e[0]/2,t[1]-e[1]/2+o],s[5]=i[5],i[6]=[t[0]-e[0]/2+a,t[1]-e[1]/2],n[6]=i[6],s[6]=[t[0]-e[0]/2+o,t[1]-e[1]/2],i[7]=[t[0]+e[0]/2-a,t[1]-e[1]/2],n[7]=[t[0]+e[0]/2-o,t[1]-e[1]/2],s[7]=i[7]):(i[0]=[t[0]+e[0]/2,t[1]-e[1]/2+a],n[0]=[t[0]+e[0]/2,t[1]-e[1]/2+o],s[0]=i[0],i[1]=[t[0]+e[0]/2-a,t[1]-e[1]/2],n[1]=i[1],s[1]=[t[0]+e[0]/2-o,t[1]-e[1]/2],i[2]=[t[0]-e[0]/2+a,t[1]-e[1]/2],n[2]=[t[0]-e[0]/2+o,t[1]-e[1]/2],s[2]=i[2],i[3]=[t[0]-e[0]/2,t[1]-e[1]/2+a],n[3]=i[3],s[3]=[t[0]-e[0]/2,t[1]-e[1]/2+o],i[4]=[t[0]-e[0]/2,t[1]+e[1]/2-a],n[4]=[t[0]-e[0]/2,t[1]+e[1]/2-o],s[4]=i[4],i[5]=[t[0]-e[0]/2+a,t[1]+e[1]/2],n[5]=i[5],s[5]=[t[0]-e[0]/2+o,t[1]+e[1]/2],i[6]=[t[0]+e[0]/2-a,t[1]+e[1]/2],n[6]=[t[0]+e[0]/2-o,t[1]+e[1]/2],s[6]=i[6],i[7]=[t[0]+e[0]/2,t[1]+e[1]/2-a],n[7]=i[7],s[7]=[t[0]+e[0]/2,t[1]+e[1]/2-o]),{v:i,o:n,i:s,c:!0}}function p(t,e,a,r,i){var s,o,l,c,f,u,g,C,E,D,w=t.length;i||(i=[]);var x,S,A,I,M;for(s=w-1;s>=0;s-=1)if(o=t[s],"sh"==o.ty)o.renderedData[e]={path:h(o,e,a,r,!1,i)};else if("fl"==o.ty)l=n(o.c,e,a),c=n(o.o,e,a),o.renderedData[e]={opacity:c instanceof Array?c[0]:c},"canvas"==r?(d(l),o.renderedData[e].color=l):o.renderedData[e].color=rgbToHex(Math.round(l[0]),Math.round(l[1]),Math.round(l[2]));else if("rc"==o.ty)f=n(o.p,e,a),u=n(o.s,e,a),g=n(o.r,e,a),o.trimmed?(o.renderedData[e]={path:{closed:!0}},o.renderedData[e].path.pathNodes=v(m(f,u,g,o.d),!0,i,!1)):o.renderedData[e]={position:f,size:u,roundness:g};else if("el"==o.ty){if(f=n(o.p,e,a),u=n(o.s,e,a),o.renderedData[e]={p:f,size:u},"svg"==r){var F={v:new Array(4),i:new Array(4),o:new Array(4)};2!==o.d&&3!==o.d?(F.v[0]=[f[0],f[1]-u[1]/2],F.i[0]=[f[0]-u[0]/2*.55,f[1]-u[1]/2],F.o[0]=[f[0]+u[0]/2*.55,f[1]-u[1]/2],F.v[1]=[f[0]+u[0]/2,f[1]],F.i[1]=[f[0]+u[0]/2,f[1]-u[1]/2*.55],F.o[1]=[f[0]+u[0]/2,f[1]+u[1]/2*.55],F.v[2]=[f[0],f[1]+u[1]/2],F.i[2]=[f[0]+u[0]/2*.55,f[1]+u[1]/2],F.o[2]=[f[0]-u[0]/2*.55,f[1]+u[1]/2],F.v[3]=[f[0]-u[0]/2,f[1]],F.i[3]=[f[0]-u[0]/2,f[1]+u[1]/2*.55],F.o[3]=[f[0]-u[0]/2,f[1]-u[1]/2*.55]):(F.v[0]=[f[0],f[1]-u[1]/2],F.o[0]=[f[0]-u[0]/2*.55,f[1]-u[1]/2],F.i[0]=[f[0]+u[0]/2*.55,f[1]-u[1]/2],F.v[1]=[f[0]-u[0]/2,f[1]],F.o[1]=[f[0]-u[0]/2,f[1]+u[1]/2*.55],F.i[1]=[f[0]-u[0]/2,f[1]-u[1]/2*.55],F.v[2]=[f[0],f[1]+u[1]/2],F.o[2]=[f[0]+u[0]/2*.55,f[1]+u[1]/2],F.i[2]=[f[0]-u[0]/2*.55,f[1]+u[1]/2],F.v[3]=[f[0]+u[0]/2,f[1]],F.o[3]=[f[0]+u[0]/2,f[1]-u[1]/2*.55],F.i[3]=[f[0]+u[0]/2,f[1]+u[1]/2*.55]),o.trimmed?(o.renderedData[e]={path:{closed:!0}},o.renderedData[e].path.pathNodes=v(F,!0,i,!1),o.closed=!0):(o.renderedData[e].path={pathNodes:F},o.closed=!0)}}else if("st"==o.ty){if(C=n(o.c,e,a),E=n(o.o,e,a),D=n(o.w,e,a),o.renderedData[e]={opacity:E instanceof Array?E[0]:E,width:D instanceof Array?D[0]:D},o.d){var P=[];M=o.d.length;var T;for(I=0;M>I;I+=1)T=n(o.d[I].v,e,a),P.push({v:T instanceof Array?T[0]:T,n:o.d[I].n});o.renderedData[e].dashes=P}"canvas"==r?(d(C),o.renderedData[e].color=C):o.renderedData[e].color=rgbToHex(Math.round(C[0]),Math.round(C[1]),Math.round(C[2]))}else if("tr"==o.ty)o.renderedData[e]={a:n(o.a,e,a),o:n(o.o,e,a)},n(o.s,e,a,b,1,2),n(o.r,e,a,b,0,1),n(o.p,e,a,b,3,2),o.renderedData[e].mtArr=y.getMatrixArrayFromParams(b[0],b[1],b[2],b[3],b[4]);else if("tm"==o.ty){x=n(o.s,e,a),S=n(o.e,e,a),A=n(o.o,e,a);var _={s:x,e:S,o:A};i.push(_),o.renderedData[e]=_}else"gr"==o.ty&&p(o.it,e,a,r,i)}function d(t){var e,a=t.length;for(e=0;a>e;e+=1)t[e]=Math.round(t[e])}function c(t,e){for(var a=1;a>0;){if(e+=1,e>=Math.floor(t.animation.totalFrames)){t.__renderFinished=!0;break}t.__renderedFrames[e]||(f(t,e),a-=1)}}function f(t,e){return 2==t.__renderedFrames[e]?void(t.__renderFinished||c(t,e)):(u=t.animation.frameRate,t.__renderedFrames[e]=2,void l(t.animation.layers,e,t._animType))}var u=0,y=new MatrixManager,g=Math.PI/180,v=function(){function t(t,s,n,o,p){r[h]=s,e[h+1]=n,a[h+1]=o,l?a[h]=t:(m+=" M"+t.join(","),l=!0,i[h]=t),m+=" C"+s.join(",")+" "+n.join(",")+" "+o.join(","),h+=1}var e,a,r,i,s,n,h,l=!1,m="";return function(p,d,c,f){o(p,d);var u,y=c.length,g=p;a=e=r=i=null;var v,b,C,E,D;for(u=y-1;u>=0;u-=1){var w=[],x=c[u].o%360/360;if(0!==x||0!==c[u].s||100!=c[u].e){m="",l=!1,e=[],r=[],a=[],i=[],s=[],n=0,0>x&&(x+=1);var S=c[u].s/100+x,A=c[u].e/100+x;if(S==A)return f?"":{};if(S>A){var I=S;S=A,A=I}1>=A?w.push({s:g.__totalLength*S,e:g.__totalLength*A}):S>=1?w.push({s:g.__totalLength*(S-1),e:g.__totalLength*(A-1)}):(w.push({s:g.__totalLength*S,e:g.__totalLength}),w.push({s:0,e:g.__totalLength*(A-1)})),v=[],b=[],C=[];var M;v=g.v,b=g.o,C=g.i,M=g.__lengths,D=v.length;var F,P,T=0,_=0,k=w.length;for(h=0,F=0;k>F;F+=1){for(T=0,E=1;D>E;E++)if(_=M[E-1].addedLength,T+_<w[F].s)T+=_;else{if(T>w[F].e)break;w[F].s<=T&&w[F].e>=T+_?t(v[E-1],b[E-1],C[E],v[E],M[E-1]):(P=bez.getNewSegment(v[E-1],v[E],b[E-1],C[E],(w[F].s-T)/_,(w[F].e-T)/_,M[E-1]),t(P.pt1,P.pt3,P.pt4,P.pt2)),T+=_}d!==!1?T<=w[F].e&&(_=M[E-1].addedLength,w[F].s<=T&&w[F].e>=T+_?t(v[E-1],b[E-1],C[0],v[0],M[E-1]):(P=bez.getNewSegment(v[E-1],v[0],b[E-1],C[0],(w[F].s-T)/_,(w[F].e-T)/_,M[E-1]),t(P.pt1,P.pt3,P.pt4,P.pt2))):l=!1}d=!1}}if(a?(v=a,b=r,C=e):(v=g.v,b=g.o,C=g.i,i=[]),D=v.length,f){for(m="",E=1;D>E;E++)i[E-1]?m+="M"+i[E-1].join(","):1==E&&(m+="M"+v[0].join(",")),m+=" C"+b[E-1].join(",")+" "+C[E].join(",")+" "+v[E].join(",");return d!==!1&&(m+=" C"+b[E-1].join(",")+" "+C[0].join(",")+" "+v[0].join(",")),m}return{i:C,o:b,v:v,s:i,c:d}}}(),b=[0,1,1,0,0],C={};return C.completeData=s,C.renderFrame=f,C}function SVGRenderer(t){this.animationItem=t,this.layers=null,this.lastFrame=-1,this.globalData={frameNum:-1},this.elements=[],this.destroyed=!1}function CanvasRenderer(t,e){this.animationItem=t,this.renderConfig=e?e:{clearCanvas:!0,context:null,scaleMode:"fit"},this.lastFrame=-1,this.globalData={frameNum:-1},this.contextData={saved:new Array(15),savedOp:new Array(15),cArrPos:0,cTr:new Matrix,cO:1};var a,r=15;for(a=0;r>a;a+=1)this.contextData.saved[a]=new Array(6);this.elements=[]}function MaskElement(t,e,a){this.data=t,this.storedData=[],this.element=e,this.globalData=a,this.paths=[],this.registeredEffects=[],this.masksProperties=[],this.maskElement=null}function ICompElement(t,e,a){this.parent.constructor.call(this,t,e,a),this.layers=t.layers}function IImageElement(t,e,a){this.assetData=a.getAssetData(t.id),this.path=a.getPath(),this.parent.constructor.call(this,t,e,a)}function IShapeElement(t,e,a){this.shapes=[],this.parent.constructor.call(this,t,e,a)}function ShapeItemElement(t,e,a){this.lcEnum={1:"butt",2:"round",3:"butt"},this.ljEnum={1:"miter",2:"round",3:"bevel"},this.stylesList=[],this.viewData=[],this.shape=e,this.data=t,this.globalData=a,this.searchShapes(this.data,this.viewData),styleUnselectableDiv(this.shape)}function ISolidElement(t,e,a){this.parent.constructor.call(this,t,e,a)}function ITextElement(t,e,a,r){this.parent.constructor.call(this,t,e,a,r)}function CVBaseElement(t,e){this.data=t,this.globalData=e,this.canvasContext=e.canvasContext,this.currentAnimData=null,this.renderFrame=!1,this.ownMatrix=new Matrix,this.finalTransform={mat:new Matrix,opacity:1},this.init()}function CVCompElement(t,e){this.parent.constructor.call(this,t,e),this.layers=t.layers}function CVImageElement(t,e){this.animationItem=e.renderer.animationItem,this.assetData=this.animationItem.getAssetData(t.id),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,a){this.data=t,this.globalData=a,this.canvasContext=a.canvasContext,this.frameNum=-1,this.dataLength=this.data.length,this.mainFlag=e,this.stylesList=[],this.ownStylesList=[],this.stylesPool=[],this.currentStylePoolPos=0,this.transform={opacity:1,mat:new Matrix},this.mat=new Matrix;var r,i=this.dataLength-1;this.renderedPaths=new Array(this.globalData.totalFrames);var s;for(r=i;r>=0;r-=1)"gr"==this.data[r].ty?this.data[r].item=new CVShapeItemElement(this.data[r].it,!1,this.globalData):("st"==this.data[r].ty||"fl"==this.data[r].ty)&&(s={type:"fill",styleOpacity:0,opacity:0,value:"rgba(0,0,0,0)",closed:!1},"fl"==this.data[r].ty?s.type="fill":(s.type="stroke",s.width=0),this.stylesPool.push(s))}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),r=2*(a.x*t+a.y*e);return t-=r*a.x,e-=r*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,r,i,s){return this.props[0]=t,this.props[1]=e,this.props[2]=a,this.props[3]=r,this.props[4]=i,this.props[5]=s,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,r,i,s){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*r,this.props[3]=this.b1*a+this.d1*r,this.props[4]=this.a1*i+this.c1*s+this.e1,this.props[5]=this.b1*i+this.d1*s+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,r=t.c,i=t.d,s=t.e,n=t.f,o=new Matrix,h=e*i-a*r;return o.a=i/h,o.b=-a/h,o.c=-r/h,o.d=e/h,o.e=(r*n-i*s)/h,o.f=-(e*n-a*s)/h,o}throw"Matrix is not invertible."},interpolate:function(t,e,a){var r=this,i=a?new Matrix(a):new Matrix;return i.a=r.a+(t.a-r.a)*e,i.b=r.b+(t.b-r.b)*e,i.c=r.c+(t.c-r.c)*e,i.d=r.d+(t.d-r.d)*e,i.e=r.e+(t.e-r.e)*e,i.f=r.f+(t.f-r.f)*e,i._x()},interpolateAnim:function(t,e,a){var r=this,i=a?new Matrix(a):new Matrix,s=r.decompose(),n=t.decompose(),o=s.rotation+(n.rotation-s.rotation)*e,h=s.translate.x+(n.translate.x-s.translate.x)*e,l=s.translate.y+(n.translate.y-s.translate.y)*e,m=s.scale.x+(n.scale.x-s.scale.x)*e,p=s.scale.y+(n.scale.y-s.scale.y)*e;return i.translate(h,l),i.rotate(o),i.scale(m,p),i._x()},decompose:function(t){var e=this.props[0],a=this.props[1],r=this.props[2],i=this.props[3],s=Math.acos,n=Math.atan,o=Math.sqrt,h=Math.PI,l={x:this.props[4],y:this.props[5]},m=0,p={x:1,y:1},d={x:0,y:0},c=e*i-a*r;if(t)e?(d={x:n(r/e),y:n(a/e)},p={x:e,y:c/e}):a?(m=.5*h,p={x:a,y:c/a},d.x=n(i/a)):(p={x:r,y:i},d.x=.25*h);else if(e||a){var f=o(e*e+a*a);m=a>0?s(e/f):-s(e/f),p={x:f,y:c/f},d.x=n((e*r+a*i)/(f*f))}else if(r||i){var u=o(r*r+i*i);m=.5*h-(i>0?s(-r/u):-s(r/u)),p={x:c/u,y:u},d.y=n((e*r+a*i)/(u*u))}else p={x:0,y:0};return{scale:p,translate:l,rotation:m,skew:d}},determinant:function(){return this.a*this.d-this.b*this.c},applyToPoint:function(t,e){return{x:t*this.props[0]+e*this.props[2]+this.props[4],y:t*this.props[1]+e*this.props[3]+this.props[5]}},applyToPointStringified:function(t,e){return t*this.props[0]+e*this.props[2]+this.props[4]+","+(t*this.props[1]+e*this.props[3]+this.props[5])},applyToArray:function(t){var e,a,r=0,i=[];if("number"==typeof t[0])for(a=t.length;a>r;)e=this.applyToPoint(t[r++],t[r++]),i.push(e.x,e.y);else for(a=t.length,r=0;a>r;r++)i.push(this.applyToPoint(t[r].x,t[r].y));return i},applyToTypedArray:function(t,e){for(var a,r=0,i=t.length,s=e?new Float64Array(i):new Float32Array(i);i>r;)a=this.applyToPoint(t[r],t[r+1]),s[r++]=a.x,s[r++]=a.y;return s},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}},void 0===CanvasRenderingContext2D.prototype.ellipse&&(CanvasRenderingContext2D.prototype.ellipse=function(t,e,a,r,i,s,n,o){this.save(),this.translate(t,e),this.rotate(i),this.scale(a,r),this.arc(0,0,1,s,n,o),this.restore()});var BM_Path2D;!function(){function t(t){if(this.ops_=[],void 0!==t)if("string"==typeof t)try{this.ops_=parser.parse(t)}catch(e){}else{if(!t.hasOwnProperty("ops_"))throw"Error: "+typeof t+"is not a valid argument to Path";this.ops_=t.ops_.slice(0)}}function e(t){return function(){var e,a=arguments.length,r=[];for(e=0;a>e;e+=1)r.push(arguments[e]);this.ops_.push({type:t,args:r})}}for(var a=CanvasRenderingContext2D.prototype,r=BM_CanvasRenderingContext2D.prototype,i=["closePath","moveTo","lineTo","quadraticCurveTo","bezierCurveTo","rect","arc","arcTo","ellipse"],s=0;s<i.length;s++){var n=i[s];t.prototype[n]=e(n)}t.prototype.addPath=function(t,e){var a=!1;!e||1==e[0]&&0===e[1]&&0===e[2]&&1==e[3]&&0===e[4]&&0===e[5]||(a=!0,this.ops_.push({type:"save",args:[]}),this.ops_.push({type:"transform",args:[e[0],e[1],e[2],e[3],e[4],e[5]]})),this.ops_=this.ops_.concat(t.ops_),a&&this.ops_.push({type:"restore",args:[]})};var o=a.fill,h=a.stroke,l=a.clip;r.fill=function(e){if(e instanceof t){this.renderer.canvasContext.beginPath();for(var a=0,r=e.ops_.length;r>a;a++){var i=e.ops_[a];"transform"==i.type?this.renderer.ctxTransform(i.args):"save"==i.type?this.renderer.save():"restore"==i.type?this.renderer.restore():this.renderer.canvasContext[i.type].apply(this.renderer.canvasContext,i.args)}r=arguments.length;var s=[];for(a=1;r>a;a+=1)s.push(arguments[a]);o.apply(this.renderer.canvasContext,s)}else o.apply(this.renderer.canvasContext,arguments)},r.stroke=function(e){if(e instanceof t){this.renderer.canvasContext.beginPath();for(var a=0,r=e.ops_.length;r>a;a++){var i=e.ops_[a];this.renderer.canvasContext[i.type].apply(this.renderer.canvasContext,i.args)}h.call(this.renderer.canvasContext)}else h.call(this.renderer.canvasContext)},r.clip=function(e){if(e instanceof t){this.renderer.canvasContext.beginPath();for(var a=0,r=e.ops_.length;r>a;a++){var i=e.ops_[a];this.renderer.canvasContext[i.type].apply(this.renderer.canvasContext,i.args)}r=arguments.length;var s=[];for(a=1;r>a;a+=1)s.push(arguments[a]);l.apply(this.renderer.canvasContext,s)}else l.apply(this.renderer.canvasContext,arguments)},BM_Path2D=t}();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,a){var r=(new Date).getTime(),i=Math.max(0,16-(r-t)),s=window.setTimeout(function(){e(r+i)},i);return t=r+i,s}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)})}();var subframeEnabled=!1,cachedColors={},rgbToHex=function(){var t,e,a=[];for(t=0;256>t;t+=1)e=t.toString(16),a[t]=1==e.length?"0"+e:e;return function(t,e,r){return 0>t&&(t=0),0>e&&(e=0),0>r&&(r=0),"#"+a[t]+a[e]+a[r]}}(),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]]}}(),bez=bezFunction(),dataManager=dataFunctionManager();SVGRenderer.prototype.buildItems=function(t,e,a){var r,i=0,s=t.length;for(a||(a=this.elements),e||(e=this.animationItem.container),r=s-1;r>=0;r--){if("StillLayer"==t[r].ty)i++,a[r]=this.createImage(t[r],e);else if("PreCompLayer"==t[r].ty){a[r]=this.createComp(t[r],e);var n=[];this.buildItems(t[r].layers,a[r].getDomElement(),n),a[r].setElements(n)}else a[r]="SolidLayer"==t[r].ty?this.createSolid(t[r],e):"ShapeLayer"==t[r].ty?this.createShape(t[r],e):"TextLayer"==t[r].ty?this.createText(t[r],e):this.createBase(t[r],e);t[r].td&&a[r+1].setMatte(a[r].layerId)}},SVGRenderer.prototype.createBase=function(t,e){return new BaseElement(t,e,this.globalData)},SVGRenderer.prototype.createShape=function(t,e){return new IShapeElement(t,e,this.globalData)},SVGRenderer.prototype.createText=function(t,e){return new ITextElement(t,e,this.globalData)},SVGRenderer.prototype.createImage=function(t,e){return new IImageElement(t,e,this.globalData)},SVGRenderer.prototype.createComp=function(t,e){return new ICompElement(t,e,this.globalData)},SVGRenderer.prototype.createSolid=function(t,e){return new ISolidElement(t,e,this.globalData)},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.transform="translate3d(0,0,0)",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.globalData.defs=e,this.animationItem.container.appendChild(e),this.globalData.getAssetData=this.animationItem.getAssetData.bind(this.animationItem),this.globalData.getPath=this.animationItem.getPath.bind(this.animationItem),this.globalData.elementLoaded=this.animationItem.elementLoaded.bind(this.animationItem),this.globalData.compSize={w:t.animation.compWidth,h:t.animation.compHeight};var a=document.createElementNS(svgNS,"clipPath"),r=document.createElementNS(svgNS,"rect");r.setAttribute("width",t.animation.compWidth),r.setAttribute("height",t.animation.compHeight),r.setAttribute("x",0),r.setAttribute("y",0);var i="animationMask_"+randomString(10);a.setAttribute("id",i),a.appendChild(r);var s=document.createElementNS(svgNS,"g");s.setAttribute("clip-path","url(#"+i+")"),this.animationItem.container.appendChild(s),e.appendChild(a),this.animationItem.container=s,this.layers=t.animation.layers},SVGRenderer.prototype.buildStage=function(t,e,a){var r,i,s=e.length;for(a||(a=this.elements),r=s-1;r>=0;r--)i=e[r],void 0!==i.parent&&this.buildItemParenting(i,a[r],e,i.parent,a),"PreCompLayer"==i.ty&&this.buildStage(a[r].getComposingElement(),i.layers,a[r].getElements())},SVGRenderer.prototype.buildItemParenting=function(t,e,a,r,i){t.parents||(t.parents=[]);for(var s=0,n=a.length;n>s;)a[s].ind==r&&(e.getHierarchy().push(i[s]),void 0!==a[s].parent&&this.buildItemParenting(t,e,a,a[s].parent,i)),s+=1},SVGRenderer.prototype.destroy=function(){this.animationItem.wrapper.innerHTML="",this.animationItem.container=null,this.globalData.defs=null;var t,e=this.layers.length;for(t=0;e>t;t++)this.elements[t].destroy();this.elements.length=0,this.destroyed=!0},SVGRenderer.prototype.updateContainerSize=function(){},SVGRenderer.prototype.renderFrame=function(t){if(this.lastFrame!=t&&!this.destroyed){this.lastFrame=t,this.globalData.frameNum=t;var e,a=this.layers.length;for(e=0;a>e;e++)this.elements[e].prepareFrame(t-this.layers[e].startTime);for(e=0;a>e;e++)this.elements[e].renderFrame(t-this.layers[e].startTime)}},CanvasRenderer.prototype.buildItems=function(t,e){e||(e=this.elements);var a,r=0,i=t.length;for(a=0;i>a;a++)if("StillLayer"==t[a].ty)r++,e.push(this.createImage(t[a]));else if("PreCompLayer"==t[a].ty){e.push(this.createComp(t[a]));var s=[];this.buildItems(t[a].layers,s),e[e.length-1].setElements(s)}else e.push("SolidLayer"==t[a].ty?this.createSolid(t[a]):"ShapeLayer"==t[a].ty?this.createShape(t[a]):"TextLayer"==t[a].ty?this.createText(t[a]):this.createBase(t[a]))},CanvasRenderer.prototype.createBase=function(t){return new CVBaseElement(t,this.globalData)},CanvasRenderer.prototype.createShape=function(t){return new CVShapeElement(t,this.globalData)},CanvasRenderer.prototype.createText=function(t){return new CVTextElement(t,this.globalData)},CanvasRenderer.prototype.createImage=function(t){return new CVImageElement(t,this.globalData)},CanvasRenderer.prototype.createComp=function(t){return new CVCompElement(t,this.globalData)},CanvasRenderer.prototype.createSolid=function(t){return new CVSolidElement(t,this.globalData)},CanvasRenderer.prototype.ctxTransform=function(t){if(!this.renderConfig.clearCanvas)return void this.canvasContext.transform(t[0],t[1],t[2],t[3],t[4],t[5]);this.contextData.cTr.transform(t[0],t[1],t[2],t[3],t[4],t[5]);var e=this.contextData.cTr.props;this.canvasContext.setTransform(e[0],e[1],e[2],e[3],e[4],e[5])},CanvasRenderer.prototype.ctxOpacity=function(t){return this.renderConfig.clearCanvas?(this.contextData.cO*=0>t?0:t,void(this.canvasContext.globalAlpha=this.contextData.cO)):void(this.canvasContext.globalAlpha*=0>t?0:t)},CanvasRenderer.prototype.reset=function(){return this.renderConfig.clearCanvas?(this.contextData.cArrPos=0,this.contextData.cTr.reset(),void(this.contextData.cO=1)):void this.canvasContext.restore()},CanvasRenderer.prototype.save=function(t){if(!this.renderConfig.clearCanvas)return void this.canvasContext.save();t&&this.canvasContext.save();var e=this.contextData.cTr.props;(null===this.contextData.saved[this.contextData.cArrPos]||void 0===this.contextData.saved[this.contextData.cArrPos])&&(this.contextData.saved[this.contextData.cArrPos]=new Array(6));var a,r=6,i=this.contextData.saved[this.contextData.cArrPos];for(a=0;r>a;a+=1)i[a]=e[a];this.contextData.savedOp[this.contextData.cArrPos]=this.contextData.cO,this.contextData.cArrPos+=1},CanvasRenderer.prototype.restore=function(t){if(!this.renderConfig.clearCanvas)return void this.canvasContext.restore();t&&this.canvasContext.restore(),this.contextData.cArrPos-=1;var e,a=this.contextData.saved[this.contextData.cArrPos],r=6,i=this.contextData.cTr.props;for(e=0;r>e;e+=1)i[e]=a[e];this.canvasContext.setTransform(a[0],a[1],a[2],a[3],a[4],a[5]),a=this.contextData.savedOp[this.contextData.cArrPos],this.contextData.cO=a,this.canvasContext.globalAlpha=a},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.globalData.canvasContext=this.canvasContext,this.globalData.bmCtx=new BM_CanvasRenderingContext2D(this),this.globalData.renderer=this,this.globalData.totalFrames=Math.floor(t.animation.totalFrames),this.globalData.compWidth=t.animation.compWidth,this.globalData.compHeight=t.animation.compHeight,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(){var t,e;if(this.animationItem.wrapper&&this.animationItem.container?(t=this.animationItem.wrapper.offsetWidth,e=this.animationItem.wrapper.offsetHeight,this.animationItem.container.setAttribute("width",t),this.animationItem.container.setAttribute("height",e)):(t=this.canvasContext.canvas.width,e=this.canvasContext.canvas.height),"fit"==this.renderConfig.scaleMode){var a=t/e,r=this.transformCanvas.w/this.transformCanvas.h;r>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;this.transformCanvas.props=[this.transformCanvas.sx,0,0,this.transformCanvas.sy,this.transformCanvas.tx,this.transformCanvas.ty],this.clipper=new BM_Path2D,this.clipper.rect(0,0,this.transformCanvas.w,this.transformCanvas.h)},CanvasRenderer.prototype.buildStage=function(t,e,a){a||(a=this.elements);var r,i,s=e.length;for(r=s-1;r>=0;r--)i=e[r],void 0!==i.parent&&this.buildItemHierarchy(i,a[r],e,i.parent,a),"PreCompLayer"==i.ty&&this.buildStage(null,i.layers,a[r].getElements())},CanvasRenderer.prototype.buildItemHierarchy=function(t,e,a,r,i){for(var s=0,n=a.length;n>s;)a[s].ind===r&&(e.getHierarchy().push(i[s]),void 0!==a[s].parent&&this.buildItemHierarchy(t,e,a,a[s].parent,i)),s+=1},CanvasRenderer.prototype.prepareFrame=function(t){if(!this.destroyed){var e,a=this.elements.length;for(e=0;a>e;e++)this.elements[e].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.elements[t].draw()},CanvasRenderer.prototype.destroy=function(){this.renderConfig.clearCanvas&&(this.animationItem.wrapper.innerHTML="");var t,e=this.layers.length;for(t=e-1;t>=0;t-=1)this.elements[t].destroy();this.elements.length=0,this.globalData.bmCtx=null,this.globalData.canvasContext=null,this.animationItem.container=null,this.destroyed=!0},CanvasRenderer.prototype.renderFrame=function(t){this.lastFrame==t&&this.renderConfig.clearCanvas===!0||this.destroyed||(this.lastFrame=t,this.globalData.frameNum=t-this.animationItem.firstFrame,this.renderConfig.clearCanvas===!0?(this.reset(),this.canvasContext.canvas.width=this.canvasContext.canvas.width):this.save(),this.ctxTransform(this.transformCanvas.props),this.globalData.bmCtx.clip(this.clipper),this.prepareFrame(t),this.draw(),this.renderConfig.clearCanvas!==!0&&this.restore())},MaskElement.prototype.init=function(){this.masksProperties=this.data.masksProperties;var t,e,a,r,i,s=this.element.maskedElement,n=this.globalData.defs,o=this.masksProperties.length,h=this.data.masksProperties,l=0,m=[],p=randomString(10);for(this.maskElement=document.createElementNS(svgNS,"mask"),t=0;o>t;t++)if("s"!=h[t].mode&&"i"!=h[t].mode||0!=l||(i=document.createElementNS(svgNS,"rect"),i.setAttribute("fill","#ffffff"),i.setAttribute("x","0"),i.setAttribute("y","0"),i.setAttribute("width","100%"),i.setAttribute("height","100%"),m.push(i)),!("f"==h[t].mode&&l>0||"n"==h[t].mode)){if(l+=1,e=document.createElementNS(svgNS,"path"),h[t].cl?"s"==h[t].mode?e.setAttribute("fill","#000000"):e.setAttribute("fill","#ffffff"):(e.setAttribute("fill","none"),"s"==h[t].mode?e.setAttribute("fill","#000000"):e.setAttribute("fill","#ffffff"),e.setAttribute("stroke-width","1"),e.setAttribute("stroke-miterlimit","10")),e.setAttribute("clip-rule","nonzero"),this.storedData[t]={elem:e,lastPath:""},"i"==h[t].mode){r=m.length;var d=document.createElementNS(svgNS,"g");for(a=0;r>a;a+=1)d.appendChild(m[a]);var c=document.createElementNS(svgNS,"mask");c.setAttribute("mask-type","alpha"),c.setAttribute("id",p+"_"+l),c.appendChild(e),n.appendChild(c),d.setAttribute("mask","url(#"+p+"_"+l+")"),m.length=0,m.push(d)}else m.push(e);h[t].inv&&!this.solidPath&&(this.solidPath=this.createLayerSolidPath())}for(o=m.length,t=0;o>t;t+=1)this.maskElement.appendChild(m[t]);this.maskElement.setAttribute("id",p),l>0&&s.setAttribute("mask","url(#"+p+")"),n.appendChild(this.maskElement)},MaskElement.prototype.renderFrame=function(t){var e,a=this.data.masksProperties.length,r=0;for(e=0;a>e;e++)"f"==this.data.masksProperties[e].mode&&r>0||"n"==this.data.masksProperties[e].mode||(r+=1,this.drawPath(this.data.masksProperties[e],this.data.masksProperties[e].paths[t].pathNodes,this.storedData[e]))},MaskElement.prototype.processMaskFromEffects=function(t,e){var a,r=this.registeredEffects.length;for(a=0;r>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.globalData.compSize.w,t+=" v"+this.globalData.compSize.h,t+=" h-"+this.globalData.compSize.w,t+=" v-"+this.globalData.compSize.h+" "},MaskElement.prototype.drawPath=function(t,e,a){var r,i,s="";if(e.__renderedString)s=e.__renderedString;else{for(i=e.v.length,r=1;i>r;r+=1)1==r&&(s+=" M"+e.v[0][0]+","+e.v[0][1]),s+=" C"+e.o[r-1][0]+","+e.o[r-1][1]+" "+e.i[r][0]+","+e.i[r][1]+" "+e.v[r][0]+","+e.v[r][1];t.cl&&(s+=" C"+e.o[r-1][0]+","+e.o[r-1][1]+" "+e.i[0][0]+","+e.i[0][1]+" "+e.v[0][0]+","+e.v[0][1]),e.__renderedString=s}a.lastPath!==s&&(t.inv?a.elem.setAttribute("d",this.solidPath+s):a.elem.setAttribute("d",s),a.lastPath=s)},MaskElement.prototype.destroy=function(){this.element=null,this.globalData=null,this.maskElement=null,this.data=null,this.paths=null,this.registeredEffects=null,this.masksProperties=null};var BaseElement=function(t,e,a){this.globalData=a,this.data=t,this.ownMatrix=new Matrix,this.finalTransform={mat:new Matrix,op:1},this.matteElement=null,this.renderedFrames=[],this.lastData={},this.parentContainer=e,this.layerId=randomString(10),this.hidden=!1,this.init()};BaseElement.prototype.init=function(){this.createElements(),this.data.hasMask&&this.addMasks(this.data),this.data.eff},BaseElement.prototype.createElements=function(){if(this.data.td){if(3==this.data.td)this.layerElement=document.createElementNS(svgNS,"mask"),this.layerElement.setAttribute("id",this.layerId),this.layerElement.setAttribute("mask-type","luminance"),this.globalData.defs.appendChild(this.layerElement);else if(2==this.data.td){var t=document.createElementNS(svgNS,"mask");t.setAttribute("id",this.layerId),t.setAttribute("mask-type","alpha");var e=document.createElementNS(svgNS,"g");t.appendChild(e),this.layerElement=document.createElementNS(svgNS,"g");var a=document.createElementNS(svgNS,"filter"),r=randomString(10);a.setAttribute("id",r),a.setAttribute("filterUnits","objectBoundingBox"),a.setAttribute("x","0%"),a.setAttribute("y","0%"),a.setAttribute("width","100%"),a.setAttribute("height","100%");var i=document.createElementNS(svgNS,"feComponentTransfer");i.setAttribute("in","SourceGraphic"),a.appendChild(i);var s=document.createElementNS(svgNS,"feFuncA");s.setAttribute("type","table"),s.setAttribute("tableValues","1.0 0.0"),i.appendChild(s),this.globalData.defs.appendChild(a);var n=document.createElementNS(svgNS,"rect");n.setAttribute("width","100%"),n.setAttribute("height","100%"),n.setAttribute("x","0"),n.setAttribute("y","0"),n.setAttribute("fill","#ffffff"),n.setAttribute("opacity","0"),e.setAttribute("filter","url(#"+r+")"),e.appendChild(n),e.appendChild(this.layerElement),this.globalData.defs.appendChild(t)}else{this.layerElement=document.createElementNS(svgNS,"g");var o=document.createElementNS(svgNS,"mask");o.setAttribute("id",this.layerId),o.setAttribute("mask-type","alpha"),o.appendChild(this.layerElement),this.globalData.defs.appendChild(o)}this.data.hasMask&&(this.maskedElement=this.layerElement)}else this.data.hasMask?(this.layerElement=document.createElementNS(svgNS,"g"),this.data.tt?(this.matteElement=document.createElementNS(svgNS,"g"),this.matteElement.appendChild(this.layerElement),this.parentContainer.appendChild(this.matteElement)):this.parentContainer.appendChild(this.layerElement),this.maskedElement=this.layerElement):this.data.tt?(this.matteElement=document.createElementNS(svgNS,"g"),this.matteElement.setAttribute("id",this.layerId),this.parentContainer.appendChild(this.matteElement),this.layerElement=this.matteElement):this.layerElement=this.parentContainer},BaseElement.prototype.prepareFrame=function(t){this.currentAnimData=this.data.renderedData[t].an;var e=this.currentAnimData.matrixArray;this.ownMatrix.reset().transform(e[0],e[1],e[2],e[3],e[4],e[5]).translate(-this.currentAnimData.tr.a[0],-this.currentAnimData.tr.a[1])},BaseElement.prototype.renderFrame=function(t,e){if("NullLayer"!=this.data.ty){if(this.data.inPoint-this.data.startTime<=t&&this.data.outPoint-this.data.startTime>t?(this.isVisible!==!0&&(this.isVisible=!0),this.finalTransform.opacity=1):(this.isVisible!==!1&&(this.isVisible=!1),this.finalTransform.opacity=0),this.data.eff,t===this.data.renderedFrame.num)return this.isVisible;this.data.hasMask&&this.maskManager.renderFrame(t),this.finalTransform.opacity*=this.currentAnimData.tr.o;var a,r=this.finalTransform.mat;if(e&&(a=e.mat.props,r.reset().transform(a[0],a[1],a[2],a[3],a[4],a[5]),this.finalTransform.opacity*=e.opacity),this.hierarchy){var i,s=this.hierarchy.length;for(e||r.reset(),i=s-1;i>=0;i-=1)a=this.hierarchy[i].ownMatrix.props,r.transform(a[0],a[1],a[2],a[3],a[4],a[5]);a=this.ownMatrix.props,r.transform(a[0],a[1],a[2],a[3],a[4],a[5])}else this.isVisible&&(e?(a=this.ownMatrix.props,r.transform(a[0],a[1],a[2],a[3],a[4],a[5])):(this.finalTransform.mat.props[0]=this.ownMatrix.props[0],this.finalTransform.mat.props[1]=this.ownMatrix.props[1],this.finalTransform.mat.props[2]=this.ownMatrix.props[2],this.finalTransform.mat.props[3]=this.ownMatrix.props[3],this.finalTransform.mat.props[4]=this.ownMatrix.props[4],this.finalTransform.mat.props[5]=this.ownMatrix.props[5]));if(this.data.hasMask){this.renderedFrames[this.globalData.frameNum]||(this.renderedFrames[this.globalData.frameNum]={tr:"matrix("+r.props.join(",")+")",o:this.finalTransform.opacity});var n=this.renderedFrames[this.globalData.frameNum];this.lastData.tr!=n.tr&&(this.lastData.tr=n.tr,this.layerElement.setAttribute("transform",n.tr)),this.lastData.o!==n.o&&(this.lastData.o=n.o,this.layerElement.setAttribute("opacity",n.o))}return this.isVisible}},BaseElement.prototype.destroy=function(){this.layerElement=null,this.parentContainer=null,this.matteElement&&(this.matteElement=null),this.maskManager&&this.maskManager.destroy()},BaseElement.prototype.getDomElement=function(){return this.layerElement},BaseElement.prototype.getMaskManager=function(){return this.maskManager},BaseElement.prototype.addMasks=function(t){this.maskManager=new MaskElement(t,this,this.globalData),this.maskManager.init()},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.ty?{w:this.data.textData.width,h:this.data.textData.height}:{w:this.data.width,h:this.data.height}},BaseElement.prototype.getHierarchy=function(){return this.hierarchy||(this.hierarchy=[]),this.hierarchy},BaseElement.prototype.setMatte=function(t){this.matteElement&&this.matteElement.setAttribute("mask","url(#"+t+")")},BaseElement.prototype.hide=function(){},createElement(BaseElement,ICompElement),ICompElement.prototype.getComposingElement=function(){return this.layerElement},ICompElement.prototype.hide=function(){if(!this.hidden){var t,e=this.elements.length;for(t=0;e>t;t+=1)this.elements[t].hide();this.hidden=!0}},ICompElement.prototype.renderFrame=function(t,e){var a=this.parent.renderFrame.call(this,t,e);if(a===!1)return void this.hide();this.hidden=!1;var r,i=this.layers.length,s=this.data.tm?this.data.tm[t]<0?0:t>=this.data.tm.length?this.data.tm[this.data.tm.length-1]:this.data.tm[t]:t;for(r=0;i>r;r+=1)this.elements[r].prepareFrame(s-this.layers[r].startTime);for(r=0;i>r;r+=1)this.data.hasMask?this.elements[r].renderFrame(s-this.layers[r].startTime):this.elements[r].renderFrame(s-this.layers[r].startTime,this.finalTransform)},ICompElement.prototype.setElements=function(t){this.elements=t},ICompElement.prototype.getElements=function(){return this.elements},ICompElement.prototype.destroy=function(){this.parent.destroy.call();var t,e=this.layers.length;for(t=0;e>t;t+=1)this.elements[t].destroy()},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.assetData.p),t.maskedElement=t.image},a=new Image;a.addEventListener("load",e,!1),a.addEventListener("error",e,!1),a.src=this.path+this.assetData.p,this.parent.createElements.call(this),this.image=document.createElementNS(svgNS,"image"),this.image.setAttribute("width",this.assetData.w+"px"),this.image.setAttribute("height",this.assetData.h+"px"),this.layerElement.appendChild(this.image)},IImageElement.prototype.hide=function(){this.hidden||(this.image.setAttribute("opacity","0"),this.hidden=!0)},IImageElement.prototype.renderFrame=function(t,e){var a=this.parent.renderFrame.call(this,t,e);if(a===!1)return void this.hide();if(this.hidden&&(this.lastData.o=-1,this.hidden=!1,this.image.setAttribute("opacity","1")),!this.data.hasMask){this.renderedFrames[this.globalData.frameNum]||(this.renderedFrames[this.globalData.frameNum]={tr:"matrix("+this.finalTransform.mat.props.join(",")+")",o:this.finalTransform.opacity});var r=this.renderedFrames[this.globalData.frameNum];this.lastData.tr!=r.tr&&(this.lastData.tr=r.tr,this.image.setAttribute("transform",r.tr)),this.lastData.o!==r.o&&(this.lastData.o=r.o,this.image.setAttribute("opacity",r.o))}},IImageElement.prototype.destroy=function(){this.parent.destroy.call(),this.image=null},createElement(BaseElement,IShapeElement),IShapeElement.prototype.createElements=function(){this.parent.createElements.call(this),this.mainShape=new ShapeItemElement(this.data.shapes,this.layerElement,this.globalData)},IShapeElement.prototype.renderFrame=function(t,e){var a=this.parent.renderFrame.call(this,t,e);return a===!1?void this.hide():void this.renderShapes(t)},IShapeElement.prototype.hide=function(){this.hidden||(this.mainShape.hideShape(),this.hidden=!0)},IShapeElement.prototype.renderShapes=function(t){this.hidden=!1,this.data.hasMask?this.mainShape.renderShape(t,{opacity:1,mat:new Matrix}):this.mainShape.renderShape(t,this.finalTransform)},IShapeElement.prototype.destroy=function(){this.parent.destroy.call(),this.mainShape.destroy()},ShapeItemElement.prototype.searchShapes=function(t,e){var a,r,i,s=t.length-1,n=[];for(a=s;a>=0;a-=1)if("fl"==t[a].ty||"st"==t[a].ty){e[a]={renderedFrames:[],lastData:{c:"",o:-1,w:""}};var o=document.createElementNS(svgNS,"path");"st"==t[a].ty&&(o.setAttribute("stroke-linecap",this.lcEnum[t[a].lc]||"round"),o.setAttribute("stroke-linejoin",this.ljEnum[t[a].lj]||"round"),1==t[a].lj&&o.setAttribute("stroke-miterlimit",t[a].ml)),this.shape.appendChild(o),this.stylesList.push({pathElement:o,type:t[a].ty,d:"",ld:"a"}),e[a].style=this.stylesList[this.stylesList.length-1],n.push(e[a].style)}else if("gr"==t[a].ty)e[a]={it:[]},this.searchShapes(t[a].it,e[a].it);else if("tr"==t[a].ty)e[a]={transform:{mat:new Matrix,opacity:1}};else if("sh"==t[a].ty||"rc"==t[a].ty||"el"==t[a].ty)for(e[a]={elements:[],renderedFrames:[],styles:[],lastData:{d:"",o:"",tr:""}},i=this.stylesList.length,r=0;i>r;r+=1)this.stylesList[r].closed||(e[a].styles.push(this.stylesList[r]),"st"==this.stylesList[r].type&&this.stylesList[r].pathElement.setAttribute("fill-opacity",0));for(s=n.length,a=0;s>a;a+=1)n[a].closed=!0},ShapeItemElement.prototype.getElement=function(){return this.shape},ShapeItemElement.prototype.hideShape=function(){var t,e=this.stylesList.length;for(t=e-1;t>=0;t-=1)this.stylesList[t].pathElement.setAttribute("d","M 0,0"),this.stylesList[t].ld="M 0,0"},ShapeItemElement.prototype.renderShape=function(t,e,a,r){var i,s;if(!a)for(a=this.data,s=this.stylesList.length,i=0;s>i;i+=1)this.stylesList[i].d="";r||(r=this.viewData),this.frameNum=t,s=a.length-1;var n,o;for(n=e,i=s;i>=0;i-=1)if("tr"==a[i].ty){var h=a[i].renderedData[t].mtArr;if(n=r[i].transform,o=n.mat,o.reset(),e){var l=e.mat.props;n.opacity=e.opacity,n.opacity*=a[i].renderedData[t].o,o.transform(l[0],l[1],l[2],l[3],l[4],l[5])}else n.opacity=a[i].renderedData[t].o;o.transform(h[0],h[1],h[2],h[3],h[4],h[5]).translate(-a[i].renderedData[t].a[0],-a[i].renderedData[t].a[1])}else"sh"==a[i].ty?this.renderPath(a[i],r[i],t,n):"el"==a[i].ty?this.renderPath(a[i],r[i],t,n):"rc"==a[i].ty?a[i].trimmed?this.renderPath(a[i],r[i],t,n):this.renderRect(a[i],r[i],t,n):"fl"==a[i].ty?this.renderFill(a[i],r[i],t,n):"st"==a[i].ty?this.renderStroke(a[i],r[i],t,n):"gr"==a[i].ty?this.renderShape(t,n,a[i].it,r[i].it):"tm"==a[i].ty;for(s=this.stylesList.length,i=0;s>i;i+=1)""==this.stylesList[i].d&&""!==this.stylesList[i].ld?(this.stylesList[i].pathElement.setAttribute("d","M 0,0"),this.stylesList[i].ld=this.stylesList[i].d):this.stylesList[i].ld!==this.stylesList[i].d&&(this.stylesList[i].pathElement.setAttribute("d",this.stylesList[i].d),this.stylesList[i].ld=this.stylesList[i].d)},ShapeItemElement.prototype.renderPath=function(t,e,a,r){var i,s;if(!e.renderedFrames[this.globalData.frameNum]){var n=t.renderedData[a].path.pathNodes;if(!n.v)return;i=n.v.length;var o=n.s?n.s:[],h="";for(s=1;i>s;s+=1)o[s-1]?h+=" M"+o[s-1][0]+","+o[s-1][1]:1==s&&(h+=" M"+n.v[0][0]+","+n.v[0][1]),h+=" C"+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];1==i&&(h+=o[0]?" M"+o[0][0]+","+o[0][1]:" M"+n.v[0][0]+","+n.v[0][1]),!t.closed||t.trimmed&&!n.c||(h+=" C"+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]),e.renderedFrames[this.globalData.frameNum]={dTr:h}}var l=e.renderedFrames[this.globalData.frameNum];for(i=e.styles.length,s=0;i>s;s+=1)e.styles[s].d+=l.dTr},ShapeItemElement.prototype.renderFill=function(t,e,a,r){var i=t.renderedData[a],s=e.style;e.renderedFrames[this.globalData.frameNum]||(e.renderedFrames[this.globalData.frameNum]={c:i.color,o:i.opacity*r.opacity,t:"matrix("+r.mat.props.join(",")+")"});var n=e.renderedFrames[this.globalData.frameNum];e.lastData.c!=n.c&&(s.pathElement.setAttribute("fill",n.c),e.lastData.c=n.c),e.lastData.o!=n.o&&(s.pathElement.setAttribute("fill-opacity",n.o),e.lastData.o=n.o),e.lastData.t!=n.t&&(s.pathElement.setAttribute("transform",n.t),e.lastData.t=n.t)},ShapeItemElement.prototype.renderStroke=function(t,e,a,r){var i=t.renderedData[a],s=e.style;e.renderedFrames[this.globalData.frameNum]||(e.renderedFrames[this.globalData.frameNum]={c:i.color,o:i.opacity*r.opacity,w:i.width,t:"matrix("+r.mat.props.join(",")+")"},i.dashes&&(e.renderedFrames[this.globalData.frameNum].d=i.dashes));var n,o,h=e.renderedFrames[this.globalData.frameNum],l=h.c,m=h.o,p=h.w,d=h.d,c=h.t;if(d){var f,u=d.length;for(n="",o="",f=0;u>f;f+=1)"o"!=d[f].n?n+=" "+d[f].v:o+=d[f].v;e.lastData.da!=n&&(s.pathElement.setAttribute("stroke-dasharray",n),e.lastData.da=n),e.lastData["do"]!=o&&(s.pathElement.setAttribute("stroke-dashoffset",o),e.lastData["do"]=o)}e.lastData.c!=l&&(s.pathElement.setAttribute("stroke",l),e.lastData.c=l),e.lastData.o!=m&&(s.pathElement.setAttribute("stroke-opacity",m),e.lastData.o=m),e.lastData.w!==p&&(s.pathElement.setAttribute("stroke-width",p),e.lastData.w=p),e.lastData.t!==c&&(s.pathElement.setAttribute("transform",c),e.lastData.t=c)},ShapeItemElement.prototype.destroy=function(t,e){this.shape=null,this.data=null,this.viewData=null},createElement(BaseElement,ISolidElement),ISolidElement.prototype.createElements=function(){this.parent.createElements.call(this);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.layerElement.appendChild(t),this.rectElement=t},ISolidElement.prototype.hide=function(){this.hidden||(this.rectElement.setAttribute("opacity","0"),this.hidden=!0)},ISolidElement.prototype.renderFrame=function(t,e){var a=this.parent.renderFrame.call(this,t,e);if(a===!1)return void this.hide();if(this.hidden&&(this.lastData.o=-1,this.hidden=!1,this.data.hasMask&&this.rectElement.setAttribute("opacity","1")),!this.data.hasMask){this.renderedFrames[this.globalData.frameNum]||(this.renderedFrames[this.globalData.frameNum]={tr:"matrix("+this.finalTransform.mat.props.join(",")+")",o:this.finalTransform.opacity});var r=this.renderedFrames[this.globalData.frameNum];this.lastData.tr!=r.tr&&(this.lastData.tr=r.tr,this.rectElement.setAttribute("transform",r.tr)),this.lastData.o!==r.o&&(this.lastData.o=r.o,this.rectElement.setAttribute("opacity",r.o))}},ICompElement.prototype.destroy=function(){this.parent.destroy.call(),this.rectElement=null},createElement(BaseElement,ITextElement),ITextElement.prototype.createElements=function(){this.parent.createElements.call(this)},CVBaseElement.prototype.init=function(){this.createElements(),this.data.hasMask&&this.addMasks(this.data),this.data.eff},CVBaseElement.prototype.createElements=function(){},CVBaseElement.prototype.prepareFrame=function(t){this.currentAnimData=this.data.renderedData[t].an;var e=this.currentAnimData.matrixArray;return this.ownMatrix.reset().transform(e[0],e[1],e[2],e[3],e[4],e[5]).translate(-this.currentAnimData.tr.a[0],-this.currentAnimData.tr.a[1]),this.data.inPoint-this.data.startTime<=t&&this.data.outPoint-this.data.startTime>=t?(this.renderFrame=!0,this.finalTransform.opacity=1,void(this.data.hasMask&&this.maskManager.prepareFrame(t))):(this.renderFrame=!1,this.finalTransform.opacity=0,!1)},CVBaseElement.prototype.draw=function(t){if("NullLayer"!=this.data.ty){if(!this.renderFrame)return!1;var e,a=(this.canvasContext,this.finalTransform.mat);if(this.finalTransform.opacity*=this.currentAnimData.tr.o,t&&(e=t.mat.props,a.reset().transform(e[0],e[1],e[2],e[3],e[4],e[5]),this.finalTransform.opacity*=t.opacity),this.hierarchy){var r,i=this.hierarchy.length;for(t||a.reset(),r=i-1;r>=0;r-=1)e=this.hierarchy[r].ownMatrix.props,a.transform(e[0],e[1],e[2],e[3],e[4],e[5]);e=this.ownMatrix.props,a.transform(e[0],e[1],e[2],e[3],e[4],e[5])}else this.renderFrame&&(t?(e=this.ownMatrix.props,a.transform(e[0],e[1],e[2],e[3],e[4],e[5])):this.finalTransform.mat=this.ownMatrix);this.data.hasMask&&(this.globalData.renderer.save(!0),this.maskManager.draw(this.finalTransform))}},CVBaseElement.prototype.getCurrentAnimData=function(){return this.currentAnimData},CVBaseElement.prototype.addMasks=function(t){var e={data:{value:t},element:{value:this},globalData:{value:this.globalData}};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.getHierarchy=function(){return this.hierarchy||(this.hierarchy=[]),this.hierarchy},CVBaseElement.prototype.getLayerSize=function(){return"TextLayer"==this.data.ty?{w:this.data.textData.width,h:this.data.textData.height}:{w:this.data.width,h:this.data.height}},CVBaseElement.prototype.destroy=function(){this.canvasContext=null,this.data=null,this.globalData=null,this.maskManager&&this.maskManager.destroy()},createElement(CVBaseElement,CVCompElement),CVCompElement.prototype.prepareFrame=function(t){var e=this.parent.prepareFrame.call(this,t);if(e!==!1){var a,r=this.elements.length,i=this.data.tm?this.data.tm[t]<0?0:t>=this.data.tm.length?this.data.tm[this.data.tm.length-1]:this.data.tm[t]:t;for(a=0;r>a;a+=1)this.elements[a].prepareFrame(i-this.layers[a].startTime)}},CVCompElement.prototype.draw=function(t){if(this.parent.draw.call(this,t)!==!1){var e,a=this.layers.length;for(e=a-1;e>=0;e-=1)this.elements[e].draw(this.finalTransform);this.data.hasMask&&this.globalData.renderer.restore(!0)}},CVCompElement.prototype.setElements=function(t){this.elements=t},CVCompElement.prototype.getElements=function(){return this.elements},CVCompElement.prototype.destroy=function(){var t,e=this.layers.length;for(t=e-1;t>=0;t-=1)this.elements[t].destroy();this.layers=null,this.elements=null,this.parent.destroy.call()},createElement(CVBaseElement,CVImageElement),CVImageElement.prototype.createElements=function(){var t=this,e=function(){t.animationItem.elementLoaded()},a=function(){t.failed=!0,t.animationItem.elementLoaded()};this.img=new Image,this.img.addEventListener("load",e,!1),this.img.addEventListener("error",a,!1),this.img.src=this.path+this.assetData.p,this.parent.createElements.call(this)},CVImageElement.prototype.draw=function(t){if(!this.failed&&this.parent.draw.call(this,t)!==!1){var e=this.canvasContext;this.globalData.renderer.save();var a=this.finalTransform.mat.props;this.globalData.renderer.ctxTransform(a),this.globalData.renderer.ctxOpacity(this.finalTransform.opacity),e.drawImage(this.img,0,0),this.globalData.renderer.restore(this.data.hasMask)}},CVImageElement.prototype.destroy=function(){this.img=null,this.animationItem=null,this.parent.destroy.call()},createElement(CVBaseElement,CVShapeElement),CVShapeElement.prototype.createElements=function(){
this.parent.createElements.call(this),this.mainShape=new CVShapeItemElement(this.data.shapes,!0,this.globalData)},CVShapeElement.prototype.prepareFrame=function(t){var e=this.parent.prepareFrame.call(this,t);e!==!1&&this.mainShape.prepareFrame(t)},CVShapeElement.prototype.draw=function(t){this.parent.draw.call(this,t)!==!1&&(this.drawShapes(this.finalTransform),this.data.hasMask&&this.globalData.renderer.restore(!0))},CVShapeElement.prototype.drawShapes=function(t){this.mainShape.renderShape(t)},CVShapeElement.prototype.destroy=function(){this.mainShape.destroy(),this.parent.destroy.call()},CVShapeItemElement.prototype.drawPaths=function(t){var e,a;t?(a=[],e=this.stylesList):e=this.renderedPaths[this.globalData.frameNum];var r,i=e.length,s=this.canvasContext;for(this.globalData.renderer.save(),s.lineCap="round",s.lineJoin="round",r=0;i>r;r+=1)"stroke"==e[r].type?(1!=e[r].opacity&&(this.globalData.renderer.save(),this.globalData.renderer.ctxOpacity(e[r].opacity)),s.strokeStyle=e[r].value,s.lineWidth=e[r].width,e[r].dasharray?(s.setLineDash(e[r].dasharray),s.lineDashOffset=e[r].dashoffset):(s.setLineDash([]),s.lineDashOffset=0),this.globalData.bmCtx.stroke(e[r].path),1!=e[r].opacity&&this.globalData.renderer.restore(),t&&(a.push({type:e[r].type,opacity:e[r].opacity,value:e[r].value,width:e[r].width,path:e[r].path}),e[r].dasharray&&(a[a.length-1].dasharray=e[r].dasharray,a[a.length-1].dashoffset=e[r].dashoffset))):"fill"==e[r].type&&(1!=e[r].opacity&&(this.globalData.renderer.save(),this.globalData.renderer.ctxOpacity(e[r].opacity)),s.fillStyle=e[r].value,this.globalData.bmCtx.fill(e[r].path),1!=e[r].opacity&&this.globalData.renderer.restore(),t&&a.push({type:e[r].type,opacity:e[r].opacity,value:e[r].value,path:e[r].path}));this.globalData.renderer.restore(),t&&(this.renderedPaths[this.globalData.frameNum]=a)},CVShapeItemElement.prototype.prepareFrame=function(t){this.frameNum=t;var e,a=this.dataLength-1;for(e=a;e>=0;e-=1)"gr"==this.data[e].ty&&this.data[e].item.prepareFrame(t)},CVShapeItemElement.prototype.renderShape=function(t,e){if(this.renderedPaths[this.globalData.frameNum])return void this.drawPaths(!1);this.transform.opacity=1;var a,r;for(this.ownStylesList.length=0,this.currentStylePoolPos=0,e?this.stylesList=e:this.stylesList.length=0,t?(this.transform.mat.props[0]=t.mat.props[0],this.transform.mat.props[1]=t.mat.props[1],this.transform.mat.props[2]=t.mat.props[2],this.transform.mat.props[3]=t.mat.props[3],this.transform.mat.props[4]=t.mat.props[4],this.transform.mat.props[5]=t.mat.props[5],this.transform.opacity*=t.opacity):(this.transform.mat.props[0]=this.transform.mat.props[3]=1,this.transform.mat.props[1]=this.transform.mat.props[2]=this.transform.mat.props[4]=this.transform.mat.props[5]=0),r=this.dataLength-1,a=r;a>=0;a-=1)"gr"==this.data[a].ty?this.data[a].item.renderShape(this.transform,this.stylesList):"tr"==this.data[a].ty?this.renderTransform(this.data[a]):"sh"==this.data[a].ty?this.renderPath(this.data[a]):"el"==this.data[a].ty?this.renderEllipse(this.data[a]):"rc"==this.data[a].ty?this.data[a].trimmed?this.renderPath(this.data[a]):this.renderRect(this.data[a]):"fl"==this.data[a].ty?this.renderFill(this.data[a]):"st"==this.data[a].ty&&this.renderStroke(this.data[a]);if(this.mainFlag)this.drawPaths(!0);else for(r=this.ownStylesList.length,a=0;r>a;a+=1)this.ownStylesList[a].closed=!0},CVShapeItemElement.prototype.renderTransform=function(t){var e=t.renderedData[this.frameNum],a=e.mtArr;this.transform.mat.transform(a[0],a[1],a[2],a[3],a[4],a[5]).translate(-e.a[0],-e.a[1]),this.transform.opacity*=e.o},CVShapeItemElement.prototype.renderPath=function(t){if(t.trimmed){var e=this.canvasContext;e.lineCap="round",e.lineJoin="round"}var a=t.renderedData[this.frameNum].path,r=new BM_Path2D,i=a.pathNodes;if(i instanceof Array&&(i=i[0]),i.v){var s,n=i.v.length,o=i.s?i.s:[];for(s=1;n>s;s+=1)o[s-1]?r.moveTo(o[s-1][0],o[s-1][1]):1==s&&r.moveTo(i.v[0][0],i.v[0][1]),r.bezierCurveTo(i.o[s-1][0],i.o[s-1][1],i.i[s][0],i.i[s][1],i.v[s][0],i.v[s][1]);1==n&&(o[0]?r.moveTo(o[0][0],o[0][1]):r.moveTo(i.v[0][0],i.v[0][1])),!t.closed||t.trimmed&&!i.c||r.bezierCurveTo(i.o[s-1][0],i.o[s-1][1],i.i[0][0],i.i[0][1],i.v[0][0],i.v[0][1]),this.addPathToStyles(r)}},CVShapeItemElement.prototype.renderEllipse=function(t){var e=new BM_Path2D,a=t.renderedData[this.frameNum];e.moveTo(a.p[0]+a.size[0]/2,a.p[1]),e.ellipse(a.p[0],a.p[1],a.size[0]/2,a.size[1]/2,0,0,2*Math.PI,!1),this.addPathToStyles(e)},CVShapeItemElement.prototype.renderRect=function(t){var e=new BM_Path2D,a=t.renderedData[this.frameNum],r=a.roundness;if(0===r)e.rect(a.position[0]-a.size[0]/2,a.position[1]-a.size[1]/2,a.size[0],a.size[1]);else{var i=a.position[0]-a.size[0]/2,s=a.position[1]-a.size[1]/2,n=a.size[0],o=a.size[1];r instanceof Array&&(r=r[0]),r>n/2&&(r=n/2),r>o/2&&(r=o/2),e.moveTo(i+r,s),e.lineTo(i+n-r,s),e.quadraticCurveTo(i+n,s,i+n,s+r),e.lineTo(i+n,s+o-r),e.quadraticCurveTo(i+n,s+o,i+n-r,s+o),e.lineTo(i+r,s+o),e.quadraticCurveTo(i,s+o,i,s+o-r),e.lineTo(i,s+r),e.quadraticCurveTo(i,s,i+r,s)}this.addPathToStyles(e)},CVShapeItemElement.prototype.addPathToStyles=function(t){var e,a=this.stylesList.length,r=!0,i=0;for(e=a-1;e>=0;e-=1)this.stylesList[e].closed||("stroke"==this.stylesList[e].type?(this.stylesList[e].width>i&&this.stylesList[e].path.addPath(t,this.transform.mat.props),1==this.stylesList[e].styleOpacity&&1==this.stylesList[e].opacity&&(i=this.stylesList[e].width)):r&&"fill"==this.stylesList[e].type&&(this.stylesList[e].path.addPath(t,this.transform.mat.props),1==this.stylesList[e].styleOpacity&&1==this.stylesList[e].opacity&&(r=!1)))},CVShapeItemElement.prototype.renderFill=function(t){var e=t.renderedData[this.frameNum];return t.fillEnabled!==!1?(this.stylesPool[this.currentStylePoolPos].path=new BM_Path2D,this.stylesPool[this.currentStylePoolPos].closed=!1,this.stylesPool[this.currentStylePoolPos].styleOpacity=e.opacity<1?e.opacity:1,this.stylesPool[this.currentStylePoolPos].opacity=this.transform.opacity,this.stylesPool[this.currentStylePoolPos].value=e.opacity<1?fillColorToString(e.color,e.opacity):fillColorToString(e.color),this.stylesList.push(this.stylesPool[this.currentStylePoolPos]),this.ownStylesList.push(this.stylesList[this.stylesList.length-1]),void(this.currentStylePoolPos+=1)):(this.stylesList.push(this.stylesPool[this.currentStylePoolPos]),this.ownStylesList.push(this.stylesList[this.stylesList.length-1]),void(this.currentStylePoolPos+=1))},CVShapeItemElement.prototype.renderStroke=function(t){var e=t.renderedData[this.frameNum];if(this.data.strokeEnabled!==!1){if(this.stylesPool[this.currentStylePoolPos].path=new BM_Path2D,this.stylesPool[this.currentStylePoolPos].closed=!1,this.stylesPool[this.currentStylePoolPos].styleOpacity=e.opacity<1?e.opacity:1,this.stylesPool[this.currentStylePoolPos].width=e.width,this.stylesPool[this.currentStylePoolPos].opacity=this.transform.opacity,this.stylesPool[this.currentStylePoolPos].value=e.opacity<1?fillColorToString(e.color,e.opacity):fillColorToString(e.color),e.dashes){var a,r=e.dashes,i=r.length,s=[],n="";for(a=0;i>a;a+=1)"o"!=r[a].n?s.push(r[a].v):n=r[a].v;this.stylesPool[this.currentStylePoolPos].dasharray=s,this.stylesPool[this.currentStylePoolPos].dashoffset=n}return this.stylesList.push(this.stylesPool[this.currentStylePoolPos]),this.ownStylesList.push(this.stylesList[this.stylesList.length-1]),void(this.currentStylePoolPos+=1)}this.stylesList.push(this.stylesPool[this.currentStylePoolPos]),this.ownStylesList.push(this.stylesList[this.stylesList.length-1]),this.currentStylePoolPos+=1},CVShapeItemElement.prototype.destroy=function(){this.data=null,this.globalData=null,this.canvasContext=null},createElement(CVBaseElement,CVSolidElement),CVSolidElement.prototype.draw=function(t){if(this.parent.draw.call(this,t)!==!1){var e=this.canvasContext;this.globalData.renderer.save();var a=this.finalTransform.mat.props;this.globalData.renderer.ctxTransform(a),this.globalData.renderer.ctxOpacity(this.finalTransform.opacity),e.fillStyle=this.data.color,e.fillRect(0,0,this.data.width,this.data.height),this.globalData.renderer.restore(this.data.hasMask)}},createElement(CVBaseElement,CVTextElement),CVTextElement.prototype.createElements=function(){this.parent.createElements.call(this)},CVMaskElement.prototype.init=function(){this.registeredEffects=[],this.masksProperties=this.data.masksProperties,this.totalMasks=this.masksProperties.length,this.ctx=this.element.canvasContext,this.layerSize=this.element.getLayerSize(),this.renderedFrames=new Array(this.globalData.totalFrames+1)},CVMaskElement.prototype.prepareFrame=function(t){this.frameNum=t},CVMaskElement.prototype.draw=function(t){var e;if(this.renderedFrames[this.globalData.frameNum])e=this.renderedFrames[this.globalData.frameNum];else{var a,r=new BM_Path2D,i=this.data.masksProperties.length;for(e=new BM_Path2D,a=0;i>a;a++)this.masksProperties[a].inv&&this.createInvertedMask(r,this.data.masksProperties[a].paths[this.frameNum].pathNodes),this.drawShape(r,this.data.masksProperties[a].paths[this.frameNum].pathNodes);e.addPath(r,t.mat.props),this.renderedFrames[this.globalData.frameNum]=e}this.globalData.bmCtx.clip(e)},CVMaskElement.prototype.drawShape=function(t,e){var a,r=e.v.length;for(t.moveTo(e.v[0][0],e.v[0][1]),a=1;r>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])},CVMaskElement.prototype.createInvertedMask=function(t){t.moveTo(0,0),t.lineTo(this.globalData.compWidth,0),t.lineTo(this.globalData.compWidth,this.globalData.compHeight),t.lineTo(0,this.globalData.compHeight),t.lineTo(0,0)},CVMaskElement.prototype.destroy=function(){this.ctx=null};var animationManager=function(){function t(t){if(!t)return null;for(var e=0;b>e;){if(y[e].elem==t&&null!==y[e].elem)return y[e].animation;e+=1}var a=new AnimationItem;return a.setData(t),y.push({elem:t,animation:a}),b+=1,a}function e(t){var e=new AnimationItem;return e.setParams(t),y.push({elem:null,animation:e}),b+=1,e}function a(t,e){var a;for(a=0;b>a;a+=1)y[a].animation.setSpeed(t,e)}function r(t,e){var a;for(a=0;b>a;a+=1)y[a].animation.setDirection(t,e)}function i(t){var e;for(e=0;b>e;e+=1)y[e].animation.play(t)}function s(t,e){v=!1,g=Date.now();var a;for(a=0;b>a;a+=1)y[a].animation.moveFrame(t,e)}function n(){var t,e=Date.now(),a=e-g;for(t=0;b>t;t+=1)y[t].animation.renderer.destroyed?(y.splice(t,1),t-=1,b-=1):y[t].animation.advanceTime(a);g=e,requestAnimationFrame(n)}function o(t){var e;for(e=0;b>e;e+=1)y[e].animation.pause(t)}function h(t,e,a){var r;for(r=0;b>r;r+=1)y[r].animation.goToAndStop(t,e,a)}function l(t){var e;for(e=0;b>e;e+=1)y[e].animation.stop(t)}function m(t){var e;for(e=0;b>e;e+=1)y[e].animation.togglePause(t)}function p(t){var e;for(e=0;b>e;e+=1)y[e].animation.destroy(t)}function d(){var e=document.getElementsByClassName("bodymovin");Array.prototype.forEach.call(e,t)}function c(){var t;for(t=0;b>t;t+=1)y[t].animation.resize()}function f(){g=Date.now(),requestAnimationFrame(n)}var u={},y=[],g=0,v=!0,b=0;return setTimeout(f,0),u.registerAnimation=t,u.loadAnimation=e,u.setSpeed=a,u.setDirection=r,u.play=i,u.moveFrame=s,u.pause=o,u.stop=l,u.togglePause=m,u.searchAnimations=d,u.resize=c,u.start=f,u.goToAndStop=h,u.destroy=p,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,this.removed=!1};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 r=new XMLHttpRequest;this.path=t.path.substr(0,t.path.lastIndexOf("/")+1),r.open("GET",t.path,!0),r.send(),r.onreadystatechange=function(){if(4==r.readyState)if(200==r.status)e.configAnimation(JSON.parse(r.responseText));else try{var t=JSON.parse(r.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 r=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:"";""===r||(e.loop="false"===r?!1:"true"===r?!0:parseInt(r)),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 i=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"===i&&(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=Math.floor(this.animationData.animation.totalFrames),this.frameRate=this.animationData.animation.frameRate,this.firstFrame=Math.round(this.animationData.animation.ff*this.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(){0===this.pendingElements&&(this.renderer.buildStage(this.container,this.layers),this.prerenderFramesFlag?(this.prerenderFrames(0),dataManager.renderFrame(this.animationData,this.currentFrame+this.firstFrame),this.renderer.renderFrame(this.currentFrame+this.firstFrame)):(this.isLoaded=!0,this.gotoFrame(),this.autoplay&&this.play()))},AnimationItem.prototype.prerenderFrames=function(t){t||(t=0),this.renderedFrameCount===Math.floor(this.totalFrames)?(this.isLoaded=!0,this.gotoFrame(),this.autoplay&&this.play()):(dataManager.renderFrame(this.animationData,this.renderedFrameCount+this.firstFrame),this.renderedFrameCount+=1,t>10?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.animationData,this.currentFrame+this.firstFrame),this.renderer.renderFrame(this.currentFrame+this.firstFrame))},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.remove=function(t){t&&this.name!=t||this.renderer.destroy()},AnimationItem.prototype.destroy=function(t){t&&this.name!=t||this.renderer&&this.renderer.destroyed||this.renderer.destroy()},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.getAssetData=function(t){for(var e=0,a=this.assets.length;a>e;){if(t==this.assets[e].id)return this.assets[e];e+=1}return this.assets},AnimationItem.prototype.getAssets=function(){return this.assets},function(t){function e(t){animationManager.play(t)}function a(t){animationManager.pause(t)}function r(t){animationManager.togglePause(t)}function i(t,e){animationManager.setSpeed(t,e)}function s(t,e){animationManager.setDirection(t,e)}function n(t){animationManager.stop(t)}function o(t){animationManager.moveFrame(t)}function h(){animationManager.searchAnimations()}function l(t){return animationManager.registerAnimation(t)}function m(){animationManager.resize()}function p(){animationManager.start()}function d(t,e,a){animationManager.goToAndStop(t,e,a)}function c(t){subframeEnabled=t}function f(t){return animationManager.loadAnimation(t)}function u(t){return animationManager.destroy(t)}function y(){"complete"===document.readyState&&(clearInterval(v),h())}var g={};g.play=e,g.pause=a,g.togglePause=r,g.setSpeed=i,g.setDirection=s,g.stop=n,g.moveFrame=o,g.searchAnimations=h,g.registerAnimation=l,g.loadAnimation=f,g.setSubframeRendering=c,g.resize=m,g.start=p,g.goToAndStop=d,g.destroy=u,g.checkReady=y,t.bodymovin=g;var v=setInterval(y,100)}(window);}(window));