(function (root, factory) { if(typeof define === "function" && define.amd) { define( factory); } else if(typeof module === "object" && module.exports) { module.exports = factory(); } else { root.bodymovin = factory(); } }(window, function() {function roundValues(t){bm_rnd=t?Math.round:function(t){return t}}function roundTo2Decimals(t){return Math.round(1e4*t)/1e4}function roundTo3Decimals(t){return Math.round(100*t)/100}function styleDiv(t){t.style.position="absolute",t.style.top=0,t.style.left=0,t.style.display="block",t.style.transformOrigin=t.style.webkitTransformOrigin="0 0",t.style.backfaceVisibility=t.style.webkitBackfaceVisibility="visible",t.style.transformStyle=t.style.webkitTransformStyle=t.style.mozTransformStyle="preserve-3d"}function styleUnselectableDiv(t){t.style.userSelect="none",t.style.MozUserSelect="none",t.style.webkitUserSelect="none",t.style.oUserSelect="none"}function BMEnterFrameEvent(t,e,s,i){this.type=t,this.currentTime=e,this.totalTime=s,this.direction=0>i?-1:1}function BMCompleteEvent(t,e){this.type=t,this.direction=0>e?-1:1}function BMCompleteLoopEvent(t,e,s,i){this.type=t,this.currentLoop=e,this.totalLoops=s,this.direction=0>i?-1:1}function BMSegmentStartEvent(t,e,s){this.type=t,this.firstFrame=e,this.totalFrames=s}function BMDestroyEvent(t,e){this.type=t,this.target=e}function _addEventListener(t,e){this._cbs[t]||(this._cbs[t]=[]),this._cbs[t].push(e)}function _removeEventListener(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 _triggerEvent(t,e){if(this._cbs[t])for(var s=this._cbs[t].length,i=0;s>i;i++)this._cbs[t][i](e)}function randomString(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 HSVtoRGB(t,e,s){var i,a,r,n,o,h,l,p;switch(1===arguments.length&&(e=t.s,s=t.v,t=t.h),n=Math.floor(6*t),o=6*t-n,h=s*(1-e),l=s*(1-o*e),p=s*(1-(1-o)*e),n%6){case 0:i=s,a=p,r=h;break;case 1:i=l,a=s,r=h;break;case 2:i=h,a=s,r=p;break;case 3:i=h,a=l,r=s;break;case 4:i=p,a=h,r=s;break;case 5:i=s,a=h,r=l}return[Math.round(255*i),Math.round(255*a),Math.round(255*r)]}function RGBtoHSV(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,o=0===a?0:n/a,h=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,o,h]}function addSaturationToRGB(t,e){var s=RGBtoHSV(t[0],t[1],t[2]);return s[1]+=e,s[1]>1?s[1]=1:s[1]<=0&&(s[1]=0),HSVtoRGB(s[0],s[1],s[2])}function addBrightnessToRGB(t,e){var s=RGBtoHSV(t[0],t[1],t[2]);return s[2]+=e,s[2]>1?s[2]=1:s[2]<0&&(s[2]=0),HSVtoRGB(s[0],s[1],s[2])}function addHueToRGB(t,e){var s=RGBtoHSV(t[0],t[1],t[2]);return s[0]+=e/360,s[0]>1?s[0]-=1:s[0]<0&&(s[0]+=1),HSVtoRGB(s[0],s[1],s[2])}function componentToHex(t){var e=t.toString(16);return 1==e.length?"0"+e:e}function fillToRgba(t,e){if(!cachedColors[t]){var s=/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(t);cachedColors[t]=parseInt(s[1],16)+","+parseInt(s[2],16)+","+parseInt(s[3],16)}return"rgba("+cachedColors[t]+","+e+")"}function RenderedFrame(t,e){this.tr=t,this.o=e}function LetterProps(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 iterateDynamicProperties(t){var e,s=this.dynamicProperties;for(e=0;s>e;e+=1)this.dynamicProperties[e].getValue(t)}function reversePath(t,e){var s,i,a=[],r=[],n=[],o={},h=0;e&&(a[0]=t.o[0],r[0]=t.i[0],n[0]=t.v[0],h=1),i=t.i.length;var l=i-1;for(s=h;i>s;s+=1)a.push(t.o[l]),r.push(t.i[l]),n.push(t.v[l]),l-=1;return o.i=a,o.o=r,o.v=n,o}function Matrix(){}function matrixManagerFunction(){var t=new Matrix,e=function(e,s,i,a,r){return t.reset().translate(a,r).rotate(e).scale(s,i).toCSS()},s=function(t){return e(t.tr.r[2],t.tr.s[0],t.tr.s[1],t.tr.p[0],t.tr.p[1])};return{getMatrix:s}}function createElement(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 extendPrototype(t,e){for(var s in t.prototype)t.prototype.hasOwnProperty(s)&&(e.prototype[s]=t.prototype[s])}function bezFunction(){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(e,s,i,a,r,n,o,h,l){return t(e,s,a,r,o,h)&&t(e,i,a,n,o,l)}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=bm_floor((i-1)*t),r=t*e.addedLength,n=0;if(r==s[a].l)return s[a].p;for(var o=s[a].l>r?-1:1,h=!0;h;)s[a].l<=r&&s[a+1].l>r?(n=(r-s[a].l)/(s[a+1].l-s[a].l),h=!1):a+=o,(0>a||a>=i-1)&&(h=!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,o,h){var l=new r;n=0>n?0:n;var p=a(n,h);o=o>1?1:o;var m,f=a(o,h),d=t.length,c=1-p,u=1-f;for(m=0;d>m;m+=1)l.pt1[m]=c*c*c*t[m]+(p*c*c+c*p*c+c*c*p)*s[m]+(p*p*c+c*p*p+p*c*p)*i[m]+p*p*p*e[m],l.pt3[m]=c*c*u*t[m]+(p*c*u+c*p*u+c*c*f)*s[m]+(p*p*u+c*p*f+p*c*f)*i[m]+p*p*f*e[m],l.pt4[m]=c*u*u*t[m]+(p*u*u+c*f*u+c*u*f)*s[m]+(p*f*u+c*f*f+p*u*f)*i[m]+p*f*f*e[m],l.pt2[m]=u*u*u*t[m]+(f*u*u+u*f*u+u*u*f)*s[m]+(f*f*u+u*f*f+f*u*f)*i[m]+f*f*f*e[m];return l}var o=(Math,function(){function t(t,e){this.l=t,this.p=e}var e={};return function(s,i,a,r){var n=(s.join("_")+"_"+i.join("_")+"_"+a.join("_")+"_"+r.join("_")).replace(/\./g,"p");if(e[n])return e[n];var o,h,l,p,m,f,d=defaultCurveSegments,c=0,u=[],y=[],v={addedLength:0,segments:[]};for(l=a.length,o=0;d>o;o+=1){for(m=o/(d-1),f=0,h=0;l>h;h+=1)p=bm_pow(1-m,3)*s[h]+3*bm_pow(1-m,2)*m*a[h]+3*(1-m)*bm_pow(m,2)*r[h]+bm_pow(m,3)*i[h],u[h]=p,null!==y[h]&&(f+=bm_pow(u[h]-y[h],2)),y[h]=u[h];f&&(f=bm_sqrt(f),c+=f),v.segments.push(new t(c,m))}return v.addedLength=c,e[n]=v,v}}()),h=function(){var e={};return function(a){var r=a.s,n=a.e,o=a.to,h=a.ti,l=(r.join("_")+"_"+n.join("_")+"_"+o.join("_")+"_"+h.join("_")).replace(/\./g,"p");if(e[l])return void(a.bezierData=e[l]);var p,m,f,d,c,u,y,v=defaultCurveSegments,g=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]+o[0],r[1]+o[1])&&t(r[0],r[1],n[0],n[1],n[0]+h[0],n[1]+h[1])&&(v=2);var E=new s(v);for(f=o.length,p=0;v>p;p+=1){for(y=new Array(f),c=p/(v-1),u=0,m=0;f>m;m+=1)d=bm_pow(1-c,3)*r[m]+3*bm_pow(1-c,2)*c*(r[m]+o[m])+3*(1-c)*bm_pow(c,2)*(n[m]+h[m])+bm_pow(c,3)*n[m],y[m]=d,null!==b&&(u+=bm_pow(y[m]-b[m],2));u=bm_sqrt(u),g+=u,E.points[p]=new i(u,y),b=y}E.segmentLength=g,a.bezierData=E,e[l]=E}}();return{getBezierLength:o,getNewSegment:n,buildBezierData:h,pointOnLine2D:t,pointOnLine3D:e}}function dataFunctionManager(){function t(a,n,o){var h,l,p,m,f,d,c,u,y=a.length;for(m=0;y>m;m+=1)if(h=a[m],"ks"in h&&!h.completed){if(h.completed=!0,h.tt&&(a[m-1].td=h.tt),l=[],p=-1,h.hasMask){var v=h.masksProperties;for(d=v.length,f=0;d>f;f+=1)if(v[f].pt.k.i)i(v[f].pt.k);else for(u=v[f].pt.k.length,c=0;u>c;c+=1)v[f].pt.k[c].s&&i(v[f].pt.k[c].s[0]),v[f].pt.k[c].e&&i(v[f].pt.k[c].e[0])}0===h.ty?(h.layers=e(h.refId,n),t(h.layers,n,o)):4===h.ty?s(h.shapes,!1):5==h.ty&&r(h,o)}}function e(t,e){for(var s=0,i=e.length;i>s;){if(e[s].id===t)return JSON.parse(JSON.stringify(e[s].layers));s+=1}}function s(t,e){var a,r,n,o=t.length,h=e?e:!1;for(a=o-1;a>=0;a-=1)if("tm"==t[a].ty&&(h=!0),"sh"==t[a].ty)if(t[a].trimmed=h,t[a].ks.k.i)i(t[a].ks.k);else for(n=t[a].ks.k.length,r=0;n>r;r+=1)t[a].ks.k[r].s&&i(t[a].ks.k[r].s[0]),t[a].ks.k[r].e&&i(t[a].ks.k[r].e[0]);else"gr"==t[a].ty?s(t[a].it,h):("el"==t[a].ty||"rc"==t[a].ty)&&(t[a].trimmed=h)}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(e,s){t(e.layers,e.assets,s)}function r(t,e){var s,i,a,r,n,o,h,l=[],p=t.t.d,m=0,f=t.t.m.g,d=0,c=0,u=0,y=[],v=0,g=0,b=e.getFontByName(p.f),E=0,P=b.fStyle.split(" "),k="normal",S="normal";for(i=P.length,s=0;i>s;s+=1)"italic"===P[s].toLowerCase()?S="italic":"bold"===P[s].toLowerCase()?k="700":"black"===P[s].toLowerCase()?k="900":"medium"===P[s].toLowerCase()?k="500":"regular"===P[s].toLowerCase()||"normal"===P[s].toLowerCase()?k="400":("light"===P[s].toLowerCase()||"thin"===P[s].toLowerCase())&&(k="200");if(p.fWeight=k,p.fStyle=S,i=p.t.length,p.sz){var C=p.sz[0],x=-1;for(s=0;i>s;s+=1)a=!1," "===p.t.charAt(s)?x=s:13===p.t.charCodeAt(s)&&(v=0,a=!0),e.chars?(h=e.getCharData(p.t.charAt(s),b.fStyle,b.fFamily),E=a?0:h.w*p.s/100):E=e.measureText(p.t.charAt(s),p.f,p.s),v+E>C?(-1===x?(p.t=p.t.substr(0,s)+"\r"+p.t.substr(s),i+=1):(s=x,p.t=p.t.substr(0,s)+"\r"+p.t.substr(s+1)),x=-1,v=0):v+=E;i=p.t.length}for(v=0,E=0,s=0;i>s;s+=1)if(a=!1," "===p.t.charAt(s)?r=" ":13===p.t.charCodeAt(s)?(y.push(v),g=v>g?v:g,v=0,r="",a=!0,u+=1):r=p.t.charAt(s),e.chars?(h=e.getCharData(p.t.charAt(s),b.fStyle,e.getFontByName(p.f).fFamily),E=a?0:h.w*p.s/100):E=e.measureText(r,p.f,p.s),v+=E,l.push({l:E,an:E,add:d,n:a,anIndexes:[],val:r,line:u}),2==f){if(d+=E,""==r||" "==r||s==i-1){for((""==r||" "==r)&&(d-=E);s>=c;)l[c].an=d,l[c].ind=m,l[c].extra=E,c+=1;m+=1,d=0}}else if(3==f){if(d+=E,""==r||s==i-1){for(""==r&&(d-=E);s>=c;)l[c].an=d,l[c].ind=m,l[c].extra=E,c+=1;d=0,m+=1}}else l[m].ind=m,l[m].extra=0,m+=1;if(p.l=l,g=v>g?v:g,y.push(v),p.sz)p.boxWidth=p.sz[0],t.t.d.justifyOffset=0;else switch(p.boxWidth=g,p.j){case 1:t.t.d.justifyOffset=-p.boxWidth;break;case 2:t.t.d.justifyOffset=-p.boxWidth/2;break;default:t.t.d.justifyOffset=0}p.lineWidths=y;var w=t.t.a;o=w.length;var D,T,M=[];for(n=0;o>n;n+=1){for(w[n].a.sc&&(p.strokeColorAnim=!0),w[n].a.sw&&(p.strokeWidthAnim=!0),(w[n].a.fc||w[n].a.fh||w[n].a.fs||w[n].a.fb)&&(p.fillColorAnim=!0),T=0,D=w[n].s.b,s=0;i>s;s+=1)l[s].anIndexes[n]=T,(1==D&&""!=l[s].val||2==D&&""!=l[s].val&&" "!=l[s].val||3==D&&(l[s].n||" "==l[s].val||s==i-1)||4==D&&(l[s].n||s==i-1))&&(1===w[n].s.rn&&M.push(T),T+=1);t.t.a[n].s.totalChars=T;var I,F=-1;if(1===w[n].s.rn)for(s=0;i>s;s+=1)F!=l[s].anIndexes[n]&&(F=l[s].anIndexes[n],I=M.splice(Math.floor(Math.random()*M.length),1)[0]),l[s].anIndexes[n]=I}0!==o||"m"in t.t.p||(t.singleShape=!0),p.yOffset=1.2*p.s,p.ascent=b.ascent*p.s/100}var n={};return n.completeData=a,n}function ExpressionComp(){}function ShapeInterface(){}function LayerInterface(){}function SVGRenderer(t){this.animationItem=t,this.layers=null,this.renderedFrame=-1,this.globalData={frameNum:-1},this.elements=[],this.destroyed=!1}function CanvasRenderer(t,e){this.animationItem=t,this.renderConfig={clearCanvas:e&&e.clearCanvas||!0,context:e&&e.context||null,scaleMode:e&&e.scaleMode||"fit"},this.renderConfig.dpr=e&&e.dpr||1,this.animationItem.wrapper&&(this.renderConfig.dpr=e&&e.dpr||window.devicePixelRatio||1),this.renderedFrame=-1,this.globalData={frameNum:-1},this.contextData={saved:new Array(15),savedOp:new Array(15),cArrPos:0,cTr:new Matrix,cO:1};var s,i=15;for(s=0;i>s;s+=1)this.contextData.saved[s]=new Array(16);this.elements=[],this.transformMat=new Matrix}function HybridRenderer(t){this.animationItem=t,this.layers=null,this.renderedFrame=-1,this.globalData={frameNum:-1},this.elements=[],this.threeDElements=[],this.destroyed=!1,this.camera=null}function MaskElement(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,o,h,l,p,m=(this.element.maskedElement,this.globalData.defs),f=this.masksProperties.length,d=this.masksProperties,c=0,u=[],y=randomString(10),v="clipPath",g="clip-path";for(i=0;f>i;i++)if(("a"!==d[i].mode&&"n"!==d[i].mode||d[i].inv)&&(v="mask",g="mask"),"s"!=d[i].mode&&"i"!=d[i].mode||0!=c||(o=document.createElementNS(svgNS,"rect"),o.setAttribute("fill","#ffffff"),o.setAttribute("x","0"),o.setAttribute("y","0"),o.setAttribute("width","100%"),o.setAttribute("height","100%"),u.push(o)),"n"!=d[i].mode&&d[i].cl!==!1){if(c+=1,a=document.createElementNS(svgNS,"path"),d[i].cl?"s"==d[i].mode?a.setAttribute("fill","#000000"):a.setAttribute("fill","#ffffff"):(a.setAttribute("fill","none"),"s"==d[i].mode?a.setAttribute("fill","#000000"):a.setAttribute("fill","#ffffff"),a.setAttribute("stroke-width","1"),a.setAttribute("stroke-miterlimit","10")),a.setAttribute("clip-rule","nonzero"),0!==d[i].x.k){v="mask",g="mask",p=PropertyFactory.getProp(this.element,d[i].x,0,null,this.dynamicProperties);var b="fi_"+randomString(10);h=document.createElementNS(svgNS,"filter"),h.setAttribute("id",b),l=document.createElementNS(svgNS,"feMorphology"),l.setAttribute("operator","dilate"),l.setAttribute("in","SourceGraphic"),l.setAttribute("radius","0"),h.appendChild(l),m.appendChild(h),"s"==d[i].mode?a.setAttribute("stroke","#000000"):a.setAttribute("stroke","#ffffff")}else l=null,p=null;if(this.storedData[i]={elem:a,x:p,expan:l,lastPath:"",lastOperator:"",filterId:b,lastRadius:0},"i"==d[i].mode){n=u.length;var E=document.createElementNS(svgNS,"g");for(r=0;n>r;r+=1)E.appendChild(u[r]);var P=document.createElementNS(svgNS,"mask");P.setAttribute("mask-type","alpha"),P.setAttribute("id",y+"_"+c),P.appendChild(a),m.appendChild(P),E.setAttribute("mask","url(#"+y+"_"+c+")"),u.length=0,u.push(E)}else u.push(a);d[i].inv&&!this.solidPath&&(this.solidPath=this.createLayerSolidPath()),this.viewData[i]={elem:a,lastPath:"",prop:PropertyFactory.getShapeProp(this.element,d[i],3,this.dynamicProperties,null)},this.viewData[i].prop.k||this.drawPath(d[i],this.viewData[i].prop.v,this.viewData[i])}else this.viewData[i]={prop:PropertyFactory.getShapeProp(this.element,d[i],3,this.dynamicProperties,null)};for(this.maskElement=document.createElementNS(svgNS,v),f=u.length,i=0;f>i;i+=1)this.maskElement.appendChild(u[i]);this.maskElement.setAttribute("id",y),c>0&&this.element.maskedElement.setAttribute(g,"url(#"+y+")"),m.appendChild(this.maskElement)}function SliderEffect(t,e,s){this.p=PropertyFactory.getProp(e,t.v,0,0,s)}function AngleEffect(t,e,s){this.p=PropertyFactory.getProp(e,t.v,0,0,s)}function ColorEffect(t,e,s){this.p=PropertyFactory.getProp(e,t.v,1,1/255,s)}function PointEffect(t,e,s){this.p=PropertyFactory.getProp(e,t.v,1,0,s)}function CheckboxEffect(t,e,s){this.p=PropertyFactory.getProp(e,t.v,1,0,s)}function EffectsManager(t,e,s){this.data=t,this.element=e;var i=t.ef;this.effectElements=[];var a,r,n=i.length;for(a=0;n>a;a++)switch(i[a].ty){case 0:r=new SliderEffect(i[a],e,s),this.effectElements.push(r.proxyFunction.bind(r));break;case 1:r=new AngleEffect(i[a],e,s),this.effectElements.push(r.proxyFunction.bind(r));break;case 2:r=new ColorEffect(i[a],e,s),this.effectElements.push(r.proxyFunction.bind(r));break;case 3:r=new PointEffect(i[a],e,s),this.effectElements.push(r.proxyFunction.bind(r));break;case 4:r=new CheckboxEffect(i[a],e,s),this.effectElements.push(r.proxyFunction.bind(r))}}function BaseElement(){}function SVGBaseElement(t,e,s,i,a){this.globalData=s,this.comp=i,this.data=t,this.matteElement=null,this.parentContainer=e,this.layerId=a?a.layerId:"ly_"+randomString(10),this.placeholder=a,this.init()}function ITextElement(t,e,s,i){}function SVGTextElement(t,e,s,i,a){this.textSpans=[],this.renderType="svg",this.parent.constructor.call(this,t,e,s,i,a)}function ICompElement(t,e,s,i,a){this.parent.constructor.call(this,t,e,s,i,a),this.layers=t.layers,this.isSvg=!0,this.data.tm&&(this.tm=PropertyFactory.getProp(this,this.data.tm,0,s.frameRate,this.dynamicProperties))}function IImageElement(t,e,s,i,a){this.assetData=s.getAssetData(t.refId),this.path=s.getPath(),this.parent.constructor.call(this,t,e,s,i,a)}function IShapeElement(t,e,s,i,a){this.shapes=[],this.shapesData=t.shapes,this.stylesList=[],this.viewData=[],this.shapesContainer=document.createElementNS(svgNS,"g"),this.parent.constructor.call(this,t,e,s,i,a)}function ISolidElement(t,e,s,i,a){this.parent.constructor.call(this,t,e,s,i,a)}function CVBaseElement(t,e,s){this.globalData=s,this.data=t,this.comp=e,this.canvasContext=s.canvasContext,this.init()}function CVCompElement(t,e,s){this.parent.constructor.call(this,t,e,s),this.layers=t.layers,this.data.tm&&(this.tm=PropertyFactory.getProp(this,this.data.tm,0,s.frameRate,this.dynamicProperties))}function CVImageElement(t,e,s){this.animationItem=s.renderer.animationItem,this.assetData=this.animationItem.getAssetData(t.refId),this.path=this.animationItem.getPath(),this.parent.constructor.call(this,t,e,s),this.animationItem.pendingElements+=1}function CVMaskElement(t,e,s){this.data=t,this.element=e,this.globalData=s,this.dynamicProperties=[],this.masksProperties=this.data.masksProperties,this.ctx=this.element.canvasContext,this.viewData=new Array(this.masksProperties.length);var i,a=this.masksProperties.length;for(i=0;a>i;i++)this.viewData[i]=PropertyFactory.getShapeProp(this.element,this.masksProperties[i],3,this.dynamicProperties,null)}function CVShapeElement(t,e,s){this.shapes=[],this.stylesList=[],this.viewData=[],this.shapesData=t.shapes,this.firstFrame=!0,this.parent.constructor.call(this,t,e,s)}function CVSolidElement(t,e,s){this.parent.constructor.call(this,t,e,s)}function CVTextElement(t,e,s){this.textSpans=[],this.yOffset=0,this.fillColorAnim=!1,this.strokeColorAnim=!1,this.strokeWidthAnim=!1,this.stroke=!1,this.fill=!1,this.justifyOffset=0,this.currentRender=null,this.renderType="canvas",this.values={fill:"rgba(0,0,0,0)",stroke:"rgba(0,0,0,0)",sWidth:0,fValue:""},this.parent.constructor.call(this,t,e,s)}function HBaseElement(t,e,s,i,a){this.globalData=s,this.comp=i,this.data=t,this.matteElement=null,this.parentContainer=e,this.layerId=a?a.layerId:"ly_"+randomString(10),this.placeholder=a,this.init()}function HSolidElement(t,e,s,i,a){this.parent.constructor.call(this,t,e,s,i,a)}function HCompElement(t,e,s,i,a){this.parent.constructor.call(this,t,e,s,i,a),this.layers=t.layers,this.isSvg=!1,this.data.tm&&(this.tm=PropertyFactory.getProp(this,this.data.tm,0,s.frameRate,this.dynamicProperties)),this.data.hasMask&&(this.isSvg=!0)}function HShapeElement(t,e,s,i,a){this.shapes=[],this.shapesData=t.shapes,this.stylesList=[],this.viewData=[],this.parent.constructor.call(this,t,e,s,i,a)}function HTextElement(t,e,s,i,a){this.textSpans=[],this.textPaths=[],this.currentBBox={x:999999,y:-999999,h:0,w:0},this.renderType="svg",this.isMasked=!1,this.parent.constructor.call(this,t,e,s,i,a)}function HImageElement(t,e,s,i,a){this.assetData=s.getAssetData(t.refId),this.path=s.getPath(),this.parent.constructor.call(this,t,e,s,i,a)}function HCameraElement(t,e,s,i,a){if(this.parent.constructor.call(this,t,e,s,i,a),this.pe=PropertyFactory.getProp(this,t.pe,0,0,this.dynamicProperties),t.ks.p.s?(this.px=PropertyFactory.getProp(this,t.ks.p.x,1,0,this.dynamicProperties),this.py=PropertyFactory.getProp(this,t.ks.p.y,1,0,this.dynamicProperties),this.pz=PropertyFactory.getProp(this,t.ks.p.z,1,0,this.dynamicProperties)):this.p=PropertyFactory.getProp(this,t.ks.p,1,0,this.dynamicProperties),t.ks.a&&(this.a=PropertyFactory.getProp(this,t.ks.a,1,0,this.dynamicProperties)),t.ks.or.k.length){var r,n=t.ks.or.k.length;for(r=0;n>r;r+=1)t.ks.or.k[r].to=null,t.ks.or.k[r].ti=null}this.or=PropertyFactory.getProp(this,t.ks.or,1,degToRads,this.dynamicProperties),this.or.sh=!0,this.rx=PropertyFactory.getProp(this,t.ks.rx,0,degToRads,this.dynamicProperties),this.ry=PropertyFactory.getProp(this,t.ks.ry,0,degToRads,this.dynamicProperties),this.rz=PropertyFactory.getProp(this,t.ks.rz,0,degToRads,this.dynamicProperties),this.mat=new Matrix}var svgNS="http://www.w3.org/2000/svg",subframeEnabled=!0,isSafari=/^((?!chrome|android).)*safari/i.test(navigator.userAgent),cachedColors={},bm_rounder=Math.round,bm_rnd,bm_pow=Math.pow,bm_sqrt=Math.sqrt,bm_abs=Math.abs,bm_floor=Math.floor,bm_max=Math.max,bm_min=Math.min,BMMath={pow:bm_pow,random:Math.random},defaultCurveSegments=75,degToRads=Math.PI/180;roundValues(!1);var rgbToHex=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]}}(),fillColorToString=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]]}}(),Matrix=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 s(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 i(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 a(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 r(t,e){return this._t(1,e,t,1,0,0)}function n(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 h(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,o,h,l,p,m,f,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]=o,this.props[8]=h,this.props[9]=l,this.props[10]=p,this.props[11]=m,this.props[12]=f,this.props[13]=d,this.props[14]=c,this.props[15]=u,this}function p(t,e,s){return s=isNaN(s)?0:s,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,o,h,l,p,m,f,d,c,u){if(1===t&&0===e&&0===s&&0===i&&0===a&&1===r&&0===n&&0===o&&0===h&&0===l&&1===p&&0===m)return(0!==f||0!==d||0!==c)&&(this.props[12]=this.props[12]*t+this.props[13]*a+this.props[14]*h+this.props[15]*f,this.props[13]=this.props[12]*e+this.props[13]*r+this.props[14]*l+this.props[15]*d,this.props[14]=this.props[12]*s+this.props[13]*n+this.props[14]*p+this.props[15]*c,this.props[15]=this.props[12]*i+this.props[13]*o+this.props[14]*m+this.props[15]*u),this;var y=this.props[0],v=this.props[1],g=this.props[2],b=this.props[3],E=this.props[4],P=this.props[5],k=this.props[6],S=this.props[7],C=this.props[8],x=this.props[9],w=this.props[10],D=this.props[11],T=this.props[12],M=this.props[13],I=this.props[14],F=this.props[15];return this.props[0]=y*t+v*a+g*h+b*f,this.props[1]=y*e+v*r+g*l+b*d,this.props[2]=y*s+v*n+g*p+b*c,this.props[3]=y*i+v*o+g*m+b*u,this.props[4]=E*t+P*a+k*h+S*f,this.props[5]=E*e+P*r+k*l+S*d,this.props[6]=E*s+P*n+k*p+S*c,this.props[7]=E*i+P*o+k*m+S*u,this.props[8]=C*t+x*a+w*h+D*f,this.props[9]=C*e+x*r+w*l+D*d,this.props[10]=C*s+x*n+w*p+D*c,this.props[11]=C*i+x*o+w*m+D*u,this.props[12]=T*t+M*a+I*h+F*f,this.props[13]=T*e+M*r+I*l+F*d,this.props[14]=T*s+M*n+I*p+F*c,this.props[15]=T*i+M*o+I*m+F*u,this}function f(t){var e;for(e=0;16>e;e+=1)t.props[e]=this.props[e]}function d(t){var e;for(e=0;16>e;e+=1)this.props[e]=t[e]}function c(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 u(t,e,s){return t*this.props[0]+e*this.props[4]+s*this.props[8]+this.props[12]}function y(t,e,s){return t*this.props[1]+e*this.props[5]+s*this.props[9]+this.props[13]}function v(t,e,s){return 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],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 b(t,e){return bm_rnd(t*this.props[0]+e*this.props[4]+this.props[12])+","+bm_rnd(t*this.props[1]+e*this.props[5]+this.props[13])}function E(){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 P(){return isSafari?"matrix3d("+roundTo2Decimals(this.props[0])+","+roundTo2Decimals(this.props[1])+","+roundTo2Decimals(this.props[2])+","+roundTo2Decimals(this.props[3])+","+roundTo2Decimals(this.props[4])+","+roundTo2Decimals(this.props[5])+","+roundTo2Decimals(this.props[6])+","+roundTo2Decimals(this.props[7])+","+roundTo2Decimals(this.props[8])+","+roundTo2Decimals(this.props[9])+","+roundTo2Decimals(this.props[10])+","+roundTo2Decimals(this.props[11])+","+roundTo2Decimals(this.props[12])+","+roundTo2Decimals(this.props[13])+","+roundTo2Decimals(this.props[14])+","+roundTo2Decimals(this.props[15])+")":(this.cssParts[1]=this.props.join(","),this.cssParts.join(""))}function k(){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=s,this.rotateY=i,this.rotateZ=a,this.skew=n,this.skewFromAxis=o,this.shear=r,this.scale=h,this.setTransform=l,this.translate=p,this.transform=m,this.applyToPoint=c,this.applyToX=u,this.applyToY=y,this.applyToZ=v,this.applyToPointArray=g,this.applyToPointStringified=b,this.toArray=E,this.toCSS=P,this.to2dCSS=k,this.toString=S,this.clone=f,this.cloneFromProps=d,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,l,p){var d=[];l=1==l?{entropy:!0}:l||{};var g=n(r(l.entropy?[s,h(t)]:null==s?o():s,3),d),b=new i(d),E=function(){for(var t=b.g(f),e=u,s=0;y>t;)t=(t+s)*m,e*=m,s=b.g(1);for(;t>=v;)t/=2,e/=2,s>>>=1;return(t+s)/e};return E.int32=function(){return 0|b.g(4)},E.quick=function(){return b.g(4)/4294967296},E["double"]=E,n(h(b.S),t),(l.pass||p||function(t,s,i,r){return r&&(r.S&&a(r,b),t.state=function(){return a(b,{})}),i?(e[c]=t,s):t})(E,g,"global"in l?l.global:this==e,l.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++]);m>a;)n[a]=a++;for(a=0;m>a;a++)n[a]=n[r=g&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=g&a+1],s=s*m+n[g&(n[a]=n[r=g&r+e])+(n[r]=e)];return i.i=a,i.j=r,s})(m)}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[g&a]=g&(s^=19*e[g&a])+i.charCodeAt(a++);return h(e)}function o(){try{if(l)return h(l.randomBytes(m));var e=new Uint8Array(m);return(p.crypto||p.msCrypto).getRandomValues(e),h(e)}catch(s){var i=p.navigator,a=i&&i.plugins;return[+new Date,p,a,p.screen,h(t)]}}function h(t){return String.fromCharCode.apply(0,t)}var l,p=this,m=256,f=6,d=52,c="random",u=e.pow(m,f),y=e.pow(2,d),v=2*y,g=m-1;e["seed"+c]=s,n(e.random(),t)}([],BMMath);var BezierFactory=function(){function t(t,e,s,i,a){var r=a||("bez_"+t+"_"+e+"_"+s+"_"+i).replace(/\./g,"p");if(p[r])return p[r];var n=new h([t,e,s,i]);return p[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,o,h=0;do o=e+(s-e)/2,n=a(o,i,r)-t,n>0?s=o:e=o;while(Math.abs(n)>d&&++h<c);return o}function o(t,e,s,i){for(var n=0;m>n;++n){var o=r(e,s,i);if(0===o)return e;var h=a(e,s,i)-t;e-=h/o}return e}function h(t){this._p=t,this._mSampleValues=v?new Float32Array(u):new Array(u),this._precomputed=!1,this.get=this.get.bind(this)}var l={};l.getBezierEasing=t;var p={},m=4,f=.001,d=1e-7,c=10,u=11,y=1/(u-1),v="function"==typeof Float32Array;return h.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*y,t,e)},_getTForX:function(t){for(var e=this._p[0],s=this._p[2],i=this._mSampleValues,a=0,h=1,l=u-1;h!==l&&i[h]<=t;++h)a+=y;--h;var p=(t-i[h])/(i[h+1]-i[h]),m=a+p*y,d=r(m,e,s);return d>=f?o(t,m,e,s):0===d?m:n(t,a,a+y,e,s)}},l}(),MatrixManager=matrixManagerFunction;!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 bez=bezFunction(),dataManager=dataFunctionManager(),FontManager=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){if(window.Typekit&&window.Typekit.load&&0===this.typekitLoaded){this.typekitLoaded=1;try{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?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<h?setTimeout(e.bind(this),20):setTimeout(function(){this.loaded=!0}.bind(this),0)}function s(t,e){var s=document.createElementNS(svgNS,"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,o=n.length;for(r=0;o>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){var h=document.createElement("style");h.type="text/css",h.innerHTML="@font-face {font-family: "+n[r].fFamily+"; font-style: normal; src: url('"+n[r].fPath+"');}",a.appendChild(h)}else if("g"===n[r].fOrigin){var l=document.createElement("link");l.type="text/css",l.rel="stylesheet",l.href=n[r].fPath,a.appendChild(l)}else if("t"===n[r].fOrigin){var p=document.createElement("script");p.setAttribute("src",n[r].fPath),a.appendChild(p)}}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 o(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 h=5e3,l=function(){this.fonts=[],this.chars=null,this.typekitLoaded=0,this.loaded=!1,this.initTime=Date.now()};return l.prototype.addChars=a,l.prototype.addFonts=i,l.prototype.getCharData=r,l.prototype.getFontByName=o,l.prototype.measureText=n,l}(),ExpressionManager=function(){function sum(t,e){var s=typeof t,i=typeof e;if(!("number"!==s&&"boolean"!==s||"number"!==i&&"boolean"!==i))return t+e;if("object"===s&&("number"===i||"boolean"===i))return t[0]=t[0]+e,t;if(("number"===s||"boolean"===s)&&"object"===i)return e[0]=t+e[0],e;if("object"===s&&"object"===i){for(var a=0,r=t.length,n=e.length,o=[];r>a||n>a;)o[a]="number"==typeof t[a]&&"number"==typeof e[a]?t[a]+e[a]:t[a]||e[a],a+=1;return o}return 0}function sub(t,e){var s=typeof t,i=typeof e;if(!("number"!==s&&"boolean"!==s||"number"!==i&&"boolean"!==i))return t-e;if("object"===s&&("number"===i||"boolean"===i))return t[0]=t[0]-e,t;if(("number"===s||"boolean"===s)&&"object"===i)return e[0]=t-e[0],e;if("object"===s&&"object"===i){for(var a=0,r=t.length,n=e.length,o=[];r>a||n>a;)o[a]="number"==typeof t[a]&&"number"==typeof e[a]?t[a]-e[a]:t[a]||e[a],a+=1;return o}return 0}function mul(t,e){var s=typeof t,i=typeof e;if(!("number"!==s&&"boolean"!==s||"number"!==i&&"boolean"!==i))return t*e;var a,r;if("object"===s&&("number"===i||"boolean"===i)){for(r=t.length,arr=Array.apply(null,{length:r}),a=0;r>a;a+=1)arr[a]=t[a]*e;return arr}if(("number"===s||"boolean"===s)&&"object"===i){for(r=e.length,arr=Array.apply(null,{length:r}),a=0;r>a;a+=1)arr[a]=t*e[a];return arr}return 0}function div(t,e){var s=typeof t,i=typeof e;if(!("number"!==s&&"boolean"!==s||"number"!==i&&"boolean"!==i))return t/e;var a,r;if("object"===s&&("number"===i||"boolean"===i)){for(r=t.length,arr=Array.apply(null,{length:r}),a=0;r>a;a+=1)arr[a]=t[a]/e;return arr}if(("number"===s||"boolean"===s)&&"object"===i){for(r=e.length,arr=Array.apply(null,{length:r}),a=0;r>a;a+=1)arr[a]=t/e[a];return arr}return 0}function clamp(t,e,s){if(e>s){var i=s;s=e,e=i}return Math.min(Math.max(t,e),s)}function radiansToDegrees(t){return t/degToRads}function length(t,e){var s,i=t.length,a=0;for(s=0;i>s;s+=1)a+=Math.pow(e[s]-t[s],2);return Math.sqrt(a)}function linear(t,e,s,i,a){if(e>=t)return i;if(t>=s)return a;var r=t/(s-e);if(!i.length)return i+(a-i)*r;var n,o=i.length,h=Array.apply(null,{length:o});for(n=0;o>n;n+=1)h[n]=i[n]+(a[n]-i[n])*r;return h}function seedRandom(t){BMMath.seedrandom(t)}function random(t,e){if(void 0===e&&(void 0===t?(t=0,e=1):(e=t,t=void 0)),e.length){var s,i=e.length;t||(t=Array.apply(null,{length:i}));var a=Array.apply(null,{length:i}),r=BMMath.random();for(s=0;i>s;s+=1)a[s]=t[s]+r*(e[s]-t[s]);return a}void 0===t&&(t=0);var n=BMMath.random();return t+n*(e-t)}function initiateExpression(elem,data){function effect(t){return elem.effectsManager.getEffect(t)}function nearestKey(t){var e,s,i=data.k.length;if(data.k.length&&"number"!=typeof data.k[0])for(e=0;i>e;e+=1){if(t===data.k[e].t){s=e+1;break}if(t<data.k[e].t){s=e+1;break}if(t>data.k[e].t&&e===i-1){s=i;break}}else s=0;var a={};return a.index=s,a}function key(t){if(!data.k.length||"number"==typeof data.k[0])return{time:0};t-=1;var e,s={time:data.k[t].t/thisComp.globalData.frameRate};e=t===data.k.length-1?data.k[t-1].e:data.k[t].s;var i,a=e.length;for(i=0;a>i;i+=1)s[i]=e[i];return s}function hasParentGetter(){}function execute(){seedRandom(0),"textSelector"===this.type&&(textIndex=this.textIndex,textTotal=this.textTotal,selectorValue=this.selectorValue),transform||(transform=elem.transform),!content&&elem.content&&(content=elem.content.bind(elem)),this.getPreValue&&this.getPreValue(),value=this.pv,time=this.comp.renderedFrame/this.comp.globalData.frameRate,bindedFn();var t,e;if(this.mult)if("number"==typeof this.v)this.v*=this.mult;else for(e=this.v.length,value===this.v&&(this.v=2===e?[value[0],value[1]]:[value[0],value[1],value[2]]),t=0;e>t;t+=1)this.v[t]*=this.mult;if("number"==typeof this.v)this.lastValue!==this.v&&(this.lastValue=this.v,this.mdf=!0);else if(this.v.i)this.mdf=!0;else for(e=this.v.length,t=0;e>t;t+=1)this.v[t]!==this.lastValue[t]&&(this.lastValue[t]=this.v[t],this.mdf=!0)}var val=data.x,transform,content,effect,thisComp=elem.comp;elem.comp.frameDuration=1/thisComp.globalData.frameRate;var inPoint=elem.data.ip/thisComp.globalData.frameRate,outPoint=elem.data.op/thisComp.globalData.frameRate,thisLayer=elem,fnStr="var fn = function(){"+val+";this.v = $bm_rt;}";eval(fnStr);var bindedFn=fn.bind(this),numKeys=data.k?data.k.length:0,wiggle=function(t,e){var s,i,a=this.pv.length?this.pv.length:1,r=Array.apply(null,{len:a});for(i=0;a>i;i+=1)r[i]=0;t=5;var n=Math.floor(time*t);for(s=0,i=0;n>s;){for(i=0;a>i;i+=1)r[i]+=-e+2*e*BMMath.random();s+=1}var o=time*t,h=o-Math.floor(o),l=Array.apply({length:a});for(i=0;a>i;i+=1)l[i]=this.pv[i]+r[i]+(-e+2*e*BMMath.random())*h;return l}.bind(this),loopIn=function(t,e,s){if(!this.k)return this.pv;var i=time*thisComp.globalData.frameRate,a=this.keyframes,r=a[0].t;if(i>=r)return this.pv;var n,o;s?(n=e?Math.abs(thisComp.globalData.frameRate*e):Math.max(0,this.elem.data.op-r),o=r+n):((!e||e>a.length-1)&&(e=a.length-1),o=a[e].t,n=o-r);var h,l,p;if("pingpong"===t){var m=Math.floor((r-i)/n);if(m%2===0)return this.getValueAtTime((r-i)%n+r)}else{if("offset"===t){var f=this.getValueAtTime(r),d=this.getValueAtTime(o),c=this.getValueAtTime(n-(r-i)%n+r),u=Math.floor((r-i)/n)+1;if(this.pv.length){for(p=new Array(f.length),l=p.length,h=0;l>h;h+=1)p[h]=c[h]-(d[h]-f[h])*u;return p}return c-(d-f)*u}if("continue"===t){var y=this.getValueAtTime(r),v=this.getValueAtTime(r+.001);if(this.pv.length){for(p=new Array(y.length),l=p.length,h=0;l>h;h+=1)p[h]=y[h]+(y[h]-v[h])*(r-i)/5e-4;return p}return y+(y-v)*(r-i)/5e-4}}return this.getValueAtTime(n-(r-i)%n+r)}.bind(this),loopInDuration=function(t,e){return loopIn(t,e,!0)}.bind(this),loopOut=function(t,e,s){if(!this.k)return this.pv;var i=time*thisComp.globalData.frameRate,a=this.keyframes,r=a[a.length-1].t;if(r>=i)return this.pv;var n,o;s?(n=e?Math.abs(r-thisComp.globalData.frameRate*e):Math.max(0,r-this.elem.data.ip),o=r-n):((!e||e>a.length-1)&&(e=a.length-1),o=a[a.length-1-e].t,n=r-o);var h,l,p;if("pingpong"===t){var m=Math.floor((i-o)/n);if(m%2!==0)return this.getValueAtTime(n-(i-o)%n+o)}else{if("offset"===t){var f=this.getValueAtTime(o),d=this.getValueAtTime(r),c=this.getValueAtTime((i-o)%n+o),u=Math.floor((i-o)/n);if(this.pv.length){for(p=new Array(f.length),l=p.length,h=0;l>h;h+=1)p[h]=(d[h]-f[h])*u+c[h];return p}return(d-f)*u+c}if("continue"===t){var y=this.getValueAtTime(r),v=this.getValueAtTime(r-.001);if(this.pv.length){for(p=new Array(y.length),l=p.length,h=0;l>h;h+=1)p[h]=y[h]+(y[h]-v[h])*(i-r)/5e-4;return p}return y+(y-v)*(i-r)/5e-4}}return this.getValueAtTime((i-o)%n+o)}.bind(this),loopOutDuration=function(t,e){return loopOut(t,e,!0)}.bind(this),valueAtTime=function(t){return this.getValueAtTime(t*thisComp.globalData.frameRate)}.bind(this),velocityAtTime=function(t){return this.getVelocityAtTime(t*thisComp.globalData.frameRate)}.bind(this);Object.defineProperty(this,"hasParent",{get:hasParentGetter});var time,value,textIndex,textTotal,selectorValue,index=elem.data.ind+1,hasParent=!(!elem.hierarchy||!elem.hierarchy.length);return execute}var ob={};return ob.initiateExpression=initiateExpression,ob}();!function(){ExpressionComp.prototype.layer=function(t){for(var e=0,s=this.layers.length;s>e;){if(this.layers[e].nm===t)return this.elements[e];e+=1}},ExpressionComp.prototype.pixelAspect=1}(),ShapeInterface.prototype.fillInterface=function(t){var e={get color(){return t.c.k&&t.c.getValue(),[t.c.pv[0],t.c.pv[1],t.c.pv[2]]},get opacity(){return t.o.k&&t.o.getValue(),t.o.pv}};return e},ShapeInterface.prototype.strokeInterface=function(t,e){var s={get color(){return e.c.k&&e.c.getValue(),[e.c.pv[0],e.c.pv[1],e.c.pv[2]]},get opacity(){return e.o.k&&e.o.getValue(),e.o.pv},get strokeWidth(){return e.w.k&&e.w.getValue(),e.w.pv},dashOb:{},get dash(){var s,i=e.d,a=t.d,r=a.length;for(s=0;r>s;s+=1)i.dataProps[s].p.k&&i.dataProps[s].p.getValue(),this.dashOb[a[s].nm]=i.dataProps[s].p.v;return this.dashOb}};return s},ShapeInterface.prototype.shapeInterface=function(t){var e={get shape(){return t.sh.k&&t.sh.getValue(),t.sh.pv}};return e},ShapeInterface.prototype.ellipseInterface=function(t){var e={get size(){return t.sh.s.k&&t.sh.s.getValue(),[t.sh.s.pv[0],t.sh.s.pv[1]]},get position(){return t.sh.p.k&&t.sh.p.getValue(),[t.sh.p.pv[0],t.sh.p.pv[1]]}};return e},ShapeInterface.prototype.rectangleInterface=function(t){var e="tm"===t.sh.ty?t.sh.prop:t.sh,s={get size(){return e.s.k&&e.s.getValue(),[e.s.pv[0],e.s.pv[1]]},get position(){return e.p.k&&e.p.getValue(),[e.p.pv[0],e.p.pv[1]]},get roundness(){return e.r.k&&e.r.getValue(),e.r.pv}};return s},ShapeInterface.prototype.trimInterface=function(t){var e={get start(){return t.tr.s.k&&t.tr.s.getValue(),t.tr.s.pv},get end(){return t.tr.e.k&&t.tr.e.getValue(),t.tr.e.pv},get offset(){return t.tr.o.k&&t.tr.o.getValue(),t.tr.o.pv}};return e},ShapeInterface.prototype.transformInterface=function(t){var e={get opacity(){return t.transform.mProps.o.k&&t.transform.mProps.o.getValue(),t.transform.mProps.o.pv},get position(){return t.transform.mProps.p.k&&t.transform.mProps.p.getValue(),[t.transform.mProps.p.pv[0],t.transform.mProps.p.pv[1]]},get anchorPoint(){return t.transform.mProps.a.k&&t.transform.mProps.a.getValue(),[t.transform.mProps.a.pv[0],t.transform.mProps.a.pv[1]]},get scale(){return t.transform.mProps.s.k&&t.transform.mProps.s.getValue(),[t.transform.mProps.s.pv[0],t.transform.mProps.s.pv[1]]},get rotation(){return t.transform.mProps.r.k&&t.transform.mProps.r.getValue(),t.transform.mProps.r.pv},get skew(){return t.transform.mProps.sk.k&&t.transform.mProps.sk.getValue(),t.transform.mProps.sk.pv},get skewAxis(){return t.transform.mProps.sa.k&&t.transform.mProps.sa.getValue(),t.transform.mProps.sa.pv}};return e},ShapeInterface.prototype.groupInterface=function(t,e,s){var i,a,r=[],n=t.length;for(i=0;n>i;i+=1)"gr"===t[i].ty?(a={},this.groupInterface(t[i].it,e[i].it,a),r.push(a)):"sh"===t[i].ty?(a=this.shapeInterface(e[i]),r.push(a)):"fl"===t[i].ty?(a=this.fillInterface(e[i]),r.push(a)):"st"===t[i].ty?(a=this.strokeInterface(t[i],e[i]),r.push(a)):"el"===t[i].ty?(a=this.ellipseInterface(e[i]),r.push(a)):"rc"===t[i].ty?(a=this.rectangleInterface(e[i]),r.push(a)):"tr"===t[i].ty?s.transform=this.transformInterface(e[i]):"tm"===t[i].ty?(a=this.trimInterface(e[i]),r.push(a)):r.push("");s.content=function(e){var s,i=t.length;for(s=0;i>s;s+=1)if(t[s].nm===e)return r[s]}},ShapeInterface.prototype.buildExpressionInterface=function(){this.groupInterface(this.shapesData,this.viewData,this)},LayerInterface.prototype.toWorld=function(t){if(this.hierarchy&&this.hierarchy.length){var e,s=new Matrix,i=this.hierarchy.length;for(this.finalTransform.mProp.applyToMatrix(s,!1),e=0;i>e;e+=1)this.hierarchy[e].finalTransform.mProp.applyToMatrix(s,!0);var a=s.applyToPointArray(t[0],t[1],t[2]||0);return a}return t},LayerInterface.prototype.effect=function(t){console.log(this.effectsManager),console.log(t)};var PropertyFactory=function(){function t(t){for(var e,s,i=0,a=this.keyframes.length-1,r=1,n=!0,o=0,h="object"==typeof this.pv?[this.pv.length]:0;n;){if(e=this.keyframes[i],s=this.keyframes[i+1],i==a-1&&t>=s.t-o){e.h&&(e=s);break}if(s.t-o>t)break;a-1>i?i+=r:n=!1}var l,p,m,f,d,c=0;if(e.to){e.bezierData||bez.buildBezierData(e);var u=e.bezierData;if(t>=s.t-o||t<e.t-o){var y=t>=s.t-o?u.points.length-1:0;for(p=u.points[y].point.length,l=0;p>l;l+=1)h[l]=u.points[y].point[l]}else{e.__fnct?d=e.__fnct:(d=BezierFactory.getBezierEasing(e.o.x,e.o.y,e.i.x,e.i.y,e.n).get,e.__fnct=d),m=d((t-(e.t-o))/(s.t-o-(e.t-o)));var v,g=u.segmentLength*m,b=0;for(r=1,n=!0,f=u.points.length;n;){if(b+=u.points[c].partialLength*r,0===g||0===m||c==u.points.length-1){for(p=u.points[c].point.length,l=0;p>l;l+=1)h[l]=u.points[c].point[l];break}if(g>=b&&g<b+u.points[c+1].partialLength){for(v=(g-b)/u.points[c+1].partialLength,p=u.points[c].point.length,l=0;p>l;l+=1)h[l]=u.points[c].point[l]+(u.points[c+1].point[l]-u.points[c].point[l])*v;break}f-1>c&&1==r||c>0&&-1==r?c+=r:n=!1}}}else{var E,P,k,S,C,x=!1;for(a=e.s.length,i=0;a>i;i+=1){if(1!==e.h&&(e.o.x instanceof Array?(x=!0,e.__fnct||(e.__fnct=[]),e.__fnct[i]||(E=e.o.x[i]||e.o.x[0],P=e.o.y[i]||e.o.y[0],k=e.i.x[i]||e.i.x[0],S=e.i.y[i]||e.i.y[0])):(x=!1,e.__fnct||(E=e.o.x,P=e.o.y,k=e.i.x,S=e.i.y)),x?e.__fnct[i]?d=e.__fnct[i]:(d=BezierFactory.getBezierEasing(E,P,k,S).get,e.__fnct[i]=d):e.__fnct?d=e.__fnct:(d=BezierFactory.getBezierEasing(E,P,k,S).get,e.__fnct=d),m=t>=s.t-o?1:t<e.t-o?0:d((t-(e.t-o))/(s.t-o-(e.t-o)))),this.sh&&1!==e.h){var w=e.s[i],D=e.e[i];-180>w-D?w+=360:w-D>180&&(w-=360),C=w+(D-w)*m}else C=1===e.h?e.s[i]:e.s[i]+(e.e[i]-e.s[i])*m;1===a?h=C:h[i]=C}}return h}function e(t){var e,s=.01,i=this.getValueAtTime(t),a=this.getValueAtTime(t+s);if(i.length){e=Array.apply(null,{length:i.length});var r;for(r=0;r<i.length;r+=1)e[r]=this.elem.globalData.frameRate*((a[r]-i[r])/s)}else e=(a-i)/s;return e}function s(){if(this.elem.globalData.frameId!==this.frameId){this.mdf=!1,this.frameId=this.elem.globalData.frameId;var t=this.comp.renderedFrame-this.offsetTime;if(t===this.lastFrame||this.lastFrame!==y&&(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));else{for(var e,s,i=0,a=this.keyframes.length-1,r=1,n=!0;n;){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+=r:n=!1}var o,h,l,p,m,f=0;if(e.to){e.bezierData||bez.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,o=0;h>o;o+=1)this.v[o]=this.mult?d.points[c].point[o]*this.mult:d.points[c].point[o],this.pv[o]=d.points[c].point[o],this.lastPValue[o]!==this.pv[o]&&(this.mdf=!0,this.lastPValue[o]=this.pv[o])}else{e.__fnct?m=e.__fnct:(m=BezierFactory.getBezierEasing(e.o.x,e.o.y,e.i.x,e.i.y,e.n).get,e.__fnct=m),l=m((t-(e.t-this.offsetTime))/(s.t-this.offsetTime-(e.t-this.offsetTime)));var u,v=d.segmentLength*l,g=0;for(r=1,n=!0,p=d.points.length;n;){if(g+=d.points[f].partialLength*r,0===v||0===l||f==d.points.length-1){for(h=d.points[f].point.length,o=0;h>o;o+=1)this.v[o]=this.mult?d.points[f].point[o]*this.mult:d.points[f].point[o],this.pv[o]=d.points[f].point[o],this.lastPValue[o]!==this.pv[o]&&(this.mdf=!0,this.lastPValue[o]=this.pv[o]);break}if(v>=g&&v<g+d.points[f+1].partialLength){for(u=(v-g)/d.points[f+1].partialLength,h=d.points[f].point.length,o=0;h>o;o+=1)this.v[o]=this.mult?(d.points[f].point[o]+(d.points[f+1].point[o]-d.points[f].point[o])*u)*this.mult:d.points[f].point[o]+(d.points[f+1].point[o]-d.points[f].point[o])*u,this.pv[o]=d.points[f].point[o]+(d.points[f+1].point[o]-d.points[f].point[o])*u,this.lastPValue[o]!==this.pv[o]&&(this.mdf=!0,this.lastPValue[o]=this.pv[o]);break}p-1>f&&1==r||f>0&&-1==r?f+=r:n=!1}}}else{var b,E,P,k,S,C=!1;for(a=e.s.length,i=0;a>i;i+=1){if(1!==e.h&&(e.o.x instanceof Array?(C=!0,e.__fnct||(e.__fnct=[]),e.__fnct[i]||(b=e.o.x[i]||e.o.x[0],E=e.o.y[i]||e.o.y[0],P=e.i.x[i]||e.i.x[0],k=e.i.y[i]||e.i.y[0])):(C=!1,e.__fnct||(b=e.o.x,E=e.o.y,P=e.i.x,k=e.i.y)),C?e.__fnct[i]?m=e.__fnct[i]:(m=BezierFactory.getBezierEasing(b,E,P,k).get,e.__fnct[i]=m):e.__fnct?m=e.__fnct:(m=BezierFactory.getBezierEasing(b,E,P,k).get,e.__fnct=m),l=t>=s.t-this.offsetTime?1:t<e.t-this.offsetTime?0:m((t-(e.t-this.offsetTime))/(s.t-this.offsetTime-(e.t-this.offsetTime)))),this.sh&&1!==e.h){var x=e.s[i],w=e.e[i];-180>x-w?x+=360:x-w>180&&(x-=360),S=x+(w-x)*l}else S=1===e.h?e.s[i]:e.s[i]+(e.e[i]-e.s[i])*l;1===a?(this.v=this.mult?S*this.mult:S,this.pv=S,this.lastPValue!=this.pv&&(this.mdf=!0,this.lastPValue=this.pv)):(this.v[i]=this.mult?S*this.mult:S,this.pv[i]=S,this.lastPValue[i]!==this.pv[i]&&(this.mdf=!0,this.lastPValue[i]=this.pv[i]))}}}this.lastFrame=t}}function i(){this.mdf=!1;var t=this.comp.renderedFrame-this.offsetTime;if(this.lastFrame!==y&&(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));else{var e,s,i;if(t<this.keyframes[0].t-this.offsetTime)this.mdf=!0,e=this.keyframes[0].s[0],i=!0;else if(t>this.keyframes[this.keyframes.length-1].t-this.offsetTime)this.mdf=!0,e=1===this.keyframes[this.keyframes.length-2].h?this.keyframes[this.keyframes.length-2].s[0]:this.keyframes[this.keyframes.length-2].e[0],i=!0;else{this.mdf=!0;for(var a,r,n,o,h,l,p=0,m=this.keyframes.length-1,f=1,d=!0;d&&(a=this.keyframes[p],r=this.keyframes[p+1],!(r.t-this.offsetTime>t&&1==f));)m-1>p&&1==f||p>0&&-1==f?p+=f:d=!1;var c;if(1!==a.h){var u;a.__fnct?u=a.__fnct:(u=BezierFactory.getBezierEasing(a.o.x,a.o.y,a.i.x,a.i.y).get,a.__fnct=u),c=t>=r.t-this.offsetTime?1:t<a.t-this.offsetTime?0:u((t-(a.t-this.offsetTime))/(r.t-this.offsetTime-(a.t-this.offsetTime))),s=a.e[0]}e=a.s[0],i=1===a.h}for(o=this.v.i.length,l=e.i[0].length,n=0;o>n;n+=1)for(h=0;l>h;h+=1)i?(this.v.i[n][h]=e.i[n][h],this.v.o[n][h]=e.o[n][h],this.v.v[n][h]=e.v[n][h],this.pv.i[n][h]=e.i[n][h],this.pv.o[n][h]=e.o[n][h],this.pv.v[n][h]=e.v[n][h]):(this.v.i[n][h]=e.i[n][h]+(s.i[n][h]-e.i[n][h])*c,this.v.o[n][h]=e.o[n][h]+(s.o[n][h]-e.o[n][h])*c,this.v.v[n][h]=e.v[n][h]+(s.v[n][h]-e.v[n][h])*c,this.pv.i[n][h]=e.i[n][h]+(s.i[n][h]-e.i[n][h])*c,this.pv.o[n][h]=e.o[n][h]+(s.o[n][h]-e.o[n][h])*c,this.pv.v[n][h]=e.v[n][h]+(s.v[n][h]-e.v[n][h])*c)}this.lastFrame=t}function a(t,e){this.getExpression=ExpressionManager.initiateExpression,e.x&&(this.k=!0,this.x=!0,this.getValue&&(this.getPreValue=this.getValue),this.getValue=this.getExpression(t,e))}function r(t,e,s){this.mult=s,this.v=s?e.k*s:e.k,this.pv=e.k,this.mdf=!1,this.comp=t.comp,this.k=!1,a.bind(this)(t,e)}function n(t,e,s){this.mult=s,this.data=e,this.mdf=!1,this.comp=t.comp,this.k=!1,a.bind(this)(t,e),this.v=new Array(e.k.length),this.pv=new Array(e.k.length),this.lastValue=new Array(e.k.length);var i,r=e.k.length;for(i=0;r>i;i+=1)this.v[i]=s?e.k[i]*s:e.k[i],this.pv[i]=e.k[i]}function o(i,r,n){this.keyframes=r.k,this.offsetTime=i.data.st,this.lastValue=-99999,this.lastPValue=-99999,this.frameId=-1,this.k=!0,this.data=r,this.mult=n,this.elem=i,this.comp=i.comp,this.lastFrame=y,this.v=n?r.k[0].s[0]*n:r.k[0].s[0],this.pv=r.k[0].s[0],this.getValue=s,this.getValueAtTime=t,this.getVelocityAtTime=e,a.bind(this)(i,r)}function h(i,r,n){var o,h,l,p,m,f=r.k.length;for(o=0;f-1>o;o+=1)r.k[o].to&&r.k[o].s&&r.k[o].e&&(h=r.k[o].s,l=r.k[o].e,p=r.k[o].to,m=r.k[o].ti,(2==h.length&&bez.pointOnLine2D(h[0],h[1],l[0],l[1],h[0]+p[0],h[1]+p[1])&&bez.pointOnLine2D(h[0],h[1],l[0],l[1],l[0]+m[0],l[1]+m[1])||bez.pointOnLine3D(h[0],h[1],h[2],l[0],l[1],l[2],h[0]+p[0],h[1]+p[1],h[2]+p[2])&&bez.pointOnLine3D(h[0],h[1],h[2],l[0],l[1],l[2],l[0]+m[0],l[1]+m[1],l[2]+m[2]))&&(r.k[o].to=null,r.k[o].ti=null));this.keyframes=r.k,this.offsetTime=i.data.st,this.k=!0,this.mult=n,this.elem=i,this.comp=i.comp,this.getValue=s,this.getValueAtTime=t,this.getVelocityAtTime=e,this.frameId=-1,this.v=new Array(r.k[0].s.length),this.pv=new Array(r.k[0].s.length),this.lastValue=new Array(r.k[0].s.length),this.lastPValue=new Array(r.k[0].s.length),this.lastFrame=y,a.bind(this)(i,r)}function l(t,e,s,i,a){var l;if(2===s)l=new v(t,e,a);else if(7===s)l=new P(t,e,a);else if(e.k.length)if("number"==typeof e.k[0])l=new n(t,e,i);else switch(s){case 0:l=new o(t,e,i);break;case 1:l=new h(t,e,i)}else l=new r(t,e,i);return(l.k||l.x)&&a.push(l),l}function p(){return this.v}function m(t,e,s){this.comp=t.comp,this.k=!1,this.mdf=!1,this.closed=3===s?e.cl:e.closed,this.numNodes=3===s?e.pt.k.v.length:e.ks.k.v.length,this.v=3===s?e.pt.k:e.ks.k;var i=3===s?e.pt:e.ks;this.getValue=p,this.pv=this.v,a.bind(this)(t,i)}function f(t,e,s){this.comp=t.comp,this.offsetTime=t.data.st,this.getValue=i,this.keyframes=3===s?e.pt.k:e.ks.k,this.k=!0,this.closed=3===s?e.cl:e.closed;var r,n=this.keyframes[0].s[0].i.length,o=this.keyframes[0].s[0].i[0].length;for(this.numNodes=n,this.v={i:new Array(n),o:new Array(n),v:new Array(n)},this.pv={i:new Array(n),o:new Array(n),v:new Array(n)},r=0;n>r;r+=1)this.v.i[r]=new Array(o),this.v.o[r]=new Array(o),this.v.v[r]=new Array(o),this.pv.i[r]=new Array(o),this.pv.o[r]=new Array(o),this.pv.v[r]=new Array(o);this.lastFrame=y;var h=3===s?e.pt:e.ks;a.bind(this)(t,h)}function d(t,e,s,i,a){var r;if(3===s||4===s){var n=3===s?e.pt.k:e.ks.k;r=n.length?new f(t,e,s):new m(t,e,s)}else 5===s?r=new E(t,e):6===s?r=new g(t,e):7===s&&(r=new b(t,e));var o=!1;if(a)for(var h=0,l=a.length;l>h;){if(!a[h].closed){o=!0;break}h+=1}return o&&(r=new k(r,a)),r.k&&i.push(r),r}function c(t,e,s,i){return new S(t,e,s,i)}function u(t,e,s){switch(e.t){case 0:return new x(t,e,s);case 1:return new C(t,e)}}var y=-999999,v=function(){function t(){return this.p.k&&this.getValue(),this.p.pv}function e(){return this.a.k&&this.getValue(),this.a.pv}function s(){return this.or.k&&this.getValue(),this.or.pv}function i(){return this.r.k&&this.getValue(),this.r.pv}function a(){return this.s.k&&this.getValue(),this.s.pv}function r(){return this.o.k&&this.o.getValue(),this.o.pv}function n(){return this.sk.k&&this.sk.getValue(),this.sk.pv}function o(){return this.sa.k&&this.sa.getValue(),this.sa.pv}function h(t,e){var s,i=this.dynamicProperties.length;if(e){for(s=0;i>s;s+=1)this.dynamicProperties[s].getValue(),this.dynamicProperties[s].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])}else this.a&&t.translate(-this.a.pv[0],-this.a.pv[1],this.a.pv[2]),this.s&&t.scale(this.s.pv[0],this.s.pv[1],this.s.pv[2]),this.r?t.rotate(-this.r.pv):t.rotateZ(-this.rz.pv).rotateY(this.ry.pv).rotateX(this.rx.pv).rotateZ(-this.or.pv[2]).rotateY(this.or.pv[1]).rotateX(this.or.pv[0]),this.data.p.s?this.data.p.z?t.translate(this.px.pv,this.py.pv,-this.pz.pv):t.translate(this.px.pv,this.py.pv,0):t.translate(this.p.pv[0],this.p.pv[1],-this.p.pv[2])}function p(){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.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.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]))}}function m(){this.inverted=!0,this.iv=new Matrix,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]))}return function(f,d,c){this.elem=f,this.frameId=-1,this.dynamicProperties=[],this.mdf=!1,this.data=d,this.getValue=p,this.applyToMatrix=h,this.setInverted=m,this.v=new Matrix,d.p.s?(this.px=l(f,d.p.x,0,0,this.dynamicProperties),this.py=l(f,d.p.y,0,0,this.dynamicProperties),d.p.z&&(this.pz=l(f,d.p.z,0,0,this.dynamicProperties))):this.p=l(f,d.p,1,0,this.dynamicProperties),d.r?this.r=l(f,d.r,0,degToRads,this.dynamicProperties):d.rx&&(this.rx=l(f,d.rx,0,degToRads,this.dynamicProperties),this.ry=l(f,d.ry,0,degToRads,this.dynamicProperties),this.rz=l(f,d.rz,0,degToRads,this.dynamicProperties),this.or=l(f,d.or,0,degToRads,this.dynamicProperties)),d.sk&&(this.sk=l(f,d.sk,0,degToRads,this.dynamicProperties),this.sa=l(f,d.sa,0,degToRads,this.dynamicProperties)),d.a&&(this.a=l(f,d.a,1,0,this.dynamicProperties)),d.s&&(this.s=l(f,d.s,1,.01,this.dynamicProperties)),this.o=d.o?l(f,d.o,0,.01,c):{mdf:!1,v:1},this.dynamicProperties.length?c.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?d.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,"orientation",{get:s}),Object.defineProperty(this,"anchorPoint",{get:e}),Object.defineProperty(this,"rotation",{get:i}),Object.defineProperty(this,"scale",{get:a}),Object.defineProperty(this,"opacity",{get:r}),Object.defineProperty(this,"skew",{get:n}),Object.defineProperty(this,"skewAxis",{get:o})}}(),g=function(){function t(){var t=this.p.v[0],e=this.p.v[1],i=this.s.v[0]/2,a=this.s.v[1]/2;2!==this.d&&3!==this.d?(this.v.v[0]=[t,e-a],this.v.i[0]=[t-i*s,e-a],this.v.o[0]=[t+i*s,e-a],this.v.v[1]=[t+i,e],this.v.i[1]=[t+i,e-a*s],this.v.o[1]=[t+i,e+a*s],this.v.v[2]=[t,e+a],this.v.i[2]=[t+i*s,e+a],this.v.o[2]=[t-i*s,e+a],this.v.v[3]=[t-i,e],this.v.i[3]=[t-i,e+a*s],this.v.o[3]=[t-i,e-a*s]):(this.v.v[0]=[t,e-a],this.v.o[0]=[t-i*s,e-a],this.v.i[0]=[t+i*s,e-a],this.v.v[1]=[t-i,e],this.v.o[1]=[t-i,e+a*s],this.v.i[1]=[t-i,e-a*s],this.v.v[2]=[t,e+a],this.v.o[2]=[t+i*s,e+a],this.v.i[2]=[t-i*s,e+a],this.v.v[3]=[t+i,e],this.v.o[3]=[t+i,e-a*s],this.v.i[3]=[t+i,e+a*s])}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 s=.5519;return function(s,i){this.v={v:new Array(4),i:new Array(4),o:new Array(4),c:!0},this.numNodes=4,this.d=i.d,this.dynamicProperties=[],i.closed=!0,this.closed=!0,this.elem=s,this.comp=s.comp,this.frameId=-1,this.mdf=!1,this.getValue=e,this.convertEllToPath=t,this.p=l(s,i.p,1,0,this.dynamicProperties),this.s=l(s,i.s,1,0,this.dynamicProperties),this.dynamicProperties.length?this.k=!0:this.convertEllToPath()}}(),b=function(){function t(){var t=Math.floor(this.pt.v),e=2*Math.PI/t;this.v.v.length=t,this.v.i.length=t,this.v.o.length=t;var s,i=this.or.v,a=this.os.v,r=2*Math.PI*i/(4*t),n=-Math.PI/2,o=3===this.data.d?-1:1;for(n+=this.r.v,s=0;t>s;s+=1){var h=i*Math.cos(n),l=i*Math.sin(n),p=0===h&&0===l?0:l/Math.sqrt(h*h+l*l),m=0===h&&0===l?0:-h/Math.sqrt(h*h+l*l);h+=+this.p.v[0],l+=+this.p.v[1],this.v.v[s]=[h,l],this.v.i[s]=[h+p*r*a*o,l+m*r*a*o],this.v.o[s]=[h-p*r*a*o,l-m*r*a*o],n+=e*o}this.numNodes=t}function e(){var t=2*Math.floor(this.pt.v),e=2*Math.PI/t;this.v.v.length=t,this.v.i.length=t,this.v.o.length=t;var s,i,a,r,n=!0,o=this.or.v,h=this.ir.v,l=this.os.v,p=this.is.v,m=2*Math.PI*o/(2*t),f=2*Math.PI*h/(2*t),d=-Math.PI/2;d+=this.r.v;var c=3===this.data.d?-1:1;for(s=0;t>s;s+=1){i=n?o:h,a=n?l:p,r=n?m:f;var u=i*Math.cos(d),y=i*Math.sin(d),v=0===u&&0===y?0:y/Math.sqrt(u*u+y*y),g=0===u&&0===y?0:-u/Math.sqrt(u*u+y*y);u+=+this.p.v[0],y+=+this.p.v[1],this.v.v[s]=[u,y],this.v.i[s]=[u+v*r*a*c,y+g*r*a*c],this.v.o[s]=[u-v*r*a*c,y-g*r*a*c],n=!n,d+=e*c}this.numNodes=t}function s(){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(i,a){this.v={v:[],i:[],o:[],c:!0},this.elem=i,this.comp=i.comp,this.data=a,this.frameId=-1,this.d=a.d,this.dynamicProperties=[],this.mdf=!1,a.closed=!0,this.closed=!0,this.getValue=s,1===a.sy?(this.ir=l(i,a.ir,0,0,this.dynamicProperties),this.is=l(i,a.is,0,.01,this.dynamicProperties),this.convertToPath=e):this.convertToPath=t,this.pt=l(i,a.pt,0,0,this.dynamicProperties),this.p=l(i,a.p,1,0,this.dynamicProperties),this.r=l(i,a.r,0,degToRads,this.dynamicProperties),this.or=l(i,a.or,0,0,this.dynamicProperties),this.os=l(i,a.os,0,.01,this.dynamicProperties),this.dynamicProperties.length?this.k=!0:this.convertToPath()}}(),E=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=bm_min(s,i,this.r.v),r=a*(1-.5519);2===this.d||1===this.d?(this.v.v[0]=[t+s,e-i+a],this.v.o[0]=this.v.v[0],this.v.i[0]=[t+s,e-i+r],this.v.v[1]=[t+s,e+i-a],this.v.o[1]=[t+s,e+i-r],this.v.i[1]=this.v.v[1],this.v.v[2]=[t+s-a,e+i],this.v.o[2]=this.v.v[2],this.v.i[2]=[t+s-r,e+i],this.v.v[3]=[t-s+a,e+i],this.v.o[3]=[t-s+r,e+i],this.v.i[3]=this.v.v[3],this.v.v[4]=[t-s,e+i-a],this.v.o[4]=this.v.v[4],this.v.i[4]=[t-s,e+i-r],this.v.v[5]=[t-s,e-i+a],this.v.o[5]=[t-s,e-i+r],this.v.i[5]=this.v.v[5],this.v.v[6]=[t-s+a,e-i],this.v.o[6]=this.v.v[6],this.v.i[6]=[t-s+r,e-i],this.v.v[7]=[t+s-a,e-i],this.v.o[7]=[t+s-r,e-i],this.v.i[7]=this.v.v[7]):(this.v.v[0]=[t+s,e-i+a],this.v.o[0]=[t+s,e-i+r],this.v.i[0]=this.v.v[0],this.v.v[1]=[t+s-a,e-i],this.v.o[1]=this.v.v[1],this.v.i[1]=[t+s-r,e-i],this.v.v[2]=[t-s+a,e-i],this.v.o[2]=[t-s+r,e-i],this.v.i[2]=this.v.v[2],this.v.v[3]=[t-s,e-i+a],this.v.o[3]=this.v.v[3],this.v.i[3]=[t-s,e-i+r],this.v.v[4]=[t-s,e+i-a],this.v.o[4]=[t-s,e+i-r],this.v.i[4]=this.v.v[4],this.v.v[5]=[t-s+a,e+i],this.v.o[5]=this.v.v[5],this.v.i[5]=[t-s+r,e+i],this.v.v[6]=[t+s-a,e+i],this.v.o[6]=[t+s-r,e+i],this.v.i[6]=this.v.v[6],this.v.v[7]=[t+s,e+i-a],this.v.o[7]=this.v.v[7],this.v.i[7]=[t+s,e+i-r])}return function(s,i){this.v={v:new Array(8),i:new Array(8),o:new Array(8),c:!0},this.numNodes=8,this.elem=s,this.comp=s.comp,this.frameId=-1,this.d=i.d,this.dynamicProperties=[],this.mdf=!1,i.closed=!0,this.closed=!0,this.getValue=t,this.convertRectToPath=e,this.p=l(s,i.p,1,0,this.dynamicProperties),this.s=l(s,i.s,1,0,this.dynamicProperties),this.r=l(s,i.r,0,0,this.dynamicProperties),this.dynamicProperties.length?this.k=!0:this.convertRectToPath()}}(),P=function(){function t(t){if(this.elem.globalData.frameId!==this.frameId||t){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(),this.dynamicProperties[e].mdf&&(this.mdf=!0);if(this.mdf||t){var i=this.o.v%360/360;if(0===i&&0===this.s.v&&1==this.e.v)return void(this.isTrimming=!1);this.isTrimming=!0,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}}}return function(e,s){this.elem=e,this.frameId=-1,this.dynamicProperties=[],this.sValue=0,this.eValue=0,this.oValue=0,this.mdf=!1,this.getValue=t,this.k=!1,this.isTrimming=!1,this.comp=e.comp,
this.s=l(e,s.s,0,.01,this.dynamicProperties),this.e=l(e,s.e,0,.01,this.dynamicProperties),this.o=l(e,s.o,0,0,this.dynamicProperties),this.dynamicProperties.length?this.k=!0:this.getValue(!0)}}(),k=function(){function t(t,e){this.totalLength=0;var s,i=t.v,a=t.o,r=t.i,n=i.length;for(s=0;n-1>s;s+=1)this.lengths[s]=bez.getBezierLength(i[s],i[s+1],a[s],r[s+1]),this.totalLength+=this.lengths[s].addedLength;e&&(this.lengths[s]=bez.getBezierLength(i[s],i[0],a[s],r[0]),this.totalLength+=this.lengths[s].addedLength)}function e(t,e,s,i,a){this.nextO[this.segmentCount]=e,this.nextI[this.segmentCount+1]=s,this.nextV[this.segmentCount+1]=i,this.pathStarted?this.nextV[this.segmentCount]=t:(this.pathStarted=!0,this.v.s[this.segmentCount]=t),this.segmentCount+=1}function s(t){this.mdf=t?!0:!1,this.prop.k&&this.prop.getValue();var e=0,s=this.trims.length;for(this.pathStarted=!1;s>e;){if(this.trims[e].mdf){this.mdf=!0;break}e+=1}if(this.mdf=this.prop.mdf?!0:this.mdf,this.mdf){this.nextO.length=0,this.nextI.length=0,this.nextV.length=0,this.v.s.length=0;var i=this.prop.closed;this.getSegmentsLength(this.prop.v,i);var a,r,n,o,h,l,p=this.prop.v,m=this.trims.length;for(a=0;m>a;a+=1)if(this.trims[a].isTrimming){if(r=this.trims[a].eValue,n=this.trims[a].sValue,o=this.trims[a].oValue,r===n)return this.v.v=this.nextV,this.v.o=this.nextO,void(this.v.i=this.nextI);1>=r?(this.segments[0].s=this.totalLength*n,this.segments[0].e=this.totalLength*r,this.segments[1].vl=!1):n>=1?(this.segments[0].s=this.totalLength*(n-1),this.segments[0].e=this.totalLength*(r-1),this.segments[1].vl=!1):(this.segments[0].s=this.totalLength*n,this.segments[0].e=this.totalLength,this.segments[1].s=0,this.segments[1].e=this.totalLength*(r-1),this.segments[1].vl=!0),this.v.v=p.v,this.v.o=p.o,this.v.i=p.i,l=this.v.v.length;var f=0,d=0;s=this.segments[1].vl?2:1;var c;for(this.segmentCount=0,e=0;s>e;e+=1){for(f=0,h=1;l>h;h++)if(d=this.lengths[h-1].addedLength,f+d<this.segments[e].s)f+=d;else{if(f>this.segments[e].e)break;this.segments[e].s<=f&&this.segments[e].e>=f+d?this.addSegment(this.v.v[h-1],this.v.o[h-1],this.v.i[h],this.v.v[h],this.lengths[h-1]):(c=bez.getNewSegment(this.v.v[h-1],this.v.v[h],this.v.o[h-1],this.v.i[h],(this.segments[e].s-f)/d,(this.segments[e].e-f)/d,this.lengths[h-1]),this.addSegment(c.pt1,c.pt3,c.pt4,c.pt2)),f+=d}i!==!1?f<=this.segments[e].e&&(d=this.lengths[h-1].addedLength,this.segments[e].s<=f&&this.segments[e].e>=f+d?this.addSegment(this.v.v[h-1],this.v.o[h-1],this.v.i[0],this.v.v[0],this.lengths[h-1]):(c=bez.getNewSegment(this.v.v[h-1],this.v.v[0],this.v.o[h-1],this.v.i[0],(this.segments[e].s-f)/d,(this.segments[e].e-f)/d,this.lengths[h-1]),this.addSegment(c.pt1,c.pt3,c.pt4,c.pt2))):this.pathStarted=!1}i=!1}else this.v.v=p.v,this.v.o=p.o,this.v.i=p.i;this.nextV.length?(this.v.v=this.nextV,this.v.o=this.nextO,this.v.i=this.nextI):this.v.s.length=0,this.v.c=i}}return function(i,a){this.trims=[],this.k=!1,this.mdf=!1,this.ty="tm",this.pathStarted=!1,this.segments=[{s:0,e:0,vl:!0},{s:0,e:0,vl:!1}],this.nextO=[],this.nextV=[],this.nextI=[],this.v={i:null,o:null,v:null,s:[],c:!1};var r,n=a.length;for(r=0;n>r;r+=1)a[r].closed||(this.k=a[r].trimProp.k?!0:this.k,this.trims.push(a[r].trimProp));this.prop=i,this.prop.numNodes?(n=this.prop.numNodes-1,n+=this.prop.closed?1:0,this.lengths=new Array(n)):this.lengths=[],this.k=i.k?!0:this.k,this.totalLength=0,this.getValue=s,this.addSegment=e,this.getSegmentsLength=t,this.k||(this.prop.getValue(),this.getValue(!0))}}(),S=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,o=s.length;for(r=0;o>r;r+=1)n=l(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)}}(),C=function(){function t(t,e){return this.textIndex=t+1,this.textTotal=e,this.getValue(),this.v}return function(e,s){this.pv=1,this.comp=e.comp,this.mult=.01,this.type="textSelector",this.textTotal=s.totalChars,this.selectorValue=100,this.lastValue=[1,1,1],a.bind(this)(e,s),this.getMult=t}}(),x=function(){function t(){if(this.dynamicProperties.length){var t,e=this.dynamicProperties.length;for(t=0;e>t;t+=1)this.dynamicProperties[t].getValue()}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 o=r;r=n,n=o}this.finalS=r,this.finalE=n}function e(t){var e=BezierFactory.getBezierEasing(this.ne.v/100,0,1-this.xe.v/100,1).get,r=0,n=this.finalS,o=this.finalE,h=this.data.sh;if(2==h)r=o===n?t>=o?1:0:s(0,i(.5/(o-n)+(t-n)/(o-n),1)),r=e(r);else if(3==h)r=o===n?t>=o?0:1:1-s(0,i(.5/(o-n)+(t-n)/(o-n),1)),r=e(r);else if(4==h)o===n?r=t>=o?0:1:(r=s(0,i(.5/(o-n)+(t-n)/(o-n),1)),.5>r?r*=2:r=1-r);else if(5==h)if(o===n)r=t>=o?0:1;else{var l=o-n;r=-4/(l*l)*t*t+4/l*t}else 6==h?r=o===n?t>=o?0:1:(1+(Math.cos(Math.PI+2*Math.PI*(t-n)/(o-n))+0))/2:t>=a(n)&&(r=0>t-n?1-(n-t):s(0,i(o-t,1)));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=l(s,i.s||{k:0},0,0,this.dynamicProperties),this.e="e"in i?l(s,i.e,0,0,this.dynamicProperties):{v:2===i.r?i.totalChars:100},this.o=l(s,i.o||{k:0},0,0,this.dynamicProperties),this.xe=l(s,i.xe||{k:0},0,0,this.dynamicProperties),this.ne=l(s,i.ne||{k:0},0,0,this.dynamicProperties),this.a=l(s,i.a,0,.01,this.dynamicProperties),this.dynamicProperties.length?a.push(this):this.getValue()}}(),w={};return w.getProp=l,w.getShapeProp=d,w.getDashProp=c,w.getTextSelectorProp=u,w}();SVGRenderer.prototype.createItem=function(t,e,s,i){switch(t.ty){case 2:return this.createImage(t,e,s,i);case 0:return this.createComp(t,e,s,i);case 1:return this.createSolid(t,e,s,i);case 4:return this.createShape(t,e,s,i);case 5:return this.createText(t,e,s,i);case 99:return this.createPlaceHolder(t,e)}return this.createBase(t,e,s)},SVGRenderer.prototype.buildItems=function(t,e,s,i,a){var r,n=t.length;s||(s=this.elements),e||(e=this.animationItem.container),i||(i=this);var o;for(r=n-1;r>=0;r--)s[r]=this.createItem(t[r],e,i,a),0===t[r].ty&&(o=[],this.buildItems(t[r].layers,s[r].getDomElement(),o,s[r],s[r].placeholder),s[r].setElements(o)),t[r].td&&s[r+1].setMatte(s[r].layerId)},SVGRenderer.prototype.includeLayers=function(t,e,s){var i,a=t.length;s||(s=this.elements),e||(e=this.animationItem.container);var r,n,o,h=s.length;for(i=0;a>i;i+=1)for(r=0;h>r;){if(s[r].data.id==t[i].id){o=s[r],s[r]=this.createItem(t[i],e,this,o),0===t[i].ty&&(n=[],this.buildItems(t[i].layers,s[r].getDomElement(),n,s[r],s[i].placeholder),s[r].setElements(n));break}r+=1}for(i=0;a>i;i+=1)t[i].td&&s[i+1].setMatte(s[i].layerId)},SVGRenderer.prototype.createBase=function(t,e,s,i){return new SVGBaseElement(t,e,this.globalData,s,i)},SVGRenderer.prototype.createPlaceHolder=function(t,e){return new PlaceHolderElement(t,e,this.globalData)},SVGRenderer.prototype.createShape=function(t,e,s,i){return new IShapeElement(t,e,this.globalData,s,i)},SVGRenderer.prototype.createText=function(t,e,s,i){return new SVGTextElement(t,e,this.globalData,s,i)},SVGRenderer.prototype.createImage=function(t,e,s,i){return new IImageElement(t,e,this.globalData,s,i)},SVGRenderer.prototype.createComp=function(t,e,s,i){return new ICompElement(t,e,this.globalData,s,i)},SVGRenderer.prototype.createSolid=function(t,e,s,i){return new ISolidElement(t,e,this.globalData,s,i)},SVGRenderer.prototype.configAnimation=function(t){this.animationItem.container=document.createElementNS(svgNS,"svg"),this.animationItem.container.setAttribute("xmlns","http://www.w3.org/2000/svg"),this.animationItem.container.setAttribute("width",t.w),this.animationItem.container.setAttribute("height",t.h),this.animationItem.container.setAttribute("viewBox","0 0 "+t.w+" "+t.h),this.animationItem.container.setAttribute("preserveAspectRatio","xMidYMid meet"),this.animationItem.container.style.width="100%",this.animationItem.container.style.height="100%",this.animationItem.container.style.transform="translate3d(0,0,0)",this.animationItem.container.style.transformOrigin=this.animationItem.container.style.mozTransformOrigin=this.animationItem.container.style.webkitTransformOrigin=this.animationItem.container.style["-webkit-transform"]="0px 0px 0px",this.animationItem.wrapper.appendChild(this.animationItem.container);var e=document.createElementNS(svgNS,"defs");this.globalData.defs=e,this.animationItem.container.appendChild(e),this.globalData.getAssetData=this.animationItem.getAssetData.bind(this.animationItem),this.globalData.getPath=this.animationItem.getPath.bind(this.animationItem),this.globalData.elementLoaded=this.animationItem.elementLoaded.bind(this.animationItem),this.globalData.frameId=0,this.globalData.compSize={w:t.w,h:t.h},this.globalData.frameRate=t.fr;var s=document.createElementNS(svgNS,"clipPath"),i=document.createElementNS(svgNS,"rect");i.setAttribute("width",t.w),i.setAttribute("height",t.h),i.setAttribute("x",0),i.setAttribute("y",0);var a="animationMask_"+randomString(10);s.setAttribute("id",a),s.appendChild(i);var r=document.createElementNS(svgNS,"g");r.setAttribute("clip-path","url(#"+a+")"),this.animationItem.container.appendChild(r),e.appendChild(s),this.animationItem.container=r,this.layers=t.layers,this.globalData.fontManager=new FontManager,this.globalData.fontManager.addChars(t.chars),this.globalData.fontManager.addFonts(t.fonts,e)},SVGRenderer.prototype.buildStage=function(t,e,s){var i,a,r=e.length;for(s||(s=this.elements),i=r-1;i>=0;i--)a=e[i],void 0!==a.parent&&this.buildItemParenting(a,s[i],e,a.parent,s,!0),0===a.ty&&this.buildStage(s[i].getComposingElement(),a.layers,s[i].getElements())},SVGRenderer.prototype.buildItemParenting=function(t,e,s,i,a,r){t.parents||(t.parents=[]),r&&e.resetHierarchy();for(var n=0,o=s.length;o>n;)s[n].ind==i&&(e.getHierarchy().push(a[n]),void 0!==s[n].parent&&this.buildItemParenting(t,e,s,s[n].parent,a,!1)),n+=1},SVGRenderer.prototype.destroy=function(){this.animationItem.wrapper.innerHTML="",this.animationItem.container=null,this.globalData.defs=null;var t,e=this.layers.length;for(t=0;e>t;t++)this.elements[t].destroy();this.elements.length=0,this.destroyed=!0},SVGRenderer.prototype.updateContainerSize=function(){},SVGRenderer.prototype.renderFrame=function(t){if(this.renderedFrame!=t&&!this.destroyed){null===t?t=this.renderedFrame:this.renderedFrame=t,this.globalData.frameNum=t,this.globalData.frameId+=1;var e,s=this.layers.length;for(e=0;s>e;e++)this.elements[e].prepareFrame(t-this.layers[e].st);for(e=0;s>e;e++)this.elements[e].renderFrame()}},SVGRenderer.prototype.hide=function(){this.animationItem.container.style.display="none"},SVGRenderer.prototype.show=function(){this.animationItem.container.style.display="block"},extendPrototype(ExpressionComp,SVGRenderer),CanvasRenderer.prototype.createItem=function(t,e){switch(t.ty){case 0:return this.createComp(t,e);case 1:return this.createSolid(t,e);case 2:return this.createImage(t,e);case 4:return this.createShape(t,e);case 5:return this.createText(t,e);case 99:return this.createPlaceHolder(t,e);default:return this.createBase(t,e)}return this.createBase(t,e)},CanvasRenderer.prototype.buildItems=function(t,e,s){e||(e=this.elements),s||(s=this);var i,a=t.length;for(i=0;a>i;i++)if(e[i]=this.createItem(t[i],s),0===t[i].ty){var r=[];this.buildItems(t[i].layers,r,e[i]),e[e.length-1].setElements(r)}},CanvasRenderer.prototype.includeLayers=function(t,e,s){var i,a=t.length;s||(s=this.elements);var r,n,o=s.length;for(i=0;a>i;i+=1)for(r=0;o>r;){if(s[r].data.id==t[i].id){s[r]=this.createItem(t[i],this),0===t[i].ty&&(n=[],this.buildItems(t[i].layers,n,s[r]),s[r].setElements(n));break}r+=1}},CanvasRenderer.prototype.createBase=function(t,e){return new CVBaseElement(t,e,this.globalData)},CanvasRenderer.prototype.createShape=function(t,e){return new CVShapeElement(t,e,this.globalData)},CanvasRenderer.prototype.createText=function(t,e){return new CVTextElement(t,e,this.globalData)},CanvasRenderer.prototype.createPlaceHolder=function(t){return new PlaceHolderElement(t,null,this.globalData)},CanvasRenderer.prototype.createImage=function(t,e){return new CVImageElement(t,e,this.globalData)},CanvasRenderer.prototype.createComp=function(t,e){return new CVCompElement(t,e,this.globalData)},CanvasRenderer.prototype.createSolid=function(t,e){return new CVSolidElement(t,e,this.globalData)},CanvasRenderer.prototype.ctxTransform=function(t){if(1!==t[0]||0!==t[1]||0!==t[4]||1!==t[5]||0!==t[12]||0!==t[13]){if(!this.renderConfig.clearCanvas)return void this.canvasContext.transform(t[0],t[1],t[4],t[5],t[12],t[13]);this.transformMat.cloneFromProps(t),this.transformMat.transform(this.contextData.cTr.props[0],this.contextData.cTr.props[1],this.contextData.cTr.props[2],this.contextData.cTr.props[3],this.contextData.cTr.props[4],this.contextData.cTr.props[5],this.contextData.cTr.props[6],this.contextData.cTr.props[7],this.contextData.cTr.props[8],this.contextData.cTr.props[9],this.contextData.cTr.props[10],this.contextData.cTr.props[11],this.contextData.cTr.props[12],this.contextData.cTr.props[13],this.contextData.cTr.props[14],this.contextData.cTr.props[15]),this.contextData.cTr.cloneFromProps(this.transformMat.props);var e=this.contextData.cTr.props;this.canvasContext.setTransform(e[0],e[1],e[4],e[5],e[12],e[13])}},CanvasRenderer.prototype.ctxOpacity=function(t){if(1!==t){if(!this.renderConfig.clearCanvas)return void(this.canvasContext.globalAlpha*=0>t?0:t);this.contextData.cO*=0>t?0:t,this.canvasContext.globalAlpha=this.contextData.cO}},CanvasRenderer.prototype.reset=function(){return this.renderConfig.clearCanvas?(this.contextData.cArrPos=0,this.contextData.cTr.reset(),void(this.contextData.cO=1)):void this.canvasContext.restore()},CanvasRenderer.prototype.save=function(t){if(!this.renderConfig.clearCanvas)return void this.canvasContext.save();t&&this.canvasContext.save();var e=this.contextData.cTr.props;(null===this.contextData.saved[this.contextData.cArrPos]||void 0===this.contextData.saved[this.contextData.cArrPos])&&(this.contextData.saved[this.contextData.cArrPos]=new Array(16));var s,i=this.contextData.saved[this.contextData.cArrPos];for(s=0;16>s;s+=1)i[s]=e[s];this.contextData.savedOp[this.contextData.cArrPos]=this.contextData.cO,this.contextData.cArrPos+=1},CanvasRenderer.prototype.restore=function(t){if(!this.renderConfig.clearCanvas)return void this.canvasContext.restore();t&&this.canvasContext.restore(),this.contextData.cArrPos-=1;var e,s=this.contextData.saved[this.contextData.cArrPos],i=this.contextData.cTr.props;for(e=0;16>e;e+=1)i[e]=s[e];this.canvasContext.setTransform(s[0],s[1],s[4],s[5],s[12],s[13]),s=this.contextData.savedOp[this.contextData.cArrPos],this.contextData.cO=s,this.canvasContext.globalAlpha=s},CanvasRenderer.prototype.configAnimation=function(t){this.animationItem.wrapper?(this.animationItem.container=document.createElement("canvas"),this.animationItem.container.style.width="100%",this.animationItem.container.style.height="100%",this.animationItem.container.style.transformOrigin=this.animationItem.container.style.mozTransformOrigin=this.animationItem.container.style.webkitTransformOrigin=this.animationItem.container.style["-webkit-transform"]="0px 0px 0px",this.animationItem.wrapper.appendChild(this.animationItem.container),this.canvasContext=this.animationItem.container.getContext("2d")):this.canvasContext=this.renderConfig.context,this.globalData.canvasContext=this.canvasContext,this.globalData.renderer=this,this.globalData.isDashed=!1,this.globalData.totalFrames=Math.floor(t.tf),this.globalData.compWidth=t.w,this.globalData.compHeight=t.h,this.globalData.frameRate=t.fr,this.globalData.frameId=0,this.layers=t.layers,this.transformCanvas={},this.transformCanvas.w=t.w,this.transformCanvas.h=t.h,this.updateContainerSize(),this.globalData.fontManager=new FontManager,this.globalData.fontManager.addChars(t.chars),this.globalData.fontManager.addFonts(t.fonts,document)},CanvasRenderer.prototype.updateContainerSize=function(){var t,e;if(this.animationItem.wrapper&&this.animationItem.container?(t=this.animationItem.wrapper.offsetWidth,e=this.animationItem.wrapper.offsetHeight,this.animationItem.container.setAttribute("width",t*this.renderConfig.dpr),this.animationItem.container.setAttribute("height",e*this.renderConfig.dpr)):(t=this.canvasContext.canvas.width*this.renderConfig.dpr,e=this.canvasContext.canvas.height*this.renderConfig.dpr),"fit"==this.renderConfig.scaleMode){var s=t/e,i=this.transformCanvas.w/this.transformCanvas.h;i>s?(this.transformCanvas.sx=t/(this.transformCanvas.w/this.renderConfig.dpr),this.transformCanvas.sy=t/(this.transformCanvas.w/this.renderConfig.dpr),this.transformCanvas.tx=0,this.transformCanvas.ty=(e-this.transformCanvas.h*(t/this.transformCanvas.w))/2*this.renderConfig.dpr):(this.transformCanvas.sx=e/(this.transformCanvas.h/this.renderConfig.dpr),this.transformCanvas.sy=e/(this.transformCanvas.h/this.renderConfig.dpr),this.transformCanvas.tx=(t-this.transformCanvas.w*(e/this.transformCanvas.h))/2*this.renderConfig.dpr,this.transformCanvas.ty=0)}else this.transformCanvas.sx=this.renderConfig.dpr,this.transformCanvas.sy=this.renderConfig.dpr,this.transformCanvas.tx=0,this.transformCanvas.ty=0;this.transformCanvas.props=[this.transformCanvas.sx,0,0,0,0,this.transformCanvas.sy,0,0,0,0,1,0,this.transformCanvas.tx,this.transformCanvas.ty,0,1],this.globalData.cWidth=t,this.globalData.cHeight=e},CanvasRenderer.prototype.buildStage=function(t,e,s){s||(s=this.elements);var i,a,r=e.length;for(i=r-1;i>=0;i--)a=e[i],void 0!==a.parent&&this.buildItemHierarchy(a,s[i],e,a.parent,s,!0),0==a.ty&&this.buildStage(null,a.layers,s[i].getElements())},CanvasRenderer.prototype.buildItemHierarchy=function(t,e,s,i,a,r){var n=0,o=s.length;for(r&&e.resetHierarchy();o>n;)s[n].ind===i&&(e.getHierarchy().push(a[n]),void 0!==s[n].parent&&this.buildItemHierarchy(t,e,s,s[n].parent,a,!1)),n+=1},CanvasRenderer.prototype.destroy=function(){this.renderConfig.clearCanvas&&(this.animationItem.wrapper.innerHTML="");var t,e=this.layers.length;for(t=e-1;t>=0;t-=1)this.elements[t].destroy();this.elements.length=0,this.globalData.canvasContext=null,this.animationItem.container=null,this.destroyed=!0},CanvasRenderer.prototype.renderFrame=function(t){if(!(this.renderedFrame==t&&this.renderConfig.clearCanvas===!0||this.destroyed||null===t)){this.renderedFrame=t,this.globalData.frameNum=t-this.animationItem.firstFrame,this.globalData.frameId+=1,this.renderConfig.clearCanvas===!0?(this.reset(),this.canvasContext.clearRect(0,0,this.transformCanvas.w,this.transformCanvas.h)):this.save(),this.ctxTransform(this.transformCanvas.props),this.canvasContext.beginPath(),this.canvasContext.rect(0,0,this.transformCanvas.w,this.transformCanvas.h),this.canvasContext.closePath(),this.canvasContext.clip();var e,s=this.layers.length;for(e=0;s>e;e++)this.elements[e].prepareFrame(t-this.layers[e].st);for(e=s-1;e>=0;e-=1)this.elements[e].renderFrame();this.renderConfig.clearCanvas!==!0&&this.restore()}},CanvasRenderer.prototype.hide=function(){this.animationItem.container.style.display="none"},CanvasRenderer.prototype.show=function(){this.animationItem.container.style.display="block"},extendPrototype(ExpressionComp,CanvasRenderer),HybridRenderer.prototype.createItem=function(t,e,s,i){switch(t.ty){case 2:return this.createImage(t,e,s,i);case 0:return this.createComp(t,e,s,i);case 1:return this.createSolid(t,e,s,i);case 4:return this.createShape(t,e,s,i);case 5:return this.createText(t,e,s,i);case 13:return this.createCamera(t,e,s,i);case 99:return this.createPlaceHolder(t,e)}return this.createBase(t,e,s)},HybridRenderer.prototype.buildItems=function(t,e,s,i,a){var r,n=t.length;s||(s=this.elements),i||(i=this);var o,h,l=!1;for(r=n-1;r>=0;r--)e?s[r]=this.createItem(t[r],e,i,a):t[r].ddd?(l||(l=!0,o=this.getThreeDContainer()),s[r]=this.createItem(t[r],o,i,a)):(l=!1,s[r]=this.createItem(t[r],this.animationItem.resizerElem,i,a)),0===t[r].ty&&(h=[],this.buildItems(t[r].layers,s[r].getDomElement(),h,s[r],s[r].placeholder),s[r].setElements(h)),t[r].td&&s[r+1].setMatte(s[r].layerId);if(this.currentContainer=this.animationItem.resizerElem,!e&&this.threeDElements.length)if(this.camera)this.camera.setup();else{var p=this.globalData.compSize.w,m=this.globalData.compSize.h;for(n=this.threeDElements.length,r=0;n>r;r+=1)this.threeDElements[0][r].style.perspective=this.threeDElements[0][r].style.webkitPerspective=Math.sqrt(Math.pow(p,2)+Math.pow(m,2))+"px"}},HybridRenderer.prototype.includeLayers=function(t,e,s){var i,a=t.length;s||(s=this.elements),e||(e=this.currentContainer);var r,n,o,h=s.length;for(i=0;a>i;i+=1)if(t[i].id)for(r=0;h>r;)s[r].data.id==t[i].id&&(o=s[r],s[r]=this.createItem(t[i],e,this,o),0===t[i].ty&&(n=[],this.buildItems(t[i].layers,s[r].getDomElement(),n,s[r],s[i].placeholder),s[r].setElements(n))),r+=1;else{var l=this.createItem(t[i],e,this);s.push(l),0===t[i].ty&&(n=[],this.buildItems(t[i].layers,l.getDomElement(),n,l),l.setElements(n))}for(i=0;a>i;i+=1)t[i].td&&s[i+1].setMatte(s[i].layerId)},HybridRenderer.prototype.createBase=function(t,e,s,i){return new SVGBaseElement(t,e,this.globalData,s,i)},HybridRenderer.prototype.createPlaceHolder=function(t,e){return new PlaceHolderElement(t,e,this.globalData)},HybridRenderer.prototype.createShape=function(t,e,s,i){return s.isSvg?new IShapeElement(t,e,this.globalData,s,i):new HShapeElement(t,e,this.globalData,s,i)},HybridRenderer.prototype.createText=function(t,e,s,i){return s.isSvg?new SVGTextElement(t,e,this.globalData,s,i):new HTextElement(t,e,this.globalData,s,i)},HybridRenderer.prototype.createCamera=function(t,e,s,i){return this.camera=new HCameraElement(t,e,this.globalData,s,i),this.camera},HybridRenderer.prototype.createImage=function(t,e,s,i){return s.isSvg?new IImageElement(t,e,this.globalData,s,i):new HImageElement(t,e,this.globalData,s,i)},HybridRenderer.prototype.createComp=function(t,e,s,i){return s.isSvg?new ICompElement(t,e,this.globalData,s,i):new HCompElement(t,e,this.globalData,s,i)},HybridRenderer.prototype.createSolid=function(t,e,s,i){return s.isSvg?new ISolidElement(t,e,this.globalData,s,i):new HSolidElement(t,e,this.globalData,s,i)},HybridRenderer.prototype.getThreeDContainer=function(){var t=document.createElement("div");styleDiv(t),t.style.width=this.globalData.compSize.w+"px",t.style.height=this.globalData.compSize.h+"px",t.style.transformOrigin=t.style.mozTransformOrigin=t.style.webkitTransformOrigin="50% 50%";var e=document.createElement("div");return styleDiv(e),e.style.transform=e.style.webkitTransform="matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1)",t.appendChild(e),this.animationItem.resizerElem.appendChild(t),this.threeDElements.push([t,e]),e},HybridRenderer.prototype.configAnimation=function(t){var e=document.createElement("div"),s=this.animationItem.wrapper;e.style.width=t.w+"px",e.style.height=t.h+"px",this.animationItem.resizerElem=e,styleDiv(e),e.style.transformStyle=e.style.webkitTransformStyle=e.style.mozTransformStyle="flat",s.appendChild(e),e.style.overflow="hidden";var i=document.createElementNS(svgNS,"svg");i.setAttribute("width","1"),i.setAttribute("height","1"),styleDiv(i),this.animationItem.resizerElem.appendChild(i);var a=document.createElementNS(svgNS,"defs");i.appendChild(a),this.globalData.defs=a,this.globalData.getAssetData=this.animationItem.getAssetData.bind(this.animationItem),this.globalData.getPath=this.animationItem.getPath.bind(this.animationItem),this.globalData.elementLoaded=this.animationItem.elementLoaded.bind(this.animationItem),this.globalData.frameId=0,this.globalData.compSize={w:t.w,h:t.h},this.globalData.frameRate=t.fr,this.layers=t.layers,this.globalData.fontManager=new FontManager,this.globalData.fontManager.addChars(t.chars),this.globalData.fontManager.addFonts(t.fonts,i),this.updateContainerSize()},HybridRenderer.prototype.buildStage=function(t,e,s){var i,a,r=e.length;for(s||(s=this.elements),i=r-1;i>=0;i--)a=e[i],void 0!==a.parent&&this.buildItemParenting(a,s[i],e,a.parent,s,!0),0===a.ty&&this.buildStage(s[i].getComposingElement(),a.layers,s[i].getElements())},HybridRenderer.prototype.buildItemParenting=function(t,e,s,i,a,r){t.parents||(t.parents=[]),r&&e.resetHierarchy();for(var n=0,o=s.length;o>n;)s[n].ind==i&&(e.getHierarchy().push(a[n]),13===e.data.ty&&a[n].finalTransform.mProp.setInverted(),void 0!==s[n].parent&&this.buildItemParenting(t,e,s,s[n].parent,a,!1)),n+=1},HybridRenderer.prototype.destroy=function(){this.animationItem.wrapper.innerHTML="",this.animationItem.container=null,this.globalData.defs=null;var t,e=this.layers.length;for(t=0;e>t;t++)this.elements[t].destroy();this.elements.length=0,this.destroyed=!0},HybridRenderer.prototype.updateContainerSize=function(){var t,e,s,i,a=this.animationItem.wrapper.offsetWidth,r=this.animationItem.wrapper.offsetHeight,n=a/r,o=this.globalData.compSize.w/this.globalData.compSize.h;o>n?(t=a/this.globalData.compSize.w,e=a/this.globalData.compSize.w,s=0,i=(r-this.globalData.compSize.h*(a/this.globalData.compSize.w))/2):(t=r/this.globalData.compSize.h,e=r/this.globalData.compSize.h,s=(a-this.globalData.compSize.w*(r/this.globalData.compSize.h))/2,i=0),this.animationItem.resizerElem.style.transform=this.animationItem.resizerElem.style.webkitTransform="matrix3d("+t+",0,0,0,0,"+e+",0,0,0,0,1,0,"+s+","+i+",0,1)"},HybridRenderer.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;var e,s=this.layers.length;for(e=0;s>e;e++)this.elements[e].prepareFrame(t-this.layers[e].st);for(e=0;s>e;e++)this.elements[e].renderFrame()}},HybridRenderer.prototype.hide=function(){this.animationItem.resizerElem.style.display="none"},HybridRenderer.prototype.show=function(){this.animationItem.resizerElem.style.display="block"},extendPrototype(ExpressionComp,HybridRenderer),MaskElement.prototype.getMaskProperty=function(t){return this.viewData[t].prop},MaskElement.prototype.prepareFrame=function(){var t,e=this.dynamicProperties.length;for(t=0;e>t;t+=1)this.dynamicProperties[t].getValue()},MaskElement.prototype.renderFrame=function(){var t,e=this.masksProperties.length;for(t=0;e>t;t++)if("n"!==this.masksProperties[t].mode&&this.masksProperties[t].cl!==!1&&((this.viewData[t].prop.mdf||this.firstFrame)&&this.drawPath(this.masksProperties[t],this.viewData[t].prop.v,this.viewData[t]),this.storedData[t].x&&(this.storedData[t].x.mdf||this.firstFrame))){var s=this.storedData[t].expan;this.storedData[t].x.v<0?("erode"!==this.storedData[t].lastOperator&&(this.storedData[t].lastOperator="erode",this.storedData[t].elem.setAttribute("filter","url(#"+this.storedData[t].filterId+")")),s.setAttribute("radius",-this.storedData[t].x.v)):("dilate"!==this.storedData[t].lastOperator&&(this.storedData[t].lastOperator="dilate",this.storedData[t].elem.setAttribute("filter",null)),this.storedData[t].elem.setAttribute("stroke-width",2*this.storedData[t].x.v))}this.firstFrame=!1},MaskElement.prototype.getMaskelement=function(){return this.maskElement},MaskElement.prototype.createLayerSolidPath=function(){var t="M0,0 ";return t+=" h"+this.globalData.compSize.w,t+=" v"+this.globalData.compSize.h,t+=" h-"+this.globalData.compSize.w,t+=" v-"+this.globalData.compSize.h+" "},MaskElement.prototype.drawPath=function(t,e,s){var i,a,r="";for(a=e.v.length,i=1;a>i;i+=1)1==i&&(r+=" M"+bm_rnd(e.v[0][0])+","+bm_rnd(e.v[0][1])),r+=" C"+bm_rnd(e.o[i-1][0])+","+bm_rnd(e.o[i-1][1])+" "+bm_rnd(e.i[i][0])+","+bm_rnd(e.i[i][1])+" "+bm_rnd(e.v[i][0])+","+bm_rnd(e.v[i][1]);t.cl&&(r+=" C"+bm_rnd(e.o[i-1][0])+","+bm_rnd(e.o[i-1][1])+" "+bm_rnd(e.i[0][0])+","+bm_rnd(e.i[0][1])+" "+bm_rnd(e.v[0][0])+","+bm_rnd(e.v[0][1])),s.lastPath!==r&&(t.inv?s.elem.setAttribute("d",this.solidPath+r):s.elem.setAttribute("d",r),s.lastPath=r)},MaskElement.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}},MaskElement.prototype.destroy=function(){this.element=null,this.globalData=null,this.maskElement=null,this.data=null,this.paths=null,this.masksProperties=null},SliderEffect.prototype.proxyFunction=function(){return this.p.k&&this.p.getValue(),this.p.v},AngleEffect.prototype.proxyFunction=SliderEffect.prototype.proxyFunction,ColorEffect.prototype.proxyFunction=SliderEffect.prototype.proxyFunction,PointEffect.prototype.proxyFunction=SliderEffect.prototype.proxyFunction,CheckboxEffect.prototype.proxyFunction=SliderEffect.prototype.proxyFunction,EffectsManager.prototype.getEffect=function(t){for(var e=this.data.ef,s=0,i=e.length;i>s;){if(e[s].nm===t)return this.effectElements[s];s+=1}},BaseElement.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},BaseElement.prototype.prepareFrame=function(t){this.data.ip-this.data.st<=t&&this.data.op-this.data.st>t?this.isVisible!==!0&&(this.isVisible=!0,this.firstFrame=!0,this.data.hasMask&&(this.maskManager.firstFrame=!0)):this.isVisible!==!1&&(this.isVisible=!1);var e,s=this.dynamicProperties.length;for(e=0;s>e;e+=1)this.dynamicProperties[e].getValue(t);return this.data.hasMask&&this.maskManager.prepareFrame(t),this.currentFrameNum=t,this.isVisible},BaseElement.prototype.init=function(){this.hidden=!1,this.firstFrame=!0,this.isVisible=!1,this.dynamicProperties=[],this.currentFrameNum=-99999,this.lastNum=-99999,this.data.ef&&(this.effectsManager=new EffectsManager(this.data,this,this.dynamicProperties),this.effect=this.effectsManager.getEffect.bind(this.effectsManager)),this.finalTransform={mProp:PropertyFactory.getProp(this,this.data.ks,2,null,this.dynamicProperties),matMdf:!1,opMdf:!1,mat:new Matrix,opacity:1},this.finalTransform.op=this.finalTransform.mProp.o,this.transform=this.finalTransform.mProp,this.createElements(),this.data.hasMask&&this.addMasks(this.data)},BaseElement.prototype.getType=function(){return this.type},BaseElement.prototype.resetHierarchy=function(){this.hierarchy?this.hierarchy.length=0:this.hierarchy=[]},BaseElement.prototype.getHierarchy=function(){return this.hierarchy||(this.hierarchy=[]),this.hierarchy},BaseElement.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}},BaseElement.prototype.hide=function(){},BaseElement.prototype.mHelper=new Matrix,BaseElement.prototype.mask=function(t){return this.maskManager.getMask(t)},extendPrototype(LayerInterface,BaseElement),Object.defineProperty(BaseElement.prototype,"anchorPoint",{get:function(){return this.finalTransform.mProp.anchorPoint}}),createElement(BaseElement,SVGBaseElement),SVGBaseElement.prototype.appendNodeToParent=function(t){if(this.placeholder){var e=this.placeholder.phElement;e.parentNode.insertBefore(t,e)}else this.parentContainer.appendChild(t)},SVGBaseElement.prototype.createElements=function(){if(this.data.td){if(3==this.data.td)this.layerElement=document.createElementNS(svgNS,"mask"),this.layerElement.setAttribute("id",this.layerId),this.layerElement.setAttribute("mask-type","luminance"),this.globalData.defs.appendChild(this.layerElement);else if(2==this.data.td){var t=document.createElementNS(svgNS,"mask");t.setAttribute("id",this.layerId),t.setAttribute("mask-type","alpha");var e=document.createElementNS(svgNS,"g");

t.appendChild(e),this.layerElement=document.createElementNS(svgNS,"g");var s=document.createElementNS(svgNS,"filter"),i=randomString(10);s.setAttribute("id",i),s.setAttribute("filterUnits","objectBoundingBox"),s.setAttribute("x","0%"),s.setAttribute("y","0%"),s.setAttribute("width","100%"),s.setAttribute("height","100%");var a=document.createElementNS(svgNS,"feComponentTransfer");a.setAttribute("in","SourceGraphic"),s.appendChild(a);var r=document.createElementNS(svgNS,"feFuncA");r.setAttribute("type","table"),r.setAttribute("tableValues","1.0 0.0"),a.appendChild(r),this.globalData.defs.appendChild(s);var n=document.createElementNS(svgNS,"rect");n.setAttribute("width","100%"),n.setAttribute("height","100%"),n.setAttribute("x","0"),n.setAttribute("y","0"),n.setAttribute("fill","#ffffff"),n.setAttribute("opacity","0"),e.setAttribute("filter","url(#"+i+")"),e.appendChild(n),e.appendChild(this.layerElement),this.globalData.defs.appendChild(t)}else{this.layerElement=document.createElementNS(svgNS,"g");var o=document.createElementNS(svgNS,"mask");o.setAttribute("id",this.layerId),o.setAttribute("mask-type","alpha"),o.appendChild(this.layerElement),this.globalData.defs.appendChild(o)}this.data.hasMask&&(this.maskedElement=this.layerElement)}else this.data.hasMask?(this.layerElement=document.createElementNS(svgNS,"g"),this.data.tt?(this.matteElement=document.createElementNS(svgNS,"g"),this.matteElement.appendChild(this.layerElement),this.appendNodeToParent(this.matteElement)):this.appendNodeToParent(this.layerElement),this.maskedElement=this.layerElement):this.data.tt?(this.matteElement=document.createElementNS(svgNS,"g"),this.matteElement.setAttribute("id",this.layerId),this.appendNodeToParent(this.matteElement),this.layerElement=this.matteElement):this.layerElement=this.parentContainer;!this.data.ln||4!==this.data.ty&&0!==this.data.ty||(this.layerElement===this.parentContainer&&(this.layerElement=document.createElementNS(svgNS,"g"),this.appendNodeToParent(this.layerElement)),this.layerElement.setAttribute("id",this.data.ln)),0!==this.data.ty||!this.finalTransform.op.k&&1===this.finalTransform.op.p||this.layerElement!==this.parentContainer||(this.layerElement=document.createElementNS(svgNS,"g"),this.appendNodeToParent(this.layerElement)),this.layerElement!==this.parentContainer&&(this.placeholder=null)},SVGBaseElement.prototype.renderFrame=function(t){if(3===this.data.ty)return!1;if(this.currentFrameNum===this.lastNum||!this.isVisible)return this.isVisible;this.lastNum=this.currentFrameNum,this.data.hasMask&&this.maskManager.renderFrame(),this.finalTransform.opMdf=this.finalTransform.op.mdf,this.finalTransform.matMdf=this.finalTransform.mProp.mdf,this.finalTransform.opacity=this.finalTransform.op.v,this.firstFrame&&(this.finalTransform.opMdf=!0,this.finalTransform.matMdf=!0);var e,s=this.finalTransform.mat;if(this.hierarchy){var i,a=this.hierarchy.length;for(e=this.finalTransform.mProp.v.props,s.cloneFromProps(e),i=0;a>i;i+=1)this.finalTransform.matMdf=this.hierarchy[i].finalTransform.mProp.mdf?!0:this.finalTransform.matMdf,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&&(t?(e=this.finalTransform.mProp.v.props,s.cloneFromProps(e)):s.cloneFromProps(this.finalTransform.mProp.v.props));return t&&(e=t.mat.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]),this.finalTransform.opacity*=t.opacity,this.finalTransform.opMdf=t.opMdf?!0:this.finalTransform.opMdf,this.finalTransform.matMdf=t.matMdf?!0:this.finalTransform.matMdf),this.data.hasMask?(this.finalTransform.matMdf&&this.layerElement.setAttribute("transform",s.to2dCSS()),this.finalTransform.opMdf&&this.layerElement.setAttribute("opacity",this.finalTransform.opacity)):0===this.data.ty&&this.finalTransform.opMdf&&(this.finalTransform.op.k||1!==this.finalTransform.op.p)&&(this.layerElement.setAttribute("opacity",this.finalTransform.opacity),this.finalTransform.opacity=1),this.isVisible},SVGBaseElement.prototype.destroy=function(){this.layerElement=null,this.parentContainer=null,this.matteElement&&(this.matteElement=null),this.maskManager&&this.maskManager.destroy()},SVGBaseElement.prototype.getDomElement=function(){return this.layerElement},SVGBaseElement.prototype.addMasks=function(t){this.maskManager=new MaskElement(t,this,this.globalData)},SVGBaseElement.prototype.setMatte=function(t){this.matteElement&&this.matteElement.setAttribute("mask","url(#"+t+")")},SVGBaseElement.prototype.hide=function(){},ITextElement.prototype.init=function(){this.parent.init.call(this),this.lettersChangedFlag=!1;var t=this.data;this.renderedLetters=Array.apply(null,{length:t.t.d.l.length}),this.viewData={m:{a:PropertyFactory.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=PropertyFactory.getProp(this,a.a.r,0,degToRads,this.dynamicProperties)),"rx"in a.a&&(i.a.rx=PropertyFactory.getProp(this,a.a.rx,0,degToRads,this.dynamicProperties)),"ry"in a.a&&(i.a.ry=PropertyFactory.getProp(this,a.a.ry,0,degToRads,this.dynamicProperties)),"sk"in a.a&&(i.a.sk=PropertyFactory.getProp(this,a.a.sk,0,degToRads,this.dynamicProperties)),"sa"in a.a&&(i.a.sa=PropertyFactory.getProp(this,a.a.sa,0,degToRads,this.dynamicProperties)),"s"in a.a&&(i.a.s=PropertyFactory.getProp(this,a.a.s,1,.01,this.dynamicProperties)),"a"in a.a&&(i.a.a=PropertyFactory.getProp(this,a.a.a,1,0,this.dynamicProperties)),"o"in a.a&&(i.a.o=PropertyFactory.getProp(this,a.a.o,0,.01,this.dynamicProperties)),"p"in a.a&&(i.a.p=PropertyFactory.getProp(this,a.a.p,1,0,this.dynamicProperties)),"sw"in a.a&&(i.a.sw=PropertyFactory.getProp(this,a.a.sw,0,0,this.dynamicProperties)),"sc"in a.a&&(i.a.sc=PropertyFactory.getProp(this,a.a.sc,1,0,this.dynamicProperties)),"fc"in a.a&&(i.a.fc=PropertyFactory.getProp(this,a.a.fc,1,0,this.dynamicProperties)),"fh"in a.a&&(i.a.fh=PropertyFactory.getProp(this,a.a.fh,0,0,this.dynamicProperties)),"fs"in a.a&&(i.a.fs=PropertyFactory.getProp(this,a.a.fs,0,.01,this.dynamicProperties)),"fb"in a.a&&(i.a.fb=PropertyFactory.getProp(this,a.a.fb,0,.01,this.dynamicProperties)),"t"in a.a&&(i.a.t=PropertyFactory.getProp(this,a.a.t,0,0,this.dynamicProperties)),i.s=PropertyFactory.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:PropertyFactory.getProp(this,e.p.f,0,0,this.dynamicProperties),l:PropertyFactory.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},ITextElement.prototype.createPathShape=function(t,e){var s,i,a,r,n=e.length,o="";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&&(o+=" M"+t.applyToPointStringified(r.v[0][0],r.v[0][1])),o+=" 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]);o+=" 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]),o+="z"}return o},ITextElement.prototype.getMeasures=function(){var t,e,s,i,a=this.mHelper,r=this.renderType,n=this.data,o=n.t.d,h=o.l;if(this.maskPath){var l=this.viewData.p.m;if(!this.viewData.p.n||this.viewData.p.mdf){var p=l.v;this.viewData.p.r&&(p=reversePath(p,l.closed));var m={tLength:0,segments:[]};i=p.v.length-1;var f,d=0;for(s=0;i>s;s+=1)f={s:p.v[s],e:p.v[s+1],to:[p.o[s][0]-p.v[s][0],p.o[s][1]-p.v[s][1]],ti:[p.i[s+1][0]-p.v[s+1][0],p.i[s+1][1]-p.v[s+1][1]]},bez.buildBezierData(f),m.tLength+=f.bezierData.segmentLength,m.segments.push(f),d+=f.bezierData.segmentLength;s=i,l.closed&&(f={s:p.v[s],e:p.v[0],to:[p.o[s][0]-p.v[s][0],p.o[s][1]-p.v[s][1]],ti:[p.i[0][0]-p.v[0][0],p.i[0][1]-p.v[0][1]]},bez.buildBezierData(f),m.tLength+=f.bezierData.segmentLength,m.segments.push(f),d+=f.bezierData.segmentLength),this.viewData.p.pi=m}var c,u,y,m=this.viewData.p.pi,v=this.viewData.p.f.v,g=0,b=1,E=0,P=!0,k=m.segments;if(0>v&&l.closed)for(m.tLength<Math.abs(v)&&(v=-Math.abs(v)%m.tLength),g=k.length-1,y=k[g].bezierData.points,b=y.length-1;0>v;)v+=y[b].partialLength,b-=1,0>b&&(g-=1,y=k[g].bezierData.points,b=y.length-1);y=k[g].bezierData.points,u=y[b-1],c=y[b];var S,C,x=c.partialLength}i=h.length,t=0,e=0;var w,D,T,M,I,F=1.2*n.t.d.s*.714,A=!0,V=this.viewData,N=Array.apply(null,{length:i});this.lettersChangedFlag=!1,M=V.a.length;var L,B,_,H,R,z,O,j,G,W,X,q,Y,Z,J,U,K=-1,Q=v,$=g,tt=b,et=-1,st=0;for(s=0;i>s;s+=1)if(a.reset(),z=1,h[s].n)t=0,e+=o.yOffset,e+=A?1:0,v=Q,A=!1,st=0,this.maskPath&&(g=$,b=tt,y=k[g].bezierData.points,u=y[b-1],c=y[b],x=c.partialLength,E=0),N[s]=this.emptyProp;else{if(this.maskPath){if(et!==h[s].line){switch(o.j){case 1:v+=d-o.lineWidths[h[s].line];break;case 2:v+=(d-o.lineWidths[h[s].line])/2}et=h[s].line}K!==h[s].ind&&(h[K]&&(v+=h[K].extra),v+=h[s].an/2,K=h[s].ind),v+=V.m.a.v[0]*h[s].an/200;var it=0;for(T=0;M>T;T+=1)w=V.a[T].a,"p"in w&&(D=V.a[T].s,B=D.getMult(h[s].anIndexes[T]),it+=B.length?w.p.v[0]*B[0]:w.p.v[0]*B);for(P=!0;P;)E+x>=v+it||!y?(S=(v+it-E)/c.partialLength,H=u.point[0]+(c.point[0]-u.point[0])*S,R=u.point[1]+(c.point[1]-u.point[1])*S,a.translate(0,-(V.m.a.v[1]*F/100)+e),P=!1):y&&(E+=c.partialLength,b+=1,b>=y.length&&(b=0,g+=1,k[g]?y=k[g].bezierData.points:l.closed?(b=0,g=0,y=k[g].bezierData.points):(E-=c.partialLength,y=null)),y&&(u=c,c=y[b],x=c.partialLength));_=h[s].an/2-h[s].add,a.translate(-_,0,0)}else _=h[s].an/2-h[s].add,a.translate(-_,0,0),a.translate(-V.m.a.v[0]*h[s].an/200,-V.m.a.v[1]*F/100,0);for(st+=h[s].l/2,T=0;M>T;T+=1)w=V.a[T].a,"t"in w&&(D=V.a[T].s,B=D.getMult(h[s].anIndexes[T]),this.maskPath?v+=B.length?w.t*B[0]:w.t*B:t+=B.length?w.t.v*B[0]:w.t.v*B);for(st+=h[s].l/2,o.strokeWidthAnim&&(j=n.t.d.sw||0),o.strokeColorAnim&&(O=n.t.d.sc?[n.t.d.sc[0],n.t.d.sc[1],n.t.d.sc[2]]:[0,0,0]),o.fillColorAnim&&(G=[n.t.d.fc[0],n.t.d.fc[1],n.t.d.fc[2]]),T=0;M>T;T+=1)w=V.a[T].a,"a"in w&&(D=V.a[T].s,B=D.getMult(h[s].anIndexes[T]),B.length?a.translate(-w.a.v[0]*B[0],-w.a.v[1]*B[1],w.a.v[2]*B[2]):a.translate(-w.a.v[0]*B,-w.a.v[1]*B,w.a.v[2]*B));for(T=0;M>T;T+=1)w=V.a[T].a,"s"in w&&(D=V.a[T].s,B=D.getMult(h[s].anIndexes[T]),B.length?a.scale(1+(w.s.v[0]-1)*B[0],1+(w.s.v[1]-1)*B[1],1):a.scale(1+(w.s.v[0]-1)*B,1+(w.s.v[1]-1)*B,1));for(T=0;M>T;T+=1){if(w=V.a[T].a,D=V.a[T].s,B=D.getMult(h[s].anIndexes[T]),"sk"in w&&(B.length?a.skewFromAxis(-w.sk.v*B[0],w.sa.v*B[1]):a.skewFromAxis(-w.sk.v*B,w.sa.v*B)),"r"in w&&a.rotateZ(B.length?-w.r.v*B[2]:-w.r.v*B),"ry"in w&&a.rotateY(B.length?w.ry.v*B[1]:w.ry.v*B),"rx"in w&&a.rotateX(B.length?w.rx.v*B[0]:w.rx.v*B),"o"in w&&(z+=B.length?(w.o.v*B[0]-z)*B[0]:(w.o.v*B-z)*B),o.strokeWidthAnim&&"sw"in w&&(j+=B.length?w.sw.v*B[0]:w.sw.v*B),o.strokeColorAnim&&"sc"in w)for(W=0;3>W;W+=1)O[W]=Math.round(B.length?O[W]+(w.sc.v[W]-O[W])*B[0]:O[W]+(w.sc.v[W]-O[W])*B);if(o.fillColorAnim){if("fc"in w)for(W=0;3>W;W+=1)G[W]=Math.round(B.length?G[W]+(w.fc.v[W]-G[W])*B[0]:G[W]+(w.fc.v[W]-G[W])*B);"fh"in w&&(G=B.length?addHueToRGB(G,w.fh.v*B[0]):addHueToRGB(G,w.fh.v*B)),"fs"in w&&(G=B.length?addSaturationToRGB(G,w.fs.v*B[0]):addSaturationToRGB(G,w.fs.v*B)),"fb"in w&&(G=B.length?addBrightnessToRGB(G,w.fb.v*B[0]):addBrightnessToRGB(G,w.fb.v*B))}}for(T=0;M>T;T+=1)w=V.a[T].a,"p"in w&&(D=V.a[T].s,B=D.getMult(h[s].anIndexes[T]),this.maskPath?B.length?a.translate(0,w.p.v[1]*B[0],-w.p.v[2]*B[1]):a.translate(0,w.p.v[1]*B,-w.p.v[2]*B):B.length?a.translate(w.p.v[0]*B[0],w.p.v[1]*B[1],-w.p.v[2]*B[2]):a.translate(w.p.v[0]*B,w.p.v[1]*B,-w.p.v[2]*B));if(o.strokeWidthAnim&&(X=0>j?0:j),o.strokeColorAnim&&(q="rgb("+O[0]+","+O[1]+","+O[2]+")"),o.fillColorAnim&&(Y="rgb("+G[0]+","+G[1]+","+G[2]+")"),this.maskPath){if(n.t.p.p){C=(c.point[1]-u.point[1])/(c.point[0]-u.point[0]);var at=180*Math.atan(C)/Math.PI;c.point[0]<u.point[0]&&(at+=180),a.rotate(-at*Math.PI/180)}a.translate(H,R,0),a.translate(V.m.a.v[0]*h[s].an/200,V.m.a.v[1]*F/100,0),v-=V.m.a.v[0]*h[s].an/200,h[s+1]&&K!==h[s+1].ind&&(v+=h[s].an/2,v+=o.tr/1e3*n.t.d.s)}else{switch(a.translate(t,e,0),o.ps&&a.translate(o.ps[0],o.ps[1]+o.ascent,0),o.j){case 1:a.translate(o.justifyOffset+(o.boxWidth-o.lineWidths[h[s].line]),0,0);break;case 2:a.translate(o.justifyOffset+(o.boxWidth-o.lineWidths[h[s].line])/2,0,0)}a.translate(_,0,0),a.translate(V.m.a.v[0]*h[s].an/200,V.m.a.v[1]*F/100,0),t+=h[s].l+o.tr/1e3*n.t.d.s}"html"===r?Z=a.toCSS():"svg"===r?Z=a.to2dCSS():J=[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]],U=z,L=this.renderedLetters[s],!L||L.o===U&&L.sw===X&&L.sc===q&&L.fc===Y?"svg"!==r&&"html"!==r||L&&L.m===Z?"canvas"!==r||L&&L.props[0]===J[0]&&L.props[1]===J[1]&&L.props[4]===J[4]&&L.props[5]===J[5]&&L.props[12]===J[12]&&L.props[13]===J[13]?I=L:(this.lettersChangedFlag=!0,I=new LetterProps(U,X,q,Y,null,J)):(this.lettersChangedFlag=!0,I=new LetterProps(U,X,q,Y,Z)):(this.lettersChangedFlag=!0,I=new LetterProps(U,X,q,Y,Z,J)),this.renderedLetters[s]=I}},ITextElement.prototype.emptyProp=new LetterProps,createElement(SVGBaseElement,SVGTextElement),SVGTextElement.prototype.init=ITextElement.prototype.init,SVGTextElement.prototype.createPathShape=ITextElement.prototype.createPathShape,SVGTextElement.prototype.getMeasures=ITextElement.prototype.getMeasures,SVGTextElement.prototype.createElements=function(){this.parent.createElements.call(this);var t=this.data.t.d;this.innerElem=document.createElementNS(svgNS,"g"),t.fc?this.innerElem.setAttribute("fill","rgb("+t.fc[0]+","+t.fc[1]+","+t.fc[2]+")"):this.innerElem.setAttribute("fill","rgba(0,0,0,0)"),t.sc&&(this.innerElem.setAttribute("stroke","rgb("+t.sc[0]+","+t.sc[1]+","+t.sc[2]+")"),this.innerElem.setAttribute("stroke-width",t.sw)),this.innerElem.setAttribute("font-size",t.s);var e=this.globalData.fontManager.getFontByName(t.f);if(e.fClass)this.innerElem.setAttribute("class",e.fClass);else{this.innerElem.setAttribute("font-family",e.fFamily);var s=t.fWeight,i=t.fStyle;this.innerElem.setAttribute("font-style",i),this.innerElem.setAttribute("font-weight",s)}var a,r;this.layerElement===this.parentContainer?this.appendNodeToParent(this.innerElem):this.layerElement.appendChild(this.innerElem);var n=t.l;if(r=n.length){var o,h,l=this.mHelper,p="",m=this.data.singleShape;if(m)var f=0,d=0,c=t.lineWidths,u=t.boxWidth,y=!0;for(a=0;r>a;a+=1){if(this.globalData.fontManager.chars?m&&0!==a||(o=document.createElementNS(svgNS,"path")):o=document.createElementNS(svgNS,"text"),o.setAttribute("stroke-linecap","butt"),o.setAttribute("stroke-linejoin","round"),o.setAttribute("stroke-miterlimit","4"),m&&n[a].n&&(f=0,d+=t.yOffset,d+=y?1:0,y=!1),l.reset(),this.globalData.fontManager.chars&&l.scale(t.s/100,t.s/100),m){switch(t.ps&&l.translate(t.ps[0],t.ps[1]+t.ascent,0),t.j){case 1:l.translate(t.justifyOffset+(u-c[n[a].line]),0,0);break;case 2:l.translate(t.justifyOffset+(u-c[n[a].line])/2,0,0)}l.translate(f,d,0)}if(this.globalData.fontManager.chars){var v,g=this.globalData.fontManager.getCharData(t.t.charAt(a),e.fStyle,this.globalData.fontManager.getFontByName(t.f).fFamily);v=g?g.data:null,v&&v.shapes&&(h=v.shapes[0].it,m||(p=""),p+=this.createPathShape(l,h),m||o.setAttribute("d",p)),m||this.innerElem.appendChild(o)}else o.textContent=n[a].val,o.setAttributeNS("http://www.w3.org/XML/1998/namespace","xml:space","preserve"),this.innerElem.appendChild(o),m&&o.setAttribute("transform",l.to2dCSS());m&&(f+=n[a].l),this.textSpans.push(o)}m&&this.globalData.fontManager.chars&&(o.setAttribute("d",p),this.innerElem.appendChild(o))}},SVGTextElement.prototype.hide=function(){this.hidden||(this.innerElem.style.display="none",this.hidden=!0)},SVGTextElement.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.innerElem.style.display="block"),this.data.hasMask||(this.finalTransform.matMdf&&this.innerElem.setAttribute("transform",this.finalTransform.mat.to2dCSS()),this.finalTransform.opMdf&&this.innerElem.setAttribute("opacity",this.finalTransform.opacity)),!this.data.singleShape&&(this.getMeasures(),this.lettersChangedFlag)){var s,i,a=this.renderedLetters,r=this.data.t.d.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)}},SVGTextElement.prototype.destroy=function(){this.parent.destroy.call(),this.innerElem=null};var PlaceHolderElement=function(t,e,s){if(this.data=t,this.globalData=s,e){this.parentContainer=e;var i=document.createElementNS(svgNS,"g");i.setAttribute("id",this.data.id),e.appendChild(i),this.phElement=i}this.layerId="ly_"+randomString(10)};PlaceHolderElement.prototype.prepareFrame=function(){},PlaceHolderElement.prototype.renderFrame=function(){},PlaceHolderElement.prototype.draw=function(){},createElement(SVGBaseElement,ICompElement),extendPrototype(ExpressionComp,ICompElement),ICompElement.prototype.getComposingElement=function(){return this.layerElement},ICompElement.prototype.hide=function(){if(!this.hidden){var t,e=this.elements.length;for(t=0;e>t;t+=1)this.elements[t].hide();this.hidden=!0}},ICompElement.prototype.prepareFrame=function(t){if(this.parent.prepareFrame.call(this,t),this.isVisible!==!1){var e=t;this.tm&&(e=this.tm.v,e===this.data.op&&(e=this.data.op-1)),this.renderedFrame=e;var s,i=this.elements.length;for(s=0;i>s;s+=1)this.elements[s].prepareFrame(e-this.layers[s].st)}},ICompElement.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.data.hasMask?this.elements[e].renderFrame():this.elements[e].renderFrame(this.finalTransform);this.firstFrame&&(this.firstFrame=!1)},ICompElement.prototype.setElements=function(t){this.elements=t},ICompElement.prototype.getElements=function(){return this.elements},ICompElement.prototype.destroy=function(){this.parent.destroy.call();var t,e=this.layers.length;for(t=0;e>t;t+=1)this.elements[t].destroy()},createElement(SVGBaseElement,IImageElement),IImageElement.prototype.createElements=function(){var t=this,e=function(){t.innerElem.setAttributeNS("http://www.w3.org/1999/xlink","href",t.path+t.assetData.p),t.maskedElement=t.innerElem},s=new Image;s.addEventListener("load",e,!1),s.addEventListener("error",e,!1),s.src=this.path+this.assetData.p,this.parent.createElements.call(this),this.innerElem=document.createElementNS(svgNS,"image"),this.innerElem.setAttribute("width",this.assetData.w+"px"),this.innerElem.setAttribute("height",this.assetData.h+"px"),this.layerElement===this.parentContainer?this.appendNodeToParent(this.innerElem):this.layerElement.appendChild(this.innerElem),this.data.ln&&this.innerElem.setAttribute("id",this.data.ln)},IImageElement.prototype.hide=function(){this.hidden||(this.innerElem.setAttribute("visibility","hidden"),this.hidden=!0)},IImageElement.prototype.renderFrame=function(t){var e=this.parent.renderFrame.call(this,t);return e===!1?void this.hide():(this.hidden&&(this.hidden=!1,this.innerElem.setAttribute("visibility","visible")),this.data.hasMask||((this.finalTransform.matMdf||this.firstFrame)&&this.innerElem.setAttribute("transform",this.finalTransform.mat.to2dCSS()),(this.finalTransform.opMdf||this.firstFrame)&&this.innerElem.setAttribute("opacity",this.finalTransform.opacity)),void(this.firstFrame&&(this.firstFrame=!1)))},IImageElement.prototype.destroy=function(){this.parent.destroy.call(),this.innerElem=null},createElement(SVGBaseElement,IShapeElement),IShapeElement.prototype.lcEnum={1:"butt",2:"round",3:"butt"},IShapeElement.prototype.ljEnum={1:"miter",2:"round",3:"butt"},IShapeElement.prototype.transformHelper={opacity:1,mat:new Matrix,matMdf:!1,opMdf:!1},IShapeElement.prototype.createElements=function(){this.parent.createElements.call(this),this.searchShapes(this.shapesData,this.viewData,this.dynamicProperties,[]),this.layerElement.appendChild(this.shapesContainer),styleUnselectableDiv(this.layerElement),styleUnselectableDiv(this.shapesContainer),this.buildExpressionInterface()},IShapeElement.prototype.searchShapes=function(t,e,s,i){var a,r,n,o=t.length-1,h=[],l=[];for(a=o;a>=0;a-=1)if("fl"==t[a].ty||"st"==t[a].ty){e[a]={};var p;if(e[a].c=PropertyFactory.getProp(this,t[a].c,1,null,s),e[a].o=PropertyFactory.getProp(this,t[a].o,0,.01,s),"st"==t[a].ty){if(p=document.createElementNS(svgNS,"g"),p.style.strokeLinecap=this.lcEnum[t[a].lc]||"round",p.style.strokeLinejoin=this.ljEnum[t[a].lj]||"round",p.style.fillOpacity=0,1==t[a].lj&&(p.style.strokeMiterlimit=t[a].ml),e[a].c.k||(p.style.stroke="rgb("+e[a].c.v[0]+","+e[a].c.v[1]+","+e[a].c.v[2]+")"),e[a].o.k||(p.style.strokeOpacity=e[a].o.v),e[a].w=PropertyFactory.getProp(this,t[a].w,0,null,s),e[a].w.k||(p.style.strokeWidth=e[a].w.v),t[a].d){var m=PropertyFactory.getDashProp(this,t[a].d,"svg",s);m.k||(p.style.strokeDasharray=m.dasharray,p.style.strokeDashoffset=m.dashoffset),e[a].d=m}}else p=document.createElementNS(svgNS,"path"),e[a].c.k||(p.style.fill="rgb("+e[a].c.v[0]+","+e[a].c.v[1]+","+e[a].c.v[2]+")"),e[a].o.k||(p.style.fillOpacity=e[a].o.v);this.shapesContainer.appendChild(p),this.stylesList.push({pathElement:p,type:t[a].ty,d:"",ld:"",mdf:!1}),e[a].style=this.stylesList[this.stylesList.length-1],h.push(e[a].style)}else if("gr"==t[a].ty)e[a]={it:[]},this.searchShapes(t[a].it,e[a].it,s,i);else if("tr"==t[a].ty)e[a]={transform:{mat:new Matrix,opacity:1,matMdf:!1,opMdf:!1,op:PropertyFactory.getProp(this,t[a].o,0,.01,s),mProps:PropertyFactory.getProp(this,t[a],2,null,s)},elements:[]};else if("sh"==t[a].ty||"rc"==t[a].ty||"el"==t[a].ty||"sr"==t[a].ty){e[a]={elements:[],styles:[],lStr:""};var f=4;"rc"==t[a].ty?f=5:"el"==t[a].ty?f=6:"sr"==t[a].ty&&(f=7),i.length&&(t[a].trimmed=!0),e[a].sh=PropertyFactory.getShapeProp(this,t[a],f,s,i),n=this.stylesList.length;var d,c=!1,u=!1;for(r=0;n>r;r+=1)this.stylesList[r].closed||("st"===this.stylesList[r].type?(c=!0,d=document.createElementNS(svgNS,"path"),this.stylesList[r].pathElement.appendChild(d),e[a].elements.push({ty:this.stylesList[r].type,el:d})):(u=!0,e[a].elements.push({ty:this.stylesList[r].type,st:this.stylesList[r]})));e[a].st=c,e[a].fl=u}else if("tm"==t[a].ty){var y={closed:!1,trimProp:PropertyFactory.getProp(this,t[a],7,null,s)};e[a]={tr:y.trimProp},i.push(y),l.push(y)}for(o=h.length,a=0;o>a;a+=1)h[a].closed=!0;for(o=l.length,a=0;o>a;a+=1)l[a].closed=!0},IShapeElement.prototype.renderFrame=function(t){var e=this.parent.renderFrame.call(this,t);return e===!1?void this.hide():(this.hidden=!1,this.finalTransform.matMdf&&!this.data.hasMask&&this.shapesContainer.setAttribute("transform",this.finalTransform.mat.to2dCSS()),this.transformHelper.opacity=this.finalTransform.opacity,this.transformHelper.matMdf=!1,this.transformHelper.opMdf=this.finalTransform.opMdf,void this.renderShape(this.transformHelper,null,null,!0))},IShapeElement.prototype.hide=function(){if(!this.hidden){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].pathElement.style.display="none",this.stylesList[t].pathElement.parentNode&&(this.stylesList[t].parent=this.stylesList[t].pathElement.parentNode));this.hidden=!0}},IShapeElement.prototype.renderShape=function(t,e,s,i){var a,r;if(!e)for(e=this.shapesData,r=this.stylesList.length,a=0;r>a;a+=1)this.stylesList[a].d="",this.stylesList[a].mdf=!1;s||(s=this.viewData),r=e.length-1;var n,o;for(n=t,a=r;a>=0;a-=1)if("tr"==e[a].ty){n=s[a].transform;var h=s[a].transform.mProps.v.props;if(n.matMdf=n.mProps.mdf,n.opMdf=n.op.mdf,o=n.mat,o.cloneFromProps(h),t){var l=t.mat.props;n.opacity=t.opacity,n.opacity*=s[a].transform.op.v,n.matMdf=t.matMdf?!0:n.matMdf,n.opMdf=t.opMdf?!0:n.opMdf,o.transform(l[0],l[1],l[2],l[3],l[4],l[5],l[6],l[7],l[8],l[9],l[10],l[11],l[12],l[13],l[14],l[15])}else n.opacity=n.op.o}else"sh"==e[a].ty||"el"==e[a].ty||"rc"==e[a].ty||"sr"==e[a].ty?this.renderPath(e[a],s[a],n):"fl"==e[a].ty?this.renderFill(e[a],s[a],n):"st"==e[a].ty?this.renderStroke(e[a],s[a],n):"gr"==e[a].ty?this.renderShape(n,e[a].it,s[a].it):"tm"==e[a].ty;if(i){for(r=this.stylesList.length,a=0;r>a;a+=1)"0"===this.stylesList[a].ld&&(this.stylesList[a].ld="1",this.stylesList[a].pathElement.style.display="block"),"fl"===this.stylesList[a].type&&(this.stylesList[a].mdf||this.firstFrame)&&this.stylesList[a].pathElement.setAttribute("d",this.stylesList[a].d);this.firstFrame&&(this.firstFrame=!1)}},IShapeElement.prototype.renderPath=function(t,e,s){var i,a,r=e.sh.v,n="";if(r.v){i=r.v.length;var o=s.matMdf||e.sh.mdf||this.firstFrame;if(o){var h=r.s?r.s:[];for(a=1;i>a;a+=1)h[a-1]?n+=" M"+s.mat.applyToPointStringified(h[a-1][0],h[a-1][1]):1==a&&(n+=" M"+s.mat.applyToPointStringified(r.v[0][0],r.v[0][1])),n+=" C"+s.mat.applyToPointStringified(r.o[a-1][0],r.o[a-1][1])+" "+s.mat.applyToPointStringified(r.i[a][0],r.i[a][1])+" "+s.mat.applyToPointStringified(r.v[a][0],r.v[a][1]);1==i&&(n+=h[0]?" M"+s.mat.applyToPointStringified(h[0][0],h[0][1]):" M"+s.mat.applyToPointStringified(r.v[0][0],r.v[0][1])),i&&t.closed&&(!t.trimmed||r.c)&&(n+=" C"+s.mat.applyToPointStringified(r.o[a-1][0],r.o[a-1][1])+" "+s.mat.applyToPointStringified(r.i[0][0],r.i[0][1])+" "+s.mat.applyToPointStringified(r.v[0][0],r.v[0][1]),n+="z"),e.lStr=n}else n=e.lStr;for(i=e.elements.length,a=0;i>a;a+=1)"st"===e.elements[a].ty?(s.matMdf||e.sh.mdf||this.firstFrame)&&e.elements[a].el.setAttribute("d",n):(e.elements[a].st.mdf=o?!0:e.elements[a].st.mdf,e.elements[a].st.d+=n)}},IShapeElement.prototype.renderFill=function(t,e,s){var i=e.style;(e.c.mdf||this.firstFrame)&&(i.pathElement.style.fill="rgb("+bm_floor(e.c.v[0])+","+bm_floor(e.c.v[1])+","+bm_floor(e.c.v[2])+")"),(e.o.mdf||s.opMdf||this.firstFrame)&&(i.pathElement.style.fillOpacity=e.o.v*s.opacity)},IShapeElement.prototype.renderStroke=function(t,e,s){var i=e.style,a=e.d;a&&a.k&&(a.mdf||this.firstFrame)&&(i.pathElement.style.strokeDasharray=a.dasharray,i.pathElement.style.strokeDashoffset=a.dashoffset),(e.c.mdf||this.firstFrame)&&(i.pathElement.style.stroke="rgb("+bm_floor(e.c.v[0])+","+bm_floor(e.c.v[1])+","+bm_floor(e.c.v[2])+")"),(e.o.mdf||s.opMdf||this.firstFrame)&&(i.pathElement.style.strokeOpacity=e.o.v*s.opacity),(e.w.mdf||this.firstFrame)&&(i.pathElement.style.strokeWidth=e.w.v)},IShapeElement.prototype.destroy=function(){this.parent.destroy.call(),this.shapeData=null,this.viewData=null,this.parentContainer=null,this.placeholder=null},extendPrototype(ShapeInterface,IShapeElement),createElement(SVGBaseElement,ISolidElement),ISolidElement.prototype.createElements=function(){this.parent.createElements.call(this);var t=document.createElementNS(svgNS,"rect");t.setAttribute("width",this.data.sw),t.setAttribute("height",this.data.sh),t.setAttribute("fill",this.data.sc),this.layerElement===this.parentContainer?this.appendNodeToParent(t):this.layerElement.appendChild(t),this.data.ln&&this.innerElem.setAttribute("id",this.data.ln),this.innerElem=t},ISolidElement.prototype.hide=IImageElement.prototype.hide,ISolidElement.prototype.renderFrame=IImageElement.prototype.renderFrame,ISolidElement.prototype.destroy=IImageElement.prototype.destroy,createElement(BaseElement,CVBaseElement),CVBaseElement.prototype.createElements=function(){},CVBaseElement.prototype.renderFrame=function(t){if(3===this.data.ty)return!1;if(!this.isVisible)return this.isVisible;this.finalTransform.opMdf=this.finalTransform.op.mdf,this.finalTransform.matMdf=this.finalTransform.mProp.mdf,this.finalTransform.opacity=this.finalTransform.op.v;var e,s=this.finalTransform.mat;if(this.hierarchy){var i,a=this.hierarchy.length;for(e=this.finalTransform.mProp.v.props,s.cloneFromProps(e),i=0;a>i;i+=1)this.finalTransform.matMdf=this.hierarchy[i].finalTransform.mProp.mdf?!0:this.finalTransform.matMdf,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 t?(e=this.finalTransform.mProp.v.props,s.cloneFromProps(e)):s.cloneFromProps(this.finalTransform.mProp.v.props);return t&&(e=t.mat.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]),this.finalTransform.opacity*=t.opacity,this.finalTransform.opMdf=t.opMdf?!0:this.finalTransform.opMdf,this.finalTransform.matMdf=t.matMdf?!0:this.finalTransform.matMdf),this.data.hasMask&&(this.globalData.renderer.save(!0),this.maskManager.renderFrame(s)),this.isVisible},CVBaseElement.prototype.getCurrentAnimData=function(){return this.currentAnimData},CVBaseElement.prototype.addMasks=function(t){this.maskManager=new CVMaskElement(t,this,this.globalData)},CVBaseElement.prototype.destroy=function(){this.canvasContext=null,this.data=null,this.globalData=null,this.maskManager&&this.maskManager.destroy()},CVBaseElement.prototype.mHelper=new Matrix,createElement(CVBaseElement,CVCompElement),CVCompElement.prototype.prepareFrame=function(t){if(this.parent.prepareFrame.call(this,t),this.isVisible!==!1){var e=t;this.tm&&(e=this.tm.v,e===this.data.op&&(e=this.data.op-1)),this.renderedFrame=e;var s,i=this.elements.length;for(s=0;i>s;s+=1)this.elements[s].prepareFrame(e-this.layers[s].st)}},CVCompElement.prototype.renderFrame=function(t){if(this.parent.renderFrame.call(this,t)!==!1){var e,s=this.layers.length;for(e=s-1;e>=0;e-=1)this.elements[e].renderFrame(this.finalTransform);this.data.hasMask&&this.globalData.renderer.restore(!0),this.firstFrame&&(this.firstFrame=!1)}},CVCompElement.prototype.setElements=function(t){this.elements=t},CVCompElement.prototype.getElements=function(){return this.elements},CVCompElement.prototype.destroy=function(){var t,e=this.layers.length;for(t=e-1;t>=0;t-=1)this.elements[t].destroy();this.layers=null,this.elements=null,this.parent.destroy.call()},createElement(CVBaseElement,CVImageElement),CVImageElement.prototype.createElements=function(){var t=this,e=function(){t.animationItem.elementLoaded()},s=function(){t.failed=!0,t.animationItem.elementLoaded()};this.img=new Image,this.img.addEventListener("load",e,!1),this.img.addEventListener("error",s,!1),this.img.src=this.path+this.assetData.p,this.parent.createElements.call(this)},CVImageElement.prototype.renderFrame=function(t){if(!this.failed&&this.parent.renderFrame.call(this,t)!==!1){var e=this.canvasContext;this.globalData.renderer.save();var s=this.finalTransform.mat.props;this.globalData.renderer.ctxTransform(s),this.globalData.renderer.ctxOpacity(this.finalTransform.opacity),e.drawImage(this.img,0,0),this.globalData.renderer.restore(this.data.hasMask),this.firstFrame&&(this.firstFrame=!1)}},CVImageElement.prototype.destroy=function(){this.img=null,this.animationItem=null,this.parent.destroy.call()},CVMaskElement.prototype.getMaskProperty=function(t){return this.viewData[t]},CVMaskElement.prototype.prepareFrame=function(t){var e,s=this.dynamicProperties.length;for(e=0;s>e;e+=1)this.dynamicProperties[e].getValue(t)},CVMaskElement.prototype.renderFrame=function(t){var e,s,i,a,r,n=this.ctx,o=this.data.masksProperties.length,h=!1;for(e=0;o>e;e++)if("n"!==this.masksProperties[e].mode){h===!1&&(n.beginPath(),h=!0),this.masksProperties[e].inv&&(n.moveTo(0,0),n.lineTo(this.globalData.compWidth,0),n.lineTo(this.globalData.compWidth,this.globalData.compHeight),n.lineTo(0,this.globalData.compHeight),n.lineTo(0,0)),r=this.viewData[e].v,s=t.applyToPointArray(r.v[0][0],r.v[0][1],0),n.moveTo(s[0],s[1]);var l,p=r.v.length;for(l=1;p>l;l++)s=t.applyToPointArray(r.o[l-1][0],r.o[l-1][1],0),i=t.applyToPointArray(r.i[l][0],r.i[l][1],0),a=t.applyToPointArray(r.v[l][0],r.v[l][1],0),n.bezierCurveTo(s[0],s[1],i[0],i[1],a[0],a[1]);

s=t.applyToPointArray(r.o[l-1][0],r.o[l-1][1],0),i=t.applyToPointArray(r.i[0][0],r.i[0][1],0),a=t.applyToPointArray(r.v[0][0],r.v[0][1],0),n.bezierCurveTo(s[0],s[1],i[0],i[1],a[0],a[1])}h&&n.clip()},CVMaskElement.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].pv};e+=1}},CVMaskElement.prototype.destroy=function(){this.ctx=null},createElement(CVBaseElement,CVShapeElement),CVShapeElement.prototype.lcEnum={1:"butt",2:"round",3:"butt"},CVShapeElement.prototype.ljEnum={1:"miter",2:"round",3:"butt"},CVShapeElement.prototype.transformHelper={opacity:1,mat:new Matrix,matMdf:!1,opMdf:!1},CVShapeElement.prototype.dashResetter=[],CVShapeElement.prototype.createElements=function(){this.parent.createElements.call(this),this.searchShapes(this.shapesData,this.viewData,this.dynamicProperties,[]),this.buildExpressionInterface()},CVShapeElement.prototype.searchShapes=function(t,e,s,i){var a,r,n,o,h=t.length-1,l=[],p=[];for(a=h;a>=0;a-=1)if("fl"==t[a].ty||"st"==t[a].ty){if(o={type:t[a].ty,elements:[]},e[a]={},e[a].c=PropertyFactory.getProp(this,t[a].c,1,null,s),e[a].c.k||(o.co="rgb("+bm_floor(e[a].c.v[0])+","+bm_floor(e[a].c.v[1])+","+bm_floor(e[a].c.v[2])+")"),e[a].o=PropertyFactory.getProp(this,t[a].o,0,.01,s),"st"==t[a].ty&&(o.lc=this.lcEnum[t[a].lc]||"round",o.lj=this.ljEnum[t[a].lj]||"round",1==t[a].lj&&(o.ml=t[a].ml),e[a].w=PropertyFactory.getProp(this,t[a].w,0,null,s),e[a].w.k||(o.wi=e[a].w.v),t[a].d)){var m=PropertyFactory.getDashProp(this,t[a].d,"canvas",s);e[a].d=m,e[a].d.k||(o.da=e[a].d.dasharray,o["do"]=e[a].d.dashoffset)}this.stylesList.push(o),e[a].style=o,l.push(e[a].style)}else if("gr"==t[a].ty)e[a]={it:[]},this.searchShapes(t[a].it,e[a].it,s,i);else if("tr"==t[a].ty)e[a]={transform:{mat:new Matrix,opacity:1,matMdf:!1,opMdf:!1,op:PropertyFactory.getProp(this,t[a].o,0,.01,s),mProps:PropertyFactory.getProp(this,t[a],2,null,s)},elements:[]};else if("sh"==t[a].ty||"rc"==t[a].ty||"el"==t[a].ty||"sr"==t[a].ty){e[a]={nodes:[],trNodes:[],tr:[0,0,0,0,0,0]};var f=4;"rc"==t[a].ty?f=5:"el"==t[a].ty?f=6:"sr"==t[a].ty&&(f=7),i.length&&(t[a].trimmed=!0),e[a].sh=PropertyFactory.getShapeProp(this,t[a],f,s,i),n=this.stylesList.length;var d=!1,c=!1;for(r=0;n>r;r+=1)this.stylesList[r].closed||(this.stylesList[r].elements.push(e[a]),"st"===this.stylesList[r].type?d=!0:c=!0);e[a].st=d,e[a].fl=c}else if("tm"==t[a].ty){var u={closed:!1,trimProp:PropertyFactory.getProp(this,t[a],7,null,s)};i.push(u),p.push(u)}for(h=l.length,a=0;h>a;a+=1)l[a].closed=!0;for(h=p.length,a=0;h>a;a+=1)p[a].closed=!0},CVShapeElement.prototype.renderFrame=function(t){this.parent.renderFrame.call(this,t)!==!1&&(this.transformHelper.mat.reset(),this.transformHelper.opacity=this.finalTransform.opacity,this.transformHelper.matMdf=!1,this.transformHelper.opMdf=this.finalTransform.opMdf,this.renderShape(this.transformHelper,null,null,!0),this.data.hasMask&&this.globalData.renderer.restore(!0))},CVShapeElement.prototype.renderShape=function(t,e,s,i){var a,r;if(!e)for(e=this.shapesData,r=this.stylesList.length,a=0;r>a;a+=1)this.stylesList[a].d="",this.stylesList[a].mdf=!1;s||(s=this.viewData),r=e.length-1;var n,o;for(n=t,a=r;a>=0;a-=1)if("tr"==e[a].ty){n=s[a].transform;var h=s[a].transform.mProps.v.props;if(n.matMdf=n.mProps.mdf,n.opMdf=n.op.mdf,o=n.mat,o.cloneFromProps(h),t){var l=t.mat.props;n.opacity=t.opacity,n.opacity*=s[a].transform.op.v,n.matMdf=t.matMdf?!0:n.matMdf,n.opMdf=t.opMdf?!0:n.opMdf,o.transform(l[0],l[1],l[2],l[3],l[4],l[5],l[6],l[7],l[8],l[9],l[10],l[11],l[12],l[13],l[14],l[15])}else n.opacity=n.op.o}else"sh"==e[a].ty||"el"==e[a].ty||"rc"==e[a].ty||"sr"==e[a].ty?this.renderPath(e[a],s[a],n):"fl"==e[a].ty?this.renderFill(e[a],s[a],n):"st"==e[a].ty?this.renderStroke(e[a],s[a],n):"gr"==e[a].ty?this.renderShape(n,e[a].it,s[a].it):"tm"==e[a].ty;if(i){r=this.stylesList.length;var p,m,f,d,c,u,y,v=this.globalData.renderer,g=this.globalData.canvasContext;for(v.save(),v.ctxTransform(this.finalTransform.mat.props),a=0;r>a;a+=1)if(y=this.stylesList[a].type,"st"!==y||0!==this.stylesList[a].wi){for(v.save(),c=this.stylesList[a].elements,m=c.length,"st"===y?(g.strokeStyle=this.stylesList[a].co,g.lineWidth=this.stylesList[a].wi,g.lineCap=this.stylesList[a].lc,g.lineJoin=this.stylesList[a].lj,g.miterLimit=this.stylesList[a].ml||0):g.fillStyle=this.stylesList[a].co,v.ctxOpacity(this.stylesList[a].coOp),"st"!==y&&g.beginPath(),p=0;m>p;p+=1){for("st"===y&&(g.beginPath(),this.stylesList[a].da?(g.setLineDash(this.stylesList[a].da),g.lineDashOffset=this.stylesList[a]["do"],this.globalData.isDashed=!0):this.globalData.isDashed&&(g.setLineDash(this.dashResetter),this.globalData.isDashed=!1)),u=c[p].trNodes,d=u.length,f=0;d>f;f+=1)"m"==u[f].t?g.moveTo(u[f].p[0],u[f].p[1]):"c"==u[f].t?g.bezierCurveTo(u[f].p1[0],u[f].p1[1],u[f].p2[0],u[f].p2[1],u[f].p3[0],u[f].p3[1]):g.closePath();"st"===y&&g.stroke()}"st"!==y&&g.fill(),v.restore()}v.restore(),this.firstFrame&&(this.firstFrame=!1)}},CVShapeElement.prototype.renderPath=function(t,e,s){var i,a,r=e.sh.v;if(r.v){i=r.v.length;var n=s.matMdf||e.sh.mdf||this.firstFrame;if(n){var o=e.trNodes;o.length=0;var h=r.s?r.s:[];for(a=1;i>a;a+=1)h[a-1]?o.push({t:"m",p:s.mat.applyToPointArray(h[a-1][0],h[a-1][1],0)}):1==a&&o.push({t:"m",p:s.mat.applyToPointArray(r.v[0][0],r.v[0][1],0)}),o.push({t:"c",p1:s.mat.applyToPointArray(r.o[a-1][0],r.o[a-1][1],0),p2:s.mat.applyToPointArray(r.i[a][0],r.i[a][1],0),p3:s.mat.applyToPointArray(r.v[a][0],r.v[a][1],0)});if(1==i&&o.push(h[0]?{t:"m",p:s.mat.applyToPointArray(h[0][0],h[0][1],0)}:{t:"m",p:s.mat.applyToPointArray(r.v[0][0],r.v[0][1],0)}),i&&t.closed&&(!t.trimmed||r.c)&&(o.push({t:"c",p1:s.mat.applyToPointArray(r.o[a-1][0],r.o[a-1][1],0),p2:s.mat.applyToPointArray(r.i[0][0],r.i[0][1],0),p3:s.mat.applyToPointArray(r.v[0][0],r.v[0][1],0)}),o.push({t:"z"})),e.st)for(a=0;16>a;a+=1)e.tr[a]=s.mat.props[a];e.trNodes=o}}},CVShapeElement.prototype.renderFill=function(t,e,s){var i=e.style;(e.c.mdf||this.firstFrame)&&(i.co="rgb("+bm_floor(e.c.v[0])+","+bm_floor(e.c.v[1])+","+bm_floor(e.c.v[2])+")"),(e.o.mdf||s.opMdf||this.firstFrame)&&(i.coOp=e.o.v*s.opacity)},CVShapeElement.prototype.renderStroke=function(t,e,s){var i=e.style,a=e.d;a&&(a.mdf||this.firstFrame)&&(i.da=a.dasharray,i["do"]=a.dashoffset),(e.c.mdf||this.firstFrame)&&(i.co="rgb("+bm_floor(e.c.v[0])+","+bm_floor(e.c.v[1])+","+bm_floor(e.c.v[2])+")"),(e.o.mdf||s.opMdf||this.firstFrame)&&(i.coOp=e.o.v*s.opacity),(e.w.mdf||this.firstFrame)&&(i.wi=e.w.v)},CVShapeElement.prototype.destroy=function(){this.shapesData=null,this.globalData=null,this.canvasContext=null,this.stylesList.length=0,this.viewData.length=0,this.parent.destroy.call()},extendPrototype(ShapeInterface,CVShapeElement),createElement(CVBaseElement,CVSolidElement),CVSolidElement.prototype.renderFrame=function(t){if(this.parent.renderFrame.call(this,t)!==!1){var e=this.canvasContext;this.globalData.renderer.save();var s=this.finalTransform.mat.props;this.globalData.renderer.ctxTransform(s),this.globalData.renderer.ctxOpacity(this.finalTransform.opacity),e.fillStyle=this.data.sc,e.fillRect(0,0,this.data.sw,this.data.sh),this.globalData.renderer.restore(this.data.hasMask),this.firstFrame&&(this.firstFrame=!1)}},createElement(CVBaseElement,CVTextElement),CVTextElement.prototype.init=ITextElement.prototype.init,CVTextElement.prototype.getMeasures=ITextElement.prototype.getMeasures,CVTextElement.prototype.getMult=ITextElement.prototype.getMult,CVTextElement.prototype.tHelper=document.createElement("canvas").getContext("2d"),CVTextElement.prototype.createElements=function(){this.parent.createElements.call(this);var t=this.data.t.d,e=!1;t.fc?(e=!0,this.values.fill="rgb("+t.fc[0]+","+t.fc[1]+","+t.fc[2]+")"):this.values.fill="rgba(0,0,0,0)",this.fill=e;var s=!1;t.sc&&(s=!0,this.values.stroke="rgb("+t.sc[0]+","+t.sc[1]+","+t.sc[2]+")",this.values.sWidth=t.sw);var i,a,r=this.globalData.fontManager.getFontByName(t.f),n=t.l,o=this.mHelper;this.stroke=s,this.values.fValue=t.s+"px "+this.globalData.fontManager.getFontByName(t.f).fFamily,a=t.t.length,this.tHelper.font=this.values.fValue;var h,l,p,m,f,d,c,u,y,v,g=this.data.singleShape;if(g)var b=0,E=0,P=t.lineWidths,k=t.boxWidth,S=!0;for(i=0;a>i;i+=1){h=this.globalData.fontManager.getCharData(t.t.charAt(i),r.fStyle,this.globalData.fontManager.getFontByName(t.f).fFamily);var l;if(l=h?h.data:null,o.reset(),g&&n[i].n&&(b=0,E+=t.yOffset,E+=S?1:0,S=!1),l&&l.shapes){if(f=l.shapes[0].it,c=f.length,o.scale(t.s/100,t.s/100),g){switch(t.ps&&o.translate(t.ps[0],t.ps[1]+t.ascent,0),t.j){case 1:o.translate(t.justifyOffset+(k-P[n[i].line]),0,0);break;case 2:o.translate(t.justifyOffset+(k-P[n[i].line])/2,0,0)}o.translate(b,E,0)}for(y=new Array(c),d=0;c>d;d+=1){for(m=f[d].ks.k.i.length,u=f[d].ks.k,v=[],p=1;m>p;p+=1)1==p&&v.push(o.applyToX(u.v[0][0],u.v[0][1],0),o.applyToY(u.v[0][0],u.v[0][1],0)),v.push(o.applyToX(u.o[p-1][0],u.o[p-1][1],0),o.applyToY(u.o[p-1][0],u.o[p-1][1],0),o.applyToX(u.i[p][0],u.i[p][1],0),o.applyToY(u.i[p][0],u.i[p][1],0),o.applyToX(u.v[p][0],u.v[p][1],0),o.applyToY(u.v[p][0],u.v[p][1],0));v.push(o.applyToX(u.o[p-1][0],u.o[p-1][1],0),o.applyToY(u.o[p-1][0],u.o[p-1][1],0),o.applyToX(u.i[0][0],u.i[0][1],0),o.applyToY(u.i[0][0],u.i[0][1],0),o.applyToX(u.v[0][0],u.v[0][1],0),o.applyToY(u.v[0][0],u.v[0][1],0)),y[d]=v}}else y=[];g&&(b+=n[i].l),this.textSpans.push({elem:y})}},CVTextElement.prototype.renderFrame=function(t){if(this.parent.renderFrame.call(this,t)!==!1){var e=this.canvasContext,s=this.finalTransform.mat.props;this.globalData.renderer.save(),this.globalData.renderer.ctxTransform(s),this.globalData.renderer.ctxOpacity(this.finalTransform.opacity),e.font=this.values.fValue,e.lineCap="butt",e.lineJoin="miter",e.miterLimit=4,this.data.singleShape||this.getMeasures();var i,a,r,n,o,h,l=this.renderedLetters,p=this.data.t.d.l;a=p.length;var m,f,d,c=null,u=null,y=null;for(i=0;a>i;i+=1)if(!p[i].n){if(m=l[i],m&&(this.globalData.renderer.save(),this.globalData.renderer.ctxTransform(m.props),this.globalData.renderer.ctxOpacity(m.o)),this.fill){for(m&&m.fc?c!==m.fc&&(c=m.fc,e.fillStyle=m.fc):c!==this.values.fill&&(c=this.values.fill,e.fillStyle=this.values.fill),f=this.textSpans[i].elem,n=f.length,this.globalData.canvasContext.beginPath(),r=0;n>r;r+=1)for(d=f[r],h=d.length,this.globalData.canvasContext.moveTo(d[0],d[1]),o=2;h>o;o+=6)this.globalData.canvasContext.bezierCurveTo(d[o],d[o+1],d[o+2],d[o+3],d[o+4],d[o+5]);this.globalData.canvasContext.closePath(),this.globalData.canvasContext.fill()}if(this.stroke){for(m&&m.sw?y!==m.sw&&(y=m.sw,e.lineWidth=m.sw):y!==this.values.sWidth&&(y=this.values.sWidth,e.lineWidth=this.values.sWidth),m&&m.sc?u!==m.sc&&(u=m.sc,e.strokeStyle=m.sc):u!==this.values.stroke&&(u=this.values.stroke,e.strokeStyle=this.values.stroke),f=this.textSpans[i].elem,n=f.length,this.globalData.canvasContext.beginPath(),r=0;n>r;r+=1)for(d=f[r],h=d.length,this.globalData.canvasContext.moveTo(d[0],d[1]),o=2;h>o;o+=6)this.globalData.canvasContext.bezierCurveTo(d[o],d[o+1],d[o+2],d[o+3],d[o+4],d[o+5]);this.globalData.canvasContext.closePath(),this.globalData.canvasContext.stroke()}m&&this.globalData.renderer.restore()}this.globalData.renderer.restore(this.data.hasMask),this.firstFrame&&(this.firstFrame=!1)}},createElement(BaseElement,HBaseElement),HBaseElement.prototype.appendNodeToParent=function(t){if(this.placeholder){var e=this.placeholder.phElement;e.parentNode.insertBefore(t,e)}else this.parentContainer.appendChild(t)},HBaseElement.prototype.createElements=function(){this.data.hasMask?(this.layerElement=document.createElementNS(svgNS,"svg"),this.appendNodeToParent(this.layerElement),this.maskedElement=this.layerElement):this.layerElement=this.parentContainer,!this.data.ln||4!==this.data.ty&&0!==this.data.ty||(this.layerElement===this.parentContainer&&(this.layerElement=document.createElementNS(svgNS,"g"),this.appendNodeToParent(this.layerElement)),this.layerElement.setAttribute("id",this.data.ln)),this.layerElement!==this.parentContainer&&(this.placeholder=null)},HBaseElement.prototype.renderFrame=function(t){if(3===this.data.ty)return!1;if(this.currentFrameNum===this.lastNum||!this.isVisible)return this.isVisible;this.lastNum=this.currentFrameNum,this.data.hasMask&&this.maskManager.renderFrame(),this.finalTransform.opMdf=this.finalTransform.op.mdf,this.finalTransform.matMdf=this.finalTransform.mProp.mdf,this.finalTransform.opacity=this.finalTransform.op.v,this.firstFrame&&(this.finalTransform.opMdf=!0,this.finalTransform.matMdf=!0);var e,s=this.finalTransform.mat;if(this.hierarchy){var i,a=this.hierarchy.length;for(e=this.finalTransform.mProp.v.props,s.cloneFromProps(e),i=0;a>i;i+=1)this.finalTransform.matMdf=this.hierarchy[i].finalTransform.mProp.mdf?!0:this.finalTransform.matMdf,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&&this.finalTransform.matMdf&&(t?(e=this.finalTransform.mProp.v.props,s.cloneFromProps(e)):s.cloneFromProps(this.finalTransform.mProp.v.props));return t&&(e=t.mat.props,s.cloneFromProps(e),this.finalTransform.opacity*=t.opacity,this.finalTransform.opMdf=t.opMdf?!0:this.finalTransform.opMdf,this.finalTransform.matMdf=t.matMdf?!0:this.finalTransform.matMdf),this.finalTransform.matMdf&&(this.layerElement.style.transform=this.layerElement.style.webkitTransform=s.toCSS()),this.finalTransform.opMdf&&(this.layerElement.style.opacity=this.finalTransform.opacity),this.isVisible},HBaseElement.prototype.destroy=function(){this.layerElement=null,this.parentContainer=null,this.matteElement&&(this.matteElement=null),this.maskManager&&(this.maskManager.destroy(),this.maskManager=null)},HBaseElement.prototype.getDomElement=function(){return this.layerElement},HBaseElement.prototype.addMasks=function(t){this.maskManager=new MaskElement(t,this,this.globalData)},HBaseElement.prototype.hide=function(){},HBaseElement.prototype.setMatte=function(){},createElement(HBaseElement,HSolidElement),HSolidElement.prototype.createElements=function(){var t=document.createElement("div");styleDiv(t);var e=document.createElementNS(svgNS,"svg");e.setAttribute("width",this.data.sw),e.setAttribute("height",this.data.sh),t.appendChild(e),this.layerElement=t,this.parentContainer.appendChild(t),this.innerElem=t,this.data.ln&&this.innerElem.setAttribute("id",this.data.ln);var s=document.createElementNS(svgNS,"rect");s.setAttribute("width",this.data.sw),s.setAttribute("height",this.data.sh),s.setAttribute("fill",this.data.sc),e.appendChild(s),this.data.hasMask&&(this.maskedElement=s)},HSolidElement.prototype.hide=function(){this.hidden||(this.innerElem.style.display="none",this.hidden=!0)},HSolidElement.prototype.renderFrame=function(t){var e=this.parent.renderFrame.call(this,t);return e===!1?void this.hide():(this.hidden&&(this.hidden=!1,this.innerElem.style.display="block"),void(this.firstFrame&&(this.firstFrame=!1)))},HSolidElement.prototype.destroy=function(){this.parent.destroy.call(),this.innerElem=null},createElement(HBaseElement,HCompElement),extendPrototype(ExpressionComp,HCompElement),HCompElement.prototype.getDomElement=function(){return this.composingElement},HCompElement.prototype.getComposingElement=function(){return this.layerElement},HCompElement.prototype.createElements=function(){if(this.layerElement=document.createElement("div"),styleDiv(this.layerElement),this.data.ln&&this.layerElement.setAttribute("id",this.data.ln),this.layerElement.style.clip="rect(0px, "+this.data.w+"px, "+this.data.h+"px, 0px)",this.layerElement!==this.parentContainer&&(this.placeholder=null),this.data.hasMask){var t=document.createElementNS(svgNS,"svg");t.setAttribute("width",this.data.w),t.setAttribute("height",this.data.h);var e=document.createElementNS(svgNS,"g");t.appendChild(e),this.layerElement.appendChild(t),this.maskedElement=e,this.composingElement=e}else this.composingElement=this.layerElement;this.appendNodeToParent(this.layerElement)},HCompElement.prototype.hide=ICompElement.prototype.hide,HCompElement.prototype.prepareFrame=ICompElement.prototype.prepareFrame,HCompElement.prototype.setElements=ICompElement.prototype.setElements,HCompElement.prototype.getElements=ICompElement.prototype.getElements,HCompElement.prototype.destroy=ICompElement.prototype.destroy,HCompElement.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.elements[e].renderFrame();this.firstFrame&&(this.firstFrame=!1)},createElement(HBaseElement,HShapeElement);var parent=HShapeElement.prototype.parent;extendPrototype(IShapeElement,HShapeElement),HShapeElement.prototype.parent=parent,HShapeElement.prototype.createElements=function(){var t=document.createElement("div");styleDiv(t);var e=document.createElementNS(svgNS,"svg");if(999999===this.data.bounds.l,e.setAttribute("width",this.data.bounds.r-this.data.bounds.l),e.setAttribute("height",this.data.bounds.b-this.data.bounds.t),e.setAttribute("viewBox",this.data.bounds.l+" "+this.data.bounds.t+" "+(this.data.bounds.r-this.data.bounds.l)+" "+(this.data.bounds.b-this.data.bounds.t)),e.style.transform=e.style.webkitTransform="translate("+this.data.bounds.l+"px,"+this.data.bounds.t+"px)",this.data.hasMask){var s=document.createElementNS(svgNS,"g");t.appendChild(e),e.appendChild(s),this.maskedElement=s,this.layerElement=s,this.shapesContainer=s}else t.appendChild(e),this.layerElement=e,this.shapesContainer=document.createElementNS(svgNS,"g"),this.layerElement.appendChild(this.shapesContainer);this.parentContainer.appendChild(t),this.innerElem=t,this.data.ln&&this.innerElem.setAttribute("id",this.data.ln),this.searchShapes(this.shapesData,this.viewData,this.dynamicProperties,[]),this.buildExpressionInterface(),this.layerElement=t},HShapeElement.prototype.renderFrame=function(t){var e=this.parent.renderFrame.call(this,t);return e===!1?void this.hide():(this.hidden=!1,this.transformHelper.opacity=this.finalTransform.opacity,this.transformHelper.matMdf=!1,this.transformHelper.opMdf=this.finalTransform.opMdf,void this.renderShape(this.transformHelper,null,null,!0))},createElement(HBaseElement,HTextElement),HTextElement.prototype.init=ITextElement.prototype.init,HTextElement.prototype.getMeasures=ITextElement.prototype.getMeasures,HTextElement.prototype.createPathShape=ITextElement.prototype.createPathShape,HTextElement.prototype.createElements=function(){this.isMasked=this.checkMasks();var t=this.data.t.d,e=document.createElement("div");if(styleDiv(e),this.layerElement=e,this.isMasked){this.renderType="svg";var s=document.createElementNS(svgNS,"svg");this.cont=s,this.compW=this.comp.data?this.comp.data.w:this.globalData.compSize.w,this.compH=this.comp.data?this.comp.data.h:this.globalData.compSize.h,s.setAttribute("width",this.compW),s.setAttribute("height",this.compH);var i=document.createElementNS(svgNS,"g");s.appendChild(i),e.appendChild(s),this.maskedElement=i,this.innerElem=i}else this.renderType="html",this.innerElem=e;this.parentContainer.appendChild(e),this.innerElem.style.color=this.innerElem.style.fill=t.fc?"rgb("+t.fc[0]+","+t.fc[1]+","+t.fc[2]+")":"rgba(0,0,0,0)",t.sc&&(this.innerElem.style.stroke="rgb("+t.sc[0]+","+t.sc[1]+","+t.sc[2]+")",this.innerElem.style.strokeWidth=t.sw+"px");var a=this.globalData.fontManager.getFontByName(t.f);if(!this.globalData.fontManager.chars)if(this.innerElem.style.fontSize=t.s+"px",this.innerElem.style.lineHeight=t.s+"px",a.fClass)this.innerElem.className=a.fClass;else{this.innerElem.style.fontFamily=a.fFamily;var r=t.fWeight,n=t.fStyle;this.innerElem.style.fontStyle=n,this.innerElem.style.fontWeight=r}var o,h,l=t.l;h=l.length;var p,m,f,d,c=this.mHelper,u="";for(o=0;h>o;o+=1){if(this.globalData.fontManager.chars?(p=document.createElementNS(svgNS,"path"),this.isMasked||(m=document.createElement("div"),f=document.createElementNS(svgNS,"svg"),m.appendChild(f),f.appendChild(p),styleDiv(m)),p.setAttribute("stroke-linecap","butt"),p.setAttribute("stroke-linejoin","round"),p.setAttribute("stroke-miterlimit","4")):this.isMasked?p=document.createElementNS(svgNS,"text"):(m=document.createElement("span"),styleDiv(m),p=document.createElement("span"),styleDiv(p),m.appendChild(p)),this.globalData.fontManager.chars){var y,v=this.globalData.fontManager.getCharData(t.t.charAt(o),a.fStyle,this.globalData.fontManager.getFontByName(t.f).fFamily);if(y=v?v.data:null,c.reset(),y&&y.shapes&&(d=y.shapes[0].it,c.scale(t.s/100,t.s/100),u=this.createPathShape(c,d),p.setAttribute("d",u)),this.isMasked)this.innerElem.appendChild(p);else{this.innerElem.appendChild(m);var g=t.s/100;if(y&&y.shapes){var b=Math.ceil(y.bounds.r*g),E=Math.floor(y.bounds.t*g),P=Math.floor(y.bounds.l*g),k=Math.ceil(y.bounds.b*g);f.setAttribute("width",b-P),f.setAttribute("height",k-E),f.setAttribute("viewBox",P+" "+E+" "+(b-P)+" "+(k-E)),f.style.transform=f.style.webkitTransform="translate("+P+"px,"+E+"px)",l[o].yOffset=E}else f.setAttribute("width",1),f.setAttribute("height",1)}}else p.textContent=l[o].val,p.setAttributeNS("http://www.w3.org/XML/1998/namespace","xml:space","preserve"),this.isMasked?this.innerElem.appendChild(p):(this.innerElem.appendChild(m),p.style.transform=p.style.webkitTransform="translate3d(0,"+-t.s/1.2+"px,0)");this.textSpans.push(this.isMasked?p:m),this.textPaths.push(p)}},HTextElement.prototype.hide=SVGTextElement.prototype.hide,HTextElement.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.innerElem.style.display="block"),this.data.singleShape){if(!this.firstFrame)return;this.isMasked&&this.finalTransform.matMdf&&(this.cont.setAttribute("viewBox",-this.finalTransform.mProp.p.v[0]+" "+-this.finalTransform.mProp.p.v[1]+" "+this.compW+" "+this.compH),this.cont.style.transform=this.cont.style.webkitTransform="translate("+-this.finalTransform.mProp.p.v[0]+"px,"+-this.finalTransform.mProp.p.v[1]+"px)")}if(this.getMeasures(),this.lettersChangedFlag){var s,i,a=this.renderedLetters,r=this.data.t.d.l;i=r.length;var n;for(s=0;i>s;s+=1)r[s].n||(n=a[s],this.isMasked?this.textSpans[s].setAttribute("transform",n.m):this.textSpans[s].style.transform=this.textSpans[s].style.webkitTransform=n.m,this.textSpans[s].style.opacity=n.o,n.sw&&this.textPaths[s].setAttribute("stroke-width",n.sw),n.sc&&this.textPaths[s].setAttribute("stroke",n.sc),n.fc&&(this.textPaths[s].setAttribute("fill",n.fc),this.textPaths[s].style.color=n.fc));if(this.isMasked){var o=this.innerElem.getBBox();this.currentBBox.w!==o.width&&(this.currentBBox.w=o.width,this.cont.setAttribute("width",o.width)),this.currentBBox.h!==o.height&&(this.currentBBox.h=o.height,this.cont.setAttribute("height",o.height)),(this.currentBBox.w!==o.width||this.currentBBox.h!==o.height||this.currentBBox.x!==o.x||this.currentBBox.y!==o.y)&&(this.currentBBox.w=o.width,this.currentBBox.h=o.height,this.currentBBox.x=o.x,this.currentBBox.y=o.y,this.cont.setAttribute("viewBox",this.currentBBox.x+" "+this.currentBBox.y+" "+this.currentBBox.w+" "+this.currentBBox.h),this.cont.style.transform=this.cont.style.webkitTransform="translate("+this.currentBBox.x+"px,"+this.currentBBox.y+"px)")}this.firstFrame&&(this.firstFrame=!1)}},HTextElement.prototype.destroy=SVGTextElement.prototype.destroy,createElement(HBaseElement,HImageElement),HImageElement.prototype.createElements=function(){var t,e=function(){this.imageElem.setAttributeNS("http://www.w3.org/1999/xlink","href",this.path+this.assetData.p)},s=new Image;if(this.data.hasMask){var t=document.createElement("div");styleDiv(t);var i=document.createElementNS(svgNS,"svg");i.setAttribute("width",this.assetData.w),i.setAttribute("height",this.assetData.h),t.appendChild(i),this.imageElem=document.createElementNS(svgNS,"image"),this.imageElem.setAttribute("width",this.assetData.w+"px"),this.imageElem.setAttribute("height",this.assetData.h+"px"),i.appendChild(this.imageElem),this.layerElement=t,this.parentContainer.appendChild(t),this.innerElem=t,this.maskedElement=this.imageElem,s.addEventListener("load",e.bind(this),!1),s.addEventListener("error",e.bind(this),!1)}else styleDiv(s),this.layerElement=s,this.parentContainer.appendChild(s),this.innerElem=s;s.src=this.path+this.assetData.p,this.data.ln&&this.innerElem.setAttribute("id",this.data.ln)},HImageElement.prototype.hide=HSolidElement.prototype.hide,HImageElement.prototype.renderFrame=HSolidElement.prototype.renderFrame,HImageElement.prototype.destroy=HSolidElement.prototype.destroy,createElement(HBaseElement,HCameraElement),HCameraElement.prototype.setup=function(){var t,e,s=this.comp.threeDElements.length;for(t=0;s>t;t+=1)e=this.comp.threeDElements[t],e[0].style.perspective=e[0].style.webkitPerspective=this.pe.v+"px",e[1].style.transformOrigin=e[1].style.mozTransformOrigin=e[1].style.webkitTransformOrigin="0px 0px 0px",e[0].style.transform=e[0].style.webkitTransform="matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1)"},HCameraElement.prototype.createElements=function(){},HCameraElement.prototype.hide=function(){},HCameraElement.prototype.renderFrame=function(){var t,e,s=this.firstFrame;if(this.hierarchy)for(e=this.hierarchy.length,t=0;e>t;t+=1)s=this.hierarchy[t].finalTransform.mProp.mdf?!0:s;if(s||this.p&&this.p.mdf||this.px&&(this.px.mdf||this.py.mdf||this.pz.mdf)||this.rx.mdf||this.ry.mdf||this.rz.mdf||this.or.mdf||this.a&&this.a.mdf){if(this.mat.reset(),this.p?this.mat.translate(-this.p.v[0],-this.p.v[1],this.p.v[2]):this.mat.translate(-this.px.v,-this.py.v,this.pz.v),this.a){var i=[this.p.v[0]-this.a.v[0],this.p.v[1]-this.a.v[1],this.p.v[2]-this.a.v[2]],a=Math.sqrt(Math.pow(i[0],2)+Math.pow(i[1],2)+Math.pow(i[2],2)),r=[i[0]/a,i[1]/a,i[2]/a],n=Math.sqrt(r[2]*r[2]+r[0]*r[0]),o=Math.atan2(r[1],n),h=Math.atan2(r[0],-r[2]);this.mat.rotateY(h).rotateX(-o)}if(this.mat.rotateX(-this.rx.v).rotateY(-this.ry.v).rotateZ(this.rz.v),this.mat.rotateX(-this.or.v[0]).rotateY(-this.or.v[1]).rotateZ(this.or.v[2]),this.mat.translate(this.globalData.compSize.w/2,this.globalData.compSize.h/2,0),this.mat.translate(0,0,this.pe.v),this.hierarchy){var l;for(e=this.hierarchy.length,t=0;e>t;t+=1)l=this.hierarchy[t].finalTransform.mProp.iv.props,this.mat.transform(l[0],l[1],l[2],l[3],l[4],l[5],l[6],l[7],l[8],l[9],l[10],l[11],-l[12],-l[13],l[14],l[15])}e=this.comp.threeDElements.length;var p;for(t=0;e>t;t+=1)p=this.comp.threeDElements[t],p[1].style.transform=p[1].style.webkitTransform=this.mat.toCSS()}this.firstFrame=!1},HCameraElement.prototype.destroy=function(){};var animationManager=function(){function t(e){var s=0,i=e.target;for(i.removeEventListener("destroy",t);P>s;)g[s].animation===i&&(g.splice(s,1),s-=1,P-=1),s+=1}function e(e,s){if(!e)return null;for(var i=0;P>i;){if(g[i].elem==e&&null!==g[i].elem)return g[i].animation;i+=1}var a=new AnimationItem;return a.setData(e,s),a.addEventListener("destroy",t),g.push({elem:e,animation:a}),P+=1,a}function s(e){var s=new AnimationItem;return s.setParams(e),s.addEventListener("destroy",t),g.push({elem:null,animation:s}),P+=1,s}function i(t,e){var s;for(s=0;P>s;s+=1)g[s].animation.setSpeed(t,e)}function a(t,e){var s;for(s=0;P>s;s+=1)g[s].animation.setDirection(t,e)}function r(t){var e;for(e=0;P>e;e+=1)g[e].animation.play(t)}function n(t,e){E=!1,b=Date.now();var s;for(s=0;P>s;s+=1)g[s].animation.moveFrame(t,e)}function o(t){var e,s=t-b;for(e=0;P>e;e+=1)g[e].animation.advanceTime(s);b=t,requestAnimationFrame(o)}function h(t){b=t,requestAnimationFrame(o)}function l(t){var e;for(e=0;P>e;e+=1)g[e].animation.pause(t)}function p(t,e,s){var i;for(i=0;P>i;i+=1)g[i].animation.goToAndStop(t,e,s)}function m(t){var e;for(e=0;P>e;e+=1)g[e].animation.stop(t)}function f(t){var e;for(e=0;P>e;e+=1)g[e].animation.togglePause(t)}function d(t){var e;for(e=0;P>e;e+=1)g[e].animation.destroy(t)}function c(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 o=document.getElementsByTagName("body")[0];o.innerHTML="";var h=document.createElement("div");h.style.width="100%",h.style.height="100%",h.setAttribute("data-bm-type",i),o.appendChild(h),e(h,t)}}function u(){var t;for(t=0;P>t;t+=1)g[t].animation.resize()}function y(){requestAnimationFrame(h)}var v={},g=[],b=0,E=!0,P=0;return setTimeout(y,0),v.registerAnimation=e,v.loadAnimation=s,v.setSpeed=i,v.setDirection=a,v.play=r,v.moveFrame=n,v.pause=l,v.stop=m,v.togglePause=f,v.searchAnimations=c,v.resize=u,v.start=y,v.goToAndStop=p,v.destroy=d,v}(),AnimationItem=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.repeat="indefinite",this.animationData={},this.layers=[],this.assets=[],this.isPaused=!0,this.isScrolling=!1,this.autoplay=!1,this.loop=!0,this.renderer=null,this.animationID=randomString(10),this.renderedFrameCount=0,this.scaleMode="fit",this.math=Math,this.removed=!1,this.timeCompleted=0,this.segmentPos=0,this.segments=[]};AnimationItem.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:"canvas";switch(s){case"canvas":this.renderer=new CanvasRenderer(this,t.rendererSettings);break;case"svg":this.renderer=new SVGRenderer(this,t.rendererSettings);break;case"hybrid":case"html":default:this.renderer=new HybridRenderer(this,t.rendererSettings)}if(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.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){}}}},AnimationItem.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)),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 r=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"===r&&(s.prerender=!1),this.setParams(s)},AnimationItem.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]);dataManager.completeData(this.animationData,this.renderer.globalData.fontManager),this.renderer.includeLayers(t.layers),this.renderer.buildStage(this.container,this.layers),this.renderer.renderFrame(null),this.loadNextSegment()},AnimationItem.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){}}},AnimationItem.prototype.loadSegments=function(){var t=this.animationData.segments;t||(this.timeCompleted=this.animationData.tf),this.loadNextSegment()},AnimationItem.prototype.configAnimation=function(t){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.animationData._id=this.animationID,this.animationData._animType=this.animType,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.loadSegments(),this.updaFrameModifier(),this.renderer.globalData.fontManager?this.waitForFontsLoaded():(dataManager.completeData(this.animationData,this.renderer.globalData.fontManager),this.checkLoaded())},AnimationItem.prototype.waitForFontsLoaded=function(){function t(){this.renderer.globalData.fontManager.loaded?(dataManager.completeData(this.animationData,this.renderer.globalData.fontManager),this.renderer.buildItems(this.animationData.layers),this.checkLoaded()):setTimeout(t.bind(this),20)}return function(){t.bind(this)()}}(),AnimationItem.prototype.elementLoaded=function(){this.pendingElements--,this.checkLoaded()},AnimationItem.prototype.checkLoaded=function(){0===this.pendingElements&&(this.renderer.buildStage(this.container,this.layers),this.trigger("DOMLoaded"),this.isLoaded=!0,this.gotoFrame(),this.autoplay&&this.play())},AnimationItem.prototype.resize=function(){this.renderer.updateContainerSize()},AnimationItem.prototype.gotoFrame=function(){this.currentFrame=subframeEnabled?this.currentRawFrame:this.math.floor(this.currentRawFrame),this.timeCompleted!==this.totalFrames&&this.currentFrame>this.timeCompleted&&(this.currentFrame=this.timeCompleted),this.trigger("enterFrame"),this.renderFrame()},AnimationItem.prototype.renderFrame=function(){this.isLoaded!==!1&&this.renderer.renderFrame(this.currentFrame+this.firstFrame)},AnimationItem.prototype.play=function(t){t&&this.name!=t||this.isPaused===!0&&(this.isPaused=!1)},AnimationItem.prototype.pause=function(t){t&&this.name!=t||this.isPaused===!1&&(this.isPaused=!0)},AnimationItem.prototype.togglePause=function(t){t&&this.name!=t||(this.isPaused===!0?(this.isPaused=!1,this.play()):(this.isPaused=!0,this.pause()))},AnimationItem.prototype.stop=function(t){t&&this.name!=t||(this.isPaused=!0,this.currentFrame=this.currentRawFrame=0,this.playCount=0,this.gotoFrame())},AnimationItem.prototype.goToAndStop=function(t,e,s){s&&this.name!=s||(this.setCurrentRawFrameValue(e?t:t*this.frameModifier),this.isPaused=!0)},AnimationItem.prototype.advanceTime=function(t){this.isPaused!==!0&&this.isScrolling!==!0&&this.isLoaded!==!1&&this.setCurrentRawFrameValue(this.currentRawFrame+t*this.frameModifier)},AnimationItem.prototype.updateAnimation=function(t){this.setCurrentRawFrameValue(this.totalFrames*t)},AnimationItem.prototype.moveFrame=function(t,e){e&&this.name!=e||this.setCurrentRawFrameValue(this.currentRawFrame+t)},AnimationItem.prototype.adjustSegment=function(t){this.totalFrames=t[1]-t[0],this.firstFrame=t[0],this.trigger("segmentStart")},AnimationItem.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.setCurrentRawFrameValue(0)),this.isPaused&&this.play()},AnimationItem.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())},AnimationItem.prototype.remove=function(t){t&&this.name!=t||this.renderer.destroy()},AnimationItem.prototype.destroy=function(t){t&&this.name!=t||this.renderer&&this.renderer.destroyed||(this.renderer.destroy(),this.trigger("destroy"),this._cbs=null)},AnimationItem.prototype.setCurrentRawFrameValue=function(t){this.currentRawFrame=t;var e=!1;if(this.currentRawFrame>=this.totalFrames){if(this.segments.length&&(e=!0),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)return this.currentRawFrame=this.totalFrames-.01,this.gotoFrame(),this.pause(),void this.trigger("complete")}else if(this.currentRawFrame<0)return this.playCount-=1,this.playCount<0&&(this.playCount=0),this.loop===!1?(this.currentRawFrame=0,this.gotoFrame(),this.pause(),void this.trigger("complete")):(this.trigger("loopComplete"),this.currentRawFrame=this.totalFrames+this.currentRawFrame,void this.gotoFrame());if(e){var s=this.currentRawFrame%this.totalFrames;this.adjustSegment(this.segments.shift()),this.currentRawFrame=s}else this.currentRawFrame=this.currentRawFrame%this.totalFrames;this.gotoFrame()},AnimationItem.prototype.setSpeed=function(t){this.playSpeed=t,this.updaFrameModifier()},AnimationItem.prototype.setDirection=function(t){this.playDirection=0>t?-1:1,this.updaFrameModifier()},AnimationItem.prototype.updaFrameModifier=function(){this.frameModifier=this.frameMult*this.playSpeed*this.playDirection},AnimationItem.prototype.getPath=function(){return this.path},AnimationItem.prototype.getAssetData=function(t){for(var e=0,s=this.assets.length;s>e;){if(t==this.assets[e].id)return this.assets[e];e+=1}},AnimationItem.prototype.hide=function(){this.renderer.hide()},AnimationItem.prototype.show=function(){this.renderer.show()},AnimationItem.prototype.getAssets=function(){return this.assets},AnimationItem.prototype.trigger=function(t){if(this._cbs[t])switch(t){case"enterFrame":this.triggerEvent(t,new BMEnterFrameEvent(t,this.currentFrame,this.totalFrames,this.frameMult));break;case"loopComplete":this.triggerEvent(t,new BMCompleteLoopEvent(t,this.loop,this.playCount,this.frameMult));break;case"complete":this.triggerEvent(t,new BMCompleteEvent(t,this.frameMult));break;case"segmentStart":this.triggerEvent(t,new BMSegmentStartEvent(t,this.firstFrame,this.totalFrames));break;case"destroy":this.triggerEvent(t,new BMDestroyEvent(t,this));break;default:this.triggerEvent(t)}"enterFrame"===t&&this.onEnterFrame&&this.onEnterFrame.call(this,new BMEnterFrameEvent(t,this.currentFrame,this.totalFrames,this.frameMult)),"loopComplete"===t&&this.onLoopComplete&&this.onLoopComplete.call(this,new BMCompleteLoopEvent(t,this.loop,this.playCount,this.frameMult)),"complete"===t&&this.onComplete&&this.onComplete.call(this,new BMCompleteEvent(t,this.frameMult)),"segmentStart"===t&&this.onSegmentStart&&this.onSegmentStart.call(this,new BMSegmentStartEvent(t,this.firstFrame,this.totalFrames)),"destroy"===t&&this.onDestroy&&this.onDestroy.call(this,new BMDestroyEvent(t,this))},AnimationItem.prototype.addEventListener=_addEventListener,AnimationItem.prototype.removeEventListener=_removeEventListener,AnimationItem.prototype.triggerEvent=_triggerEvent;var bodymovinjs = {}; function play(animation){ animationManager.play(animation); } function pause(animation){ animationManager.pause(animation); } function togglePause(animation){ animationManager.togglePause(animation); } function setSpeed(value,animation){ animationManager.setSpeed(value, animation); } function setDirection(value,animation){ animationManager.setDirection(value, animation); } function stop(animation){ animationManager.stop(animation); } function moveFrame(value){ animationManager.moveFrame(value); } function searchAnimations(){ if(standalone === true){ animationManager.searchAnimations(animationData,standalone, renderer); }else{ animationManager.searchAnimations(); } } function registerAnimation(elem){ return animationManager.registerAnimation(elem); } function resize(){ animationManager.resize(); } function start(){ animationManager.start(); } function goToAndStop(val,isFrame, animation){ animationManager.goToAndStop(val,isFrame, animation); } function setSubframeRendering(flag){ subframeEnabled = flag; } function loadAnimation(params){ if(standalone === true){ params.animationData = JSON.parse(animationData); } return animationManager.loadAnimation(params); } function destroy(animation){ return animationManager.destroy(animation); } function setQuality(value){ if(typeof value === 'string'){ switch(value){ case 'high': defaultCurveSegments = 200; break; case 'medium': defaultCurveSegments = 50; break; case 'low': defaultCurveSegments = 10; break; } }else if(!isNaN(value) && value > 1){ defaultCurveSegments = value; } if(defaultCurveSegments >= 50){ roundValues(false); }else{ roundValues(true); } } bodymovinjs.play = play; bodymovinjs.pause = pause; bodymovinjs.togglePause = togglePause; bodymovinjs.setSpeed = setSpeed; bodymovinjs.setDirection = setDirection; bodymovinjs.stop = stop; bodymovinjs.moveFrame = moveFrame; bodymovinjs.searchAnimations = searchAnimations; bodymovinjs.registerAnimation = registerAnimation; bodymovinjs.loadAnimation = loadAnimation; bodymovinjs.setSubframeRendering = setSubframeRendering; bodymovinjs.resize = resize; bodymovinjs.start = start; bodymovinjs.goToAndStop = goToAndStop; bodymovinjs.destroy = destroy; bodymovinjs.setQuality = setQuality; bodymovinjs.version = '4.1.8'; function checkReady(){ if (document.readyState === "complete") { clearInterval(readyStateCheckInterval); searchAnimations(); } } function getQueryVariable(variable) { var vars = queryString.split('&'); for (var i = 0; i < vars.length; i++) { var pair = vars[i].split('='); if (decodeURIComponent(pair[0]) == variable) { return decodeURIComponent(pair[1]); } } } var standalone = '__[STANDALONE]__'; var animationData = '__[ANIMATIONDATA]__'; var renderer = ''; if(standalone) { var scripts = document.getElementsByTagName('script'); var index = scripts.length - 1; var myScript = scripts[index]; var queryString = myScript.src.replace(/^[^\?]+\??/,''); renderer = getQueryVariable('renderer'); } var readyStateCheckInterval = setInterval(checkReady, 100); return bodymovinjs; })); 