!function(t,e){"function"==typeof define&&define.amd?define(e):"object"==typeof module&&module.exports?module.exports=e():t.bodymovin=e()}(window,function(){function t(){return{}}function e(t){gt=t?Math.round:function(t){return t}}function s(t){return Math.round(1e4*t)/1e4}function i(t){t.style.userSelect="none",t.style.MozUserSelect="none",t.style.webkitUserSelect="none",t.style.oUserSelect="none"}function a(t,e,s,i){this.type=t,this.currentTime=e,this.totalTime=s,this.direction=0>i?-1:1}function r(t,e){this.type=t,this.direction=0>e?-1:1}function n(t,e,s,i){this.type=t,this.currentLoop=e,this.totalLoops=s,this.direction=0>i?-1:1}function h(t,e,s){this.type=t,this.firstFrame=e,this.totalFrames=s}function o(t,e){this.type=t,this.target=e}function p(t,e){return this._cbs[t]||(this._cbs[t]=[]),this._cbs[t].push(e),function(){this.removeEventListener(t,e)}.bind(this)}function l(t,e){if(e){if(this._cbs[t]){for(var s=0,i=this._cbs[t].length;i>s;)this._cbs[t][s]===e&&(this._cbs[t].splice(s,1),s-=1,i-=1),s+=1;this._cbs[t].length||(this._cbs[t]=null)}}else this._cbs[t]=null}function f(t,e){if(this._cbs[t])for(var s=this._cbs[t].length,i=0;s>i;i++)this._cbs[t][i](e)}function m(t,e){void 0===e&&(e="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890");var s,i="";for(s=t;s>0;--s)i+=e[Math.round(Math.random()*(e.length-1))];return i}function d(t,e,s){var i,a,r,n,h,o,p,l;switch(1===arguments.length&&(e=t.s,s=t.v,t=t.h),n=Math.floor(6*t),h=6*t-n,o=s*(1-e),p=s*(1-h*e),l=s*(1-(1-h)*e),n%6){case 0:i=s,a=l,r=o;break;case 1:i=p,a=s,r=o;break;case 2:i=o,a=s,r=l;break;case 3:i=o,a=p,r=s;break;case 4:i=l,a=o,r=s;break;case 5:i=s,a=o,r=p}return[i,a,r]}function c(t,e,s){1===arguments.length&&(e=t.g,s=t.b,t=t.r);var i,a=Math.max(t,e,s),r=Math.min(t,e,s),n=a-r,h=0===a?0:n/a,o=a/255;switch(a){case r:i=0;break;case t:i=e-s+n*(s>e?6:0),i/=6*n;break;case e:i=s-t+2*n,i/=6*n;break;case s:i=t-e+4*n,i/=6*n}return[i,h,o]}function u(t,e){var s=c(255*t[0],255*t[1],255*t[2]);return s[1]+=e,s[1]>1?s[1]=1:s[1]<=0&&(s[1]=0),d(s[0],s[1],s[2])}function g(t,e){var s=c(255*t[0],255*t[1],255*t[2]);return s[2]+=e,s[2]>1?s[2]=1:s[2]<0&&(s[2]=0),d(s[0],s[1],s[2])}function v(t,e){var s=c(255*t[0],255*t[1],255*t[2]);return s[0]+=e/360,s[0]>1?s[0]-=1:s[0]<0&&(s[0]+=1),d(s[0],s[1],s[2])}function y(t,e,s,i,a,r){this.o=t,this.sw=e,this.sc=s,this.fc=i,this.m=a,this.props=r}function b(t){var e,s,i=[],a=[],r=[],n={},h=0;t.c&&(i[0]=t.o[0],a[0]=t.i[0],r[0]=t.v[0],h=1),s=t.i.length;var o=s-1;for(e=h;s>e;e+=1)i.push(t.o[o]),a.push(t.i[o]),r.push(t.v[o]),o-=1;return n.i=i,n.o=a,n.v=r,n}function k(){}function P(t,e,s){if(!e){var i=Object.create(t.prototype,s),a={};return i&&"[object Function]"===a.toString.call(i.init)&&i.init(),i}e.prototype=Object.create(t.prototype),e.prototype.constructor=e,e.prototype._parent=t.prototype}function A(t,e){for(var s in t.prototype)t.prototype.hasOwnProperty(s)&&(e.prototype[s]=t.prototype[s])}function M(){function t(t,e,s,i,a,r){var n=t*i+e*a+s*r-a*i-r*t-s*e;return n>-1e-4&&1e-4>n}function e(t,e,s,i,a,r,n,h,o){var p,l=Math.sqrt(Math.pow(i-t,2)+Math.pow(a-e,2)+Math.pow(r-s,2)),f=Math.sqrt(Math.pow(n-t,2)+Math.pow(h-e,2)+Math.pow(o-s,2)),m=Math.sqrt(Math.pow(n-i,2)+Math.pow(h-a,2)+Math.pow(o-r,2));return p=l>f?l>m?l-f-m:m-f-l:m>f?m-f-l:f-l-m,p>-1e-4&&1e-4>p}function s(t){this.segmentLength=0,this.points=new Array(t)}function i(t,e){this.partialLength=t,this.point=e}function a(t,e){var s=e.segments,i=s.length,a=At((i-1)*t),r=t*e.addedLength,n=0;if(r==s[a].l)return s[a].p;for(var h=s[a].l>r?-1:1,o=!0;o;)s[a].l<=r&&s[a+1].l>r?(n=(r-s[a].l)/(s[a+1].l-s[a].l),o=!1):a+=h,(0>a||a>=i-1)&&(o=!1);return s[a].p+(s[a+1].p-s[a].p)*n}function r(){this.pt1=new Array(2),this.pt2=new Array(2),this.pt3=new Array(2),this.pt4=new Array(2)}function n(t,e,s,i,n,h,o){var p=new r;n=0>n?0:n>1?1:n;var l=a(n,o);h=h>1?1:h;var f,m=a(h,o),d=t.length,c=1-l,u=1-m;for(f=0;d>f;f+=1)p.pt1[f]=Math.round(1e3*(c*c*c*t[f]+(l*c*c+c*l*c+c*c*l)*s[f]+(l*l*c+c*l*l+l*c*l)*i[f]+l*l*l*e[f]))/1e3,p.pt3[f]=Math.round(1e3*(c*c*u*t[f]+(l*c*u+c*l*u+c*c*m)*s[f]+(l*l*u+c*l*m+l*c*m)*i[f]+l*l*m*e[f]))/1e3,p.pt4[f]=Math.round(1e3*(c*u*u*t[f]+(l*u*u+c*m*u+c*u*m)*s[f]+(l*m*u+c*m*m+l*u*m)*i[f]+l*m*m*e[f]))/1e3,p.pt2[f]=Math.round(1e3*(u*u*u*t[f]+(m*u*u+u*m*u+u*u*m)*s[f]+(m*m*u+u*m*m+m*u*m)*i[f]+m*m*m*e[f]))/1e3;return p}var h=(Math,function(){function t(t,e){this.l=t,this.p=e}return function(e,s,i,a){var r,n,h,o,p,l,f=wt,m=0,d=[],c=[],u={addedLength:0,segments:[]};for(h=i.length,r=0;f>r;r+=1){for(p=r/(f-1),l=0,n=0;h>n;n+=1)o=kt(1-p,3)*e[n]+3*kt(1-p,2)*p*i[n]+3*(1-p)*kt(p,2)*a[n]+kt(p,3)*s[n],d[n]=o,null!==c[n]&&(l+=kt(d[n]-c[n],2)),c[n]=d[n];l&&(l=Pt(l),m+=l),u.segments.push(new t(m,p))}return u.addedLength=m,u}}()),o=function(){var e={};return function(a){var r=a.s,n=a.e,h=a.to,o=a.ti,p=(r.join("_")+"_"+n.join("_")+"_"+h.join("_")+"_"+o.join("_")).replace(/\./g,"p");if(e[p])return void(a.bezierData=e[p]);var l,f,m,d,c,u,g,v=wt,y=0,b=null;2===r.length&&(r[0]!=n[0]||r[1]!=n[1])&&t(r[0],r[1],n[0],n[1],r[0]+h[0],r[1]+h[1])&&t(r[0],r[1],n[0],n[1],n[0]+o[0],n[1]+o[1])&&(v=2);var k=new s(v);for(m=h.length,l=0;v>l;l+=1){for(g=new Array(m),c=l/(v-1),u=0,f=0;m>f;f+=1)d=kt(1-c,3)*r[f]+3*kt(1-c,2)*c*(r[f]+h[f])+3*(1-c)*kt(c,2)*(n[f]+o[f])+kt(c,3)*n[f],g[f]=d,null!==b&&(u+=kt(g[f]-b[f],2));u=Pt(u),y+=u,k.points[l]=new i(u,g),b=g}k.segmentLength=y,a.bezierData=k,e[p]=k}}();return{getBezierLength:h,getNewSegment:n,buildBezierData:o,pointOnLine2D:t,pointOnLine3D:e}}function E(){function t(a,r,h){var o,p,l,f,m,d,c,u,g=a.length;for(f=0;g>f;f+=1)if(o=a[f],"ks"in o&&!o.completed){if(o.completed=!0,o.tt&&(a[f-1].td=o.tt),p=[],l=-1,o.hasMask){var v=o.masksProperties;for(d=v.length,m=0;d>m;m+=1)if(v[m].pt.k.i)i(v[m].pt.k);else for(u=v[m].pt.k.length,c=0;u>c;c+=1)v[m].pt.k[c].s&&i(v[m].pt.k[c].s[0]),v[m].pt.k[c].e&&i(v[m].pt.k[c].e[0])}0===o.ty?(o.layers=e(o.refId,r),t(o.layers,r,h)):4===o.ty?s(o.shapes):5==o.ty&&n(o,h)}}function e(t,e){for(var s=0,i=e.length;i>s;){if(e[s].id===t)return e[s].layers;s+=1}}function s(t){var e,a,r,n=t.length,h=!1;for(e=n-1;e>=0;e-=1)if("sh"==t[e].ty){if(t[e].ks.k.i)i(t[e].ks.k);else for(r=t[e].ks.k.length,a=0;r>a;a+=1)t[e].ks.k[a].s&&i(t[e].ks.k[a].s[0]),t[e].ks.k[a].e&&i(t[e].ks.k[a].e[0]);h=!0}else"gr"==t[e].ty&&s(t[e].it)}function i(t){var e,s=t.i.length;for(e=0;s>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 a(t,e){var s=e?e.split("."):[100,100,100];return t[0]>s[0]?!0:s[0]>t[0]?!1:t[1]>s[1]?!0:s[1]>t[1]?!1:t[2]>s[2]?!0:s[2]>t[2]?!1:void 0}function r(e,s){e.__complete||(o(e),h(e),p(e),t(e.layers,e.assets,s),e.__complete=!0)}function n(t,e){var s,i,a=t.t.d.k,r=a.length;for(i=0;r>i;i+=1){var n=t.t.d.k[i].s;s=[];var h,o,p,l,f,m,d,c=0,u=t.t.m.g,g=0,v=0,y=0,b=[],k=0,P=0,A=e.getFontByName(n.f),M=0,E=A.fStyle.split(" "),w="normal",S="normal";for(o=E.length,h=0;o>h;h+=1)"italic"===E[h].toLowerCase()?S="italic":"bold"===E[h].toLowerCase()?w="700":"black"===E[h].toLowerCase()?w="900":"medium"===E[h].toLowerCase()?w="500":"regular"===E[h].toLowerCase()||"normal"===E[h].toLowerCase()?w="400":("light"===E[h].toLowerCase()||"thin"===E[h].toLowerCase())&&(w="200");if(n.fWeight=w,n.fStyle=S,o=n.t.length,n.sz){var F=n.sz[0],x=-1;for(h=0;o>h;h+=1)p=!1," "===n.t.charAt(h)?x=h:13===n.t.charCodeAt(h)&&(k=0,p=!0),e.chars?(d=e.getCharData(n.t.charAt(h),A.fStyle,A.fFamily),M=p?0:d.w*n.s/100):M=e.measureText(n.t.charAt(h),n.f,n.s),k+M>F?(-1===x?(n.t=n.t.substr(0,h)+"\r"+n.t.substr(h),o+=1):(h=x,n.t=n.t.substr(0,h)+"\r"+n.t.substr(h+1)),x=-1,k=0):k+=M;o=n.t.length}for(k=0,M=0,h=0;o>h;h+=1)if(p=!1," "===n.t.charAt(h)?l="\xa0":13===n.t.charCodeAt(h)?(b.push(k),P=k>P?k:P,k=0,l="",p=!0,y+=1):l=n.t.charAt(h),e.chars?(d=e.getCharData(n.t.charAt(h),A.fStyle,e.getFontByName(n.f).fFamily),M=p?0:d.w*n.s/100):M=e.measureText(l,n.f,n.s),k+=M,s.push({l:M,an:M,add:g,n:p,anIndexes:[],val:l,line:y}),2==u){if(g+=M,""==l||"\xa0"==l||h==o-1){for((""==l||"\xa0"==l)&&(g-=M);h>=v;)s[v].an=g,s[v].ind=c,s[v].extra=M,v+=1;c+=1,g=0}}else if(3==u){if(g+=M,""==l||h==o-1){for(""==l&&(g-=M);h>=v;)s[v].an=g,s[v].ind=c,s[v].extra=M,v+=1;g=0,c+=1}}else s[c].ind=c,s[c].extra=0,c+=1;if(n.l=s,P=k>P?k:P,b.push(k),n.sz)n.boxWidth=n.sz[0],n.justifyOffset=0;else switch(n.boxWidth=P,n.j){case 1:n.justifyOffset=-n.boxWidth;break;case 2:n.justifyOffset=-n.boxWidth/2;break;default:n.justifyOffset=0}n.lineWidths=b;var D=t.t.a;m=D.length;var C,_,T=[];for(f=0;m>f;f+=1){for(D[f].a.sc&&(n.strokeColorAnim=!0),D[f].a.sw&&(n.strokeWidthAnim=!0),(D[f].a.fc||D[f].a.fh||D[f].a.fs||D[f].a.fb)&&(n.fillColorAnim=!0),_=0,C=D[f].s.b,h=0;o>h;h+=1)s[h].anIndexes[f]=_,(1==C&&""!=s[h].val||2==C&&""!=s[h].val&&"\xa0"!=s[h].val||3==C&&(s[h].n||"\xa0"==s[h].val||h==o-1)||4==C&&(s[h].n||h==o-1))&&(1===D[f].s.rn&&T.push(_),_+=1);t.t.a[f].s.totalChars=_;var I,L=-1;if(1===D[f].s.rn)for(h=0;o>h;h+=1)L!=s[h].anIndexes[f]&&(L=s[h].anIndexes[f],I=T.splice(Math.floor(Math.random()*T.length),1)[0]),s[h].anIndexes[f]=I}0!==m||"m"in t.t.p||(t.singleShape=!0),n.yOffset=n.lh||1.2*n.s,n.ls=n.ls||0,n.ascent=A.ascent*n.s/100}}var h=function(){function t(t){var e=t.t.d;t.t.d={k:[{s:e,t:0}]}}function e(e){var s,i=e.length;for(s=0;i>s;s+=1)5===e[s].ty&&t(e[s])}var s=[4,4,14];return function(t){if(a(s,t.v)&&(e(t.layers),t.assets)){var i,r=t.assets.length;for(i=0;r>i;i+=1)t.assets[i].layers&&e(t.assets[i].layers)}}}(),o=function(){function t(e){var s,i,a,r=e.length;for(s=0;r>s;s+=1)if("gr"===e[s].ty)t(e[s].it);else if("fl"===e[s].ty||"st"===e[s].ty)if(e[s].c.k&&e[s].c.k[0].i)for(a=e[s].c.k.length,i=0;a>i;i+=1)e[s].c.k[i].s&&(e[s].c.k[i].s[0]/=255,e[s].c.k[i].s[1]/=255,e[s].c.k[i].s[2]/=255,e[s].c.k[i].s[3]/=255),e[s].c.k[i].e&&(e[s].c.k[i].e[0]/=255,e[s].c.k[i].e[1]/=255,e[s].c.k[i].e[2]/=255,e[s].c.k[i].e[3]/=255);else e[s].c.k[0]/=255,e[s].c.k[1]/=255,e[s].c.k[2]/=255,e[s].c.k[3]/=255}function e(e){var s,i=e.length;for(s=0;i>s;s+=1)4===e[s].ty&&t(e[s].shapes)}var s=[4,1,9];return function(t){if(a(s,t.v)&&(e(t.layers),t.assets)){var i,r=t.assets.length;for(i=0;r>i;i+=1)t.assets[i].layers&&e(t.assets[i].layers)}}}(),p=function(){function t(e){var s,i,a,r=e.length,n=!1;for(s=r-1;s>=0;s-=1)if("sh"==e[s].ty){if(e[s].ks.k.i)e[s].ks.k.c=e[s].closed;else for(a=e[s].ks.k.length,i=0;a>i;i+=1)e[s].ks.k[i].s&&(e[s].ks.k[i].s[0].c=e[s].closed),e[s].ks.k[i].e&&(e[s].ks.k[i].e[0].c=e[s].closed);n=!0}else"gr"==e[s].ty&&t(e[s].it)}function e(e){var s,i,a,r,n,h,o=e.length;for(i=0;o>i;i+=1){if(s=e[i],s.hasMask){var p=s.masksProperties;for(r=p.length,a=0;r>a;a+=1)if(p[a].pt.k.i)p[a].pt.k.c=p[a].cl;else for(h=p[a].pt.k.length,n=0;h>n;n+=1)p[a].pt.k[n].s&&(p[a].pt.k[n].s[0].c=p[a].cl),p[a].pt.k[n].e&&(p[a].pt.k[n].e[0].c=p[a].cl)}4===s.ty&&t(s.shapes)}}var s=[4,4,18];return function(t){if(a(s,t.v)&&(e(t.layers),t.assets)){var i,r=t.assets.length;for(i=0;r>i;i+=1)t.assets[i].layers&&e(t.assets[i].layers)}}}(),l={};return l.completeData=r,l}function w(){this.c=!1,this._length=0,this._maxLength=8,this.v=Array.apply(null,{length:this._maxLength}),this.o=Array.apply(null,{length:this._maxLength}),this.i=Array.apply(null,{length:this._maxLength})}function S(){}function F(){}function x(){}function D(){}function C(){this._length=0,this._maxLength=4,this.shapes=Array.apply(null,{length:this._maxLength})}function _(){}function T(t,e){this.animationItem=t,this.layers=null,this.renderedFrame=-1,this.globalData={frameNum:-1},this.renderConfig={preserveAspectRatio:e&&e.preserveAspectRatio||"xMidYMid meet",progressiveLoad:e&&e.progressiveLoad||!1},this.elements=[],this.pendingElements=[],this.destroyed=!1}function I(t,e,s){this.dynamicProperties=[],this.data=t,this.element=e,this.globalData=s,this.paths=[],this.storedData=[],this.masksProperties=this.data.masksProperties,this.viewData=new Array(this.masksProperties.length),this.maskElement=null,this.firstFrame=!0;var i,a,r,n,h,o,p,l,f=this.globalData.defs,d=this.masksProperties.length,c=this.masksProperties,u=0,g=[],v=m(10),y="clipPath",b="clip-path";for(i=0;d>i;i++)if(("a"!==c[i].mode&&"n"!==c[i].mode||c[i].inv||100!==c[i].o.k)&&(y="mask",b="mask"),"s"!=c[i].mode&&"i"!=c[i].mode||0!=u?h=null:(h=document.createElementNS(vt,"rect"),h.setAttribute("fill","#ffffff"),h.setAttribute("width",this.element.comp.data.w),h.setAttribute("height",this.element.comp.data.h),g.push(h)),a=document.createElementNS(vt,"path"),"n"!=c[i].mode){if(u+=1,"s"==c[i].mode?a.setAttribute("fill","#000000"):a.setAttribute("fill","#ffffff"),a.setAttribute("clip-rule","nonzero"),0!==c[i].x.k){y="mask",b="mask",l=It.getProp(this.element,c[i].x,0,null,this.dynamicProperties);var k="fi_"+m(10);o=document.createElementNS(vt,"filter"),o.setAttribute("id",k),p=document.createElementNS(vt,"feMorphology"),p.setAttribute("operator","dilate"),p.setAttribute("in","SourceGraphic"),p.setAttribute("radius","0"),o.appendChild(p),f.appendChild(o),"s"==c[i].mode?a.setAttribute("stroke","#000000"):a.setAttribute("stroke","#ffffff")}else p=null,l=null;if(this.storedData[i]={elem:a,x:l,expan:p,lastPath:"",lastOperator:"",filterId:k,lastRadius:0},"i"==c[i].mode){n=g.length;var P=document.createElementNS(vt,"g");for(r=0;n>r;r+=1)P.appendChild(g[r]);var A=document.createElementNS(vt,"mask");A.setAttribute("mask-type","alpha"),A.setAttribute("id",v+"_"+u),A.appendChild(a),f.appendChild(A),P.setAttribute("mask","url(#"+v+"_"+u+")"),g.length=0,g.push(P)}else g.push(a);c[i].inv&&!this.solidPath&&(this.solidPath=this.createLayerSolidPath()),this.viewData[i]={elem:a,lastPath:"",op:It.getProp(this.element,c[i].o,0,.01,this.dynamicProperties),prop:Lt.getShapeProp(this.element,c[i],3,this.dynamicProperties,null)},h&&(this.viewData[i].invRect=h),this.viewData[i].prop.k||this.drawPath(c[i],this.viewData[i].prop.v,this.viewData[i])}else this.viewData[i]={op:It.getProp(this.element,c[i].o,0,.01,this.dynamicProperties),prop:Lt.getShapeProp(this.element,c[i],3,this.dynamicProperties,null),elem:a},f.appendChild(a);for(this.maskElement=document.createElementNS(vt,y),d=g.length,i=0;d>i;i+=1)this.maskElement.appendChild(g[i]);this.maskElement.setAttribute("id",v),u>0&&this.element.maskedElement.setAttribute(b,"url(#"+v+")"),f.appendChild(this.maskElement)}function L(){}function N(t,e,s,i,a){this.globalData=s,this.comp=i,this.data=t,this.matteElement=null,this.transformedElement=null,this.parentContainer=e,this.layerId=a?a.layerId:"ly_"+m(10),this.placeholder=a,this.init()}function V(t,e,s,i){}function z(t,e,s,i,a){this.textSpans=[],this.renderType="svg",this._parent.constructor.call(this,t,e,s,i,a)}function R(t,e){this.filterManager=e;var s=document.createElementNS(vt,"feColorMatrix");if(s.setAttribute("type","matrix"),s.setAttribute("color-interpolation-filters","linearRGB"),s.setAttribute("values","0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0 0 0 1 0"),s.setAttribute("result","f1"),t.appendChild(s),s=document.createElementNS(vt,"feColorMatrix"),s.setAttribute("type","matrix"),s.setAttribute("color-interpolation-filters","sRGB"),s.setAttribute("values","1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0"),s.setAttribute("result","f2"),t.appendChild(s),this.matrixFilter=s,100!==e.effectElements[2].p.v||e.effectElements[2].p.k){var i=document.createElementNS(vt,"feMerge");t.appendChild(i);var a;a=document.createElementNS(vt,"feMergeNode"),a.setAttribute("in","SourceGraphic"),i.appendChild(a),a=document.createElementNS(vt,"feMergeNode"),a.setAttribute("in","f2"),i.appendChild(a)}}function j(t,e){this.filterManager=e;var s=document.createElementNS(vt,"feColorMatrix");s.setAttribute("type","matrix"),s.setAttribute("color-interpolation-filters","sRGB"),s.setAttribute("values","1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0"),t.appendChild(s),this.matrixFilter=s}function O(t,e){this.initialized=!1,this.filterManager=e,this.elem=t,this.paths=[]}function B(t,e){this.filterManager=e;var s=document.createElementNS(vt,"feColorMatrix");s.setAttribute("type","matrix"),s.setAttribute("color-interpolation-filters","linearRGB"),s.setAttribute("values","0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0 0 0 1 0"),s.setAttribute("result","f1"),t.appendChild(s);var i=document.createElementNS(vt,"feComponentTransfer");i.setAttribute("color-interpolation-filters","sRGB"),t.appendChild(i),this.matrixFilter=i;var a=document.createElementNS(vt,"feFuncR");a.setAttribute("type","table"),i.appendChild(a),this.feFuncR=a;var r=document.createElementNS(vt,"feFuncG");r.setAttribute("type","table"),i.appendChild(r),this.feFuncG=r;var n=document.createElementNS(vt,"feFuncB");n.setAttribute("type","table"),i.appendChild(n),this.feFuncB=n}function G(t,e){this.filterManager=e;var s=this.filterManager.effectElements,i=document.createElementNS(vt,"feComponentTransfer");(s[9].p.k||0!==s[9].p.v||s[10].p.k||1!==s[10].p.v||s[11].p.k||1!==s[11].p.v||s[12].p.k||0!==s[12].p.v||s[13].p.k||1!==s[13].p.v)&&(this.feFuncR=this.createFeFunc("feFuncR",i)),(s[16].p.k||0!==s[16].p.v||s[17].p.k||1!==s[17].p.v||s[18].p.k||1!==s[18].p.v||s[19].p.k||0!==s[19].p.v||s[20].p.k||1!==s[20].p.v)&&(this.feFuncG=this.createFeFunc("feFuncG",i)),(s[23].p.k||0!==s[23].p.v||s[24].p.k||1!==s[24].p.v||s[25].p.k||1!==s[25].p.v||s[26].p.k||0!==s[26].p.v||s[27].p.k||1!==s[27].p.v)&&(this.feFuncB=this.createFeFunc("feFuncB",i)),(s[30].p.k||0!==s[30].p.v||s[31].p.k||1!==s[31].p.v||s[32].p.k||1!==s[32].p.v||s[33].p.k||0!==s[33].p.v||s[34].p.k||1!==s[34].p.v)&&(this.feFuncA=this.createFeFunc("feFuncA",i)),(this.feFuncR||this.feFuncG||this.feFuncB||this.feFuncA)&&(i.setAttribute("color-interpolation-filters","sRGB"),t.appendChild(i),i=document.createElementNS(vt,"feComponentTransfer")),(s[2].p.k||0!==s[2].p.v||s[3].p.k||1!==s[3].p.v||s[4].p.k||1!==s[4].p.v||s[5].p.k||0!==s[5].p.v||s[6].p.k||1!==s[6].p.v)&&(i.setAttribute("color-interpolation-filters","sRGB"),t.appendChild(i),this.feFuncRComposed=this.createFeFunc("feFuncR",i),this.feFuncGComposed=this.createFeFunc("feFuncG",i),this.feFuncBComposed=this.createFeFunc("feFuncB",i))}function X(t,e){t.setAttribute("x","-100%"),t.setAttribute("y","-100%"),t.setAttribute("width","400%"),t.setAttribute("height","400%"),this.filterManager=e;var s=document.createElementNS(vt,"feGaussianBlur");s.setAttribute("in","SourceAlpha"),s.setAttribute("result","drop_shadow_1"),s.setAttribute("stdDeviation","0"),this.feGaussianBlur=s,t.appendChild(s);var i=document.createElementNS(vt,"feOffset");i.setAttribute("dx","25"),i.setAttribute("dy","0"),i.setAttribute("in","drop_shadow_1"),i.setAttribute("result","drop_shadow_2"),this.feOffset=i,t.appendChild(i);var a=document.createElementNS(vt,"feFlood");a.setAttribute("flood-color","#00ff00"),a.setAttribute("flood-opacity","1"),a.setAttribute("result","drop_shadow_3"),this.feFlood=a,t.appendChild(a);var r=document.createElementNS(vt,"feComposite");r.setAttribute("in","drop_shadow_3"),r.setAttribute("in2","drop_shadow_2"),r.setAttribute("operator","in"),r.setAttribute("result","drop_shadow_4"),t.appendChild(r);var n=document.createElementNS(vt,"feMerge");t.appendChild(n);var h;h=document.createElementNS(vt,"feMergeNode"),n.appendChild(h),h=document.createElementNS(vt,"feMergeNode"),h.setAttribute("in","SourceGraphic"),this.feMergeNode=h,this.feMerge=n,this.originalNodeAdded=!1,n.appendChild(h)}function q(t){var e,s=t.data.ef.length,i=m(10),a=Rt.createFilter(i),r=0;this.filters=[];var n;for(e=0;s>e;e+=1)20===t.data.ef[e].ty?(r+=1,n=new R(a,t.effects.effectElements[e]),this.filters.push(n)):21===t.data.ef[e].ty?(r+=1,n=new j(a,t.effects.effectElements[e]),this.filters.push(n)):22===t.data.ef[e].ty?(n=new O(t,t.effects.effectElements[e]),this.filters.push(n)):23===t.data.ef[e].ty?(r+=1,n=new B(a,t.effects.effectElements[e]),this.filters.push(n)):24===t.data.ef[e].ty?(r+=1,n=new G(a,t.effects.effectElements[e]),this.filters.push(n)):25===t.data.ef[e].ty&&(r+=1,n=new X(a,t.effects.effectElements[e]),this.filters.push(n));r&&(t.globalData.defs.appendChild(a),t.layerElement.setAttribute("filter","url(#"+i+")"))}function Y(t,e,s,i,a){this._parent.constructor.call(this,t,e,s,i,a),this.layers=t.layers,this.supports3d=!0,this.completeLayers=!1,this.pendingElements=[],this.elements=this.layers?Array.apply(null,{length:this.layers.length}):[],this.data.tm&&(this.tm=It.getProp(this,this.data.tm,0,s.frameRate,this.dynamicProperties)),this.data.xt?(this.layerElement=document.createElementNS(vt,"g"),this.buildAllItems()):s.progressiveLoad||this.buildAllItems()}function W(t,e,s,i,a){this.assetData=s.getAssetData(t.refId),this._parent.constructor.call(this,t,e,s,i,a)}function H(t,e,s,i,a){this.shapes=[],this.shapesData=t.shapes,this.stylesList=[],this.viewData=[],this.shapeModifiers=[],this._parent.constructor.call(this,t,e,s,i,a)}function U(t,e,s,i,a){this._parent.constructor.call(this,t,e,s,i,a)}function Z(t){Xt.play(t)}function J(t){Xt.pause(t)}function K(t){Xt.togglePause(t)}function Q(t,e){Xt.setSpeed(t,e)}function $(t,e){Xt.setDirection(t,e)}function tt(t){Xt.stop(t)}function et(t){Xt.moveFrame(t)}function st(){Wt===!0?Xt.searchAnimations(Ht,Wt,Ut):Xt.searchAnimations()}function it(t){return Xt.registerAnimation(t)}function at(){Xt.resize()}function rt(){Xt.start()}function nt(t,e,s){Xt.goToAndStop(t,e,s)}function ht(t){yt=t}function ot(t){return Wt===!0&&(t.animationData=JSON.parse(Ht)),Xt.loadAnimation(t)}function pt(t){return Xt.destroy(t)}function lt(t){if("string"==typeof t)switch(t){case"high":wt=200;break;case"medium":wt=50;break;case"low":wt=10}else!isNaN(t)&&t>1&&(wt=t);e(wt>=50?!1:!0)}function ft(t,e){"expressions"===t&&(ut=e)}function mt(t){switch(t){case"propertyFactory":return It;case"shapePropertyFactory":return Lt;case"matrix":return k}}function dt(){"complete"===document.readyState&&(clearInterval($t),st())}function ct(t){for(var e=Qt.split("&"),s=0;s<e.length;s++){var i=e[s].split("=");if(decodeURIComponent(i[0])==t)return decodeURIComponent(i[1])}}var ut,gt,vt="http://www.w3.org/2000/svg",yt=!0,bt=/^((?!chrome|android).)*safari/i.test(navigator.userAgent),kt=(Math.round,Math.pow),Pt=Math.sqrt,At=(Math.abs,Math.floor),Mt=(Math.max,Math.min),Et={};!function(){var t,e=Object.getOwnPropertyNames(Math),s=e.length;for(t=0;s>t;t+=1)Et[e[t]]=Math[e[t]]}(),Et.random=Math.random,Et.abs=function(t){var e=typeof t;if("object"===e&&t.length){var s,i=Array.apply(null,{length:t.length}),a=t.length;for(s=0;a>s;s+=1)i[s]=Math.abs(t[s]);return i}return Math.abs(t)};var wt=150,St=Math.PI/180,Ft=.5519;e(!1);var xt=function(){var t,e,s=[];for(t=0;256>t;t+=1)e=t.toString(16),s[t]=1==e.length?"0"+e:e;return function(t,e,i){return 0>t&&(t=0),0>e&&(e=0),0>i&&(i=0),"#"+s[t]+s[e]+s[i]}}(),k=(function(){var t=[];return function(e,s){return void 0!==s&&(e[3]=s),t[e[0]]||(t[e[0]]={}),t[e[0]][e[1]]||(t[e[0]][e[1]]={}),t[e[0]][e[1]][e[2]]||(t[e[0]][e[1]][e[2]]={}),t[e[0]][e[1]][e[2]][e[3]]||(t[e[0]][e[1]][e[2]][e[3]]="rgba("+e.join(",")+")"),t[e[0]][e[1]][e[2]][e[3]]}}(),function(){function t(){return this.props[0]=1,this.props[1]=0,this.props[2]=0,this.props[3]=0,this.props[4]=0,this.props[5]=1,this.props[6]=0,this.props[7]=0,this.props[8]=0,this.props[9]=0,this.props[10]=1,this.props[11]=0,this.props[12]=0,this.props[13]=0,this.props[14]=0,this.props[15]=1,this}function e(t){if(0===t)return this;var e=Math.cos(t),s=Math.sin(t);return this._t(e,-s,0,0,s,e,0,0,0,0,1,0,0,0,0,1)}function i(t){if(0===t)return this;var e=Math.cos(t),s=Math.sin(t);return this._t(1,0,0,0,0,e,-s,0,0,s,e,0,0,0,0,1)}function a(t){if(0===t)return this;var e=Math.cos(t),s=Math.sin(t);return this._t(e,0,s,0,0,1,0,0,-s,0,e,0,0,0,0,1)}function r(t){if(0===t)return this;var e=Math.cos(t),s=Math.sin(t);return this._t(e,-s,0,0,s,e,0,0,0,0,1,0,0,0,0,1)}function n(t,e){return this._t(1,e,t,1,0,0)}function h(t,e){return this.shear(Math.tan(t),Math.tan(e))}function o(t,e){var s=Math.cos(e),i=Math.sin(e);return this._t(s,i,0,0,-i,s,0,0,0,0,1,0,0,0,0,1)._t(1,0,0,0,Math.tan(t),1,0,0,0,0,1,0,0,0,0,1)._t(s,-i,0,0,i,s,0,0,0,0,1,0,0,0,0,1)}function p(t,e,s){return s=isNaN(s)?1:s,1==t&&1==e&&1==s?this:this._t(t,0,0,0,0,e,0,0,0,0,s,0,0,0,0,1)}function l(t,e,s,i,a,r,n,h,o,p,l,f,m,d,c,u){return this.props[0]=t,this.props[1]=e,this.props[2]=s,this.props[3]=i,this.props[4]=a,this.props[5]=r,this.props[6]=n,this.props[7]=h,this.props[8]=o,this.props[9]=p,this.props[10]=l,this.props[11]=f,this.props[12]=m,this.props[13]=d,this.props[14]=c,this.props[15]=u,this}function f(t,e,s){return s=s||0,0!==t||0!==e||0!==s?this._t(1,0,0,0,0,1,0,0,0,0,1,0,t,e,s,1):this}function m(t,e,s,i,a,r,n,h,o,p,l,f,m,d,c,u){if(1===t&&0===e&&0===s&&0===i&&0===a&&1===r&&0===n&&0===h&&0===o&&0===p&&1===l&&0===f)return(0!==m||0!==d||0!==c)&&(this.props[12]=this.props[12]*t+this.props[13]*a+this.props[14]*o+this.props[15]*m,this.props[13]=this.props[12]*e+this.props[13]*r+this.props[14]*p+this.props[15]*d,this.props[14]=this.props[12]*s+this.props[13]*n+this.props[14]*l+this.props[15]*c,this.props[15]=this.props[12]*i+this.props[13]*h+this.props[14]*f+this.props[15]*u),this;var g=this.props[0],v=this.props[1],y=this.props[2],b=this.props[3],k=this.props[4],P=this.props[5],A=this.props[6],M=this.props[7],E=this.props[8],w=this.props[9],S=this.props[10],F=this.props[11],x=this.props[12],D=this.props[13],C=this.props[14],_=this.props[15];return this.props[0]=g*t+v*a+y*o+b*m,this.props[1]=g*e+v*r+y*p+b*d,this.props[2]=g*s+v*n+y*l+b*c,this.props[3]=g*i+v*h+y*f+b*u,this.props[4]=k*t+P*a+A*o+M*m,this.props[5]=k*e+P*r+A*p+M*d,this.props[6]=k*s+P*n+A*l+M*c,this.props[7]=k*i+P*h+A*f+M*u,this.props[8]=E*t+w*a+S*o+F*m,this.props[9]=E*e+w*r+S*p+F*d,this.props[10]=E*s+w*n+S*l+F*c,this.props[11]=E*i+w*h+S*f+F*u,this.props[12]=x*t+D*a+C*o+_*m,this.props[13]=x*e+D*r+C*p+_*d,this.props[14]=x*s+D*n+C*l+_*c,this.props[15]=x*i+D*h+C*f+_*u,this}function d(t){var e;for(e=0;16>e;e+=1)t.props[e]=this.props[e]}function c(t){var e;for(e=0;16>e;e+=1)this.props[e]=t[e]}function u(t,e,s){return{x:t*this.props[0]+e*this.props[4]+s*this.props[8]+this.props[12],y:t*this.props[1]+e*this.props[5]+s*this.props[9]+this.props[13],z:t*this.props[2]+e*this.props[6]+s*this.props[10]+this.props[14]}}function g(t,e,s){return t*this.props[0]+e*this.props[4]+s*this.props[8]+this.props[12]}function v(t,e,s){return t*this.props[1]+e*this.props[5]+s*this.props[9]+this.props[13]}function y(t,e,s){return t*this.props[2]+e*this.props[6]+s*this.props[10]+this.props[14]}function b(t){var e=this.props[0]*this.props[5]-this.props[1]*this.props[4],s=this.props[5]/e,i=-this.props[1]/e,a=-this.props[4]/e,r=this.props[0]/e,n=(this.props[4]*this.props[13]-this.props[5]*this.props[12])/e,h=-(this.props[0]*this.props[13]-this.props[1]*this.props[12])/e;return[t[0]*s+t[1]*a+n,t[0]*i+t[1]*r+h,0]}function k(t){var e,s=t.length,i=[];for(e=0;s>e;e+=1)i[e]=b(t[e]);return i}function P(t,e,s,i){if(i&&2===i){var a=Ot.newPoint();return a[0]=t*this.props[0]+e*this.props[4]+s*this.props[8]+this.props[12],a[1]=t*this.props[1]+e*this.props[5]+s*this.props[9]+this.props[13],a}return[t*this.props[0]+e*this.props[4]+s*this.props[8]+this.props[12],t*this.props[1]+e*this.props[5]+s*this.props[9]+this.props[13],t*this.props[2]+e*this.props[6]+s*this.props[10]+this.props[14]]}function A(t,e){return gt(t*this.props[0]+e*this.props[4]+this.props[12])+","+gt(t*this.props[1]+e*this.props[5]+this.props[13])}function M(){return[this.props[0],this.props[1],this.props[2],this.props[3],this.props[4],this.props[5],this.props[6],this.props[7],this.props[8],this.props[9],this.props[10],this.props[11],this.props[12],this.props[13],this.props[14],this.props[15]]}function E(){return bt?"matrix3d("+s(this.props[0])+","+s(this.props[1])+","+s(this.props[2])+","+s(this.props[3])+","+s(this.props[4])+","+s(this.props[5])+","+s(this.props[6])+","+s(this.props[7])+","+s(this.props[8])+","+s(this.props[9])+","+s(this.props[10])+","+s(this.props[11])+","+s(this.props[12])+","+s(this.props[13])+","+s(this.props[14])+","+s(this.props[15])+")":(this.cssParts[1]=this.props.join(","),this.cssParts.join(""))}function w(){return"matrix("+this.props[0]+","+this.props[1]+","+this.props[4]+","+this.props[5]+","+this.props[12]+","+this.props[13]+")"}function S(){return""+this.toArray()}return function(){this.reset=t,this.rotate=e,this.rotateX=i,this.rotateY=a,this.rotateZ=r,this.skew=h,this.skewFromAxis=o,this.shear=n,this.scale=p,this.setTransform=l,this.translate=f,this.transform=m,this.applyToPoint=u,this.applyToX=g,this.applyToY=v,this.applyToZ=y,this.applyToPointArray=P,this.applyToPointStringified=A,this.toArray=M,this.toCSS=E,this.to2dCSS=w,this.toString=S,this.clone=d,this.cloneFromProps=c,this.inversePoints=k,this.inversePoint=b,this._t=this.transform,this.props=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],this.cssParts=["matrix3d(","",")"]}}());!function(t,e){function s(s,p,l){var d=[];p=1==p?{entropy:!0}:p||{};var y=n(r(p.entropy?[s,o(t)]:null==s?h():s,3),d),b=new i(d),k=function(){for(var t=b.g(m),e=u,s=0;g>t;)t=(t+s)*f,e*=f,s=b.g(1);for(;t>=v;)t/=2,e/=2,s>>>=1;return(t+s)/e};return k.int32=function(){return 0|b.g(4)},k.quick=function(){return b.g(4)/4294967296},k["double"]=k,n(o(b.S),t),(p.pass||l||function(t,s,i,r){return r&&(r.S&&a(r,b),t.state=function(){return a(b,{})}),i?(e[c]=t,s):t})(k,y,"global"in p?p.global:this==e,p.state)}function i(t){var e,s=t.length,i=this,a=0,r=i.i=i.j=0,n=i.S=[];for(s||(t=[s++]);f>a;)n[a]=a++;for(a=0;f>a;a++)n[a]=n[r=y&r+t[a%s]+(e=n[a])],n[r]=e;(i.g=function(t){for(var e,s=0,a=i.i,r=i.j,n=i.S;t--;)e=n[a=y&a+1],s=s*f+n[y&(n[a]=n[r=y&r+e])+(n[r]=e)];return i.i=a,i.j=r,s})(f)}function a(t,e){return e.i=t.i,e.j=t.j,e.S=t.S.slice(),e}function r(t,e){var s,i=[],a=typeof t;if(e&&"object"==a)for(s in t)try{i.push(r(t[s],e-1))}catch(n){}return i.length?i:"string"==a?t:t+"\x00"}function n(t,e){for(var s,i=t+"",a=0;a<i.length;)e[y&a]=y&(s^=19*e[y&a])+i.charCodeAt(a++);return o(e)}function h(){try{if(p)return o(p.randomBytes(f));var e=new Uint8Array(f);return(l.crypto||l.msCrypto).getRandomValues(e),o(e)}catch(s){var i=l.navigator,a=i&&i.plugins;return[+new Date,l,a,l.screen,o(t)]}}function o(t){return String.fromCharCode.apply(0,t)}var p,l=this,f=256,m=6,d=52,c="random",u=e.pow(f,m),g=e.pow(2,d),v=2*g,y=f-1;e["seed"+c]=s,n(e.random(),t)}([],Et);var Dt=function(){function t(t,e,s,i,a){var r=a||("bez_"+t+"_"+e+"_"+s+"_"+i).replace(/\./g,"p");if(l[r])return l[r];var n=new o([t,e,s,i]);return l[r]=n,n}function e(t,e){return 1-3*e+3*t}function s(t,e){return 3*e-6*t}function i(t){return 3*t}function a(t,a,r){return((e(a,r)*t+s(a,r))*t+i(a))*t}function r(t,a,r){return 3*e(a,r)*t*t+2*s(a,r)*t+i(a)}function n(t,e,s,i,r){var n,h,o=0;do h=e+(s-e)/2,n=a(h,i,r)-t,n>0?s=h:e=h;while(Math.abs(n)>d&&++o<c);return h}function h(t,e,s,i){for(var n=0;f>n;++n){var h=r(e,s,i);if(0===h)return e;var o=a(e,s,i)-t;e-=o/h}return e}function o(t){this._p=t,this._mSampleValues=v?new Float32Array(u):new Array(u),this._precomputed=!1,this.get=this.get.bind(this)}var p={};p.getBezierEasing=t;var l={},f=4,m=.001,d=1e-7,c=10,u=11,g=1/(u-1),v="function"==typeof Float32Array;return o.prototype={get:function(t){var e=this._p[0],s=this._p[1],i=this._p[2],r=this._p[3];return this._precomputed||this._precompute(),e===s&&i===r?t:0===t?0:1===t?1:a(this._getTForX(t),s,r)},_precompute:function(){var t=this._p[0],e=this._p[1],s=this._p[2],i=this._p[3];this._precomputed=!0,(t!==e||s!==i)&&this._calcSampleValues()},_calcSampleValues:function(){for(var t=this._p[0],e=this._p[2],s=0;u>s;++s)this._mSampleValues[s]=a(s*g,t,e)},_getTForX:function(t){for(var e=this._p[0],s=this._p[2],i=this._mSampleValues,a=0,o=1,p=u-1;o!==p&&i[o]<=t;++o)a+=g;--o;var l=(t-i[o])/(i[o+1]-i[o]),f=a+l*g,d=r(f,e,s);return d>=m?h(t,f,e,s):0===d?f:n(t,a,a+g,e,s)}},p}();!function(){for(var t=0,e=["ms","moz","webkit","o"],s=0;s<e.length&&!window.requestAnimationFrame;++s)window.requestAnimationFrame=window[e[s]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[e[s]+"CancelAnimationFrame"]||window[e[s]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(e,s){var i=(new Date).getTime(),a=Math.max(0,16-(i-t)),r=window.setTimeout(function(){e(i+a)},a);

return t=i+a,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)})}();var Ct=M(),_t=E(),Tt=function(){function t(t,e){var s=document.createElement("span");s.style.fontFamily=e;var i=document.createElement("span");i.innerHTML="giItT1WQy@!-/#",s.style.position="absolute",s.style.left="-10000px",s.style.top="-10000px",s.style.fontSize="300px",s.style.fontVariant="normal",s.style.fontStyle="normal",s.style.fontWeight="normal",s.style.letterSpacing="0",s.appendChild(i),document.body.appendChild(s);var a=i.offsetWidth;return i.style.fontFamily=t+", "+e,{node:i,w:a,parent:s}}function e(){var t,s,i,a=this.fonts.length,r=a;for(t=0;a>t;t+=1)if(this.fonts[t].loaded)r-=1;else if("t"===this.fonts[t].fOrigin||2===this.fonts[t].origin){if(window.Typekit&&window.Typekit.load&&0===this.typekitLoaded){this.typekitLoaded=1;try{window.Typekit.load({async:!0,active:function(){this.typekitLoaded=2}.bind(this)})}catch(n){}}2===this.typekitLoaded&&(this.fonts[t].loaded=!0)}else"n"===this.fonts[t].fOrigin||0===this.fonts[t].origin?this.fonts[t].loaded=!0:(s=this.fonts[t].monoCase.node,i=this.fonts[t].monoCase.w,s.offsetWidth!==i?(r-=1,this.fonts[t].loaded=!0):(s=this.fonts[t].sansCase.node,i=this.fonts[t].sansCase.w,s.offsetWidth!==i&&(r-=1,this.fonts[t].loaded=!0)),this.fonts[t].loaded&&(this.fonts[t].sansCase.parent.parentNode.removeChild(this.fonts[t].sansCase.parent),this.fonts[t].monoCase.parent.parentNode.removeChild(this.fonts[t].monoCase.parent)));0!==r&&Date.now()-this.initTime<o?setTimeout(e.bind(this),20):setTimeout(function(){this.loaded=!0}.bind(this),0)}function s(t,e){var s=document.createElementNS(vt,"text");s.style.fontSize="100px",s.style.fontFamily=e.fFamily,s.textContent="1",e.fClass?(s.style.fontFamily="inherit",s.className=e.fClass):s.style.fontFamily=e.fFamily,t.appendChild(s);var i=document.createElement("canvas").getContext("2d");return i.font="100px "+e.fFamily,i}function i(i,a){if(!i)return void(this.loaded=!0);if(this.chars)return this.loaded=!0,void(this.fonts=i.list);var r,n=i.list,h=n.length;for(r=0;h>r;r+=1){if(n[r].loaded=!1,n[r].monoCase=t(n[r].fFamily,"monospace"),n[r].sansCase=t(n[r].fFamily,"sans-serif"),n[r].fPath){if("p"===n[r].fOrigin||3===n[r].origin){var o=document.createElement("style");o.type="text/css",o.innerHTML="@font-face {font-family: "+n[r].fFamily+"; font-style: normal; src: url('"+n[r].fPath+"');}",a.appendChild(o)}else if("g"===n[r].fOrigin||1===n[r].origin){var p=document.createElement("link");p.type="text/css",p.rel="stylesheet",p.href=n[r].fPath,a.appendChild(p)}else if("t"===n[r].fOrigin||2===n[r].origin){var l=document.createElement("script");l.setAttribute("src",n[r].fPath),a.appendChild(l)}}else n[r].loaded=!0;n[r].helper=s(a,n[r]),this.fonts.push(n[r])}e.bind(this)()}function a(t){if(t){this.chars||(this.chars=[]);var e,s,i,a=t.length,r=this.chars.length;for(e=0;a>e;e+=1){for(s=0,i=!1;r>s;)this.chars[s].style===t[e].style&&this.chars[s].fFamily===t[e].fFamily&&this.chars[s].ch===t[e].ch&&(i=!0),s+=1;i||(this.chars.push(t[e]),r+=1)}}}function r(t,e,s){for(var i=0,a=this.chars.length;a>i;){if(this.chars[i].ch===t&&this.chars[i].style===e&&this.chars[i].fFamily===s)return this.chars[i];i+=1}}function n(t,e,s){var i=this.getFontByName(e),a=i.helper;return a.measureText(t).width*s/100}function h(t){for(var e=0,s=this.fonts.length;s>e;){if(this.fonts[e].fName===t)return this.fonts[e];e+=1}return"sans-serif"}var o=5e3,p=function(){this.fonts=[],this.chars=null,this.typekitLoaded=0,this.loaded=!1,this.initTime=Date.now()};return p.prototype.addChars=a,p.prototype.addFonts=i,p.prototype.getCharData=r,p.prototype.getFontByName=h,p.prototype.measureText=n,p}(),It=function(){function t(){if(this.elem.globalData.frameId!==this.frameId){this.mdf=!1;var t=this.comp.renderedFrame-this.offsetTime;if(!(t===this.lastFrame||this.lastFrame!==p&&(this.lastFrame>=this.keyframes[this.keyframes.length-1].t-this.offsetTime&&t>=this.keyframes[this.keyframes.length-1].t-this.offsetTime||this.lastFrame<this.keyframes[0].t-this.offsetTime&&t<this.keyframes[0].t-this.offsetTime))){for(var e,s,i=this.lastFrame<t?this._lastIndex:0,a=this.keyframes.length-1,r=!0;r;){if(e=this.keyframes[i],s=this.keyframes[i+1],i==a-1&&t>=s.t-this.offsetTime){e.h&&(e=s);break}if(s.t-this.offsetTime>t)break;a-1>i?i+=1:r=!1}this._lastIndex=i;var n,h,o,l,f,m;if(e.to){e.bezierData||Ct.buildBezierData(e);var d=e.bezierData;if(t>=s.t-this.offsetTime||t<e.t-this.offsetTime){var c=t>=s.t-this.offsetTime?d.points.length-1:0;for(h=d.points[c].point.length,n=0;h>n;n+=1)this.pv[n]=d.points[c].point[n],this.v[n]=this.mult?this.pv[n]*this.mult:this.pv[n],this.lastPValue[n]!==this.pv[n]&&(this.mdf=!0,this.lastPValue[n]=this.pv[n]);this._lastBezierData=null}else{e.__fnct?m=e.__fnct:(m=Dt.getBezierEasing(e.o.x,e.o.y,e.i.x,e.i.y,e.n).get,e.__fnct=m),o=m((t-(e.t-this.offsetTime))/(s.t-this.offsetTime-(e.t-this.offsetTime)));var u,g=d.segmentLength*o,v=this.lastFrame<t&&this._lastBezierData===d?this._lastAddedLength:0;for(f=this.lastFrame<t&&this._lastBezierData===d?this._lastPoint:0,r=!0,l=d.points.length;r;){if(v+=d.points[f].partialLength,0===g||0===o||f==d.points.length-1){for(h=d.points[f].point.length,n=0;h>n;n+=1)this.pv[n]=d.points[f].point[n],this.v[n]=this.mult?this.pv[n]*this.mult:this.pv[n],this.lastPValue[n]!==this.pv[n]&&(this.mdf=!0,this.lastPValue[n]=this.pv[n]);break}if(g>=v&&g<v+d.points[f+1].partialLength){for(u=(g-v)/d.points[f+1].partialLength,h=d.points[f].point.length,n=0;h>n;n+=1)this.pv[n]=d.points[f].point[n]+(d.points[f+1].point[n]-d.points[f].point[n])*u,this.v[n]=this.mult?this.pv[n]*this.mult:this.pv[n],this.lastPValue[n]!==this.pv[n]&&(this.mdf=!0,this.lastPValue[n]=this.pv[n]);break}l-1>f?f+=1:r=!1}this._lastPoint=f,this._lastAddedLength=v-d.points[f].partialLength,this._lastBezierData=d}}else{var y,b,k,P,A;for(a=e.s.length,i=0;a>i;i+=1){if(1!==e.h&&(t>=s.t-this.offsetTime?o=1:t<e.t-this.offsetTime?o=0:(e.o.x instanceof Array?(e.__fnct||(e.__fnct=[]),e.__fnct[i]?m=e.__fnct[i]:(y=e.o.x[i]||e.o.x[0],b=e.o.y[i]||e.o.y[0],k=e.i.x[i]||e.i.x[0],P=e.i.y[i]||e.i.y[0],m=Dt.getBezierEasing(y,b,k,P).get,e.__fnct[i]=m)):e.__fnct?m=e.__fnct:(y=e.o.x,b=e.o.y,k=e.i.x,P=e.i.y,m=Dt.getBezierEasing(y,b,k,P).get,e.__fnct=m),o=m((t-(e.t-this.offsetTime))/(s.t-this.offsetTime-(e.t-this.offsetTime))))),this.sh&&1!==e.h){var M=e.s[i],E=e.e[i];-180>M-E?M+=360:M-E>180&&(M-=360),A=M+(E-M)*o}else A=1===e.h?e.s[i]:e.s[i]+(e.e[i]-e.s[i])*o;1===a?(this.v=this.mult?A*this.mult:A,this.pv=A,this.lastPValue!=this.pv&&(this.mdf=!0,this.lastPValue=this.pv)):(this.v[i]=this.mult?A*this.mult:A,this.pv[i]=A,this.lastPValue[i]!==this.pv[i]&&(this.mdf=!0,this.lastPValue[i]=this.pv[i]))}}}this.lastFrame=t,this.frameId=this.elem.globalData.frameId}}function e(){}function s(t,s,i){this.mult=i,this.v=i?s.k*i:s.k,this.pv=s.k,this.mdf=!1,this.comp=t.comp,this.k=!1,this.kf=!1,this.vel=0,this.getValue=e}function i(t,s,i){this.mult=i,this.data=s,this.mdf=!1,this.comp=t.comp,this.k=!1,this.kf=!1,this.frameId=-1,this.v=Array.apply(null,{length:s.k.length}),this.pv=Array.apply(null,{length:s.k.length}),this.lastValue=Array.apply(null,{length:s.k.length});var a=Array.apply(null,{length:s.k.length});this.vel=a.map(function(){return 0});var r,n=s.k.length;for(r=0;n>r;r+=1)this.v[r]=i?s.k[r]*i:s.k[r],this.pv[r]=s.k[r];this.getValue=e}function a(e,s,i){this.keyframes=s.k,this.offsetTime=e.data.st,this.lastValue=-99999,this.lastPValue=-99999,this.frameId=-1,this._lastIndex=0,this.k=!0,this.kf=!0,this.data=s,this.mult=i,this.elem=e,this.comp=e.comp,this.lastFrame=p,this.v=i?s.k[0].s[0]*i:s.k[0].s[0],this.pv=s.k[0].s[0],this.getValue=t}function r(e,s,i){var a,r,n,h,o,l=s.k.length;for(a=0;l-1>a;a+=1)s.k[a].to&&s.k[a].s&&s.k[a].e&&(r=s.k[a].s,n=s.k[a].e,h=s.k[a].to,o=s.k[a].ti,(2===r.length&&(r[0]!==n[0]||r[1]!==n[1])&&Ct.pointOnLine2D(r[0],r[1],n[0],n[1],r[0]+h[0],r[1]+h[1])&&Ct.pointOnLine2D(r[0],r[1],n[0],n[1],n[0]+o[0],n[1]+o[1])||3===r.length&&(r[0]!==n[0]||r[1]!==n[1]||r[2]!==n[2])&&Ct.pointOnLine3D(r[0],r[1],r[2],n[0],n[1],n[2],r[0]+h[0],r[1]+h[1],r[2]+h[2])&&Ct.pointOnLine3D(r[0],r[1],r[2],n[0],n[1],n[2],n[0]+o[0],n[1]+o[1],n[2]+o[2]))&&(s.k[a].to=null,s.k[a].ti=null));this.keyframes=s.k,this.offsetTime=e.data.st,this.k=!0,this.kf=!0,this.mult=i,this.elem=e,this.comp=e.comp,this.getValue=t,this.frameId=-1,this._lastIndex=0,this.v=Array.apply(null,{length:s.k[0].s.length}),this.pv=Array.apply(null,{length:s.k[0].s.length}),this.lastValue=Array.apply(null,{length:s.k[0].s.length}),this.lastPValue=Array.apply(null,{length:s.k[0].s.length}),this.lastFrame=p}function n(t,e,n,h,o){var p;if(2===n)p=new l(t,e,o);else if(0===e.a)p=0===n?new s(t,e,h):new i(t,e,h);else if(1===e.a)p=0===n?new a(t,e,h):new r(t,e,h);else if(e.k.length)if("number"==typeof e.k[0])p=new i(t,e,h);else switch(n){case 0:p=new a(t,e,h);break;case 1:p=new r(t,e,h)}else p=new s(t,e,h);return p.k&&o.push(p),p}function h(t,e,s,i){return new m(t,e,s,i)}function o(t,e,s){return new d(t,e,s)}var p=-999999,l=function(){function t(){return ExpressionValue(this.p)}function e(){return ExpressionValue(this.px)}function s(){return ExpressionValue(this.py)}function i(){return ExpressionValue(this.a)}function a(){return ExpressionValue(this.or)}function r(){return ExpressionValue(this.r,1/St)}function n(){return ExpressionValue(this.s,100)}function h(){return ExpressionValue(this.o,100)}function o(){return ExpressionValue(this.sk)}function p(){return ExpressionValue(this.sa)}function l(t){var e,s=this.dynamicProperties.length;for(e=0;s>e;e+=1)this.dynamicProperties[e].getValue(),this.dynamicProperties[e].mdf&&(this.mdf=!0);this.a&&t.translate(-this.a.v[0],-this.a.v[1],this.a.v[2]),this.s&&t.scale(this.s.v[0],this.s.v[1],this.s.v[2]),this.r?t.rotate(-this.r.v):t.rotateZ(-this.rz.v).rotateY(this.ry.v).rotateX(this.rx.v).rotateZ(-this.or.v[2]).rotateY(this.or.v[1]).rotateX(this.or.v[0]),this.data.p.s?this.data.p.z?t.translate(this.px.v,this.py.v,-this.pz.v):t.translate(this.px.v,this.py.v,0):t.translate(this.p.v[0],this.p.v[1],-this.p.v[2])}function f(){if(this.elem.globalData.frameId!==this.frameId){this.mdf=!1;var t,e=this.dynamicProperties.length;for(t=0;e>t;t+=1)this.dynamicProperties[t].getValue(),this.dynamicProperties[t].mdf&&(this.mdf=!0);if(this.mdf){if(this.v.reset(),this.a&&this.v.translate(-this.a.v[0],-this.a.v[1],this.a.v[2]),this.s&&this.v.scale(this.s.v[0],this.s.v[1],this.s.v[2]),this.sk&&this.v.skewFromAxis(-this.sk.v,this.sa.v),this.r?this.v.rotate(-this.r.v):this.v.rotateZ(-this.rz.v).rotateY(this.ry.v).rotateX(this.rx.v).rotateZ(-this.or.v[2]).rotateY(this.or.v[1]).rotateX(this.or.v[0]),this.autoOriented&&this.p.keyframes&&this.p.getValueAtTime){var s,i;this.p.lastFrame+this.p.offsetTime<=this.p.keyframes[0].t?(s=this.p.getValueAtTime((this.p.keyframes[0].t+.01)/this.elem.globalData.frameRate,0),i=this.p.getValueAtTime(this.p.keyframes[0].t/this.elem.globalData.frameRate,0)):this.p.lastFrame+this.p.offsetTime>=this.p.keyframes[this.p.keyframes.length-1].t?(s=this.p.getValueAtTime(this.p.keyframes[this.p.keyframes.length-1].t/this.elem.globalData.frameRate,0),i=this.p.getValueAtTime((this.p.keyframes[this.p.keyframes.length-1].t-.01)/this.elem.globalData.frameRate,0)):(s=this.p.pv,i=this.p.getValueAtTime((this.p.lastFrame+this.p.offsetTime-.01)/this.elem.globalData.frameRate,this.p.offsetTime)),this.v.rotate(-Math.atan2(s[1]-i[1],s[0]-i[0]))}this.data.p.s?this.data.p.z?this.v.translate(this.px.v,this.py.v,-this.pz.v):this.v.translate(this.px.v,this.py.v,0):this.v.translate(this.p.v[0],this.p.v[1],-this.p.v[2])}this.frameId=this.elem.globalData.frameId}}function m(){this.inverted=!0,this.iv=new k,this.k||(this.data.p.s?this.iv.translate(this.px.v,this.py.v,-this.pz.v):this.iv.translate(this.p.v[0],this.p.v[1],-this.p.v[2]),this.r?this.iv.rotate(-this.r.v):this.iv.rotateX(-this.rx.v).rotateY(-this.ry.v).rotateZ(this.rz.v),this.s&&this.iv.scale(this.s.v[0],this.s.v[1],1),this.a&&this.iv.translate(-this.a.v[0],-this.a.v[1],this.a.v[2]))}function d(){}return function(c,u,g){this.elem=c,this.frameId=-1,this.type="transform",this.dynamicProperties=[],this.mdf=!1,this.data=u,this.getValue=f,this.applyToMatrix=l,this.setInverted=m,this.autoOrient=d,this.v=new k,u.p.s?(this.px=It.getProp(c,u.p.x,0,0,this.dynamicProperties),this.py=It.getProp(c,u.p.y,0,0,this.dynamicProperties),u.p.z&&(this.pz=It.getProp(c,u.p.z,0,0,this.dynamicProperties))):this.p=It.getProp(c,u.p,1,0,this.dynamicProperties),u.r?this.r=It.getProp(c,u.r,0,St,this.dynamicProperties):u.rx&&(this.rx=It.getProp(c,u.rx,0,St,this.dynamicProperties),this.ry=It.getProp(c,u.ry,0,St,this.dynamicProperties),this.rz=It.getProp(c,u.rz,0,St,this.dynamicProperties),this.or=It.getProp(c,u.or,1,St,this.dynamicProperties)),u.sk&&(this.sk=It.getProp(c,u.sk,0,St,this.dynamicProperties),this.sa=It.getProp(c,u.sa,0,St,this.dynamicProperties)),u.a&&(this.a=It.getProp(c,u.a,1,0,this.dynamicProperties)),u.s&&(this.s=It.getProp(c,u.s,1,.01,this.dynamicProperties)),this.o=u.o?It.getProp(c,u.o,0,.01,g):{mdf:!1,v:1},this.dynamicProperties.length?g.push(this):(this.a&&this.v.translate(-this.a.v[0],-this.a.v[1],this.a.v[2]),this.s&&this.v.scale(this.s.v[0],this.s.v[1],this.s.v[2]),this.sk&&this.v.skewFromAxis(-this.sk.v,this.sa.v),this.r?this.v.rotate(-this.r.v):this.v.rotateZ(-this.rz.v).rotateY(this.ry.v).rotateX(this.rx.v).rotateZ(-this.or.v[2]).rotateY(this.or.v[1]).rotateX(this.or.v[0]),this.data.p.s?u.p.z?this.v.translate(this.px.v,this.py.v,-this.pz.v):this.v.translate(this.px.v,this.py.v,0):this.v.translate(this.p.v[0],this.p.v[1],-this.p.v[2])),Object.defineProperty(this,"position",{get:t}),Object.defineProperty(this,"xPosition",{get:e}),Object.defineProperty(this,"yPosition",{get:s}),Object.defineProperty(this,"orientation",{get:a}),Object.defineProperty(this,"anchorPoint",{get:i}),Object.defineProperty(this,"rotation",{get:r}),Object.defineProperty(this,"scale",{get:n}),Object.defineProperty(this,"opacity",{get:h}),Object.defineProperty(this,"skew",{get:o}),Object.defineProperty(this,"skewAxis",{get:p})}}(),f=function(){function t(t){if(this.prop.getValue(),this.cmdf=!1,this.omdf=!1,this.prop.mdf||t){var e,s,i,a=4*this.data.p;for(e=0;a>e;e+=1)s=e%4===0?100:255,i=Math.round(this.prop.v[e]*s),this.c[e]!==i&&(this.c[e]=i,this.cmdf=!0);if(this.o.length)for(a=this.prop.v.length,e=4*this.data.p;a>e;e+=1)s=e%2===0?100:1,i=e%2===0?Math.round(100*this.prop.v[e]):this.prop.v[e],this.o[e-4*this.data.p]!==i&&(this.o[e-4*this.data.p]=i,this.omdf=!0)}}function e(e,s,i){this.prop=n(e,s.k,1,null,[]),this.data=s,this.k=this.prop.k,this.c=Array.apply(null,{length:4*s.p});var a=s.k.k[0].s?s.k.k[0].s.length-4*s.p:s.k.k.length-4*s.p;this.o=Array.apply(null,{length:a}),this.cmdf=!1,this.omdf=!1,this.getValue=t,this.prop.k&&i.push(this),this.getValue(!0)}return function(t,s,i){return new e(t,s,i)}}(),m=function(){function t(t){var e=0,s=this.dataProps.length;if(this.elem.globalData.frameId!==this.frameId||t){for(this.mdf=!1,this.frameId=this.elem.globalData.frameId;s>e;){if(this.dataProps[e].p.mdf){this.mdf=!0;break}e+=1}if(this.mdf||t)for("svg"===this.renderer&&(this.dasharray=""),e=0;s>e;e+=1)"o"!=this.dataProps[e].n?"svg"===this.renderer?this.dasharray+=" "+this.dataProps[e].p.v:this.dasharray[e]=this.dataProps[e].p.v:this.dashoffset=this.dataProps[e].p.v}}return function(e,s,i,a){this.elem=e,this.frameId=-1,this.dataProps=new Array(s.length),this.renderer=i,this.mdf=!1,this.k=!1,this.dasharray="svg"===this.renderer?"":new Array(s.length-1),this.dashoffset=0;var r,n,h=s.length;for(r=0;h>r;r+=1)n=It.getProp(e,s[r].v,0,0,a),this.k=n.k?!0:this.k,this.dataProps[r]={n:s[r].n,p:n};this.getValue=t,this.k?a.push(this):this.getValue(!0)}}(),d=function(){function t(){if(this.dynamicProperties.length){var t,e=this.dynamicProperties.length;for(t=0;e>t;t+=1)this.dynamicProperties[t].getValue(),this.dynamicProperties[t].mdf&&(this.mdf=!0)}var s=this.data.totalChars,i=2===this.data.r?1:100/s,a=this.o.v/i,r=this.s.v/i+a,n=this.e.v/i+a;if(r>n){var h=r;r=n,n=h}this.finalS=r,this.finalE=n}function e(t){var e=Dt.getBezierEasing(this.ne.v/100,0,1-this.xe.v/100,1).get,r=0,n=this.finalS,h=this.finalE,o=this.data.sh;if(2==o)r=h===n?t>=h?1:0:s(0,i(.5/(h-n)+(t-n)/(h-n),1)),r=e(r);else if(3==o)r=h===n?t>=h?0:1:1-s(0,i(.5/(h-n)+(t-n)/(h-n),1)),r=e(r);else if(4==o)h===n?r=0:(r=s(0,i(.5/(h-n)+(t-n)/(h-n),1)),.5>r?r*=2:r=1-2*(r-.5)),r=e(r);else if(5==o){if(h===n)r=0;else{var p=h-n;t=i(s(0,t+.5-n),h-n);var l=-p/2+t,f=p/2;r=Math.sqrt(1-l*l/(f*f))}r=e(r)}else 6==o?(h===n?r=0:(t=i(s(0,t+.5-n),h-n),r=(1+Math.cos(Math.PI+2*Math.PI*t/(h-n)))/2),r=e(r)):(t>=a(n)&&(r=0>t-n?1-(n-t):s(0,i(h-t,1))),r=e(r));return r*this.a.v}var s=Math.max,i=Math.min,a=Math.floor;return function(s,i,a){this.mdf=!1,this.k=!1,this.data=i,this.dynamicProperties=[],this.getValue=t,this.getMult=e,this.comp=s.comp,this.finalS=0,this.finalE=0,this.s=It.getProp(s,i.s||{k:0},0,0,this.dynamicProperties),this.e="e"in i?It.getProp(s,i.e,0,0,this.dynamicProperties):{v:2===i.r?i.totalChars:100},this.o=It.getProp(s,i.o||{k:0},0,0,this.dynamicProperties),this.xe=It.getProp(s,i.xe||{k:0},0,0,this.dynamicProperties),this.ne=It.getProp(s,i.ne||{k:0},0,0,this.dynamicProperties),this.a=It.getProp(s,i.a,0,.01,this.dynamicProperties),this.dynamicProperties.length?a.push(this):this.getValue()}}(),c={};return c.getProp=n,c.getDashProp=h,c.getTextSelectorProp=o,c.getGradientProp=f,c}();w.prototype.setPathData=function(t,e){for(this.c=t;e>this._maxLength;)this.doubleArrayLength();for(var s=0;e>s;)this.v[s]=Ot.newPoint(),this.o[s]=Ot.newPoint(),this.i[s]=Ot.newPoint(),s+=1;this._length=e},w.prototype.doubleArrayLength=function(){this.v=this.v.concat(Array.apply(null,{length:this._maxLength})),this.i=this.i.concat(Array.apply(null,{length:this._maxLength})),this.o=this.o.concat(Array.apply(null,{length:this._maxLength})),this._maxLength*=2},w.prototype.setXYAt=function(t,e,s,i,a){var r;switch(this._length=Math.max(this._length,i+1),this._length>=this._maxLength&&this.doubleArrayLength(),s){case"v":r=this.v;break;case"i":r=this.i;break;case"o":r=this.o}(!r[i]||r[i]&&!a)&&(r[i]=Ot.newPoint()),r[i][0]=t,r[i][1]=e},w.prototype.setTripleAt=function(t,e,s,i,a,r,n,h){this.setXYAt(t,e,"v",n,h),this.setXYAt(s,i,"o",n,h),this.setXYAt(a,r,"i",n,h)};var Lt=function(){function t(){if(this.elem.globalData.frameId!==this.frameId){this.mdf=!1;var t=this.comp.renderedFrame-this.offsetTime;if(this.lastFrame===n||!(this.lastFrame<this.keyframes[0].t-this.offsetTime&&t<this.keyframes[0].t-this.offsetTime||this.lastFrame>this.keyframes[this.keyframes.length-1].t-this.offsetTime&&t>this.keyframes[this.keyframes.length-1].t-this.offsetTime)){var e,s,i;if(t<this.keyframes[0].t-this.offsetTime)e=this.keyframes[0].s[0],i=!0,this._lastIndex=0;else if(t>=this.keyframes[this.keyframes.length-1].t-this.offsetTime)e=1===this.keyframes[this.keyframes.length-2].h?this.keyframes[this.keyframes.length-1].s[0]:this.keyframes[this.keyframes.length-2].e[0],i=!0;else{for(var a,r,h,o,p,l,f=this.lastFrame<n?this._lastIndex:0,m=this.keyframes.length-1,d=!0;d&&(a=this.keyframes[f],r=this.keyframes[f+1],!(r.t-this.offsetTime>t));)m-1>f?f+=1:d=!1;i=1===a.h,this._lastIndex=f;var c;if(!i){if(t>=r.t-this.offsetTime)c=1;else if(t<a.t-this.offsetTime)c=0;else{var u;a.__fnct?u=a.__fnct:(u=Dt.getBezierEasing(a.o.x,a.o.y,a.i.x,a.i.y).get,a.__fnct=u),c=u((t-(a.t-this.offsetTime))/(r.t-this.offsetTime-(a.t-this.offsetTime)))}s=a.e[0]}e=a.s[0]}o=this.v._length,l=e.i[0].length;var g,v=!1;for(h=0;o>h;h+=1)for(p=0;l>p;p+=1)i?(g=e.i[h][p],this.v.i[h][p]!==g&&(this.v.i[h][p]=g,this.pv.i[h][p]=g,v=!0),g=e.o[h][p],this.v.o[h][p]!==g&&(this.v.o[h][p]=g,this.pv.o[h][p]=g,v=!0),g=e.v[h][p],this.v.v[h][p]!==g&&(this.v.v[h][p]=g,this.pv.v[h][p]=g,v=!0)):(g=e.i[h][p]+(s.i[h][p]-e.i[h][p])*c,this.v.i[h][p]!==g&&(this.v.i[h][p]=g,this.pv.i[h][p]=g,v=!0),g=e.o[h][p]+(s.o[h][p]-e.o[h][p])*c,this.v.o[h][p]!==g&&(this.v.o[h][p]=g,this.pv.o[h][p]=g,v=!0),g=e.v[h][p]+(s.v[h][p]-e.v[h][p])*c,this.v.v[h][p]!==g&&(this.v.v[h][p]=g,this.pv.v[h][p]=g,v=!0));this.mdf=v,this.v.c=e.c,this.paths=this.localShapeCollection}this.lastFrame=t,this.frameId=this.elem.globalData.frameId}}function e(){return this.v}function s(){this.paths=this.localShapeCollection,this.k||(this.mdf=!1)}function i(t,i,a){this.comp=t.comp,this.k=!1,this.mdf=!1,this.v=Bt.newShape();var r=3===a?i.pt.k:i.ks.k;this.v.v=r.v,this.v.i=r.i,this.v.o=r.o,this.v.c=r.c,this.v._length=this.v.v.length,this.getValue=e,this.pv=Bt.clone(this.v),this.localShapeCollection=Gt.newShapeCollection(),this.paths=this.localShapeCollection,this.paths.addShape(this.v),this.reset=s}function a(e,i,a){this.comp=e.comp,this.elem=e,this.offsetTime=e.data.st,this._lastIndex=0,this.getValue=t,this.keyframes=3===a?i.pt.k:i.ks.k,this.k=!0,this.kf=!0;{var r=this.keyframes[0].s[0].i.length;this.keyframes[0].s[0].i[0].length}this.v=Bt.newShape(),this.v.setPathData(this.keyframes[0].s[0].c,r),this.pv=Bt.clone(this.v),this.localShapeCollection=Gt.newShapeCollection(),this.paths=this.localShapeCollection,this.paths.addShape(this.v),this.lastFrame=n,this.reset=s}function r(t,e,s,r){var n;if(3===s||4===s){var l=3===s?e.pt:e.ks,f=l.k;n=1===l.a||f.length?new a(t,e,s):new i(t,e,s)}else 5===s?n=new p(t,e):6===s?n=new h(t,e):7===s&&(n=new o(t,e));return n.k&&r.push(n),n}var n=-999999,h=function(){function t(){var t=this.p.v[0],e=this.p.v[1],s=this.s.v[0]/2,a=this.s.v[1]/2;3!==this.d?(this.v.v[0][0]=t,this.v.v[0][1]=e-a,this.v.v[1][0]=t+s,this.v.v[1][1]=e,this.v.v[2][0]=t,this.v.v[2][1]=e+a,this.v.v[3][0]=t-s,this.v.v[3][1]=e,this.v.i[0][0]=t-s*i,this.v.i[0][1]=e-a,this.v.i[1][0]=t+s,this.v.i[1][1]=e-a*i,this.v.i[2][0]=t+s*i,this.v.i[2][1]=e+a,this.v.i[3][0]=t-s,this.v.i[3][1]=e+a*i,this.v.o[0][0]=t+s*i,this.v.o[0][1]=e-a,this.v.o[1][0]=t+s,this.v.o[1][1]=e+a*i,this.v.o[2][0]=t-s*i,this.v.o[2][1]=e+a,this.v.o[3][0]=t-s,this.v.o[3][1]=e-a*i):(this.v.v[0][0]=t,this.v.v[0][1]=e-a,this.v.v[1][0]=t-s,this.v.v[1][1]=e,this.v.v[2][0]=t,this.v.v[2][1]=e+a,this.v.v[3][0]=t+s,this.v.v[3][1]=e,this.v.i[0][0]=t+s*i,this.v.i[0][1]=e-a,this.v.i[1][0]=t-s,this.v.i[1][1]=e-a*i,this.v.i[2][0]=t-s*i,this.v.i[2][1]=e+a,this.v.i[3][0]=t+s,this.v.i[3][1]=e+a*i,this.v.o[0][0]=t-s*i,this.v.o[0][1]=e-a,this.v.o[1][0]=t-s,this.v.o[1][1]=e+a*i,this.v.o[2][0]=t+s*i,this.v.o[2][1]=e+a,this.v.o[3][0]=t+s,this.v.o[3][1]=e-a*i)}function e(t){var e,s=this.dynamicProperties.length;if(this.elem.globalData.frameId!==this.frameId){for(this.mdf=!1,this.frameId=this.elem.globalData.frameId,e=0;s>e;e+=1)this.dynamicProperties[e].getValue(t),this.dynamicProperties[e].mdf&&(this.mdf=!0);this.mdf&&this.convertEllToPath()}}var i=Ft;return function(i,a){this.v=Bt.newShape(),this.v.setPathData(!0,4),this.localShapeCollection=Gt.newShapeCollection(),this.paths=this.localShapeCollection,this.localShapeCollection.addShape(this.v),this.d=a.d,this.dynamicProperties=[],this.elem=i,this.comp=i.comp,this.frameId=-1,this.mdf=!1,this.getValue=e,this.convertEllToPath=t,this.reset=s,this.p=It.getProp(i,a.p,1,0,this.dynamicProperties),this.s=It.getProp(i,a.s,1,0,this.dynamicProperties),this.dynamicProperties.length?this.k=!0:this.convertEllToPath()}}(),o=function(){function t(){var t,e=Math.floor(this.pt.v),s=2*Math.PI/e,i=this.or.v,a=this.os.v,r=2*Math.PI*i/(4*e),n=-Math.PI/2,h=3===this.data.d?-1:1;for(n+=this.r.v,this.v._length=0,t=0;e>t;t+=1){var o=i*Math.cos(n),p=i*Math.sin(n),l=0===o&&0===p?0:p/Math.sqrt(o*o+p*p),f=0===o&&0===p?0:-o/Math.sqrt(o*o+p*p);o+=+this.p.v[0],p+=+this.p.v[1],this.v.setTripleAt(o,p,o-l*r*a*h,p-f*r*a*h,o+l*r*a*h,p+f*r*a*h,t,!0),n+=s*h}this.paths.length=0,this.paths[0]=this.v}function e(){var t,e,s,i,a=2*Math.floor(this.pt.v),r=2*Math.PI/a,n=!0,h=this.or.v,o=this.ir.v,p=this.os.v,l=this.is.v,f=2*Math.PI*h/(2*a),m=2*Math.PI*o/(2*a),d=-Math.PI/2;d+=this.r.v;var c=3===this.data.d?-1:1;for(this.v._length=0,t=0;a>t;t+=1){e=n?h:o,s=n?p:l,i=n?f:m;var u=e*Math.cos(d),g=e*Math.sin(d),v=0===u&&0===g?0:g/Math.sqrt(u*u+g*g),y=0===u&&0===g?0:-u/Math.sqrt(u*u+g*g);u+=+this.p.v[0],g+=+this.p.v[1],this.v.setTripleAt(u,g,u-v*i*s*c,g-y*i*s*c,u+v*i*s*c,g+y*i*s*c,t,!0),n=!n,d+=r*c}}function i(){if(this.elem.globalData.frameId!==this.frameId){this.mdf=!1,this.frameId=this.elem.globalData.frameId;var t,e=this.dynamicProperties.length;for(t=0;e>t;t+=1)this.dynamicProperties[t].getValue(),this.dynamicProperties[t].mdf&&(this.mdf=!0);this.mdf&&this.convertToPath()}}return function(a,r){this.v=Bt.newShape(),this.v.setPathData(!0,0),this.elem=a,this.comp=a.comp,this.data=r,this.frameId=-1,this.d=r.d,this.dynamicProperties=[],this.mdf=!1,this.getValue=i,this.reset=s,1===r.sy?(this.ir=It.getProp(a,r.ir,0,0,this.dynamicProperties),this.is=It.getProp(a,r.is,0,.01,this.dynamicProperties),this.convertToPath=e):this.convertToPath=t,this.pt=It.getProp(a,r.pt,0,0,this.dynamicProperties),this.p=It.getProp(a,r.p,1,0,this.dynamicProperties),this.r=It.getProp(a,r.r,0,St,this.dynamicProperties),this.or=It.getProp(a,r.or,0,0,this.dynamicProperties),this.os=It.getProp(a,r.os,0,.01,this.dynamicProperties),this.localShapeCollection=Gt.newShapeCollection(),this.localShapeCollection.addShape(this.v),this.paths=this.localShapeCollection,this.dynamicProperties.length?this.k=!0:this.convertToPath()}}(),p=function(){function t(t){if(this.elem.globalData.frameId!==this.frameId){this.mdf=!1,this.frameId=this.elem.globalData.frameId;var e,s=this.dynamicProperties.length;for(e=0;s>e;e+=1)this.dynamicProperties[e].getValue(t),this.dynamicProperties[e].mdf&&(this.mdf=!0);this.mdf&&this.convertRectToPath()}}function e(){var t=this.p.v[0],e=this.p.v[1],s=this.s.v[0]/2,i=this.s.v[1]/2,a=Mt(s,i,this.r.v),r=a*(1-Ft);this.v._length=0,2===this.d||1===this.d?(this.v.setTripleAt(t+s,e-i+a,t+s,e-i+a,t+s,e-i+r,0,!0),this.v.setTripleAt(t+s,e+i-a,t+s,e+i-r,t+s,e+i-a,1,!0),0!==a?(this.v.setTripleAt(t+s-a,e+i,t+s-a,e+i,t+s-r,e+i,2,!0),this.v.setTripleAt(t-s+a,e+i,t-s+r,e+i,t-s+a,e+i,3,!0),this.v.setTripleAt(t-s,e+i-a,t-s,e+i-a,t-s,e+i-r,4,!0),this.v.setTripleAt(t-s,e-i+a,t-s,e-i+r,t-s,e-i+a,5,!0),this.v.setTripleAt(t-s+a,e-i,t-s+a,e-i,t-s+r,e-i,6,!0),this.v.setTripleAt(t+s-a,e-i,t+s-r,e-i,t+s-a,e-i,7,!0)):(this.v.setTripleAt(t-s,e+i,t-s+r,e+i,t-s,e+i,2),this.v.setTripleAt(t-s,e-i,t-s,e-i+r,t-s,e-i,3))):(this.v.setTripleAt(t+s,e-i+a,t+s,e-i+r,t+s,e-i+a,0,!0),0!==a?(this.v.setTripleAt(t+s-a,e-i,t+s-a,e-i,t+s-r,e-i,1,!0),this.v.setTripleAt(t-s+a,e-i,t-s+r,e-i,t-s+a,e-i,2,!0),this.v.setTripleAt(t-s,e-i+a,t-s,e-i+a,t-s,e-i+r,3,!0),this.v.setTripleAt(t-s,e+i-a,t-s,e+i-r,t-s,e+i-a,4,!0),this.v.setTripleAt(t-s+a,e+i,t-s+a,e+i,t-s+r,e+i,5,!0),this.v.setTripleAt(t+s-a,e+i,t+s-r,e+i,t+s-a,e+i,6,!0),this.v.setTripleAt(t+s,e+i-a,t+s,e+i-a,t+s,e+i-r,7,!0)):(this.v.setTripleAt(t-s,e-i,t-s+r,e-i,t-s,e-i,1,!0),this.v.setTripleAt(t-s,e+i,t-s,e+i-r,t-s,e+i,2,!0),this.v.setTripleAt(t+s,e+i,t+s-r,e+i,t+s,e+i,3,!0)))}return function(i,a){this.v=Bt.newShape(),this.v.c=!0,this.localShapeCollection=Gt.newShapeCollection(),this.localShapeCollection.addShape(this.v),this.paths=this.localShapeCollection,this.elem=i,this.comp=i.comp,this.frameId=-1,this.d=a.d,this.dynamicProperties=[],this.mdf=!1,this.getValue=t,this.convertRectToPath=e,this.reset=s,this.p=It.getProp(i,a.p,1,0,this.dynamicProperties),this.s=It.getProp(i,a.s,1,0,this.dynamicProperties),this.r=It.getProp(i,a.r,0,0,this.dynamicProperties),this.dynamicProperties.length?this.k=!0:this.convertRectToPath()}}(),l={};return l.getShapeProp=r,l}(),Nt=function(){function t(t,e){i[t]||(i[t]=e)}function e(t,e,s,a){return new i[t](e,s,a)}var s={},i={};return s.registerModifier=t,s.getModifier=e,s}();S.prototype.initModifierProperties=function(){},S.prototype.addShapeToModifier=function(){},S.prototype.addShape=function(t){this.closed||(this.shapes.push({shape:t.sh,data:t,localShapeCollection:Gt.newShapeCollection()}),this.addShapeToModifier(t.sh))},S.prototype.init=function(t,e,s){this.elem=t,this.frameId=-1,this.shapes=[],this.dynamicProperties=[],this.mdf=!1,this.closed=!1,this.k=!1,this.isTrimming=!1,this.comp=t.comp,this.initModifierProperties(t,e),this.dynamicProperties.length?(this.k=!0,s.push(this)):this.getValue(!0)},A(S,F),F.prototype.processKeys=function(t){if(this.elem.globalData.frameId!==this.frameId||t){this.mdf=t?!0:!1,this.frameId=this.elem.globalData.frameId;var e,s=this.dynamicProperties.length;for(e=0;s>e;e+=1)this.dynamicProperties[e].getValue(),this.dynamicProperties[e].mdf&&(this.mdf=!0);if(this.mdf||t){var i=this.o.v%360/360;0>i&&(i+=1);var a=this.s.v+i,r=this.e.v+i;if(a>r){var n=a;a=r,r=n}this.sValue=a,this.eValue=r,this.oValue=i}}},F.prototype.initModifierProperties=function(t,e){this.sValue=0,this.eValue=0,this.oValue=0,this.getValue=this.processKeys,this.s=It.getProp(t,e.s,0,.01,this.dynamicProperties),this.e=It.getProp(t,e.e,0,.01,this.dynamicProperties),this.o=It.getProp(t,e.o,0,0,this.dynamicProperties),this.m=e.m,this.dynamicProperties.length||this.getValue(!0)},F.prototype.getSegmentsLength=function(t){var e,s=t.c,i=t.v,a=t.o,r=t.i,n=t._length,h=[],o=0;for(e=0;n-1>e;e+=1)h[e]=Ct.getBezierLength(i[e],i[e+1],a[e],r[e+1]),o+=h[e].addedLength;return s&&(h[e]=Ct.getBezierLength(i[e],i[0],a[e],r[0]),o+=h[e].addedLength),{lengths:h,totalLength:o}},F.prototype.calculateShapeEdges=function(t,e,s,i,a){var r=[];1>=e?r.push({s:t,e:e}):t>=1?r.push({s:t-1,e:e-1}):(r.push({s:t,e:1}),r.push({s:0,e:e-1}));var n,h,o=[],p=r.length;for(n=0;p>n;n+=1)if(h=r[n],h.e*a<i||h.s*a>i+s);else{var l,f;l=h.s*a<=i?0:(h.s*a-i)/s,f=h.e*a>=i+s?1:(h.e*a-i)/s,o.push([l,f])}return o.length||o.push([0,0]),o},F.prototype.processShapes=function(t){var e,s,i,a,r,n,h,o=this.shapes.length,p=this.sValue,l=this.eValue,f=0;if(l===p)for(s=0;o>s;s+=1)this.shapes[s].localShapeCollection.releaseShapes(),this.shapes[s].shape.mdf=!0,this.shapes[s].shape.paths=this.shapes[s].localShapeCollection;else if(1===l&&0===p||0===l&&1===p){if(this.mdf)for(s=0;o>s;s+=1)this.shapes[s].shape.mdf=!0}else{var m,d,c=[];for(s=0;o>s;s+=1)if(m=this.shapes[s],m.shape.mdf||this.mdf||t||2===this.m){if(e=m.shape.paths,a=e._length,h=0,!m.shape.mdf&&m.pathsData)h=m.totalShapeLength;else{for(r=[],i=0;a>i;i+=1)n=this.getSegmentsLength(e.shapes[i]),r.push(n),h+=n.totalLength;m.totalShapeLength=h,m.pathsData=r}f+=h,m.shape.mdf=!0}else m.shape.paths=m.localShapeCollection;var i,a,u=p,g=l,v=0;for(s=o-1;s>=0;s-=1)if(m=this.shapes[s],m.shape.mdf){if(d=m.localShapeCollection,d.releaseShapes(),2===this.m&&o>1){var y=this.calculateShapeEdges(p,l,m.totalShapeLength,v,f);v+=m.totalShapeLength}else y=[[u,g]];for(a=y.length,i=0;a>i;i+=1){u=y[i][0],g=y[i][1],c.length=0,1>=g?c.push({s:m.totalShapeLength*u,e:m.totalShapeLength*g}):u>=1?c.push({s:m.totalShapeLength*(u-1),e:m.totalShapeLength*(g-1)}):(c.push({s:m.totalShapeLength*u,e:m.totalShapeLength}),c.push({s:0,e:m.totalShapeLength*(g-1)}));var b=this.addShapes(m,c[0]);if(c[0].s!==c[0].e){if(c.length>1)if(m.shape.v.c){var k=b.pop();this.addPaths(b,d),b=this.addShapes(m,c[1],k)}else this.addPaths(b,d),b=this.addShapes(m,c[1]);this.addPaths(b,d)}}m.shape.paths=d}}this.dynamicProperties.length||(this.mdf=!1)},F.prototype.addPaths=function(t,e){var s,i=t.length;for(s=0;i>s;s+=1)e.addShape(t[s])},F.prototype.addSegment=function(t,e,s,i,a,r,n){a.setXYAt(e[0],e[1],"o",r),a.setXYAt(s[0],s[1],"i",r+1),n&&a.setXYAt(t[0],t[1],"v",r),a.setXYAt(i[0],i[1],"v",r+1)},F.prototype.addShapes=function(t,e,s){var i,a,r,n,h,o,p,l,f=t.pathsData,m=t.shape.paths.shapes,d=t.shape.paths._length,c=0,u=[],g=!0;for(s?(h=s._length,l=s._length):(s=Bt.newShape(),h=0,l=0),u.push(s),i=0;d>i;i+=1){for(o=f[i].lengths,s.c=m[i].c,r=m[i].c?o.length:o.length+1,a=1;r>a;a+=1)if(n=o[a-1],c+n.addedLength<e.s)c+=n.addedLength,s.c=!1;else{if(c>e.e){s.c=!1;break}e.s<=c&&e.e>=c+n.addedLength?(this.addSegment(m[i].v[a-1],m[i].o[a-1],m[i].i[a],m[i].v[a],s,h,g),g=!1):(p=Ct.getNewSegment(m[i].v[a-1],m[i].v[a],m[i].o[a-1],m[i].i[a],(e.s-c)/n.addedLength,(e.e-c)/n.addedLength,o[a-1]),this.addSegment(p.pt1,p.pt3,p.pt4,p.pt2,s,h,g),g=!1,s.c=!1),c+=n.addedLength,h+=1}if(m[i].c){if(n=o[a-1],c<=e.e){var v=o[a-1].addedLength;

e.s<=c&&e.e>=c+v?(this.addSegment(m[i].v[a-1],m[i].o[a-1],m[i].i[0],m[i].v[0],s,h,g),g=!1):(p=Ct.getNewSegment(m[i].v[a-1],m[i].v[0],m[i].o[a-1],m[i].i[0],(e.s-c)/v,(e.e-c)/v,o[a-1]),this.addSegment(p.pt1,p.pt3,p.pt4,p.pt2,s,h,g),g=!1,s.c=!1)}else s.c=!1;c+=n.addedLength,h+=1}if(s._length&&(s.setXYAt(s.v[l][0],s.v[l][1],"i",l),s.setXYAt(s.v[s._length-1][0],s.v[s._length-1][1],"o",s._length-1)),c>e.e)break;d-1>i&&(s=Bt.newShape(),g=!0,u.push(s),h=0)}return u},Nt.registerModifier("tm",F),A(S,x),x.prototype.processKeys=function(t){if(this.elem.globalData.frameId!==this.frameId||t){this.mdf=t?!0:!1,this.frameId=this.elem.globalData.frameId;var e,s=this.dynamicProperties.length;for(e=0;s>e;e+=1)this.dynamicProperties[e].getValue(),this.dynamicProperties[e].mdf&&(this.mdf=!0)}},x.prototype.initModifierProperties=function(t,e){this.getValue=this.processKeys,this.rd=It.getProp(t,e.r,0,null,this.dynamicProperties),this.dynamicProperties.length||this.getValue(!0)},x.prototype.processPath=function(t,e){var s=Bt.newShape();s.c=t.c;var i,a,r,n,h,o,p,l,f,m,d,c,u,g=t._length,v=0;for(i=0;g>i;i+=1)a=t.v[i],n=t.o[i],r=t.i[i],a[0]===n[0]&&a[1]===n[1]&&a[0]===r[0]&&a[1]===r[1]?0!==i&&i!==g-1||t.c?(h=0===i?t.v[g-1]:t.v[i-1],o=Math.sqrt(Math.pow(a[0]-h[0],2)+Math.pow(a[1]-h[1],2)),p=o?Math.min(o/2,e)/o:0,l=c=a[0]+(h[0]-a[0])*p,f=u=a[1]-(a[1]-h[1])*p,m=l-(l-a[0])*Ft,d=f-(f-a[1])*Ft,s.setTripleAt(l,f,m,d,c,u,v),v+=1,h=i===g-1?t.v[0]:t.v[i+1],o=Math.sqrt(Math.pow(a[0]-h[0],2)+Math.pow(a[1]-h[1],2)),p=o?Math.min(o/2,e)/o:0,l=m=a[0]+(h[0]-a[0])*p,f=d=a[1]+(h[1]-a[1])*p,c=l-(l-a[0])*Ft,u=f-(f-a[1])*Ft,s.setTripleAt(l,f,m,d,c,u,v),v+=1):(s.setTripleAt(a[0],a[1],n[0],n[1],r[0],r[1],v),v+=1):(s.setTripleAt(t.v[i][0],t.v[i][1],t.o[i][0],t.o[i][1],t.i[i][0],t.i[i][1],v),v+=1);return s},x.prototype.processShapes=function(t){var e,s,i,a,r=this.shapes.length,n=this.rd.v;if(0!==n){var h,o,p;for(s=0;r>s;s+=1){if(h=this.shapes[s],o=h.shape.paths,p=h.localShapeCollection,h.shape.mdf||this.mdf||t)for(p.releaseShapes(),h.shape.mdf=!0,e=h.shape.paths.shapes,a=h.shape.paths._length,i=0;a>i;i+=1)p.addShape(this.processPath(e[i],n));h.shape.paths=h.localShapeCollection}}this.dynamicProperties.length||(this.mdf=!1)},Nt.registerModifier("rd",x),A(S,D),D.prototype.processKeys=function(t){if(this.elem.globalData.frameId!==this.frameId||t){this.mdf=t?!0:!1,this.frameId=this.elem.globalData.frameId;var e,s=this.dynamicProperties.length;for(e=0;s>e;e+=1)this.dynamicProperties[e].getValue(),this.dynamicProperties[e].mdf&&(this.mdf=!0)}},D.prototype.initModifierProperties=function(t,e){this.getValue=this.processKeys,this.c=It.getProp(t,e.c,0,null,this.dynamicProperties),this.o=It.getProp(t,e.o,0,null,this.dynamicProperties),this.tr=It.getProp(t,e.tr,2,null,this.dynamicProperties),this.dynamicProperties.length||this.getValue(!0),this.pMatrix=new k,this.rMatrix=new k,this.sMatrix=new k,this.tMatrix=new k,this.matrix=new k},D.prototype.applyTransforms=function(t,e,s,i,a,r){var n=r?-1:1,h=i.s.v[0]+(1-i.s.v[0])*(1-a),o=i.s.v[1]+(1-i.s.v[1])*(1-a);t.translate(i.p.v[0]*n*a,i.p.v[1]*n*a,i.p.v[2]),e.translate(-i.a.v[0],-i.a.v[1],i.a.v[2]),e.rotate(-i.r.v*n*a),e.translate(i.a.v[0],i.a.v[1],i.a.v[2]),s.translate(-i.a.v[0],-i.a.v[1],i.a.v[2]),s.scale(r?1/h:h,r?1/o:o),s.translate(i.a.v[0],i.a.v[1],i.a.v[2])},D.prototype.processShapes=function(t){this.dynamicProperties.length||(this.mdf=!1);var e,s,i,a,r,n,h,o,p,l,f,m,d,c,u=this.shapes.length,g=Math.ceil(this.c.v),v=this.o.v,y=v%1,b=v>0?Math.floor(v):Math.ceil(v),k=(this.tr.v.props,this.pMatrix.props),P=this.rMatrix.props,A=this.sMatrix.props,M=0;for(e=0;u>e;e+=1){if(a=this.shapes[e],r=a.localShapeCollection,a.shape.mdf||this.mdf||t){if(r.releaseShapes(),a.shape.mdf=!0,o=a.shape.paths,p=o.shapes,i=o._length,M=0,this.pMatrix.reset(),this.rMatrix.reset(),this.sMatrix.reset(),this.tMatrix.reset(),this.matrix.reset(),v>0){for(;b>M;)this.applyTransforms(this.pMatrix,this.rMatrix,this.sMatrix,this.tr,1,!1),M+=1;y&&(this.applyTransforms(this.pMatrix,this.rMatrix,this.sMatrix,this.tr,y,!1),M+=y)}else if(0>b){for(;M>b;)this.applyTransforms(this.pMatrix,this.rMatrix,this.sMatrix,this.tr,1,!0),M-=1;y&&(this.applyTransforms(this.pMatrix,this.rMatrix,this.sMatrix,this.tr,-y,!0),M-=y)}for(s=0;i>s;s+=1)for(n=p[s],h=0;g>h;h+=1){if(0!==h&&this.applyTransforms(this.pMatrix,this.rMatrix,this.sMatrix,this.tr,1,!1),a.data.transformers){for(a.data.lvl=0,c=0,f=a.data.elements.length,l=0;f>l;l+=1)c=Math.max(c,a.data.elements[l].st.lvl);for(d=a.data.transformers,f=d.length,l=f-1;l>=c;l-=1)m=d[l].mProps.v.props,this.matrix.transform(m[0],m[1],m[2],m[3],m[4],m[5],m[6],m[7],m[8],m[9],m[10],m[11],m[12],m[13],m[14],m[15])}0!==M&&(this.matrix.transform(P[0],P[1],P[2],P[3],P[4],P[5],P[6],P[7],P[8],P[9],P[10],P[11],P[12],P[13],P[14],P[15]),this.matrix.transform(A[0],A[1],A[2],A[3],A[4],A[5],A[6],A[7],A[8],A[9],A[10],A[11],A[12],A[13],A[14],A[15]),this.matrix.transform(k[0],k[1],k[2],k[3],k[4],k[5],k[6],k[7],k[8],k[9],k[10],k[11],k[12],k[13],k[14],k[15])),r.addShape(this.processPath(n,this.matrix)),this.matrix.reset(),M+=1}}a.shape.paths=r}},D.prototype.processPath=function(t,e){var s=Bt.clone(t,e);return s},Nt.registerModifier("rp",D),C.prototype.addShape=function(t){this._length===this._maxLength&&(this.shapes=this.shapes.concat(Array.apply(null,{length:this._maxLength})),this._maxLength*=2),this.shapes[this._length]=t,this._length+=1},C.prototype.releaseShapes=function(){var t;for(t=0;t<this._length;t+=1)Bt.release(this.shapes[t]);this._length=0};var Vt=function(){function t(){this.loadedAssets+=1,this.loadedAssets===this.totalImages}function e(t){var e="";if(this.assetsPath){var s=t.p;-1!==s.indexOf("images/")&&(s=s.split("/")[1]),e=this.assetsPath+s}else e=this.path,e+=t.u?t.u:"",e+=t.p;return e}function s(e){var s=document.createElement("img");s.addEventListener("load",t.bind(this),!1),s.addEventListener("error",t.bind(this),!1),s.src=e}function i(t){this.totalAssets=t.length;var i;for(i=0;i<this.totalAssets;i+=1)t[i].layers||(s.bind(this)(e.bind(this)(t[i])),this.totalImages+=1)}function a(t){this.path=t||""}function r(t){this.assetsPath=t||""}return function(){this.loadAssets=i,this.setAssetsPath=r,this.setPath=a,this.assetsPath="",this.path="",this.totalAssets=0,this.totalImages=0,this.loadedAssets=0}}(),zt=function(){var t={maskType:!0};return(/MSIE 10/i.test(navigator.userAgent)||/MSIE 9/i.test(navigator.userAgent)||/rv:11.0/i.test(navigator.userAgent)||/Edge\/\d./i.test(navigator.userAgent))&&(t.maskType=!1),t}(),Rt=function(){function t(t){var e=document.createElementNS(vt,"filter");return e.setAttribute("id",t),e.setAttribute("filterUnits","objectBoundingBox"),e.setAttribute("x","0%"),e.setAttribute("y","0%"),e.setAttribute("width","100%"),e.setAttribute("height","100%"),e}function e(){var t=document.createElementNS(vt,"feColorMatrix");return t.setAttribute("type","matrix"),t.setAttribute("color-interpolation-filters","sRGB"),t.setAttribute("values","0 0 0 1 0  0 0 0 1 0  0 0 0 1 0  0 0 0 0 1"),t}var s={};return s.createFilter=t,s.createAlphaToLuminanceFilter=e,s}(),jt=function(){function t(t){return t.concat(Array.apply(null,{length:t.length}))}return{"double":t}}(),Ot=function(){function t(){var t;return i?(i-=1,t=r[i]):t=[.1,.1],t}function e(t){i===a&&(r=jt["double"](r),a=2*a),r[i]=t,i+=1}var s={newPoint:t,release:e},i=0,a=8,r=Array.apply(null,{length:a});return s}(),Bt=function(){function t(){var t;return r?(r-=1,t=h[r]):t=new w,t}function e(t){r===n&&(h=jt["double"](h),n=2*n);var e,s=t._length;for(e=0;s>e;e+=1)Ot.release(t.v[e]),Ot.release(t.i[e]),Ot.release(t.o[e]),t.v[e]=null,t.i[e]=null,t.o[e]=null;t._length=0,t.c=!1,h[r]=t,r+=1}function s(t,s){for(;s--;)e(t[s])}function i(e,s){var i,a=e._length,r=t();r._length=e._length,r.c=e.c;var n;for(i=0;a>i;i+=1)s?(n=s.applyToPointArray(e.v[i][0],e.v[i][1],0,2),r.setXYAt(n[0],n[1],"v",i),Ot.release(n),n=s.applyToPointArray(e.o[i][0],e.o[i][1],0,2),r.setXYAt(n[0],n[1],"o",i),Ot.release(n),n=s.applyToPointArray(e.i[i][0],e.i[i][1],0,2),r.setXYAt(n[0],n[1],"i",i),Ot.release(n)):r.setTripleAt(e.v[i][0],e.v[i][1],e.o[i][0],e.o[i][1],e.i[i][0],e.i[i][1],i);return r}var a={clone:i,newShape:t,release:e,releaseArray:s},r=0,n=4,h=Array.apply(null,{length:n});return a}(),Gt=function(){function t(){var t;return a?(a-=1,t=n[a]):t=new C,t}function e(t){var e,s=t._length;for(e=0;s>e;e+=1)Bt.release(t.shapes[e]);t._length=0,a===r&&(n=jt["double"](n),r=2*r),n[a]=t,a+=1}function s(t,s){e(t),a===r&&(n=jt["double"](n),r=2*r),n[a]=t,a+=1}var i={newShapeCollection:t,release:e,clone:s},a=0,r=4,n=Array.apply(null,{length:r});return i}();_.prototype.checkLayers=function(t){var e,s,i=this.layers.length;for(this.completeLayers=!0,e=i-1;e>=0;e--)this.elements[e]||(s=this.layers[e],s.ip-s.st<=t-this.layers[e].st&&s.op-s.st>t-this.layers[e].st&&this.buildItem(e)),this.completeLayers=this.elements[e]?this.completeLayers:!1;this.checkPendingElements()},_.prototype.createItem=function(t){switch(t.ty){case 2:return this.createImage(t);case 0:return this.createComp(t);case 1:return this.createSolid(t);case 4:return this.createShape(t);case 5:return this.createText(t);case 13:return this.createCamera(t);case 99:return null}return this.createBase(t)},_.prototype.createCamera=function(){throw new Error("You're using a 3d camera. Try the html renderer.")},_.prototype.buildAllItems=function(){var t,e=this.layers.length;for(t=0;e>t;t+=1)this.buildItem(t);this.checkPendingElements()},_.prototype.includeLayers=function(t){this.completeLayers=!1;var e,s,i=t.length,a=this.layers.length;for(e=0;i>e;e+=1)for(s=0;a>s;){if(this.layers[s].id==t[e].id){this.layers[s]=t[e];break}s+=1}},_.prototype.setProjectInterface=function(t){this.globalData.projectInterface=t},_.prototype.initItems=function(){this.globalData.progressiveLoad||this.buildAllItems()},_.prototype.buildElementParenting=function(t,e,s){s=s||[];for(var i=this.elements,a=this.layers,r=0,n=a.length;n>r;)a[r].ind==e&&(i[r]&&i[r]!==!0?void 0!==a[r].parent?(s.push(i[r]),i[r]._isParent=!0,this.buildElementParenting(t,a[r].parent,s)):(s.push(i[r]),i[r]._isParent=!0,t.setHierarchy(s)):(this.buildItem(r),this.addPendingElement(t))),r+=1},_.prototype.addPendingElement=function(t){this.pendingElements.push(t)},A(_,T),T.prototype.createBase=function(t){return new N(t,this.layerElement,this.globalData,this)},T.prototype.createShape=function(t){return new H(t,this.layerElement,this.globalData,this)},T.prototype.createText=function(t){return new z(t,this.layerElement,this.globalData,this)},T.prototype.createImage=function(t){return new W(t,this.layerElement,this.globalData,this)},T.prototype.createComp=function(t){return new Y(t,this.layerElement,this.globalData,this)},T.prototype.createSolid=function(t){return new U(t,this.layerElement,this.globalData,this)},T.prototype.configAnimation=function(t){this.layerElement=document.createElementNS(vt,"svg"),this.layerElement.setAttribute("xmlns","http://www.w3.org/2000/svg"),this.layerElement.setAttribute("width",t.w),this.layerElement.setAttribute("height",t.h),this.layerElement.setAttribute("viewBox","0 0 "+t.w+" "+t.h),this.layerElement.setAttribute("preserveAspectRatio",this.renderConfig.preserveAspectRatio),this.layerElement.style.width="100%",this.layerElement.style.height="100%",this.animationItem.wrapper.appendChild(this.layerElement);var e=document.createElementNS(vt,"defs");this.globalData.defs=e,this.layerElement.appendChild(e),this.globalData.getAssetData=this.animationItem.getAssetData.bind(this.animationItem),this.globalData.getAssetsPath=this.animationItem.getAssetsPath.bind(this.animationItem),this.globalData.progressiveLoad=this.renderConfig.progressiveLoad,this.globalData.frameId=0,this.globalData.nm=t.nm,this.globalData.compSize={w:t.w,h:t.h},this.data=t,this.globalData.frameRate=t.fr;var s=document.createElementNS(vt,"clipPath"),i=document.createElementNS(vt,"rect");i.setAttribute("width",t.w),i.setAttribute("height",t.h),i.setAttribute("x",0),i.setAttribute("y",0);var a="animationMask_"+m(10);s.setAttribute("id",a),s.appendChild(i);var r=document.createElementNS(vt,"g");r.setAttribute("clip-path","url(#"+a+")"),this.layerElement.appendChild(r),e.appendChild(s),this.layerElement=r,this.layers=t.layers,this.globalData.fontManager=new Tt,this.globalData.fontManager.addChars(t.chars),this.globalData.fontManager.addFonts(t.fonts,e),this.elements=Array.apply(null,{length:t.layers.length})},T.prototype.destroy=function(){this.animationItem.wrapper.innerHTML="",this.layerElement=null,this.globalData.defs=null;var t,e=this.layers?this.layers.length:0;for(t=0;e>t;t++)this.elements[t]&&this.elements[t].destroy();this.elements.length=0,this.destroyed=!0,this.animationItem=null},T.prototype.updateContainerSize=function(){},T.prototype.buildItem=function(t){var e=this.elements;if(!e[t]&&99!=this.layers[t].ty){e[t]=!0;var s=this.createItem(this.layers[t]);e[t]=s,ut&&(0===this.layers[t].ty&&this.globalData.projectInterface.registerComposition(s),s.initExpressions()),this.appendElementInPos(s,t),this.layers[t].tt&&(this.elements[t-1]&&this.elements[t-1]!==!0?s.setMatte(e[t-1].layerId):(this.buildItem(t-1),this.addPendingElement(s)))}},T.prototype.checkPendingElements=function(){for(;this.pendingElements.length;){var t=this.pendingElements.pop();if(t.checkParenting(),t.data.tt)for(var e=0,s=this.elements.length;s>e;){if(this.elements[e]===t){t.setMatte(this.elements[e-1].layerId);break}e+=1}}},T.prototype.renderFrame=function(t){if(this.renderedFrame!=t&&!this.destroyed){null===t?t=this.renderedFrame:this.renderedFrame=t,this.globalData.frameNum=t,this.globalData.frameId+=1,this.globalData.projectInterface.currentFrame=t;var e,s=this.layers.length;for(this.completeLayers||this.checkLayers(t),e=s-1;e>=0;e--)(this.completeLayers||this.elements[e])&&this.elements[e].prepareFrame(t-this.layers[e].st);for(e=s-1;e>=0;e--)(this.completeLayers||this.elements[e])&&this.elements[e].renderFrame()}},T.prototype.appendElementInPos=function(t,e){var s=t.getBaseElement();if(s){for(var i,a=0;e>a;)this.elements[a]&&this.elements[a]!==!0&&this.elements[a].getBaseElement()&&(i=this.elements[a].getBaseElement()),a+=1;i?this.layerElement.insertBefore(s,i):this.layerElement.appendChild(s)}},T.prototype.hide=function(){this.layerElement.style.display="none"},T.prototype.show=function(){this.layerElement.style.display="block"},T.prototype.searchExtraCompositions=function(t){var e,s=t.length,i=document.createElementNS(vt,"g");for(e=0;s>e;e+=1)if(t[e].xt){var a=this.createComp(t[e],i,this.globalData.comp,null);a.initExpressions(),this.globalData.projectInterface.registerComposition(a)}},I.prototype.getMaskProperty=function(t){return this.viewData[t].prop},I.prototype.prepareFrame=function(){var t,e=this.dynamicProperties.length;for(t=0;e>t;t+=1)this.dynamicProperties[t].getValue()},I.prototype.renderFrame=function(t){var e,s=this.masksProperties.length;for(e=0;s>e;e++)if((this.viewData[e].prop.mdf||this.firstFrame)&&this.drawPath(this.masksProperties[e],this.viewData[e].prop.v,this.viewData[e]),(this.viewData[e].op.mdf||this.firstFrame)&&this.viewData[e].elem.setAttribute("fill-opacity",this.viewData[e].op.v),"n"!==this.masksProperties[e].mode&&(this.viewData[e].invRect&&(this.element.finalTransform.mProp.mdf||this.firstFrame)&&(this.viewData[e].invRect.setAttribute("x",-t.props[12]),this.viewData[e].invRect.setAttribute("y",-t.props[13])),this.storedData[e].x&&(this.storedData[e].x.mdf||this.firstFrame))){var i=this.storedData[e].expan;this.storedData[e].x.v<0?("erode"!==this.storedData[e].lastOperator&&(this.storedData[e].lastOperator="erode",this.storedData[e].elem.setAttribute("filter","url(#"+this.storedData[e].filterId+")")),i.setAttribute("radius",-this.storedData[e].x.v)):("dilate"!==this.storedData[e].lastOperator&&(this.storedData[e].lastOperator="dilate",this.storedData[e].elem.setAttribute("filter",null)),this.storedData[e].elem.setAttribute("stroke-width",2*this.storedData[e].x.v))}this.firstFrame=!1},I.prototype.getMaskelement=function(){return this.maskElement},I.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+" "},I.prototype.drawPath=function(t,e,s){var i,a,r=" M"+e.v[0][0]+","+e.v[0][1];for(a=e._length,i=1;a>i;i+=1)r+=" C"+gt(e.o[i-1][0])+","+gt(e.o[i-1][1])+" "+gt(e.i[i][0])+","+gt(e.i[i][1])+" "+gt(e.v[i][0])+","+gt(e.v[i][1]);e.c&&a>1&&(r+=" C"+gt(e.o[i-1][0])+","+gt(e.o[i-1][1])+" "+gt(e.i[0][0])+","+gt(e.i[0][1])+" "+gt(e.v[0][0])+","+gt(e.v[0][1])),s.lastPath!==r&&(s.elem&&(e.c?t.inv?s.elem.setAttribute("d",this.solidPath+r):s.elem.setAttribute("d",r):s.elem.setAttribute("d","")),s.lastPath=r)},I.prototype.getMask=function(t){for(var e=0,s=this.masksProperties.length;s>e;){if(this.masksProperties[e].nm===t)return{maskPath:this.viewData[e].prop.pv};e+=1}},I.prototype.destroy=function(){this.element=null,this.globalData=null,this.maskElement=null,this.data=null,this.paths=null,this.masksProperties=null},L.prototype.checkMasks=function(){if(!this.data.hasMask)return!1;for(var t=0,e=this.data.masksProperties.length;e>t;){if("n"!==this.data.masksProperties[t].mode&&this.data.masksProperties[t].cl!==!1)return!0;t+=1}return!1},L.prototype.checkParenting=function(){void 0!==this.data.parent&&this.comp.buildElementParenting(this,this.data.parent)},L.prototype.prepareFrame=function(t){this.data.ip-this.data.st<=t&&this.data.op-this.data.st>t?this.isVisible!==!0&&(this.elemMdf=!0,this.globalData.mdf=!0,this.isVisible=!0,this.firstFrame=!0,this.data.hasMask&&(this.maskManager.firstFrame=!0)):this.isVisible!==!1&&(this.elemMdf=!0,this.globalData.mdf=!0,this.isVisible=!1);var e,s=this.dynamicProperties.length;for(e=0;s>e;e+=1)(this.isVisible||this._isParent&&"transform"===this.dynamicProperties[e].type)&&(this.dynamicProperties[e].getValue(),this.dynamicProperties[e].mdf&&(this.elemMdf=!0,this.globalData.mdf=!0));return this.data.hasMask&&this.isVisible&&this.maskManager.prepareFrame(t*this.data.sr),this.currentFrameNum=t*this.data.sr,this.isVisible},L.prototype.globalToLocal=function(t){var e=[];e.push(this.finalTransform);for(var s=!0,i=this.comp;s;)i.finalTransform?(i.data.hasMask&&e.splice(0,0,i.finalTransform),i=i.comp):s=!1;var a,r,n=e.length;for(a=0;n>a;a+=1)r=e[a].mat.applyToPointArray(0,0,0),t=[t[0]-r[0],t[1]-r[1],0];return t},L.prototype.initExpressions=function(){this.layerInterface=LayerExpressionInterface(this),this.data.hasMask&&this.layerInterface.registerMaskInterface(this.maskManager);var t=EffectsExpressionInterface.createEffectsInterface(this,this.layerInterface);this.layerInterface.registerEffectsInterface(t),0===this.data.ty||this.data.xt?this.compInterface=CompExpressionInterface(this):4===this.data.ty?this.layerInterface.shapeInterface=ShapeExpressionInterface.createShapeInterface(this.shapesData,this.viewData,this.layerInterface):5===this.data.ty&&(this.layerInterface.textInterface=TextExpressionInterface(this))},L.prototype.setBlendMode=function(){var t="";switch(this.data.bm){case 1:t="multiply";break;case 2:t="screen";break;case 3:t="overlay";break;case 4:t="darken";break;case 5:t="lighten";break;case 6:t="color-dodge";break;case 7:t="color-burn";break;case 8:t="hard-light";break;case 9:t="soft-light";break;case 10:t="difference";break;case 11:t="exclusion";break;case 12:t="hue";break;case 13:t="saturation";break;case 14:t="color";break;case 15:t="luminosity"}var e=this.baseElement||this.layerElement;e.style["mix-blend-mode"]=t},L.prototype.init=function(){this.data.sr||(this.data.sr=1),this.dynamicProperties=[],this.data.ef&&(this.effects=new EffectsManager(this.data,this,this.dynamicProperties)),this.hidden=!1,this.firstFrame=!0,this.isVisible=!1,this._isParent=!1,this.currentFrameNum=-99999,this.lastNum=-99999,this.data.ks&&(this.finalTransform={mProp:It.getProp(this,this.data.ks,2,null,this.dynamicProperties),matMdf:!1,opMdf:!1,mat:new k,opacity:1},this.data.ao&&(this.finalTransform.mProp.autoOriented=!0),this.finalTransform.op=this.finalTransform.mProp.o,this.transform=this.finalTransform.mProp,11!==this.data.ty&&this.createElements(),this.data.hasMask&&this.addMasks(this.data)),this.elemMdf=!1},L.prototype.getType=function(){return this.type},L.prototype.resetHierarchy=function(){this.hierarchy?this.hierarchy.length=0:this.hierarchy=[]},L.prototype.getHierarchy=function(){return this.hierarchy||(this.hierarchy=[]),this.hierarchy},L.prototype.setHierarchy=function(t){this.hierarchy=t},L.prototype.getLayerSize=function(){return 5===this.data.ty?{w:this.data.textData.width,h:this.data.textData.height}:{w:this.data.width,h:this.data.height}},L.prototype.hide=function(){},L.prototype.mHelper=new k,P(L,N),N.prototype.createElements=function(){this.layerElement=document.createElementNS(vt,"g"),this.transformedElement=this.layerElement,this.data.hasMask&&(this.maskedElement=this.layerElement);var t=null;if(this.data.td){if(3==this.data.td||1==this.data.td){var e=document.createElementNS(vt,"mask");if(e.setAttribute("id",this.layerId),e.setAttribute("mask-type",3==this.data.td?"luminance":"alpha"),e.appendChild(this.layerElement),t=e,this.globalData.defs.appendChild(e),!zt.maskType&&1==this.data.td){e.setAttribute("mask-type","luminance");var s=m(10),i=Rt.createFilter(s);this.globalData.defs.appendChild(i),i.appendChild(Rt.createAlphaToLuminanceFilter());var a=document.createElementNS(vt,"g");a.appendChild(this.layerElement),t=a,e.appendChild(a),a.setAttribute("filter","url(#"+s+")")}}else if(2==this.data.td){var r=document.createElementNS(vt,"mask");r.setAttribute("id",this.layerId),r.setAttribute("mask-type","alpha");var n=document.createElementNS(vt,"g");r.appendChild(n);var s=m(10),i=Rt.createFilter(s),h=document.createElementNS(vt,"feColorMatrix");h.setAttribute("type","matrix"),h.setAttribute("color-interpolation-filters","sRGB"),h.setAttribute("values","1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 -1 1"),i.appendChild(h),this.globalData.defs.appendChild(i);var o=document.createElementNS(vt,"rect");if(o.setAttribute("width",this.comp.data.w),o.setAttribute("height",this.comp.data.h),o.setAttribute("x","0"),o.setAttribute("y","0"),o.setAttribute("fill","#ffffff"),o.setAttribute("opacity","0"),n.setAttribute("filter","url(#"+s+")"),n.appendChild(o),n.appendChild(this.layerElement),t=n,!zt.maskType){r.setAttribute("mask-type","luminance"),i.appendChild(Rt.createAlphaToLuminanceFilter());var a=document.createElementNS(vt,"g");n.appendChild(o),a.appendChild(this.layerElement),t=a,n.appendChild(a)}this.globalData.defs.appendChild(r)}}else(this.data.hasMask||this.data.tt)&&this.data.tt?(this.matteElement=document.createElementNS(vt,"g"),this.matteElement.appendChild(this.layerElement),t=this.matteElement,this.baseElement=this.matteElement):this.baseElement=this.layerElement;if(!this.data.ln&&!this.data.cl||4!==this.data.ty&&0!==this.data.ty||(this.data.ln&&this.layerElement.setAttribute("id",this.data.ln),this.data.cl&&this.layerElement.setAttribute("class",this.data.cl)),0===this.data.ty){var p=document.createElementNS(vt,"clipPath"),l=document.createElementNS(vt,"path");l.setAttribute("d","M0,0 L"+this.data.w+",0 L"+this.data.w+","+this.data.h+" L0,"+this.data.h+"z");var f="cp_"+m(8);if(p.setAttribute("id",f),p.appendChild(l),this.globalData.defs.appendChild(p),this.checkMasks()){var d=document.createElementNS(vt,"g");d.setAttribute("clip-path","url(#"+f+")"),d.appendChild(this.layerElement),this.transformedElement=d,t?t.appendChild(this.transformedElement):this.baseElement=this.transformedElement}else this.layerElement.setAttribute("clip-path","url(#"+f+")")}0!==this.data.bm&&this.setBlendMode(),this.layerElement!==this.parentContainer&&(this.placeholder=null),this.data.ef&&(this.effectsManager=new q(this)),this.checkParenting()},N.prototype.setBlendMode=L.prototype.setBlendMode,N.prototype.renderFrame=function(t){if(3===this.data.ty||this.data.hd||!this.isVisible)return!1;this.lastNum=this.currentFrameNum,this.finalTransform.opMdf=this.firstFrame||this.finalTransform.op.mdf,this.finalTransform.matMdf=this.firstFrame||this.finalTransform.mProp.mdf,this.finalTransform.opacity=this.finalTransform.op.v;var e,s=this.finalTransform.mat;if(this.hierarchy){var i=0,a=this.hierarchy.length;if(!this.finalTransform.matMdf)for(;a>i;){if(this.hierarchy[i].finalTransform.mProp.mdf){this.finalTransform.matMdf=!0;break}i+=1}if(this.finalTransform.matMdf)for(e=this.finalTransform.mProp.v.props,s.cloneFromProps(e),i=0;a>i;i+=1)e=this.hierarchy[i].finalTransform.mProp.v.props,s.transform(e[0],e[1],e[2],e[3],e[4],e[5],e[6],e[7],e[8],e[9],e[10],e[11],e[12],e[13],e[14],e[15])}else this.isVisible&&(s=this.finalTransform.mProp.v);return this.finalTransform.matMdf&&this.layerElement&&this.transformedElement.setAttribute("transform",s.to2dCSS()),this.finalTransform.opMdf&&this.layerElement&&this.transformedElement.setAttribute("opacity",this.finalTransform.op.v),this.data.hasMask&&this.maskManager.renderFrame(s),this.effectsManager&&this.effectsManager.renderFrame(this.firstFrame),this.isVisible},N.prototype.destroy=function(){this.layerElement=null,this.parentContainer=null,this.matteElement&&(this.matteElement=null),this.maskManager&&this.maskManager.destroy()},N.prototype.getBaseElement=function(){return this.baseElement},N.prototype.addMasks=function(t){this.maskManager=new I(t,this,this.globalData)},N.prototype.setMatte=function(t){this.matteElement&&this.matteElement.setAttribute("mask","url(#"+t+")")},N.prototype.setMatte=function(t){this.matteElement&&this.matteElement.setAttribute("mask","url(#"+t+")")},N.prototype.hide=function(){},V.prototype.init=function(){this._parent.init.call(this),this.lettersChangedFlag=!1,this.currentTextDocumentData={};var t=this.data;this.viewData={m:{a:It.getProp(this,t.t.m.a,1,0,this.dynamicProperties)}};var e=this.data.t;if(e.a.length){this.viewData.a=Array.apply(null,{length:e.a.length});var s,i,a,r=e.a.length;for(s=0;r>s;s+=1)a=e.a[s],i={a:{},s:{}},"r"in a.a&&(i.a.r=It.getProp(this,a.a.r,0,St,this.dynamicProperties)),"rx"in a.a&&(i.a.rx=It.getProp(this,a.a.rx,0,St,this.dynamicProperties)),"ry"in a.a&&(i.a.ry=It.getProp(this,a.a.ry,0,St,this.dynamicProperties)),"sk"in a.a&&(i.a.sk=It.getProp(this,a.a.sk,0,St,this.dynamicProperties)),"sa"in a.a&&(i.a.sa=It.getProp(this,a.a.sa,0,St,this.dynamicProperties)),"s"in a.a&&(i.a.s=It.getProp(this,a.a.s,1,.01,this.dynamicProperties)),"a"in a.a&&(i.a.a=It.getProp(this,a.a.a,1,0,this.dynamicProperties)),"o"in a.a&&(i.a.o=It.getProp(this,a.a.o,0,.01,this.dynamicProperties)),"p"in a.a&&(i.a.p=It.getProp(this,a.a.p,1,0,this.dynamicProperties)),"sw"in a.a&&(i.a.sw=It.getProp(this,a.a.sw,0,0,this.dynamicProperties)),"sc"in a.a&&(i.a.sc=It.getProp(this,a.a.sc,1,0,this.dynamicProperties)),"fc"in a.a&&(i.a.fc=It.getProp(this,a.a.fc,1,0,this.dynamicProperties)),"fh"in a.a&&(i.a.fh=It.getProp(this,a.a.fh,0,0,this.dynamicProperties)),"fs"in a.a&&(i.a.fs=It.getProp(this,a.a.fs,0,.01,this.dynamicProperties)),"fb"in a.a&&(i.a.fb=It.getProp(this,a.a.fb,0,.01,this.dynamicProperties)),"t"in a.a&&(i.a.t=It.getProp(this,a.a.t,0,0,this.dynamicProperties)),i.s=It.getTextSelectorProp(this,a.s,this.dynamicProperties),i.s.t=a.s.t,this.viewData.a[s]=i}else this.viewData.a=[];e.p&&"m"in e.p?(this.viewData.p={f:It.getProp(this,e.p.f,0,0,this.dynamicProperties),l:It.getProp(this,e.p.l,0,0,this.dynamicProperties),r:e.p.r,m:this.maskManager.getMaskProperty(e.p.m)},this.maskPath=!0):this.maskPath=!1},V.prototype.prepareFrame=function(t){var e=0,s=this.data.t.d.k.length,i=this.data.t.d.k[e].s;for(e+=1;s>e&&!(this.data.t.d.k[e].t>t);)i=this.data.t.d.k[e].s,e+=1;this.lettersChangedFlag=!1,i!==this.currentTextDocumentData&&(this.currentTextDocumentData=i,this.lettersChangedFlag=!0,this.buildNewText()),this._parent.prepareFrame.call(this,t)},V.prototype.createPathShape=function(t,e){var s,i,a,r,n=e.length,h="";for(s=0;n>s;s+=1){for(a=e[s].ks.k.i.length,r=e[s].ks.k,i=1;a>i;i+=1)1==i&&(h+=" M"+t.applyToPointStringified(r.v[0][0],r.v[0][1])),h+=" C"+t.applyToPointStringified(r.o[i-1][0],r.o[i-1][1])+" "+t.applyToPointStringified(r.i[i][0],r.i[i][1])+" "+t.applyToPointStringified(r.v[i][0],r.v[i][1]);h+=" C"+t.applyToPointStringified(r.o[i-1][0],r.o[i-1][1])+" "+t.applyToPointStringified(r.i[0][0],r.i[0][1])+" "+t.applyToPointStringified(r.v[0][0],r.v[0][1]),h+="z"}return h},V.prototype.getMeasures=function(){var t,e,s,i,a=this.mHelper,r=this.renderType,n=this.data,h=this.currentTextDocumentData,o=h.l;if(this.maskPath){var p=this.viewData.p.m;if(!this.viewData.p.n||this.viewData.p.mdf){var l=p.v;this.viewData.p.r&&(l=b(l));var f={tLength:0,segments:[]};i=l.v.length-1;var m,d=0;for(s=0;i>s;s+=1)m={s:l.v[s],e:l.v[s+1],to:[l.o[s][0]-l.v[s][0],l.o[s][1]-l.v[s][1]],ti:[l.i[s+1][0]-l.v[s+1][0],l.i[s+1][1]-l.v[s+1][1]]},Ct.buildBezierData(m),f.tLength+=m.bezierData.segmentLength,f.segments.push(m),d+=m.bezierData.segmentLength;s=i,p.v.c&&(m={s:l.v[s],e:l.v[0],to:[l.o[s][0]-l.v[s][0],l.o[s][1]-l.v[s][1]],ti:[l.i[0][0]-l.v[0][0],l.i[0][1]-l.v[0][1]]},Ct.buildBezierData(m),f.tLength+=m.bezierData.segmentLength,f.segments.push(m),d+=m.bezierData.segmentLength),this.viewData.p.pi=f}var c,k,P,f=this.viewData.p.pi,A=this.viewData.p.f.v,M=0,E=1,w=0,S=!0,F=f.segments;if(0>A&&p.v.c)for(f.tLength<Math.abs(A)&&(A=-Math.abs(A)%f.tLength),M=F.length-1,P=F[M].bezierData.points,E=P.length-1;0>A;)A+=P[E].partialLength,E-=1,0>E&&(M-=1,P=F[M].bezierData.points,E=P.length-1);P=F[M].bezierData.points,k=P[E-1],c=P[E];var x,D,C=c.partialLength}i=o.length,t=0,e=0;var _,T,I,L,N,V=1.2*h.s*.714,z=!0,R=this.viewData,j=Array.apply(null,{length:i});L=R.a.length;var O,B,G,X,q,Y,W,H,U,Z,J,K,Q,$,tt,et,st=-1,it=A,at=M,rt=E,nt=-1,ht=0;for(s=0;i>s;s+=1)if(a.reset(),Y=1,o[s].n)t=0,e+=h.yOffset,e+=z?1:0,A=it,z=!1,ht=0,this.maskPath&&(M=at,E=rt,P=F[M].bezierData.points,k=P[E-1],c=P[E],C=c.partialLength,w=0),j[s]=this.emptyProp;else{if(this.maskPath){if(nt!==o[s].line){switch(h.j){case 1:A+=d-h.lineWidths[o[s].line];break;case 2:A+=(d-h.lineWidths[o[s].line])/2}nt=o[s].line}st!==o[s].ind&&(o[st]&&(A+=o[st].extra),A+=o[s].an/2,st=o[s].ind),A+=R.m.a.v[0]*o[s].an/200;var ot=0;for(I=0;L>I;I+=1)_=R.a[I].a,"p"in _&&(T=R.a[I].s,B=T.getMult(o[s].anIndexes[I],n.t.a[I].s.totalChars),ot+=B.length?_.p.v[0]*B[0]:_.p.v[0]*B),"a"in _&&(T=R.a[I].s,B=T.getMult(o[s].anIndexes[I],n.t.a[I].s.totalChars),ot+=B.length?_.a.v[0]*B[0]:_.a.v[0]*B);for(S=!0;S;)w+C>=A+ot||!P?(x=(A+ot-w)/c.partialLength,X=k.point[0]+(c.point[0]-k.point[0])*x,q=k.point[1]+(c.point[1]-k.point[1])*x,a.translate(-R.m.a.v[0]*o[s].an/200,-(R.m.a.v[1]*V/100)),S=!1):P&&(w+=c.partialLength,E+=1,E>=P.length&&(E=0,M+=1,F[M]?P=F[M].bezierData.points:p.v.c?(E=0,M=0,P=F[M].bezierData.points):(w-=c.partialLength,P=null)),P&&(k=c,c=P[E],C=c.partialLength));G=o[s].an/2-o[s].add,a.translate(-G,0,0)}else G=o[s].an/2-o[s].add,a.translate(-G,0,0),a.translate(-R.m.a.v[0]*o[s].an/200,-R.m.a.v[1]*V/100,0);for(ht+=o[s].l/2,I=0;L>I;I+=1)_=R.a[I].a,"t"in _&&(T=R.a[I].s,B=T.getMult(o[s].anIndexes[I],n.t.a[I].s.totalChars),this.maskPath?A+=B.length?_.t*B[0]:_.t*B:t+=B.length?_.t.v*B[0]:_.t.v*B);for(ht+=o[s].l/2,h.strokeWidthAnim&&(H=h.sw||0),h.strokeColorAnim&&(W=h.sc?[h.sc[0],h.sc[1],h.sc[2]]:[0,0,0]),h.fillColorAnim&&(U=[h.fc[0],h.fc[1],h.fc[2]]),I=0;L>I;I+=1)_=R.a[I].a,"a"in _&&(T=R.a[I].s,B=T.getMult(o[s].anIndexes[I],n.t.a[I].s.totalChars),B.length?a.translate(-_.a.v[0]*B[0],-_.a.v[1]*B[1],_.a.v[2]*B[2]):a.translate(-_.a.v[0]*B,-_.a.v[1]*B,_.a.v[2]*B));for(I=0;L>I;I+=1)_=R.a[I].a,"s"in _&&(T=R.a[I].s,B=T.getMult(o[s].anIndexes[I],n.t.a[I].s.totalChars),B.length?a.scale(1+(_.s.v[0]-1)*B[0],1+(_.s.v[1]-1)*B[1],1):a.scale(1+(_.s.v[0]-1)*B,1+(_.s.v[1]-1)*B,1));for(I=0;L>I;I+=1){if(_=R.a[I].a,T=R.a[I].s,B=T.getMult(o[s].anIndexes[I],n.t.a[I].s.totalChars),"sk"in _&&(B.length?a.skewFromAxis(-_.sk.v*B[0],_.sa.v*B[1]):a.skewFromAxis(-_.sk.v*B,_.sa.v*B)),"r"in _&&a.rotateZ(B.length?-_.r.v*B[2]:-_.r.v*B),"ry"in _&&a.rotateY(B.length?_.ry.v*B[1]:_.ry.v*B),"rx"in _&&a.rotateX(B.length?_.rx.v*B[0]:_.rx.v*B),
"o"in _&&(Y+=B.length?(_.o.v*B[0]-Y)*B[0]:(_.o.v*B-Y)*B),h.strokeWidthAnim&&"sw"in _&&(H+=B.length?_.sw.v*B[0]:_.sw.v*B),h.strokeColorAnim&&"sc"in _)for(Z=0;3>Z;Z+=1)W[Z]=Math.round(B.length?255*(W[Z]+(_.sc.v[Z]-W[Z])*B[0]):255*(W[Z]+(_.sc.v[Z]-W[Z])*B));if(h.fillColorAnim){if("fc"in _)for(Z=0;3>Z;Z+=1)U[Z]=B.length?U[Z]+(_.fc.v[Z]-U[Z])*B[0]:U[Z]+(_.fc.v[Z]-U[Z])*B;"fh"in _&&(U=B.length?v(U,_.fh.v*B[0]):v(U,_.fh.v*B)),"fs"in _&&(U=B.length?u(U,_.fs.v*B[0]):u(U,_.fs.v*B)),"fb"in _&&(U=B.length?g(U,_.fb.v*B[0]):g(U,_.fb.v*B))}}for(I=0;L>I;I+=1)_=R.a[I].a,"p"in _&&(T=R.a[I].s,B=T.getMult(o[s].anIndexes[I],n.t.a[I].s.totalChars),this.maskPath?B.length?a.translate(0,_.p.v[1]*B[0],-_.p.v[2]*B[1]):a.translate(0,_.p.v[1]*B,-_.p.v[2]*B):B.length?a.translate(_.p.v[0]*B[0],_.p.v[1]*B[1],-_.p.v[2]*B[2]):a.translate(_.p.v[0]*B,_.p.v[1]*B,-_.p.v[2]*B));if(h.strokeWidthAnim&&(J=0>H?0:H),h.strokeColorAnim&&(K="rgb("+Math.round(255*W[0])+","+Math.round(255*W[1])+","+Math.round(255*W[2])+")"),h.fillColorAnim&&(Q="rgb("+Math.round(255*U[0])+","+Math.round(255*U[1])+","+Math.round(255*U[2])+")"),this.maskPath){if(a.translate(0,-h.ls),a.translate(0,R.m.a.v[1]*V/100+e,0),n.t.p.p){D=(c.point[1]-k.point[1])/(c.point[0]-k.point[0]);var pt=180*Math.atan(D)/Math.PI;c.point[0]<k.point[0]&&(pt+=180),a.rotate(-pt*Math.PI/180)}a.translate(X,q,0),A-=R.m.a.v[0]*o[s].an/200,o[s+1]&&st!==o[s+1].ind&&(A+=o[s].an/2,A+=h.tr/1e3*h.s)}else{switch(a.translate(t,e,0),h.ps&&a.translate(h.ps[0],h.ps[1]+h.ascent,0),h.j){case 1:a.translate(h.justifyOffset+(h.boxWidth-h.lineWidths[o[s].line]),0,0);break;case 2:a.translate(h.justifyOffset+(h.boxWidth-h.lineWidths[o[s].line])/2,0,0)}a.translate(0,-h.ls),a.translate(G,0,0),a.translate(R.m.a.v[0]*o[s].an/200,R.m.a.v[1]*V/100,0),t+=o[s].l+h.tr/1e3*h.s}"html"===r?$=a.toCSS():"svg"===r?$=a.to2dCSS():tt=[a.props[0],a.props[1],a.props[2],a.props[3],a.props[4],a.props[5],a.props[6],a.props[7],a.props[8],a.props[9],a.props[10],a.props[11],a.props[12],a.props[13],a.props[14],a.props[15]],et=Y,O=this.renderedLetters[s],!O||O.o===et&&O.sw===J&&O.sc===K&&O.fc===Q?"svg"!==r&&"html"!==r||O&&O.m===$?"canvas"!==r||O&&O.props[0]===tt[0]&&O.props[1]===tt[1]&&O.props[4]===tt[4]&&O.props[5]===tt[5]&&O.props[12]===tt[12]&&O.props[13]===tt[13]?N=O:(this.lettersChangedFlag=!0,N=new y(et,J,K,Q,null,tt)):(this.lettersChangedFlag=!0,N=new y(et,J,K,Q,$)):(this.lettersChangedFlag=!0,N=new y(et,J,K,Q,$,tt)),this.renderedLetters[s]=N}},V.prototype.emptyProp=new y,P(N,z),z.prototype.init=V.prototype.init,z.prototype.createPathShape=V.prototype.createPathShape,z.prototype.getMeasures=V.prototype.getMeasures,z.prototype.prepareFrame=V.prototype.prepareFrame,z.prototype.createElements=function(){this._parent.createElements.call(this),this.data.ln&&this.layerElement.setAttribute("id",this.data.ln),this.data.cl&&this.layerElement.setAttribute("class",this.data.cl)},z.prototype.buildNewText=function(){var t,e,s=this.currentTextDocumentData;this.renderedLetters=Array.apply(null,{length:this.currentTextDocumentData.l?this.currentTextDocumentData.l.length:0}),s.fc?this.layerElement.setAttribute("fill","rgb("+Math.round(255*s.fc[0])+","+Math.round(255*s.fc[1])+","+Math.round(255*s.fc[2])+")"):this.layerElement.setAttribute("fill","rgba(0,0,0,0)"),s.sc&&(this.layerElement.setAttribute("stroke","rgb("+Math.round(255*s.sc[0])+","+Math.round(255*s.sc[1])+","+Math.round(255*s.sc[2])+")"),this.layerElement.setAttribute("stroke-width",s.sw)),this.layerElement.setAttribute("font-size",s.s);var i=this.globalData.fontManager.getFontByName(s.f);if(i.fClass)this.layerElement.setAttribute("class",i.fClass);else{this.layerElement.setAttribute("font-family",i.fFamily);var a=s.fWeight,r=s.fStyle;this.layerElement.setAttribute("font-style",r),this.layerElement.setAttribute("font-weight",a)}var n=s.l||[];if(e=n.length){var h,o,p=this.mHelper,l="",f=this.data.singleShape;if(f)var m=0,d=0,c=s.lineWidths,u=s.boxWidth,g=!0;var v=0;for(t=0;e>t;t+=1){if(this.globalData.fontManager.chars?f&&0!==t||(h=this.textSpans[v]?this.textSpans[v]:document.createElementNS(vt,"path")):h=this.textSpans[v]?this.textSpans[v]:document.createElementNS(vt,"text"),h.style.display="inherit",h.setAttribute("stroke-linecap","butt"),h.setAttribute("stroke-linejoin","round"),h.setAttribute("stroke-miterlimit","4"),f&&n[t].n&&(m=0,d+=s.yOffset,d+=g?1:0,g=!1),p.reset(),this.globalData.fontManager.chars&&p.scale(s.s/100,s.s/100),f){switch(s.ps&&p.translate(s.ps[0],s.ps[1]+s.ascent,0),p.translate(0,-s.ls,0),s.j){case 1:p.translate(s.justifyOffset+(u-c[n[t].line]),0,0);break;case 2:p.translate(s.justifyOffset+(u-c[n[t].line])/2,0,0)}p.translate(m,d,0)}if(this.globalData.fontManager.chars){var y,b=this.globalData.fontManager.getCharData(s.t.charAt(t),i.fStyle,this.globalData.fontManager.getFontByName(s.f).fFamily);y=b?b.data:null,y&&y.shapes&&(o=y.shapes[0].it,f||(l=""),l+=this.createPathShape(p,o),f||h.setAttribute("d",l)),f||this.layerElement.appendChild(h)}else h.textContent=n[t].val,h.setAttributeNS("http://www.w3.org/XML/1998/namespace","xml:space","preserve"),this.layerElement.appendChild(h),f&&h.setAttribute("transform",p.to2dCSS());f&&(m+=n[t].l,m+=s.tr/1e3*s.s),this.textSpans[v]=h,v+=1}if(!f)for(;v<this.textSpans.length;)this.textSpans[v].style.display="none",v+=1;f&&this.globalData.fontManager.chars&&(h.setAttribute("d",l),this.layerElement.appendChild(h))}},z.prototype.hide=function(){this.hidden||(this.layerElement.style.display="none",this.hidden=!0)},z.prototype.renderFrame=function(t){var e=this._parent.renderFrame.call(this,t);if(e===!1)return void this.hide();if(this.hidden&&(this.hidden=!1,this.layerElement.style.display="block"),!this.data.singleShape&&(this.getMeasures(),this.lettersChangedFlag)){var s,i,a=this.renderedLetters,r=this.currentTextDocumentData.l;i=r.length;var n;for(s=0;i>s;s+=1)r[s].n||(n=a[s],this.textSpans[s].setAttribute("transform",n.m),this.textSpans[s].setAttribute("opacity",n.o),n.sw&&this.textSpans[s].setAttribute("stroke-width",n.sw),n.sc&&this.textSpans[s].setAttribute("stroke",n.sc),n.fc&&this.textSpans[s].setAttribute("fill",n.fc));this.firstFrame&&(this.firstFrame=!1)}},z.prototype.destroy=function(){this._parent.destroy.call(this._parent)},R.prototype.renderFrame=function(t){if(t||this.filterManager.mdf){var e=this.filterManager.effectElements[0].p.v,s=this.filterManager.effectElements[1].p.v,i=this.filterManager.effectElements[2].p.v/100;this.matrixFilter.setAttribute("values",s[0]-e[0]+" 0 0 0 "+e[0]+" "+(s[1]-e[1])+" 0 0 0 "+e[1]+" "+(s[2]-e[2])+" 0 0 0 "+e[2]+" 0 0 0 "+i+" 0")}},j.prototype.renderFrame=function(t){if(t||this.filterManager.mdf){var e=this.filterManager.effectElements[2].p.v,s=this.filterManager.effectElements[6].p.v;this.matrixFilter.setAttribute("values","0 0 0 0 "+e[0]+" 0 0 0 0 "+e[1]+" 0 0 0 0 "+e[2]+" 0 0 0 "+s+" 0")}},O.prototype.initialize=function(){var t,e,s,i,a=this.elem.layerElement.children||this.elem.layerElement.childNodes;for(1===this.filterManager.effectElements[1].p.v?(i=this.elem.maskManager.masksProperties.length,s=0):(s=this.filterManager.effectElements[0].p.v-1,i=s+1),e=document.createElementNS(vt,"g"),e.setAttribute("fill","none"),e.setAttribute("stroke-linecap","round"),e.setAttribute("stroke-dashoffset",1),s;i>s;s+=1)t=document.createElementNS(vt,"path"),e.appendChild(t),this.paths.push({p:t,m:s});if(3===this.filterManager.effectElements[10].p.v){var r=document.createElementNS(vt,"mask"),n="stms_"+m(10);r.setAttribute("id",n),r.setAttribute("mask-type","alpha"),r.appendChild(e),this.elem.globalData.defs.appendChild(r);var h=document.createElementNS(vt,"g");h.setAttribute("mask","url(#"+n+")"),a[0]&&h.appendChild(a[0]),this.elem.layerElement.appendChild(h),this.masker=r,e.setAttribute("stroke","#fff")}else if(1===this.filterManager.effectElements[10].p.v||2===this.filterManager.effectElements[10].p.v){if(2===this.filterManager.effectElements[10].p.v)for(var a=this.elem.layerElement.children||this.elem.layerElement.childNodes;a.length;)this.elem.layerElement.removeChild(a[0]);this.elem.layerElement.appendChild(e),this.elem.layerElement.removeAttribute("mask"),e.setAttribute("stroke","#fff")}this.initialized=!0,this.pathMasker=e},O.prototype.renderFrame=function(t){this.initialized||this.initialize();var e,s,i,a=this.paths.length;for(e=0;a>e;e+=1)if(s=this.elem.maskManager.viewData[this.paths[e].m],i=this.paths[e].p,(t||this.filterManager.mdf||s.prop.mdf)&&i.setAttribute("d",s.lastPath),t||this.filterManager.effectElements[9].p.mdf||this.filterManager.effectElements[4].p.mdf||this.filterManager.effectElements[7].p.mdf||this.filterManager.effectElements[8].p.mdf||s.prop.mdf){var r;if(0!==this.filterManager.effectElements[7].p.v||100!==this.filterManager.effectElements[8].p.v){var n=Math.min(this.filterManager.effectElements[7].p.v,this.filterManager.effectElements[8].p.v)/100,h=Math.max(this.filterManager.effectElements[7].p.v,this.filterManager.effectElements[8].p.v)/100,o=i.getTotalLength();r="0 0 0 "+o*n+" ";var p,l=o*(h-n),f=1+2*this.filterManager.effectElements[4].p.v*this.filterManager.effectElements[9].p.v/100,m=Math.floor(l/f);for(p=0;m>p;p+=1)r+="1 "+2*this.filterManager.effectElements[4].p.v*this.filterManager.effectElements[9].p.v/100+" ";r+="0 "+10*o+" 0 0"}else r="1 "+2*this.filterManager.effectElements[4].p.v*this.filterManager.effectElements[9].p.v/100;i.setAttribute("stroke-dasharray",r)}if((t||this.filterManager.effectElements[4].p.mdf)&&this.pathMasker.setAttribute("stroke-width",2*this.filterManager.effectElements[4].p.v),(t||this.filterManager.effectElements[6].p.mdf)&&this.pathMasker.setAttribute("opacity",this.filterManager.effectElements[6].p.v),(1===this.filterManager.effectElements[10].p.v||2===this.filterManager.effectElements[10].p.v)&&(t||this.filterManager.effectElements[3].p.mdf)){var d=this.filterManager.effectElements[3].p.v;this.pathMasker.setAttribute("stroke","rgb("+At(255*d[0])+","+At(255*d[1])+","+At(255*d[2])+")")}},B.prototype.renderFrame=function(t){if(t||this.filterManager.mdf){var e=this.filterManager.effectElements[0].p.v,s=this.filterManager.effectElements[1].p.v,i=this.filterManager.effectElements[2].p.v,a=i[0]+" "+s[0]+" "+e[0],r=i[1]+" "+s[1]+" "+e[1],n=i[2]+" "+s[2]+" "+e[2];this.feFuncR.setAttribute("tableValues",a),this.feFuncG.setAttribute("tableValues",r),this.feFuncB.setAttribute("tableValues",n)}},G.prototype.createFeFunc=function(t,e){var s=document.createElementNS(vt,t);return s.setAttribute("type","table"),e.appendChild(s),s},G.prototype.getTableValue=function(t,e,s,i,a){for(var r,n,h=0,o=256,p=Math.min(t,e),l=Math.max(t,e),f=Array.call(null,{length:o}),m=0,d=a-i,c=e-t;256>=h;)r=h/256,n=p>=r?0>c?a:i:r>=l?0>c?i:a:i+d*Math.pow((r-t)/c,1/s),f[m++]=n,h+=256/(o-1);return f.join(" ")},G.prototype.renderFrame=function(t){if(t||this.filterManager.mdf){var e,s=this.filterManager.effectElements;this.feFuncRComposed&&(t||s[2].p.mdf||s[3].p.mdf||s[4].p.mdf||s[5].p.mdf||s[6].p.mdf)&&(e=this.getTableValue(s[2].p.v,s[3].p.v,s[4].p.v,s[5].p.v,s[6].p.v),this.feFuncRComposed.setAttribute("tableValues",e),this.feFuncGComposed.setAttribute("tableValues",e),this.feFuncBComposed.setAttribute("tableValues",e)),this.feFuncR&&(t||s[9].p.mdf||s[10].p.mdf||s[11].p.mdf||s[12].p.mdf||s[13].p.mdf)&&(e=this.getTableValue(s[9].p.v,s[10].p.v,s[11].p.v,s[12].p.v,s[13].p.v),this.feFuncR.setAttribute("tableValues",e)),this.feFuncG&&(t||s[16].p.mdf||s[17].p.mdf||s[18].p.mdf||s[19].p.mdf||s[20].p.mdf)&&(e=this.getTableValue(s[16].p.v,s[17].p.v,s[18].p.v,s[19].p.v,s[20].p.v),this.feFuncG.setAttribute("tableValues",e)),this.feFuncB&&(t||s[23].p.mdf||s[24].p.mdf||s[25].p.mdf||s[26].p.mdf||s[27].p.mdf)&&(e=this.getTableValue(s[23].p.v,s[24].p.v,s[25].p.v,s[26].p.v,s[27].p.v),this.feFuncB.setAttribute("tableValues",e)),this.feFuncA&&(t||s[30].p.mdf||s[31].p.mdf||s[32].p.mdf||s[33].p.mdf||s[34].p.mdf)&&(e=this.getTableValue(s[30].p.v,s[31].p.v,s[32].p.v,s[33].p.v,s[34].p.v),this.feFuncA.setAttribute("tableValues",e))}},X.prototype.renderFrame=function(t){if(t||this.filterManager.mdf){if((t||this.filterManager.effectElements[4].p.mdf)&&this.feGaussianBlur.setAttribute("stdDeviation",this.filterManager.effectElements[4].p.v/4),t||this.filterManager.effectElements[0].p.mdf){var e=this.filterManager.effectElements[0].p.v;this.feFlood.setAttribute("flood-color",xt(Math.round(255*e[0]),Math.round(255*e[1]),Math.round(255*e[2])))}if((t||this.filterManager.effectElements[1].p.mdf)&&this.feFlood.setAttribute("flood-opacity",this.filterManager.effectElements[1].p.v/255),t||this.filterManager.effectElements[2].p.mdf||this.filterManager.effectElements[3].p.mdf){var s=this.filterManager.effectElements[3].p.v,i=(this.filterManager.effectElements[2].p.v-90)*St,a=s*Math.cos(i),r=s*Math.sin(i);this.feOffset.setAttribute("dx",a),this.feOffset.setAttribute("dy",r)}}},q.prototype.renderFrame=function(t){var e,s=this.filters.length;for(e=0;s>e;e+=1)this.filters[e].renderFrame(t)},P(N,Y),Y.prototype.hide=function(){if(!this.hidden){var t,e=this.elements.length;for(t=0;e>t;t+=1)this.elements[t]&&this.elements[t].hide();this.hidden=!0}},Y.prototype.prepareFrame=function(t){if(this._parent.prepareFrame.call(this,t),this.isVisible!==!1||this.data.xt){if(this.tm){var e=this.tm.v;e===this.data.op&&(e=this.data.op-1),this.renderedFrame=e}else this.renderedFrame=t/this.data.sr;var s,i=this.elements.length;for(this.completeLayers||this.checkLayers(this.renderedFrame),s=0;i>s;s+=1)(this.completeLayers||this.elements[s])&&this.elements[s].prepareFrame(this.renderedFrame-this.layers[s].st)}},Y.prototype.renderFrame=function(t){var e,s=this._parent.renderFrame.call(this,t),i=this.layers.length;if(s===!1)return void this.hide();for(this.hidden=!1,e=0;i>e;e+=1)(this.completeLayers||this.elements[e])&&this.elements[e].renderFrame();this.firstFrame&&(this.firstFrame=!1)},Y.prototype.setElements=function(t){this.elements=t},Y.prototype.getElements=function(){return this.elements},Y.prototype.destroy=function(){this._parent.destroy.call(this._parent);var t,e=this.layers.length;for(t=0;e>t;t+=1)this.elements[t]&&this.elements[t].destroy()},Y.prototype.checkLayers=T.prototype.checkLayers,Y.prototype.buildItem=T.prototype.buildItem,Y.prototype.buildAllItems=T.prototype.buildAllItems,Y.prototype.buildElementParenting=T.prototype.buildElementParenting,Y.prototype.createItem=T.prototype.createItem,Y.prototype.createImage=T.prototype.createImage,Y.prototype.createComp=T.prototype.createComp,Y.prototype.createSolid=T.prototype.createSolid,Y.prototype.createShape=T.prototype.createShape,Y.prototype.createText=T.prototype.createText,Y.prototype.createBase=T.prototype.createBase,Y.prototype.appendElementInPos=T.prototype.appendElementInPos,Y.prototype.checkPendingElements=T.prototype.checkPendingElements,Y.prototype.addPendingElement=T.prototype.addPendingElement,P(N,W),W.prototype.createElements=function(){var t=this.globalData.getAssetsPath(this.assetData);this._parent.createElements.call(this),this.innerElem=document.createElementNS(vt,"image"),this.innerElem.setAttribute("width",this.assetData.w+"px"),this.innerElem.setAttribute("height",this.assetData.h+"px"),this.innerElem.setAttribute("preserveAspectRatio","xMidYMid slice"),this.innerElem.setAttributeNS("http://www.w3.org/1999/xlink","href",t),this.maskedElement=this.innerElem,this.layerElement.appendChild(this.innerElem),this.data.ln&&this.layerElement.setAttribute("id",this.data.ln),this.data.cl&&this.layerElement.setAttribute("class",this.data.cl)},W.prototype.hide=function(){this.hidden||(this.layerElement.style.display="none",this.hidden=!0)},W.prototype.renderFrame=function(t){var e=this._parent.renderFrame.call(this,t);return e===!1?void this.hide():(this.hidden&&(this.hidden=!1,this.layerElement.style.display="block"),void(this.firstFrame&&(this.firstFrame=!1)))},W.prototype.destroy=function(){this._parent.destroy.call(this._parent),this.innerElem=null},P(N,H),H.prototype.lcEnum={1:"butt",2:"round",3:"butt"},H.prototype.ljEnum={1:"miter",2:"round",3:"butt"},H.prototype.buildExpressionInterface=function(){},H.prototype.createElements=function(){this._parent.createElements.call(this),this.searchShapes(this.shapesData,this.viewData,this.layerElement,this.dynamicProperties,0),(!this.data.hd||this.data.td)&&i(this.layerElement)},H.prototype.setGradientData=function(t,e,s){var i,a="gr_"+m(10);i=1===e.t?document.createElementNS(vt,"linearGradient"):document.createElementNS(vt,"radialGradient"),i.setAttribute("id",a),i.setAttribute("spreadMethod","pad"),i.setAttribute("gradientUnits","userSpaceOnUse");var r,n,h,o=[];for(h=4*e.g.p,n=0;h>n;n+=4)r=document.createElementNS(vt,"stop"),i.appendChild(r),o.push(r);t.setAttribute("gf"===e.ty?"fill":"stroke","url(#"+a+")"),this.globalData.defs.appendChild(i),s.gf=i,s.cst=o},H.prototype.setGradientOpacity=function(t,e,s){if(t.g.k.k[0].s&&t.g.k.k[0].s.length>4*t.g.p||t.g.k.k.length>4*t.g.p){var i,a,r,n,h=document.createElementNS(vt,"mask"),o=document.createElementNS(vt,"path");h.appendChild(o);var p="op_"+m(10),l="mk_"+m(10);h.setAttribute("id",l),i=1===t.t?document.createElementNS(vt,"linearGradient"):document.createElementNS(vt,"radialGradient"),i.setAttribute("id",p),i.setAttribute("spreadMethod","pad"),i.setAttribute("gradientUnits","userSpaceOnUse"),n=t.g.k.k[0].s?t.g.k.k[0].s.length:t.g.k.k.length;var f=[];for(r=4*t.g.p;n>r;r+=2)a=document.createElementNS(vt,"stop"),a.setAttribute("stop-color","rgb(255,255,255)"),i.appendChild(a),f.push(a);return o.setAttribute("gf"===t.ty?"fill":"stroke","url(#"+p+")"),this.globalData.defs.appendChild(i),this.globalData.defs.appendChild(h),e.of=i,e.ost=f,s.msElem=o,l}},H.prototype.searchShapes=function(t,e,s,i,a,r){r=r||[];var n,h,o,p,l,f=[].concat(r),m=t.length-1,d=[],c=[];for(n=m;n>=0;n-=1)if("fl"==t[n].ty||"st"==t[n].ty||"gf"==t[n].ty||"gs"==t[n].ty){e[n]={},p={type:t[n].ty,d:"",ld:"",lvl:a,mdf:!1};var u=document.createElementNS(vt,"path");if(e[n].o=It.getProp(this,t[n].o,0,.01,i),("st"==t[n].ty||"gs"==t[n].ty)&&(u.setAttribute("stroke-linecap",this.lcEnum[t[n].lc]||"round"),u.setAttribute("stroke-linejoin",this.ljEnum[t[n].lj]||"round"),u.setAttribute("fill-opacity","0"),1==t[n].lj&&u.setAttribute("stroke-miterlimit",t[n].ml),e[n].w=It.getProp(this,t[n].w,0,null,i),t[n].d)){var g=It.getDashProp(this,t[n].d,"svg",i);g.k||(u.setAttribute("stroke-dasharray",g.dasharray),u.setAttribute("stroke-dashoffset",g.dashoffset)),e[n].d=g}if("fl"==t[n].ty||"st"==t[n].ty)e[n].c=It.getProp(this,t[n].c,1,255,i),s.appendChild(u);else{e[n].g=It.getGradientProp(this,t[n].g,i),2==t[n].t&&(e[n].h=It.getProp(this,t[n].h,1,.01,i),e[n].a=It.getProp(this,t[n].a,1,St,i)),e[n].s=It.getProp(this,t[n].s,1,null,i),e[n].e=It.getProp(this,t[n].e,1,null,i),this.setGradientData(u,t[n],e[n],p);var v=this.setGradientOpacity(t[n],e[n],p);v&&u.setAttribute("mask","url(#"+v+")"),e[n].elem=u,s.appendChild(u)}2===t[n].r&&u.setAttribute("fill-rule","evenodd"),t[n].ln&&u.setAttribute("id",t[n].ln),t[n].cl&&u.setAttribute("class",t[n].cl),p.pElem=u,this.stylesList.push(p),e[n].style=p,d.push(p)}else if("gr"==t[n].ty){e[n]={it:[]};var y=document.createElementNS(vt,"g");s.appendChild(y),e[n].gr=y,this.searchShapes(t[n].it,e[n].it,y,i,a+1,f)}else if("tr"==t[n].ty)e[n]={transform:{op:It.getProp(this,t[n].o,0,.01,i),mProps:It.getProp(this,t[n],2,null,i)},elements:[]},l=e[n].transform,f.push(l);else if("sh"==t[n].ty||"rc"==t[n].ty||"el"==t[n].ty||"sr"==t[n].ty){e[n]={elements:[],caches:[],styles:[],transformers:f,lStr:""};var b=4;for("rc"==t[n].ty?b=5:"el"==t[n].ty?b=6:"sr"==t[n].ty&&(b=7),e[n].sh=Lt.getShapeProp(this,t[n],b,i),e[n].lvl=a,this.shapes.push(e[n].sh),this.addShapeToModifiers(e[n]),o=this.stylesList.length,h=0;o>h;h+=1)this.stylesList[h].closed||e[n].elements.push({ty:this.stylesList[h].type,st:this.stylesList[h]})}else if("tm"==t[n].ty||"rd"==t[n].ty||"ms"==t[n].ty||"rp"==t[n].ty){var k=Nt.getModifier(t[n].ty);k.init(this,t[n],i),this.shapeModifiers.push(k),c.push(k),e[n]=k}for(m=d.length,n=0;m>n;n+=1)d[n].closed=!0;for(m=c.length,n=0;m>n;n+=1)c[n].closed=!0},H.prototype.addShapeToModifiers=function(t){var e,s=this.shapeModifiers.length;for(e=0;s>e;e+=1)this.shapeModifiers[e].addShape(t)},H.prototype.renderModifiers=function(){if(this.shapeModifiers.length){var t,e=this.shapes.length;for(t=0;e>t;t+=1)this.shapes[t].reset();for(e=this.shapeModifiers.length,t=e-1;t>=0;t-=1)this.shapeModifiers[t].processShapes(this.firstFrame)}},H.prototype.renderFrame=function(t){var e=this._parent.renderFrame.call(this,t);return e===!1?void this.hide():(this.globalToLocal([0,0,0]),this.hidden&&(this.layerElement.style.display="block",this.hidden=!1),this.renderModifiers(),void this.renderShape(null,null,!0,null))},H.prototype.hide=function(){if(!this.hidden){this.layerElement.style.display="none";var t,e=this.stylesList.length;for(t=e-1;t>=0;t-=1)"0"!==this.stylesList[t].ld&&(this.stylesList[t].ld="0",this.stylesList[t].pElem.style.display="none",this.stylesList[t].pElem.parentNode&&(this.stylesList[t].parent=this.stylesList[t].pElem.parentNode));this.hidden=!0}},H.prototype.renderShape=function(t,e,s,i){var a,r;if(!t)for(t=this.shapesData,r=this.stylesList.length,a=0;r>a;a+=1)this.stylesList[a].d="",this.stylesList[a].mdf=!1;e||(e=this.viewData),r=t.length-1;var n;for(a=r;a>=0;a-=1)n=t[a].ty,"tr"==n?((this.firstFrame||e[a].transform.op.mdf&&i)&&i.setAttribute("opacity",e[a].transform.op.v),(this.firstFrame||e[a].transform.mProps.mdf&&i)&&i.setAttribute("transform",e[a].transform.mProps.v.to2dCSS())):"sh"==n||"el"==n||"rc"==n||"sr"==n?this.renderPath(t[a],e[a]):"fl"==n?this.renderFill(t[a],e[a]):"gf"==n?this.renderGradient(t[a],e[a]):"gs"==n?(this.renderGradient(t[a],e[a]),this.renderStroke(t[a],e[a])):"st"==n?this.renderStroke(t[a],e[a]):"gr"==n&&this.renderShape(t[a].it,e[a].it,!1,e[a].gr);if(s){for(r=this.stylesList.length,a=0;r>a;a+=1)"0"===this.stylesList[a].ld&&(this.stylesList[a].ld="1",this.stylesList[a].pElem.style.display="block"),(this.stylesList[a].mdf||this.firstFrame)&&(this.stylesList[a].pElem.setAttribute("d",this.stylesList[a].d),this.stylesList[a].msElem&&this.stylesList[a].msElem.setAttribute("d",this.stylesList[a].d));this.firstFrame&&(this.firstFrame=!1)}},H.prototype.renderPath=function(t,e){var s,i,a,r,n,h,o,p,l=e.elements.length,f=e.lvl;for(p=0;l>p;p+=1){h=e.sh.mdf||this.firstFrame,n="M0 0";var m=e.sh.paths;if(r=m._length,e.elements[p].st.lvl<f){for(var d,c=this.mHelper.reset(),u=f-e.elements[p].st.lvl,g=e.transformers.length-1;u>0;)h=e.transformers[g].mProps.mdf||h,d=e.transformers[g].mProps.v.props,c.transform(d[0],d[1],d[2],d[3],d[4],d[5],d[6],d[7],d[8],d[9],d[10],d[11],d[12],d[13],d[14],d[15]),u--,g--;if(h){for(a=0;r>a;a+=1)if(o=m.shapes[a],o&&o._length){for(s=o._length,i=1;s>i;i+=1)1==i&&(n+=" M"+c.applyToPointStringified(o.v[0][0],o.v[0][1])),n+=" C"+c.applyToPointStringified(o.o[i-1][0],o.o[i-1][1])+" "+c.applyToPointStringified(o.i[i][0],o.i[i][1])+" "+c.applyToPointStringified(o.v[i][0],o.v[i][1]);1==s&&(n+=" M"+c.applyToPointStringified(o.v[0][0],o.v[0][1])),o.c&&(n+=" C"+c.applyToPointStringified(o.o[i-1][0],o.o[i-1][1])+" "+c.applyToPointStringified(o.i[0][0],o.i[0][1])+" "+c.applyToPointStringified(o.v[0][0],o.v[0][1]),n+="z")}e.caches[p]=n}else n=e.caches[p]}else if(h){for(a=0;r>a;a+=1)if(o=m.shapes[a],o&&o._length){for(s=o._length,i=1;s>i;i+=1)1==i&&(n+=" M"+o.v[0].join(",")),n+=" C"+o.o[i-1].join(",")+" "+o.i[i].join(",")+" "+o.v[i].join(",");1==s&&(n+=" M"+o.v[0].join(",")),o.c&&s&&(n+=" C"+o.o[i-1].join(",")+" "+o.i[0].join(",")+" "+o.v[0].join(","),n+="z")}e.caches[p]=n}else n=e.caches[p];e.elements[p].st.d+=n,e.elements[p].st.mdf=h||e.elements[p].st.mdf}},H.prototype.renderFill=function(t,e){var s=e.style;(e.c.mdf||this.firstFrame)&&s.pElem.setAttribute("fill","rgb("+At(e.c.v[0])+","+At(e.c.v[1])+","+At(e.c.v[2])+")"),(e.o.mdf||this.firstFrame)&&s.pElem.setAttribute("fill-opacity",e.o.v)},H.prototype.renderGradient=function(t,e){var s=e.gf,i=e.of,a=e.s.v,r=e.e.v;if(e.o.mdf||this.firstFrame){var n="gf"===t.ty?"fill-opacity":"stroke-opacity";e.elem.setAttribute(n,e.o.v)}if(e.s.mdf||this.firstFrame){var h=1===t.t?"x1":"cx",o="x1"===h?"y1":"cy";s.setAttribute(h,a[0]),s.setAttribute(o,a[1]),i&&(i.setAttribute(h,a[0]),i.setAttribute(o,a[1]))}var p,l,f,m;if(e.g.cmdf||this.firstFrame){p=e.cst;var d=e.g.c;for(f=p.length,l=0;f>l;l+=1)m=p[l],m.setAttribute("offset",d[4*l]+"%"),m.setAttribute("stop-color","rgb("+d[4*l+1]+","+d[4*l+2]+","+d[4*l+3]+")")}if(i&&(e.g.omdf||this.firstFrame)){p=e.ost;var c=e.g.o;for(f=p.length,l=0;f>l;l+=1)m=p[l],m.setAttribute("offset",c[2*l]+"%"),m.setAttribute("stop-opacity",c[2*l+1])}if(1===t.t)(e.e.mdf||this.firstFrame)&&(s.setAttribute("x2",r[0]),s.setAttribute("y2",r[1]),i&&(i.setAttribute("x2",r[0]),i.setAttribute("y2",r[1])));else{var u;if((e.s.mdf||e.e.mdf||this.firstFrame)&&(u=Math.sqrt(Math.pow(a[0]-r[0],2)+Math.pow(a[1]-r[1],2)),s.setAttribute("r",u),i&&i.setAttribute("r",u)),e.e.mdf||e.h.mdf||e.a.mdf||this.firstFrame){u||(u=Math.sqrt(Math.pow(a[0]-r[0],2)+Math.pow(a[1]-r[1],2)));var g=Math.atan2(r[1]-a[1],r[0]-a[0]),v=e.h.v>=1?.99:e.h.v<=-1?-.99:e.h.v,y=u*v,b=Math.cos(g+e.a.v)*y+a[0],k=Math.sin(g+e.a.v)*y+a[1];s.setAttribute("fx",b),s.setAttribute("fy",k),i&&(i.setAttribute("fx",b),i.setAttribute("fy",k))}}},H.prototype.renderStroke=function(t,e){var s=e.style,i=e.d;i&&i.k&&(i.mdf||this.firstFrame)&&(s.pElem.setAttribute("stroke-dasharray",i.dasharray),s.pElem.setAttribute("stroke-dashoffset",i.dashoffset)),e.c&&(e.c.mdf||this.firstFrame)&&s.pElem.setAttribute("stroke","rgb("+At(e.c.v[0])+","+At(e.c.v[1])+","+At(e.c.v[2])+")"),(e.o.mdf||this.firstFrame)&&s.pElem.setAttribute("stroke-opacity",e.o.v),(e.w.mdf||this.firstFrame)&&(s.pElem.setAttribute("stroke-width",e.w.v),s.msElem&&s.msElem.setAttribute("stroke-width",e.w.v))},H.prototype.destroy=function(){this._parent.destroy.call(this._parent),this.shapeData=null,this.viewData=null,this.parentContainer=null,this.placeholder=null},P(N,U),U.prototype.createElements=function(){this._parent.createElements.call(this);var t=document.createElementNS(vt,"rect");t.setAttribute("width",this.data.sw),t.setAttribute("height",this.data.sh),t.setAttribute("fill",this.data.sc),this.layerElement.appendChild(t),this.innerElem=t,this.data.ln&&this.layerElement.setAttribute("id",this.data.ln),this.data.cl&&this.layerElement.setAttribute("class",this.data.cl)},U.prototype.hide=W.prototype.hide,U.prototype.renderFrame=W.prototype.renderFrame,U.prototype.destroy=W.prototype.destroy;var Xt=function(){function t(t){for(var e=0,s=t.target;E>e;)A[e].animation===s&&(A.splice(e,1),e-=1,E-=1,s.isPaused||i()),e+=1}function e(t,e){if(!t)return null;for(var s=0;E>s;){if(A[s].elem==t&&null!==A[s].elem)return A[s].animation;s+=1}var i=new qt;return a(i,t),i.setData(t,e),i}function s(){S+=1,k()}function i(){S-=1,0===S&&(w=!0)}function a(e,a){e.addEventListener("destroy",t),e.addEventListener("_active",s),e.addEventListener("_idle",i),A.push({elem:a,animation:e}),E+=1}function r(t){var e=new qt;return a(e,null),e.setParams(t),e}function n(t,e){var s;for(s=0;E>s;s+=1)A[s].animation.setSpeed(t,e)}function h(t,e){var s;for(s=0;E>s;s+=1)A[s].animation.setDirection(t,e)}function o(t){var e;for(e=0;E>e;e+=1)A[e].animation.play(t)}function p(t,e){M=Date.now();var s;for(s=0;E>s;s+=1)A[s].animation.moveFrame(t,e)}function l(t){var e,s=t-M;for(e=0;E>e;e+=1)A[e].animation.advanceTime(s);M=t,w||requestAnimationFrame(l)}function f(t){M=t,requestAnimationFrame(l)}function m(t){var e;for(e=0;E>e;e+=1)A[e].animation.pause(t)}function d(t,e,s){var i;for(i=0;E>i;i+=1)A[i].animation.goToAndStop(t,e,s)}function c(t){var e;for(e=0;E>e;e+=1)A[e].animation.stop(t)}function u(t){var e;for(e=0;E>e;e+=1)A[e].animation.togglePause(t)}function g(t){var e;for(e=E-1;e>=0;e-=1)A[e].animation.destroy(t)}function v(t,s,i){var a,r=document.getElementsByClassName("bodymovin"),n=r.length;for(a=0;n>a;a+=1)i&&r[a].setAttribute("data-bm-type",i),e(r[a],t);if(s&&0===n){i||(i="svg");var h=document.getElementsByTagName("body")[0];h.innerHTML="";var o=document.createElement("div");o.style.width="100%",o.style.height="100%",o.setAttribute("data-bm-type",i),h.appendChild(o),e(o,t)}}function y(){var t;for(t=0;E>t;t+=1)A[t].animation.resize()}function b(){requestAnimationFrame(f)}function k(){w&&(w=!1,requestAnimationFrame(f))}var P={},A=[],M=0,E=0,w=!0,S=0;return setTimeout(b,0),P.registerAnimation=e,P.loadAnimation=r,P.setSpeed=n,P.setDirection=h,P.play=o,P.moveFrame=p,P.pause=m,P.stop=c,P.togglePause=u,P.searchAnimations=v,P.resize=y,P.start=b,P.goToAndStop=d,P.destroy=g,P}(),qt=function(){this._cbs=[],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.animationData={},this.layers=[],this.assets=[],this.isPaused=!0,this.autoplay=!1,this.loop=!0,this.renderer=null,this.animationID=m(10),this.scaleMode="fit",this.assetsPath="",this.timeCompleted=0,this.segmentPos=0,this.subframeEnabled=yt,this.segments=[],this.pendingSegment=!1,this._idle=!0,this.projectInterface=t()};qt.prototype.setParams=function(t){var e=this;t.context&&(this.context=t.context),(t.wrapper||t.container)&&(this.wrapper=t.wrapper||t.container);var s=t.animType?t.animType:t.renderer?t.renderer:"svg";switch(s){case"canvas":this.renderer=new CanvasRenderer(this,t.rendererSettings);break;case"svg":this.renderer=new T(this,t.rendererSettings);break;case"hybrid":case"html":default:this.renderer=new HybridRenderer(this,t.rendererSettings)}if(this.renderer.setProjectInterface(this.projectInterface),this.animType=s,""===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,this.autoloadSegments=t.hasOwnProperty("autoloadSegments")?t.autoloadSegments:!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=-1!=t.path.lastIndexOf("\\")?t.path.substr(0,t.path.lastIndexOf("\\")+1):t.path.substr(0,t.path.lastIndexOf("/")+1),this.assetsPath=t.assetsPath,this.fileName=t.path.substr(t.path.lastIndexOf("/")+1),this.fileName=this.fileName.substr(0,this.fileName.lastIndexOf(".json")),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(s){}}}},qt.prototype.setData=function(t,e){var s={wrapper:t,animationData:e?"object"==typeof e?e:JSON.parse(e):null},i=t.attributes;s.path=i.getNamedItem("data-animation-path")?i.getNamedItem("data-animation-path").value:i.getNamedItem("data-bm-path")?i.getNamedItem("data-bm-path").value:i.getNamedItem("bm-path")?i.getNamedItem("bm-path").value:"",s.animType=i.getNamedItem("data-anim-type")?i.getNamedItem("data-anim-type").value:i.getNamedItem("data-bm-type")?i.getNamedItem("data-bm-type").value:i.getNamedItem("bm-type")?i.getNamedItem("bm-type").value:i.getNamedItem("data-bm-renderer")?i.getNamedItem("data-bm-renderer").value:i.getNamedItem("bm-renderer")?i.getNamedItem("bm-renderer").value:"canvas";var a=i.getNamedItem("data-anim-loop")?i.getNamedItem("data-anim-loop").value:i.getNamedItem("data-bm-loop")?i.getNamedItem("data-bm-loop").value:i.getNamedItem("bm-loop")?i.getNamedItem("bm-loop").value:"";""===a||(s.loop="false"===a?!1:"true"===a?!0:parseInt(a));var r=i.getNamedItem("data-anim-autoplay")?i.getNamedItem("data-anim-autoplay").value:i.getNamedItem("data-bm-autoplay")?i.getNamedItem("data-bm-autoplay").value:i.getNamedItem("bm-autoplay")?i.getNamedItem("bm-autoplay").value:!0;s.autoplay="false"!==r,s.name=i.getNamedItem("data-name")?i.getNamedItem("data-name").value:i.getNamedItem("data-bm-name")?i.getNamedItem("data-bm-name").value:i.getNamedItem("bm-name")?i.getNamedItem("bm-name").value:"";

var n=i.getNamedItem("data-anim-prerender")?i.getNamedItem("data-anim-prerender").value:i.getNamedItem("data-bm-prerender")?i.getNamedItem("data-bm-prerender").value:i.getNamedItem("bm-prerender")?i.getNamedItem("bm-prerender").value:"";"false"===n&&(s.prerender=!1),this.setParams(s)},qt.prototype.includeLayers=function(t){t.op>this.animationData.op&&(this.animationData.op=t.op,this.totalFrames=Math.floor(t.op-this.animationData.ip),this.animationData.tf=this.totalFrames);var e,s,i=this.animationData.layers,a=i.length,r=t.layers,n=r.length;for(s=0;n>s;s+=1)for(e=0;a>e;){if(i[e].id==r[s].id){i[e]=r[s];break}e+=1}if((t.chars||t.fonts)&&(this.renderer.globalData.fontManager.addChars(t.chars),this.renderer.globalData.fontManager.addFonts(t.fonts,this.renderer.globalData.defs)),t.assets)for(a=t.assets.length,e=0;a>e;e+=1)this.animationData.assets.push(t.assets[e]);this.animationData.__complete=!1,_t.completeData(this.animationData,this.renderer.globalData.fontManager),this.renderer.includeLayers(t.layers),ut&&ut.initExpressions(this),this.renderer.renderFrame(null),this.loadNextSegment()},qt.prototype.loadNextSegment=function(){var t=this.animationData.segments;if(!t||0===t.length||!this.autoloadSegments)return this.trigger("data_ready"),void(this.timeCompleted=this.animationData.tf);var e=t.shift();this.timeCompleted=e.time*this.frameRate;var s=new XMLHttpRequest,i=this,a=this.path+this.fileName+"_"+this.segmentPos+".json";this.segmentPos+=1,s.open("GET",a,!0),s.send(),s.onreadystatechange=function(){if(4==s.readyState)if(200==s.status)i.includeLayers(JSON.parse(s.responseText));else try{var t=JSON.parse(s.responseText);i.includeLayers(t)}catch(e){}}},qt.prototype.loadSegments=function(){var t=this.animationData.segments;t||(this.timeCompleted=this.animationData.tf),this.loadNextSegment()},qt.prototype.configAnimation=function(t){this.renderer&&this.renderer.destroyed||(this.animationData=t,this.totalFrames=Math.floor(this.animationData.op-this.animationData.ip),this.animationData.tf=this.totalFrames,this.renderer.configAnimation(t),t.assets||(t.assets=[]),t.comps&&(t.assets=t.assets.concat(t.comps),t.comps=null),this.renderer.searchExtraCompositions(t.assets),this.layers=this.animationData.layers,this.assets=this.animationData.assets,this.frameRate=this.animationData.fr,this.firstFrame=Math.round(this.animationData.ip),this.frameMult=this.animationData.fr/1e3,this.trigger("config_ready"),this.imagePreloader=new Vt,this.imagePreloader.setAssetsPath(this.assetsPath),this.imagePreloader.setPath(this.path),this.imagePreloader.loadAssets(t.assets),this.loadSegments(),this.updaFrameModifier(),this.renderer.globalData.fontManager?this.waitForFontsLoaded():(_t.completeData(this.animationData,this.renderer.globalData.fontManager),this.checkLoaded()))},qt.prototype.waitForFontsLoaded=function(){function t(){this.renderer.globalData.fontManager.loaded?(_t.completeData(this.animationData,this.renderer.globalData.fontManager),this.checkLoaded()):setTimeout(t.bind(this),20)}return function(){t.bind(this)()}}(),qt.prototype.addPendingElement=function(){this.pendingElements+=1},qt.prototype.elementLoaded=function(){this.pendingElements--,this.checkLoaded()},qt.prototype.checkLoaded=function(){0===this.pendingElements&&(ut&&ut.initExpressions(this),this.renderer.initItems(),setTimeout(function(){this.trigger("DOMLoaded")}.bind(this),0),this.isLoaded=!0,this.gotoFrame(),this.autoplay&&this.play())},qt.prototype.resize=function(){this.renderer.updateContainerSize()},qt.prototype.setSubframe=function(t){this.subframeEnabled=t?!0:!1},qt.prototype.gotoFrame=function(){this.currentFrame=this.subframeEnabled?this.currentRawFrame:Math.floor(this.currentRawFrame),this.timeCompleted!==this.totalFrames&&this.currentFrame>this.timeCompleted&&(this.currentFrame=this.timeCompleted),this.trigger("enterFrame"),this.renderFrame()},qt.prototype.renderFrame=function(){this.isLoaded!==!1&&this.renderer.renderFrame(this.currentFrame+this.firstFrame)},qt.prototype.play=function(t){t&&this.name!=t||this.isPaused===!0&&(this.isPaused=!1,this._idle&&(this._idle=!1,this.trigger("_active")))},qt.prototype.pause=function(t){t&&this.name!=t||this.isPaused===!1&&(this.isPaused=!0,this.pendingSegment||(this._idle=!0,this.trigger("_idle")))},qt.prototype.togglePause=function(t){t&&this.name!=t||(this.isPaused===!0?this.play():this.pause())},qt.prototype.stop=function(t){t&&this.name!=t||(this.pause(),this.currentFrame=this.currentRawFrame=0,this.playCount=0,this.gotoFrame())},qt.prototype.goToAndStop=function(t,e,s){s&&this.name!=s||(this.setCurrentRawFrameValue(e?t:t*this.frameModifier),this.pause())},qt.prototype.goToAndPlay=function(t,e,s){this.goToAndStop(t,e,s),this.play()},qt.prototype.advanceTime=function(t){return this.pendingSegment?(this.pendingSegment=!1,this.adjustSegment(this.segments.shift()),void(this.isPaused&&this.play())):void(this.isPaused!==!0&&this.isLoaded!==!1&&this.setCurrentRawFrameValue(this.currentRawFrame+t*this.frameModifier))},qt.prototype.updateAnimation=function(t){this.setCurrentRawFrameValue(this.totalFrames*t)},qt.prototype.moveFrame=function(t,e){e&&this.name!=e||this.setCurrentRawFrameValue(this.currentRawFrame+t)},qt.prototype.adjustSegment=function(t){this.playCount=0,t[1]<t[0]?(this.frameModifier>0&&(this.playSpeed<0?this.setSpeed(-this.playSpeed):this.setDirection(-1)),this.totalFrames=t[0]-t[1],this.firstFrame=t[1],this.setCurrentRawFrameValue(this.totalFrames-.01)):t[1]>t[0]&&(this.frameModifier<0&&(this.playSpeed<0?this.setSpeed(-this.playSpeed):this.setDirection(1)),this.totalFrames=t[1]-t[0],this.firstFrame=t[0],this.setCurrentRawFrameValue(0)),this.trigger("segmentStart")},qt.prototype.setSegment=function(t,e){var s=-1;this.isPaused&&(this.currentRawFrame+this.firstFrame<t?s=t:this.currentRawFrame+this.firstFrame>e&&(s=e-t-.01)),this.firstFrame=t,this.totalFrames=e-t,-1!==s&&this.goToAndStop(s,!0)},qt.prototype.playSegments=function(t,e){if("object"==typeof t[0]){var s,i=t.length;for(s=0;i>s;s+=1)this.segments.push(t[s])}else this.segments.push(t);e&&this.adjustSegment(this.segments.shift()),this.isPaused&&this.play()},qt.prototype.resetSegments=function(t){this.segments.length=0,this.segments.push([this.animationData.ip*this.frameRate,Math.floor(this.animationData.op-this.animationData.ip+this.animationData.ip*this.frameRate)]),t&&this.adjustSegment(this.segments.shift())},qt.prototype.checkSegments=function(){this.segments.length&&(this.pendingSegment=!0)},qt.prototype.remove=function(t){t&&this.name!=t||this.renderer.destroy()},qt.prototype.destroy=function(t){t&&this.name!=t||this.renderer&&this.renderer.destroyed||(this.renderer.destroy(),this.trigger("destroy"),this._cbs=null,this.onEnterFrame=this.onLoopComplete=this.onComplete=this.onSegmentStart=this.onDestroy=null)},qt.prototype.setCurrentRawFrameValue=function(t){if(this.currentRawFrame=t,this.currentRawFrame>=this.totalFrames){if(this.checkSegments(),this.loop===!1)return this.currentRawFrame=this.totalFrames-.01,this.gotoFrame(),this.pause(),void this.trigger("complete");if(this.trigger("loopComplete"),this.playCount+=1,this.loop!==!0&&this.playCount==this.loop||this.pendingSegment)return this.currentRawFrame=this.totalFrames-.01,this.gotoFrame(),this.pause(),void this.trigger("complete");this.currentRawFrame=this.currentRawFrame%this.totalFrames}else if(this.currentRawFrame<0)return this.checkSegments(),this.playCount-=1,this.playCount<0&&(this.playCount=0),this.loop===!1||this.pendingSegment?(this.currentRawFrame=0,this.gotoFrame(),this.pause(),void this.trigger("complete")):(this.trigger("loopComplete"),this.currentRawFrame=(this.totalFrames+this.currentRawFrame)%this.totalFrames,void this.gotoFrame());this.gotoFrame()},qt.prototype.setSpeed=function(t){this.playSpeed=t,this.updaFrameModifier()},qt.prototype.setDirection=function(t){this.playDirection=0>t?-1:1,this.updaFrameModifier()},qt.prototype.updaFrameModifier=function(){this.frameModifier=this.frameMult*this.playSpeed*this.playDirection},qt.prototype.getPath=function(){return this.path},qt.prototype.getAssetsPath=function(t){var e="";if(this.assetsPath){var s=t.p;-1!==s.indexOf("images/")&&(s=s.split("/")[1]),e=this.assetsPath+s}else e=this.path,e+=t.u?t.u:"",e+=t.p;return e},qt.prototype.getAssetData=function(t){for(var e=0,s=this.assets.length;s>e;){if(t==this.assets[e].id)return this.assets[e];e+=1}},qt.prototype.hide=function(){this.renderer.hide()},qt.prototype.show=function(){this.renderer.show()},qt.prototype.getAssets=function(){return this.assets},qt.prototype.trigger=function(t){if(this._cbs&&this._cbs[t])switch(t){case"enterFrame":this.triggerEvent(t,new a(t,this.currentFrame,this.totalFrames,this.frameMult));break;case"loopComplete":this.triggerEvent(t,new n(t,this.loop,this.playCount,this.frameMult));break;case"complete":this.triggerEvent(t,new r(t,this.frameMult));break;case"segmentStart":this.triggerEvent(t,new h(t,this.firstFrame,this.totalFrames));break;case"destroy":this.triggerEvent(t,new o(t,this));break;default:this.triggerEvent(t)}"enterFrame"===t&&this.onEnterFrame&&this.onEnterFrame.call(this,new a(t,this.currentFrame,this.totalFrames,this.frameMult)),"loopComplete"===t&&this.onLoopComplete&&this.onLoopComplete.call(this,new n(t,this.loop,this.playCount,this.frameMult)),"complete"===t&&this.onComplete&&this.onComplete.call(this,new r(t,this.frameMult)),"segmentStart"===t&&this.onSegmentStart&&this.onSegmentStart.call(this,new h(t,this.firstFrame,this.totalFrames)),"destroy"===t&&this.onDestroy&&this.onDestroy.call(this,new o(t,this))},qt.prototype.addEventListener=p,qt.prototype.removeEventListener=l,qt.prototype.triggerEvent=f;var Yt={};Yt.play=Z,Yt.pause=J,Yt.togglePause=K,Yt.setSpeed=Q,Yt.setDirection=$,Yt.stop=tt,Yt.moveFrame=et,Yt.searchAnimations=st,Yt.registerAnimation=it,Yt.loadAnimation=ot,Yt.setSubframeRendering=ht,Yt.resize=at,Yt.start=rt,Yt.goToAndStop=nt,Yt.destroy=pt,Yt.setQuality=lt,Yt.installPlugin=ft,Yt.__getFactory=mt,Yt.version="4.6.11";var Wt="__[STANDALONE]__",Ht="__[ANIMATIONDATA]__",Ut="";if(Wt){var Zt=document.getElementsByTagName("script"),Jt=Zt.length-1,Kt=Zt[Jt]||{src:""},Qt=Kt.src.replace(/^[^\?]+\??/,"");Ut=ct("renderer")}var $t=setInterval(dt,100);return Yt});