diff --git a/build/player/lottie.js b/build/player/lottie.js
index 0203434..aff4209 100644
--- a/build/player/lottie.js
+++ b/build/player/lottie.js
@@ -47,7 +47,7 @@
 BMMath.abs = function(val){
     var tOfVal = typeof val;
     if(tOfVal === 'object' && val.length){
-        var absArr = Array.apply(null,{length:val.length});
+        var absArr = _cv(val.length);
         var i, len = val.length;
         for(i=0;i<len;i+=1){
             absArr[i] = Math.abs(val[i]);
@@ -103,7 +103,7 @@
 
 function BMSegmentStartEvent(n,f,t){
     this.type = n;
-    this.firstFrame = f;
+    this._ch = f;
     this.totalFrames = t;
 }
 
@@ -112,48 +112,6 @@
     this.target = t;
 }
 
-function _addEventListener(eventName, callback){
-
-    if (!this._cbs[eventName]){
-        this._cbs[eventName] = [];
-    }
-    this._cbs[eventName].push(callback);
-
-	return function() {
-		this.removeEventListener(eventName, callback);
-	}.bind(this);
-}
-
-function _removeEventListener(eventName,callback){
-
-    if (!callback){
-        this._cbs[eventName] = null;
-    }else if(this._cbs[eventName]){
-        var i = 0, len = this._cbs[eventName].length;
-        while(i<len){
-            if(this._cbs[eventName][i] === callback){
-                this._cbs[eventName].splice(i,1);
-                i -=1;
-                len -= 1;
-            }
-            i += 1;
-        }
-        if(!this._cbs[eventName].length){
-            this._cbs[eventName] = null;
-        }
-    }
-
-}
-
-function _triggerEvent(eventName, args){
-    if (this._cbs[eventName]) {
-        var len = this._cbs[eventName].length;
-        for (var i = 0; i < len; i++){
-            this._cbs[eventName][i](args);
-        }
-    }
-}
-
 function randomString(length, chars){
     if(chars === undefined){
         chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890';
@@ -269,7 +227,46 @@
         return '#' + colorMap[r] + colorMap[g] + colorMap[b];
     };
 }());
-var createTypedArray = (function(){
+function BaseEvent(){}
+BaseEvent.prototype = {
+	_cy: function (eventName, args) {
+	    if (this._cbs[eventName]) {
+	        var len = this._cbs[eventName].length;
+	        for (var i = 0; i < len; i++){
+	            this._cbs[eventName][i](args);
+	        }
+	    }
+	},
+	addEventListener: function (eventName, callback) {
+	    if (!this._cbs[eventName]){
+	        this._cbs[eventName] = [];
+	    }
+	    this._cbs[eventName].push(callback);
+
+		return function() {
+			this.removeEventListener(eventName, callback);
+		}.bind(this);
+	},
+	removeEventListener: function (eventName,callback){
+	    if (!callback){
+	        this._cbs[eventName] = null;
+	    }else if(this._cbs[eventName]){
+	        var i = 0, len = this._cbs[eventName].length;
+	        while(i<len){
+	            if(this._cbs[eventName][i] === callback){
+	                this._cbs[eventName].splice(i,1);
+	                i -=1;
+	                len -= 1;
+	            }
+	            i += 1;
+	        }
+	        if(!this._cbs[eventName].length){
+	            this._cbs[eventName] = null;
+	        }
+	    }
+	}
+}
+var _cs = (function(){
 	function createRegularArray(type, len){
 		var i = 0, arr = [], value;
 		switch(type) {
@@ -286,7 +283,7 @@
 		}
 		return arr;
 	}
-	function createTypedArray(type, len){
+	function _cs(type, len){
 		if(type === 'float32') {
 			return new Float32Array(len);
 		} else if(type === 'int16') {
@@ -296,16 +293,20 @@
 		}
 	}
 	if(typeof Uint8ClampedArray === 'function' && typeof Float32Array === 'function') {
-		return createTypedArray
+		return _cs
 	} else {
 		return createRegularArray
 	}
 }())
-function createNS(type) {
+
+function _cv(len) {
+	return Array.apply(null,{length:len})
+}
+function _ct(type) {
 	//return {appendChild:function(){},setAttribute:function(){},style:{}}
 	return document.createElementNS(svgNS, type);
 }
-function createTag(type) {
+function _cu(type) {
 	//return {appendChild:function(){},setAttribute:function(){},style:{}}
 	return document.createElement(type);
 }
@@ -612,7 +613,7 @@
         return retPts;
     }
 
-    function applyToPointArray(x,y,z,dimensions){
+    function _cn(x,y,z,dimensions){
         if(dimensions && dimensions === 2) {
             var arr = point_pool.newElement();
             arr[0] = x * this.props[0] + y * this.props[4] + z * this.props[8] + this.props[12]; 
@@ -672,7 +673,7 @@
         this.applyToX = applyToX;
         this.applyToY = applyToY;
         this.applyToZ = applyToZ;
-        this.applyToPointArray = applyToPointArray;
+        this._cn = _cn;
         this.applyToPointStringified = applyToPointStringified;
         this.toCSS = toCSS;
         this.to2dCSS = to2dCSS;
@@ -686,7 +687,7 @@
         this._identity = true;
         this._identityCalculated = false;
 
-        this.props = createTypedArray('float32', 16);
+        this.props = _cs('float32', 16);
         this.reset();
     }
 }());
@@ -1239,7 +1240,7 @@
             var bezierData = new BezierData(curveSegments);
             len = pt3.length;
             for (k = 0; k < curveSegments; k += 1) {
-                point = Array.apply(null,{length:len});
+                point = _cv(len);
                 perc = k / (curveSegments - 1);
                 ptDistance = 0;
                 for (i = 0; i < len; i += 1){
@@ -1304,7 +1305,7 @@
 
     }
 
-    var bezier_segment_points = createTypedArray('float32', 8);
+    var bezier_segment_points = _cs('float32', 8);
 
     function getNewSegment(pt1,pt2,pt3,pt4,startPerc,endPerc, bezierData){
 
@@ -1367,9 +1368,9 @@
 var bez = bezFunction();
 function dataFunctionManager(){
 
-    //var tCanvasHelper = createTag('canvas').getContext('2d');
+    //var tCanvasHelper = _cu('canvas').getContext('2d');
 
-    function completeLayers(layers, comps, fontManager){
+    function _db(layers, comps, _cr){
         var layerData;
         var animArray, lastFrame;
         var i, len = layers.length;
@@ -1406,11 +1407,11 @@
             }
             if(layerData.ty===0){
                 layerData.layers = findCompLayers(layerData.refId, comps);
-                completeLayers(layerData.layers,comps, fontManager);
+                _db(layerData.layers,comps, _cr);
             }else if(layerData.ty === 4){
                 completeShapes(layerData.shapes);
             }else if(layerData.ty == 5){
-                completeText(layerData, fontManager);
+                completeText(layerData, _cr);
             }
         }
     }
@@ -1755,7 +1756,7 @@
         }
     }
 
-    function blitText(data, fontManager){
+    function blitText(data, _cr){
 
     }
 
@@ -1794,7 +1795,7 @@
         }
     }
 
-    function blitLayers(layers,comps, fontManager){
+    function blitLayers(layers,comps, _cr){
         var layerData;
         var animArray, lastFrame;
         var i, len = layers.length;
@@ -1834,11 +1835,11 @@
             if(layerData.ty===0){
                 layerData.w = Math.round(layerData.w/blitter);
                 layerData.h = Math.round(layerData.h/blitter);
-                blitLayers(layerData.layers,comps, fontManager);
+                blitLayers(layerData.layers,comps, _cr);
             }else if(layerData.ty === 4){
                 blitShapes(layerData.shapes);
             }else if(layerData.ty == 5){
-                blitText(layerData, fontManager);
+                blitText(layerData, _cr);
             }else if(layerData.ty == 1){
                 layerData.sh /= blitter;
                 layerData.sw /= blitter;
@@ -1847,11 +1848,11 @@
         }
     }
 
-    function blitAnimation(animationData,comps, fontManager){
-        blitLayers(animationData.layers,comps, fontManager);
+    function blitAnimation(animationData,comps, _cr){
+        blitLayers(animationData.layers,comps, _cr);
     }*/
 
-    function completeData(animationData, fontManager){
+    function completeData(animationData, _cr){
         if(animationData.__complete){
             return;
         }
@@ -1859,12 +1860,12 @@
         checkText(animationData);
         checkChars(animationData);
         checkShapes(animationData);
-        completeLayers(animationData.layers, animationData.assets, fontManager);
+        _db(animationData.layers, animationData.assets, _cr);
         animationData.__complete = true;
-        //blitAnimation(animationData, animationData.assets, fontManager);
+        //blitAnimation(animationData, animationData.assets, _cr);
     }
 
-    function completeText(data, fontManager){
+    function completeText(data, _cr){
         if(data.t.a.length === 0 && !('m' in data.t.p)){
             data.singleShape = true;
         }
@@ -1887,9 +1888,9 @@
     }
 
     function setUpNode(font, family){
-        var parentNode = createTag('span');
+        var parentNode = _cu('span');
         parentNode.style.fontFamily    = family;
-        var node = createTag('span');
+        var node = _cu('span');
         // Characters that vary significantly among different fonts
         node.innerHTML = 'giItT1WQy@!-/#';
         // Visible - so we can measure it - but not on the screen
@@ -1966,7 +1967,7 @@
     };
 
     function createHelper(def, fontData){
-        var tHelper = createNS('text');
+        var tHelper = _ct('text');
         tHelper.style.fontSize = '100px';
         tHelper.style.fontFamily = fontData.fFamily;
         tHelper.textContent = '1';
@@ -1977,7 +1978,7 @@
             tHelper.style.fontFamily = fontData.fFamily;
         }
         def.appendChild(tHelper);
-        var tCanvasHelper = createTag('canvas').getContext('2d');
+        var tCanvasHelper = _cu('canvas').getContext('2d');
         tCanvasHelper.font = '100px '+ fontData.fFamily;
         return tCanvasHelper;
     }
@@ -2002,20 +2003,20 @@
             if(!fontArr[i].fPath) {
                 fontArr[i].loaded = true;
             }else if(fontArr[i].fOrigin === 'p' || fontArr[i].origin === 3){
-                var s = createTag('style');
+                var s = _cu('style');
                 s.type = "text/css";
                 s.innerHTML = "@font-face {" + "font-family: "+fontArr[i].fFamily+"; font-style: normal; src: url('"+fontArr[i].fPath+"');}";
                 defs.appendChild(s);
             } else if(fontArr[i].fOrigin === 'g' || fontArr[i].origin === 1){
                 //<link href='https://fonts.googleapis.com/css?family=Montserrat' rel='stylesheet' type='text/css'>
-                var l = createTag('link');
+                var l = _cu('link');
                 l.type = "text/css";
                 l.rel = "stylesheet";
                 l.href = fontArr[i].fPath;
                 defs.appendChild(l);
             } else if(fontArr[i].fOrigin === 't' || fontArr[i].origin === 2){
                 //<link href='https://fonts.googleapis.com/css?family=Montserrat' rel='stylesheet' type='text/css'>
-                var sc = createTag('script');
+                var sc = _cu('script');
                 sc.setAttribute('src',fontArr[i].fPath);
                 defs.appendChild(sc);
             }
@@ -2107,16 +2108,16 @@
         var offsetTime = this.offsetTime;
         var newValue;
         if(this.propType === 'multidimensional') {
-            newValue = createTypedArray('float32', previousValue.length);
+            newValue = _cs('float32', previousValue.length);
         }
         var iterationIndex = caching.lastIndex;
         var i = iterationIndex;
-        var len = this.keyframes.length- 1,flag = true;
+        var len = this._df.length- 1,flag = true;
         var keyData, nextKeyData;
 
         while(flag){
-            keyData = this.keyframes[i];
-            nextKeyData = this.keyframes[i+1];
+            keyData = this._df[i];
+            nextKeyData = this._df[i+1];
             if(i == len-1 && frameNum >= nextKeyData.t - offsetTime){
                 if(keyData.h){
                     keyData = nextKeyData;
@@ -2281,8 +2282,8 @@
         }
         this.mdf = false;
         var frameNum = this.comp.renderedFrame - this.offsetTime;
-        var initTime = this.keyframes[0].t - this.offsetTime;
-        var endTime = this.keyframes[this.keyframes.length- 1].t-this.offsetTime;
+        var initTime = this._df[0].t - this.offsetTime;
+        var endTime = this._df[this._df.length- 1].t-this.offsetTime;
         if(!(frameNum === this._caching.lastFrame || (this._caching.lastFrame !== initFrame && ((this._caching.lastFrame >= endTime && frameNum >= endTime) || (this._caching.lastFrame < initTime && frameNum < initTime))))){
             this._caching.lastIndex = this._caching.lastFrame < frameNum ? this._caching.lastIndex : 0;
             var renderResult = this.interpolateValue(frameNum, this.pv, this._caching);
@@ -2316,11 +2317,11 @@
         this.k = false;
         this.kf = false;
         this.frameId = -1;
-        this.v = createTypedArray('float32', data.k.length);
-        this.pv = createTypedArray('float32', data.k.length);
-        this.lastValue = createTypedArray('float32', data.k.length);
-        var arr = createTypedArray('float32', data.k.length);
-        this.vel = createTypedArray('float32', data.k.length);
+        this.v = _cs('float32', data.k.length);
+        this.pv = _cs('float32', data.k.length);
+        this.lastValue = _cs('float32', data.k.length);
+        var arr = _cs('float32', data.k.length);
+        this.vel = _cs('float32', data.k.length);
         var i, len = data.k.length;
         for(i = 0;i<len;i+=1){
             this.v[i] = mult ? data.k[i] * mult : data.k[i];
@@ -2331,7 +2332,7 @@
 
     function KeyframedValueProperty(elem, data, mult){
         this.propType = 'unidimensional';
-        this.keyframes = data.k;
+        this._df = data.k;
         this.offsetTime = elem.data.st;
         this.lastValue = initFrame;
         this.lastPValue = initFrame;
@@ -2342,7 +2343,7 @@
         this.data = data;
         this.mult = mult;
         this.elem = elem;
-        this.firstFrame = false;
+        this._ch = false;
         this.comp = elem.comp;
         this.v = mult ? data.k[0].s[0]*mult : data.k[0].s[0];
         this.pv = data.k[0].s[0];
@@ -2373,11 +2374,11 @@
                 }
             }
         }
-        this.keyframes = data.k;
+        this._df = data.k;
         this.offsetTime = elem.data.st;
         this.k = true;
         this.kf = true;
-        this.firstFrame = true;
+        this._ch = true;
         this.mult = mult;
         this.elem = elem;
         this.comp = elem.comp;
@@ -2386,11 +2387,11 @@
         this.interpolateValue = interpolateValue;
         this.frameId = -1;
         var arrLen = data.k[0].s.length;
-        this.v = createTypedArray('float32', arrLen);
-        this.pv = createTypedArray('float32', arrLen);
-        this.lastValue = createTypedArray('float32', arrLen);
-        this.lastPValue = createTypedArray('float32', arrLen);
-        this._caching={lastFrame:initFrame,lastIndex:0,value:createTypedArray('float32', arrLen)};
+        this.v = _cs('float32', arrLen);
+        this.pv = _cs('float32', arrLen);
+        this.lastValue = _cs('float32', arrLen);
+        this.lastPValue = _cs('float32', arrLen);
+        this._caching={lastFrame:initFrame,lastIndex:0,value:_cs('float32', arrLen)};
     }
 
     function _bo(elem,data,type, mult, arr) {
@@ -2435,10 +2436,10 @@
 var _ag = (function() {
 
     function applyToMatrix(mat) {
-        var i, len = this.dynamicProperties.length;
+        var i, len = this._co.length;
         for(i = 0; i < len; i += 1) {
-            this.dynamicProperties[i].getValue();
-            if (this.dynamicProperties[i].mdf) {
+            this._co[i].getValue();
+            if (this._co[i].mdf) {
                 this.mdf = true;
             }
         }
@@ -2463,17 +2464,17 @@
             mat.translate(this.p.v[0], this.p.v[1], -this.p.v[2]);
         }
     }
-    function processKeys(firstFrame){
+    function processKeys(_ch){
         if (this.elem._x.frameId === this.frameId) {
             return;
         }
 
-        this.mdf = firstFrame;
-        var i, len = this.dynamicProperties.length;
+        this.mdf = _ch;
+        var i, len = this._co.length;
 
         for(i = 0; i < len; i += 1) {
-            this.dynamicProperties[i].getValue();
-            if (this.dynamicProperties[i].mdf) {
+            this._co[i].getValue();
+            if (this._co[i].mdf) {
                 this.mdf = true;
             }
         }
@@ -2494,17 +2495,17 @@
             } else {
                 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]);
             }
-            if (this.autoOriented && this.p.keyframes && this.p.getValueAtTime) {
+            if (this.autoOriented && this.p._df && this.p._dg) {
                 var v1,v2;
-                if (this.p._caching.lastFrame+this.p.offsetTime <= this.p.keyframes[0].t) {
-                    v1 = this.p.getValueAtTime((this.p.keyframes[0].t + 0.01) / this.elem._x.frameRate,0);
-                    v2 = this.p.getValueAtTime(this.p.keyframes[0].t / this.elem._x.frameRate, 0);
-                } else if(this.p._caching.lastFrame+this.p.offsetTime >= this.p.keyframes[this.p.keyframes.length - 1].t) {
-                    v1 = this.p.getValueAtTime((this.p.keyframes[this.p.keyframes.length - 1].t / this.elem._x.frameRate), 0);
-                    v2 = this.p.getValueAtTime((this.p.keyframes[this.p.keyframes.length - 1].t - 0.01) / this.elem._x.frameRate, 0);
+                if (this.p._caching.lastFrame+this.p.offsetTime <= this.p._df[0].t) {
+                    v1 = this.p._dg((this.p._df[0].t + 0.01) / this.elem._x.frameRate,0);
+                    v2 = this.p._dg(this.p._df[0].t / this.elem._x.frameRate, 0);
+                } else if(this.p._caching.lastFrame+this.p.offsetTime >= this.p._df[this.p._df.length - 1].t) {
+                    v1 = this.p._dg((this.p._df[this.p._df.length - 1].t / this.elem._x.frameRate), 0);
+                    v2 = this.p._dg((this.p._df[this.p._df.length - 1].t - 0.01) / this.elem._x.frameRate, 0);
                 } else {
                     v1 = this.p.pv;
-                    v2 = this.p.getValueAtTime((this.p._caching.lastFrame+this.p.offsetTime - 0.01) / this.elem._x.frameRate, this.p.offsetTime);
+                    v2 = this.p._dg((this.p._caching.lastFrame+this.p.offsetTime - 0.01) / this.elem._x.frameRate, this.p.offsetTime);
                 }
                 this.v.rotate(-Math.atan2(v1[1] - v2[1], v1[0] - v2[0]));
             }
@@ -2546,59 +2547,59 @@
 
     function autoOrient(){
         //
-        //var prevP = this.getValueAtTime();
+        //var prevP = this._dg();
     }
 
     function _bk(elem,data,arr){
         this.elem = elem;
         this.frameId = -1;
         this.propType = 'transform';
-        this.dynamicProperties = [];
+        this._co = [];
         this.mdf = false;
         this.data = data;
         this.v = new Matrix();
         if(data.p.s){
-            this.px = _ai._bo(elem,data.p.x,0,0,this.dynamicProperties);
-            this.py = _ai._bo(elem,data.p.y,0,0,this.dynamicProperties);
+            this.px = _ai._bo(elem,data.p.x,0,0,this._co);
+            this.py = _ai._bo(elem,data.p.y,0,0,this._co);
             if(data.p.z){
-                this.pz = _ai._bo(elem,data.p.z,0,0,this.dynamicProperties);
+                this.pz = _ai._bo(elem,data.p.z,0,0,this._co);
             }
         }else{
-            this.p = _ai._bo(elem,data.p,1,0,this.dynamicProperties);
+            this.p = _ai._bo(elem,data.p,1,0,this._co);
         }
         if(data.r) {
-            this.r = _ai._bo(elem, data.r, 0, degToRads, this.dynamicProperties);
+            this.r = _ai._bo(elem, data.r, 0, degToRads, this._co);
         } else if(data.rx) {
-            this.rx = _ai._bo(elem, data.rx, 0, degToRads, this.dynamicProperties);
-            this.ry = _ai._bo(elem, data.ry, 0, degToRads, this.dynamicProperties);
-            this.rz = _ai._bo(elem, data.rz, 0, degToRads, this.dynamicProperties);
+            this.rx = _ai._bo(elem, data.rx, 0, degToRads, this._co);
+            this.ry = _ai._bo(elem, data.ry, 0, degToRads, this._co);
+            this.rz = _ai._bo(elem, data.rz, 0, degToRads, this._co);
             if(data.or.k[0].ti) {
                 var i, len = data.or.k.length;
                 for(i=0;i<len;i+=1) {
                     data.or.k[i].to = data.or.k[i].ti = null;
                 }
             }
-            this.or = _ai._bo(elem, data.or, 1, degToRads, this.dynamicProperties);
+            this.or = _ai._bo(elem, data.or, 1, degToRads, this._co);
             //sh Indicates it needs to be capped between -180 and 180
             this.or.sh = true;
         }
         if(data.sk){
-            this.sk = _ai._bo(elem, data.sk, 0, degToRads, this.dynamicProperties);
-            this.sa = _ai._bo(elem, data.sa, 0, degToRads, this.dynamicProperties);
+            this.sk = _ai._bo(elem, data.sk, 0, degToRads, this._co);
+            this.sa = _ai._bo(elem, data.sa, 0, degToRads, this._co);
         }
         if(data.a) {
-            this.a = _ai._bo(elem,data.a,1,0,this.dynamicProperties);
+            this.a = _ai._bo(elem,data.a,1,0,this._co);
         }
         if(data.s) {
-            this.s = _ai._bo(elem,data.s,1,0.01,this.dynamicProperties);
+            this.s = _ai._bo(elem,data.s,1,0.01,this._co);
         }
-        // Opacity is not part of the transform properties, that's why it won't use this.dynamicProperties. That way transforms won't get updated if opacity changes.
+        // Opacity is not part of the transform properties, that's why it won't use this._co. That way transforms won't get updated if opacity changes.
         if(data.o){
             this.o = _ai._bo(elem,data.o,0,0.01,arr);
         } else {
             this.o = {mdf:false,v:1};
         }
-        if(this.dynamicProperties.length){
+        if(this._co.length){
             arr.push(this);
         }else{
             this.getValue(true);
@@ -2623,9 +2624,9 @@
 	this.c = false;
 	this._length = 0;
 	this._maxLength = 8;
-	this.v = Array.apply(null,{length:this._maxLength});
-	this.o = Array.apply(null,{length:this._maxLength});
-	this.i = Array.apply(null,{length:this._maxLength});
+	this.v = _cv(this._maxLength);
+	this.o = _cv(this._maxLength);
+	this.i = _cv(this._maxLength);
 };
 
 _av.prototype.setPathData = function(closed, len) {
@@ -2648,9 +2649,9 @@
 }
 
 _av.prototype.doubleArrayLength = function() {
-	this.v = this.v.concat(Array.apply(null,{length:this._maxLength}))
-	this.i = this.i.concat(Array.apply(null,{length:this._maxLength}))
-	this.o = this.o.concat(Array.apply(null,{length:this._maxLength}))
+	this.v = this.v.concat(_cv(this._maxLength))
+	this.i = this.i.concat(_cv(this._maxLength))
+	this.o = this.o.concat(_cv(this._maxLength))
 	this._maxLength *= 2;
 };
 
@@ -2709,23 +2710,23 @@
     function interpolateShape(frameNum, previousValue, isCurrentRender, caching) {
         var iterationIndex = caching.lastIndex;
         var keyPropS,keyPropE,isHold;
-        if(frameNum < this.keyframes[0].t-this.offsetTime){
-            keyPropS = this.keyframes[0].s[0];
+        if(frameNum < this._df[0].t-this.offsetTime){
+            keyPropS = this._df[0].s[0];
             isHold = true;
             iterationIndex = 0;
-        }else if(frameNum >= this.keyframes[this.keyframes.length - 1].t-this.offsetTime){
-            if(this.keyframes[this.keyframes.length - 2].h === 1){
-                keyPropS = this.keyframes[this.keyframes.length - 1].s[0];
+        }else if(frameNum >= this._df[this._df.length - 1].t-this.offsetTime){
+            if(this._df[this._df.length - 2].h === 1){
+                keyPropS = this._df[this._df.length - 1].s[0];
             }else{
-                keyPropS = this.keyframes[this.keyframes.length - 2].e[0];
+                keyPropS = this._df[this._df.length - 2].e[0];
             }
             isHold = true;
         }else{
             var i = iterationIndex;
-            var len = this.keyframes.length- 1,flag = true,keyData,nextKeyData, j, jLen, k, kLen;
+            var len = this._df.length- 1,flag = true,keyData,nextKeyData, j, jLen, k, kLen;
             while(flag){
-                keyData = this.keyframes[i];
-                nextKeyData = this.keyframes[i+1];
+                keyData = this._df[i];
+                nextKeyData = this._df[i+1];
                 if((nextKeyData.t - this.offsetTime) > frameNum){
                     break;
                 }
@@ -2807,8 +2808,8 @@
         }
         this.mdf = false;
         var frameNum = this.comp.renderedFrame - this.offsetTime;
-        var initTime = this.keyframes[0].t - this.offsetTime;
-        var endTime = this.keyframes[this.keyframes.length - 1].t - this.offsetTime;
+        var initTime = this._df[0].t - this.offsetTime;
+        var endTime = this._df[this._df.length - 1].t - this.offsetTime;
         var lastFrame = this._caching.lastFrame;
         if(!(lastFrame !== initFrame && ((lastFrame < initTime && frameNum < initTime) || (lastFrame > endTime && frameNum > endTime)))){
             ////
@@ -2856,13 +2857,13 @@
         this.comp = elem.comp;
         this.elem = elem;
         this.offsetTime = elem.data.st;
-        this.keyframes = type === 3 ? data.pt.k : data.ks.k;
+        this._df = type === 3 ? data.pt.k : data.ks.k;
         this.k = true;
         this.kf = true;
-        var i, len = this.keyframes[0].s[0].i.length;
-        var jLen = this.keyframes[0].s[0].i[0].length;
+        var i, len = this._df[0].s[0].i.length;
+        var jLen = this._df[0].s[0].i[0].length;
         this.v = shape_pool.newElement();
-        this.v.setPathData(this.keyframes[0].s[0].c, len);
+        this.v.setPathData(this._df[0].s[0].c, len);
         this.pv = shape_pool.clone(this.v);
         this._ak = shapeCollection_pool._al();
         this.paths = this._ak;
@@ -2911,7 +2912,7 @@
         }
 
         function processKeys(frameNum){
-            var i, len = this.dynamicProperties.length;
+            var i, len = this._co.length;
             if(this.elem._x.frameId === this.frameId){
                 return;
             }
@@ -2919,8 +2920,8 @@
             this.frameId = this.elem._x.frameId;
 
             for(i=0;i<len;i+=1){
-                this.dynamicProperties[i].getValue(frameNum);
-                if(this.dynamicProperties[i].mdf){
+                this._co[i].getValue(frameNum);
+                if(this._co[i].mdf){
                     this.mdf = true;
                 }
             }
@@ -2931,9 +2932,9 @@
 
         return function EllShapeProperty(elem,data) {
             /*this.v = {
-                v: Array.apply(null,{length:4}),
-                i: Array.apply(null,{length:4}),
-                o: Array.apply(null,{length:4}),
+                v: _cv(4),
+                i: _cv(4),
+                o: _cv(4),
                 c: true
             };*/
             this.v = shape_pool.newElement();
@@ -2942,7 +2943,7 @@
             this.paths = this._ak;
             this._ak.addShape(this.v);
             this.d = data.d;
-            this.dynamicProperties = [];
+            this._co = [];
             this.elem = elem;
             this.comp = elem.comp;
             this.frameId = -1;
@@ -2950,9 +2951,9 @@
             this.getValue = processKeys;
             this.convertEllToPath = convertEllToPath;
             this.reset = resetShape;
-            this.p = _ai._bo(elem,data.p,1,0,this.dynamicProperties);
-            this.s = _ai._bo(elem,data.s,1,0,this.dynamicProperties);
-            if(this.dynamicProperties.length){
+            this.p = _ai._bo(elem,data.p,1,0,this._co);
+            this.s = _ai._bo(elem,data.s,1,0,this._co);
+            if(this._co.length){
                 this.k = true;
             }else{
                 this.convertEllToPath();
@@ -3036,11 +3037,11 @@
             }
             this.mdf = false;
             this.frameId = this.elem._x.frameId;
-            var i, len = this.dynamicProperties.length;
+            var i, len = this._co.length;
 
             for(i=0;i<len;i+=1){
-                this.dynamicProperties[i].getValue();
-                if(this.dynamicProperties[i].mdf){
+                this._co[i].getValue();
+                if(this._co[i].mdf){
                     this.mdf = true;
                 }
             }
@@ -3063,26 +3064,26 @@
             this.data = data;
             this.frameId = -1;
             this.d = data.d;
-            this.dynamicProperties = [];
+            this._co = [];
             this.mdf = false;
             this.getValue = processKeys;
             this.reset = resetShape;
             if(data.sy === 1){
-                this.ir = _ai._bo(elem,data.ir,0,0,this.dynamicProperties);
-                this.is = _ai._bo(elem,data.is,0,0.01,this.dynamicProperties);
+                this.ir = _ai._bo(elem,data.ir,0,0,this._co);
+                this.is = _ai._bo(elem,data.is,0,0.01,this._co);
                 this.convertToPath = convertStarToPath;
             } else {
                 this.convertToPath = convertPolygonToPath;
             }
-            this.pt = _ai._bo(elem,data.pt,0,0,this.dynamicProperties);
-            this.p = _ai._bo(elem,data.p,1,0,this.dynamicProperties);
-            this.r = _ai._bo(elem,data.r,0,degToRads,this.dynamicProperties);
-            this.or = _ai._bo(elem,data.or,0,0,this.dynamicProperties);
-            this.os = _ai._bo(elem,data.os,0,0.01,this.dynamicProperties);
+            this.pt = _ai._bo(elem,data.pt,0,0,this._co);
+            this.p = _ai._bo(elem,data.p,1,0,this._co);
+            this.r = _ai._bo(elem,data.r,0,degToRads,this._co);
+            this.or = _ai._bo(elem,data.or,0,0,this._co);
+            this.os = _ai._bo(elem,data.os,0,0.01,this._co);
             this._ak = shapeCollection_pool._al();
             this._ak.addShape(this.v);
             this.paths = this._ak;
-            if(this.dynamicProperties.length){
+            if(this._co.length){
                 this.k = true;
             }else{
                 this.convertToPath();
@@ -3097,11 +3098,11 @@
             }
             this.mdf = false;
             this.frameId = this.elem._x.frameId;
-            var i, len = this.dynamicProperties.length;
+            var i, len = this._co.length;
 
             for(i=0;i<len;i+=1){
-                this.dynamicProperties[i].getValue(frameNum);
-                if(this.dynamicProperties[i].mdf){
+                this._co[i].getValue(frameNum);
+                if(this._co[i].mdf){
                     this.mdf = true;
                 }
             }
@@ -3160,15 +3161,15 @@
             this.comp = elem.comp;
             this.frameId = -1;
             this.d = data.d;
-            this.dynamicProperties = [];
+            this._co = [];
             this.mdf = false;
             this.getValue = processKeys;
             this.convertRectToPath = convertRectToPath;
             this.reset = resetShape;
-            this.p = _ai._bo(elem,data.p,1,0,this.dynamicProperties);
-            this.s = _ai._bo(elem,data.s,1,0,this.dynamicProperties);
-            this.r = _ai._bo(elem,data.r,0,0,this.dynamicProperties);
-            if(this.dynamicProperties.length){
+            this.p = _ai._bo(elem,data.p,1,0,this._co);
+            this.s = _ai._bo(elem,data.s,1,0,this._co);
+            this.r = _ai._bo(elem,data.r,0,0,this._co);
+            if(this._co.length){
                 this.k = true;
             }else{
                 this.convertRectToPath();
@@ -3225,8 +3226,8 @@
         }
     }
 
-    function getModifier(nm,elem, data, dynamicProperties){
-        return new modifiers[nm](elem, data, dynamicProperties);
+    function getModifier(nm,elem, data, _co){
+        return new modifiers[nm](elem, data, _co);
     }
 
     return ob;
@@ -3242,8 +3243,8 @@
         this.addShapeToModifier(shapeData);
     }
 }
-_at.prototype.init = function(elem,data,dynamicProperties){
-    this.dynamicProperties = [];
+_at.prototype.init = function(elem,data,_co){
+    this._co = [];
     this.shapes = [];
     this.elem = elem;
     this.initModifierProperties(elem,data);
@@ -3251,9 +3252,9 @@
     this.mdf = false;
     this.closed = false;
     this.k = false;
-    if(this.dynamicProperties.length){
+    if(this._co.length){
         this.k = true;
-        dynamicProperties.push(this);
+        _co.push(this);
     }else{
         this.getValue(true);
     }
@@ -3267,11 +3268,11 @@
     }
     this.mdf = forceRender;
     this.frameId = this.elem._x.frameId;
-    var i, len = this.dynamicProperties.length;
+    var i, len = this._co.length;
 
     for (i = 0; i < len; i +=1) {
-        this.dynamicProperties[i].getValue();
-        if (this.dynamicProperties[i].mdf) {
+        this._co[i].getValue();
+        if (this._co[i].mdf) {
             this.mdf = true;
         }
     }
@@ -3296,9 +3297,9 @@
     }
 }
 _an.prototype.initModifierProperties = function(elem, data) {
-    this.s = _ai._bo(elem, data.s, 0, 0.01, this.dynamicProperties);
-    this.e = _ai._bo(elem, data.e, 0, 0.01, this.dynamicProperties);
-    this.o = _ai._bo(elem, data.o, 0, 0, this.dynamicProperties);
+    this.s = _ai._bo(elem, data.s, 0, 0.01, this._co);
+    this.e = _ai._bo(elem, data.e, 0, 0.01, this._co);
+    this.o = _ai._bo(elem, data.o, 0, 0, this._co);
     this.sValue = 0;
     this.eValue = 0;
     this.oValue = 0;
@@ -3368,7 +3369,7 @@
     return pathsData;
 }
 
-_an.prototype.processShapes = function(firstFrame) {
+_an.prototype.processShapes = function(_ch) {
     var shapePaths;
     var i, len = this.shapes.length;
     var j, jLen;
@@ -3387,7 +3388,7 @@
         for (i = 0; i < len; i += 1) {
             shapeData = this.shapes[i];
             // if shape hasn't changed and trim properties haven't changed, cached previous path can be used
-            if (!shapeData.shape.mdf && !this.mdf && !firstFrame && this.m !== 2) {
+            if (!shapeData.shape.mdf && !this.mdf && !_ch && this.m !== 2) {
                 shapeData.shape.paths = shapeData._ak;
             } else {
                 shapePaths = shapeData.shape.paths;
@@ -3473,7 +3474,7 @@
             this.shapes[i].shape.mdf = true;
         }
     }
-    if (!this.dynamicProperties.length) {
+    if (!this._co.length) {
         this.mdf = false;
     }
 }
@@ -3598,18 +3599,18 @@
     }
     this.mdf = forceRender ? true : false;
     this.frameId = this.elem._x.frameId;
-    var i, len = this.dynamicProperties.length;
+    var i, len = this._co.length;
 
     for(i=0;i<len;i+=1){
-        this.dynamicProperties[i].getValue();
-        if(this.dynamicProperties[i].mdf){
+        this._co[i].getValue();
+        if(this._co[i].mdf){
             this.mdf = true;
         }
     }
 }
 _au.prototype.initModifierProperties = function(elem,data){
     this.getValue = this.processKeys;
-    this.rd = _ai._bo(elem,data.r,0,null,this.dynamicProperties);
+    this.rd = _ai._bo(elem,data.r,0,null,this._co);
 };
 
 _au.prototype.processPath = function(path, round){
@@ -3666,7 +3667,7 @@
     return cloned_path;
 }
 
-_au.prototype.processShapes = function(firstFrame){
+_au.prototype.processShapes = function(_ch){
     var shapePaths;
     var i, len = this.shapes.length;
     var j, jLen;
@@ -3678,7 +3679,7 @@
             shapeData = this.shapes[i];
             newPaths = shapeData.shape.paths;
             _ak = shapeData._ak;
-            if(!(!shapeData.shape.mdf && !this.mdf && !firstFrame)){
+            if(!(!shapeData.shape.mdf && !this.mdf && !_ch)){
                 _ak.releaseShapes();
                 shapeData.shape.mdf = true;
                 shapePaths = shapeData.shape.paths.shapes;
@@ -3691,7 +3692,7 @@
         }
 
     }
-    if(!this.dynamicProperties.length){
+    if(!this._co.length){
         this.mdf = false;
     }
 }
@@ -3704,11 +3705,11 @@
         return;
     }
     this.mdf = forceRender ? true : false;
-    var i, len = this.dynamicProperties.length;
+    var i, len = this._co.length;
 
     for(i=0;i<len;i+=1){
-        this.dynamicProperties[i].getValue();
-        if(this.dynamicProperties[i].mdf){
+        this._co[i].getValue();
+        if(this._co[i].mdf){
             this.mdf = true;
         }
     }
@@ -3716,11 +3717,11 @@
 
 _aj.prototype.initModifierProperties = function(elem,data){
     this.getValue = this.processKeys;
-    this.c = _ai._bo(elem,data.c,0,null,this.dynamicProperties);
-    this.o = _ai._bo(elem,data.o,0,null,this.dynamicProperties);
-    this.tr = _ag._bj(elem,data.tr,this.dynamicProperties);
+    this.c = _ai._bo(elem,data.c,0,null,this._co);
+    this.o = _ai._bo(elem,data.o,0,null,this._co);
+    this.tr = _ag._bj(elem,data.tr,this._co);
     this.data = data;
-    if(!this.dynamicProperties.length){
+    if(!this._co.length){
         this.getValue(true);
     }
     this.pMatrix = new Matrix();
@@ -3743,7 +3744,7 @@
     sMatrix.translate(transform.a.v[0], transform.a.v[1], transform.a.v[2]);
 }
 
-_aj.prototype.init = function(elem, arr, pos, elemsData, dynamicProperties) {
+_aj.prototype.init = function(elem, arr, pos, elemsData, _co) {
     this.elem = elem;
     this.arr = arr;
     this.pos = pos;
@@ -3751,7 +3752,7 @@
     this._currentCopies = 0;
     this._bq = [];
     this._groups = [];
-    this.dynamicProperties = [];
+    this._co = [];
     this.frameId = -1;
     this.initModifierProperties(elem,arr[pos]);
     var cont = 0;
@@ -3761,9 +3762,9 @@
         this._bq.unshift(arr[pos]);
         cont += 1;
     }
-    if(this.dynamicProperties.length){
+    if(this._co.length){
         this.k = true;
-        dynamicProperties.push(this);
+        _co.push(this);
     }else{
         this.getValue(true);
     }
@@ -3796,13 +3797,13 @@
     }
 }
 
-_aj.prototype.processShapes = function(firstFrame){
+_aj.prototype.processShapes = function(_ch){
 
     if(this.elem._x.frameId === this.frameId){
         return;
     }
     this.frameId = this.elem._x.frameId;
-    if(!this.dynamicProperties.length && !firstFrame){
+    if(!this._co.length && !_ch){
         this.mdf = false;
     }
     if(this.mdf){
@@ -3830,7 +3831,7 @@
         }
         
         this._currentCopies = copies;
-        this.elem.firstFrame = true;
+        this.elem._ch = true;
         ////
 
         var offset = this.o.v;
@@ -3907,12 +3908,12 @@
 function _am(){
 	this._length = 0;
 	this._maxLength = 4;
-	this.shapes = Array.apply(null,{length:this._maxLength});
+	this.shapes = _cv(this._maxLength);
 };
 
 _am.prototype.addShape = function(shapeData){
 	if(this._length === this._maxLength){
-		this.shapes = this.shapes.concat(Array.apply(null,{length:this._maxLength}));
+		this.shapes = this.shapes.concat(_cv(this._maxLength));
 		this._maxLength *= 2;
 	}
 	this.shapes[this._length] = shapeData;
@@ -3926,24 +3927,24 @@
 	}
 	this._length = 0;
 };
-function DashProperty(elem, data, renderer, dynamicProperties) {
+function DashProperty(elem, data, renderer, _co) {
     this.elem = elem;
     this.frameId = -1;
-    this.dataProps = Array.apply(null,{length:data.length});
+    this.dataProps = _cv(data.length);
     this.renderer = renderer;
     this.mdf = false;
     this.k = false;
     this.dashStr = '';
-    this.dashArray = createTypedArray('float32',  data.length - 1);
-    this.dashoffset = createTypedArray('float32',  1);
+    this.dashArray = _cs('float32',  data.length - 1);
+    this.dashoffset = _cs('float32',  1);
     var i, len = data.length, prop;
     for(i=0;i<len;i+=1){
-        prop = _ai._bo(elem,data[i].v,0, 0, dynamicProperties);
+        prop = _ai._bo(elem,data[i].v,0, 0, _co);
         this.k = prop.k ? true : this.k;
         this.dataProps[i] = {n:data[i].n,p:prop};
     }
     if(this.k){
-        dynamicProperties.push(this);
+        _co.push(this);
     }else{
         this.getValue(true);
     }
@@ -3984,9 +3985,9 @@
     this.prop = _ai._bo(elem,data.k,1,null,[]);
     this.data = data;
     this.k = this.prop.k;
-    this.c = createTypedArray('uint8c', data.p*4);
+    this.c = _cs('uint8c', data.p*4);
     var cLength = data.k.k[0].s ? (data.k.k[0].s.length - data.p*4) : data.k.k.length - data.p*4;
-    this.o = createTypedArray('float32', cLength);
+    this.o = _cs('float32', cLength);
     this.cmdf = false;
     this.omdf = false;
     this._collapsable = this.checkCollapsable();
@@ -4083,7 +4084,7 @@
     }
 
     function loadImage(path){
-        var img = createTag('img');
+        var img = _cu('img');
         img.addEventListener('load', imageLoaded.bind(this), false);
         img.addEventListener('error', imageLoaded.bind(this), false);
         img.src = path;
@@ -4140,7 +4141,7 @@
 	ob.createAlphaToLuminanceFilter = createAlphaToLuminanceFilter;
 
 	function createFilter(filId){
-        	var fil = createNS('filter');
+        	var fil = _ct('filter');
         	fil.setAttribute('id',filId);
                 fil.setAttribute('filterUnits','objectBoundingBox');
                 fil.setAttribute('x','0%');
@@ -4151,7 +4152,7 @@
 	}
 
 	function createAlphaToLuminanceFilter(){
-                var feColorMatrix = createNS('feColorMatrix');
+                var feColorMatrix = _ct('feColorMatrix');
                 feColorMatrix.setAttribute('type','matrix');
                 feColorMatrix.setAttribute('color-interpolation-filters','sRGB');
                 feColorMatrix.setAttribute('values','0 0 0 1 0  0 0 0 1 0  0 0 0 1 0  0 0 0 1 1');
@@ -4162,14 +4163,14 @@
 }())
 function _bl(textData, renderType, elem){
     this.mdf = false;
-    this._firstFrame = true;
+    this._ch = true;
 	this._hasMaskedPath = false;
 	this._frameId = -1;
-	this._dynamicProperties = [];
+	this.__co = [];
 	this._textData = textData;
 	this._renderType = renderType;
 	this._elem = elem;
-	this._animatorsData = Array.apply(null,{length:this._textData.a.length});
+	this._animatorsData = _cv(this._textData.a.length);
 	this._pathData = {}
 	this._moreOptions = {
 		alignment: {}
@@ -4179,17 +4180,17 @@
 
 }
 
-_bl.prototype.searchProperties = function(dynamicProperties){
+_bl.prototype.searchProperties = function(_co){
     var i, len = this._textData.a.length, animatorProps;
     var _bo = _ai._bo;
     for(i=0;i<len;i+=1){
         animatorProps = this._textData.a[i];
-        this._animatorsData[i] = new TextAnimatorDataProperty(this._elem, animatorProps, this._dynamicProperties);
+        this._animatorsData[i] = new TextAnimatorDataProperty(this._elem, animatorProps, this.__co);
     }
     if(this._textData.p && 'm' in this._textData.p){
         this._pathData = {
-            f: _bo(this._elem,this._textData.p.f,0,0,this._dynamicProperties),
-            l: _bo(this._elem,this._textData.p.l,0,0,this._dynamicProperties),
+            f: _bo(this._elem,this._textData.p.f,0,0,this.__co),
+            l: _bo(this._elem,this._textData.p.l,0,0,this.__co),
             r: this._textData.p.r,
             m: this._elem.maskManager.getMaskProperty(this._textData.p.m)
         };
@@ -4197,18 +4198,18 @@
     } else {
         this._hasMaskedPath = false;
     }
-    this._moreOptions.alignment = _bo(this._elem,this._textData.m.a,1,0,this._dynamicProperties);
-    if(this._dynamicProperties.length) {
-    	dynamicProperties.push(this);
+    this._moreOptions.alignment = _bo(this._elem,this._textData.m.a,1,0,this.__co);
+    if(this.__co.length) {
+    	_co.push(this);
     }
 }
 
 _bl.prototype.getMeasures = function(documentData, lettersChangedFlag){
     this.lettersChangedFlag = lettersChangedFlag;
-    if(!this.mdf && !this._firstFrame && !lettersChangedFlag && (!this._hasMaskedPath || !this._pathData.m.mdf)) {
+    if(!this.mdf && !this._ch && !lettersChangedFlag && (!this._hasMaskedPath || !this._pathData.m.mdf)) {
         return;
     }
-    this._firstFrame = false;
+    this._ch = false;
     var alignment = this._moreOptions.alignment.v;
     var animators = this._animatorsData;
     var textData = this._textData;
@@ -4674,40 +4675,40 @@
         return;
     }
     this._frameId = this._elem._x.frameId;
-	var i, len = this._dynamicProperties.length;
+	var i, len = this.__co.length;
     this.mdf = false;
 	for(i = 0; i < len; i += 1) {
-		this._dynamicProperties[i].getValue();
-        this.mdf = this._dynamicProperties[i].mdf || this.mdf;
+		this.__co[i].getValue();
+        this.mdf = this.__co[i].mdf || this.mdf;
 	}
 }
 
 _bl.prototype.mHelper = new Matrix();
 _bl.prototype.defaultPropsArray = [];
-function TextAnimatorDataProperty(elem, animatorProps, dynamicProperties) {
+function TextAnimatorDataProperty(elem, animatorProps, _co) {
 	var defaultData = {propType:false};
 	var _bo = _ai._bo;
 	var _bn = animatorProps.a;
 	this.a = {
-		r: _bn.r ? _bo(elem, _bn.r, 0, degToRads, dynamicProperties) : defaultData,
-		rx: _bn.rx ? _bo(elem, _bn.rx, 0, degToRads, dynamicProperties) : defaultData,
-		ry: _bn.ry ? _bo(elem, _bn.ry, 0, degToRads, dynamicProperties) : defaultData,
-		sk: _bn.sk ? _bo(elem, _bn.sk, 0, degToRads, dynamicProperties) : defaultData,
-		sa: _bn.sa ? _bo(elem, _bn.sa, 0, degToRads, dynamicProperties) : defaultData,
-		s: _bn.s ? _bo(elem, _bn.s, 1, 0.01, dynamicProperties) : defaultData,
-		a: _bn.a ? _bo(elem, _bn.a, 1, 0, dynamicProperties) : defaultData,
-		o: _bn.o ? _bo(elem, _bn.o, 0, 0.01, dynamicProperties) : defaultData,
-		p: _bn.p ? _bo(elem,_bn.p, 1, 0, dynamicProperties) : defaultData,
-		sw: _bn.sw ? _bo(elem, _bn.sw, 0, 0, dynamicProperties) : defaultData,
-		sc: _bn.sc ? _bo(elem, _bn.sc, 1, 0, dynamicProperties) : defaultData,
-		fc: _bn.fc ? _bo(elem, _bn.fc, 1, 0, dynamicProperties) : defaultData,
-		fh: _bn.fh ? _bo(elem, _bn.fh, 0, 0, dynamicProperties) : defaultData,
-		fs: _bn.fs ? _bo(elem, _bn.fs, 0, 0.01, dynamicProperties) : defaultData,
-		fb: _bn.fb ? _bo(elem, _bn.fb, 0, 0.01, dynamicProperties) : defaultData,
-		t: _bn.t ? _bo(elem, _bn.t, 0, 0, dynamicProperties) : defaultData
+		r: _bn.r ? _bo(elem, _bn.r, 0, degToRads, _co) : defaultData,
+		rx: _bn.rx ? _bo(elem, _bn.rx, 0, degToRads, _co) : defaultData,
+		ry: _bn.ry ? _bo(elem, _bn.ry, 0, degToRads, _co) : defaultData,
+		sk: _bn.sk ? _bo(elem, _bn.sk, 0, degToRads, _co) : defaultData,
+		sa: _bn.sa ? _bo(elem, _bn.sa, 0, degToRads, _co) : defaultData,
+		s: _bn.s ? _bo(elem, _bn.s, 1, 0.01, _co) : defaultData,
+		a: _bn.a ? _bo(elem, _bn.a, 1, 0, _co) : defaultData,
+		o: _bn.o ? _bo(elem, _bn.o, 0, 0.01, _co) : defaultData,
+		p: _bn.p ? _bo(elem,_bn.p, 1, 0, _co) : defaultData,
+		sw: _bn.sw ? _bo(elem, _bn.sw, 0, 0, _co) : defaultData,
+		sc: _bn.sc ? _bo(elem, _bn.sc, 1, 0, _co) : defaultData,
+		fc: _bn.fc ? _bo(elem, _bn.fc, 1, 0, _co) : defaultData,
+		fh: _bn.fh ? _bo(elem, _bn.fh, 0, 0, _co) : defaultData,
+		fs: _bn.fs ? _bo(elem, _bn.fs, 0, 0.01, _co) : defaultData,
+		fb: _bn.fb ? _bo(elem, _bn.fb, 0, 0.01, _co) : defaultData,
+		t: _bn.t ? _bo(elem, _bn.t, 0, 0, _co) : defaultData
 	}
 
-	this.s = TextSelectorProp.getTextSelectorProp(elem,animatorProps.s, dynamicProperties);
+	this.s = TextSelectorProp.getTextSelectorProp(elem,animatorProps.s, _co);
     this.s.t = animatorProps.s.t;
 }
 function LetterProps(o, sw, sc, fc, m, p){
@@ -4768,12 +4769,12 @@
 	}
 	return updated;
 }
-function _ar(elem, data, dynamicProperties){
+function _ar(elem, data, _co){
 	this._frameId = initialDefaultFrame;
 	this.pv = '';
 	this.v = '';
 	this.kf = false;
-	this.firstFrame = true;
+	this._ch = true;
 	this.mdf = true;
 	this.data = data;
 	this.elem = elem;
@@ -4807,7 +4808,7 @@
 
 	}
 	if(this.searchProperty()) {
-		dynamicProperties.push(this);
+		_co.push(this);
 	} else {
 		this.getValue(true);
 	}
@@ -4850,7 +4851,7 @@
 _ar.prototype.getValue = function() {
 	this.mdf = false;
 	var frameId = this.elem._x.frameId;
-	if((frameId === this._frameId || !this.kf) && !this.firstFrame) {
+	if((frameId === this._frameId || !this.kf) && !this._ch) {
 		return;
 	}
 	var textKeys = this.data.d.k, textDocumentData;
@@ -4867,7 +4868,7 @@
             this.completeTextData(textDocumentData);
         }
         this.setCurrentData(textDocumentData);
-        this.mdf = this.firstFrame ? false : true;
+        this.mdf = this._ch ? false : true;
         this.pv = this.v = this.currentData.t;
         this.keysIndex = i;
     }
@@ -4876,7 +4877,7 @@
 
 _ar.prototype.completeTextData = function(documentData) {
     documentData.__complete = true;
-    var fontManager = this.elem._x.fontManager;
+    var _cr = this.elem._x._cr;
     var data = this.data;
     var letters = [];
     var i, len;
@@ -4886,7 +4887,7 @@
     var lineWidth = 0;
     var maxLineWidth = 0;
     var j, jLen;
-    var fontData = fontManager.getFontByName(documentData.f);
+    var fontData = _cr.getFontByName(documentData.f);
     var charData, cLength = 0;
     var styles = fontData.fStyle.split(' ');
 
@@ -4932,12 +4933,12 @@
                 lineWidth = 0;
                 newLineFlag = true;
             }
-            if(fontManager.chars){
-                charData = fontManager.getCharData(documentData.t.charAt(i), fontData.fStyle, fontData.fFamily);
+            if(_cr.chars){
+                charData = _cr.getCharData(documentData.t.charAt(i), fontData.fStyle, fontData.fFamily);
                 cLength = newLineFlag ? 0 : charData.w*documentData.s/100;
             }else{
                 //tCanvasHelper.font = documentData.s + 'px '+ fontData.fFamily;
-                cLength = fontManager.measureText(documentData.t.charAt(i), documentData.f, documentData.s);
+                cLength = _cr.measureText(documentData.t.charAt(i), documentData.f, documentData.s);
             }
             if(lineWidth + cLength > boxWidth && documentData.t.charAt(i) !== ' '){
                 if(lastSpaceIndex === -1){
@@ -4975,13 +4976,13 @@
         }else{
             val = documentData.t.charAt(i);
         }
-        if(fontManager.chars){
-            charData = fontManager.getCharData(currentChar, fontData.fStyle, fontManager.getFontByName(documentData.f).fFamily);
+        if(_cr.chars){
+            charData = _cr.getCharData(currentChar, fontData.fStyle, _cr.getFontByName(documentData.f).fFamily);
             cLength = newLineFlag ? 0 : charData.w*documentData.s/100;
         }else{
-            //var charWidth = fontManager.measureText(val, documentData.f, documentData.s);
-            //tCanvasHelper.font = documentData.s + 'px '+ fontManager.getFontByName(documentData.f).fFamily;
-            cLength = fontManager.measureText(val, documentData.f, documentData.s);
+            //var charWidth = _cr.measureText(val, documentData.f, documentData.s);
+            //tCanvasHelper.font = documentData.s + 'px '+ _cr.getFontByName(documentData.f).fFamily;
+            cLength = _cr.measureText(val, documentData.f, documentData.s);
         }
 
         //
@@ -5099,7 +5100,7 @@
     dData.__complete = false;
     dData.t = newData.t;
     this.keysIndex = -1;
-    this.firstFrame = true;
+    this._ch = true;
     this.getValue();
 }
 
@@ -5109,11 +5110,11 @@
     var floor = Math.floor;
     function updateRange(newCharsFlag){
         this.mdf = newCharsFlag || false;
-        if(this.dynamicProperties.length){
-            var i, len = this.dynamicProperties.length;
+        if(this._co.length){
+            var i, len = this._co.length;
             for(i=0;i<len;i+=1){
-                this.dynamicProperties[i].getValue();
-                if(this.dynamicProperties[i].mdf){
+                this._co[i].getValue();
+                if(this._co[i].mdf){
                     this.mdf = true;
                 }
             }
@@ -5211,24 +5212,24 @@
         this.mdf = false;
         this.k = false;
         this.data = data;
-        this.dynamicProperties = [];
+        this._co = [];
         this.getValue = updateRange;
         this.getMult = getMult;
         this.elem = elem;
         this.comp = elem.comp;
         this.finalS = 0;
         this.finalE = 0;
-        this.s = _ai._bo(elem,data.s || {k:0},0,0,this.dynamicProperties);
+        this.s = _ai._bo(elem,data.s || {k:0},0,0,this._co);
         if('e' in data){
-            this.e = _ai._bo(elem,data.e,0,0,this.dynamicProperties);
+            this.e = _ai._bo(elem,data.e,0,0,this._co);
         }else{
             this.e = {v:100};
         }
-        this.o = _ai._bo(elem,data.o || {k:0},0,0,this.dynamicProperties);
-        this.xe = _ai._bo(elem,data.xe || {k:0},0,0,this.dynamicProperties);
-        this.ne = _ai._bo(elem,data.ne || {k:0},0,0,this.dynamicProperties);
-        this.a = _ai._bo(elem,data.a,0,0.01,this.dynamicProperties);
-        if(this.dynamicProperties.length){
+        this.o = _ai._bo(elem,data.o || {k:0},0,0,this._co);
+        this.xe = _ai._bo(elem,data.xe || {k:0},0,0,this._co);
+        this.ne = _ai._bo(elem,data.ne || {k:0},0,0,this._co);
+        this.a = _ai._bo(elem,data.a,0,0.01,this._co);
+        if(this._co.length){
             arr.push(this);
         }else{
             this.getValue();
@@ -5250,7 +5251,7 @@
 
 		var _length = 0;
 		var _maxLength = initialLength;
-		var pool = Array.apply(null, {length: _maxLength});
+		var pool = _cv(_maxLength);
 
 		var ob = {
 			newElement: newElement,
@@ -5293,7 +5294,7 @@
 var pooling = (function(){
 
 	function double(arr){
-		return arr.concat(Array.apply(null,{length:arr.length}))
+		return arr.concat(_cv(arr.length));
 	}
 
 	return {
@@ -5303,7 +5304,7 @@
 var point_pool = (function(){
 
 	function create() {
-		return createTypedArray('float32', 2);
+		return _cs('float32', 2);
 	}
 	return pool_factory(8, create);
 }());
@@ -5353,7 +5354,7 @@
 
 	var _length = 0;
 	var _maxLength = 4;
-	var pool = Array.apply(null,{length:_maxLength});
+	var pool = _cv(_maxLength);
 
 	function _al(){
 		var shapeCollection;
@@ -5407,8 +5408,8 @@
 	function create() {
 		return {
             addedLength: 0,
-            percents: createTypedArray('float32', defaultCurveSegments),
-            lengths: createTypedArray('float32', defaultCurveSegments),
+            percents: _cs('float32', defaultCurveSegments),
+            lengths: _cs('float32', defaultCurveSegments),
         };
 	}
 	return pool_factory(8, create);
@@ -5416,7 +5417,7 @@
 function _l(){}
 _l.prototype.checkLayers = function(num){
     var i, len = this.layers.length, data;
-    this.completeLayers = true;
+    this._db = true;
     for (i = len - 1; i >= 0; i--) {
         if (!this._br[i]) {
             data = this.layers[i];
@@ -5425,7 +5426,7 @@
                 this.buildItem(i);
             }
         }
-        this.completeLayers = this._br[i] ? this.completeLayers:false;
+        this._db = this._br[i] ? this._db:false;
     }
     this.checkPendingElements();
 };
@@ -5465,7 +5466,7 @@
 };
 
 _l.prototype.includeLayers = function(newLayers){
-    this.completeLayers = false;
+    this._db = false;
     var i, len = newLayers.length;
     var j, jLen = this.layers.length;
     for(i=0;i<len;i+=1){
@@ -5489,7 +5490,7 @@
         this.buildAllItems();
     }
 };
-_l.prototype.buildElementParenting = function(element, parentName, hierarchy) {
+_l.prototype.buildElementParenting = function(element, parentName, _dd) {
     var _br = this._br;
     var layers = this.layers;
     var i=0, len = layers.length;
@@ -5499,13 +5500,13 @@
                 this.buildItem(i);
                 this.addPendingElement(element);
             } else if(layers[i].parent !== undefined) {
-                hierarchy.push(_br[i]);
+                _dd.push(_br[i]);
                 _br[i]._isParent = true;
-                this.buildElementParenting(element, layers[i].parent, hierarchy);
+                this.buildElementParenting(element, layers[i].parent, _dd);
             } else {
-                hierarchy.push(_br[i]);
+                _dd.push(_br[i]);
                 _br[i]._isParent = true;
-                element.setHierarchy(hierarchy);
+                element.setHierarchy(_dd);
             }
         }
         i += 1;
@@ -5513,17 +5514,17 @@
 };
 
 _l.prototype.addPendingElement = function(element){
-    this.pendingElements.push(element);
+    this._dc.push(element);
 };
-function _ao(animationItem, config){
-    this.animationItem = animationItem;
+function _ao(_cq, config){
+    this._cq = _cq;
     this.layers = null;
     this.renderedFrame = -1;
-    this._cf = createNS('svg');
-    var maskElement = createNS('g');
+    this._cf = _ct('svg');
+    var maskElement = _ct('g');
     this._cf.appendChild(maskElement);
     this._bx = maskElement;
-    var defs = createNS( 'defs');
+    var defs = _ct( 'defs');
     this._cf.appendChild(defs);
     this.renderConfig = {
         preserveAspectRatio: (config && config.preserveAspectRatio) || 'xMidYMid meet',
@@ -5538,12 +5539,12 @@
         frameNum: -1,
         defs: defs,
         frameId: 0,
-        compSize: {w:0,h:0},
+        _de: {w:0,h:0},
         renderConfig: this.renderConfig,
-        fontManager: new FontManager()
+        _cr: new FontManager()
     };
     this._br = [];
-    this.pendingElements = [];
+    this._dc = [];
     this.destroyed = false;
 
 }
@@ -5559,11 +5560,11 @@
 };
 
 _ao.prototype.createShape = function (data) {
-    return new _f(data,this._x,this);
+    return new SVGShapeElement(data,this._x,this);
 };
 
 _ao.prototype.createText = function (data) {
-    return new SVGTextElement(data,this._x,this);
+    return new _cw(data,this._x,this);
 
 };
 
@@ -5600,21 +5601,21 @@
     this._cf.setAttribute('preserveAspectRatio',this.renderConfig.preserveAspectRatio);
     //this._bx.style.transform = 'translate3d(0,0,0)';
     //this._bx.style.transformOrigin = this._bx.style.mozTransformOrigin = this._bx.style.webkitTransformOrigin = this._bx.style['-webkit-transform'] = "0px 0px 0px";
-    this.animationItem.wrapper.appendChild(this._cf);
+    this._cq.wrapper.appendChild(this._cf);
     //Mask animation
     var defs = this._x.defs;
 
-    this._x.getAssetData = this.animationItem.getAssetData.bind(this.animationItem);
-    this._x.getAssetsPath = this.animationItem.getAssetsPath.bind(this.animationItem);
+    this._x.getAssetData = this._cq.getAssetData.bind(this._cq);
+    this._x.getAssetsPath = this._cq.getAssetsPath.bind(this._cq);
     this._x.progressiveLoad = this.renderConfig.progressiveLoad;
     this._x.nm = animData.nm;
-    this._x.compSize.w = animData.w;
-    this._x.compSize.h = animData.h;
+    this._x._de.w = animData.w;
+    this._x._de.h = animData.h;
     this._x.frameRate = animData.fr;
     this.data = animData;
 
-    var maskElement = createNS( 'clipPath');
-    var rect = createNS('rect');
+    var maskElement = _ct( 'clipPath');
+    var rect = _ct('rect');
     rect.setAttribute('width',animData.w);
     rect.setAttribute('height',animData.h);
     rect.setAttribute('x',0);
@@ -5626,14 +5627,14 @@
 
     defs.appendChild(maskElement);
     this.layers = animData.layers;
-    this._x.fontManager.addChars(animData.chars);
-    this._x.fontManager.addFonts(animData.fonts,defs);
-    this._br = Array.apply(null,{length:animData.layers.length});
+    this._x._cr.addChars(animData.chars);
+    this._x._cr.addFonts(animData.fonts,defs);
+    this._br = _cv(animData.layers.length);
 };
 
 
 _ao.prototype.destroy = function () {
-    this.animationItem.wrapper.innerHTML = '';
+    this._cq.wrapper.innerHTML = '';
     this._bx = null;
     this._x.defs = null;
     var i, len = this.layers ? this.layers.length : 0;
@@ -5644,7 +5645,7 @@
     }
     this._br.length = 0;
     this.destroyed = true;
-    this.animationItem = null;
+    this._cq = null;
 };
 
 _ao.prototype.updateContainerSize = function () {
@@ -5677,8 +5678,8 @@
 };
 
 _ao.prototype.checkPendingElements  = function(){
-    while(this.pendingElements.length){
-        var element = this.pendingElements.pop();
+    while(this._dc.length){
+        var element = this._dc.pop();
         element.checkParenting();
         if(element.data.tt){
             var i = 0, len = this._br.length;
@@ -5709,16 +5710,16 @@
     this._x.frameId += 1;
     this._x.projectInterface.currentFrame = num;
     var i, len = this.layers.length;
-    if(!this.completeLayers){
+    if(!this._db){
         this.checkLayers(num);
     }
     for (i = len - 1; i >= 0; i--) {
-        if(this.completeLayers || this._br[i]){
+        if(this._db || this._br[i]){
             this._br[i]._az(num - this.layers[i].st);
         }
     }
     for (i = 0; i < len; i += 1) {
-        if(this.completeLayers || this._br[i]){
+        if(this._db || this._br[i]){
             this._br[i]._ba();
         }
     }
@@ -5754,7 +5755,7 @@
 
 _ao.prototype.searchExtraCompositions = function(assets){
     var i, len = assets.length;
-    var floatingContainer = createNS('g');
+    var floatingContainer = _ct('g');
     for(i=0;i<len;i+=1){
         if(assets[i].xt){
             var comp = this.createComp(assets[i],floatingContainer,this._x.comp,null);
@@ -5766,660 +5767,19 @@
     }
 };
 
-function _aq(animationItem, config){
-    this.animationItem = animationItem;
-    this.renderConfig = {
-        clearCanvas: (config && config.clearCanvas !== undefined) ? config.clearCanvas : true,
-        context: (config && config.context) || null,
-        progressiveLoad: (config && config.progressiveLoad) || false,
-        preserveAspectRatio: (config && config.preserveAspectRatio) || 'xMidYMid meet',
-        className: (config && config.className) || ''
-    };
-    this.renderConfig.dpr = (config && config.dpr) || 1;
-    if (this.animationItem.wrapper) {
-        this.renderConfig.dpr = (config && config.dpr) || window.devicePixelRatio || 1;
-    }
-    //TODO remove this when fixed
-    // this.renderConfig.dpr = 1;
-    this.renderedFrame = -1;
-    this._x = {
-        frameNum: -1,
-        mdf: false,
-        renderConfig: this.renderConfig
-    };
-    var i, len = 15;
-    this.contextData = new _n();
-    this._br = [];
-    this.pendingElements = [];
-    this.transformMat = new Matrix();
-    this.completeLayers = false;
-}
-extendPrototype([_l],_aq);
-
-_aq.prototype.createBase = function (data) {
-    return new _c(data, this._x, this);
-};
-
-_aq.prototype.createShape = function (data) {
-    return new _r(data, this._x, this);
-};
-
-_aq.prototype.createText = function (data) {
-    return new _t(data, this._x, this);
-};
-
-_aq.prototype.createImage = function (data) {
-    return new _p(data, this._x, this);
-};
-
-_aq.prototype.createComp = function (data) {
-    return new _m(data, this._x, this);
-};
-
-_aq.prototype.createSolid = function (data) {
-    return new _s(data, this._x, this);
-};
-
-_aq.prototype.createNull = _ao.prototype.createNull;
-
-_aq.prototype.ctxTransform = function(props){
-    if(props[0] === 1 && props[1] === 0 && props[4] === 0 && props[5] === 1 && props[12] === 0 && props[13] === 0){
-        return;
-    }
-    if(!this.renderConfig.clearCanvas){
-        this.canvasContext.transform(props[0],props[1],props[4],props[5],props[12],props[13]);
-        return;
-    }
-    this.transformMat.cloneFromProps(props);
-    var cProps = this.contextData.cTr.props;
-    this.transformMat.transform(cProps[0],cProps[1],cProps[2],cProps[3],cProps[4],cProps[5],cProps[6],cProps[7],cProps[8],cProps[9],cProps[10],cProps[11],cProps[12],cProps[13],cProps[14],cProps[15]);
-    //this.contextData.cTr.transform(props[0],props[1],props[2],props[3],props[4],props[5],props[6],props[7],props[8],props[9],props[10],props[11],props[12],props[13],props[14],props[15]);
-    this.contextData.cTr.cloneFromProps(this.transformMat.props);
-    var trProps = this.contextData.cTr.props;
-    this.canvasContext.setTransform(trProps[0],trProps[1],trProps[4],trProps[5],trProps[12],trProps[13]);
-};
-
-_aq.prototype.ctxOpacity = function(op){
-    /*if(op === 1){
-        return;
-    }*/
-    if(!this.renderConfig.clearCanvas){
-        this.canvasContext.globalAlpha *= op < 0 ? 0 : op;
-        return;
-    }
-    this.contextData.cO *= op < 0 ? 0 : op;
-    this.canvasContext.globalAlpha = this.contextData.cO;
-};
-
-_aq.prototype.reset = function(){
-    if(!this.renderConfig.clearCanvas){
-        this.canvasContext.restore();
-        return;
-    }
-    this.contextData.reset();
-};
-
-_aq.prototype.save = function(actionFlag){
-    if(!this.renderConfig.clearCanvas){
-        this.canvasContext.save();
-        return;
-    }
-    if(actionFlag){
-        this.canvasContext.save();
-    }
-    var props = this.contextData.cTr.props;
-    if(this.contextData._length <= this.contextData.cArrPos) {
-        this.contextData.duplicate();
-    }
-    var i, arr = this.contextData.saved[this.contextData.cArrPos];
-    for (i = 0; i < 16; i += 1) {
-        arr[i] = props[i];
-    }
-    this.contextData.savedOp[this.contextData.cArrPos] = this.contextData.cO;
-    this.contextData.cArrPos += 1;
-};
-
-_aq.prototype.restore = function(actionFlag){
-    if(!this.renderConfig.clearCanvas){
-        this.canvasContext.restore();
-        return;
-    }
-    if(actionFlag){
-        this.canvasContext.restore();
-        this._x.blendMode = 'source-over';
-    }
-    this.contextData.cArrPos -= 1;
-    var popped = this.contextData.saved[this.contextData.cArrPos];
-    var i,arr = this.contextData.cTr.props;
-    for(i=0;i<16;i+=1){
-        arr[i] = popped[i];
-    }
-    this.canvasContext.setTransform(popped[0],popped[1],popped[4],popped[5],popped[12],popped[13]);
-    popped = this.contextData.savedOp[this.contextData.cArrPos];
-    this.contextData.cO = popped;
-    this.canvasContext.globalAlpha = popped;
-};
-
-_aq.prototype.configAnimation = function(animData){
-    if(this.animationItem.wrapper){
-        this.animationItem.container = createTag('canvas');
-        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.webkitTransform = '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);
-        this.canvasContext = this.animationItem.container.getContext('2d');
-        if(this.renderConfig.className) {
-            this.animationItem.container.setAttribute('class', this.renderConfig.className);
-        }
-    }else{
-        this.canvasContext = this.renderConfig.context;
-    }
-    this.data = animData;
-    this._x.canvasContext = this.canvasContext;
-    this._x.renderer = this;
-    this._x.isDashed = false;
-    this._x.totalFrames = Math.floor(animData.tf);
-    this._x.compWidth = animData.w;
-    this._x.compHeight = animData.h;
-    this._x.frameRate = animData.fr;
-    this._x.frameId = 0;
-    this._x.compSize = {
-        w: animData.w,
-        h: animData.h
-    };
-    this._x.progressiveLoad = this.renderConfig.progressiveLoad;
-    this.layers = animData.layers;
-    this.transformCanvas = {};
-    this.transformCanvas.w = animData.w;
-    this.transformCanvas.h = animData.h;
-    this._x.fontManager = new FontManager();
-    this._x.fontManager.addChars(animData.chars);
-    this._x.fontManager.addFonts(animData.fonts,document.body);
-    this._x.getAssetData = this.animationItem.getAssetData.bind(this.animationItem);
-    this._x.getAssetsPath = this.animationItem.getAssetsPath.bind(this.animationItem);
-    this._x.elementLoaded = this.animationItem.elementLoaded.bind(this.animationItem);
-    this._x.addPendingElement = this.animationItem.addPendingElement.bind(this.animationItem);
-    this._x.transformCanvas = this.transformCanvas;
-    this._br = Array.apply(null,{length:animData.layers.length});
-
-    this.updateContainerSize();
-};
-
-_aq.prototype.updateContainerSize = function () {
-    this.reset();
-    var elementWidth,elementHeight;
-    if(this.animationItem.wrapper && this.animationItem.container){
-        elementWidth = this.animationItem.wrapper.offsetWidth;
-        elementHeight = this.animationItem.wrapper.offsetHeight;
-        this.animationItem.container.setAttribute('width',elementWidth * this.renderConfig.dpr );
-        this.animationItem.container.setAttribute('height',elementHeight * this.renderConfig.dpr);
-    }else{
-        elementWidth = this.canvasContext.canvas.width * this.renderConfig.dpr;
-        elementHeight = this.canvasContext.canvas.height * this.renderConfig.dpr;
-    }
-    var elementRel,animationRel;
-    if(this.renderConfig.preserveAspectRatio.indexOf('meet') !== -1 || this.renderConfig.preserveAspectRatio.indexOf('slice') !== -1){
-        var par = this.renderConfig.preserveAspectRatio.split(' ');
-        var fillType = par[1] || 'meet';
-        var pos = par[0] || 'xMidYMid';
-        var xPos = pos.substr(0,4);
-        var yPos = pos.substr(4);
-        elementRel = elementWidth/elementHeight;
-        animationRel = this.transformCanvas.w/this.transformCanvas.h;
-        if(animationRel>elementRel && fillType === 'meet' || animationRel<elementRel && fillType === 'slice'){
-            this.transformCanvas.sx = elementWidth/(this.transformCanvas.w/this.renderConfig.dpr);
-            this.transformCanvas.sy = elementWidth/(this.transformCanvas.w/this.renderConfig.dpr);
-        }else{
-            this.transformCanvas.sx = elementHeight/(this.transformCanvas.h / this.renderConfig.dpr);
-            this.transformCanvas.sy = elementHeight/(this.transformCanvas.h / this.renderConfig.dpr);
-        }
-
-        if(xPos === 'xMid' && ((animationRel<elementRel && fillType==='meet') || (animationRel>elementRel && fillType === 'slice'))){
-            this.transformCanvas.tx = (elementWidth-this.transformCanvas.w*(elementHeight/this.transformCanvas.h))/2*this.renderConfig.dpr;
-        } else if(xPos === 'xMax' && ((animationRel<elementRel && fillType==='meet') || (animationRel>elementRel && fillType === 'slice'))){
-            this.transformCanvas.tx = (elementWidth-this.transformCanvas.w*(elementHeight/this.transformCanvas.h))*this.renderConfig.dpr;
-        } else {
-            this.transformCanvas.tx = 0;
-        }
-        if(yPos === 'YMid' && ((animationRel>elementRel && fillType==='meet') || (animationRel<elementRel && fillType === 'slice'))){
-            this.transformCanvas.ty = ((elementHeight-this.transformCanvas.h*(elementWidth/this.transformCanvas.w))/2)*this.renderConfig.dpr;
-        } else if(yPos === 'YMax' && ((animationRel>elementRel && fillType==='meet') || (animationRel<elementRel && fillType === 'slice'))){
-            this.transformCanvas.ty = ((elementHeight-this.transformCanvas.h*(elementWidth/this.transformCanvas.w)))*this.renderConfig.dpr;
-        } else {
-            this.transformCanvas.ty = 0;
-        }
-
-    }else if(this.renderConfig.preserveAspectRatio == 'none'){
-        this.transformCanvas.sx = elementWidth/(this.transformCanvas.w/this.renderConfig.dpr);
-        this.transformCanvas.sy = elementHeight/(this.transformCanvas.h/this.renderConfig.dpr);
-        this.transformCanvas.tx = 0;
-        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];
-    /*var i, len = this._br.length;
-    for(i=0;i<len;i+=1){
-        if(this._br[i] && this._br[i].data.ty === 0){
-            this._br[i].resize(this._x.transformCanvas);
-        }
-    }*/
-    this.ctxTransform(this.transformCanvas.props);
-};
-
-_aq.prototype.destroy = function () {
-    if(this.renderConfig.clearCanvas) {
-        this.animationItem.wrapper.innerHTML = '';
-    }
-    var i, len = this.layers ? this.layers.length : 0;
-    for (i = len - 1; i >= 0; i-=1) {
-        if(this._br[i]) {
-            this._br[i].destroy();
-        }
-    }
-    this._br.length = 0;
-    this._x.canvasContext = null;
-    this.animationItem.container = null;
-    this.destroyed = true;
-};
-
-_aq.prototype._ba = function(num){
-    if((this.renderedFrame == num && this.renderConfig.clearCanvas === true) || this.destroyed || num === null){
-        return;
-    }
-    this.renderedFrame = num;
-    this._x.frameNum = num - this.animationItem.firstFrame;
-    this._x.frameId += 1;
-    this._x.projectInterface.currentFrame = num;
-    if(this.renderConfig.clearCanvas === true){
-        //this.reset();
-        //this.canvasContext.save();
-        //this.canvasContext.canvas.width = this.canvasContext.canvas.width;
-        this.canvasContext.clearRect(this.transformCanvas.tx, this.transformCanvas.ty, this.transformCanvas.w*this.transformCanvas.sx, this.transformCanvas.h*this.transformCanvas.sy);
-    }else{
-        this.save();
-    }
-    this.canvasContext.beginPath();
-    this.canvasContext.rect(0,0,this.transformCanvas.w,this.transformCanvas.h);
-    this.canvasContext.closePath();
-    this.canvasContext.clip();
-
-     // console.log('--------');
-     // console.log('NEW: ',num);
-    var i, len = this.layers.length;
-    if(!this.completeLayers){
-        this.checkLayers(num);
-    }
-
-    for (i = 0; i < len; i++) {
-        if(this.completeLayers || this._br[i]){
-            this._br[i]._az(num - this.layers[i].st);
-        }
-    }
-    for (i = len - 1; i >= 0; i-=1) {
-        if(this.completeLayers || this._br[i]){
-            this._br[i]._ba();
-        }
-    }
-    if(this.renderConfig.clearCanvas !== true){
-        this.restore();
-    } else {
-        //this.canvasContext.restore();
-    }
-    // console.log(this.contextData.cTr.props)
-};
-
-_aq.prototype.buildItem = function(pos){
-    var _br = this._br;
-    if(_br[pos] || this.layers[pos].ty == 99){
-        return;
-    }
-    var element = this.createItem(this.layers[pos], this,this._x);
-    _br[pos] = element;
-    element.initExpressions();
-    /*if(this.layers[pos].ty === 0){
-        element.resize(this._x.transformCanvas);
-    }*/
-};
-
-_aq.prototype.checkPendingElements  = function(){
-    while(this.pendingElements.length){
-        var element = this.pendingElements.pop();
-        element.checkParenting();
-    }
-};
-
-_aq.prototype.hide = function(){
-    this.animationItem.container.style.display = 'none';
-};
-
-_aq.prototype.show = function(){
-    this.animationItem.container.style.display = 'block';
-};
-
-_aq.prototype.searchExtraCompositions = function(assets){
-    var i, len = assets.length;
-    var floatingContainer = createNS('g');
-    for(i=0;i<len;i+=1){
-        if(assets[i].xt){
-            var comp = this.createComp(assets[i],this._x.comp,this._x);
-            comp.initExpressions();
-            //comp.compInterface = CompExpressionInterface(comp);
-            //Expressions.addLayersInterface(comp._br, this._x.projectInterface);
-            this._x.projectInterface.registerComposition(comp);
-        }
-    }
-};
-
-function _ap(animationItem, config){
-    this.animationItem = animationItem;
-    this.layers = null;
-    this.renderedFrame = -1;
-    this.renderConfig = {
-        className: (config && config.className) || '',
-        hideOnTransparent: (config && config.hideOnTransparent === false) ? false : true
-    };
-    this._x = {
-        mdf: false,
-        frameNum: -1,
-        renderConfig: this.renderConfig
-    };
-    this.pendingElements = [];
-    this._br = [];
-    this.threeDElements = [];
-    this.destroyed = false;
-    this.camera = null;
-    this.supports3d = true;
-
-}
-
-extendPrototype([_l],_ap);
-
-_ap.prototype.buildItem = _ao.prototype.buildItem;
-
-_ap.prototype.checkPendingElements  = function(){
-    while(this.pendingElements.length){
-        var element = this.pendingElements.pop();
-        element.checkParenting();
-    }
-};
-
-_ap.prototype.appendElementInPos = function(element, pos){
-    var newDOMElement = element.get_e();
-    if(!newDOMElement){
-        return;
-    }
-    var layer = this.layers[pos];
-    if(!layer.ddd || !this.supports3d){
-        var i = 0;
-        var nextDOMElement, nextLayer;
-        while(i<pos){
-            if(this._br[i] && this._br[i]!== true && this._br[i].get_e){
-                nextLayer = this._br[i];
-                nextDOMElement = this.layers[i].ddd ? this.getThreeDContainerByPos(i) : nextLayer.get_e();
-            }
-            i += 1;
-        }
-        if(nextDOMElement){
-            if(!layer.ddd || !this.supports3d){
-                this._bx.insertBefore(newDOMElement, nextDOMElement);
-            }
-        } else {
-            if(!layer.ddd || !this.supports3d){
-                this._bx.appendChild(newDOMElement);
-            }
-        }
-    } else {
-        this.addTo3dContainer(newDOMElement,pos);
-    }
-};
-
-
-_ap.prototype.createBase = function (data) {
-    return new _d(data, this._x, this);
-};
-
-_ap.prototype.createShape = function (data) {
-    if(!this.supports3d){
-        return new _f(data, this._x, this);
-    }
-    return new _z(data, this._x, this);
-};
-
-_ap.prototype.createText = function (data) {
-    if(!this.supports3d){
-        return new SVGTextElement(data, this._x, this);
-    }
-    return new _ab(data, this._x, this);
-};
-
-_ap.prototype.createCamera = function (data) {
-    this.camera = new _v(data, this._x, this);
-    return this.camera;
-};
-
-_ap.prototype.createImage = function (data) {
-    if(!this.supports3d){
-        return new _h(data, this._x, this);
-    }
-    return new _y(data, this._x, this);
-};
-
-_ap.prototype.createComp = function (data) {
-    if(!this.supports3d){
-        return new _g(data, this._x, this);
-    }
-    return new _w(data, this._x, this);
-
-};
-
-_ap.prototype.createSolid = function (data) {
-    if(!this.supports3d){
-        return new _j(data, this._x, this);
-    }
-    return new _aa(data, this._x, this);
-};
-
-_ap.prototype.createNull = _ao.prototype.createNull;
-
-_ap.prototype.getThreeDContainerByPos = function(pos){
-    var i = 0, len = this.threeDElements.length;
-    while(i<len) {
-        if(this.threeDElements[i].startPos <= pos && this.threeDElements[i].endPos >= pos) {
-            return this.threeDElements[i].perspectiveElem;
-        }
-        i += 1;
-    }
-}
-
-_ap.prototype.createThreeDContainer = function(pos){
-    var perspectiveElem = createTag('div');
-    styleDiv(perspectiveElem);
-    perspectiveElem.style.width = this._x.compSize.w+'px';
-    perspectiveElem.style.height = this._x.compSize.h+'px';
-    perspectiveElem.style.transformOrigin = perspectiveElem.style.mozTransformOrigin = perspectiveElem.style.webkitTransformOrigin = "50% 50%";
-    var container = createTag('div');
-    styleDiv(container);
-    container.style.transform = container.style.webkitTransform = 'matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1)';
-    perspectiveElem.appendChild(container);
-    this.resizerElem.appendChild(perspectiveElem);
-    var threeDContainerData = {
-        container:container,
-        perspectiveElem:perspectiveElem,
-        startPos: pos,
-        endPos: pos
-    };
-    this.threeDElements.push(threeDContainerData);
-    return threeDContainerData;
-};
-
-_ap.prototype.build3dContainers = function(){
-    var i, len = this.layers.length;
-    var lastThreeDContainerData;
-    for(i=0;i<len;i+=1){
-        if(this.layers[i].ddd){
-            if(!lastThreeDContainerData){
-                lastThreeDContainerData = this.createThreeDContainer(i);
-            }
-            lastThreeDContainerData.endPos = Math.max(lastThreeDContainerData.endPos,i);
-        } else {
-            lastThreeDContainerData = null;
-        }
-    }
-};
-
-_ap.prototype.addTo3dContainer = function(elem,pos){
-    var i = 0, len = this.threeDElements.length;
-    while(i<len){
-        if(pos <= this.threeDElements[i].endPos){
-            var j = this.threeDElements[i].startPos;
-            var nextElement;
-            while(j<pos){
-                if(this._br[j] && this._br[j].get_e){
-                    nextElement = this._br[j].get_e();
-                }
-                j += 1;
-            }
-            if(nextElement){
-                this.threeDElements[i].container.insertBefore(elem, nextElement);
-            } else {
-                this.threeDElements[i].container.appendChild(elem);
-            }
-            break;
-        }
-        i += 1;
-    }
-};
-
-_ap.prototype.configAnimation = function(animData){
-    var resizerElem = createTag('div');
-    var wrapper = this.animationItem.wrapper;
-    resizerElem.style.width = animData.w+'px';
-    resizerElem.style.height = animData.h+'px';
-    this.resizerElem = resizerElem;
-    styleDiv(resizerElem);
-    resizerElem.style.transformStyle = resizerElem.style.webkitTransformStyle = resizerElem.style.mozTransformStyle = "flat";
-    if(this.renderConfig.className) {
-      wrapper.setAttribute('class', this.renderConfig.className);
-    }
-    wrapper.appendChild(resizerElem);
-
-    resizerElem.style.overflow = 'hidden';
-    var svg = createNS('svg');
-    svg.setAttribute('width','1');
-    svg.setAttribute('height','1');
-    styleDiv(svg);
-    this.resizerElem.appendChild(svg);
-    var defs = createNS('defs');
-    svg.appendChild(defs);
-    this._x.defs = defs;
-    this.data = animData;
-    //Mask animation
-    this._x.getAssetData = this.animationItem.getAssetData.bind(this.animationItem);
-    this._x.getAssetsPath = this.animationItem.getAssetsPath.bind(this.animationItem);
-    this._x.elementLoaded = this.animationItem.elementLoaded.bind(this.animationItem);
-    this._x.frameId = 0;
-    this._x.compSize = {
-        w: animData.w,
-        h: animData.h
-    };
-    this._x.frameRate = animData.fr;
-    this.layers = animData.layers;
-    this._x.fontManager = new FontManager();
-    this._x.fontManager.addChars(animData.chars);
-    this._x.fontManager.addFonts(animData.fonts,svg);
-    this._bx = this.resizerElem;
-    this.build3dContainers();
-    this.updateContainerSize();
-};
-
-_ap.prototype.destroy = function () {
-    this.animationItem.wrapper.innerHTML = '';
-    this.animationItem.container = null;
-    this._x.defs = null;
-    var i, len = this.layers ? this.layers.length : 0;
-    for (i = 0; i < len; i++) {
-        this._br[i].destroy();
-    }
-    this._br.length = 0;
-    this.destroyed = true;
-    this.animationItem = null;
-};
-
-_ap.prototype.updateContainerSize = function () {
-    var elementWidth = this.animationItem.wrapper.offsetWidth;
-    var elementHeight = this.animationItem.wrapper.offsetHeight;
-    var elementRel = elementWidth/elementHeight;
-    var animationRel = this._x.compSize.w/this._x.compSize.h;
-    var sx,sy,tx,ty;
-    if(animationRel>elementRel){
-        sx = elementWidth/(this._x.compSize.w);
-        sy = elementWidth/(this._x.compSize.w);
-        tx = 0;
-        ty = ((elementHeight-this._x.compSize.h*(elementWidth/this._x.compSize.w))/2);
-    }else{
-        sx = elementHeight/(this._x.compSize.h);
-        sy = elementHeight/(this._x.compSize.h);
-        tx = (elementWidth-this._x.compSize.w*(elementHeight/this._x.compSize.h))/2;
-        ty = 0;
-    }
-    this.resizerElem.style.transform = this.resizerElem.style.webkitTransform = 'matrix3d(' + sx + ',0,0,0,0,'+sy+',0,0,0,0,1,0,'+tx+','+ty+',0,1)';
-};
-
-_ap.prototype._ba = _ao.prototype._ba;
-
-_ap.prototype.hide = function(){
-    this.resizerElem.style.display = 'none';
-};
-
-_ap.prototype.show = function(){
-    this.resizerElem.style.display = 'block';
-};
-
-_ap.prototype.initItems = function(){
-    this.buildAllItems();
-    if(this.camera){
-        this.camera.setup();
-    } else {
-        var cWidth = this._x.compSize.w;
-        var cHeight = this._x.compSize.h;
-        var i, len = this.threeDElements.length;
-        for(i=0;i<len;i+=1){
-            this.threeDElements[i].perspectiveElem.style.perspective = this.threeDElements[i].perspectiveElem.style.webkitPerspective = Math.sqrt(Math.pow(cWidth,2) + Math.pow(cHeight,2)) + 'px';
-        }
-    }
-};
-
-_ap.prototype.searchExtraCompositions = function(assets){
-    var i, len = assets.length;
-    var floatingContainer = createTag('div');
-    for(i=0;i<len;i+=1){
-        if(assets[i].xt){
-            var comp = this.createComp(assets[i],floatingContainer,this._x.comp,null);
-            comp.initExpressions();
-            this._x.projectInterface.registerComposition(comp);
-        }
-    }
-};
-
 function _ay(data,element,_x) {
     //TODO: check if dynamic properties array can be used from element
-    this.dynamicProperties = [];
+    this._co = [];
     this.data = data;
     this.element = element;
     this._x = _x;
     this.storedData = [];
     this.masksProperties = this.data.masksProperties || [];
     this.maskElement = null;
-    this.firstFrame = true;
+    this._ch = true;
     var defs = this._x.defs;
     var i, len = this.masksProperties ? this.masksProperties.length : 0;
-    this.viewData = Array.apply(null,{length:len});
+    this.viewData = _cv(len);
     this.solidPath = '';
 
 
@@ -6438,7 +5798,7 @@
         }
 
         if((properties[i].mode == 's' || properties[i].mode == 'i') && count == 0){
-            rect = createNS( 'rect');
+            rect = _ct( 'rect');
             rect.setAttribute('fill', '#ffffff');
             rect.setAttribute('width', this.element.comp.data.w);
             rect.setAttribute('height', this.element.comp.data.h);
@@ -6447,12 +5807,12 @@
             rect = null;
         }
 
-        path = createNS( 'path');
+        path = _ct( 'path');
         if(properties[i].mode == 'n') {
             // TODO move this to a factory or to a constructor
             this.viewData[i] = {
-                op: _ai._bo(this.element,properties[i].o,0,0.01,this.dynamicProperties),
-                prop: _ah._bp(this.element,properties[i],3,this.dynamicProperties,null),
+                op: _ai._bo(this.element,properties[i].o,0,0.01,this._co),
+                prop: _ah._bp(this.element,properties[i],3,this._co,null),
                 elem: path
             };
             defs.appendChild(path);
@@ -6466,11 +5826,11 @@
         if (properties[i].x.k !== 0) {
             maskType = 'mask';
             maskRef = 'mask';
-            x = _ai._bo(this.element,properties[i].x,0,null,this.dynamicProperties);
+            x = _ai._bo(this.element,properties[i].x,0,null,this._co);
             var filterID = 'fi_'+randomString(10);
-            expansor = createNS('filter');
+            expansor = _ct('filter');
             expansor.setAttribute('id',filterID);
-            feMorph = createNS('feMorphology');
+            feMorph = _ct('feMorphology');
             feMorph.setAttribute('operator','dilate');
             feMorph.setAttribute('in','SourceGraphic');
             feMorph.setAttribute('radius','0');
@@ -6494,11 +5854,11 @@
         };
         if(properties[i].mode == 'i'){
             jLen = currentMasks.length;
-            var g = createNS('g');
+            var g = _ct('g');
             for(j=0;j<jLen;j+=1){
                 g.appendChild(currentMasks[j]);
             }
-            var mask = createNS('mask');
+            var mask = _ct('mask');
             mask.setAttribute('mask-type','alpha');
             mask.setAttribute('id',layerId+'_'+count);
             mask.appendChild(path);
@@ -6517,8 +5877,8 @@
         this.viewData[i] = {
             elem: path,
             lastPath: '',
-            op: _ai._bo(this.element,properties[i].o,0,0.01,this.dynamicProperties),
-            prop:_ah._bp(this.element,properties[i],3,this.dynamicProperties,null)
+            op: _ai._bo(this.element,properties[i].o,0,0.01,this._co),
+            prop:_ah._bp(this.element,properties[i],3,this._co,null)
         };
         if(rect){
             //TODO: move the invRect property to the object definition in order to prevent a new hidden class creation.
@@ -6529,7 +5889,7 @@
         }
     }
 
-    this.maskElement = createNS( maskType);
+    this.maskElement = _ct( maskType);
 
     len = currentMasks.length;
     for(i=0;i<len;i+=1){
@@ -6549,9 +5909,9 @@
 };
 
 _ay.prototype._az = function(){
-    var i, len = this.dynamicProperties.length;
+    var i, len = this._co.length;
     for(i=0;i<len;i+=1){
-        this.dynamicProperties[i].getValue();
+        this._co[i].getValue();
 
     }
 };
@@ -6559,18 +5919,18 @@
 _ay.prototype._ba = function (finalMat) {
     var i, len = this.masksProperties.length;
     for (i = 0; i < len; i++) {
-        if(this.viewData[i].prop.mdf || this.firstFrame){
+        if(this.viewData[i].prop.mdf || this._ch){
             this.drawPath(this.masksProperties[i],this.viewData[i].prop.v,this.viewData[i]);
         }
-        if(this.viewData[i].op.mdf || this.firstFrame){
+        if(this.viewData[i].op.mdf || this._ch){
             this.viewData[i].elem.setAttribute('fill-opacity',this.viewData[i].op.v);
         }
         if(this.masksProperties[i].mode !== 'n'){
-            if(this.viewData[i].invRect && (this.element.finalTransform.mProp.mdf || this.firstFrame)){
+            if(this.viewData[i].invRect && (this.element.finalTransform.mProp.mdf || this._ch)){
                 this.viewData[i].invRect.setAttribute('x', -finalMat.props[12]);
                 this.viewData[i].invRect.setAttribute('y', -finalMat.props[13]);
             }
-            if(this.storedData[i].x && (this.storedData[i].x.mdf || this.firstFrame)){
+            if(this.storedData[i].x && (this.storedData[i].x.mdf || this._ch)){
                 var feMorph = this.storedData[i].expan;
                 if(this.storedData[i].x.v < 0){
                     if(this.storedData[i].lastOperator !== 'erode'){
@@ -6589,7 +5949,7 @@
             }
         }
     }
-    this.firstFrame = false;
+    this._ch = false;
 };
 
 _ay.prototype.getMaskelement = function () {
@@ -6598,10 +5958,10 @@
 
 _ay.prototype.createLayerSolidPath = function(){
     var path = 'M0,0 ';
-    path += ' h' + this._x.compSize.w ;
-    path += ' v' + this._x.compSize.h ;
-    path += ' h-' + this._x.compSize.w ;
-    path += ' v-' + this._x.compSize.h + ' ';
+    path += ' h' + this._x._de.w ;
+    path += ' v' + this._x._de.h ;
+    path += ' h-' + this._x._de.w ;
+    path += ' v-' + this._x._de.h + ' ';
     return path;
 };
 
@@ -6642,21 +6002,21 @@
 function _ad(){}
 
 _ad.prototype.initHierarchy = function() {
-    this.hierarchy = [];
+    this._dd = [];
     this._isParent = false;
     this.checkParenting();
 }
 
 _ad.prototype.resetHierarchy = function() {
-    this.hierarchy.length = 0;
+    this._dd.length = 0;
 };
 
 _ad.prototype.getHierarchy = function() {
-    return this.hierarchy;
+    return this._dd;
 };
 
-_ad.prototype.setHierarchy = function(hierarchy){
-    this.hierarchy = hierarchy;
+_ad.prototype.setHierarchy = function(_dd){
+    this._dd = _dd;
 };
 
 _ad.prototype.checkParenting = function(){
@@ -6685,9 +6045,9 @@
 
 _ac.prototype.initFrame = function(){
 	//set to true when inpoint is rendered
-	this.firstFrame = false;
+	this._ch = false;
 	//list of animated properties
-	this.dynamicProperties = [];
+	this._co = [];
 }
 
 
@@ -6700,12 +6060,12 @@
  * 
  */
 _ac.prototype.prepareProperties = function(num, isVisible) {
-    var i, len = this.dynamicProperties.length;
+    var i, len = this._co.length;
     for (i = 0;i < len; i += 1) {
         //TODO change .type to .propType
-        if (isVisible || (this._isParent && this.dynamicProperties[i].propType === 'transform')) {
-            this.dynamicProperties[i].getValue(this.firstFrame);
-            if (this.dynamicProperties[i].mdf) {
+        if (isVisible || (this._isParent && this._co[i].propType === 'transform')) {
+            this._co[i].getValue(this._ch);
+            if (this._co[i].mdf) {
                 this._x.mdf = true;
             }
         }
@@ -6715,7 +6075,7 @@
 
 _af.prototype.initTransform = function() {
     this.finalTransform = {
-        mProp: this.data.ks ? _ag._bj(this, this.data.ks, this.dynamicProperties) : {o:0},
+        mProp: this.data.ks ? _ag._bj(this, this.data.ks, this._co) : {o:0},
         matMdf: false,
         opMdf: false,
         mat: new Matrix()
@@ -6732,17 +6092,17 @@
 
 _af.prototype.renderTransform = function() {
 
-	this.finalTransform.opMdf = this.finalTransform.mProp.o.mdf || this.firstFrame;
-    this.finalTransform.matMdf = this.finalTransform.mProp.mdf || this.firstFrame;
+	this.finalTransform.opMdf = this.finalTransform.mProp.o.mdf || this._ch;
+    this.finalTransform.matMdf = this.finalTransform.mProp.mdf || this._ch;
 
-    if (this.hierarchy) {
+    if (this._dd) {
         var mat;
         var finalMat = this.finalTransform.mat;
-        var i = 0, len = this.hierarchy.length;
-        //Checking if any of the transformation matrices in the hierarchy chain has changed.
+        var i = 0, len = this._dd.length;
+        //Checking if any of the transformation matrices in the _dd chain has changed.
         if (!this.finalTransform.matMdf) {
             while (i < len) {
-                if (this.hierarchy[i].finalTransform.mProp.mdf) {
+                if (this._dd[i].finalTransform.mProp.mdf) {
                     this.finalTransform.matMdf = true;
                     break;
                 }
@@ -6754,7 +6114,7 @@
             mat = this.finalTransform.mProp.v.props;
             finalMat.cloneFromProps(mat);
             for (i = 0; i < len; i += 1) {
-                mat = this.hierarchy[i].finalTransform.mProp.v.props;
+                mat = this._dd[i].finalTransform.mProp.v.props;
                 finalMat.transform(mat[0], mat[1], mat[2], mat[3], mat[4], mat[5], mat[6], mat[7], mat[8], mat[9], mat[10], mat[11], mat[12], mat[13], mat[14], mat[15]);
             }
         }
@@ -6778,8 +6138,8 @@
     }
     var i, len = transforms.length,ptNew;
     for (i = 0; i < len; i += 1) {
-        ptNew = transforms[i].mat.applyToPointArray(0, 0, 0);
-        //ptNew = transforms[i].mat.applyToPointArray(pt[0],pt[1],pt[2]);
+        ptNew = transforms[i].mat._cn(0, 0, 0);
+        //ptNew = transforms[i].mat._cn(pt[0],pt[1],pt[2]);
         pt = [pt[0] - ptNew[0], pt[1] - ptNew[1], 0];
     }
     return pt;
@@ -6847,7 +6207,7 @@
 
 _ae.prototype.renderRenderable = function() {
     this.maskManager._ba(this.finalTransform.mat);
-    this.effectsManager._ba(this.firstFrame);
+    this.effectsManager._ba(this._ch);
 }
 
 _ae.prototype.sourceRectAtTime = function(){
@@ -6866,12 +6226,12 @@
         return {w:this.data.width,h:this.data.height};
     }
 };
-function RenderableDOMElement() {
+function _ci() {
 
 }
-extendPrototype([_ae], RenderableDOMElement);
+extendPrototype([_ae], _ci);
 
-RenderableDOMElement.prototype.initElement = function(data,_x,comp) {
+_ci.prototype._cz = function(data,_x,comp) {
     this.initFrame();
     this.initBaseData(data, _x, comp);
     this.initTransform(data, _x, comp);
@@ -6884,25 +6244,25 @@
     this.hide();
 }
 
-RenderableDOMElement.prototype.hide = function(){
+_ci.prototype.hide = function(){
     if (!this.hidden && (!this.isInRange || this.isTransparent)) {
         this._bx.style.display = 'none';
         this.hidden = true;
     }
 };
 
-RenderableDOMElement.prototype.show = function(){
+_ci.prototype.show = function(){
     if (this.isInRange && !this.isTransparent){
         if (!this.data.hd) {
             this._bx.style.display = 'block';
         }
         this.hidden = false;
-        this.firstFrame = true;
-        this.maskManager.firstFrame = true;
+        this._ch = true;
+        this.maskManager._ch = true;
     }
 };
 
-RenderableDOMElement.prototype._ba = function() {
+_ci.prototype._ba = function() {
     //If it is exported as hidden (data.hd === true) no need to render
     //If it is not visible no need to render
     if (this.data.hd || this.hidden) {
@@ -6912,19 +6272,19 @@
     this.renderRenderable();
     this.renderElement();
     this.renderInnerContent();
-    if (this.firstFrame) {
-        this.firstFrame = false;
+    if (this._ch) {
+        this._ch = false;
     }
 };
 
-RenderableDOMElement.prototype.renderInnerContent = function() {};
+_ci.prototype.renderInnerContent = function() {};
 
-RenderableDOMElement.prototype.destroy = function(){
+_ci.prototype.destroy = function(){
     this._cc =  null;
     this.destroy_e();
 };
 
-RenderableDOMElement.prototype._az = function(num) {
+_ci.prototype._az = function(num) {
     this.prepareRenderableFrame(num);
     this.prepareProperties(num, this.isInRange);
 };
@@ -6939,7 +6299,7 @@
 	this.lvl = level;
 	this.mdf = false;
 	this.closed = false;
-	this.pElem = createNS('path');
+	this.pElem = _ct('path');
 	this.msElem = null;
 }
 
@@ -6962,29 +6322,29 @@
 	}
 	this._br = []
 }
-function SVGStrokeStyleData(elem, data, dynamicProperties, styleOb){
-	this.o = _ai._bo(elem,data.o,0,0.01,dynamicProperties);
-	this.w = _ai._bo(elem,data.w,0,null,dynamicProperties);
-	this.d = new DashProperty(elem,data.d||{},'svg',dynamicProperties);
-	this.c = _ai._bo(elem,data.c,1,255,dynamicProperties);
+function SVGStrokeStyleData(elem, data, _co, styleOb){
+	this.o = _ai._bo(elem,data.o,0,0.01,_co);
+	this.w = _ai._bo(elem,data.w,0,null,_co);
+	this.d = new DashProperty(elem,data.d||{},'svg',_co);
+	this.c = _ai._bo(elem,data.c,1,255,_co);
 	this.style = styleOb;
 }
-function SVGFillStyleData(elem, data, dynamicProperties, styleOb){
-	this.o = _ai._bo(elem,data.o,0,0.01,dynamicProperties);
-	this.c = _ai._bo(elem,data.c,1,255,dynamicProperties);
+function SVGFillStyleData(elem, data, _co, styleOb){
+	this.o = _ai._bo(elem,data.o,0,0.01,_co);
+	this.c = _ai._bo(elem,data.c,1,255,_co);
 	this.style = styleOb;
 }
-function SVGGradientFillStyleData(elem, data, dynamicProperties, styleOb){
-    this.initGradientData(elem, data, dynamicProperties, styleOb);
+function _ck(elem, data, _co, styleOb){
+    this.initGradientData(elem, data, _co, styleOb);
 }
 
-SVGGradientFillStyleData.prototype.initGradientData = function(elem, data, dynamicProperties, styleOb){
-    this.o = _ai._bo(elem,data.o,0,0.01,dynamicProperties);
-    this.s = _ai._bo(elem,data.s,1,null,dynamicProperties);
-    this.e = _ai._bo(elem,data.e,1,null,dynamicProperties);
-    this.h = _ai._bo(elem,data.h||{k:0},0,0.01,dynamicProperties);
-    this.a = _ai._bo(elem,data.a||{k:0},0,degToRads,dynamicProperties);
-    this.g = new GradientProperty(elem,data.g,dynamicProperties);
+_ck.prototype.initGradientData = function(elem, data, _co, styleOb){
+    this.o = _ai._bo(elem,data.o,0,0.01,_co);
+    this.s = _ai._bo(elem,data.s,1,null,_co);
+    this.e = _ai._bo(elem,data.e,1,null,_co);
+    this.h = _ai._bo(elem,data.h||{k:0},0,0.01,_co);
+    this.a = _ai._bo(elem,data.a||{k:0},0,degToRads,_co);
+    this.g = new GradientProperty(elem,data.g,_co);
     this.style = styleOb;
     this.stops = [];
     this.setGradientData(styleOb.pElem, data);
@@ -6992,10 +6352,10 @@
 
 }
 
-SVGGradientFillStyleData.prototype.setGradientData = function(pathElement,data){
+_ck.prototype.setGradientData = function(pathElement,data){
 
     var gradientId = 'gr_'+randomString(10);
-    var gfill = createNS(data.t === 1 ? 'linearGradient' : 'radialGradient');
+    var gfill = _ct(data.t === 1 ? 'linearGradient' : 'radialGradient');
     gfill.setAttribute('id',gradientId);
     gfill.setAttribute('spreadMethod','pad');
     gfill.setAttribute('gradientUnits','userSpaceOnUse');
@@ -7003,7 +6363,7 @@
     var stop, j, jLen;
     jLen = data.g.p*4;
     for(j=0;j<jLen;j+=4){
-        stop = createNS('stop');
+        stop = _ct('stop');
         gfill.appendChild(stop);
         stops.push(stop);
     }
@@ -7013,23 +6373,23 @@
     this.cst = stops;
 }
 
-SVGGradientFillStyleData.prototype.setGradientOpacity = function(data, styleOb){
+_ck.prototype.setGradientOpacity = function(data, styleOb){
     if(this.g._hasOpacity && !this.g._collapsable){
         var stop, j, jLen;
-        var mask = createNS("mask");
-        var maskElement = createNS( 'path');
+        var mask = _ct("mask");
+        var maskElement = _ct( 'path');
         mask.appendChild(maskElement);
         var opacityId = 'op_'+randomString(10);
         var maskId = 'mk_'+randomString(10);
         mask.setAttribute('id',maskId);
-        var opFill = createNS(data.t === 1 ? 'linearGradient' : 'radialGradient');
+        var opFill = _ct(data.t === 1 ? 'linearGradient' : 'radialGradient');
         opFill.setAttribute('id',opacityId);
         opFill.setAttribute('spreadMethod','pad');
         opFill.setAttribute('gradientUnits','userSpaceOnUse');
         jLen = data.g.k.k[0].s ? data.g.k.k[0].s.length : data.g.k.k.length;
         var stops = this.stops;
         for(j=data.g.p*4;j<jLen;j+=2){
-            stop = createNS('stop');
+            stop = _ct('stop');
             stop.setAttribute('stop-color','rgb(255,255,255)');
             opFill.appendChild(stop);
             stops.push(stop);
@@ -7042,19 +6402,19 @@
         styleOb.msElem = maskElement;
     }
 };
-function SVGGradientStrokeStyleData(elem, data, dynamicProperties, styleOb){
-	this.w = _ai._bo(elem,data.w,0,null,dynamicProperties);
-	this.d = new DashProperty(elem,data.d||{},'svg',dynamicProperties);
-    this.initGradientData(elem, data, dynamicProperties, styleOb);
+function _cj(elem, data, _co, styleOb){
+	this.w = _ai._bo(elem,data.w,0,null,_co);
+	this.d = new DashProperty(elem,data.d||{},'svg',_co);
+    this.initGradientData(elem, data, _co, styleOb);
 }
 
-SVGGradientStrokeStyleData.prototype.initGradientData = SVGGradientFillStyleData.prototype.initGradientData;
-SVGGradientStrokeStyleData.prototype.setGradientData = SVGGradientFillStyleData.prototype.setGradientData;
-SVGGradientStrokeStyleData.prototype.setGradientOpacity = SVGGradientFillStyleData.prototype.setGradientOpacity;
+_cj.prototype.initGradientData = _ck.prototype.initGradientData;
+_cj.prototype.setGradientData = _ck.prototype.setGradientData;
+_cj.prototype.setGradientOpacity = _ck.prototype.setGradientOpacity;
 function ShapeGroupData() {
 	this.it = [];
     this.prevViewData = [];
-    this.gr = createNS('g');
+    this.gr = _ct('g');
 }
 function _e(){
 };
@@ -7091,56 +6451,26 @@
     }
 }
 
+_e.prototype.blendModeEnums = {
+    1:'multiply',
+    2:'screen',
+    3:'overlay',
+    4:'darken',
+    5:'lighten',
+    6:'color-dodge',
+    7:'color-burn',
+    8:'hard-light',
+    9:'soft-light',
+    10:'difference',
+    11:'exclusion',
+    12:'hue',
+    13:'saturation',
+    14:'color',
+    15:'luminosity'
+}
+
 _e.prototype.getBlendMode = function(){
-    var blendModeValue = '';
-    switch(this.data.bm){
-        case 1:
-            blendModeValue = 'multiply';
-            break;
-        case 2:
-            blendModeValue = 'screen';
-            break;
-        case 3:
-            blendModeValue = 'overlay';
-            break;
-        case 4:
-            blendModeValue = 'darken';
-            break;
-        case 5:
-            blendModeValue = 'lighten';
-            break;
-        case 6:
-            blendModeValue = 'color-dodge';
-            break;
-        case 7:
-            blendModeValue = 'color-burn';
-            break;
-        case 8:
-            blendModeValue = 'hard-light';
-            break;
-        case 9:
-            blendModeValue = 'soft-light';
-            break;
-        case 10:
-            blendModeValue = 'difference';
-            break;
-        case 11:
-            blendModeValue = 'exclusion';
-            break;
-        case 12:
-            blendModeValue = 'hue';
-            break;
-        case 13:
-            blendModeValue = 'saturation';
-            break;
-        case 14:
-            blendModeValue = 'color';
-            break;
-        case 15:
-            blendModeValue = 'luminosity';
-            break;
-    }
-    return blendModeValue;
+    return this.blendModeEnums[this.data.bm] || '';
 }
 
 _e.prototype.setBlendMode = function(){
@@ -7161,7 +6491,7 @@
         this.data.sr = 1;
     }
     // effects manager
-    this.effects = new EffectsManager(this.data,this,this.dynamicProperties);
+    this.effects = new EffectsManager(this.data,this,this._co);
     
 };
 
@@ -7203,11 +6533,11 @@
 };
 
 _d.prototype.initRendererElement = function() {
-    this._bx = createNS('g');
+    this._bx = _ct('g');
 }
 
 _d.prototype.createContainerElements = function(){
-    this.matteElement = createNS('g');
+    this.matteElement = _ct('g');
     this._bz = this._bx;
     this._ca = this._bx;
     this._sizeChanged = false;
@@ -7215,7 +6545,7 @@
     //If this layer acts as a mask for the following layer
     if (this.data.td) {
         if (this.data.td == 3 || this.data.td == 1) {
-            var masker = createNS('mask');
+            var masker = _ct('mask');
             masker.setAttribute('id', this.layerId);
             masker.setAttribute('mask-type', this.data.td == 3 ? 'luminance' : 'alpha');
             masker.appendChild(this._bx);
@@ -7228,38 +6558,38 @@
                 var fil = filtersFactory.createFilter(filId);
                 this._x.defs.appendChild(fil);
                 fil.appendChild(filtersFactory.createAlphaToLuminanceFilter());
-                var gg = createNS('g');
+                var gg = _ct('g');
                 gg.appendChild(this._bx);
                 _bw = gg;
                 masker.appendChild(gg);
                 gg.setAttribute('filter','url(' + locationHref + '#' + filId + ')');
             }
         } else if(this.data.td == 2) {
-            var maskGroup = createNS('mask');
+            var maskGroup = _ct('mask');
             maskGroup.setAttribute('id', this.layerId);
             maskGroup.setAttribute('mask-type','alpha');
-            var maskGrouper = createNS('g');
+            var maskGrouper = _ct('g');
             maskGroup.appendChild(maskGrouper);
             var filId = randomString(10);
             var fil = filtersFactory.createFilter(filId);
             ////
 
-            var feColorMatrix = createNS('feColorMatrix');
+            var feColorMatrix = _ct('feColorMatrix');
             feColorMatrix.setAttribute('type', 'matrix');
             feColorMatrix.setAttribute('color-interpolation-filters', 'sRGB');
             feColorMatrix.setAttribute('values','1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 -1 1');
             fil.appendChild(feColorMatrix);
 
             ////
-            /*var feCTr = createNS('feComponentTransfer');
+            /*var feCTr = _ct('feComponentTransfer');
             feCTr.setAttribute('in','SourceGraphic');
             fil.appendChild(feCTr);
-            var feFunc = createNS('feFuncA');
+            var feFunc = _ct('feFuncA');
             feFunc.setAttribute('type','table');
             feFunc.setAttribute('tableValues','1.0 0.0');
             feCTr.appendChild(feFunc);*/
             this._x.defs.appendChild(fil);
-            var alphaRect = createNS('rect');
+            var alphaRect = _ct('rect');
             alphaRect.setAttribute('width',  this.comp.data.w);
             alphaRect.setAttribute('height', this.comp.data.h);
             alphaRect.setAttribute('x','0');
@@ -7273,7 +6603,7 @@
             if (!featureSupport.maskType) {
                 maskGroup.setAttribute('mask-type', 'luminance');
                 fil.appendChild(filtersFactory.createAlphaToLuminanceFilter());
-                var gg = createNS('g');
+                var gg = _ct('g');
                 maskGrouper.appendChild(alphaRect);
                 gg.appendChild(this._bx);
                 _bw = gg;
@@ -7298,8 +6628,8 @@
     }
     //Clipping compositions to hide content that exceeds boundaries. If collapsed transformations is on, component should not be clipped
     if (this.data.ty === 0 && !this.data.hd) {
-        var cp = createNS( 'clipPath');
-        var pt = createNS('path');
+        var cp = _ct( 'clipPath');
+        var pt = _ct('path');
         pt.setAttribute('d','M0,0 L' + this.data.w + ',0' + ' L' + this.data.w + ',' + this.data.h + ' L0,' + this.data.h + 'z');
         var clipId = 'cp_'+randomString(8);
         cp.setAttribute('id',clipId);
@@ -7307,7 +6637,7 @@
         this._x.defs.appendChild(cp);
 
         if (this.checkMasks()) {
-            var cpGroup = createNS('g');
+            var cpGroup = _ct('g');
             cpGroup.setAttribute('clip-path','url(' + locationHref + '#'+clipId + ')');
             cpGroup.appendChild(this._bx);
             this._bz = cpGroup;
@@ -7360,524 +6690,94 @@
     this.matteElement.setAttribute("mask", "url(" + locationHref + "#" + id + ")");
 };
 
-function _f(data,_x,comp){
-    //List of drawable _br
-    this.shapes = [];
-    // Full shape data
-    this.shapesData = data.shapes;
-    //List of styles that will be applied to shapes
-    this.stylesList = [];
-    //List of modifiers that will be applied to shapes
-    this.shapeModifiers = [];
-    //List of items in shape tree
-    this.itemsData = [];
-    //List of items in previous shape tree
-    this.processedElements = [];
-    this.initElement(data,_x,comp);
-    //Moving any property that doesn't get too much access after initialization because of v8 way of handling more than 10 properties.
-    // List of _br that have been created
-    this.prevViewData = [];
+function _f(){
 }
 
-extendPrototype([_e,_af,_d,_ad,_ac,RenderableDOMElement], _f);
-
-_f.prototype.initSecondaryElement = function() {
-}
-
-_f.prototype.identityMatrix = new Matrix();
-
-_f.prototype.lcEnum = {
-    '1': 'butt',
-    '2': 'round',
-    '3': 'square'
-}
-
-_f.prototype.ljEnum = {
-    '1': 'miter',
-    '2': 'round',
-    '3': 'butt'
-}
-
-_f.prototype.searchProcessedElement = function(elem){
-    var i = 0, len = this.processedElements.length;
-    while(i < len){
-        if(this.processedElements[i].elem === elem){
-            return this.processedElements[i].pos;
+_f.prototype = {
+    addShapeToModifiers: function(data) {
+        var i, len = this.shapeModifiers.length;
+        for(i=0;i<len;i+=1){
+            this.shapeModifiers[i].addShape(data);
         }
-        i += 1;
-    }
-    return 0;
-};
-
-_f.prototype.addProcessedElement = function(elem, pos){
-    var i = this.processedElements.length;
-    while(i){
-        i -= 1;
-        if(this.processedElements[i].elem === elem){
-            this.processedElements[i].pos = pos;
-            break;
+    },
+    renderModifiers: function() {
+        if(!this.shapeModifiers.length){
+            return;
         }
-    }
-    if(i === 0){
-        this.processedElements.push(new ProcessedElement(elem, pos));
-    }
-};
-
-_f.prototype.buildExpressionInterface = function(){};
-
-_f.prototype.createContent = function(){
-    this.searchShapes(this.shapesData,this.itemsData,this.prevViewData,this._bx,this.dynamicProperties, 0, [], true);
-};
-
-_f.prototype.createStyleElement = function(data, level, dynamicProperties){
-    //TODO: prevent drawing of hidden styles
-    var elementData;
-    var styleOb = new SVGStyleData(data, level);
-
-    var pathElement = styleOb.pElem;
-    if(data.ty === 'st') {
-        elementData = new SVGStrokeStyleData(this, data, dynamicProperties, styleOb);
-    } else if(data.ty === 'fl') {
-        elementData = new SVGFillStyleData(this, data, dynamicProperties, styleOb);
-    } else if(data.ty === 'gf' || data.ty === 'gs') {
-        var gradientConstructor = data.ty === 'gf' ? SVGGradientFillStyleData : SVGGradientStrokeStyleData;
-        elementData = new gradientConstructor(this, data, dynamicProperties, styleOb);
-        this._x.defs.appendChild(elementData.gf);
-        if (elementData.maskId) {
-            this._x.defs.appendChild(elementData.ms);
-            this._x.defs.appendChild(elementData.of);
-            pathElement.setAttribute('mask','url(#' + elementData.maskId + ')');
+        var i, len = this.shapes.length;
+        for(i=0;i<len;i+=1){
+            this.shapes[i].reset();
         }
-    }
-    
-    if(data.ty === 'st' || data.ty === 'gs') {
-        pathElement.setAttribute('stroke-linecap', this.lcEnum[data.lc] || 'round');
-        pathElement.setAttribute('stroke-linejoin',this.ljEnum[data.lj] || 'round');
-        pathElement.setAttribute('fill-opacity','0');
-        if(data.lj === 1) {
-            pathElement.setAttribute('stroke-miterlimit',data.ml);
+
+        len = this.shapeModifiers.length;
+        for(i=len-1;i>=0;i-=1){
+            this.shapeModifiers[i].processShapes(this._ch);
         }
-    }
-
-    if(data.r === 2) {
-        pathElement.setAttribute('fill-rule', 'evenodd');
-    }
-
-    if(data.ln){
-        pathElement.setAttribute('id',data.ln);
-    }
-    if(data.cl){
-        pathElement.setAttribute('class',data.cl);
-    }
-    this.stylesList.push(styleOb);
-    return elementData;
-}
-
-_f.prototype.createGroupElement = function(data) {
-    var elementData = new ShapeGroupData();
-    if(data.ln){
-        elementData.gr.setAttribute('id',data.ln);
-    }
-    return elementData;
-}
-
-_f.prototype.create_af = function(data, dynamicProperties) {
-    return new SVGTransformData(_ag._bj(this,data,dynamicProperties), _ai._bo(this,data.o,0,0.01,dynamicProperties))
-}
-
-_f.prototype.createShapeElement = function(data, ownTransformers, level, dynamicProperties) {
-    var ty = 4;
-    if(data.ty === 'rc'){
-        ty = 5;
-    }else if(data.ty === 'el'){
-        ty = 6;
-    }else if(data.ty === 'sr'){
-        ty = 7;
-    }
-    var shapeProperty = _ah._bp(this,data,ty,dynamicProperties);
-    var elementData = new SVGShapeData(ownTransformers, level, shapeProperty)
-    this.shapes.push(elementData.sh);
-    this.addShapeToModifiers(elementData);
-    return elementData;
-}
-
-_f.prototype.setElementStyles = function(elementData){
-    var arr = elementData.styles;
-    var j, jLen = this.stylesList.length;
-    for (j = 0; j < jLen; j += 1) {
-        if (!this.stylesList[j].closed) {
-            arr.push(this.stylesList[j]);
+    },
+    lcEnum: {
+        '1': 'butt',
+        '2': 'round',
+        '3': 'square'
+    },
+    ljEnum: {
+        '1': 'miter',
+        '2': 'round',
+        '3': 'butt'
+    },
+    searchProcessedElement: function(elem){
+        var i = 0, len = this.processedElements.length;
+        while(i < len){
+            if(this.processedElements[i].elem === elem){
+                return this.processedElements[i].pos;
+            }
+            i += 1;
         }
-    }
-}
-
-_f.prototype.reloadShapes = function(){
-    this.firstFrame = true;
-    var i, len = this.itemsData.length;
-    for( i = 0; i < len; i += 1) {
-        this.prevViewData[i] = this.itemsData[i];
-    }
-    this.searchShapes(this.shapesData,this.itemsData,this.prevViewData,this._bx,this.dynamicProperties, 0, [], true);
-    var i, len = this.dynamicProperties.length;
-    for(i = 0; i < len; i += 1) {
-        this.dynamicProperties[i].getValue();
-    }
-    this.renderModifiers();
-}
-
-_f.prototype.searchShapes = function(arr,itemsData,prevViewData,container,dynamicProperties, level, transformers, render){
-    var ownTransformers = [].concat(transformers);
-    var i, len = arr.length - 1;
-    var j, jLen;
-    var ownStyles = [], ownModifiers = [], styleOb, currentTransform, modifier, processedPos;
-    for(i=len;i>=0;i-=1){
-        processedPos = this.searchProcessedElement(arr[i]);
-        if(!processedPos){
-            arr[i]._render = render;
-        } else {
-            itemsData[i] = prevViewData[processedPos - 1];
+        return 0;
+    },
+    addProcessedElement: function(elem, pos){
+        var i = this.processedElements.length;
+        while(i){
+            i -= 1;
+            if(this.processedElements[i].elem === elem){
+                this.processedElements[i].pos = pos;
+                break;
+            }
         }
-        if(arr[i].ty == 'fl' || arr[i].ty == 'st' || arr[i].ty == 'gf' || arr[i].ty == 'gs'){
-            if(!processedPos){
-                itemsData[i] = this.createStyleElement(arr[i], level, dynamicProperties);
-            } else {
-                itemsData[i].style.closed = false;
-            }
-            if(arr[i]._render){
-                container.appendChild(itemsData[i].style.pElem);
-            }
-            ownStyles.push(itemsData[i].style);
-        }else if(arr[i].ty == 'gr'){
-            if(!processedPos){
-                itemsData[i] = this.createGroupElement(arr[i]);
-            } else {
-                jLen = itemsData[i].it.length;
-                for(j=0;j<jLen;j+=1){
-                    itemsData[i].prevViewData[j] = itemsData[i].it[j];
-                }
-            }
-            this.searchShapes(arr[i].it,itemsData[i].it,itemsData[i].prevViewData,itemsData[i].gr,dynamicProperties, level + 1, ownTransformers, render);
-            if(arr[i]._render){
-                container.appendChild(itemsData[i].gr);
-            }
-        }else if(arr[i].ty == 'tr'){
-            if(!processedPos){
-                itemsData[i] = this.create_af(arr[i], dynamicProperties);
-            }
-            currentTransform = itemsData[i].transform;
-            ownTransformers.push(currentTransform);
-        }else if(arr[i].ty == 'sh' || arr[i].ty == 'rc' || arr[i].ty == 'el' || arr[i].ty == 'sr'){
-            if(!processedPos){
-                itemsData[i] = this.createShapeElement(arr[i], ownTransformers, level, dynamicProperties);
-            }
-            this.setElementStyles(itemsData[i]);
-
-        }else if(arr[i].ty == 'tm' || arr[i].ty == 'rd' || arr[i].ty == 'ms'){
-            if(!processedPos){
-                modifier = _as.getModifier(arr[i].ty);
-                modifier.init(this,arr[i],dynamicProperties);
-                itemsData[i] = modifier;
-                this.shapeModifiers.push(modifier);
-            } else {
-                modifier = itemsData[i];
-                modifier.closed = false;
-            }
-            ownModifiers.push(modifier);
-        }else if(arr[i].ty == 'rp'){
-            if(!processedPos){
-                modifier = _as.getModifier(arr[i].ty);
-                itemsData[i] = modifier;
-                modifier.init(this,arr,i,itemsData,dynamicProperties);
-                this.shapeModifiers.push(modifier);
-                render = false;
-            }else{
-                modifier = itemsData[i];
-                modifier.closed = true;
-            }
-            ownModifiers.push(modifier);
+        if(i === 0){
+            this.processedElements.push(new ProcessedElement(elem, pos));
         }
-        this.addProcessedElement(arr[i], i + 1);
-    }
-    len = ownStyles.length;
-    for(i=0;i<len;i+=1){
-        ownStyles[i].closed = true;
-    }
-    len = ownModifiers.length;
-    for(i=0;i<len;i+=1){
-        ownModifiers[i].closed = true;
-    }
-};
-
-_f.prototype.addShapeToModifiers = function(data) {
-    var i, len = this.shapeModifiers.length;
-    for(i=0;i<len;i+=1){
-        this.shapeModifiers[i].addShape(data);
-    }
-};
-
-_f.prototype.renderModifiers = function() {
-    if(!this.shapeModifiers.length){
-        return;
-    }
-    var i, len = this.shapes.length;
-    for(i=0;i<len;i+=1){
-        this.shapes[i].reset();
-    }
-
-    len = this.shapeModifiers.length;
-    for(i=len-1;i>=0;i-=1){
-        this.shapeModifiers[i].processShapes(this.firstFrame);
-    }
-};
-
-_f.prototype._az = function(num) {
-    this.prepareRenderableFrame(num);
-    this.prepareProperties(num, this.isInRange);
-};
-
-_f.prototype.renderInnerContent = function() {
-    this.renderModifiers();
-    var i, len = this.stylesList.length;
-    for(i=0;i<len;i+=1){
-        this.stylesList[i].reset();
-    }
-    this.renderShape(this.shapesData,this.itemsData, null);
-
-    for (i = 0; i < len; i += 1) {
-        if (this.stylesList[i].mdf || this.firstFrame) {
-            if(this.stylesList[i].msElem){
-                this.stylesList[i].msElem.setAttribute('d', this.stylesList[i].d);
-                //Adding M0 0 fixes same mask bug on all browsers
-                this.stylesList[i].d = 'M0 0' + this.stylesList[i].d;
+    },
+    _az: function(num) {
+        this.prepareRenderableFrame(num);
+        this.prepareProperties(num, this.isInRange);
+    },
+    buildShapeString: function(pathNodes, length, closed, mat) {
+        var i, shapeString = '';
+        for(i = 1; i < length; i += 1) {
+            if (i === 1) {
+                shapeString += " M" + mat.applyToPointStringified(pathNodes.v[0][0], pathNodes.v[0][1]);
             }
-            this.stylesList[i].pElem.setAttribute('d', this.stylesList[i].d || 'M0 0');
+            shapeString += " C" + mat.applyToPointStringified(pathNodes.o[i - 1][0], pathNodes.o[i - 1][1]) + " " + mat.applyToPointStringified(pathNodes.i[i][0], pathNodes.i[i][1]) + " " + mat.applyToPointStringified(pathNodes.v[i][0], pathNodes.v[i][1]);
         }
-    }
-};
-
-
-_f.prototype.renderShape = function(items, data, container) {
-    //TODO: find out why a container could be missing
-    var i, len = items.length - 1;
-    var ty;
-    for(i=0;i<=len;i+=1){
-        ty = items[i].ty;
-        if(ty == 'tr'){
-            if(this.firstFrame || data[i].transform.op.mdf && container){
-                container.setAttribute('opacity',data[i].transform.op.v);
-            }
-            if(this.firstFrame || data[i].transform.mProps.mdf && container){
-                container.setAttribute('transform',data[i].transform.mProps.v.to2dCSS());
-            }
-        }else if(items[i]._render && (ty == 'sh' || ty == 'el' || ty == 'rc' || ty == 'sr')){
-            this.renderPath(data[i]);
-        }else if(ty == 'fl'){
-            this.renderFill(items[i],data[i]);
-        }else if(ty == 'gf'){
-            this.renderGradient(items[i],data[i]);
-        }else if(ty == 'gs'){
-            this.renderGradient(items[i],data[i]);
-            this.renderStroke(items[i],data[i]);
-        }else if(ty == 'st'){
-            this.renderStroke(items[i],data[i]);
-        }else if(ty == 'gr'){
-            this.renderShape(items[i].it,data[i].it, data[i].gr);
-        }else if(ty == 'tm'){
-            //
-        }
-    }
-
-};
-
-_f.prototype.buildShapeString = function(pathNodes, length, closed, mat) {
-    var i, shapeString = '';
-    for(i = 1; i < length; i += 1) {
-        if (i === 1) {
+        if (length === 1) {
             shapeString += " M" + mat.applyToPointStringified(pathNodes.v[0][0], pathNodes.v[0][1]);
         }
-        shapeString += " C" + mat.applyToPointStringified(pathNodes.o[i - 1][0], pathNodes.o[i - 1][1]) + " " + mat.applyToPointStringified(pathNodes.i[i][0], pathNodes.i[i][1]) + " " + mat.applyToPointStringified(pathNodes.v[i][0], pathNodes.v[i][1]);
-    }
-    if (length === 1) {
-        shapeString += " M" + mat.applyToPointStringified(pathNodes.v[0][0], pathNodes.v[0][1]);
-    }
-    if (closed && length) {
-        shapeString += " C" + mat.applyToPointStringified(pathNodes.o[i - 1][0], pathNodes.o[i - 1][1]) + " " + mat.applyToPointStringified(pathNodes.i[0][0], pathNodes.i[0][1]) + " " + mat.applyToPointStringified(pathNodes.v[0][0], pathNodes.v[0][1]);
-        shapeString += 'z';
-    }
-    return shapeString;
-};
-
-_f.prototype.renderPath = function(itemData){
-    var j, jLen,pathStringTransformed,redraw,pathNodes,l, lLen = itemData.styles.length;
-    var lvl = itemData.lvl;
-    var paths, mat, props, iterations, k;
-    for(l=0;l<lLen;l+=1){
-        redraw = itemData.sh.mdf || this.firstFrame;
-        if(itemData.styles[l].lvl < lvl){
-            mat = this.mHelper.reset();
-            iterations = lvl - itemData.styles[l].lvl;
-            k = itemData.transformers.length-1;
-            while(iterations > 0) {
-                redraw = itemData.transformers[k].mProps.mdf || redraw;
-                props = itemData.transformers[k].mProps.v.props;
-                mat.transform(props[0],props[1],props[2],props[3],props[4],props[5],props[6],props[7],props[8],props[9],props[10],props[11],props[12],props[13],props[14],props[15]);
-                iterations --;
-                k --;
-            }
-        } else {
-            mat = this.identityMatrix;
+        if (closed && length) {
+            shapeString += " C" + mat.applyToPointStringified(pathNodes.o[i - 1][0], pathNodes.o[i - 1][1]) + " " + mat.applyToPointStringified(pathNodes.i[0][0], pathNodes.i[0][1]) + " " + mat.applyToPointStringified(pathNodes.v[0][0], pathNodes.v[0][1]);
+            shapeString += 'z';
         }
-        paths = itemData.sh.paths;
-        jLen = paths._length;
-        if(redraw){
-            pathStringTransformed = '';
-            for(j=0;j<jLen;j+=1){
-                pathNodes = paths.shapes[j];
-                if(pathNodes && pathNodes._length){
-                    pathStringTransformed += this.buildShapeString(pathNodes, pathNodes._length, pathNodes.c, mat);
-                }
-            }
-            itemData.caches[l] = pathStringTransformed;
-        } else {
-            pathStringTransformed = itemData.caches[l];
-        }
-        itemData.styles[l].d += pathStringTransformed;
-        itemData.styles[l].mdf = redraw || itemData.styles[l].mdf;
+        return shapeString;
     }
-};
-
-_f.prototype.renderFill = function(styleData,itemData){
-    var styleElem = itemData.style;
-
-    if(itemData.c.mdf || this.firstFrame){
-        styleElem.pElem.setAttribute('fill','rgb('+bm_floor(itemData.c.v[0])+','+bm_floor(itemData.c.v[1])+','+bm_floor(itemData.c.v[2])+')');
-    }
-    if(itemData.o.mdf || this.firstFrame){
-        styleElem.pElem.setAttribute('fill-opacity',itemData.o.v);
-    }
-};
-
-_f.prototype.renderGradient = function(styleData, itemData) {
-    var gfill = itemData.gf;
-    var hasOpacity = itemData.g._hasOpacity;
-    var pt1 = itemData.s.v, pt2 = itemData.e.v;
-
-    if (itemData.o.mdf || this.firstFrame) {
-        var attr = styleData.ty === 'gf' ? 'fill-opacity' : 'stroke-opacity';
-        itemData.style.pElem.setAttribute(attr, itemData.o.v);
-    }
-    if (itemData.s.mdf || this.firstFrame) {
-        var attr1 = styleData.t === 1 ? 'x1' : 'cx';
-        var attr2 = attr1 === 'x1' ? 'y1' : 'cy';
-        gfill.setAttribute(attr1, pt1[0]);
-        gfill.setAttribute(attr2, pt1[1]);
-        if (hasOpacity && !itemData.g._collapsable) {
-            itemData.of.setAttribute(attr1, pt1[0]);
-            itemData.of.setAttribute(attr2, pt1[1]);
-        }
-    }
-    var stops, i, len, stop;
-    if (itemData.g.cmdf || this.firstFrame) {
-        stops = itemData.cst;
-        var cValues = itemData.g.c;
-        len = stops.length;
-        for (i = 0; i < len; i += 1){
-            stop = stops[i];
-            stop.setAttribute('offset', cValues[i * 4] + '%');
-            stop.setAttribute('stop-color','rgb('+ cValues[i * 4 + 1] + ',' + cValues[i * 4 + 2] + ','+cValues[i * 4 + 3] + ')');
-        }
-    }
-    if (hasOpacity && (itemData.g.omdf || this.firstFrame)) {
-        var oValues = itemData.g.o;
-        if(itemData.g._collapsable) {
-            stops = itemData.cst;
-        } else {
-            stops = itemData.ost;
-        }
-        len = stops.length;
-        for (i = 0; i < len; i += 1) {
-            stop = stops[i];
-            if(!itemData.g._collapsable) {
-                stop.setAttribute('offset', oValues[i * 2] + '%');
-            }
-            stop.setAttribute('stop-opacity', oValues[i * 2 + 1]);
-        }
-    }
-    if (styleData.t === 1) {
-        if (itemData.e.mdf  || this.firstFrame) {
-            gfill.setAttribute('x2', pt2[0]);
-            gfill.setAttribute('y2', pt2[1]);
-            if (hasOpacity && !itemData.g._collapsable) {
-                itemData.of.setAttribute('x2', pt2[0]);
-                itemData.of.setAttribute('y2', pt2[1]);
-            }
-        }
-    } else {
-        var rad;
-        if (itemData.s.mdf || itemData.e.mdf || this.firstFrame) {
-            rad = Math.sqrt(Math.pow(pt1[0] - pt2[0], 2) + Math.pow(pt1[1] - pt2[1], 2));
-            gfill.setAttribute('r', rad);
-            if(hasOpacity && !itemData.g._collapsable){
-                itemData.of.setAttribute('r', rad);
-            }
-        }
-        if (itemData.e.mdf || itemData.h.mdf || itemData.a.mdf || this.firstFrame) {
-            if (!rad) {
-                rad = Math.sqrt(Math.pow(pt1[0] - pt2[0], 2) + Math.pow(pt1[1] - pt2[1], 2));
-            }
-            var ang = Math.atan2(pt2[1] - pt1[1], pt2[0] - pt1[0]);
-
-            var percent = itemData.h.v >= 1 ? 0.99 : itemData.h.v <= -1 ? -0.99: itemData.h.v;
-            var dist = rad * percent;
-            var x = Math.cos(ang + itemData.a.v) * dist + pt1[0];
-            var y = Math.sin(ang + itemData.a.v) * dist + pt1[1];
-            gfill.setAttribute('fx', x);
-            gfill.setAttribute('fy', y);
-            if (hasOpacity && !itemData.g._collapsable) {
-                itemData.of.setAttribute('fx', x);
-                itemData.of.setAttribute('fy', y);
-            }
-        }
-        //gfill.setAttribute('fy','200');
-    }
-};
-
-_f.prototype.renderStroke = function(styleData, itemData) {
-    var styleElem = itemData.style;
-    var d = itemData.d;
-    if (d && (d.mdf || this.firstFrame)) {
-        styleElem.pElem.setAttribute('stroke-dasharray', d.dashStr);
-        styleElem.pElem.setAttribute('stroke-dashoffset', d.dashoffset[0]);
-    }
-    if(itemData.c && (itemData.c.mdf || this.firstFrame)){
-        styleElem.pElem.setAttribute('stroke','rgb(' + bm_floor(itemData.c.v[0]) + ',' + bm_floor(itemData.c.v[1]) + ',' + bm_floor(itemData.c.v[2]) + ')');
-    }
-    if(itemData.o.mdf || this.firstFrame){
-        styleElem.pElem.setAttribute('stroke-opacity', itemData.o.v);
-    }
-    if(itemData.w.mdf || this.firstFrame){
-        styleElem.pElem.setAttribute('stroke-width', itemData.w.v);
-        if(styleElem.msElem){
-            styleElem.msElem.setAttribute('stroke-width', itemData.w.v);
-        }
-    }
-};
-
-_f.prototype.destroy = function(){
-    this.destroy_e();
-    this.shapeData = null;
-    this.itemsData = null;
-};
-
+}
 function _k(){
 }
 
-_k.prototype.initElement = function(data,_x,comp){
+_k.prototype._cz = function(data,_x,comp){
     this.lettersChangedFlag = true;
     this.initFrame();
     this.initBaseData(data, _x, comp);
     this.textAnimator = new _bl(data.t, this.renderType, this);
-    this.textProperty = new _ar(this, data.t, this.dynamicProperties);
+    this.textProperty = new _ar(this, data.t, this._co);
     this.initTransform(data, _x, comp);
     this.initHierarchy();
     this.initRenderable();
@@ -7885,15 +6785,15 @@
     this.createContainerElements();
     this.addMasks();
     this.createContent();
-    this.textAnimator.searchProperties(this.dynamicProperties);
+    this.textAnimator.searchProperties(this._co);
 };
 
 _k.prototype._az = function(num) {
     this.prepareRenderableFrame(num);
     this.prepareProperties(num, this.isInRange);
-    if(this.textProperty.mdf || this.textProperty.firstFrame) {
+    if(this.textProperty.mdf || this.textProperty._ch) {
         this.buildNewText();
-        this.textProperty.firstFrame = false;
+        this.textProperty._ch = false;
     }
 }
 
@@ -7941,9 +6841,9 @@
 };
 function _g(){}
 
-extendPrototype([_e, _af, _ad, _ac, RenderableDOMElement], _g);
+extendPrototype([_e, _af, _ad, _ac, _ci], _g);
 
-_g.prototype.initElement = function(data,_x,comp) {
+_g.prototype._cz = function(data,_x,comp) {
     this.initFrame();
     this.initBaseData(data, _x, comp);
     this.initTransform(data, _x, comp);
@@ -7987,11 +6887,11 @@
         this.renderedFrame = num/this.data.sr;
     }
     var i,len = this._br.length;
-    if(!this.completeLayers){
+    if(!this._db){
         this.checkLayers(this.renderedFrame);
     }
     for( i = 0; i < len; i+=1 ){
-        if(this.completeLayers || this._br[i]){
+        if(this._db || this._br[i]){
             this._br[i]._az(this.renderedFrame - this.layers[i].st);
         }
     }
@@ -8000,7 +6900,7 @@
 _g.prototype.renderInnerContent = function() {
     var i,len = this.layers.length;
     for( i = 0; i < len; i += 1 ){
-        if(this.completeLayers || this._br[i]){
+        if(this._db || this._br[i]){
             this._br[i]._ba();
         }
     }
@@ -8030,16 +6930,16 @@
 
 function _h(data,_x,comp){
     this.assetData = _x.getAssetData(data.refId);
-    this.initElement(data,_x,comp);
+    this._cz(data,_x,comp);
 }
 
-extendPrototype([_e,_af,_d,_ad,_ac,RenderableDOMElement], _h);
+extendPrototype([_e,_af,_d,_ad,_ac,_ci], _h);
 
 _h.prototype.createContent = function(){
 
     var assetPath = this._x.getAssetsPath(this.assetData);
 
-    this._cc = createNS('image');
+    this._cc = _ct('image');
     this._cc.setAttribute('width',this.assetData.w+"px");
     this._cc.setAttribute('height',this.assetData.h+"px");
     this._cc.setAttribute('preserveAspectRatio','xMidYMid slice');
@@ -8051,13 +6951,13 @@
 };
 
 function _j(data,_x,comp){
-    this.initElement(data,_x,comp);
+    this._cz(data,_x,comp);
 }
 extendPrototype([_h], _j);
 
 _j.prototype.createContent = function(){
 
-    var rect = createNS('rect');
+    var rect = _ct('rect');
     ////rect.style.width = this.data.sw;
     ////rect.style.height = this.data.sh;
     ////rect.style.fill = this.data.sc;
@@ -8069,24 +6969,24 @@
 function SVGCompElement(data,_x,comp){
     this.layers = data.layers;
     this.supports3d = true;
-    this.completeLayers = false;
-    this.pendingElements = [];
-    this._br = this.layers ? Array.apply(null,{length:this.layers.length}) : [];
-    //this._bx = createNS('g');
-    this.initElement(data,_x,comp);
-    this.tm = data.tm ? _ai._bo(this,data.tm,0,_x.frameRate,this.dynamicProperties) : {_placeholder:true};
+    this._db = false;
+    this._dc = [];
+    this._br = this.layers ? _cv(this.layers.length) : [];
+    //this._bx = _ct('g');
+    this._cz(data,_x,comp);
+    this.tm = data.tm ? _ai._bo(this,data.tm,0,_x.frameRate,this._co) : {_placeholder:true};
 }
 
 extendPrototype([_ao, _g, _d], SVGCompElement);
-function SVGTextElement(data,_x,comp){
+function _cw(data,_x,comp){
     this.textSpans = [];
     this.renderType = 'svg';
-    this.initElement(data,_x,comp);
+    this._cz(data,_x,comp);
 }
 
-extendPrototype([_e,_af,_d,_ad,_ac,RenderableDOMElement,_k], SVGTextElement);
+extendPrototype([_e,_af,_d,_ad,_ac,_ci,_k], _cw);
 
-SVGTextElement.prototype.createContent = function(){
+_cw.prototype.createContent = function(){
 
     if(this.data.ln){
         this._bx.setAttribute('id',this.data.ln);
@@ -8094,16 +6994,16 @@
     if(this.data.cl){
         this._bx.setAttribute('class',this.data.cl);
     }
-    if (this.data.singleShape && !this._x.fontManager.chars) {
-        this.textContainer = createNS('text');
+    if (this.data.singleShape && !this._x._cr.chars) {
+        this.textContainer = _ct('text');
     }
 };
 
-SVGTextElement.prototype.buildNewText = function(){
+_cw.prototype.buildNewText = function(){
     var i, len;
 
     var documentData = this.textProperty.currentData;
-    this._bt = Array.apply(null,{length:documentData ? documentData.l.length : 0});
+    this._bt = _cv(documentData ? documentData.l.length : 0);
     if(documentData.fc) {
         this._bx.setAttribute('fill', this.buildColor(documentData.fc));
     }else{
@@ -8114,7 +7014,7 @@
         this._bx.setAttribute('stroke-width', documentData.sw);
     }
     this._bx.setAttribute('font-size', documentData.s);
-    var fontData = this._x.fontManager.getFontByName(documentData.f);
+    var fontData = this._x._cr.getFontByName(documentData.f);
     if(fontData.fClass){
         this._bx.setAttribute('class',fontData.fClass);
     } else {
@@ -8125,7 +7025,7 @@
     }
 
     var letters = documentData.l || [];
-    var usesGlyphs = this._x.fontManager.chars;
+    var usesGlyphs = this._x._cr.chars;
     len = letters.length;
     if(!len){
         return;
@@ -8155,7 +7055,7 @@
         len = textContent.length;
         var yPos = documentData.ps ? documentData.ps[1] + documentData.ascent : 0;
         for ( i = 0; i < len; i += 1) {
-            tSpan = this.textSpans[i] || createNS('tspan');
+            tSpan = this.textSpans[i] || _ct('tspan');
             tSpan.textContent = textContent[i];
             tSpan.setAttribute('x', 0);
             tSpan.setAttribute('y', yPos);
@@ -8171,7 +7071,7 @@
         var shapeData, charData;
         for (i = 0; i < len; i += 1) {
             if(!usesGlyphs || !singleShape || i === 0){
-                tSpan = cachedSpansLength > i ? this.textSpans[i] : createNS(usesGlyphs?'path':'text');
+                tSpan = cachedSpansLength > i ? this.textSpans[i] : _ct(usesGlyphs?'path':'text');
                 if (cachedSpansLength <= i) {
                     tSpan.setAttribute('stroke-linecap', 'butt');
                     tSpan.setAttribute('stroke-linejoin','round');
@@ -8197,7 +7097,7 @@
                     //xPos += letters[i].val === ' ' ? 0 : trackingOffset;
                     xPos += trackingOffset;
                 }
-                charData = this._x.fontManager.getCharData(documentData.t.charAt(i), fontData.fStyle, this._x.fontManager.getFontByName(documentData.f).fFamily);
+                charData = this._x._cr.getCharData(documentData.t.charAt(i), fontData.fStyle, this._x._cr.getFontByName(documentData.f).fFamily);
                 shapeData = charData && charData.data || {};
                 shapes = shapeData.shapes ? shapeData.shapes[0].it : [];
                 if(!singleShape){
@@ -8223,7 +7123,7 @@
     this._sizeChanged = true;
 }
 
-SVGTextElement.prototype.sourceRectAtTime = function(time){
+_cw.prototype.sourceRectAtTime = function(time){
     this._az(this.comp.renderedFrame - this.data.st);
     this.renderInnerContent();
     if(this._sizeChanged){
@@ -8239,7 +7139,7 @@
     return this.bbox;
 }
 
-SVGTextElement.prototype.renderInnerContent = function(){
+_cw.prototype.renderInnerContent = function(){
 
     if(!this.data.singleShape){
         this.textAnimator.getMeasures(this.textProperty.currentData, this.lettersChangedFlag);
@@ -8277,45 +7177,472 @@
         }
     }
 }
-function _bb(filter, filterManager){
-    this.filterManager = filterManager;
-    var feColorMatrix = createNS('feColorMatrix');
+function SVGShapeElement(data,_x,comp){
+    //List of drawable _br
+    this.shapes = [];
+    // Full shape data
+    this.shapesData = data.shapes;
+    //List of styles that will be applied to shapes
+    this.stylesList = [];
+    //List of modifiers that will be applied to shapes
+    this.shapeModifiers = [];
+    //List of items in shape tree
+    this.itemsData = [];
+    //List of items in previous shape tree
+    this.processedElements = [];
+    this._cz(data,_x,comp);
+    //Moving any property that doesn't get too much access after initialization because of v8 way of handling more than 10 properties.
+    // List of _br that have been created
+    this.prevViewData = [];
+}
+
+extendPrototype([_e,_af,_d,_f,_ad,_ac,_ci], SVGShapeElement);
+
+SVGShapeElement.prototype.initSecondaryElement = function() {
+}
+
+SVGShapeElement.prototype.identityMatrix = new Matrix();
+
+SVGShapeElement.prototype.buildExpressionInterface = function(){};
+
+SVGShapeElement.prototype.createContent = function(){
+    this.searchShapes(this.shapesData,this.itemsData,this.prevViewData,this._bx,this._co, 0, [], true);
+};
+
+SVGShapeElement.prototype.createStyleElement = function(data, level, _co){
+    //TODO: prevent drawing of hidden styles
+    var elementData;
+    var styleOb = new SVGStyleData(data, level);
+
+    var pathElement = styleOb.pElem;
+    if(data.ty === 'st') {
+        elementData = new SVGStrokeStyleData(this, data, _co, styleOb);
+    } else if(data.ty === 'fl') {
+        elementData = new SVGFillStyleData(this, data, _co, styleOb);
+    } else if(data.ty === 'gf' || data.ty === 'gs') {
+        var gradientConstructor = data.ty === 'gf' ? _ck : _cj;
+        elementData = new gradientConstructor(this, data, _co, styleOb);
+        this._x.defs.appendChild(elementData.gf);
+        if (elementData.maskId) {
+            this._x.defs.appendChild(elementData.ms);
+            this._x.defs.appendChild(elementData.of);
+            pathElement.setAttribute('mask','url(#' + elementData.maskId + ')');
+        }
+    }
+    
+    if(data.ty === 'st' || data.ty === 'gs') {
+        pathElement.setAttribute('stroke-linecap', this.lcEnum[data.lc] || 'round');
+        pathElement.setAttribute('stroke-linejoin',this.ljEnum[data.lj] || 'round');
+        pathElement.setAttribute('fill-opacity','0');
+        if(data.lj === 1) {
+            pathElement.setAttribute('stroke-miterlimit',data.ml);
+        }
+    }
+
+    if(data.r === 2) {
+        pathElement.setAttribute('fill-rule', 'evenodd');
+    }
+
+    if(data.ln){
+        pathElement.setAttribute('id',data.ln);
+    }
+    if(data.cl){
+        pathElement.setAttribute('class',data.cl);
+    }
+    this.stylesList.push(styleOb);
+    return elementData;
+}
+
+SVGShapeElement.prototype.createGroupElement = function(data) {
+    var elementData = new ShapeGroupData();
+    if(data.ln){
+        elementData.gr.setAttribute('id',data.ln);
+    }
+    return elementData;
+}
+
+SVGShapeElement.prototype._cp = function(data, _co) {
+    return new SVGTransformData(_ag._bj(this,data,_co), _ai._bo(this,data.o,0,0.01,_co))
+}
+
+SVGShapeElement.prototype.createShapeElement = function(data, ownTransformers, level, _co) {
+    var ty = 4;
+    if(data.ty === 'rc'){
+        ty = 5;
+    }else if(data.ty === 'el'){
+        ty = 6;
+    }else if(data.ty === 'sr'){
+        ty = 7;
+    }
+    var shapeProperty = _ah._bp(this,data,ty,_co);
+    var elementData = new SVGShapeData(ownTransformers, level, shapeProperty)
+    this.shapes.push(elementData.sh);
+    this.addShapeToModifiers(elementData);
+    return elementData;
+}
+
+SVGShapeElement.prototype.setElementStyles = function(elementData){
+    var arr = elementData.styles;
+    var j, jLen = this.stylesList.length;
+    for (j = 0; j < jLen; j += 1) {
+        if (!this.stylesList[j].closed) {
+            arr.push(this.stylesList[j]);
+        }
+    }
+}
+
+SVGShapeElement.prototype.reloadShapes = function(){
+    this._ch = true;
+    var i, len = this.itemsData.length;
+    for( i = 0; i < len; i += 1) {
+        this.prevViewData[i] = this.itemsData[i];
+    }
+    this.searchShapes(this.shapesData,this.itemsData,this.prevViewData,this._bx,this._co, 0, [], true);
+    var i, len = this._co.length;
+    for(i = 0; i < len; i += 1) {
+        this._co[i].getValue();
+    }
+    this.renderModifiers();
+}
+
+SVGShapeElement.prototype.searchShapes = function(arr,itemsData,prevViewData,container,_co, level, transformers, render){
+    var ownTransformers = [].concat(transformers);
+    var i, len = arr.length - 1;
+    var j, jLen;
+    var ownStyles = [], ownModifiers = [], styleOb, currentTransform, modifier, processedPos;
+    for(i=len;i>=0;i-=1){
+        processedPos = this.searchProcessedElement(arr[i]);
+        if(!processedPos){
+            arr[i]._render = render;
+        } else {
+            itemsData[i] = prevViewData[processedPos - 1];
+        }
+        if(arr[i].ty == 'fl' || arr[i].ty == 'st' || arr[i].ty == 'gf' || arr[i].ty == 'gs'){
+            if(!processedPos){
+                itemsData[i] = this.createStyleElement(arr[i], level, _co);
+            } else {
+                itemsData[i].style.closed = false;
+            }
+            if(arr[i]._render){
+                container.appendChild(itemsData[i].style.pElem);
+            }
+            ownStyles.push(itemsData[i].style);
+        }else if(arr[i].ty == 'gr'){
+            if(!processedPos){
+                itemsData[i] = this.createGroupElement(arr[i]);
+            } else {
+                jLen = itemsData[i].it.length;
+                for(j=0;j<jLen;j+=1){
+                    itemsData[i].prevViewData[j] = itemsData[i].it[j];
+                }
+            }
+            this.searchShapes(arr[i].it,itemsData[i].it,itemsData[i].prevViewData,itemsData[i].gr,_co, level + 1, ownTransformers, render);
+            if(arr[i]._render){
+                container.appendChild(itemsData[i].gr);
+            }
+        }else if(arr[i].ty == 'tr'){
+            if(!processedPos){
+                itemsData[i] = this._cp(arr[i], _co);
+            }
+            currentTransform = itemsData[i].transform;
+            ownTransformers.push(currentTransform);
+        }else if(arr[i].ty == 'sh' || arr[i].ty == 'rc' || arr[i].ty == 'el' || arr[i].ty == 'sr'){
+            if(!processedPos){
+                itemsData[i] = this.createShapeElement(arr[i], ownTransformers, level, _co);
+            }
+            this.setElementStyles(itemsData[i]);
+
+        }else if(arr[i].ty == 'tm' || arr[i].ty == 'rd' || arr[i].ty == 'ms'){
+            if(!processedPos){
+                modifier = _as.getModifier(arr[i].ty);
+                modifier.init(this,arr[i],_co);
+                itemsData[i] = modifier;
+                this.shapeModifiers.push(modifier);
+            } else {
+                modifier = itemsData[i];
+                modifier.closed = false;
+            }
+            ownModifiers.push(modifier);
+        }else if(arr[i].ty == 'rp'){
+            if(!processedPos){
+                modifier = _as.getModifier(arr[i].ty);
+                itemsData[i] = modifier;
+                modifier.init(this,arr,i,itemsData,_co);
+                this.shapeModifiers.push(modifier);
+                render = false;
+            }else{
+                modifier = itemsData[i];
+                modifier.closed = true;
+            }
+            ownModifiers.push(modifier);
+        }
+        this.addProcessedElement(arr[i], i + 1);
+    }
+    len = ownStyles.length;
+    for(i=0;i<len;i+=1){
+        ownStyles[i].closed = true;
+    }
+    len = ownModifiers.length;
+    for(i=0;i<len;i+=1){
+        ownModifiers[i].closed = true;
+    }
+};
+
+SVGShapeElement.prototype.renderInnerContent = function() {
+    this.renderModifiers();
+    var i, len = this.stylesList.length;
+    for(i=0;i<len;i+=1){
+        this.stylesList[i].reset();
+    }
+    this.renderShape(this.shapesData,this.itemsData, null);
+
+    for (i = 0; i < len; i += 1) {
+        if (this.stylesList[i].mdf || this._ch) {
+            if(this.stylesList[i].msElem){
+                this.stylesList[i].msElem.setAttribute('d', this.stylesList[i].d);
+                //Adding M0 0 fixes same mask bug on all browsers
+                this.stylesList[i].d = 'M0 0' + this.stylesList[i].d;
+            }
+            this.stylesList[i].pElem.setAttribute('d', this.stylesList[i].d || 'M0 0');
+        }
+    }
+};
+
+
+SVGShapeElement.prototype.renderShape = function(items, data, container) {
+    //TODO: find out why a container could be missing
+    var i, len = items.length - 1;
+    var ty;
+    for(i=0;i<=len;i+=1){
+        ty = items[i].ty;
+        if(ty == 'tr'){
+            if(this._ch || data[i].transform.op.mdf && container){
+                container.setAttribute('opacity',data[i].transform.op.v);
+            }
+            if(this._ch || data[i].transform.mProps.mdf && container){
+                container.setAttribute('transform',data[i].transform.mProps.v.to2dCSS());
+            }
+        }else if(items[i]._render && (ty == 'sh' || ty == 'el' || ty == 'rc' || ty == 'sr')){
+            this.renderPath(data[i]);
+        }else if(ty == 'fl'){
+            this.renderFill(items[i],data[i]);
+        }else if(ty == 'gf'){
+            this.renderGradient(items[i],data[i]);
+        }else if(ty == 'gs'){
+            this.renderGradient(items[i],data[i]);
+            this.renderStroke(items[i],data[i]);
+        }else if(ty == 'st'){
+            this.renderStroke(items[i],data[i]);
+        }else if(ty == 'gr'){
+            this.renderShape(items[i].it,data[i].it, data[i].gr);
+        }else if(ty == 'tm'){
+            //
+        }
+    }
+
+};
+
+SVGShapeElement.prototype.renderPath = function(itemData){
+    var j, jLen,pathStringTransformed,redraw,pathNodes,l, lLen = itemData.styles.length;
+    var lvl = itemData.lvl;
+    var paths, mat, props, iterations, k;
+    for(l=0;l<lLen;l+=1){
+        redraw = itemData.sh.mdf || this._ch;
+        if(itemData.styles[l].lvl < lvl){
+            mat = this.mHelper.reset();
+            iterations = lvl - itemData.styles[l].lvl;
+            k = itemData.transformers.length-1;
+            while(iterations > 0) {
+                redraw = itemData.transformers[k].mProps.mdf || redraw;
+                props = itemData.transformers[k].mProps.v.props;
+                mat.transform(props[0],props[1],props[2],props[3],props[4],props[5],props[6],props[7],props[8],props[9],props[10],props[11],props[12],props[13],props[14],props[15]);
+                iterations --;
+                k --;
+            }
+        } else {
+            mat = this.identityMatrix;
+        }
+        paths = itemData.sh.paths;
+        jLen = paths._length;
+        if(redraw){
+            pathStringTransformed = '';
+            for(j=0;j<jLen;j+=1){
+                pathNodes = paths.shapes[j];
+                if(pathNodes && pathNodes._length){
+                    pathStringTransformed += this.buildShapeString(pathNodes, pathNodes._length, pathNodes.c, mat);
+                }
+            }
+            itemData.caches[l] = pathStringTransformed;
+        } else {
+            pathStringTransformed = itemData.caches[l];
+        }
+        itemData.styles[l].d += pathStringTransformed;
+        itemData.styles[l].mdf = redraw || itemData.styles[l].mdf;
+    }
+};
+
+SVGShapeElement.prototype.renderFill = function(styleData,itemData){
+    var styleElem = itemData.style;
+
+    if(itemData.c.mdf || this._ch){
+        styleElem.pElem.setAttribute('fill','rgb('+bm_floor(itemData.c.v[0])+','+bm_floor(itemData.c.v[1])+','+bm_floor(itemData.c.v[2])+')');
+    }
+    if(itemData.o.mdf || this._ch){
+        styleElem.pElem.setAttribute('fill-opacity',itemData.o.v);
+    }
+};
+
+SVGShapeElement.prototype.renderGradient = function(styleData, itemData) {
+    var gfill = itemData.gf;
+    var hasOpacity = itemData.g._hasOpacity;
+    var pt1 = itemData.s.v, pt2 = itemData.e.v;
+
+    if (itemData.o.mdf || this._ch) {
+        var attr = styleData.ty === 'gf' ? 'fill-opacity' : 'stroke-opacity';
+        itemData.style.pElem.setAttribute(attr, itemData.o.v);
+    }
+    if (itemData.s.mdf || this._ch) {
+        var attr1 = styleData.t === 1 ? 'x1' : 'cx';
+        var attr2 = attr1 === 'x1' ? 'y1' : 'cy';
+        gfill.setAttribute(attr1, pt1[0]);
+        gfill.setAttribute(attr2, pt1[1]);
+        if (hasOpacity && !itemData.g._collapsable) {
+            itemData.of.setAttribute(attr1, pt1[0]);
+            itemData.of.setAttribute(attr2, pt1[1]);
+        }
+    }
+    var stops, i, len, stop;
+    if (itemData.g.cmdf || this._ch) {
+        stops = itemData.cst;
+        var cValues = itemData.g.c;
+        len = stops.length;
+        for (i = 0; i < len; i += 1){
+            stop = stops[i];
+            stop.setAttribute('offset', cValues[i * 4] + '%');
+            stop.setAttribute('stop-color','rgb('+ cValues[i * 4 + 1] + ',' + cValues[i * 4 + 2] + ','+cValues[i * 4 + 3] + ')');
+        }
+    }
+    if (hasOpacity && (itemData.g.omdf || this._ch)) {
+        var oValues = itemData.g.o;
+        if(itemData.g._collapsable) {
+            stops = itemData.cst;
+        } else {
+            stops = itemData.ost;
+        }
+        len = stops.length;
+        for (i = 0; i < len; i += 1) {
+            stop = stops[i];
+            if(!itemData.g._collapsable) {
+                stop.setAttribute('offset', oValues[i * 2] + '%');
+            }
+            stop.setAttribute('stop-opacity', oValues[i * 2 + 1]);
+        }
+    }
+    if (styleData.t === 1) {
+        if (itemData.e.mdf  || this._ch) {
+            gfill.setAttribute('x2', pt2[0]);
+            gfill.setAttribute('y2', pt2[1]);
+            if (hasOpacity && !itemData.g._collapsable) {
+                itemData.of.setAttribute('x2', pt2[0]);
+                itemData.of.setAttribute('y2', pt2[1]);
+            }
+        }
+    } else {
+        var rad;
+        if (itemData.s.mdf || itemData.e.mdf || this._ch) {
+            rad = Math.sqrt(Math.pow(pt1[0] - pt2[0], 2) + Math.pow(pt1[1] - pt2[1], 2));
+            gfill.setAttribute('r', rad);
+            if(hasOpacity && !itemData.g._collapsable){
+                itemData.of.setAttribute('r', rad);
+            }
+        }
+        if (itemData.e.mdf || itemData.h.mdf || itemData.a.mdf || this._ch) {
+            if (!rad) {
+                rad = Math.sqrt(Math.pow(pt1[0] - pt2[0], 2) + Math.pow(pt1[1] - pt2[1], 2));
+            }
+            var ang = Math.atan2(pt2[1] - pt1[1], pt2[0] - pt1[0]);
+
+            var percent = itemData.h.v >= 1 ? 0.99 : itemData.h.v <= -1 ? -0.99: itemData.h.v;
+            var dist = rad * percent;
+            var x = Math.cos(ang + itemData.a.v) * dist + pt1[0];
+            var y = Math.sin(ang + itemData.a.v) * dist + pt1[1];
+            gfill.setAttribute('fx', x);
+            gfill.setAttribute('fy', y);
+            if (hasOpacity && !itemData.g._collapsable) {
+                itemData.of.setAttribute('fx', x);
+                itemData.of.setAttribute('fy', y);
+            }
+        }
+        //gfill.setAttribute('fy','200');
+    }
+};
+
+SVGShapeElement.prototype.renderStroke = function(styleData, itemData) {
+    var styleElem = itemData.style;
+    var d = itemData.d;
+    if (d && (d.mdf || this._ch)) {
+        styleElem.pElem.setAttribute('stroke-dasharray', d.dashStr);
+        styleElem.pElem.setAttribute('stroke-dashoffset', d.dashoffset[0]);
+    }
+    if(itemData.c && (itemData.c.mdf || this._ch)){
+        styleElem.pElem.setAttribute('stroke','rgb(' + bm_floor(itemData.c.v[0]) + ',' + bm_floor(itemData.c.v[1]) + ',' + bm_floor(itemData.c.v[2]) + ')');
+    }
+    if(itemData.o.mdf || this._ch){
+        styleElem.pElem.setAttribute('stroke-opacity', itemData.o.v);
+    }
+    if(itemData.w.mdf || this._ch){
+        styleElem.pElem.setAttribute('stroke-width', itemData.w.v);
+        if(styleElem.msElem){
+            styleElem.msElem.setAttribute('stroke-width', itemData.w.v);
+        }
+    }
+};
+
+SVGShapeElement.prototype.destroy = function(){
+    this.destroy_e();
+    this.shapeData = null;
+    this.itemsData = null;
+};
+
+function _bb(filter, _cl){
+    this._cl = _cl;
+    var feColorMatrix = _ct('feColorMatrix');
     feColorMatrix.setAttribute('type','matrix');
     feColorMatrix.setAttribute('color-interpolation-filters','linearRGB');
     feColorMatrix.setAttribute('values','0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0 0 0 1 0');
     feColorMatrix.setAttribute('result','f1');
     filter.appendChild(feColorMatrix);
-    feColorMatrix = createNS('feColorMatrix');
+    feColorMatrix = _ct('feColorMatrix');
     feColorMatrix.setAttribute('type','matrix');
     feColorMatrix.setAttribute('color-interpolation-filters','sRGB');
     feColorMatrix.setAttribute('values','1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0');
     feColorMatrix.setAttribute('result','f2');
     filter.appendChild(feColorMatrix);
     this.matrixFilter = feColorMatrix;
-    if(filterManager.effectElements[2].p.v !== 100 || filterManager.effectElements[2].p.k){
-        var feMerge = createNS('feMerge');
+    if(_cl._cm[2].p.v !== 100 || _cl._cm[2].p.k){
+        var feMerge = _ct('feMerge');
         filter.appendChild(feMerge);
         var feMergeNode;
-        feMergeNode = createNS('feMergeNode');
+        feMergeNode = _ct('feMergeNode');
         feMergeNode.setAttribute('in','SourceGraphic');
         feMerge.appendChild(feMergeNode);
-        feMergeNode = createNS('feMergeNode');
+        feMergeNode = _ct('feMergeNode');
         feMergeNode.setAttribute('in','f2');
         feMerge.appendChild(feMergeNode);
     }
 }
 
 _bb.prototype._ba = function(forceRender){
-    if(forceRender || this.filterManager.mdf){
-        var colorBlack = this.filterManager.effectElements[0].p.v;
-        var colorWhite = this.filterManager.effectElements[1].p.v;
-        var opacity = this.filterManager.effectElements[2].p.v/100;
+    if(forceRender || this._cl.mdf){
+        var colorBlack = this._cl._cm[0].p.v;
+        var colorWhite = this._cl._cm[1].p.v;
+        var opacity = this._cl._cm[2].p.v/100;
         this.matrixFilter.setAttribute('values',(colorWhite[0]- colorBlack[0])+' 0 0 0 '+ colorBlack[0] +' '+ (colorWhite[1]- colorBlack[1]) +' 0 0 0 '+ colorBlack[1] +' '+ (colorWhite[2]- colorBlack[2]) +' 0 0 0 '+ colorBlack[2] +' 0 0 0 ' + opacity + ' 0');
     }
 };
-function _bc(filter, filterManager){
-    this.filterManager = filterManager;
-    var feColorMatrix = createNS('feColorMatrix');
+function _bc(filter, _cl){
+    this._cl = _cl;
+    var feColorMatrix = _ct('feColorMatrix');
     feColorMatrix.setAttribute('type','matrix');
     feColorMatrix.setAttribute('color-interpolation-filters','sRGB');
     feColorMatrix.setAttribute('values','1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0');
@@ -8323,15 +7650,15 @@
     this.matrixFilter = feColorMatrix;
 }
 _bc.prototype._ba = function(forceRender){
-    if(forceRender || this.filterManager.mdf){
-        var color = this.filterManager.effectElements[2].p.v;
-        var opacity = this.filterManager.effectElements[6].p.v;
+    if(forceRender || this._cl.mdf){
+        var color = this._cl._cm[2].p.v;
+        var opacity = this._cl._cm[6].p.v;
         this.matrixFilter.setAttribute('values','0 0 0 0 '+color[0]+' 0 0 0 0 '+color[1]+' 0 0 0 0 '+color[2]+' 0 0 0 '+opacity+' 0');
     }
 };
-function _bd(elem, filterManager){
+function _bd(elem, _cl){
     this.initialized = false;
-    this.filterManager = filterManager;
+    this._cl = _cl;
     this.elem = elem;
     this.paths = [];
 }
@@ -8340,30 +7667,30 @@
 
     var elemChildren = this.elem._bx.children || this.elem._bx.childNodes;
     var path,groupPath, i, len;
-    if(this.filterManager.effectElements[1].p.v === 1){
+    if(this._cl._cm[1].p.v === 1){
         len = this.elem.maskManager.masksProperties.length;
         i = 0;
     } else {
-        i = this.filterManager.effectElements[0].p.v - 1;
+        i = this._cl._cm[0].p.v - 1;
         len = i + 1;
     }
-    groupPath = createNS('g'); 
+    groupPath = _ct('g'); 
     groupPath.setAttribute('fill','none');
     groupPath.setAttribute('stroke-linecap','round');
     groupPath.setAttribute('stroke-dashoffset',1);
     for(i;i<len;i+=1){
-        path = createNS('path');
+        path = _ct('path');
         groupPath.appendChild(path);
         this.paths.push({p:path,m:i});
     }
-    if(this.filterManager.effectElements[10].p.v === 3){
-        var mask = createNS('mask');
+    if(this._cl._cm[10].p.v === 3){
+        var mask = _ct('mask');
         var id = 'stms_' + randomString(10);
         mask.setAttribute('id',id);
         mask.setAttribute('mask-type','alpha');
         mask.appendChild(groupPath);
         this.elem._x.defs.appendChild(mask);
-        var g = createNS('g');
+        var g = _ct('g');
         g.setAttribute('mask','url(' + locationHref + '#'+id+')');
         if(elemChildren[0]){
             g.appendChild(elemChildren[0]);
@@ -8371,8 +7698,8 @@
         this.elem._bx.appendChild(g);
         this.masker = mask;
         groupPath.setAttribute('stroke','#fff');
-    } else if(this.filterManager.effectElements[10].p.v === 1 || this.filterManager.effectElements[10].p.v === 2){
-        if(this.filterManager.effectElements[10].p.v === 2){
+    } else if(this._cl._cm[10].p.v === 1 || this._cl._cm[10].p.v === 2){
+        if(this._cl._cm[10].p.v === 2){
             var elemChildren = this.elem._bx.children || this.elem._bx.childNodes;
             while(elemChildren.length){
                 this.elem._bx.removeChild(elemChildren[0]);
@@ -8395,111 +7722,111 @@
     for(i=0;i<len;i+=1){
         mask = this.elem.maskManager.viewData[this.paths[i].m];
         path = this.paths[i].p;
-        if(forceRender || this.filterManager.mdf || mask.prop.mdf){
+        if(forceRender || this._cl.mdf || mask.prop.mdf){
             path.setAttribute('d',mask.lastPath);
         }
-        if(forceRender || this.filterManager.effectElements[9].p.mdf || this.filterManager.effectElements[4].p.mdf || this.filterManager.effectElements[7].p.mdf || this.filterManager.effectElements[8].p.mdf || mask.prop.mdf){
+        if(forceRender || this._cl._cm[9].p.mdf || this._cl._cm[4].p.mdf || this._cl._cm[7].p.mdf || this._cl._cm[8].p.mdf || mask.prop.mdf){
             var dasharrayValue;
-            if(this.filterManager.effectElements[7].p.v !== 0 || this.filterManager.effectElements[8].p.v !== 100){
-                var s = Math.min(this.filterManager.effectElements[7].p.v,this.filterManager.effectElements[8].p.v)/100;
-                var e = Math.max(this.filterManager.effectElements[7].p.v,this.filterManager.effectElements[8].p.v)/100;
+            if(this._cl._cm[7].p.v !== 0 || this._cl._cm[8].p.v !== 100){
+                var s = Math.min(this._cl._cm[7].p.v,this._cl._cm[8].p.v)/100;
+                var e = Math.max(this._cl._cm[7].p.v,this._cl._cm[8].p.v)/100;
                 var l = path.getTotalLength();
                 dasharrayValue = '0 0 0 ' + l*s + ' ';
                 var lineLength = l*(e-s);
-                var segment = 1+this.filterManager.effectElements[4].p.v*2*this.filterManager.effectElements[9].p.v/100;
+                var segment = 1+this._cl._cm[4].p.v*2*this._cl._cm[9].p.v/100;
                 var units = Math.floor(lineLength/segment);
                 var j;
                 for(j=0;j<units;j+=1){
-                    dasharrayValue += '1 ' + this.filterManager.effectElements[4].p.v*2*this.filterManager.effectElements[9].p.v/100 + ' ';
+                    dasharrayValue += '1 ' + this._cl._cm[4].p.v*2*this._cl._cm[9].p.v/100 + ' ';
                 }
                 dasharrayValue += '0 ' + l*10 + ' 0 0';
             } else {
-                dasharrayValue = '1 ' + this.filterManager.effectElements[4].p.v*2*this.filterManager.effectElements[9].p.v/100;
+                dasharrayValue = '1 ' + this._cl._cm[4].p.v*2*this._cl._cm[9].p.v/100;
             }
             path.setAttribute('stroke-dasharray',dasharrayValue);
         }
     }
-    if(forceRender || this.filterManager.effectElements[4].p.mdf){
-        this.pathMasker.setAttribute('stroke-width',this.filterManager.effectElements[4].p.v*2);
+    if(forceRender || this._cl._cm[4].p.mdf){
+        this.pathMasker.setAttribute('stroke-width',this._cl._cm[4].p.v*2);
     }
     
-    if(forceRender || this.filterManager.effectElements[6].p.mdf){
-        this.pathMasker.setAttribute('opacity',this.filterManager.effectElements[6].p.v);
+    if(forceRender || this._cl._cm[6].p.mdf){
+        this.pathMasker.setAttribute('opacity',this._cl._cm[6].p.v);
     }
-    if(this.filterManager.effectElements[10].p.v === 1 || this.filterManager.effectElements[10].p.v === 2){
-        if(forceRender || this.filterManager.effectElements[3].p.mdf){
-            var color = this.filterManager.effectElements[3].p.v;
+    if(this._cl._cm[10].p.v === 1 || this._cl._cm[10].p.v === 2){
+        if(forceRender || this._cl._cm[3].p.mdf){
+            var color = this._cl._cm[3].p.v;
             this.pathMasker.setAttribute('stroke','rgb('+bm_floor(color[0]*255)+','+bm_floor(color[1]*255)+','+bm_floor(color[2]*255)+')');
         }
     }
 };
-function _be(filter, filterManager){
-    this.filterManager = filterManager;
-    var feColorMatrix = createNS('feColorMatrix');
+function _be(filter, _cl){
+    this._cl = _cl;
+    var feColorMatrix = _ct('feColorMatrix');
     feColorMatrix.setAttribute('type','matrix');
     feColorMatrix.setAttribute('color-interpolation-filters','linearRGB');
     feColorMatrix.setAttribute('values','0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0 0 0 1 0');
     feColorMatrix.setAttribute('result','f1');
     filter.appendChild(feColorMatrix);
-    var feComponentTransfer = createNS('feComponentTransfer');
+    var feComponentTransfer = _ct('feComponentTransfer');
     feComponentTransfer.setAttribute('color-interpolation-filters','sRGB');
     filter.appendChild(feComponentTransfer);
     this.matrixFilter = feComponentTransfer;
-    var feFuncR = createNS('feFuncR');
+    var feFuncR = _ct('feFuncR');
     feFuncR.setAttribute('type','table');
     feComponentTransfer.appendChild(feFuncR);
     this.feFuncR = feFuncR;
-    var feFuncG = createNS('feFuncG');
+    var feFuncG = _ct('feFuncG');
     feFuncG.setAttribute('type','table');
     feComponentTransfer.appendChild(feFuncG);
     this.feFuncG = feFuncG;
-    var feFuncB = createNS('feFuncB');
+    var feFuncB = _ct('feFuncB');
     feFuncB.setAttribute('type','table');
     feComponentTransfer.appendChild(feFuncB);
     this.feFuncB = feFuncB;
 }
 
 _be.prototype._ba = function(forceRender){
-    if(forceRender || this.filterManager.mdf){
-        var color1 = this.filterManager.effectElements[0].p.v;
-        var color2 = this.filterManager.effectElements[1].p.v;
-        var color3 = this.filterManager.effectElements[2].p.v;
+    if(forceRender || this._cl.mdf){
+        var color1 = this._cl._cm[0].p.v;
+        var color2 = this._cl._cm[1].p.v;
+        var color3 = this._cl._cm[2].p.v;
         var tableR = color3[0] + ' ' + color2[0] + ' ' + color1[0]
         var tableG = color3[1] + ' ' + color2[1] + ' ' + color1[1]
         var tableB = color3[2] + ' ' + color2[2] + ' ' + color1[2]
         this.feFuncR.setAttribute('tableValues', tableR);
         this.feFuncG.setAttribute('tableValues', tableG);
         this.feFuncB.setAttribute('tableValues', tableB);
-        //var opacity = this.filterManager.effectElements[2].p.v/100;
+        //var opacity = this._cl._cm[2].p.v/100;
         //this.matrixFilter.setAttribute('values',(colorWhite[0]- colorBlack[0])+' 0 0 0 '+ colorBlack[0] +' '+ (colorWhite[1]- colorBlack[1]) +' 0 0 0 '+ colorBlack[1] +' '+ (colorWhite[2]- colorBlack[2]) +' 0 0 0 '+ colorBlack[2] +' 0 0 0 ' + opacity + ' 0');
     }
 };
-function _bf(filter, filterManager){
-    this.filterManager = filterManager;
-    var effectElements = this.filterManager.effectElements;
-    var feComponentTransfer = createNS('feComponentTransfer');
+function _bf(filter, _cl){
+    this._cl = _cl;
+    var _cm = this._cl._cm;
+    var feComponentTransfer = _ct('feComponentTransfer');
     var feFuncR, feFuncG, feFuncB;
     
-    if(effectElements[10].p.k || effectElements[10].p.v !== 0 || effectElements[11].p.k || effectElements[11].p.v !== 1 || effectElements[12].p.k || effectElements[12].p.v !== 1 || effectElements[13].p.k || effectElements[13].p.v !== 0 || effectElements[14].p.k || effectElements[14].p.v !== 1){
+    if(_cm[10].p.k || _cm[10].p.v !== 0 || _cm[11].p.k || _cm[11].p.v !== 1 || _cm[12].p.k || _cm[12].p.v !== 1 || _cm[13].p.k || _cm[13].p.v !== 0 || _cm[14].p.k || _cm[14].p.v !== 1){
         this.feFuncR = this.createFeFunc('feFuncR', feComponentTransfer);
     }
-    if(effectElements[17].p.k || effectElements[17].p.v !== 0 || effectElements[18].p.k || effectElements[18].p.v !== 1 || effectElements[19].p.k || effectElements[19].p.v !== 1 || effectElements[20].p.k || effectElements[20].p.v !== 0 || effectElements[21].p.k || effectElements[21].p.v !== 1){
+    if(_cm[17].p.k || _cm[17].p.v !== 0 || _cm[18].p.k || _cm[18].p.v !== 1 || _cm[19].p.k || _cm[19].p.v !== 1 || _cm[20].p.k || _cm[20].p.v !== 0 || _cm[21].p.k || _cm[21].p.v !== 1){
         this.feFuncG = this.createFeFunc('feFuncG', feComponentTransfer);
     }
-    if(effectElements[24].p.k || effectElements[24].p.v !== 0 || effectElements[25].p.k || effectElements[25].p.v !== 1 || effectElements[26].p.k || effectElements[26].p.v !== 1 || effectElements[27].p.k || effectElements[27].p.v !== 0 || effectElements[28].p.k || effectElements[28].p.v !== 1){
+    if(_cm[24].p.k || _cm[24].p.v !== 0 || _cm[25].p.k || _cm[25].p.v !== 1 || _cm[26].p.k || _cm[26].p.v !== 1 || _cm[27].p.k || _cm[27].p.v !== 0 || _cm[28].p.k || _cm[28].p.v !== 1){
         this.feFuncB = this.createFeFunc('feFuncB', feComponentTransfer);
     }
-    if(effectElements[31].p.k || effectElements[31].p.v !== 0 || effectElements[32].p.k || effectElements[32].p.v !== 1 || effectElements[33].p.k || effectElements[33].p.v !== 1 || effectElements[34].p.k || effectElements[34].p.v !== 0 || effectElements[35].p.k || effectElements[35].p.v !== 1){
+    if(_cm[31].p.k || _cm[31].p.v !== 0 || _cm[32].p.k || _cm[32].p.v !== 1 || _cm[33].p.k || _cm[33].p.v !== 1 || _cm[34].p.k || _cm[34].p.v !== 0 || _cm[35].p.k || _cm[35].p.v !== 1){
         this.feFuncA = this.createFeFunc('feFuncA', feComponentTransfer);
     }
     
     if(this.feFuncR || this.feFuncG || this.feFuncB || this.feFuncA){
         feComponentTransfer.setAttribute('color-interpolation-filters','sRGB');
         filter.appendChild(feComponentTransfer);
-        feComponentTransfer = createNS('feComponentTransfer');
+        feComponentTransfer = _ct('feComponentTransfer');
     }
 
-    if(effectElements[3].p.k || effectElements[3].p.v !== 0 || effectElements[4].p.k || effectElements[4].p.v !== 1 || effectElements[5].p.k || effectElements[5].p.v !== 1 || effectElements[6].p.k || effectElements[6].p.v !== 0 || effectElements[7].p.k || effectElements[7].p.v !== 1){
+    if(_cm[3].p.k || _cm[3].p.v !== 0 || _cm[4].p.k || _cm[4].p.v !== 1 || _cm[5].p.k || _cm[5].p.v !== 1 || _cm[6].p.k || _cm[6].p.v !== 0 || _cm[7].p.k || _cm[7].p.v !== 1){
 
         feComponentTransfer.setAttribute('color-interpolation-filters','sRGB');
         filter.appendChild(feComponentTransfer);
@@ -8510,7 +7837,7 @@
 }
 
 _bf.prototype.createFeFunc = function(type, feComponentTransfer) {
-    var feFunc = createNS(type);
+    var feFunc = _ct(type);
     feFunc.setAttribute('type','table');
     feComponentTransfer.appendChild(feFunc);
     return feFunc;
@@ -8543,40 +7870,40 @@
 };
 
 _bf.prototype._ba = function(forceRender){
-    if(forceRender || this.filterManager.mdf){
+    if(forceRender || this._cl.mdf){
         var val, cnt, perc, bezier;
-        var effectElements = this.filterManager.effectElements;
-        if(this.feFuncRComposed && (forceRender || effectElements[3].p.mdf || effectElements[4].p.mdf || effectElements[5].p.mdf || effectElements[6].p.mdf || effectElements[7].p.mdf)){
-            val = this.getTableValue(effectElements[3].p.v,effectElements[4].p.v,effectElements[5].p.v,effectElements[6].p.v,effectElements[7].p.v);
+        var _cm = this._cl._cm;
+        if(this.feFuncRComposed && (forceRender || _cm[3].p.mdf || _cm[4].p.mdf || _cm[5].p.mdf || _cm[6].p.mdf || _cm[7].p.mdf)){
+            val = this.getTableValue(_cm[3].p.v,_cm[4].p.v,_cm[5].p.v,_cm[6].p.v,_cm[7].p.v);
             this.feFuncRComposed.setAttribute('tableValues',val);
             this.feFuncGComposed.setAttribute('tableValues',val);
             this.feFuncBComposed.setAttribute('tableValues',val);
         }
 
 
-        if(this.feFuncR && (forceRender || effectElements[10].p.mdf || effectElements[11].p.mdf || effectElements[12].p.mdf || effectElements[13].p.mdf || effectElements[14].p.mdf)){
-            val = this.getTableValue(effectElements[10].p.v,effectElements[11].p.v,effectElements[12].p.v,effectElements[13].p.v,effectElements[14].p.v);
+        if(this.feFuncR && (forceRender || _cm[10].p.mdf || _cm[11].p.mdf || _cm[12].p.mdf || _cm[13].p.mdf || _cm[14].p.mdf)){
+            val = this.getTableValue(_cm[10].p.v,_cm[11].p.v,_cm[12].p.v,_cm[13].p.v,_cm[14].p.v);
             this.feFuncR.setAttribute('tableValues',val);
         }
 
-        if(this.feFuncG && (forceRender || effectElements[17].p.mdf || effectElements[18].p.mdf || effectElements[19].p.mdf || effectElements[20].p.mdf || effectElements[21].p.mdf)){
-            val = this.getTableValue(effectElements[17].p.v,effectElements[18].p.v,effectElements[19].p.v,effectElements[20].p.v,effectElements[21].p.v);
+        if(this.feFuncG && (forceRender || _cm[17].p.mdf || _cm[18].p.mdf || _cm[19].p.mdf || _cm[20].p.mdf || _cm[21].p.mdf)){
+            val = this.getTableValue(_cm[17].p.v,_cm[18].p.v,_cm[19].p.v,_cm[20].p.v,_cm[21].p.v);
             this.feFuncG.setAttribute('tableValues',val);
         }
 
-        if(this.feFuncB && (forceRender || effectElements[24].p.mdf || effectElements[25].p.mdf || effectElements[26].p.mdf || effectElements[27].p.mdf || effectElements[28].p.mdf)){
-            val = this.getTableValue(effectElements[24].p.v,effectElements[25].p.v,effectElements[26].p.v,effectElements[27].p.v,effectElements[28].p.v);
+        if(this.feFuncB && (forceRender || _cm[24].p.mdf || _cm[25].p.mdf || _cm[26].p.mdf || _cm[27].p.mdf || _cm[28].p.mdf)){
+            val = this.getTableValue(_cm[24].p.v,_cm[25].p.v,_cm[26].p.v,_cm[27].p.v,_cm[28].p.v);
             this.feFuncB.setAttribute('tableValues',val);
         }
 
-        if(this.feFuncA && (forceRender || effectElements[31].p.mdf || effectElements[32].p.mdf || effectElements[33].p.mdf || effectElements[34].p.mdf || effectElements[35].p.mdf)){
-            val = this.getTableValue(effectElements[31].p.v,effectElements[32].p.v,effectElements[33].p.v,effectElements[34].p.v,effectElements[35].p.v);
+        if(this.feFuncA && (forceRender || _cm[31].p.mdf || _cm[32].p.mdf || _cm[33].p.mdf || _cm[34].p.mdf || _cm[35].p.mdf)){
+            val = this.getTableValue(_cm[31].p.v,_cm[32].p.v,_cm[33].p.v,_cm[34].p.v,_cm[35].p.v);
             this.feFuncA.setAttribute('tableValues',val);
         }
         
     }
 };
-function _bg(filter, filterManager){
+function _bg(filter, _cl){
     /*<feGaussianBlur in="SourceAlpha" stdDeviation="3"/> <!-- stdDeviation is how much to blur -->
   <feOffset dx="2" dy="2" result="offsetblur"/> <!-- how much to offset -->
   <feMerge> 
@@ -8588,30 +7915,30 @@
     filter.setAttribute('y','-100%');
     filter.setAttribute('width','400%');
     filter.setAttribute('height','400%');
-    this.filterManager = filterManager;
+    this._cl = _cl;
 
-    var feGaussianBlur = createNS('feGaussianBlur');
+    var feGaussianBlur = _ct('feGaussianBlur');
     feGaussianBlur.setAttribute('in','SourceAlpha');
     feGaussianBlur.setAttribute('result','drop_shadow_1');
     feGaussianBlur.setAttribute('stdDeviation','0');
     this.feGaussianBlur = feGaussianBlur;
     filter.appendChild(feGaussianBlur);
 
-    var feOffset = createNS('feOffset');
+    var feOffset = _ct('feOffset');
     feOffset.setAttribute('dx','25');
     feOffset.setAttribute('dy','0');
     feOffset.setAttribute('in','drop_shadow_1');
     feOffset.setAttribute('result','drop_shadow_2');
     this.feOffset = feOffset;
     filter.appendChild(feOffset);
-    var feFlood = createNS('feFlood');
+    var feFlood = _ct('feFlood');
     feFlood.setAttribute('flood-color','#00ff00');
     feFlood.setAttribute('flood-opacity','1');
     feFlood.setAttribute('result','drop_shadow_3');
     this.feFlood = feFlood;
     filter.appendChild(feFlood);
 
-    var feComposite = createNS('feComposite');
+    var feComposite = _ct('feComposite');
     feComposite.setAttribute('in','drop_shadow_3');
     feComposite.setAttribute('in2','drop_shadow_2');
     feComposite.setAttribute('operator','in');
@@ -8619,12 +7946,12 @@
     filter.appendChild(feComposite);
 
 
-    var feMerge = createNS('feMerge');
+    var feMerge = _ct('feMerge');
     filter.appendChild(feMerge);
     var feMergeNode;
-    feMergeNode = createNS('feMergeNode');
+    feMergeNode = _ct('feMergeNode');
     feMerge.appendChild(feMergeNode);
-    feMergeNode = createNS('feMergeNode');
+    feMergeNode = _ct('feMergeNode');
     feMergeNode.setAttribute('in','SourceGraphic');
     this.feMergeNode = feMergeNode;
     this.feMerge = feMerge;
@@ -8633,30 +7960,30 @@
 }
 
 _bg.prototype._ba = function(forceRender){
-    if(forceRender || this.filterManager.mdf){
-        if(forceRender || this.filterManager.effectElements[4].p.mdf){
-            this.feGaussianBlur.setAttribute('stdDeviation', this.filterManager.effectElements[4].p.v / 4);
+    if(forceRender || this._cl.mdf){
+        if(forceRender || this._cl._cm[4].p.mdf){
+            this.feGaussianBlur.setAttribute('stdDeviation', this._cl._cm[4].p.v / 4);
         }
-        if(forceRender || this.filterManager.effectElements[0].p.mdf){
-            var col = this.filterManager.effectElements[0].p.v;
+        if(forceRender || this._cl._cm[0].p.mdf){
+            var col = this._cl._cm[0].p.v;
             this.feFlood.setAttribute('flood-color',rgbToHex(Math.round(col[0]*255),Math.round(col[1]*255),Math.round(col[2]*255)));
         }
-        if(forceRender || this.filterManager.effectElements[1].p.mdf){
-            this.feFlood.setAttribute('flood-opacity',this.filterManager.effectElements[1].p.v/255);
+        if(forceRender || this._cl._cm[1].p.mdf){
+            this.feFlood.setAttribute('flood-opacity',this._cl._cm[1].p.v/255);
         }
-        if(forceRender || this.filterManager.effectElements[2].p.mdf || this.filterManager.effectElements[3].p.mdf){
-            var distance = this.filterManager.effectElements[3].p.v
-            var angle = (this.filterManager.effectElements[2].p.v - 90) * degToRads
+        if(forceRender || this._cl._cm[2].p.mdf || this._cl._cm[3].p.mdf){
+            var distance = this._cl._cm[3].p.v
+            var angle = (this._cl._cm[2].p.v - 90) * degToRads
             var x = distance * Math.cos(angle)
             var y = distance * Math.sin(angle)
             this.feOffset.setAttribute('dx', x);
             this.feOffset.setAttribute('dy', y);
         }
-        /*if(forceRender || this.filterManager.effectElements[5].p.mdf){
-            if(this.filterManager.effectElements[5].p.v === 1 && this.originalNodeAdded) {
+        /*if(forceRender || this._cl._cm[5].p.mdf){
+            if(this._cl._cm[5].p.v === 1 && this.originalNodeAdded) {
                 this.feMerge.removeChild(this.feMergeNode);
                 this.originalNodeAdded = false;
-            } else if(this.filterManager.effectElements[5].p.v === 0 && !this.originalNodeAdded) {
+            } else if(this._cl._cm[5].p.v === 0 && !this.originalNodeAdded) {
                 this.feMerge.appendChild(this.feMergeNode);
                 this.originalNodeAdded = true;
             }
@@ -8666,12 +7993,12 @@
 var _svgMatteSymbols = [];
 var _svgMatteMaskCounter = 0;
 
-function _bh(filterElem, filterManager, elem){
+function _bh(filterElem, _cl, elem){
     this.initialized = false;
-    this.filterManager = filterManager;
+    this._cl = _cl;
     this.filterElem = filterElem;
     this.elem = elem;
-    elem.matteElement = createNS('g');
+    elem.matteElement = _ct('g');
     elem.matteElement.appendChild(elem._bx);
     elem.matteElement.appendChild(elem._bz);
     elem._by = elem.matteElement;
@@ -8705,7 +8032,7 @@
     if (i <= len - 2) {
         nextChild = children[i + 1];
     }
-    var useElem = createNS('use');
+    var useElem = _ct('use');
     useElem.setAttribute('href', '#' + symbolId);
     if(nextChild) {
         parentNode.insertBefore(useElem, nextChild);
@@ -8717,18 +8044,18 @@
 _bh.prototype.setElementAsMask = function(elem, mask) {
     if(!this.findSymbol(mask)) {
         var symbolId = 'matte_' + randomString(5) + '_' + _svgMatteMaskCounter++;
-        var masker = createNS('mask');
+        var masker = _ct('mask');
         masker.setAttribute('id', mask.layerId);
         masker.setAttribute('mask-type', 'alpha');
         _svgMatteSymbols.push(mask);
         var defs = elem._x.defs;
         defs.appendChild(masker);
-        var symbol = createNS('symbol');
+        var symbol = _ct('symbol');
         symbol.setAttribute('id', symbolId);
         this.replaceInParent(mask, symbolId);
         symbol.appendChild(mask._bx);
         defs.appendChild(symbol);
-        useElem = createNS('use');
+        useElem = _ct('use');
         useElem.setAttribute('href', '#' + symbolId);
         masker.appendChild(useElem);
         mask.data.hd = false;
@@ -8738,7 +8065,7 @@
 }
 
 _bh.prototype.initialize = function() {
-    var ind = this.filterManager.effectElements[0].p.v;
+    var ind = this._cl._cm[0].p.v;
     var i = 0, len = this.elem.comp._br.length;
     while (i < len) {
     	if (this.elem.comp._br[i].data.ind === ind) {
@@ -8760,35 +8087,35 @@
     var fil = filtersFactory.createFilter(filId);
     var count = 0;
     this.filters = [];
-    var filterManager;
+    var _cl;
     for(i=0;i<len;i+=1){
         if(elem.data.ef[i].ty === 20){
             count += 1;
-            filterManager = new _bb(fil, elem.effects.effectElements[i]);
-            this.filters.push(filterManager);
+            _cl = new _bb(fil, elem.effects._cm[i]);
+            this.filters.push(_cl);
         }else if(elem.data.ef[i].ty === 21){
             count += 1;
-            filterManager = new _bc(fil, elem.effects.effectElements[i]);
-            this.filters.push(filterManager);
+            _cl = new _bc(fil, elem.effects._cm[i]);
+            this.filters.push(_cl);
         }else if(elem.data.ef[i].ty === 22){
-            filterManager = new _bd(elem, elem.effects.effectElements[i]);
-            this.filters.push(filterManager);
+            _cl = new _bd(elem, elem.effects._cm[i]);
+            this.filters.push(_cl);
         }else if(elem.data.ef[i].ty === 23){
             count += 1;
-            filterManager = new _be(fil, elem.effects.effectElements[i]);
-            this.filters.push(filterManager);
+            _cl = new _be(fil, elem.effects._cm[i]);
+            this.filters.push(_cl);
         }else if(elem.data.ef[i].ty === 24){
             count += 1;
-            filterManager = new _bf(fil, elem.effects.effectElements[i]);
-            this.filters.push(filterManager);
+            _cl = new _bf(fil, elem.effects._cm[i]);
+            this.filters.push(_cl);
         }else if(elem.data.ef[i].ty === 25){
             count += 1;
-            filterManager = new _bg(fil, elem.effects.effectElements[i]);
-            this.filters.push(filterManager);
+            _cl = new _bg(fil, elem.effects._cm[i]);
+            this.filters.push(_cl);
         }else if(elem.data.ef[i].ty === 28){
             //count += 1;
-            filterManager = new _bh(fil, elem.effects.effectElements[i], elem);
-            this.filters.push(filterManager);
+            _cl = new _bh(fil, elem.effects._cm[i], elem);
+            this.filters.push(_cl);
         }
     }
     if(count){
@@ -8797,1543 +8124,12 @@
     }
 }
 
-_bi.prototype._ba = function(firstFrame){
+_bi.prototype._ba = function(_ch){
     var i, len = this.filters.length;
     for(i=0;i<len;i+=1){
-        this.filters[i]._ba(firstFrame);
+        this.filters[i]._ba(_ch);
     }
 };
-function _n() {
-	this.saved = [];
-    this.cArrPos = 0;
-    this.cTr = new Matrix();
-    this.cO = 1;
-    var i, len = 15;
-    this.savedOp = createTypedArray('float32', len);
-    for(i=0;i<len;i+=1){
-        this.saved[i] = createTypedArray('float32', 16);
-    }
-    this._length = len;
-}
-
-_n.prototype.duplicate = function() {
-	var newLength = this._length * 2;
-	var currentSavedOp = this.savedOp;
-    this.savedOp = createTypedArray('float32', newLength);
-    this.savedOp.set(currentSavedOp);
-    var i = 0;
-    for(i = this._length; i < newLength; i += 1) {
-        this.saved[i] = createTypedArray('float32', 16);
-    }
-    this._length = newLength;
-}
-
-_n.prototype.reset = function() {
-	this.cArrPos = 0;
-	this.cTr.reset();
-    this.cO = 1;
-}
-function _c(data, comp, _x){
-}
-
-_c.prototype.createElements = function(){
-    this.checkParenting();
-};
-
-_c.prototype.initRendererElement = function(){
-
-};
-_c.prototype.createContainerElements = function(){
-    this.canvasContext = this._x.canvasContext;
-    this.effectsManager = new _o(this);
-};
-_c.prototype.createContent = function(){};
-
-_c.prototype.setBlendMode = function(){
-    var _x = this._x;
-    if(_x.blendMode !== this.data.bm) {
-        _x.blendMode = this.data.bm;
-        var blendModeValue = this.getBlendMode();
-        _x.canvasContext.globalCompositeOperation = blendModeValue;
-    }
-};
-
-_c.prototype.addMasks = function(){
-    this.maskManager = new _q(this.data, this, this._x);
-};
-
-_c.prototype.hideElement = function(){
-    if (!this.hidden && (!this.isInRange || this.isTransparent)) {
-        this.hidden = true;
-    }
-};
-
-_c.prototype.showElement = function(){
-    if (this.isInRange && !this.isTransparent){
-        this.hidden = false;
-        this.firstFrame = true;
-        this.maskManager.firstFrame = true;
-    }
-};
-
-_c.prototype._ba = function() {
-    if (this.hidden) {
-        return;
-    }
-    this.renderTransform();
-    this.renderRenderable();
-    this.setBlendMode();
-    this._x.renderer.save();
-    this._x.renderer.ctxTransform(this.finalTransform.mat.props);
-    this._x.renderer.ctxOpacity(this.finalTransform.mProp.o.v);
-    this.renderInnerContent();
-    this._x.renderer.restore();
-    if(this.maskManager.hasMasks) {
-        this._x.renderer.restore(true);
-    }
-    if (this.firstFrame) {
-        this.firstFrame = false;
-    }
-};
-
-_c.prototype.hide = _c.prototype.hideElement;
-_c.prototype.show = _c.prototype.showElement;
-
-_c.prototype.destroy = function(){
-    this.canvasContext = null;
-    this.data = null;
-    this._x = null;
-    this.maskManager.destroy();
-};
-
-_c.prototype.mHelper = new Matrix();
-
-function _p(data, _x, comp){
-    this.failed = false;
-    this.img = new Image();
-    this.assetData = _x.getAssetData(data.refId);
-    this.initElement(data,_x,comp);
-    this._x.addPendingElement();
-}
-extendPrototype([_e, _af, _c, _ad, _ac, _ae], _p);
-
-_p.prototype.initElement = _f.prototype.initElement;
-_p.prototype._az = _h.prototype._az;
-
-_p.prototype.imageLoaded = function() {
-    this._x.elementLoaded();
-    if(this.assetData.w !== this.img.width || this.assetData.h !== this.img.height){
-        var canvas = createTag('canvas');
-        canvas.width = this.assetData.w;
-        canvas.height = this.assetData.h;
-        var ctx = canvas.getContext('2d');
-
-        var imgW = this.img.width;
-        var imgH = this.img.height;
-        var imgRel = imgW / imgH;
-        var canvasRel = this.assetData.w/this.assetData.h;
-        var widthCrop, heightCrop;
-        if(imgRel>canvasRel){
-            heightCrop = imgH;
-            widthCrop = heightCrop*canvasRel;
-        } else {
-            widthCrop = imgW;
-            heightCrop = widthCrop/canvasRel;
-        }
-        ctx.drawImage(this.img,(imgW-widthCrop)/2,(imgH-heightCrop)/2,widthCrop,heightCrop,0,0,this.assetData.w,this.assetData.h);
-        this.img = canvas;
-    }
-}
-
-_p.prototype.imageFailed = function() {
-    this.failed = true;
-    this._x.elementLoaded();
-}
-
-_p.prototype.createContent = function(){
-    var img = this.img;
-    img.addEventListener('load', this.imageLoaded.bind(this), false);
-    img.addEventListener('error', this.imageFailed.bind(this), false);
-    var assetPath = this._x.getAssetsPath(this.assetData);
-    img.src = assetPath;
-
-};
-
-_p.prototype.renderInnerContent = function(parentMatrix){
-    if (this.failed) {
-        return;
-    }
-    this.canvasContext.drawImage(this.img, 0, 0);
-};
-
-_p.prototype.destroy = function(){
-    this.img = null;
-    this.destroy_e();
-};
-function _m(data, _x, comp) {
-    this.completeLayers = false;
-    this.layers = data.layers;
-    this.pendingElements = [];
-    this._br = Array.apply(null,{length:this.layers.length});
-    this.initElement(data, _x, comp);
-    this.tm = data.tm ? _ai._bo(this,data.tm,0,_x.frameRate,this.dynamicProperties) : {_placeholder:true};
-}
-
-extendPrototype([_aq, _g, _c], _m);
-
-_m.prototype.renderInnerContent = function() {
-    var i,len = this.layers.length;
-    for( i = len - 1; i >= 0; i -= 1 ){
-        if(this.completeLayers || this._br[i]){
-            this._br[i]._ba();
-        }
-    }
-};
-
-_m.prototype.destroy = function(){
-    var i,len = this.layers.length;
-    for( i = len - 1; i >= 0; i -= 1 ){
-        this._br[i].destroy();
-    }
-    this.layers = null;
-    this._br = null;
-};
-
-function _q(data,element){
-    this.data = data;
-    this.element = element;
-    this.dynamicProperties = [];
-    this.masksProperties = this.data.masksProperties || [];
-    this.viewData = Array.apply(null,{length:this.masksProperties.length});
-    var i, len = this.masksProperties.length, hasMasks = false;
-    for (i = 0; i < len; i++) {
-        if(this.masksProperties[i].mode !== 'n'){
-            hasMasks = true;
-        }
-        this.viewData[i] = _ah._bp(this.element,this.masksProperties[i],3,this.dynamicProperties,null);
-    }
-    this.hasMasks = hasMasks;
-}
-
-_q.prototype._az = function(num){
-    var i, len = this.dynamicProperties.length;
-    for(i=0;i<len;i+=1){
-        this.dynamicProperties[i].getValue(num);
-        if(this.dynamicProperties[i].mdf){
-            this.element._x.mdf = true;
-        }
-    }
-};
-
-_q.prototype._ba = function (transform) {
-    if(!this.hasMasks){
-        return;
-    }
-    var ctx = this.element.canvasContext;
-    var i, len = this.masksProperties.length;
-    var pt,pt2,pt3,data;
-    ctx.beginPath();
-    for (i = 0; i < len; i++) {
-        if(this.masksProperties[i].mode !== 'n'){
-            if (this.masksProperties[i].inv) {
-                ctx.moveTo(0, 0);
-                ctx.lineTo(this.element._x.compWidth, 0);
-                ctx.lineTo(this.element._x.compWidth, this.element._x.compHeight);
-                ctx.lineTo(0, this.element._x.compHeight);
-                ctx.lineTo(0, 0);
-            }
-            data = this.viewData[i].v;
-            pt = transform ? transform.applyToPointArray(data.v[0][0],data.v[0][1],0):data.v[0];
-            ctx.moveTo(pt[0], pt[1]);
-            var j, jLen = data._length;
-            for (j = 1; j < jLen; j++) {
-                pt = transform ? transform.applyToPointArray(data.o[j - 1][0],data.o[j - 1][1],0) : data.o[j - 1];
-                pt2 = transform ? transform.applyToPointArray(data.i[j][0],data.i[j][1],0) : data.i[j];
-                pt3 = transform ? transform.applyToPointArray(data.v[j][0],data.v[j][1],0) : data.v[j];
-                ctx.bezierCurveTo(pt[0], pt[1], pt2[0], pt2[1], pt3[0], pt3[1]);
-            }
-            pt = transform ? transform.applyToPointArray(data.o[j - 1][0],data.o[j - 1][1],0) : data.o[j - 1];
-            pt2 = transform ? transform.applyToPointArray(data.i[0][0],data.i[0][1],0) : data.i[0];
-            pt3 = transform ? transform.applyToPointArray(data.v[0][0],data.v[0][1],0) : data.v[0];
-            ctx.bezierCurveTo(pt[0], pt[1], pt2[0], pt2[1], pt3[0], pt3[1]);
-        }
-    }
-    this.element._x.renderer.save(true);
-    ctx.clip();
-};
-
-_q.prototype.getMaskProperty = _ay.prototype.getMaskProperty;
-
-_q.prototype.destroy = function(){
-    this.element = null;
-};
-function _r(data, _x, comp) {
-    this.shapes = [];
-    this.shapesData = data.shapes;
-    this.stylesList = [];
-    this.itemsData = [];
-    this.prevViewData = [];
-    this.shapeModifiers = [];
-    this.processedElements = [];
-    this.initElement(data, _x, comp);
-}
-
-extendPrototype([_e,_af,_c,_ad,_ac,_ae], _r);
-
-_r.prototype.initElement = function(data,_x,comp) {
-    this.initFrame();
-    this.initBaseData(data, _x, comp);
-    this.initTransform(data, _x, comp);
-    this.initHierarchy();
-    this.initRenderable();
-    this.initRendererElement();
-    this.createContainerElements();
-    this.addMasks();
-    this.createContent();
-    this.hide();
-}
-
-_r.prototype.transformHelper = {opacity:1,mat:new Matrix(),matMdf:false,opMdf:false};
-
-_r.prototype.dashResetter = [];
-
-_r.prototype.createContent = function(){
-    this.searchShapes(this.shapesData,this.itemsData,this.prevViewData,this.dynamicProperties, true);
-};
-
-_r.prototype.createStyleElement = function(data, dynamicProperties){
-    var styleElem = {
-        data: data,
-        type: data.ty,
-        _br: []
-    };
-    var elementData = {};
-    if(data.ty == 'fl' || data.ty == 'st'){
-        elementData.c = _ai._bo(this,data.c,1,255,dynamicProperties);
-        if(!elementData.c.k){
-            styleElem.co = 'rgb('+bm_floor(elementData.c.v[0])+','+bm_floor(elementData.c.v[1])+','+bm_floor(elementData.c.v[2])+')';
-        }
-    }
-    elementData.o = _ai._bo(this,data.o,0,0.01,dynamicProperties);
-    if(data.ty == 'st') {
-        styleElem.lc = this.lcEnum[data.lc] || 'round';
-        styleElem.lj = this.ljEnum[data.lj] || 'round';
-        if(data.lj == 1) {
-            styleElem.ml = data.ml;
-        }
-        elementData.w = _ai._bo(this,data.w,0,null,dynamicProperties);
-        if(!elementData.w.k){
-            styleElem.wi = elementData.w.v;
-        }
-        if(data.d){
-            var d = new DashProperty(this,data.d,'canvas',dynamicProperties);
-            elementData.d = d;
-            if(!elementData.d.k){
-                styleElem.da = elementData.d.dashArray;
-                styleElem.do = elementData.d.dashoffset[0];
-            }
-        }
-
-    } else {
-
-        styleElem.r = data.r === 2 ? 'evenodd' : 'nonzero';
-    }
-    this.stylesList.push(styleElem);
-    elementData.style = styleElem;
-    return elementData;
-}
-
-_r.prototype.createGroupElement = function(data) {
-    var elementData = {
-        it: [],
-        prevViewData: []
-    };
-    return elementData;
-}
-
-_r.prototype.create_af = function(data, dynamicProperties) {
-    var elementData = {
-        transform : {
-            mat: new Matrix(),
-            opacity: 1,
-            matMdf:false,
-            opMdf:false,
-            op: _ai._bo(this,data.o,0,0.01,dynamicProperties),
-            //mProps: _ai._bo(this,data,2,null,dynamicProperties)
-            mProps: _ag._bj(this,data,dynamicProperties)
-        },
-        _br: []
-    };
-    return elementData;
-}
-
-_r.prototype.createShapeElement = function(data, dynamicProperties) {
-    var elementData = {
-        nodes:[],
-        trNodes:[],
-        tr:[0,0,0,0,0,0]
-    };
-    var ty = 4;
-    if(data.ty == 'rc'){
-        ty = 5;
-    }else if(data.ty == 'el'){
-        ty = 6;
-    }else if(data.ty == 'sr'){
-        ty = 7;
-    }
-    elementData.sh = _ah._bp(this,data,ty,dynamicProperties);
-    this.shapes.push(elementData.sh);
-    this.addShapeToModifiers(elementData);
-    var j, jLen = this.stylesList.length;
-    var hasStrokes = false, hasFills = false;
-    for(j=0;j<jLen;j+=1){
-        if(!this.stylesList[j].closed){
-            this.stylesList[j]._br.push(elementData);
-            if(this.stylesList[j].type === 'st'){
-                hasStrokes = true;
-            }else{
-                hasFills = true;
-            }
-        }
-    }
-    elementData.st = hasStrokes;
-    elementData.fl = hasFills;
-    return elementData;
-}
-
-_r.prototype.reloadShapes = function(){
-    this.firstFrame = true;
-    var i, len = this.itemsData.length;
-    for(i=0;i<len;i+=1){
-        this.prevViewData[i] = this.itemsData[i];
-    }
-    this.searchShapes(this.shapesData,this.itemsData,this.prevViewData,this.dynamicProperties, true);
-    var i, len = this.dynamicProperties.length;
-    for(i=0;i<len;i+=1){
-        this.dynamicProperties[i].getValue();
-    }
-    this.renderModifiers();
-}
-
-_r.prototype.searchShapes = function(arr,itemsData, prevViewData,dynamicProperties, render){
-    var i, len = arr.length - 1;
-    var j, jLen;
-    var ownArrays = [], ownModifiers = [], processedPos;
-    for(i=len;i>=0;i-=1){
-        processedPos = this.searchProcessedElement(arr[i]);
-        if(!processedPos){
-            arr[i]._render = render;
-        } else {
-            itemsData[i] = prevViewData[processedPos - 1];
-        }
-        if(arr[i].ty == 'fl' || arr[i].ty == 'st'){
-            if(!processedPos){
-                itemsData[i] = this.createStyleElement(arr[i], dynamicProperties);
-            } else {
-                itemsData[i].style.closed = false;
-            }
-            
-            ownArrays.push(itemsData[i].style);
-        }else if(arr[i].ty == 'gr'){
-            if(!processedPos){
-                itemsData[i] = this.createGroupElement(arr[i]);
-            } else {
-                jLen = itemsData[i].it.length;
-                for(j=0;j<jLen;j+=1){
-                    itemsData[i].prevViewData[j] = itemsData[i].it[j];
-                }
-            }
-            this.searchShapes(arr[i].it,itemsData[i].it,itemsData[i].prevViewData,dynamicProperties, render);
-        }else if(arr[i].ty == 'tr'){
-            if(!processedPos){
-                itemsData[i] = this.create_af(arr[i], dynamicProperties);
-            }
-        }else if(arr[i].ty == 'sh' || arr[i].ty == 'rc' || arr[i].ty == 'el' || arr[i].ty == 'sr'){
-            if(!processedPos){
-                itemsData[i] = this.createShapeElement(arr[i], dynamicProperties);
-            }
-            
-        }else if(arr[i].ty == 'tm' || arr[i].ty == 'rd'){
-            if(!processedPos){
-                var modifier = _as.getModifier(arr[i].ty);
-                modifier.init(this,arr[i],dynamicProperties);
-                itemsData[i] = modifier;
-                this.shapeModifiers.push(modifier);
-            } else {
-                modifier = itemsData[i];
-                modifier.closed = false;
-            }
-            ownModifiers.push(modifier);
-        } else if(arr[i].ty == 'rp'){
-            if(!processedPos){
-                modifier = _as.getModifier(arr[i].ty);
-                itemsData[i] = modifier;
-                modifier.init(this,arr,i,itemsData,dynamicProperties);
-                this.shapeModifiers.push(modifier);
-                render = false;
-            }else{
-                modifier = itemsData[i];
-                modifier.closed = true;
-            }
-            ownModifiers.push(modifier);
-        }
-        this.addProcessedElement(arr[i], i + 1);
-    }
-    len = ownArrays.length;
-    for(i=0;i<len;i+=1){
-        ownArrays[i].closed = true;
-    }
-    len = ownModifiers.length;
-    for(i=0;i<len;i+=1){
-        ownModifiers[i].closed = true;
-    }
-};
-
-_r.prototype.addShapeToModifiers = _f.prototype.addShapeToModifiers;
-_r.prototype.renderModifiers = _f.prototype.renderModifiers;
-_r.prototype.lcEnum = _f.prototype.lcEnum;
-_r.prototype.ljEnum = _f.prototype.ljEnum;
-_r.prototype.searchProcessedElement = _f.prototype.searchProcessedElement;
-_r.prototype.addProcessedElement = _f.prototype.addProcessedElement;
-_r.prototype._az = _f.prototype._az;
-
-_r.prototype.renderInnerContent = function() {
-
-    this.transformHelper.mat.reset();
-    this.transformHelper.opacity = this.finalTransform.mProp.o.v;
-    this.transformHelper.matMdf = false;
-    this.transformHelper.opMdf = this.finalTransform.opMdf;
-    this.renderModifiers();
-    this.renderShape(this.transformHelper,null,null,true);
-}
-
-_r.prototype.renderShape = function(parentTransform,items,data,isMain){
-    var i, len;
-    if(!items){
-        items = this.shapesData;
-        len = this.stylesList.length;
-        for(i=0;i<len;i+=1){
-            this.stylesList[i].d = '';
-            this.stylesList[i].mdf = false;
-        }
-    }
-    if(!data){
-        data = this.itemsData;
-    }
-    ///
-    ///
-    len = items.length - 1;
-    var groupTransform,groupMatrix;
-    groupTransform = parentTransform;
-    for(i=len;i>=0;i-=1){
-        if(items[i].ty == 'tr'){
-            groupTransform = data[i].transform;
-            var mtArr = data[i].transform.mProps.v.props;
-            groupTransform.matMdf = groupTransform.mProps.mdf;
-            groupTransform.opMdf = groupTransform.op.mdf;
-            groupMatrix = groupTransform.mat;
-            groupMatrix.cloneFromProps(mtArr);
-            if(parentTransform){
-                var props = parentTransform.mat.props;
-                groupTransform.opacity = parentTransform.opacity;
-                groupTransform.opacity *= data[i].transform.op.v;
-                groupTransform.matMdf = parentTransform.matMdf ? true : groupTransform.matMdf;
-                groupTransform.opMdf = parentTransform.opMdf ? true : groupTransform.opMdf;
-                groupMatrix.transform(props[0],props[1],props[2],props[3],props[4],props[5],props[6],props[7],props[8],props[9],props[10],props[11],props[12],props[13],props[14],props[15]);
-            }else{
-                groupTransform.opacity = groupTransform.op.o;
-            }
-        }else if(items[i].ty == 'sh' || items[i].ty == 'el' || items[i].ty == 'rc' || items[i].ty == 'sr'){
-            this.renderPath(items[i],data[i],groupTransform);
-        }else if(items[i].ty == 'fl'){
-            this.renderFill(items[i],data[i],groupTransform);
-        }else if(items[i].ty == 'st'){
-            this.renderStroke(items[i],data[i],groupTransform);
-        }else if(items[i].ty == 'gr'){
-            this.renderShape(groupTransform,items[i].it,data[i].it);
-        }else if(items[i].ty == 'tm'){
-            //
-        }
-    }
-    if(!isMain){
-        return;
-    }
-    len = this.stylesList.length;
-    var j, jLen, k, kLen,elems,nodes, renderer = this._x.renderer, ctx = this._x.canvasContext, type;
-    //renderer.save();
-    //renderer.ctxTransform(this.finalTransform.mat.props);
-    for(i=0;i<len;i+=1){
-        type = this.stylesList[i].type;
-        if((type === 'st' && this.stylesList[i].wi === 0) || !this.stylesList[i].data._render){
-            continue;
-        }
-        renderer.save();
-        elems = this.stylesList[i]._br;
-        if(type === 'st'){
-            ctx.strokeStyle = this.stylesList[i].co;
-            ctx.lineWidth = this.stylesList[i].wi;
-            ctx.lineCap = this.stylesList[i].lc;
-            ctx.lineJoin = this.stylesList[i].lj;
-            ctx.miterLimit = this.stylesList[i].ml || 0;
-        }else{
-            ctx.fillStyle = this.stylesList[i].co;
-        }
-        renderer.ctxOpacity(this.stylesList[i].coOp);
-        if(type !== 'st'){
-            ctx.beginPath();
-        }
-        jLen = elems.length;
-        for(j=0;j<jLen;j+=1){
-            if(type === 'st'){
-                ctx.beginPath();
-                if(this.stylesList[i].da){
-                    ctx.setLineDash(this.stylesList[i].da);
-                    ctx.lineDashOffset = this.stylesList[i].do;
-                    this._x.isDashed = true;
-                }else if(this._x.isDashed){
-                    ctx.setLineDash(this.dashResetter);
-                    this._x.isDashed = false;
-                }
-            }
-            nodes = elems[j].trNodes;
-            kLen = nodes.length;
-
-            for(k=0;k<kLen;k+=1){
-                if(nodes[k].t == 'm'){
-                    ctx.moveTo(nodes[k].p[0],nodes[k].p[1]);
-                }else if(nodes[k].t == 'c'){
-                    ctx.bezierCurveTo(nodes[k].p1[0],nodes[k].p1[1],nodes[k].p2[0],nodes[k].p2[1],nodes[k].p3[0],nodes[k].p3[1]);
-                }else{
-                    ctx.closePath();
-                }
-            }
-            if(type === 'st'){
-                ctx.stroke();
-            }
-        }
-        if(type !== 'st'){
-            ctx.fill(this.stylesList[i].r);
-        }
-        renderer.restore();
-    }
-    //renderer.restore();
-    if(this.firstFrame){
-        this.firstFrame = false;
-    }
-};
-_r.prototype.renderPath = function(pathData,itemData,groupTransform){
-    var len, i, j,jLen;
-    var redraw = groupTransform.matMdf || itemData.sh.mdf || this.firstFrame;
-    if(redraw) {
-        var paths = itemData.sh.paths, groupTransformMat = groupTransform.mat;
-        jLen = pathData._render === false ? 0 : paths._length;
-        var pathStringTransformed = itemData.trNodes;
-        pathStringTransformed.length = 0;
-        for(j=0;j<jLen;j+=1){
-            var pathNodes = paths.shapes[j];
-            if(pathNodes && pathNodes.v){
-                len = pathNodes._length;
-                for (i = 1; i < len; i += 1) {
-                    if (i == 1) {
-                        pathStringTransformed.push({
-                            t: 'm',
-                            p: groupTransformMat.applyToPointArray(pathNodes.v[0][0], pathNodes.v[0][1], 0)
-                        });
-                    }
-                    pathStringTransformed.push({
-                        t: 'c',
-                        p1: groupTransformMat.applyToPointArray(pathNodes.o[i - 1][0], pathNodes.o[i - 1][1], 0),
-                        p2: groupTransformMat.applyToPointArray(pathNodes.i[i][0], pathNodes.i[i][1], 0),
-                        p3: groupTransformMat.applyToPointArray(pathNodes.v[i][0], pathNodes.v[i][1], 0)
-                    });
-                }
-                if (len == 1) {
-                    pathStringTransformed.push({
-                        t: 'm',
-                        p: groupTransformMat.applyToPointArray(pathNodes.v[0][0], pathNodes.v[0][1], 0)
-                    });
-                }
-                if (pathNodes.c && len) {
-                    pathStringTransformed.push({
-                        t: 'c',
-                        p1: groupTransformMat.applyToPointArray(pathNodes.o[i - 1][0], pathNodes.o[i - 1][1], 0),
-                        p2: groupTransformMat.applyToPointArray(pathNodes.i[0][0], pathNodes.i[0][1], 0),
-                        p3: groupTransformMat.applyToPointArray(pathNodes.v[0][0], pathNodes.v[0][1], 0)
-                    });
-                    pathStringTransformed.push({
-                        t: 'z'
-                    });
-                }
-                itemData.lStr = pathStringTransformed;
-            }
-
-        }
-
-        if (itemData.st) {
-            for (i = 0; i < 16; i += 1) {
-                itemData.tr[i] = groupTransform.mat.props[i];
-            }
-        }
-        itemData.trNodes = pathStringTransformed;
-
-    }
-};
-
-
-
-_r.prototype.renderFill = function(styleData,itemData, groupTransform){
-    var styleElem = itemData.style;
-
-    if(itemData.c.mdf || this.firstFrame){
-        styleElem.co = 'rgb('+bm_floor(itemData.c.v[0])+','+bm_floor(itemData.c.v[1])+','+bm_floor(itemData.c.v[2])+')';
-    }
-    if(itemData.o.mdf || groupTransform.opMdf || this.firstFrame){
-        styleElem.coOp = itemData.o.v*groupTransform.opacity;
-    }
-};
-
-_r.prototype.renderStroke = function(styleData,itemData, groupTransform){
-    var styleElem = itemData.style;
-    //TODO fix dashes
-    var d = itemData.d;
-    if(d && (d.mdf  || this.firstFrame)){
-        styleElem.da = d.dashArray;
-        styleElem.do = d.dashoffset[0];
-    }
-    if(itemData.c.mdf || this.firstFrame){
-        styleElem.co = 'rgb('+bm_floor(itemData.c.v[0])+','+bm_floor(itemData.c.v[1])+','+bm_floor(itemData.c.v[2])+')';
-    }
-    if(itemData.o.mdf || groupTransform.opMdf || this.firstFrame){
-        styleElem.coOp = itemData.o.v*groupTransform.opacity;
-    }
-    if(itemData.w.mdf || this.firstFrame){
-        styleElem.wi = itemData.w.v;
-    }
-};
-
-
-_r.prototype.destroy = function(){
-    this.shapesData = null;
-    this._x = null;
-    this.canvasContext = null;
-    this.stylesList.length = 0;
-    this.itemsData.length = 0;
-};
-
-
-function _s(data, _x, comp) {
-    this.initElement(data,_x,comp);
-}
-extendPrototype([_e, _af, _c, _ad, _ac, _ae], _s);
-
-_s.prototype.initElement = _f.prototype.initElement;
-_s.prototype._az = _h.prototype._az;
-
-_s.prototype.renderInnerContent = function() {
-    var ctx = this.canvasContext;
-    ctx.fillStyle = this.data.sc;
-    ctx.fillRect(0, 0, this.data.sw, this.data.sh);
-    //
-};
-function _t(data, _x, comp){
-    this.textSpans = [];
-    this.yOffset = 0;
-    this.fillColorAnim = false;
-    this.strokeColorAnim = false;
-    this.strokeWidthAnim = false;
-    this.stroke = false;
-    this.fill = false;
-    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.initElement(data,_x,comp);
-}
-extendPrototype([_e,_af,_c,_ad,_ac,_ae,_k], _t);
-
-_t.prototype.tHelper = createTag('canvas').getContext('2d');
-
-_t.prototype.buildNewText = function(){
-    var documentData = this.textProperty.currentData;
-    this._bt = Array.apply(null,{length:documentData.l ? documentData.l.length : 0});
-
-    var hasFill = false;
-    if(documentData.fc) {
-        hasFill = true;
-        this.values.fill = this.buildColor(documentData.fc);
-    }else{
-        this.values.fill = 'rgba(0,0,0,0)';
-    }
-    this.fill = hasFill;
-    var hasStroke = false;
-    if(documentData.sc){
-        hasStroke = true;
-        this.values.stroke = this.buildColor(documentData.sc);
-        this.values.sWidth = documentData.sw;
-    }
-    var fontData = this._x.fontManager.getFontByName(documentData.f);
-    var i, len;
-    var letters = documentData.l;
-    var matrixHelper = this.mHelper;
-    this.stroke = hasStroke;
-    this.values.fValue = documentData.s + 'px '+ this._x.fontManager.getFontByName(documentData.f).fFamily;
-    len = documentData.t.length;
-    //this.tHelper.font = this.values.fValue;
-    var charData, shapeData, k, kLen, shapes, j, jLen, pathNodes, commands, pathArr, singleShape = this.data.singleShape;
-    var trackingOffset = documentData.tr/1000*documentData.s;
-    var xPos = 0, yPos = 0, firstLine = true;
-    var cnt = 0;
-    for (i = 0; i < len; i += 1) {
-        charData = this._x.fontManager.getCharData(documentData.t.charAt(i), fontData.fStyle, this._x.fontManager.getFontByName(documentData.f).fFamily);
-        shapeData = charData && charData.data || {};
-        matrixHelper.reset();
-        if(singleShape && letters[i].n) {
-            xPos = -trackingOffset;
-            yPos += documentData.yOffset;
-            yPos += firstLine ? 1 : 0;
-            firstLine = false;
-        }
-
-        shapes = shapeData.shapes ? shapeData.shapes[0].it : [];
-        jLen = shapes.length;
-        matrixHelper.scale(documentData.s/100,documentData.s/100);
-        if(singleShape){
-            this.applyTextPropertiesToMatrix(documentData, matrixHelper, letters[i].line, xPos, yPos);
-        }
-        commands = Array.apply(null,{length:jLen})
-        for(j=0;j<jLen;j+=1){
-            kLen = shapes[j].ks.k.i.length;
-            pathNodes = shapes[j].ks.k;
-            pathArr = [];
-            for(k=1;k<kLen;k+=1){
-                if(k==1){
-                    pathArr.push(matrixHelper.applyToX(pathNodes.v[0][0],pathNodes.v[0][1],0),matrixHelper.applyToY(pathNodes.v[0][0],pathNodes.v[0][1],0));
-                }
-                pathArr.push(matrixHelper.applyToX(pathNodes.o[k-1][0],pathNodes.o[k-1][1],0),matrixHelper.applyToY(pathNodes.o[k-1][0],pathNodes.o[k-1][1],0),matrixHelper.applyToX(pathNodes.i[k][0],pathNodes.i[k][1],0),matrixHelper.applyToY(pathNodes.i[k][0],pathNodes.i[k][1],0),matrixHelper.applyToX(pathNodes.v[k][0],pathNodes.v[k][1],0),matrixHelper.applyToY(pathNodes.v[k][0],pathNodes.v[k][1],0));
-            }
-            pathArr.push(matrixHelper.applyToX(pathNodes.o[k-1][0],pathNodes.o[k-1][1],0),matrixHelper.applyToY(pathNodes.o[k-1][0],pathNodes.o[k-1][1],0),matrixHelper.applyToX(pathNodes.i[0][0],pathNodes.i[0][1],0),matrixHelper.applyToY(pathNodes.i[0][0],pathNodes.i[0][1],0),matrixHelper.applyToX(pathNodes.v[0][0],pathNodes.v[0][1],0),matrixHelper.applyToY(pathNodes.v[0][0],pathNodes.v[0][1],0));
-            commands[j] = pathArr;
-        }
-        if(singleShape){
-            xPos += letters[i].l;
-            xPos += trackingOffset;
-        }
-        if(this.textSpans[cnt]){
-            this.textSpans[cnt].elem = commands;
-        } else {
-            this.textSpans[cnt] = {elem: commands};
-        }
-        cnt +=1;
-    }
-}
-
-_t.prototype.renderInnerContent = function(){
-    var ctx = this.canvasContext;
-    var finalMat = this.finalTransform.mat.props;
-    ctx.font = this.values.fValue;
-    ctx.lineCap = 'butt';
-    ctx.lineJoin = 'miter';
-    ctx.miterLimit = 4;
-
-    if(!this.data.singleShape){
-        this.textAnimator.getMeasures(this.textProperty.currentData, this.lettersChangedFlag);
-    }
-
-    var  i,len, j, jLen, k, kLen;
-    var _bt = this.textAnimator._bt;
-
-    var letters = this.textProperty.currentData.l;
-
-    len = letters.length;
-    var _bu;
-    var lastFill = null, lastStroke = null, lastStrokeW = null, commands, pathArr;
-    for(i=0;i<len;i+=1){
-        if(letters[i].n){
-            continue;
-        }
-        _bu = _bt[i];
-        if(_bu){
-            this._x.renderer.save();
-            this._x.renderer.ctxTransform(_bu.p);
-            this._x.renderer.ctxOpacity(_bu.o);
-        }
-        if(this.fill){
-            if(_bu && _bu.fc){
-                if(lastFill !== _bu.fc){
-                    lastFill = _bu.fc;
-                    ctx.fillStyle = _bu.fc;
-                }
-            }else if(lastFill !== this.values.fill){
-                lastFill = this.values.fill;
-                ctx.fillStyle = this.values.fill;
-            }
-            commands = this.textSpans[i].elem;
-            jLen = commands.length;
-            this._x.canvasContext.beginPath();
-            for(j=0;j<jLen;j+=1) {
-                pathArr = commands[j];
-                kLen = pathArr.length;
-                this._x.canvasContext.moveTo(pathArr[0], pathArr[1]);
-                for (k = 2; k < kLen; k += 6) {
-                    this._x.canvasContext.bezierCurveTo(pathArr[k], pathArr[k + 1], pathArr[k + 2], pathArr[k + 3], pathArr[k + 4], pathArr[k + 5]);
-                }
-            }
-            this._x.canvasContext.closePath();
-            this._x.canvasContext.fill();
-            ///ctx.fillText(this.textSpans[i].val,0,0);
-        }
-        if(this.stroke){
-            if(_bu && _bu.sw){
-                if(lastStrokeW !== _bu.sw){
-                    lastStrokeW = _bu.sw;
-                    ctx.lineWidth = _bu.sw;
-                }
-            }else if(lastStrokeW !== this.values.sWidth){
-                lastStrokeW = this.values.sWidth;
-                ctx.lineWidth = this.values.sWidth;
-            }
-            if(_bu && _bu.sc){
-                if(lastStroke !== _bu.sc){
-                    lastStroke = _bu.sc;
-                    ctx.strokeStyle = _bu.sc;
-                }
-            }else if(lastStroke !== this.values.stroke){
-                lastStroke = this.values.stroke;
-                ctx.strokeStyle = this.values.stroke;
-            }
-            commands = this.textSpans[i].elem;
-            jLen = commands.length;
-            this._x.canvasContext.beginPath();
-            for(j=0;j<jLen;j+=1) {
-                pathArr = commands[j];
-                kLen = pathArr.length;
-                this._x.canvasContext.moveTo(pathArr[0], pathArr[1]);
-                for (k = 2; k < kLen; k += 6) {
-                    this._x.canvasContext.bezierCurveTo(pathArr[k], pathArr[k + 1], pathArr[k + 2], pathArr[k + 3], pathArr[k + 4], pathArr[k + 5]);
-                }
-            }
-            this._x.canvasContext.closePath();
-            this._x.canvasContext.stroke();
-            ///ctx.strokeText(letters[i].val,0,0);
-        }
-        if(_bu) {
-            this._x.renderer.restore();
-        }
-    }
-    /*if(this.data.hasMask){
-     this._x.renderer.restore(true);
-     }*/
-};
-function _o() {
-
-}
-_o.prototype._ba = function(){}
-function _b(data,_x,comp){
-};
-
-_b.prototype.checkBlendMode = function(){
-};
-
-_b.prototype.get_e = _d.prototype.get_e;
-
-_b.prototype.initRendererElement = function(){
-    this._by = createTag('div');
-    if(this.data.hasMask) {
-        this._cf = createNS('svg');
-        this._bx = createNS('g');
-        this._ca = this._bx;
-        this._cf.appendChild(this._bx);
-        this._by.appendChild(this._cf);
-    } else {
-        this._bx = this._by;
-    }
-    styleDiv(this._by);
-}
-
-_b.prototype.createContainerElements = function(){
-    this.effectsManager = new _o(this);
-    this._bz = this._by;
-    this._ca = this._bx;
-    if (this.data.ln) {
-        this._bx.setAttribute('id',this.data.ln);
-    }
-    if (this.data.bm !== 0) {
-        this.setBlendMode();
-    }
-    this.checkParenting();
-};
-
-_b.prototype.renderElement = function() {
-    if(this.finalTransform.matMdf){
-        this._bz.style.transform = this._bz.style.webkitTransform = this.finalTransform.mat.toCSS();
-    }
-    if(this.finalTransform.opMdf){
-        this._bz.style.opacity = this.finalTransform.mProp.o.v;
-    }
-};
-
-_b.prototype._ba = function() {
-    //If it is exported as hidden (data.hd === true) no need to render
-    //If it is not visible no need to render
-    if (this.data.hd || this.hidden) {
-        return;
-    }
-    this.renderTransform();
-    this.renderRenderable();
-    this.renderElement();
-    this.renderInnerContent();
-    if (this.firstFrame) {
-        this.firstFrame = false;
-    }
-};
-
-_b.prototype.destroy = function(){
-    this._bx = null;
-    this._bz = null;
-    if(this.matteElement) {
-        this.matteElement = null;
-    }
-    if(this.maskManager) {
-        this.maskManager.destroy();
-        this.maskManager = null;
-    }
-};
-
-_b.prototype.getDomElement = function(){
-    return this._bx;
-};
-_b.prototype.addMasks = function(){
-    this.maskManager = new _ay(this.data, this, this._x);
-};
-
-_b.prototype.setMatte = function(){
-
-}
-
-_b.prototype.buildElementParenting = _ap.prototype.buildElementParenting;
-function _aa(data,_x,comp){
-    this.initElement(data,_x,comp);
-}
-extendPrototype([_e,_af,_b,_ad,_ac,RenderableDOMElement], _aa);
-
-_aa.prototype.createContent = function(){
-    var rect;
-    if(this.data.hasMask){
-        rect = createNS('rect');
-        rect.setAttribute('width',this.data.sw);
-        rect.setAttribute('height',this.data.sh);
-        rect.setAttribute('fill',this.data.sc);
-        this._cf.setAttribute('width',this.data.sw);
-        this._cf.setAttribute('height',this.data.sh);
-    } else {
-        rect = createTag('div');
-        rect.style.width = this.data.sw + 'px';
-        rect.style.height = this.data.sh + 'px';
-        rect.style.backgroundColor = this.data.sc;
-    }
-    this._bx.appendChild(rect);
-};
-
-function _w(data,_x,comp){
-    this.layers = data.layers;
-    this.supports3d = !data.hasMask;
-    this.completeLayers = false;
-    this.pendingElements = [];
-    this._br = this.layers ? Array.apply(null,{length:this.layers.length}) : [];
-    this.tm = data.tm ? _ai._bo(this,data.tm,0,_x.frameRate,this.dynamicProperties) : {_placeholder:true};
-    
-    this.initElement(data,_x,comp);
-}
-
-extendPrototype([_ap, _g, _b], _w);
-
-_w.prototype.createContainerElements = function(){
-    //divElement.style.clip = 'rect(0px, '+this.data.w+'px, '+this.data.h+'px, 0px)';
-    if(this.data.hasMask){
-        this._bz = this._bx;
-        this._cf.setAttribute('width',this.data.w);
-        this._cf.setAttribute('height',this.data.h);
-    }else{
-        this._bz = this._bx;
-
-    }
-    //this.appendNodeToParent(this._bx);
-    this.effectsManager = new _o(this);
-    this.checkParenting();
-};
-function _z(data,_x,comp){
-    //List of drawable _br
-    this.shapes = [];
-    // Full shape data
-    this.shapesData = data.shapes;
-    //List of styles that will be applied to shapes
-    this.stylesList = [];
-    //List of modifiers that will be applied to shapes
-    this.shapeModifiers = [];
-    //List of items in shape tree
-    this.itemsData = [];
-    //List of items in previous shape tree
-    this.processedElements = [];
-    this.shapesContainer = createNS('g');
-    this.initElement(data,_x,comp);
-    //Moving any property that doesn't get too much access after initialization because of v8 way of handling more than 10 properties.
-    // List of _br that have been created
-    this.prevViewData = [];
-    this._cg = {
-        x:999999,
-        y: -999999,
-        h: 0,
-        w: 0
-    };
-}
-extendPrototype([_e,_af,_aa,_f,_b,_ad,_ac,_ae], _z);
-_z.prototype._renderShapeFrame = _z.prototype.renderInnerContent;
-
-_z.prototype.createContent = function(){
-    var cont;
-    if (this.data.hasMask) {
-        this._bx.appendChild(this.shapesContainer);
-        cont = this._cf;
-    } else {
-        cont = createNS('svg');
-        var size = this.comp.data ? this.comp.data : this._x.compSize;
-        cont.setAttribute('width',size.w);
-        cont.setAttribute('height',size.h);
-        cont.appendChild(this.shapesContainer);
-        this._bx.appendChild(cont);
-    }
-
-    this.searchShapes(this.shapesData,this.itemsData,this.prevViewData,this.shapesContainer,this.dynamicProperties,0, [], true);
-    this.shapeCont = cont;
-};
-
-_z.prototype.renderInnerContent = function() {
-    this._renderShapeFrame();
-
-    //TODO: this also needs to be recalculated every time a property changes. Check how canvas renderer uses _x.mdf. Also would be great to calculate size from shapes and not from DOM.
-    if(!this.hidden && this.firstFrame) {
-        var boundingBox = this.shapeCont.getBBox();
-        var changed = false;
-        if(this._cg.w !== boundingBox.width){
-            this._cg.w = boundingBox.width;
-            this.shapeCont.setAttribute('width',boundingBox.width);
-            changed = true;
-        }
-        if(this._cg.h !== boundingBox.height){
-            this._cg.h = boundingBox.height;
-            this.shapeCont.setAttribute('height',boundingBox.height);
-            changed = true;
-        }
-        if(changed  || this._cg.x !== boundingBox.x  || this._cg.y !== boundingBox.y){
-            this._cg.w = boundingBox.width;
-            this._cg.h = boundingBox.height;
-            this._cg.x = boundingBox.x;
-            this._cg.y = boundingBox.y;
-
-            this.shapeCont.setAttribute('viewBox',this._cg.x+' '+this._cg.y+' '+this._cg.w+' '+this._cg.h);
-            this.shapeCont.style.transform = this.shapeCont.style.webkitTransform = 'translate(' + this._cg.x + 'px,' + this._cg.y + 'px)';
-        }
-    }
-
-};
-function _ab(data,_x,comp){
-    this.textSpans = [];
-    this.textPaths = [];
-    this._cg = {
-        x:999999,
-        y: -999999,
-        h: 0,
-        w: 0
-    }
-    this.renderType = 'svg';
-    this.isMasked = false;
-    this.initElement(data,_x,comp);
-
-}
-extendPrototype([_e,_af,_b,_ad,_ac,RenderableDOMElement,_k], _ab);
-
-_ab.prototype.createContent = function(){
-    this.isMasked = this.checkMasks();
-    if(this.isMasked){
-        this.renderType = 'svg';
-        this.compW = this.comp.data.w;
-        this.compH = this.comp.data.h;
-        this._cf.setAttribute('width',this.compW);
-        this._cf.setAttribute('height',this.compH);
-        var g = createNS('g');
-        this._ca.appendChild(g);
-        this._cc = g;
-    } else {
-        this.renderType = 'html';
-        this._cc = this._bx;
-    }
-
-    this.checkParenting();
-
-};
-
-_ab.prototype.buildNewText = function(){
-    var documentData = this.textProperty.currentData;
-    this._bt = Array.apply(null,{length:this.textProperty.currentData.l ? this.textProperty.currentData.l.length : 0});
-    var _cb = this._cc.style;
-    _cb.color = _cb.fill = documentData.fc ? this.buildColor(documentData.fc) : 'rgba(0,0,0,0)';
-    if(documentData.sc){
-        _cb.stroke = this.buildColor(documentData.sc);
-        _cb.strokeWidth = documentData.sw+'px';
-    }
-    var fontData = this._x.fontManager.getFontByName(documentData.f);
-    if(!this._x.fontManager.chars){
-        _cb.fontSize = documentData.s+'px';
-        _cb.lineHeight = documentData.s+'px';
-        if(fontData.fClass){
-            this._cc.className = fontData.fClass;
-        } else {
-            _cb.fontFamily = fontData.fFamily;
-            var fWeight = documentData.fWeight, fStyle = documentData.fStyle;
-            _cb.fontStyle = fStyle;
-            _cb.fontWeight = fWeight;
-        }
-    }
-    var i, len;
-
-    var letters = documentData.l;
-    len = letters.length;
-    var tSpan,tParent,tCont;
-    var matrixHelper = this.mHelper;
-    var shapes, shapeStr = '';
-    var cnt = 0;
-    for (i = 0;i < len ;i += 1) {
-        if(this._x.fontManager.chars){
-            if(!this.textPaths[cnt]){
-                tSpan = createNS('path');
-                tSpan.setAttribute('stroke-linecap', 'butt');
-                tSpan.setAttribute('stroke-linejoin','round');
-                tSpan.setAttribute('stroke-miterlimit','4');
-            } else {
-                tSpan = this.textPaths[cnt];
-            }
-            if(!this.isMasked){
-                if(this.textSpans[cnt]){
-                    tParent = this.textSpans[cnt];
-                    tCont = tParent.children[0];
-                } else {
-
-                    tParent = createTag('div');
-                    tCont = createNS('svg');
-                    tCont.appendChild(tSpan);
-                    styleDiv(tParent);
-                }
-            }
-        }else{
-            if(!this.isMasked){
-                if(this.textSpans[cnt]){
-                    tParent = this.textSpans[cnt];
-                    tSpan = this.textPaths[cnt];
-                } else {
-                    tParent = createTag('span');
-                    styleDiv(tParent);
-                    tSpan = createTag('span');
-                    styleDiv(tSpan);
-                    tParent.appendChild(tSpan);
-                }
-            } else {
-                tSpan = this.textPaths[cnt] ? this.textPaths[cnt] : createNS('text');
-            }
-        }
-        //tSpan.setAttribute('visibility', 'hidden');
-        if(this._x.fontManager.chars){
-            var charData = this._x.fontManager.getCharData(documentData.t.charAt(i), fontData.fStyle, this._x.fontManager.getFontByName(documentData.f).fFamily);
-            var shapeData;
-            if(charData){
-                shapeData = charData.data;
-            } else {
-                shapeData = null;
-            }
-            matrixHelper.reset();
-            if(shapeData && shapeData.shapes){
-                shapes = shapeData.shapes[0].it;
-                matrixHelper.scale(documentData.s/100,documentData.s/100);
-                shapeStr = this.createPathShape(matrixHelper,shapes);
-                tSpan.setAttribute('d',shapeStr);
-            }
-            if(!this.isMasked){
-                this._cc.appendChild(tParent);
-                if(shapeData && shapeData.shapes){
-
-                    var boundingBox = tCont.getBBox();
-                    tCont.setAttribute('width',boundingBox.width + 2);
-                    tCont.setAttribute('height',boundingBox.height + 2);
-                    tCont.setAttribute('viewBox',(boundingBox.x-1)+' '+ (boundingBox.y-1)+' '+ (boundingBox.width+2)+' '+ (boundingBox.height+2));
-                    tCont.style.transform = tCont.style.webkitTransform = 'translate(' + (boundingBox.x-1) + 'px,' + (boundingBox.y-1) + 'px)';
-
-                    letters[i].yOffset = boundingBox.y-1;
-                    tParent.appendChild(tCont);
-
-                } else{
-                    tCont.setAttribute('width',1);
-                    tCont.setAttribute('height',1);
-                }
-            }else{
-                this._cc.appendChild(tSpan);
-            }
-        }else{
-            tSpan.textContent = letters[i].val;
-            tSpan.setAttributeNS("http://www.w3.org/XML/1998/namespace", "xml:space","preserve");
-            if(!this.isMasked){
-                this._cc.appendChild(tParent);
-                //
-                tSpan.style.transform = tSpan.style.webkitTransform = 'translate3d(0,'+ -documentData.s/1.2+'px,0)';
-            } else {
-                this._cc.appendChild(tSpan);
-            }
-        }
-        //
-        if(!this.isMasked){
-            this.textSpans[cnt] = tParent;
-        }else{
-            this.textSpans[cnt] = tSpan;
-        }
-        this.textSpans[cnt].style.display = 'block';
-        this.textPaths[cnt] = tSpan;
-        cnt += 1;
-    }
-    while(cnt < this.textSpans.length){
-        this.textSpans[cnt].style.display = 'none';
-        cnt += 1;
-    }
-}
-
-_ab.prototype.renderInnerContent = function() {
-
-    if(this.data.singleShape){
-        if(!this.firstFrame && !this.lettersChangedFlag){
-            return;
-        } else {
-            // Todo Benchmark if using this is better than getBBox
-             if(this.isMasked && this.finalTransform.matMdf){
-                 this._cf.setAttribute('viewBox',-this.finalTransform.mProp.p.v[0]+' '+ -this.finalTransform.mProp.p.v[1]+' '+this.compW+' '+this.compH);
-                this._cf.style.transform = this._cf.style.webkitTransform = 'translate(' + -this.finalTransform.mProp.p.v[0] + 'px,' + -this.finalTransform.mProp.p.v[1] + 'px)';
-             }
-        }
-    }
-
-    this.textAnimator.getMeasures(this.textProperty.currentData, this.lettersChangedFlag);
-    if(!this.lettersChangedFlag && !this.textAnimator.lettersChangedFlag){
-        return;
-    }
-    var  i,len, count = 0;
-    var _bt = this.textAnimator._bt;
-
-    var letters = this.textProperty.currentData.l;
-
-    len = letters.length;
-    var _bu, textSpan, textPath;
-    for(i=0;i<len;i+=1){
-        if(letters[i].n){
-            count += 1;
-            continue;
-        }
-        textSpan = this.textSpans[i];
-        textPath = this.textPaths[i];
-        _bu = _bt[count];
-        count += 1;
-        if(!this.isMasked){
-            textSpan.style.transform = textSpan.style.webkitTransform = _bu.m;
-        }else{
-            textSpan.setAttribute('transform',_bu.m);
-        }
-        ////textSpan.setAttribute('opacity',_bu.o);
-        textSpan.style.opacity = _bu.o;
-        if(_bu.sw){
-            textPath.setAttribute('stroke-width',_bu.sw);
-        }
-        if(_bu.sc){
-            textPath.setAttribute('stroke',_bu.sc);
-        }
-        if(_bu.fc){
-            textPath.setAttribute('fill',_bu.fc);
-            textPath.style.color = _bu.fc;
-        }
-    }
-
-    //TODO: this also needs to be recalculated every time a property changes. Check how canvas renderer uses _x.mdf. Also would be great to calculate size from shapes and not from DOM.
-    if(this.isVisible && (this.firstFrame)){
-        if(this._cc.getBBox){
-            var boundingBox = this._cc.getBBox();
-
-            if(this._cg.w !== boundingBox.width){
-                this._cg.w = boundingBox.width;
-                this._cf.setAttribute('width',boundingBox.width);
-            }
-            if(this._cg.h !== boundingBox.height){
-                this._cg.h = boundingBox.height;
-                this._cf.setAttribute('height',boundingBox.height);
-            }
-
-            var margin = 1;
-            if(this._cg.w !== (boundingBox.width + margin*2) || this._cg.h !== (boundingBox.height + margin*2)  || this._cg.x !== (boundingBox.x - margin)  || this._cg.y !== (boundingBox.y - margin)){
-                this._cg.w = boundingBox.width + margin*2;
-                this._cg.h = boundingBox.height + margin*2;
-                this._cg.x = boundingBox.x - margin;
-                this._cg.y = boundingBox.y - margin;
-
-                this._cf.setAttribute('viewBox',this._cg.x+' '+this._cg.y+' '+this._cg.w+' '+this._cg.h);
-                this._cf.style.transform = this._cf.style.webkitTransform = 'translate(' + this._cg.x + 'px,' + this._cg.y + 'px)';
-            }
-        }
-    }
-}
-function _y(data,_x,comp){
-    this.assetData = _x.getAssetData(data.refId);
-    this.initElement(data,_x,comp);
-}
-
-extendPrototype([_e,_af,_b,_aa,_ad,_ac,_ae], _y);
-
-
-_y.prototype.createContent = function(){
-    var assetPath = this._x.getAssetsPath(this.assetData);
-    var img = new Image();
-
-    if(this.data.hasMask){
-        this.imageElem = createNS('image');
-        this.imageElem.setAttribute('width',this.assetData.w+"px");
-        this.imageElem.setAttribute('height',this.assetData.h+"px");
-        this.imageElem.setAttributeNS('http://www.w3.org/1999/xlink','href',assetPath);
-        this._bx.appendChild(this.imageElem);
-        this._by.setAttribute('width',this.assetData.w);
-        this._by.setAttribute('height',this.assetData.h);
-    } else {
-        this._bx.appendChild(img);
-    }
-    img.src = assetPath;
-    if(this.data.ln){
-        this._cc.setAttribute('id',this.data.ln);
-    }
-    this.checkParenting();
-};
-function _v(data,_x,comp){
-    this.initFrame();
-    this.initBaseData(data,_x,comp);
-    var _bo = _ai._bo;
-    this.pe = _bo(this,data.pe,0,0,this.dynamicProperties);
-    if(data.ks.p.s){
-        this.px = _bo(this,data.ks.p.x,1,0,this.dynamicProperties);
-        this.py = _bo(this,data.ks.p.y,1,0,this.dynamicProperties);
-        this.pz = _bo(this,data.ks.p.z,1,0,this.dynamicProperties);
-    }else{
-        this.p = _bo(this,data.ks.p,1,0,this.dynamicProperties);
-    }
-    if(data.ks.a){
-        this.a = _bo(this,data.ks.a,1,0,this.dynamicProperties);
-    }
-    if(data.ks.or.k.length && data.ks.or.k[0].to){
-        var i,len = data.ks.or.k.length;
-        for(i=0;i<len;i+=1){
-            data.ks.or.k[i].to = null;
-            data.ks.or.k[i].ti = null;
-        }
-    }
-    this.or = _bo(this,data.ks.or,1,degToRads,this.dynamicProperties);
-    this.or.sh = true;
-    this.rx = _bo(this,data.ks.rx,0,degToRads,this.dynamicProperties);
-    this.ry = _bo(this,data.ks.ry,0,degToRads,this.dynamicProperties);
-    this.rz = _bo(this,data.ks.rz,0,degToRads,this.dynamicProperties);
-    this.mat = new Matrix();
-    this._prevMat = new Matrix();
-    this.firstFrame = true;
-}
-extendPrototype([_e, _ac], _v);
-
-_v.prototype.setup = function() {
-    var i, len = this.comp.threeDElements.length, comp;
-    for(i=0;i<len;i+=1){
-        //[perspectiveElem,container]
-        comp = this.comp.threeDElements[i];
-        comp.perspectiveElem.style.perspective = comp.perspectiveElem.style.webkitPerspective = this.pe.v+'px';
-        comp.container.style.transformOrigin = comp.container.style.mozTransformOrigin = comp.container.style.webkitTransformOrigin = "0px 0px 0px";
-        comp.perspectiveElem.style.transform = comp.perspectiveElem.style.webkitTransform = 'matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1)';
-    }
-};
-
-_v.prototype.createElements = function(){
-};
-
-_v.prototype.hide = function(){
-};
-
-_v.prototype._ba = function(){
-    var mdf = this.firstFrame;
-    var i, len;
-    if(this.hierarchy){
-        len = this.hierarchy.length;
-        for(i=0;i<len;i+=1){
-            mdf = this.hierarchy[i].finalTransform.mProp.mdf ? true : mdf;
-        }
-    }
-    if(mdf || (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)) {
-        this.mat.reset();
-
-        if(this.p){
-            this.mat.translate(-this.p.v[0],-this.p.v[1],this.p.v[2]);
-        }else{
-            this.mat.translate(-this.px.v,-this.py.v,this.pz.v);
-        }
-        if(this.a){
-            var diffVector = [this.p.v[0]-this.a.v[0],this.p.v[1]-this.a.v[1],this.p.v[2]-this.a.v[2]];
-            var mag = Math.sqrt(Math.pow(diffVector[0],2)+Math.pow(diffVector[1],2)+Math.pow(diffVector[2],2));
-            //var lookDir = getNormalizedPoint(getDiffVector(this.a.v,this.p.v));
-            var lookDir = [diffVector[0]/mag,diffVector[1]/mag,diffVector[2]/mag];
-            var lookLengthOnXZ = Math.sqrt( lookDir[2]*lookDir[2] + lookDir[0]*lookDir[0] );
-            var m_rotationX = (Math.atan2( lookDir[1], lookLengthOnXZ ));
-            var m_rotationY = (Math.atan2( lookDir[0], -lookDir[2]));
-            this.mat.rotateY(m_rotationY).rotateX(-m_rotationX);
-
-        }
-        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._x.compSize.w/2,this._x.compSize.h/2,0);
-        this.mat.translate(0,0,this.pe.v);
-        if(this.hierarchy){
-            var mat;
-            len = this.hierarchy.length;
-            for(i=0;i<len;i+=1){
-                mat = this.hierarchy[i].finalTransform.mProp.iv.props;
-                this.mat.transform(mat[0],mat[1],mat[2],mat[3],mat[4],mat[5],mat[6],mat[7],mat[8],mat[9],mat[10],mat[11],-mat[12],-mat[13],mat[14],mat[15]);
-            }
-        }
-        if(!this._prevMat.equals(this.mat)) {
-            len = this.comp.threeDElements.length;
-            var comp;
-            for(i=0;i<len;i+=1){
-                comp = this.comp.threeDElements[i];
-                comp.container.style.transform = comp.container.style.webkitTransform = this.mat.toCSS();
-            }
-            this.mat.clone(this._prevMat);
-        }
-    } else {
-
-        //console.log('NO ENTRO')
-    }
-    this.firstFrame = false;
-};
-
-_v.prototype._az = function(num) {
-    this.prepareProperties(num, true);
-};
-
-_v.prototype.destroy = function(){
-};
-_v.prototype.initExpressions = function(){};
-_v.prototype.get_e = function(){return null};
-function _bv() {
-}
-_bv.prototype._ba = function(){}
 var animationManager = (function(){
     var moduleOb = {};
     var registeredAnimations = [];
@@ -10502,7 +8298,7 @@
             }
             var body = document.getElementsByTagName('body')[0];
             body.innerHTML = '';
-            var div = createTag('div');
+            var div = _cu('div');
             div.style.width = '100%';
             div.style.height = '100%';
             div.setAttribute('data-bm-type',renderer);
@@ -10565,7 +8361,7 @@
     this.frameMult = 0;
     this.playSpeed = 1;
     this.playDirection = 1;
-    this.pendingElements = 0;
+    this._dc = 0;
     this.playCount = 0;
     this.animationData = {};
     this.layers = [];
@@ -10585,6 +8381,8 @@
     this.projectInterface = ProjectInterface();
 };
 
+extendPrototype([BaseEvent], _a);
+
 _a.prototype.setParams = function(params) {
     var self = this;
     if(params.context){
@@ -10710,8 +8508,8 @@
         }
     }
     if(data.chars || data.fonts){
-        this.renderer._x.fontManager.addChars(data.chars);
-        this.renderer._x.fontManager.addFonts(data.fonts, this.renderer._x.defs);
+        this.renderer._x._cr.addChars(data.chars);
+        this.renderer._x._cr.addFonts(data.fonts, this.renderer._x.defs);
     }
     if(data.assets){
         len = data.assets.length;
@@ -10722,7 +8520,7 @@
     //this.totalFrames = 50;
     //this.animationData.tf = 50;
     this.animationData.__complete = false;
-    dataManager.completeData(this.animationData,this.renderer._x.fontManager);
+    dataManager.completeData(this.animationData,this.renderer._x._cr);
     this.renderer.includeLayers(data.layers);
     if(expressionsPlugin){
         expressionsPlugin.initExpressions(this);
@@ -10793,7 +8591,7 @@
     this.layers = this.animationData.layers;
     this.assets = this.animationData.assets;
     this.frameRate = this.animationData.fr;
-    this.firstFrame = Math.round(this.animationData.ip);
+    this._ch = Math.round(this.animationData.ip);
     this.frameMult = this.animationData.fr / 1000;
     this.trigger('config_ready');
     this.imagePreloader = new ImagePreloader();
@@ -10806,18 +8604,18 @@
     });
     this.loadSegments();
     this.updaFrameModifier();
-    if(this.renderer._x.fontManager){
+    if(this.renderer._x._cr){
         this.waitForFontsLoaded();
     }else{
-        dataManager.completeData(this.animationData,this.renderer._x.fontManager);
+        dataManager.completeData(this.animationData,this.renderer._x._cr);
         this.checkLoaded();
     }
 };
 
 _a.prototype.waitForFontsLoaded = (function(){
     function checkFontsLoaded(){
-        if(this.renderer._x.fontManager.loaded){
-            dataManager.completeData(this.animationData,this.renderer._x.fontManager);
+        if(this.renderer._x._cr.loaded){
+            dataManager.completeData(this.animationData,this.renderer._x._cr);
             //this.renderer.buildItems(this.animationData.layers);
             this.checkLoaded();
         }else{
@@ -10831,16 +8629,16 @@
 }());
 
 _a.prototype.addPendingElement = function () {
-    this.pendingElements += 1;
+    this._dc += 1;
 };
 
 _a.prototype.elementLoaded = function () {
-    this.pendingElements--;
+    this._dc--;
     this.checkLoaded();
 };
 
 _a.prototype.checkLoaded = function () {
-    if (this.pendingElements === 0) {
+    if (this._dc === 0) {
         if(expressionsPlugin){
             expressionsPlugin.initExpressions(this);
         }
@@ -10878,8 +8676,8 @@
     if(this.isLoaded === false){
         return;
     }
-    //console.log('this.currentFrame:',this.currentFrame + this.firstFrame);
-    this.renderer._ba(this.currentFrame + this.firstFrame);
+    //console.log('this.currentFrame:',this.currentFrame + this._ch);
+    this.renderer._ba(this.currentFrame + this._ch);
 };
 
 _a.prototype.play = function (name) {
@@ -10983,7 +8781,7 @@
             }
         }
         this.totalFrames = arr[0] - arr[1];
-        this.firstFrame = arr[1];
+        this._ch = arr[1];
         this.setCurrentRawFrameValue(this.totalFrames - 0.001);
     } else if(arr[1] > arr[0]){
         if(this.frameModifier < 0){
@@ -10994,7 +8792,7 @@
             }
         }
         this.totalFrames = arr[1] - arr[0];
-        this.firstFrame = arr[0];
+        this._ch = arr[0];
         this.setCurrentRawFrameValue(0.001);
     }
     this.trigger('segmentStart');
@@ -11002,14 +8800,14 @@
 _a.prototype.setSegment = function (init,end) {
     var pendingFrame = -1;
     if(this.isPaused) {
-        if (this.currentRawFrame + this.firstFrame < init) {
+        if (this.currentRawFrame + this._ch < init) {
             pendingFrame = init;
-        } else if (this.currentRawFrame + this.firstFrame > end) {
+        } else if (this.currentRawFrame + this._ch > end) {
             pendingFrame = end - init;
         }
     }
 
-    this.firstFrame = init;
+    this._ch = init;
     this.totalFrames = end - init;
     if(pendingFrame !== -1) {
         this.goToAndStop(pendingFrame,true);
@@ -11166,22 +8964,22 @@
     if(this._cbs && this._cbs[name]){
         switch(name){
             case 'enterFrame':
-                this.triggerEvent(name,new BMEnterFrameEvent(name,this.currentFrame,this.totalFrames,this.frameMult));
+                this._cy(name,new BMEnterFrameEvent(name,this.currentFrame,this.totalFrames,this.frameMult));
                 break;
             case 'loopComplete':
-                this.triggerEvent(name,new BMCompleteLoopEvent(name,this.loop,this.playCount,this.frameMult));
+                this._cy(name,new BMCompleteLoopEvent(name,this.loop,this.playCount,this.frameMult));
                 break;
             case 'complete':
-                this.triggerEvent(name,new BMCompleteEvent(name,this.frameMult));
+                this._cy(name,new BMCompleteEvent(name,this.frameMult));
                 break;
             case 'segmentStart':
-                this.triggerEvent(name,new BMSegmentStartEvent(name,this.firstFrame,this.totalFrames));
+                this._cy(name,new BMSegmentStartEvent(name,this._ch,this.totalFrames));
                 break;
             case 'destroy':
-                this.triggerEvent(name,new BMDestroyEvent(name,this));
+                this._cy(name,new BMDestroyEvent(name,this));
                 break;
             default:
-                this.triggerEvent(name);
+                this._cy(name);
         }
     }
     if(name === 'enterFrame' && this.onEnterFrame){
@@ -11194,17 +8992,2165 @@
         this.onComplete.call(this,new BMCompleteEvent(name,this.frameMult));
     }
     if(name === 'segmentStart' && this.onSegmentStart){
-        this.onSegmentStart.call(this,new BMSegmentStartEvent(name,this.firstFrame,this.totalFrames));
+        this.onSegmentStart.call(this,new BMSegmentStartEvent(name,this._ch,this.totalFrames));
     }
     if(name === 'destroy' && this.onDestroy){
         this.onDestroy.call(this,new BMDestroyEvent(name,this));
     }
 };
+function _aq(_cq, config){
+    this._cq = _cq;
+    this.renderConfig = {
+        clearCanvas: (config && config.clearCanvas !== undefined) ? config.clearCanvas : true,
+        context: (config && config.context) || null,
+        progressiveLoad: (config && config.progressiveLoad) || false,
+        preserveAspectRatio: (config && config.preserveAspectRatio) || 'xMidYMid meet',
+        className: (config && config.className) || ''
+    };
+    this.renderConfig.dpr = (config && config.dpr) || 1;
+    if (this._cq.wrapper) {
+        this.renderConfig.dpr = (config && config.dpr) || window.devicePixelRatio || 1;
+    }
+    //TODO remove this when fixed
+    // this.renderConfig.dpr = 1;
+    this.renderedFrame = -1;
+    this._x = {
+        frameNum: -1,
+        mdf: false,
+        renderConfig: this.renderConfig
+    };
+    var i, len = 15;
+    this.contextData = new _n();
+    this._br = [];
+    this._dc = [];
+    this.transformMat = new Matrix();
+    this._db = false;
+}
+extendPrototype([_l],_aq);
 
-_a.prototype.addEventListener = _addEventListener;
-_a.prototype.removeEventListener = _removeEventListener;
-_a.prototype.triggerEvent = _triggerEvent;
+_aq.prototype.createBase = function (data) {
+    return new _c(data, this._x, this);
+};
 
+_aq.prototype.createShape = function (data) {
+    return new _r(data, this._x, this);
+};
+
+_aq.prototype.createText = function (data) {
+    return new _t(data, this._x, this);
+};
+
+_aq.prototype.createImage = function (data) {
+    return new _p(data, this._x, this);
+};
+
+_aq.prototype.createComp = function (data) {
+    return new _m(data, this._x, this);
+};
+
+_aq.prototype.createSolid = function (data) {
+    return new _s(data, this._x, this);
+};
+
+_aq.prototype.createNull = _ao.prototype.createNull;
+
+_aq.prototype.ctxTransform = function(props){
+    if(props[0] === 1 && props[1] === 0 && props[4] === 0 && props[5] === 1 && props[12] === 0 && props[13] === 0){
+        return;
+    }
+    if(!this.renderConfig.clearCanvas){
+        this._da.transform(props[0],props[1],props[4],props[5],props[12],props[13]);
+        return;
+    }
+    this.transformMat.cloneFromProps(props);
+    var cProps = this.contextData.cTr.props;
+    this.transformMat.transform(cProps[0],cProps[1],cProps[2],cProps[3],cProps[4],cProps[5],cProps[6],cProps[7],cProps[8],cProps[9],cProps[10],cProps[11],cProps[12],cProps[13],cProps[14],cProps[15]);
+    //this.contextData.cTr.transform(props[0],props[1],props[2],props[3],props[4],props[5],props[6],props[7],props[8],props[9],props[10],props[11],props[12],props[13],props[14],props[15]);
+    this.contextData.cTr.cloneFromProps(this.transformMat.props);
+    var trProps = this.contextData.cTr.props;
+    this._da.setTransform(trProps[0],trProps[1],trProps[4],trProps[5],trProps[12],trProps[13]);
+};
+
+_aq.prototype.ctxOpacity = function(op){
+    /*if(op === 1){
+        return;
+    }*/
+    if(!this.renderConfig.clearCanvas){
+        this._da.globalAlpha *= op < 0 ? 0 : op;
+        return;
+    }
+    this.contextData.cO *= op < 0 ? 0 : op;
+    this._da.globalAlpha = this.contextData.cO;
+};
+
+_aq.prototype.reset = function(){
+    if(!this.renderConfig.clearCanvas){
+        this._da.restore();
+        return;
+    }
+    this.contextData.reset();
+};
+
+_aq.prototype.save = function(actionFlag){
+    if(!this.renderConfig.clearCanvas){
+        this._da.save();
+        return;
+    }
+    if(actionFlag){
+        this._da.save();
+    }
+    var props = this.contextData.cTr.props;
+    if(this.contextData._length <= this.contextData.cArrPos) {
+        this.contextData.duplicate();
+    }
+    var i, arr = this.contextData.saved[this.contextData.cArrPos];
+    for (i = 0; i < 16; i += 1) {
+        arr[i] = props[i];
+    }
+    this.contextData.savedOp[this.contextData.cArrPos] = this.contextData.cO;
+    this.contextData.cArrPos += 1;
+};
+
+_aq.prototype.restore = function(actionFlag){
+    if(!this.renderConfig.clearCanvas){
+        this._da.restore();
+        return;
+    }
+    if(actionFlag){
+        this._da.restore();
+        this._x.blendMode = 'source-over';
+    }
+    this.contextData.cArrPos -= 1;
+    var popped = this.contextData.saved[this.contextData.cArrPos];
+    var i,arr = this.contextData.cTr.props;
+    for(i=0;i<16;i+=1){
+        arr[i] = popped[i];
+    }
+    this._da.setTransform(popped[0],popped[1],popped[4],popped[5],popped[12],popped[13]);
+    popped = this.contextData.savedOp[this.contextData.cArrPos];
+    this.contextData.cO = popped;
+    this._da.globalAlpha = popped;
+};
+
+_aq.prototype.configAnimation = function(animData){
+    if(this._cq.wrapper){
+        this._cq.container = _cu('canvas');
+        this._cq.container.style.width = '100%';
+        this._cq.container.style.height = '100%';
+        //this._cq.container.style.transform = 'translate3d(0,0,0)';
+        //this._cq.container.style.webkitTransform = 'translate3d(0,0,0)';
+        this._cq.container.style.transformOrigin = this._cq.container.style.mozTransformOrigin = this._cq.container.style.webkitTransformOrigin = this._cq.container.style['-webkit-transform'] = "0px 0px 0px";
+        this._cq.wrapper.appendChild(this._cq.container);
+        this._da = this._cq.container.getContext('2d');
+        if(this.renderConfig.className) {
+            this._cq.container.setAttribute('class', this.renderConfig.className);
+        }
+    }else{
+        this._da = this.renderConfig.context;
+    }
+    this.data = animData;
+    this._x._da = this._da;
+    this._x.renderer = this;
+    this._x.isDashed = false;
+    this._x.totalFrames = Math.floor(animData.tf);
+    this._x.compWidth = animData.w;
+    this._x.compHeight = animData.h;
+    this._x.frameRate = animData.fr;
+    this._x.frameId = 0;
+    this._x._de = {
+        w: animData.w,
+        h: animData.h
+    };
+    this._x.progressiveLoad = this.renderConfig.progressiveLoad;
+    this.layers = animData.layers;
+    this._cx = {};
+    this._cx.w = animData.w;
+    this._cx.h = animData.h;
+    this._x._cr = new FontManager();
+    this._x._cr.addChars(animData.chars);
+    this._x._cr.addFonts(animData.fonts,document.body);
+    this._x.getAssetData = this._cq.getAssetData.bind(this._cq);
+    this._x.getAssetsPath = this._cq.getAssetsPath.bind(this._cq);
+    this._x.elementLoaded = this._cq.elementLoaded.bind(this._cq);
+    this._x.addPendingElement = this._cq.addPendingElement.bind(this._cq);
+    this._x._cx = this._cx;
+    this._br = _cv(animData.layers.length);
+
+    this.updateContainerSize();
+};
+
+_aq.prototype.updateContainerSize = function () {
+    this.reset();
+    var elementWidth,elementHeight;
+    if(this._cq.wrapper && this._cq.container){
+        elementWidth = this._cq.wrapper.offsetWidth;
+        elementHeight = this._cq.wrapper.offsetHeight;
+        this._cq.container.setAttribute('width',elementWidth * this.renderConfig.dpr );
+        this._cq.container.setAttribute('height',elementHeight * this.renderConfig.dpr);
+    }else{
+        elementWidth = this._da.canvas.width * this.renderConfig.dpr;
+        elementHeight = this._da.canvas.height * this.renderConfig.dpr;
+    }
+    var elementRel,animationRel;
+    if(this.renderConfig.preserveAspectRatio.indexOf('meet') !== -1 || this.renderConfig.preserveAspectRatio.indexOf('slice') !== -1){
+        var par = this.renderConfig.preserveAspectRatio.split(' ');
+        var fillType = par[1] || 'meet';
+        var pos = par[0] || 'xMidYMid';
+        var xPos = pos.substr(0,4);
+        var yPos = pos.substr(4);
+        elementRel = elementWidth/elementHeight;
+        animationRel = this._cx.w/this._cx.h;
+        if(animationRel>elementRel && fillType === 'meet' || animationRel<elementRel && fillType === 'slice'){
+            this._cx.sx = elementWidth/(this._cx.w/this.renderConfig.dpr);
+            this._cx.sy = elementWidth/(this._cx.w/this.renderConfig.dpr);
+        }else{
+            this._cx.sx = elementHeight/(this._cx.h / this.renderConfig.dpr);
+            this._cx.sy = elementHeight/(this._cx.h / this.renderConfig.dpr);
+        }
+
+        if(xPos === 'xMid' && ((animationRel<elementRel && fillType==='meet') || (animationRel>elementRel && fillType === 'slice'))){
+            this._cx.tx = (elementWidth-this._cx.w*(elementHeight/this._cx.h))/2*this.renderConfig.dpr;
+        } else if(xPos === 'xMax' && ((animationRel<elementRel && fillType==='meet') || (animationRel>elementRel && fillType === 'slice'))){
+            this._cx.tx = (elementWidth-this._cx.w*(elementHeight/this._cx.h))*this.renderConfig.dpr;
+        } else {
+            this._cx.tx = 0;
+        }
+        if(yPos === 'YMid' && ((animationRel>elementRel && fillType==='meet') || (animationRel<elementRel && fillType === 'slice'))){
+            this._cx.ty = ((elementHeight-this._cx.h*(elementWidth/this._cx.w))/2)*this.renderConfig.dpr;
+        } else if(yPos === 'YMax' && ((animationRel>elementRel && fillType==='meet') || (animationRel<elementRel && fillType === 'slice'))){
+            this._cx.ty = ((elementHeight-this._cx.h*(elementWidth/this._cx.w)))*this.renderConfig.dpr;
+        } else {
+            this._cx.ty = 0;
+        }
+
+    }else if(this.renderConfig.preserveAspectRatio == 'none'){
+        this._cx.sx = elementWidth/(this._cx.w/this.renderConfig.dpr);
+        this._cx.sy = elementHeight/(this._cx.h/this.renderConfig.dpr);
+        this._cx.tx = 0;
+        this._cx.ty = 0;
+    }else{
+        this._cx.sx = this.renderConfig.dpr;
+        this._cx.sy = this.renderConfig.dpr;
+        this._cx.tx = 0;
+        this._cx.ty = 0;
+    }
+    this._cx.props = [this._cx.sx,0,0,0,0,this._cx.sy,0,0,0,0,1,0,this._cx.tx,this._cx.ty,0,1];
+    /*var i, len = this._br.length;
+    for(i=0;i<len;i+=1){
+        if(this._br[i] && this._br[i].data.ty === 0){
+            this._br[i].resize(this._x._cx);
+        }
+    }*/
+    this.ctxTransform(this._cx.props);
+};
+
+_aq.prototype.destroy = function () {
+    if(this.renderConfig.clearCanvas) {
+        this._cq.wrapper.innerHTML = '';
+    }
+    var i, len = this.layers ? this.layers.length : 0;
+    for (i = len - 1; i >= 0; i-=1) {
+        if(this._br[i]) {
+            this._br[i].destroy();
+        }
+    }
+    this._br.length = 0;
+    this._x._da = null;
+    this._cq.container = null;
+    this.destroyed = true;
+};
+
+_aq.prototype._ba = function(num){
+    if((this.renderedFrame == num && this.renderConfig.clearCanvas === true) || this.destroyed || num === null){
+        return;
+    }
+    this.renderedFrame = num;
+    this._x.frameNum = num - this._cq._ch;
+    this._x.frameId += 1;
+    this._x.projectInterface.currentFrame = num;
+    if(this.renderConfig.clearCanvas === true){
+        //this.reset();
+        //this._da.save();
+        //this._da.canvas.width = this._da.canvas.width;
+        this._da.clearRect(this._cx.tx, this._cx.ty, this._cx.w*this._cx.sx, this._cx.h*this._cx.sy);
+    }else{
+        this.save();
+    }
+    this._da.beginPath();
+    this._da.rect(0,0,this._cx.w,this._cx.h);
+    this._da.closePath();
+    this._da.clip();
+
+     // console.log('--------');
+     // console.log('NEW: ',num);
+    var i, len = this.layers.length;
+    if(!this._db){
+        this.checkLayers(num);
+    }
+
+    for (i = 0; i < len; i++) {
+        if(this._db || this._br[i]){
+            this._br[i]._az(num - this.layers[i].st);
+        }
+    }
+    for (i = len - 1; i >= 0; i-=1) {
+        if(this._db || this._br[i]){
+            this._br[i]._ba();
+        }
+    }
+    if(this.renderConfig.clearCanvas !== true){
+        this.restore();
+    } else {
+        //this._da.restore();
+    }
+    // console.log(this.contextData.cTr.props)
+};
+
+_aq.prototype.buildItem = function(pos){
+    var _br = this._br;
+    if(_br[pos] || this.layers[pos].ty == 99){
+        return;
+    }
+    var element = this.createItem(this.layers[pos], this,this._x);
+    _br[pos] = element;
+    element.initExpressions();
+    /*if(this.layers[pos].ty === 0){
+        element.resize(this._x._cx);
+    }*/
+};
+
+_aq.prototype.checkPendingElements  = function(){
+    while(this._dc.length){
+        var element = this._dc.pop();
+        element.checkParenting();
+    }
+};
+
+_aq.prototype.hide = function(){
+    this._cq.container.style.display = 'none';
+};
+
+_aq.prototype.show = function(){
+    this._cq.container.style.display = 'block';
+};
+
+_aq.prototype.searchExtraCompositions = function(assets){
+    var i, len = assets.length;
+    var floatingContainer = _ct('g');
+    for(i=0;i<len;i+=1){
+        if(assets[i].xt){
+            var comp = this.createComp(assets[i],this._x.comp,this._x);
+            comp.initExpressions();
+            //comp.compInterface = CompExpressionInterface(comp);
+            //Expressions.addLayersInterface(comp._br, this._x.projectInterface);
+            this._x.projectInterface.registerComposition(comp);
+        }
+    }
+};
+
+function _ap(_cq, config){
+    this._cq = _cq;
+    this.layers = null;
+    this.renderedFrame = -1;
+    this.renderConfig = {
+        className: (config && config.className) || '',
+        hideOnTransparent: (config && config.hideOnTransparent === false) ? false : true
+    };
+    this._x = {
+        mdf: false,
+        frameNum: -1,
+        renderConfig: this.renderConfig
+    };
+    this._dc = [];
+    this._br = [];
+    this.threeDElements = [];
+    this.destroyed = false;
+    this.camera = null;
+    this.supports3d = true;
+
+}
+
+extendPrototype([_l],_ap);
+
+_ap.prototype.buildItem = _ao.prototype.buildItem;
+
+_ap.prototype.checkPendingElements  = function(){
+    while(this._dc.length){
+        var element = this._dc.pop();
+        element.checkParenting();
+    }
+};
+
+_ap.prototype.appendElementInPos = function(element, pos){
+    var newDOMElement = element.get_e();
+    if(!newDOMElement){
+        return;
+    }
+    var layer = this.layers[pos];
+    if(!layer.ddd || !this.supports3d){
+        var i = 0;
+        var nextDOMElement, nextLayer;
+        while(i<pos){
+            if(this._br[i] && this._br[i]!== true && this._br[i].get_e){
+                nextLayer = this._br[i];
+                nextDOMElement = this.layers[i].ddd ? this.getThreeDContainerByPos(i) : nextLayer.get_e();
+            }
+            i += 1;
+        }
+        if(nextDOMElement){
+            if(!layer.ddd || !this.supports3d){
+                this._bx.insertBefore(newDOMElement, nextDOMElement);
+            }
+        } else {
+            if(!layer.ddd || !this.supports3d){
+                this._bx.appendChild(newDOMElement);
+            }
+        }
+    } else {
+        this.addTo3dContainer(newDOMElement,pos);
+    }
+};
+
+
+_ap.prototype.createBase = function (data) {
+    return new _d(data, this._x, this);
+};
+
+_ap.prototype.createShape = function (data) {
+    if(!this.supports3d){
+        return new SVGShapeElement(data, this._x, this);
+    }
+    return new _z(data, this._x, this);
+};
+
+_ap.prototype.createText = function (data) {
+    if(!this.supports3d){
+        return new _cw(data, this._x, this);
+    }
+    return new _ab(data, this._x, this);
+};
+
+_ap.prototype.createCamera = function (data) {
+    this.camera = new _v(data, this._x, this);
+    return this.camera;
+};
+
+_ap.prototype.createImage = function (data) {
+    if(!this.supports3d){
+        return new _h(data, this._x, this);
+    }
+    return new _y(data, this._x, this);
+};
+
+_ap.prototype.createComp = function (data) {
+    if(!this.supports3d){
+        return new _g(data, this._x, this);
+    }
+    return new _w(data, this._x, this);
+
+};
+
+_ap.prototype.createSolid = function (data) {
+    if(!this.supports3d){
+        return new _j(data, this._x, this);
+    }
+    return new _aa(data, this._x, this);
+};
+
+_ap.prototype.createNull = _ao.prototype.createNull;
+
+_ap.prototype.getThreeDContainerByPos = function(pos){
+    var i = 0, len = this.threeDElements.length;
+    while(i<len) {
+        if(this.threeDElements[i].startPos <= pos && this.threeDElements[i].endPos >= pos) {
+            return this.threeDElements[i].perspectiveElem;
+        }
+        i += 1;
+    }
+}
+
+_ap.prototype.createThreeDContainer = function(pos){
+    var perspectiveElem = _cu('div');
+    styleDiv(perspectiveElem);
+    perspectiveElem.style.width = this._x._de.w+'px';
+    perspectiveElem.style.height = this._x._de.h+'px';
+    perspectiveElem.style.transformOrigin = perspectiveElem.style.mozTransformOrigin = perspectiveElem.style.webkitTransformOrigin = "50% 50%";
+    var container = _cu('div');
+    styleDiv(container);
+    container.style.transform = container.style.webkitTransform = 'matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1)';
+    perspectiveElem.appendChild(container);
+    this.resizerElem.appendChild(perspectiveElem);
+    var threeDContainerData = {
+        container:container,
+        perspectiveElem:perspectiveElem,
+        startPos: pos,
+        endPos: pos
+    };
+    this.threeDElements.push(threeDContainerData);
+    return threeDContainerData;
+};
+
+_ap.prototype.build3dContainers = function(){
+    var i, len = this.layers.length;
+    var lastThreeDContainerData;
+    for(i=0;i<len;i+=1){
+        if(this.layers[i].ddd){
+            if(!lastThreeDContainerData){
+                lastThreeDContainerData = this.createThreeDContainer(i);
+            }
+            lastThreeDContainerData.endPos = Math.max(lastThreeDContainerData.endPos,i);
+        } else {
+            lastThreeDContainerData = null;
+        }
+    }
+};
+
+_ap.prototype.addTo3dContainer = function(elem,pos){
+    var i = 0, len = this.threeDElements.length;
+    while(i<len){
+        if(pos <= this.threeDElements[i].endPos){
+            var j = this.threeDElements[i].startPos;
+            var nextElement;
+            while(j<pos){
+                if(this._br[j] && this._br[j].get_e){
+                    nextElement = this._br[j].get_e();
+                }
+                j += 1;
+            }
+            if(nextElement){
+                this.threeDElements[i].container.insertBefore(elem, nextElement);
+            } else {
+                this.threeDElements[i].container.appendChild(elem);
+            }
+            break;
+        }
+        i += 1;
+    }
+};
+
+_ap.prototype.configAnimation = function(animData){
+    var resizerElem = _cu('div');
+    var wrapper = this._cq.wrapper;
+    resizerElem.style.width = animData.w+'px';
+    resizerElem.style.height = animData.h+'px';
+    this.resizerElem = resizerElem;
+    styleDiv(resizerElem);
+    resizerElem.style.transformStyle = resizerElem.style.webkitTransformStyle = resizerElem.style.mozTransformStyle = "flat";
+    if(this.renderConfig.className) {
+      wrapper.setAttribute('class', this.renderConfig.className);
+    }
+    wrapper.appendChild(resizerElem);
+
+    resizerElem.style.overflow = 'hidden';
+    var svg = _ct('svg');
+    svg.setAttribute('width','1');
+    svg.setAttribute('height','1');
+    styleDiv(svg);
+    this.resizerElem.appendChild(svg);
+    var defs = _ct('defs');
+    svg.appendChild(defs);
+    this._x.defs = defs;
+    this.data = animData;
+    //Mask animation
+    this._x.getAssetData = this._cq.getAssetData.bind(this._cq);
+    this._x.getAssetsPath = this._cq.getAssetsPath.bind(this._cq);
+    this._x.elementLoaded = this._cq.elementLoaded.bind(this._cq);
+    this._x.frameId = 0;
+    this._x._de = {
+        w: animData.w,
+        h: animData.h
+    };
+    this._x.frameRate = animData.fr;
+    this.layers = animData.layers;
+    this._x._cr = new FontManager();
+    this._x._cr.addChars(animData.chars);
+    this._x._cr.addFonts(animData.fonts,svg);
+    this._bx = this.resizerElem;
+    this.build3dContainers();
+    this.updateContainerSize();
+};
+
+_ap.prototype.destroy = function () {
+    this._cq.wrapper.innerHTML = '';
+    this._cq.container = null;
+    this._x.defs = null;
+    var i, len = this.layers ? this.layers.length : 0;
+    for (i = 0; i < len; i++) {
+        this._br[i].destroy();
+    }
+    this._br.length = 0;
+    this.destroyed = true;
+    this._cq = null;
+};
+
+_ap.prototype.updateContainerSize = function () {
+    var elementWidth = this._cq.wrapper.offsetWidth;
+    var elementHeight = this._cq.wrapper.offsetHeight;
+    var elementRel = elementWidth/elementHeight;
+    var animationRel = this._x._de.w/this._x._de.h;
+    var sx,sy,tx,ty;
+    if(animationRel>elementRel){
+        sx = elementWidth/(this._x._de.w);
+        sy = elementWidth/(this._x._de.w);
+        tx = 0;
+        ty = ((elementHeight-this._x._de.h*(elementWidth/this._x._de.w))/2);
+    }else{
+        sx = elementHeight/(this._x._de.h);
+        sy = elementHeight/(this._x._de.h);
+        tx = (elementWidth-this._x._de.w*(elementHeight/this._x._de.h))/2;
+        ty = 0;
+    }
+    this.resizerElem.style.transform = this.resizerElem.style.webkitTransform = 'matrix3d(' + sx + ',0,0,0,0,'+sy+',0,0,0,0,1,0,'+tx+','+ty+',0,1)';
+};
+
+_ap.prototype._ba = _ao.prototype._ba;
+
+_ap.prototype.hide = function(){
+    this.resizerElem.style.display = 'none';
+};
+
+_ap.prototype.show = function(){
+    this.resizerElem.style.display = 'block';
+};
+
+_ap.prototype.initItems = function(){
+    this.buildAllItems();
+    if(this.camera){
+        this.camera.setup();
+    } else {
+        var cWidth = this._x._de.w;
+        var cHeight = this._x._de.h;
+        var i, len = this.threeDElements.length;
+        for(i=0;i<len;i+=1){
+            this.threeDElements[i].perspectiveElem.style.perspective = this.threeDElements[i].perspectiveElem.style.webkitPerspective = Math.sqrt(Math.pow(cWidth,2) + Math.pow(cHeight,2)) + 'px';
+        }
+    }
+};
+
+_ap.prototype.searchExtraCompositions = function(assets){
+    var i, len = assets.length;
+    var floatingContainer = _cu('div');
+    for(i=0;i<len;i+=1){
+        if(assets[i].xt){
+            var comp = this.createComp(assets[i],floatingContainer,this._x.comp,null);
+            comp.initExpressions();
+            this._x.projectInterface.registerComposition(comp);
+        }
+    }
+};
+
+function _n() {
+	this.saved = [];
+    this.cArrPos = 0;
+    this.cTr = new Matrix();
+    this.cO = 1;
+    var i, len = 15;
+    this.savedOp = _cs('float32', len);
+    for(i=0;i<len;i+=1){
+        this.saved[i] = _cs('float32', 16);
+    }
+    this._length = len;
+}
+
+_n.prototype.duplicate = function() {
+	var newLength = this._length * 2;
+	var currentSavedOp = this.savedOp;
+    this.savedOp = _cs('float32', newLength);
+    this.savedOp.set(currentSavedOp);
+    var i = 0;
+    for(i = this._length; i < newLength; i += 1) {
+        this.saved[i] = _cs('float32', 16);
+    }
+    this._length = newLength;
+}
+
+_n.prototype.reset = function() {
+	this.cArrPos = 0;
+	this.cTr.reset();
+    this.cO = 1;
+}
+function _c(data, comp, _x){
+}
+
+_c.prototype.createElements = function(){
+    this.checkParenting();
+};
+
+_c.prototype.initRendererElement = function(){
+
+};
+_c.prototype.createContainerElements = function(){
+    this._da = this._x._da;
+    this.effectsManager = new _o(this);
+};
+_c.prototype.createContent = function(){};
+
+_c.prototype.setBlendMode = function(){
+    var _x = this._x;
+    if(_x.blendMode !== this.data.bm) {
+        _x.blendMode = this.data.bm;
+        var blendModeValue = this.getBlendMode();
+        _x._da.globalCompositeOperation = blendModeValue;
+    }
+};
+
+_c.prototype.addMasks = function(){
+    this.maskManager = new _q(this.data, this, this._x);
+};
+
+_c.prototype.hideElement = function(){
+    if (!this.hidden && (!this.isInRange || this.isTransparent)) {
+        this.hidden = true;
+    }
+};
+
+_c.prototype.showElement = function(){
+    if (this.isInRange && !this.isTransparent){
+        this.hidden = false;
+        this._ch = true;
+        this.maskManager._ch = true;
+    }
+};
+
+_c.prototype._ba = function() {
+    if (this.hidden) {
+        return;
+    }
+    this.renderTransform();
+    this.renderRenderable();
+    this.setBlendMode();
+    this._x.renderer.save();
+    this._x.renderer.ctxTransform(this.finalTransform.mat.props);
+    this._x.renderer.ctxOpacity(this.finalTransform.mProp.o.v);
+    this.renderInnerContent();
+    this._x.renderer.restore();
+    if(this.maskManager.hasMasks) {
+        this._x.renderer.restore(true);
+    }
+    if (this._ch) {
+        this._ch = false;
+    }
+};
+
+_c.prototype.hide = _c.prototype.hideElement;
+_c.prototype.show = _c.prototype.showElement;
+
+_c.prototype.destroy = function(){
+    this._da = null;
+    this.data = null;
+    this._x = null;
+    this.maskManager.destroy();
+};
+
+_c.prototype.mHelper = new Matrix();
+
+function _p(data, _x, comp){
+    this.failed = false;
+    this.img = new Image();
+    this.assetData = _x.getAssetData(data.refId);
+    this._cz(data,_x,comp);
+    this._x.addPendingElement();
+}
+extendPrototype([_e, _af, _c, _ad, _ac, _ae], _p);
+
+_p.prototype._cz = SVGShapeElement.prototype._cz;
+_p.prototype._az = _h.prototype._az;
+
+_p.prototype.imageLoaded = function() {
+    this._x.elementLoaded();
+    if(this.assetData.w !== this.img.width || this.assetData.h !== this.img.height){
+        var canvas = _cu('canvas');
+        canvas.width = this.assetData.w;
+        canvas.height = this.assetData.h;
+        var ctx = canvas.getContext('2d');
+
+        var imgW = this.img.width;
+        var imgH = this.img.height;
+        var imgRel = imgW / imgH;
+        var canvasRel = this.assetData.w/this.assetData.h;
+        var widthCrop, heightCrop;
+        if(imgRel>canvasRel){
+            heightCrop = imgH;
+            widthCrop = heightCrop*canvasRel;
+        } else {
+            widthCrop = imgW;
+            heightCrop = widthCrop/canvasRel;
+        }
+        ctx.drawImage(this.img,(imgW-widthCrop)/2,(imgH-heightCrop)/2,widthCrop,heightCrop,0,0,this.assetData.w,this.assetData.h);
+        this.img = canvas;
+    }
+}
+
+_p.prototype.imageFailed = function() {
+    this.failed = true;
+    this._x.elementLoaded();
+}
+
+_p.prototype.createContent = function(){
+    var img = this.img;
+    img.addEventListener('load', this.imageLoaded.bind(this), false);
+    img.addEventListener('error', this.imageFailed.bind(this), false);
+    var assetPath = this._x.getAssetsPath(this.assetData);
+    img.src = assetPath;
+
+};
+
+_p.prototype.renderInnerContent = function(parentMatrix){
+    if (this.failed) {
+        return;
+    }
+    this._da.drawImage(this.img, 0, 0);
+};
+
+_p.prototype.destroy = function(){
+    this.img = null;
+    this.destroy_e();
+};
+function _m(data, _x, comp) {
+    this._db = false;
+    this.layers = data.layers;
+    this._dc = [];
+    this._br = _cv(this.layers.length);
+    this._cz(data, _x, comp);
+    this.tm = data.tm ? _ai._bo(this,data.tm,0,_x.frameRate,this._co) : {_placeholder:true};
+}
+
+extendPrototype([_aq, _g, _c], _m);
+
+_m.prototype.renderInnerContent = function() {
+    var i,len = this.layers.length;
+    for( i = len - 1; i >= 0; i -= 1 ){
+        if(this._db || this._br[i]){
+            this._br[i]._ba();
+        }
+    }
+};
+
+_m.prototype.destroy = function(){
+    var i,len = this.layers.length;
+    for( i = len - 1; i >= 0; i -= 1 ){
+        this._br[i].destroy();
+    }
+    this.layers = null;
+    this._br = null;
+};
+
+function _q(data,element){
+    this.data = data;
+    this.element = element;
+    this._co = [];
+    this.masksProperties = this.data.masksProperties || [];
+    this.viewData = _cv(this.masksProperties.length);
+    var i, len = this.masksProperties.length, hasMasks = false;
+    for (i = 0; i < len; i++) {
+        if(this.masksProperties[i].mode !== 'n'){
+            hasMasks = true;
+        }
+        this.viewData[i] = _ah._bp(this.element,this.masksProperties[i],3,this._co,null);
+    }
+    this.hasMasks = hasMasks;
+}
+
+_q.prototype._az = function(num){
+    var i, len = this._co.length;
+    for(i=0;i<len;i+=1){
+        this._co[i].getValue(num);
+        if(this._co[i].mdf){
+            this.element._x.mdf = true;
+        }
+    }
+};
+
+_q.prototype._ba = function (transform) {
+    if(!this.hasMasks){
+        return;
+    }
+    var ctx = this.element._da;
+    var i, len = this.masksProperties.length;
+    var pt,pt2,pt3,data;
+    ctx.beginPath();
+    for (i = 0; i < len; i++) {
+        if(this.masksProperties[i].mode !== 'n'){
+            if (this.masksProperties[i].inv) {
+                ctx.moveTo(0, 0);
+                ctx.lineTo(this.element._x.compWidth, 0);
+                ctx.lineTo(this.element._x.compWidth, this.element._x.compHeight);
+                ctx.lineTo(0, this.element._x.compHeight);
+                ctx.lineTo(0, 0);
+            }
+            data = this.viewData[i].v;
+            pt = transform ? transform._cn(data.v[0][0],data.v[0][1],0):data.v[0];
+            ctx.moveTo(pt[0], pt[1]);
+            var j, jLen = data._length;
+            for (j = 1; j < jLen; j++) {
+                pt = transform ? transform._cn(data.o[j - 1][0],data.o[j - 1][1],0) : data.o[j - 1];
+                pt2 = transform ? transform._cn(data.i[j][0],data.i[j][1],0) : data.i[j];
+                pt3 = transform ? transform._cn(data.v[j][0],data.v[j][1],0) : data.v[j];
+                ctx.bezierCurveTo(pt[0], pt[1], pt2[0], pt2[1], pt3[0], pt3[1]);
+            }
+            pt = transform ? transform._cn(data.o[j - 1][0],data.o[j - 1][1],0) : data.o[j - 1];
+            pt2 = transform ? transform._cn(data.i[0][0],data.i[0][1],0) : data.i[0];
+            pt3 = transform ? transform._cn(data.v[0][0],data.v[0][1],0) : data.v[0];
+            ctx.bezierCurveTo(pt[0], pt[1], pt2[0], pt2[1], pt3[0], pt3[1]);
+        }
+    }
+    this.element._x.renderer.save(true);
+    ctx.clip();
+};
+
+_q.prototype.getMaskProperty = _ay.prototype.getMaskProperty;
+
+_q.prototype.destroy = function(){
+    this.element = null;
+};
+function _r(data, _x, comp) {
+    this.shapes = [];
+    this.shapesData = data.shapes;
+    this.stylesList = [];
+    this.itemsData = [];
+    this.prevViewData = [];
+    this.shapeModifiers = [];
+    this.processedElements = [];
+    this._cz(data, _x, comp);
+}
+
+extendPrototype([_e,_af,_c,_f,_ad,_ac,_ae], _r);
+
+_r.prototype._cz = _ci.prototype._cz;
+
+_r.prototype.transformHelper = {opacity:1,mat:new Matrix(),matMdf:false,opMdf:false};
+
+_r.prototype.dashResetter = [];
+
+_r.prototype.createContent = function(){
+    this.searchShapes(this.shapesData,this.itemsData,this.prevViewData,this._co, true);
+};
+
+_r.prototype.createStyleElement = function(data, _co){
+    var styleElem = {
+        data: data,
+        type: data.ty,
+        _br: []
+    };
+    var elementData = {};
+    if(data.ty == 'fl' || data.ty == 'st'){
+        elementData.c = _ai._bo(this,data.c,1,255,_co);
+        if(!elementData.c.k){
+            styleElem.co = 'rgb('+bm_floor(elementData.c.v[0])+','+bm_floor(elementData.c.v[1])+','+bm_floor(elementData.c.v[2])+')';
+        }
+    }
+    elementData.o = _ai._bo(this,data.o,0,0.01,_co);
+    if(data.ty == 'st') {
+        styleElem.lc = this.lcEnum[data.lc] || 'round';
+        styleElem.lj = this.ljEnum[data.lj] || 'round';
+        if(data.lj == 1) {
+            styleElem.ml = data.ml;
+        }
+        elementData.w = _ai._bo(this,data.w,0,null,_co);
+        if(!elementData.w.k){
+            styleElem.wi = elementData.w.v;
+        }
+        if(data.d){
+            var d = new DashProperty(this,data.d,'canvas',_co);
+            elementData.d = d;
+            if(!elementData.d.k){
+                styleElem.da = elementData.d.dashArray;
+                styleElem.do = elementData.d.dashoffset[0];
+            }
+        }
+
+    } else {
+
+        styleElem.r = data.r === 2 ? 'evenodd' : 'nonzero';
+    }
+    this.stylesList.push(styleElem);
+    elementData.style = styleElem;
+    return elementData;
+}
+
+_r.prototype.createGroupElement = function(data) {
+    var elementData = {
+        it: [],
+        prevViewData: []
+    };
+    return elementData;
+}
+
+_r.prototype._cp = function(data, _co) {
+    var elementData = {
+        transform : {
+            mat: new Matrix(),
+            opacity: 1,
+            matMdf:false,
+            opMdf:false,
+            op: _ai._bo(this,data.o,0,0.01,_co),
+            //mProps: _ai._bo(this,data,2,null,_co)
+            mProps: _ag._bj(this,data,_co)
+        },
+        _br: []
+    };
+    return elementData;
+}
+
+_r.prototype.createShapeElement = function(data, _co) {
+    var elementData = {
+        nodes:[],
+        trNodes:[],
+        tr:[0,0,0,0,0,0]
+    };
+    var ty = 4;
+    if(data.ty == 'rc'){
+        ty = 5;
+    }else if(data.ty == 'el'){
+        ty = 6;
+    }else if(data.ty == 'sr'){
+        ty = 7;
+    }
+    elementData.sh = _ah._bp(this,data,ty,_co);
+    this.shapes.push(elementData.sh);
+    this.addShapeToModifiers(elementData);
+    var j, jLen = this.stylesList.length;
+    var hasStrokes = false, hasFills = false;
+    for(j=0;j<jLen;j+=1){
+        if(!this.stylesList[j].closed){
+            this.stylesList[j]._br.push(elementData);
+            if(this.stylesList[j].type === 'st'){
+                hasStrokes = true;
+            }else{
+                hasFills = true;
+            }
+        }
+    }
+    elementData.st = hasStrokes;
+    elementData.fl = hasFills;
+    return elementData;
+}
+
+_r.prototype.reloadShapes = function(){
+    this._ch = true;
+    var i, len = this.itemsData.length;
+    for(i=0;i<len;i+=1){
+        this.prevViewData[i] = this.itemsData[i];
+    }
+    this.searchShapes(this.shapesData,this.itemsData,this.prevViewData,this._co, true);
+    var i, len = this._co.length;
+    for(i=0;i<len;i+=1){
+        this._co[i].getValue();
+    }
+    this.renderModifiers();
+}
+
+_r.prototype.searchShapes = function(arr,itemsData, prevViewData,_co, render){
+    var i, len = arr.length - 1;
+    var j, jLen;
+    var ownArrays = [], ownModifiers = [], processedPos;
+    for(i=len;i>=0;i-=1){
+        processedPos = this.searchProcessedElement(arr[i]);
+        if(!processedPos){
+            arr[i]._render = render;
+        } else {
+            itemsData[i] = prevViewData[processedPos - 1];
+        }
+        if(arr[i].ty == 'fl' || arr[i].ty == 'st'){
+            if(!processedPos){
+                itemsData[i] = this.createStyleElement(arr[i], _co);
+            } else {
+                itemsData[i].style.closed = false;
+            }
+            
+            ownArrays.push(itemsData[i].style);
+        }else if(arr[i].ty == 'gr'){
+            if(!processedPos){
+                itemsData[i] = this.createGroupElement(arr[i]);
+            } else {
+                jLen = itemsData[i].it.length;
+                for(j=0;j<jLen;j+=1){
+                    itemsData[i].prevViewData[j] = itemsData[i].it[j];
+                }
+            }
+            this.searchShapes(arr[i].it,itemsData[i].it,itemsData[i].prevViewData,_co, render);
+        }else if(arr[i].ty == 'tr'){
+            if(!processedPos){
+                itemsData[i] = this._cp(arr[i], _co);
+            }
+        }else if(arr[i].ty == 'sh' || arr[i].ty == 'rc' || arr[i].ty == 'el' || arr[i].ty == 'sr'){
+            if(!processedPos){
+                itemsData[i] = this.createShapeElement(arr[i], _co);
+            }
+            
+        }else if(arr[i].ty == 'tm' || arr[i].ty == 'rd'){
+            if(!processedPos){
+                var modifier = _as.getModifier(arr[i].ty);
+                modifier.init(this,arr[i],_co);
+                itemsData[i] = modifier;
+                this.shapeModifiers.push(modifier);
+            } else {
+                modifier = itemsData[i];
+                modifier.closed = false;
+            }
+            ownModifiers.push(modifier);
+        } else if(arr[i].ty == 'rp'){
+            if(!processedPos){
+                modifier = _as.getModifier(arr[i].ty);
+                itemsData[i] = modifier;
+                modifier.init(this,arr,i,itemsData,_co);
+                this.shapeModifiers.push(modifier);
+                render = false;
+            }else{
+                modifier = itemsData[i];
+                modifier.closed = true;
+            }
+            ownModifiers.push(modifier);
+        }
+        this.addProcessedElement(arr[i], i + 1);
+    }
+    len = ownArrays.length;
+    for(i=0;i<len;i+=1){
+        ownArrays[i].closed = true;
+    }
+    len = ownModifiers.length;
+    for(i=0;i<len;i+=1){
+        ownModifiers[i].closed = true;
+    }
+};
+
+_r.prototype.renderInnerContent = function() {
+
+    this.transformHelper.mat.reset();
+    this.transformHelper.opacity = this.finalTransform.mProp.o.v;
+    this.transformHelper.matMdf = false;
+    this.transformHelper.opMdf = this.finalTransform.opMdf;
+    this.renderModifiers();
+    this.renderShape(this.transformHelper,null,null,true);
+}
+
+_r.prototype.renderShape = function(parentTransform,items,data,isMain){
+    var i, len;
+    if(!items){
+        items = this.shapesData;
+        len = this.stylesList.length;
+        for(i=0;i<len;i+=1){
+            this.stylesList[i].d = '';
+            this.stylesList[i].mdf = false;
+        }
+    }
+    if(!data){
+        data = this.itemsData;
+    }
+    ///
+    ///
+    len = items.length - 1;
+    var groupTransform,groupMatrix;
+    groupTransform = parentTransform;
+    for(i=len;i>=0;i-=1){
+        if(items[i].ty == 'tr'){
+            groupTransform = data[i].transform;
+            var mtArr = data[i].transform.mProps.v.props;
+            groupTransform.matMdf = groupTransform.mProps.mdf;
+            groupTransform.opMdf = groupTransform.op.mdf;
+            groupMatrix = groupTransform.mat;
+            groupMatrix.cloneFromProps(mtArr);
+            if(parentTransform){
+                var props = parentTransform.mat.props;
+                groupTransform.opacity = parentTransform.opacity;
+                groupTransform.opacity *= data[i].transform.op.v;
+                groupTransform.matMdf = parentTransform.matMdf ? true : groupTransform.matMdf;
+                groupTransform.opMdf = parentTransform.opMdf ? true : groupTransform.opMdf;
+                groupMatrix.transform(props[0],props[1],props[2],props[3],props[4],props[5],props[6],props[7],props[8],props[9],props[10],props[11],props[12],props[13],props[14],props[15]);
+            }else{
+                groupTransform.opacity = groupTransform.op.o;
+            }
+        }else if(items[i].ty == 'sh' || items[i].ty == 'el' || items[i].ty == 'rc' || items[i].ty == 'sr'){
+            this.renderPath(items[i],data[i],groupTransform);
+        }else if(items[i].ty == 'fl'){
+            this.renderFill(items[i],data[i],groupTransform);
+        }else if(items[i].ty == 'st'){
+            this.renderStroke(items[i],data[i],groupTransform);
+        }else if(items[i].ty == 'gr'){
+            this.renderShape(groupTransform,items[i].it,data[i].it);
+        }else if(items[i].ty == 'tm'){
+            //
+        }
+    }
+    if(!isMain){
+        return;
+    }
+    len = this.stylesList.length;
+    var j, jLen, k, kLen,elems,nodes, renderer = this._x.renderer, ctx = this._x._da, type;
+    //renderer.save();
+    //renderer.ctxTransform(this.finalTransform.mat.props);
+    for(i=0;i<len;i+=1){
+        type = this.stylesList[i].type;
+        if((type === 'st' && this.stylesList[i].wi === 0) || !this.stylesList[i].data._render){
+            continue;
+        }
+        renderer.save();
+        elems = this.stylesList[i]._br;
+        if(type === 'st'){
+            ctx.strokeStyle = this.stylesList[i].co;
+            ctx.lineWidth = this.stylesList[i].wi;
+            ctx.lineCap = this.stylesList[i].lc;
+            ctx.lineJoin = this.stylesList[i].lj;
+            ctx.miterLimit = this.stylesList[i].ml || 0;
+        }else{
+            ctx.fillStyle = this.stylesList[i].co;
+        }
+        renderer.ctxOpacity(this.stylesList[i].coOp);
+        if(type !== 'st'){
+            ctx.beginPath();
+        }
+        jLen = elems.length;
+        for(j=0;j<jLen;j+=1){
+            if(type === 'st'){
+                ctx.beginPath();
+                if(this.stylesList[i].da){
+                    ctx.setLineDash(this.stylesList[i].da);
+                    ctx.lineDashOffset = this.stylesList[i].do;
+                    this._x.isDashed = true;
+                }else if(this._x.isDashed){
+                    ctx.setLineDash(this.dashResetter);
+                    this._x.isDashed = false;
+                }
+            }
+            nodes = elems[j].trNodes;
+            kLen = nodes.length;
+
+            for(k=0;k<kLen;k+=1){
+                if(nodes[k].t == 'm'){
+                    ctx.moveTo(nodes[k].p[0],nodes[k].p[1]);
+                }else if(nodes[k].t == 'c'){
+                    ctx.bezierCurveTo(nodes[k].p1[0],nodes[k].p1[1],nodes[k].p2[0],nodes[k].p2[1],nodes[k].p3[0],nodes[k].p3[1]);
+                }else{
+                    ctx.closePath();
+                }
+            }
+            if(type === 'st'){
+                ctx.stroke();
+            }
+        }
+        if(type !== 'st'){
+            ctx.fill(this.stylesList[i].r);
+        }
+        renderer.restore();
+    }
+    //renderer.restore();
+    if(this._ch){
+        this._ch = false;
+    }
+};
+_r.prototype.renderPath = function(pathData,itemData,groupTransform){
+    var len, i, j,jLen;
+    var redraw = groupTransform.matMdf || itemData.sh.mdf || this._ch;
+    if(redraw) {
+        var paths = itemData.sh.paths, groupTransformMat = groupTransform.mat;
+        jLen = pathData._render === false ? 0 : paths._length;
+        var pathStringTransformed = itemData.trNodes;
+        pathStringTransformed.length = 0;
+        for(j=0;j<jLen;j+=1){
+            var pathNodes = paths.shapes[j];
+            if(pathNodes && pathNodes.v){
+                len = pathNodes._length;
+                for (i = 1; i < len; i += 1) {
+                    if (i == 1) {
+                        pathStringTransformed.push({
+                            t: 'm',
+                            p: groupTransformMat._cn(pathNodes.v[0][0], pathNodes.v[0][1], 0)
+                        });
+                    }
+                    pathStringTransformed.push({
+                        t: 'c',
+                        p1: groupTransformMat._cn(pathNodes.o[i - 1][0], pathNodes.o[i - 1][1], 0),
+                        p2: groupTransformMat._cn(pathNodes.i[i][0], pathNodes.i[i][1], 0),
+                        p3: groupTransformMat._cn(pathNodes.v[i][0], pathNodes.v[i][1], 0)
+                    });
+                }
+                if (len == 1) {
+                    pathStringTransformed.push({
+                        t: 'm',
+                        p: groupTransformMat._cn(pathNodes.v[0][0], pathNodes.v[0][1], 0)
+                    });
+                }
+                if (pathNodes.c && len) {
+                    pathStringTransformed.push({
+                        t: 'c',
+                        p1: groupTransformMat._cn(pathNodes.o[i - 1][0], pathNodes.o[i - 1][1], 0),
+                        p2: groupTransformMat._cn(pathNodes.i[0][0], pathNodes.i[0][1], 0),
+                        p3: groupTransformMat._cn(pathNodes.v[0][0], pathNodes.v[0][1], 0)
+                    });
+                    pathStringTransformed.push({
+                        t: 'z'
+                    });
+                }
+                itemData.lStr = pathStringTransformed;
+            }
+
+        }
+
+        if (itemData.st) {
+            for (i = 0; i < 16; i += 1) {
+                itemData.tr[i] = groupTransform.mat.props[i];
+            }
+        }
+        itemData.trNodes = pathStringTransformed;
+
+    }
+};
+
+
+
+_r.prototype.renderFill = function(styleData,itemData, groupTransform){
+    var styleElem = itemData.style;
+
+    if(itemData.c.mdf || this._ch){
+        styleElem.co = 'rgb('+bm_floor(itemData.c.v[0])+','+bm_floor(itemData.c.v[1])+','+bm_floor(itemData.c.v[2])+')';
+    }
+    if(itemData.o.mdf || groupTransform.opMdf || this._ch){
+        styleElem.coOp = itemData.o.v*groupTransform.opacity;
+    }
+};
+
+_r.prototype.renderStroke = function(styleData,itemData, groupTransform){
+    var styleElem = itemData.style;
+    //TODO fix dashes
+    var d = itemData.d;
+    if(d && (d.mdf  || this._ch)){
+        styleElem.da = d.dashArray;
+        styleElem.do = d.dashoffset[0];
+    }
+    if(itemData.c.mdf || this._ch){
+        styleElem.co = 'rgb('+bm_floor(itemData.c.v[0])+','+bm_floor(itemData.c.v[1])+','+bm_floor(itemData.c.v[2])+')';
+    }
+    if(itemData.o.mdf || groupTransform.opMdf || this._ch){
+        styleElem.coOp = itemData.o.v*groupTransform.opacity;
+    }
+    if(itemData.w.mdf || this._ch){
+        styleElem.wi = itemData.w.v;
+    }
+};
+
+
+_r.prototype.destroy = function(){
+    this.shapesData = null;
+    this._x = null;
+    this._da = null;
+    this.stylesList.length = 0;
+    this.itemsData.length = 0;
+};
+
+
+function _s(data, _x, comp) {
+    this._cz(data,_x,comp);
+}
+extendPrototype([_e, _af, _c, _ad, _ac, _ae], _s);
+
+_s.prototype._cz = SVGShapeElement.prototype._cz;
+_s.prototype._az = _h.prototype._az;
+
+_s.prototype.renderInnerContent = function() {
+    var ctx = this._da;
+    ctx.fillStyle = this.data.sc;
+    ctx.fillRect(0, 0, this.data.sw, this.data.sh);
+    //
+};
+function _t(data, _x, comp){
+    this.textSpans = [];
+    this.yOffset = 0;
+    this.fillColorAnim = false;
+    this.strokeColorAnim = false;
+    this.strokeWidthAnim = false;
+    this.stroke = false;
+    this.fill = false;
+    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._cz(data,_x,comp);
+}
+extendPrototype([_e,_af,_c,_ad,_ac,_ae,_k], _t);
+
+_t.prototype.tHelper = _cu('canvas').getContext('2d');
+
+_t.prototype.buildNewText = function(){
+    var documentData = this.textProperty.currentData;
+    this._bt = _cv(documentData.l ? documentData.l.length : 0);
+
+    var hasFill = false;
+    if(documentData.fc) {
+        hasFill = true;
+        this.values.fill = this.buildColor(documentData.fc);
+    }else{
+        this.values.fill = 'rgba(0,0,0,0)';
+    }
+    this.fill = hasFill;
+    var hasStroke = false;
+    if(documentData.sc){
+        hasStroke = true;
+        this.values.stroke = this.buildColor(documentData.sc);
+        this.values.sWidth = documentData.sw;
+    }
+    var fontData = this._x._cr.getFontByName(documentData.f);
+    var i, len;
+    var letters = documentData.l;
+    var matrixHelper = this.mHelper;
+    this.stroke = hasStroke;
+    this.values.fValue = documentData.s + 'px '+ this._x._cr.getFontByName(documentData.f).fFamily;
+    len = documentData.t.length;
+    //this.tHelper.font = this.values.fValue;
+    var charData, shapeData, k, kLen, shapes, j, jLen, pathNodes, commands, pathArr, singleShape = this.data.singleShape;
+    var trackingOffset = documentData.tr/1000*documentData.s;
+    var xPos = 0, yPos = 0, firstLine = true;
+    var cnt = 0;
+    for (i = 0; i < len; i += 1) {
+        charData = this._x._cr.getCharData(documentData.t.charAt(i), fontData.fStyle, this._x._cr.getFontByName(documentData.f).fFamily);
+        shapeData = charData && charData.data || {};
+        matrixHelper.reset();
+        if(singleShape && letters[i].n) {
+            xPos = -trackingOffset;
+            yPos += documentData.yOffset;
+            yPos += firstLine ? 1 : 0;
+            firstLine = false;
+        }
+
+        shapes = shapeData.shapes ? shapeData.shapes[0].it : [];
+        jLen = shapes.length;
+        matrixHelper.scale(documentData.s/100,documentData.s/100);
+        if(singleShape){
+            this.applyTextPropertiesToMatrix(documentData, matrixHelper, letters[i].line, xPos, yPos);
+        }
+        commands = _cv(jLen)
+        for(j=0;j<jLen;j+=1){
+            kLen = shapes[j].ks.k.i.length;
+            pathNodes = shapes[j].ks.k;
+            pathArr = [];
+            for(k=1;k<kLen;k+=1){
+                if(k==1){
+                    pathArr.push(matrixHelper.applyToX(pathNodes.v[0][0],pathNodes.v[0][1],0),matrixHelper.applyToY(pathNodes.v[0][0],pathNodes.v[0][1],0));
+                }
+                pathArr.push(matrixHelper.applyToX(pathNodes.o[k-1][0],pathNodes.o[k-1][1],0),matrixHelper.applyToY(pathNodes.o[k-1][0],pathNodes.o[k-1][1],0),matrixHelper.applyToX(pathNodes.i[k][0],pathNodes.i[k][1],0),matrixHelper.applyToY(pathNodes.i[k][0],pathNodes.i[k][1],0),matrixHelper.applyToX(pathNodes.v[k][0],pathNodes.v[k][1],0),matrixHelper.applyToY(pathNodes.v[k][0],pathNodes.v[k][1],0));
+            }
+            pathArr.push(matrixHelper.applyToX(pathNodes.o[k-1][0],pathNodes.o[k-1][1],0),matrixHelper.applyToY(pathNodes.o[k-1][0],pathNodes.o[k-1][1],0),matrixHelper.applyToX(pathNodes.i[0][0],pathNodes.i[0][1],0),matrixHelper.applyToY(pathNodes.i[0][0],pathNodes.i[0][1],0),matrixHelper.applyToX(pathNodes.v[0][0],pathNodes.v[0][1],0),matrixHelper.applyToY(pathNodes.v[0][0],pathNodes.v[0][1],0));
+            commands[j] = pathArr;
+        }
+        if(singleShape){
+            xPos += letters[i].l;
+            xPos += trackingOffset;
+        }
+        if(this.textSpans[cnt]){
+            this.textSpans[cnt].elem = commands;
+        } else {
+            this.textSpans[cnt] = {elem: commands};
+        }
+        cnt +=1;
+    }
+}
+
+_t.prototype.renderInnerContent = function(){
+    var ctx = this._da;
+    var finalMat = this.finalTransform.mat.props;
+    ctx.font = this.values.fValue;
+    ctx.lineCap = 'butt';
+    ctx.lineJoin = 'miter';
+    ctx.miterLimit = 4;
+
+    if(!this.data.singleShape){
+        this.textAnimator.getMeasures(this.textProperty.currentData, this.lettersChangedFlag);
+    }
+
+    var  i,len, j, jLen, k, kLen;
+    var _bt = this.textAnimator._bt;
+
+    var letters = this.textProperty.currentData.l;
+
+    len = letters.length;
+    var _bu;
+    var lastFill = null, lastStroke = null, lastStrokeW = null, commands, pathArr;
+    for(i=0;i<len;i+=1){
+        if(letters[i].n){
+            continue;
+        }
+        _bu = _bt[i];
+        if(_bu){
+            this._x.renderer.save();
+            this._x.renderer.ctxTransform(_bu.p);
+            this._x.renderer.ctxOpacity(_bu.o);
+        }
+        if(this.fill){
+            if(_bu && _bu.fc){
+                if(lastFill !== _bu.fc){
+                    lastFill = _bu.fc;
+                    ctx.fillStyle = _bu.fc;
+                }
+            }else if(lastFill !== this.values.fill){
+                lastFill = this.values.fill;
+                ctx.fillStyle = this.values.fill;
+            }
+            commands = this.textSpans[i].elem;
+            jLen = commands.length;
+            this._x._da.beginPath();
+            for(j=0;j<jLen;j+=1) {
+                pathArr = commands[j];
+                kLen = pathArr.length;
+                this._x._da.moveTo(pathArr[0], pathArr[1]);
+                for (k = 2; k < kLen; k += 6) {
+                    this._x._da.bezierCurveTo(pathArr[k], pathArr[k + 1], pathArr[k + 2], pathArr[k + 3], pathArr[k + 4], pathArr[k + 5]);
+                }
+            }
+            this._x._da.closePath();
+            this._x._da.fill();
+            ///ctx.fillText(this.textSpans[i].val,0,0);
+        }
+        if(this.stroke){
+            if(_bu && _bu.sw){
+                if(lastStrokeW !== _bu.sw){
+                    lastStrokeW = _bu.sw;
+                    ctx.lineWidth = _bu.sw;
+                }
+            }else if(lastStrokeW !== this.values.sWidth){
+                lastStrokeW = this.values.sWidth;
+                ctx.lineWidth = this.values.sWidth;
+            }
+            if(_bu && _bu.sc){
+                if(lastStroke !== _bu.sc){
+                    lastStroke = _bu.sc;
+                    ctx.strokeStyle = _bu.sc;
+                }
+            }else if(lastStroke !== this.values.stroke){
+                lastStroke = this.values.stroke;
+                ctx.strokeStyle = this.values.stroke;
+            }
+            commands = this.textSpans[i].elem;
+            jLen = commands.length;
+            this._x._da.beginPath();
+            for(j=0;j<jLen;j+=1) {
+                pathArr = commands[j];
+                kLen = pathArr.length;
+                this._x._da.moveTo(pathArr[0], pathArr[1]);
+                for (k = 2; k < kLen; k += 6) {
+                    this._x._da.bezierCurveTo(pathArr[k], pathArr[k + 1], pathArr[k + 2], pathArr[k + 3], pathArr[k + 4], pathArr[k + 5]);
+                }
+            }
+            this._x._da.closePath();
+            this._x._da.stroke();
+            ///ctx.strokeText(letters[i].val,0,0);
+        }
+        if(_bu) {
+            this._x.renderer.restore();
+        }
+    }
+    /*if(this.data.hasMask){
+     this._x.renderer.restore(true);
+     }*/
+};
+function _o() {
+
+}
+_o.prototype._ba = function(){}
+function _b(data,_x,comp){
+};
+
+_b.prototype.checkBlendMode = function(){
+};
+
+_b.prototype.get_e = _d.prototype.get_e;
+
+_b.prototype.initRendererElement = function(){
+    this._by = _cu('div');
+    if(this.data.hasMask) {
+        this._cf = _ct('svg');
+        this._bx = _ct('g');
+        this._ca = this._bx;
+        this._cf.appendChild(this._bx);
+        this._by.appendChild(this._cf);
+    } else {
+        this._bx = this._by;
+    }
+    styleDiv(this._by);
+}
+
+_b.prototype.createContainerElements = function(){
+    this.effectsManager = new _o(this);
+    this._bz = this._by;
+    this._ca = this._bx;
+    if (this.data.ln) {
+        this._bx.setAttribute('id',this.data.ln);
+    }
+    if (this.data.bm !== 0) {
+        this.setBlendMode();
+    }
+    this.checkParenting();
+};
+
+_b.prototype.renderElement = function() {
+    if(this.finalTransform.matMdf){
+        this._bz.style.transform = this._bz.style.webkitTransform = this.finalTransform.mat.toCSS();
+    }
+    if(this.finalTransform.opMdf){
+        this._bz.style.opacity = this.finalTransform.mProp.o.v;
+    }
+};
+
+_b.prototype._ba = function() {
+    //If it is exported as hidden (data.hd === true) no need to render
+    //If it is not visible no need to render
+    if (this.data.hd || this.hidden) {
+        return;
+    }
+    this.renderTransform();
+    this.renderRenderable();
+    this.renderElement();
+    this.renderInnerContent();
+    if (this._ch) {
+        this._ch = false;
+    }
+};
+
+_b.prototype.destroy = function(){
+    this._bx = null;
+    this._bz = null;
+    if(this.matteElement) {
+        this.matteElement = null;
+    }
+    if(this.maskManager) {
+        this.maskManager.destroy();
+        this.maskManager = null;
+    }
+};
+
+_b.prototype.getDomElement = function(){
+    return this._bx;
+};
+_b.prototype.addMasks = function(){
+    this.maskManager = new _ay(this.data, this, this._x);
+};
+
+_b.prototype.setMatte = function(){
+
+}
+
+_b.prototype.buildElementParenting = _ap.prototype.buildElementParenting;
+function _aa(data,_x,comp){
+    this._cz(data,_x,comp);
+}
+extendPrototype([_e,_af,_b,_ad,_ac,_ci], _aa);
+
+_aa.prototype.createContent = function(){
+    var rect;
+    if(this.data.hasMask){
+        rect = _ct('rect');
+        rect.setAttribute('width',this.data.sw);
+        rect.setAttribute('height',this.data.sh);
+        rect.setAttribute('fill',this.data.sc);
+        this._cf.setAttribute('width',this.data.sw);
+        this._cf.setAttribute('height',this.data.sh);
+    } else {
+        rect = _cu('div');
+        rect.style.width = this.data.sw + 'px';
+        rect.style.height = this.data.sh + 'px';
+        rect.style.backgroundColor = this.data.sc;
+    }
+    this._bx.appendChild(rect);
+};
+
+function _w(data,_x,comp){
+    this.layers = data.layers;
+    this.supports3d = !data.hasMask;
+    this._db = false;
+    this._dc = [];
+    this._br = this.layers ? _cv(this.layers.length) : [];
+    this.tm = data.tm ? _ai._bo(this,data.tm,0,_x.frameRate,this._co) : {_placeholder:true};
+    
+    this._cz(data,_x,comp);
+}
+
+extendPrototype([_ap, _g, _b], _w);
+
+_w.prototype.createContainerElements = function(){
+    //divElement.style.clip = 'rect(0px, '+this.data.w+'px, '+this.data.h+'px, 0px)';
+    if(this.data.hasMask){
+        this._bz = this._bx;
+        this._cf.setAttribute('width',this.data.w);
+        this._cf.setAttribute('height',this.data.h);
+    }else{
+        this._bz = this._bx;
+
+    }
+    //this.appendNodeToParent(this._bx);
+    this.effectsManager = new _o(this);
+    this.checkParenting();
+};
+function _z(data,_x,comp){
+    //List of drawable _br
+    this.shapes = [];
+    // Full shape data
+    this.shapesData = data.shapes;
+    //List of styles that will be applied to shapes
+    this.stylesList = [];
+    //List of modifiers that will be applied to shapes
+    this.shapeModifiers = [];
+    //List of items in shape tree
+    this.itemsData = [];
+    //List of items in previous shape tree
+    this.processedElements = [];
+    this.shapesContainer = _ct('g');
+    this._cz(data,_x,comp);
+    //Moving any property that doesn't get too much access after initialization because of v8 way of handling more than 10 properties.
+    // List of _br that have been created
+    this.prevViewData = [];
+    this._cg = {
+        x:999999,
+        y: -999999,
+        h: 0,
+        w: 0
+    };
+}
+extendPrototype([_e,_af,_aa,SVGShapeElement,_b,_ad,_ac,_ae], _z);
+_z.prototype._renderShapeFrame = _z.prototype.renderInnerContent;
+
+_z.prototype.createContent = function(){
+    var cont;
+    if (this.data.hasMask) {
+        this._bx.appendChild(this.shapesContainer);
+        cont = this._cf;
+    } else {
+        cont = _ct('svg');
+        var size = this.comp.data ? this.comp.data : this._x._de;
+        cont.setAttribute('width',size.w);
+        cont.setAttribute('height',size.h);
+        cont.appendChild(this.shapesContainer);
+        this._bx.appendChild(cont);
+    }
+
+    this.searchShapes(this.shapesData,this.itemsData,this.prevViewData,this.shapesContainer,this._co,0, [], true);
+    this.shapeCont = cont;
+};
+
+_z.prototype.renderInnerContent = function() {
+    this._renderShapeFrame();
+
+    //TODO: this also needs to be recalculated every time a property changes. Check how canvas renderer uses _x.mdf. Also would be great to calculate size from shapes and not from DOM.
+    if(!this.hidden && this._ch) {
+        var boundingBox = this.shapeCont.getBBox();
+        var changed = false;
+        if(this._cg.w !== boundingBox.width){
+            this._cg.w = boundingBox.width;
+            this.shapeCont.setAttribute('width',boundingBox.width);
+            changed = true;
+        }
+        if(this._cg.h !== boundingBox.height){
+            this._cg.h = boundingBox.height;
+            this.shapeCont.setAttribute('height',boundingBox.height);
+            changed = true;
+        }
+        if(changed  || this._cg.x !== boundingBox.x  || this._cg.y !== boundingBox.y){
+            this._cg.w = boundingBox.width;
+            this._cg.h = boundingBox.height;
+            this._cg.x = boundingBox.x;
+            this._cg.y = boundingBox.y;
+
+            this.shapeCont.setAttribute('viewBox',this._cg.x+' '+this._cg.y+' '+this._cg.w+' '+this._cg.h);
+            this.shapeCont.style.transform = this.shapeCont.style.webkitTransform = 'translate(' + this._cg.x + 'px,' + this._cg.y + 'px)';
+        }
+    }
+
+};
+function _ab(data,_x,comp){
+    this.textSpans = [];
+    this.textPaths = [];
+    this._cg = {
+        x:999999,
+        y: -999999,
+        h: 0,
+        w: 0
+    }
+    this.renderType = 'svg';
+    this.isMasked = false;
+    this._cz(data,_x,comp);
+
+}
+extendPrototype([_e,_af,_b,_ad,_ac,_ci,_k], _ab);
+
+_ab.prototype.createContent = function(){
+    this.isMasked = this.checkMasks();
+    if(this.isMasked){
+        this.renderType = 'svg';
+        this.compW = this.comp.data.w;
+        this.compH = this.comp.data.h;
+        this._cf.setAttribute('width',this.compW);
+        this._cf.setAttribute('height',this.compH);
+        var g = _ct('g');
+        this._ca.appendChild(g);
+        this._cc = g;
+    } else {
+        this.renderType = 'html';
+        this._cc = this._bx;
+    }
+
+    this.checkParenting();
+
+};
+
+_ab.prototype.buildNewText = function(){
+    var documentData = this.textProperty.currentData;
+    this._bt = _cv(this.textProperty.currentData.l ? this.textProperty.currentData.l.length : 0);
+    var _cb = this._cc.style;
+    _cb.color = _cb.fill = documentData.fc ? this.buildColor(documentData.fc) : 'rgba(0,0,0,0)';
+    if(documentData.sc){
+        _cb.stroke = this.buildColor(documentData.sc);
+        _cb.strokeWidth = documentData.sw+'px';
+    }
+    var fontData = this._x._cr.getFontByName(documentData.f);
+    if(!this._x._cr.chars){
+        _cb.fontSize = documentData.s+'px';
+        _cb.lineHeight = documentData.s+'px';
+        if(fontData.fClass){
+            this._cc.className = fontData.fClass;
+        } else {
+            _cb.fontFamily = fontData.fFamily;
+            var fWeight = documentData.fWeight, fStyle = documentData.fStyle;
+            _cb.fontStyle = fStyle;
+            _cb.fontWeight = fWeight;
+        }
+    }
+    var i, len;
+
+    var letters = documentData.l;
+    len = letters.length;
+    var tSpan,tParent,tCont;
+    var matrixHelper = this.mHelper;
+    var shapes, shapeStr = '';
+    var cnt = 0;
+    for (i = 0;i < len ;i += 1) {
+        if(this._x._cr.chars){
+            if(!this.textPaths[cnt]){
+                tSpan = _ct('path');
+                tSpan.setAttribute('stroke-linecap', 'butt');
+                tSpan.setAttribute('stroke-linejoin','round');
+                tSpan.setAttribute('stroke-miterlimit','4');
+            } else {
+                tSpan = this.textPaths[cnt];
+            }
+            if(!this.isMasked){
+                if(this.textSpans[cnt]){
+                    tParent = this.textSpans[cnt];
+                    tCont = tParent.children[0];
+                } else {
+
+                    tParent = _cu('div');
+                    tCont = _ct('svg');
+                    tCont.appendChild(tSpan);
+                    styleDiv(tParent);
+                }
+            }
+        }else{
+            if(!this.isMasked){
+                if(this.textSpans[cnt]){
+                    tParent = this.textSpans[cnt];
+                    tSpan = this.textPaths[cnt];
+                } else {
+                    tParent = _cu('span');
+                    styleDiv(tParent);
+                    tSpan = _cu('span');
+                    styleDiv(tSpan);
+                    tParent.appendChild(tSpan);
+                }
+            } else {
+                tSpan = this.textPaths[cnt] ? this.textPaths[cnt] : _ct('text');
+            }
+        }
+        //tSpan.setAttribute('visibility', 'hidden');
+        if(this._x._cr.chars){
+            var charData = this._x._cr.getCharData(documentData.t.charAt(i), fontData.fStyle, this._x._cr.getFontByName(documentData.f).fFamily);
+            var shapeData;
+            if(charData){
+                shapeData = charData.data;
+            } else {
+                shapeData = null;
+            }
+            matrixHelper.reset();
+            if(shapeData && shapeData.shapes){
+                shapes = shapeData.shapes[0].it;
+                matrixHelper.scale(documentData.s/100,documentData.s/100);
+                shapeStr = this.createPathShape(matrixHelper,shapes);
+                tSpan.setAttribute('d',shapeStr);
+            }
+            if(!this.isMasked){
+                this._cc.appendChild(tParent);
+                if(shapeData && shapeData.shapes){
+
+                    var boundingBox = tCont.getBBox();
+                    tCont.setAttribute('width',boundingBox.width + 2);
+                    tCont.setAttribute('height',boundingBox.height + 2);
+                    tCont.setAttribute('viewBox',(boundingBox.x-1)+' '+ (boundingBox.y-1)+' '+ (boundingBox.width+2)+' '+ (boundingBox.height+2));
+                    tCont.style.transform = tCont.style.webkitTransform = 'translate(' + (boundingBox.x-1) + 'px,' + (boundingBox.y-1) + 'px)';
+
+                    letters[i].yOffset = boundingBox.y-1;
+                    tParent.appendChild(tCont);
+
+                } else{
+                    tCont.setAttribute('width',1);
+                    tCont.setAttribute('height',1);
+                }
+            }else{
+                this._cc.appendChild(tSpan);
+            }
+        }else{
+            tSpan.textContent = letters[i].val;
+            tSpan.setAttributeNS("http://www.w3.org/XML/1998/namespace", "xml:space","preserve");
+            if(!this.isMasked){
+                this._cc.appendChild(tParent);
+                //
+                tSpan.style.transform = tSpan.style.webkitTransform = 'translate3d(0,'+ -documentData.s/1.2+'px,0)';
+            } else {
+                this._cc.appendChild(tSpan);
+            }
+        }
+        //
+        if(!this.isMasked){
+            this.textSpans[cnt] = tParent;
+        }else{
+            this.textSpans[cnt] = tSpan;
+        }
+        this.textSpans[cnt].style.display = 'block';
+        this.textPaths[cnt] = tSpan;
+        cnt += 1;
+    }
+    while(cnt < this.textSpans.length){
+        this.textSpans[cnt].style.display = 'none';
+        cnt += 1;
+    }
+}
+
+_ab.prototype.renderInnerContent = function() {
+
+    if(this.data.singleShape){
+        if(!this._ch && !this.lettersChangedFlag){
+            return;
+        } else {
+            // Todo Benchmark if using this is better than getBBox
+             if(this.isMasked && this.finalTransform.matMdf){
+                 this._cf.setAttribute('viewBox',-this.finalTransform.mProp.p.v[0]+' '+ -this.finalTransform.mProp.p.v[1]+' '+this.compW+' '+this.compH);
+                this._cf.style.transform = this._cf.style.webkitTransform = 'translate(' + -this.finalTransform.mProp.p.v[0] + 'px,' + -this.finalTransform.mProp.p.v[1] + 'px)';
+             }
+        }
+    }
+
+    this.textAnimator.getMeasures(this.textProperty.currentData, this.lettersChangedFlag);
+    if(!this.lettersChangedFlag && !this.textAnimator.lettersChangedFlag){
+        return;
+    }
+    var  i,len, count = 0;
+    var _bt = this.textAnimator._bt;
+
+    var letters = this.textProperty.currentData.l;
+
+    len = letters.length;
+    var _bu, textSpan, textPath;
+    for(i=0;i<len;i+=1){
+        if(letters[i].n){
+            count += 1;
+            continue;
+        }
+        textSpan = this.textSpans[i];
+        textPath = this.textPaths[i];
+        _bu = _bt[count];
+        count += 1;
+        if(!this.isMasked){
+            textSpan.style.transform = textSpan.style.webkitTransform = _bu.m;
+        }else{
+            textSpan.setAttribute('transform',_bu.m);
+        }
+        ////textSpan.setAttribute('opacity',_bu.o);
+        textSpan.style.opacity = _bu.o;
+        if(_bu.sw){
+            textPath.setAttribute('stroke-width',_bu.sw);
+        }
+        if(_bu.sc){
+            textPath.setAttribute('stroke',_bu.sc);
+        }
+        if(_bu.fc){
+            textPath.setAttribute('fill',_bu.fc);
+            textPath.style.color = _bu.fc;
+        }
+    }
+
+    //TODO: this also needs to be recalculated every time a property changes. Check how canvas renderer uses _x.mdf. Also would be great to calculate size from shapes and not from DOM.
+    if(this.isVisible && (this._ch)){
+        if(this._cc.getBBox){
+            var boundingBox = this._cc.getBBox();
+
+            if(this._cg.w !== boundingBox.width){
+                this._cg.w = boundingBox.width;
+                this._cf.setAttribute('width',boundingBox.width);
+            }
+            if(this._cg.h !== boundingBox.height){
+                this._cg.h = boundingBox.height;
+                this._cf.setAttribute('height',boundingBox.height);
+            }
+
+            var margin = 1;
+            if(this._cg.w !== (boundingBox.width + margin*2) || this._cg.h !== (boundingBox.height + margin*2)  || this._cg.x !== (boundingBox.x - margin)  || this._cg.y !== (boundingBox.y - margin)){
+                this._cg.w = boundingBox.width + margin*2;
+                this._cg.h = boundingBox.height + margin*2;
+                this._cg.x = boundingBox.x - margin;
+                this._cg.y = boundingBox.y - margin;
+
+                this._cf.setAttribute('viewBox',this._cg.x+' '+this._cg.y+' '+this._cg.w+' '+this._cg.h);
+                this._cf.style.transform = this._cf.style.webkitTransform = 'translate(' + this._cg.x + 'px,' + this._cg.y + 'px)';
+            }
+        }
+    }
+}
+function _y(data,_x,comp){
+    this.assetData = _x.getAssetData(data.refId);
+    this._cz(data,_x,comp);
+}
+
+extendPrototype([_e,_af,_b,_aa,_ad,_ac,_ae], _y);
+
+
+_y.prototype.createContent = function(){
+    var assetPath = this._x.getAssetsPath(this.assetData);
+    var img = new Image();
+
+    if(this.data.hasMask){
+        this.imageElem = _ct('image');
+        this.imageElem.setAttribute('width',this.assetData.w+"px");
+        this.imageElem.setAttribute('height',this.assetData.h+"px");
+        this.imageElem.setAttributeNS('http://www.w3.org/1999/xlink','href',assetPath);
+        this._bx.appendChild(this.imageElem);
+        this._by.setAttribute('width',this.assetData.w);
+        this._by.setAttribute('height',this.assetData.h);
+    } else {
+        this._bx.appendChild(img);
+    }
+    img.src = assetPath;
+    if(this.data.ln){
+        this._cc.setAttribute('id',this.data.ln);
+    }
+    this.checkParenting();
+};
+function _v(data,_x,comp){
+    this.initFrame();
+    this.initBaseData(data,_x,comp);
+    var _bo = _ai._bo;
+    this.pe = _bo(this,data.pe,0,0,this._co);
+    if(data.ks.p.s){
+        this.px = _bo(this,data.ks.p.x,1,0,this._co);
+        this.py = _bo(this,data.ks.p.y,1,0,this._co);
+        this.pz = _bo(this,data.ks.p.z,1,0,this._co);
+    }else{
+        this.p = _bo(this,data.ks.p,1,0,this._co);
+    }
+    if(data.ks.a){
+        this.a = _bo(this,data.ks.a,1,0,this._co);
+    }
+    if(data.ks.or.k.length && data.ks.or.k[0].to){
+        var i,len = data.ks.or.k.length;
+        for(i=0;i<len;i+=1){
+            data.ks.or.k[i].to = null;
+            data.ks.or.k[i].ti = null;
+        }
+    }
+    this.or = _bo(this,data.ks.or,1,degToRads,this._co);
+    this.or.sh = true;
+    this.rx = _bo(this,data.ks.rx,0,degToRads,this._co);
+    this.ry = _bo(this,data.ks.ry,0,degToRads,this._co);
+    this.rz = _bo(this,data.ks.rz,0,degToRads,this._co);
+    this.mat = new Matrix();
+    this._prevMat = new Matrix();
+    this._ch = true;
+}
+extendPrototype([_e, _ac], _v);
+
+_v.prototype.setup = function() {
+    var i, len = this.comp.threeDElements.length, comp;
+    for(i=0;i<len;i+=1){
+        //[perspectiveElem,container]
+        comp = this.comp.threeDElements[i];
+        comp.perspectiveElem.style.perspective = comp.perspectiveElem.style.webkitPerspective = this.pe.v+'px';
+        comp.container.style.transformOrigin = comp.container.style.mozTransformOrigin = comp.container.style.webkitTransformOrigin = "0px 0px 0px";
+        comp.perspectiveElem.style.transform = comp.perspectiveElem.style.webkitTransform = 'matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1)';
+    }
+};
+
+_v.prototype.createElements = function(){
+};
+
+_v.prototype.hide = function(){
+};
+
+_v.prototype._ba = function(){
+    var mdf = this._ch;
+    var i, len;
+    if(this._dd){
+        len = this._dd.length;
+        for(i=0;i<len;i+=1){
+            mdf = this._dd[i].finalTransform.mProp.mdf ? true : mdf;
+        }
+    }
+    if(mdf || (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)) {
+        this.mat.reset();
+
+        if(this.p){
+            this.mat.translate(-this.p.v[0],-this.p.v[1],this.p.v[2]);
+        }else{
+            this.mat.translate(-this.px.v,-this.py.v,this.pz.v);
+        }
+        if(this.a){
+            var diffVector = [this.p.v[0]-this.a.v[0],this.p.v[1]-this.a.v[1],this.p.v[2]-this.a.v[2]];
+            var mag = Math.sqrt(Math.pow(diffVector[0],2)+Math.pow(diffVector[1],2)+Math.pow(diffVector[2],2));
+            //var lookDir = getNormalizedPoint(getDiffVector(this.a.v,this.p.v));
+            var lookDir = [diffVector[0]/mag,diffVector[1]/mag,diffVector[2]/mag];
+            var lookLengthOnXZ = Math.sqrt( lookDir[2]*lookDir[2] + lookDir[0]*lookDir[0] );
+            var m_rotationX = (Math.atan2( lookDir[1], lookLengthOnXZ ));
+            var m_rotationY = (Math.atan2( lookDir[0], -lookDir[2]));
+            this.mat.rotateY(m_rotationY).rotateX(-m_rotationX);
+
+        }
+        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._x._de.w/2,this._x._de.h/2,0);
+        this.mat.translate(0,0,this.pe.v);
+        if(this._dd){
+            var mat;
+            len = this._dd.length;
+            for(i=0;i<len;i+=1){
+                mat = this._dd[i].finalTransform.mProp.iv.props;
+                this.mat.transform(mat[0],mat[1],mat[2],mat[3],mat[4],mat[5],mat[6],mat[7],mat[8],mat[9],mat[10],mat[11],-mat[12],-mat[13],mat[14],mat[15]);
+            }
+        }
+        if(!this._prevMat.equals(this.mat)) {
+            len = this.comp.threeDElements.length;
+            var comp;
+            for(i=0;i<len;i+=1){
+                comp = this.comp.threeDElements[i];
+                comp.container.style.transform = comp.container.style.webkitTransform = this.mat.toCSS();
+            }
+            this.mat.clone(this._prevMat);
+        }
+    } else {
+
+        //console.log('NO ENTRO')
+    }
+    this._ch = false;
+};
+
+_v.prototype._az = function(num) {
+    this.prepareProperties(num, true);
+};
+
+_v.prototype.destroy = function(){
+};
+_v.prototype.initExpressions = function(){};
+_v.prototype.get_e = function(){return null};
+function _bv() {
+}
+_bv.prototype._ba = function(){}
 var Expressions = (function(){
     var ob = {};
     ob.initExpressions = initExpressions;
@@ -11234,7 +11180,7 @@
         } else if(value.i) {
             return shape_pool.clone(value);
         } else {
-            var arr = createTypedArray('float32', value.length);
+            var arr = _cs('float32', value.length);
             var i, len = value.length;
             for (i = 0; i < len; i += 1) {
                 arr[i] = value[i] * mult;
@@ -11359,7 +11305,7 @@
         var i, len;
         if(isTypeOfArray(a) && (tOfB === 'number' || tOfB === 'boolean' || tOfB === 'string' || b instanceof Number )){
             len = a.length;
-            arr = createTypedArray('float32', len);
+            arr = _cs('float32', len);
             for(i=0;i<len;i+=1){
                 arr[i] = a[i] * b;
             }
@@ -11367,7 +11313,7 @@
         }
         if((tOfA === 'number' || tOfA === 'boolean' || tOfA === 'string' || a instanceof Number ) && isTypeOfArray(b)){
             len = b.length;
-            arr = createTypedArray('float32', len);
+            arr = _cs('float32', len);
             for(i=0;i<len;i+=1){
                 arr[i] = a * b[i];
             }
@@ -11386,7 +11332,7 @@
         var i, len;
         if(isTypeOfArray(a) && (tOfB === 'number' || tOfB === 'boolean' || tOfB === 'string' || b instanceof Number  )){
             len = a.length;
-            arr = createTypedArray('float32', len);
+            arr = _cs('float32', len);
             for(i=0;i<len;i+=1){
                 arr[i] = a[i] / b;
             }
@@ -11394,7 +11340,7 @@
         }
         if((tOfA === 'number' || tOfA === 'boolean' || tOfA === 'string' || a instanceof Number ) && isTypeOfArray(b)){
             len = b.length;
-            arr = createTypedArray('float32', len);
+            arr = _cs('float32', len);
             for(i=0;i<len;i+=1){
                 arr[i] = a / b[i];
             }
@@ -11516,7 +11462,7 @@
             return value1 + (value2-value1)*perc;
         }
         var i, len = value1.length;
-        var arr = createTypedArray('float32', len);
+        var arr = _cs('float32', len);
         for(i=0;i<len;i+=1){
             arr[i] = value1[i] + (value2[i]-value1[i])*perc;
         }
@@ -11535,9 +11481,9 @@
         if(max.length){
             var i, len = max.length;
             if(!min){
-                min = createTypedArray('float32', len);
+                min = _cs('float32', len);
             }
-            var arr = createTypedArray('float32', len);
+            var arr = _cs('float32', len);
             var rnd = BMMath.random();
             for(i=0;i<len;i+=1){
                 arr[i] = min[i] + rnd*(max[i]-min[i])
@@ -11585,7 +11531,7 @@
 
         var wiggle = function wiggle(freq,amp){
             var i,j, len = this.pv.length ? this.pv.length : 1;
-            var addedAmps = createTypedArray('float32', len);
+            var addedAmps = _cs('float32', len);
             freq = 5;
             var iterations = Math.floor(time*freq);
             i = 0;
@@ -11601,7 +11547,7 @@
             //var rnd2 = BMMath.random();
             var periods = time*freq;
             var perc = periods - Math.floor(periods);
-            var arr = createTypedArray('float32', len);
+            var arr = _cs('float32', len);
             if(len>1){
                 for(j=0;j<len;j+=1){
                     arr[j] = this.pv[j] + addedAmps[j] + (-amp + amp*2*BMMath.random())*perc;
@@ -11632,8 +11578,8 @@
             return loopOut(type,duration,true);
         }.bind(this);
 
-        if(this.getValueAtTime) {
-            valueAtTime = this.getValueAtTime.bind(this);
+        if(this._dg) {
+            valueAtTime = this._dg.bind(this);
         }
 
         if(this.getVelocityAtTime) {
@@ -11759,7 +11705,7 @@
 
         var time, velocity, value, textIndex, textTotal, selectorValue;
         var index = elem.data.ind;
-        var hasParent = !!(elem.hierarchy && elem.hierarchy.length);
+        var hasParent = !!(elem._dd && elem._dd.length);
         var parent;
         var randSeed = Math.floor(Math.random()*1000000);
         function executeExpression() {
@@ -11798,9 +11744,9 @@
             if (!effect) {
                 effect = thisLayer(4);
             }
-            hasParent = !!(elem.hierarchy && elem.hierarchy.length);
+            hasParent = !!(elem._dd && elem._dd.length);
             if (hasParent && !parent) {
-                parent = elem.hierarchy[0].layerInterface;
+                parent = elem._dd[0].layerInterface;
             }
             this.lock = true;
             if (this.getPreValue) {
@@ -11873,22 +11819,22 @@
     }
 
     function loopOut(type,duration,durationFlag){
-        if(!this.k || !this.keyframes){
+        if(!this.k || !this._df){
             return this.pv;
         }
         type = type ? type.toLowerCase() : '';
         var currentFrame = this.comp.renderedFrame;
-        var keyframes = this.keyframes;
-        var lastKeyFrame = keyframes[keyframes.length - 1].t;
+        var _df = this._df;
+        var lastKeyFrame = _df[_df.length - 1].t;
         if(currentFrame<=lastKeyFrame){
             return this.pv;
         }else{
             var cycleDuration, firstKeyFrame;
             if(!durationFlag){
-                if(!duration || duration > keyframes.length - 1){
-                    duration = keyframes.length - 1;
+                if(!duration || duration > _df.length - 1){
+                    duration = _df.length - 1;
                 }
-                firstKeyFrame = keyframes[keyframes.length - 1 - duration].t;
+                firstKeyFrame = _df[_df.length - 1 - duration].t;
                 cycleDuration = lastKeyFrame - firstKeyFrame;
             } else {
                 if(!duration){
@@ -11902,12 +11848,12 @@
             if(type === 'pingpong') {
                 var iterations = Math.floor((currentFrame - firstKeyFrame)/cycleDuration);
                 if(iterations % 2 !== 0){
-                    return this.getValueAtTime(((cycleDuration - (currentFrame - firstKeyFrame) % cycleDuration +  firstKeyFrame)) / this.comp._x.frameRate, 0);
+                    return this._dg(((cycleDuration - (currentFrame - firstKeyFrame) % cycleDuration +  firstKeyFrame)) / this.comp._x.frameRate, 0);
                 }
             } else if(type === 'offset'){
-                var initV = this.getValueAtTime(firstKeyFrame / this.comp._x.frameRate, 0);
-                var endV = this.getValueAtTime(lastKeyFrame / this.comp._x.frameRate, 0);
-                var current = this.getValueAtTime(((currentFrame - firstKeyFrame) % cycleDuration +  firstKeyFrame) / this.comp._x.frameRate, 0);
+                var initV = this._dg(firstKeyFrame / this.comp._x.frameRate, 0);
+                var endV = this._dg(lastKeyFrame / this.comp._x.frameRate, 0);
+                var current = this._dg(((currentFrame - firstKeyFrame) % cycleDuration +  firstKeyFrame) / this.comp._x.frameRate, 0);
                 var repeats = Math.floor((currentFrame - firstKeyFrame)/cycleDuration);
                 if(this.pv.length){
                     ret = new Array(initV.length);
@@ -11919,8 +11865,8 @@
                 }
                 return (endV-initV)*repeats + current;
             } else if(type === 'continue'){
-                var lastValue = this.getValueAtTime(lastKeyFrame / this.comp._x.frameRate, 0);
-                var nextLastValue = this.getValueAtTime((lastKeyFrame - 0.001) / this.comp._x.frameRate, 0);
+                var lastValue = this._dg(lastKeyFrame / this.comp._x.frameRate, 0);
+                var nextLastValue = this._dg((lastKeyFrame - 0.001) / this.comp._x.frameRate, 0);
                 if(this.pv.length){
                     ret = new Array(lastValue.length);
                     len = ret.length;
@@ -11931,7 +11877,7 @@
                 }
                 return lastValue + (lastValue-nextLastValue)*(((currentFrame - lastKeyFrame))/0.001);
             }
-            return this.getValueAtTime((((currentFrame - firstKeyFrame) % cycleDuration +  firstKeyFrame)) / this.comp._x.frameRate, 0);
+            return this._dg((((currentFrame - firstKeyFrame) % cycleDuration +  firstKeyFrame)) / this.comp._x.frameRate, 0);
         }
     }
 
@@ -11941,17 +11887,17 @@
         }
         type = type ? type.toLowerCase() : '';
         var currentFrame = this.comp.renderedFrame;
-        var keyframes = this.keyframes;
-        var firstKeyFrame = keyframes[0].t;
+        var _df = this._df;
+        var firstKeyFrame = _df[0].t;
         if(currentFrame>=firstKeyFrame){
             return this.pv;
         }else{
             var cycleDuration, lastKeyFrame;
             if(!durationFlag){
-                if(!duration || duration > keyframes.length - 1){
-                    duration = keyframes.length - 1;
+                if(!duration || duration > _df.length - 1){
+                    duration = _df.length - 1;
                 }
-                lastKeyFrame = keyframes[duration].t;
+                lastKeyFrame = _df[duration].t;
                 cycleDuration = lastKeyFrame - firstKeyFrame;
             } else {
                 if(!duration){
@@ -11965,12 +11911,12 @@
             if(type === 'pingpong') {
                 var iterations = Math.floor((firstKeyFrame - currentFrame)/cycleDuration);
                 if(iterations % 2 === 0){
-                    return this.getValueAtTime((((firstKeyFrame - currentFrame)%cycleDuration +  firstKeyFrame)) / this.comp._x.frameRate, 0);
+                    return this._dg((((firstKeyFrame - currentFrame)%cycleDuration +  firstKeyFrame)) / this.comp._x.frameRate, 0);
                 }
             } else if(type === 'offset'){
-                var initV = this.getValueAtTime(firstKeyFrame / this.comp._x.frameRate, 0);
-                var endV = this.getValueAtTime(lastKeyFrame / this.comp._x.frameRate, 0);
-                var current = this.getValueAtTime((cycleDuration - (firstKeyFrame - currentFrame)%cycleDuration +  firstKeyFrame) / this.comp._x.frameRate, 0);
+                var initV = this._dg(firstKeyFrame / this.comp._x.frameRate, 0);
+                var endV = this._dg(lastKeyFrame / this.comp._x.frameRate, 0);
+                var current = this._dg((cycleDuration - (firstKeyFrame - currentFrame)%cycleDuration +  firstKeyFrame) / this.comp._x.frameRate, 0);
                 var repeats = Math.floor((firstKeyFrame - currentFrame)/cycleDuration)+1;
                 if(this.pv.length){
                     ret = new Array(initV.length);
@@ -11982,8 +11928,8 @@
                 }
                 return current-(endV-initV)*repeats;
             } else if(type === 'continue'){
-                var firstValue = this.getValueAtTime(firstKeyFrame / this.comp._x.frameRate, 0);
-                var nextFirstValue = this.getValueAtTime((firstKeyFrame + 0.001) / this.comp._x.frameRate, 0);
+                var firstValue = this._dg(firstKeyFrame / this.comp._x.frameRate, 0);
+                var nextFirstValue = this._dg((firstKeyFrame + 0.001) / this.comp._x.frameRate, 0);
                 if(this.pv.length){
                     ret = new Array(firstValue.length);
                     len = ret.length;
@@ -11994,11 +11940,11 @@
                 }
                 return firstValue + (firstValue-nextFirstValue)*(firstKeyFrame - currentFrame)/0.001;
             }
-            return this.getValueAtTime(((cycleDuration - (firstKeyFrame - currentFrame) % cycleDuration +  firstKeyFrame)) / this.comp._x.frameRate, 0);
+            return this._dg(((cycleDuration - (firstKeyFrame - currentFrame) % cycleDuration +  firstKeyFrame)) / this.comp._x.frameRate, 0);
         }
     }
 
-    function getValueAtTime(frameNum) {
+    function _dg(frameNum) {
         //TODO this shouldn't be necessary anymore
         if(!this._cachingAtTime) {
             this._cachingAtTime = {lastValue:initialDefaultFrame,lastIndex:0};
@@ -12020,11 +11966,11 @@
         }
         var delta = -0.01;
         //frameNum += this.elem.data.st;
-        var v1 = this.getValueAtTime(frameNum);
-        var v2 = this.getValueAtTime(frameNum + delta);
+        var v1 = this._dg(frameNum);
+        var v2 = this._dg(frameNum + delta);
         var velocity;
         if(v1.length){
-            velocity = createTypedArray('float32', v1.length);
+            velocity = _cs('float32', v1.length);
             var i;
             for(i=0;i<v1.length;i+=1){
                 //removing frameRate
@@ -12085,9 +12031,9 @@
             this.getMult = getValueProxy;
             this.getVelocityAtTime = getVelocityAtTime;
             if(this.kf){
-                this.getValueAtTime = getValueAtTime.bind(this);
+                this._dg = _dg.bind(this);
             } else {
-                this.getValueAtTime = getStaticValueAtTime.bind(this);
+                this._dg = getStaticValueAtTime.bind(this);
             }
             this._ce = _ce;
         }
@@ -12096,10 +12042,10 @@
     var _bj = _ag._bj;
     _ag._bj = function(elem, data, arr) {
         var prop = _bj(elem, data, arr);
-        if(prop.dynamicProperties.length) {
-            prop.getValueAtTime = getTransformValueAtTime.bind(prop);
+        if(prop._co.length) {
+            prop._dg = getTransformValueAtTime.bind(prop);
         } else {
-            prop.getValueAtTime = getTransformStaticValueAtTime.bind(prop);
+            prop._dg = getTransformStaticValueAtTime.bind(prop);
         }
         prop._ce = _ce;
         return prop;
@@ -12112,9 +12058,9 @@
         //prop.loopOut = loopOut;
         //prop.loopIn = loopIn;
         if(prop.kf){
-            prop.getValueAtTime = getValueAtTime.bind(prop);
+            prop._dg = _dg.bind(prop);
         } else {
-            prop.getValueAtTime = getStaticValueAtTime.bind(prop);
+            prop._dg = getStaticValueAtTime.bind(prop);
         }
         prop._ce = _ce;
         prop.loopOut = loopOut;
@@ -12123,7 +12069,7 @@
         prop.numKeys = data.a === 1 ? data.k.length : 0;
         var isAdded = prop.k;
         prop.propertyIndex = data.ix;
-        prop._cachingAtTime={lastFrame:initialDefaultFrame,lastIndex:0,value:type === 0 ? 0 : createTypedArray('float32', 3)}
+        prop._cachingAtTime={lastFrame:initialDefaultFrame,lastIndex:0,value:type === 0 ? 0 : _cs('float32', 3)}
         searchExpressions(elem,data,prop);
         if(!isAdded && prop.x){
             arr.push(prop);
@@ -12157,12 +12103,12 @@
         vertices: function(prop, time){
             var shapePath = this.v;
             if(time !== undefined) {
-                shapePath = this.getValueAtTime(time, 0);
+                shapePath = this._dg(time, 0);
             }
             var i, len = shapePath._length;
             var vertices = shapePath[prop];
             var points = shapePath.v;
-            var arr = Array.apply(null,{length:len})
+            var arr = _cv(len);
             for(i = 0; i < len; i += 1) {
                 if(prop === 'i' || prop === 'o') {
                     arr[i] = [vertices[i][0] - points[i][0], vertices[i][1] - points[i][1]]
@@ -12188,7 +12134,7 @@
         pointOnPath: function(perc, time){
             var shapePath = this.v;
             if(time !== undefined) {
-                shapePath = this.getValueAtTime(time, 0);
+                shapePath = this._dg(time, 0);
             }
             if(!this._segmentsLength) {
                 this._segmentsLength = bez.getSegmentsLength(shapePath);
@@ -12235,11 +12181,11 @@
             return this.vectorOnPath(perc, time, 'normal');
         },
         _ce: _ce,
-        getValueAtTime: getStaticValueAtTime
+        _dg: getStaticValueAtTime
     }
     extendPrototype([ShapeExpressions], ShapePropertyConstructorFunction);
     extendPrototype([ShapeExpressions], KeyframedShapePropertyConstructorFunction);
-    KeyframedShapePropertyConstructorFunction.prototype.getValueAtTime = getShapeValueAtTime;
+    KeyframedShapePropertyConstructorFunction.prototype._dg = getShapeValueAtTime;
     KeyframedShapePropertyConstructorFunction.prototype.initiateExpression = ExpressionManager.initiateExpression;
 
     var propertyGetShapeProp = _ah._bp;
@@ -12964,20 +12910,20 @@
         var transformMat;
         if(time) {
             //Todo implement value at time on transform properties
-            //transformMat = this._elem.finalTransform.mProp.getValueAtTime(time);
+            //transformMat = this._elem.finalTransform.mProp._dg(time);
             transformMat = this._elem.finalTransform.mProp;
         } else {
             transformMat = this._elem.finalTransform.mProp;
         }
         transformMat.applyToMatrix(toWorldMat);
-        if(this._elem.hierarchy && this._elem.hierarchy.length){
-            var i, len = this._elem.hierarchy.length;
+        if(this._elem._dd && this._elem._dd.length){
+            var i, len = this._elem._dd.length;
             for(i=0;i<len;i+=1){
-                this._elem.hierarchy[i].finalTransform.mProp.applyToMatrix(toWorldMat);
+                this._elem._dd[i].finalTransform.mProp.applyToMatrix(toWorldMat);
             }
-            return toWorldMat.applyToPointArray(arr[0],arr[1],arr[2]||0);
+            return toWorldMat._cn(arr[0],arr[1],arr[2]||0);
         }
-        return toWorldMat.applyToPointArray(arr[0],arr[1],arr[2]||0);
+        return toWorldMat._cn(arr[0],arr[1],arr[2]||0);
     }
     function fromWorld(arr, time){
         var toWorldMat = new Matrix();
@@ -12985,16 +12931,16 @@
         var transformMat;
         if(time) {
             //Todo implement value at time on transform properties
-            //transformMat = this._elem.finalTransform.mProp.getValueAtTime(time);
+            //transformMat = this._elem.finalTransform.mProp._dg(time);
             transformMat = this._elem.finalTransform.mProp;
         } else {
             transformMat = this._elem.finalTransform.mProp;
         }
         transformMat.applyToMatrix(toWorldMat);
-        if(this._elem.hierarchy && this._elem.hierarchy.length){
-            var i, len = this._elem.hierarchy.length;
+        if(this._elem._dd && this._elem._dd.length){
+            var i, len = this._elem._dd.length;
             for(i=0;i<len;i+=1){
-                this._elem.hierarchy[i].finalTransform.mProp.applyToMatrix(toWorldMat);
+                this._elem._dd[i].finalTransform.mProp.applyToMatrix(toWorldMat);
             }
             return toWorldMat.inversePoint(arr);
         }
@@ -13004,10 +12950,10 @@
         var toWorldMat = new Matrix();
         toWorldMat.reset();
         this._elem.finalTransform.mProp.applyToMatrix(toWorldMat);
-        if(this._elem.hierarchy && this._elem.hierarchy.length){
-            var i, len = this._elem.hierarchy.length;
+        if(this._elem._dd && this._elem._dd.length){
+            var i, len = this._elem._dd.length;
             for(i=0;i<len;i+=1){
-                this._elem.hierarchy[i].finalTransform.mProp.applyToMatrix(toWorldMat);
+                this._elem._dd[i].finalTransform.mProp.applyToMatrix(toWorldMat);
             }
             return toWorldMat.inversePoint(arr);
         }
@@ -13054,12 +13000,12 @@
         Object.defineProperties(_cd,{
             hasParent: {
                 get: function(){
-                    return elem.hierarchy.length;
+                    return elem._dd.length;
                 }
             },
             parent: {
                 get: function(){
-                    return elem.hierarchy[0].layerInterface;
+                    return elem._dd[0].layerInterface;
                 }
             },
             rotation: getDescriptor(transformInterface, 'rotation'),
@@ -13107,8 +13053,8 @@
         Object.defineProperty(_cd, "_name", { value:comp.data.nm });
         _cd.layer = _cd;
         _cd.pixelAspect = 1;
-        _cd.height = comp._x.compSize.h;
-        _cd.width = comp._x.compSize.w;
+        _cd.height = comp._x._de.h;
+        _cd.width = comp._x._de.w;
         _cd.pixelAspect = 1;
         _cd.frameDuration = 1/comp._x.frameRate;
         return _cd;
@@ -13261,18 +13207,18 @@
     function createEffectsInterface(elem, propertyGroup){
         if(elem.effects){
 
-            var effectElements = [];
+            var _cm = [];
             var effectsData = elem.data.ef;
-            var i, len = elem.effects.effectElements.length;
+            var i, len = elem.effects._cm.length;
             for(i=0;i<len;i+=1){
-                effectElements.push(createGroupInterface(effectsData[i],elem.effects.effectElements[i],propertyGroup,elem));
+                _cm.push(createGroupInterface(effectsData[i],elem.effects._cm[i],propertyGroup,elem));
             }
 
             return function(name){
                 var effects = elem.data.ef, i = 0, len = effects.length;
                 while(i<len) {
                     if(name === effects[i].nm || name === effects[i].mn || name === effects[i].ix){
-                        return effectElements[i];
+                        return _cm[i];
                     }
                     i += 1;
                 }
@@ -13281,13 +13227,13 @@
     }
 
     function createGroupInterface(data,_br, propertyGroup, elem){
-        var effectElements = [];
+        var _cm = [];
         var i, len = data.ef.length;
         for(i=0;i<len;i+=1){
             if(data.ef[i].ty === 5){
-                effectElements.push(createGroupInterface(data.ef[i],_br.effectElements[i],_br.effectElements[i].propertyGroup, elem));
+                _cm.push(createGroupInterface(data.ef[i],_br._cm[i],_br._cm[i].propertyGroup, elem));
             } else {
-                effectElements.push(createValueInterface(_br.effectElements[i],data.ef[i].ty, elem, _propertyGroup));
+                _cm.push(createValueInterface(_br._cm[i],data.ef[i].ty, elem, _propertyGroup));
             }
         }
 
@@ -13304,14 +13250,14 @@
             while(i<len) {
                 if(name === effects[i].nm || name === effects[i].mn || name === effects[i].ix){
                     if(effects[i].ty === 5){
-                        return effectElements[i];
+                        return _cm[i];
                     } else {
-                        return effectElements[i]();
+                        return _cm[i]();
                     }
                 }
                 i += 1;
             }
-            return effectElements[0]();
+            return _cm[0]();
         }
 
         groupInterface.propertyGroup = _propertyGroup;
@@ -13319,7 +13265,7 @@
         if(data.mn === 'ADBE Color Control'){
             Object.defineProperty(groupInterface, 'color', {
                 get: function(){
-                    return effectElements[0]();
+                    return _cm[0]();
                 }
             });
         }
@@ -13368,7 +13314,7 @@
 	var MaskManager = function(maskManager, elem){
 		var _maskManager = maskManager;
 		var _elem = elem;
-		var _masksInterfaces = Array.apply(null,{length: maskManager.viewData.length});
+		var _masksInterfaces = _cv(maskManager.viewData.length);
 		var i, len = maskManager.viewData.length;
 		for(i = 0; i < len; i += 1) {
 			_masksInterfaces[i] = new MaskInterface(maskManager.viewData[i], maskManager.masksProperties[i]);
@@ -13400,8 +13346,8 @@
         if (type) {
         	if(type === 'color') {
         		len = 4;
-                expressionValue = createTypedArray('float32', len);
-                arrValue = createTypedArray('float32', len);
+                expressionValue = _cs('float32', len);
+                arrValue = _cs('float32', len);
 		        for (i = 0; i < len; i += 1) {
 		            expressionValue[i] = arrValue[i] = (mult && i < 3) ? elementProp.v[i] * mult : 1;
 		        }
@@ -13412,124 +13358,124 @@
             expressionValue.value = mult ? elementProp.v * mult : elementProp.v;
         } else {
         	len = elementProp.v.length;
-            expressionValue = createTypedArray('float32', len);
-            arrValue = createTypedArray('float32', len);
+            expressionValue = _cs('float32', len);
+            arrValue = _cs('float32', len);
 	        for (i = 0; i < len; i += 1) {
 	            expressionValue[i] = arrValue[i] = mult ? elementProp.v[i] * mult : elementProp.v[i];
 	        }
 	        expressionValue.value = arrValue;
         }
         
-        expressionValue.numKeys = elementProp.keyframes ? elementProp.keyframes.length : 0;
+        expressionValue.numKeys = elementProp._df ? elementProp._df.length : 0;
         expressionValue.key = function(pos) {
             if (!expressionValue.numKeys) {
                 return 0;
             } else {
-                return elementProp.keyframes[pos-1].t;
+                return elementProp._df[pos-1].t;
             }
         };
-        expressionValue.valueAtTime = elementProp.getValueAtTime;
+        expressionValue.valueAtTime = elementProp._dg;
         expressionValue.propertyGroup = elementProp.propertyGroup;
         return expressionValue;
 	}
 }())
-function SliderEffect(data,elem, dynamicProperties){
-    this.p = _ai._bo(elem,data.v,0,0,dynamicProperties);
+function SliderEffect(data,elem, _co){
+    this.p = _ai._bo(elem,data.v,0,0,_co);
 }
-function AngleEffect(data,elem, dynamicProperties){
-    this.p = _ai._bo(elem,data.v,0,0,dynamicProperties);
+function AngleEffect(data,elem, _co){
+    this.p = _ai._bo(elem,data.v,0,0,_co);
 }
-function ColorEffect(data,elem, dynamicProperties){
-    this.p = _ai._bo(elem,data.v,1,0,dynamicProperties);
+function ColorEffect(data,elem, _co){
+    this.p = _ai._bo(elem,data.v,1,0,_co);
 }
-function PointEffect(data,elem, dynamicProperties){
-    this.p = _ai._bo(elem,data.v,1,0,dynamicProperties);
+function PointEffect(data,elem, _co){
+    this.p = _ai._bo(elem,data.v,1,0,_co);
 }
-function LayerIndexEffect(data,elem, dynamicProperties){
-    this.p = _ai._bo(elem,data.v,0,0,dynamicProperties);
+function LayerIndexEffect(data,elem, _co){
+    this.p = _ai._bo(elem,data.v,0,0,_co);
 }
-function MaskIndexEffect(data,elem, dynamicProperties){
-    this.p = _ai._bo(elem,data.v,0,0,dynamicProperties);
+function MaskIndexEffect(data,elem, _co){
+    this.p = _ai._bo(elem,data.v,0,0,_co);
 }
-function CheckboxEffect(data,elem, dynamicProperties){
-    this.p = _ai._bo(elem,data.v,0,0,dynamicProperties);
+function CheckboxEffect(data,elem, _co){
+    this.p = _ai._bo(elem,data.v,0,0,_co);
 }
 function NoValueEffect(){
     this.p = {};
 }
-function EffectsManager(data,element,dynamicProperties){
+function EffectsManager(data,element,_co){
     var effects = data.ef || [];
-    this.effectElements = [];
+    this._cm = [];
     var i,len = effects.length;
     var effectItem;
     for(i=0;i<len;i++) {
-        effectItem = new GroupEffect(effects[i],element,dynamicProperties);
-        this.effectElements.push(effectItem);
+        effectItem = new GroupEffect(effects[i],element,_co);
+        this._cm.push(effectItem);
     }
 }
 
-function GroupEffect(data,element,dynamicProperties){
-    this.dynamicProperties = [];
-    this.init(data,element,this.dynamicProperties);
-    if(this.dynamicProperties.length){
-        dynamicProperties.push(this);
+function GroupEffect(data,element,_co){
+    this._co = [];
+    this.init(data,element,this._co);
+    if(this._co.length){
+        _co.push(this);
     }
 }
 
 GroupEffect.prototype.getValue = function(){
     this.mdf = false;
-    var i, len = this.dynamicProperties.length;
+    var i, len = this._co.length;
     for(i=0;i<len;i+=1){
-        this.dynamicProperties[i].getValue();
-        this.mdf = this.dynamicProperties[i].mdf ? true : this.mdf;
+        this._co[i].getValue();
+        this.mdf = this._co[i].mdf ? true : this.mdf;
     }
 };
 
-GroupEffect.prototype.init = function(data,element,dynamicProperties){
+GroupEffect.prototype.init = function(data,element,_co){
     this.data = data;
     this.mdf = false;
-    this.effectElements = [];
+    this._cm = [];
     var i, len = this.data.ef.length;
     var eff, effects = this.data.ef;
     for(i=0;i<len;i+=1){
         switch(effects[i].ty){
             case 0:
-                eff = new SliderEffect(effects[i],element,dynamicProperties);
-                this.effectElements.push(eff);
+                eff = new SliderEffect(effects[i],element,_co);
+                this._cm.push(eff);
                 break;
             case 1:
-                eff = new AngleEffect(effects[i],element,dynamicProperties);
-                this.effectElements.push(eff);
+                eff = new AngleEffect(effects[i],element,_co);
+                this._cm.push(eff);
                 break;
             case 2:
-                eff = new ColorEffect(effects[i],element,dynamicProperties);
-                this.effectElements.push(eff);
+                eff = new ColorEffect(effects[i],element,_co);
+                this._cm.push(eff);
                 break;
             case 3:
-                eff = new PointEffect(effects[i],element,dynamicProperties);
-                this.effectElements.push(eff);
+                eff = new PointEffect(effects[i],element,_co);
+                this._cm.push(eff);
                 break;
             case 4:
             case 7:
-                eff = new CheckboxEffect(effects[i],element,dynamicProperties);
-                this.effectElements.push(eff);
+                eff = new CheckboxEffect(effects[i],element,_co);
+                this._cm.push(eff);
                 break;
             case 10:
-                eff = new LayerIndexEffect(effects[i],element,dynamicProperties);
-                this.effectElements.push(eff);
+                eff = new LayerIndexEffect(effects[i],element,_co);
+                this._cm.push(eff);
                 break;
             case 11:
-                eff = new MaskIndexEffect(effects[i],element,dynamicProperties);
-                this.effectElements.push(eff);
+                eff = new MaskIndexEffect(effects[i],element,_co);
+                this._cm.push(eff);
                 break;
             case 5:
-                eff = new EffectsManager(effects[i],element,dynamicProperties);
-                this.effectElements.push(eff);
+                eff = new EffectsManager(effects[i],element,_co);
+                this._cm.push(eff);
                 break;
             case 6:
             default:
-                eff = new NoValueEffect(effects[i],element,dynamicProperties);
-                this.effectElements.push(eff);
+                eff = new NoValueEffect(effects[i],element,_co);
+                this._cm.push(eff);
                 break;
         }
     }
diff --git a/build/player/lottie.min.js b/build/player/lottie.min.js
index 24bc160..54f4e71 100644
--- a/build/player/lottie.min.js
+++ b/build/player/lottie.min.js
@@ -1,8 +1,8 @@
-!function(t,e){"function"==typeof define&&define.amd?define(function(){return e(t)}):"object"==typeof module&&module.exports?module.exports=e(t):(t.lottie=e(t),t.bodymovin=t.lottie)}(window||{},function(window){"use strict";function ProjectInterface(){return{}}function roundValues(t){bm_rnd=t?Math.round:function(t){return t}}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 BMEnterFrameEvent(t,e,r,s){this.type=t,this.currentTime=e,this.totalTime=r,this.direction=s<0?-1:1}function BMCompleteEvent(t,e){this.type=t,this.direction=e<0?-1:1}function BMCompleteLoopEvent(t,e,r,s){this.type=t,this.currentLoop=e,this.totalLoops=r,this.direction=s<0?-1:1}function BMSegmentStartEvent(t,e,r){this.type=t,this.firstFrame=e,this.totalFrames=r}function BMDestroyEvent(t,e){this.type=t,this.target=e}function _addEventListener(t,e){return this._cbs[t]||(this._cbs[t]=[]),this._cbs[t].push(e),function(){this.removeEventListener(t,e)}.bind(this)}function _removeEventListener(t,e){if(e){if(this._cbs[t]){for(var r=0,s=this._cbs[t].length;r<s;)this._cbs[t][r]===e&&(this._cbs[t].splice(r,1),r-=1,s-=1),r+=1;this._cbs[t].length||(this._cbs[t]=null)}}else this._cbs[t]=null}function _triggerEvent(t,e){if(this._cbs[t])for(var r=this._cbs[t].length,s=0;s<r;s++)this._cbs[t][s](e)}function randomString(t,e){void 0===e&&(e="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890");var r,s="";for(r=t;r>0;--r)s+=e[Math.round(Math.random()*(e.length-1))];return s}function HSVtoRGB(t,e,r){var s,i,a,n,o,h,l,p;switch(1===arguments.length&&(e=t.s,r=t.v,t=t.h),n=Math.floor(6*t),o=6*t-n,h=r*(1-e),l=r*(1-o*e),p=r*(1-(1-o)*e),n%6){case 0:s=r,i=p,a=h;break;case 1:s=l,i=r,a=h;break;case 2:s=h,i=r,a=p;break;case 3:s=h,i=l,a=r;break;case 4:s=p,i=h,a=r;break;case 5:s=r,i=h,a=l}return[s,i,a]}function RGBtoHSV(t,e,r){1===arguments.length&&(e=t.g,r=t.b,t=t.r);var s,i=Math.max(t,e,r),a=Math.min(t,e,r),n=i-a,o=0===i?0:n/i,h=i/255;switch(i){case a:s=0;break;case t:s=e-r+n*(e<r?6:0),s/=6*n;break;case e:s=r-t+2*n,s/=6*n;break;case r:s=t-e+4*n,s/=6*n}return[s,o,h]}function addSaturationToRGB(t,e){var r=RGBtoHSV(255*t[0],255*t[1],255*t[2]);return r[1]+=e,r[1]>1?r[1]=1:r[1]<=0&&(r[1]=0),HSVtoRGB(r[0],r[1],r[2])}function addBrightnessToRGB(t,e){var r=RGBtoHSV(255*t[0],255*t[1],255*t[2]);return r[2]+=e,r[2]>1?r[2]=1:r[2]<0&&(r[2]=0),HSVtoRGB(r[0],r[1],r[2])}function addHueToRGB(t,e){var r=RGBtoHSV(255*t[0],255*t[1],255*t[2]);return r[0]+=e/360,r[0]>1?r[0]-=1:r[0]<0&&(r[0]+=1),HSVtoRGB(r[0],r[1],r[2])}function createNS(t){return document.createElementNS(svgNS,t)}function createTag(t){return document.createElement(t)}function extendPrototype(t,e){var r,s,i=t.length;for(r=0;r<i;r+=1){s=t[r].prototype;for(var a in s)s.hasOwnProperty(a)&&(e.prototype[a]=s[a])}}function getDescriptor(t,e){return Object.getOwnPropertyDescriptor(t,e)}function bezFunction(){function t(t,e,r,s,i,a){var n=t*s+e*i+r*a-i*s-a*t-r*e;return n>-1e-4&&n<1e-4}function e(e,r,s,i,a,n,o,h,l){if(0===s&&0===n&&0===l)return t(e,r,i,a,o,h);var p,m=Math.sqrt(Math.pow(i-e,2)+Math.pow(a-r,2)+Math.pow(n-s,2)),f=Math.sqrt(Math.pow(o-e,2)+Math.pow(h-r,2)+Math.pow(l-s,2)),c=Math.sqrt(Math.pow(o-i,2)+Math.pow(h-a,2)+Math.pow(l-n,2));return p=m>f?m>c?m-f-c:c-f-m:c>f?c-f-m:f-m-c,p>-1e-4&&p<1e-4}function r(t){var e,r=segments_length_pool.newElement(),s=t.c,i=t.v,a=t.o,n=t.i,o=t._length,l=r.lengths,p=0;for(e=0;e<o-1;e+=1)l[e]=h(i[e],i[e+1],a[e],n[e+1]),p+=l[e].addedLength;return s&&(l[e]=h(i[e],i[0],a[e],n[0]),p+=l[e].addedLength),r.totalLength=p,r}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 r=e.percents,s=e.lengths,i=r.length,a=bm_floor((i-1)*t),n=t*e.addedLength,o=0;if(a===i-1||0===a||n===s[a])return r[a];for(var h=s[a]>n?-1:1,l=!0;l;)if(s[a]<=n&&s[a+1]>n?(o=(n-s[a])/(s[a+1]-s[a]),l=!1):a+=h,a<0||a>=i-1){if(a===i-1)return r[a];l=!1}return r[a]+(r[a+1]-r[a])*o}function n(t,e,r,s,i,n){var o=a(i,n),h=1-o,l=Math.round(1e3*(h*h*h*t[0]+(o*h*h+h*o*h+h*h*o)*r[0]+(o*o*h+h*o*o+o*h*o)*s[0]+o*o*o*e[0]))/1e3,p=Math.round(1e3*(h*h*h*t[1]+(o*h*h+h*o*h+h*h*o)*r[1]+(o*o*h+h*o*o+o*h*o)*s[1]+o*o*o*e[1]))/1e3;return[l,p]}function o(t,e,r,s,i,n,o){i=i<0?0:i>1?1:i;var h=a(i,o);n=n>1?1:n;var l,m=a(n,o),f=t.length,c=1-h,d=1-m,u=c*c*c,y=h*c*c*3,g=h*h*c*3,v=h*h*h,b=c*c*d,E=h*c*d+c*h*d+c*c*m,P=h*h*d+c*h*m+h*c*m,x=h*h*m,S=c*d*d,C=h*d*d+c*m*d+c*d*m,A=h*m*d+c*m*m+h*d*m,k=h*m*m,M=d*d*d,T=m*d*d+d*m*d+d*d*m,D=m*m*d+d*m*m+m*d*m,w=m*m*m;for(l=0;l<f;l+=1)p[4*l]=Math.round(1e3*(u*t[l]+y*r[l]+g*s[l]+v*e[l]))/1e3,p[4*l+1]=Math.round(1e3*(b*t[l]+E*r[l]+P*s[l]+x*e[l]))/1e3,p[4*l+2]=Math.round(1e3*(S*t[l]+C*r[l]+A*s[l]+k*e[l]))/1e3,p[4*l+3]=Math.round(1e3*(M*t[l]+T*r[l]+D*s[l]+w*e[l]))/1e3;return p}var h=(Math,function(){return function(t,e,r,s){var i,a,n,o,h,l,p=defaultCurveSegments,m=0,f=[],c=[],d=bezier_length_pool.newElement();for(n=r.length,i=0;i<p;i+=1){for(h=i/(p-1),l=0,a=0;a<n;a+=1)o=bm_pow(1-h,3)*t[a]+3*bm_pow(1-h,2)*h*r[a]+3*(1-h)*bm_pow(h,2)*s[a]+bm_pow(h,3)*e[a],f[a]=o,null!==c[a]&&(l+=bm_pow(f[a]-c[a],2)),c[a]=f[a];l&&(l=bm_sqrt(l),m+=l),d.percents[i]=h,d.lengths[i]=m}return d.addedLength=m,d}}()),l=function(){var e={};return function(r){var a=r.s,n=r.e,o=r.to,h=r.ti,l=(a[0]+"_"+a[1]+"_"+n[0]+"_"+n[1]+"_"+o[0]+"_"+o[1]+"_"+h[0]+"_"+h[1]).replace(/\./g,"p");if(e[l])return void(r.bezierData=e[l]);var p,m,f,c,d,u,y,g=defaultCurveSegments,v=0,b=null;2===a.length&&(a[0]!=n[0]||a[1]!=n[1])&&t(a[0],a[1],n[0],n[1],a[0]+o[0],a[1]+o[1])&&t(a[0],a[1],n[0],n[1],n[0]+h[0],n[1]+h[1])&&(g=2);var E=new s(g);for(f=o.length,p=0;p<g;p+=1){for(y=Array.apply(null,{length:f}),d=p/(g-1),u=0,m=0;m<f;m+=1)c=bm_pow(1-d,3)*a[m]+3*bm_pow(1-d,2)*d*(a[m]+o[m])+3*(1-d)*bm_pow(d,2)*(n[m]+h[m])+bm_pow(d,3)*n[m],y[m]=c,null!==b&&(u+=bm_pow(y[m]-b[m],2));u=bm_sqrt(u),v+=u,E.points[p]=new i(u,y),b=y}E.segmentLength=v,r.bezierData=E,e[l]=E}}(),p=createTypedArray("float32",8);return{getSegmentsLength:r,getNewSegment:o,getPointInSegment:n,buildBezierData:l,pointOnLine2D:t,pointOnLine3D:e}}function dataFunctionManager(){function t(i,a,o){var h,l,p,m,f,c,d,u,y=i.length;for(m=0;m<y;m+=1)if(h=i[m],"ks"in h&&!h.completed){if(h.completed=!0,h.tt&&(i[m-1].td=h.tt),l=[],p=-1,h.hasMask){var g=h.masksProperties;for(c=g.length,f=0;f<c;f+=1)if(g[f].pt.k.i)s(g[f].pt.k);else for(u=g[f].pt.k.length,d=0;d<u;d+=1)g[f].pt.k[d].s&&s(g[f].pt.k[d].s[0]),g[f].pt.k[d].e&&s(g[f].pt.k[d].e[0])}0===h.ty?(h.layers=e(h.refId,a),t(h.layers,a,o)):4===h.ty?r(h.shapes):5==h.ty&&n(h,o)}}function e(t,e){for(var r=0,s=e.length;r<s;){if(e[r].id===t)return e[r].layers.__used?JSON.parse(JSON.stringify(e[r].layers)):(e[r].layers.__used=!0,e[r].layers);r+=1}}function r(t){var e,i,a,n=t.length,o=!1;for(e=n-1;e>=0;e-=1)if("sh"==t[e].ty){if(t[e].ks.k.i)s(t[e].ks.k);else for(a=t[e].ks.k.length,i=0;i<a;i+=1)t[e].ks.k[i].s&&s(t[e].ks.k[i].s[0]),t[e].ks.k[i].e&&s(t[e].ks.k[i].e[0]);o=!0}else"gr"==t[e].ty&&r(t[e].it)}function s(t){var e,r=t.i.length;for(e=0;e<r;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 i(t,e){var r=e?e.split("."):[100,100,100];return t[0]>r[0]||!(r[0]>t[0])&&(t[1]>r[1]||!(r[1]>t[1])&&(t[2]>r[2]||!(r[2]>t[2])&&void 0))}function a(e,r){e.__complete||(l(e),o(e),h(e),p(e),t(e.layers,e.assets,r),e.__complete=!0)}function n(t,e){0!==t.t.a.length||"m"in t.t.p||(t.singleShape=!0)}var o=function(){function t(t){var e=t.t.d;t.t.d={k:[{s:e,t:0}]}}function e(e){var r,s=e.length;for(r=0;r<s;r+=1)5===e[r].ty&&t(e[r])}var r=[4,4,14];return function(t){if(i(r,t.v)&&(e(t.layers),t.assets)){var s,a=t.assets.length;for(s=0;s<a;s+=1)t.assets[s].layers&&e(t.assets[s].layers)}}}(),h=function(){var t=[4,7,99];return function(e){if(e.chars&&!i(t,e.v)){var r,a,n,o,h,l=e.chars.length;for(r=0;r<l;r+=1)if(e.chars[r].data&&e.chars[r].data.shapes)for(h=e.chars[r].data.shapes[0].it,n=h.length,a=0;a<n;a+=1)o=h[a].ks.k,o.__converted||(s(h[a].ks.k),o.__converted=!0)}}}(),l=function(){function t(e){var r,s,i,a=e.length;for(r=0;r<a;r+=1)if("gr"===e[r].ty)t(e[r].it);else if("fl"===e[r].ty||"st"===e[r].ty)if(e[r].c.k&&e[r].c.k[0].i)for(i=e[r].c.k.length,s=0;s<i;s+=1)e[r].c.k[s].s&&(e[r].c.k[s].s[0]/=255,e[r].c.k[s].s[1]/=255,e[r].c.k[s].s[2]/=255,e[r].c.k[s].s[3]/=255),e[r].c.k[s].e&&(e[r].c.k[s].e[0]/=255,e[r].c.k[s].e[1]/=255,e[r].c.k[s].e[2]/=255,e[r].c.k[s].e[3]/=255);else e[r].c.k[0]/=255,e[r].c.k[1]/=255,e[r].c.k[2]/=255,e[r].c.k[3]/=255}function e(e){var r,s=e.length;for(r=0;r<s;r+=1)4===e[r].ty&&t(e[r].shapes)}var r=[4,1,9];return function(t){if(i(r,t.v)&&(e(t.layers),t.assets)){var s,a=t.assets.length;for(s=0;s<a;s+=1)t.assets[s].layers&&e(t.assets[s].layers)}}}(),p=function(){function t(e){var r,s,i,a=e.length,n=!1;for(r=a-1;r>=0;r-=1)if("sh"==e[r].ty){if(e[r].ks.k.i)e[r].ks.k.c=e[r].closed;else for(i=e[r].ks.k.length,s=0;s<i;s+=1)e[r].ks.k[s].s&&(e[r].ks.k[s].s[0].c=e[r].closed),e[r].ks.k[s].e&&(e[r].ks.k[s].e[0].c=e[r].closed);n=!0}else"gr"==e[r].ty&&t(e[r].it)}function e(e){var r,s,i,a,n,o,h=e.length;for(s=0;s<h;s+=1){if(r=e[s],r.hasMask){var l=r.masksProperties;for(a=l.length,i=0;i<a;i+=1)if(l[i].pt.k.i)l[i].pt.k.c=l[i].cl;else for(o=l[i].pt.k.length,n=0;n<o;n+=1)l[i].pt.k[n].s&&(l[i].pt.k[n].s[0].c=l[i].cl),l[i].pt.k[n].e&&(l[i].pt.k[n].e[0].c=l[i].cl)}4===r.ty&&t(r.shapes)}}var r=[4,4,18];return function(t){if(i(r,t.v)&&(e(t.layers),t.assets)){var s,a=t.assets.length;for(s=0;s<a;s+=1)t.assets[s].layers&&e(t.assets[s].layers)}}}(),m={};return m.completeData=a,m}function _av(){this.c=!1,this._length=0,this._maxLength=8,this.v=Array.apply(null,{length:this._maxLength}),this.o=Array.apply(null,{length:this._maxLength}),this.i=Array.apply(null,{length:this._maxLength})}function _at(){}function _an(){}function _au(){}function _aj(){}function _am(){this._length=0,this._maxLength=4,this.shapes=Array.apply(null,{length:this._maxLength})}function DashProperty(t,e,r,s){this.elem=t,this.frameId=-1,this.dataProps=Array.apply(null,{length:e.length}),this.renderer=r,this.mdf=!1,this.k=!1,this.dashStr="",this.dashArray=createTypedArray("float32",e.length-1),this.dashoffset=createTypedArray("float32",1);var i,a,n=e.length;for(i=0;i<n;i+=1)a=_ai._bo(t,e[i].v,0,0,s),this.k=!!a.k||this.k,this.dataProps[i]={n:e[i].n,p:a};this.k?s.push(this):this.getValue(!0)}function GradientProperty(t,e,r){this.prop=_ai._bo(t,e.k,1,null,[]),this.data=e,this.k=this.prop.k,this.c=createTypedArray("uint8c",4*e.p);var s=e.k.k[0].s?e.k.k[0].s.length-4*e.p:e.k.k.length-4*e.p;this.o=createTypedArray("float32",s),this.cmdf=!1,this.omdf=!1,this._collapsable=this.checkCollapsable(),this._hasOpacity=s,this.prop.k&&r.push(this),this.getValue(!0)}function _bl(t,e,r){this.mdf=!1,this._firstFrame=!0,this._hasMaskedPath=!1,this._frameId=-1,this._dynamicProperties=[],this._textData=t,this._renderType=e,this._elem=r,this._animatorsData=Array.apply(null,{length:this._textData.a.length}),this._pathData={},this._moreOptions={alignment:{}},this._bt=[],this.lettersChangedFlag=!1}function TextAnimatorDataProperty(t,e,r){var s={propType:!1},i=_ai._bo,a=e.a;this.a={r:a.r?i(t,a.r,0,degToRads,r):s,rx:a.rx?i(t,a.rx,0,degToRads,r):s,ry:a.ry?i(t,a.ry,0,degToRads,r):s,sk:a.sk?i(t,a.sk,0,degToRads,r):s,sa:a.sa?i(t,a.sa,0,degToRads,r):s,s:a.s?i(t,a.s,1,.01,r):s,a:a.a?i(t,a.a,1,0,r):s,o:a.o?i(t,a.o,0,.01,r):s,p:a.p?i(t,a.p,1,0,r):s,sw:a.sw?i(t,a.sw,0,0,r):s,sc:a.sc?i(t,a.sc,1,0,r):s,fc:a.fc?i(t,a.fc,1,0,r):s,fh:a.fh?i(t,a.fh,0,0,r):s,fs:a.fs?i(t,a.fs,0,.01,r):s,fb:a.fb?i(t,a.fb,0,.01,r):s,t:a.t?i(t,a.t,0,0,r):s},this.s=TextSelectorProp.getTextSelectorProp(t,e.s,r),this.s.t=e.s.t}function LetterProps(t,e,r,s,i,a){this.o=t,this.sw=e,this.sc=r,this.fc=s,this.m=i,this.p=a,this.mdf={o:!0,sw:!!e,sc:!!r,fc:!!s,m:!0,p:!0}}function _ar(t,e,r){this._frameId=initialDefaultFrame,this.pv="",this.v="",this.kf=!1,this.firstFrame=!0,this.mdf=!0,this.data=e,this.elem=t,this.keysIndex=-1,this.currentData={ascent:0,boxWidth:[0,0],f:"",fStyle:"",fWeight:"",fc:"",j:"",justifyOffset:"",l:[],lh:0,lineWidths:[],ls:"",of:"",s:"",sc:"",sw:0,t:0,tr:0,sz:0,ps:[0,0],fillColorAnim:!1,strokeColorAnim:!1,strokeWidthAnim:!1,yOffset:0,__complete:!1},this.searchProperty()?r.push(this):this.getValue(!0)}function _l(){}function _ao(t,e){this.animationItem=t,this.layers=null,this.renderedFrame=-1,this._cf=createNS("svg");var r=createNS("g");this._cf.appendChild(r),this._bx=r;var s=createNS("defs");this._cf.appendChild(s),this.renderConfig={preserveAspectRatio:e&&e.preserveAspectRatio||"xMidYMid meet",progressiveLoad:e&&e.progressiveLoad||!1,hideOnTransparent:!e||e.hideOnTransparent!==!1,viewBoxOnly:e&&e.viewBoxOnly||!1,viewBoxSize:e&&e.viewBoxSize||!1,className:e&&e.className||""},this._x={mdf:!1,frameNum:-1,defs:s,frameId:0,compSize:{w:0,h:0},renderConfig:this.renderConfig,fontManager:new FontManager},this._br=[],this.pendingElements=[],this.destroyed=!1}function _aq(t,e){this.animationItem=t,this.renderConfig={clearCanvas:!e||void 0===e.clearCanvas||e.clearCanvas,context:e&&e.context||null,progressiveLoad:e&&e.progressiveLoad||!1,preserveAspectRatio:e&&e.preserveAspectRatio||"xMidYMid meet",className:e&&e.className||""},this.renderConfig.dpr=e&&e.dpr||1,this.animationItem.wrapper&&(this.renderConfig.dpr=e&&e.dpr||window.devicePixelRatio||1),this.renderedFrame=-1,this._x={frameNum:-1,mdf:!1,renderConfig:this.renderConfig};this.contextData=new _n,this._br=[],this.pendingElements=[],this.transformMat=new Matrix,this.completeLayers=!1}function _ap(t,e){this.animationItem=t,this.layers=null,this.renderedFrame=-1,this.renderConfig={className:e&&e.className||"",hideOnTransparent:!e||e.hideOnTransparent!==!1},this._x={mdf:!1,frameNum:-1,renderConfig:this.renderConfig},this.pendingElements=[],this._br=[],this.threeDElements=[],this.destroyed=!1,this.camera=null,this.supports3d=!0}function _ay(t,e,r){this.dynamicProperties=[],this.data=t,this.element=e,this._x=r,this.storedData=[],this.masksProperties=this.data.masksProperties||[],this.maskElement=null,this.firstFrame=!0;var s,i=this._x.defs,a=this.masksProperties?this.masksProperties.length:0;this.viewData=Array.apply(null,{length:a}),this.solidPath="";var n,o,h,l,p,m,f,c=this.masksProperties,d=0,u=[],y=randomString(10),g="clipPath",v="clip-path";for(s=0;s<a;s++)if(("a"!==c[s].mode&&"n"!==c[s].mode||c[s].inv||100!==c[s].o.k)&&(g="mask",v="mask"),"s"!=c[s].mode&&"i"!=c[s].mode||0!=d?l=null:(l=createNS("rect"),l.setAttribute("fill","#ffffff"),l.setAttribute("width",this.element.comp.data.w),l.setAttribute("height",this.element.comp.data.h),u.push(l)),n=createNS("path"),"n"!=c[s].mode){if(d+=1,n.setAttribute("fill","s"===c[s].mode?"#000000":"#ffffff"),n.setAttribute("clip-rule","nonzero"),0!==c[s].x.k){g="mask",v="mask",f=_ai._bo(this.element,c[s].x,0,null,this.dynamicProperties);var b="fi_"+randomString(10);p=createNS("filter"),p.setAttribute("id",b),m=createNS("feMorphology"),m.setAttribute("operator","dilate"),m.setAttribute("in","SourceGraphic"),m.setAttribute("radius","0"),p.appendChild(m),i.appendChild(p),n.setAttribute("stroke","s"===c[s].mode?"#000000":"#ffffff")}else m=null,f=null;if(this.storedData[s]={elem:n,x:f,expan:m,lastPath:"",lastOperator:"",filterId:b,lastRadius:0},"i"==c[s].mode){h=u.length;var E=createNS("g");for(o=0;o<h;o+=1)E.appendChild(u[o]);var P=createNS("mask");P.setAttribute("mask-type","alpha"),P.setAttribute("id",y+"_"+d),P.appendChild(n),i.appendChild(P),E.setAttribute("mask","url("+locationHref+"#"+y+"_"+d+")"),u.length=0,u.push(E)}else u.push(n);c[s].inv&&!this.solidPath&&(this.solidPath=this.createLayerSolidPath()),this.viewData[s]={elem:n,lastPath:"",op:_ai._bo(this.element,c[s].o,0,.01,this.dynamicProperties),prop:_ah._bp(this.element,c[s],3,this.dynamicProperties,null)},l&&(this.viewData[s].invRect=l),this.viewData[s].prop.k||this.drawPath(c[s],this.viewData[s].prop.v,this.viewData[s])}else this.viewData[s]={op:_ai._bo(this.element,c[s].o,0,.01,this.dynamicProperties),prop:_ah._bp(this.element,c[s],3,this.dynamicProperties,null),elem:n},i.appendChild(n);for(this.maskElement=createNS(g),a=u.length,s=0;s<a;s+=1)this.maskElement.appendChild(u[s]);d>0&&(this.maskElement.setAttribute("id",y),this.element._ca.setAttribute(v,"url("+locationHref+"#"+y+")"),i.appendChild(this.maskElement))}function _ad(){}function _ac(){}function _af(){}function _ae(){}function RenderableDOMElement(){}function ProcessedElement(t,e){this.elem=t,this.pos=e}function SVGStyleData(t,e){this.data=t,this.type=t.ty,this.d="",this.lvl=e,this.mdf=!1,this.closed=!1,this.pElem=createNS("path"),this.msElem=null}function SVGShapeData(t,e,r){this.caches=[],this.styles=[],this.transformers=t,this.lStr="",this.sh=r,this.lvl=e}function SVGTransformData(t,e){this.transform={mProps:t,op:e},this._br=[]}function SVGStrokeStyleData(t,e,r,s){this.o=_ai._bo(t,e.o,0,.01,r),this.w=_ai._bo(t,e.w,0,null,r),this.d=new DashProperty(t,e.d||{},"svg",r),this.c=_ai._bo(t,e.c,1,255,r),this.style=s}function SVGFillStyleData(t,e,r,s){this.o=_ai._bo(t,e.o,0,.01,r),this.c=_ai._bo(t,e.c,1,255,r),this.style=s}function SVGGradientFillStyleData(t,e,r,s){this.initGradientData(t,e,r,s)}function SVGGradientStrokeStyleData(t,e,r,s){this.w=_ai._bo(t,e.w,0,null,r),this.d=new DashProperty(t,e.d||{},"svg",r),this.initGradientData(t,e,r,s)}function ShapeGroupData(){this.it=[],this.prevViewData=[],this.gr=createNS("g")}function _e(){}function _i(t,e,r){this.initFrame(),this.initBaseData(t,e,r),this.initFrame(),this.initTransform(t,e,r),this.initHierarchy()}function _d(){}function _f(t,e,r){this.shapes=[],this.shapesData=t.shapes,this.stylesList=[],this.shapeModifiers=[],this.itemsData=[],this.processedElements=[],this.initElement(t,e,r),this.prevViewData=[]}function _k(){}function _g(){}function _h(t,e,r){this.assetData=e.getAssetData(t.refId),this.initElement(t,e,r)}function _j(t,e,r){this.initElement(t,e,r)}function SVGCompElement(t,e,r){this.layers=t.layers,this.supports3d=!0,this.completeLayers=!1,this.pendingElements=[],this._br=this.layers?Array.apply(null,{length:this.layers.length}):[],this.initElement(t,e,r),this.tm=t.tm?_ai._bo(this,t.tm,0,e.frameRate,this.dynamicProperties):{_placeholder:!0}}function SVGTextElement(t,e,r){this.textSpans=[],this.renderType="svg",this.initElement(t,e,r)}function _bb(t,e){this.filterManager=e;var r=createNS("feColorMatrix");if(r.setAttribute("type","matrix"),r.setAttribute("color-interpolation-filters","linearRGB"),r.setAttribute("values","0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0 0 0 1 0"),r.setAttribute("result","f1"),t.appendChild(r),r=createNS("feColorMatrix"),r.setAttribute("type","matrix"),r.setAttribute("color-interpolation-filters","sRGB"),r.setAttribute("values","1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0"),r.setAttribute("result","f2"),t.appendChild(r),this.matrixFilter=r,100!==e.effectElements[2].p.v||e.effectElements[2].p.k){var s=createNS("feMerge");t.appendChild(s);var i;i=createNS("feMergeNode"),i.setAttribute("in","SourceGraphic"),s.appendChild(i),i=createNS("feMergeNode"),i.setAttribute("in","f2"),s.appendChild(i)}}function _bc(t,e){this.filterManager=e;var r=createNS("feColorMatrix");r.setAttribute("type","matrix"),r.setAttribute("color-interpolation-filters","sRGB"),r.setAttribute("values","1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0"),t.appendChild(r),this.matrixFilter=r}function _bd(t,e){this.initialized=!1,this.filterManager=e,this.elem=t,this.paths=[]}function _be(t,e){this.filterManager=e;var r=createNS("feColorMatrix");r.setAttribute("type","matrix"),r.setAttribute("color-interpolation-filters","linearRGB"),r.setAttribute("values","0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0 0 0 1 0"),r.setAttribute("result","f1"),t.appendChild(r);var s=createNS("feComponentTransfer");s.setAttribute("color-interpolation-filters","sRGB"),t.appendChild(s),this.matrixFilter=s;var i=createNS("feFuncR");i.setAttribute("type","table"),s.appendChild(i),this.feFuncR=i;var a=createNS("feFuncG");a.setAttribute("type","table"),s.appendChild(a),this.feFuncG=a;var n=createNS("feFuncB");n.setAttribute("type","table"),s.appendChild(n),this.feFuncB=n}function _bf(t,e){this.filterManager=e;var r=this.filterManager.effectElements,s=createNS("feComponentTransfer");(r[10].p.k||0!==r[10].p.v||r[11].p.k||1!==r[11].p.v||r[12].p.k||1!==r[12].p.v||r[13].p.k||0!==r[13].p.v||r[14].p.k||1!==r[14].p.v)&&(this.feFuncR=this.createFeFunc("feFuncR",s)),(r[17].p.k||0!==r[17].p.v||r[18].p.k||1!==r[18].p.v||r[19].p.k||1!==r[19].p.v||r[20].p.k||0!==r[20].p.v||r[21].p.k||1!==r[21].p.v)&&(this.feFuncG=this.createFeFunc("feFuncG",s)),(r[24].p.k||0!==r[24].p.v||r[25].p.k||1!==r[25].p.v||r[26].p.k||1!==r[26].p.v||r[27].p.k||0!==r[27].p.v||r[28].p.k||1!==r[28].p.v)&&(this.feFuncB=this.createFeFunc("feFuncB",s)),(r[31].p.k||0!==r[31].p.v||r[32].p.k||1!==r[32].p.v||r[33].p.k||1!==r[33].p.v||r[34].p.k||0!==r[34].p.v||r[35].p.k||1!==r[35].p.v)&&(this.feFuncA=this.createFeFunc("feFuncA",s)),(this.feFuncR||this.feFuncG||this.feFuncB||this.feFuncA)&&(s.setAttribute("color-interpolation-filters","sRGB"),t.appendChild(s),s=createNS("feComponentTransfer")),(r[3].p.k||0!==r[3].p.v||r[4].p.k||1!==r[4].p.v||r[5].p.k||1!==r[5].p.v||r[6].p.k||0!==r[6].p.v||r[7].p.k||1!==r[7].p.v)&&(s.setAttribute("color-interpolation-filters","sRGB"),t.appendChild(s),this.feFuncRComposed=this.createFeFunc("feFuncR",s),this.feFuncGComposed=this.createFeFunc("feFuncG",s),this.feFuncBComposed=this.createFeFunc("feFuncB",s))}function _bg(t,e){t.setAttribute("x","-100%"),t.setAttribute("y","-100%"),t.setAttribute("width","400%"),t.setAttribute("height","400%"),this.filterManager=e;var r=createNS("feGaussianBlur");r.setAttribute("in","SourceAlpha"),r.setAttribute("result","drop_shadow_1"),r.setAttribute("stdDeviation","0"),this.feGaussianBlur=r,t.appendChild(r);var s=createNS("feOffset");s.setAttribute("dx","25"),s.setAttribute("dy","0"),s.setAttribute("in","drop_shadow_1"),s.setAttribute("result","drop_shadow_2"),this.feOffset=s,t.appendChild(s);var i=createNS("feFlood");i.setAttribute("flood-color","#00ff00"),i.setAttribute("flood-opacity","1"),i.setAttribute("result","drop_shadow_3"),this.feFlood=i,t.appendChild(i);var a=createNS("feComposite");a.setAttribute("in","drop_shadow_3"),a.setAttribute("in2","drop_shadow_2"),a.setAttribute("operator","in"),a.setAttribute("result","drop_shadow_4"),t.appendChild(a);var n=createNS("feMerge");t.appendChild(n);var o;o=createNS("feMergeNode"),n.appendChild(o),o=createNS("feMergeNode"),o.setAttribute("in","SourceGraphic"),this.feMergeNode=o,this.feMerge=n,this.originalNodeAdded=!1,n.appendChild(o)}function _bh(t,e,r){this.initialized=!1,this.filterManager=e,this.filterElem=t,this.elem=r,r.matteElement=createNS("g"),r.matteElement.appendChild(r._bx),r.matteElement.appendChild(r._bz),r._by=r.matteElement}function _bi(t){var e,r=t.data.ef?t.data.ef.length:0,s=randomString(10),i=filtersFactory.createFilter(s),a=0;this.filters=[];var n;for(e=0;e<r;e+=1)20===t.data.ef[e].ty?(a+=1,n=new _bb(i,t.effects.effectElements[e]),this.filters.push(n)):21===t.data.ef[e].ty?(a+=1,n=new _bc(i,t.effects.effectElements[e]),this.filters.push(n)):22===t.data.ef[e].ty?(n=new _bd(t,t.effects.effectElements[e]),this.filters.push(n)):23===t.data.ef[e].ty?(a+=1,n=new _be(i,t.effects.effectElements[e]),this.filters.push(n)):24===t.data.ef[e].ty?(a+=1,n=new _bf(i,t.effects.effectElements[e]),this.filters.push(n)):25===t.data.ef[e].ty?(a+=1,n=new _bg(i,t.effects.effectElements[e]),this.filters.push(n)):28===t.data.ef[e].ty&&(n=new _bh(i,t.effects.effectElements[e],t),this.filters.push(n));a&&(t._x.defs.appendChild(i),t._bx.setAttribute("filter","url("+locationHref+"#"+s+")"))}function _n(){this.saved=[],this.cArrPos=0,this.cTr=new Matrix,this.cO=1;var t,e=15;for(this.savedOp=createTypedArray("float32",e),t=0;t<e;t+=1)this.saved[t]=createTypedArray("float32",16);this._length=e}function _c(t,e,r){}function _p(t,e,r){this.failed=!1,this.img=new Image,this.assetData=e.getAssetData(t.refId),this.initElement(t,e,r),this._x.addPendingElement()}function _m(t,e,r){this.completeLayers=!1,this.layers=t.layers,this.pendingElements=[],this._br=Array.apply(null,{length:this.layers.length}),this.initElement(t,e,r),this.tm=t.tm?_ai._bo(this,t.tm,0,e.frameRate,this.dynamicProperties):{_placeholder:!0}}function _q(t,e){this.data=t,this.element=e,this.dynamicProperties=[],this.masksProperties=this.data.masksProperties||[],this.viewData=Array.apply(null,{length:this.masksProperties.length});var r,s=this.masksProperties.length,i=!1;for(r=0;r<s;r++)"n"!==this.masksProperties[r].mode&&(i=!0),this.viewData[r]=_ah._bp(this.element,this.masksProperties[r],3,this.dynamicProperties,null);this.hasMasks=i}function _r(t,e,r){this.shapes=[],this.shapesData=t.shapes,this.stylesList=[],this.itemsData=[],this.prevViewData=[],this.shapeModifiers=[],this.processedElements=[],this.initElement(t,e,r)}function _s(t,e,r){this.initElement(t,e,r)}function _t(t,e,r){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.initElement(t,e,r)}function _o(){}function _b(t,e,r){}function _aa(t,e,r){this.initElement(t,e,r)}function _w(t,e,r){this.layers=t.layers,this.supports3d=!t.hasMask,this.completeLayers=!1,this.pendingElements=[],this._br=this.layers?Array.apply(null,{length:this.layers.length}):[],this.tm=t.tm?_ai._bo(this,t.tm,0,e.frameRate,this.dynamicProperties):{_placeholder:!0},this.initElement(t,e,r)}function _z(t,e,r){this.shapes=[],this.shapesData=t.shapes,this.stylesList=[],this.shapeModifiers=[],this.itemsData=[],this.processedElements=[],this.shapesContainer=createNS("g"),this.initElement(t,e,r),this.prevViewData=[],this._cg={x:999999,y:-999999,h:0,w:0}}function _ab(t,e,r){this.textSpans=[],this.textPaths=[],this._cg={x:999999,y:-999999,h:0,w:0},this.renderType="svg",this.isMasked=!1,this.initElement(t,e,r)}function _y(t,e,r){this.assetData=e.getAssetData(t.refId),this.initElement(t,e,r)}function _v(t,e,r){this.initFrame(),this.initBaseData(t,e,r);var s=_ai._bo;if(this.pe=s(this,t.pe,0,0,this.dynamicProperties),t.ks.p.s?(this.px=s(this,t.ks.p.x,1,0,this.dynamicProperties),this.py=s(this,t.ks.p.y,1,0,this.dynamicProperties),this.pz=s(this,t.ks.p.z,1,0,this.dynamicProperties)):this.p=s(this,t.ks.p,1,0,this.dynamicProperties),t.ks.a&&(this.a=s(this,t.ks.a,1,0,this.dynamicProperties)),t.ks.or.k.length&&t.ks.or.k[0].to){var i,a=t.ks.or.k.length;for(i=0;i<a;i+=1)t.ks.or.k[i].to=null,t.ks.or.k[i].ti=null}this.or=s(this,t.ks.or,1,degToRads,this.dynamicProperties),this.or.sh=!0,this.rx=s(this,t.ks.rx,0,degToRads,this.dynamicProperties),this.ry=s(this,t.ks.ry,0,degToRads,this.dynamicProperties),this.rz=s(this,t.ks.rz,0,degToRads,this.dynamicProperties),this.mat=new Matrix,this._prevMat=new Matrix,this.firstFrame=!0}function _bv(){}function SliderEffect(t,e,r){this.p=_ai._bo(e,t.v,0,0,r)}function AngleEffect(t,e,r){this.p=_ai._bo(e,t.v,0,0,r)}function ColorEffect(t,e,r){this.p=_ai._bo(e,t.v,1,0,r)}function PointEffect(t,e,r){this.p=_ai._bo(e,t.v,1,0,r)}function LayerIndexEffect(t,e,r){this.p=_ai._bo(e,t.v,0,0,r)}function MaskIndexEffect(t,e,r){this.p=_ai._bo(e,t.v,0,0,r)}function CheckboxEffect(t,e,r){this.p=_ai._bo(e,t.v,0,0,r)}function NoValueEffect(){this.p={}}function EffectsManager(t,e,r){var s=t.ef||[];this.effectElements=[];var i,a,n=s.length;for(i=0;i<n;i++)a=new GroupEffect(s[i],e,r),this.effectElements.push(a)}function GroupEffect(t,e,r){this.dynamicProperties=[],this.init(t,e,this.dynamicProperties),this.dynamicProperties.length&&r.push(this)}function setLocationHref(t){locationHref=t}function play(t){animationManager.play(t)}function pause(t){animationManager.pause(t)}function togglePause(t){animationManager.togglePause(t)}function setSpeed(t,e){animationManager.setSpeed(t,e)}function setDirection(t,e){animationManager.setDirection(t,e)}function stop(t){animationManager.stop(t)}function moveFrame(t){animationManager.moveFrame(t)}function searchAnimations(){standalone===!0?animationManager.searchAnimations(animationData,standalone,renderer):animationManager.searchAnimations()}function registerAnimation(t){return animationManager.registerAnimation(t)}function resize(){animationManager.resize()}function goToAndStop(t,e,r){animationManager.goToAndStop(t,e,r)}function setSubframeRendering(t){subframeEnabled=t}function loadAnimation(t){return standalone===!0&&(t.animationData=JSON.parse(animationData)),animationManager.loadAnimation(t)}function destroy(t){return animationManager.destroy(t)}function setQuality(t){if("string"==typeof t)switch(t){case"high":defaultCurveSegments=200;break;case"medium":defaultCurveSegments=50;break;case"low":defaultCurveSegments=10}else!isNaN(t)&&t>1&&(defaultCurveSegments=t);roundValues(!(defaultCurveSegments>=50))}function inBrowser(){return"undefined"!=typeof navigator}function installPlugin(t,e){"expressions"===t&&(expressionsPlugin=e)}function getFactory(t){switch(t){case"propertyFactory":return _ai;case"shape_ai":return _ah;case"matrix":return Matrix}}function checkReady(){"complete"===document.readyState&&(clearInterval(readyStateCheckInterval),searchAnimations())}function getQueryVariable(t){for(var e=queryString.split("&"),r=0;r<e.length;r++){var s=e[r].split("=");if(decodeURIComponent(s[0])==t)return decodeURIComponent(s[1])}}var svgNS="http://www.w3.org/2000/svg",locationHref="",initialDefaultFrame=-999999,subframeEnabled=!0,expressionsPlugin,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,blitter=10,BMMath={};!function(){var t,e=Object.getOwnPropertyNames(Math),r=e.length;for(t=0;t<r;t+=1)BMMath[e[t]]=Math[e[t]]}(),BMMath.random=Math.random,BMMath.abs=function(t){var e=typeof t;if("object"===e&&t.length){var r,s=Array.apply(null,{length:t.length}),i=t.length;for(r=0;r<i;r+=1)s[r]=Math.abs(t[r]);return s}return Math.abs(t)};var defaultCurveSegments=150,degToRads=Math.PI/180,roundCorner=.5519;roundValues(!1);var rgbToHex=function(){var t,e,r=[];for(t=0;t<256;t+=1)e=t.toString(16),r[t]=1==e.length?"0"+e:e;return function(t,e,s){return t<0&&(t=0),e<0&&(e=0),s<0&&(s=0),"#"+r[t]+r[e]+r[s]}}(),createTypedArray=function(){function t(t,e){var r,s=0,i=[];switch(t){case"int16":
-case"uint8c":r=1;break;default:r=1.1}for(s=0;s<e;s+=1)i.push(r);return i}function e(t,e){return"float32"===t?new Float32Array(e):"int16"===t?new Int16Array(e):"uint8c"===t?new Uint8ClampedArray(e):void 0}return"function"==typeof Uint8ClampedArray&&"function"==typeof Float32Array?e:t}(),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=k(t),r=M(t);return this._t(e,-r,0,0,r,e,0,0,0,0,1,0,0,0,0,1)}function r(t){if(0===t)return this;var e=k(t),r=M(t);return this._t(1,0,0,0,0,e,-r,0,0,r,e,0,0,0,0,1)}function s(t){if(0===t)return this;var e=k(t),r=M(t);return this._t(e,0,r,0,0,1,0,0,-r,0,e,0,0,0,0,1)}function i(t){if(0===t)return this;var e=k(t),r=M(t);return this._t(e,-r,0,0,r,e,0,0,0,0,1,0,0,0,0,1)}function a(t,e){return this._t(1,e,t,1,0,0)}function n(t,e){return this.shear(T(t),T(e))}function o(t,e){var r=k(e),s=M(e);return this._t(r,s,0,0,-s,r,0,0,0,0,1,0,0,0,0,1)._t(1,0,0,0,T(t),1,0,0,0,0,1,0,0,0,0,1)._t(r,-s,0,0,s,r,0,0,0,0,1,0,0,0,0,1)}function h(t,e,r){return r=isNaN(r)?1:r,1==t&&1==e&&1==r?this:this._t(t,0,0,0,0,e,0,0,0,0,r,0,0,0,0,1)}function l(t,e,r,s,i,a,n,o,h,l,p,m,f,c,d,u){return this.props[0]=t,this.props[1]=e,this.props[2]=r,this.props[3]=s,this.props[4]=i,this.props[5]=a,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]=c,this.props[14]=d,this.props[15]=u,this}function p(t,e,r){return r=r||0,0!==t||0!==e||0!==r?this._t(1,0,0,0,0,1,0,0,0,0,1,0,t,e,r,1):this}function m(t,e,r,s,i,a,n,o,h,l,p,m,f,c,d,u){if(1===t&&0===e&&0===r&&0===s&&0===i&&1===a&&0===n&&0===o&&0===h&&0===l&&1===p&&0===m)return this.props[12]=this.props[12]*t+this.props[15]*f,this.props[13]=this.props[13]*a+this.props[15]*c,this.props[14]=this.props[14]*p+this.props[15]*d,this.props[15]=this.props[15]*u,this._identityCalculated=!1,this;var y=this.props[0],g=this.props[1],v=this.props[2],b=this.props[3],E=this.props[4],P=this.props[5],x=this.props[6],S=this.props[7],C=this.props[8],A=this.props[9],k=this.props[10],M=this.props[11],T=this.props[12],D=this.props[13],w=this.props[14],F=this.props[15];return this.props[0]=y*t+g*i+v*h+b*f,this.props[1]=y*e+g*a+v*l+b*c,this.props[2]=y*r+g*n+v*p+b*d,this.props[3]=y*s+g*o+v*m+b*u,this.props[4]=E*t+P*i+x*h+S*f,this.props[5]=E*e+P*a+x*l+S*c,this.props[6]=E*r+P*n+x*p+S*d,this.props[7]=E*s+P*o+x*m+S*u,this.props[8]=C*t+A*i+k*h+M*f,this.props[9]=C*e+A*a+k*l+M*c,this.props[10]=C*r+A*n+k*p+M*d,this.props[11]=C*s+A*o+k*m+M*u,this.props[12]=T*t+D*i+w*h+F*f,this.props[13]=T*e+D*a+w*l+F*c,this.props[14]=T*r+D*n+w*p+F*d,this.props[15]=T*s+D*o+w*m+F*u,this._identityCalculated=!1,this}function f(){return this._identityCalculated||(this._identity=!(1!==this.props[0]||0!==this.props[1]||0!==this.props[2]||0!==this.props[3]||0!==this.props[4]||1!==this.props[5]||0!==this.props[6]||0!==this.props[7]||0!==this.props[8]||0!==this.props[9]||1!==this.props[10]||0!==this.props[11]||0!==this.props[12]||0!==this.props[13]||0!==this.props[14]||1!==this.props[15]),this._identityCalculated=!0),this._identity}function c(t){for(var e=0;e<16;){if(t.props[e]!==this.props[e])return!1;e+=1}return!0}function d(t){var e;for(e=0;e<16;e+=1)t.props[e]=this.props[e]}function u(t){var e;for(e=0;e<16;e+=1)this.props[e]=t[e]}function y(t,e,r){return{x:t*this.props[0]+e*this.props[4]+r*this.props[8]+this.props[12],y:t*this.props[1]+e*this.props[5]+r*this.props[9]+this.props[13],z:t*this.props[2]+e*this.props[6]+r*this.props[10]+this.props[14]}}function g(t,e,r){return t*this.props[0]+e*this.props[4]+r*this.props[8]+this.props[12]}function v(t,e,r){return t*this.props[1]+e*this.props[5]+r*this.props[9]+this.props[13]}function b(t,e,r){return t*this.props[2]+e*this.props[6]+r*this.props[10]+this.props[14]}function E(t){var e=this.props[0]*this.props[5]-this.props[1]*this.props[4],r=this.props[5]/e,s=-this.props[1]/e,i=-this.props[4]/e,a=this.props[0]/e,n=(this.props[4]*this.props[13]-this.props[5]*this.props[12])/e,o=-(this.props[0]*this.props[13]-this.props[1]*this.props[12])/e;return[t[0]*r+t[1]*i+n,t[0]*s+t[1]*a+o,0]}function P(t){var e,r=t.length,s=[];for(e=0;e<r;e+=1)s[e]=E(t[e]);return s}function x(t,e,r,s){if(s&&2===s){var i=point_pool.newElement();return i[0]=t*this.props[0]+e*this.props[4]+r*this.props[8]+this.props[12],i[1]=t*this.props[1]+e*this.props[5]+r*this.props[9]+this.props[13],i}return[t*this.props[0]+e*this.props[4]+r*this.props[8]+this.props[12],t*this.props[1]+e*this.props[5]+r*this.props[9]+this.props[13],t*this.props[2]+e*this.props[6]+r*this.props[10]+this.props[14]]}function S(t,e){return this.isIdentity()?t+","+e:t*this.props[0]+e*this.props[4]+this.props[12]+","+(t*this.props[1]+e*this.props[5]+this.props[13])}function C(){for(var t=0,e=this.props,r="matrix3d(",s=1e4;t<16;)r+=D(e[t]*s)/s,r+=15===t?")":",",t+=1;return r}function A(){var t=1e4,e=this.props;return"matrix("+D(e[0]*t)/t+","+D(e[1]*t)/t+","+D(e[4]*t)/t+","+D(e[5]*t)/t+","+D(e[12]*t)/t+","+D(e[13]*t)/t+")"}var k=Math.cos,M=Math.sin,T=Math.tan,D=Math.round;return function(){this.reset=t,this.rotate=e,this.rotateX=r,this.rotateY=s,this.rotateZ=i,this.skew=n,this.skewFromAxis=o,this.shear=a,this.scale=h,this.setTransform=l,this.translate=p,this.transform=m,this.applyToPoint=y,this.applyToX=g,this.applyToY=v,this.applyToZ=b,this.applyToPointArray=x,this.applyToPointStringified=S,this.toCSS=C,this.to2dCSS=A,this.clone=d,this.cloneFromProps=u,this.equals=c,this.inversePoints=P,this.inversePoint=E,this._t=this.transform,this.isIdentity=f,this._identity=!0,this._identityCalculated=!1,this.props=createTypedArray("float32",16),this.reset()}}();!function(t,e){function r(r,l,p){var c=[];l=1==l?{entropy:!0}:l||{};var v=n(a(l.entropy?[r,h(t)]:null==r?o():r,3),c),b=new s(c),E=function(){for(var t=b.g(f),e=u,r=0;t<y;)t=(t+r)*m,e*=m,r=b.g(1);for(;t>=g;)t/=2,e/=2,r>>>=1;return(t+r)/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,r,s,a){return a&&(a.S&&i(a,b),t.state=function(){return i(b,{})}),s?(e[d]=t,r):t})(E,v,"global"in l?l.global:this==e,l.state)}function s(t){var e,r=t.length,s=this,i=0,a=s.i=s.j=0,n=s.S=[];for(r||(t=[r++]);i<m;)n[i]=i++;for(i=0;i<m;i++)n[i]=n[a=v&a+t[i%r]+(e=n[i])],n[a]=e;(s.g=function(t){for(var e,r=0,i=s.i,a=s.j,n=s.S;t--;)e=n[i=v&i+1],r=r*m+n[v&(n[i]=n[a=v&a+e])+(n[a]=e)];return s.i=i,s.j=a,r})(m)}function i(t,e){return e.i=t.i,e.j=t.j,e.S=t.S.slice(),e}function a(t,e){var r,s=[],i=typeof t;if(e&&"object"==i)for(r in t)try{s.push(a(t[r],e-1))}catch(n){}return s.length?s:"string"==i?t:t+"\0"}function n(t,e){for(var r,s=t+"",i=0;i<s.length;)e[v&i]=v&(r^=19*e[v&i])+s.charCodeAt(i++);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(r){var s=p.navigator,i=s&&s.plugins;return[+new Date,p,i,p.screen,h(t)]}}function h(t){return String.fromCharCode.apply(0,t)}var l,p=this,m=256,f=6,c=52,d="random",u=e.pow(m,f),y=e.pow(2,c),g=2*y,v=m-1;e["seed"+d]=r,n(e.random(),t)}([],BMMath);var BezierFactory=function(){function t(t,e,r,s,i){var a=i||("bez_"+t+"_"+e+"_"+r+"_"+s).replace(/\./g,"p");if(p[a])return p[a];var n=new h([t,e,r,s]);return p[a]=n,n}function e(t,e){return 1-3*e+3*t}function r(t,e){return 3*e-6*t}function s(t){return 3*t}function i(t,i,a){return((e(i,a)*t+r(i,a))*t+s(i))*t}function a(t,i,a){return 3*e(i,a)*t*t+2*r(i,a)*t+s(i)}function n(t,e,r,s,a){var n,o,h=0;do o=e+(r-e)/2,n=i(o,s,a)-t,n>0?r=o:e=o;while(Math.abs(n)>c&&++h<d);return o}function o(t,e,r,s){for(var n=0;n<m;++n){var o=a(e,r,s);if(0===o)return e;var h=i(e,r,s)-t;e-=h/o}return e}function h(t){this._p=t,this._mSampleValues=g?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,c=1e-7,d=10,u=11,y=1/(u-1),g="function"==typeof Float32Array;return h.prototype={get:function(t){var e=this._p[0],r=this._p[1],s=this._p[2],a=this._p[3];return this._precomputed||this._precompute(),e===r&&s===a?t:0===t?0:1===t?1:i(this._getTForX(t),r,a)},_precompute:function(){var t=this._p[0],e=this._p[1],r=this._p[2],s=this._p[3];this._precomputed=!0,t===e&&r===s||this._calcSampleValues()},_calcSampleValues:function(){for(var t=this._p[0],e=this._p[2],r=0;r<u;++r)this._mSampleValues[r]=i(r*y,t,e)},_getTForX:function(t){for(var e=this._p[0],r=this._p[2],s=this._mSampleValues,i=0,h=1,l=u-1;h!==l&&s[h]<=t;++h)i+=y;--h;var p=(t-s[h])/(s[h+1]-s[h]),m=i+p*y,c=a(m,e,r);return c>=f?o(t,m,e,r):0===c?m:n(t,i,i+y,e,r)}},l}();!function(){for(var t=0,e=["ms","moz","webkit","o"],r=0;r<e.length&&!window.requestAnimationFrame;++r)window.requestAnimationFrame=window[e[r]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[e[r]+"CancelAnimationFrame"]||window[e[r]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(e,r){var s=(new Date).getTime(),i=Math.max(0,16-(s-t)),a=setTimeout(function(){e(s+i)},i);return t=s+i,a}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)})}();var bez=bezFunction(),dataManager=dataFunctionManager(),FontManager=function(){function t(t,e){var r=createTag("span");r.style.fontFamily=e;var s=createTag("span");s.innerHTML="giItT1WQy@!-/#",r.style.position="absolute",r.style.left="-10000px",r.style.top="-10000px",r.style.fontSize="300px",r.style.fontVariant="normal",r.style.fontStyle="normal",r.style.fontWeight="normal",r.style.letterSpacing="0",r.appendChild(s),document.body.appendChild(r);var i=s.offsetWidth;return s.style.fontFamily=t+", "+e,{node:s,w:i,parent:r}}function e(){var t,r,s,i=this.fonts.length,a=i;for(t=0;t<i;t+=1)if(this.fonts[t].loaded)a-=1;else if("t"===this.fonts[t].fOrigin||2===this.fonts[t].origin){if(window.Typekit&&window.Typekit.load&&0===this.typekitLoaded){this.typekitLoaded=1;try{window.Typekit.load({async:!0,active:function(){this.typekitLoaded=2}.bind(this)})}catch(n){}}2===this.typekitLoaded&&(this.fonts[t].loaded=!0)}else"n"===this.fonts[t].fOrigin||0===this.fonts[t].origin?this.fonts[t].loaded=!0:(r=this.fonts[t].monoCase.node,s=this.fonts[t].monoCase.w,r.offsetWidth!==s?(a-=1,this.fonts[t].loaded=!0):(r=this.fonts[t].sansCase.node,s=this.fonts[t].sansCase.w,r.offsetWidth!==s&&(a-=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!==a&&Date.now()-this.initTime<h?setTimeout(e.bind(this),20):setTimeout(function(){this.loaded=!0}.bind(this),0)}function r(t,e){var r=createNS("text");r.style.fontSize="100px",r.style.fontFamily=e.fFamily,r.textContent="1",e.fClass?(r.style.fontFamily="inherit",r.className=e.fClass):r.style.fontFamily=e.fFamily,t.appendChild(r);var s=createTag("canvas").getContext("2d");return s.font="100px "+e.fFamily,s}function s(s,i){if(!s)return void(this.loaded=!0);if(this.chars)return this.loaded=!0,void(this.fonts=s.list);var a,n=s.list,o=n.length;for(a=0;a<o;a+=1){if(n[a].loaded=!1,n[a].monoCase=t(n[a].fFamily,"monospace"),n[a].sansCase=t(n[a].fFamily,"sans-serif"),n[a].fPath){if("p"===n[a].fOrigin||3===n[a].origin){var h=createTag("style");h.type="text/css",h.innerHTML="@font-face {font-family: "+n[a].fFamily+"; font-style: normal; src: url('"+n[a].fPath+"');}",i.appendChild(h)}else if("g"===n[a].fOrigin||1===n[a].origin){var l=createTag("link");l.type="text/css",l.rel="stylesheet",l.href=n[a].fPath,i.appendChild(l)}else if("t"===n[a].fOrigin||2===n[a].origin){var p=createTag("script");p.setAttribute("src",n[a].fPath),i.appendChild(p)}}else n[a].loaded=!0;n[a].helper=r(i,n[a]),this.fonts.push(n[a])}e.bind(this)()}function i(t){if(t){this.chars||(this.chars=[]);var e,r,s,i=t.length,a=this.chars.length;for(e=0;e<i;e+=1){for(r=0,s=!1;r<a;)this.chars[r].style===t[e].style&&this.chars[r].fFamily===t[e].fFamily&&this.chars[r].ch===t[e].ch&&(s=!0),r+=1;s||(this.chars.push(t[e]),a+=1)}}}function a(t,e,r){for(var s=0,i=this.chars.length;s<i;){if(this.chars[s].ch===t&&this.chars[s].style===e&&this.chars[s].fFamily===r)return this.chars[s];s+=1}return console&&console.warn&&console.warn("Missing character from exported characters list: ",t,e,r),l}function n(t,e,r){var s=this.getFontByName(e),i=s.helper;return i.measureText(t).width*r/100}function o(t){for(var e=0,r=this.fonts.length;e<r;){if(this.fonts[e].fName===t)return this.fonts[e];e+=1}return"sans-serif"}var h=5e3,l={w:0,size:0,shapes:[]},p=function(){this.fonts=[],this.chars=null,this.typekitLoaded=0,this.loaded=!1,this.initTime=Date.now()};return p.prototype.addChars=i,p.prototype.addFonts=s,p.prototype.getCharData=a,p.prototype.getFontByName=o,p.prototype.measureText=n,p}(),_ai=function(){function t(t,e,r){var s,i=this.offsetTime;"multidimensional"===this.propType&&(s=createTypedArray("float32",e.length));for(var a,n,o=r.lastIndex,h=o,l=this.keyframes.length-1,p=!0;p;){if(a=this.keyframes[h],n=this.keyframes[h+1],h==l-1&&t>=n.t-i){a.h&&(a=n),o=0;break}if(n.t-i>t){o=h;break}h<l-1?h+=1:(o=0,p=!1)}var m,f,c,d,u,y;if(a.to){a.bezierData||bez.buildBezierData(a);var g=a.bezierData;if(t>=n.t-i||t<a.t-i){var v=t>=n.t-i?g.points.length-1:0;for(f=g.points[v].point.length,m=0;m<f;m+=1)s[m]=g.points[v].point[m];r._lastBezierData=null}else{a.__fnct?y=a.__fnct:(y=BezierFactory.getBezierEasing(a.o.x,a.o.y,a.i.x,a.i.y,a.n).get,a.__fnct=y),c=y((t-(a.t-i))/(n.t-i-(a.t-i)));var b,E=g.segmentLength*c,P=r.lastFrame<t&&r._lastBezierData===g?r._lastAddedLength:0;for(u=r.lastFrame<t&&r._lastBezierData===g?r._lastPoint:0,p=!0,d=g.points.length;p;){if(P+=g.points[u].partialLength,0===E||0===c||u==g.points.length-1){for(f=g.points[u].point.length,m=0;m<f;m+=1)s[m]=g.points[u].point[m];break}if(E>=P&&E<P+g.points[u+1].partialLength){for(b=(E-P)/g.points[u+1].partialLength,f=g.points[u].point.length,m=0;m<f;m+=1)s[m]=g.points[u].point[m]+(g.points[u+1].point[m]-g.points[u].point[m])*b;break}u<d-1?u+=1:p=!1}r._lastPoint=u,r._lastAddedLength=P-g.points[u].partialLength,r._lastBezierData=g}}else{var x,S,C,A,k;for(l=a.s.length,h=0;h<l;h+=1){if(1!==a.h&&(t>=n.t-i?c=1:t<a.t-i?c=0:(a.o.x.constructor===Array?(a.__fnct||(a.__fnct=[]),a.__fnct[h]?y=a.__fnct[h]:(x=a.o.x[h]||a.o.x[0],S=a.o.y[h]||a.o.y[0],C=a.i.x[h]||a.i.x[0],A=a.i.y[h]||a.i.y[0],y=BezierFactory.getBezierEasing(x,S,C,A).get,a.__fnct[h]=y)):a.__fnct?y=a.__fnct:(x=a.o.x,S=a.o.y,C=a.i.x,A=a.i.y,y=BezierFactory.getBezierEasing(x,S,C,A).get,a.__fnct=y),c=y((t-(a.t-i))/(n.t-i-(a.t-i))))),this.sh&&1!==a.h){var M=a.s[h],T=a.e[h];M-T<-180?M+=360:M-T>180&&(M-=360),k=M+(T-M)*c}else k=1===a.h?a.s[h]:a.s[h]+(a.e[h]-a.s[h])*c;1===l?s=k:s[h]=k}}return r.lastIndex=o,s}function e(t){for(var e=0;e<this.v.length;)this.pv[e]=t[e],this.v[e]=this.mult?this.pv[e]*this.mult:this.pv[e],this.lastPValue[e]!==this.pv[e]&&(this.mdf=!0,this.lastPValue[e]=this.pv[e]),e+=1}function r(t){this.pv=t,this.v=this.mult?this.pv*this.mult:this.pv,this.lastPValue!=this.pv&&(this.mdf=!0,this.lastPValue=this.pv)}function s(){if(this.elem._x.frameId!==this.frameId){this.mdf=!1;var t=this.comp.renderedFrame-this.offsetTime,e=this.keyframes[0].t-this.offsetTime,r=this.keyframes[this.keyframes.length-1].t-this.offsetTime;if(!(t===this._caching.lastFrame||this._caching.lastFrame!==p&&(this._caching.lastFrame>=r&&t>=r||this._caching.lastFrame<e&&t<e))){this._caching.lastIndex=this._caching.lastFrame<t?this._caching.lastIndex:0;var s=this.interpolateValue(t,this.pv,this._caching);this.calculateValueAtCurrentTime(s)}this._caching.lastFrame=t,this.frameId=this.elem._x.frameId}}function i(){}function a(t,e,r){this.propType="unidimensional",this.mult=r,this.v=r?e.k*r:e.k,this.pv=e.k,this.mdf=!1,this.comp=t.comp,this.k=!1,this.kf=!1,this.vel=0,this.getValue=i}function n(t,e,r){this.propType="multidimensional",this.mult=r,this.data=e,this.mdf=!1,this.comp=t.comp,this.k=!1,this.kf=!1,this.frameId=-1,this.v=createTypedArray("float32",e.k.length),this.pv=createTypedArray("float32",e.k.length),this.lastValue=createTypedArray("float32",e.k.length);createTypedArray("float32",e.k.length);this.vel=createTypedArray("float32",e.k.length);var s,a=e.k.length;for(s=0;s<a;s+=1)this.v[s]=r?e.k[s]*r:e.k[s],this.pv[s]=e.k[s];this.getValue=i}function o(e,i,a){this.propType="unidimensional",this.keyframes=i.k,this.offsetTime=e.data.st,this.lastValue=p,this.lastPValue=p,this.frameId=-1,this._caching={lastFrame:p,lastIndex:0,value:0},this.k=!0,this.kf=!0,this.data=i,this.mult=a,this.elem=e,this.firstFrame=!1,this.comp=e.comp,this.v=a?i.k[0].s[0]*a:i.k[0].s[0],this.pv=i.k[0].s[0],this.getValue=s,this.calculateValueAtCurrentTime=r,this.interpolateValue=t}function h(r,i,a){this.propType="multidimensional";var n,o,h,l,m,f=i.k.length;for(n=0;n<f-1;n+=1)i.k[n].to&&i.k[n].s&&i.k[n].e&&(o=i.k[n].s,h=i.k[n].e,l=i.k[n].to,m=i.k[n].ti,(2===o.length&&(o[0]!==h[0]||o[1]!==h[1])&&bez.pointOnLine2D(o[0],o[1],h[0],h[1],o[0]+l[0],o[1]+l[1])&&bez.pointOnLine2D(o[0],o[1],h[0],h[1],h[0]+m[0],h[1]+m[1])||3===o.length&&(o[0]!==h[0]||o[1]!==h[1]||o[2]!==h[2])&&bez.pointOnLine3D(o[0],o[1],o[2],h[0],h[1],h[2],o[0]+l[0],o[1]+l[1],o[2]+l[2])&&bez.pointOnLine3D(o[0],o[1],o[2],h[0],h[1],h[2],h[0]+m[0],h[1]+m[1],h[2]+m[2]))&&(i.k[n].to=null,i.k[n].ti=null),o[0]===h[0]&&o[1]===h[1]&&0===l[0]&&0===l[1]&&0===m[0]&&0===m[1]&&(2===o.length||o[2]===h[2]&&0===l[2]&&0===m[2])&&(i.k[n].to=null,i.k[n].ti=null));this.keyframes=i.k,this.offsetTime=r.data.st,this.k=!0,this.kf=!0,this.firstFrame=!0,this.mult=a,this.elem=r,this.comp=r.comp,this.getValue=s,this.calculateValueAtCurrentTime=e,this.interpolateValue=t,this.frameId=-1;var c=i.k[0].s.length;this.v=createTypedArray("float32",c),this.pv=createTypedArray("float32",c),this.lastValue=createTypedArray("float32",c),this.lastPValue=createTypedArray("float32",c),this._caching={lastFrame:p,lastIndex:0,value:createTypedArray("float32",c)}}function l(t,e,r,s,i){var l;if(0===e.a)l=0===r?new a(t,e,s):new n(t,e,s);else if(1===e.a)l=0===r?new o(t,e,s):new h(t,e,s);else if(e.k.length)if("number"==typeof e.k[0])l=new n(t,e,s);else switch(r){case 0:l=new o(t,e,s);break;case 1:l=new h(t,e,s)}else l=new a(t,e,s);return l.k&&i.push(l),l}var p=initialDefaultFrame,m={_bo:l};return m}(),_ag=function(){function t(t){var e,r=this.dynamicProperties.length;for(e=0;e<r;e+=1)this.dynamicProperties[e].getValue(),this.dynamicProperties[e].mdf&&(this.mdf=!0);this.a&&t.translate(-this.a.v[0],-this.a.v[1],this.a.v[2]),this.s&&t.scale(this.s.v[0],this.s.v[1],this.s.v[2]),this.r?t.rotate(-this.r.v):t.rotateZ(-this.rz.v).rotateY(this.ry.v).rotateX(this.rx.v).rotateZ(-this.or.v[2]).rotateY(this.or.v[1]).rotateX(this.or.v[0]),this.data.p.s?this.data.p.z?t.translate(this.px.v,this.py.v,-this.pz.v):t.translate(this.px.v,this.py.v,0):t.translate(this.p.v[0],this.p.v[1],-this.p.v[2])}function e(t){if(this.elem._x.frameId!==this.frameId){this.mdf=t;var e,r=this.dynamicProperties.length;for(e=0;e<r;e+=1)this.dynamicProperties[e].getValue(),this.dynamicProperties[e].mdf&&(this.mdf=!0);if(this.mdf){if(this.v.reset(),this.a&&this.v.translate(-this.a.v[0],-this.a.v[1],this.a.v[2]),this.s&&this.v.scale(this.s.v[0],this.s.v[1],this.s.v[2]),this.sk&&this.v.skewFromAxis(-this.sk.v,this.sa.v),this.r?this.v.rotate(-this.r.v):this.v.rotateZ(-this.rz.v).rotateY(this.ry.v).rotateX(this.rx.v).rotateZ(-this.or.v[2]).rotateY(this.or.v[1]).rotateX(this.or.v[0]),this.autoOriented&&this.p.keyframes&&this.p.getValueAtTime){var s,i;this.p._caching.lastFrame+this.p.offsetTime<=this.p.keyframes[0].t?(s=this.p.getValueAtTime((this.p.keyframes[0].t+.01)/this.elem._x.frameRate,0),i=this.p.getValueAtTime(this.p.keyframes[0].t/this.elem._x.frameRate,0)):this.p._caching.lastFrame+this.p.offsetTime>=this.p.keyframes[this.p.keyframes.length-1].t?(s=this.p.getValueAtTime(this.p.keyframes[this.p.keyframes.length-1].t/this.elem._x.frameRate,0),i=this.p.getValueAtTime((this.p.keyframes[this.p.keyframes.length-1].t-.01)/this.elem._x.frameRate,0)):(s=this.p.pv,i=this.p.getValueAtTime((this.p._caching.lastFrame+this.p.offsetTime-.01)/this.elem._x.frameRate,this.p.offsetTime)),this.v.rotate(-Math.atan2(s[1]-i[1],s[0]-i[0]))}this.data.p.s?this.data.p.z?this.v.translate(this.px.v,this.py.v,-this.pz.v):this.v.translate(this.px.v,this.py.v,0):this.v.translate(this.p.v[0],this.p.v[1],-this.p.v[2])}this.frameId=this.elem._x.frameId}}function r(){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]))}function s(){}function i(t,e,r){if(this.elem=t,this.frameId=-1,this.propType="transform",this.dynamicProperties=[],this.mdf=!1,this.data=e,this.v=new Matrix,e.p.s?(this.px=_ai._bo(t,e.p.x,0,0,this.dynamicProperties),this.py=_ai._bo(t,e.p.y,0,0,this.dynamicProperties),e.p.z&&(this.pz=_ai._bo(t,e.p.z,0,0,this.dynamicProperties))):this.p=_ai._bo(t,e.p,1,0,this.dynamicProperties),e.r)this.r=_ai._bo(t,e.r,0,degToRads,this.dynamicProperties);else if(e.rx){if(this.rx=_ai._bo(t,e.rx,0,degToRads,this.dynamicProperties),this.ry=_ai._bo(t,e.ry,0,degToRads,this.dynamicProperties),this.rz=_ai._bo(t,e.rz,0,degToRads,this.dynamicProperties),e.or.k[0].ti){var s,i=e.or.k.length;for(s=0;s<i;s+=1)e.or.k[s].to=e.or.k[s].ti=null}this.or=_ai._bo(t,e.or,1,degToRads,this.dynamicProperties),this.or.sh=!0}e.sk&&(this.sk=_ai._bo(t,e.sk,0,degToRads,this.dynamicProperties),this.sa=_ai._bo(t,e.sa,0,degToRads,this.dynamicProperties)),e.a&&(this.a=_ai._bo(t,e.a,1,0,this.dynamicProperties)),e.s&&(this.s=_ai._bo(t,e.s,1,.01,this.dynamicProperties)),e.o?this.o=_ai._bo(t,e.o,0,.01,r):this.o={mdf:!1,v:1},this.dynamicProperties.length?r.push(this):this.getValue(!0)}function a(t,e,r){return new i(t,e,r)}return i.prototype.applyToMatrix=t,i.prototype.getValue=e,i.prototype.setInverted=r,i.prototype.autoOrient=s,{_bj:a}}();_av.prototype.setPathData=function(t,e){this.c=t,this.setLength(e);for(var r=0;r<e;)this.v[r]=point_pool.newElement(),this.o[r]=point_pool.newElement(),this.i[r]=point_pool.newElement(),r+=1},_av.prototype.setLength=function(t){for(;this._maxLength<t;)this.doubleArrayLength();this._length=t},_av.prototype.doubleArrayLength=function(){this.v=this.v.concat(Array.apply(null,{length:this._maxLength})),this.i=this.i.concat(Array.apply(null,{length:this._maxLength})),this.o=this.o.concat(Array.apply(null,{length:this._maxLength})),this._maxLength*=2},_av.prototype._ax=function(t,e,r,s,i){var a;switch(this._length=Math.max(this._length,s+1),this._length>=this._maxLength&&this.doubleArrayLength(),r){case"v":a=this.v;break;case"i":a=this.i;break;case"o":a=this.o}(!a[s]||a[s]&&!i)&&(a[s]=point_pool.newElement()),a[s][0]=t,a[s][1]=e},_av.prototype._aw=function(t,e,r,s,i,a,n,o){this._ax(t,e,"v",n,o),this._ax(r,s,"o",n,o),this._ax(i,a,"i",n,o)},_av.prototype.reverse=function(){var t=new _av;t.setPathData(this.c,this._length);var e=this.v,r=this.o,s=this.i,a=0;this.c&&(t._aw(e[0][0],e[0][1],s[0][0],s[0][1],r[0][0],r[0][1],0,!1),a=1);var n=this._length-1,o=this._length;for(i=a;i<o;i+=1)t._aw(e[n][0],e[n][1],s[n][0],s[n][1],r[n][0],r[n][1],i,!1),n-=1;return t};var _ah=function(){function t(t,e,r,s){var i,a,n,o=s.lastIndex;if(t<this.keyframes[0].t-this.offsetTime)i=this.keyframes[0].s[0],n=!0,o=0;else if(t>=this.keyframes[this.keyframes.length-1].t-this.offsetTime)i=1===this.keyframes[this.keyframes.length-2].h?this.keyframes[this.keyframes.length-1].s[0]:this.keyframes[this.keyframes.length-2].e[0],n=!0;else{for(var h,l,p,m,f,c,d=o,u=this.keyframes.length-1,y=!0;y&&(h=this.keyframes[d],l=this.keyframes[d+1],!(l.t-this.offsetTime>t));)d<u-1?d+=1:y=!1;n=1===h.h,o=d;var g;if(!n){if(t>=l.t-this.offsetTime)g=1;else if(t<h.t-this.offsetTime)g=0;else{var v;h.__fnct?v=h.__fnct:(v=BezierFactory.getBezierEasing(h.o.x,h.o.y,h.i.x,h.i.y).get,h.__fnct=v),g=v((t-(h.t-this.offsetTime))/(l.t-this.offsetTime-(h.t-this.offsetTime)))}a=h.e[0]}i=h.s[0]}m=e._length,c=i.i[0].length;var b,E=!1;s.lastIndex=o;var p,f,b,m=e._length,c=i.i[0].length,E=!1;for(p=0;p<m;p+=1)for(f=0;f<c;f+=1)b=n?i.i[p][f]:i.i[p][f]+(a.i[p][f]-i.i[p][f])*g,e.i[p][f]!==b&&(e.i[p][f]=b,r&&(this.pv.i[p][f]=b),E=!0),b=n?i.o[p][f]:i.o[p][f]+(a.o[p][f]-i.o[p][f])*g,e.o[p][f]!==b&&(e.o[p][f]=b,r&&(this.pv.o[p][f]=b),E=!0),b=n?i.v[p][f]:i.v[p][f]+(a.v[p][f]-i.v[p][f])*g,e.v[p][f]!==b&&(e.v[p][f]=b,r&&(this.pv.v[p][f]=b),E=!0);return E}function e(){if(this.elem._x.frameId!==this.frameId){this.mdf=!1;var t=this.comp.renderedFrame-this.offsetTime,e=this.keyframes[0].t-this.offsetTime,r=this.keyframes[this.keyframes.length-1].t-this.offsetTime,s=this._caching.lastFrame;if(s===l||!(s<e&&t<e||s>r&&t>r)){this._caching.lastIndex=s<t?this._caching.lastIndex:0;var i=this.interpolateShape(t,this.v,!0,this._caching);this.mdf=i,i&&(this.paths=this._ak)}this._caching.lastFrame=t,this.frameId=this.elem._x.frameId}}function r(){return this.v}function s(){this.paths=this._ak,this.k||(this.mdf=!1)}function i(t,e,r){this.propType="shape",this.comp=t.comp,this.k=!1,this.mdf=!1;var i=3===r?e.pt.k:e.ks.k;this.v=shape_pool.clone(i),this.pv=shape_pool.clone(this.v),this._ak=shapeCollection_pool._al(),this.paths=this._ak,this.paths.addShape(this.v),this.reset=s}function a(t,e,r){this.propType="shape",this.comp=t.comp,this.elem=t,this.offsetTime=t.data.st,this.keyframes=3===r?e.pt.k:e.ks.k,this.k=!0,this.kf=!0;var i=this.keyframes[0].s[0].i.length;this.keyframes[0].s[0].i[0].length;this.v=shape_pool.newElement(),this.v.setPathData(this.keyframes[0].s[0].c,i),this.pv=shape_pool.clone(this.v),this._ak=shapeCollection_pool._al(),this.paths=this._ak,this.paths.addShape(this.v),this.lastFrame=l,this.reset=s,this._caching={lastFrame:l,lastIndex:0}}function n(t,e,r,s){var n;if(3===r||4===r){var o=3===r?e.pt:e.ks,h=o.k;n=1===o.a||h.length?new a(t,e,r):new i(t,e,r)}else 5===r?n=new f(t,e):6===r?n=new p(t,e):7===r&&(n=new m(t,e));return n.k&&s.push(n),n}function o(){return i}function h(){return a}var l=-999999;i.prototype.interpolateShape=t,i.prototype.getValue=r,a.prototype.getValue=e,a.prototype.interpolateShape=t;var p=function(){function t(){var t=this.p.v[0],e=this.p.v[1],s=this.s.v[0]/2,i=this.s.v[1]/2,a=3!==this.d,n=this.v;3!==this.d&&(n.v[0][0]=t,n.v[0][1]=e-i,n.v[1][0]=a?t+s:t-s,n.v[1][1]=e,n.v[2][0]=t,n.v[2][1]=e+i,n.v[3][0]=a?t-s:t+s,n.v[3][1]=e,n.i[0][0]=a?t-s*r:t+s*r,n.i[0][1]=e-i,n.i[1][0]=a?t+s:t-s,n.i[1][1]=e-i*r,n.i[2][0]=a?t+s*r:t-s*r,n.i[2][1]=e+i,n.i[3][0]=a?t-s:t+s,n.i[3][1]=e+i*r,n.o[0][0]=a?t+s*r:t-s*r,n.o[0][1]=e-i,n.o[1][0]=a?t+s:t-s,n.o[1][1]=e+i*r,n.o[2][0]=a?t-s*r:t+s*r,n.o[2][1]=e+i,n.o[3][0]=a?t-s:t+s,n.o[3][1]=e-i*r)}function e(t){var e,r=this.dynamicProperties.length;if(this.elem._x.frameId!==this.frameId){for(this.mdf=!1,this.frameId=this.elem._x.frameId,e=0;e<r;e+=1)this.dynamicProperties[e].getValue(t),this.dynamicProperties[e].mdf&&(this.mdf=!0);this.mdf&&this.convertEllToPath()}}var r=roundCorner;return function(r,i){this.v=shape_pool.newElement(),this.v.setPathData(!0,4),this._ak=shapeCollection_pool._al(),this.paths=this._ak,this._ak.addShape(this.v),this.d=i.d,this.dynamicProperties=[],this.elem=r,this.comp=r.comp,this.frameId=-1,this.mdf=!1,this.getValue=e,this.convertEllToPath=t,this.reset=s,this.p=_ai._bo(r,i.p,1,0,this.dynamicProperties),this.s=_ai._bo(r,i.s,1,0,this.dynamicProperties),this.dynamicProperties.length?this.k=!0:this.convertEllToPath()}}(),m=function(){function t(){var t,e=Math.floor(this.pt.v),r=2*Math.PI/e,s=this.or.v,i=this.os.v,a=2*Math.PI*s/(4*e),n=-Math.PI/2,o=3===this.data.d?-1:1;for(n+=this.r.v,this.v._length=0,t=0;t<e;t+=1){var h=s*Math.cos(n),l=s*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._aw(h,l,h-p*a*i*o,l-m*a*i*o,h+p*a*i*o,l+m*a*i*o,t,!0),n+=r*o}this.paths.length=0,this.paths[0]=this.v}function e(){var t,e,r,s,i=2*Math.floor(this.pt.v),a=2*Math.PI/i,n=!0,o=this.or.v,h=this.ir.v,l=this.os.v,p=this.is.v,m=2*Math.PI*o/(2*i),f=2*Math.PI*h/(2*i),c=-Math.PI/2;c+=this.r.v;var d=3===this.data.d?-1:1;for(this.v._length=0,t=0;t<i;t+=1){e=n?o:h,r=n?l:p,s=n?m:f;var u=e*Math.cos(c),y=e*Math.sin(c),g=0===u&&0===y?0:y/Math.sqrt(u*u+y*y),v=0===u&&0===y?0:-u/Math.sqrt(u*u+y*y);u+=+this.p.v[0],y+=+this.p.v[1],this.v._aw(u,y,u-g*s*r*d,y-v*s*r*d,u+g*s*r*d,y+v*s*r*d,t,!0),n=!n,c+=a*d}}function r(){if(this.elem._x.frameId!==this.frameId){this.mdf=!1,this.frameId=this.elem._x.frameId;var t,e=this.dynamicProperties.length;for(t=0;t<e;t+=1)this.dynamicProperties[t].getValue(),this.dynamicProperties[t].mdf&&(this.mdf=!0);this.mdf&&this.convertToPath()}}return function(i,a){this.v=shape_pool.newElement(),this.v.setPathData(!0,0),this.elem=i,this.comp=i.comp,this.data=a,this.frameId=-1,this.d=a.d,this.dynamicProperties=[],this.mdf=!1,this.getValue=r,this.reset=s,1===a.sy?(this.ir=_ai._bo(i,a.ir,0,0,this.dynamicProperties),this.is=_ai._bo(i,a.is,0,.01,this.dynamicProperties),this.convertToPath=e):this.convertToPath=t,this.pt=_ai._bo(i,a.pt,0,0,this.dynamicProperties),this.p=_ai._bo(i,a.p,1,0,this.dynamicProperties),this.r=_ai._bo(i,a.r,0,degToRads,this.dynamicProperties),this.or=_ai._bo(i,a.or,0,0,this.dynamicProperties),this.os=_ai._bo(i,a.os,0,.01,this.dynamicProperties),this._ak=shapeCollection_pool._al(),this._ak.addShape(this.v),this.paths=this._ak,this.dynamicProperties.length?this.k=!0:this.convertToPath()}}(),f=function(){function t(t){if(this.elem._x.frameId!==this.frameId){this.mdf=!1,this.frameId=this.elem._x.frameId;var e,r=this.dynamicProperties.length;for(e=0;e<r;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],r=this.s.v[0]/2,s=this.s.v[1]/2,i=bm_min(r,s,this.r.v),a=i*(1-roundCorner);this.v._length=0,2===this.d||1===this.d?(this.v._aw(t+r,e-s+i,t+r,e-s+i,t+r,e-s+a,0,!0),this.v._aw(t+r,e+s-i,t+r,e+s-a,t+r,e+s-i,1,!0),0!==i?(this.v._aw(t+r-i,e+s,t+r-i,e+s,t+r-a,e+s,2,!0),this.v._aw(t-r+i,e+s,t-r+a,e+s,t-r+i,e+s,3,!0),this.v._aw(t-r,e+s-i,t-r,e+s-i,t-r,e+s-a,4,!0),this.v._aw(t-r,e-s+i,t-r,e-s+a,t-r,e-s+i,5,!0),this.v._aw(t-r+i,e-s,t-r+i,e-s,t-r+a,e-s,6,!0),this.v._aw(t+r-i,e-s,t+r-a,e-s,t+r-i,e-s,7,!0)):(this.v._aw(t-r,e+s,t-r+a,e+s,t-r,e+s,2),this.v._aw(t-r,e-s,t-r,e-s+a,t-r,e-s,3))):(this.v._aw(t+r,e-s+i,t+r,e-s+a,t+r,e-s+i,0,!0),0!==i?(this.v._aw(t+r-i,e-s,t+r-i,e-s,t+r-a,e-s,1,!0),this.v._aw(t-r+i,e-s,t-r+a,e-s,t-r+i,e-s,2,!0),this.v._aw(t-r,e-s+i,t-r,e-s+i,t-r,e-s+a,3,!0),this.v._aw(t-r,e+s-i,t-r,e+s-a,t-r,e+s-i,4,!0),this.v._aw(t-r+i,e+s,t-r+i,e+s,t-r+a,e+s,5,!0),
-this.v._aw(t+r-i,e+s,t+r-a,e+s,t+r-i,e+s,6,!0),this.v._aw(t+r,e+s-i,t+r,e+s-i,t+r,e+s-a,7,!0)):(this.v._aw(t-r,e-s,t-r+a,e-s,t-r,e-s,1,!0),this.v._aw(t-r,e+s,t-r,e+s-a,t-r,e+s,2,!0),this.v._aw(t+r,e+s,t+r-a,e+s,t+r,e+s,3,!0)))}return function(r,i){this.v=shape_pool.newElement(),this.v.c=!0,this._ak=shapeCollection_pool._al(),this._ak.addShape(this.v),this.paths=this._ak,this.elem=r,this.comp=r.comp,this.frameId=-1,this.d=i.d,this.dynamicProperties=[],this.mdf=!1,this.getValue=t,this.convertRectToPath=e,this.reset=s,this.p=_ai._bo(r,i.p,1,0,this.dynamicProperties),this.s=_ai._bo(r,i.s,1,0,this.dynamicProperties),this.r=_ai._bo(r,i.r,0,0,this.dynamicProperties),this.dynamicProperties.length?this.k=!0:this.convertRectToPath()}}(),c={};return c._bp=n,c.getConstructorFunction=o,c.getKeyframedConstructorFunction=h,c}(),_as=function(){function t(t,e){s[t]||(s[t]=e)}function e(t,e,r,i){return new s[t](e,r,i)}var r={},s={};return r.registerModifier=t,r.getModifier=e,r}();_at.prototype.initModifierProperties=function(){},_at.prototype.addShapeToModifier=function(){},_at.prototype.addShape=function(t){if(!this.closed){var e={shape:t.sh,data:t,_ak:shapeCollection_pool._al()};this.shapes.push(e),this.addShapeToModifier(e)}},_at.prototype.init=function(t,e,r){this.dynamicProperties=[],this.shapes=[],this.elem=t,this.initModifierProperties(t,e),this.frameId=initialDefaultFrame,this.mdf=!1,this.closed=!1,this.k=!1,this.dynamicProperties.length?(this.k=!0,r.push(this)):this.getValue(!0)},extendPrototype([_at],_an),_an.prototype.processKeys=function(t){if(this.elem._x.frameId!==this.frameId||t){this.mdf=t,this.frameId=this.elem._x.frameId;var e,r=this.dynamicProperties.length;for(e=0;e<r;e+=1)this.dynamicProperties[e].getValue(),this.dynamicProperties[e].mdf&&(this.mdf=!0);if(this.mdf||t){var s=this.o.v%360/360;s<0&&(s+=1);var i=this.s.v+s,a=this.e.v+s;if(i>a){var n=i;i=a,a=n}this.sValue=i,this.eValue=a,this.oValue=s}}},_an.prototype.initModifierProperties=function(t,e){this.s=_ai._bo(t,e.s,0,.01,this.dynamicProperties),this.e=_ai._bo(t,e.e,0,.01,this.dynamicProperties),this.o=_ai._bo(t,e.o,0,0,this.dynamicProperties),this.sValue=0,this.eValue=0,this.oValue=0,this.getValue=this.processKeys,this.m=e.m},_an.prototype.addShapeToModifier=function(t){t.pathsData=[]},_an.prototype.calculateShapeEdges=function(t,e,r,s,i){var a=[];e<=1?a.push({s:t,e:e}):t>=1?a.push({s:t-1,e:e-1}):(a.push({s:t,e:1}),a.push({s:0,e:e-1}));var n,o,h=[],l=a.length;for(n=0;n<l;n+=1)if(o=a[n],o.e*i<s||o.s*i>s+r);else{var p,m;p=o.s*i<=s?0:(o.s*i-s)/r,m=o.e*i>=s+r?1:(o.e*i-s)/r,h.push([p,m])}return h.length||h.push([0,0]),h},_an.prototype.releasePathsData=function(t){var e,r=t.length;for(e=0;e<r;e+=1)segments_length_pool.release(t[e]);return t.length=0,t},_an.prototype.processShapes=function(t){var e,r,s,i,a,n,o,h=this.shapes.length,l=this.sValue,p=this.eValue,m=0;if(p===l)for(r=0;r<h;r+=1)this.shapes[r]._ak.releaseShapes(),this.shapes[r].shape.mdf=!0,this.shapes[r].shape.paths=this.shapes[r]._ak;else if(1===p&&0===l||0===p&&1===l){if(this.mdf)for(r=0;r<h;r+=1)this.shapes[r].shape.mdf=!0}else{var f,c,d=[];for(r=0;r<h;r+=1)if(f=this.shapes[r],f.shape.mdf||this.mdf||t||2===this.m){if(e=f.shape.paths,i=e._length,o=0,!f.shape.mdf&&f.pathsData.length)o=f.totalShapeLength;else{for(a=this.releasePathsData(f.pathsData),s=0;s<i;s+=1)n=bez.getSegmentsLength(e.shapes[s]),a.push(n),o+=n.totalLength;f.totalShapeLength=o,f.pathsData=a}m+=o,f.shape.mdf=!0}else f.shape.paths=f._ak;var s,i,u=l,y=p,g=0;for(r=h-1;r>=0;r-=1)if(f=this.shapes[r],f.shape.mdf){if(c=f._ak,c.releaseShapes(),2===this.m&&h>1){var v=this.calculateShapeEdges(l,p,f.totalShapeLength,g,m);g+=f.totalShapeLength}else v=[[u,y]];for(i=v.length,s=0;s<i;s+=1){u=v[s][0],y=v[s][1],d.length=0,y<=1?d.push({s:f.totalShapeLength*u,e:f.totalShapeLength*y}):u>=1?d.push({s:f.totalShapeLength*(u-1),e:f.totalShapeLength*(y-1)}):(d.push({s:f.totalShapeLength*u,e:f.totalShapeLength}),d.push({s:0,e:f.totalShapeLength*(y-1)}));var b=this.addShapes(f,d[0]);if(d[0].s!==d[0].e){if(d.length>1)if(f.shape.v.c){var E=b.pop();this.addPaths(b,c),b=this.addShapes(f,d[1],E)}else this.addPaths(b,c),b=this.addShapes(f,d[1]);this.addPaths(b,c)}}f.shape.paths=c}}this.dynamicProperties.length||(this.mdf=!1)},_an.prototype.addPaths=function(t,e){var r,s=t.length;for(r=0;r<s;r+=1)e.addShape(t[r])},_an.prototype.addSegment=function(t,e,r,s,i,a,n){i._ax(e[0],e[1],"o",a),i._ax(r[0],r[1],"i",a+1),n&&i._ax(t[0],t[1],"v",a),i._ax(s[0],s[1],"v",a+1)},_an.prototype.addSegmentFromArray=function(t,e,r,s){e._ax(t[1],t[5],"o",r),e._ax(t[2],t[6],"i",r+1),s&&e._ax(t[0],t[4],"v",r),e._ax(t[3],t[7],"v",r+1)},_an.prototype.addShapes=function(t,e,r){var s,i,a,n,o,h,l,p,m=t.pathsData,f=t.shape.paths.shapes,c=t.shape.paths._length,d=0,u=[],y=!0;for(r?(o=r._length,p=r._length):(r=shape_pool.newElement(),o=0,p=0),u.push(r),s=0;s<c;s+=1){for(h=m[s].lengths,r.c=f[s].c,a=f[s].c?h.length:h.length+1,i=1;i<a;i+=1)if(n=h[i-1],d+n.addedLength<e.s)d+=n.addedLength,r.c=!1;else{if(d>e.e){r.c=!1;break}e.s<=d&&e.e>=d+n.addedLength?(this.addSegment(f[s].v[i-1],f[s].o[i-1],f[s].i[i],f[s].v[i],r,o,y),y=!1):(l=bez.getNewSegment(f[s].v[i-1],f[s].v[i],f[s].o[i-1],f[s].i[i],(e.s-d)/n.addedLength,(e.e-d)/n.addedLength,h[i-1]),this.addSegmentFromArray(l,r,o,y),y=!1,r.c=!1),d+=n.addedLength,o+=1}if(f[s].c){if(n=h[i-1],d<=e.e){var g=h[i-1].addedLength;e.s<=d&&e.e>=d+g?(this.addSegment(f[s].v[i-1],f[s].o[i-1],f[s].i[0],f[s].v[0],r,o,y),y=!1):(l=bez.getNewSegment(f[s].v[i-1],f[s].v[0],f[s].o[i-1],f[s].i[0],(e.s-d)/g,(e.e-d)/g,h[i-1]),this.addSegmentFromArray(l,r,o,y),y=!1,r.c=!1)}else r.c=!1;d+=n.addedLength,o+=1}if(r._length&&(r._ax(r.v[p][0],r.v[p][1],"i",p),r._ax(r.v[r._length-1][0],r.v[r._length-1][1],"o",r._length-1)),d>e.e)break;s<c-1&&(r=shape_pool.newElement(),y=!0,u.push(r),o=0)}return u},_as.registerModifier("tm",_an),extendPrototype([_at],_au),_au.prototype.processKeys=function(t){if(this.elem._x.frameId!==this.frameId||t){this.mdf=!!t,this.frameId=this.elem._x.frameId;var e,r=this.dynamicProperties.length;for(e=0;e<r;e+=1)this.dynamicProperties[e].getValue(),this.dynamicProperties[e].mdf&&(this.mdf=!0)}},_au.prototype.initModifierProperties=function(t,e){this.getValue=this.processKeys,this.rd=_ai._bo(t,e.r,0,null,this.dynamicProperties)},_au.prototype.processPath=function(t,e){var r=shape_pool.newElement();r.c=t.c;var s,i,a,n,o,h,l,p,m,f,c,d,u,y=t._length,g=0;for(s=0;s<y;s+=1)i=t.v[s],n=t.o[s],a=t.i[s],i[0]===n[0]&&i[1]===n[1]&&i[0]===a[0]&&i[1]===a[1]?0!==s&&s!==y-1||t.c?(o=0===s?t.v[y-1]:t.v[s-1],h=Math.sqrt(Math.pow(i[0]-o[0],2)+Math.pow(i[1]-o[1],2)),l=h?Math.min(h/2,e)/h:0,p=d=i[0]+(o[0]-i[0])*l,m=u=i[1]-(i[1]-o[1])*l,f=p-(p-i[0])*roundCorner,c=m-(m-i[1])*roundCorner,r._aw(p,m,f,c,d,u,g),g+=1,o=s===y-1?t.v[0]:t.v[s+1],h=Math.sqrt(Math.pow(i[0]-o[0],2)+Math.pow(i[1]-o[1],2)),l=h?Math.min(h/2,e)/h:0,p=f=i[0]+(o[0]-i[0])*l,m=c=i[1]+(o[1]-i[1])*l,d=p-(p-i[0])*roundCorner,u=m-(m-i[1])*roundCorner,r._aw(p,m,f,c,d,u,g),g+=1):(r._aw(i[0],i[1],n[0],n[1],a[0],a[1],g),g+=1):(r._aw(t.v[s][0],t.v[s][1],t.o[s][0],t.o[s][1],t.i[s][0],t.i[s][1],g),g+=1);return r},_au.prototype.processShapes=function(t){var e,r,s,i,a=this.shapes.length,n=this.rd.v;if(0!==n){var o,h,l;for(r=0;r<a;r+=1){if(o=this.shapes[r],h=o.shape.paths,l=o._ak,o.shape.mdf||this.mdf||t)for(l.releaseShapes(),o.shape.mdf=!0,e=o.shape.paths.shapes,i=o.shape.paths._length,s=0;s<i;s+=1)l.addShape(this.processPath(e[s],n));o.shape.paths=o._ak}}this.dynamicProperties.length||(this.mdf=!1)},_as.registerModifier("rd",_au),_aj.prototype.processKeys=function(t){if(this.elem._x.frameId!==this.frameId||t){this.mdf=!!t;var e,r=this.dynamicProperties.length;for(e=0;e<r;e+=1)this.dynamicProperties[e].getValue(),this.dynamicProperties[e].mdf&&(this.mdf=!0)}},_aj.prototype.initModifierProperties=function(t,e){this.getValue=this.processKeys,this.c=_ai._bo(t,e.c,0,null,this.dynamicProperties),this.o=_ai._bo(t,e.o,0,null,this.dynamicProperties),this.tr=_ag._bj(t,e.tr,this.dynamicProperties),this.data=e,this.dynamicProperties.length||this.getValue(!0),this.pMatrix=new Matrix,this.rMatrix=new Matrix,this.sMatrix=new Matrix,this.tMatrix=new Matrix,this.matrix=new Matrix},_aj.prototype.applyTransforms=function(t,e,r,s,i,a){var n=a?-1:1,o=s.s.v[0]+(1-s.s.v[0])*(1-i),h=s.s.v[1]+(1-s.s.v[1])*(1-i);t.translate(s.p.v[0]*n*i,s.p.v[1]*n*i,s.p.v[2]),e.translate(-s.a.v[0],-s.a.v[1],s.a.v[2]),e.rotate(-s.r.v*n*i),e.translate(s.a.v[0],s.a.v[1],s.a.v[2]),r.translate(-s.a.v[0],-s.a.v[1],s.a.v[2]),r.scale(a?1/o:o,a?1/h:h),r.translate(s.a.v[0],s.a.v[1],s.a.v[2])},_aj.prototype.init=function(t,e,r,s,i){this.elem=t,this.arr=e,this.pos=r,this.elemsData=s,this._currentCopies=0,this._bq=[],this._groups=[],this.dynamicProperties=[],this.frameId=-1,this.initModifierProperties(t,e[r]);for(var a=0;r>0;)r-=1,this._bq.unshift(e[r]),a+=1;this.dynamicProperties.length?(this.k=!0,i.push(this)):this.getValue(!0)},_aj.prototype.resetElements=function(t){var e,r=t.length;for(e=0;e<r;e+=1)t[e]._processed=!1,"gr"===t[e].ty&&this.resetElements(t[e].it)},_aj.prototype.cloneElements=function(t){var e=(t.length,JSON.parse(JSON.stringify(t)));return this.resetElements(e),e},_aj.prototype.changeGroupRender=function(t,e){var r,s=t.length;for(r=0;r<s;r+=1)t[r]._render=e,"gr"===t[r].ty&&this.changeGroupRender(t[r].it,e)},_aj.prototype.processShapes=function(t){if(this.elem._x.frameId!==this.frameId&&(this.frameId=this.elem._x.frameId,this.dynamicProperties.length||t||(this.mdf=!1),this.mdf)){var e=Math.ceil(this.c.v);if(this._groups.length<e){for(;this._groups.length<e;){var r={it:this.cloneElements(this._bq),ty:"gr"};r.it.push({a:{a:0,ix:1,k:[0,0]},nm:"Transform",o:{a:0,ix:7,k:100},p:{a:0,ix:2,k:[0,0]},r:{a:0,ix:6,k:0},s:{a:0,ix:3,k:[100,100]},sa:{a:0,ix:5,k:0},sk:{a:0,ix:4,k:0},ty:"tr"}),this.arr.splice(0,0,r),this._groups.splice(0,0,r),this._currentCopies+=1}this.elem.reloadShapes()}var s,i,a=0;for(s=0;s<=this._groups.length-1;s+=1)i=a<e,this._groups[s]._render=i,this.changeGroupRender(this._groups[s].it,i),a+=1;this._currentCopies=e,this.elem.firstFrame=!0;var n=this.o.v,o=n%1,h=n>0?Math.floor(n):Math.ceil(n),l=(this.tr.v.props,this.pMatrix.props),p=this.rMatrix.props,m=this.sMatrix.props;this.pMatrix.reset(),this.rMatrix.reset(),this.sMatrix.reset(),this.tMatrix.reset(),this.matrix.reset();var f=0;if(n>0){for(;f<h;)this.applyTransforms(this.pMatrix,this.rMatrix,this.sMatrix,this.tr,1,!1),f+=1;o&&(this.applyTransforms(this.pMatrix,this.rMatrix,this.sMatrix,this.tr,o,!1),f+=o)}else if(n<0){for(;f>h;)this.applyTransforms(this.pMatrix,this.rMatrix,this.sMatrix,this.tr,1,!0),f-=1;o&&(this.applyTransforms(this.pMatrix,this.rMatrix,this.sMatrix,this.tr,-o,!0),f-=o)}s=1===this.data.m?0:this._currentCopies-1;var c=1===this.data.m?1:-1;for(a=this._currentCopies;a;){if(0!==f){(0!==s&&1===c||s!==this._currentCopies-1&&c===-1)&&this.applyTransforms(this.pMatrix,this.rMatrix,this.sMatrix,this.tr,1,!1),this.matrix.transform(p[0],p[1],p[2],p[3],p[4],p[5],p[6],p[7],p[8],p[9],p[10],p[11],p[12],p[13],p[14],p[15]),this.matrix.transform(m[0],m[1],m[2],m[3],m[4],m[5],m[6],m[7],m[8],m[9],m[10],m[11],m[12],m[13],m[14],m[15]),this.matrix.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]);var d,u=this.elemsData[s].it,y=u[u.length-1].transform.mProps.v.props,g=y.length;for(d=0;d<g;d+=1)y[d]=this.matrix.props[d];this.matrix.reset()}else{this.matrix.reset();var d,u=this.elemsData[s].it,y=u[u.length-1].transform.mProps.v.props,g=y.length;for(d=0;d<g;d+=1)y[d]=this.matrix.props[d]}f+=1,a-=1,s+=c}}},_aj.prototype.addShape=function(){},_as.registerModifier("rp",_aj),_am.prototype.addShape=function(t){this._length===this._maxLength&&(this.shapes=this.shapes.concat(Array.apply(null,{length:this._maxLength})),this._maxLength*=2),this.shapes[this._length]=t,this._length+=1},_am.prototype.releaseShapes=function(){var t;for(t=0;t<this._length;t+=1)shape_pool.release(this.shapes[t]);this._length=0},DashProperty.prototype.getValue=function(t){if(this.elem._x.frameId!==this.frameId||t){var e=0,r=this.dataProps.length;for(this.mdf=!1,this.frameId=this.elem._x.frameId;e<r;){if(this.dataProps[e].p.mdf){this.mdf=!t;break}e+=1}if(this.mdf||t)for("svg"===this.renderer&&(this.dashStr=""),e=0;e<r;e+=1)"o"!=this.dataProps[e].n?"svg"===this.renderer?this.dashStr+=" "+this.dataProps[e].p.v:this.dashArray[e]=this.dataProps[e].p.v:this.dashoffset[0]=this.dataProps[e].p.v}},GradientProperty.prototype.comparePoints=function(t,e){for(var r,s=0,i=this.o.length/2;s<i;){if(r=Math.abs(t[4*s]-t[4*e+2*s]),r>.01)return!1;s+=1}return!0},GradientProperty.prototype.checkCollapsable=function(){if(this.o.length/2!==this.c.length/4)return!1;if(this.data.k.k[0].s)for(var t=0,e=this.data.k.k.length;t<e;){if(!this.comparePoints(this.data.k.k[t].s,this.data.p))return!1;t+=1}else if(!this.comparePoints(this.data.k.k,this.data.p))return!1;return!0},GradientProperty.prototype.getValue=function(t){if(this.prop.getValue(),this.cmdf=!1,this.omdf=!1,this.prop.mdf||t){var e,r,s,i=4*this.data.p;for(e=0;e<i;e+=1)r=e%4===0?100:255,s=Math.round(this.prop.v[e]*r),this.c[e]!==s&&(this.c[e]=s,this.cmdf=!t);if(this.o.length)for(i=this.prop.v.length,e=4*this.data.p;e<i;e+=1)r=e%2===0?100:1,s=e%2===0?Math.round(100*this.prop.v[e]):this.prop.v[e],this.o[e-4*this.data.p]!==s&&(this.o[e-4*this.data.p]=s,this.omdf=!t)}};var ImagePreloader=function(){function t(){this.loadedAssets+=1,this.loadedAssets===this.totalImages&&this.imagesLoadedCb&&this.imagesLoadedCb(null)}function e(t){var e="";if(this.assetsPath){var r=t.p;r.indexOf("images/")!==-1&&(r=r.split("/")[1]),e=this.assetsPath+r}else e=this.path,e+=t.u?t.u:"",e+=t.p;return e}function r(e){var r=createTag("img");r.addEventListener("load",t.bind(this),!1),r.addEventListener("error",t.bind(this),!1),r.src=e}function s(t,s){this.imagesLoadedCb=s,this.totalAssets=t.length;var i;for(i=0;i<this.totalAssets;i+=1)t[i].layers||(r.bind(this)(e.bind(this)(t[i])),this.totalImages+=1)}function i(t){this.path=t||""}function a(t){this.assetsPath=t||""}function n(){this.imagesLoadedCb=null}return function(){this.loadAssets=s,this.setAssetsPath=a,this.setPath=i,this.destroy=n,this.assetsPath="",this.path="",this.totalAssets=0,this.totalImages=0,this.loadedAssets=0,this.imagesLoadedCb=null}}(),featureSupport=function(){var t={maskType:!0};return(/MSIE 10/i.test(navigator.userAgent)||/MSIE 9/i.test(navigator.userAgent)||/rv:11.0/i.test(navigator.userAgent)||/Edge\/\d./i.test(navigator.userAgent))&&(t.maskType=!1),t}(),filtersFactory=function(){function t(t){var e=createNS("filter");return e.setAttribute("id",t),e.setAttribute("filterUnits","objectBoundingBox"),e.setAttribute("x","0%"),e.setAttribute("y","0%"),e.setAttribute("width","100%"),e.setAttribute("height","100%"),e}function e(){var t=createNS("feColorMatrix");return t.setAttribute("type","matrix"),t.setAttribute("color-interpolation-filters","sRGB"),t.setAttribute("values","0 0 0 1 0  0 0 0 1 0  0 0 0 1 0  0 0 0 1 1"),t}var r={};return r.createFilter=t,r.createAlphaToLuminanceFilter=e,r}();_bl.prototype.searchProperties=function(t){var e,r,s=this._textData.a.length,i=_ai._bo;for(e=0;e<s;e+=1)r=this._textData.a[e],this._animatorsData[e]=new TextAnimatorDataProperty(this._elem,r,this._dynamicProperties);this._textData.p&&"m"in this._textData.p?(this._pathData={f:i(this._elem,this._textData.p.f,0,0,this._dynamicProperties),l:i(this._elem,this._textData.p.l,0,0,this._dynamicProperties),r:this._textData.p.r,m:this._elem.maskManager.getMaskProperty(this._textData.p.m)},this._hasMaskedPath=!0):this._hasMaskedPath=!1,this._moreOptions.alignment=i(this._elem,this._textData.m.a,1,0,this._dynamicProperties),this._dynamicProperties.length&&t.push(this)},_bl.prototype.getMeasures=function(t,e){if(this.lettersChangedFlag=e,this.mdf||this._firstFrame||e||this._hasMaskedPath&&this._pathData.m.mdf){this._firstFrame=!1;var r,s,i,a,n=this._moreOptions.alignment.v,o=this._animatorsData,h=this._textData,l=this.mHelper,p=this._renderType,m=this._bt.length,f=(this.data,t.l);if(this._hasMaskedPath){var c=this._pathData.m;if(!this._pathData.n||this._pathData.mdf){var d=c.v;this._pathData.r&&(d=d.reverse());var u={tLength:0,segments:[]};a=d._length-1;var y,g=0;for(i=0;i<a;i+=1)y={s:d.v[i],e:d.v[i+1],to:[d.o[i][0]-d.v[i][0],d.o[i][1]-d.v[i][1]],ti:[d.i[i+1][0]-d.v[i+1][0],d.i[i+1][1]-d.v[i+1][1]]},bez.buildBezierData(y),u.tLength+=y.bezierData.segmentLength,u.segments.push(y),g+=y.bezierData.segmentLength;i=a,c.v.c&&(y={s:d.v[i],e:d.v[0],to:[d.o[i][0]-d.v[i][0],d.o[i][1]-d.v[i][1]],ti:[d.i[0][0]-d.v[0][0],d.i[0][1]-d.v[0][1]]},bez.buildBezierData(y),u.tLength+=y.bezierData.segmentLength,u.segments.push(y),g+=y.bezierData.segmentLength),this._pathData.pi=u}var v,b,E,u=this._pathData.pi,P=this._pathData.f.v,x=0,S=1,C=0,A=!0,k=u.segments;if(P<0&&c.v.c)for(u.tLength<Math.abs(P)&&(P=-Math.abs(P)%u.tLength),x=k.length-1,E=k[x].bezierData.points,S=E.length-1;P<0;)P+=E[S].partialLength,S-=1,S<0&&(x-=1,E=k[x].bezierData.points,S=E.length-1);E=k[x].bezierData.points,b=E[S-1],v=E[S];var M,T,D=v.partialLength}a=f.length,r=0,s=0;var w,F,_,I,V,R=1.2*t.s*.714,B=!0;I=o.length;var L,G,N,O,z,H,j,W,q,Y,X,K,J,Z=-1,U=P,Q=x,$=S,tt=-1,et=0,rt="",st=this.defaultPropsArray;for(i=0;i<a;i+=1){if(l.reset(),z=1,f[i].n)r=0,s+=t.yOffset,s+=B?1:0,P=U,B=!1,et=0,this._hasMaskedPath&&(x=Q,S=$,E=k[x].bezierData.points,b=E[S-1],v=E[S],D=v.partialLength,C=0),J=Y=K=rt="",st=this.defaultPropsArray;else{if(this._hasMaskedPath){if(tt!==f[i].line){switch(t.j){case 1:P+=g-t.lineWidths[f[i].line];break;case 2:P+=(g-t.lineWidths[f[i].line])/2}tt=f[i].line}Z!==f[i].ind&&(f[Z]&&(P+=f[Z].extra),P+=f[i].an/2,Z=f[i].ind),P+=n[0]*f[i].an/200;var it=0;for(_=0;_<I;_+=1)w=o[_].a,w.p.propType&&(F=o[_].s,L=F.getMult(f[i].anIndexes[_],h.a[_].s.totalChars),it+=L.length?w.p.v[0]*L[0]:w.p.v[0]*L),w.a.propType&&(F=o[_].s,L=F.getMult(f[i].anIndexes[_],h.a[_].s.totalChars),it+=L.length?w.a.v[0]*L[0]:w.a.v[0]*L);for(A=!0;A;)C+D>=P+it||!E?(M=(P+it-C)/v.partialLength,N=b.point[0]+(v.point[0]-b.point[0])*M,O=b.point[1]+(v.point[1]-b.point[1])*M,l.translate(-n[0]*f[i].an/200,-(n[1]*R/100)),A=!1):E&&(C+=v.partialLength,S+=1,S>=E.length&&(S=0,x+=1,k[x]?E=k[x].bezierData.points:c.v.c?(S=0,x=0,E=k[x].bezierData.points):(C-=v.partialLength,E=null)),E&&(b=v,v=E[S],D=v.partialLength));G=f[i].an/2-f[i].add,l.translate(-G,0,0)}else G=f[i].an/2-f[i].add,l.translate(-G,0,0),l.translate(-n[0]*f[i].an/200,-n[1]*R/100,0);for(et+=f[i].l/2,_=0;_<I;_+=1)w=o[_].a,w.t.propType&&(F=o[_].s,L=F.getMult(f[i].anIndexes[_],h.a[_].s.totalChars),this._hasMaskedPath?P+=L.length?w.t*L[0]:w.t*L:r+=L.length?w.t.v*L[0]:w.t.v*L);for(et+=f[i].l/2,t.strokeWidthAnim&&(j=t.sw||0),t.strokeColorAnim&&(H=t.sc?[t.sc[0],t.sc[1],t.sc[2]]:[0,0,0]),t.fillColorAnim&&t.fc&&(W=[t.fc[0],t.fc[1],t.fc[2]]),_=0;_<I;_+=1)w=o[_].a,w.a.propType&&(F=o[_].s,L=F.getMult(f[i].anIndexes[_],h.a[_].s.totalChars),L.length?l.translate(-w.a.v[0]*L[0],-w.a.v[1]*L[1],w.a.v[2]*L[2]):l.translate(-w.a.v[0]*L,-w.a.v[1]*L,w.a.v[2]*L));for(_=0;_<I;_+=1)w=o[_].a,w.s.propType&&(F=o[_].s,L=F.getMult(f[i].anIndexes[_],h.a[_].s.totalChars),L.length?l.scale(1+(w.s.v[0]-1)*L[0],1+(w.s.v[1]-1)*L[1],1):l.scale(1+(w.s.v[0]-1)*L,1+(w.s.v[1]-1)*L,1));for(_=0;_<I;_+=1){if(w=o[_].a,F=o[_].s,L=F.getMult(f[i].anIndexes[_],h.a[_].s.totalChars),w.sk.propType&&(L.length?l.skewFromAxis(-w.sk.v*L[0],w.sa.v*L[1]):l.skewFromAxis(-w.sk.v*L,w.sa.v*L)),w.r.propType&&(L.length?l.rotateZ(-w.r.v*L[2]):l.rotateZ(-w.r.v*L)),w.ry.propType&&(L.length?l.rotateY(w.ry.v*L[1]):l.rotateY(w.ry.v*L)),w.rx.propType&&(L.length?l.rotateX(w.rx.v*L[0]):l.rotateX(w.rx.v*L)),w.o.propType&&(z+=L.length?(w.o.v*L[0]-z)*L[0]:(w.o.v*L-z)*L),t.strokeWidthAnim&&w.sw.propType&&(j+=L.length?w.sw.v*L[0]:w.sw.v*L),t.strokeColorAnim&&w.sc.propType)for(q=0;q<3;q+=1)L.length?H[q]=H[q]+(w.sc.v[q]-H[q])*L[0]:H[q]=H[q]+(w.sc.v[q]-H[q])*L;if(t.fillColorAnim&&t.fc){if(w.fc.propType)for(q=0;q<3;q+=1)L.length?W[q]=W[q]+(w.fc.v[q]-W[q])*L[0]:W[q]=W[q]+(w.fc.v[q]-W[q])*L;w.fh.propType&&(W=L.length?addHueToRGB(W,w.fh.v*L[0]):addHueToRGB(W,w.fh.v*L)),w.fs.propType&&(W=L.length?addSaturationToRGB(W,w.fs.v*L[0]):addSaturationToRGB(W,w.fs.v*L)),w.fb.propType&&(W=L.length?addBrightnessToRGB(W,w.fb.v*L[0]):addBrightnessToRGB(W,w.fb.v*L))}}for(_=0;_<I;_+=1)w=o[_].a,w.p.propType&&(F=o[_].s,L=F.getMult(f[i].anIndexes[_],h.a[_].s.totalChars),this._hasMaskedPath?L.length?l.translate(0,w.p.v[1]*L[0],-w.p.v[2]*L[1]):l.translate(0,w.p.v[1]*L,-w.p.v[2]*L):L.length?l.translate(w.p.v[0]*L[0],w.p.v[1]*L[1],-w.p.v[2]*L[2]):l.translate(w.p.v[0]*L,w.p.v[1]*L,-w.p.v[2]*L));if(t.strokeWidthAnim&&(Y=j<0?0:j),t.strokeColorAnim&&(X="rgb("+Math.round(255*H[0])+","+Math.round(255*H[1])+","+Math.round(255*H[2])+")"),t.fillColorAnim&&t.fc&&(K="rgb("+Math.round(255*W[0])+","+Math.round(255*W[1])+","+Math.round(255*W[2])+")"),this._hasMaskedPath){if(l.translate(0,-t.ls),l.translate(0,n[1]*R/100+s,0),h.p.p){T=(v.point[1]-b.point[1])/(v.point[0]-b.point[0]);var at=180*Math.atan(T)/Math.PI;v.point[0]<b.point[0]&&(at+=180),l.rotate(-at*Math.PI/180)}l.translate(N,O,0),P-=n[0]*f[i].an/200,f[i+1]&&Z!==f[i+1].ind&&(P+=f[i].an/2,P+=t.tr/1e3*t.s)}else{switch(l.translate(r,s,0),t.ps&&l.translate(t.ps[0],t.ps[1]+t.ascent,0),t.j){case 1:l.translate(t.justifyOffset+(t.boxWidth-t.lineWidths[f[i].line]),0,0);break;case 2:l.translate(t.justifyOffset+(t.boxWidth-t.lineWidths[f[i].line])/2,0,0)}l.translate(0,-t.ls),l.translate(G,0,0),l.translate(n[0]*f[i].an/200,n[1]*R/100,0),r+=f[i].l+t.tr/1e3*t.s}"html"===p?rt=l.toCSS():"svg"===p?rt=l.to2dCSS():st=[l.props[0],l.props[1],l.props[2],l.props[3],l.props[4],l.props[5],l.props[6],l.props[7],l.props[8],l.props[9],l.props[10],l.props[11],l.props[12],l.props[13],l.props[14],l.props[15]],J=z}m<=i?(V=new LetterProps(J,Y,X,K,rt,st),this._bt.push(V),m+=1,this.lettersChangedFlag=!0):(V=this._bt[i],this.lettersChangedFlag=V.update(J,Y,X,K,rt,st)||this.lettersChangedFlag)}}},_bl.prototype.getValue=function(){if(this._elem._x.frameId!==this._frameId){this._frameId=this._elem._x.frameId;var t,e=this._dynamicProperties.length;for(this.mdf=!1,t=0;t<e;t+=1)this._dynamicProperties[t].getValue(),this.mdf=this._dynamicProperties[t].mdf||this.mdf}},_bl.prototype.mHelper=new Matrix,_bl.prototype.defaultPropsArray=[],LetterProps.prototype.update=function(t,e,r,s,i,a){this.mdf.o=!1,this.mdf.sw=!1,this.mdf.sc=!1,this.mdf.fc=!1,this.mdf.m=!1,this.mdf.p=!1;var n=!1;return this.o!==t&&(this.o=t,this.mdf.o=!0,n=!0),this.sw!==e&&(this.sw=e,this.mdf.sw=!0,n=!0),this.sc!==r&&(this.sc=r,this.mdf.sc=!0,n=!0),this.fc!==s&&(this.fc=s,this.mdf.fc=!0,n=!0),this.m!==i&&(this.m=i,this.mdf.m=!0,n=!0),!a.length||this.p[0]===a[0]&&this.p[1]===a[1]&&this.p[4]===a[4]&&this.p[5]===a[5]&&this.p[12]===a[12]&&this.p[13]===a[13]||(this.p=a,this.mdf.p=!0,n=!0),n},_ar.prototype.setCurrentData=function(t){var e=this.currentData;e.ascent=t.ascent,e.boxWidth=t.boxWidth?t.boxWidth:e.boxWidth,e.f=t.f,e.fStyle=t.fStyle,e.fWeight=t.fWeight,e.fc=t.fc,e.j=t.j,e.justifyOffset=t.justifyOffset,e.l=t.l,e.lh=t.lh,e.lineWidths=t.lineWidths,e.ls=t.ls,e.of=t.of,e.s=t.s,e.sc=t.sc,e.sw=t.sw,e.sz=t.sz,e.ps=t.ps,e.t=t.t,e.tr=t.tr,e.fillColorAnim=t.fillColorAnim||e.fillColorAnim,e.strokeColorAnim=t.strokeColorAnim||e.strokeColorAnim,e.strokeWidthAnim=t.strokeWidthAnim||e.strokeWidthAnim,e.yOffset=t.yOffset,e.__complete=!1},_ar.prototype.searchProperty=function(){return this.kf=this.data.d.k.length>1,this.kf},_ar.prototype.getValue=function(){this.mdf=!1;var t=this.elem._x.frameId;if(t!==this._frameId&&this.kf||this.firstFrame){for(var e,r=this.data.d.k,s=0,i=r.length;s<=i-1&&(e=r[s].s,!(s===i-1||r[s+1].t>t));)s+=1;this.keysIndex!==s&&(e.__complete||this.completeTextData(e),this.setCurrentData(e),this.mdf=!this.firstFrame,this.pv=this.v=this.currentData.t,this.keysIndex=s),this._frameId=t}},_ar.prototype.completeTextData=function(t){t.__complete=!0;var e,r,s,i,a,n,o,h=this.elem._x.fontManager,l=this.data,p=[],m=0,f=l.m.g,c=0,d=0,u=0,y=[],g=0,v=0,b=h.getFontByName(t.f),E=0,P=b.fStyle.split(" "),x="normal",S="normal";r=P.length;var C;for(e=0;e<r;e+=1)switch(C=P[e].toLowerCase()){case"italic":S="italic";break;case"bold":x="700";break;case"black":x="900";break;case"medium":x="500";break;case"regular":case"normal":x="400";case"light":case"thin":x="200"}t.fWeight=x,t.fStyle=S,r=t.t.length;var A=t.tr/1e3*t.s;if(t.sz){var k=t.sz[0],M=-1;for(e=0;e<r;e+=1)s=!1," "===t.t.charAt(e)?M=e:13===t.t.charCodeAt(e)&&(g=0,s=!0),h.chars?(o=h.getCharData(t.t.charAt(e),b.fStyle,b.fFamily),E=s?0:o.w*t.s/100):E=h.measureText(t.t.charAt(e),t.f,t.s),g+E>k&&" "!==t.t.charAt(e)?(M===-1?r+=1:e=M,t.t=t.t.substr(0,e)+"\r"+t.t.substr(e===M?e+1:e),M=-1,g=0):(g+=E,g+=A);r=t.t.length}g=-A,E=0;var T,D=0;for(e=0;e<r;e+=1)if(s=!1,T=t.t.charAt(e)," "===T?i="\xa0":13===T.charCodeAt(0)?(D=0,y.push(g),v=g>v?g:v,g=-2*A,i="",s=!0,u+=1):i=t.t.charAt(e),h.chars?(o=h.getCharData(T,b.fStyle,h.getFontByName(t.f).fFamily),E=s?0:o.w*t.s/100):E=h.measureText(i,t.f,t.s)," "===T?D+=E+A:(g+=E+A+D,D=0),p.push({l:E,an:E,add:c,n:s,anIndexes:[],val:i,line:u}),2==f){if(c+=E,""==i||"\xa0"==i||e==r-1){for(""!=i&&"\xa0"!=i||(c-=E);d<=e;)p[d].an=c,p[d].ind=m,p[d].extra=E,d+=1;m+=1,c=0}}else if(3==f){if(c+=E,""==i||e==r-1){for(""==i&&(c-=E);d<=e;)p[d].an=c,p[d].ind=m,p[d].extra=E,d+=1;c=0,m+=1}}else p[m].ind=m,p[m].extra=0,m+=1;if(t.l=p,v=g>v?g:v,y.push(g),t.sz)t.boxWidth=t.sz[0],t.justifyOffset=0;else switch(t.boxWidth=v,t.j){case 1:t.justifyOffset=-t.boxWidth;break;case 2:t.justifyOffset=-t.boxWidth/2;break;default:t.justifyOffset=0}t.lineWidths=y;var w,F,_=l.a;n=_.length;var I,V,R=[];for(a=0;a<n;a+=1){for(w=_[a],w.a.sc&&(t.strokeColorAnim=!0),w.a.sw&&(t.strokeWidthAnim=!0),(w.a.fc||w.a.fh||w.a.fs||w.a.fb)&&(t.fillColorAnim=!0),V=0,I=w.s.b,e=0;e<r;e+=1)F=p[e],F.anIndexes[a]=V,(1==I&&""!=F.val||2==I&&""!=F.val&&"\xa0"!=F.val||3==I&&(F.n||"\xa0"==F.val||e==r-1)||4==I&&(F.n||e==r-1))&&(1===w.s.rn&&R.push(V),V+=1);l.a[a].s.totalChars=V;var B,L=-1;if(1===w.s.rn)for(e=0;e<r;e+=1)F=p[e],L!=F.anIndexes[a]&&(L=F.anIndexes[a],B=R.splice(Math.floor(Math.random()*R.length),1)[0]),F.anIndexes[a]=B}t.yOffset=t.lh||1.2*t.s,t.ls=t.ls||0,t.ascent=b.ascent*t.s/100},_ar.prototype.updateDocumentData=function(t,e){e=void 0===e?this.keysIndex:e;var r=this.data.d.k[e].s;r.__complete=!1,r.t=t.t,this.keysIndex=-1,this.firstFrame=!0,this.getValue()};var TextSelectorProp=function(){function t(t){if(this.mdf=t||!1,this.dynamicProperties.length){var e,r=this.dynamicProperties.length;for(e=0;e<r;e+=1)this.dynamicProperties[e].getValue(),this.dynamicProperties[e].mdf&&(this.mdf=!0)}var s=this.elem.textProperty.currentData?this.elem.textProperty.currentData.l.length:0;t&&2===this.data.r&&(this.e.v=s);var i=2===this.data.r?1:100/s,a=this.o.v/i,n=this.s.v/i+a,o=this.e.v/i+a;if(n>o){var h=n;n=o,o=h}this.finalS=n,this.finalE=o}function e(t){var e=BezierFactory.getBezierEasing(this.ne.v/100,0,1-this.xe.v/100,1).get,r=0,s=this.finalS,o=this.finalE,h=this.data.sh;if(2==h)r=o===s?t>=o?1:0:i(0,a(.5/(o-s)+(t-s)/(o-s),1)),r=e(r);else if(3==h)r=o===s?t>=o?0:1:1-i(0,a(.5/(o-s)+(t-s)/(o-s),1)),r=e(r);else if(4==h)o===s?r=0:(r=i(0,a(.5/(o-s)+(t-s)/(o-s),1)),r<.5?r*=2:r=1-2*(r-.5)),r=e(r);else if(5==h){if(o===s)r=0;else{var l=o-s;t=a(i(0,t+.5-s),o-s);var p=-l/2+t,m=l/2;r=Math.sqrt(1-p*p/(m*m))}r=e(r)}else 6==h?(o===s?r=0:(t=a(i(0,t+.5-s),o-s),r=(1+Math.cos(Math.PI+2*Math.PI*t/(o-s)))/2),r=e(r)):(t>=n(s)&&(r=t-s<0?1-(s-t):i(0,a(o-t,1))),r=e(r));return r*this.a.v}function r(r,s,i){this.mdf=!1,this.k=!1,this.data=s,this.dynamicProperties=[],this.getValue=t,this.getMult=e,this.elem=r,this.comp=r.comp,this.finalS=0,this.finalE=0,this.s=_ai._bo(r,s.s||{k:0},0,0,this.dynamicProperties),"e"in s?this.e=_ai._bo(r,s.e,0,0,this.dynamicProperties):this.e={v:100},this.o=_ai._bo(r,s.o||{k:0},0,0,this.dynamicProperties),this.xe=_ai._bo(r,s.xe||{k:0},0,0,this.dynamicProperties),this.ne=_ai._bo(r,s.ne||{k:0},0,0,this.dynamicProperties),this.a=_ai._bo(r,s.a,0,.01,this.dynamicProperties),this.dynamicProperties.length?i.push(this):this.getValue()}function s(t,e,s){return new r(t,e,s)}var i=Math.max,a=Math.min,n=Math.floor;return{getTextSelectorProp:s}}(),pool_factory=function(){return function(t,e,r,s){function i(){var t;return n?(n-=1,t=h[n]):t=e(),t}function a(t){n===o&&(h=pooling["double"](h),o=2*o),r&&r(t),h[n]=t,n+=1}var n=0,o=t,h=Array.apply(null,{length:o}),l={newElement:i,release:a};return l}}(),pooling=function(){function t(t){return t.concat(Array.apply(null,{length:t.length}))}return{"double":t}}(),point_pool=function(){function t(){return createTypedArray("float32",2)}return pool_factory(8,t)}(),shape_pool=function(){function t(){return new _av}function e(t){var e,r=t._length;for(e=0;e<r;e+=1)point_pool.release(t.v[e]),point_pool.release(t.i[e]),point_pool.release(t.o[e]),t.v[e]=null,t.i[e]=null,t.o[e]=null;t._length=0,t.c=!1}function r(t){var e,r=s.newElement(),i=void 0===t._length?t.v.length:t._length;r.setLength(i),r.c=t.c;for(e=0;e<i;e+=1)r._aw(t.v[e][0],t.v[e][1],t.o[e][0],t.o[e][1],t.i[e][0],t.i[e][1],e);return r}var s=pool_factory(4,t,e);return s.clone=r,s}(),shapeCollection_pool=function(){function t(){var t;return s?(s-=1,t=a[s]):t=new _am,t}function e(t){var e,r=t._length;for(e=0;e<r;e+=1)shape_pool.release(t.shapes[e]);t._length=0,s===i&&(a=pooling["double"](a),i=2*i),a[s]=t,s+=1}var r={_al:t,release:e},s=0,i=4,a=Array.apply(null,{length:i});return r}(),segments_length_pool=function(){function t(){return{lengths:[],totalLength:0}}function e(t){var e,r=t.lengths.length;for(e=0;e<r;e+=1)bezier_length_pool.release(t.lengths[e]);t.lengths.length=0}return pool_factory(8,t,e)}(),bezier_length_pool=function(){function t(){return{addedLength:0,percents:createTypedArray("float32",defaultCurveSegments),lengths:createTypedArray("float32",defaultCurveSegments)}}return pool_factory(8,t)}();_l.prototype.checkLayers=function(t){var e,r,s=this.layers.length;for(this.completeLayers=!0,e=s-1;e>=0;e--)this._br[e]||(r=this.layers[e],r.ip-r.st<=t-this.layers[e].st&&r.op-r.st>t-this.layers[e].st&&this.buildItem(e)),this.completeLayers=!!this._br[e]&&this.completeLayers;this.checkPendingElements()},_l.prototype.createItem=function(t){switch(t.ty){case 2:return this.createImage(t);case 0:return this.createComp(t);case 1:return this.createSolid(t);case 3:return this.createNull(t);case 4:return this.createShape(t);case 5:return this.createText(t);case 13:return this.createCamera(t);case 99:return null}return this.createBase(t)},_l.prototype.createCamera=function(){throw new Error("You're using a 3d camera. Try the html renderer.")},_l.prototype.buildAllItems=function(){
-var t,e=this.layers.length;for(t=0;t<e;t+=1)this.buildItem(t);this.checkPendingElements()},_l.prototype.includeLayers=function(t){this.completeLayers=!1;var e,r,s=t.length,i=this.layers.length;for(e=0;e<s;e+=1)for(r=0;r<i;){if(this.layers[r].id==t[e].id){this.layers[r]=t[e];break}r+=1}},_l.prototype.setProjectInterface=function(t){this._x.projectInterface=t},_l.prototype.initItems=function(){this._x.progressiveLoad||this.buildAllItems()},_l.prototype.buildElementParenting=function(t,e,r){for(var s=this._br,i=this.layers,a=0,n=i.length;a<n;)i[a].ind==e&&(s[a]&&s[a]!==!0?void 0!==i[a].parent?(r.push(s[a]),s[a]._isParent=!0,this.buildElementParenting(t,i[a].parent,r)):(r.push(s[a]),s[a]._isParent=!0,t.setHierarchy(r)):(this.buildItem(a),this.addPendingElement(t))),a+=1},_l.prototype.addPendingElement=function(t){this.pendingElements.push(t)},extendPrototype([_l],_ao),_ao.prototype.createBase=function(t){return new _d(t,this._x,this)},_ao.prototype.createNull=function(t){return new _i(t,this._x,this)},_ao.prototype.createShape=function(t){return new _f(t,this._x,this)},_ao.prototype.createText=function(t){return new SVGTextElement(t,this._x,this)},_ao.prototype.createImage=function(t){return new _h(t,this._x,this)},_ao.prototype.createComp=function(t){return new SVGCompElement(t,this._x,this)},_ao.prototype.createSolid=function(t){return new _j(t,this._x,this)},_ao.prototype.configAnimation=function(t){this._cf.setAttribute("xmlns","http://www.w3.org/2000/svg"),this.renderConfig.viewBoxSize?this._cf.setAttribute("viewBox",this.renderConfig.viewBoxSize):this._cf.setAttribute("viewBox","0 0 "+t.w+" "+t.h),this.renderConfig.viewBoxOnly||(this._cf.setAttribute("width",t.w),this._cf.setAttribute("height",t.h),this._cf.style.width="100%",this._cf.style.height="100%"),this.renderConfig.className&&this._cf.setAttribute("class",this.renderConfig.className),this._cf.setAttribute("preserveAspectRatio",this.renderConfig.preserveAspectRatio),this.animationItem.wrapper.appendChild(this._cf);var e=this._x.defs;this._x.getAssetData=this.animationItem.getAssetData.bind(this.animationItem),this._x.getAssetsPath=this.animationItem.getAssetsPath.bind(this.animationItem),this._x.progressiveLoad=this.renderConfig.progressiveLoad,this._x.nm=t.nm,this._x.compSize.w=t.w,this._x.compSize.h=t.h,this._x.frameRate=t.fr,this.data=t;var r=createNS("clipPath"),s=createNS("rect");s.setAttribute("width",t.w),s.setAttribute("height",t.h),s.setAttribute("x",0),s.setAttribute("y",0);var i="animationMask_"+randomString(10);r.setAttribute("id",i),r.appendChild(s),this._bx.setAttribute("clip-path","url("+locationHref+"#"+i+")"),e.appendChild(r),this.layers=t.layers,this._x.fontManager.addChars(t.chars),this._x.fontManager.addFonts(t.fonts,e),this._br=Array.apply(null,{length:t.layers.length})},_ao.prototype.destroy=function(){this.animationItem.wrapper.innerHTML="",this._bx=null,this._x.defs=null;var t,e=this.layers?this.layers.length:0;for(t=0;t<e;t++)this._br[t]&&this._br[t].destroy();this._br.length=0,this.destroyed=!0,this.animationItem=null},_ao.prototype.updateContainerSize=function(){},_ao.prototype.buildItem=function(t){var e=this._br;if(!e[t]&&99!=this.layers[t].ty){e[t]=!0;var r=this.createItem(this.layers[t]);e[t]=r,expressionsPlugin&&(0===this.layers[t].ty&&this._x.projectInterface.registerComposition(r),r.initExpressions()),this.appendElementInPos(r,t),this.layers[t].tt&&(this._br[t-1]&&this._br[t-1]!==!0?r.setMatte(e[t-1].layerId):(this.buildItem(t-1),this.addPendingElement(r)))}},_ao.prototype.checkPendingElements=function(){for(;this.pendingElements.length;){var t=this.pendingElements.pop();if(t.checkParenting(),t.data.tt)for(var e=0,r=this._br.length;e<r;){if(this._br[e]===t){t.setMatte(this._br[e-1].layerId);break}e+=1}}},_ao.prototype._ba=function(t){if(this.renderedFrame!==t&&!this.destroyed){null===t?t=this.renderedFrame:this.renderedFrame=t,this._x.frameNum=t,this._x.frameId+=1,this._x.projectInterface.currentFrame=t;var e,r=this.layers.length;for(this.completeLayers||this.checkLayers(t),e=r-1;e>=0;e--)(this.completeLayers||this._br[e])&&this._br[e]._az(t-this.layers[e].st);for(e=0;e<r;e+=1)(this.completeLayers||this._br[e])&&this._br[e]._ba()}},_ao.prototype.appendElementInPos=function(t,e){var r=t.get_e();if(r){for(var s,i=0;i<e;)this._br[i]&&this._br[i]!==!0&&this._br[i].get_e()&&(s=this._br[i].get_e()),i+=1;s?this._bx.insertBefore(r,s):this._bx.appendChild(r)}},_ao.prototype.hide=function(){this._bx.style.display="none"},_ao.prototype.show=function(){this._bx.style.display="block"},_ao.prototype.searchExtraCompositions=function(t){var e,r=t.length,s=createNS("g");for(e=0;e<r;e+=1)if(t[e].xt){var i=this.createComp(t[e],s,this._x.comp,null);i.initExpressions(),this._x.projectInterface.registerComposition(i)}},extendPrototype([_l],_aq),_aq.prototype.createBase=function(t){return new _c(t,this._x,this)},_aq.prototype.createShape=function(t){return new _r(t,this._x,this)},_aq.prototype.createText=function(t){return new _t(t,this._x,this)},_aq.prototype.createImage=function(t){return new _p(t,this._x,this)},_aq.prototype.createComp=function(t){return new _m(t,this._x,this)},_aq.prototype.createSolid=function(t){return new _s(t,this._x,this)},_aq.prototype.createNull=_ao.prototype.createNull,_aq.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);var e=this.contextData.cTr.props;this.transformMat.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.contextData.cTr.cloneFromProps(this.transformMat.props);var r=this.contextData.cTr.props;this.canvasContext.setTransform(r[0],r[1],r[4],r[5],r[12],r[13])}},_aq.prototype.ctxOpacity=function(t){return this.renderConfig.clearCanvas?(this.contextData.cO*=t<0?0:t,void(this.canvasContext.globalAlpha=this.contextData.cO)):void(this.canvasContext.globalAlpha*=t<0?0:t)},_aq.prototype.reset=function(){return this.renderConfig.clearCanvas?void this.contextData.reset():void this.canvasContext.restore()},_aq.prototype.save=function(t){if(!this.renderConfig.clearCanvas)return void this.canvasContext.save();t&&this.canvasContext.save();var e=this.contextData.cTr.props;this.contextData._length<=this.contextData.cArrPos&&this.contextData.duplicate();var r,s=this.contextData.saved[this.contextData.cArrPos];for(r=0;r<16;r+=1)s[r]=e[r];this.contextData.savedOp[this.contextData.cArrPos]=this.contextData.cO,this.contextData.cArrPos+=1},_aq.prototype.restore=function(t){if(!this.renderConfig.clearCanvas)return void this.canvasContext.restore();t&&(this.canvasContext.restore(),this._x.blendMode="source-over"),this.contextData.cArrPos-=1;var e,r=this.contextData.saved[this.contextData.cArrPos],s=this.contextData.cTr.props;for(e=0;e<16;e+=1)s[e]=r[e];this.canvasContext.setTransform(r[0],r[1],r[4],r[5],r[12],r[13]),r=this.contextData.savedOp[this.contextData.cArrPos],this.contextData.cO=r,this.canvasContext.globalAlpha=r},_aq.prototype.configAnimation=function(t){this.animationItem.wrapper?(this.animationItem.container=createTag("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.renderConfig.className&&this.animationItem.container.setAttribute("class",this.renderConfig.className)):this.canvasContext=this.renderConfig.context,this.data=t,this._x.canvasContext=this.canvasContext,this._x.renderer=this,this._x.isDashed=!1,this._x.totalFrames=Math.floor(t.tf),this._x.compWidth=t.w,this._x.compHeight=t.h,this._x.frameRate=t.fr,this._x.frameId=0,this._x.compSize={w:t.w,h:t.h},this._x.progressiveLoad=this.renderConfig.progressiveLoad,this.layers=t.layers,this.transformCanvas={},this.transformCanvas.w=t.w,this.transformCanvas.h=t.h,this._x.fontManager=new FontManager,this._x.fontManager.addChars(t.chars),this._x.fontManager.addFonts(t.fonts,document.body),this._x.getAssetData=this.animationItem.getAssetData.bind(this.animationItem),this._x.getAssetsPath=this.animationItem.getAssetsPath.bind(this.animationItem),this._x.elementLoaded=this.animationItem.elementLoaded.bind(this.animationItem),this._x.addPendingElement=this.animationItem.addPendingElement.bind(this.animationItem),this._x.transformCanvas=this.transformCanvas,this._br=Array.apply(null,{length:t.layers.length}),this.updateContainerSize()},_aq.prototype.updateContainerSize=function(){this.reset();var t,e;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);var r,s;if(this.renderConfig.preserveAspectRatio.indexOf("meet")!==-1||this.renderConfig.preserveAspectRatio.indexOf("slice")!==-1){var i=this.renderConfig.preserveAspectRatio.split(" "),a=i[1]||"meet",n=i[0]||"xMidYMid",o=n.substr(0,4),h=n.substr(4);r=t/e,s=this.transformCanvas.w/this.transformCanvas.h,s>r&&"meet"===a||s<r&&"slice"===a?(this.transformCanvas.sx=t/(this.transformCanvas.w/this.renderConfig.dpr),this.transformCanvas.sy=t/(this.transformCanvas.w/this.renderConfig.dpr)):(this.transformCanvas.sx=e/(this.transformCanvas.h/this.renderConfig.dpr),this.transformCanvas.sy=e/(this.transformCanvas.h/this.renderConfig.dpr)),"xMid"===o&&(s<r&&"meet"===a||s>r&&"slice"===a)?this.transformCanvas.tx=(t-this.transformCanvas.w*(e/this.transformCanvas.h))/2*this.renderConfig.dpr:"xMax"===o&&(s<r&&"meet"===a||s>r&&"slice"===a)?this.transformCanvas.tx=(t-this.transformCanvas.w*(e/this.transformCanvas.h))*this.renderConfig.dpr:this.transformCanvas.tx=0,"YMid"===h&&(s>r&&"meet"===a||s<r&&"slice"===a)?this.transformCanvas.ty=(e-this.transformCanvas.h*(t/this.transformCanvas.w))/2*this.renderConfig.dpr:"YMax"===h&&(s>r&&"meet"===a||s<r&&"slice"===a)?this.transformCanvas.ty=(e-this.transformCanvas.h*(t/this.transformCanvas.w))*this.renderConfig.dpr:this.transformCanvas.ty=0}else"none"==this.renderConfig.preserveAspectRatio?(this.transformCanvas.sx=t/(this.transformCanvas.w/this.renderConfig.dpr),this.transformCanvas.sy=e/(this.transformCanvas.h/this.renderConfig.dpr),this.transformCanvas.tx=0,this.transformCanvas.ty=0):(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.ctxTransform(this.transformCanvas.props)},_aq.prototype.destroy=function(){this.renderConfig.clearCanvas&&(this.animationItem.wrapper.innerHTML="");var t,e=this.layers?this.layers.length:0;for(t=e-1;t>=0;t-=1)this._br[t]&&this._br[t].destroy();this._br.length=0,this._x.canvasContext=null,this.animationItem.container=null,this.destroyed=!0},_aq.prototype._ba=function(t){if(!(this.renderedFrame==t&&this.renderConfig.clearCanvas===!0||this.destroyed||null===t)){this.renderedFrame=t,this._x.frameNum=t-this.animationItem.firstFrame,this._x.frameId+=1,this._x.projectInterface.currentFrame=t,this.renderConfig.clearCanvas===!0?this.canvasContext.clearRect(this.transformCanvas.tx,this.transformCanvas.ty,this.transformCanvas.w*this.transformCanvas.sx,this.transformCanvas.h*this.transformCanvas.sy):this.save(),this.canvasContext.beginPath(),this.canvasContext.rect(0,0,this.transformCanvas.w,this.transformCanvas.h),this.canvasContext.closePath(),this.canvasContext.clip();var e,r=this.layers.length;for(this.completeLayers||this.checkLayers(t),e=0;e<r;e++)(this.completeLayers||this._br[e])&&this._br[e]._az(t-this.layers[e].st);for(e=r-1;e>=0;e-=1)(this.completeLayers||this._br[e])&&this._br[e]._ba();this.renderConfig.clearCanvas!==!0&&this.restore()}},_aq.prototype.buildItem=function(t){var e=this._br;if(!e[t]&&99!=this.layers[t].ty){var r=this.createItem(this.layers[t],this,this._x);e[t]=r,r.initExpressions()}},_aq.prototype.checkPendingElements=function(){for(;this.pendingElements.length;){var t=this.pendingElements.pop();t.checkParenting()}},_aq.prototype.hide=function(){this.animationItem.container.style.display="none"},_aq.prototype.show=function(){this.animationItem.container.style.display="block"},_aq.prototype.searchExtraCompositions=function(t){var e,r=t.length;createNS("g");for(e=0;e<r;e+=1)if(t[e].xt){var s=this.createComp(t[e],this._x.comp,this._x);s.initExpressions(),this._x.projectInterface.registerComposition(s)}},extendPrototype([_l],_ap),_ap.prototype.buildItem=_ao.prototype.buildItem,_ap.prototype.checkPendingElements=function(){for(;this.pendingElements.length;){var t=this.pendingElements.pop();t.checkParenting()}},_ap.prototype.appendElementInPos=function(t,e){var r=t.get_e();if(r){var s=this.layers[e];if(s.ddd&&this.supports3d)this.addTo3dContainer(r,e);else{for(var i,a,n=0;n<e;)this._br[n]&&this._br[n]!==!0&&this._br[n].get_e&&(a=this._br[n],i=this.layers[n].ddd?this.getThreeDContainerByPos(n):a.get_e()),n+=1;i?s.ddd&&this.supports3d||this._bx.insertBefore(r,i):s.ddd&&this.supports3d||this._bx.appendChild(r)}}},_ap.prototype.createBase=function(t){return new _d(t,this._x,this)},_ap.prototype.createShape=function(t){return this.supports3d?new _z(t,this._x,this):new _f(t,this._x,this)},_ap.prototype.createText=function(t){return this.supports3d?new _ab(t,this._x,this):new SVGTextElement(t,this._x,this)},_ap.prototype.createCamera=function(t){return this.camera=new _v(t,this._x,this),this.camera},_ap.prototype.createImage=function(t){return this.supports3d?new _y(t,this._x,this):new _h(t,this._x,this)},_ap.prototype.createComp=function(t){return this.supports3d?new _w(t,this._x,this):new _g(t,this._x,this)},_ap.prototype.createSolid=function(t){return this.supports3d?new _aa(t,this._x,this):new _j(t,this._x,this)},_ap.prototype.createNull=_ao.prototype.createNull,_ap.prototype.getThreeDContainerByPos=function(t){for(var e=0,r=this.threeDElements.length;e<r;){if(this.threeDElements[e].startPos<=t&&this.threeDElements[e].endPos>=t)return this.threeDElements[e].perspectiveElem;e+=1}},_ap.prototype.createThreeDContainer=function(t){var e=createTag("div");styleDiv(e),e.style.width=this._x.compSize.w+"px",e.style.height=this._x.compSize.h+"px",e.style.transformOrigin=e.style.mozTransformOrigin=e.style.webkitTransformOrigin="50% 50%";var r=createTag("div");styleDiv(r),r.style.transform=r.style.webkitTransform="matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1)",e.appendChild(r),this.resizerElem.appendChild(e);var s={container:r,perspectiveElem:e,startPos:t,endPos:t};return this.threeDElements.push(s),s},_ap.prototype.build3dContainers=function(){var t,e,r=this.layers.length;for(t=0;t<r;t+=1)this.layers[t].ddd?(e||(e=this.createThreeDContainer(t)),e.endPos=Math.max(e.endPos,t)):e=null},_ap.prototype.addTo3dContainer=function(t,e){for(var r=0,s=this.threeDElements.length;r<s;){if(e<=this.threeDElements[r].endPos){for(var i,a=this.threeDElements[r].startPos;a<e;)this._br[a]&&this._br[a].get_e&&(i=this._br[a].get_e()),a+=1;i?this.threeDElements[r].container.insertBefore(t,i):this.threeDElements[r].container.appendChild(t);break}r+=1}},_ap.prototype.configAnimation=function(t){var e=createTag("div"),r=this.animationItem.wrapper;e.style.width=t.w+"px",e.style.height=t.h+"px",this.resizerElem=e,styleDiv(e),e.style.transformStyle=e.style.webkitTransformStyle=e.style.mozTransformStyle="flat",this.renderConfig.className&&r.setAttribute("class",this.renderConfig.className),r.appendChild(e),e.style.overflow="hidden";var s=createNS("svg");s.setAttribute("width","1"),s.setAttribute("height","1"),styleDiv(s),this.resizerElem.appendChild(s);var i=createNS("defs");s.appendChild(i),this._x.defs=i,this.data=t,this._x.getAssetData=this.animationItem.getAssetData.bind(this.animationItem),this._x.getAssetsPath=this.animationItem.getAssetsPath.bind(this.animationItem),this._x.elementLoaded=this.animationItem.elementLoaded.bind(this.animationItem),this._x.frameId=0,this._x.compSize={w:t.w,h:t.h},this._x.frameRate=t.fr,this.layers=t.layers,this._x.fontManager=new FontManager,this._x.fontManager.addChars(t.chars),this._x.fontManager.addFonts(t.fonts,s),this._bx=this.resizerElem,this.build3dContainers(),this.updateContainerSize()},_ap.prototype.destroy=function(){this.animationItem.wrapper.innerHTML="",this.animationItem.container=null,this._x.defs=null;var t,e=this.layers?this.layers.length:0;for(t=0;t<e;t++)this._br[t].destroy();this._br.length=0,this.destroyed=!0,this.animationItem=null},_ap.prototype.updateContainerSize=function(){var t,e,r,s,i=this.animationItem.wrapper.offsetWidth,a=this.animationItem.wrapper.offsetHeight,n=i/a,o=this._x.compSize.w/this._x.compSize.h;o>n?(t=i/this._x.compSize.w,e=i/this._x.compSize.w,r=0,s=(a-this._x.compSize.h*(i/this._x.compSize.w))/2):(t=a/this._x.compSize.h,e=a/this._x.compSize.h,r=(i-this._x.compSize.w*(a/this._x.compSize.h))/2,s=0),this.resizerElem.style.transform=this.resizerElem.style.webkitTransform="matrix3d("+t+",0,0,0,0,"+e+",0,0,0,0,1,0,"+r+","+s+",0,1)"},_ap.prototype._ba=_ao.prototype._ba,_ap.prototype.hide=function(){this.resizerElem.style.display="none"},_ap.prototype.show=function(){this.resizerElem.style.display="block"},_ap.prototype.initItems=function(){if(this.buildAllItems(),this.camera)this.camera.setup();else{var t,e=this._x.compSize.w,r=this._x.compSize.h,s=this.threeDElements.length;for(t=0;t<s;t+=1)this.threeDElements[t].perspectiveElem.style.perspective=this.threeDElements[t].perspectiveElem.style.webkitPerspective=Math.sqrt(Math.pow(e,2)+Math.pow(r,2))+"px"}},_ap.prototype.searchExtraCompositions=function(t){var e,r=t.length,s=createTag("div");for(e=0;e<r;e+=1)if(t[e].xt){var i=this.createComp(t[e],s,this._x.comp,null);i.initExpressions(),this._x.projectInterface.registerComposition(i)}},_ay.prototype.getMaskProperty=function(t){return this.viewData[t].prop},_ay.prototype._az=function(){var t,e=this.dynamicProperties.length;for(t=0;t<e;t+=1)this.dynamicProperties[t].getValue()},_ay.prototype._ba=function(t){var e,r=this.masksProperties.length;for(e=0;e<r;e++)if((this.viewData[e].prop.mdf||this.firstFrame)&&this.drawPath(this.masksProperties[e],this.viewData[e].prop.v,this.viewData[e]),(this.viewData[e].op.mdf||this.firstFrame)&&this.viewData[e].elem.setAttribute("fill-opacity",this.viewData[e].op.v),"n"!==this.masksProperties[e].mode&&(this.viewData[e].invRect&&(this.element.finalTransform.mProp.mdf||this.firstFrame)&&(this.viewData[e].invRect.setAttribute("x",-t.props[12]),this.viewData[e].invRect.setAttribute("y",-t.props[13])),this.storedData[e].x&&(this.storedData[e].x.mdf||this.firstFrame))){var s=this.storedData[e].expan;this.storedData[e].x.v<0?("erode"!==this.storedData[e].lastOperator&&(this.storedData[e].lastOperator="erode",this.storedData[e].elem.setAttribute("filter","url("+locationHref+"#"+this.storedData[e].filterId+")")),s.setAttribute("radius",-this.storedData[e].x.v)):("dilate"!==this.storedData[e].lastOperator&&(this.storedData[e].lastOperator="dilate",this.storedData[e].elem.setAttribute("filter",null)),this.storedData[e].elem.setAttribute("stroke-width",2*this.storedData[e].x.v))}this.firstFrame=!1},_ay.prototype.getMaskelement=function(){return this.maskElement},_ay.prototype.createLayerSolidPath=function(){var t="M0,0 ";return t+=" h"+this._x.compSize.w,t+=" v"+this._x.compSize.h,t+=" h-"+this._x.compSize.w,t+=" v-"+this._x.compSize.h+" "},_ay.prototype.drawPath=function(t,e,r){var s,i,a=" M"+e.v[0][0]+","+e.v[0][1];for(i=e._length,s=1;s<i;s+=1)a+=" C"+e.o[s-1][0]+","+e.o[s-1][1]+" "+e.i[s][0]+","+e.i[s][1]+" "+e.v[s][0]+","+e.v[s][1];if(e.c&&i>1&&(a+=" C"+e.o[s-1][0]+","+e.o[s-1][1]+" "+e.i[0][0]+","+e.i[0][1]+" "+e.v[0][0]+","+e.v[0][1]),r.lastPath!==a){var n="";r.elem&&(e.c&&(n=t.inv?this.solidPath+a:a),r.elem.setAttribute("d",n)),r.lastPath=a}},_ay.prototype.destroy=function(){this.element=null,this._x=null,this.maskElement=null,this.data=null,this.masksProperties=null},_ad.prototype.initHierarchy=function(){this.hierarchy=[],this._isParent=!1,this.checkParenting()},_ad.prototype.resetHierarchy=function(){this.hierarchy.length=0},_ad.prototype.getHierarchy=function(){return this.hierarchy},_ad.prototype.setHierarchy=function(t){this.hierarchy=t},_ad.prototype.checkParenting=function(){void 0!==this.data.parent&&this.comp.buildElementParenting(this,this.data.parent,[])},_ad.prototype.prepareHierarchy=function(){},_ac.prototype.initFrame=function(){this.firstFrame=!1,this.dynamicProperties=[]},_ac.prototype.prepareProperties=function(t,e){var r,s=this.dynamicProperties.length;for(r=0;r<s;r+=1)(e||this._isParent&&"transform"===this.dynamicProperties[r].propType)&&(this.dynamicProperties[r].getValue(this.firstFrame),this.dynamicProperties[r].mdf&&(this._x.mdf=!0))},_af.prototype.initTransform=function(){this.finalTransform={mProp:this.data.ks?_ag._bj(this,this.data.ks,this.dynamicProperties):{o:0},matMdf:!1,opMdf:!1,mat:new Matrix},this.data.ao&&(this.finalTransform.mProp.autoOriented=!0),11!==this.data.ty},_af.prototype.renderTransform=function(){if(this.finalTransform.opMdf=this.finalTransform.mProp.o.mdf||this.firstFrame,this.finalTransform.matMdf=this.finalTransform.mProp.mdf||this.firstFrame,this.hierarchy){var t,e=this.finalTransform.mat,r=0,s=this.hierarchy.length;if(!this.finalTransform.matMdf)for(;r<s;){if(this.hierarchy[r].finalTransform.mProp.mdf){this.finalTransform.matMdf=!0;break}r+=1}if(this.finalTransform.matMdf)for(t=this.finalTransform.mProp.v.props,e.cloneFromProps(t),r=0;r<s;r+=1)t=this.hierarchy[r].finalTransform.mProp.v.props,e.transform(t[0],t[1],t[2],t[3],t[4],t[5],t[6],t[7],t[8],t[9],t[10],t[11],t[12],t[13],t[14],t[15])}},_af.prototype.globalToLocal=function(t){var e=[];e.push(this.finalTransform);for(var r=!0,s=this.comp;r;)s.finalTransform?(s.data.hasMask&&e.splice(0,0,s.finalTransform),s=s.comp):r=!1;var i,a,n=e.length;for(i=0;i<n;i+=1)a=e[i].mat.applyToPointArray(0,0,0),t=[t[0]-a[0],t[1]-a[1],0];return t},_af.prototype.mHelper=new Matrix,_ae.prototype.initRenderable=function(){this.isInRange=!1,this.hidden=!1,this.isTransparent=!1},_ae.prototype.prepareRenderableFrame=function(t){this.checkLayerLimits(t),this.prepareMasks(t),this.finalTransform.mProp.o.v<=0?!this.isTransparent&&this._x.renderConfig.hideOnTransparent&&(this.isTransparent=!0,this.hide()):this.isTransparent&&(this.isTransparent=!1,this.show())},_ae.prototype.checkLayerLimits=function(t){this.data.ip-this.data.st<=t&&this.data.op-this.data.st>t?this.isInRange!==!0&&(this._x.mdf=!0,this.isInRange=!0,this.show()):this.isInRange!==!1&&(this._x.mdf=!0,this.isInRange=!1,this.hide())},_ae.prototype.prepareMasks=function(){this.isInRange&&this.maskManager._az()},_ae.prototype.renderRenderable=function(){this.maskManager._ba(this.finalTransform.mat),this.effectsManager._ba(this.firstFrame)},_ae.prototype.sourceRectAtTime=function(){return{top:0,left:0,width:100,height:100}},_ae.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}},extendPrototype([_ae],RenderableDOMElement),RenderableDOMElement.prototype.initElement=function(t,e,r){this.initFrame(),this.initBaseData(t,e,r),this.initTransform(t,e,r),this.initHierarchy(),this.initRenderable(),this.initRendererElement(),this.createContainerElements(),this.addMasks(),this.createContent(),this.hide()},RenderableDOMElement.prototype.hide=function(){this.hidden||this.isInRange&&!this.isTransparent||(this._bx.style.display="none",this.hidden=!0)},RenderableDOMElement.prototype.show=function(){this.isInRange&&!this.isTransparent&&(this.data.hd||(this._bx.style.display="block"),this.hidden=!1,this.firstFrame=!0,this.maskManager.firstFrame=!0)},RenderableDOMElement.prototype._ba=function(){this.data.hd||this.hidden||(this.renderTransform(),this.renderRenderable(),this.renderElement(),this.renderInnerContent(),this.firstFrame&&(this.firstFrame=!1))},RenderableDOMElement.prototype.renderInnerContent=function(){},RenderableDOMElement.prototype.destroy=function(){this._cc=null,this.destroy_e()},RenderableDOMElement.prototype._az=function(t){this.prepareRenderableFrame(t),this.prepareProperties(t,this.isInRange)},SVGStyleData.prototype.reset=function(){this.d="",this.mdf=!1},SVGGradientFillStyleData.prototype.initGradientData=function(t,e,r,s){this.o=_ai._bo(t,e.o,0,.01,r),this.s=_ai._bo(t,e.s,1,null,r),this.e=_ai._bo(t,e.e,1,null,r),this.h=_ai._bo(t,e.h||{k:0},0,.01,r),this.a=_ai._bo(t,e.a||{k:0},0,degToRads,r),this.g=new GradientProperty(t,e.g,r),this.style=s,this.stops=[],this.setGradientData(s.pElem,e),this.setGradientOpacity(e,s)},SVGGradientFillStyleData.prototype.setGradientData=function(t,e){var r="gr_"+randomString(10),s=createNS(1===e.t?"linearGradient":"radialGradient");s.setAttribute("id",r),s.setAttribute("spreadMethod","pad"),s.setAttribute("gradientUnits","userSpaceOnUse");var i,a,n,o=[];for(n=4*e.g.p,a=0;a<n;a+=4)i=createNS("stop"),s.appendChild(i),o.push(i);t.setAttribute("gf"===e.ty?"fill":"stroke","url(#"+r+")"),this.gf=s,this.cst=o},SVGGradientFillStyleData.prototype.setGradientOpacity=function(t,e){if(this.g._hasOpacity&&!this.g._collapsable){var r,s,i,a=createNS("mask"),n=createNS("path");a.appendChild(n);var o="op_"+randomString(10),h="mk_"+randomString(10);a.setAttribute("id",h);var l=createNS(1===t.t?"linearGradient":"radialGradient");l.setAttribute("id",o),l.setAttribute("spreadMethod","pad"),l.setAttribute("gradientUnits","userSpaceOnUse"),i=t.g.k.k[0].s?t.g.k.k[0].s.length:t.g.k.k.length;var p=this.stops;for(s=4*t.g.p;s<i;s+=2)r=createNS("stop"),r.setAttribute("stop-color","rgb(255,255,255)"),l.appendChild(r),p.push(r);n.setAttribute("gf"===t.ty?"fill":"stroke","url(#"+o+")"),this.of=l,this.ms=a,this.ost=p,this.maskId=h,e.msElem=n}},SVGGradientStrokeStyleData.prototype.initGradientData=SVGGradientFillStyleData.prototype.initGradientData,SVGGradientStrokeStyleData.prototype.setGradientData=SVGGradientFillStyleData.prototype.setGradientData,SVGGradientStrokeStyleData.prototype.setGradientOpacity=SVGGradientFillStyleData.prototype.setGradientOpacity,_e.prototype.checkMasks=function(){if(!this.data.hasMask)return!1;for(var t=0,e=this.data.masksProperties.length;t<e;){if("n"!==this.data.masksProperties[t].mode&&this.data.masksProperties[t].cl!==!1)return!0;t+=1}return!1},_e.prototype.initExpressions=function(){this.layerInterface=LayerExpressionInterface(this),this.data.hasMask&&this.layerInterface.registerMaskInterface(this.maskManager);var t=EffectsExpressionInterface.createEffectsInterface(this,this.layerInterface);this.layerInterface.registerEffectsInterface(t),0===this.data.ty||this.data.xt?this.compInterface=CompExpressionInterface(this):4===this.data.ty?(this.layerInterface.shapeInterface=ShapeExpressionInterface(this.shapesData,this.itemsData,this.layerInterface),this.layerInterface.content=this.layerInterface.shapeInterface):5===this.data.ty&&(this.layerInterface.textInterface=TextExpressionInterface(this),this.layerInterface.text=this.layerInterface.textInterface)},_e.prototype.getBlendMode=function(){var t="";switch(this.data.bm){case 1:t="multiply";break;case 2:t="screen";break;case 3:t="overlay";break;case 4:t="darken";break;case 5:t="lighten";break;case 6:t="color-dodge";break;case 7:t="color-burn";break;case 8:t="hard-light";break;case 9:t="soft-light";break;case 10:t="difference";break;case 11:t="exclusion";break;case 12:t="hue";break;case 13:t="saturation";break;case 14:t="color";break;case 15:t="luminosity"}return t},_e.prototype.setBlendMode=function(){var t=this.getBlendMode(),e=this._by||this._bx;e.style["mix-blend-mode"]=t},_e.prototype.initBaseData=function(t,e,r){this._x=e,this.comp=r,this.data=t,this.layerId="ly_"+randomString(10),this.data.sr||(this.data.sr=1),this.effects=new EffectsManager(this.data,this,this.dynamicProperties)},_e.prototype.getType=function(){return this.type},_i.prototype._az=function(t){this.prepareProperties(t,!0)},_i.prototype._ba=function(){},_i.prototype.get_e=function(){return null},_i.prototype.destroy=function(){},_i.prototype.sourceRectAtTime=function(){},_i.prototype.hide=function(){},extendPrototype([_e,_af,_ad,_ac],_i),_d.prototype.initRendererElement=function(){this._bx=createNS("g")},_d.prototype.createContainerElements=function(){this.matteElement=createNS("g"),this._bz=this._bx,
-this._ca=this._bx,this._sizeChanged=!1;var t=null;if(this.data.td){if(3==this.data.td||1==this.data.td){var e=createNS("mask");if(e.setAttribute("id",this.layerId),e.setAttribute("mask-type",3==this.data.td?"luminance":"alpha"),e.appendChild(this._bx),t=e,this._x.defs.appendChild(e),!featureSupport.maskType&&1==this.data.td){e.setAttribute("mask-type","luminance");var r=randomString(10),s=filtersFactory.createFilter(r);this._x.defs.appendChild(s),s.appendChild(filtersFactory.createAlphaToLuminanceFilter());var i=createNS("g");i.appendChild(this._bx),t=i,e.appendChild(i),i.setAttribute("filter","url("+locationHref+"#"+r+")")}}else if(2==this.data.td){var a=createNS("mask");a.setAttribute("id",this.layerId),a.setAttribute("mask-type","alpha");var n=createNS("g");a.appendChild(n);var r=randomString(10),s=filtersFactory.createFilter(r),o=createNS("feColorMatrix");o.setAttribute("type","matrix"),o.setAttribute("color-interpolation-filters","sRGB"),o.setAttribute("values","1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 -1 1"),s.appendChild(o),this._x.defs.appendChild(s);var h=createNS("rect");if(h.setAttribute("width",this.comp.data.w),h.setAttribute("height",this.comp.data.h),h.setAttribute("x","0"),h.setAttribute("y","0"),h.setAttribute("fill","#ffffff"),h.setAttribute("opacity","0"),n.setAttribute("filter","url("+locationHref+"#"+r+")"),n.appendChild(h),n.appendChild(this._bx),t=n,!featureSupport.maskType){a.setAttribute("mask-type","luminance"),s.appendChild(filtersFactory.createAlphaToLuminanceFilter());var i=createNS("g");n.appendChild(h),i.appendChild(this._bx),t=i,n.appendChild(i)}this._x.defs.appendChild(a)}}else this.data.tt?(this.matteElement.appendChild(this._bx),t=this.matteElement,this._by=this.matteElement):this._by=this._bx;if(!this.data.ln&&!this.data.cl||4!==this.data.ty&&0!==this.data.ty||(this.data.ln&&this._bx.setAttribute("id",this.data.ln),this.data.cl&&this._bx.setAttribute("class",this.data.cl)),0===this.data.ty&&!this.data.hd){var l=createNS("clipPath"),p=createNS("path");p.setAttribute("d","M0,0 L"+this.data.w+",0 L"+this.data.w+","+this.data.h+" L0,"+this.data.h+"z");var m="cp_"+randomString(8);if(l.setAttribute("id",m),l.appendChild(p),this._x.defs.appendChild(l),this.checkMasks()){var f=createNS("g");f.setAttribute("clip-path","url("+locationHref+"#"+m+")"),f.appendChild(this._bx),this._bz=f,t?t.appendChild(this._bz):this._by=this._bz}else this._bx.setAttribute("clip-path","url("+locationHref+"#"+m+")")}0!==this.data.bm&&this.setBlendMode(),this.effectsManager=new _bi(this)},_d.prototype.renderElement=function(){this.finalTransform.matMdf&&this._bz.setAttribute("transform",this.finalTransform.mat.to2dCSS()),this.finalTransform.opMdf&&this._bz.setAttribute("opacity",this.finalTransform.mProp.o.v)},_d.prototype.destroy_e=function(){this._bx=null,this.matteElement=null,this.maskManager.destroy()},_d.prototype.get_e=function(){return this.data.hd?null:this._by},_d.prototype.addMasks=function(){this.maskManager=new _ay(this.data,this,this._x)},_d.prototype.setMatte=function(t){this.matteElement&&this.matteElement.setAttribute("mask","url("+locationHref+"#"+t+")")},extendPrototype([_e,_af,_d,_ad,_ac,RenderableDOMElement],_f),_f.prototype.initSecondaryElement=function(){},_f.prototype.identityMatrix=new Matrix,_f.prototype.lcEnum={1:"butt",2:"round",3:"square"},_f.prototype.ljEnum={1:"miter",2:"round",3:"butt"},_f.prototype.searchProcessedElement=function(t){for(var e=0,r=this.processedElements.length;e<r;){if(this.processedElements[e].elem===t)return this.processedElements[e].pos;e+=1}return 0},_f.prototype.addProcessedElement=function(t,e){for(var r=this.processedElements.length;r;)if(r-=1,this.processedElements[r].elem===t){this.processedElements[r].pos=e;break}0===r&&this.processedElements.push(new ProcessedElement(t,e))},_f.prototype.buildExpressionInterface=function(){},_f.prototype.createContent=function(){this.searchShapes(this.shapesData,this.itemsData,this.prevViewData,this._bx,this.dynamicProperties,0,[],!0)},_f.prototype.createStyleElement=function(t,e,r){var s,i=new SVGStyleData(t,e),a=i.pElem;if("st"===t.ty)s=new SVGStrokeStyleData(this,t,r,i);else if("fl"===t.ty)s=new SVGFillStyleData(this,t,r,i);else if("gf"===t.ty||"gs"===t.ty){var n="gf"===t.ty?SVGGradientFillStyleData:SVGGradientStrokeStyleData;s=new n(this,t,r,i),this._x.defs.appendChild(s.gf),s.maskId&&(this._x.defs.appendChild(s.ms),this._x.defs.appendChild(s.of),a.setAttribute("mask","url(#"+s.maskId+")"))}return"st"!==t.ty&&"gs"!==t.ty||(a.setAttribute("stroke-linecap",this.lcEnum[t.lc]||"round"),a.setAttribute("stroke-linejoin",this.ljEnum[t.lj]||"round"),a.setAttribute("fill-opacity","0"),1===t.lj&&a.setAttribute("stroke-miterlimit",t.ml)),2===t.r&&a.setAttribute("fill-rule","evenodd"),t.ln&&a.setAttribute("id",t.ln),t.cl&&a.setAttribute("class",t.cl),this.stylesList.push(i),s},_f.prototype.createGroupElement=function(t){var e=new ShapeGroupData;return t.ln&&e.gr.setAttribute("id",t.ln),e},_f.prototype.create_af=function(t,e){return new SVGTransformData(_ag._bj(this,t,e),_ai._bo(this,t.o,0,.01,e))},_f.prototype.createShapeElement=function(t,e,r,s){var i=4;"rc"===t.ty?i=5:"el"===t.ty?i=6:"sr"===t.ty&&(i=7);var a=_ah._bp(this,t,i,s),n=new SVGShapeData(e,r,a);return this.shapes.push(n.sh),this.addShapeToModifiers(n),n},_f.prototype.setElementStyles=function(t){var e,r=t.styles,s=this.stylesList.length;for(e=0;e<s;e+=1)this.stylesList[e].closed||r.push(this.stylesList[e])},_f.prototype.reloadShapes=function(){this.firstFrame=!0;var t,e=this.itemsData.length;for(t=0;t<e;t+=1)this.prevViewData[t]=this.itemsData[t];this.searchShapes(this.shapesData,this.itemsData,this.prevViewData,this._bx,this.dynamicProperties,0,[],!0);var t,e=this.dynamicProperties.length;for(t=0;t<e;t+=1)this.dynamicProperties[t].getValue();this.renderModifiers()},_f.prototype.searchShapes=function(t,e,r,s,i,a,n,o){var h,l,p,m,f,c,d=[].concat(n),u=t.length-1,y=[],g=[];for(h=u;h>=0;h-=1){if(c=this.searchProcessedElement(t[h]),c?e[h]=r[c-1]:t[h]._render=o,"fl"==t[h].ty||"st"==t[h].ty||"gf"==t[h].ty||"gs"==t[h].ty)c?e[h].style.closed=!1:e[h]=this.createStyleElement(t[h],a,i),t[h]._render&&s.appendChild(e[h].style.pElem),y.push(e[h].style);else if("gr"==t[h].ty){if(c)for(p=e[h].it.length,l=0;l<p;l+=1)e[h].prevViewData[l]=e[h].it[l];else e[h]=this.createGroupElement(t[h]);this.searchShapes(t[h].it,e[h].it,e[h].prevViewData,e[h].gr,i,a+1,d,o),t[h]._render&&s.appendChild(e[h].gr)}else"tr"==t[h].ty?(c||(e[h]=this.create_af(t[h],i)),m=e[h].transform,d.push(m)):"sh"==t[h].ty||"rc"==t[h].ty||"el"==t[h].ty||"sr"==t[h].ty?(c||(e[h]=this.createShapeElement(t[h],d,a,i)),this.setElementStyles(e[h])):"tm"==t[h].ty||"rd"==t[h].ty||"ms"==t[h].ty?(c?(f=e[h],f.closed=!1):(f=_as.getModifier(t[h].ty),f.init(this,t[h],i),e[h]=f,this.shapeModifiers.push(f)),g.push(f)):"rp"==t[h].ty&&(c?(f=e[h],f.closed=!0):(f=_as.getModifier(t[h].ty),e[h]=f,f.init(this,t,h,e,i),this.shapeModifiers.push(f),o=!1),g.push(f));this.addProcessedElement(t[h],h+1)}for(u=y.length,h=0;h<u;h+=1)y[h].closed=!0;for(u=g.length,h=0;h<u;h+=1)g[h].closed=!0},_f.prototype.addShapeToModifiers=function(t){var e,r=this.shapeModifiers.length;for(e=0;e<r;e+=1)this.shapeModifiers[e].addShape(t)},_f.prototype.renderModifiers=function(){if(this.shapeModifiers.length){var t,e=this.shapes.length;for(t=0;t<e;t+=1)this.shapes[t].reset();for(e=this.shapeModifiers.length,t=e-1;t>=0;t-=1)this.shapeModifiers[t].processShapes(this.firstFrame)}},_f.prototype._az=function(t){this.prepareRenderableFrame(t),this.prepareProperties(t,this.isInRange)},_f.prototype.renderInnerContent=function(){this.renderModifiers();var t,e=this.stylesList.length;for(t=0;t<e;t+=1)this.stylesList[t].reset();for(this.renderShape(this.shapesData,this.itemsData,null),t=0;t<e;t+=1)(this.stylesList[t].mdf||this.firstFrame)&&(this.stylesList[t].msElem&&(this.stylesList[t].msElem.setAttribute("d",this.stylesList[t].d),this.stylesList[t].d="M0 0"+this.stylesList[t].d),this.stylesList[t].pElem.setAttribute("d",this.stylesList[t].d||"M0 0"))},_f.prototype.renderShape=function(t,e,r){var s,i,a=t.length-1;for(s=0;s<=a;s+=1)i=t[s].ty,"tr"==i?((this.firstFrame||e[s].transform.op.mdf&&r)&&r.setAttribute("opacity",e[s].transform.op.v),(this.firstFrame||e[s].transform.mProps.mdf&&r)&&r.setAttribute("transform",e[s].transform.mProps.v.to2dCSS())):!t[s]._render||"sh"!=i&&"el"!=i&&"rc"!=i&&"sr"!=i?"fl"==i?this.renderFill(t[s],e[s]):"gf"==i?this.renderGradient(t[s],e[s]):"gs"==i?(this.renderGradient(t[s],e[s]),this.renderStroke(t[s],e[s])):"st"==i?this.renderStroke(t[s],e[s]):"gr"==i&&this.renderShape(t[s].it,e[s].it,e[s].gr):this.renderPath(e[s])},_f.prototype.buildShapeString=function(t,e,r,s){var i,a="";for(i=1;i<e;i+=1)1===i&&(a+=" M"+s.applyToPointStringified(t.v[0][0],t.v[0][1])),a+=" C"+s.applyToPointStringified(t.o[i-1][0],t.o[i-1][1])+" "+s.applyToPointStringified(t.i[i][0],t.i[i][1])+" "+s.applyToPointStringified(t.v[i][0],t.v[i][1]);return 1===e&&(a+=" M"+s.applyToPointStringified(t.v[0][0],t.v[0][1])),r&&e&&(a+=" C"+s.applyToPointStringified(t.o[i-1][0],t.o[i-1][1])+" "+s.applyToPointStringified(t.i[0][0],t.i[0][1])+" "+s.applyToPointStringified(t.v[0][0],t.v[0][1]),a+="z"),a},_f.prototype.renderPath=function(t){var e,r,s,i,a,n,o,h,l,p,m,f=t.styles.length,c=t.lvl;for(n=0;n<f;n+=1){if(i=t.sh.mdf||this.firstFrame,t.styles[n].lvl<c)for(h=this.mHelper.reset(),p=c-t.styles[n].lvl,m=t.transformers.length-1;p>0;)i=t.transformers[m].mProps.mdf||i,l=t.transformers[m].mProps.v.props,h.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]),p--,m--;else h=this.identityMatrix;if(o=t.sh.paths,r=o._length,i){for(s="",e=0;e<r;e+=1)a=o.shapes[e],a&&a._length&&(s+=this.buildShapeString(a,a._length,a.c,h));t.caches[n]=s}else s=t.caches[n];t.styles[n].d+=s,t.styles[n].mdf=i||t.styles[n].mdf}},_f.prototype.renderFill=function(t,e){var r=e.style;(e.c.mdf||this.firstFrame)&&r.pElem.setAttribute("fill","rgb("+bm_floor(e.c.v[0])+","+bm_floor(e.c.v[1])+","+bm_floor(e.c.v[2])+")"),(e.o.mdf||this.firstFrame)&&r.pElem.setAttribute("fill-opacity",e.o.v)},_f.prototype.renderGradient=function(t,e){var r=e.gf,s=e.g._hasOpacity,i=e.s.v,a=e.e.v;if(e.o.mdf||this.firstFrame){var n="gf"===t.ty?"fill-opacity":"stroke-opacity";e.style.pElem.setAttribute(n,e.o.v)}if(e.s.mdf||this.firstFrame){var o=1===t.t?"x1":"cx",h="x1"===o?"y1":"cy";r.setAttribute(o,i[0]),r.setAttribute(h,i[1]),s&&!e.g._collapsable&&(e.of.setAttribute(o,i[0]),e.of.setAttribute(h,i[1]))}var l,p,m,f;if(e.g.cmdf||this.firstFrame){l=e.cst;var c=e.g.c;for(m=l.length,p=0;p<m;p+=1)f=l[p],f.setAttribute("offset",c[4*p]+"%"),f.setAttribute("stop-color","rgb("+c[4*p+1]+","+c[4*p+2]+","+c[4*p+3]+")")}if(s&&(e.g.omdf||this.firstFrame)){var d=e.g.o;for(l=e.g._collapsable?e.cst:e.ost,m=l.length,p=0;p<m;p+=1)f=l[p],e.g._collapsable||f.setAttribute("offset",d[2*p]+"%"),f.setAttribute("stop-opacity",d[2*p+1])}if(1===t.t)(e.e.mdf||this.firstFrame)&&(r.setAttribute("x2",a[0]),r.setAttribute("y2",a[1]),s&&!e.g._collapsable&&(e.of.setAttribute("x2",a[0]),e.of.setAttribute("y2",a[1])));else{var u;if((e.s.mdf||e.e.mdf||this.firstFrame)&&(u=Math.sqrt(Math.pow(i[0]-a[0],2)+Math.pow(i[1]-a[1],2)),r.setAttribute("r",u),s&&!e.g._collapsable&&e.of.setAttribute("r",u)),e.e.mdf||e.h.mdf||e.a.mdf||this.firstFrame){u||(u=Math.sqrt(Math.pow(i[0]-a[0],2)+Math.pow(i[1]-a[1],2)));var y=Math.atan2(a[1]-i[1],a[0]-i[0]),g=e.h.v>=1?.99:e.h.v<=-1?-.99:e.h.v,v=u*g,b=Math.cos(y+e.a.v)*v+i[0],E=Math.sin(y+e.a.v)*v+i[1];r.setAttribute("fx",b),r.setAttribute("fy",E),s&&!e.g._collapsable&&(e.of.setAttribute("fx",b),e.of.setAttribute("fy",E))}}},_f.prototype.renderStroke=function(t,e){var r=e.style,s=e.d;s&&(s.mdf||this.firstFrame)&&(r.pElem.setAttribute("stroke-dasharray",s.dashStr),r.pElem.setAttribute("stroke-dashoffset",s.dashoffset[0])),e.c&&(e.c.mdf||this.firstFrame)&&r.pElem.setAttribute("stroke","rgb("+bm_floor(e.c.v[0])+","+bm_floor(e.c.v[1])+","+bm_floor(e.c.v[2])+")"),(e.o.mdf||this.firstFrame)&&r.pElem.setAttribute("stroke-opacity",e.o.v),(e.w.mdf||this.firstFrame)&&(r.pElem.setAttribute("stroke-width",e.w.v),r.msElem&&r.msElem.setAttribute("stroke-width",e.w.v))},_f.prototype.destroy=function(){this.destroy_e(),this.shapeData=null,this.itemsData=null},_k.prototype.initElement=function(t,e,r){this.lettersChangedFlag=!0,this.initFrame(),this.initBaseData(t,e,r),this.textAnimator=new _bl(t.t,this.renderType,this),this.textProperty=new _ar(this,t.t,this.dynamicProperties),this.initTransform(t,e,r),this.initHierarchy(),this.initRenderable(),this.initRendererElement(),this.createContainerElements(),this.addMasks(),this.createContent(),this.textAnimator.searchProperties(this.dynamicProperties)},_k.prototype._az=function(t){this.prepareRenderableFrame(t),this.prepareProperties(t,this.isInRange),(this.textProperty.mdf||this.textProperty.firstFrame)&&(this.buildNewText(),this.textProperty.firstFrame=!1)},_k.prototype.createPathShape=function(t,e){var r,s,i=e.length,a="";for(r=0;r<i;r+=1)s=e[r].ks.k,a+=this.buildShapeString(s,s.i.length,!0,t);return a},_k.prototype.updateDocumentData=function(t,e){this.textProperty.updateDocumentData(t,e)},_k.prototype.applyTextPropertiesToMatrix=function(t,e,r,s,i){switch(t.ps&&e.translate(t.ps[0],t.ps[1]+t.ascent,0),e.translate(0,-t.ls,0),t.j){case 1:e.translate(t.justifyOffset+(t.boxWidth-t.lineWidths[r]),0,0);break;case 2:e.translate(t.justifyOffset+(t.boxWidth-t.lineWidths[r])/2,0,0)}e.translate(s,i,0)},_k.prototype.buildColor=function(t){return"rgb("+Math.round(255*t[0])+","+Math.round(255*t[1])+","+Math.round(255*t[2])+")"},_k.prototype.buildShapeString=_f.prototype.buildShapeString,_k.prototype.emptyProp=new LetterProps,_k.prototype.destroy=function(){},extendPrototype([_e,_af,_ad,_ac,RenderableDOMElement],_g),_g.prototype.initElement=function(t,e,r){this.initFrame(),this.initBaseData(t,e,r),this.initTransform(t,e,r),this.initRenderable(),this.initHierarchy(),this.initRendererElement(),this.createContainerElements(),this.addMasks(),!this.data.xt&&e.progressiveLoad||this.buildAllItems(),this.hide()},_g.prototype._az=function(t){if(this.prepareRenderableFrame(t),this.prepareProperties(t,this.isInRange),this.isInRange||this.data.xt){if(this.tm._placeholder)this.renderedFrame=t/this.data.sr;else{var e=this.tm.v;e===this.data.op&&(e=this.data.op-1),this.renderedFrame=e}var r,s=this._br.length;for(this.completeLayers||this.checkLayers(this.renderedFrame),r=0;r<s;r+=1)(this.completeLayers||this._br[r])&&this._br[r]._az(this.renderedFrame-this.layers[r].st)}},_g.prototype.renderInnerContent=function(){var t,e=this.layers.length;for(t=0;t<e;t+=1)(this.completeLayers||this._br[t])&&this._br[t]._ba()},_g.prototype.setElements=function(t){this._br=t},_g.prototype.getElements=function(){return this._br},_g.prototype.destroyElements=function(){var t,e=this.layers.length;for(t=0;t<e;t+=1)this._br[t]&&this._br[t].destroy()},_g.prototype.destroy=function(){this.destroyElements(),this.destroy_e()},extendPrototype([_e,_af,_d,_ad,_ac,RenderableDOMElement],_h),_h.prototype.createContent=function(){var t=this._x.getAssetsPath(this.assetData);this._cc=createNS("image"),this._cc.setAttribute("width",this.assetData.w+"px"),this._cc.setAttribute("height",this.assetData.h+"px"),this._cc.setAttribute("preserveAspectRatio","xMidYMid slice"),this._cc.setAttributeNS("http://www.w3.org/1999/xlink","href",t),this._bx.appendChild(this._cc)},extendPrototype([_h],_j),_j.prototype.createContent=function(){var t=createNS("rect");t.setAttribute("width",this.data.sw),t.setAttribute("height",this.data.sh),t.setAttribute("fill",this.data.sc),this._bx.appendChild(t)},extendPrototype([_ao,_g,_d],SVGCompElement),extendPrototype([_e,_af,_d,_ad,_ac,RenderableDOMElement,_k],SVGTextElement),SVGTextElement.prototype.createContent=function(){this.data.ln&&this._bx.setAttribute("id",this.data.ln),this.data.cl&&this._bx.setAttribute("class",this.data.cl),this.data.singleShape&&!this._x.fontManager.chars&&(this.textContainer=createNS("text"))},SVGTextElement.prototype.buildNewText=function(){var t,e,r=this.textProperty.currentData;this._bt=Array.apply(null,{length:r?r.l.length:0}),r.fc?this._bx.setAttribute("fill",this.buildColor(r.fc)):this._bx.setAttribute("fill","rgba(0,0,0,0)"),r.sc&&(this._bx.setAttribute("stroke",this.buildColor(r.sc)),this._bx.setAttribute("stroke-width",r.sw)),this._bx.setAttribute("font-size",r.s);var s=this._x.fontManager.getFontByName(r.f);if(s.fClass)this._bx.setAttribute("class",s.fClass);else{this._bx.setAttribute("font-family",s.fFamily);var i=r.fWeight,a=r.fStyle;this._bx.setAttribute("font-style",a),this._bx.setAttribute("font-weight",i)}var n=r.l||[],o=this._x.fontManager.chars;if(e=n.length){var h,l,p=this.mHelper,m="",f=this.data.singleShape,c=0,d=0,u=!0,y=r.tr/1e3*r.s;if(f&&!o){var g=this.textContainer,v="";switch(r.j){case 1:v="end";break;case 2:v="middle";break;case 2:v="start"}g.setAttribute("text-anchor",v),g.setAttribute("letter-spacing",y);var b=r.t.split(String.fromCharCode(13));e=b.length;var d=r.ps?r.ps[1]+r.ascent:0;for(t=0;t<e;t+=1)h=this.textSpans[t]||createNS("tspan"),h.textContent=b[t],h.setAttribute("x",0),h.setAttribute("y",d),h.style.display="inherit",g.appendChild(h),this.textSpans[t]=h,d+=r.lh;this._bx.appendChild(g)}else{var E,P,x=this.textSpans.length;for(t=0;t<e;t+=1)o&&f&&0!==t||(h=x>t?this.textSpans[t]:createNS(o?"path":"text"),x<=t&&(h.setAttribute("stroke-linecap","butt"),h.setAttribute("stroke-linejoin","round"),h.setAttribute("stroke-miterlimit","4"),this.textSpans[t]=h,this._bx.appendChild(h)),h.style.display="inherit"),p.reset(),o?(p.scale(r.s/100,r.s/100),f&&(n[t].n&&(c=-y,d+=r.yOffset,d+=u?1:0,u=!1),this.applyTextPropertiesToMatrix(r,p,n[t].line,c,d),c+=n[t].l||0,c+=y),P=this._x.fontManager.getCharData(r.t.charAt(t),s.fStyle,this._x.fontManager.getFontByName(r.f).fFamily),E=P&&P.data||{},l=E.shapes?E.shapes[0].it:[],f?m+=this.createPathShape(p,l):h.setAttribute("d",this.createPathShape(p,l))):(h.textContent=n[t].val,h.setAttributeNS("http://www.w3.org/XML/1998/namespace","xml:space","preserve"));f&&h.setAttribute("d",m)}for(;t<this.textSpans.length;)this.textSpans[t].style.display="none",t+=1;this._sizeChanged=!0}},SVGTextElement.prototype.sourceRectAtTime=function(t){if(this._az(this.comp.renderedFrame-this.data.st),this.renderInnerContent(),this._sizeChanged){this._sizeChanged=!1;var e=this._bx.getBBox();this.bbox={top:e.y,left:e.x,width:e.width,height:e.height}}return this.bbox},SVGTextElement.prototype.renderInnerContent=function(){if(!this.data.singleShape&&(this.textAnimator.getMeasures(this.textProperty.currentData,this.lettersChangedFlag),this.lettersChangedFlag||this.textAnimator.lettersChangedFlag)){this._sizeChanged=!0;var t,e,r=this.textAnimator._bt,s=this.textProperty.currentData.l;e=s.length;var i,a;for(t=0;t<e;t+=1)s[t].n||(i=r[t],a=this.textSpans[t],i.mdf.m&&a.setAttribute("transform",i.m),i.mdf.o&&a.setAttribute("opacity",i.o),i.mdf.sw&&a.setAttribute("stroke-width",i.sw),i.mdf.sc&&a.setAttribute("stroke",i.sc),i.mdf.fc&&a.setAttribute("fill",i.fc))}},_bb.prototype._ba=function(t){if(t||this.filterManager.mdf){var e=this.filterManager.effectElements[0].p.v,r=this.filterManager.effectElements[1].p.v,s=this.filterManager.effectElements[2].p.v/100;this.matrixFilter.setAttribute("values",r[0]-e[0]+" 0 0 0 "+e[0]+" "+(r[1]-e[1])+" 0 0 0 "+e[1]+" "+(r[2]-e[2])+" 0 0 0 "+e[2]+" 0 0 0 "+s+" 0")}},_bc.prototype._ba=function(t){if(t||this.filterManager.mdf){var e=this.filterManager.effectElements[2].p.v,r=this.filterManager.effectElements[6].p.v;this.matrixFilter.setAttribute("values","0 0 0 0 "+e[0]+" 0 0 0 0 "+e[1]+" 0 0 0 0 "+e[2]+" 0 0 0 "+r+" 0")}},_bd.prototype.initialize=function(){var t,e,r,s,i=this.elem._bx.children||this.elem._bx.childNodes;for(1===this.filterManager.effectElements[1].p.v?(s=this.elem.maskManager.masksProperties.length,r=0):(r=this.filterManager.effectElements[0].p.v-1,s=r+1),e=createNS("g"),e.setAttribute("fill","none"),e.setAttribute("stroke-linecap","round"),e.setAttribute("stroke-dashoffset",1),r;r<s;r+=1)t=createNS("path"),e.appendChild(t),this.paths.push({p:t,m:r});if(3===this.filterManager.effectElements[10].p.v){var a=createNS("mask"),n="stms_"+randomString(10);a.setAttribute("id",n),a.setAttribute("mask-type","alpha"),a.appendChild(e),this.elem._x.defs.appendChild(a);var o=createNS("g");o.setAttribute("mask","url("+locationHref+"#"+n+")"),i[0]&&o.appendChild(i[0]),this.elem._bx.appendChild(o),this.masker=a,e.setAttribute("stroke","#fff")}else if(1===this.filterManager.effectElements[10].p.v||2===this.filterManager.effectElements[10].p.v){if(2===this.filterManager.effectElements[10].p.v)for(var i=this.elem._bx.children||this.elem._bx.childNodes;i.length;)this.elem._bx.removeChild(i[0]);this.elem._bx.appendChild(e),this.elem._bx.removeAttribute("mask"),e.setAttribute("stroke","#fff")}this.initialized=!0,this.pathMasker=e},_bd.prototype._ba=function(t){this.initialized||this.initialize();var e,r,s,i=this.paths.length;for(e=0;e<i;e+=1)if(r=this.elem.maskManager.viewData[this.paths[e].m],s=this.paths[e].p,(t||this.filterManager.mdf||r.prop.mdf)&&s.setAttribute("d",r.lastPath),t||this.filterManager.effectElements[9].p.mdf||this.filterManager.effectElements[4].p.mdf||this.filterManager.effectElements[7].p.mdf||this.filterManager.effectElements[8].p.mdf||r.prop.mdf){var a;if(0!==this.filterManager.effectElements[7].p.v||100!==this.filterManager.effectElements[8].p.v){var n=Math.min(this.filterManager.effectElements[7].p.v,this.filterManager.effectElements[8].p.v)/100,o=Math.max(this.filterManager.effectElements[7].p.v,this.filterManager.effectElements[8].p.v)/100,h=s.getTotalLength();a="0 0 0 "+h*n+" ";var l,p=h*(o-n),m=1+2*this.filterManager.effectElements[4].p.v*this.filterManager.effectElements[9].p.v/100,f=Math.floor(p/m);for(l=0;l<f;l+=1)a+="1 "+2*this.filterManager.effectElements[4].p.v*this.filterManager.effectElements[9].p.v/100+" ";a+="0 "+10*h+" 0 0"}else a="1 "+2*this.filterManager.effectElements[4].p.v*this.filterManager.effectElements[9].p.v/100;s.setAttribute("stroke-dasharray",a)}if((t||this.filterManager.effectElements[4].p.mdf)&&this.pathMasker.setAttribute("stroke-width",2*this.filterManager.effectElements[4].p.v),(t||this.filterManager.effectElements[6].p.mdf)&&this.pathMasker.setAttribute("opacity",this.filterManager.effectElements[6].p.v),(1===this.filterManager.effectElements[10].p.v||2===this.filterManager.effectElements[10].p.v)&&(t||this.filterManager.effectElements[3].p.mdf)){var c=this.filterManager.effectElements[3].p.v;this.pathMasker.setAttribute("stroke","rgb("+bm_floor(255*c[0])+","+bm_floor(255*c[1])+","+bm_floor(255*c[2])+")")}},_be.prototype._ba=function(t){if(t||this.filterManager.mdf){var e=this.filterManager.effectElements[0].p.v,r=this.filterManager.effectElements[1].p.v,s=this.filterManager.effectElements[2].p.v,i=s[0]+" "+r[0]+" "+e[0],a=s[1]+" "+r[1]+" "+e[1],n=s[2]+" "+r[2]+" "+e[2];this.feFuncR.setAttribute("tableValues",i),this.feFuncG.setAttribute("tableValues",a),this.feFuncB.setAttribute("tableValues",n)}},_bf.prototype.createFeFunc=function(t,e){var r=createNS(t);return r.setAttribute("type","table"),e.appendChild(r),r},_bf.prototype.getTableValue=function(t,e,r,s,i){for(var a,n,o=0,h=256,l=Math.min(t,e),p=Math.max(t,e),m=Array.call(null,{length:h}),f=0,c=i-s,d=e-t;o<=256;)a=o/256,n=a<=l?d<0?i:s:a>=p?d<0?s:i:s+c*Math.pow((a-t)/d,1/r),m[f++]=n,o+=256/(h-1);return m.join(" ")},_bf.prototype._ba=function(t){if(t||this.filterManager.mdf){var e,r=this.filterManager.effectElements;this.feFuncRComposed&&(t||r[3].p.mdf||r[4].p.mdf||r[5].p.mdf||r[6].p.mdf||r[7].p.mdf)&&(e=this.getTableValue(r[3].p.v,r[4].p.v,r[5].p.v,r[6].p.v,r[7].p.v),this.feFuncRComposed.setAttribute("tableValues",e),this.feFuncGComposed.setAttribute("tableValues",e),this.feFuncBComposed.setAttribute("tableValues",e)),this.feFuncR&&(t||r[10].p.mdf||r[11].p.mdf||r[12].p.mdf||r[13].p.mdf||r[14].p.mdf)&&(e=this.getTableValue(r[10].p.v,r[11].p.v,r[12].p.v,r[13].p.v,r[14].p.v),this.feFuncR.setAttribute("tableValues",e)),this.feFuncG&&(t||r[17].p.mdf||r[18].p.mdf||r[19].p.mdf||r[20].p.mdf||r[21].p.mdf)&&(e=this.getTableValue(r[17].p.v,r[18].p.v,r[19].p.v,r[20].p.v,r[21].p.v),this.feFuncG.setAttribute("tableValues",e)),this.feFuncB&&(t||r[24].p.mdf||r[25].p.mdf||r[26].p.mdf||r[27].p.mdf||r[28].p.mdf)&&(e=this.getTableValue(r[24].p.v,r[25].p.v,r[26].p.v,r[27].p.v,r[28].p.v),this.feFuncB.setAttribute("tableValues",e)),this.feFuncA&&(t||r[31].p.mdf||r[32].p.mdf||r[33].p.mdf||r[34].p.mdf||r[35].p.mdf)&&(e=this.getTableValue(r[31].p.v,r[32].p.v,r[33].p.v,r[34].p.v,r[35].p.v),this.feFuncA.setAttribute("tableValues",e))}},_bg.prototype._ba=function(t){if(t||this.filterManager.mdf){if((t||this.filterManager.effectElements[4].p.mdf)&&this.feGaussianBlur.setAttribute("stdDeviation",this.filterManager.effectElements[4].p.v/4),t||this.filterManager.effectElements[0].p.mdf){var e=this.filterManager.effectElements[0].p.v;this.feFlood.setAttribute("flood-color",rgbToHex(Math.round(255*e[0]),Math.round(255*e[1]),Math.round(255*e[2])))}if((t||this.filterManager.effectElements[1].p.mdf)&&this.feFlood.setAttribute("flood-opacity",this.filterManager.effectElements[1].p.v/255),t||this.filterManager.effectElements[2].p.mdf||this.filterManager.effectElements[3].p.mdf){var r=this.filterManager.effectElements[3].p.v,s=(this.filterManager.effectElements[2].p.v-90)*degToRads,i=r*Math.cos(s),a=r*Math.sin(s);this.feOffset.setAttribute("dx",i),this.feOffset.setAttribute("dy",a)}}};var _svgMatteSymbols=[],_svgMatteMaskCounter=0;_bh.prototype.findSymbol=function(t){for(var e=0,r=_svgMatteSymbols.length;e<r;){if(_svgMatteSymbols[e]===t)return _svgMatteSymbols[e];e+=1}return null},_bh.prototype.replaceInParent=function(t,e){var r=t._bx.parentNode;if(r){for(var s=r.children,i=0,a=s.length;i<a&&s[i]!==t._bx;)i+=1;var n;i<=a-2&&(n=s[i+1]);var o=createNS("use");o.setAttribute("href","#"+e),n?r.insertBefore(o,n):r.appendChild(o)}},_bh.prototype.setElementAsMask=function(t,e){if(!this.findSymbol(e)){var r="matte_"+randomString(5)+"_"+_svgMatteMaskCounter++,s=createNS("mask");s.setAttribute("id",e.layerId),s.setAttribute("mask-type","alpha"),_svgMatteSymbols.push(e);var i=t._x.defs;i.appendChild(s);var a=createNS("symbol");a.setAttribute("id",r),this.replaceInParent(e,r),a.appendChild(e._bx),i.appendChild(a),useElem=createNS("use"),useElem.setAttribute("href","#"+r),s.appendChild(useElem),e.data.hd=!1,e.show()}t.setMatte(e.layerId)},_bh.prototype.initialize=function(){for(var t=this.filterManager.effectElements[0].p.v,e=0,r=this.elem.comp._br.length;e<r;)this.elem.comp._br[e].data.ind===t&&this.setElementAsMask(this.elem,this.elem.comp._br[e]),e+=1;this.initialized=!0},_bh.prototype._ba=function(){this.initialized||this.initialize()},_bi.prototype._ba=function(t){var e,r=this.filters.length;for(e=0;e<r;e+=1)this.filters[e]._ba(t)},_n.prototype.duplicate=function(){var t=2*this._length,e=this.savedOp;this.savedOp=createTypedArray("float32",t),this.savedOp.set(e);var r=0;for(r=this._length;r<t;r+=1)this.saved[r]=createTypedArray("float32",16);this._length=t},_n.prototype.reset=function(){this.cArrPos=0,this.cTr.reset(),this.cO=1},_c.prototype.createElements=function(){this.checkParenting()},_c.prototype.initRendererElement=function(){},_c.prototype.createContainerElements=function(){this.canvasContext=this._x.canvasContext,this.effectsManager=new _o(this)},_c.prototype.createContent=function(){},_c.prototype.setBlendMode=function(){var t=this._x;if(t.blendMode!==this.data.bm){t.blendMode=this.data.bm;var e=this.getBlendMode();t.canvasContext.globalCompositeOperation=e}},_c.prototype.addMasks=function(){this.maskManager=new _q(this.data,this,this._x)},_c.prototype.hideElement=function(){this.hidden||this.isInRange&&!this.isTransparent||(this.hidden=!0)},_c.prototype.showElement=function(){this.isInRange&&!this.isTransparent&&(this.hidden=!1,this.firstFrame=!0,this.maskManager.firstFrame=!0)},_c.prototype._ba=function(){this.hidden||(this.renderTransform(),this.renderRenderable(),this.setBlendMode(),this._x.renderer.save(),this._x.renderer.ctxTransform(this.finalTransform.mat.props),this._x.renderer.ctxOpacity(this.finalTransform.mProp.o.v),this.renderInnerContent(),this._x.renderer.restore(),this.maskManager.hasMasks&&this._x.renderer.restore(!0),this.firstFrame&&(this.firstFrame=!1))},_c.prototype.hide=_c.prototype.hideElement,_c.prototype.show=_c.prototype.showElement,_c.prototype.destroy=function(){this.canvasContext=null,this.data=null,this._x=null,this.maskManager.destroy()},_c.prototype.mHelper=new Matrix,extendPrototype([_e,_af,_c,_ad,_ac,_ae],_p),_p.prototype.initElement=_f.prototype.initElement,_p.prototype._az=_h.prototype._az,_p.prototype.imageLoaded=function(){if(this._x.elementLoaded(),this.assetData.w!==this.img.width||this.assetData.h!==this.img.height){var t=createTag("canvas");t.width=this.assetData.w,t.height=this.assetData.h;var e,r,s=t.getContext("2d"),i=this.img.width,a=this.img.height,n=i/a,o=this.assetData.w/this.assetData.h;n>o?(r=a,e=r*o):(e=i,r=e/o),s.drawImage(this.img,(i-e)/2,(a-r)/2,e,r,0,0,this.assetData.w,this.assetData.h),this.img=t}},_p.prototype.imageFailed=function(){this.failed=!0,this._x.elementLoaded()},_p.prototype.createContent=function(){var t=this.img;t.addEventListener("load",this.imageLoaded.bind(this),!1),t.addEventListener("error",this.imageFailed.bind(this),!1);var e=this._x.getAssetsPath(this.assetData);
-t.src=e},_p.prototype.renderInnerContent=function(t){this.failed||this.canvasContext.drawImage(this.img,0,0)},_p.prototype.destroy=function(){this.img=null,this.destroy_e()},extendPrototype([_aq,_g,_c],_m),_m.prototype.renderInnerContent=function(){var t,e=this.layers.length;for(t=e-1;t>=0;t-=1)(this.completeLayers||this._br[t])&&this._br[t]._ba()},_m.prototype.destroy=function(){var t,e=this.layers.length;for(t=e-1;t>=0;t-=1)this._br[t].destroy();this.layers=null,this._br=null},_q.prototype._az=function(t){var e,r=this.dynamicProperties.length;for(e=0;e<r;e+=1)this.dynamicProperties[e].getValue(t),this.dynamicProperties[e].mdf&&(this.element._x.mdf=!0)},_q.prototype._ba=function(t){if(this.hasMasks){var e,r,s,i,a,n=this.element.canvasContext,o=this.masksProperties.length;for(n.beginPath(),e=0;e<o;e++)if("n"!==this.masksProperties[e].mode){this.masksProperties[e].inv&&(n.moveTo(0,0),n.lineTo(this.element._x.compWidth,0),n.lineTo(this.element._x.compWidth,this.element._x.compHeight),n.lineTo(0,this.element._x.compHeight),n.lineTo(0,0)),a=this.viewData[e].v,r=t?t.applyToPointArray(a.v[0][0],a.v[0][1],0):a.v[0],n.moveTo(r[0],r[1]);var h,l=a._length;for(h=1;h<l;h++)r=t?t.applyToPointArray(a.o[h-1][0],a.o[h-1][1],0):a.o[h-1],s=t?t.applyToPointArray(a.i[h][0],a.i[h][1],0):a.i[h],i=t?t.applyToPointArray(a.v[h][0],a.v[h][1],0):a.v[h],n.bezierCurveTo(r[0],r[1],s[0],s[1],i[0],i[1]);r=t?t.applyToPointArray(a.o[h-1][0],a.o[h-1][1],0):a.o[h-1],s=t?t.applyToPointArray(a.i[0][0],a.i[0][1],0):a.i[0],i=t?t.applyToPointArray(a.v[0][0],a.v[0][1],0):a.v[0],n.bezierCurveTo(r[0],r[1],s[0],s[1],i[0],i[1])}this.element._x.renderer.save(!0),n.clip()}},_q.prototype.getMaskProperty=_ay.prototype.getMaskProperty,_q.prototype.destroy=function(){this.element=null},extendPrototype([_e,_af,_c,_ad,_ac,_ae],_r),_r.prototype.initElement=function(t,e,r){this.initFrame(),this.initBaseData(t,e,r),this.initTransform(t,e,r),this.initHierarchy(),this.initRenderable(),this.initRendererElement(),this.createContainerElements(),this.addMasks(),this.createContent(),this.hide()},_r.prototype.transformHelper={opacity:1,mat:new Matrix,matMdf:!1,opMdf:!1},_r.prototype.dashResetter=[],_r.prototype.createContent=function(){this.searchShapes(this.shapesData,this.itemsData,this.prevViewData,this.dynamicProperties,!0)},_r.prototype.createStyleElement=function(t,e){var r={data:t,type:t.ty,_br:[]},s={};if("fl"!=t.ty&&"st"!=t.ty||(s.c=_ai._bo(this,t.c,1,255,e),s.c.k||(r.co="rgb("+bm_floor(s.c.v[0])+","+bm_floor(s.c.v[1])+","+bm_floor(s.c.v[2])+")")),s.o=_ai._bo(this,t.o,0,.01,e),"st"==t.ty){if(r.lc=this.lcEnum[t.lc]||"round",r.lj=this.ljEnum[t.lj]||"round",1==t.lj&&(r.ml=t.ml),s.w=_ai._bo(this,t.w,0,null,e),s.w.k||(r.wi=s.w.v),t.d){var i=new DashProperty(this,t.d,"canvas",e);s.d=i,s.d.k||(r.da=s.d.dashArray,r["do"]=s.d.dashoffset[0])}}else r.r=2===t.r?"evenodd":"nonzero";return this.stylesList.push(r),s.style=r,s},_r.prototype.createGroupElement=function(t){var e={it:[],prevViewData:[]};return e},_r.prototype.create_af=function(t,e){var r={transform:{mat:new Matrix,opacity:1,matMdf:!1,opMdf:!1,op:_ai._bo(this,t.o,0,.01,e),mProps:_ag._bj(this,t,e)},_br:[]};return r},_r.prototype.createShapeElement=function(t,e){var r={nodes:[],trNodes:[],tr:[0,0,0,0,0,0]},s=4;"rc"==t.ty?s=5:"el"==t.ty?s=6:"sr"==t.ty&&(s=7),r.sh=_ah._bp(this,t,s,e),this.shapes.push(r.sh),this.addShapeToModifiers(r);var i,a=this.stylesList.length,n=!1,o=!1;for(i=0;i<a;i+=1)this.stylesList[i].closed||(this.stylesList[i]._br.push(r),"st"===this.stylesList[i].type?n=!0:o=!0);return r.st=n,r.fl=o,r},_r.prototype.reloadShapes=function(){this.firstFrame=!0;var t,e=this.itemsData.length;for(t=0;t<e;t+=1)this.prevViewData[t]=this.itemsData[t];this.searchShapes(this.shapesData,this.itemsData,this.prevViewData,this.dynamicProperties,!0);var t,e=this.dynamicProperties.length;for(t=0;t<e;t+=1)this.dynamicProperties[t].getValue();this.renderModifiers()},_r.prototype.searchShapes=function(t,e,r,s,i){var a,n,o,h,l=t.length-1,p=[],m=[];for(a=l;a>=0;a-=1){if(h=this.searchProcessedElement(t[a]),h?e[a]=r[h-1]:t[a]._render=i,"fl"==t[a].ty||"st"==t[a].ty)h?e[a].style.closed=!1:e[a]=this.createStyleElement(t[a],s),p.push(e[a].style);else if("gr"==t[a].ty){if(h)for(o=e[a].it.length,n=0;n<o;n+=1)e[a].prevViewData[n]=e[a].it[n];else e[a]=this.createGroupElement(t[a]);this.searchShapes(t[a].it,e[a].it,e[a].prevViewData,s,i)}else if("tr"==t[a].ty)h||(e[a]=this.create_af(t[a],s));else if("sh"==t[a].ty||"rc"==t[a].ty||"el"==t[a].ty||"sr"==t[a].ty)h||(e[a]=this.createShapeElement(t[a],s));else if("tm"==t[a].ty||"rd"==t[a].ty){if(h)f=e[a],f.closed=!1;else{var f=_as.getModifier(t[a].ty);f.init(this,t[a],s),e[a]=f,this.shapeModifiers.push(f)}m.push(f)}else"rp"==t[a].ty&&(h?(f=e[a],f.closed=!0):(f=_as.getModifier(t[a].ty),e[a]=f,f.init(this,t,a,e,s),this.shapeModifiers.push(f),i=!1),m.push(f));this.addProcessedElement(t[a],a+1)}for(l=p.length,a=0;a<l;a+=1)p[a].closed=!0;for(l=m.length,a=0;a<l;a+=1)m[a].closed=!0},_r.prototype.addShapeToModifiers=_f.prototype.addShapeToModifiers,_r.prototype.renderModifiers=_f.prototype.renderModifiers,_r.prototype.lcEnum=_f.prototype.lcEnum,_r.prototype.ljEnum=_f.prototype.ljEnum,_r.prototype.searchProcessedElement=_f.prototype.searchProcessedElement,_r.prototype.addProcessedElement=_f.prototype.addProcessedElement,_r.prototype._az=_f.prototype._az,_r.prototype.renderInnerContent=function(){this.transformHelper.mat.reset(),this.transformHelper.opacity=this.finalTransform.mProp.o.v,this.transformHelper.matMdf=!1,this.transformHelper.opMdf=this.finalTransform.opMdf,this.renderModifiers(),this.renderShape(this.transformHelper,null,null,!0)},_r.prototype.renderShape=function(t,e,r,s){var i,a;if(!e)for(e=this.shapesData,a=this.stylesList.length,i=0;i<a;i+=1)this.stylesList[i].d="",this.stylesList[i].mdf=!1;r||(r=this.itemsData),a=e.length-1;var n,o;for(n=t,i=a;i>=0;i-=1)if("tr"==e[i].ty){n=r[i].transform;var h=r[i].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*=r[i].transform.op.v,n.matMdf=!!t.matMdf||n.matMdf,n.opMdf=!!t.opMdf||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[i].ty||"el"==e[i].ty||"rc"==e[i].ty||"sr"==e[i].ty?this.renderPath(e[i],r[i],n):"fl"==e[i].ty?this.renderFill(e[i],r[i],n):"st"==e[i].ty?this.renderStroke(e[i],r[i],n):"gr"==e[i].ty?this.renderShape(n,e[i].it,r[i].it):"tm"==e[i].ty;if(s){a=this.stylesList.length;var p,m,f,c,d,u,y,g=this._x.renderer,v=this._x.canvasContext;for(i=0;i<a;i+=1)if(y=this.stylesList[i].type,("st"!==y||0!==this.stylesList[i].wi)&&this.stylesList[i].data._render){for(g.save(),d=this.stylesList[i]._br,"st"===y?(v.strokeStyle=this.stylesList[i].co,v.lineWidth=this.stylesList[i].wi,v.lineCap=this.stylesList[i].lc,v.lineJoin=this.stylesList[i].lj,v.miterLimit=this.stylesList[i].ml||0):v.fillStyle=this.stylesList[i].co,g.ctxOpacity(this.stylesList[i].coOp),"st"!==y&&v.beginPath(),m=d.length,p=0;p<m;p+=1){for("st"===y&&(v.beginPath(),this.stylesList[i].da?(v.setLineDash(this.stylesList[i].da),v.lineDashOffset=this.stylesList[i]["do"],this._x.isDashed=!0):this._x.isDashed&&(v.setLineDash(this.dashResetter),this._x.isDashed=!1)),u=d[p].trNodes,c=u.length,f=0;f<c;f+=1)"m"==u[f].t?v.moveTo(u[f].p[0],u[f].p[1]):"c"==u[f].t?v.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]):v.closePath();"st"===y&&v.stroke()}"st"!==y&&v.fill(this.stylesList[i].r),g.restore()}this.firstFrame&&(this.firstFrame=!1)}},_r.prototype.renderPath=function(t,e,r){var s,i,a,n,o=r.matMdf||e.sh.mdf||this.firstFrame;if(o){var h=e.sh.paths,l=r.mat;n=t._render===!1?0:h._length;var p=e.trNodes;for(p.length=0,a=0;a<n;a+=1){var m=h.shapes[a];if(m&&m.v){for(s=m._length,i=1;i<s;i+=1)1==i&&p.push({t:"m",p:l.applyToPointArray(m.v[0][0],m.v[0][1],0)}),p.push({t:"c",p1:l.applyToPointArray(m.o[i-1][0],m.o[i-1][1],0),p2:l.applyToPointArray(m.i[i][0],m.i[i][1],0),p3:l.applyToPointArray(m.v[i][0],m.v[i][1],0)});1==s&&p.push({t:"m",p:l.applyToPointArray(m.v[0][0],m.v[0][1],0)}),m.c&&s&&(p.push({t:"c",p1:l.applyToPointArray(m.o[i-1][0],m.o[i-1][1],0),p2:l.applyToPointArray(m.i[0][0],m.i[0][1],0),p3:l.applyToPointArray(m.v[0][0],m.v[0][1],0)}),p.push({t:"z"})),e.lStr=p}}if(e.st)for(i=0;i<16;i+=1)e.tr[i]=r.mat.props[i];e.trNodes=p}},_r.prototype.renderFill=function(t,e,r){var s=e.style;(e.c.mdf||this.firstFrame)&&(s.co="rgb("+bm_floor(e.c.v[0])+","+bm_floor(e.c.v[1])+","+bm_floor(e.c.v[2])+")"),(e.o.mdf||r.opMdf||this.firstFrame)&&(s.coOp=e.o.v*r.opacity)},_r.prototype.renderStroke=function(t,e,r){var s=e.style,i=e.d;i&&(i.mdf||this.firstFrame)&&(s.da=i.dashArray,s["do"]=i.dashoffset[0]),(e.c.mdf||this.firstFrame)&&(s.co="rgb("+bm_floor(e.c.v[0])+","+bm_floor(e.c.v[1])+","+bm_floor(e.c.v[2])+")"),(e.o.mdf||r.opMdf||this.firstFrame)&&(s.coOp=e.o.v*r.opacity),(e.w.mdf||this.firstFrame)&&(s.wi=e.w.v)},_r.prototype.destroy=function(){this.shapesData=null,this._x=null,this.canvasContext=null,this.stylesList.length=0,this.itemsData.length=0},extendPrototype([_e,_af,_c,_ad,_ac,_ae],_s),_s.prototype.initElement=_f.prototype.initElement,_s.prototype._az=_h.prototype._az,_s.prototype.renderInnerContent=function(){var t=this.canvasContext;t.fillStyle=this.data.sc,t.fillRect(0,0,this.data.sw,this.data.sh)},extendPrototype([_e,_af,_c,_ad,_ac,_ae,_k],_t),_t.prototype.tHelper=createTag("canvas").getContext("2d"),_t.prototype.buildNewText=function(){var t=this.textProperty.currentData;this._bt=Array.apply(null,{length:t.l?t.l.length:0});var e=!1;t.fc?(e=!0,this.values.fill=this.buildColor(t.fc)):this.values.fill="rgba(0,0,0,0)",this.fill=e;var r=!1;t.sc&&(r=!0,this.values.stroke=this.buildColor(t.sc),this.values.sWidth=t.sw);var s,i,a=this._x.fontManager.getFontByName(t.f),n=t.l,o=this.mHelper;this.stroke=r,this.values.fValue=t.s+"px "+this._x.fontManager.getFontByName(t.f).fFamily,i=t.t.length;var h,l,p,m,f,c,d,u,y,g,v=this.data.singleShape,b=t.tr/1e3*t.s,E=0,P=0,x=!0,S=0;for(s=0;s<i;s+=1){for(h=this._x.fontManager.getCharData(t.t.charAt(s),a.fStyle,this._x.fontManager.getFontByName(t.f).fFamily),l=h&&h.data||{},o.reset(),v&&n[s].n&&(E=-b,P+=t.yOffset,P+=x?1:0,x=!1),f=l.shapes?l.shapes[0].it:[],d=f.length,o.scale(t.s/100,t.s/100),v&&this.applyTextPropertiesToMatrix(t,o,n[s].line,E,P),y=Array.apply(null,{length:d}),c=0;c<d;c+=1){for(m=f[c].ks.k.i.length,u=f[c].ks.k,g=[],p=1;p<m;p+=1)1==p&&g.push(o.applyToX(u.v[0][0],u.v[0][1],0),o.applyToY(u.v[0][0],u.v[0][1],0)),g.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));g.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[c]=g}v&&(E+=n[s].l,E+=b),this.textSpans[S]?this.textSpans[S].elem=y:this.textSpans[S]={elem:y},S+=1}},_t.prototype.renderInnerContent=function(){var t=this.canvasContext;this.finalTransform.mat.props;t.font=this.values.fValue,t.lineCap="butt",t.lineJoin="miter",t.miterLimit=4,this.data.singleShape||this.textAnimator.getMeasures(this.textProperty.currentData,this.lettersChangedFlag);var e,r,s,i,a,n,o=this.textAnimator._bt,h=this.textProperty.currentData.l;r=h.length;var l,p,m,f=null,c=null,d=null;for(e=0;e<r;e+=1)if(!h[e].n){if(l=o[e],l&&(this._x.renderer.save(),this._x.renderer.ctxTransform(l.p),this._x.renderer.ctxOpacity(l.o)),this.fill){for(l&&l.fc?f!==l.fc&&(f=l.fc,t.fillStyle=l.fc):f!==this.values.fill&&(f=this.values.fill,t.fillStyle=this.values.fill),p=this.textSpans[e].elem,i=p.length,this._x.canvasContext.beginPath(),s=0;s<i;s+=1)for(m=p[s],n=m.length,this._x.canvasContext.moveTo(m[0],m[1]),a=2;a<n;a+=6)this._x.canvasContext.bezierCurveTo(m[a],m[a+1],m[a+2],m[a+3],m[a+4],m[a+5]);this._x.canvasContext.closePath(),this._x.canvasContext.fill()}if(this.stroke){for(l&&l.sw?d!==l.sw&&(d=l.sw,t.lineWidth=l.sw):d!==this.values.sWidth&&(d=this.values.sWidth,t.lineWidth=this.values.sWidth),l&&l.sc?c!==l.sc&&(c=l.sc,t.strokeStyle=l.sc):c!==this.values.stroke&&(c=this.values.stroke,t.strokeStyle=this.values.stroke),p=this.textSpans[e].elem,i=p.length,this._x.canvasContext.beginPath(),s=0;s<i;s+=1)for(m=p[s],n=m.length,this._x.canvasContext.moveTo(m[0],m[1]),a=2;a<n;a+=6)this._x.canvasContext.bezierCurveTo(m[a],m[a+1],m[a+2],m[a+3],m[a+4],m[a+5]);this._x.canvasContext.closePath(),this._x.canvasContext.stroke()}l&&this._x.renderer.restore()}},_o.prototype._ba=function(){},_b.prototype.checkBlendMode=function(){},_b.prototype.get_e=_d.prototype.get_e,_b.prototype.initRendererElement=function(){this._by=createTag("div"),this.data.hasMask?(this._cf=createNS("svg"),this._bx=createNS("g"),this._ca=this._bx,this._cf.appendChild(this._bx),this._by.appendChild(this._cf)):this._bx=this._by,styleDiv(this._by)},_b.prototype.createContainerElements=function(){this.effectsManager=new _o(this),this._bz=this._by,this._ca=this._bx,this.data.ln&&this._bx.setAttribute("id",this.data.ln),0!==this.data.bm&&this.setBlendMode(),this.checkParenting()},_b.prototype.renderElement=function(){this.finalTransform.matMdf&&(this._bz.style.transform=this._bz.style.webkitTransform=this.finalTransform.mat.toCSS()),this.finalTransform.opMdf&&(this._bz.style.opacity=this.finalTransform.mProp.o.v)},_b.prototype._ba=function(){this.data.hd||this.hidden||(this.renderTransform(),this.renderRenderable(),this.renderElement(),this.renderInnerContent(),this.firstFrame&&(this.firstFrame=!1))},_b.prototype.destroy=function(){this._bx=null,this._bz=null,this.matteElement&&(this.matteElement=null),this.maskManager&&(this.maskManager.destroy(),this.maskManager=null)},_b.prototype.getDomElement=function(){return this._bx},_b.prototype.addMasks=function(){this.maskManager=new _ay(this.data,this,this._x)},_b.prototype.setMatte=function(){},_b.prototype.buildElementParenting=_ap.prototype.buildElementParenting,extendPrototype([_e,_af,_b,_ad,_ac,RenderableDOMElement],_aa),_aa.prototype.createContent=function(){var t;this.data.hasMask?(t=createNS("rect"),t.setAttribute("width",this.data.sw),t.setAttribute("height",this.data.sh),t.setAttribute("fill",this.data.sc),this._cf.setAttribute("width",this.data.sw),this._cf.setAttribute("height",this.data.sh)):(t=createTag("div"),t.style.width=this.data.sw+"px",t.style.height=this.data.sh+"px",t.style.backgroundColor=this.data.sc),this._bx.appendChild(t)},extendPrototype([_ap,_g,_b],_w),_w.prototype.createContainerElements=function(){this.data.hasMask?(this._bz=this._bx,this._cf.setAttribute("width",this.data.w),this._cf.setAttribute("height",this.data.h)):this._bz=this._bx,this.effectsManager=new _o(this),this.checkParenting()},extendPrototype([_e,_af,_aa,_f,_b,_ad,_ac,_ae],_z),_z.prototype._renderShapeFrame=_z.prototype.renderInnerContent,_z.prototype.createContent=function(){var t;if(this.data.hasMask)this._bx.appendChild(this.shapesContainer),t=this._cf;else{t=createNS("svg");var e=this.comp.data?this.comp.data:this._x.compSize;t.setAttribute("width",e.w),t.setAttribute("height",e.h),t.appendChild(this.shapesContainer),this._bx.appendChild(t)}this.searchShapes(this.shapesData,this.itemsData,this.prevViewData,this.shapesContainer,this.dynamicProperties,0,[],!0),this.shapeCont=t},_z.prototype.renderInnerContent=function(){if(this._renderShapeFrame(),!this.hidden&&this.firstFrame){var t=this.shapeCont.getBBox(),e=!1;this._cg.w!==t.width&&(this._cg.w=t.width,this.shapeCont.setAttribute("width",t.width),e=!0),this._cg.h!==t.height&&(this._cg.h=t.height,this.shapeCont.setAttribute("height",t.height),e=!0),(e||this._cg.x!==t.x||this._cg.y!==t.y)&&(this._cg.w=t.width,this._cg.h=t.height,this._cg.x=t.x,this._cg.y=t.y,this.shapeCont.setAttribute("viewBox",this._cg.x+" "+this._cg.y+" "+this._cg.w+" "+this._cg.h),this.shapeCont.style.transform=this.shapeCont.style.webkitTransform="translate("+this._cg.x+"px,"+this._cg.y+"px)")}},extendPrototype([_e,_af,_b,_ad,_ac,RenderableDOMElement,_k],_ab),_ab.prototype.createContent=function(){if(this.isMasked=this.checkMasks(),this.isMasked){this.renderType="svg",this.compW=this.comp.data.w,this.compH=this.comp.data.h,this._cf.setAttribute("width",this.compW),this._cf.setAttribute("height",this.compH);var t=createNS("g");this._ca.appendChild(t),this._cc=t}else this.renderType="html",this._cc=this._bx;this.checkParenting()},_ab.prototype.buildNewText=function(){var t=this.textProperty.currentData;this._bt=Array.apply(null,{length:this.textProperty.currentData.l?this.textProperty.currentData.l.length:0});var e=this._cc.style;e.color=e.fill=t.fc?this.buildColor(t.fc):"rgba(0,0,0,0)",t.sc&&(e.stroke=this.buildColor(t.sc),e.strokeWidth=t.sw+"px");var r=this._x.fontManager.getFontByName(t.f);if(!this._x.fontManager.chars)if(e.fontSize=t.s+"px",e.lineHeight=t.s+"px",r.fClass)this._cc.className=r.fClass;else{e.fontFamily=r.fFamily;var s=t.fWeight,i=t.fStyle;e.fontStyle=i,e.fontWeight=s}var a,n,o=t.l;n=o.length;var h,l,p,m,f=this.mHelper,c="",d=0;for(a=0;a<n;a+=1){if(this._x.fontManager.chars?(this.textPaths[d]?h=this.textPaths[d]:(h=createNS("path"),h.setAttribute("stroke-linecap","butt"),h.setAttribute("stroke-linejoin","round"),h.setAttribute("stroke-miterlimit","4")),this.isMasked||(this.textSpans[d]?(l=this.textSpans[d],p=l.children[0]):(l=createTag("div"),p=createNS("svg"),p.appendChild(h),styleDiv(l)))):this.isMasked?h=this.textPaths[d]?this.textPaths[d]:createNS("text"):this.textSpans[d]?(l=this.textSpans[d],h=this.textPaths[d]):(l=createTag("span"),styleDiv(l),h=createTag("span"),styleDiv(h),l.appendChild(h)),this._x.fontManager.chars){var u,y=this._x.fontManager.getCharData(t.t.charAt(a),r.fStyle,this._x.fontManager.getFontByName(t.f).fFamily);if(u=y?y.data:null,f.reset(),u&&u.shapes&&(m=u.shapes[0].it,f.scale(t.s/100,t.s/100),c=this.createPathShape(f,m),h.setAttribute("d",c)),this.isMasked)this._cc.appendChild(h);else if(this._cc.appendChild(l),u&&u.shapes){var g=p.getBBox();p.setAttribute("width",g.width+2),p.setAttribute("height",g.height+2),p.setAttribute("viewBox",g.x-1+" "+(g.y-1)+" "+(g.width+2)+" "+(g.height+2)),p.style.transform=p.style.webkitTransform="translate("+(g.x-1)+"px,"+(g.y-1)+"px)",o[a].yOffset=g.y-1,l.appendChild(p)}else p.setAttribute("width",1),p.setAttribute("height",1)}else h.textContent=o[a].val,h.setAttributeNS("http://www.w3.org/XML/1998/namespace","xml:space","preserve"),this.isMasked?this._cc.appendChild(h):(this._cc.appendChild(l),h.style.transform=h.style.webkitTransform="translate3d(0,"+-t.s/1.2+"px,0)");this.isMasked?this.textSpans[d]=h:this.textSpans[d]=l,this.textSpans[d].style.display="block",this.textPaths[d]=h,d+=1}for(;d<this.textSpans.length;)this.textSpans[d].style.display="none",d+=1},_ab.prototype.renderInnerContent=function(){if(this.data.singleShape){if(!this.firstFrame&&!this.lettersChangedFlag)return;this.isMasked&&this.finalTransform.matMdf&&(this._cf.setAttribute("viewBox",-this.finalTransform.mProp.p.v[0]+" "+-this.finalTransform.mProp.p.v[1]+" "+this.compW+" "+this.compH),this._cf.style.transform=this._cf.style.webkitTransform="translate("+-this.finalTransform.mProp.p.v[0]+"px,"+-this.finalTransform.mProp.p.v[1]+"px)")}if(this.textAnimator.getMeasures(this.textProperty.currentData,this.lettersChangedFlag),this.lettersChangedFlag||this.textAnimator.lettersChangedFlag){var t,e,r=0,s=this.textAnimator._bt,i=this.textProperty.currentData.l;e=i.length;var a,n,o;for(t=0;t<e;t+=1)i[t].n?r+=1:(n=this.textSpans[t],o=this.textPaths[t],a=s[r],r+=1,this.isMasked?n.setAttribute("transform",a.m):n.style.transform=n.style.webkitTransform=a.m,n.style.opacity=a.o,a.sw&&o.setAttribute("stroke-width",a.sw),a.sc&&o.setAttribute("stroke",a.sc),a.fc&&(o.setAttribute("fill",a.fc),o.style.color=a.fc));if(this.isVisible&&this.firstFrame&&this._cc.getBBox){var h=this._cc.getBBox();this._cg.w!==h.width&&(this._cg.w=h.width,this._cf.setAttribute("width",h.width)),this._cg.h!==h.height&&(this._cg.h=h.height,this._cf.setAttribute("height",h.height));var l=1;this._cg.w===h.width+2*l&&this._cg.h===h.height+2*l&&this._cg.x===h.x-l&&this._cg.y===h.y-l||(this._cg.w=h.width+2*l,this._cg.h=h.height+2*l,this._cg.x=h.x-l,this._cg.y=h.y-l,this._cf.setAttribute("viewBox",this._cg.x+" "+this._cg.y+" "+this._cg.w+" "+this._cg.h),this._cf.style.transform=this._cf.style.webkitTransform="translate("+this._cg.x+"px,"+this._cg.y+"px)")}}},extendPrototype([_e,_af,_b,_aa,_ad,_ac,_ae],_y),_y.prototype.createContent=function(){var t=this._x.getAssetsPath(this.assetData),e=new Image;this.data.hasMask?(this.imageElem=createNS("image"),this.imageElem.setAttribute("width",this.assetData.w+"px"),this.imageElem.setAttribute("height",this.assetData.h+"px"),this.imageElem.setAttributeNS("http://www.w3.org/1999/xlink","href",t),this._bx.appendChild(this.imageElem),this._by.setAttribute("width",this.assetData.w),this._by.setAttribute("height",this.assetData.h)):this._bx.appendChild(e),e.src=t,this.data.ln&&this._cc.setAttribute("id",this.data.ln),this.checkParenting()},extendPrototype([_e,_ac],_v),_v.prototype.setup=function(){var t,e,r=this.comp.threeDElements.length;for(t=0;t<r;t+=1)e=this.comp.threeDElements[t],e.perspectiveElem.style.perspective=e.perspectiveElem.style.webkitPerspective=this.pe.v+"px",e.container.style.transformOrigin=e.container.style.mozTransformOrigin=e.container.style.webkitTransformOrigin="0px 0px 0px",e.perspectiveElem.style.transform=e.perspectiveElem.style.webkitTransform="matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1)"},_v.prototype.createElements=function(){},_v.prototype.hide=function(){},_v.prototype._ba=function(){var t,e,r=this.firstFrame;if(this.hierarchy)for(e=this.hierarchy.length,t=0;t<e;t+=1)r=!!this.hierarchy[t].finalTransform.mProp.mdf||r;if(r||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 s=[this.p.v[0]-this.a.v[0],this.p.v[1]-this.a.v[1],this.p.v[2]-this.a.v[2]],i=Math.sqrt(Math.pow(s[0],2)+Math.pow(s[1],2)+Math.pow(s[2],2)),a=[s[0]/i,s[1]/i,s[2]/i],n=Math.sqrt(a[2]*a[2]+a[0]*a[0]),o=Math.atan2(a[1],n),h=Math.atan2(a[0],-a[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._x.compSize.w/2,this._x.compSize.h/2,0),this.mat.translate(0,0,this.pe.v),this.hierarchy){var l;for(e=this.hierarchy.length,t=0;t<e;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])}if(!this._prevMat.equals(this.mat)){e=this.comp.threeDElements.length;var p;for(t=0;t<e;t+=1)p=this.comp.threeDElements[t],p.container.style.transform=p.container.style.webkitTransform=this.mat.toCSS();this.mat.clone(this._prevMat)}}this.firstFrame=!1},_v.prototype._az=function(t){this.prepareProperties(t,!0)},_v.prototype.destroy=function(){},_v.prototype.initExpressions=function(){},_v.prototype.get_e=function(){return null},_bv.prototype._ba=function(){};var animationManager=function(){function t(t){for(var e=0,r=t.target;e<S;)P[e].animation===r&&(P.splice(e,1),e-=1,S-=1,r.isPaused||s()),e+=1}function e(t,e){if(!t)return null;for(var r=0;r<S;){if(P[r].elem==t&&null!==P[r].elem)return P[r].animation;r+=1}var s=new _a;return i(s,t),s.setData(t,e),s}function r(){A+=1,b()}function s(){A-=1,0===A&&(C=!0)}function i(e,i){e.addEventListener("destroy",t),e.addEventListener("_active",r),e.addEventListener("_idle",s),P.push({elem:i,animation:e}),S+=1}function a(t){var e=new _a;return i(e,null),e.setParams(t),e}function n(t,e){var r;for(r=0;r<S;r+=1)P[r].animation.setSpeed(t,e)}function o(t,e){var r;for(r=0;r<S;r+=1)P[r].animation.setDirection(t,e)}function h(t){var e;for(e=0;e<S;e+=1)P[e].animation.play(t)}function l(t,e){x=Date.now();var r;for(r=0;r<S;r+=1)P[r].animation.moveFrame(t,e)}function p(t){var e,r=t-x;for(e=0;e<S;e+=1)P[e].animation.advanceTime(r);x=t,C?k=!0:window.requestAnimationFrame(p)}function m(t){x=t,window.requestAnimationFrame(p)}function f(t){var e;for(e=0;e<S;e+=1)P[e].animation.pause(t)}function c(t,e,r){var s;for(s=0;s<S;s+=1)P[s].animation.goToAndStop(t,e,r)}function d(t){var e;for(e=0;e<S;e+=1)P[e].animation.stop(t)}function u(t){var e;for(e=0;e<S;e+=1)P[e].animation.togglePause(t)}function y(t){var e;for(e=S-1;e>=0;e-=1)P[e].animation.destroy(t)}function g(t,r,s){var i,a=[].concat([].slice.call(document.getElementsByClassName("lottie")),[].slice.call(document.getElementsByClassName("bodymovin"))),n=a.length;for(i=0;i<n;i+=1)s&&a[i].setAttribute("data-bm-type",s),e(a[i],t);if(r&&0===n){s||(s="svg");var o=document.getElementsByTagName("body")[0];o.innerHTML="";var h=createTag("div");h.style.width="100%",h.style.height="100%",h.setAttribute("data-bm-type",s),o.appendChild(h),e(h,t)}}function v(){var t;for(t=0;t<S;t+=1)P[t].animation.resize()}function b(){C&&(C=!1,k&&(window.requestAnimationFrame(m),k=!1))}var E={},P=[],x=0,S=0,C=!0,A=0,k=!0;return E.registerAnimation=e,E.loadAnimation=a,E.setSpeed=n,E.setDirection=o,E.play=h,E.moveFrame=l,E.pause=f,E.stop=d,E.togglePause=u,E.searchAnimations=g,E.resize=v,E.goToAndStop=c,E.destroy=y,E}(),_a=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.animationData={},this.layers=[],this.assets=[],this.isPaused=!0,this.autoplay=!1,this.loop=!0,this.renderer=null,this.animationID=randomString(10),this.assetsPath="",this.timeCompleted=0,this.segmentPos=0,this.subframeEnabled=subframeEnabled,this.segments=[],this.pendingSegment=!1,this._idle=!0,this.projectInterface=ProjectInterface()};_a.prototype.setParams=function(t){var e=this;t.context&&(this.context=t.context),(t.wrapper||t.container)&&(this.wrapper=t.wrapper||t.container);var r=t.animType?t.animType:t.renderer?t.renderer:"svg";switch(r){case"canvas":this.renderer=new _aq(this,t.rendererSettings);break;case"svg":this.renderer=new _ao(this,t.rendererSettings);break;case"hybrid":case"html":default:this.renderer=new _ap(this,t.rendererSettings)}if(this.renderer.setProjectInterface(this.projectInterface),this.animType=r,""===t.loop||null===t.loop||(t.loop===!1?this.loop=!1:t.loop===!0?this.loop=!0:this.loop=parseInt(t.loop)),this.autoplay=!("autoplay"in t)||t.autoplay,this.name=t.name?t.name:"",this.autoloadSegments=!t.hasOwnProperty("autoloadSegments")||t.autoloadSegments,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 s=new XMLHttpRequest;t.path.lastIndexOf("\\")!=-1?this.path=t.path.substr(0,t.path.lastIndexOf("\\")+1):this.path=t.path.substr(0,t.path.lastIndexOf("/")+1),this.assetsPath=t.assetsPath,this.fileName=t.path.substr(t.path.lastIndexOf("/")+1),this.fileName=this.fileName.substr(0,this.fileName.lastIndexOf(".json")),s.open("GET",t.path,!0),s.send(),s.onreadystatechange=function(){if(4==s.readyState)if(200==s.status)e.configAnimation(JSON.parse(s.responseText));else try{var t=JSON.parse(s.responseText);e.configAnimation(t)}catch(r){}}}},_a.prototype.setData=function(t,e){var r={wrapper:t,animationData:e?"object"==typeof e?e:JSON.parse(e):null},s=t.attributes;r.path=s.getNamedItem("data-animation-path")?s.getNamedItem("data-animation-path").value:s.getNamedItem("data-bm-path")?s.getNamedItem("data-bm-path").value:s.getNamedItem("bm-path")?s.getNamedItem("bm-path").value:"",r.animType=s.getNamedItem("data-anim-type")?s.getNamedItem("data-anim-type").value:s.getNamedItem("data-bm-type")?s.getNamedItem("data-bm-type").value:s.getNamedItem("bm-type")?s.getNamedItem("bm-type").value:s.getNamedItem("data-bm-renderer")?s.getNamedItem("data-bm-renderer").value:s.getNamedItem("bm-renderer")?s.getNamedItem("bm-renderer").value:"canvas";var i=s.getNamedItem("data-anim-loop")?s.getNamedItem("data-anim-loop").value:s.getNamedItem("data-bm-loop")?s.getNamedItem("data-bm-loop").value:s.getNamedItem("bm-loop")?s.getNamedItem("bm-loop").value:"";""===i||("false"===i?r.loop=!1:"true"===i?r.loop=!0:r.loop=parseInt(i));var a=s.getNamedItem("data-anim-autoplay")?s.getNamedItem("data-anim-autoplay").value:s.getNamedItem("data-bm-autoplay")?s.getNamedItem("data-bm-autoplay").value:!s.getNamedItem("bm-autoplay")||s.getNamedItem("bm-autoplay").value;r.autoplay="false"!==a,
-r.name=s.getNamedItem("data-name")?s.getNamedItem("data-name").value:s.getNamedItem("data-bm-name")?s.getNamedItem("data-bm-name").value:s.getNamedItem("bm-name")?s.getNamedItem("bm-name").value:"";var n=s.getNamedItem("data-anim-prerender")?s.getNamedItem("data-anim-prerender").value:s.getNamedItem("data-bm-prerender")?s.getNamedItem("data-bm-prerender").value:s.getNamedItem("bm-prerender")?s.getNamedItem("bm-prerender").value:"";"false"===n&&(r.prerender=!1),this.setParams(r)},_a.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,r,s=this.animationData.layers,i=s.length,a=t.layers,n=a.length;for(r=0;r<n;r+=1)for(e=0;e<i;){if(s[e].id==a[r].id){s[e]=a[r];break}e+=1}if((t.chars||t.fonts)&&(this.renderer._x.fontManager.addChars(t.chars),this.renderer._x.fontManager.addFonts(t.fonts,this.renderer._x.defs)),t.assets)for(i=t.assets.length,e=0;e<i;e+=1)this.animationData.assets.push(t.assets[e]);this.animationData.__complete=!1,dataManager.completeData(this.animationData,this.renderer._x.fontManager),this.renderer.includeLayers(t.layers),expressionsPlugin&&expressionsPlugin.initExpressions(this),this.renderer._ba(null),this.loadNextSegment()},_a.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 r=new XMLHttpRequest,s=this,i=this.path+this.fileName+"_"+this.segmentPos+".json";this.segmentPos+=1,r.open("GET",i,!0),r.send(),r.onreadystatechange=function(){if(4==r.readyState)if(200==r.status)s.includeLayers(JSON.parse(r.responseText));else try{var t=JSON.parse(r.responseText);s.includeLayers(t)}catch(e){}}},_a.prototype.loadSegments=function(){var t=this.animationData.segments;t||(this.timeCompleted=this.animationData.tf),this.loadNextSegment()},_a.prototype.configAnimation=function(t){var e=this;this.renderer&&this.renderer.destroyed||(this.animationData=t,this.totalFrames=Math.floor(this.animationData.op-this.animationData.ip),this.animationData.tf=this.totalFrames,this.renderer.configAnimation(t),t.assets||(t.assets=[]),t.comps&&(t.assets=t.assets.concat(t.comps),t.comps=null),this.renderer.searchExtraCompositions(t.assets),this.layers=this.animationData.layers,this.assets=this.animationData.assets,this.frameRate=this.animationData.fr,this.firstFrame=Math.round(this.animationData.ip),this.frameMult=this.animationData.fr/1e3,this.trigger("config_ready"),this.imagePreloader=new ImagePreloader,this.imagePreloader.setAssetsPath(this.assetsPath),this.imagePreloader.setPath(this.path),this.imagePreloader.loadAssets(t.assets,function(t){t||e.trigger("loaded_images")}),this.loadSegments(),this.updaFrameModifier(),this.renderer._x.fontManager?this.waitForFontsLoaded():(dataManager.completeData(this.animationData,this.renderer._x.fontManager),this.checkLoaded()))},_a.prototype.waitForFontsLoaded=function(){function t(){this.renderer._x.fontManager.loaded?(dataManager.completeData(this.animationData,this.renderer._x.fontManager),this.checkLoaded()):setTimeout(t.bind(this),20)}return function(){t.bind(this)()}}(),_a.prototype.addPendingElement=function(){this.pendingElements+=1},_a.prototype.elementLoaded=function(){this.pendingElements--,this.checkLoaded()},_a.prototype.checkLoaded=function(){0===this.pendingElements&&(expressionsPlugin&&expressionsPlugin.initExpressions(this),this.renderer.initItems(),setTimeout(function(){this.trigger("DOMLoaded")}.bind(this),0),this.isLoaded=!0,this.gotoFrame(),this.autoplay&&this.play())},_a.prototype.resize=function(){this.renderer.updateContainerSize()},_a.prototype.setSubframe=function(t){this.subframeEnabled=!!t},_a.prototype.gotoFrame=function(){this.currentFrame=this.subframeEnabled?this.currentRawFrame:~~this.currentRawFrame,this.timeCompleted!==this.totalFrames&&this.currentFrame>this.timeCompleted&&(this.currentFrame=this.timeCompleted),this.trigger("enterFrame"),this._ba()},_a.prototype._ba=function(){this.isLoaded!==!1&&this.renderer._ba(this.currentFrame+this.firstFrame)},_a.prototype.play=function(t){t&&this.name!=t||this.isPaused===!0&&(this.isPaused=!1,this._idle&&(this._idle=!1,this.trigger("_active")))},_a.prototype.pause=function(t){t&&this.name!=t||this.isPaused===!1&&(this.isPaused=!0,this.pendingSegment||(this._idle=!0,this.trigger("_idle")))},_a.prototype.togglePause=function(t){t&&this.name!=t||(this.isPaused===!0?this.play():this.pause())},_a.prototype.stop=function(t){t&&this.name!=t||(this.pause(),this.currentFrame=this.currentRawFrame=0,this.playCount=0,this.gotoFrame())},_a.prototype.goToAndStop=function(t,e,r){r&&this.name!=r||(e?this.setCurrentRawFrameValue(t):this.setCurrentRawFrameValue(t*this.frameModifier),this.pause())},_a.prototype.goToAndPlay=function(t,e,r){this.goToAndStop(t,e,r),this.play()},_a.prototype.advanceTime=function(t){return this.pendingSegment?(this.pendingSegment=!1,this.adjustSegment(this.segments.shift()),void(this.isPaused&&this.play())):void(this.isPaused!==!0&&this.isLoaded!==!1&&this.setCurrentRawFrameValue(this.currentRawFrame+t*this.frameModifier))},_a.prototype.updateAnimation=function(t){this.setCurrentRawFrameValue(this.totalFrames*t)},_a.prototype.moveFrame=function(t,e){e&&this.name!=e||this.setCurrentRawFrameValue(this.currentRawFrame+t)},_a.prototype.adjustSegment=function(t){this.playCount=0,t[1]<t[0]?(this.frameModifier>0&&(this.playSpeed<0?this.setSpeed(-this.playSpeed):this.setDirection(-1)),this.totalFrames=t[0]-t[1],this.firstFrame=t[1],this.setCurrentRawFrameValue(this.totalFrames-.001)):t[1]>t[0]&&(this.frameModifier<0&&(this.playSpeed<0?this.setSpeed(-this.playSpeed):this.setDirection(1)),this.totalFrames=t[1]-t[0],this.firstFrame=t[0],this.setCurrentRawFrameValue(.001)),this.trigger("segmentStart")},_a.prototype.setSegment=function(t,e){var r=-1;this.isPaused&&(this.currentRawFrame+this.firstFrame<t?r=t:this.currentRawFrame+this.firstFrame>e&&(r=e-t)),this.firstFrame=t,this.totalFrames=e-t,r!==-1&&this.goToAndStop(r,!0)},_a.prototype.playSegments=function(t,e){if("object"==typeof t[0]){var r,s=t.length;for(r=0;r<s;r+=1)this.segments.push(t[r])}else this.segments.push(t);e&&this.adjustSegment(this.segments.shift()),this.isPaused&&this.play()},_a.prototype.resetSegments=function(t){this.segments.length=0,this.segments.push([this.animationData.ip,this.animationData.op]),t&&this.adjustSegment(this.segments.shift())},_a.prototype.checkSegments=function(){this.segments.length&&(this.pendingSegment=!0)},_a.prototype.remove=function(t){t&&this.name!=t||this.renderer.destroy()},_a.prototype.destroy=function(t){t&&this.name!=t||this.renderer&&this.renderer.destroyed||(this.renderer.destroy(),this.trigger("destroy"),this._cbs=null,this.onEnterFrame=this.onLoopComplete=this.onComplete=this.onSegmentStart=this.onDestroy=null,this.renderer=null)},_a.prototype.setCurrentRawFrameValue=function(t){this.currentRawFrame=t;var e=!1;this.currentRawFrame>=this.totalFrames?(this.checkSegments(),this.loop===!1?(this.currentRawFrame=this.totalFrames,e=!0):(this.trigger("loopComplete"),this.playCount+=1,this.loop!==!0&&this.playCount==this.loop||this.pendingSegment?(this.currentRawFrame=this.totalFrames,e=!0):this.currentRawFrame=this.currentRawFrame%this.totalFrames)):this.currentRawFrame<0&&(this.checkSegments(),this.playCount-=1,this.playCount<0&&(this.playCount=0),this.loop===!1||this.pendingSegment?(this.currentRawFrame=0,e=!0):(this.trigger("loopComplete"),this.currentRawFrame=(this.totalFrames+this.currentRawFrame)%this.totalFrames)),this.gotoFrame(),e&&(this.pause(),this.trigger("complete"))},_a.prototype.setSpeed=function(t){this.playSpeed=t,this.updaFrameModifier()},_a.prototype.setDirection=function(t){this.playDirection=t<0?-1:1,this.updaFrameModifier()},_a.prototype.updaFrameModifier=function(){this.frameModifier=this.frameMult*this.playSpeed*this.playDirection},_a.prototype.getPath=function(){return this.path},_a.prototype.getAssetsPath=function(t){var e="";if(this.assetsPath){var r=t.p;r.indexOf("images/")!==-1&&(r=r.split("/")[1]),e=this.assetsPath+r}else e=this.path,e+=t.u?t.u:"",e+=t.p;return e},_a.prototype.getAssetData=function(t){for(var e=0,r=this.assets.length;e<r;){if(t==this.assets[e].id)return this.assets[e];e+=1}},_a.prototype.hide=function(){this.renderer.hide()},_a.prototype.show=function(){this.renderer.show()},_a.prototype.getAssets=function(){return this.assets},_a.prototype.trigger=function(t){if(this._cbs&&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))},_a.prototype.addEventListener=_addEventListener,_a.prototype.removeEventListener=_removeEventListener,_a.prototype.triggerEvent=_triggerEvent;var Expressions=function(){function t(t){t.renderer.compInterface=CompExpressionInterface(t.renderer),t.renderer._x.projectInterface.registerComposition(t.renderer)}var e={};return e.initExpressions=t,e}();expressionsPlugin=Expressions;var ExpressionManager=function(){function duplicatePropertyValue(t,e){if(e=e||1,"number"==typeof t||t instanceof Number)return t*e;if(t.i)return shape_pool.clone(t);var r,s=createTypedArray("float32",t.length),i=t.length;for(r=0;r<i;r+=1)s[r]=t[r]*e;return s}function isTypeOfArray(t){return t.constructor===Array||t.constructor===Float32Array}function shapesEqual(t,e){if(t._length!==e._length||t.c!==e.c)return!1;var r,s=t._length;for(r=0;r<s;r+=1)if(t.v[r][0]!==e.v[r][0]||t.v[r][1]!==e.v[r][1]||t.o[r][0]!==e.o[r][0]||t.o[r][1]!==e.o[r][1]||t.i[r][0]!==e.i[r][0]||t.i[r][1]!==e.i[r][1])return!1;return!0}function $bm_neg(t){var e=typeof t;if("number"===e||"boolean"===e||t instanceof Number)return-t;if(isTypeOfArray(t)){var r,s=t.length,i=[];for(r=0;r<s;r+=1)i[r]=-t[r];return i}}function sum(t,e){var r=typeof t,s=typeof e;if("string"===r||"string"===s)return t+e;if(("number"===r||"boolean"===r||"string"===r||t instanceof Number)&&("number"===s||"boolean"===s||"string"===s||e instanceof Number))return t+e;if(isTypeOfArray(t)&&("number"===s||"boolean"===s||"string"===s||e instanceof Number))return t[0]=t[0]+e,t;if(("number"===r||"boolean"===r||"string"===r||t instanceof Number)&&isTypeOfArray(e))return e[0]=t+e[0],e;if(isTypeOfArray(t)&&isTypeOfArray(e)){for(var i=0,a=t.length,n=e.length,o=[];i<a||i<n;)("number"==typeof t[i]||t[i]instanceof Number)&&("number"==typeof e[i]||e[i]instanceof Number)?o[i]=t[i]+e[i]:o[i]=void 0==e[i]?t[i]:t[i]||e[i],i+=1;return o}return 0}function sub(t,e){var r=typeof t,s=typeof e;if(("number"===r||"boolean"===r||"string"===r||t instanceof Number)&&("number"===s||"boolean"===s||"string"===s||e instanceof Number))return"string"===r&&(t=parseInt(t)),"string"===s&&(e=parseInt(e)),t-e;if(isTypeOfArray(t)&&("number"===s||"boolean"===s||"string"===s||e instanceof Number))return t[0]=t[0]-e,t;if(("number"===r||"boolean"===r||"string"===r||t instanceof Number)&&isTypeOfArray(e))return e[0]=t-e[0],e;if(isTypeOfArray(t)&&isTypeOfArray(e)){for(var i=0,a=t.length,n=e.length,o=[];i<a||i<n;)"number"==typeof t[i]||t[i]instanceof Number?o[i]=t[i]-e[i]:o[i]=void 0==e[i]?t[i]:t[i]||e[i],i+=1;return o}return 0}function mul(t,e){var r,s=typeof t,i=typeof e;if(("number"===s||"boolean"===s||"string"===s||t instanceof Number)&&("number"===i||"boolean"===i||"string"===i||e instanceof Number))return t*e;var a,n;if(isTypeOfArray(t)&&("number"===i||"boolean"===i||"string"===i||e instanceof Number)){for(n=t.length,r=createTypedArray("float32",n),a=0;a<n;a+=1)r[a]=t[a]*e;return r}if(("number"===s||"boolean"===s||"string"===s||t instanceof Number)&&isTypeOfArray(e)){for(n=e.length,r=createTypedArray("float32",n),a=0;a<n;a+=1)r[a]=t*e[a];return r}return 0}function div(t,e){var r,s=typeof t,i=typeof e;if(("number"===s||"boolean"===s||"string"===s||t instanceof Number)&&("number"===i||"boolean"===i||"string"===i||e instanceof Number))return t/e;var a,n;if(isTypeOfArray(t)&&("number"===i||"boolean"===i||"string"===i||e instanceof Number)){for(n=t.length,r=createTypedArray("float32",n),a=0;a<n;a+=1)r[a]=t[a]/e;return r}if(("number"===s||"boolean"===s||"string"===s||t instanceof Number)&&isTypeOfArray(e)){for(n=e.length,r=createTypedArray("float32",n),a=0;a<n;a+=1)r[a]=t/e[a];return r}return 0}function mod(t,e){return"string"==typeof t&&(t=parseInt(t)),"string"==typeof e&&(e=parseInt(e)),t%e}function clamp(t,e,r){if(e>r){var s=r;r=e,e=s}return Math.min(Math.max(t,e),r)}function radiansToDegrees(t){return t/degToRads}function degreesToRadians(t){return t*degToRads}function length(t,e){if("number"==typeof t||t instanceof Number)return e=e||0,Math.abs(t-e);e||(e=helperLengthArray);var r,s=Math.min(t.length,e.length),i=0;for(r=0;r<s;r+=1)i+=Math.pow(e[r]-t[r],2);return Math.sqrt(i)}function normalize(t){return div(t,length(t))}function rgbToHsl(t){var e,r,s=t[0],i=t[1],a=t[2],n=Math.max(s,i,a),o=Math.min(s,i,a),h=(n+o)/2;if(n==o)e=r=0;else{var l=n-o;switch(r=h>.5?l/(2-n-o):l/(n+o),n){case s:e=(i-a)/l+(i<a?6:0);break;case i:e=(a-s)/l+2;break;case a:e=(s-i)/l+4}e/=6}return[e,r,h,t[3]]}function hslToRgb(t){function e(t,e,r){return r<0&&(r+=1),r>1&&(r-=1),r<1/6?t+6*(e-t)*r:r<.5?e:r<2/3?t+(e-t)*(2/3-r)*6:t}var r,s,i,a=t[0],n=t[1],o=t[2];if(0==n)r=s=i=o;else{var h=o<.5?o*(1+n):o+n-o*n,l=2*o-h;r=e(l,h,a+1/3),s=e(l,h,a),i=e(l,h,a-1/3)}return[r,s,i,t[3]]}function linear(t,e,r,s,i){if(void 0===s||void 0===i)return linear(t,0,1,e,r);if(t<=e)return s;if(t>=r)return i;var a=r===e?0:(t-e)/(r-e);if(!s.length)return s+(i-s)*a;var n,o=s.length,h=createTypedArray("float32",o);for(n=0;n<o;n+=1)h[n]=s[n]+(i[n]-s[n])*a;return h}function random(t,e){if(void 0===e&&(void 0===t?(t=0,e=1):(e=t,t=void 0)),e.length){var r,s=e.length;t||(t=createTypedArray("float32",s));var i=createTypedArray("float32",s),a=BMMath.random();for(r=0;r<s;r+=1)i[r]=t[r]+a*(e[r]-t[r]);return i}void 0===t&&(t=0);var n=BMMath.random();return t+n*(e-t)}function createPath(t,e,r,s){e=e&&e.length?e:t,r=r&&r.length?r:t;var a=shape_pool.newElement(),n=t.length;for(a.setPathData(s,n),i=0;i<n;i+=1)a._aw(t[i][0],t[i][1],r[i][0]+t[i][0],r[i][1]+t[i][1],e[i][0]+t[i][0],e[i][1]+t[i][1],i,!0);return a}function initiateExpression(elem,data,property){function lookAt(t,e){var r=[e[0]-t[0],e[1]-t[1],e[2]-t[2]],s=Math.atan2(r[0],Math.sqrt(r[1]*r[1]+r[2]*r[2]))/degToRads,i=-Math.atan2(r[1],r[2])/degToRads;return[i,s,0]}function easeOut(t,e,r,s,i){return void 0===s?(s=e,i=r):t=(t-e)/(r-e),-(i-s)*t*(t-2)+s}function easeIn(t,e,r,s,i){return void 0===s?(s=e,i=r):t=(t-e)/(r-e),(i-s)*t*t+s}function nearestKey(t){var e,r,s,i=data.k.length;if(data.k.length&&"number"!=typeof data.k[0])if(r=-1,t*=elem.comp._x.frameRate,t<data.k[0].t)r=1,s=data.k[0].t;else{for(e=0;e<i-1;e+=1){if(t===data.k[e].t){r=e+1,s=data.k[e].t;break}if(t>data.k[e].t&&t<data.k[e+1].t){t-data.k[e].t>data.k[e+1].t-t?(r=e+2,s=data.k[e+1].t):(r=e+1,s=data.k[e].t);break}}r===-1&&(r=e+1,s=data.k[e].t)}else r=0,s=0;var a={};return a.index=r,a.time=s/elem.comp._x.frameRate,a}function key(t){var e,r,s;if(!data.k.length||"number"==typeof data.k[0])throw new Error("The property has no keyframe at index "+t);t-=1,e={time:data.k[t].t/elem.comp._x.frameRate};var i;for(i=t!==data.k.length-1||data.k[t].h?data.k[t].s:data.k[t-1].e,s=i.length,r=0;r<s;r+=1)e[r]=i[r];return e}function framesToTime(t,e){return e||(e=elem.comp._x.frameRate),t/e}function timeToFrames(t,e){return t||0===t||(t=time),e||(e=elem.comp._x.frameRate),t*e}function seedRandom(t){BMMath.seedrandom(randSeed+t)}function sourceRectAtTime(){return elem.sourceRectAtTime()}function executeExpression(){if(_needsRandom&&seedRandom(randSeed),this.frameExpressionId!==elem._x.frameId||"textSelector"===this.propType){if(this.lock)return this.v=duplicatePropertyValue(this.pv,this.mult),!0;"textSelector"===this.propType&&(textIndex=this.textIndex,textTotal=this.textTotal,selectorValue=this.selectorValue),thisLayer||(thisLayer=elem.layerInterface,thisComp=elem.comp.compInterface,toWorld=thisLayer.toWorld.bind(thisLayer),fromWorld=thisLayer.fromWorld.bind(thisLayer),fromComp=thisLayer.fromComp.bind(thisLayer),mask=thisLayer.mask?thisLayer.mask.bind(thisLayer):null,fromCompToSurface=fromComp),transform||(transform=elem.layerInterface("ADBE Transform Group"),anchorPoint=transform.anchorPoint),4!==elemType||content||(content=thisLayer("ADBE Root Vectors Group")),effect||(effect=thisLayer(4)),hasParent=!(!elem.hierarchy||!elem.hierarchy.length),hasParent&&!parent&&(parent=elem.hierarchy[0].layerInterface),this.lock=!0,this.getPreValue&&this.getPreValue(),value=this.pv,time=this.comp.renderedFrame/this.comp._x.frameRate,needsVelocity&&(velocity=velocityAtTime(time)),expression_function(),"shape"===scoped_bm_rt.propType?this.v=shape_pool.clone(scoped_bm_rt.v):this.v=scoped_bm_rt,this.frameExpressionId=elem._x.frameId;var t,e;if(this.mult)if("unidimensional"===this.propType)this.v*=this.mult;else if(1===this.v.length)this.v=this.v[0]*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;t<e;t+=1)this.v[t]*=this.mult;if(1===this.v.length&&(this.v=this.v[0]),"unidimensional"===this.propType)this.lastValue!==this.v&&(this.lastValue=this.v,this.mdf=!0);else if("shape"===this.propType)shapesEqual(this.v,this._ak.shapes[0])||(this.mdf=!0,this._ak.releaseShapes(),this._ak.addShape(shape_pool.clone(this.v)));else for(e=this.v.length,t=0;t<e;t+=1)this.v[t]!==this.lastValue[t]&&(this.lastValue[t]=this.v[t],this.mdf=!0);this.lock=!1}}var val=data.x,needsVelocity=/velocity(?![\w\d])/.test(val),_needsRandom=val.indexOf("random")!==-1,elemType=elem.data.ty,transform,content,effect,thisComp=elem.comp,thisProperty=property;elem.comp.frameDuration=1/elem.comp._x.frameRate;var inPoint=elem.data.ip/elem.comp._x.frameRate,outPoint=elem.data.op/elem.comp._x.frameRate,width=elem.data.sw?elem.data.sw:0,height=elem.data.sh?elem.data.sh:0,loopIn,loop_in,loopOut,loop_out,toWorld,fromWorld,fromComp,fromCompToSurface,anchorPoint,thisLayer,thisComp,mask,valueAtTime,velocityAtTime,scoped_bm_rt,expression_function=eval("[function _expression_function(){"+val+";scoped_bm_rt=$bm_rt}]")[0],numKeys=property.kf?data.k.length:0,wiggle=function(t,e){var r,s,i=this.pv.length?this.pv.length:1,a=createTypedArray("float32",i);t=5;var n=Math.floor(time*t);for(r=0,s=0;r<n;){for(s=0;s<i;s+=1)a[s]+=-e+2*e*BMMath.random();r+=1}var o=time*t,h=o-Math.floor(o),l=createTypedArray("float32",i);if(i>1){for(s=0;s<i;s+=1)l[s]=this.pv[s]+a[s]+(-e+2*e*BMMath.random())*h;return l}return this.pv+a[0]+(-e+2*e*BMMath.random())*h}.bind(this);thisProperty.loopIn&&(loopIn=thisProperty.loopIn.bind(thisProperty),loop_in=loopIn),thisProperty.loopOut&&(loopOut=thisProperty.loopOut.bind(thisProperty),loop_out=loopOut);var loopInDuration=function(t,e){return loopIn(t,e,!0)}.bind(this),loopOutDuration=function(t,e){return loopOut(t,e,!0)}.bind(this);this.getValueAtTime&&(valueAtTime=this.getValueAtTime.bind(this)),this.getVelocityAtTime&&(velocityAtTime=this.getVelocityAtTime.bind(this));var comp=elem.comp._x.projectInterface.bind(elem.comp._x.projectInterface),time,velocity,value,textIndex,textTotal,selectorValue,index=elem.data.ind,hasParent=!(!elem.hierarchy||!elem.hierarchy.length),parent,randSeed=Math.floor(1e6*Math.random());return executeExpression}var ob={},Math=BMMath,window=null,document=null,add=sum,radians_to_degrees=radiansToDegrees,degrees_to_radians=radiansToDegrees,helperLengthArray=[0,0,0,0,0,0];return ob.initiateExpression=initiateExpression,ob}();!function(){function t(){return this.pv}function e(t,e,r){if(!this.k||!this.keyframes)return this.pv;t=t?t.toLowerCase():"";var s=this.comp.renderedFrame,i=this.keyframes,a=i[i.length-1].t;if(s<=a)return this.pv;var n,o;r?(n=e?Math.abs(a-elem.comp._x.frameRate*e):Math.max(0,a-this.elem.data.ip),o=a-n):((!e||e>i.length-1)&&(e=i.length-1),o=i[i.length-1-e].t,n=a-o);var h,l,p;if("pingpong"===t){var m=Math.floor((s-o)/n);if(m%2!==0)return this.getValueAtTime((n-(s-o)%n+o)/this.comp._x.frameRate,0)}else{if("offset"===t){var f=this.getValueAtTime(o/this.comp._x.frameRate,0),c=this.getValueAtTime(a/this.comp._x.frameRate,0),d=this.getValueAtTime(((s-o)%n+o)/this.comp._x.frameRate,0),u=Math.floor((s-o)/n);if(this.pv.length){for(p=new Array(f.length),l=p.length,h=0;h<l;h+=1)p[h]=(c[h]-f[h])*u+d[h];return p}return(c-f)*u+d}if("continue"===t){var y=this.getValueAtTime(a/this.comp._x.frameRate,0),g=this.getValueAtTime((a-.001)/this.comp._x.frameRate,0);if(this.pv.length){for(p=new Array(y.length),l=p.length,h=0;h<l;h+=1)p[h]=y[h]+(y[h]-g[h])*((s-a)/this.comp._x.frameRate)/5e-4;return p}return y+(y-g)*((s-a)/.001)}}return this.getValueAtTime(((s-o)%n+o)/this.comp._x.frameRate,0)}function r(t,e,r){if(!this.k)return this.pv;t=t?t.toLowerCase():"";var s=this.comp.renderedFrame,i=this.keyframes,a=i[0].t;if(s>=a)return this.pv;var n,o;r?(n=e?Math.abs(elem.comp._x.frameRate*e):Math.max(0,this.elem.data.op-a),o=a+n):((!e||e>i.length-1)&&(e=i.length-1),o=i[e].t,n=o-a);var h,l,p;if("pingpong"===t){var m=Math.floor((a-s)/n);if(m%2===0)return this.getValueAtTime(((a-s)%n+a)/this.comp._x.frameRate,0)}else{if("offset"===t){var f=this.getValueAtTime(a/this.comp._x.frameRate,0),c=this.getValueAtTime(o/this.comp._x.frameRate,0),d=this.getValueAtTime((n-(a-s)%n+a)/this.comp._x.frameRate,0),u=Math.floor((a-s)/n)+1;if(this.pv.length){for(p=new Array(f.length),l=p.length,h=0;h<l;h+=1)p[h]=d[h]-(c[h]-f[h])*u;return p}return d-(c-f)*u}if("continue"===t){var y=this.getValueAtTime(a/this.comp._x.frameRate,0),g=this.getValueAtTime((a+.001)/this.comp._x.frameRate,0);if(this.pv.length){for(p=new Array(y.length),l=p.length,h=0;h<l;h+=1)p[h]=y[h]+(y[h]-g[h])*(a-s)/.001;return p}return y+(y-g)*(a-s)/.001}}return this.getValueAtTime((n-(a-s)%n+a)/this.comp._x.frameRate,0)}function s(t){return this._cachingAtTime||(this._cachingAtTime={lastValue:initialDefaultFrame,lastIndex:0}),t!==this._cachingAtTime.lastFrame&&(t*=this.elem._x.frameRate,t-=this.offsetTime,this._cachingAtTime.lastIndex=this._cachingAtTime.lastFrame<t?this._cachingAtTime.lastIndex:0,this._cachingAtTime.value=this.interpolateValue(t,this.pv,this._cachingAtTime),this._cachingAtTime.lastFrame=t),this._cachingAtTime.value}function i(t){if(void 0!==this.vel)return this.vel;var e,r=-.01,s=this.getValueAtTime(t),i=this.getValueAtTime(t+r);if(s.length){e=createTypedArray("float32",s.length);var a;for(a=0;a<s.length;a+=1)e[a]=(i[a]-s[a])/r}else e=(i-s)/r;return e}function a(t){this.propertyGroup=t}function n(t,e,r){e.x&&(r.k=!0,r.x=!0,r.getValue&&(r.getPreValue=r.getValue),r.initiateExpression=ExpressionManager.initiateExpression,r.getValue=r.initiateExpression(t,e,r))}function o(t){}function h(t){}function l(t){return this._cachingAtTime||(this._cachingAtTime={shapeValue:shape_pool.clone(this.pv),lastIndex:0,lastTime:initialDefaultFrame}),t!==this._cachingAtTime.lastTime&&(this._cachingAtTime.lastTime=t,t*=this.elem._x.frameRate,this.interpolateShape(t,this._cachingAtTime.shapeValue,!1,this._cachingAtTime)),this._cachingAtTime.shapeValue}function p(){}var m=function(){function e(t,e){return this.textIndex=t+1,this.textTotal=e,this.getValue(),this.v}return function(r,o){this.pv=1,this.comp=r.comp,this.elem=r,this.mult=.01,this.propType="textSelector",this.textTotal=o.totalChars,this.selectorValue=100,this.lastValue=[1,1,1],n.bind(this)(r,o,this),this.getMult=e,this.getVelocityAtTime=i,this.kf?this.getValueAtTime=s.bind(this):this.getValueAtTime=t.bind(this),this._ce=a}}(),f=_ag._bj;_ag._bj=function(t,e,r){var s=f(t,e,r);return s.dynamicProperties.length?s.getValueAtTime=o.bind(s):s.getValueAtTime=h.bind(s),s._ce=a,s};var c=_ai._bo;_ai._bo=function(o,h,l,p,m){var f=c(o,h,l,p,m);f.kf?f.getValueAtTime=s.bind(f):f.getValueAtTime=t.bind(f),f._ce=a,f.loopOut=e,f.loopIn=r,f.getVelocityAtTime=i,f.numKeys=1===h.a?h.k.length:0;var d=f.k;return f.propertyIndex=h.ix,f._cachingAtTime={lastFrame:initialDefaultFrame,lastIndex:0,value:0===l?0:createTypedArray("float32",3)},n(o,h,f),!d&&f.x&&m.push(f),f};var d=_ah.getConstructorFunction(),u=_ah.getKeyframedConstructorFunction();p.prototype={vertices:function(t,e){var r=this.v;void 0!==e&&(r=this.getValueAtTime(e,0));var s,i=r._length,a=r[t],n=r.v,o=Array.apply(null,{length:i});for(s=0;s<i;s+=1)"i"===t||"o"===t?o[s]=[a[s][0]-n[s][0],a[s][1]-n[s][1]]:o[s]=[a[s][0],a[s][1]];return o},points:function(t){return this.vertices("v",t)},inTangents:function(t){return this.vertices("i",t)},outTangents:function(t){return this.vertices("o",t)},isClosed:function(){return this.v.c},pointOnPath:function(t,e){var r=this.v;void 0!==e&&(r=this.getValueAtTime(e,0)),this._segmentsLength||(this._segmentsLength=bez.getSegmentsLength(r));for(var s=this._segmentsLength,i=s.lengths,a=s.totalLength*t,n=0,o=i.length,h=0;n<o;){if(h+i[n].addedLength>a){var l=n,p=r.c&&n===o-1?0:n+1,m=(a-h)/i[n].addedLength,f=bez.getPointInSegment(r.v[l],r.v[p],r.o[l],r.i[p],m,i[n]);break}h+=i[n].addedLength,n+=1}return f||(f=r.c?[r.v[0][0],r.v[0][1]]:[r.v[r._length-1][0],r.v[r._length-1][1]]),f},vectorOnPath:function(t,e,r){t=1==t?this.v.c?0:.999:t;var s=this.pointOnPath(t,e),i=this.pointOnPath(t+.001,e),a=i[0]-s[0],n=i[1]-s[1],o=Math.sqrt(Math.pow(a,2)+Math.pow(n,2)),h="tangent"===r?[a/o,n/o]:[-n/o,a/o];return h},tangentOnPath:function(t,e){return this.vectorOnPath(t,e,"tangent")},normalOnPath:function(t,e){return this.vectorOnPath(t,e,"normal")},_ce:a,getValueAtTime:t},extendPrototype([p],d),extendPrototype([p],u),u.prototype.getValueAtTime=l,u.prototype.initiateExpression=ExpressionManager.initiateExpression;var y=_ah._bp;_ah._bp=function(t,e,r,s,i){var a=y(t,e,r,s,i),o=a.k;return a.propertyIndex=e.ix,a.lock=!1,3===r?n(t,e.pt,a):4===r&&n(t,e.ks,a),!o&&a.x&&s.push(a),a};var g=TextSelectorProp.getTextSelectorProp;TextSelectorProp.getTextSelectorProp=function(t,e,r){return 1===e.t?new m(t,e,r):g(t,e,r)}}(),function(){function t(){return!!this.data.d.x&&(this.comp=this.elem.comp,this.getValue&&(this.getPreValue=this.getValue),this.calculateExpression=ExpressionManager.initiateExpression.bind(this)(this.elem,this.data.d,this),this.getValue=this.getExpressionValue,!0)}_ar.prototype.searchProperty=function(){return this.kf=this.searchExpressions()||this.data.d.k.length>1,this.kf},_ar.prototype.getExpressionValue=function(t){this.calculateExpression(),this.mdf&&(this.currentData.t=this.v.toString(),this.completeTextData(this.currentData))},_ar.prototype.searchExpressions=t}();var ShapeExpressionInterface=function(){function t(t,e,n){var c,d=[],u=t?t.length:0;for(c=0;c<u;c+=1)"gr"==t[c].ty?d.push(r(t[c],e[c],n)):"fl"==t[c].ty?d.push(s(t[c],e[c],n)):"st"==t[c].ty?d.push(i(t[c],e[c],n)):"tm"==t[c].ty?d.push(a(t[c],e[c],n)):"tr"==t[c].ty||("el"==t[c].ty?d.push(o(t[c],e[c],n)):"sr"==t[c].ty?d.push(h(t[c],e[c],n)):"sh"==t[c].ty?d.push(f(t[c],e[c],n)):"rc"==t[c].ty?d.push(l(t[c],e[c],n)):"rd"==t[c].ty?d.push(p(t[c],e[c],n)):"rp"==t[c].ty&&d.push(m(t[c],e[c],n)));return d}function e(e,r,s){var i,a=function(t){for(var e=0,r=i.length;e<r;){if(i[e]._name===t||i[e].mn===t||i[e].propertyIndex===t||i[e].ix===t||i[e].ind===t)return i[e];e+=1}if("number"==typeof t)return i[t-1]};return a.propertyGroup=function(t){return 1===t?a:s(t-1)},i=t(e.it,r.it,a.propertyGroup),a.numProperties=i.length,a.propertyIndex=e.cix,a}function r(t,r,s){var i=function(t){switch(t){case"ADBE Vectors Group":case"Contents":case 2:return i.content;case"ADBE Vector Transform Group":case 3:default:return i.transform}};i.propertyGroup=function(t){return 1===t?i:s(t-1)};var a=e(t,r,i.propertyGroup),o=n(t.it[t.it.length-1],r.it[r.it.length-1],i.propertyGroup);return i.content=a,i.transform=o,Object.defineProperty(i,"_name",{get:function(){return t.nm}}),i.numProperties=t.np,i.propertyIndex=t.ix,i.nm=t.nm,i.mn=t.mn,i}function s(t,e,r){function s(t){return"Color"===t||"color"===t?s.color:"Opacity"===t||"opacity"===t?s.opacity:void 0}return Object.defineProperties(s,{color:{get:function(){return ExpressionValue(e.c,1/e.c.mult,"color")}},opacity:{get:function(){return ExpressionValue(e.o,100)}},_name:{value:t.nm},mn:{value:t.mn}}),e.c._ce(r),e.o._ce(r),s}function i(t,e,r){function s(t){return 1===t?ob:r(t-1)}function i(t){return 1===t?l:s(t-1)}function a(r){Object.defineProperty(l,t.d[r].nm,{get:function(){return ExpressionValue(e.d.dataProps[r].p)}})}function n(t){return"Color"===t||"color"===t?n.color:"Opacity"===t||"opacity"===t?n.opacity:"Stroke Width"===t||"stroke width"===t?n.strokeWidth:void 0}var o,h=t.d?t.d.length:0,l={};for(o=0;o<h;o+=1)a(o),e.d.dataProps[o].p._ce(i);return Object.defineProperties(n,{color:{get:function(){return ExpressionValue(e.c,1/e.c.mult,"color")}},opacity:{get:function(){return ExpressionValue(e.o,100)}},strokeWidth:{get:function(){return ExpressionValue(e.w)}},dash:{get:function(){return l}},_name:{value:t.nm},mn:{value:t.mn}}),e.c._ce(s),e.o._ce(s),e.w._ce(s),n}function a(t,e,r){function s(t){return 1==t?i:r(--t)}function i(e){return e===t.e.ix||"End"===e||"end"===e?i.end:e===t.s.ix?i.start:e===t.o.ix?i.offset:void 0}return i.propertyIndex=t.ix,e.s._ce(s),e.e._ce(s),e.o._ce(s),i.propertyIndex=t.ix,Object.defineProperties(i,{start:{get:function(){return ExpressionValue(e.s,1/e.s.mult)}},end:{get:function(){return ExpressionValue(e.e,1/e.e.mult)}},offset:{get:function(){return ExpressionValue(e.o)}},_name:{value:t.nm}}),i.mn=t.mn,i}function n(t,e,r){function s(t){return 1==t?i:r(--t)}function i(e){return t.a.ix===e||"Anchor Point"===e?i.anchorPoint:t.o.ix===e||"Opacity"===e?i.opacity:t.p.ix===e||"Position"===e?i.position:t.r.ix===e||"Rotation"===e||"ADBE Vector Rotation"===e?i.rotation:t.s.ix===e||"Scale"===e?i.scale:t.sk&&t.sk.ix===e||"Skew"===e?i.skew:t.sa&&t.sa.ix===e||"Skew Axis"===e?i.skewAxis:void 0;
-}return e.transform.mProps.o._ce(s),e.transform.mProps.p._ce(s),e.transform.mProps.a._ce(s),e.transform.mProps.s._ce(s),e.transform.mProps.r._ce(s),e.transform.mProps.sk&&(e.transform.mProps.sk._ce(s),e.transform.mProps.sa._ce(s)),e.transform.op._ce(s),Object.defineProperties(i,{opacity:{get:function(){return ExpressionValue(e.transform.mProps.o,1/e.transform.mProps.o.mult)}},position:{get:function(){return ExpressionValue(e.transform.mProps.p)}},anchorPoint:{get:function(){return ExpressionValue(e.transform.mProps.a)}},scale:{get:function(){return ExpressionValue(e.transform.mProps.s,1/e.transform.mProps.s.mult)}},rotation:{get:function(){return ExpressionValue(e.transform.mProps.r,1/e.transform.mProps.r.mult)}},skew:{get:function(){return ExpressionValue(e.transform.mProps.sk)}},skewAxis:{get:function(){return ExpressionValue(e.transform.mProps.sa)}},_name:{value:t.nm}}),i.ty="tr",i.mn=t.mn,i}function o(t,e,r){function s(t){return 1==t?i:r(--t)}function i(e){return t.p.ix===e?i.position:t.s.ix===e?i.size:void 0}i.propertyIndex=t.ix;var a="tm"===e.sh.ty?e.sh.prop:e.sh;return a.s._ce(s),a.p._ce(s),Object.defineProperties(i,{size:{get:function(){return ExpressionValue(a.s)}},position:{get:function(){return ExpressionValue(a.p)}},_name:{value:t.nm}}),i.mn=t.mn,i}function h(t,e,r){function s(t){return 1==t?i:r(--t)}function i(e){return t.p.ix===e?i.position:t.r.ix===e?i.rotation:t.pt.ix===e?i.points:t.or.ix===e||"ADBE Vector Star Outer Radius"===e?i.outerRadius:t.os.ix===e?i.outerRoundness:!t.ir||t.ir.ix!==e&&"ADBE Vector Star Inner Radius"!==e?t.is&&t.is.ix===e?i.innerRoundness:void 0:i.innerRadius}var a="tm"===e.sh.ty?e.sh.prop:e.sh;return i.propertyIndex=t.ix,a.or._ce(s),a.os._ce(s),a.pt._ce(s),a.p._ce(s),a.r._ce(s),t.ir&&(a.ir._ce(s),a.is._ce(s)),Object.defineProperties(i,{position:{get:function(){return ExpressionValue(a.p)}},rotation:{get:function(){return ExpressionValue(a.r,1/a.r.mult)}},points:{get:function(){return ExpressionValue(a.pt)}},outerRadius:{get:function(){return ExpressionValue(a.or)}},outerRoundness:{get:function(){return ExpressionValue(a.os)}},innerRadius:{get:function(){return a.ir?ExpressionValue(a.ir):0}},innerRoundness:{get:function(){return a.is?ExpressionValue(a.is,1/a.is.mult):0}},_name:{value:t.nm}}),i.mn=t.mn,i}function l(t,e,r){function s(t){return 1==t?i:r(--t)}function i(e){return t.p.ix===e?i.position:t.r.ix===e?i.roundness:t.s.ix===e||"Size"===e||"ADBE Vector Rect Size"===e?i.size:void 0}var a="tm"===e.sh.ty?e.sh.prop:e.sh;return i.propertyIndex=t.ix,a.p._ce(s),a.s._ce(s),a.r._ce(s),Object.defineProperties(i,{position:{get:function(){return ExpressionValue(a.p)}},roundness:{get:function(){return ExpressionValue(a.r)}},size:{get:function(){return ExpressionValue(a.s)}},_name:{value:t.nm}}),i.mn=t.mn,i}function p(t,e,r){function s(t){return 1==t?i:r(--t)}function i(e){if(t.r.ix===e||"Round Corners 1"===e)return i.radius}var a=e;return i.propertyIndex=t.ix,a.rd._ce(s),Object.defineProperties(i,{radius:{get:function(){return ExpressionValue(a.rd)}},_name:{value:t.nm}}),i.mn=t.mn,i}function m(t,e,r){function s(t){return 1==t?i:r(--t)}function i(e){return t.c.ix===e||"Copies"===e?i.copies:t.o.ix===e||"Offset"===e?i.offset:void 0}var a=e;return i.propertyIndex=t.ix,a.c._ce(s),a.o._ce(s),Object.defineProperties(i,{copies:{get:function(){return ExpressionValue(a.c)}},offset:{get:function(){return ExpressionValue(a.o)}},_name:{value:t.nm}}),i.mn=t.mn,i}function f(t,e,r){function s(t){return 1==t?i:r(--t)}function i(t){if("Shape"===t||"shape"===t||"Path"===t||"path"===t||"ADBE Vector Shape"===t||2===t)return i.path}var a=e.sh;return a._ce(s),Object.defineProperties(i,{path:{get:function(){return a.k&&a.getValue(),a}},shape:{get:function(){return a.k&&a.getValue(),a}},_name:{value:t.nm},ix:{value:t.ix},mn:{value:t.mn}}),i}return function(e,r,s){function i(t){if("number"==typeof t)return a[t-1];for(var e=0,r=a.length;e<r;){if(a[e]._name===t)return a[e];e+=1}}var a;return i.propertyGroup=s,a=t(e,r,i),i}}(),TextExpressionInterface=function(){return function(t){function e(){}var r,s;return Object.defineProperty(e,"sourceText",{get:function(){var e=t.textProperty.currentData.t;return t.textProperty.currentData.t!==r&&(t.textProperty.currentData.t=r,s=new String(e),s.value=e?e:new String(e)),s}}),e}}(),LayerExpressionInterface=function(){function t(t,e){var r=new Matrix;r.reset();var s;if(s=e?this._elem.finalTransform.mProp:this._elem.finalTransform.mProp,s.applyToMatrix(r),this._elem.hierarchy&&this._elem.hierarchy.length){var i,a=this._elem.hierarchy.length;for(i=0;i<a;i+=1)this._elem.hierarchy[i].finalTransform.mProp.applyToMatrix(r);return r.applyToPointArray(t[0],t[1],t[2]||0)}return r.applyToPointArray(t[0],t[1],t[2]||0)}function e(t,e){var r=new Matrix;r.reset();var s;if(s=e?this._elem.finalTransform.mProp:this._elem.finalTransform.mProp,s.applyToMatrix(r),this._elem.hierarchy&&this._elem.hierarchy.length){var i,a=this._elem.hierarchy.length;for(i=0;i<a;i+=1)this._elem.hierarchy[i].finalTransform.mProp.applyToMatrix(r);return r.inversePoint(t)}return r.inversePoint(t)}function r(t){var e=new Matrix;if(e.reset(),this._elem.finalTransform.mProp.applyToMatrix(e),this._elem.hierarchy&&this._elem.hierarchy.length){var r,s=this._elem.hierarchy.length;for(r=0;r<s;r+=1)this._elem.hierarchy[r].finalTransform.mProp.applyToMatrix(e);return e.inversePoint(t)}return e.inversePoint(t)}return function(s){function i(t){n.mask=new MaskManagerInterface(t,s)}function a(t){n.effect=t}function n(t){switch(t){case"ADBE Root Vectors Group":case"Contents":case 2:return n.shapeInterface;case 1:case 6:case"Transform":case"transform":case"ADBE Transform Group":return o;case 4:case"ADBE Effect Parade":return n.effect}}var o;n.toWorld=t,n.fromWorld=e,n.toComp=t,n.fromComp=r,n.sourceRectAtTime=s.sourceRectAtTime.bind(s),n._elem=s,o=TransformExpressionInterface(s.finalTransform.mProp);var h=getDescriptor(o,"anchorPoint");return Object.defineProperties(n,{hasParent:{get:function(){return s.hierarchy.length}},parent:{get:function(){return s.hierarchy[0].layerInterface}},rotation:getDescriptor(o,"rotation"),scale:getDescriptor(o,"scale"),position:getDescriptor(o,"position"),opacity:getDescriptor(o,"opacity"),anchorPoint:h,anchor_point:h,transform:{get:function(){return o}},active:{get:function(){return s.isInRange}}}),n.startTime=s.data.st,n.index=s.data.ind,n.source=s.data.refId,n.height=0===s.data.ty?s.data.h:100,n.width=0===s.data.ty?s.data.w:100,n.registerMaskInterface=i,n.registerEffectsInterface=a,n}}(),CompExpressionInterface=function(){return function(t){function e(e){for(var r=0,s=t.layers.length;r<s;){if(t.layers[r].nm===e||t.layers[r].ind===e)return t._br[r].layerInterface;r+=1}return{active:!1}}return Object.defineProperty(e,"_name",{value:t.data.nm}),e.layer=e,e.pixelAspect=1,e.height=t._x.compSize.h,e.width=t._x.compSize.w,e.pixelAspect=1,e.frameDuration=1/t._x.frameRate,e}}(),TransformExpressionInterface=function(){return function(t){function e(t){switch(t){case"scale":case"Scale":case"ADBE Scale":case 6:return e.scale;case"rotation":case"Rotation":case"ADBE Rotation":case"ADBE Rotate Z":case 10:return e.rotation;case"position":case"Position":case"ADBE Position":case 2:return e.position;case"anchorPoint":case"AnchorPoint":case"Anchor Point":case"ADBE AnchorPoint":case 1:return e.anchorPoint;case"opacity":case"Opacity":case 11:return e.opacity}}return Object.defineProperty(e,"rotation",{get:function(){return t.r?ExpressionValue(t.r,1/degToRads):ExpressionValue(t.rz,1/degToRads)}}),Object.defineProperty(e,"scale",{get:function(){return ExpressionValue(t.s,100)}}),Object.defineProperty(e,"position",{get:function(){return t.p?ExpressionValue(t.p):[t.px.v,t.py.v,t.pz?t.pz.v:0]}}),Object.defineProperty(e,"xPosition",{get:function(){return ExpressionValue(t.px)}}),Object.defineProperty(e,"yPosition",{get:function(){return ExpressionValue(t.py)}}),Object.defineProperty(e,"zPosition",{get:function(){return ExpressionValue(t.pz)}}),Object.defineProperty(e,"anchorPoint",{get:function(){return ExpressionValue(t.a)}}),Object.defineProperty(e,"opacity",{get:function(){return ExpressionValue(t.o,100)}}),Object.defineProperty(e,"skew",{get:function(){return ExpressionValue(t.sk)}}),Object.defineProperty(e,"skewAxis",{get:function(){return ExpressionValue(t.sa)}}),Object.defineProperty(e,"orientation",{get:function(){return ExpressionValue(t.or)}}),e}}(),ProjectInterface=function(){function t(t){this.compositions.push(t)}return function(){function e(t){for(var e=0,r=this.compositions.length;e<r;){if(this.compositions[e].data&&this.compositions[e].data.nm===t)return this.compositions[e]._az&&this.compositions[e]._az(this.compositions[e].data.xt?this.currentFrame:this.compositions[e].renderedFrame),this.compositions[e].compInterface;e+=1}}return e.compositions=[],e.currentFrame=0,e.registerComposition=t,e}}(),EffectsExpressionInterface=function(){function t(t,r){if(t.effects){var s,i=[],a=t.data.ef,n=t.effects.effectElements.length;for(s=0;s<n;s+=1)i.push(e(a[s],t.effects.effectElements[s],r,t));return function(e){for(var r=t.data.ef,s=0,a=r.length;s<a;){if(e===r[s].nm||e===r[s].mn||e===r[s].ix)return i[s];s+=1}}}}function e(t,s,i,a){function n(t){return 1===t?p:i(t-1)}var o,h=[],l=t.ef.length;for(o=0;o<l;o+=1)5===t.ef[o].ty?h.push(e(t.ef[o],s.effectElements[o],s.effectElements[o].propertyGroup,a)):h.push(r(s.effectElements[o],t.ef[o].ty,a,n));var p=function(e){for(var r=t.ef,s=0,i=r.length;s<i;){if(e===r[s].nm||e===r[s].mn||e===r[s].ix)return 5===r[s].ty?h[s]:h[s]();s+=1}return h[0]()};return p.propertyGroup=n,"ADBE Color Control"===t.mn&&Object.defineProperty(p,"color",{get:function(){return h[0]()}}),Object.defineProperty(p,"numProperties",{get:function(){return t.np}}),p.active=0!==t.en,p}function r(t,e,r,s){function i(){return 10===e?r.comp.compInterface(t.p.v):ExpressionValue(t.p)}return t.p._ce&&t.p._ce(s),i}var s={createEffectsInterface:t};return s}(),MaskManagerInterface=function(){function t(t,e){this._mask=t,this._data=e}Object.defineProperty(t.prototype,"maskPath",{get:function(){return this._mask.prop.k&&this._mask.prop.getValue(),this._mask.prop}});var e=function(e,r){var s,i=Array.apply(null,{length:e.viewData.length}),a=e.viewData.length;for(s=0;s<a;s+=1)i[s]=new t(e.viewData[s],e.masksProperties[s]);var n=function(t){for(s=0;s<a;){if(e.masksProperties[s].nm===t)return i[s];s+=1}};return n};return e}(),ExpressionValue=function(){return function(t,e,r){var s;t.k&&t.getValue();var i,a,n;if(r){if("color"===r){for(a=4,s=createTypedArray("float32",a),n=createTypedArray("float32",a),i=0;i<a;i+=1)s[i]=n[i]=e&&i<3?t.v[i]*e:1;s.value=n}}else if("number"==typeof t.v||t.v instanceof Number)s=e?new Number(t.v*e):new Number(t.v),s.value=e?t.v*e:t.v;else{for(a=t.v.length,s=createTypedArray("float32",a),n=createTypedArray("float32",a),i=0;i<a;i+=1)s[i]=n[i]=e?t.v[i]*e:t.v[i];s.value=n}return s.numKeys=t.keyframes?t.keyframes.length:0,s.key=function(e){return s.numKeys?t.keyframes[e-1].t:0},s.valueAtTime=t.getValueAtTime,s.propertyGroup=t.propertyGroup,s}}();GroupEffect.prototype.getValue=function(){this.mdf=!1;var t,e=this.dynamicProperties.length;for(t=0;t<e;t+=1)this.dynamicProperties[t].getValue(),this.mdf=!!this.dynamicProperties[t].mdf||this.mdf},GroupEffect.prototype.init=function(t,e,r){this.data=t,this.mdf=!1,this.effectElements=[];var s,i,a=this.data.ef.length,n=this.data.ef;for(s=0;s<a;s+=1)switch(n[s].ty){case 0:i=new SliderEffect(n[s],e,r),this.effectElements.push(i);break;case 1:i=new AngleEffect(n[s],e,r),this.effectElements.push(i);break;case 2:i=new ColorEffect(n[s],e,r),this.effectElements.push(i);break;case 3:i=new PointEffect(n[s],e,r),this.effectElements.push(i);break;case 4:case 7:i=new CheckboxEffect(n[s],e,r),this.effectElements.push(i);break;case 10:i=new LayerIndexEffect(n[s],e,r),this.effectElements.push(i);break;case 11:i=new MaskIndexEffect(n[s],e,r),this.effectElements.push(i);break;case 5:i=new EffectsManager(n[s],e,r),this.effectElements.push(i);break;case 6:default:i=new NoValueEffect(n[s],e,r),this.effectElements.push(i)}};var lottiejs={};lottiejs.play=play,lottiejs.pause=pause,lottiejs.setLocationHref=setLocationHref,lottiejs.togglePause=togglePause,lottiejs.setSpeed=setSpeed,lottiejs.setDirection=setDirection,lottiejs.stop=stop,lottiejs.moveFrame=moveFrame,lottiejs.searchAnimations=searchAnimations,lottiejs.registerAnimation=registerAnimation,lottiejs.loadAnimation=loadAnimation,lottiejs.setSubframeRendering=setSubframeRendering,lottiejs.resize=resize,lottiejs.goToAndStop=goToAndStop,lottiejs.destroy=destroy,lottiejs.setQuality=setQuality,lottiejs.inBrowser=inBrowser,lottiejs.installPlugin=installPlugin,lottiejs.__getFactory=getFactory,lottiejs.version="5.0.6";var standalone="__[STANDALONE]__",animationData="__[ANIMATIONDATA]__",renderer="";if(standalone){var scripts=document.getElementsByTagName("script"),index=scripts.length-1,myScript=scripts[index]||{src:""},queryString=myScript.src.replace(/^[^\?]+\??/,"");renderer=getQueryVariable("renderer")}var readyStateCheckInterval=setInterval(checkReady,100);return lottiejs});
\ No newline at end of file
+!function(t,e){"function"==typeof define&&define.amd?define(function(){return e(t)}):"object"==typeof module&&module.exports?module.exports=e(t):(t.lottie=e(t),t.bodymovin=t.lottie)}(window||{},function(window){"use strict";function ProjectInterface(){return{}}function roundValues(t){bm_rnd=t?Math.round:function(t){return t}}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 BMEnterFrameEvent(t,e,r,s){this.type=t,this.currentTime=e,this.totalTime=r,this.direction=s<0?-1:1}function BMCompleteEvent(t,e){this.type=t,this.direction=e<0?-1:1}function BMCompleteLoopEvent(t,e,r,s){this.type=t,this.currentLoop=e,this.totalLoops=r,this.direction=s<0?-1:1}function BMSegmentStartEvent(t,e,r){this.type=t,this._ch=e,this.totalFrames=r}function BMDestroyEvent(t,e){this.type=t,this.target=e}function randomString(t,e){void 0===e&&(e="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890");var r,s="";for(r=t;r>0;--r)s+=e[Math.round(Math.random()*(e.length-1))];return s}function HSVtoRGB(t,e,r){var s,i,a,n,o,h,l,p;switch(1===arguments.length&&(e=t.s,r=t.v,t=t.h),n=Math.floor(6*t),o=6*t-n,h=r*(1-e),l=r*(1-o*e),p=r*(1-(1-o)*e),n%6){case 0:s=r,i=p,a=h;break;case 1:s=l,i=r,a=h;break;case 2:s=h,i=r,a=p;break;case 3:s=h,i=l,a=r;break;case 4:s=p,i=h,a=r;break;case 5:s=r,i=h,a=l}return[s,i,a]}function RGBtoHSV(t,e,r){1===arguments.length&&(e=t.g,r=t.b,t=t.r);var s,i=Math.max(t,e,r),a=Math.min(t,e,r),n=i-a,o=0===i?0:n/i,h=i/255;switch(i){case a:s=0;break;case t:s=e-r+n*(e<r?6:0),s/=6*n;break;case e:s=r-t+2*n,s/=6*n;break;case r:s=t-e+4*n,s/=6*n}return[s,o,h]}function addSaturationToRGB(t,e){var r=RGBtoHSV(255*t[0],255*t[1],255*t[2]);return r[1]+=e,r[1]>1?r[1]=1:r[1]<=0&&(r[1]=0),HSVtoRGB(r[0],r[1],r[2])}function addBrightnessToRGB(t,e){var r=RGBtoHSV(255*t[0],255*t[1],255*t[2]);return r[2]+=e,r[2]>1?r[2]=1:r[2]<0&&(r[2]=0),HSVtoRGB(r[0],r[1],r[2])}function addHueToRGB(t,e){var r=RGBtoHSV(255*t[0],255*t[1],255*t[2]);return r[0]+=e/360,r[0]>1?r[0]-=1:r[0]<0&&(r[0]+=1),HSVtoRGB(r[0],r[1],r[2])}function BaseEvent(){}function _cv(t){return Array.apply(null,{length:t})}function _ct(t){return document.createElementNS(svgNS,t)}function _cu(t){return document.createElement(t)}function extendPrototype(t,e){var r,s,i=t.length;for(r=0;r<i;r+=1){s=t[r].prototype;for(var a in s)s.hasOwnProperty(a)&&(e.prototype[a]=s[a])}}function getDescriptor(t,e){return Object.getOwnPropertyDescriptor(t,e)}function bezFunction(){function t(t,e,r,s,i,a){var n=t*s+e*i+r*a-i*s-a*t-r*e;return n>-1e-4&&n<1e-4}function e(e,r,s,i,a,n,o,h,l){if(0===s&&0===n&&0===l)return t(e,r,i,a,o,h);var p,m=Math.sqrt(Math.pow(i-e,2)+Math.pow(a-r,2)+Math.pow(n-s,2)),f=Math.sqrt(Math.pow(o-e,2)+Math.pow(h-r,2)+Math.pow(l-s,2)),c=Math.sqrt(Math.pow(o-i,2)+Math.pow(h-a,2)+Math.pow(l-n,2));return p=m>f?m>c?m-f-c:c-f-m:c>f?c-f-m:f-m-c,p>-1e-4&&p<1e-4}function r(t){var e,r=segments_length_pool.newElement(),s=t.c,i=t.v,a=t.o,n=t.i,o=t._length,l=r.lengths,p=0;for(e=0;e<o-1;e+=1)l[e]=h(i[e],i[e+1],a[e],n[e+1]),p+=l[e].addedLength;return s&&(l[e]=h(i[e],i[0],a[e],n[0]),p+=l[e].addedLength),r.totalLength=p,r}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 r=e.percents,s=e.lengths,i=r.length,a=bm_floor((i-1)*t),n=t*e.addedLength,o=0;if(a===i-1||0===a||n===s[a])return r[a];for(var h=s[a]>n?-1:1,l=!0;l;)if(s[a]<=n&&s[a+1]>n?(o=(n-s[a])/(s[a+1]-s[a]),l=!1):a+=h,a<0||a>=i-1){if(a===i-1)return r[a];l=!1}return r[a]+(r[a+1]-r[a])*o}function n(t,e,r,s,i,n){var o=a(i,n),h=1-o,l=Math.round(1e3*(h*h*h*t[0]+(o*h*h+h*o*h+h*h*o)*r[0]+(o*o*h+h*o*o+o*h*o)*s[0]+o*o*o*e[0]))/1e3,p=Math.round(1e3*(h*h*h*t[1]+(o*h*h+h*o*h+h*h*o)*r[1]+(o*o*h+h*o*o+o*h*o)*s[1]+o*o*o*e[1]))/1e3;return[l,p]}function o(t,e,r,s,i,n,o){i=i<0?0:i>1?1:i;var h=a(i,o);n=n>1?1:n;var l,m=a(n,o),f=t.length,c=1-h,d=1-m,u=c*c*c,y=h*c*c*3,g=h*h*c*3,v=h*h*h,b=c*c*d,E=h*c*d+c*h*d+c*c*m,P=h*h*d+c*h*m+h*c*m,x=h*h*m,S=c*d*d,C=h*d*d+c*m*d+c*d*m,A=h*m*d+c*m*m+h*d*m,k=h*m*m,M=d*d*d,T=m*d*d+d*m*d+d*d*m,D=m*m*d+d*m*m+m*d*m,w=m*m*m;for(l=0;l<f;l+=1)p[4*l]=Math.round(1e3*(u*t[l]+y*r[l]+g*s[l]+v*e[l]))/1e3,p[4*l+1]=Math.round(1e3*(b*t[l]+E*r[l]+P*s[l]+x*e[l]))/1e3,p[4*l+2]=Math.round(1e3*(S*t[l]+C*r[l]+A*s[l]+k*e[l]))/1e3,p[4*l+3]=Math.round(1e3*(M*t[l]+T*r[l]+D*s[l]+w*e[l]))/1e3;return p}var h=(Math,function(){return function(t,e,r,s){var i,a,n,o,h,l,p=defaultCurveSegments,m=0,f=[],c=[],d=bezier_length_pool.newElement();for(n=r.length,i=0;i<p;i+=1){for(h=i/(p-1),l=0,a=0;a<n;a+=1)o=bm_pow(1-h,3)*t[a]+3*bm_pow(1-h,2)*h*r[a]+3*(1-h)*bm_pow(h,2)*s[a]+bm_pow(h,3)*e[a],f[a]=o,null!==c[a]&&(l+=bm_pow(f[a]-c[a],2)),c[a]=f[a];l&&(l=bm_sqrt(l),m+=l),d.percents[i]=h,d.lengths[i]=m}return d.addedLength=m,d}}()),l=function(){var e={};return function(r){var a=r.s,n=r.e,o=r.to,h=r.ti,l=(a[0]+"_"+a[1]+"_"+n[0]+"_"+n[1]+"_"+o[0]+"_"+o[1]+"_"+h[0]+"_"+h[1]).replace(/\./g,"p");if(e[l])return void(r.bezierData=e[l]);var p,m,f,c,d,u,y,g=defaultCurveSegments,v=0,b=null;2===a.length&&(a[0]!=n[0]||a[1]!=n[1])&&t(a[0],a[1],n[0],n[1],a[0]+o[0],a[1]+o[1])&&t(a[0],a[1],n[0],n[1],n[0]+h[0],n[1]+h[1])&&(g=2);var E=new s(g);for(f=o.length,p=0;p<g;p+=1){for(y=_cv(f),d=p/(g-1),u=0,m=0;m<f;m+=1)c=bm_pow(1-d,3)*a[m]+3*bm_pow(1-d,2)*d*(a[m]+o[m])+3*(1-d)*bm_pow(d,2)*(n[m]+h[m])+bm_pow(d,3)*n[m],y[m]=c,null!==b&&(u+=bm_pow(y[m]-b[m],2));u=bm_sqrt(u),v+=u,E.points[p]=new i(u,y),b=y}E.segmentLength=v,r.bezierData=E,e[l]=E}}(),p=_cs("float32",8);return{getSegmentsLength:r,getNewSegment:o,getPointInSegment:n,buildBezierData:l,pointOnLine2D:t,pointOnLine3D:e}}function dataFunctionManager(){function t(i,a,o){var h,l,p,m,f,c,d,u,y=i.length;for(m=0;m<y;m+=1)if(h=i[m],"ks"in h&&!h.completed){if(h.completed=!0,h.tt&&(i[m-1].td=h.tt),l=[],p=-1,h.hasMask){var g=h.masksProperties;for(c=g.length,f=0;f<c;f+=1)if(g[f].pt.k.i)s(g[f].pt.k);else for(u=g[f].pt.k.length,d=0;d<u;d+=1)g[f].pt.k[d].s&&s(g[f].pt.k[d].s[0]),g[f].pt.k[d].e&&s(g[f].pt.k[d].e[0])}0===h.ty?(h.layers=e(h.refId,a),t(h.layers,a,o)):4===h.ty?r(h.shapes):5==h.ty&&n(h,o)}}function e(t,e){for(var r=0,s=e.length;r<s;){if(e[r].id===t)return e[r].layers.__used?JSON.parse(JSON.stringify(e[r].layers)):(e[r].layers.__used=!0,e[r].layers);r+=1}}function r(t){var e,i,a,n=t.length,o=!1;for(e=n-1;e>=0;e-=1)if("sh"==t[e].ty){if(t[e].ks.k.i)s(t[e].ks.k);else for(a=t[e].ks.k.length,i=0;i<a;i+=1)t[e].ks.k[i].s&&s(t[e].ks.k[i].s[0]),t[e].ks.k[i].e&&s(t[e].ks.k[i].e[0]);o=!0}else"gr"==t[e].ty&&r(t[e].it)}function s(t){var e,r=t.i.length;for(e=0;e<r;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 i(t,e){var r=e?e.split("."):[100,100,100];return t[0]>r[0]||!(r[0]>t[0])&&(t[1]>r[1]||!(r[1]>t[1])&&(t[2]>r[2]||!(r[2]>t[2])&&void 0))}function a(e,r){e.__complete||(l(e),o(e),h(e),p(e),t(e.layers,e.assets,r),e.__complete=!0)}function n(t,e){0!==t.t.a.length||"m"in t.t.p||(t.singleShape=!0)}var o=function(){function t(t){var e=t.t.d;t.t.d={k:[{s:e,t:0}]}}function e(e){var r,s=e.length;for(r=0;r<s;r+=1)5===e[r].ty&&t(e[r])}var r=[4,4,14];return function(t){if(i(r,t.v)&&(e(t.layers),t.assets)){var s,a=t.assets.length;for(s=0;s<a;s+=1)t.assets[s].layers&&e(t.assets[s].layers)}}}(),h=function(){var t=[4,7,99];return function(e){if(e.chars&&!i(t,e.v)){var r,a,n,o,h,l=e.chars.length;for(r=0;r<l;r+=1)if(e.chars[r].data&&e.chars[r].data.shapes)for(h=e.chars[r].data.shapes[0].it,n=h.length,a=0;a<n;a+=1)o=h[a].ks.k,o.__converted||(s(h[a].ks.k),o.__converted=!0)}}}(),l=function(){function t(e){var r,s,i,a=e.length;for(r=0;r<a;r+=1)if("gr"===e[r].ty)t(e[r].it);else if("fl"===e[r].ty||"st"===e[r].ty)if(e[r].c.k&&e[r].c.k[0].i)for(i=e[r].c.k.length,s=0;s<i;s+=1)e[r].c.k[s].s&&(e[r].c.k[s].s[0]/=255,e[r].c.k[s].s[1]/=255,e[r].c.k[s].s[2]/=255,e[r].c.k[s].s[3]/=255),e[r].c.k[s].e&&(e[r].c.k[s].e[0]/=255,e[r].c.k[s].e[1]/=255,e[r].c.k[s].e[2]/=255,e[r].c.k[s].e[3]/=255);else e[r].c.k[0]/=255,e[r].c.k[1]/=255,e[r].c.k[2]/=255,e[r].c.k[3]/=255}function e(e){var r,s=e.length;for(r=0;r<s;r+=1)4===e[r].ty&&t(e[r].shapes)}var r=[4,1,9];return function(t){if(i(r,t.v)&&(e(t.layers),t.assets)){var s,a=t.assets.length;for(s=0;s<a;s+=1)t.assets[s].layers&&e(t.assets[s].layers)}}}(),p=function(){function t(e){var r,s,i,a=e.length,n=!1;for(r=a-1;r>=0;r-=1)if("sh"==e[r].ty){if(e[r].ks.k.i)e[r].ks.k.c=e[r].closed;else for(i=e[r].ks.k.length,s=0;s<i;s+=1)e[r].ks.k[s].s&&(e[r].ks.k[s].s[0].c=e[r].closed),e[r].ks.k[s].e&&(e[r].ks.k[s].e[0].c=e[r].closed);n=!0}else"gr"==e[r].ty&&t(e[r].it)}function e(e){var r,s,i,a,n,o,h=e.length;for(s=0;s<h;s+=1){if(r=e[s],r.hasMask){var l=r.masksProperties;for(a=l.length,i=0;i<a;i+=1)if(l[i].pt.k.i)l[i].pt.k.c=l[i].cl;else for(o=l[i].pt.k.length,n=0;n<o;n+=1)l[i].pt.k[n].s&&(l[i].pt.k[n].s[0].c=l[i].cl),l[i].pt.k[n].e&&(l[i].pt.k[n].e[0].c=l[i].cl)}4===r.ty&&t(r.shapes)}}var r=[4,4,18];return function(t){if(i(r,t.v)&&(e(t.layers),t.assets)){var s,a=t.assets.length;for(s=0;s<a;s+=1)t.assets[s].layers&&e(t.assets[s].layers)}}}(),m={};return m.completeData=a,m}function _av(){this.c=!1,this._length=0,this._maxLength=8,this.v=_cv(this._maxLength),this.o=_cv(this._maxLength),this.i=_cv(this._maxLength)}function _at(){}function _an(){}function _au(){}function _aj(){}function _am(){this._length=0,this._maxLength=4,this.shapes=_cv(this._maxLength)}function DashProperty(t,e,r,s){this.elem=t,this.frameId=-1,this.dataProps=_cv(e.length),this.renderer=r,this.mdf=!1,this.k=!1,this.dashStr="",this.dashArray=_cs("float32",e.length-1),this.dashoffset=_cs("float32",1);var i,a,n=e.length;for(i=0;i<n;i+=1)a=_ai._bo(t,e[i].v,0,0,s),this.k=!!a.k||this.k,this.dataProps[i]={n:e[i].n,p:a};this.k?s.push(this):this.getValue(!0)}function GradientProperty(t,e,r){this.prop=_ai._bo(t,e.k,1,null,[]),this.data=e,this.k=this.prop.k,this.c=_cs("uint8c",4*e.p);var s=e.k.k[0].s?e.k.k[0].s.length-4*e.p:e.k.k.length-4*e.p;this.o=_cs("float32",s),this.cmdf=!1,this.omdf=!1,this._collapsable=this.checkCollapsable(),this._hasOpacity=s,this.prop.k&&r.push(this),this.getValue(!0)}function _bl(t,e,r){this.mdf=!1,this._ch=!0,this._hasMaskedPath=!1,this._frameId=-1,this.__co=[],this._textData=t,this._renderType=e,this._elem=r,this._animatorsData=_cv(this._textData.a.length),this._pathData={},this._moreOptions={alignment:{}},this._bt=[],this.lettersChangedFlag=!1}function TextAnimatorDataProperty(t,e,r){var s={propType:!1},i=_ai._bo,a=e.a;this.a={r:a.r?i(t,a.r,0,degToRads,r):s,rx:a.rx?i(t,a.rx,0,degToRads,r):s,ry:a.ry?i(t,a.ry,0,degToRads,r):s,sk:a.sk?i(t,a.sk,0,degToRads,r):s,sa:a.sa?i(t,a.sa,0,degToRads,r):s,s:a.s?i(t,a.s,1,.01,r):s,a:a.a?i(t,a.a,1,0,r):s,o:a.o?i(t,a.o,0,.01,r):s,p:a.p?i(t,a.p,1,0,r):s,sw:a.sw?i(t,a.sw,0,0,r):s,sc:a.sc?i(t,a.sc,1,0,r):s,fc:a.fc?i(t,a.fc,1,0,r):s,fh:a.fh?i(t,a.fh,0,0,r):s,fs:a.fs?i(t,a.fs,0,.01,r):s,fb:a.fb?i(t,a.fb,0,.01,r):s,t:a.t?i(t,a.t,0,0,r):s},this.s=TextSelectorProp.getTextSelectorProp(t,e.s,r),this.s.t=e.s.t}function LetterProps(t,e,r,s,i,a){this.o=t,this.sw=e,this.sc=r,this.fc=s,this.m=i,this.p=a,this.mdf={o:!0,sw:!!e,sc:!!r,fc:!!s,m:!0,p:!0}}function _ar(t,e,r){this._frameId=initialDefaultFrame,this.pv="",this.v="",this.kf=!1,this._ch=!0,this.mdf=!0,this.data=e,this.elem=t,this.keysIndex=-1,this.currentData={ascent:0,boxWidth:[0,0],f:"",fStyle:"",fWeight:"",fc:"",j:"",justifyOffset:"",l:[],lh:0,lineWidths:[],ls:"",of:"",s:"",sc:"",sw:0,t:0,tr:0,sz:0,ps:[0,0],fillColorAnim:!1,strokeColorAnim:!1,strokeWidthAnim:!1,yOffset:0,__complete:!1},this.searchProperty()?r.push(this):this.getValue(!0)}function _l(){}function _ao(t,e){this._cq=t,this.layers=null,this.renderedFrame=-1,this._cf=_ct("svg");var r=_ct("g");this._cf.appendChild(r),this._bx=r;var s=_ct("defs");this._cf.appendChild(s),this.renderConfig={preserveAspectRatio:e&&e.preserveAspectRatio||"xMidYMid meet",progressiveLoad:e&&e.progressiveLoad||!1,hideOnTransparent:!e||e.hideOnTransparent!==!1,viewBoxOnly:e&&e.viewBoxOnly||!1,viewBoxSize:e&&e.viewBoxSize||!1,className:e&&e.className||""},this._x={mdf:!1,frameNum:-1,defs:s,frameId:0,_de:{w:0,h:0},renderConfig:this.renderConfig,_cr:new FontManager},this._br=[],this._dc=[],this.destroyed=!1}function _ay(t,e,r){this._co=[],this.data=t,this.element=e,this._x=r,this.storedData=[],this.masksProperties=this.data.masksProperties||[],this.maskElement=null,this._ch=!0;var s,i=this._x.defs,a=this.masksProperties?this.masksProperties.length:0;this.viewData=_cv(a),this.solidPath="";var n,o,h,l,p,m,f,c=this.masksProperties,d=0,u=[],y=randomString(10),g="clipPath",v="clip-path";for(s=0;s<a;s++)if(("a"!==c[s].mode&&"n"!==c[s].mode||c[s].inv||100!==c[s].o.k)&&(g="mask",v="mask"),"s"!=c[s].mode&&"i"!=c[s].mode||0!=d?l=null:(l=_ct("rect"),l.setAttribute("fill","#ffffff"),l.setAttribute("width",this.element.comp.data.w),l.setAttribute("height",this.element.comp.data.h),u.push(l)),n=_ct("path"),"n"!=c[s].mode){if(d+=1,n.setAttribute("fill","s"===c[s].mode?"#000000":"#ffffff"),n.setAttribute("clip-rule","nonzero"),0!==c[s].x.k){g="mask",v="mask",f=_ai._bo(this.element,c[s].x,0,null,this._co);var b="fi_"+randomString(10);p=_ct("filter"),p.setAttribute("id",b),m=_ct("feMorphology"),m.setAttribute("operator","dilate"),m.setAttribute("in","SourceGraphic"),m.setAttribute("radius","0"),p.appendChild(m),i.appendChild(p),n.setAttribute("stroke","s"===c[s].mode?"#000000":"#ffffff")}else m=null,f=null;if(this.storedData[s]={elem:n,x:f,expan:m,lastPath:"",lastOperator:"",filterId:b,lastRadius:0},"i"==c[s].mode){h=u.length;var E=_ct("g");for(o=0;o<h;o+=1)E.appendChild(u[o]);var P=_ct("mask");P.setAttribute("mask-type","alpha"),P.setAttribute("id",y+"_"+d),P.appendChild(n),i.appendChild(P),E.setAttribute("mask","url("+locationHref+"#"+y+"_"+d+")"),u.length=0,u.push(E)}else u.push(n);c[s].inv&&!this.solidPath&&(this.solidPath=this.createLayerSolidPath()),this.viewData[s]={elem:n,lastPath:"",op:_ai._bo(this.element,c[s].o,0,.01,this._co),prop:_ah._bp(this.element,c[s],3,this._co,null)},l&&(this.viewData[s].invRect=l),this.viewData[s].prop.k||this.drawPath(c[s],this.viewData[s].prop.v,this.viewData[s])}else this.viewData[s]={op:_ai._bo(this.element,c[s].o,0,.01,this._co),prop:_ah._bp(this.element,c[s],3,this._co,null),elem:n},i.appendChild(n);for(this.maskElement=_ct(g),a=u.length,s=0;s<a;s+=1)this.maskElement.appendChild(u[s]);d>0&&(this.maskElement.setAttribute("id",y),this.element._ca.setAttribute(v,"url("+locationHref+"#"+y+")"),i.appendChild(this.maskElement))}function _ad(){}function _ac(){}function _af(){}function _ae(){}function _ci(){}function ProcessedElement(t,e){this.elem=t,this.pos=e}function SVGStyleData(t,e){this.data=t,this.type=t.ty,this.d="",this.lvl=e,this.mdf=!1,this.closed=!1,this.pElem=_ct("path"),this.msElem=null}function SVGShapeData(t,e,r){this.caches=[],this.styles=[],this.transformers=t,this.lStr="",this.sh=r,this.lvl=e}function SVGTransformData(t,e){this.transform={mProps:t,op:e},this._br=[]}function SVGStrokeStyleData(t,e,r,s){this.o=_ai._bo(t,e.o,0,.01,r),this.w=_ai._bo(t,e.w,0,null,r),this.d=new DashProperty(t,e.d||{},"svg",r),this.c=_ai._bo(t,e.c,1,255,r),this.style=s}function SVGFillStyleData(t,e,r,s){this.o=_ai._bo(t,e.o,0,.01,r),this.c=_ai._bo(t,e.c,1,255,r),this.style=s}function _ck(t,e,r,s){this.initGradientData(t,e,r,s)}function _cj(t,e,r,s){this.w=_ai._bo(t,e.w,0,null,r),this.d=new DashProperty(t,e.d||{},"svg",r),this.initGradientData(t,e,r,s)}function ShapeGroupData(){this.it=[],this.prevViewData=[],this.gr=_ct("g")}function _e(){}function _i(t,e,r){this.initFrame(),this.initBaseData(t,e,r),this.initFrame(),this.initTransform(t,e,r),this.initHierarchy()}function _d(){}function _f(){}function _k(){}function _g(){}function _h(t,e,r){this.assetData=e.getAssetData(t.refId),this._cz(t,e,r)}function _j(t,e,r){this._cz(t,e,r)}function SVGCompElement(t,e,r){this.layers=t.layers,this.supports3d=!0,this._db=!1,this._dc=[],this._br=this.layers?_cv(this.layers.length):[],this._cz(t,e,r),this.tm=t.tm?_ai._bo(this,t.tm,0,e.frameRate,this._co):{_placeholder:!0}}function _cw(t,e,r){this.textSpans=[],this.renderType="svg",this._cz(t,e,r)}function SVGShapeElement(t,e,r){this.shapes=[],this.shapesData=t.shapes,this.stylesList=[],this.shapeModifiers=[],this.itemsData=[],this.processedElements=[],this._cz(t,e,r),this.prevViewData=[]}function _bb(t,e){this._cl=e;var r=_ct("feColorMatrix");if(r.setAttribute("type","matrix"),r.setAttribute("color-interpolation-filters","linearRGB"),r.setAttribute("values","0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0 0 0 1 0"),r.setAttribute("result","f1"),t.appendChild(r),r=_ct("feColorMatrix"),r.setAttribute("type","matrix"),r.setAttribute("color-interpolation-filters","sRGB"),r.setAttribute("values","1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0"),r.setAttribute("result","f2"),t.appendChild(r),this.matrixFilter=r,100!==e._cm[2].p.v||e._cm[2].p.k){var s=_ct("feMerge");t.appendChild(s);var i;i=_ct("feMergeNode"),i.setAttribute("in","SourceGraphic"),s.appendChild(i),i=_ct("feMergeNode"),i.setAttribute("in","f2"),s.appendChild(i)}}function _bc(t,e){this._cl=e;var r=_ct("feColorMatrix");r.setAttribute("type","matrix"),r.setAttribute("color-interpolation-filters","sRGB"),r.setAttribute("values","1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0"),t.appendChild(r),this.matrixFilter=r}function _bd(t,e){this.initialized=!1,this._cl=e,this.elem=t,this.paths=[]}function _be(t,e){this._cl=e;var r=_ct("feColorMatrix");r.setAttribute("type","matrix"),r.setAttribute("color-interpolation-filters","linearRGB"),r.setAttribute("values","0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0 0 0 1 0"),r.setAttribute("result","f1"),t.appendChild(r);var s=_ct("feComponentTransfer");s.setAttribute("color-interpolation-filters","sRGB"),t.appendChild(s),this.matrixFilter=s;var i=_ct("feFuncR");i.setAttribute("type","table"),s.appendChild(i),this.feFuncR=i;var a=_ct("feFuncG");a.setAttribute("type","table"),s.appendChild(a),this.feFuncG=a;var n=_ct("feFuncB");n.setAttribute("type","table"),s.appendChild(n),this.feFuncB=n}function _bf(t,e){this._cl=e;var r=this._cl._cm,s=_ct("feComponentTransfer");(r[10].p.k||0!==r[10].p.v||r[11].p.k||1!==r[11].p.v||r[12].p.k||1!==r[12].p.v||r[13].p.k||0!==r[13].p.v||r[14].p.k||1!==r[14].p.v)&&(this.feFuncR=this.createFeFunc("feFuncR",s)),(r[17].p.k||0!==r[17].p.v||r[18].p.k||1!==r[18].p.v||r[19].p.k||1!==r[19].p.v||r[20].p.k||0!==r[20].p.v||r[21].p.k||1!==r[21].p.v)&&(this.feFuncG=this.createFeFunc("feFuncG",s)),(r[24].p.k||0!==r[24].p.v||r[25].p.k||1!==r[25].p.v||r[26].p.k||1!==r[26].p.v||r[27].p.k||0!==r[27].p.v||r[28].p.k||1!==r[28].p.v)&&(this.feFuncB=this.createFeFunc("feFuncB",s)),(r[31].p.k||0!==r[31].p.v||r[32].p.k||1!==r[32].p.v||r[33].p.k||1!==r[33].p.v||r[34].p.k||0!==r[34].p.v||r[35].p.k||1!==r[35].p.v)&&(this.feFuncA=this.createFeFunc("feFuncA",s)),(this.feFuncR||this.feFuncG||this.feFuncB||this.feFuncA)&&(s.setAttribute("color-interpolation-filters","sRGB"),t.appendChild(s),s=_ct("feComponentTransfer")),(r[3].p.k||0!==r[3].p.v||r[4].p.k||1!==r[4].p.v||r[5].p.k||1!==r[5].p.v||r[6].p.k||0!==r[6].p.v||r[7].p.k||1!==r[7].p.v)&&(s.setAttribute("color-interpolation-filters","sRGB"),t.appendChild(s),this.feFuncRComposed=this.createFeFunc("feFuncR",s),this.feFuncGComposed=this.createFeFunc("feFuncG",s),this.feFuncBComposed=this.createFeFunc("feFuncB",s))}function _bg(t,e){t.setAttribute("x","-100%"),t.setAttribute("y","-100%"),t.setAttribute("width","400%"),t.setAttribute("height","400%"),this._cl=e;var r=_ct("feGaussianBlur");r.setAttribute("in","SourceAlpha"),r.setAttribute("result","drop_shadow_1"),r.setAttribute("stdDeviation","0"),this.feGaussianBlur=r,t.appendChild(r);var s=_ct("feOffset");s.setAttribute("dx","25"),s.setAttribute("dy","0"),s.setAttribute("in","drop_shadow_1"),s.setAttribute("result","drop_shadow_2"),this.feOffset=s,t.appendChild(s);var i=_ct("feFlood");i.setAttribute("flood-color","#00ff00"),i.setAttribute("flood-opacity","1"),i.setAttribute("result","drop_shadow_3"),this.feFlood=i,t.appendChild(i);var a=_ct("feComposite");a.setAttribute("in","drop_shadow_3"),a.setAttribute("in2","drop_shadow_2"),a.setAttribute("operator","in"),a.setAttribute("result","drop_shadow_4"),t.appendChild(a);var n=_ct("feMerge");t.appendChild(n);var o;o=_ct("feMergeNode"),n.appendChild(o),o=_ct("feMergeNode"),o.setAttribute("in","SourceGraphic"),this.feMergeNode=o,this.feMerge=n,this.originalNodeAdded=!1,n.appendChild(o)}function _bh(t,e,r){this.initialized=!1,this._cl=e,this.filterElem=t,this.elem=r,r.matteElement=_ct("g"),r.matteElement.appendChild(r._bx),r.matteElement.appendChild(r._bz),r._by=r.matteElement}function _bi(t){var e,r=t.data.ef?t.data.ef.length:0,s=randomString(10),i=filtersFactory.createFilter(s),a=0;this.filters=[];var n;for(e=0;e<r;e+=1)20===t.data.ef[e].ty?(a+=1,n=new _bb(i,t.effects._cm[e]),this.filters.push(n)):21===t.data.ef[e].ty?(a+=1,n=new _bc(i,t.effects._cm[e]),this.filters.push(n)):22===t.data.ef[e].ty?(n=new _bd(t,t.effects._cm[e]),this.filters.push(n)):23===t.data.ef[e].ty?(a+=1,n=new _be(i,t.effects._cm[e]),this.filters.push(n)):24===t.data.ef[e].ty?(a+=1,n=new _bf(i,t.effects._cm[e]),this.filters.push(n)):25===t.data.ef[e].ty?(a+=1,n=new _bg(i,t.effects._cm[e]),this.filters.push(n)):28===t.data.ef[e].ty&&(n=new _bh(i,t.effects._cm[e],t),this.filters.push(n));a&&(t._x.defs.appendChild(i),t._bx.setAttribute("filter","url("+locationHref+"#"+s+")"))}function _aq(t,e){this._cq=t,this.renderConfig={clearCanvas:!e||void 0===e.clearCanvas||e.clearCanvas,context:e&&e.context||null,progressiveLoad:e&&e.progressiveLoad||!1,preserveAspectRatio:e&&e.preserveAspectRatio||"xMidYMid meet",className:e&&e.className||""},this.renderConfig.dpr=e&&e.dpr||1,this._cq.wrapper&&(this.renderConfig.dpr=e&&e.dpr||window.devicePixelRatio||1),this.renderedFrame=-1,this._x={frameNum:-1,mdf:!1,renderConfig:this.renderConfig};this.contextData=new _n,this._br=[],this._dc=[],this.transformMat=new Matrix,this._db=!1}function _ap(t,e){this._cq=t,this.layers=null,this.renderedFrame=-1,this.renderConfig={className:e&&e.className||"",hideOnTransparent:!e||e.hideOnTransparent!==!1},this._x={mdf:!1,frameNum:-1,renderConfig:this.renderConfig},this._dc=[],this._br=[],this.threeDElements=[],this.destroyed=!1,this.camera=null,this.supports3d=!0}function _n(){this.saved=[],this.cArrPos=0,this.cTr=new Matrix,this.cO=1;var t,e=15;for(this.savedOp=_cs("float32",e),t=0;t<e;t+=1)this.saved[t]=_cs("float32",16);this._length=e}function _c(t,e,r){}function _p(t,e,r){this.failed=!1,this.img=new Image,this.assetData=e.getAssetData(t.refId),this._cz(t,e,r),this._x.addPendingElement()}function _m(t,e,r){this._db=!1,this.layers=t.layers,this._dc=[],this._br=_cv(this.layers.length),this._cz(t,e,r),this.tm=t.tm?_ai._bo(this,t.tm,0,e.frameRate,this._co):{_placeholder:!0}}function _q(t,e){this.data=t,this.element=e,this._co=[],this.masksProperties=this.data.masksProperties||[],this.viewData=_cv(this.masksProperties.length);var r,s=this.masksProperties.length,i=!1;for(r=0;r<s;r++)"n"!==this.masksProperties[r].mode&&(i=!0),this.viewData[r]=_ah._bp(this.element,this.masksProperties[r],3,this._co,null);this.hasMasks=i}function _r(t,e,r){this.shapes=[],this.shapesData=t.shapes,this.stylesList=[],this.itemsData=[],this.prevViewData=[],this.shapeModifiers=[],this.processedElements=[],this._cz(t,e,r)}function _s(t,e,r){this._cz(t,e,r)}function _t(t,e,r){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._cz(t,e,r)}function _o(){}function _b(t,e,r){}function _aa(t,e,r){this._cz(t,e,r)}function _w(t,e,r){this.layers=t.layers,this.supports3d=!t.hasMask,this._db=!1,this._dc=[],this._br=this.layers?_cv(this.layers.length):[],this.tm=t.tm?_ai._bo(this,t.tm,0,e.frameRate,this._co):{_placeholder:!0},this._cz(t,e,r)}function _z(t,e,r){this.shapes=[],this.shapesData=t.shapes,this.stylesList=[],this.shapeModifiers=[],this.itemsData=[],this.processedElements=[],this.shapesContainer=_ct("g"),this._cz(t,e,r),this.prevViewData=[],this._cg={x:999999,y:-999999,h:0,w:0}}function _ab(t,e,r){this.textSpans=[],this.textPaths=[],this._cg={x:999999,y:-999999,h:0,w:0},this.renderType="svg",this.isMasked=!1,this._cz(t,e,r)}function _y(t,e,r){this.assetData=e.getAssetData(t.refId),this._cz(t,e,r)}function _v(t,e,r){this.initFrame(),this.initBaseData(t,e,r);var s=_ai._bo;if(this.pe=s(this,t.pe,0,0,this._co),t.ks.p.s?(this.px=s(this,t.ks.p.x,1,0,this._co),this.py=s(this,t.ks.p.y,1,0,this._co),this.pz=s(this,t.ks.p.z,1,0,this._co)):this.p=s(this,t.ks.p,1,0,this._co),t.ks.a&&(this.a=s(this,t.ks.a,1,0,this._co)),t.ks.or.k.length&&t.ks.or.k[0].to){var i,a=t.ks.or.k.length;for(i=0;i<a;i+=1)t.ks.or.k[i].to=null,t.ks.or.k[i].ti=null}this.or=s(this,t.ks.or,1,degToRads,this._co),this.or.sh=!0,this.rx=s(this,t.ks.rx,0,degToRads,this._co),this.ry=s(this,t.ks.ry,0,degToRads,this._co),this.rz=s(this,t.ks.rz,0,degToRads,this._co),this.mat=new Matrix,this._prevMat=new Matrix,this._ch=!0}function _bv(){}function SliderEffect(t,e,r){this.p=_ai._bo(e,t.v,0,0,r)}function AngleEffect(t,e,r){this.p=_ai._bo(e,t.v,0,0,r)}function ColorEffect(t,e,r){this.p=_ai._bo(e,t.v,1,0,r)}function PointEffect(t,e,r){this.p=_ai._bo(e,t.v,1,0,r)}function LayerIndexEffect(t,e,r){this.p=_ai._bo(e,t.v,0,0,r)}function MaskIndexEffect(t,e,r){this.p=_ai._bo(e,t.v,0,0,r)}function CheckboxEffect(t,e,r){this.p=_ai._bo(e,t.v,0,0,r)}function NoValueEffect(){this.p={}}function EffectsManager(t,e,r){var s=t.ef||[];this._cm=[];var i,a,n=s.length;for(i=0;i<n;i++)a=new GroupEffect(s[i],e,r),this._cm.push(a)}function GroupEffect(t,e,r){this._co=[],this.init(t,e,this._co),this._co.length&&r.push(this)}function setLocationHref(t){locationHref=t}function play(t){animationManager.play(t)}function pause(t){animationManager.pause(t)}function togglePause(t){animationManager.togglePause(t)}function setSpeed(t,e){animationManager.setSpeed(t,e)}function setDirection(t,e){animationManager.setDirection(t,e)}function stop(t){animationManager.stop(t)}function moveFrame(t){animationManager.moveFrame(t)}function searchAnimations(){standalone===!0?animationManager.searchAnimations(animationData,standalone,renderer):animationManager.searchAnimations()}function registerAnimation(t){return animationManager.registerAnimation(t)}function resize(){animationManager.resize()}function goToAndStop(t,e,r){animationManager.goToAndStop(t,e,r)}function setSubframeRendering(t){subframeEnabled=t}function loadAnimation(t){return standalone===!0&&(t.animationData=JSON.parse(animationData)),animationManager.loadAnimation(t)}function destroy(t){return animationManager.destroy(t)}function setQuality(t){if("string"==typeof t)switch(t){case"high":defaultCurveSegments=200;break;case"medium":defaultCurveSegments=50;break;case"low":defaultCurveSegments=10}else!isNaN(t)&&t>1&&(defaultCurveSegments=t);roundValues(!(defaultCurveSegments>=50))}function inBrowser(){return"undefined"!=typeof navigator}function installPlugin(t,e){"expressions"===t&&(expressionsPlugin=e)}function getFactory(t){switch(t){case"propertyFactory":return _ai;case"shape_ai":return _ah;case"matrix":return Matrix}}function checkReady(){"complete"===document.readyState&&(clearInterval(readyStateCheckInterval),searchAnimations())}function getQueryVariable(t){for(var e=queryString.split("&"),r=0;r<e.length;r++){var s=e[r].split("=");if(decodeURIComponent(s[0])==t)return decodeURIComponent(s[1])}}var svgNS="http://www.w3.org/2000/svg",locationHref="",initialDefaultFrame=-999999,subframeEnabled=!0,expressionsPlugin,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,blitter=10,BMMath={};!function(){var t,e=Object.getOwnPropertyNames(Math),r=e.length;for(t=0;t<r;t+=1)BMMath[e[t]]=Math[e[t]]}(),BMMath.random=Math.random,BMMath.abs=function(t){var e=typeof t;if("object"===e&&t.length){var r,s=_cv(t.length),i=t.length;for(r=0;r<i;r+=1)s[r]=Math.abs(t[r]);return s}return Math.abs(t)};var defaultCurveSegments=150,degToRads=Math.PI/180,roundCorner=.5519;roundValues(!1);var rgbToHex=function(){var t,e,r=[];for(t=0;t<256;t+=1)e=t.toString(16),r[t]=1==e.length?"0"+e:e;return function(t,e,s){return t<0&&(t=0),e<0&&(e=0),s<0&&(s=0),"#"+r[t]+r[e]+r[s]}}();BaseEvent.prototype={_cy:function(t,e){if(this._cbs[t])for(var r=this._cbs[t].length,s=0;s<r;s++)this._cbs[t][s](e)},addEventListener:function(t,e){return this._cbs[t]||(this._cbs[t]=[]),this._cbs[t].push(e),function(){this.removeEventListener(t,e)}.bind(this)},removeEventListener:function(t,e){if(e){if(this._cbs[t]){for(var r=0,s=this._cbs[t].length;r<s;)this._cbs[t][r]===e&&(this._cbs[t].splice(r,1),r-=1,s-=1),r+=1;this._cbs[t].length||(this._cbs[t]=null)}}else this._cbs[t]=null}};var _cs=function(){function t(t,e){var r,s=0,i=[];
+switch(t){case"int16":case"uint8c":r=1;break;default:r=1.1}for(s=0;s<e;s+=1)i.push(r);return i}function e(t,e){return"float32"===t?new Float32Array(e):"int16"===t?new Int16Array(e):"uint8c"===t?new Uint8ClampedArray(e):void 0}return"function"==typeof Uint8ClampedArray&&"function"==typeof Float32Array?e:t}(),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=k(t),r=M(t);return this._t(e,-r,0,0,r,e,0,0,0,0,1,0,0,0,0,1)}function r(t){if(0===t)return this;var e=k(t),r=M(t);return this._t(1,0,0,0,0,e,-r,0,0,r,e,0,0,0,0,1)}function s(t){if(0===t)return this;var e=k(t),r=M(t);return this._t(e,0,r,0,0,1,0,0,-r,0,e,0,0,0,0,1)}function i(t){if(0===t)return this;var e=k(t),r=M(t);return this._t(e,-r,0,0,r,e,0,0,0,0,1,0,0,0,0,1)}function a(t,e){return this._t(1,e,t,1,0,0)}function n(t,e){return this.shear(T(t),T(e))}function o(t,e){var r=k(e),s=M(e);return this._t(r,s,0,0,-s,r,0,0,0,0,1,0,0,0,0,1)._t(1,0,0,0,T(t),1,0,0,0,0,1,0,0,0,0,1)._t(r,-s,0,0,s,r,0,0,0,0,1,0,0,0,0,1)}function h(t,e,r){return r=isNaN(r)?1:r,1==t&&1==e&&1==r?this:this._t(t,0,0,0,0,e,0,0,0,0,r,0,0,0,0,1)}function l(t,e,r,s,i,a,n,o,h,l,p,m,f,c,d,u){return this.props[0]=t,this.props[1]=e,this.props[2]=r,this.props[3]=s,this.props[4]=i,this.props[5]=a,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]=c,this.props[14]=d,this.props[15]=u,this}function p(t,e,r){return r=r||0,0!==t||0!==e||0!==r?this._t(1,0,0,0,0,1,0,0,0,0,1,0,t,e,r,1):this}function m(t,e,r,s,i,a,n,o,h,l,p,m,f,c,d,u){if(1===t&&0===e&&0===r&&0===s&&0===i&&1===a&&0===n&&0===o&&0===h&&0===l&&1===p&&0===m)return this.props[12]=this.props[12]*t+this.props[15]*f,this.props[13]=this.props[13]*a+this.props[15]*c,this.props[14]=this.props[14]*p+this.props[15]*d,this.props[15]=this.props[15]*u,this._identityCalculated=!1,this;var y=this.props[0],g=this.props[1],v=this.props[2],b=this.props[3],E=this.props[4],P=this.props[5],x=this.props[6],S=this.props[7],C=this.props[8],A=this.props[9],k=this.props[10],M=this.props[11],T=this.props[12],D=this.props[13],w=this.props[14],F=this.props[15];return this.props[0]=y*t+g*i+v*h+b*f,this.props[1]=y*e+g*a+v*l+b*c,this.props[2]=y*r+g*n+v*p+b*d,this.props[3]=y*s+g*o+v*m+b*u,this.props[4]=E*t+P*i+x*h+S*f,this.props[5]=E*e+P*a+x*l+S*c,this.props[6]=E*r+P*n+x*p+S*d,this.props[7]=E*s+P*o+x*m+S*u,this.props[8]=C*t+A*i+k*h+M*f,this.props[9]=C*e+A*a+k*l+M*c,this.props[10]=C*r+A*n+k*p+M*d,this.props[11]=C*s+A*o+k*m+M*u,this.props[12]=T*t+D*i+w*h+F*f,this.props[13]=T*e+D*a+w*l+F*c,this.props[14]=T*r+D*n+w*p+F*d,this.props[15]=T*s+D*o+w*m+F*u,this._identityCalculated=!1,this}function f(){return this._identityCalculated||(this._identity=!(1!==this.props[0]||0!==this.props[1]||0!==this.props[2]||0!==this.props[3]||0!==this.props[4]||1!==this.props[5]||0!==this.props[6]||0!==this.props[7]||0!==this.props[8]||0!==this.props[9]||1!==this.props[10]||0!==this.props[11]||0!==this.props[12]||0!==this.props[13]||0!==this.props[14]||1!==this.props[15]),this._identityCalculated=!0),this._identity}function c(t){for(var e=0;e<16;){if(t.props[e]!==this.props[e])return!1;e+=1}return!0}function d(t){var e;for(e=0;e<16;e+=1)t.props[e]=this.props[e]}function u(t){var e;for(e=0;e<16;e+=1)this.props[e]=t[e]}function y(t,e,r){return{x:t*this.props[0]+e*this.props[4]+r*this.props[8]+this.props[12],y:t*this.props[1]+e*this.props[5]+r*this.props[9]+this.props[13],z:t*this.props[2]+e*this.props[6]+r*this.props[10]+this.props[14]}}function g(t,e,r){return t*this.props[0]+e*this.props[4]+r*this.props[8]+this.props[12]}function v(t,e,r){return t*this.props[1]+e*this.props[5]+r*this.props[9]+this.props[13]}function b(t,e,r){return t*this.props[2]+e*this.props[6]+r*this.props[10]+this.props[14]}function E(t){var e=this.props[0]*this.props[5]-this.props[1]*this.props[4],r=this.props[5]/e,s=-this.props[1]/e,i=-this.props[4]/e,a=this.props[0]/e,n=(this.props[4]*this.props[13]-this.props[5]*this.props[12])/e,o=-(this.props[0]*this.props[13]-this.props[1]*this.props[12])/e;return[t[0]*r+t[1]*i+n,t[0]*s+t[1]*a+o,0]}function P(t){var e,r=t.length,s=[];for(e=0;e<r;e+=1)s[e]=E(t[e]);return s}function x(t,e,r,s){if(s&&2===s){var i=point_pool.newElement();return i[0]=t*this.props[0]+e*this.props[4]+r*this.props[8]+this.props[12],i[1]=t*this.props[1]+e*this.props[5]+r*this.props[9]+this.props[13],i}return[t*this.props[0]+e*this.props[4]+r*this.props[8]+this.props[12],t*this.props[1]+e*this.props[5]+r*this.props[9]+this.props[13],t*this.props[2]+e*this.props[6]+r*this.props[10]+this.props[14]]}function S(t,e){return this.isIdentity()?t+","+e:t*this.props[0]+e*this.props[4]+this.props[12]+","+(t*this.props[1]+e*this.props[5]+this.props[13])}function C(){for(var t=0,e=this.props,r="matrix3d(",s=1e4;t<16;)r+=D(e[t]*s)/s,r+=15===t?")":",",t+=1;return r}function A(){var t=1e4,e=this.props;return"matrix("+D(e[0]*t)/t+","+D(e[1]*t)/t+","+D(e[4]*t)/t+","+D(e[5]*t)/t+","+D(e[12]*t)/t+","+D(e[13]*t)/t+")"}var k=Math.cos,M=Math.sin,T=Math.tan,D=Math.round;return function(){this.reset=t,this.rotate=e,this.rotateX=r,this.rotateY=s,this.rotateZ=i,this.skew=n,this.skewFromAxis=o,this.shear=a,this.scale=h,this.setTransform=l,this.translate=p,this.transform=m,this.applyToPoint=y,this.applyToX=g,this.applyToY=v,this.applyToZ=b,this._cn=x,this.applyToPointStringified=S,this.toCSS=C,this.to2dCSS=A,this.clone=d,this.cloneFromProps=u,this.equals=c,this.inversePoints=P,this.inversePoint=E,this._t=this.transform,this.isIdentity=f,this._identity=!0,this._identityCalculated=!1,this.props=_cs("float32",16),this.reset()}}();!function(t,e){function r(r,l,p){var c=[];l=1==l?{entropy:!0}:l||{};var v=n(a(l.entropy?[r,h(t)]:null==r?o():r,3),c),b=new s(c),E=function(){for(var t=b.g(f),e=u,r=0;t<y;)t=(t+r)*m,e*=m,r=b.g(1);for(;t>=g;)t/=2,e/=2,r>>>=1;return(t+r)/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,r,s,a){return a&&(a.S&&i(a,b),t.state=function(){return i(b,{})}),s?(e[d]=t,r):t})(E,v,"global"in l?l.global:this==e,l.state)}function s(t){var e,r=t.length,s=this,i=0,a=s.i=s.j=0,n=s.S=[];for(r||(t=[r++]);i<m;)n[i]=i++;for(i=0;i<m;i++)n[i]=n[a=v&a+t[i%r]+(e=n[i])],n[a]=e;(s.g=function(t){for(var e,r=0,i=s.i,a=s.j,n=s.S;t--;)e=n[i=v&i+1],r=r*m+n[v&(n[i]=n[a=v&a+e])+(n[a]=e)];return s.i=i,s.j=a,r})(m)}function i(t,e){return e.i=t.i,e.j=t.j,e.S=t.S.slice(),e}function a(t,e){var r,s=[],i=typeof t;if(e&&"object"==i)for(r in t)try{s.push(a(t[r],e-1))}catch(n){}return s.length?s:"string"==i?t:t+"\0"}function n(t,e){for(var r,s=t+"",i=0;i<s.length;)e[v&i]=v&(r^=19*e[v&i])+s.charCodeAt(i++);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(r){var s=p.navigator,i=s&&s.plugins;return[+new Date,p,i,p.screen,h(t)]}}function h(t){return String.fromCharCode.apply(0,t)}var l,p=this,m=256,f=6,c=52,d="random",u=e.pow(m,f),y=e.pow(2,c),g=2*y,v=m-1;e["seed"+d]=r,n(e.random(),t)}([],BMMath);var BezierFactory=function(){function t(t,e,r,s,i){var a=i||("bez_"+t+"_"+e+"_"+r+"_"+s).replace(/\./g,"p");if(p[a])return p[a];var n=new h([t,e,r,s]);return p[a]=n,n}function e(t,e){return 1-3*e+3*t}function r(t,e){return 3*e-6*t}function s(t){return 3*t}function i(t,i,a){return((e(i,a)*t+r(i,a))*t+s(i))*t}function a(t,i,a){return 3*e(i,a)*t*t+2*r(i,a)*t+s(i)}function n(t,e,r,s,a){var n,o,h=0;do o=e+(r-e)/2,n=i(o,s,a)-t,n>0?r=o:e=o;while(Math.abs(n)>c&&++h<d);return o}function o(t,e,r,s){for(var n=0;n<m;++n){var o=a(e,r,s);if(0===o)return e;var h=i(e,r,s)-t;e-=h/o}return e}function h(t){this._p=t,this._mSampleValues=g?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,c=1e-7,d=10,u=11,y=1/(u-1),g="function"==typeof Float32Array;return h.prototype={get:function(t){var e=this._p[0],r=this._p[1],s=this._p[2],a=this._p[3];return this._precomputed||this._precompute(),e===r&&s===a?t:0===t?0:1===t?1:i(this._getTForX(t),r,a)},_precompute:function(){var t=this._p[0],e=this._p[1],r=this._p[2],s=this._p[3];this._precomputed=!0,t===e&&r===s||this._calcSampleValues()},_calcSampleValues:function(){for(var t=this._p[0],e=this._p[2],r=0;r<u;++r)this._mSampleValues[r]=i(r*y,t,e)},_getTForX:function(t){for(var e=this._p[0],r=this._p[2],s=this._mSampleValues,i=0,h=1,l=u-1;h!==l&&s[h]<=t;++h)i+=y;--h;var p=(t-s[h])/(s[h+1]-s[h]),m=i+p*y,c=a(m,e,r);return c>=f?o(t,m,e,r):0===c?m:n(t,i,i+y,e,r)}},l}();!function(){for(var t=0,e=["ms","moz","webkit","o"],r=0;r<e.length&&!window.requestAnimationFrame;++r)window.requestAnimationFrame=window[e[r]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[e[r]+"CancelAnimationFrame"]||window[e[r]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(e,r){var s=(new Date).getTime(),i=Math.max(0,16-(s-t)),a=setTimeout(function(){e(s+i)},i);return t=s+i,a}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)})}();var bez=bezFunction(),dataManager=dataFunctionManager(),FontManager=function(){function t(t,e){var r=_cu("span");r.style.fontFamily=e;var s=_cu("span");s.innerHTML="giItT1WQy@!-/#",r.style.position="absolute",r.style.left="-10000px",r.style.top="-10000px",r.style.fontSize="300px",r.style.fontVariant="normal",r.style.fontStyle="normal",r.style.fontWeight="normal",r.style.letterSpacing="0",r.appendChild(s),document.body.appendChild(r);var i=s.offsetWidth;return s.style.fontFamily=t+", "+e,{node:s,w:i,parent:r}}function e(){var t,r,s,i=this.fonts.length,a=i;for(t=0;t<i;t+=1)if(this.fonts[t].loaded)a-=1;else if("t"===this.fonts[t].fOrigin||2===this.fonts[t].origin){if(window.Typekit&&window.Typekit.load&&0===this.typekitLoaded){this.typekitLoaded=1;try{window.Typekit.load({async:!0,active:function(){this.typekitLoaded=2}.bind(this)})}catch(n){}}2===this.typekitLoaded&&(this.fonts[t].loaded=!0)}else"n"===this.fonts[t].fOrigin||0===this.fonts[t].origin?this.fonts[t].loaded=!0:(r=this.fonts[t].monoCase.node,s=this.fonts[t].monoCase.w,r.offsetWidth!==s?(a-=1,this.fonts[t].loaded=!0):(r=this.fonts[t].sansCase.node,s=this.fonts[t].sansCase.w,r.offsetWidth!==s&&(a-=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!==a&&Date.now()-this.initTime<h?setTimeout(e.bind(this),20):setTimeout(function(){this.loaded=!0}.bind(this),0)}function r(t,e){var r=_ct("text");r.style.fontSize="100px",r.style.fontFamily=e.fFamily,r.textContent="1",e.fClass?(r.style.fontFamily="inherit",r.className=e.fClass):r.style.fontFamily=e.fFamily,t.appendChild(r);var s=_cu("canvas").getContext("2d");return s.font="100px "+e.fFamily,s}function s(s,i){if(!s)return void(this.loaded=!0);if(this.chars)return this.loaded=!0,void(this.fonts=s.list);var a,n=s.list,o=n.length;for(a=0;a<o;a+=1){if(n[a].loaded=!1,n[a].monoCase=t(n[a].fFamily,"monospace"),n[a].sansCase=t(n[a].fFamily,"sans-serif"),n[a].fPath){if("p"===n[a].fOrigin||3===n[a].origin){var h=_cu("style");h.type="text/css",h.innerHTML="@font-face {font-family: "+n[a].fFamily+"; font-style: normal; src: url('"+n[a].fPath+"');}",i.appendChild(h)}else if("g"===n[a].fOrigin||1===n[a].origin){var l=_cu("link");l.type="text/css",l.rel="stylesheet",l.href=n[a].fPath,i.appendChild(l)}else if("t"===n[a].fOrigin||2===n[a].origin){var p=_cu("script");p.setAttribute("src",n[a].fPath),i.appendChild(p)}}else n[a].loaded=!0;n[a].helper=r(i,n[a]),this.fonts.push(n[a])}e.bind(this)()}function i(t){if(t){this.chars||(this.chars=[]);var e,r,s,i=t.length,a=this.chars.length;for(e=0;e<i;e+=1){for(r=0,s=!1;r<a;)this.chars[r].style===t[e].style&&this.chars[r].fFamily===t[e].fFamily&&this.chars[r].ch===t[e].ch&&(s=!0),r+=1;s||(this.chars.push(t[e]),a+=1)}}}function a(t,e,r){for(var s=0,i=this.chars.length;s<i;){if(this.chars[s].ch===t&&this.chars[s].style===e&&this.chars[s].fFamily===r)return this.chars[s];s+=1}return console&&console.warn&&console.warn("Missing character from exported characters list: ",t,e,r),l}function n(t,e,r){var s=this.getFontByName(e),i=s.helper;return i.measureText(t).width*r/100}function o(t){for(var e=0,r=this.fonts.length;e<r;){if(this.fonts[e].fName===t)return this.fonts[e];e+=1}return"sans-serif"}var h=5e3,l={w:0,size:0,shapes:[]},p=function(){this.fonts=[],this.chars=null,this.typekitLoaded=0,this.loaded=!1,this.initTime=Date.now()};return p.prototype.addChars=i,p.prototype.addFonts=s,p.prototype.getCharData=a,p.prototype.getFontByName=o,p.prototype.measureText=n,p}(),_ai=function(){function t(t,e,r){var s,i=this.offsetTime;"multidimensional"===this.propType&&(s=_cs("float32",e.length));for(var a,n,o=r.lastIndex,h=o,l=this._df.length-1,p=!0;p;){if(a=this._df[h],n=this._df[h+1],h==l-1&&t>=n.t-i){a.h&&(a=n),o=0;break}if(n.t-i>t){o=h;break}h<l-1?h+=1:(o=0,p=!1)}var m,f,c,d,u,y;if(a.to){a.bezierData||bez.buildBezierData(a);var g=a.bezierData;if(t>=n.t-i||t<a.t-i){var v=t>=n.t-i?g.points.length-1:0;for(f=g.points[v].point.length,m=0;m<f;m+=1)s[m]=g.points[v].point[m];r._lastBezierData=null}else{a.__fnct?y=a.__fnct:(y=BezierFactory.getBezierEasing(a.o.x,a.o.y,a.i.x,a.i.y,a.n).get,a.__fnct=y),c=y((t-(a.t-i))/(n.t-i-(a.t-i)));var b,E=g.segmentLength*c,P=r.lastFrame<t&&r._lastBezierData===g?r._lastAddedLength:0;for(u=r.lastFrame<t&&r._lastBezierData===g?r._lastPoint:0,p=!0,d=g.points.length;p;){if(P+=g.points[u].partialLength,0===E||0===c||u==g.points.length-1){for(f=g.points[u].point.length,m=0;m<f;m+=1)s[m]=g.points[u].point[m];break}if(E>=P&&E<P+g.points[u+1].partialLength){for(b=(E-P)/g.points[u+1].partialLength,f=g.points[u].point.length,m=0;m<f;m+=1)s[m]=g.points[u].point[m]+(g.points[u+1].point[m]-g.points[u].point[m])*b;break}u<d-1?u+=1:p=!1}r._lastPoint=u,r._lastAddedLength=P-g.points[u].partialLength,r._lastBezierData=g}}else{var x,S,C,A,k;for(l=a.s.length,h=0;h<l;h+=1){if(1!==a.h&&(t>=n.t-i?c=1:t<a.t-i?c=0:(a.o.x.constructor===Array?(a.__fnct||(a.__fnct=[]),a.__fnct[h]?y=a.__fnct[h]:(x=a.o.x[h]||a.o.x[0],S=a.o.y[h]||a.o.y[0],C=a.i.x[h]||a.i.x[0],A=a.i.y[h]||a.i.y[0],y=BezierFactory.getBezierEasing(x,S,C,A).get,a.__fnct[h]=y)):a.__fnct?y=a.__fnct:(x=a.o.x,S=a.o.y,C=a.i.x,A=a.i.y,y=BezierFactory.getBezierEasing(x,S,C,A).get,a.__fnct=y),c=y((t-(a.t-i))/(n.t-i-(a.t-i))))),this.sh&&1!==a.h){var M=a.s[h],T=a.e[h];M-T<-180?M+=360:M-T>180&&(M-=360),k=M+(T-M)*c}else k=1===a.h?a.s[h]:a.s[h]+(a.e[h]-a.s[h])*c;1===l?s=k:s[h]=k}}return r.lastIndex=o,s}function e(t){for(var e=0;e<this.v.length;)this.pv[e]=t[e],this.v[e]=this.mult?this.pv[e]*this.mult:this.pv[e],this.lastPValue[e]!==this.pv[e]&&(this.mdf=!0,this.lastPValue[e]=this.pv[e]),e+=1}function r(t){this.pv=t,this.v=this.mult?this.pv*this.mult:this.pv,this.lastPValue!=this.pv&&(this.mdf=!0,this.lastPValue=this.pv)}function s(){if(this.elem._x.frameId!==this.frameId){this.mdf=!1;var t=this.comp.renderedFrame-this.offsetTime,e=this._df[0].t-this.offsetTime,r=this._df[this._df.length-1].t-this.offsetTime;if(!(t===this._caching.lastFrame||this._caching.lastFrame!==p&&(this._caching.lastFrame>=r&&t>=r||this._caching.lastFrame<e&&t<e))){this._caching.lastIndex=this._caching.lastFrame<t?this._caching.lastIndex:0;var s=this.interpolateValue(t,this.pv,this._caching);this.calculateValueAtCurrentTime(s)}this._caching.lastFrame=t,this.frameId=this.elem._x.frameId}}function i(){}function a(t,e,r){this.propType="unidimensional",this.mult=r,this.v=r?e.k*r:e.k,this.pv=e.k,this.mdf=!1,this.comp=t.comp,this.k=!1,this.kf=!1,this.vel=0,this.getValue=i}function n(t,e,r){this.propType="multidimensional",this.mult=r,this.data=e,this.mdf=!1,this.comp=t.comp,this.k=!1,this.kf=!1,this.frameId=-1,this.v=_cs("float32",e.k.length),this.pv=_cs("float32",e.k.length),this.lastValue=_cs("float32",e.k.length);_cs("float32",e.k.length);this.vel=_cs("float32",e.k.length);var s,a=e.k.length;for(s=0;s<a;s+=1)this.v[s]=r?e.k[s]*r:e.k[s],this.pv[s]=e.k[s];this.getValue=i}function o(e,i,a){this.propType="unidimensional",this._df=i.k,this.offsetTime=e.data.st,this.lastValue=p,this.lastPValue=p,this.frameId=-1,this._caching={lastFrame:p,lastIndex:0,value:0},this.k=!0,this.kf=!0,this.data=i,this.mult=a,this.elem=e,this._ch=!1,this.comp=e.comp,this.v=a?i.k[0].s[0]*a:i.k[0].s[0],this.pv=i.k[0].s[0],this.getValue=s,this.calculateValueAtCurrentTime=r,this.interpolateValue=t}function h(r,i,a){this.propType="multidimensional";var n,o,h,l,m,f=i.k.length;for(n=0;n<f-1;n+=1)i.k[n].to&&i.k[n].s&&i.k[n].e&&(o=i.k[n].s,h=i.k[n].e,l=i.k[n].to,m=i.k[n].ti,(2===o.length&&(o[0]!==h[0]||o[1]!==h[1])&&bez.pointOnLine2D(o[0],o[1],h[0],h[1],o[0]+l[0],o[1]+l[1])&&bez.pointOnLine2D(o[0],o[1],h[0],h[1],h[0]+m[0],h[1]+m[1])||3===o.length&&(o[0]!==h[0]||o[1]!==h[1]||o[2]!==h[2])&&bez.pointOnLine3D(o[0],o[1],o[2],h[0],h[1],h[2],o[0]+l[0],o[1]+l[1],o[2]+l[2])&&bez.pointOnLine3D(o[0],o[1],o[2],h[0],h[1],h[2],h[0]+m[0],h[1]+m[1],h[2]+m[2]))&&(i.k[n].to=null,i.k[n].ti=null),o[0]===h[0]&&o[1]===h[1]&&0===l[0]&&0===l[1]&&0===m[0]&&0===m[1]&&(2===o.length||o[2]===h[2]&&0===l[2]&&0===m[2])&&(i.k[n].to=null,i.k[n].ti=null));this._df=i.k,this.offsetTime=r.data.st,this.k=!0,this.kf=!0,this._ch=!0,this.mult=a,this.elem=r,this.comp=r.comp,this.getValue=s,this.calculateValueAtCurrentTime=e,this.interpolateValue=t,this.frameId=-1;var c=i.k[0].s.length;this.v=_cs("float32",c),this.pv=_cs("float32",c),this.lastValue=_cs("float32",c),this.lastPValue=_cs("float32",c),this._caching={lastFrame:p,lastIndex:0,value:_cs("float32",c)}}function l(t,e,r,s,i){var l;if(0===e.a)l=0===r?new a(t,e,s):new n(t,e,s);else if(1===e.a)l=0===r?new o(t,e,s):new h(t,e,s);else if(e.k.length)if("number"==typeof e.k[0])l=new n(t,e,s);else switch(r){case 0:l=new o(t,e,s);break;case 1:l=new h(t,e,s)}else l=new a(t,e,s);return l.k&&i.push(l),l}var p=initialDefaultFrame,m={_bo:l};return m}(),_ag=function(){function t(t){var e,r=this._co.length;for(e=0;e<r;e+=1)this._co[e].getValue(),this._co[e].mdf&&(this.mdf=!0);this.a&&t.translate(-this.a.v[0],-this.a.v[1],this.a.v[2]),this.s&&t.scale(this.s.v[0],this.s.v[1],this.s.v[2]),this.r?t.rotate(-this.r.v):t.rotateZ(-this.rz.v).rotateY(this.ry.v).rotateX(this.rx.v).rotateZ(-this.or.v[2]).rotateY(this.or.v[1]).rotateX(this.or.v[0]),this.data.p.s?this.data.p.z?t.translate(this.px.v,this.py.v,-this.pz.v):t.translate(this.px.v,this.py.v,0):t.translate(this.p.v[0],this.p.v[1],-this.p.v[2])}function e(t){if(this.elem._x.frameId!==this.frameId){this.mdf=t;var e,r=this._co.length;for(e=0;e<r;e+=1)this._co[e].getValue(),this._co[e].mdf&&(this.mdf=!0);if(this.mdf){if(this.v.reset(),this.a&&this.v.translate(-this.a.v[0],-this.a.v[1],this.a.v[2]),this.s&&this.v.scale(this.s.v[0],this.s.v[1],this.s.v[2]),this.sk&&this.v.skewFromAxis(-this.sk.v,this.sa.v),this.r?this.v.rotate(-this.r.v):this.v.rotateZ(-this.rz.v).rotateY(this.ry.v).rotateX(this.rx.v).rotateZ(-this.or.v[2]).rotateY(this.or.v[1]).rotateX(this.or.v[0]),this.autoOriented&&this.p._df&&this.p._dg){var s,i;this.p._caching.lastFrame+this.p.offsetTime<=this.p._df[0].t?(s=this.p._dg((this.p._df[0].t+.01)/this.elem._x.frameRate,0),i=this.p._dg(this.p._df[0].t/this.elem._x.frameRate,0)):this.p._caching.lastFrame+this.p.offsetTime>=this.p._df[this.p._df.length-1].t?(s=this.p._dg(this.p._df[this.p._df.length-1].t/this.elem._x.frameRate,0),i=this.p._dg((this.p._df[this.p._df.length-1].t-.01)/this.elem._x.frameRate,0)):(s=this.p.pv,i=this.p._dg((this.p._caching.lastFrame+this.p.offsetTime-.01)/this.elem._x.frameRate,this.p.offsetTime)),this.v.rotate(-Math.atan2(s[1]-i[1],s[0]-i[0]))}this.data.p.s?this.data.p.z?this.v.translate(this.px.v,this.py.v,-this.pz.v):this.v.translate(this.px.v,this.py.v,0):this.v.translate(this.p.v[0],this.p.v[1],-this.p.v[2])}this.frameId=this.elem._x.frameId}}function r(){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]))}function s(){}function i(t,e,r){if(this.elem=t,this.frameId=-1,this.propType="transform",this._co=[],this.mdf=!1,this.data=e,this.v=new Matrix,e.p.s?(this.px=_ai._bo(t,e.p.x,0,0,this._co),this.py=_ai._bo(t,e.p.y,0,0,this._co),e.p.z&&(this.pz=_ai._bo(t,e.p.z,0,0,this._co))):this.p=_ai._bo(t,e.p,1,0,this._co),e.r)this.r=_ai._bo(t,e.r,0,degToRads,this._co);else if(e.rx){if(this.rx=_ai._bo(t,e.rx,0,degToRads,this._co),this.ry=_ai._bo(t,e.ry,0,degToRads,this._co),this.rz=_ai._bo(t,e.rz,0,degToRads,this._co),e.or.k[0].ti){var s,i=e.or.k.length;for(s=0;s<i;s+=1)e.or.k[s].to=e.or.k[s].ti=null}this.or=_ai._bo(t,e.or,1,degToRads,this._co),this.or.sh=!0}e.sk&&(this.sk=_ai._bo(t,e.sk,0,degToRads,this._co),this.sa=_ai._bo(t,e.sa,0,degToRads,this._co)),e.a&&(this.a=_ai._bo(t,e.a,1,0,this._co)),e.s&&(this.s=_ai._bo(t,e.s,1,.01,this._co)),e.o?this.o=_ai._bo(t,e.o,0,.01,r):this.o={mdf:!1,v:1},this._co.length?r.push(this):this.getValue(!0)}function a(t,e,r){return new i(t,e,r)}return i.prototype.applyToMatrix=t,i.prototype.getValue=e,i.prototype.setInverted=r,i.prototype.autoOrient=s,{_bj:a}}();_av.prototype.setPathData=function(t,e){this.c=t,this.setLength(e);for(var r=0;r<e;)this.v[r]=point_pool.newElement(),this.o[r]=point_pool.newElement(),this.i[r]=point_pool.newElement(),r+=1},_av.prototype.setLength=function(t){for(;this._maxLength<t;)this.doubleArrayLength();this._length=t},_av.prototype.doubleArrayLength=function(){this.v=this.v.concat(_cv(this._maxLength)),this.i=this.i.concat(_cv(this._maxLength)),this.o=this.o.concat(_cv(this._maxLength)),this._maxLength*=2},_av.prototype._ax=function(t,e,r,s,i){var a;switch(this._length=Math.max(this._length,s+1),this._length>=this._maxLength&&this.doubleArrayLength(),r){case"v":a=this.v;break;case"i":a=this.i;break;case"o":a=this.o}(!a[s]||a[s]&&!i)&&(a[s]=point_pool.newElement()),a[s][0]=t,a[s][1]=e},_av.prototype._aw=function(t,e,r,s,i,a,n,o){this._ax(t,e,"v",n,o),this._ax(r,s,"o",n,o),this._ax(i,a,"i",n,o)},_av.prototype.reverse=function(){var t=new _av;t.setPathData(this.c,this._length);var e=this.v,r=this.o,s=this.i,a=0;this.c&&(t._aw(e[0][0],e[0][1],s[0][0],s[0][1],r[0][0],r[0][1],0,!1),a=1);var n=this._length-1,o=this._length;for(i=a;i<o;i+=1)t._aw(e[n][0],e[n][1],s[n][0],s[n][1],r[n][0],r[n][1],i,!1),n-=1;return t};var _ah=function(){function t(t,e,r,s){var i,a,n,o=s.lastIndex;if(t<this._df[0].t-this.offsetTime)i=this._df[0].s[0],n=!0,o=0;else if(t>=this._df[this._df.length-1].t-this.offsetTime)i=1===this._df[this._df.length-2].h?this._df[this._df.length-1].s[0]:this._df[this._df.length-2].e[0],n=!0;else{for(var h,l,p,m,f,c,d=o,u=this._df.length-1,y=!0;y&&(h=this._df[d],l=this._df[d+1],!(l.t-this.offsetTime>t));)d<u-1?d+=1:y=!1;n=1===h.h,o=d;var g;if(!n){if(t>=l.t-this.offsetTime)g=1;else if(t<h.t-this.offsetTime)g=0;else{var v;h.__fnct?v=h.__fnct:(v=BezierFactory.getBezierEasing(h.o.x,h.o.y,h.i.x,h.i.y).get,h.__fnct=v),g=v((t-(h.t-this.offsetTime))/(l.t-this.offsetTime-(h.t-this.offsetTime)))}a=h.e[0]}i=h.s[0]}m=e._length,c=i.i[0].length;var b,E=!1;s.lastIndex=o;var p,f,b,m=e._length,c=i.i[0].length,E=!1;for(p=0;p<m;p+=1)for(f=0;f<c;f+=1)b=n?i.i[p][f]:i.i[p][f]+(a.i[p][f]-i.i[p][f])*g,e.i[p][f]!==b&&(e.i[p][f]=b,r&&(this.pv.i[p][f]=b),E=!0),b=n?i.o[p][f]:i.o[p][f]+(a.o[p][f]-i.o[p][f])*g,e.o[p][f]!==b&&(e.o[p][f]=b,r&&(this.pv.o[p][f]=b),E=!0),b=n?i.v[p][f]:i.v[p][f]+(a.v[p][f]-i.v[p][f])*g,e.v[p][f]!==b&&(e.v[p][f]=b,r&&(this.pv.v[p][f]=b),E=!0);return E}function e(){if(this.elem._x.frameId!==this.frameId){this.mdf=!1;var t=this.comp.renderedFrame-this.offsetTime,e=this._df[0].t-this.offsetTime,r=this._df[this._df.length-1].t-this.offsetTime,s=this._caching.lastFrame;if(s===l||!(s<e&&t<e||s>r&&t>r)){this._caching.lastIndex=s<t?this._caching.lastIndex:0;var i=this.interpolateShape(t,this.v,!0,this._caching);this.mdf=i,i&&(this.paths=this._ak)}this._caching.lastFrame=t,this.frameId=this.elem._x.frameId}}function r(){return this.v}function s(){this.paths=this._ak,this.k||(this.mdf=!1)}function i(t,e,r){this.propType="shape",this.comp=t.comp,this.k=!1,this.mdf=!1;var i=3===r?e.pt.k:e.ks.k;this.v=shape_pool.clone(i),this.pv=shape_pool.clone(this.v),this._ak=shapeCollection_pool._al(),this.paths=this._ak,this.paths.addShape(this.v),this.reset=s}function a(t,e,r){this.propType="shape",this.comp=t.comp,this.elem=t,this.offsetTime=t.data.st,this._df=3===r?e.pt.k:e.ks.k,this.k=!0,this.kf=!0;var i=this._df[0].s[0].i.length;this._df[0].s[0].i[0].length;this.v=shape_pool.newElement(),this.v.setPathData(this._df[0].s[0].c,i),this.pv=shape_pool.clone(this.v),this._ak=shapeCollection_pool._al(),this.paths=this._ak,this.paths.addShape(this.v),this.lastFrame=l,this.reset=s,this._caching={lastFrame:l,lastIndex:0}}function n(t,e,r,s){var n;if(3===r||4===r){var o=3===r?e.pt:e.ks,h=o.k;n=1===o.a||h.length?new a(t,e,r):new i(t,e,r)}else 5===r?n=new f(t,e):6===r?n=new p(t,e):7===r&&(n=new m(t,e));return n.k&&s.push(n),n}function o(){return i}function h(){return a}var l=-999999;i.prototype.interpolateShape=t,i.prototype.getValue=r,a.prototype.getValue=e,a.prototype.interpolateShape=t;var p=function(){function t(){var t=this.p.v[0],e=this.p.v[1],s=this.s.v[0]/2,i=this.s.v[1]/2,a=3!==this.d,n=this.v;3!==this.d&&(n.v[0][0]=t,n.v[0][1]=e-i,n.v[1][0]=a?t+s:t-s,n.v[1][1]=e,n.v[2][0]=t,n.v[2][1]=e+i,n.v[3][0]=a?t-s:t+s,n.v[3][1]=e,n.i[0][0]=a?t-s*r:t+s*r,n.i[0][1]=e-i,n.i[1][0]=a?t+s:t-s,n.i[1][1]=e-i*r,n.i[2][0]=a?t+s*r:t-s*r,n.i[2][1]=e+i,n.i[3][0]=a?t-s:t+s,n.i[3][1]=e+i*r,n.o[0][0]=a?t+s*r:t-s*r,n.o[0][1]=e-i,n.o[1][0]=a?t+s:t-s,n.o[1][1]=e+i*r,n.o[2][0]=a?t-s*r:t+s*r,n.o[2][1]=e+i,n.o[3][0]=a?t-s:t+s,n.o[3][1]=e-i*r)}function e(t){var e,r=this._co.length;if(this.elem._x.frameId!==this.frameId){for(this.mdf=!1,this.frameId=this.elem._x.frameId,e=0;e<r;e+=1)this._co[e].getValue(t),this._co[e].mdf&&(this.mdf=!0);this.mdf&&this.convertEllToPath()}}var r=roundCorner;return function(r,i){this.v=shape_pool.newElement(),this.v.setPathData(!0,4),this._ak=shapeCollection_pool._al(),this.paths=this._ak,this._ak.addShape(this.v),this.d=i.d,this._co=[],this.elem=r,this.comp=r.comp,this.frameId=-1,this.mdf=!1,this.getValue=e,this.convertEllToPath=t,this.reset=s,this.p=_ai._bo(r,i.p,1,0,this._co),this.s=_ai._bo(r,i.s,1,0,this._co),this._co.length?this.k=!0:this.convertEllToPath()}}(),m=function(){function t(){var t,e=Math.floor(this.pt.v),r=2*Math.PI/e,s=this.or.v,i=this.os.v,a=2*Math.PI*s/(4*e),n=-Math.PI/2,o=3===this.data.d?-1:1;for(n+=this.r.v,this.v._length=0,t=0;t<e;t+=1){var h=s*Math.cos(n),l=s*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._aw(h,l,h-p*a*i*o,l-m*a*i*o,h+p*a*i*o,l+m*a*i*o,t,!0),n+=r*o}this.paths.length=0,this.paths[0]=this.v}function e(){var t,e,r,s,i=2*Math.floor(this.pt.v),a=2*Math.PI/i,n=!0,o=this.or.v,h=this.ir.v,l=this.os.v,p=this.is.v,m=2*Math.PI*o/(2*i),f=2*Math.PI*h/(2*i),c=-Math.PI/2;c+=this.r.v;var d=3===this.data.d?-1:1;for(this.v._length=0,t=0;t<i;t+=1){e=n?o:h,r=n?l:p,s=n?m:f;var u=e*Math.cos(c),y=e*Math.sin(c),g=0===u&&0===y?0:y/Math.sqrt(u*u+y*y),v=0===u&&0===y?0:-u/Math.sqrt(u*u+y*y);u+=+this.p.v[0],y+=+this.p.v[1],this.v._aw(u,y,u-g*s*r*d,y-v*s*r*d,u+g*s*r*d,y+v*s*r*d,t,!0),n=!n,c+=a*d}}function r(){if(this.elem._x.frameId!==this.frameId){this.mdf=!1,this.frameId=this.elem._x.frameId;var t,e=this._co.length;for(t=0;t<e;t+=1)this._co[t].getValue(),this._co[t].mdf&&(this.mdf=!0);this.mdf&&this.convertToPath()}}return function(i,a){this.v=shape_pool.newElement(),this.v.setPathData(!0,0),this.elem=i,this.comp=i.comp,this.data=a,this.frameId=-1,this.d=a.d,this._co=[],this.mdf=!1,this.getValue=r,this.reset=s,1===a.sy?(this.ir=_ai._bo(i,a.ir,0,0,this._co),this.is=_ai._bo(i,a.is,0,.01,this._co),this.convertToPath=e):this.convertToPath=t,this.pt=_ai._bo(i,a.pt,0,0,this._co),this.p=_ai._bo(i,a.p,1,0,this._co),this.r=_ai._bo(i,a.r,0,degToRads,this._co),this.or=_ai._bo(i,a.or,0,0,this._co),this.os=_ai._bo(i,a.os,0,.01,this._co),this._ak=shapeCollection_pool._al(),this._ak.addShape(this.v),this.paths=this._ak,this._co.length?this.k=!0:this.convertToPath()}}(),f=function(){function t(t){if(this.elem._x.frameId!==this.frameId){this.mdf=!1,this.frameId=this.elem._x.frameId;var e,r=this._co.length;for(e=0;e<r;e+=1)this._co[e].getValue(t),this._co[e].mdf&&(this.mdf=!0);this.mdf&&this.convertRectToPath()}}function e(){var t=this.p.v[0],e=this.p.v[1],r=this.s.v[0]/2,s=this.s.v[1]/2,i=bm_min(r,s,this.r.v),a=i*(1-roundCorner);this.v._length=0,2===this.d||1===this.d?(this.v._aw(t+r,e-s+i,t+r,e-s+i,t+r,e-s+a,0,!0),this.v._aw(t+r,e+s-i,t+r,e+s-a,t+r,e+s-i,1,!0),0!==i?(this.v._aw(t+r-i,e+s,t+r-i,e+s,t+r-a,e+s,2,!0),this.v._aw(t-r+i,e+s,t-r+a,e+s,t-r+i,e+s,3,!0),this.v._aw(t-r,e+s-i,t-r,e+s-i,t-r,e+s-a,4,!0),this.v._aw(t-r,e-s+i,t-r,e-s+a,t-r,e-s+i,5,!0),this.v._aw(t-r+i,e-s,t-r+i,e-s,t-r+a,e-s,6,!0),this.v._aw(t+r-i,e-s,t+r-a,e-s,t+r-i,e-s,7,!0)):(this.v._aw(t-r,e+s,t-r+a,e+s,t-r,e+s,2),this.v._aw(t-r,e-s,t-r,e-s+a,t-r,e-s,3))):(this.v._aw(t+r,e-s+i,t+r,e-s+a,t+r,e-s+i,0,!0),0!==i?(this.v._aw(t+r-i,e-s,t+r-i,e-s,t+r-a,e-s,1,!0),this.v._aw(t-r+i,e-s,t-r+a,e-s,t-r+i,e-s,2,!0),this.v._aw(t-r,e-s+i,t-r,e-s+i,t-r,e-s+a,3,!0),this.v._aw(t-r,e+s-i,t-r,e+s-a,t-r,e+s-i,4,!0),this.v._aw(t-r+i,e+s,t-r+i,e+s,t-r+a,e+s,5,!0),
+this.v._aw(t+r-i,e+s,t+r-a,e+s,t+r-i,e+s,6,!0),this.v._aw(t+r,e+s-i,t+r,e+s-i,t+r,e+s-a,7,!0)):(this.v._aw(t-r,e-s,t-r+a,e-s,t-r,e-s,1,!0),this.v._aw(t-r,e+s,t-r,e+s-a,t-r,e+s,2,!0),this.v._aw(t+r,e+s,t+r-a,e+s,t+r,e+s,3,!0)))}return function(r,i){this.v=shape_pool.newElement(),this.v.c=!0,this._ak=shapeCollection_pool._al(),this._ak.addShape(this.v),this.paths=this._ak,this.elem=r,this.comp=r.comp,this.frameId=-1,this.d=i.d,this._co=[],this.mdf=!1,this.getValue=t,this.convertRectToPath=e,this.reset=s,this.p=_ai._bo(r,i.p,1,0,this._co),this.s=_ai._bo(r,i.s,1,0,this._co),this.r=_ai._bo(r,i.r,0,0,this._co),this._co.length?this.k=!0:this.convertRectToPath()}}(),c={};return c._bp=n,c.getConstructorFunction=o,c.getKeyframedConstructorFunction=h,c}(),_as=function(){function t(t,e){s[t]||(s[t]=e)}function e(t,e,r,i){return new s[t](e,r,i)}var r={},s={};return r.registerModifier=t,r.getModifier=e,r}();_at.prototype.initModifierProperties=function(){},_at.prototype.addShapeToModifier=function(){},_at.prototype.addShape=function(t){if(!this.closed){var e={shape:t.sh,data:t,_ak:shapeCollection_pool._al()};this.shapes.push(e),this.addShapeToModifier(e)}},_at.prototype.init=function(t,e,r){this._co=[],this.shapes=[],this.elem=t,this.initModifierProperties(t,e),this.frameId=initialDefaultFrame,this.mdf=!1,this.closed=!1,this.k=!1,this._co.length?(this.k=!0,r.push(this)):this.getValue(!0)},extendPrototype([_at],_an),_an.prototype.processKeys=function(t){if(this.elem._x.frameId!==this.frameId||t){this.mdf=t,this.frameId=this.elem._x.frameId;var e,r=this._co.length;for(e=0;e<r;e+=1)this._co[e].getValue(),this._co[e].mdf&&(this.mdf=!0);if(this.mdf||t){var s=this.o.v%360/360;s<0&&(s+=1);var i=this.s.v+s,a=this.e.v+s;if(i>a){var n=i;i=a,a=n}this.sValue=i,this.eValue=a,this.oValue=s}}},_an.prototype.initModifierProperties=function(t,e){this.s=_ai._bo(t,e.s,0,.01,this._co),this.e=_ai._bo(t,e.e,0,.01,this._co),this.o=_ai._bo(t,e.o,0,0,this._co),this.sValue=0,this.eValue=0,this.oValue=0,this.getValue=this.processKeys,this.m=e.m},_an.prototype.addShapeToModifier=function(t){t.pathsData=[]},_an.prototype.calculateShapeEdges=function(t,e,r,s,i){var a=[];e<=1?a.push({s:t,e:e}):t>=1?a.push({s:t-1,e:e-1}):(a.push({s:t,e:1}),a.push({s:0,e:e-1}));var n,o,h=[],l=a.length;for(n=0;n<l;n+=1)if(o=a[n],o.e*i<s||o.s*i>s+r);else{var p,m;p=o.s*i<=s?0:(o.s*i-s)/r,m=o.e*i>=s+r?1:(o.e*i-s)/r,h.push([p,m])}return h.length||h.push([0,0]),h},_an.prototype.releasePathsData=function(t){var e,r=t.length;for(e=0;e<r;e+=1)segments_length_pool.release(t[e]);return t.length=0,t},_an.prototype.processShapes=function(t){var e,r,s,i,a,n,o,h=this.shapes.length,l=this.sValue,p=this.eValue,m=0;if(p===l)for(r=0;r<h;r+=1)this.shapes[r]._ak.releaseShapes(),this.shapes[r].shape.mdf=!0,this.shapes[r].shape.paths=this.shapes[r]._ak;else if(1===p&&0===l||0===p&&1===l){if(this.mdf)for(r=0;r<h;r+=1)this.shapes[r].shape.mdf=!0}else{var f,c,d=[];for(r=0;r<h;r+=1)if(f=this.shapes[r],f.shape.mdf||this.mdf||t||2===this.m){if(e=f.shape.paths,i=e._length,o=0,!f.shape.mdf&&f.pathsData.length)o=f.totalShapeLength;else{for(a=this.releasePathsData(f.pathsData),s=0;s<i;s+=1)n=bez.getSegmentsLength(e.shapes[s]),a.push(n),o+=n.totalLength;f.totalShapeLength=o,f.pathsData=a}m+=o,f.shape.mdf=!0}else f.shape.paths=f._ak;var s,i,u=l,y=p,g=0;for(r=h-1;r>=0;r-=1)if(f=this.shapes[r],f.shape.mdf){if(c=f._ak,c.releaseShapes(),2===this.m&&h>1){var v=this.calculateShapeEdges(l,p,f.totalShapeLength,g,m);g+=f.totalShapeLength}else v=[[u,y]];for(i=v.length,s=0;s<i;s+=1){u=v[s][0],y=v[s][1],d.length=0,y<=1?d.push({s:f.totalShapeLength*u,e:f.totalShapeLength*y}):u>=1?d.push({s:f.totalShapeLength*(u-1),e:f.totalShapeLength*(y-1)}):(d.push({s:f.totalShapeLength*u,e:f.totalShapeLength}),d.push({s:0,e:f.totalShapeLength*(y-1)}));var b=this.addShapes(f,d[0]);if(d[0].s!==d[0].e){if(d.length>1)if(f.shape.v.c){var E=b.pop();this.addPaths(b,c),b=this.addShapes(f,d[1],E)}else this.addPaths(b,c),b=this.addShapes(f,d[1]);this.addPaths(b,c)}}f.shape.paths=c}}this._co.length||(this.mdf=!1)},_an.prototype.addPaths=function(t,e){var r,s=t.length;for(r=0;r<s;r+=1)e.addShape(t[r])},_an.prototype.addSegment=function(t,e,r,s,i,a,n){i._ax(e[0],e[1],"o",a),i._ax(r[0],r[1],"i",a+1),n&&i._ax(t[0],t[1],"v",a),i._ax(s[0],s[1],"v",a+1)},_an.prototype.addSegmentFromArray=function(t,e,r,s){e._ax(t[1],t[5],"o",r),e._ax(t[2],t[6],"i",r+1),s&&e._ax(t[0],t[4],"v",r),e._ax(t[3],t[7],"v",r+1)},_an.prototype.addShapes=function(t,e,r){var s,i,a,n,o,h,l,p,m=t.pathsData,f=t.shape.paths.shapes,c=t.shape.paths._length,d=0,u=[],y=!0;for(r?(o=r._length,p=r._length):(r=shape_pool.newElement(),o=0,p=0),u.push(r),s=0;s<c;s+=1){for(h=m[s].lengths,r.c=f[s].c,a=f[s].c?h.length:h.length+1,i=1;i<a;i+=1)if(n=h[i-1],d+n.addedLength<e.s)d+=n.addedLength,r.c=!1;else{if(d>e.e){r.c=!1;break}e.s<=d&&e.e>=d+n.addedLength?(this.addSegment(f[s].v[i-1],f[s].o[i-1],f[s].i[i],f[s].v[i],r,o,y),y=!1):(l=bez.getNewSegment(f[s].v[i-1],f[s].v[i],f[s].o[i-1],f[s].i[i],(e.s-d)/n.addedLength,(e.e-d)/n.addedLength,h[i-1]),this.addSegmentFromArray(l,r,o,y),y=!1,r.c=!1),d+=n.addedLength,o+=1}if(f[s].c){if(n=h[i-1],d<=e.e){var g=h[i-1].addedLength;e.s<=d&&e.e>=d+g?(this.addSegment(f[s].v[i-1],f[s].o[i-1],f[s].i[0],f[s].v[0],r,o,y),y=!1):(l=bez.getNewSegment(f[s].v[i-1],f[s].v[0],f[s].o[i-1],f[s].i[0],(e.s-d)/g,(e.e-d)/g,h[i-1]),this.addSegmentFromArray(l,r,o,y),y=!1,r.c=!1)}else r.c=!1;d+=n.addedLength,o+=1}if(r._length&&(r._ax(r.v[p][0],r.v[p][1],"i",p),r._ax(r.v[r._length-1][0],r.v[r._length-1][1],"o",r._length-1)),d>e.e)break;s<c-1&&(r=shape_pool.newElement(),y=!0,u.push(r),o=0)}return u},_as.registerModifier("tm",_an),extendPrototype([_at],_au),_au.prototype.processKeys=function(t){if(this.elem._x.frameId!==this.frameId||t){this.mdf=!!t,this.frameId=this.elem._x.frameId;var e,r=this._co.length;for(e=0;e<r;e+=1)this._co[e].getValue(),this._co[e].mdf&&(this.mdf=!0)}},_au.prototype.initModifierProperties=function(t,e){this.getValue=this.processKeys,this.rd=_ai._bo(t,e.r,0,null,this._co)},_au.prototype.processPath=function(t,e){var r=shape_pool.newElement();r.c=t.c;var s,i,a,n,o,h,l,p,m,f,c,d,u,y=t._length,g=0;for(s=0;s<y;s+=1)i=t.v[s],n=t.o[s],a=t.i[s],i[0]===n[0]&&i[1]===n[1]&&i[0]===a[0]&&i[1]===a[1]?0!==s&&s!==y-1||t.c?(o=0===s?t.v[y-1]:t.v[s-1],h=Math.sqrt(Math.pow(i[0]-o[0],2)+Math.pow(i[1]-o[1],2)),l=h?Math.min(h/2,e)/h:0,p=d=i[0]+(o[0]-i[0])*l,m=u=i[1]-(i[1]-o[1])*l,f=p-(p-i[0])*roundCorner,c=m-(m-i[1])*roundCorner,r._aw(p,m,f,c,d,u,g),g+=1,o=s===y-1?t.v[0]:t.v[s+1],h=Math.sqrt(Math.pow(i[0]-o[0],2)+Math.pow(i[1]-o[1],2)),l=h?Math.min(h/2,e)/h:0,p=f=i[0]+(o[0]-i[0])*l,m=c=i[1]+(o[1]-i[1])*l,d=p-(p-i[0])*roundCorner,u=m-(m-i[1])*roundCorner,r._aw(p,m,f,c,d,u,g),g+=1):(r._aw(i[0],i[1],n[0],n[1],a[0],a[1],g),g+=1):(r._aw(t.v[s][0],t.v[s][1],t.o[s][0],t.o[s][1],t.i[s][0],t.i[s][1],g),g+=1);return r},_au.prototype.processShapes=function(t){var e,r,s,i,a=this.shapes.length,n=this.rd.v;if(0!==n){var o,h,l;for(r=0;r<a;r+=1){if(o=this.shapes[r],h=o.shape.paths,l=o._ak,o.shape.mdf||this.mdf||t)for(l.releaseShapes(),o.shape.mdf=!0,e=o.shape.paths.shapes,i=o.shape.paths._length,s=0;s<i;s+=1)l.addShape(this.processPath(e[s],n));o.shape.paths=o._ak}}this._co.length||(this.mdf=!1)},_as.registerModifier("rd",_au),_aj.prototype.processKeys=function(t){if(this.elem._x.frameId!==this.frameId||t){this.mdf=!!t;var e,r=this._co.length;for(e=0;e<r;e+=1)this._co[e].getValue(),this._co[e].mdf&&(this.mdf=!0)}},_aj.prototype.initModifierProperties=function(t,e){this.getValue=this.processKeys,this.c=_ai._bo(t,e.c,0,null,this._co),this.o=_ai._bo(t,e.o,0,null,this._co),this.tr=_ag._bj(t,e.tr,this._co),this.data=e,this._co.length||this.getValue(!0),this.pMatrix=new Matrix,this.rMatrix=new Matrix,this.sMatrix=new Matrix,this.tMatrix=new Matrix,this.matrix=new Matrix},_aj.prototype.applyTransforms=function(t,e,r,s,i,a){var n=a?-1:1,o=s.s.v[0]+(1-s.s.v[0])*(1-i),h=s.s.v[1]+(1-s.s.v[1])*(1-i);t.translate(s.p.v[0]*n*i,s.p.v[1]*n*i,s.p.v[2]),e.translate(-s.a.v[0],-s.a.v[1],s.a.v[2]),e.rotate(-s.r.v*n*i),e.translate(s.a.v[0],s.a.v[1],s.a.v[2]),r.translate(-s.a.v[0],-s.a.v[1],s.a.v[2]),r.scale(a?1/o:o,a?1/h:h),r.translate(s.a.v[0],s.a.v[1],s.a.v[2])},_aj.prototype.init=function(t,e,r,s,i){this.elem=t,this.arr=e,this.pos=r,this.elemsData=s,this._currentCopies=0,this._bq=[],this._groups=[],this._co=[],this.frameId=-1,this.initModifierProperties(t,e[r]);for(var a=0;r>0;)r-=1,this._bq.unshift(e[r]),a+=1;this._co.length?(this.k=!0,i.push(this)):this.getValue(!0)},_aj.prototype.resetElements=function(t){var e,r=t.length;for(e=0;e<r;e+=1)t[e]._processed=!1,"gr"===t[e].ty&&this.resetElements(t[e].it)},_aj.prototype.cloneElements=function(t){var e=(t.length,JSON.parse(JSON.stringify(t)));return this.resetElements(e),e},_aj.prototype.changeGroupRender=function(t,e){var r,s=t.length;for(r=0;r<s;r+=1)t[r]._render=e,"gr"===t[r].ty&&this.changeGroupRender(t[r].it,e)},_aj.prototype.processShapes=function(t){if(this.elem._x.frameId!==this.frameId&&(this.frameId=this.elem._x.frameId,this._co.length||t||(this.mdf=!1),this.mdf)){var e=Math.ceil(this.c.v);if(this._groups.length<e){for(;this._groups.length<e;){var r={it:this.cloneElements(this._bq),ty:"gr"};r.it.push({a:{a:0,ix:1,k:[0,0]},nm:"Transform",o:{a:0,ix:7,k:100},p:{a:0,ix:2,k:[0,0]},r:{a:0,ix:6,k:0},s:{a:0,ix:3,k:[100,100]},sa:{a:0,ix:5,k:0},sk:{a:0,ix:4,k:0},ty:"tr"}),this.arr.splice(0,0,r),this._groups.splice(0,0,r),this._currentCopies+=1}this.elem.reloadShapes()}var s,i,a=0;for(s=0;s<=this._groups.length-1;s+=1)i=a<e,this._groups[s]._render=i,this.changeGroupRender(this._groups[s].it,i),a+=1;this._currentCopies=e,this.elem._ch=!0;var n=this.o.v,o=n%1,h=n>0?Math.floor(n):Math.ceil(n),l=(this.tr.v.props,this.pMatrix.props),p=this.rMatrix.props,m=this.sMatrix.props;this.pMatrix.reset(),this.rMatrix.reset(),this.sMatrix.reset(),this.tMatrix.reset(),this.matrix.reset();var f=0;if(n>0){for(;f<h;)this.applyTransforms(this.pMatrix,this.rMatrix,this.sMatrix,this.tr,1,!1),f+=1;o&&(this.applyTransforms(this.pMatrix,this.rMatrix,this.sMatrix,this.tr,o,!1),f+=o)}else if(n<0){for(;f>h;)this.applyTransforms(this.pMatrix,this.rMatrix,this.sMatrix,this.tr,1,!0),f-=1;o&&(this.applyTransforms(this.pMatrix,this.rMatrix,this.sMatrix,this.tr,-o,!0),f-=o)}s=1===this.data.m?0:this._currentCopies-1;var c=1===this.data.m?1:-1;for(a=this._currentCopies;a;){if(0!==f){(0!==s&&1===c||s!==this._currentCopies-1&&c===-1)&&this.applyTransforms(this.pMatrix,this.rMatrix,this.sMatrix,this.tr,1,!1),this.matrix.transform(p[0],p[1],p[2],p[3],p[4],p[5],p[6],p[7],p[8],p[9],p[10],p[11],p[12],p[13],p[14],p[15]),this.matrix.transform(m[0],m[1],m[2],m[3],m[4],m[5],m[6],m[7],m[8],m[9],m[10],m[11],m[12],m[13],m[14],m[15]),this.matrix.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]);var d,u=this.elemsData[s].it,y=u[u.length-1].transform.mProps.v.props,g=y.length;for(d=0;d<g;d+=1)y[d]=this.matrix.props[d];this.matrix.reset()}else{this.matrix.reset();var d,u=this.elemsData[s].it,y=u[u.length-1].transform.mProps.v.props,g=y.length;for(d=0;d<g;d+=1)y[d]=this.matrix.props[d]}f+=1,a-=1,s+=c}}},_aj.prototype.addShape=function(){},_as.registerModifier("rp",_aj),_am.prototype.addShape=function(t){this._length===this._maxLength&&(this.shapes=this.shapes.concat(_cv(this._maxLength)),this._maxLength*=2),this.shapes[this._length]=t,this._length+=1},_am.prototype.releaseShapes=function(){var t;for(t=0;t<this._length;t+=1)shape_pool.release(this.shapes[t]);this._length=0},DashProperty.prototype.getValue=function(t){if(this.elem._x.frameId!==this.frameId||t){var e=0,r=this.dataProps.length;for(this.mdf=!1,this.frameId=this.elem._x.frameId;e<r;){if(this.dataProps[e].p.mdf){this.mdf=!t;break}e+=1}if(this.mdf||t)for("svg"===this.renderer&&(this.dashStr=""),e=0;e<r;e+=1)"o"!=this.dataProps[e].n?"svg"===this.renderer?this.dashStr+=" "+this.dataProps[e].p.v:this.dashArray[e]=this.dataProps[e].p.v:this.dashoffset[0]=this.dataProps[e].p.v}},GradientProperty.prototype.comparePoints=function(t,e){for(var r,s=0,i=this.o.length/2;s<i;){if(r=Math.abs(t[4*s]-t[4*e+2*s]),r>.01)return!1;s+=1}return!0},GradientProperty.prototype.checkCollapsable=function(){if(this.o.length/2!==this.c.length/4)return!1;if(this.data.k.k[0].s)for(var t=0,e=this.data.k.k.length;t<e;){if(!this.comparePoints(this.data.k.k[t].s,this.data.p))return!1;t+=1}else if(!this.comparePoints(this.data.k.k,this.data.p))return!1;return!0},GradientProperty.prototype.getValue=function(t){if(this.prop.getValue(),this.cmdf=!1,this.omdf=!1,this.prop.mdf||t){var e,r,s,i=4*this.data.p;for(e=0;e<i;e+=1)r=e%4===0?100:255,s=Math.round(this.prop.v[e]*r),this.c[e]!==s&&(this.c[e]=s,this.cmdf=!t);if(this.o.length)for(i=this.prop.v.length,e=4*this.data.p;e<i;e+=1)r=e%2===0?100:1,s=e%2===0?Math.round(100*this.prop.v[e]):this.prop.v[e],this.o[e-4*this.data.p]!==s&&(this.o[e-4*this.data.p]=s,this.omdf=!t)}};var ImagePreloader=function(){function t(){this.loadedAssets+=1,this.loadedAssets===this.totalImages&&this.imagesLoadedCb&&this.imagesLoadedCb(null)}function e(t){var e="";if(this.assetsPath){var r=t.p;r.indexOf("images/")!==-1&&(r=r.split("/")[1]),e=this.assetsPath+r}else e=this.path,e+=t.u?t.u:"",e+=t.p;return e}function r(e){var r=_cu("img");r.addEventListener("load",t.bind(this),!1),r.addEventListener("error",t.bind(this),!1),r.src=e}function s(t,s){this.imagesLoadedCb=s,this.totalAssets=t.length;var i;for(i=0;i<this.totalAssets;i+=1)t[i].layers||(r.bind(this)(e.bind(this)(t[i])),this.totalImages+=1)}function i(t){this.path=t||""}function a(t){this.assetsPath=t||""}function n(){this.imagesLoadedCb=null}return function(){this.loadAssets=s,this.setAssetsPath=a,this.setPath=i,this.destroy=n,this.assetsPath="",this.path="",this.totalAssets=0,this.totalImages=0,this.loadedAssets=0,this.imagesLoadedCb=null}}(),featureSupport=function(){var t={maskType:!0};return(/MSIE 10/i.test(navigator.userAgent)||/MSIE 9/i.test(navigator.userAgent)||/rv:11.0/i.test(navigator.userAgent)||/Edge\/\d./i.test(navigator.userAgent))&&(t.maskType=!1),t}(),filtersFactory=function(){function t(t){var e=_ct("filter");return e.setAttribute("id",t),e.setAttribute("filterUnits","objectBoundingBox"),e.setAttribute("x","0%"),e.setAttribute("y","0%"),e.setAttribute("width","100%"),e.setAttribute("height","100%"),e}function e(){var t=_ct("feColorMatrix");return t.setAttribute("type","matrix"),t.setAttribute("color-interpolation-filters","sRGB"),t.setAttribute("values","0 0 0 1 0  0 0 0 1 0  0 0 0 1 0  0 0 0 1 1"),t}var r={};return r.createFilter=t,r.createAlphaToLuminanceFilter=e,r}();_bl.prototype.searchProperties=function(t){var e,r,s=this._textData.a.length,i=_ai._bo;for(e=0;e<s;e+=1)r=this._textData.a[e],this._animatorsData[e]=new TextAnimatorDataProperty(this._elem,r,this.__co);this._textData.p&&"m"in this._textData.p?(this._pathData={f:i(this._elem,this._textData.p.f,0,0,this.__co),l:i(this._elem,this._textData.p.l,0,0,this.__co),r:this._textData.p.r,m:this._elem.maskManager.getMaskProperty(this._textData.p.m)},this._hasMaskedPath=!0):this._hasMaskedPath=!1,this._moreOptions.alignment=i(this._elem,this._textData.m.a,1,0,this.__co),this.__co.length&&t.push(this)},_bl.prototype.getMeasures=function(t,e){if(this.lettersChangedFlag=e,this.mdf||this._ch||e||this._hasMaskedPath&&this._pathData.m.mdf){this._ch=!1;var r,s,i,a,n=this._moreOptions.alignment.v,o=this._animatorsData,h=this._textData,l=this.mHelper,p=this._renderType,m=this._bt.length,f=(this.data,t.l);if(this._hasMaskedPath){var c=this._pathData.m;if(!this._pathData.n||this._pathData.mdf){var d=c.v;this._pathData.r&&(d=d.reverse());var u={tLength:0,segments:[]};a=d._length-1;var y,g=0;for(i=0;i<a;i+=1)y={s:d.v[i],e:d.v[i+1],to:[d.o[i][0]-d.v[i][0],d.o[i][1]-d.v[i][1]],ti:[d.i[i+1][0]-d.v[i+1][0],d.i[i+1][1]-d.v[i+1][1]]},bez.buildBezierData(y),u.tLength+=y.bezierData.segmentLength,u.segments.push(y),g+=y.bezierData.segmentLength;i=a,c.v.c&&(y={s:d.v[i],e:d.v[0],to:[d.o[i][0]-d.v[i][0],d.o[i][1]-d.v[i][1]],ti:[d.i[0][0]-d.v[0][0],d.i[0][1]-d.v[0][1]]},bez.buildBezierData(y),u.tLength+=y.bezierData.segmentLength,u.segments.push(y),g+=y.bezierData.segmentLength),this._pathData.pi=u}var v,b,E,u=this._pathData.pi,P=this._pathData.f.v,x=0,S=1,C=0,A=!0,k=u.segments;if(P<0&&c.v.c)for(u.tLength<Math.abs(P)&&(P=-Math.abs(P)%u.tLength),x=k.length-1,E=k[x].bezierData.points,S=E.length-1;P<0;)P+=E[S].partialLength,S-=1,S<0&&(x-=1,E=k[x].bezierData.points,S=E.length-1);E=k[x].bezierData.points,b=E[S-1],v=E[S];var M,T,D=v.partialLength}a=f.length,r=0,s=0;var w,F,_,I,V,R=1.2*t.s*.714,B=!0;I=o.length;var L,G,N,z,O,H,j,W,q,Y,X,K,J,Z=-1,U=P,Q=x,$=S,tt=-1,et=0,rt="",st=this.defaultPropsArray;for(i=0;i<a;i+=1){if(l.reset(),O=1,f[i].n)r=0,s+=t.yOffset,s+=B?1:0,P=U,B=!1,et=0,this._hasMaskedPath&&(x=Q,S=$,E=k[x].bezierData.points,b=E[S-1],v=E[S],D=v.partialLength,C=0),J=Y=K=rt="",st=this.defaultPropsArray;else{if(this._hasMaskedPath){if(tt!==f[i].line){switch(t.j){case 1:P+=g-t.lineWidths[f[i].line];break;case 2:P+=(g-t.lineWidths[f[i].line])/2}tt=f[i].line}Z!==f[i].ind&&(f[Z]&&(P+=f[Z].extra),P+=f[i].an/2,Z=f[i].ind),P+=n[0]*f[i].an/200;var it=0;for(_=0;_<I;_+=1)w=o[_].a,w.p.propType&&(F=o[_].s,L=F.getMult(f[i].anIndexes[_],h.a[_].s.totalChars),it+=L.length?w.p.v[0]*L[0]:w.p.v[0]*L),w.a.propType&&(F=o[_].s,L=F.getMult(f[i].anIndexes[_],h.a[_].s.totalChars),it+=L.length?w.a.v[0]*L[0]:w.a.v[0]*L);for(A=!0;A;)C+D>=P+it||!E?(M=(P+it-C)/v.partialLength,N=b.point[0]+(v.point[0]-b.point[0])*M,z=b.point[1]+(v.point[1]-b.point[1])*M,l.translate(-n[0]*f[i].an/200,-(n[1]*R/100)),A=!1):E&&(C+=v.partialLength,S+=1,S>=E.length&&(S=0,x+=1,k[x]?E=k[x].bezierData.points:c.v.c?(S=0,x=0,E=k[x].bezierData.points):(C-=v.partialLength,E=null)),E&&(b=v,v=E[S],D=v.partialLength));G=f[i].an/2-f[i].add,l.translate(-G,0,0)}else G=f[i].an/2-f[i].add,l.translate(-G,0,0),l.translate(-n[0]*f[i].an/200,-n[1]*R/100,0);for(et+=f[i].l/2,_=0;_<I;_+=1)w=o[_].a,w.t.propType&&(F=o[_].s,L=F.getMult(f[i].anIndexes[_],h.a[_].s.totalChars),this._hasMaskedPath?P+=L.length?w.t*L[0]:w.t*L:r+=L.length?w.t.v*L[0]:w.t.v*L);for(et+=f[i].l/2,t.strokeWidthAnim&&(j=t.sw||0),t.strokeColorAnim&&(H=t.sc?[t.sc[0],t.sc[1],t.sc[2]]:[0,0,0]),t.fillColorAnim&&t.fc&&(W=[t.fc[0],t.fc[1],t.fc[2]]),_=0;_<I;_+=1)w=o[_].a,w.a.propType&&(F=o[_].s,L=F.getMult(f[i].anIndexes[_],h.a[_].s.totalChars),L.length?l.translate(-w.a.v[0]*L[0],-w.a.v[1]*L[1],w.a.v[2]*L[2]):l.translate(-w.a.v[0]*L,-w.a.v[1]*L,w.a.v[2]*L));for(_=0;_<I;_+=1)w=o[_].a,w.s.propType&&(F=o[_].s,L=F.getMult(f[i].anIndexes[_],h.a[_].s.totalChars),L.length?l.scale(1+(w.s.v[0]-1)*L[0],1+(w.s.v[1]-1)*L[1],1):l.scale(1+(w.s.v[0]-1)*L,1+(w.s.v[1]-1)*L,1));for(_=0;_<I;_+=1){if(w=o[_].a,F=o[_].s,L=F.getMult(f[i].anIndexes[_],h.a[_].s.totalChars),w.sk.propType&&(L.length?l.skewFromAxis(-w.sk.v*L[0],w.sa.v*L[1]):l.skewFromAxis(-w.sk.v*L,w.sa.v*L)),w.r.propType&&(L.length?l.rotateZ(-w.r.v*L[2]):l.rotateZ(-w.r.v*L)),w.ry.propType&&(L.length?l.rotateY(w.ry.v*L[1]):l.rotateY(w.ry.v*L)),w.rx.propType&&(L.length?l.rotateX(w.rx.v*L[0]):l.rotateX(w.rx.v*L)),w.o.propType&&(O+=L.length?(w.o.v*L[0]-O)*L[0]:(w.o.v*L-O)*L),t.strokeWidthAnim&&w.sw.propType&&(j+=L.length?w.sw.v*L[0]:w.sw.v*L),t.strokeColorAnim&&w.sc.propType)for(q=0;q<3;q+=1)L.length?H[q]=H[q]+(w.sc.v[q]-H[q])*L[0]:H[q]=H[q]+(w.sc.v[q]-H[q])*L;if(t.fillColorAnim&&t.fc){if(w.fc.propType)for(q=0;q<3;q+=1)L.length?W[q]=W[q]+(w.fc.v[q]-W[q])*L[0]:W[q]=W[q]+(w.fc.v[q]-W[q])*L;w.fh.propType&&(W=L.length?addHueToRGB(W,w.fh.v*L[0]):addHueToRGB(W,w.fh.v*L)),w.fs.propType&&(W=L.length?addSaturationToRGB(W,w.fs.v*L[0]):addSaturationToRGB(W,w.fs.v*L)),w.fb.propType&&(W=L.length?addBrightnessToRGB(W,w.fb.v*L[0]):addBrightnessToRGB(W,w.fb.v*L))}}for(_=0;_<I;_+=1)w=o[_].a,w.p.propType&&(F=o[_].s,L=F.getMult(f[i].anIndexes[_],h.a[_].s.totalChars),this._hasMaskedPath?L.length?l.translate(0,w.p.v[1]*L[0],-w.p.v[2]*L[1]):l.translate(0,w.p.v[1]*L,-w.p.v[2]*L):L.length?l.translate(w.p.v[0]*L[0],w.p.v[1]*L[1],-w.p.v[2]*L[2]):l.translate(w.p.v[0]*L,w.p.v[1]*L,-w.p.v[2]*L));if(t.strokeWidthAnim&&(Y=j<0?0:j),t.strokeColorAnim&&(X="rgb("+Math.round(255*H[0])+","+Math.round(255*H[1])+","+Math.round(255*H[2])+")"),t.fillColorAnim&&t.fc&&(K="rgb("+Math.round(255*W[0])+","+Math.round(255*W[1])+","+Math.round(255*W[2])+")"),this._hasMaskedPath){if(l.translate(0,-t.ls),l.translate(0,n[1]*R/100+s,0),h.p.p){T=(v.point[1]-b.point[1])/(v.point[0]-b.point[0]);var at=180*Math.atan(T)/Math.PI;v.point[0]<b.point[0]&&(at+=180),l.rotate(-at*Math.PI/180)}l.translate(N,z,0),P-=n[0]*f[i].an/200,f[i+1]&&Z!==f[i+1].ind&&(P+=f[i].an/2,P+=t.tr/1e3*t.s)}else{switch(l.translate(r,s,0),t.ps&&l.translate(t.ps[0],t.ps[1]+t.ascent,0),t.j){case 1:l.translate(t.justifyOffset+(t.boxWidth-t.lineWidths[f[i].line]),0,0);break;case 2:l.translate(t.justifyOffset+(t.boxWidth-t.lineWidths[f[i].line])/2,0,0)}l.translate(0,-t.ls),l.translate(G,0,0),l.translate(n[0]*f[i].an/200,n[1]*R/100,0),r+=f[i].l+t.tr/1e3*t.s}"html"===p?rt=l.toCSS():"svg"===p?rt=l.to2dCSS():st=[l.props[0],l.props[1],l.props[2],l.props[3],l.props[4],l.props[5],l.props[6],l.props[7],l.props[8],l.props[9],l.props[10],l.props[11],l.props[12],l.props[13],l.props[14],l.props[15]],J=O}m<=i?(V=new LetterProps(J,Y,X,K,rt,st),this._bt.push(V),m+=1,this.lettersChangedFlag=!0):(V=this._bt[i],this.lettersChangedFlag=V.update(J,Y,X,K,rt,st)||this.lettersChangedFlag)}}},_bl.prototype.getValue=function(){if(this._elem._x.frameId!==this._frameId){this._frameId=this._elem._x.frameId;var t,e=this.__co.length;for(this.mdf=!1,t=0;t<e;t+=1)this.__co[t].getValue(),this.mdf=this.__co[t].mdf||this.mdf}},_bl.prototype.mHelper=new Matrix,_bl.prototype.defaultPropsArray=[],LetterProps.prototype.update=function(t,e,r,s,i,a){this.mdf.o=!1,this.mdf.sw=!1,this.mdf.sc=!1,this.mdf.fc=!1,this.mdf.m=!1,this.mdf.p=!1;var n=!1;return this.o!==t&&(this.o=t,this.mdf.o=!0,n=!0),this.sw!==e&&(this.sw=e,this.mdf.sw=!0,n=!0),this.sc!==r&&(this.sc=r,this.mdf.sc=!0,n=!0),this.fc!==s&&(this.fc=s,this.mdf.fc=!0,n=!0),this.m!==i&&(this.m=i,this.mdf.m=!0,n=!0),!a.length||this.p[0]===a[0]&&this.p[1]===a[1]&&this.p[4]===a[4]&&this.p[5]===a[5]&&this.p[12]===a[12]&&this.p[13]===a[13]||(this.p=a,this.mdf.p=!0,n=!0),n},_ar.prototype.setCurrentData=function(t){var e=this.currentData;e.ascent=t.ascent,e.boxWidth=t.boxWidth?t.boxWidth:e.boxWidth,e.f=t.f,e.fStyle=t.fStyle,e.fWeight=t.fWeight,e.fc=t.fc,e.j=t.j,e.justifyOffset=t.justifyOffset,e.l=t.l,e.lh=t.lh,e.lineWidths=t.lineWidths,e.ls=t.ls,e.of=t.of,e.s=t.s,e.sc=t.sc,e.sw=t.sw,e.sz=t.sz,e.ps=t.ps,e.t=t.t,e.tr=t.tr,e.fillColorAnim=t.fillColorAnim||e.fillColorAnim,e.strokeColorAnim=t.strokeColorAnim||e.strokeColorAnim,e.strokeWidthAnim=t.strokeWidthAnim||e.strokeWidthAnim,e.yOffset=t.yOffset,e.__complete=!1},_ar.prototype.searchProperty=function(){return this.kf=this.data.d.k.length>1,this.kf},_ar.prototype.getValue=function(){this.mdf=!1;var t=this.elem._x.frameId;if(t!==this._frameId&&this.kf||this._ch){for(var e,r=this.data.d.k,s=0,i=r.length;s<=i-1&&(e=r[s].s,!(s===i-1||r[s+1].t>t));)s+=1;this.keysIndex!==s&&(e.__complete||this.completeTextData(e),this.setCurrentData(e),this.mdf=!this._ch,this.pv=this.v=this.currentData.t,this.keysIndex=s),this._frameId=t}},_ar.prototype.completeTextData=function(t){t.__complete=!0;var e,r,s,i,a,n,o,h=this.elem._x._cr,l=this.data,p=[],m=0,f=l.m.g,c=0,d=0,u=0,y=[],g=0,v=0,b=h.getFontByName(t.f),E=0,P=b.fStyle.split(" "),x="normal",S="normal";r=P.length;var C;for(e=0;e<r;e+=1)switch(C=P[e].toLowerCase()){case"italic":S="italic";break;case"bold":x="700";break;case"black":x="900";break;case"medium":x="500";break;case"regular":case"normal":x="400";case"light":case"thin":x="200"}t.fWeight=x,t.fStyle=S,r=t.t.length;var A=t.tr/1e3*t.s;if(t.sz){var k=t.sz[0],M=-1;for(e=0;e<r;e+=1)s=!1," "===t.t.charAt(e)?M=e:13===t.t.charCodeAt(e)&&(g=0,s=!0),h.chars?(o=h.getCharData(t.t.charAt(e),b.fStyle,b.fFamily),E=s?0:o.w*t.s/100):E=h.measureText(t.t.charAt(e),t.f,t.s),g+E>k&&" "!==t.t.charAt(e)?(M===-1?r+=1:e=M,t.t=t.t.substr(0,e)+"\r"+t.t.substr(e===M?e+1:e),M=-1,g=0):(g+=E,g+=A);r=t.t.length}g=-A,E=0;var T,D=0;for(e=0;e<r;e+=1)if(s=!1,T=t.t.charAt(e)," "===T?i="\xa0":13===T.charCodeAt(0)?(D=0,y.push(g),v=g>v?g:v,g=-2*A,i="",s=!0,u+=1):i=t.t.charAt(e),h.chars?(o=h.getCharData(T,b.fStyle,h.getFontByName(t.f).fFamily),E=s?0:o.w*t.s/100):E=h.measureText(i,t.f,t.s)," "===T?D+=E+A:(g+=E+A+D,D=0),p.push({l:E,an:E,add:c,n:s,anIndexes:[],val:i,line:u}),2==f){if(c+=E,""==i||"\xa0"==i||e==r-1){for(""!=i&&"\xa0"!=i||(c-=E);d<=e;)p[d].an=c,p[d].ind=m,p[d].extra=E,d+=1;m+=1,c=0}}else if(3==f){if(c+=E,""==i||e==r-1){for(""==i&&(c-=E);d<=e;)p[d].an=c,p[d].ind=m,p[d].extra=E,d+=1;c=0,m+=1}}else p[m].ind=m,p[m].extra=0,m+=1;if(t.l=p,v=g>v?g:v,y.push(g),t.sz)t.boxWidth=t.sz[0],t.justifyOffset=0;else switch(t.boxWidth=v,t.j){case 1:t.justifyOffset=-t.boxWidth;break;case 2:t.justifyOffset=-t.boxWidth/2;break;default:t.justifyOffset=0}t.lineWidths=y;var w,F,_=l.a;n=_.length;var I,V,R=[];for(a=0;a<n;a+=1){for(w=_[a],w.a.sc&&(t.strokeColorAnim=!0),w.a.sw&&(t.strokeWidthAnim=!0),(w.a.fc||w.a.fh||w.a.fs||w.a.fb)&&(t.fillColorAnim=!0),V=0,I=w.s.b,e=0;e<r;e+=1)F=p[e],F.anIndexes[a]=V,(1==I&&""!=F.val||2==I&&""!=F.val&&"\xa0"!=F.val||3==I&&(F.n||"\xa0"==F.val||e==r-1)||4==I&&(F.n||e==r-1))&&(1===w.s.rn&&R.push(V),V+=1);l.a[a].s.totalChars=V;var B,L=-1;if(1===w.s.rn)for(e=0;e<r;e+=1)F=p[e],L!=F.anIndexes[a]&&(L=F.anIndexes[a],B=R.splice(Math.floor(Math.random()*R.length),1)[0]),F.anIndexes[a]=B}t.yOffset=t.lh||1.2*t.s,t.ls=t.ls||0,t.ascent=b.ascent*t.s/100},_ar.prototype.updateDocumentData=function(t,e){e=void 0===e?this.keysIndex:e;var r=this.data.d.k[e].s;r.__complete=!1,r.t=t.t,this.keysIndex=-1,this._ch=!0,this.getValue()};var TextSelectorProp=function(){function t(t){if(this.mdf=t||!1,this._co.length){var e,r=this._co.length;for(e=0;e<r;e+=1)this._co[e].getValue(),this._co[e].mdf&&(this.mdf=!0)}var s=this.elem.textProperty.currentData?this.elem.textProperty.currentData.l.length:0;t&&2===this.data.r&&(this.e.v=s);var i=2===this.data.r?1:100/s,a=this.o.v/i,n=this.s.v/i+a,o=this.e.v/i+a;if(n>o){var h=n;n=o,o=h}this.finalS=n,this.finalE=o}function e(t){var e=BezierFactory.getBezierEasing(this.ne.v/100,0,1-this.xe.v/100,1).get,r=0,s=this.finalS,o=this.finalE,h=this.data.sh;if(2==h)r=o===s?t>=o?1:0:i(0,a(.5/(o-s)+(t-s)/(o-s),1)),r=e(r);else if(3==h)r=o===s?t>=o?0:1:1-i(0,a(.5/(o-s)+(t-s)/(o-s),1)),r=e(r);else if(4==h)o===s?r=0:(r=i(0,a(.5/(o-s)+(t-s)/(o-s),1)),r<.5?r*=2:r=1-2*(r-.5)),r=e(r);else if(5==h){if(o===s)r=0;else{var l=o-s;t=a(i(0,t+.5-s),o-s);var p=-l/2+t,m=l/2;r=Math.sqrt(1-p*p/(m*m))}r=e(r)}else 6==h?(o===s?r=0:(t=a(i(0,t+.5-s),o-s),r=(1+Math.cos(Math.PI+2*Math.PI*t/(o-s)))/2),r=e(r)):(t>=n(s)&&(r=t-s<0?1-(s-t):i(0,a(o-t,1))),r=e(r));return r*this.a.v}function r(r,s,i){this.mdf=!1,this.k=!1,this.data=s,this._co=[],this.getValue=t,this.getMult=e,this.elem=r,this.comp=r.comp,this.finalS=0,this.finalE=0,this.s=_ai._bo(r,s.s||{k:0},0,0,this._co),"e"in s?this.e=_ai._bo(r,s.e,0,0,this._co):this.e={v:100},this.o=_ai._bo(r,s.o||{k:0},0,0,this._co),this.xe=_ai._bo(r,s.xe||{k:0},0,0,this._co),this.ne=_ai._bo(r,s.ne||{k:0},0,0,this._co),this.a=_ai._bo(r,s.a,0,.01,this._co),this._co.length?i.push(this):this.getValue()}function s(t,e,s){return new r(t,e,s)}var i=Math.max,a=Math.min,n=Math.floor;return{getTextSelectorProp:s}}(),pool_factory=function(){return function(t,e,r,s){function i(){var t;return n?(n-=1,t=h[n]):t=e(),t}function a(t){n===o&&(h=pooling["double"](h),o=2*o),r&&r(t),h[n]=t,n+=1}var n=0,o=t,h=_cv(o),l={newElement:i,release:a};return l}}(),pooling=function(){function t(t){return t.concat(_cv(t.length))}return{"double":t}}(),point_pool=function(){function t(){return _cs("float32",2)}return pool_factory(8,t)}(),shape_pool=function(){function t(){return new _av}function e(t){var e,r=t._length;for(e=0;e<r;e+=1)point_pool.release(t.v[e]),point_pool.release(t.i[e]),point_pool.release(t.o[e]),t.v[e]=null,t.i[e]=null,t.o[e]=null;t._length=0,t.c=!1}function r(t){var e,r=s.newElement(),i=void 0===t._length?t.v.length:t._length;r.setLength(i),r.c=t.c;for(e=0;e<i;e+=1)r._aw(t.v[e][0],t.v[e][1],t.o[e][0],t.o[e][1],t.i[e][0],t.i[e][1],e);return r}var s=pool_factory(4,t,e);return s.clone=r,s}(),shapeCollection_pool=function(){function t(){var t;return s?(s-=1,t=a[s]):t=new _am,t}function e(t){var e,r=t._length;for(e=0;e<r;e+=1)shape_pool.release(t.shapes[e]);t._length=0,s===i&&(a=pooling["double"](a),i=2*i),a[s]=t,s+=1}var r={_al:t,release:e},s=0,i=4,a=_cv(i);return r}(),segments_length_pool=function(){function t(){return{lengths:[],totalLength:0}}function e(t){var e,r=t.lengths.length;for(e=0;e<r;e+=1)bezier_length_pool.release(t.lengths[e]);t.lengths.length=0}return pool_factory(8,t,e)}(),bezier_length_pool=function(){function t(){return{addedLength:0,percents:_cs("float32",defaultCurveSegments),lengths:_cs("float32",defaultCurveSegments)}}return pool_factory(8,t)}();_l.prototype.checkLayers=function(t){var e,r,s=this.layers.length;for(this._db=!0,e=s-1;e>=0;e--)this._br[e]||(r=this.layers[e],r.ip-r.st<=t-this.layers[e].st&&r.op-r.st>t-this.layers[e].st&&this.buildItem(e)),this._db=!!this._br[e]&&this._db;this.checkPendingElements()},_l.prototype.createItem=function(t){switch(t.ty){case 2:return this.createImage(t);case 0:return this.createComp(t);case 1:return this.createSolid(t);case 3:return this.createNull(t);case 4:return this.createShape(t);case 5:return this.createText(t);case 13:return this.createCamera(t);case 99:return null}return this.createBase(t)},_l.prototype.createCamera=function(){throw new Error("You're using a 3d camera. Try the html renderer.")},_l.prototype.buildAllItems=function(){
+var t,e=this.layers.length;for(t=0;t<e;t+=1)this.buildItem(t);this.checkPendingElements()},_l.prototype.includeLayers=function(t){this._db=!1;var e,r,s=t.length,i=this.layers.length;for(e=0;e<s;e+=1)for(r=0;r<i;){if(this.layers[r].id==t[e].id){this.layers[r]=t[e];break}r+=1}},_l.prototype.setProjectInterface=function(t){this._x.projectInterface=t},_l.prototype.initItems=function(){this._x.progressiveLoad||this.buildAllItems()},_l.prototype.buildElementParenting=function(t,e,r){for(var s=this._br,i=this.layers,a=0,n=i.length;a<n;)i[a].ind==e&&(s[a]&&s[a]!==!0?void 0!==i[a].parent?(r.push(s[a]),s[a]._isParent=!0,this.buildElementParenting(t,i[a].parent,r)):(r.push(s[a]),s[a]._isParent=!0,t.setHierarchy(r)):(this.buildItem(a),this.addPendingElement(t))),a+=1},_l.prototype.addPendingElement=function(t){this._dc.push(t)},extendPrototype([_l],_ao),_ao.prototype.createBase=function(t){return new _d(t,this._x,this)},_ao.prototype.createNull=function(t){return new _i(t,this._x,this)},_ao.prototype.createShape=function(t){return new SVGShapeElement(t,this._x,this)},_ao.prototype.createText=function(t){return new _cw(t,this._x,this)},_ao.prototype.createImage=function(t){return new _h(t,this._x,this)},_ao.prototype.createComp=function(t){return new SVGCompElement(t,this._x,this)},_ao.prototype.createSolid=function(t){return new _j(t,this._x,this)},_ao.prototype.configAnimation=function(t){this._cf.setAttribute("xmlns","http://www.w3.org/2000/svg"),this.renderConfig.viewBoxSize?this._cf.setAttribute("viewBox",this.renderConfig.viewBoxSize):this._cf.setAttribute("viewBox","0 0 "+t.w+" "+t.h),this.renderConfig.viewBoxOnly||(this._cf.setAttribute("width",t.w),this._cf.setAttribute("height",t.h),this._cf.style.width="100%",this._cf.style.height="100%"),this.renderConfig.className&&this._cf.setAttribute("class",this.renderConfig.className),this._cf.setAttribute("preserveAspectRatio",this.renderConfig.preserveAspectRatio),this._cq.wrapper.appendChild(this._cf);var e=this._x.defs;this._x.getAssetData=this._cq.getAssetData.bind(this._cq),this._x.getAssetsPath=this._cq.getAssetsPath.bind(this._cq),this._x.progressiveLoad=this.renderConfig.progressiveLoad,this._x.nm=t.nm,this._x._de.w=t.w,this._x._de.h=t.h,this._x.frameRate=t.fr,this.data=t;var r=_ct("clipPath"),s=_ct("rect");s.setAttribute("width",t.w),s.setAttribute("height",t.h),s.setAttribute("x",0),s.setAttribute("y",0);var i="animationMask_"+randomString(10);r.setAttribute("id",i),r.appendChild(s),this._bx.setAttribute("clip-path","url("+locationHref+"#"+i+")"),e.appendChild(r),this.layers=t.layers,this._x._cr.addChars(t.chars),this._x._cr.addFonts(t.fonts,e),this._br=_cv(t.layers.length)},_ao.prototype.destroy=function(){this._cq.wrapper.innerHTML="",this._bx=null,this._x.defs=null;var t,e=this.layers?this.layers.length:0;for(t=0;t<e;t++)this._br[t]&&this._br[t].destroy();this._br.length=0,this.destroyed=!0,this._cq=null},_ao.prototype.updateContainerSize=function(){},_ao.prototype.buildItem=function(t){var e=this._br;if(!e[t]&&99!=this.layers[t].ty){e[t]=!0;var r=this.createItem(this.layers[t]);e[t]=r,expressionsPlugin&&(0===this.layers[t].ty&&this._x.projectInterface.registerComposition(r),r.initExpressions()),this.appendElementInPos(r,t),this.layers[t].tt&&(this._br[t-1]&&this._br[t-1]!==!0?r.setMatte(e[t-1].layerId):(this.buildItem(t-1),this.addPendingElement(r)))}},_ao.prototype.checkPendingElements=function(){for(;this._dc.length;){var t=this._dc.pop();if(t.checkParenting(),t.data.tt)for(var e=0,r=this._br.length;e<r;){if(this._br[e]===t){t.setMatte(this._br[e-1].layerId);break}e+=1}}},_ao.prototype._ba=function(t){if(this.renderedFrame!==t&&!this.destroyed){null===t?t=this.renderedFrame:this.renderedFrame=t,this._x.frameNum=t,this._x.frameId+=1,this._x.projectInterface.currentFrame=t;var e,r=this.layers.length;for(this._db||this.checkLayers(t),e=r-1;e>=0;e--)(this._db||this._br[e])&&this._br[e]._az(t-this.layers[e].st);for(e=0;e<r;e+=1)(this._db||this._br[e])&&this._br[e]._ba()}},_ao.prototype.appendElementInPos=function(t,e){var r=t.get_e();if(r){for(var s,i=0;i<e;)this._br[i]&&this._br[i]!==!0&&this._br[i].get_e()&&(s=this._br[i].get_e()),i+=1;s?this._bx.insertBefore(r,s):this._bx.appendChild(r)}},_ao.prototype.hide=function(){this._bx.style.display="none"},_ao.prototype.show=function(){this._bx.style.display="block"},_ao.prototype.searchExtraCompositions=function(t){var e,r=t.length,s=_ct("g");for(e=0;e<r;e+=1)if(t[e].xt){var i=this.createComp(t[e],s,this._x.comp,null);i.initExpressions(),this._x.projectInterface.registerComposition(i)}},_ay.prototype.getMaskProperty=function(t){return this.viewData[t].prop},_ay.prototype._az=function(){var t,e=this._co.length;for(t=0;t<e;t+=1)this._co[t].getValue()},_ay.prototype._ba=function(t){var e,r=this.masksProperties.length;for(e=0;e<r;e++)if((this.viewData[e].prop.mdf||this._ch)&&this.drawPath(this.masksProperties[e],this.viewData[e].prop.v,this.viewData[e]),(this.viewData[e].op.mdf||this._ch)&&this.viewData[e].elem.setAttribute("fill-opacity",this.viewData[e].op.v),"n"!==this.masksProperties[e].mode&&(this.viewData[e].invRect&&(this.element.finalTransform.mProp.mdf||this._ch)&&(this.viewData[e].invRect.setAttribute("x",-t.props[12]),this.viewData[e].invRect.setAttribute("y",-t.props[13])),this.storedData[e].x&&(this.storedData[e].x.mdf||this._ch))){var s=this.storedData[e].expan;this.storedData[e].x.v<0?("erode"!==this.storedData[e].lastOperator&&(this.storedData[e].lastOperator="erode",this.storedData[e].elem.setAttribute("filter","url("+locationHref+"#"+this.storedData[e].filterId+")")),s.setAttribute("radius",-this.storedData[e].x.v)):("dilate"!==this.storedData[e].lastOperator&&(this.storedData[e].lastOperator="dilate",this.storedData[e].elem.setAttribute("filter",null)),this.storedData[e].elem.setAttribute("stroke-width",2*this.storedData[e].x.v))}this._ch=!1},_ay.prototype.getMaskelement=function(){return this.maskElement},_ay.prototype.createLayerSolidPath=function(){var t="M0,0 ";return t+=" h"+this._x._de.w,t+=" v"+this._x._de.h,t+=" h-"+this._x._de.w,t+=" v-"+this._x._de.h+" "},_ay.prototype.drawPath=function(t,e,r){var s,i,a=" M"+e.v[0][0]+","+e.v[0][1];for(i=e._length,s=1;s<i;s+=1)a+=" C"+e.o[s-1][0]+","+e.o[s-1][1]+" "+e.i[s][0]+","+e.i[s][1]+" "+e.v[s][0]+","+e.v[s][1];if(e.c&&i>1&&(a+=" C"+e.o[s-1][0]+","+e.o[s-1][1]+" "+e.i[0][0]+","+e.i[0][1]+" "+e.v[0][0]+","+e.v[0][1]),r.lastPath!==a){var n="";r.elem&&(e.c&&(n=t.inv?this.solidPath+a:a),r.elem.setAttribute("d",n)),r.lastPath=a}},_ay.prototype.destroy=function(){this.element=null,this._x=null,this.maskElement=null,this.data=null,this.masksProperties=null},_ad.prototype.initHierarchy=function(){this._dd=[],this._isParent=!1,this.checkParenting()},_ad.prototype.resetHierarchy=function(){this._dd.length=0},_ad.prototype.getHierarchy=function(){return this._dd},_ad.prototype.setHierarchy=function(t){this._dd=t},_ad.prototype.checkParenting=function(){void 0!==this.data.parent&&this.comp.buildElementParenting(this,this.data.parent,[])},_ad.prototype.prepareHierarchy=function(){},_ac.prototype.initFrame=function(){this._ch=!1,this._co=[]},_ac.prototype.prepareProperties=function(t,e){var r,s=this._co.length;for(r=0;r<s;r+=1)(e||this._isParent&&"transform"===this._co[r].propType)&&(this._co[r].getValue(this._ch),this._co[r].mdf&&(this._x.mdf=!0))},_af.prototype.initTransform=function(){this.finalTransform={mProp:this.data.ks?_ag._bj(this,this.data.ks,this._co):{o:0},matMdf:!1,opMdf:!1,mat:new Matrix},this.data.ao&&(this.finalTransform.mProp.autoOriented=!0),11!==this.data.ty},_af.prototype.renderTransform=function(){if(this.finalTransform.opMdf=this.finalTransform.mProp.o.mdf||this._ch,this.finalTransform.matMdf=this.finalTransform.mProp.mdf||this._ch,this._dd){var t,e=this.finalTransform.mat,r=0,s=this._dd.length;if(!this.finalTransform.matMdf)for(;r<s;){if(this._dd[r].finalTransform.mProp.mdf){this.finalTransform.matMdf=!0;break}r+=1}if(this.finalTransform.matMdf)for(t=this.finalTransform.mProp.v.props,e.cloneFromProps(t),r=0;r<s;r+=1)t=this._dd[r].finalTransform.mProp.v.props,e.transform(t[0],t[1],t[2],t[3],t[4],t[5],t[6],t[7],t[8],t[9],t[10],t[11],t[12],t[13],t[14],t[15])}},_af.prototype.globalToLocal=function(t){var e=[];e.push(this.finalTransform);for(var r=!0,s=this.comp;r;)s.finalTransform?(s.data.hasMask&&e.splice(0,0,s.finalTransform),s=s.comp):r=!1;var i,a,n=e.length;for(i=0;i<n;i+=1)a=e[i].mat._cn(0,0,0),t=[t[0]-a[0],t[1]-a[1],0];return t},_af.prototype.mHelper=new Matrix,_ae.prototype.initRenderable=function(){this.isInRange=!1,this.hidden=!1,this.isTransparent=!1},_ae.prototype.prepareRenderableFrame=function(t){this.checkLayerLimits(t),this.prepareMasks(t),this.finalTransform.mProp.o.v<=0?!this.isTransparent&&this._x.renderConfig.hideOnTransparent&&(this.isTransparent=!0,this.hide()):this.isTransparent&&(this.isTransparent=!1,this.show())},_ae.prototype.checkLayerLimits=function(t){this.data.ip-this.data.st<=t&&this.data.op-this.data.st>t?this.isInRange!==!0&&(this._x.mdf=!0,this.isInRange=!0,this.show()):this.isInRange!==!1&&(this._x.mdf=!0,this.isInRange=!1,this.hide())},_ae.prototype.prepareMasks=function(){this.isInRange&&this.maskManager._az()},_ae.prototype.renderRenderable=function(){this.maskManager._ba(this.finalTransform.mat),this.effectsManager._ba(this._ch)},_ae.prototype.sourceRectAtTime=function(){return{top:0,left:0,width:100,height:100}},_ae.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}},extendPrototype([_ae],_ci),_ci.prototype._cz=function(t,e,r){this.initFrame(),this.initBaseData(t,e,r),this.initTransform(t,e,r),this.initHierarchy(),this.initRenderable(),this.initRendererElement(),this.createContainerElements(),this.addMasks(),this.createContent(),this.hide()},_ci.prototype.hide=function(){this.hidden||this.isInRange&&!this.isTransparent||(this._bx.style.display="none",this.hidden=!0)},_ci.prototype.show=function(){this.isInRange&&!this.isTransparent&&(this.data.hd||(this._bx.style.display="block"),this.hidden=!1,this._ch=!0,this.maskManager._ch=!0)},_ci.prototype._ba=function(){this.data.hd||this.hidden||(this.renderTransform(),this.renderRenderable(),this.renderElement(),this.renderInnerContent(),this._ch&&(this._ch=!1))},_ci.prototype.renderInnerContent=function(){},_ci.prototype.destroy=function(){this._cc=null,this.destroy_e()},_ci.prototype._az=function(t){this.prepareRenderableFrame(t),this.prepareProperties(t,this.isInRange)},SVGStyleData.prototype.reset=function(){this.d="",this.mdf=!1},_ck.prototype.initGradientData=function(t,e,r,s){this.o=_ai._bo(t,e.o,0,.01,r),this.s=_ai._bo(t,e.s,1,null,r),this.e=_ai._bo(t,e.e,1,null,r),this.h=_ai._bo(t,e.h||{k:0},0,.01,r),this.a=_ai._bo(t,e.a||{k:0},0,degToRads,r),this.g=new GradientProperty(t,e.g,r),this.style=s,this.stops=[],this.setGradientData(s.pElem,e),this.setGradientOpacity(e,s)},_ck.prototype.setGradientData=function(t,e){var r="gr_"+randomString(10),s=_ct(1===e.t?"linearGradient":"radialGradient");s.setAttribute("id",r),s.setAttribute("spreadMethod","pad"),s.setAttribute("gradientUnits","userSpaceOnUse");var i,a,n,o=[];for(n=4*e.g.p,a=0;a<n;a+=4)i=_ct("stop"),s.appendChild(i),o.push(i);t.setAttribute("gf"===e.ty?"fill":"stroke","url(#"+r+")"),this.gf=s,this.cst=o},_ck.prototype.setGradientOpacity=function(t,e){if(this.g._hasOpacity&&!this.g._collapsable){var r,s,i,a=_ct("mask"),n=_ct("path");a.appendChild(n);var o="op_"+randomString(10),h="mk_"+randomString(10);a.setAttribute("id",h);var l=_ct(1===t.t?"linearGradient":"radialGradient");l.setAttribute("id",o),l.setAttribute("spreadMethod","pad"),l.setAttribute("gradientUnits","userSpaceOnUse"),i=t.g.k.k[0].s?t.g.k.k[0].s.length:t.g.k.k.length;var p=this.stops;for(s=4*t.g.p;s<i;s+=2)r=_ct("stop"),r.setAttribute("stop-color","rgb(255,255,255)"),l.appendChild(r),p.push(r);n.setAttribute("gf"===t.ty?"fill":"stroke","url(#"+o+")"),this.of=l,this.ms=a,this.ost=p,this.maskId=h,e.msElem=n}},_cj.prototype.initGradientData=_ck.prototype.initGradientData,_cj.prototype.setGradientData=_ck.prototype.setGradientData,_cj.prototype.setGradientOpacity=_ck.prototype.setGradientOpacity,_e.prototype.checkMasks=function(){if(!this.data.hasMask)return!1;for(var t=0,e=this.data.masksProperties.length;t<e;){if("n"!==this.data.masksProperties[t].mode&&this.data.masksProperties[t].cl!==!1)return!0;t+=1}return!1},_e.prototype.initExpressions=function(){this.layerInterface=LayerExpressionInterface(this),this.data.hasMask&&this.layerInterface.registerMaskInterface(this.maskManager);var t=EffectsExpressionInterface.createEffectsInterface(this,this.layerInterface);this.layerInterface.registerEffectsInterface(t),0===this.data.ty||this.data.xt?this.compInterface=CompExpressionInterface(this):4===this.data.ty?(this.layerInterface.shapeInterface=ShapeExpressionInterface(this.shapesData,this.itemsData,this.layerInterface),this.layerInterface.content=this.layerInterface.shapeInterface):5===this.data.ty&&(this.layerInterface.textInterface=TextExpressionInterface(this),this.layerInterface.text=this.layerInterface.textInterface)},_e.prototype.blendModeEnums={1:"multiply",2:"screen",3:"overlay",4:"darken",5:"lighten",6:"color-dodge",7:"color-burn",8:"hard-light",9:"soft-light",10:"difference",11:"exclusion",12:"hue",13:"saturation",14:"color",15:"luminosity"},_e.prototype.getBlendMode=function(){return this.blendModeEnums[this.data.bm]||""},_e.prototype.setBlendMode=function(){var t=this.getBlendMode(),e=this._by||this._bx;e.style["mix-blend-mode"]=t},_e.prototype.initBaseData=function(t,e,r){this._x=e,this.comp=r,this.data=t,this.layerId="ly_"+randomString(10),this.data.sr||(this.data.sr=1),this.effects=new EffectsManager(this.data,this,this._co)},_e.prototype.getType=function(){return this.type},_i.prototype._az=function(t){this.prepareProperties(t,!0)},_i.prototype._ba=function(){},_i.prototype.get_e=function(){return null},_i.prototype.destroy=function(){},_i.prototype.sourceRectAtTime=function(){},_i.prototype.hide=function(){},extendPrototype([_e,_af,_ad,_ac],_i),_d.prototype.initRendererElement=function(){this._bx=_ct("g")},_d.prototype.createContainerElements=function(){this.matteElement=_ct("g"),this._bz=this._bx,this._ca=this._bx,this._sizeChanged=!1;var t=null;if(this.data.td){if(3==this.data.td||1==this.data.td){var e=_ct("mask");if(e.setAttribute("id",this.layerId),e.setAttribute("mask-type",3==this.data.td?"luminance":"alpha"),e.appendChild(this._bx),t=e,this._x.defs.appendChild(e),!featureSupport.maskType&&1==this.data.td){e.setAttribute("mask-type","luminance");var r=randomString(10),s=filtersFactory.createFilter(r);this._x.defs.appendChild(s),s.appendChild(filtersFactory.createAlphaToLuminanceFilter());var i=_ct("g");i.appendChild(this._bx),t=i,e.appendChild(i),i.setAttribute("filter","url("+locationHref+"#"+r+")")}}else if(2==this.data.td){var a=_ct("mask");a.setAttribute("id",this.layerId),a.setAttribute("mask-type","alpha");var n=_ct("g");a.appendChild(n);var r=randomString(10),s=filtersFactory.createFilter(r),o=_ct("feColorMatrix");o.setAttribute("type","matrix"),o.setAttribute("color-interpolation-filters","sRGB"),o.setAttribute("values","1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 -1 1"),s.appendChild(o),this._x.defs.appendChild(s);var h=_ct("rect");if(h.setAttribute("width",this.comp.data.w),h.setAttribute("height",this.comp.data.h),h.setAttribute("x","0"),h.setAttribute("y","0"),h.setAttribute("fill","#ffffff"),h.setAttribute("opacity","0"),n.setAttribute("filter","url("+locationHref+"#"+r+")"),n.appendChild(h),n.appendChild(this._bx),t=n,!featureSupport.maskType){a.setAttribute("mask-type","luminance"),s.appendChild(filtersFactory.createAlphaToLuminanceFilter());var i=_ct("g");n.appendChild(h),i.appendChild(this._bx),t=i,n.appendChild(i)}this._x.defs.appendChild(a)}}else this.data.tt?(this.matteElement.appendChild(this._bx),t=this.matteElement,this._by=this.matteElement):this._by=this._bx;if(!this.data.ln&&!this.data.cl||4!==this.data.ty&&0!==this.data.ty||(this.data.ln&&this._bx.setAttribute("id",this.data.ln),this.data.cl&&this._bx.setAttribute("class",this.data.cl)),0===this.data.ty&&!this.data.hd){var l=_ct("clipPath"),p=_ct("path");p.setAttribute("d","M0,0 L"+this.data.w+",0 L"+this.data.w+","+this.data.h+" L0,"+this.data.h+"z");var m="cp_"+randomString(8);if(l.setAttribute("id",m),l.appendChild(p),this._x.defs.appendChild(l),this.checkMasks()){var f=_ct("g");f.setAttribute("clip-path","url("+locationHref+"#"+m+")"),f.appendChild(this._bx),this._bz=f,t?t.appendChild(this._bz):this._by=this._bz}else this._bx.setAttribute("clip-path","url("+locationHref+"#"+m+")")}0!==this.data.bm&&this.setBlendMode(),this.effectsManager=new _bi(this)},_d.prototype.renderElement=function(){this.finalTransform.matMdf&&this._bz.setAttribute("transform",this.finalTransform.mat.to2dCSS()),this.finalTransform.opMdf&&this._bz.setAttribute("opacity",this.finalTransform.mProp.o.v)},_d.prototype.destroy_e=function(){this._bx=null,this.matteElement=null,this.maskManager.destroy()},_d.prototype.get_e=function(){return this.data.hd?null:this._by},_d.prototype.addMasks=function(){this.maskManager=new _ay(this.data,this,this._x)},_d.prototype.setMatte=function(t){this.matteElement&&this.matteElement.setAttribute("mask","url("+locationHref+"#"+t+")")},_f.prototype={addShapeToModifiers:function(t){var e,r=this.shapeModifiers.length;for(e=0;e<r;e+=1)this.shapeModifiers[e].addShape(t)},renderModifiers:function(){if(this.shapeModifiers.length){var t,e=this.shapes.length;for(t=0;t<e;t+=1)this.shapes[t].reset();for(e=this.shapeModifiers.length,t=e-1;t>=0;t-=1)this.shapeModifiers[t].processShapes(this._ch)}},lcEnum:{1:"butt",2:"round",3:"square"},ljEnum:{1:"miter",2:"round",3:"butt"},searchProcessedElement:function(t){for(var e=0,r=this.processedElements.length;e<r;){if(this.processedElements[e].elem===t)return this.processedElements[e].pos;e+=1}return 0},addProcessedElement:function(t,e){for(var r=this.processedElements.length;r;)if(r-=1,this.processedElements[r].elem===t){this.processedElements[r].pos=e;break}0===r&&this.processedElements.push(new ProcessedElement(t,e))},_az:function(t){this.prepareRenderableFrame(t),this.prepareProperties(t,this.isInRange)},buildShapeString:function(t,e,r,s){var i,a="";for(i=1;i<e;i+=1)1===i&&(a+=" M"+s.applyToPointStringified(t.v[0][0],t.v[0][1])),a+=" C"+s.applyToPointStringified(t.o[i-1][0],t.o[i-1][1])+" "+s.applyToPointStringified(t.i[i][0],t.i[i][1])+" "+s.applyToPointStringified(t.v[i][0],t.v[i][1]);return 1===e&&(a+=" M"+s.applyToPointStringified(t.v[0][0],t.v[0][1])),r&&e&&(a+=" C"+s.applyToPointStringified(t.o[i-1][0],t.o[i-1][1])+" "+s.applyToPointStringified(t.i[0][0],t.i[0][1])+" "+s.applyToPointStringified(t.v[0][0],t.v[0][1]),a+="z"),a}},_k.prototype._cz=function(t,e,r){this.lettersChangedFlag=!0,this.initFrame(),this.initBaseData(t,e,r),this.textAnimator=new _bl(t.t,this.renderType,this),this.textProperty=new _ar(this,t.t,this._co),this.initTransform(t,e,r),this.initHierarchy(),this.initRenderable(),this.initRendererElement(),this.createContainerElements(),this.addMasks(),this.createContent(),this.textAnimator.searchProperties(this._co)},_k.prototype._az=function(t){this.prepareRenderableFrame(t),this.prepareProperties(t,this.isInRange),(this.textProperty.mdf||this.textProperty._ch)&&(this.buildNewText(),this.textProperty._ch=!1)},_k.prototype.createPathShape=function(t,e){var r,s,i=e.length,a="";for(r=0;r<i;r+=1)s=e[r].ks.k,a+=this.buildShapeString(s,s.i.length,!0,t);return a},_k.prototype.updateDocumentData=function(t,e){this.textProperty.updateDocumentData(t,e)},_k.prototype.applyTextPropertiesToMatrix=function(t,e,r,s,i){switch(t.ps&&e.translate(t.ps[0],t.ps[1]+t.ascent,0),e.translate(0,-t.ls,0),t.j){case 1:e.translate(t.justifyOffset+(t.boxWidth-t.lineWidths[r]),0,0);break;case 2:e.translate(t.justifyOffset+(t.boxWidth-t.lineWidths[r])/2,0,0)}e.translate(s,i,0)},_k.prototype.buildColor=function(t){return"rgb("+Math.round(255*t[0])+","+Math.round(255*t[1])+","+Math.round(255*t[2])+")"},_k.prototype.buildShapeString=_f.prototype.buildShapeString,_k.prototype.emptyProp=new LetterProps,_k.prototype.destroy=function(){},extendPrototype([_e,_af,_ad,_ac,_ci],_g),_g.prototype._cz=function(t,e,r){this.initFrame(),this.initBaseData(t,e,r),this.initTransform(t,e,r),this.initRenderable(),this.initHierarchy(),this.initRendererElement(),this.createContainerElements(),this.addMasks(),!this.data.xt&&e.progressiveLoad||this.buildAllItems(),this.hide()},_g.prototype._az=function(t){if(this.prepareRenderableFrame(t),this.prepareProperties(t,this.isInRange),this.isInRange||this.data.xt){if(this.tm._placeholder)this.renderedFrame=t/this.data.sr;else{var e=this.tm.v;e===this.data.op&&(e=this.data.op-1),this.renderedFrame=e}var r,s=this._br.length;for(this._db||this.checkLayers(this.renderedFrame),r=0;r<s;r+=1)(this._db||this._br[r])&&this._br[r]._az(this.renderedFrame-this.layers[r].st)}},_g.prototype.renderInnerContent=function(){var t,e=this.layers.length;for(t=0;t<e;t+=1)(this._db||this._br[t])&&this._br[t]._ba()},_g.prototype.setElements=function(t){this._br=t},_g.prototype.getElements=function(){return this._br},_g.prototype.destroyElements=function(){var t,e=this.layers.length;for(t=0;t<e;t+=1)this._br[t]&&this._br[t].destroy()},_g.prototype.destroy=function(){this.destroyElements(),this.destroy_e()},extendPrototype([_e,_af,_d,_ad,_ac,_ci],_h),_h.prototype.createContent=function(){var t=this._x.getAssetsPath(this.assetData);this._cc=_ct("image"),this._cc.setAttribute("width",this.assetData.w+"px"),this._cc.setAttribute("height",this.assetData.h+"px"),this._cc.setAttribute("preserveAspectRatio","xMidYMid slice"),this._cc.setAttributeNS("http://www.w3.org/1999/xlink","href",t),this._bx.appendChild(this._cc)},extendPrototype([_h],_j),_j.prototype.createContent=function(){var t=_ct("rect");t.setAttribute("width",this.data.sw),t.setAttribute("height",this.data.sh),t.setAttribute("fill",this.data.sc),this._bx.appendChild(t)},extendPrototype([_ao,_g,_d],SVGCompElement),extendPrototype([_e,_af,_d,_ad,_ac,_ci,_k],_cw),_cw.prototype.createContent=function(){this.data.ln&&this._bx.setAttribute("id",this.data.ln),this.data.cl&&this._bx.setAttribute("class",this.data.cl),this.data.singleShape&&!this._x._cr.chars&&(this.textContainer=_ct("text"))},_cw.prototype.buildNewText=function(){var t,e,r=this.textProperty.currentData;this._bt=_cv(r?r.l.length:0),r.fc?this._bx.setAttribute("fill",this.buildColor(r.fc)):this._bx.setAttribute("fill","rgba(0,0,0,0)"),r.sc&&(this._bx.setAttribute("stroke",this.buildColor(r.sc)),this._bx.setAttribute("stroke-width",r.sw)),this._bx.setAttribute("font-size",r.s);var s=this._x._cr.getFontByName(r.f);if(s.fClass)this._bx.setAttribute("class",s.fClass);else{this._bx.setAttribute("font-family",s.fFamily);var i=r.fWeight,a=r.fStyle;this._bx.setAttribute("font-style",a),this._bx.setAttribute("font-weight",i)}var n=r.l||[],o=this._x._cr.chars;if(e=n.length){var h,l,p=this.mHelper,m="",f=this.data.singleShape,c=0,d=0,u=!0,y=r.tr/1e3*r.s;if(f&&!o){var g=this.textContainer,v="";switch(r.j){case 1:v="end";break;case 2:v="middle";break;case 2:v="start"}g.setAttribute("text-anchor",v),g.setAttribute("letter-spacing",y);var b=r.t.split(String.fromCharCode(13));e=b.length;var d=r.ps?r.ps[1]+r.ascent:0;for(t=0;t<e;t+=1)h=this.textSpans[t]||_ct("tspan"),h.textContent=b[t],h.setAttribute("x",0),h.setAttribute("y",d),h.style.display="inherit",g.appendChild(h),this.textSpans[t]=h,d+=r.lh;this._bx.appendChild(g)}else{var E,P,x=this.textSpans.length;for(t=0;t<e;t+=1)o&&f&&0!==t||(h=x>t?this.textSpans[t]:_ct(o?"path":"text"),x<=t&&(h.setAttribute("stroke-linecap","butt"),h.setAttribute("stroke-linejoin","round"),h.setAttribute("stroke-miterlimit","4"),this.textSpans[t]=h,this._bx.appendChild(h)),h.style.display="inherit"),p.reset(),o?(p.scale(r.s/100,r.s/100),f&&(n[t].n&&(c=-y,d+=r.yOffset,d+=u?1:0,u=!1),this.applyTextPropertiesToMatrix(r,p,n[t].line,c,d),c+=n[t].l||0,c+=y),P=this._x._cr.getCharData(r.t.charAt(t),s.fStyle,this._x._cr.getFontByName(r.f).fFamily),E=P&&P.data||{},l=E.shapes?E.shapes[0].it:[],f?m+=this.createPathShape(p,l):h.setAttribute("d",this.createPathShape(p,l))):(h.textContent=n[t].val,h.setAttributeNS("http://www.w3.org/XML/1998/namespace","xml:space","preserve"));f&&h.setAttribute("d",m)}for(;t<this.textSpans.length;)this.textSpans[t].style.display="none",t+=1;this._sizeChanged=!0}},_cw.prototype.sourceRectAtTime=function(t){if(this._az(this.comp.renderedFrame-this.data.st),this.renderInnerContent(),this._sizeChanged){this._sizeChanged=!1;var e=this._bx.getBBox();this.bbox={top:e.y,left:e.x,width:e.width,height:e.height}}return this.bbox},_cw.prototype.renderInnerContent=function(){if(!this.data.singleShape&&(this.textAnimator.getMeasures(this.textProperty.currentData,this.lettersChangedFlag),this.lettersChangedFlag||this.textAnimator.lettersChangedFlag)){this._sizeChanged=!0;var t,e,r=this.textAnimator._bt,s=this.textProperty.currentData.l;e=s.length;var i,a;for(t=0;t<e;t+=1)s[t].n||(i=r[t],a=this.textSpans[t],i.mdf.m&&a.setAttribute("transform",i.m),i.mdf.o&&a.setAttribute("opacity",i.o),i.mdf.sw&&a.setAttribute("stroke-width",i.sw),i.mdf.sc&&a.setAttribute("stroke",i.sc),i.mdf.fc&&a.setAttribute("fill",i.fc))}},extendPrototype([_e,_af,_d,_f,_ad,_ac,_ci],SVGShapeElement),SVGShapeElement.prototype.initSecondaryElement=function(){},SVGShapeElement.prototype.identityMatrix=new Matrix,SVGShapeElement.prototype.buildExpressionInterface=function(){},SVGShapeElement.prototype.createContent=function(){this.searchShapes(this.shapesData,this.itemsData,this.prevViewData,this._bx,this._co,0,[],!0)},SVGShapeElement.prototype.createStyleElement=function(t,e,r){var s,i=new SVGStyleData(t,e),a=i.pElem;if("st"===t.ty)s=new SVGStrokeStyleData(this,t,r,i);else if("fl"===t.ty)s=new SVGFillStyleData(this,t,r,i);else if("gf"===t.ty||"gs"===t.ty){var n="gf"===t.ty?_ck:_cj;s=new n(this,t,r,i),this._x.defs.appendChild(s.gf),s.maskId&&(this._x.defs.appendChild(s.ms),this._x.defs.appendChild(s.of),a.setAttribute("mask","url(#"+s.maskId+")"))}return"st"!==t.ty&&"gs"!==t.ty||(a.setAttribute("stroke-linecap",this.lcEnum[t.lc]||"round"),a.setAttribute("stroke-linejoin",this.ljEnum[t.lj]||"round"),a.setAttribute("fill-opacity","0"),1===t.lj&&a.setAttribute("stroke-miterlimit",t.ml)),2===t.r&&a.setAttribute("fill-rule","evenodd"),t.ln&&a.setAttribute("id",t.ln),t.cl&&a.setAttribute("class",t.cl),this.stylesList.push(i),s},SVGShapeElement.prototype.createGroupElement=function(t){var e=new ShapeGroupData;return t.ln&&e.gr.setAttribute("id",t.ln),e},SVGShapeElement.prototype._cp=function(t,e){return new SVGTransformData(_ag._bj(this,t,e),_ai._bo(this,t.o,0,.01,e))},SVGShapeElement.prototype.createShapeElement=function(t,e,r,s){var i=4;"rc"===t.ty?i=5:"el"===t.ty?i=6:"sr"===t.ty&&(i=7);var a=_ah._bp(this,t,i,s),n=new SVGShapeData(e,r,a);return this.shapes.push(n.sh),this.addShapeToModifiers(n),n},SVGShapeElement.prototype.setElementStyles=function(t){var e,r=t.styles,s=this.stylesList.length;for(e=0;e<s;e+=1)this.stylesList[e].closed||r.push(this.stylesList[e])},SVGShapeElement.prototype.reloadShapes=function(){this._ch=!0;var t,e=this.itemsData.length;for(t=0;t<e;t+=1)this.prevViewData[t]=this.itemsData[t];this.searchShapes(this.shapesData,this.itemsData,this.prevViewData,this._bx,this._co,0,[],!0);var t,e=this._co.length;for(t=0;t<e;t+=1)this._co[t].getValue();this.renderModifiers()},SVGShapeElement.prototype.searchShapes=function(t,e,r,s,i,a,n,o){var h,l,p,m,f,c,d=[].concat(n),u=t.length-1,y=[],g=[];for(h=u;h>=0;h-=1){if(c=this.searchProcessedElement(t[h]),
+c?e[h]=r[c-1]:t[h]._render=o,"fl"==t[h].ty||"st"==t[h].ty||"gf"==t[h].ty||"gs"==t[h].ty)c?e[h].style.closed=!1:e[h]=this.createStyleElement(t[h],a,i),t[h]._render&&s.appendChild(e[h].style.pElem),y.push(e[h].style);else if("gr"==t[h].ty){if(c)for(p=e[h].it.length,l=0;l<p;l+=1)e[h].prevViewData[l]=e[h].it[l];else e[h]=this.createGroupElement(t[h]);this.searchShapes(t[h].it,e[h].it,e[h].prevViewData,e[h].gr,i,a+1,d,o),t[h]._render&&s.appendChild(e[h].gr)}else"tr"==t[h].ty?(c||(e[h]=this._cp(t[h],i)),m=e[h].transform,d.push(m)):"sh"==t[h].ty||"rc"==t[h].ty||"el"==t[h].ty||"sr"==t[h].ty?(c||(e[h]=this.createShapeElement(t[h],d,a,i)),this.setElementStyles(e[h])):"tm"==t[h].ty||"rd"==t[h].ty||"ms"==t[h].ty?(c?(f=e[h],f.closed=!1):(f=_as.getModifier(t[h].ty),f.init(this,t[h],i),e[h]=f,this.shapeModifiers.push(f)),g.push(f)):"rp"==t[h].ty&&(c?(f=e[h],f.closed=!0):(f=_as.getModifier(t[h].ty),e[h]=f,f.init(this,t,h,e,i),this.shapeModifiers.push(f),o=!1),g.push(f));this.addProcessedElement(t[h],h+1)}for(u=y.length,h=0;h<u;h+=1)y[h].closed=!0;for(u=g.length,h=0;h<u;h+=1)g[h].closed=!0},SVGShapeElement.prototype.renderInnerContent=function(){this.renderModifiers();var t,e=this.stylesList.length;for(t=0;t<e;t+=1)this.stylesList[t].reset();for(this.renderShape(this.shapesData,this.itemsData,null),t=0;t<e;t+=1)(this.stylesList[t].mdf||this._ch)&&(this.stylesList[t].msElem&&(this.stylesList[t].msElem.setAttribute("d",this.stylesList[t].d),this.stylesList[t].d="M0 0"+this.stylesList[t].d),this.stylesList[t].pElem.setAttribute("d",this.stylesList[t].d||"M0 0"))},SVGShapeElement.prototype.renderShape=function(t,e,r){var s,i,a=t.length-1;for(s=0;s<=a;s+=1)i=t[s].ty,"tr"==i?((this._ch||e[s].transform.op.mdf&&r)&&r.setAttribute("opacity",e[s].transform.op.v),(this._ch||e[s].transform.mProps.mdf&&r)&&r.setAttribute("transform",e[s].transform.mProps.v.to2dCSS())):!t[s]._render||"sh"!=i&&"el"!=i&&"rc"!=i&&"sr"!=i?"fl"==i?this.renderFill(t[s],e[s]):"gf"==i?this.renderGradient(t[s],e[s]):"gs"==i?(this.renderGradient(t[s],e[s]),this.renderStroke(t[s],e[s])):"st"==i?this.renderStroke(t[s],e[s]):"gr"==i&&this.renderShape(t[s].it,e[s].it,e[s].gr):this.renderPath(e[s])},SVGShapeElement.prototype.renderPath=function(t){var e,r,s,i,a,n,o,h,l,p,m,f=t.styles.length,c=t.lvl;for(n=0;n<f;n+=1){if(i=t.sh.mdf||this._ch,t.styles[n].lvl<c)for(h=this.mHelper.reset(),p=c-t.styles[n].lvl,m=t.transformers.length-1;p>0;)i=t.transformers[m].mProps.mdf||i,l=t.transformers[m].mProps.v.props,h.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]),p--,m--;else h=this.identityMatrix;if(o=t.sh.paths,r=o._length,i){for(s="",e=0;e<r;e+=1)a=o.shapes[e],a&&a._length&&(s+=this.buildShapeString(a,a._length,a.c,h));t.caches[n]=s}else s=t.caches[n];t.styles[n].d+=s,t.styles[n].mdf=i||t.styles[n].mdf}},SVGShapeElement.prototype.renderFill=function(t,e){var r=e.style;(e.c.mdf||this._ch)&&r.pElem.setAttribute("fill","rgb("+bm_floor(e.c.v[0])+","+bm_floor(e.c.v[1])+","+bm_floor(e.c.v[2])+")"),(e.o.mdf||this._ch)&&r.pElem.setAttribute("fill-opacity",e.o.v)},SVGShapeElement.prototype.renderGradient=function(t,e){var r=e.gf,s=e.g._hasOpacity,i=e.s.v,a=e.e.v;if(e.o.mdf||this._ch){var n="gf"===t.ty?"fill-opacity":"stroke-opacity";e.style.pElem.setAttribute(n,e.o.v)}if(e.s.mdf||this._ch){var o=1===t.t?"x1":"cx",h="x1"===o?"y1":"cy";r.setAttribute(o,i[0]),r.setAttribute(h,i[1]),s&&!e.g._collapsable&&(e.of.setAttribute(o,i[0]),e.of.setAttribute(h,i[1]))}var l,p,m,f;if(e.g.cmdf||this._ch){l=e.cst;var c=e.g.c;for(m=l.length,p=0;p<m;p+=1)f=l[p],f.setAttribute("offset",c[4*p]+"%"),f.setAttribute("stop-color","rgb("+c[4*p+1]+","+c[4*p+2]+","+c[4*p+3]+")")}if(s&&(e.g.omdf||this._ch)){var d=e.g.o;for(l=e.g._collapsable?e.cst:e.ost,m=l.length,p=0;p<m;p+=1)f=l[p],e.g._collapsable||f.setAttribute("offset",d[2*p]+"%"),f.setAttribute("stop-opacity",d[2*p+1])}if(1===t.t)(e.e.mdf||this._ch)&&(r.setAttribute("x2",a[0]),r.setAttribute("y2",a[1]),s&&!e.g._collapsable&&(e.of.setAttribute("x2",a[0]),e.of.setAttribute("y2",a[1])));else{var u;if((e.s.mdf||e.e.mdf||this._ch)&&(u=Math.sqrt(Math.pow(i[0]-a[0],2)+Math.pow(i[1]-a[1],2)),r.setAttribute("r",u),s&&!e.g._collapsable&&e.of.setAttribute("r",u)),e.e.mdf||e.h.mdf||e.a.mdf||this._ch){u||(u=Math.sqrt(Math.pow(i[0]-a[0],2)+Math.pow(i[1]-a[1],2)));var y=Math.atan2(a[1]-i[1],a[0]-i[0]),g=e.h.v>=1?.99:e.h.v<=-1?-.99:e.h.v,v=u*g,b=Math.cos(y+e.a.v)*v+i[0],E=Math.sin(y+e.a.v)*v+i[1];r.setAttribute("fx",b),r.setAttribute("fy",E),s&&!e.g._collapsable&&(e.of.setAttribute("fx",b),e.of.setAttribute("fy",E))}}},SVGShapeElement.prototype.renderStroke=function(t,e){var r=e.style,s=e.d;s&&(s.mdf||this._ch)&&(r.pElem.setAttribute("stroke-dasharray",s.dashStr),r.pElem.setAttribute("stroke-dashoffset",s.dashoffset[0])),e.c&&(e.c.mdf||this._ch)&&r.pElem.setAttribute("stroke","rgb("+bm_floor(e.c.v[0])+","+bm_floor(e.c.v[1])+","+bm_floor(e.c.v[2])+")"),(e.o.mdf||this._ch)&&r.pElem.setAttribute("stroke-opacity",e.o.v),(e.w.mdf||this._ch)&&(r.pElem.setAttribute("stroke-width",e.w.v),r.msElem&&r.msElem.setAttribute("stroke-width",e.w.v))},SVGShapeElement.prototype.destroy=function(){this.destroy_e(),this.shapeData=null,this.itemsData=null},_bb.prototype._ba=function(t){if(t||this._cl.mdf){var e=this._cl._cm[0].p.v,r=this._cl._cm[1].p.v,s=this._cl._cm[2].p.v/100;this.matrixFilter.setAttribute("values",r[0]-e[0]+" 0 0 0 "+e[0]+" "+(r[1]-e[1])+" 0 0 0 "+e[1]+" "+(r[2]-e[2])+" 0 0 0 "+e[2]+" 0 0 0 "+s+" 0")}},_bc.prototype._ba=function(t){if(t||this._cl.mdf){var e=this._cl._cm[2].p.v,r=this._cl._cm[6].p.v;this.matrixFilter.setAttribute("values","0 0 0 0 "+e[0]+" 0 0 0 0 "+e[1]+" 0 0 0 0 "+e[2]+" 0 0 0 "+r+" 0")}},_bd.prototype.initialize=function(){var t,e,r,s,i=this.elem._bx.children||this.elem._bx.childNodes;for(1===this._cl._cm[1].p.v?(s=this.elem.maskManager.masksProperties.length,r=0):(r=this._cl._cm[0].p.v-1,s=r+1),e=_ct("g"),e.setAttribute("fill","none"),e.setAttribute("stroke-linecap","round"),e.setAttribute("stroke-dashoffset",1),r;r<s;r+=1)t=_ct("path"),e.appendChild(t),this.paths.push({p:t,m:r});if(3===this._cl._cm[10].p.v){var a=_ct("mask"),n="stms_"+randomString(10);a.setAttribute("id",n),a.setAttribute("mask-type","alpha"),a.appendChild(e),this.elem._x.defs.appendChild(a);var o=_ct("g");o.setAttribute("mask","url("+locationHref+"#"+n+")"),i[0]&&o.appendChild(i[0]),this.elem._bx.appendChild(o),this.masker=a,e.setAttribute("stroke","#fff")}else if(1===this._cl._cm[10].p.v||2===this._cl._cm[10].p.v){if(2===this._cl._cm[10].p.v)for(var i=this.elem._bx.children||this.elem._bx.childNodes;i.length;)this.elem._bx.removeChild(i[0]);this.elem._bx.appendChild(e),this.elem._bx.removeAttribute("mask"),e.setAttribute("stroke","#fff")}this.initialized=!0,this.pathMasker=e},_bd.prototype._ba=function(t){this.initialized||this.initialize();var e,r,s,i=this.paths.length;for(e=0;e<i;e+=1)if(r=this.elem.maskManager.viewData[this.paths[e].m],s=this.paths[e].p,(t||this._cl.mdf||r.prop.mdf)&&s.setAttribute("d",r.lastPath),t||this._cl._cm[9].p.mdf||this._cl._cm[4].p.mdf||this._cl._cm[7].p.mdf||this._cl._cm[8].p.mdf||r.prop.mdf){var a;if(0!==this._cl._cm[7].p.v||100!==this._cl._cm[8].p.v){var n=Math.min(this._cl._cm[7].p.v,this._cl._cm[8].p.v)/100,o=Math.max(this._cl._cm[7].p.v,this._cl._cm[8].p.v)/100,h=s.getTotalLength();a="0 0 0 "+h*n+" ";var l,p=h*(o-n),m=1+2*this._cl._cm[4].p.v*this._cl._cm[9].p.v/100,f=Math.floor(p/m);for(l=0;l<f;l+=1)a+="1 "+2*this._cl._cm[4].p.v*this._cl._cm[9].p.v/100+" ";a+="0 "+10*h+" 0 0"}else a="1 "+2*this._cl._cm[4].p.v*this._cl._cm[9].p.v/100;s.setAttribute("stroke-dasharray",a)}if((t||this._cl._cm[4].p.mdf)&&this.pathMasker.setAttribute("stroke-width",2*this._cl._cm[4].p.v),(t||this._cl._cm[6].p.mdf)&&this.pathMasker.setAttribute("opacity",this._cl._cm[6].p.v),(1===this._cl._cm[10].p.v||2===this._cl._cm[10].p.v)&&(t||this._cl._cm[3].p.mdf)){var c=this._cl._cm[3].p.v;this.pathMasker.setAttribute("stroke","rgb("+bm_floor(255*c[0])+","+bm_floor(255*c[1])+","+bm_floor(255*c[2])+")")}},_be.prototype._ba=function(t){if(t||this._cl.mdf){var e=this._cl._cm[0].p.v,r=this._cl._cm[1].p.v,s=this._cl._cm[2].p.v,i=s[0]+" "+r[0]+" "+e[0],a=s[1]+" "+r[1]+" "+e[1],n=s[2]+" "+r[2]+" "+e[2];this.feFuncR.setAttribute("tableValues",i),this.feFuncG.setAttribute("tableValues",a),this.feFuncB.setAttribute("tableValues",n)}},_bf.prototype.createFeFunc=function(t,e){var r=_ct(t);return r.setAttribute("type","table"),e.appendChild(r),r},_bf.prototype.getTableValue=function(t,e,r,s,i){for(var a,n,o=0,h=256,l=Math.min(t,e),p=Math.max(t,e),m=Array.call(null,{length:h}),f=0,c=i-s,d=e-t;o<=256;)a=o/256,n=a<=l?d<0?i:s:a>=p?d<0?s:i:s+c*Math.pow((a-t)/d,1/r),m[f++]=n,o+=256/(h-1);return m.join(" ")},_bf.prototype._ba=function(t){if(t||this._cl.mdf){var e,r=this._cl._cm;this.feFuncRComposed&&(t||r[3].p.mdf||r[4].p.mdf||r[5].p.mdf||r[6].p.mdf||r[7].p.mdf)&&(e=this.getTableValue(r[3].p.v,r[4].p.v,r[5].p.v,r[6].p.v,r[7].p.v),this.feFuncRComposed.setAttribute("tableValues",e),this.feFuncGComposed.setAttribute("tableValues",e),this.feFuncBComposed.setAttribute("tableValues",e)),this.feFuncR&&(t||r[10].p.mdf||r[11].p.mdf||r[12].p.mdf||r[13].p.mdf||r[14].p.mdf)&&(e=this.getTableValue(r[10].p.v,r[11].p.v,r[12].p.v,r[13].p.v,r[14].p.v),this.feFuncR.setAttribute("tableValues",e)),this.feFuncG&&(t||r[17].p.mdf||r[18].p.mdf||r[19].p.mdf||r[20].p.mdf||r[21].p.mdf)&&(e=this.getTableValue(r[17].p.v,r[18].p.v,r[19].p.v,r[20].p.v,r[21].p.v),this.feFuncG.setAttribute("tableValues",e)),this.feFuncB&&(t||r[24].p.mdf||r[25].p.mdf||r[26].p.mdf||r[27].p.mdf||r[28].p.mdf)&&(e=this.getTableValue(r[24].p.v,r[25].p.v,r[26].p.v,r[27].p.v,r[28].p.v),this.feFuncB.setAttribute("tableValues",e)),this.feFuncA&&(t||r[31].p.mdf||r[32].p.mdf||r[33].p.mdf||r[34].p.mdf||r[35].p.mdf)&&(e=this.getTableValue(r[31].p.v,r[32].p.v,r[33].p.v,r[34].p.v,r[35].p.v),this.feFuncA.setAttribute("tableValues",e))}},_bg.prototype._ba=function(t){if(t||this._cl.mdf){if((t||this._cl._cm[4].p.mdf)&&this.feGaussianBlur.setAttribute("stdDeviation",this._cl._cm[4].p.v/4),t||this._cl._cm[0].p.mdf){var e=this._cl._cm[0].p.v;this.feFlood.setAttribute("flood-color",rgbToHex(Math.round(255*e[0]),Math.round(255*e[1]),Math.round(255*e[2])))}if((t||this._cl._cm[1].p.mdf)&&this.feFlood.setAttribute("flood-opacity",this._cl._cm[1].p.v/255),t||this._cl._cm[2].p.mdf||this._cl._cm[3].p.mdf){var r=this._cl._cm[3].p.v,s=(this._cl._cm[2].p.v-90)*degToRads,i=r*Math.cos(s),a=r*Math.sin(s);this.feOffset.setAttribute("dx",i),this.feOffset.setAttribute("dy",a)}}};var _svgMatteSymbols=[],_svgMatteMaskCounter=0;_bh.prototype.findSymbol=function(t){for(var e=0,r=_svgMatteSymbols.length;e<r;){if(_svgMatteSymbols[e]===t)return _svgMatteSymbols[e];e+=1}return null},_bh.prototype.replaceInParent=function(t,e){var r=t._bx.parentNode;if(r){for(var s=r.children,i=0,a=s.length;i<a&&s[i]!==t._bx;)i+=1;var n;i<=a-2&&(n=s[i+1]);var o=_ct("use");o.setAttribute("href","#"+e),n?r.insertBefore(o,n):r.appendChild(o)}},_bh.prototype.setElementAsMask=function(t,e){if(!this.findSymbol(e)){var r="matte_"+randomString(5)+"_"+_svgMatteMaskCounter++,s=_ct("mask");s.setAttribute("id",e.layerId),s.setAttribute("mask-type","alpha"),_svgMatteSymbols.push(e);var i=t._x.defs;i.appendChild(s);var a=_ct("symbol");a.setAttribute("id",r),this.replaceInParent(e,r),a.appendChild(e._bx),i.appendChild(a),useElem=_ct("use"),useElem.setAttribute("href","#"+r),s.appendChild(useElem),e.data.hd=!1,e.show()}t.setMatte(e.layerId)},_bh.prototype.initialize=function(){for(var t=this._cl._cm[0].p.v,e=0,r=this.elem.comp._br.length;e<r;)this.elem.comp._br[e].data.ind===t&&this.setElementAsMask(this.elem,this.elem.comp._br[e]),e+=1;this.initialized=!0},_bh.prototype._ba=function(){this.initialized||this.initialize()},_bi.prototype._ba=function(t){var e,r=this.filters.length;for(e=0;e<r;e+=1)this.filters[e]._ba(t)};var animationManager=function(){function t(t){for(var e=0,r=t.target;e<S;)P[e].animation===r&&(P.splice(e,1),e-=1,S-=1,r.isPaused||s()),e+=1}function e(t,e){if(!t)return null;for(var r=0;r<S;){if(P[r].elem==t&&null!==P[r].elem)return P[r].animation;r+=1}var s=new _a;return i(s,t),s.setData(t,e),s}function r(){A+=1,b()}function s(){A-=1,0===A&&(C=!0)}function i(e,i){e.addEventListener("destroy",t),e.addEventListener("_active",r),e.addEventListener("_idle",s),P.push({elem:i,animation:e}),S+=1}function a(t){var e=new _a;return i(e,null),e.setParams(t),e}function n(t,e){var r;for(r=0;r<S;r+=1)P[r].animation.setSpeed(t,e)}function o(t,e){var r;for(r=0;r<S;r+=1)P[r].animation.setDirection(t,e)}function h(t){var e;for(e=0;e<S;e+=1)P[e].animation.play(t)}function l(t,e){x=Date.now();var r;for(r=0;r<S;r+=1)P[r].animation.moveFrame(t,e)}function p(t){var e,r=t-x;for(e=0;e<S;e+=1)P[e].animation.advanceTime(r);x=t,C?k=!0:window.requestAnimationFrame(p)}function m(t){x=t,window.requestAnimationFrame(p)}function f(t){var e;for(e=0;e<S;e+=1)P[e].animation.pause(t)}function c(t,e,r){var s;for(s=0;s<S;s+=1)P[s].animation.goToAndStop(t,e,r)}function d(t){var e;for(e=0;e<S;e+=1)P[e].animation.stop(t)}function u(t){var e;for(e=0;e<S;e+=1)P[e].animation.togglePause(t)}function y(t){var e;for(e=S-1;e>=0;e-=1)P[e].animation.destroy(t)}function g(t,r,s){var i,a=[].concat([].slice.call(document.getElementsByClassName("lottie")),[].slice.call(document.getElementsByClassName("bodymovin"))),n=a.length;for(i=0;i<n;i+=1)s&&a[i].setAttribute("data-bm-type",s),e(a[i],t);if(r&&0===n){s||(s="svg");var o=document.getElementsByTagName("body")[0];o.innerHTML="";var h=_cu("div");h.style.width="100%",h.style.height="100%",h.setAttribute("data-bm-type",s),o.appendChild(h),e(h,t)}}function v(){var t;for(t=0;t<S;t+=1)P[t].animation.resize()}function b(){C&&(C=!1,k&&(window.requestAnimationFrame(m),k=!1))}var E={},P=[],x=0,S=0,C=!0,A=0,k=!0;return E.registerAnimation=e,E.loadAnimation=a,E.setSpeed=n,E.setDirection=o,E.play=h,E.moveFrame=l,E.pause=f,E.stop=d,E.togglePause=u,E.searchAnimations=g,E.resize=v,E.goToAndStop=c,E.destroy=y,E}(),_a=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._dc=0,this.playCount=0,this.animationData={},this.layers=[],this.assets=[],this.isPaused=!0,this.autoplay=!1,this.loop=!0,this.renderer=null,this.animationID=randomString(10),this.assetsPath="",this.timeCompleted=0,this.segmentPos=0,this.subframeEnabled=subframeEnabled,this.segments=[],this.pendingSegment=!1,this._idle=!0,this.projectInterface=ProjectInterface()};extendPrototype([BaseEvent],_a),_a.prototype.setParams=function(t){var e=this;t.context&&(this.context=t.context),(t.wrapper||t.container)&&(this.wrapper=t.wrapper||t.container);var r=t.animType?t.animType:t.renderer?t.renderer:"svg";switch(r){case"canvas":this.renderer=new _aq(this,t.rendererSettings);break;case"svg":this.renderer=new _ao(this,t.rendererSettings);break;case"hybrid":case"html":default:this.renderer=new _ap(this,t.rendererSettings)}if(this.renderer.setProjectInterface(this.projectInterface),this.animType=r,""===t.loop||null===t.loop||(t.loop===!1?this.loop=!1:t.loop===!0?this.loop=!0:this.loop=parseInt(t.loop)),this.autoplay=!("autoplay"in t)||t.autoplay,this.name=t.name?t.name:"",this.autoloadSegments=!t.hasOwnProperty("autoloadSegments")||t.autoloadSegments,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 s=new XMLHttpRequest;t.path.lastIndexOf("\\")!=-1?this.path=t.path.substr(0,t.path.lastIndexOf("\\")+1):this.path=t.path.substr(0,t.path.lastIndexOf("/")+1),this.assetsPath=t.assetsPath,this.fileName=t.path.substr(t.path.lastIndexOf("/")+1),this.fileName=this.fileName.substr(0,this.fileName.lastIndexOf(".json")),s.open("GET",t.path,!0),s.send(),s.onreadystatechange=function(){if(4==s.readyState)if(200==s.status)e.configAnimation(JSON.parse(s.responseText));else try{var t=JSON.parse(s.responseText);e.configAnimation(t)}catch(r){}}}},_a.prototype.setData=function(t,e){var r={wrapper:t,animationData:e?"object"==typeof e?e:JSON.parse(e):null},s=t.attributes;r.path=s.getNamedItem("data-animation-path")?s.getNamedItem("data-animation-path").value:s.getNamedItem("data-bm-path")?s.getNamedItem("data-bm-path").value:s.getNamedItem("bm-path")?s.getNamedItem("bm-path").value:"",r.animType=s.getNamedItem("data-anim-type")?s.getNamedItem("data-anim-type").value:s.getNamedItem("data-bm-type")?s.getNamedItem("data-bm-type").value:s.getNamedItem("bm-type")?s.getNamedItem("bm-type").value:s.getNamedItem("data-bm-renderer")?s.getNamedItem("data-bm-renderer").value:s.getNamedItem("bm-renderer")?s.getNamedItem("bm-renderer").value:"canvas";var i=s.getNamedItem("data-anim-loop")?s.getNamedItem("data-anim-loop").value:s.getNamedItem("data-bm-loop")?s.getNamedItem("data-bm-loop").value:s.getNamedItem("bm-loop")?s.getNamedItem("bm-loop").value:"";""===i||("false"===i?r.loop=!1:"true"===i?r.loop=!0:r.loop=parseInt(i));var a=s.getNamedItem("data-anim-autoplay")?s.getNamedItem("data-anim-autoplay").value:s.getNamedItem("data-bm-autoplay")?s.getNamedItem("data-bm-autoplay").value:!s.getNamedItem("bm-autoplay")||s.getNamedItem("bm-autoplay").value;r.autoplay="false"!==a,r.name=s.getNamedItem("data-name")?s.getNamedItem("data-name").value:s.getNamedItem("data-bm-name")?s.getNamedItem("data-bm-name").value:s.getNamedItem("bm-name")?s.getNamedItem("bm-name").value:"";var n=s.getNamedItem("data-anim-prerender")?s.getNamedItem("data-anim-prerender").value:s.getNamedItem("data-bm-prerender")?s.getNamedItem("data-bm-prerender").value:s.getNamedItem("bm-prerender")?s.getNamedItem("bm-prerender").value:"";"false"===n&&(r.prerender=!1),this.setParams(r)},_a.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,r,s=this.animationData.layers,i=s.length,a=t.layers,n=a.length;for(r=0;r<n;r+=1)for(e=0;e<i;){if(s[e].id==a[r].id){s[e]=a[r];break}e+=1}if((t.chars||t.fonts)&&(this.renderer._x._cr.addChars(t.chars),this.renderer._x._cr.addFonts(t.fonts,this.renderer._x.defs)),t.assets)for(i=t.assets.length,e=0;e<i;e+=1)this.animationData.assets.push(t.assets[e]);this.animationData.__complete=!1,dataManager.completeData(this.animationData,this.renderer._x._cr),this.renderer.includeLayers(t.layers),expressionsPlugin&&expressionsPlugin.initExpressions(this),this.renderer._ba(null),this.loadNextSegment()},_a.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 r=new XMLHttpRequest,s=this,i=this.path+this.fileName+"_"+this.segmentPos+".json";this.segmentPos+=1,r.open("GET",i,!0),r.send(),r.onreadystatechange=function(){if(4==r.readyState)if(200==r.status)s.includeLayers(JSON.parse(r.responseText));else try{var t=JSON.parse(r.responseText);s.includeLayers(t)}catch(e){}}},_a.prototype.loadSegments=function(){var t=this.animationData.segments;t||(this.timeCompleted=this.animationData.tf),this.loadNextSegment()},_a.prototype.configAnimation=function(t){var e=this;this.renderer&&this.renderer.destroyed||(this.animationData=t,this.totalFrames=Math.floor(this.animationData.op-this.animationData.ip),this.animationData.tf=this.totalFrames,this.renderer.configAnimation(t),t.assets||(t.assets=[]),t.comps&&(t.assets=t.assets.concat(t.comps),t.comps=null),this.renderer.searchExtraCompositions(t.assets),this.layers=this.animationData.layers,this.assets=this.animationData.assets,this.frameRate=this.animationData.fr,this._ch=Math.round(this.animationData.ip),this.frameMult=this.animationData.fr/1e3,this.trigger("config_ready"),this.imagePreloader=new ImagePreloader,this.imagePreloader.setAssetsPath(this.assetsPath),this.imagePreloader.setPath(this.path),this.imagePreloader.loadAssets(t.assets,function(t){t||e.trigger("loaded_images")}),this.loadSegments(),this.updaFrameModifier(),this.renderer._x._cr?this.waitForFontsLoaded():(dataManager.completeData(this.animationData,this.renderer._x._cr),this.checkLoaded()))},_a.prototype.waitForFontsLoaded=function(){function t(){this.renderer._x._cr.loaded?(dataManager.completeData(this.animationData,this.renderer._x._cr),this.checkLoaded()):setTimeout(t.bind(this),20)}return function(){t.bind(this)()}}(),_a.prototype.addPendingElement=function(){this._dc+=1},_a.prototype.elementLoaded=function(){this._dc--,this.checkLoaded()},_a.prototype.checkLoaded=function(){0===this._dc&&(expressionsPlugin&&expressionsPlugin.initExpressions(this),this.renderer.initItems(),setTimeout(function(){this.trigger("DOMLoaded")}.bind(this),0),this.isLoaded=!0,this.gotoFrame(),this.autoplay&&this.play())},_a.prototype.resize=function(){this.renderer.updateContainerSize()},_a.prototype.setSubframe=function(t){this.subframeEnabled=!!t},_a.prototype.gotoFrame=function(){this.currentFrame=this.subframeEnabled?this.currentRawFrame:~~this.currentRawFrame,this.timeCompleted!==this.totalFrames&&this.currentFrame>this.timeCompleted&&(this.currentFrame=this.timeCompleted),this.trigger("enterFrame"),this._ba()},_a.prototype._ba=function(){this.isLoaded!==!1&&this.renderer._ba(this.currentFrame+this._ch)},_a.prototype.play=function(t){t&&this.name!=t||this.isPaused===!0&&(this.isPaused=!1,this._idle&&(this._idle=!1,this.trigger("_active")))},_a.prototype.pause=function(t){t&&this.name!=t||this.isPaused===!1&&(this.isPaused=!0,this.pendingSegment||(this._idle=!0,this.trigger("_idle")))},_a.prototype.togglePause=function(t){t&&this.name!=t||(this.isPaused===!0?this.play():this.pause())},_a.prototype.stop=function(t){t&&this.name!=t||(this.pause(),this.currentFrame=this.currentRawFrame=0,this.playCount=0,this.gotoFrame())},_a.prototype.goToAndStop=function(t,e,r){r&&this.name!=r||(e?this.setCurrentRawFrameValue(t):this.setCurrentRawFrameValue(t*this.frameModifier),this.pause())},_a.prototype.goToAndPlay=function(t,e,r){this.goToAndStop(t,e,r),this.play()},_a.prototype.advanceTime=function(t){return this.pendingSegment?(this.pendingSegment=!1,this.adjustSegment(this.segments.shift()),void(this.isPaused&&this.play())):void(this.isPaused!==!0&&this.isLoaded!==!1&&this.setCurrentRawFrameValue(this.currentRawFrame+t*this.frameModifier))},_a.prototype.updateAnimation=function(t){this.setCurrentRawFrameValue(this.totalFrames*t)},_a.prototype.moveFrame=function(t,e){e&&this.name!=e||this.setCurrentRawFrameValue(this.currentRawFrame+t)},_a.prototype.adjustSegment=function(t){this.playCount=0,t[1]<t[0]?(this.frameModifier>0&&(this.playSpeed<0?this.setSpeed(-this.playSpeed):this.setDirection(-1)),this.totalFrames=t[0]-t[1],this._ch=t[1],this.setCurrentRawFrameValue(this.totalFrames-.001)):t[1]>t[0]&&(this.frameModifier<0&&(this.playSpeed<0?this.setSpeed(-this.playSpeed):this.setDirection(1)),this.totalFrames=t[1]-t[0],this._ch=t[0],this.setCurrentRawFrameValue(.001)),this.trigger("segmentStart")},_a.prototype.setSegment=function(t,e){var r=-1;this.isPaused&&(this.currentRawFrame+this._ch<t?r=t:this.currentRawFrame+this._ch>e&&(r=e-t)),this._ch=t,this.totalFrames=e-t,r!==-1&&this.goToAndStop(r,!0)},_a.prototype.playSegments=function(t,e){if("object"==typeof t[0]){var r,s=t.length;for(r=0;r<s;r+=1)this.segments.push(t[r])}else this.segments.push(t);e&&this.adjustSegment(this.segments.shift()),this.isPaused&&this.play()},_a.prototype.resetSegments=function(t){this.segments.length=0,this.segments.push([this.animationData.ip,this.animationData.op]),t&&this.adjustSegment(this.segments.shift())},_a.prototype.checkSegments=function(){this.segments.length&&(this.pendingSegment=!0)},_a.prototype.remove=function(t){t&&this.name!=t||this.renderer.destroy()},_a.prototype.destroy=function(t){t&&this.name!=t||this.renderer&&this.renderer.destroyed||(this.renderer.destroy(),this.trigger("destroy"),this._cbs=null,this.onEnterFrame=this.onLoopComplete=this.onComplete=this.onSegmentStart=this.onDestroy=null,this.renderer=null)},_a.prototype.setCurrentRawFrameValue=function(t){this.currentRawFrame=t;var e=!1;this.currentRawFrame>=this.totalFrames?(this.checkSegments(),this.loop===!1?(this.currentRawFrame=this.totalFrames,e=!0):(this.trigger("loopComplete"),this.playCount+=1,this.loop!==!0&&this.playCount==this.loop||this.pendingSegment?(this.currentRawFrame=this.totalFrames,e=!0):this.currentRawFrame=this.currentRawFrame%this.totalFrames)):this.currentRawFrame<0&&(this.checkSegments(),this.playCount-=1,this.playCount<0&&(this.playCount=0),this.loop===!1||this.pendingSegment?(this.currentRawFrame=0,e=!0):(this.trigger("loopComplete"),this.currentRawFrame=(this.totalFrames+this.currentRawFrame)%this.totalFrames)),this.gotoFrame(),e&&(this.pause(),this.trigger("complete"))},_a.prototype.setSpeed=function(t){this.playSpeed=t,this.updaFrameModifier()},_a.prototype.setDirection=function(t){this.playDirection=t<0?-1:1,this.updaFrameModifier()},_a.prototype.updaFrameModifier=function(){this.frameModifier=this.frameMult*this.playSpeed*this.playDirection},_a.prototype.getPath=function(){return this.path},_a.prototype.getAssetsPath=function(t){var e="";if(this.assetsPath){var r=t.p;r.indexOf("images/")!==-1&&(r=r.split("/")[1]),e=this.assetsPath+r}else e=this.path,e+=t.u?t.u:"",e+=t.p;return e},_a.prototype.getAssetData=function(t){for(var e=0,r=this.assets.length;e<r;){if(t==this.assets[e].id)return this.assets[e];e+=1}},_a.prototype.hide=function(){this.renderer.hide()},_a.prototype.show=function(){this.renderer.show()},_a.prototype.getAssets=function(){return this.assets},_a.prototype.trigger=function(t){if(this._cbs&&this._cbs[t])switch(t){case"enterFrame":this._cy(t,new BMEnterFrameEvent(t,this.currentFrame,this.totalFrames,this.frameMult));break;case"loopComplete":this._cy(t,new BMCompleteLoopEvent(t,this.loop,this.playCount,this.frameMult));break;case"complete":this._cy(t,new BMCompleteEvent(t,this.frameMult));break;case"segmentStart":this._cy(t,new BMSegmentStartEvent(t,this._ch,this.totalFrames));break;case"destroy":this._cy(t,new BMDestroyEvent(t,this));break;default:this._cy(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._ch,this.totalFrames)),"destroy"===t&&this.onDestroy&&this.onDestroy.call(this,new BMDestroyEvent(t,this))},extendPrototype([_l],_aq),_aq.prototype.createBase=function(t){return new _c(t,this._x,this)},_aq.prototype.createShape=function(t){return new _r(t,this._x,this)},_aq.prototype.createText=function(t){return new _t(t,this._x,this)},_aq.prototype.createImage=function(t){return new _p(t,this._x,this)},_aq.prototype.createComp=function(t){return new _m(t,this._x,this)},_aq.prototype.createSolid=function(t){return new _s(t,this._x,this)},_aq.prototype.createNull=_ao.prototype.createNull,_aq.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._da.transform(t[0],t[1],t[4],t[5],t[12],t[13]);this.transformMat.cloneFromProps(t);var e=this.contextData.cTr.props;this.transformMat.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.contextData.cTr.cloneFromProps(this.transformMat.props);var r=this.contextData.cTr.props;this._da.setTransform(r[0],r[1],r[4],r[5],r[12],r[13])}},_aq.prototype.ctxOpacity=function(t){return this.renderConfig.clearCanvas?(this.contextData.cO*=t<0?0:t,void(this._da.globalAlpha=this.contextData.cO)):void(this._da.globalAlpha*=t<0?0:t)},_aq.prototype.reset=function(){return this.renderConfig.clearCanvas?void this.contextData.reset():void this._da.restore()},_aq.prototype.save=function(t){if(!this.renderConfig.clearCanvas)return void this._da.save();t&&this._da.save();var e=this.contextData.cTr.props;this.contextData._length<=this.contextData.cArrPos&&this.contextData.duplicate();var r,s=this.contextData.saved[this.contextData.cArrPos];for(r=0;r<16;r+=1)s[r]=e[r];this.contextData.savedOp[this.contextData.cArrPos]=this.contextData.cO,this.contextData.cArrPos+=1},_aq.prototype.restore=function(t){if(!this.renderConfig.clearCanvas)return void this._da.restore();t&&(this._da.restore(),this._x.blendMode="source-over"),this.contextData.cArrPos-=1;var e,r=this.contextData.saved[this.contextData.cArrPos],s=this.contextData.cTr.props;for(e=0;e<16;e+=1)s[e]=r[e];this._da.setTransform(r[0],r[1],r[4],r[5],r[12],r[13]),r=this.contextData.savedOp[this.contextData.cArrPos],this.contextData.cO=r,this._da.globalAlpha=r},_aq.prototype.configAnimation=function(t){
+this._cq.wrapper?(this._cq.container=_cu("canvas"),this._cq.container.style.width="100%",this._cq.container.style.height="100%",this._cq.container.style.transformOrigin=this._cq.container.style.mozTransformOrigin=this._cq.container.style.webkitTransformOrigin=this._cq.container.style["-webkit-transform"]="0px 0px 0px",this._cq.wrapper.appendChild(this._cq.container),this._da=this._cq.container.getContext("2d"),this.renderConfig.className&&this._cq.container.setAttribute("class",this.renderConfig.className)):this._da=this.renderConfig.context,this.data=t,this._x._da=this._da,this._x.renderer=this,this._x.isDashed=!1,this._x.totalFrames=Math.floor(t.tf),this._x.compWidth=t.w,this._x.compHeight=t.h,this._x.frameRate=t.fr,this._x.frameId=0,this._x._de={w:t.w,h:t.h},this._x.progressiveLoad=this.renderConfig.progressiveLoad,this.layers=t.layers,this._cx={},this._cx.w=t.w,this._cx.h=t.h,this._x._cr=new FontManager,this._x._cr.addChars(t.chars),this._x._cr.addFonts(t.fonts,document.body),this._x.getAssetData=this._cq.getAssetData.bind(this._cq),this._x.getAssetsPath=this._cq.getAssetsPath.bind(this._cq),this._x.elementLoaded=this._cq.elementLoaded.bind(this._cq),this._x.addPendingElement=this._cq.addPendingElement.bind(this._cq),this._x._cx=this._cx,this._br=_cv(t.layers.length),this.updateContainerSize()},_aq.prototype.updateContainerSize=function(){this.reset();var t,e;this._cq.wrapper&&this._cq.container?(t=this._cq.wrapper.offsetWidth,e=this._cq.wrapper.offsetHeight,this._cq.container.setAttribute("width",t*this.renderConfig.dpr),this._cq.container.setAttribute("height",e*this.renderConfig.dpr)):(t=this._da.canvas.width*this.renderConfig.dpr,e=this._da.canvas.height*this.renderConfig.dpr);var r,s;if(this.renderConfig.preserveAspectRatio.indexOf("meet")!==-1||this.renderConfig.preserveAspectRatio.indexOf("slice")!==-1){var i=this.renderConfig.preserveAspectRatio.split(" "),a=i[1]||"meet",n=i[0]||"xMidYMid",o=n.substr(0,4),h=n.substr(4);r=t/e,s=this._cx.w/this._cx.h,s>r&&"meet"===a||s<r&&"slice"===a?(this._cx.sx=t/(this._cx.w/this.renderConfig.dpr),this._cx.sy=t/(this._cx.w/this.renderConfig.dpr)):(this._cx.sx=e/(this._cx.h/this.renderConfig.dpr),this._cx.sy=e/(this._cx.h/this.renderConfig.dpr)),"xMid"===o&&(s<r&&"meet"===a||s>r&&"slice"===a)?this._cx.tx=(t-this._cx.w*(e/this._cx.h))/2*this.renderConfig.dpr:"xMax"===o&&(s<r&&"meet"===a||s>r&&"slice"===a)?this._cx.tx=(t-this._cx.w*(e/this._cx.h))*this.renderConfig.dpr:this._cx.tx=0,"YMid"===h&&(s>r&&"meet"===a||s<r&&"slice"===a)?this._cx.ty=(e-this._cx.h*(t/this._cx.w))/2*this.renderConfig.dpr:"YMax"===h&&(s>r&&"meet"===a||s<r&&"slice"===a)?this._cx.ty=(e-this._cx.h*(t/this._cx.w))*this.renderConfig.dpr:this._cx.ty=0}else"none"==this.renderConfig.preserveAspectRatio?(this._cx.sx=t/(this._cx.w/this.renderConfig.dpr),this._cx.sy=e/(this._cx.h/this.renderConfig.dpr),this._cx.tx=0,this._cx.ty=0):(this._cx.sx=this.renderConfig.dpr,this._cx.sy=this.renderConfig.dpr,this._cx.tx=0,this._cx.ty=0);this._cx.props=[this._cx.sx,0,0,0,0,this._cx.sy,0,0,0,0,1,0,this._cx.tx,this._cx.ty,0,1],this.ctxTransform(this._cx.props)},_aq.prototype.destroy=function(){this.renderConfig.clearCanvas&&(this._cq.wrapper.innerHTML="");var t,e=this.layers?this.layers.length:0;for(t=e-1;t>=0;t-=1)this._br[t]&&this._br[t].destroy();this._br.length=0,this._x._da=null,this._cq.container=null,this.destroyed=!0},_aq.prototype._ba=function(t){if(!(this.renderedFrame==t&&this.renderConfig.clearCanvas===!0||this.destroyed||null===t)){this.renderedFrame=t,this._x.frameNum=t-this._cq._ch,this._x.frameId+=1,this._x.projectInterface.currentFrame=t,this.renderConfig.clearCanvas===!0?this._da.clearRect(this._cx.tx,this._cx.ty,this._cx.w*this._cx.sx,this._cx.h*this._cx.sy):this.save(),this._da.beginPath(),this._da.rect(0,0,this._cx.w,this._cx.h),this._da.closePath(),this._da.clip();var e,r=this.layers.length;for(this._db||this.checkLayers(t),e=0;e<r;e++)(this._db||this._br[e])&&this._br[e]._az(t-this.layers[e].st);for(e=r-1;e>=0;e-=1)(this._db||this._br[e])&&this._br[e]._ba();this.renderConfig.clearCanvas!==!0&&this.restore()}},_aq.prototype.buildItem=function(t){var e=this._br;if(!e[t]&&99!=this.layers[t].ty){var r=this.createItem(this.layers[t],this,this._x);e[t]=r,r.initExpressions()}},_aq.prototype.checkPendingElements=function(){for(;this._dc.length;){var t=this._dc.pop();t.checkParenting()}},_aq.prototype.hide=function(){this._cq.container.style.display="none"},_aq.prototype.show=function(){this._cq.container.style.display="block"},_aq.prototype.searchExtraCompositions=function(t){var e,r=t.length;_ct("g");for(e=0;e<r;e+=1)if(t[e].xt){var s=this.createComp(t[e],this._x.comp,this._x);s.initExpressions(),this._x.projectInterface.registerComposition(s)}},extendPrototype([_l],_ap),_ap.prototype.buildItem=_ao.prototype.buildItem,_ap.prototype.checkPendingElements=function(){for(;this._dc.length;){var t=this._dc.pop();t.checkParenting()}},_ap.prototype.appendElementInPos=function(t,e){var r=t.get_e();if(r){var s=this.layers[e];if(s.ddd&&this.supports3d)this.addTo3dContainer(r,e);else{for(var i,a,n=0;n<e;)this._br[n]&&this._br[n]!==!0&&this._br[n].get_e&&(a=this._br[n],i=this.layers[n].ddd?this.getThreeDContainerByPos(n):a.get_e()),n+=1;i?s.ddd&&this.supports3d||this._bx.insertBefore(r,i):s.ddd&&this.supports3d||this._bx.appendChild(r)}}},_ap.prototype.createBase=function(t){return new _d(t,this._x,this)},_ap.prototype.createShape=function(t){return this.supports3d?new _z(t,this._x,this):new SVGShapeElement(t,this._x,this)},_ap.prototype.createText=function(t){return this.supports3d?new _ab(t,this._x,this):new _cw(t,this._x,this)},_ap.prototype.createCamera=function(t){return this.camera=new _v(t,this._x,this),this.camera},_ap.prototype.createImage=function(t){return this.supports3d?new _y(t,this._x,this):new _h(t,this._x,this)},_ap.prototype.createComp=function(t){return this.supports3d?new _w(t,this._x,this):new _g(t,this._x,this)},_ap.prototype.createSolid=function(t){return this.supports3d?new _aa(t,this._x,this):new _j(t,this._x,this)},_ap.prototype.createNull=_ao.prototype.createNull,_ap.prototype.getThreeDContainerByPos=function(t){for(var e=0,r=this.threeDElements.length;e<r;){if(this.threeDElements[e].startPos<=t&&this.threeDElements[e].endPos>=t)return this.threeDElements[e].perspectiveElem;e+=1}},_ap.prototype.createThreeDContainer=function(t){var e=_cu("div");styleDiv(e),e.style.width=this._x._de.w+"px",e.style.height=this._x._de.h+"px",e.style.transformOrigin=e.style.mozTransformOrigin=e.style.webkitTransformOrigin="50% 50%";var r=_cu("div");styleDiv(r),r.style.transform=r.style.webkitTransform="matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1)",e.appendChild(r),this.resizerElem.appendChild(e);var s={container:r,perspectiveElem:e,startPos:t,endPos:t};return this.threeDElements.push(s),s},_ap.prototype.build3dContainers=function(){var t,e,r=this.layers.length;for(t=0;t<r;t+=1)this.layers[t].ddd?(e||(e=this.createThreeDContainer(t)),e.endPos=Math.max(e.endPos,t)):e=null},_ap.prototype.addTo3dContainer=function(t,e){for(var r=0,s=this.threeDElements.length;r<s;){if(e<=this.threeDElements[r].endPos){for(var i,a=this.threeDElements[r].startPos;a<e;)this._br[a]&&this._br[a].get_e&&(i=this._br[a].get_e()),a+=1;i?this.threeDElements[r].container.insertBefore(t,i):this.threeDElements[r].container.appendChild(t);break}r+=1}},_ap.prototype.configAnimation=function(t){var e=_cu("div"),r=this._cq.wrapper;e.style.width=t.w+"px",e.style.height=t.h+"px",this.resizerElem=e,styleDiv(e),e.style.transformStyle=e.style.webkitTransformStyle=e.style.mozTransformStyle="flat",this.renderConfig.className&&r.setAttribute("class",this.renderConfig.className),r.appendChild(e),e.style.overflow="hidden";var s=_ct("svg");s.setAttribute("width","1"),s.setAttribute("height","1"),styleDiv(s),this.resizerElem.appendChild(s);var i=_ct("defs");s.appendChild(i),this._x.defs=i,this.data=t,this._x.getAssetData=this._cq.getAssetData.bind(this._cq),this._x.getAssetsPath=this._cq.getAssetsPath.bind(this._cq),this._x.elementLoaded=this._cq.elementLoaded.bind(this._cq),this._x.frameId=0,this._x._de={w:t.w,h:t.h},this._x.frameRate=t.fr,this.layers=t.layers,this._x._cr=new FontManager,this._x._cr.addChars(t.chars),this._x._cr.addFonts(t.fonts,s),this._bx=this.resizerElem,this.build3dContainers(),this.updateContainerSize()},_ap.prototype.destroy=function(){this._cq.wrapper.innerHTML="",this._cq.container=null,this._x.defs=null;var t,e=this.layers?this.layers.length:0;for(t=0;t<e;t++)this._br[t].destroy();this._br.length=0,this.destroyed=!0,this._cq=null},_ap.prototype.updateContainerSize=function(){var t,e,r,s,i=this._cq.wrapper.offsetWidth,a=this._cq.wrapper.offsetHeight,n=i/a,o=this._x._de.w/this._x._de.h;o>n?(t=i/this._x._de.w,e=i/this._x._de.w,r=0,s=(a-this._x._de.h*(i/this._x._de.w))/2):(t=a/this._x._de.h,e=a/this._x._de.h,r=(i-this._x._de.w*(a/this._x._de.h))/2,s=0),this.resizerElem.style.transform=this.resizerElem.style.webkitTransform="matrix3d("+t+",0,0,0,0,"+e+",0,0,0,0,1,0,"+r+","+s+",0,1)"},_ap.prototype._ba=_ao.prototype._ba,_ap.prototype.hide=function(){this.resizerElem.style.display="none"},_ap.prototype.show=function(){this.resizerElem.style.display="block"},_ap.prototype.initItems=function(){if(this.buildAllItems(),this.camera)this.camera.setup();else{var t,e=this._x._de.w,r=this._x._de.h,s=this.threeDElements.length;for(t=0;t<s;t+=1)this.threeDElements[t].perspectiveElem.style.perspective=this.threeDElements[t].perspectiveElem.style.webkitPerspective=Math.sqrt(Math.pow(e,2)+Math.pow(r,2))+"px"}},_ap.prototype.searchExtraCompositions=function(t){var e,r=t.length,s=_cu("div");for(e=0;e<r;e+=1)if(t[e].xt){var i=this.createComp(t[e],s,this._x.comp,null);i.initExpressions(),this._x.projectInterface.registerComposition(i)}},_n.prototype.duplicate=function(){var t=2*this._length,e=this.savedOp;this.savedOp=_cs("float32",t),this.savedOp.set(e);var r=0;for(r=this._length;r<t;r+=1)this.saved[r]=_cs("float32",16);this._length=t},_n.prototype.reset=function(){this.cArrPos=0,this.cTr.reset(),this.cO=1},_c.prototype.createElements=function(){this.checkParenting()},_c.prototype.initRendererElement=function(){},_c.prototype.createContainerElements=function(){this._da=this._x._da,this.effectsManager=new _o(this)},_c.prototype.createContent=function(){},_c.prototype.setBlendMode=function(){var t=this._x;if(t.blendMode!==this.data.bm){t.blendMode=this.data.bm;var e=this.getBlendMode();t._da.globalCompositeOperation=e}},_c.prototype.addMasks=function(){this.maskManager=new _q(this.data,this,this._x)},_c.prototype.hideElement=function(){this.hidden||this.isInRange&&!this.isTransparent||(this.hidden=!0)},_c.prototype.showElement=function(){this.isInRange&&!this.isTransparent&&(this.hidden=!1,this._ch=!0,this.maskManager._ch=!0)},_c.prototype._ba=function(){this.hidden||(this.renderTransform(),this.renderRenderable(),this.setBlendMode(),this._x.renderer.save(),this._x.renderer.ctxTransform(this.finalTransform.mat.props),this._x.renderer.ctxOpacity(this.finalTransform.mProp.o.v),this.renderInnerContent(),this._x.renderer.restore(),this.maskManager.hasMasks&&this._x.renderer.restore(!0),this._ch&&(this._ch=!1))},_c.prototype.hide=_c.prototype.hideElement,_c.prototype.show=_c.prototype.showElement,_c.prototype.destroy=function(){this._da=null,this.data=null,this._x=null,this.maskManager.destroy()},_c.prototype.mHelper=new Matrix,extendPrototype([_e,_af,_c,_ad,_ac,_ae],_p),_p.prototype._cz=SVGShapeElement.prototype._cz,_p.prototype._az=_h.prototype._az,_p.prototype.imageLoaded=function(){if(this._x.elementLoaded(),this.assetData.w!==this.img.width||this.assetData.h!==this.img.height){var t=_cu("canvas");t.width=this.assetData.w,t.height=this.assetData.h;var e,r,s=t.getContext("2d"),i=this.img.width,a=this.img.height,n=i/a,o=this.assetData.w/this.assetData.h;n>o?(r=a,e=r*o):(e=i,r=e/o),s.drawImage(this.img,(i-e)/2,(a-r)/2,e,r,0,0,this.assetData.w,this.assetData.h),this.img=t}},_p.prototype.imageFailed=function(){this.failed=!0,this._x.elementLoaded()},_p.prototype.createContent=function(){var t=this.img;t.addEventListener("load",this.imageLoaded.bind(this),!1),t.addEventListener("error",this.imageFailed.bind(this),!1);var e=this._x.getAssetsPath(this.assetData);t.src=e},_p.prototype.renderInnerContent=function(t){this.failed||this._da.drawImage(this.img,0,0)},_p.prototype.destroy=function(){this.img=null,this.destroy_e()},extendPrototype([_aq,_g,_c],_m),_m.prototype.renderInnerContent=function(){var t,e=this.layers.length;for(t=e-1;t>=0;t-=1)(this._db||this._br[t])&&this._br[t]._ba()},_m.prototype.destroy=function(){var t,e=this.layers.length;for(t=e-1;t>=0;t-=1)this._br[t].destroy();this.layers=null,this._br=null},_q.prototype._az=function(t){var e,r=this._co.length;for(e=0;e<r;e+=1)this._co[e].getValue(t),this._co[e].mdf&&(this.element._x.mdf=!0)},_q.prototype._ba=function(t){if(this.hasMasks){var e,r,s,i,a,n=this.element._da,o=this.masksProperties.length;for(n.beginPath(),e=0;e<o;e++)if("n"!==this.masksProperties[e].mode){this.masksProperties[e].inv&&(n.moveTo(0,0),n.lineTo(this.element._x.compWidth,0),n.lineTo(this.element._x.compWidth,this.element._x.compHeight),n.lineTo(0,this.element._x.compHeight),n.lineTo(0,0)),a=this.viewData[e].v,r=t?t._cn(a.v[0][0],a.v[0][1],0):a.v[0],n.moveTo(r[0],r[1]);var h,l=a._length;for(h=1;h<l;h++)r=t?t._cn(a.o[h-1][0],a.o[h-1][1],0):a.o[h-1],s=t?t._cn(a.i[h][0],a.i[h][1],0):a.i[h],i=t?t._cn(a.v[h][0],a.v[h][1],0):a.v[h],n.bezierCurveTo(r[0],r[1],s[0],s[1],i[0],i[1]);r=t?t._cn(a.o[h-1][0],a.o[h-1][1],0):a.o[h-1],s=t?t._cn(a.i[0][0],a.i[0][1],0):a.i[0],i=t?t._cn(a.v[0][0],a.v[0][1],0):a.v[0],n.bezierCurveTo(r[0],r[1],s[0],s[1],i[0],i[1])}this.element._x.renderer.save(!0),n.clip()}},_q.prototype.getMaskProperty=_ay.prototype.getMaskProperty,_q.prototype.destroy=function(){this.element=null},extendPrototype([_e,_af,_c,_f,_ad,_ac,_ae],_r),_r.prototype._cz=_ci.prototype._cz,_r.prototype.transformHelper={opacity:1,mat:new Matrix,matMdf:!1,opMdf:!1},_r.prototype.dashResetter=[],_r.prototype.createContent=function(){this.searchShapes(this.shapesData,this.itemsData,this.prevViewData,this._co,!0)},_r.prototype.createStyleElement=function(t,e){var r={data:t,type:t.ty,_br:[]},s={};if("fl"!=t.ty&&"st"!=t.ty||(s.c=_ai._bo(this,t.c,1,255,e),s.c.k||(r.co="rgb("+bm_floor(s.c.v[0])+","+bm_floor(s.c.v[1])+","+bm_floor(s.c.v[2])+")")),s.o=_ai._bo(this,t.o,0,.01,e),"st"==t.ty){if(r.lc=this.lcEnum[t.lc]||"round",r.lj=this.ljEnum[t.lj]||"round",1==t.lj&&(r.ml=t.ml),s.w=_ai._bo(this,t.w,0,null,e),s.w.k||(r.wi=s.w.v),t.d){var i=new DashProperty(this,t.d,"canvas",e);s.d=i,s.d.k||(r.da=s.d.dashArray,r["do"]=s.d.dashoffset[0])}}else r.r=2===t.r?"evenodd":"nonzero";return this.stylesList.push(r),s.style=r,s},_r.prototype.createGroupElement=function(t){var e={it:[],prevViewData:[]};return e},_r.prototype._cp=function(t,e){var r={transform:{mat:new Matrix,opacity:1,matMdf:!1,opMdf:!1,op:_ai._bo(this,t.o,0,.01,e),mProps:_ag._bj(this,t,e)},_br:[]};return r},_r.prototype.createShapeElement=function(t,e){var r={nodes:[],trNodes:[],tr:[0,0,0,0,0,0]},s=4;"rc"==t.ty?s=5:"el"==t.ty?s=6:"sr"==t.ty&&(s=7),r.sh=_ah._bp(this,t,s,e),this.shapes.push(r.sh),this.addShapeToModifiers(r);var i,a=this.stylesList.length,n=!1,o=!1;for(i=0;i<a;i+=1)this.stylesList[i].closed||(this.stylesList[i]._br.push(r),"st"===this.stylesList[i].type?n=!0:o=!0);return r.st=n,r.fl=o,r},_r.prototype.reloadShapes=function(){this._ch=!0;var t,e=this.itemsData.length;for(t=0;t<e;t+=1)this.prevViewData[t]=this.itemsData[t];this.searchShapes(this.shapesData,this.itemsData,this.prevViewData,this._co,!0);var t,e=this._co.length;for(t=0;t<e;t+=1)this._co[t].getValue();this.renderModifiers()},_r.prototype.searchShapes=function(t,e,r,s,i){var a,n,o,h,l=t.length-1,p=[],m=[];for(a=l;a>=0;a-=1){if(h=this.searchProcessedElement(t[a]),h?e[a]=r[h-1]:t[a]._render=i,"fl"==t[a].ty||"st"==t[a].ty)h?e[a].style.closed=!1:e[a]=this.createStyleElement(t[a],s),p.push(e[a].style);else if("gr"==t[a].ty){if(h)for(o=e[a].it.length,n=0;n<o;n+=1)e[a].prevViewData[n]=e[a].it[n];else e[a]=this.createGroupElement(t[a]);this.searchShapes(t[a].it,e[a].it,e[a].prevViewData,s,i)}else if("tr"==t[a].ty)h||(e[a]=this._cp(t[a],s));else if("sh"==t[a].ty||"rc"==t[a].ty||"el"==t[a].ty||"sr"==t[a].ty)h||(e[a]=this.createShapeElement(t[a],s));else if("tm"==t[a].ty||"rd"==t[a].ty){if(h)f=e[a],f.closed=!1;else{var f=_as.getModifier(t[a].ty);f.init(this,t[a],s),e[a]=f,this.shapeModifiers.push(f)}m.push(f)}else"rp"==t[a].ty&&(h?(f=e[a],f.closed=!0):(f=_as.getModifier(t[a].ty),e[a]=f,f.init(this,t,a,e,s),this.shapeModifiers.push(f),i=!1),m.push(f));this.addProcessedElement(t[a],a+1)}for(l=p.length,a=0;a<l;a+=1)p[a].closed=!0;for(l=m.length,a=0;a<l;a+=1)m[a].closed=!0},_r.prototype.renderInnerContent=function(){this.transformHelper.mat.reset(),this.transformHelper.opacity=this.finalTransform.mProp.o.v,this.transformHelper.matMdf=!1,this.transformHelper.opMdf=this.finalTransform.opMdf,this.renderModifiers(),this.renderShape(this.transformHelper,null,null,!0)},_r.prototype.renderShape=function(t,e,r,s){var i,a;if(!e)for(e=this.shapesData,a=this.stylesList.length,i=0;i<a;i+=1)this.stylesList[i].d="",this.stylesList[i].mdf=!1;r||(r=this.itemsData),a=e.length-1;var n,o;for(n=t,i=a;i>=0;i-=1)if("tr"==e[i].ty){n=r[i].transform;var h=r[i].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*=r[i].transform.op.v,n.matMdf=!!t.matMdf||n.matMdf,n.opMdf=!!t.opMdf||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[i].ty||"el"==e[i].ty||"rc"==e[i].ty||"sr"==e[i].ty?this.renderPath(e[i],r[i],n):"fl"==e[i].ty?this.renderFill(e[i],r[i],n):"st"==e[i].ty?this.renderStroke(e[i],r[i],n):"gr"==e[i].ty?this.renderShape(n,e[i].it,r[i].it):"tm"==e[i].ty;if(s){a=this.stylesList.length;var p,m,f,c,d,u,y,g=this._x.renderer,v=this._x._da;for(i=0;i<a;i+=1)if(y=this.stylesList[i].type,("st"!==y||0!==this.stylesList[i].wi)&&this.stylesList[i].data._render){for(g.save(),d=this.stylesList[i]._br,"st"===y?(v.strokeStyle=this.stylesList[i].co,v.lineWidth=this.stylesList[i].wi,v.lineCap=this.stylesList[i].lc,v.lineJoin=this.stylesList[i].lj,v.miterLimit=this.stylesList[i].ml||0):v.fillStyle=this.stylesList[i].co,g.ctxOpacity(this.stylesList[i].coOp),"st"!==y&&v.beginPath(),m=d.length,p=0;p<m;p+=1){for("st"===y&&(v.beginPath(),this.stylesList[i].da?(v.setLineDash(this.stylesList[i].da),v.lineDashOffset=this.stylesList[i]["do"],this._x.isDashed=!0):this._x.isDashed&&(v.setLineDash(this.dashResetter),this._x.isDashed=!1)),u=d[p].trNodes,c=u.length,f=0;f<c;f+=1)"m"==u[f].t?v.moveTo(u[f].p[0],u[f].p[1]):"c"==u[f].t?v.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]):v.closePath();"st"===y&&v.stroke()}"st"!==y&&v.fill(this.stylesList[i].r),g.restore()}this._ch&&(this._ch=!1)}},_r.prototype.renderPath=function(t,e,r){var s,i,a,n,o=r.matMdf||e.sh.mdf||this._ch;if(o){var h=e.sh.paths,l=r.mat;n=t._render===!1?0:h._length;var p=e.trNodes;for(p.length=0,a=0;a<n;a+=1){var m=h.shapes[a];if(m&&m.v){for(s=m._length,i=1;i<s;i+=1)1==i&&p.push({t:"m",p:l._cn(m.v[0][0],m.v[0][1],0)}),p.push({t:"c",p1:l._cn(m.o[i-1][0],m.o[i-1][1],0),p2:l._cn(m.i[i][0],m.i[i][1],0),p3:l._cn(m.v[i][0],m.v[i][1],0)});1==s&&p.push({t:"m",p:l._cn(m.v[0][0],m.v[0][1],0)}),m.c&&s&&(p.push({t:"c",p1:l._cn(m.o[i-1][0],m.o[i-1][1],0),p2:l._cn(m.i[0][0],m.i[0][1],0),p3:l._cn(m.v[0][0],m.v[0][1],0)}),p.push({t:"z"})),e.lStr=p}}if(e.st)for(i=0;i<16;i+=1)e.tr[i]=r.mat.props[i];e.trNodes=p}},_r.prototype.renderFill=function(t,e,r){var s=e.style;(e.c.mdf||this._ch)&&(s.co="rgb("+bm_floor(e.c.v[0])+","+bm_floor(e.c.v[1])+","+bm_floor(e.c.v[2])+")"),(e.o.mdf||r.opMdf||this._ch)&&(s.coOp=e.o.v*r.opacity)},_r.prototype.renderStroke=function(t,e,r){var s=e.style,i=e.d;i&&(i.mdf||this._ch)&&(s.da=i.dashArray,s["do"]=i.dashoffset[0]),(e.c.mdf||this._ch)&&(s.co="rgb("+bm_floor(e.c.v[0])+","+bm_floor(e.c.v[1])+","+bm_floor(e.c.v[2])+")"),(e.o.mdf||r.opMdf||this._ch)&&(s.coOp=e.o.v*r.opacity),(e.w.mdf||this._ch)&&(s.wi=e.w.v)},_r.prototype.destroy=function(){this.shapesData=null,this._x=null,this._da=null,this.stylesList.length=0,this.itemsData.length=0},extendPrototype([_e,_af,_c,_ad,_ac,_ae],_s),_s.prototype._cz=SVGShapeElement.prototype._cz,_s.prototype._az=_h.prototype._az,_s.prototype.renderInnerContent=function(){var t=this._da;t.fillStyle=this.data.sc,t.fillRect(0,0,this.data.sw,this.data.sh)},extendPrototype([_e,_af,_c,_ad,_ac,_ae,_k],_t),_t.prototype.tHelper=_cu("canvas").getContext("2d"),_t.prototype.buildNewText=function(){var t=this.textProperty.currentData;this._bt=_cv(t.l?t.l.length:0);var e=!1;t.fc?(e=!0,this.values.fill=this.buildColor(t.fc)):this.values.fill="rgba(0,0,0,0)",this.fill=e;var r=!1;t.sc&&(r=!0,this.values.stroke=this.buildColor(t.sc),this.values.sWidth=t.sw);var s,i,a=this._x._cr.getFontByName(t.f),n=t.l,o=this.mHelper;this.stroke=r,this.values.fValue=t.s+"px "+this._x._cr.getFontByName(t.f).fFamily,i=t.t.length;var h,l,p,m,f,c,d,u,y,g,v=this.data.singleShape,b=t.tr/1e3*t.s,E=0,P=0,x=!0,S=0;for(s=0;s<i;s+=1){for(h=this._x._cr.getCharData(t.t.charAt(s),a.fStyle,this._x._cr.getFontByName(t.f).fFamily),l=h&&h.data||{},o.reset(),v&&n[s].n&&(E=-b,P+=t.yOffset,P+=x?1:0,x=!1),f=l.shapes?l.shapes[0].it:[],d=f.length,o.scale(t.s/100,t.s/100),v&&this.applyTextPropertiesToMatrix(t,o,n[s].line,E,P),y=_cv(d),c=0;c<d;c+=1){for(m=f[c].ks.k.i.length,u=f[c].ks.k,g=[],p=1;p<m;p+=1)1==p&&g.push(o.applyToX(u.v[0][0],u.v[0][1],0),o.applyToY(u.v[0][0],u.v[0][1],0)),g.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));g.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[c]=g}v&&(E+=n[s].l,E+=b),this.textSpans[S]?this.textSpans[S].elem=y:this.textSpans[S]={elem:y},S+=1}},_t.prototype.renderInnerContent=function(){var t=this._da;this.finalTransform.mat.props;t.font=this.values.fValue,t.lineCap="butt",t.lineJoin="miter",t.miterLimit=4,this.data.singleShape||this.textAnimator.getMeasures(this.textProperty.currentData,this.lettersChangedFlag);var e,r,s,i,a,n,o=this.textAnimator._bt,h=this.textProperty.currentData.l;r=h.length;var l,p,m,f=null,c=null,d=null;for(e=0;e<r;e+=1)if(!h[e].n){if(l=o[e],l&&(this._x.renderer.save(),this._x.renderer.ctxTransform(l.p),this._x.renderer.ctxOpacity(l.o)),this.fill){for(l&&l.fc?f!==l.fc&&(f=l.fc,t.fillStyle=l.fc):f!==this.values.fill&&(f=this.values.fill,t.fillStyle=this.values.fill),p=this.textSpans[e].elem,i=p.length,this._x._da.beginPath(),s=0;s<i;s+=1)for(m=p[s],n=m.length,this._x._da.moveTo(m[0],m[1]),a=2;a<n;a+=6)this._x._da.bezierCurveTo(m[a],m[a+1],m[a+2],m[a+3],m[a+4],m[a+5]);this._x._da.closePath(),this._x._da.fill()}if(this.stroke){for(l&&l.sw?d!==l.sw&&(d=l.sw,t.lineWidth=l.sw):d!==this.values.sWidth&&(d=this.values.sWidth,t.lineWidth=this.values.sWidth),l&&l.sc?c!==l.sc&&(c=l.sc,t.strokeStyle=l.sc):c!==this.values.stroke&&(c=this.values.stroke,t.strokeStyle=this.values.stroke),p=this.textSpans[e].elem,i=p.length,this._x._da.beginPath(),s=0;s<i;s+=1)for(m=p[s],n=m.length,this._x._da.moveTo(m[0],m[1]),a=2;a<n;a+=6)this._x._da.bezierCurveTo(m[a],m[a+1],m[a+2],m[a+3],m[a+4],m[a+5]);this._x._da.closePath(),this._x._da.stroke()}l&&this._x.renderer.restore()}},_o.prototype._ba=function(){},_b.prototype.checkBlendMode=function(){},_b.prototype.get_e=_d.prototype.get_e,_b.prototype.initRendererElement=function(){this._by=_cu("div"),this.data.hasMask?(this._cf=_ct("svg"),this._bx=_ct("g"),this._ca=this._bx,this._cf.appendChild(this._bx),this._by.appendChild(this._cf)):this._bx=this._by,styleDiv(this._by)},_b.prototype.createContainerElements=function(){this.effectsManager=new _o(this),this._bz=this._by,this._ca=this._bx,this.data.ln&&this._bx.setAttribute("id",this.data.ln),0!==this.data.bm&&this.setBlendMode(),this.checkParenting()},_b.prototype.renderElement=function(){this.finalTransform.matMdf&&(this._bz.style.transform=this._bz.style.webkitTransform=this.finalTransform.mat.toCSS()),this.finalTransform.opMdf&&(this._bz.style.opacity=this.finalTransform.mProp.o.v)},_b.prototype._ba=function(){this.data.hd||this.hidden||(this.renderTransform(),this.renderRenderable(),this.renderElement(),this.renderInnerContent(),this._ch&&(this._ch=!1))},_b.prototype.destroy=function(){this._bx=null,this._bz=null,this.matteElement&&(this.matteElement=null),this.maskManager&&(this.maskManager.destroy(),this.maskManager=null)},_b.prototype.getDomElement=function(){return this._bx},_b.prototype.addMasks=function(){this.maskManager=new _ay(this.data,this,this._x)},_b.prototype.setMatte=function(){},_b.prototype.buildElementParenting=_ap.prototype.buildElementParenting,extendPrototype([_e,_af,_b,_ad,_ac,_ci],_aa),_aa.prototype.createContent=function(){var t;this.data.hasMask?(t=_ct("rect"),t.setAttribute("width",this.data.sw),t.setAttribute("height",this.data.sh),t.setAttribute("fill",this.data.sc),this._cf.setAttribute("width",this.data.sw),this._cf.setAttribute("height",this.data.sh)):(t=_cu("div"),t.style.width=this.data.sw+"px",t.style.height=this.data.sh+"px",t.style.backgroundColor=this.data.sc),this._bx.appendChild(t)},extendPrototype([_ap,_g,_b],_w),_w.prototype.createContainerElements=function(){this.data.hasMask?(this._bz=this._bx,this._cf.setAttribute("width",this.data.w),this._cf.setAttribute("height",this.data.h)):this._bz=this._bx,this.effectsManager=new _o(this),this.checkParenting()},extendPrototype([_e,_af,_aa,SVGShapeElement,_b,_ad,_ac,_ae],_z),_z.prototype._renderShapeFrame=_z.prototype.renderInnerContent,_z.prototype.createContent=function(){var t;if(this.data.hasMask)this._bx.appendChild(this.shapesContainer),
+t=this._cf;else{t=_ct("svg");var e=this.comp.data?this.comp.data:this._x._de;t.setAttribute("width",e.w),t.setAttribute("height",e.h),t.appendChild(this.shapesContainer),this._bx.appendChild(t)}this.searchShapes(this.shapesData,this.itemsData,this.prevViewData,this.shapesContainer,this._co,0,[],!0),this.shapeCont=t},_z.prototype.renderInnerContent=function(){if(this._renderShapeFrame(),!this.hidden&&this._ch){var t=this.shapeCont.getBBox(),e=!1;this._cg.w!==t.width&&(this._cg.w=t.width,this.shapeCont.setAttribute("width",t.width),e=!0),this._cg.h!==t.height&&(this._cg.h=t.height,this.shapeCont.setAttribute("height",t.height),e=!0),(e||this._cg.x!==t.x||this._cg.y!==t.y)&&(this._cg.w=t.width,this._cg.h=t.height,this._cg.x=t.x,this._cg.y=t.y,this.shapeCont.setAttribute("viewBox",this._cg.x+" "+this._cg.y+" "+this._cg.w+" "+this._cg.h),this.shapeCont.style.transform=this.shapeCont.style.webkitTransform="translate("+this._cg.x+"px,"+this._cg.y+"px)")}},extendPrototype([_e,_af,_b,_ad,_ac,_ci,_k],_ab),_ab.prototype.createContent=function(){if(this.isMasked=this.checkMasks(),this.isMasked){this.renderType="svg",this.compW=this.comp.data.w,this.compH=this.comp.data.h,this._cf.setAttribute("width",this.compW),this._cf.setAttribute("height",this.compH);var t=_ct("g");this._ca.appendChild(t),this._cc=t}else this.renderType="html",this._cc=this._bx;this.checkParenting()},_ab.prototype.buildNewText=function(){var t=this.textProperty.currentData;this._bt=_cv(this.textProperty.currentData.l?this.textProperty.currentData.l.length:0);var e=this._cc.style;e.color=e.fill=t.fc?this.buildColor(t.fc):"rgba(0,0,0,0)",t.sc&&(e.stroke=this.buildColor(t.sc),e.strokeWidth=t.sw+"px");var r=this._x._cr.getFontByName(t.f);if(!this._x._cr.chars)if(e.fontSize=t.s+"px",e.lineHeight=t.s+"px",r.fClass)this._cc.className=r.fClass;else{e.fontFamily=r.fFamily;var s=t.fWeight,i=t.fStyle;e.fontStyle=i,e.fontWeight=s}var a,n,o=t.l;n=o.length;var h,l,p,m,f=this.mHelper,c="",d=0;for(a=0;a<n;a+=1){if(this._x._cr.chars?(this.textPaths[d]?h=this.textPaths[d]:(h=_ct("path"),h.setAttribute("stroke-linecap","butt"),h.setAttribute("stroke-linejoin","round"),h.setAttribute("stroke-miterlimit","4")),this.isMasked||(this.textSpans[d]?(l=this.textSpans[d],p=l.children[0]):(l=_cu("div"),p=_ct("svg"),p.appendChild(h),styleDiv(l)))):this.isMasked?h=this.textPaths[d]?this.textPaths[d]:_ct("text"):this.textSpans[d]?(l=this.textSpans[d],h=this.textPaths[d]):(l=_cu("span"),styleDiv(l),h=_cu("span"),styleDiv(h),l.appendChild(h)),this._x._cr.chars){var u,y=this._x._cr.getCharData(t.t.charAt(a),r.fStyle,this._x._cr.getFontByName(t.f).fFamily);if(u=y?y.data:null,f.reset(),u&&u.shapes&&(m=u.shapes[0].it,f.scale(t.s/100,t.s/100),c=this.createPathShape(f,m),h.setAttribute("d",c)),this.isMasked)this._cc.appendChild(h);else if(this._cc.appendChild(l),u&&u.shapes){var g=p.getBBox();p.setAttribute("width",g.width+2),p.setAttribute("height",g.height+2),p.setAttribute("viewBox",g.x-1+" "+(g.y-1)+" "+(g.width+2)+" "+(g.height+2)),p.style.transform=p.style.webkitTransform="translate("+(g.x-1)+"px,"+(g.y-1)+"px)",o[a].yOffset=g.y-1,l.appendChild(p)}else p.setAttribute("width",1),p.setAttribute("height",1)}else h.textContent=o[a].val,h.setAttributeNS("http://www.w3.org/XML/1998/namespace","xml:space","preserve"),this.isMasked?this._cc.appendChild(h):(this._cc.appendChild(l),h.style.transform=h.style.webkitTransform="translate3d(0,"+-t.s/1.2+"px,0)");this.isMasked?this.textSpans[d]=h:this.textSpans[d]=l,this.textSpans[d].style.display="block",this.textPaths[d]=h,d+=1}for(;d<this.textSpans.length;)this.textSpans[d].style.display="none",d+=1},_ab.prototype.renderInnerContent=function(){if(this.data.singleShape){if(!this._ch&&!this.lettersChangedFlag)return;this.isMasked&&this.finalTransform.matMdf&&(this._cf.setAttribute("viewBox",-this.finalTransform.mProp.p.v[0]+" "+-this.finalTransform.mProp.p.v[1]+" "+this.compW+" "+this.compH),this._cf.style.transform=this._cf.style.webkitTransform="translate("+-this.finalTransform.mProp.p.v[0]+"px,"+-this.finalTransform.mProp.p.v[1]+"px)")}if(this.textAnimator.getMeasures(this.textProperty.currentData,this.lettersChangedFlag),this.lettersChangedFlag||this.textAnimator.lettersChangedFlag){var t,e,r=0,s=this.textAnimator._bt,i=this.textProperty.currentData.l;e=i.length;var a,n,o;for(t=0;t<e;t+=1)i[t].n?r+=1:(n=this.textSpans[t],o=this.textPaths[t],a=s[r],r+=1,this.isMasked?n.setAttribute("transform",a.m):n.style.transform=n.style.webkitTransform=a.m,n.style.opacity=a.o,a.sw&&o.setAttribute("stroke-width",a.sw),a.sc&&o.setAttribute("stroke",a.sc),a.fc&&(o.setAttribute("fill",a.fc),o.style.color=a.fc));if(this.isVisible&&this._ch&&this._cc.getBBox){var h=this._cc.getBBox();this._cg.w!==h.width&&(this._cg.w=h.width,this._cf.setAttribute("width",h.width)),this._cg.h!==h.height&&(this._cg.h=h.height,this._cf.setAttribute("height",h.height));var l=1;this._cg.w===h.width+2*l&&this._cg.h===h.height+2*l&&this._cg.x===h.x-l&&this._cg.y===h.y-l||(this._cg.w=h.width+2*l,this._cg.h=h.height+2*l,this._cg.x=h.x-l,this._cg.y=h.y-l,this._cf.setAttribute("viewBox",this._cg.x+" "+this._cg.y+" "+this._cg.w+" "+this._cg.h),this._cf.style.transform=this._cf.style.webkitTransform="translate("+this._cg.x+"px,"+this._cg.y+"px)")}}},extendPrototype([_e,_af,_b,_aa,_ad,_ac,_ae],_y),_y.prototype.createContent=function(){var t=this._x.getAssetsPath(this.assetData),e=new Image;this.data.hasMask?(this.imageElem=_ct("image"),this.imageElem.setAttribute("width",this.assetData.w+"px"),this.imageElem.setAttribute("height",this.assetData.h+"px"),this.imageElem.setAttributeNS("http://www.w3.org/1999/xlink","href",t),this._bx.appendChild(this.imageElem),this._by.setAttribute("width",this.assetData.w),this._by.setAttribute("height",this.assetData.h)):this._bx.appendChild(e),e.src=t,this.data.ln&&this._cc.setAttribute("id",this.data.ln),this.checkParenting()},extendPrototype([_e,_ac],_v),_v.prototype.setup=function(){var t,e,r=this.comp.threeDElements.length;for(t=0;t<r;t+=1)e=this.comp.threeDElements[t],e.perspectiveElem.style.perspective=e.perspectiveElem.style.webkitPerspective=this.pe.v+"px",e.container.style.transformOrigin=e.container.style.mozTransformOrigin=e.container.style.webkitTransformOrigin="0px 0px 0px",e.perspectiveElem.style.transform=e.perspectiveElem.style.webkitTransform="matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1)"},_v.prototype.createElements=function(){},_v.prototype.hide=function(){},_v.prototype._ba=function(){var t,e,r=this._ch;if(this._dd)for(e=this._dd.length,t=0;t<e;t+=1)r=!!this._dd[t].finalTransform.mProp.mdf||r;if(r||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 s=[this.p.v[0]-this.a.v[0],this.p.v[1]-this.a.v[1],this.p.v[2]-this.a.v[2]],i=Math.sqrt(Math.pow(s[0],2)+Math.pow(s[1],2)+Math.pow(s[2],2)),a=[s[0]/i,s[1]/i,s[2]/i],n=Math.sqrt(a[2]*a[2]+a[0]*a[0]),o=Math.atan2(a[1],n),h=Math.atan2(a[0],-a[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._x._de.w/2,this._x._de.h/2,0),this.mat.translate(0,0,this.pe.v),this._dd){var l;for(e=this._dd.length,t=0;t<e;t+=1)l=this._dd[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])}if(!this._prevMat.equals(this.mat)){e=this.comp.threeDElements.length;var p;for(t=0;t<e;t+=1)p=this.comp.threeDElements[t],p.container.style.transform=p.container.style.webkitTransform=this.mat.toCSS();this.mat.clone(this._prevMat)}}this._ch=!1},_v.prototype._az=function(t){this.prepareProperties(t,!0)},_v.prototype.destroy=function(){},_v.prototype.initExpressions=function(){},_v.prototype.get_e=function(){return null},_bv.prototype._ba=function(){};var Expressions=function(){function t(t){t.renderer.compInterface=CompExpressionInterface(t.renderer),t.renderer._x.projectInterface.registerComposition(t.renderer)}var e={};return e.initExpressions=t,e}();expressionsPlugin=Expressions;var ExpressionManager=function(){function duplicatePropertyValue(t,e){if(e=e||1,"number"==typeof t||t instanceof Number)return t*e;if(t.i)return shape_pool.clone(t);var r,s=_cs("float32",t.length),i=t.length;for(r=0;r<i;r+=1)s[r]=t[r]*e;return s}function isTypeOfArray(t){return t.constructor===Array||t.constructor===Float32Array}function shapesEqual(t,e){if(t._length!==e._length||t.c!==e.c)return!1;var r,s=t._length;for(r=0;r<s;r+=1)if(t.v[r][0]!==e.v[r][0]||t.v[r][1]!==e.v[r][1]||t.o[r][0]!==e.o[r][0]||t.o[r][1]!==e.o[r][1]||t.i[r][0]!==e.i[r][0]||t.i[r][1]!==e.i[r][1])return!1;return!0}function $bm_neg(t){var e=typeof t;if("number"===e||"boolean"===e||t instanceof Number)return-t;if(isTypeOfArray(t)){var r,s=t.length,i=[];for(r=0;r<s;r+=1)i[r]=-t[r];return i}}function sum(t,e){var r=typeof t,s=typeof e;if("string"===r||"string"===s)return t+e;if(("number"===r||"boolean"===r||"string"===r||t instanceof Number)&&("number"===s||"boolean"===s||"string"===s||e instanceof Number))return t+e;if(isTypeOfArray(t)&&("number"===s||"boolean"===s||"string"===s||e instanceof Number))return t[0]=t[0]+e,t;if(("number"===r||"boolean"===r||"string"===r||t instanceof Number)&&isTypeOfArray(e))return e[0]=t+e[0],e;if(isTypeOfArray(t)&&isTypeOfArray(e)){for(var i=0,a=t.length,n=e.length,o=[];i<a||i<n;)("number"==typeof t[i]||t[i]instanceof Number)&&("number"==typeof e[i]||e[i]instanceof Number)?o[i]=t[i]+e[i]:o[i]=void 0==e[i]?t[i]:t[i]||e[i],i+=1;return o}return 0}function sub(t,e){var r=typeof t,s=typeof e;if(("number"===r||"boolean"===r||"string"===r||t instanceof Number)&&("number"===s||"boolean"===s||"string"===s||e instanceof Number))return"string"===r&&(t=parseInt(t)),"string"===s&&(e=parseInt(e)),t-e;if(isTypeOfArray(t)&&("number"===s||"boolean"===s||"string"===s||e instanceof Number))return t[0]=t[0]-e,t;if(("number"===r||"boolean"===r||"string"===r||t instanceof Number)&&isTypeOfArray(e))return e[0]=t-e[0],e;if(isTypeOfArray(t)&&isTypeOfArray(e)){for(var i=0,a=t.length,n=e.length,o=[];i<a||i<n;)"number"==typeof t[i]||t[i]instanceof Number?o[i]=t[i]-e[i]:o[i]=void 0==e[i]?t[i]:t[i]||e[i],i+=1;return o}return 0}function mul(t,e){var r,s=typeof t,i=typeof e;if(("number"===s||"boolean"===s||"string"===s||t instanceof Number)&&("number"===i||"boolean"===i||"string"===i||e instanceof Number))return t*e;var a,n;if(isTypeOfArray(t)&&("number"===i||"boolean"===i||"string"===i||e instanceof Number)){for(n=t.length,r=_cs("float32",n),a=0;a<n;a+=1)r[a]=t[a]*e;return r}if(("number"===s||"boolean"===s||"string"===s||t instanceof Number)&&isTypeOfArray(e)){for(n=e.length,r=_cs("float32",n),a=0;a<n;a+=1)r[a]=t*e[a];return r}return 0}function div(t,e){var r,s=typeof t,i=typeof e;if(("number"===s||"boolean"===s||"string"===s||t instanceof Number)&&("number"===i||"boolean"===i||"string"===i||e instanceof Number))return t/e;var a,n;if(isTypeOfArray(t)&&("number"===i||"boolean"===i||"string"===i||e instanceof Number)){for(n=t.length,r=_cs("float32",n),a=0;a<n;a+=1)r[a]=t[a]/e;return r}if(("number"===s||"boolean"===s||"string"===s||t instanceof Number)&&isTypeOfArray(e)){for(n=e.length,r=_cs("float32",n),a=0;a<n;a+=1)r[a]=t/e[a];return r}return 0}function mod(t,e){return"string"==typeof t&&(t=parseInt(t)),"string"==typeof e&&(e=parseInt(e)),t%e}function clamp(t,e,r){if(e>r){var s=r;r=e,e=s}return Math.min(Math.max(t,e),r)}function radiansToDegrees(t){return t/degToRads}function degreesToRadians(t){return t*degToRads}function length(t,e){if("number"==typeof t||t instanceof Number)return e=e||0,Math.abs(t-e);e||(e=helperLengthArray);var r,s=Math.min(t.length,e.length),i=0;for(r=0;r<s;r+=1)i+=Math.pow(e[r]-t[r],2);return Math.sqrt(i)}function normalize(t){return div(t,length(t))}function rgbToHsl(t){var e,r,s=t[0],i=t[1],a=t[2],n=Math.max(s,i,a),o=Math.min(s,i,a),h=(n+o)/2;if(n==o)e=r=0;else{var l=n-o;switch(r=h>.5?l/(2-n-o):l/(n+o),n){case s:e=(i-a)/l+(i<a?6:0);break;case i:e=(a-s)/l+2;break;case a:e=(s-i)/l+4}e/=6}return[e,r,h,t[3]]}function hslToRgb(t){function e(t,e,r){return r<0&&(r+=1),r>1&&(r-=1),r<1/6?t+6*(e-t)*r:r<.5?e:r<2/3?t+(e-t)*(2/3-r)*6:t}var r,s,i,a=t[0],n=t[1],o=t[2];if(0==n)r=s=i=o;else{var h=o<.5?o*(1+n):o+n-o*n,l=2*o-h;r=e(l,h,a+1/3),s=e(l,h,a),i=e(l,h,a-1/3)}return[r,s,i,t[3]]}function linear(t,e,r,s,i){if(void 0===s||void 0===i)return linear(t,0,1,e,r);if(t<=e)return s;if(t>=r)return i;var a=r===e?0:(t-e)/(r-e);if(!s.length)return s+(i-s)*a;var n,o=s.length,h=_cs("float32",o);for(n=0;n<o;n+=1)h[n]=s[n]+(i[n]-s[n])*a;return h}function random(t,e){if(void 0===e&&(void 0===t?(t=0,e=1):(e=t,t=void 0)),e.length){var r,s=e.length;t||(t=_cs("float32",s));var i=_cs("float32",s),a=BMMath.random();for(r=0;r<s;r+=1)i[r]=t[r]+a*(e[r]-t[r]);return i}void 0===t&&(t=0);var n=BMMath.random();return t+n*(e-t)}function createPath(t,e,r,s){e=e&&e.length?e:t,r=r&&r.length?r:t;var a=shape_pool.newElement(),n=t.length;for(a.setPathData(s,n),i=0;i<n;i+=1)a._aw(t[i][0],t[i][1],r[i][0]+t[i][0],r[i][1]+t[i][1],e[i][0]+t[i][0],e[i][1]+t[i][1],i,!0);return a}function initiateExpression(elem,data,property){function lookAt(t,e){var r=[e[0]-t[0],e[1]-t[1],e[2]-t[2]],s=Math.atan2(r[0],Math.sqrt(r[1]*r[1]+r[2]*r[2]))/degToRads,i=-Math.atan2(r[1],r[2])/degToRads;return[i,s,0]}function easeOut(t,e,r,s,i){return void 0===s?(s=e,i=r):t=(t-e)/(r-e),-(i-s)*t*(t-2)+s}function easeIn(t,e,r,s,i){return void 0===s?(s=e,i=r):t=(t-e)/(r-e),(i-s)*t*t+s}function nearestKey(t){var e,r,s,i=data.k.length;if(data.k.length&&"number"!=typeof data.k[0])if(r=-1,t*=elem.comp._x.frameRate,t<data.k[0].t)r=1,s=data.k[0].t;else{for(e=0;e<i-1;e+=1){if(t===data.k[e].t){r=e+1,s=data.k[e].t;break}if(t>data.k[e].t&&t<data.k[e+1].t){t-data.k[e].t>data.k[e+1].t-t?(r=e+2,s=data.k[e+1].t):(r=e+1,s=data.k[e].t);break}}r===-1&&(r=e+1,s=data.k[e].t)}else r=0,s=0;var a={};return a.index=r,a.time=s/elem.comp._x.frameRate,a}function key(t){var e,r,s;if(!data.k.length||"number"==typeof data.k[0])throw new Error("The property has no keyframe at index "+t);t-=1,e={time:data.k[t].t/elem.comp._x.frameRate};var i;for(i=t!==data.k.length-1||data.k[t].h?data.k[t].s:data.k[t-1].e,s=i.length,r=0;r<s;r+=1)e[r]=i[r];return e}function framesToTime(t,e){return e||(e=elem.comp._x.frameRate),t/e}function timeToFrames(t,e){return t||0===t||(t=time),e||(e=elem.comp._x.frameRate),t*e}function seedRandom(t){BMMath.seedrandom(randSeed+t)}function sourceRectAtTime(){return elem.sourceRectAtTime()}function executeExpression(){if(_needsRandom&&seedRandom(randSeed),this.frameExpressionId!==elem._x.frameId||"textSelector"===this.propType){if(this.lock)return this.v=duplicatePropertyValue(this.pv,this.mult),!0;"textSelector"===this.propType&&(textIndex=this.textIndex,textTotal=this.textTotal,selectorValue=this.selectorValue),thisLayer||(thisLayer=elem.layerInterface,thisComp=elem.comp.compInterface,toWorld=thisLayer.toWorld.bind(thisLayer),fromWorld=thisLayer.fromWorld.bind(thisLayer),fromComp=thisLayer.fromComp.bind(thisLayer),mask=thisLayer.mask?thisLayer.mask.bind(thisLayer):null,fromCompToSurface=fromComp),transform||(transform=elem.layerInterface("ADBE Transform Group"),anchorPoint=transform.anchorPoint),4!==elemType||content||(content=thisLayer("ADBE Root Vectors Group")),effect||(effect=thisLayer(4)),hasParent=!(!elem._dd||!elem._dd.length),hasParent&&!parent&&(parent=elem._dd[0].layerInterface),this.lock=!0,this.getPreValue&&this.getPreValue(),value=this.pv,time=this.comp.renderedFrame/this.comp._x.frameRate,needsVelocity&&(velocity=velocityAtTime(time)),expression_function(),"shape"===scoped_bm_rt.propType?this.v=shape_pool.clone(scoped_bm_rt.v):this.v=scoped_bm_rt,this.frameExpressionId=elem._x.frameId;var t,e;if(this.mult)if("unidimensional"===this.propType)this.v*=this.mult;else if(1===this.v.length)this.v=this.v[0]*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;t<e;t+=1)this.v[t]*=this.mult;if(1===this.v.length&&(this.v=this.v[0]),"unidimensional"===this.propType)this.lastValue!==this.v&&(this.lastValue=this.v,this.mdf=!0);else if("shape"===this.propType)shapesEqual(this.v,this._ak.shapes[0])||(this.mdf=!0,this._ak.releaseShapes(),this._ak.addShape(shape_pool.clone(this.v)));else for(e=this.v.length,t=0;t<e;t+=1)this.v[t]!==this.lastValue[t]&&(this.lastValue[t]=this.v[t],this.mdf=!0);this.lock=!1}}var val=data.x,needsVelocity=/velocity(?![\w\d])/.test(val),_needsRandom=val.indexOf("random")!==-1,elemType=elem.data.ty,transform,content,effect,thisComp=elem.comp,thisProperty=property;elem.comp.frameDuration=1/elem.comp._x.frameRate;var inPoint=elem.data.ip/elem.comp._x.frameRate,outPoint=elem.data.op/elem.comp._x.frameRate,width=elem.data.sw?elem.data.sw:0,height=elem.data.sh?elem.data.sh:0,loopIn,loop_in,loopOut,loop_out,toWorld,fromWorld,fromComp,fromCompToSurface,anchorPoint,thisLayer,thisComp,mask,valueAtTime,velocityAtTime,scoped_bm_rt,expression_function=eval("[function _expression_function(){"+val+";scoped_bm_rt=$bm_rt}]")[0],numKeys=property.kf?data.k.length:0,wiggle=function(t,e){var r,s,i=this.pv.length?this.pv.length:1,a=_cs("float32",i);t=5;var n=Math.floor(time*t);for(r=0,s=0;r<n;){for(s=0;s<i;s+=1)a[s]+=-e+2*e*BMMath.random();r+=1}var o=time*t,h=o-Math.floor(o),l=_cs("float32",i);if(i>1){for(s=0;s<i;s+=1)l[s]=this.pv[s]+a[s]+(-e+2*e*BMMath.random())*h;return l}return this.pv+a[0]+(-e+2*e*BMMath.random())*h}.bind(this);thisProperty.loopIn&&(loopIn=thisProperty.loopIn.bind(thisProperty),loop_in=loopIn),thisProperty.loopOut&&(loopOut=thisProperty.loopOut.bind(thisProperty),loop_out=loopOut);var loopInDuration=function(t,e){return loopIn(t,e,!0)}.bind(this),loopOutDuration=function(t,e){return loopOut(t,e,!0)}.bind(this);this._dg&&(valueAtTime=this._dg.bind(this)),this.getVelocityAtTime&&(velocityAtTime=this.getVelocityAtTime.bind(this));var comp=elem.comp._x.projectInterface.bind(elem.comp._x.projectInterface),time,velocity,value,textIndex,textTotal,selectorValue,index=elem.data.ind,hasParent=!(!elem._dd||!elem._dd.length),parent,randSeed=Math.floor(1e6*Math.random());return executeExpression}var ob={},Math=BMMath,window=null,document=null,add=sum,radians_to_degrees=radiansToDegrees,degrees_to_radians=radiansToDegrees,helperLengthArray=[0,0,0,0,0,0];return ob.initiateExpression=initiateExpression,ob}();!function(){function t(){return this.pv}function e(t,e,r){if(!this.k||!this._df)return this.pv;t=t?t.toLowerCase():"";var s=this.comp.renderedFrame,i=this._df,a=i[i.length-1].t;if(s<=a)return this.pv;var n,o;r?(n=e?Math.abs(a-elem.comp._x.frameRate*e):Math.max(0,a-this.elem.data.ip),o=a-n):((!e||e>i.length-1)&&(e=i.length-1),o=i[i.length-1-e].t,n=a-o);var h,l,p;if("pingpong"===t){var m=Math.floor((s-o)/n);if(m%2!==0)return this._dg((n-(s-o)%n+o)/this.comp._x.frameRate,0)}else{if("offset"===t){var f=this._dg(o/this.comp._x.frameRate,0),c=this._dg(a/this.comp._x.frameRate,0),d=this._dg(((s-o)%n+o)/this.comp._x.frameRate,0),u=Math.floor((s-o)/n);if(this.pv.length){for(p=new Array(f.length),l=p.length,h=0;h<l;h+=1)p[h]=(c[h]-f[h])*u+d[h];return p}return(c-f)*u+d}if("continue"===t){var y=this._dg(a/this.comp._x.frameRate,0),g=this._dg((a-.001)/this.comp._x.frameRate,0);if(this.pv.length){for(p=new Array(y.length),l=p.length,h=0;h<l;h+=1)p[h]=y[h]+(y[h]-g[h])*((s-a)/this.comp._x.frameRate)/5e-4;return p}return y+(y-g)*((s-a)/.001)}}return this._dg(((s-o)%n+o)/this.comp._x.frameRate,0)}function r(t,e,r){if(!this.k)return this.pv;t=t?t.toLowerCase():"";var s=this.comp.renderedFrame,i=this._df,a=i[0].t;if(s>=a)return this.pv;var n,o;r?(n=e?Math.abs(elem.comp._x.frameRate*e):Math.max(0,this.elem.data.op-a),o=a+n):((!e||e>i.length-1)&&(e=i.length-1),o=i[e].t,n=o-a);var h,l,p;if("pingpong"===t){var m=Math.floor((a-s)/n);if(m%2===0)return this._dg(((a-s)%n+a)/this.comp._x.frameRate,0)}else{if("offset"===t){var f=this._dg(a/this.comp._x.frameRate,0),c=this._dg(o/this.comp._x.frameRate,0),d=this._dg((n-(a-s)%n+a)/this.comp._x.frameRate,0),u=Math.floor((a-s)/n)+1;if(this.pv.length){for(p=new Array(f.length),l=p.length,h=0;h<l;h+=1)p[h]=d[h]-(c[h]-f[h])*u;return p}return d-(c-f)*u}if("continue"===t){var y=this._dg(a/this.comp._x.frameRate,0),g=this._dg((a+.001)/this.comp._x.frameRate,0);if(this.pv.length){for(p=new Array(y.length),l=p.length,h=0;h<l;h+=1)p[h]=y[h]+(y[h]-g[h])*(a-s)/.001;return p}return y+(y-g)*(a-s)/.001}}return this._dg((n-(a-s)%n+a)/this.comp._x.frameRate,0)}function s(t){return this._cachingAtTime||(this._cachingAtTime={lastValue:initialDefaultFrame,lastIndex:0}),t!==this._cachingAtTime.lastFrame&&(t*=this.elem._x.frameRate,t-=this.offsetTime,this._cachingAtTime.lastIndex=this._cachingAtTime.lastFrame<t?this._cachingAtTime.lastIndex:0,this._cachingAtTime.value=this.interpolateValue(t,this.pv,this._cachingAtTime),this._cachingAtTime.lastFrame=t),this._cachingAtTime.value}function i(t){if(void 0!==this.vel)return this.vel;var e,r=-.01,s=this._dg(t),i=this._dg(t+r);if(s.length){e=_cs("float32",s.length);var a;for(a=0;a<s.length;a+=1)e[a]=(i[a]-s[a])/r}else e=(i-s)/r;return e}function a(t){this.propertyGroup=t}function n(t,e,r){e.x&&(r.k=!0,r.x=!0,r.getValue&&(r.getPreValue=r.getValue),r.initiateExpression=ExpressionManager.initiateExpression,r.getValue=r.initiateExpression(t,e,r))}function o(t){}function h(t){}function l(t){return this._cachingAtTime||(this._cachingAtTime={shapeValue:shape_pool.clone(this.pv),lastIndex:0,lastTime:initialDefaultFrame}),t!==this._cachingAtTime.lastTime&&(this._cachingAtTime.lastTime=t,t*=this.elem._x.frameRate,this.interpolateShape(t,this._cachingAtTime.shapeValue,!1,this._cachingAtTime)),this._cachingAtTime.shapeValue}function p(){}var m=function(){function e(t,e){return this.textIndex=t+1,this.textTotal=e,this.getValue(),this.v}return function(r,o){this.pv=1,this.comp=r.comp,this.elem=r,this.mult=.01,this.propType="textSelector",this.textTotal=o.totalChars,this.selectorValue=100,this.lastValue=[1,1,1],n.bind(this)(r,o,this),this.getMult=e,this.getVelocityAtTime=i,this.kf?this._dg=s.bind(this):this._dg=t.bind(this),this._ce=a}}(),f=_ag._bj;_ag._bj=function(t,e,r){var s=f(t,e,r);return s._co.length?s._dg=o.bind(s):s._dg=h.bind(s),s._ce=a,s};var c=_ai._bo;_ai._bo=function(o,h,l,p,m){var f=c(o,h,l,p,m);f.kf?f._dg=s.bind(f):f._dg=t.bind(f),f._ce=a,f.loopOut=e,f.loopIn=r,f.getVelocityAtTime=i,f.numKeys=1===h.a?h.k.length:0;var d=f.k;return f.propertyIndex=h.ix,f._cachingAtTime={lastFrame:initialDefaultFrame,lastIndex:0,value:0===l?0:_cs("float32",3)},n(o,h,f),!d&&f.x&&m.push(f),f};var d=_ah.getConstructorFunction(),u=_ah.getKeyframedConstructorFunction();p.prototype={vertices:function(t,e){var r=this.v;void 0!==e&&(r=this._dg(e,0));var s,i=r._length,a=r[t],n=r.v,o=_cv(i);for(s=0;s<i;s+=1)"i"===t||"o"===t?o[s]=[a[s][0]-n[s][0],a[s][1]-n[s][1]]:o[s]=[a[s][0],a[s][1]];return o},points:function(t){return this.vertices("v",t)},inTangents:function(t){return this.vertices("i",t)},outTangents:function(t){return this.vertices("o",t)},isClosed:function(){return this.v.c},pointOnPath:function(t,e){var r=this.v;void 0!==e&&(r=this._dg(e,0)),this._segmentsLength||(this._segmentsLength=bez.getSegmentsLength(r));for(var s=this._segmentsLength,i=s.lengths,a=s.totalLength*t,n=0,o=i.length,h=0;n<o;){if(h+i[n].addedLength>a){var l=n,p=r.c&&n===o-1?0:n+1,m=(a-h)/i[n].addedLength,f=bez.getPointInSegment(r.v[l],r.v[p],r.o[l],r.i[p],m,i[n]);break}h+=i[n].addedLength,n+=1}return f||(f=r.c?[r.v[0][0],r.v[0][1]]:[r.v[r._length-1][0],r.v[r._length-1][1]]),f},vectorOnPath:function(t,e,r){t=1==t?this.v.c?0:.999:t;var s=this.pointOnPath(t,e),i=this.pointOnPath(t+.001,e),a=i[0]-s[0],n=i[1]-s[1],o=Math.sqrt(Math.pow(a,2)+Math.pow(n,2)),h="tangent"===r?[a/o,n/o]:[-n/o,a/o];return h},tangentOnPath:function(t,e){return this.vectorOnPath(t,e,"tangent")},normalOnPath:function(t,e){return this.vectorOnPath(t,e,"normal")},_ce:a,_dg:t},extendPrototype([p],d),extendPrototype([p],u),u.prototype._dg=l,u.prototype.initiateExpression=ExpressionManager.initiateExpression;var y=_ah._bp;_ah._bp=function(t,e,r,s,i){var a=y(t,e,r,s,i),o=a.k;return a.propertyIndex=e.ix,a.lock=!1,3===r?n(t,e.pt,a):4===r&&n(t,e.ks,a),!o&&a.x&&s.push(a),a};var g=TextSelectorProp.getTextSelectorProp;TextSelectorProp.getTextSelectorProp=function(t,e,r){return 1===e.t?new m(t,e,r):g(t,e,r)}}(),function(){function t(){return!!this.data.d.x&&(this.comp=this.elem.comp,this.getValue&&(this.getPreValue=this.getValue),this.calculateExpression=ExpressionManager.initiateExpression.bind(this)(this.elem,this.data.d,this),this.getValue=this.getExpressionValue,!0)}_ar.prototype.searchProperty=function(){return this.kf=this.searchExpressions()||this.data.d.k.length>1,this.kf},_ar.prototype.getExpressionValue=function(t){this.calculateExpression(),this.mdf&&(this.currentData.t=this.v.toString(),this.completeTextData(this.currentData))},_ar.prototype.searchExpressions=t}();var ShapeExpressionInterface=function(){function t(t,e,n){var c,d=[],u=t?t.length:0;for(c=0;c<u;c+=1)"gr"==t[c].ty?d.push(r(t[c],e[c],n)):"fl"==t[c].ty?d.push(s(t[c],e[c],n)):"st"==t[c].ty?d.push(i(t[c],e[c],n)):"tm"==t[c].ty?d.push(a(t[c],e[c],n)):"tr"==t[c].ty||("el"==t[c].ty?d.push(o(t[c],e[c],n)):"sr"==t[c].ty?d.push(h(t[c],e[c],n)):"sh"==t[c].ty?d.push(f(t[c],e[c],n)):"rc"==t[c].ty?d.push(l(t[c],e[c],n)):"rd"==t[c].ty?d.push(p(t[c],e[c],n)):"rp"==t[c].ty&&d.push(m(t[c],e[c],n)));return d}function e(e,r,s){var i,a=function(t){for(var e=0,r=i.length;e<r;){if(i[e]._name===t||i[e].mn===t||i[e].propertyIndex===t||i[e].ix===t||i[e].ind===t)return i[e];e+=1}if("number"==typeof t)return i[t-1]};return a.propertyGroup=function(t){return 1===t?a:s(t-1)},i=t(e.it,r.it,a.propertyGroup),a.numProperties=i.length,a.propertyIndex=e.cix,a}function r(t,r,s){var i=function(t){switch(t){case"ADBE Vectors Group":case"Contents":case 2:return i.content;case"ADBE Vector Transform Group":case 3:default:return i.transform}};i.propertyGroup=function(t){return 1===t?i:s(t-1)};var a=e(t,r,i.propertyGroup),o=n(t.it[t.it.length-1],r.it[r.it.length-1],i.propertyGroup);return i.content=a,i.transform=o,Object.defineProperty(i,"_name",{get:function(){return t.nm}}),i.numProperties=t.np,i.propertyIndex=t.ix,i.nm=t.nm,i.mn=t.mn,i}function s(t,e,r){function s(t){return"Color"===t||"color"===t?s.color:"Opacity"===t||"opacity"===t?s.opacity:void 0}return Object.defineProperties(s,{color:{get:function(){return ExpressionValue(e.c,1/e.c.mult,"color")}},opacity:{get:function(){return ExpressionValue(e.o,100)}},_name:{value:t.nm},mn:{value:t.mn}}),e.c._ce(r),e.o._ce(r),s}function i(t,e,r){function s(t){return 1===t?ob:r(t-1)}function i(t){return 1===t?l:s(t-1)}function a(r){Object.defineProperty(l,t.d[r].nm,{get:function(){return ExpressionValue(e.d.dataProps[r].p)}})}function n(t){return"Color"===t||"color"===t?n.color:"Opacity"===t||"opacity"===t?n.opacity:"Stroke Width"===t||"stroke width"===t?n.strokeWidth:void 0}var o,h=t.d?t.d.length:0,l={};for(o=0;o<h;o+=1)a(o),e.d.dataProps[o].p._ce(i);return Object.defineProperties(n,{color:{get:function(){return ExpressionValue(e.c,1/e.c.mult,"color")}},opacity:{get:function(){return ExpressionValue(e.o,100)}},strokeWidth:{get:function(){return ExpressionValue(e.w)}},dash:{get:function(){return l}},_name:{value:t.nm},mn:{value:t.mn}}),e.c._ce(s),e.o._ce(s),e.w._ce(s),n}function a(t,e,r){function s(t){return 1==t?i:r(--t)}function i(e){return e===t.e.ix||"End"===e||"end"===e?i.end:e===t.s.ix?i.start:e===t.o.ix?i.offset:void 0}return i.propertyIndex=t.ix,e.s._ce(s),e.e._ce(s),e.o._ce(s),i.propertyIndex=t.ix,Object.defineProperties(i,{start:{get:function(){return ExpressionValue(e.s,1/e.s.mult)}},end:{get:function(){return ExpressionValue(e.e,1/e.e.mult)}},offset:{get:function(){return ExpressionValue(e.o)}},_name:{value:t.nm}}),i.mn=t.mn,i}function n(t,e,r){function s(t){return 1==t?i:r(--t)}function i(e){return t.a.ix===e||"Anchor Point"===e?i.anchorPoint:t.o.ix===e||"Opacity"===e?i.opacity:t.p.ix===e||"Position"===e?i.position:t.r.ix===e||"Rotation"===e||"ADBE Vector Rotation"===e?i.rotation:t.s.ix===e||"Scale"===e?i.scale:t.sk&&t.sk.ix===e||"Skew"===e?i.skew:t.sa&&t.sa.ix===e||"Skew Axis"===e?i.skewAxis:void 0}return e.transform.mProps.o._ce(s),e.transform.mProps.p._ce(s),e.transform.mProps.a._ce(s),e.transform.mProps.s._ce(s),e.transform.mProps.r._ce(s),e.transform.mProps.sk&&(e.transform.mProps.sk._ce(s),e.transform.mProps.sa._ce(s)),e.transform.op._ce(s),Object.defineProperties(i,{opacity:{get:function(){return ExpressionValue(e.transform.mProps.o,1/e.transform.mProps.o.mult)}},position:{get:function(){return ExpressionValue(e.transform.mProps.p)}},anchorPoint:{get:function(){return ExpressionValue(e.transform.mProps.a)}},scale:{get:function(){return ExpressionValue(e.transform.mProps.s,1/e.transform.mProps.s.mult)}},rotation:{get:function(){return ExpressionValue(e.transform.mProps.r,1/e.transform.mProps.r.mult)}},skew:{get:function(){return ExpressionValue(e.transform.mProps.sk)}},skewAxis:{get:function(){return ExpressionValue(e.transform.mProps.sa)}},_name:{value:t.nm}}),i.ty="tr",i.mn=t.mn,i}function o(t,e,r){function s(t){return 1==t?i:r(--t)}function i(e){return t.p.ix===e?i.position:t.s.ix===e?i.size:void 0}i.propertyIndex=t.ix;var a="tm"===e.sh.ty?e.sh.prop:e.sh;
+return a.s._ce(s),a.p._ce(s),Object.defineProperties(i,{size:{get:function(){return ExpressionValue(a.s)}},position:{get:function(){return ExpressionValue(a.p)}},_name:{value:t.nm}}),i.mn=t.mn,i}function h(t,e,r){function s(t){return 1==t?i:r(--t)}function i(e){return t.p.ix===e?i.position:t.r.ix===e?i.rotation:t.pt.ix===e?i.points:t.or.ix===e||"ADBE Vector Star Outer Radius"===e?i.outerRadius:t.os.ix===e?i.outerRoundness:!t.ir||t.ir.ix!==e&&"ADBE Vector Star Inner Radius"!==e?t.is&&t.is.ix===e?i.innerRoundness:void 0:i.innerRadius}var a="tm"===e.sh.ty?e.sh.prop:e.sh;return i.propertyIndex=t.ix,a.or._ce(s),a.os._ce(s),a.pt._ce(s),a.p._ce(s),a.r._ce(s),t.ir&&(a.ir._ce(s),a.is._ce(s)),Object.defineProperties(i,{position:{get:function(){return ExpressionValue(a.p)}},rotation:{get:function(){return ExpressionValue(a.r,1/a.r.mult)}},points:{get:function(){return ExpressionValue(a.pt)}},outerRadius:{get:function(){return ExpressionValue(a.or)}},outerRoundness:{get:function(){return ExpressionValue(a.os)}},innerRadius:{get:function(){return a.ir?ExpressionValue(a.ir):0}},innerRoundness:{get:function(){return a.is?ExpressionValue(a.is,1/a.is.mult):0}},_name:{value:t.nm}}),i.mn=t.mn,i}function l(t,e,r){function s(t){return 1==t?i:r(--t)}function i(e){return t.p.ix===e?i.position:t.r.ix===e?i.roundness:t.s.ix===e||"Size"===e||"ADBE Vector Rect Size"===e?i.size:void 0}var a="tm"===e.sh.ty?e.sh.prop:e.sh;return i.propertyIndex=t.ix,a.p._ce(s),a.s._ce(s),a.r._ce(s),Object.defineProperties(i,{position:{get:function(){return ExpressionValue(a.p)}},roundness:{get:function(){return ExpressionValue(a.r)}},size:{get:function(){return ExpressionValue(a.s)}},_name:{value:t.nm}}),i.mn=t.mn,i}function p(t,e,r){function s(t){return 1==t?i:r(--t)}function i(e){if(t.r.ix===e||"Round Corners 1"===e)return i.radius}var a=e;return i.propertyIndex=t.ix,a.rd._ce(s),Object.defineProperties(i,{radius:{get:function(){return ExpressionValue(a.rd)}},_name:{value:t.nm}}),i.mn=t.mn,i}function m(t,e,r){function s(t){return 1==t?i:r(--t)}function i(e){return t.c.ix===e||"Copies"===e?i.copies:t.o.ix===e||"Offset"===e?i.offset:void 0}var a=e;return i.propertyIndex=t.ix,a.c._ce(s),a.o._ce(s),Object.defineProperties(i,{copies:{get:function(){return ExpressionValue(a.c)}},offset:{get:function(){return ExpressionValue(a.o)}},_name:{value:t.nm}}),i.mn=t.mn,i}function f(t,e,r){function s(t){return 1==t?i:r(--t)}function i(t){if("Shape"===t||"shape"===t||"Path"===t||"path"===t||"ADBE Vector Shape"===t||2===t)return i.path}var a=e.sh;return a._ce(s),Object.defineProperties(i,{path:{get:function(){return a.k&&a.getValue(),a}},shape:{get:function(){return a.k&&a.getValue(),a}},_name:{value:t.nm},ix:{value:t.ix},mn:{value:t.mn}}),i}return function(e,r,s){function i(t){if("number"==typeof t)return a[t-1];for(var e=0,r=a.length;e<r;){if(a[e]._name===t)return a[e];e+=1}}var a;return i.propertyGroup=s,a=t(e,r,i),i}}(),TextExpressionInterface=function(){return function(t){function e(){}var r,s;return Object.defineProperty(e,"sourceText",{get:function(){var e=t.textProperty.currentData.t;return t.textProperty.currentData.t!==r&&(t.textProperty.currentData.t=r,s=new String(e),s.value=e?e:new String(e)),s}}),e}}(),LayerExpressionInterface=function(){function t(t,e){var r=new Matrix;r.reset();var s;if(s=e?this._elem.finalTransform.mProp:this._elem.finalTransform.mProp,s.applyToMatrix(r),this._elem._dd&&this._elem._dd.length){var i,a=this._elem._dd.length;for(i=0;i<a;i+=1)this._elem._dd[i].finalTransform.mProp.applyToMatrix(r);return r._cn(t[0],t[1],t[2]||0)}return r._cn(t[0],t[1],t[2]||0)}function e(t,e){var r=new Matrix;r.reset();var s;if(s=e?this._elem.finalTransform.mProp:this._elem.finalTransform.mProp,s.applyToMatrix(r),this._elem._dd&&this._elem._dd.length){var i,a=this._elem._dd.length;for(i=0;i<a;i+=1)this._elem._dd[i].finalTransform.mProp.applyToMatrix(r);return r.inversePoint(t)}return r.inversePoint(t)}function r(t){var e=new Matrix;if(e.reset(),this._elem.finalTransform.mProp.applyToMatrix(e),this._elem._dd&&this._elem._dd.length){var r,s=this._elem._dd.length;for(r=0;r<s;r+=1)this._elem._dd[r].finalTransform.mProp.applyToMatrix(e);return e.inversePoint(t)}return e.inversePoint(t)}return function(s){function i(t){n.mask=new MaskManagerInterface(t,s)}function a(t){n.effect=t}function n(t){switch(t){case"ADBE Root Vectors Group":case"Contents":case 2:return n.shapeInterface;case 1:case 6:case"Transform":case"transform":case"ADBE Transform Group":return o;case 4:case"ADBE Effect Parade":return n.effect}}var o;n.toWorld=t,n.fromWorld=e,n.toComp=t,n.fromComp=r,n.sourceRectAtTime=s.sourceRectAtTime.bind(s),n._elem=s,o=TransformExpressionInterface(s.finalTransform.mProp);var h=getDescriptor(o,"anchorPoint");return Object.defineProperties(n,{hasParent:{get:function(){return s._dd.length}},parent:{get:function(){return s._dd[0].layerInterface}},rotation:getDescriptor(o,"rotation"),scale:getDescriptor(o,"scale"),position:getDescriptor(o,"position"),opacity:getDescriptor(o,"opacity"),anchorPoint:h,anchor_point:h,transform:{get:function(){return o}},active:{get:function(){return s.isInRange}}}),n.startTime=s.data.st,n.index=s.data.ind,n.source=s.data.refId,n.height=0===s.data.ty?s.data.h:100,n.width=0===s.data.ty?s.data.w:100,n.registerMaskInterface=i,n.registerEffectsInterface=a,n}}(),CompExpressionInterface=function(){return function(t){function e(e){for(var r=0,s=t.layers.length;r<s;){if(t.layers[r].nm===e||t.layers[r].ind===e)return t._br[r].layerInterface;r+=1}return{active:!1}}return Object.defineProperty(e,"_name",{value:t.data.nm}),e.layer=e,e.pixelAspect=1,e.height=t._x._de.h,e.width=t._x._de.w,e.pixelAspect=1,e.frameDuration=1/t._x.frameRate,e}}(),TransformExpressionInterface=function(){return function(t){function e(t){switch(t){case"scale":case"Scale":case"ADBE Scale":case 6:return e.scale;case"rotation":case"Rotation":case"ADBE Rotation":case"ADBE Rotate Z":case 10:return e.rotation;case"position":case"Position":case"ADBE Position":case 2:return e.position;case"anchorPoint":case"AnchorPoint":case"Anchor Point":case"ADBE AnchorPoint":case 1:return e.anchorPoint;case"opacity":case"Opacity":case 11:return e.opacity}}return Object.defineProperty(e,"rotation",{get:function(){return t.r?ExpressionValue(t.r,1/degToRads):ExpressionValue(t.rz,1/degToRads)}}),Object.defineProperty(e,"scale",{get:function(){return ExpressionValue(t.s,100)}}),Object.defineProperty(e,"position",{get:function(){return t.p?ExpressionValue(t.p):[t.px.v,t.py.v,t.pz?t.pz.v:0]}}),Object.defineProperty(e,"xPosition",{get:function(){return ExpressionValue(t.px)}}),Object.defineProperty(e,"yPosition",{get:function(){return ExpressionValue(t.py)}}),Object.defineProperty(e,"zPosition",{get:function(){return ExpressionValue(t.pz)}}),Object.defineProperty(e,"anchorPoint",{get:function(){return ExpressionValue(t.a)}}),Object.defineProperty(e,"opacity",{get:function(){return ExpressionValue(t.o,100)}}),Object.defineProperty(e,"skew",{get:function(){return ExpressionValue(t.sk)}}),Object.defineProperty(e,"skewAxis",{get:function(){return ExpressionValue(t.sa)}}),Object.defineProperty(e,"orientation",{get:function(){return ExpressionValue(t.or)}}),e}}(),ProjectInterface=function(){function t(t){this.compositions.push(t)}return function(){function e(t){for(var e=0,r=this.compositions.length;e<r;){if(this.compositions[e].data&&this.compositions[e].data.nm===t)return this.compositions[e]._az&&this.compositions[e]._az(this.compositions[e].data.xt?this.currentFrame:this.compositions[e].renderedFrame),this.compositions[e].compInterface;e+=1}}return e.compositions=[],e.currentFrame=0,e.registerComposition=t,e}}(),EffectsExpressionInterface=function(){function t(t,r){if(t.effects){var s,i=[],a=t.data.ef,n=t.effects._cm.length;for(s=0;s<n;s+=1)i.push(e(a[s],t.effects._cm[s],r,t));return function(e){for(var r=t.data.ef,s=0,a=r.length;s<a;){if(e===r[s].nm||e===r[s].mn||e===r[s].ix)return i[s];s+=1}}}}function e(t,s,i,a){function n(t){return 1===t?p:i(t-1)}var o,h=[],l=t.ef.length;for(o=0;o<l;o+=1)5===t.ef[o].ty?h.push(e(t.ef[o],s._cm[o],s._cm[o].propertyGroup,a)):h.push(r(s._cm[o],t.ef[o].ty,a,n));var p=function(e){for(var r=t.ef,s=0,i=r.length;s<i;){if(e===r[s].nm||e===r[s].mn||e===r[s].ix)return 5===r[s].ty?h[s]:h[s]();s+=1}return h[0]()};return p.propertyGroup=n,"ADBE Color Control"===t.mn&&Object.defineProperty(p,"color",{get:function(){return h[0]()}}),Object.defineProperty(p,"numProperties",{get:function(){return t.np}}),p.active=0!==t.en,p}function r(t,e,r,s){function i(){return 10===e?r.comp.compInterface(t.p.v):ExpressionValue(t.p)}return t.p._ce&&t.p._ce(s),i}var s={createEffectsInterface:t};return s}(),MaskManagerInterface=function(){function t(t,e){this._mask=t,this._data=e}Object.defineProperty(t.prototype,"maskPath",{get:function(){return this._mask.prop.k&&this._mask.prop.getValue(),this._mask.prop}});var e=function(e,r){var s,i=_cv(e.viewData.length),a=e.viewData.length;for(s=0;s<a;s+=1)i[s]=new t(e.viewData[s],e.masksProperties[s]);var n=function(t){for(s=0;s<a;){if(e.masksProperties[s].nm===t)return i[s];s+=1}};return n};return e}(),ExpressionValue=function(){return function(t,e,r){var s;t.k&&t.getValue();var i,a,n;if(r){if("color"===r){for(a=4,s=_cs("float32",a),n=_cs("float32",a),i=0;i<a;i+=1)s[i]=n[i]=e&&i<3?t.v[i]*e:1;s.value=n}}else if("number"==typeof t.v||t.v instanceof Number)s=e?new Number(t.v*e):new Number(t.v),s.value=e?t.v*e:t.v;else{for(a=t.v.length,s=_cs("float32",a),n=_cs("float32",a),i=0;i<a;i+=1)s[i]=n[i]=e?t.v[i]*e:t.v[i];s.value=n}return s.numKeys=t._df?t._df.length:0,s.key=function(e){return s.numKeys?t._df[e-1].t:0},s.valueAtTime=t._dg,s.propertyGroup=t.propertyGroup,s}}();GroupEffect.prototype.getValue=function(){this.mdf=!1;var t,e=this._co.length;for(t=0;t<e;t+=1)this._co[t].getValue(),this.mdf=!!this._co[t].mdf||this.mdf},GroupEffect.prototype.init=function(t,e,r){this.data=t,this.mdf=!1,this._cm=[];var s,i,a=this.data.ef.length,n=this.data.ef;for(s=0;s<a;s+=1)switch(n[s].ty){case 0:i=new SliderEffect(n[s],e,r),this._cm.push(i);break;case 1:i=new AngleEffect(n[s],e,r),this._cm.push(i);break;case 2:i=new ColorEffect(n[s],e,r),this._cm.push(i);break;case 3:i=new PointEffect(n[s],e,r),this._cm.push(i);break;case 4:case 7:i=new CheckboxEffect(n[s],e,r),this._cm.push(i);break;case 10:i=new LayerIndexEffect(n[s],e,r),this._cm.push(i);break;case 11:i=new MaskIndexEffect(n[s],e,r),this._cm.push(i);break;case 5:i=new EffectsManager(n[s],e,r),this._cm.push(i);break;case 6:default:i=new NoValueEffect(n[s],e,r),this._cm.push(i)}};var lottiejs={};lottiejs.play=play,lottiejs.pause=pause,lottiejs.setLocationHref=setLocationHref,lottiejs.togglePause=togglePause,lottiejs.setSpeed=setSpeed,lottiejs.setDirection=setDirection,lottiejs.stop=stop,lottiejs.moveFrame=moveFrame,lottiejs.searchAnimations=searchAnimations,lottiejs.registerAnimation=registerAnimation,lottiejs.loadAnimation=loadAnimation,lottiejs.setSubframeRendering=setSubframeRendering,lottiejs.resize=resize,lottiejs.goToAndStop=goToAndStop,lottiejs.destroy=destroy,lottiejs.setQuality=setQuality,lottiejs.inBrowser=inBrowser,lottiejs.installPlugin=installPlugin,lottiejs.__getFactory=getFactory,lottiejs.version="5.0.6";var standalone="__[STANDALONE]__",animationData="__[ANIMATIONDATA]__",renderer="";if(standalone){var scripts=document.getElementsByTagName("script"),index=scripts.length-1,myScript=scripts[index]||{src:""},queryString=myScript.src.replace(/^[^\?]+\??/,"");renderer=getQueryVariable("renderer")}var readyStateCheckInterval=setInterval(checkReady,100);return lottiejs});
\ No newline at end of file
diff --git a/build/player/lottie_light.js b/build/player/lottie_light.js
index 0203434..77d31ac 100644
--- a/build/player/lottie_light.js
+++ b/build/player/lottie_light.js
@@ -47,7 +47,7 @@
 BMMath.abs = function(val){
     var tOfVal = typeof val;
     if(tOfVal === 'object' && val.length){
-        var absArr = Array.apply(null,{length:val.length});
+        var absArr = _cv(val.length);
         var i, len = val.length;
         for(i=0;i<len;i+=1){
             absArr[i] = Math.abs(val[i]);
@@ -103,7 +103,7 @@
 
 function BMSegmentStartEvent(n,f,t){
     this.type = n;
-    this.firstFrame = f;
+    this._ch = f;
     this.totalFrames = t;
 }
 
@@ -112,48 +112,6 @@
     this.target = t;
 }
 
-function _addEventListener(eventName, callback){
-
-    if (!this._cbs[eventName]){
-        this._cbs[eventName] = [];
-    }
-    this._cbs[eventName].push(callback);
-
-	return function() {
-		this.removeEventListener(eventName, callback);
-	}.bind(this);
-}
-
-function _removeEventListener(eventName,callback){
-
-    if (!callback){
-        this._cbs[eventName] = null;
-    }else if(this._cbs[eventName]){
-        var i = 0, len = this._cbs[eventName].length;
-        while(i<len){
-            if(this._cbs[eventName][i] === callback){
-                this._cbs[eventName].splice(i,1);
-                i -=1;
-                len -= 1;
-            }
-            i += 1;
-        }
-        if(!this._cbs[eventName].length){
-            this._cbs[eventName] = null;
-        }
-    }
-
-}
-
-function _triggerEvent(eventName, args){
-    if (this._cbs[eventName]) {
-        var len = this._cbs[eventName].length;
-        for (var i = 0; i < len; i++){
-            this._cbs[eventName][i](args);
-        }
-    }
-}
-
 function randomString(length, chars){
     if(chars === undefined){
         chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890';
@@ -269,7 +227,46 @@
         return '#' + colorMap[r] + colorMap[g] + colorMap[b];
     };
 }());
-var createTypedArray = (function(){
+function BaseEvent(){}
+BaseEvent.prototype = {
+	_cy: function (eventName, args) {
+	    if (this._cbs[eventName]) {
+	        var len = this._cbs[eventName].length;
+	        for (var i = 0; i < len; i++){
+	            this._cbs[eventName][i](args);
+	        }
+	    }
+	},
+	addEventListener: function (eventName, callback) {
+	    if (!this._cbs[eventName]){
+	        this._cbs[eventName] = [];
+	    }
+	    this._cbs[eventName].push(callback);
+
+		return function() {
+			this.removeEventListener(eventName, callback);
+		}.bind(this);
+	},
+	removeEventListener: function (eventName,callback){
+	    if (!callback){
+	        this._cbs[eventName] = null;
+	    }else if(this._cbs[eventName]){
+	        var i = 0, len = this._cbs[eventName].length;
+	        while(i<len){
+	            if(this._cbs[eventName][i] === callback){
+	                this._cbs[eventName].splice(i,1);
+	                i -=1;
+	                len -= 1;
+	            }
+	            i += 1;
+	        }
+	        if(!this._cbs[eventName].length){
+	            this._cbs[eventName] = null;
+	        }
+	    }
+	}
+}
+var _cs = (function(){
 	function createRegularArray(type, len){
 		var i = 0, arr = [], value;
 		switch(type) {
@@ -286,7 +283,7 @@
 		}
 		return arr;
 	}
-	function createTypedArray(type, len){
+	function _cs(type, len){
 		if(type === 'float32') {
 			return new Float32Array(len);
 		} else if(type === 'int16') {
@@ -296,16 +293,20 @@
 		}
 	}
 	if(typeof Uint8ClampedArray === 'function' && typeof Float32Array === 'function') {
-		return createTypedArray
+		return _cs
 	} else {
 		return createRegularArray
 	}
 }())
-function createNS(type) {
+
+function _cv(len) {
+	return Array.apply(null,{length:len})
+}
+function _ct(type) {
 	//return {appendChild:function(){},setAttribute:function(){},style:{}}
 	return document.createElementNS(svgNS, type);
 }
-function createTag(type) {
+function _cu(type) {
 	//return {appendChild:function(){},setAttribute:function(){},style:{}}
 	return document.createElement(type);
 }
@@ -612,7 +613,7 @@
         return retPts;
     }
 
-    function applyToPointArray(x,y,z,dimensions){
+    function _cn(x,y,z,dimensions){
         if(dimensions && dimensions === 2) {
             var arr = point_pool.newElement();
             arr[0] = x * this.props[0] + y * this.props[4] + z * this.props[8] + this.props[12]; 
@@ -672,7 +673,7 @@
         this.applyToX = applyToX;
         this.applyToY = applyToY;
         this.applyToZ = applyToZ;
-        this.applyToPointArray = applyToPointArray;
+        this._cn = _cn;
         this.applyToPointStringified = applyToPointStringified;
         this.toCSS = toCSS;
         this.to2dCSS = to2dCSS;
@@ -686,7 +687,7 @@
         this._identity = true;
         this._identityCalculated = false;
 
-        this.props = createTypedArray('float32', 16);
+        this.props = _cs('float32', 16);
         this.reset();
     }
 }());
@@ -1239,7 +1240,7 @@
             var bezierData = new BezierData(curveSegments);
             len = pt3.length;
             for (k = 0; k < curveSegments; k += 1) {
-                point = Array.apply(null,{length:len});
+                point = _cv(len);
                 perc = k / (curveSegments - 1);
                 ptDistance = 0;
                 for (i = 0; i < len; i += 1){
@@ -1304,7 +1305,7 @@
 
     }
 
-    var bezier_segment_points = createTypedArray('float32', 8);
+    var bezier_segment_points = _cs('float32', 8);
 
     function getNewSegment(pt1,pt2,pt3,pt4,startPerc,endPerc, bezierData){
 
@@ -1367,9 +1368,9 @@
 var bez = bezFunction();
 function dataFunctionManager(){
 
-    //var tCanvasHelper = createTag('canvas').getContext('2d');
+    //var tCanvasHelper = _cu('canvas').getContext('2d');
 
-    function completeLayers(layers, comps, fontManager){
+    function _db(layers, comps, _cr){
         var layerData;
         var animArray, lastFrame;
         var i, len = layers.length;
@@ -1406,11 +1407,11 @@
             }
             if(layerData.ty===0){
                 layerData.layers = findCompLayers(layerData.refId, comps);
-                completeLayers(layerData.layers,comps, fontManager);
+                _db(layerData.layers,comps, _cr);
             }else if(layerData.ty === 4){
                 completeShapes(layerData.shapes);
             }else if(layerData.ty == 5){
-                completeText(layerData, fontManager);
+                completeText(layerData, _cr);
             }
         }
     }
@@ -1755,7 +1756,7 @@
         }
     }
 
-    function blitText(data, fontManager){
+    function blitText(data, _cr){
 
     }
 
@@ -1794,7 +1795,7 @@
         }
     }
 
-    function blitLayers(layers,comps, fontManager){
+    function blitLayers(layers,comps, _cr){
         var layerData;
         var animArray, lastFrame;
         var i, len = layers.length;
@@ -1834,11 +1835,11 @@
             if(layerData.ty===0){
                 layerData.w = Math.round(layerData.w/blitter);
                 layerData.h = Math.round(layerData.h/blitter);
-                blitLayers(layerData.layers,comps, fontManager);
+                blitLayers(layerData.layers,comps, _cr);
             }else if(layerData.ty === 4){
                 blitShapes(layerData.shapes);
             }else if(layerData.ty == 5){
-                blitText(layerData, fontManager);
+                blitText(layerData, _cr);
             }else if(layerData.ty == 1){
                 layerData.sh /= blitter;
                 layerData.sw /= blitter;
@@ -1847,11 +1848,11 @@
         }
     }
 
-    function blitAnimation(animationData,comps, fontManager){
-        blitLayers(animationData.layers,comps, fontManager);
+    function blitAnimation(animationData,comps, _cr){
+        blitLayers(animationData.layers,comps, _cr);
     }*/
 
-    function completeData(animationData, fontManager){
+    function completeData(animationData, _cr){
         if(animationData.__complete){
             return;
         }
@@ -1859,12 +1860,12 @@
         checkText(animationData);
         checkChars(animationData);
         checkShapes(animationData);
-        completeLayers(animationData.layers, animationData.assets, fontManager);
+        _db(animationData.layers, animationData.assets, _cr);
         animationData.__complete = true;
-        //blitAnimation(animationData, animationData.assets, fontManager);
+        //blitAnimation(animationData, animationData.assets, _cr);
     }
 
-    function completeText(data, fontManager){
+    function completeText(data, _cr){
         if(data.t.a.length === 0 && !('m' in data.t.p)){
             data.singleShape = true;
         }
@@ -1887,9 +1888,9 @@
     }
 
     function setUpNode(font, family){
-        var parentNode = createTag('span');
+        var parentNode = _cu('span');
         parentNode.style.fontFamily    = family;
-        var node = createTag('span');
+        var node = _cu('span');
         // Characters that vary significantly among different fonts
         node.innerHTML = 'giItT1WQy@!-/#';
         // Visible - so we can measure it - but not on the screen
@@ -1966,7 +1967,7 @@
     };
 
     function createHelper(def, fontData){
-        var tHelper = createNS('text');
+        var tHelper = _ct('text');
         tHelper.style.fontSize = '100px';
         tHelper.style.fontFamily = fontData.fFamily;
         tHelper.textContent = '1';
@@ -1977,7 +1978,7 @@
             tHelper.style.fontFamily = fontData.fFamily;
         }
         def.appendChild(tHelper);
-        var tCanvasHelper = createTag('canvas').getContext('2d');
+        var tCanvasHelper = _cu('canvas').getContext('2d');
         tCanvasHelper.font = '100px '+ fontData.fFamily;
         return tCanvasHelper;
     }
@@ -2002,20 +2003,20 @@
             if(!fontArr[i].fPath) {
                 fontArr[i].loaded = true;
             }else if(fontArr[i].fOrigin === 'p' || fontArr[i].origin === 3){
-                var s = createTag('style');
+                var s = _cu('style');
                 s.type = "text/css";
                 s.innerHTML = "@font-face {" + "font-family: "+fontArr[i].fFamily+"; font-style: normal; src: url('"+fontArr[i].fPath+"');}";
                 defs.appendChild(s);
             } else if(fontArr[i].fOrigin === 'g' || fontArr[i].origin === 1){
                 //<link href='https://fonts.googleapis.com/css?family=Montserrat' rel='stylesheet' type='text/css'>
-                var l = createTag('link');
+                var l = _cu('link');
                 l.type = "text/css";
                 l.rel = "stylesheet";
                 l.href = fontArr[i].fPath;
                 defs.appendChild(l);
             } else if(fontArr[i].fOrigin === 't' || fontArr[i].origin === 2){
                 //<link href='https://fonts.googleapis.com/css?family=Montserrat' rel='stylesheet' type='text/css'>
-                var sc = createTag('script');
+                var sc = _cu('script');
                 sc.setAttribute('src',fontArr[i].fPath);
                 defs.appendChild(sc);
             }
@@ -2107,16 +2108,16 @@
         var offsetTime = this.offsetTime;
         var newValue;
         if(this.propType === 'multidimensional') {
-            newValue = createTypedArray('float32', previousValue.length);
+            newValue = _cs('float32', previousValue.length);
         }
         var iterationIndex = caching.lastIndex;
         var i = iterationIndex;
-        var len = this.keyframes.length- 1,flag = true;
+        var len = this._df.length- 1,flag = true;
         var keyData, nextKeyData;
 
         while(flag){
-            keyData = this.keyframes[i];
-            nextKeyData = this.keyframes[i+1];
+            keyData = this._df[i];
+            nextKeyData = this._df[i+1];
             if(i == len-1 && frameNum >= nextKeyData.t - offsetTime){
                 if(keyData.h){
                     keyData = nextKeyData;
@@ -2281,8 +2282,8 @@
         }
         this.mdf = false;
         var frameNum = this.comp.renderedFrame - this.offsetTime;
-        var initTime = this.keyframes[0].t - this.offsetTime;
-        var endTime = this.keyframes[this.keyframes.length- 1].t-this.offsetTime;
+        var initTime = this._df[0].t - this.offsetTime;
+        var endTime = this._df[this._df.length- 1].t-this.offsetTime;
         if(!(frameNum === this._caching.lastFrame || (this._caching.lastFrame !== initFrame && ((this._caching.lastFrame >= endTime && frameNum >= endTime) || (this._caching.lastFrame < initTime && frameNum < initTime))))){
             this._caching.lastIndex = this._caching.lastFrame < frameNum ? this._caching.lastIndex : 0;
             var renderResult = this.interpolateValue(frameNum, this.pv, this._caching);
@@ -2316,11 +2317,11 @@
         this.k = false;
         this.kf = false;
         this.frameId = -1;
-        this.v = createTypedArray('float32', data.k.length);
-        this.pv = createTypedArray('float32', data.k.length);
-        this.lastValue = createTypedArray('float32', data.k.length);
-        var arr = createTypedArray('float32', data.k.length);
-        this.vel = createTypedArray('float32', data.k.length);
+        this.v = _cs('float32', data.k.length);
+        this.pv = _cs('float32', data.k.length);
+        this.lastValue = _cs('float32', data.k.length);
+        var arr = _cs('float32', data.k.length);
+        this.vel = _cs('float32', data.k.length);
         var i, len = data.k.length;
         for(i = 0;i<len;i+=1){
             this.v[i] = mult ? data.k[i] * mult : data.k[i];
@@ -2331,7 +2332,7 @@
 
     function KeyframedValueProperty(elem, data, mult){
         this.propType = 'unidimensional';
-        this.keyframes = data.k;
+        this._df = data.k;
         this.offsetTime = elem.data.st;
         this.lastValue = initFrame;
         this.lastPValue = initFrame;
@@ -2342,7 +2343,7 @@
         this.data = data;
         this.mult = mult;
         this.elem = elem;
-        this.firstFrame = false;
+        this._ch = false;
         this.comp = elem.comp;
         this.v = mult ? data.k[0].s[0]*mult : data.k[0].s[0];
         this.pv = data.k[0].s[0];
@@ -2373,11 +2374,11 @@
                 }
             }
         }
-        this.keyframes = data.k;
+        this._df = data.k;
         this.offsetTime = elem.data.st;
         this.k = true;
         this.kf = true;
-        this.firstFrame = true;
+        this._ch = true;
         this.mult = mult;
         this.elem = elem;
         this.comp = elem.comp;
@@ -2386,11 +2387,11 @@
         this.interpolateValue = interpolateValue;
         this.frameId = -1;
         var arrLen = data.k[0].s.length;
-        this.v = createTypedArray('float32', arrLen);
-        this.pv = createTypedArray('float32', arrLen);
-        this.lastValue = createTypedArray('float32', arrLen);
-        this.lastPValue = createTypedArray('float32', arrLen);
-        this._caching={lastFrame:initFrame,lastIndex:0,value:createTypedArray('float32', arrLen)};
+        this.v = _cs('float32', arrLen);
+        this.pv = _cs('float32', arrLen);
+        this.lastValue = _cs('float32', arrLen);
+        this.lastPValue = _cs('float32', arrLen);
+        this._caching={lastFrame:initFrame,lastIndex:0,value:_cs('float32', arrLen)};
     }
 
     function _bo(elem,data,type, mult, arr) {
@@ -2435,10 +2436,10 @@
 var _ag = (function() {
 
     function applyToMatrix(mat) {
-        var i, len = this.dynamicProperties.length;
+        var i, len = this._co.length;
         for(i = 0; i < len; i += 1) {
-            this.dynamicProperties[i].getValue();
-            if (this.dynamicProperties[i].mdf) {
+            this._co[i].getValue();
+            if (this._co[i].mdf) {
                 this.mdf = true;
             }
         }
@@ -2463,17 +2464,17 @@
             mat.translate(this.p.v[0], this.p.v[1], -this.p.v[2]);
         }
     }
-    function processKeys(firstFrame){
+    function processKeys(_ch){
         if (this.elem._x.frameId === this.frameId) {
             return;
         }
 
-        this.mdf = firstFrame;
-        var i, len = this.dynamicProperties.length;
+        this.mdf = _ch;
+        var i, len = this._co.length;
 
         for(i = 0; i < len; i += 1) {
-            this.dynamicProperties[i].getValue();
-            if (this.dynamicProperties[i].mdf) {
+            this._co[i].getValue();
+            if (this._co[i].mdf) {
                 this.mdf = true;
             }
         }
@@ -2494,17 +2495,17 @@
             } else {
                 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]);
             }
-            if (this.autoOriented && this.p.keyframes && this.p.getValueAtTime) {
+            if (this.autoOriented && this.p._df && this.p._dg) {
                 var v1,v2;
-                if (this.p._caching.lastFrame+this.p.offsetTime <= this.p.keyframes[0].t) {
-                    v1 = this.p.getValueAtTime((this.p.keyframes[0].t + 0.01) / this.elem._x.frameRate,0);
-                    v2 = this.p.getValueAtTime(this.p.keyframes[0].t / this.elem._x.frameRate, 0);
-                } else if(this.p._caching.lastFrame+this.p.offsetTime >= this.p.keyframes[this.p.keyframes.length - 1].t) {
-                    v1 = this.p.getValueAtTime((this.p.keyframes[this.p.keyframes.length - 1].t / this.elem._x.frameRate), 0);
-                    v2 = this.p.getValueAtTime((this.p.keyframes[this.p.keyframes.length - 1].t - 0.01) / this.elem._x.frameRate, 0);
+                if (this.p._caching.lastFrame+this.p.offsetTime <= this.p._df[0].t) {
+                    v1 = this.p._dg((this.p._df[0].t + 0.01) / this.elem._x.frameRate,0);
+                    v2 = this.p._dg(this.p._df[0].t / this.elem._x.frameRate, 0);
+                } else if(this.p._caching.lastFrame+this.p.offsetTime >= this.p._df[this.p._df.length - 1].t) {
+                    v1 = this.p._dg((this.p._df[this.p._df.length - 1].t / this.elem._x.frameRate), 0);
+                    v2 = this.p._dg((this.p._df[this.p._df.length - 1].t - 0.01) / this.elem._x.frameRate, 0);
                 } else {
                     v1 = this.p.pv;
-                    v2 = this.p.getValueAtTime((this.p._caching.lastFrame+this.p.offsetTime - 0.01) / this.elem._x.frameRate, this.p.offsetTime);
+                    v2 = this.p._dg((this.p._caching.lastFrame+this.p.offsetTime - 0.01) / this.elem._x.frameRate, this.p.offsetTime);
                 }
                 this.v.rotate(-Math.atan2(v1[1] - v2[1], v1[0] - v2[0]));
             }
@@ -2546,59 +2547,59 @@
 
     function autoOrient(){
         //
-        //var prevP = this.getValueAtTime();
+        //var prevP = this._dg();
     }
 
     function _bk(elem,data,arr){
         this.elem = elem;
         this.frameId = -1;
         this.propType = 'transform';
-        this.dynamicProperties = [];
+        this._co = [];
         this.mdf = false;
         this.data = data;
         this.v = new Matrix();
         if(data.p.s){
-            this.px = _ai._bo(elem,data.p.x,0,0,this.dynamicProperties);
-            this.py = _ai._bo(elem,data.p.y,0,0,this.dynamicProperties);
+            this.px = _ai._bo(elem,data.p.x,0,0,this._co);
+            this.py = _ai._bo(elem,data.p.y,0,0,this._co);
             if(data.p.z){
-                this.pz = _ai._bo(elem,data.p.z,0,0,this.dynamicProperties);
+                this.pz = _ai._bo(elem,data.p.z,0,0,this._co);
             }
         }else{
-            this.p = _ai._bo(elem,data.p,1,0,this.dynamicProperties);
+            this.p = _ai._bo(elem,data.p,1,0,this._co);
         }
         if(data.r) {
-            this.r = _ai._bo(elem, data.r, 0, degToRads, this.dynamicProperties);
+            this.r = _ai._bo(elem, data.r, 0, degToRads, this._co);
         } else if(data.rx) {
-            this.rx = _ai._bo(elem, data.rx, 0, degToRads, this.dynamicProperties);
-            this.ry = _ai._bo(elem, data.ry, 0, degToRads, this.dynamicProperties);
-            this.rz = _ai._bo(elem, data.rz, 0, degToRads, this.dynamicProperties);
+            this.rx = _ai._bo(elem, data.rx, 0, degToRads, this._co);
+            this.ry = _ai._bo(elem, data.ry, 0, degToRads, this._co);
+            this.rz = _ai._bo(elem, data.rz, 0, degToRads, this._co);
             if(data.or.k[0].ti) {
                 var i, len = data.or.k.length;
                 for(i=0;i<len;i+=1) {
                     data.or.k[i].to = data.or.k[i].ti = null;
                 }
             }
-            this.or = _ai._bo(elem, data.or, 1, degToRads, this.dynamicProperties);
+            this.or = _ai._bo(elem, data.or, 1, degToRads, this._co);
             //sh Indicates it needs to be capped between -180 and 180
             this.or.sh = true;
         }
         if(data.sk){
-            this.sk = _ai._bo(elem, data.sk, 0, degToRads, this.dynamicProperties);
-            this.sa = _ai._bo(elem, data.sa, 0, degToRads, this.dynamicProperties);
+            this.sk = _ai._bo(elem, data.sk, 0, degToRads, this._co);
+            this.sa = _ai._bo(elem, data.sa, 0, degToRads, this._co);
         }
         if(data.a) {
-            this.a = _ai._bo(elem,data.a,1,0,this.dynamicProperties);
+            this.a = _ai._bo(elem,data.a,1,0,this._co);
         }
         if(data.s) {
-            this.s = _ai._bo(elem,data.s,1,0.01,this.dynamicProperties);
+            this.s = _ai._bo(elem,data.s,1,0.01,this._co);
         }
-        // Opacity is not part of the transform properties, that's why it won't use this.dynamicProperties. That way transforms won't get updated if opacity changes.
+        // Opacity is not part of the transform properties, that's why it won't use this._co. That way transforms won't get updated if opacity changes.
         if(data.o){
             this.o = _ai._bo(elem,data.o,0,0.01,arr);
         } else {
             this.o = {mdf:false,v:1};
         }
-        if(this.dynamicProperties.length){
+        if(this._co.length){
             arr.push(this);
         }else{
             this.getValue(true);
@@ -2623,9 +2624,9 @@
 	this.c = false;
 	this._length = 0;
 	this._maxLength = 8;
-	this.v = Array.apply(null,{length:this._maxLength});
-	this.o = Array.apply(null,{length:this._maxLength});
-	this.i = Array.apply(null,{length:this._maxLength});
+	this.v = _cv(this._maxLength);
+	this.o = _cv(this._maxLength);
+	this.i = _cv(this._maxLength);
 };
 
 _av.prototype.setPathData = function(closed, len) {
@@ -2648,9 +2649,9 @@
 }
 
 _av.prototype.doubleArrayLength = function() {
-	this.v = this.v.concat(Array.apply(null,{length:this._maxLength}))
-	this.i = this.i.concat(Array.apply(null,{length:this._maxLength}))
-	this.o = this.o.concat(Array.apply(null,{length:this._maxLength}))
+	this.v = this.v.concat(_cv(this._maxLength))
+	this.i = this.i.concat(_cv(this._maxLength))
+	this.o = this.o.concat(_cv(this._maxLength))
 	this._maxLength *= 2;
 };
 
@@ -2709,23 +2710,23 @@
     function interpolateShape(frameNum, previousValue, isCurrentRender, caching) {
         var iterationIndex = caching.lastIndex;
         var keyPropS,keyPropE,isHold;
-        if(frameNum < this.keyframes[0].t-this.offsetTime){
-            keyPropS = this.keyframes[0].s[0];
+        if(frameNum < this._df[0].t-this.offsetTime){
+            keyPropS = this._df[0].s[0];
             isHold = true;
             iterationIndex = 0;
-        }else if(frameNum >= this.keyframes[this.keyframes.length - 1].t-this.offsetTime){
-            if(this.keyframes[this.keyframes.length - 2].h === 1){
-                keyPropS = this.keyframes[this.keyframes.length - 1].s[0];
+        }else if(frameNum >= this._df[this._df.length - 1].t-this.offsetTime){
+            if(this._df[this._df.length - 2].h === 1){
+                keyPropS = this._df[this._df.length - 1].s[0];
             }else{
-                keyPropS = this.keyframes[this.keyframes.length - 2].e[0];
+                keyPropS = this._df[this._df.length - 2].e[0];
             }
             isHold = true;
         }else{
             var i = iterationIndex;
-            var len = this.keyframes.length- 1,flag = true,keyData,nextKeyData, j, jLen, k, kLen;
+            var len = this._df.length- 1,flag = true,keyData,nextKeyData, j, jLen, k, kLen;
             while(flag){
-                keyData = this.keyframes[i];
-                nextKeyData = this.keyframes[i+1];
+                keyData = this._df[i];
+                nextKeyData = this._df[i+1];
                 if((nextKeyData.t - this.offsetTime) > frameNum){
                     break;
                 }
@@ -2807,8 +2808,8 @@
         }
         this.mdf = false;
         var frameNum = this.comp.renderedFrame - this.offsetTime;
-        var initTime = this.keyframes[0].t - this.offsetTime;
-        var endTime = this.keyframes[this.keyframes.length - 1].t - this.offsetTime;
+        var initTime = this._df[0].t - this.offsetTime;
+        var endTime = this._df[this._df.length - 1].t - this.offsetTime;
         var lastFrame = this._caching.lastFrame;
         if(!(lastFrame !== initFrame && ((lastFrame < initTime && frameNum < initTime) || (lastFrame > endTime && frameNum > endTime)))){
             ////
@@ -2856,13 +2857,13 @@
         this.comp = elem.comp;
         this.elem = elem;
         this.offsetTime = elem.data.st;
-        this.keyframes = type === 3 ? data.pt.k : data.ks.k;
+        this._df = type === 3 ? data.pt.k : data.ks.k;
         this.k = true;
         this.kf = true;
-        var i, len = this.keyframes[0].s[0].i.length;
-        var jLen = this.keyframes[0].s[0].i[0].length;
+        var i, len = this._df[0].s[0].i.length;
+        var jLen = this._df[0].s[0].i[0].length;
         this.v = shape_pool.newElement();
-        this.v.setPathData(this.keyframes[0].s[0].c, len);
+        this.v.setPathData(this._df[0].s[0].c, len);
         this.pv = shape_pool.clone(this.v);
         this._ak = shapeCollection_pool._al();
         this.paths = this._ak;
@@ -2911,7 +2912,7 @@
         }
 
         function processKeys(frameNum){
-            var i, len = this.dynamicProperties.length;
+            var i, len = this._co.length;
             if(this.elem._x.frameId === this.frameId){
                 return;
             }
@@ -2919,8 +2920,8 @@
             this.frameId = this.elem._x.frameId;
 
             for(i=0;i<len;i+=1){
-                this.dynamicProperties[i].getValue(frameNum);
-                if(this.dynamicProperties[i].mdf){
+                this._co[i].getValue(frameNum);
+                if(this._co[i].mdf){
                     this.mdf = true;
                 }
             }
@@ -2931,9 +2932,9 @@
 
         return function EllShapeProperty(elem,data) {
             /*this.v = {
-                v: Array.apply(null,{length:4}),
-                i: Array.apply(null,{length:4}),
-                o: Array.apply(null,{length:4}),
+                v: _cv(4),
+                i: _cv(4),
+                o: _cv(4),
                 c: true
             };*/
             this.v = shape_pool.newElement();
@@ -2942,7 +2943,7 @@
             this.paths = this._ak;
             this._ak.addShape(this.v);
             this.d = data.d;
-            this.dynamicProperties = [];
+            this._co = [];
             this.elem = elem;
             this.comp = elem.comp;
             this.frameId = -1;
@@ -2950,9 +2951,9 @@
             this.getValue = processKeys;
             this.convertEllToPath = convertEllToPath;
             this.reset = resetShape;
-            this.p = _ai._bo(elem,data.p,1,0,this.dynamicProperties);
-            this.s = _ai._bo(elem,data.s,1,0,this.dynamicProperties);
-            if(this.dynamicProperties.length){
+            this.p = _ai._bo(elem,data.p,1,0,this._co);
+            this.s = _ai._bo(elem,data.s,1,0,this._co);
+            if(this._co.length){
                 this.k = true;
             }else{
                 this.convertEllToPath();
@@ -3036,11 +3037,11 @@
             }
             this.mdf = false;
             this.frameId = this.elem._x.frameId;
-            var i, len = this.dynamicProperties.length;
+            var i, len = this._co.length;
 
             for(i=0;i<len;i+=1){
-                this.dynamicProperties[i].getValue();
-                if(this.dynamicProperties[i].mdf){
+                this._co[i].getValue();
+                if(this._co[i].mdf){
                     this.mdf = true;
                 }
             }
@@ -3063,26 +3064,26 @@
             this.data = data;
             this.frameId = -1;
             this.d = data.d;
-            this.dynamicProperties = [];
+            this._co = [];
             this.mdf = false;
             this.getValue = processKeys;
             this.reset = resetShape;
             if(data.sy === 1){
-                this.ir = _ai._bo(elem,data.ir,0,0,this.dynamicProperties);
-                this.is = _ai._bo(elem,data.is,0,0.01,this.dynamicProperties);
+                this.ir = _ai._bo(elem,data.ir,0,0,this._co);
+                this.is = _ai._bo(elem,data.is,0,0.01,this._co);
                 this.convertToPath = convertStarToPath;
             } else {
                 this.convertToPath = convertPolygonToPath;
             }
-            this.pt = _ai._bo(elem,data.pt,0,0,this.dynamicProperties);
-            this.p = _ai._bo(elem,data.p,1,0,this.dynamicProperties);
-            this.r = _ai._bo(elem,data.r,0,degToRads,this.dynamicProperties);
-            this.or = _ai._bo(elem,data.or,0,0,this.dynamicProperties);
-            this.os = _ai._bo(elem,data.os,0,0.01,this.dynamicProperties);
+            this.pt = _ai._bo(elem,data.pt,0,0,this._co);
+            this.p = _ai._bo(elem,data.p,1,0,this._co);
+            this.r = _ai._bo(elem,data.r,0,degToRads,this._co);
+            this.or = _ai._bo(elem,data.or,0,0,this._co);
+            this.os = _ai._bo(elem,data.os,0,0.01,this._co);
             this._ak = shapeCollection_pool._al();
             this._ak.addShape(this.v);
             this.paths = this._ak;
-            if(this.dynamicProperties.length){
+            if(this._co.length){
                 this.k = true;
             }else{
                 this.convertToPath();
@@ -3097,11 +3098,11 @@
             }
             this.mdf = false;
             this.frameId = this.elem._x.frameId;
-            var i, len = this.dynamicProperties.length;
+            var i, len = this._co.length;
 
             for(i=0;i<len;i+=1){
-                this.dynamicProperties[i].getValue(frameNum);
-                if(this.dynamicProperties[i].mdf){
+                this._co[i].getValue(frameNum);
+                if(this._co[i].mdf){
                     this.mdf = true;
                 }
             }
@@ -3160,15 +3161,15 @@
             this.comp = elem.comp;
             this.frameId = -1;
             this.d = data.d;
-            this.dynamicProperties = [];
+            this._co = [];
             this.mdf = false;
             this.getValue = processKeys;
             this.convertRectToPath = convertRectToPath;
             this.reset = resetShape;
-            this.p = _ai._bo(elem,data.p,1,0,this.dynamicProperties);
-            this.s = _ai._bo(elem,data.s,1,0,this.dynamicProperties);
-            this.r = _ai._bo(elem,data.r,0,0,this.dynamicProperties);
-            if(this.dynamicProperties.length){
+            this.p = _ai._bo(elem,data.p,1,0,this._co);
+            this.s = _ai._bo(elem,data.s,1,0,this._co);
+            this.r = _ai._bo(elem,data.r,0,0,this._co);
+            if(this._co.length){
                 this.k = true;
             }else{
                 this.convertRectToPath();
@@ -3225,8 +3226,8 @@
         }
     }
 
-    function getModifier(nm,elem, data, dynamicProperties){
-        return new modifiers[nm](elem, data, dynamicProperties);
+    function getModifier(nm,elem, data, _co){
+        return new modifiers[nm](elem, data, _co);
     }
 
     return ob;
@@ -3242,8 +3243,8 @@
         this.addShapeToModifier(shapeData);
     }
 }
-_at.prototype.init = function(elem,data,dynamicProperties){
-    this.dynamicProperties = [];
+_at.prototype.init = function(elem,data,_co){
+    this._co = [];
     this.shapes = [];
     this.elem = elem;
     this.initModifierProperties(elem,data);
@@ -3251,9 +3252,9 @@
     this.mdf = false;
     this.closed = false;
     this.k = false;
-    if(this.dynamicProperties.length){
+    if(this._co.length){
         this.k = true;
-        dynamicProperties.push(this);
+        _co.push(this);
     }else{
         this.getValue(true);
     }
@@ -3267,11 +3268,11 @@
     }
     this.mdf = forceRender;
     this.frameId = this.elem._x.frameId;
-    var i, len = this.dynamicProperties.length;
+    var i, len = this._co.length;
 
     for (i = 0; i < len; i +=1) {
-        this.dynamicProperties[i].getValue();
-        if (this.dynamicProperties[i].mdf) {
+        this._co[i].getValue();
+        if (this._co[i].mdf) {
             this.mdf = true;
         }
     }
@@ -3296,9 +3297,9 @@
     }
 }
 _an.prototype.initModifierProperties = function(elem, data) {
-    this.s = _ai._bo(elem, data.s, 0, 0.01, this.dynamicProperties);
-    this.e = _ai._bo(elem, data.e, 0, 0.01, this.dynamicProperties);
-    this.o = _ai._bo(elem, data.o, 0, 0, this.dynamicProperties);
+    this.s = _ai._bo(elem, data.s, 0, 0.01, this._co);
+    this.e = _ai._bo(elem, data.e, 0, 0.01, this._co);
+    this.o = _ai._bo(elem, data.o, 0, 0, this._co);
     this.sValue = 0;
     this.eValue = 0;
     this.oValue = 0;
@@ -3368,7 +3369,7 @@
     return pathsData;
 }
 
-_an.prototype.processShapes = function(firstFrame) {
+_an.prototype.processShapes = function(_ch) {
     var shapePaths;
     var i, len = this.shapes.length;
     var j, jLen;
@@ -3387,7 +3388,7 @@
         for (i = 0; i < len; i += 1) {
             shapeData = this.shapes[i];
             // if shape hasn't changed and trim properties haven't changed, cached previous path can be used
-            if (!shapeData.shape.mdf && !this.mdf && !firstFrame && this.m !== 2) {
+            if (!shapeData.shape.mdf && !this.mdf && !_ch && this.m !== 2) {
                 shapeData.shape.paths = shapeData._ak;
             } else {
                 shapePaths = shapeData.shape.paths;
@@ -3473,7 +3474,7 @@
             this.shapes[i].shape.mdf = true;
         }
     }
-    if (!this.dynamicProperties.length) {
+    if (!this._co.length) {
         this.mdf = false;
     }
 }
@@ -3598,18 +3599,18 @@
     }
     this.mdf = forceRender ? true : false;
     this.frameId = this.elem._x.frameId;
-    var i, len = this.dynamicProperties.length;
+    var i, len = this._co.length;
 
     for(i=0;i<len;i+=1){
-        this.dynamicProperties[i].getValue();
-        if(this.dynamicProperties[i].mdf){
+        this._co[i].getValue();
+        if(this._co[i].mdf){
             this.mdf = true;
         }
     }
 }
 _au.prototype.initModifierProperties = function(elem,data){
     this.getValue = this.processKeys;
-    this.rd = _ai._bo(elem,data.r,0,null,this.dynamicProperties);
+    this.rd = _ai._bo(elem,data.r,0,null,this._co);
 };
 
 _au.prototype.processPath = function(path, round){
@@ -3666,7 +3667,7 @@
     return cloned_path;
 }
 
-_au.prototype.processShapes = function(firstFrame){
+_au.prototype.processShapes = function(_ch){
     var shapePaths;
     var i, len = this.shapes.length;
     var j, jLen;
@@ -3678,7 +3679,7 @@
             shapeData = this.shapes[i];
             newPaths = shapeData.shape.paths;
             _ak = shapeData._ak;
-            if(!(!shapeData.shape.mdf && !this.mdf && !firstFrame)){
+            if(!(!shapeData.shape.mdf && !this.mdf && !_ch)){
                 _ak.releaseShapes();
                 shapeData.shape.mdf = true;
                 shapePaths = shapeData.shape.paths.shapes;
@@ -3691,7 +3692,7 @@
         }
 
     }
-    if(!this.dynamicProperties.length){
+    if(!this._co.length){
         this.mdf = false;
     }
 }
@@ -3704,11 +3705,11 @@
         return;
     }
     this.mdf = forceRender ? true : false;
-    var i, len = this.dynamicProperties.length;
+    var i, len = this._co.length;
 
     for(i=0;i<len;i+=1){
-        this.dynamicProperties[i].getValue();
-        if(this.dynamicProperties[i].mdf){
+        this._co[i].getValue();
+        if(this._co[i].mdf){
             this.mdf = true;
         }
     }
@@ -3716,11 +3717,11 @@
 
 _aj.prototype.initModifierProperties = function(elem,data){
     this.getValue = this.processKeys;
-    this.c = _ai._bo(elem,data.c,0,null,this.dynamicProperties);
-    this.o = _ai._bo(elem,data.o,0,null,this.dynamicProperties);
-    this.tr = _ag._bj(elem,data.tr,this.dynamicProperties);
+    this.c = _ai._bo(elem,data.c,0,null,this._co);
+    this.o = _ai._bo(elem,data.o,0,null,this._co);
+    this.tr = _ag._bj(elem,data.tr,this._co);
     this.data = data;
-    if(!this.dynamicProperties.length){
+    if(!this._co.length){
         this.getValue(true);
     }
     this.pMatrix = new Matrix();
@@ -3743,7 +3744,7 @@
     sMatrix.translate(transform.a.v[0], transform.a.v[1], transform.a.v[2]);
 }
 
-_aj.prototype.init = function(elem, arr, pos, elemsData, dynamicProperties) {
+_aj.prototype.init = function(elem, arr, pos, elemsData, _co) {
     this.elem = elem;
     this.arr = arr;
     this.pos = pos;
@@ -3751,7 +3752,7 @@
     this._currentCopies = 0;
     this._bq = [];
     this._groups = [];
-    this.dynamicProperties = [];
+    this._co = [];
     this.frameId = -1;
     this.initModifierProperties(elem,arr[pos]);
     var cont = 0;
@@ -3761,9 +3762,9 @@
         this._bq.unshift(arr[pos]);
         cont += 1;
     }
-    if(this.dynamicProperties.length){
+    if(this._co.length){
         this.k = true;
-        dynamicProperties.push(this);
+        _co.push(this);
     }else{
         this.getValue(true);
     }
@@ -3796,13 +3797,13 @@
     }
 }
 
-_aj.prototype.processShapes = function(firstFrame){
+_aj.prototype.processShapes = function(_ch){
 
     if(this.elem._x.frameId === this.frameId){
         return;
     }
     this.frameId = this.elem._x.frameId;
-    if(!this.dynamicProperties.length && !firstFrame){
+    if(!this._co.length && !_ch){
         this.mdf = false;
     }
     if(this.mdf){
@@ -3830,7 +3831,7 @@
         }
         
         this._currentCopies = copies;
-        this.elem.firstFrame = true;
+        this.elem._ch = true;
         ////
 
         var offset = this.o.v;
@@ -3907,12 +3908,12 @@
 function _am(){
 	this._length = 0;
 	this._maxLength = 4;
-	this.shapes = Array.apply(null,{length:this._maxLength});
+	this.shapes = _cv(this._maxLength);
 };
 
 _am.prototype.addShape = function(shapeData){
 	if(this._length === this._maxLength){
-		this.shapes = this.shapes.concat(Array.apply(null,{length:this._maxLength}));
+		this.shapes = this.shapes.concat(_cv(this._maxLength));
 		this._maxLength *= 2;
 	}
 	this.shapes[this._length] = shapeData;
@@ -3926,24 +3927,24 @@
 	}
 	this._length = 0;
 };
-function DashProperty(elem, data, renderer, dynamicProperties) {
+function DashProperty(elem, data, renderer, _co) {
     this.elem = elem;
     this.frameId = -1;
-    this.dataProps = Array.apply(null,{length:data.length});
+    this.dataProps = _cv(data.length);
     this.renderer = renderer;
     this.mdf = false;
     this.k = false;
     this.dashStr = '';
-    this.dashArray = createTypedArray('float32',  data.length - 1);
-    this.dashoffset = createTypedArray('float32',  1);
+    this.dashArray = _cs('float32',  data.length - 1);
+    this.dashoffset = _cs('float32',  1);
     var i, len = data.length, prop;
     for(i=0;i<len;i+=1){
-        prop = _ai._bo(elem,data[i].v,0, 0, dynamicProperties);
+        prop = _ai._bo(elem,data[i].v,0, 0, _co);
         this.k = prop.k ? true : this.k;
         this.dataProps[i] = {n:data[i].n,p:prop};
     }
     if(this.k){
-        dynamicProperties.push(this);
+        _co.push(this);
     }else{
         this.getValue(true);
     }
@@ -3984,9 +3985,9 @@
     this.prop = _ai._bo(elem,data.k,1,null,[]);
     this.data = data;
     this.k = this.prop.k;
-    this.c = createTypedArray('uint8c', data.p*4);
+    this.c = _cs('uint8c', data.p*4);
     var cLength = data.k.k[0].s ? (data.k.k[0].s.length - data.p*4) : data.k.k.length - data.p*4;
-    this.o = createTypedArray('float32', cLength);
+    this.o = _cs('float32', cLength);
     this.cmdf = false;
     this.omdf = false;
     this._collapsable = this.checkCollapsable();
@@ -4083,7 +4084,7 @@
     }
 
     function loadImage(path){
-        var img = createTag('img');
+        var img = _cu('img');
         img.addEventListener('load', imageLoaded.bind(this), false);
         img.addEventListener('error', imageLoaded.bind(this), false);
         img.src = path;
@@ -4140,7 +4141,7 @@
 	ob.createAlphaToLuminanceFilter = createAlphaToLuminanceFilter;
 
 	function createFilter(filId){
-        	var fil = createNS('filter');
+        	var fil = _ct('filter');
         	fil.setAttribute('id',filId);
                 fil.setAttribute('filterUnits','objectBoundingBox');
                 fil.setAttribute('x','0%');
@@ -4151,7 +4152,7 @@
 	}
 
 	function createAlphaToLuminanceFilter(){
-                var feColorMatrix = createNS('feColorMatrix');
+                var feColorMatrix = _ct('feColorMatrix');
                 feColorMatrix.setAttribute('type','matrix');
                 feColorMatrix.setAttribute('color-interpolation-filters','sRGB');
                 feColorMatrix.setAttribute('values','0 0 0 1 0  0 0 0 1 0  0 0 0 1 0  0 0 0 1 1');
@@ -4162,14 +4163,14 @@
 }())
 function _bl(textData, renderType, elem){
     this.mdf = false;
-    this._firstFrame = true;
+    this._ch = true;
 	this._hasMaskedPath = false;
 	this._frameId = -1;
-	this._dynamicProperties = [];
+	this.__co = [];
 	this._textData = textData;
 	this._renderType = renderType;
 	this._elem = elem;
-	this._animatorsData = Array.apply(null,{length:this._textData.a.length});
+	this._animatorsData = _cv(this._textData.a.length);
 	this._pathData = {}
 	this._moreOptions = {
 		alignment: {}
@@ -4179,17 +4180,17 @@
 
 }
 
-_bl.prototype.searchProperties = function(dynamicProperties){
+_bl.prototype.searchProperties = function(_co){
     var i, len = this._textData.a.length, animatorProps;
     var _bo = _ai._bo;
     for(i=0;i<len;i+=1){
         animatorProps = this._textData.a[i];
-        this._animatorsData[i] = new TextAnimatorDataProperty(this._elem, animatorProps, this._dynamicProperties);
+        this._animatorsData[i] = new TextAnimatorDataProperty(this._elem, animatorProps, this.__co);
     }
     if(this._textData.p && 'm' in this._textData.p){
         this._pathData = {
-            f: _bo(this._elem,this._textData.p.f,0,0,this._dynamicProperties),
-            l: _bo(this._elem,this._textData.p.l,0,0,this._dynamicProperties),
+            f: _bo(this._elem,this._textData.p.f,0,0,this.__co),
+            l: _bo(this._elem,this._textData.p.l,0,0,this.__co),
             r: this._textData.p.r,
             m: this._elem.maskManager.getMaskProperty(this._textData.p.m)
         };
@@ -4197,18 +4198,18 @@
     } else {
         this._hasMaskedPath = false;
     }
-    this._moreOptions.alignment = _bo(this._elem,this._textData.m.a,1,0,this._dynamicProperties);
-    if(this._dynamicProperties.length) {
-    	dynamicProperties.push(this);
+    this._moreOptions.alignment = _bo(this._elem,this._textData.m.a,1,0,this.__co);
+    if(this.__co.length) {
+    	_co.push(this);
     }
 }
 
 _bl.prototype.getMeasures = function(documentData, lettersChangedFlag){
     this.lettersChangedFlag = lettersChangedFlag;
-    if(!this.mdf && !this._firstFrame && !lettersChangedFlag && (!this._hasMaskedPath || !this._pathData.m.mdf)) {
+    if(!this.mdf && !this._ch && !lettersChangedFlag && (!this._hasMaskedPath || !this._pathData.m.mdf)) {
         return;
     }
-    this._firstFrame = false;
+    this._ch = false;
     var alignment = this._moreOptions.alignment.v;
     var animators = this._animatorsData;
     var textData = this._textData;
@@ -4674,40 +4675,40 @@
         return;
     }
     this._frameId = this._elem._x.frameId;
-	var i, len = this._dynamicProperties.length;
+	var i, len = this.__co.length;
     this.mdf = false;
 	for(i = 0; i < len; i += 1) {
-		this._dynamicProperties[i].getValue();
-        this.mdf = this._dynamicProperties[i].mdf || this.mdf;
+		this.__co[i].getValue();
+        this.mdf = this.__co[i].mdf || this.mdf;
 	}
 }
 
 _bl.prototype.mHelper = new Matrix();
 _bl.prototype.defaultPropsArray = [];
-function TextAnimatorDataProperty(elem, animatorProps, dynamicProperties) {
+function TextAnimatorDataProperty(elem, animatorProps, _co) {
 	var defaultData = {propType:false};
 	var _bo = _ai._bo;
 	var _bn = animatorProps.a;
 	this.a = {
-		r: _bn.r ? _bo(elem, _bn.r, 0, degToRads, dynamicProperties) : defaultData,
-		rx: _bn.rx ? _bo(elem, _bn.rx, 0, degToRads, dynamicProperties) : defaultData,
-		ry: _bn.ry ? _bo(elem, _bn.ry, 0, degToRads, dynamicProperties) : defaultData,
-		sk: _bn.sk ? _bo(elem, _bn.sk, 0, degToRads, dynamicProperties) : defaultData,
-		sa: _bn.sa ? _bo(elem, _bn.sa, 0, degToRads, dynamicProperties) : defaultData,
-		s: _bn.s ? _bo(elem, _bn.s, 1, 0.01, dynamicProperties) : defaultData,
-		a: _bn.a ? _bo(elem, _bn.a, 1, 0, dynamicProperties) : defaultData,
-		o: _bn.o ? _bo(elem, _bn.o, 0, 0.01, dynamicProperties) : defaultData,
-		p: _bn.p ? _bo(elem,_bn.p, 1, 0, dynamicProperties) : defaultData,
-		sw: _bn.sw ? _bo(elem, _bn.sw, 0, 0, dynamicProperties) : defaultData,
-		sc: _bn.sc ? _bo(elem, _bn.sc, 1, 0, dynamicProperties) : defaultData,
-		fc: _bn.fc ? _bo(elem, _bn.fc, 1, 0, dynamicProperties) : defaultData,
-		fh: _bn.fh ? _bo(elem, _bn.fh, 0, 0, dynamicProperties) : defaultData,
-		fs: _bn.fs ? _bo(elem, _bn.fs, 0, 0.01, dynamicProperties) : defaultData,
-		fb: _bn.fb ? _bo(elem, _bn.fb, 0, 0.01, dynamicProperties) : defaultData,
-		t: _bn.t ? _bo(elem, _bn.t, 0, 0, dynamicProperties) : defaultData
+		r: _bn.r ? _bo(elem, _bn.r, 0, degToRads, _co) : defaultData,
+		rx: _bn.rx ? _bo(elem, _bn.rx, 0, degToRads, _co) : defaultData,
+		ry: _bn.ry ? _bo(elem, _bn.ry, 0, degToRads, _co) : defaultData,
+		sk: _bn.sk ? _bo(elem, _bn.sk, 0, degToRads, _co) : defaultData,
+		sa: _bn.sa ? _bo(elem, _bn.sa, 0, degToRads, _co) : defaultData,
+		s: _bn.s ? _bo(elem, _bn.s, 1, 0.01, _co) : defaultData,
+		a: _bn.a ? _bo(elem, _bn.a, 1, 0, _co) : defaultData,
+		o: _bn.o ? _bo(elem, _bn.o, 0, 0.01, _co) : defaultData,
+		p: _bn.p ? _bo(elem,_bn.p, 1, 0, _co) : defaultData,
+		sw: _bn.sw ? _bo(elem, _bn.sw, 0, 0, _co) : defaultData,
+		sc: _bn.sc ? _bo(elem, _bn.sc, 1, 0, _co) : defaultData,
+		fc: _bn.fc ? _bo(elem, _bn.fc, 1, 0, _co) : defaultData,
+		fh: _bn.fh ? _bo(elem, _bn.fh, 0, 0, _co) : defaultData,
+		fs: _bn.fs ? _bo(elem, _bn.fs, 0, 0.01, _co) : defaultData,
+		fb: _bn.fb ? _bo(elem, _bn.fb, 0, 0.01, _co) : defaultData,
+		t: _bn.t ? _bo(elem, _bn.t, 0, 0, _co) : defaultData
 	}
 
-	this.s = TextSelectorProp.getTextSelectorProp(elem,animatorProps.s, dynamicProperties);
+	this.s = TextSelectorProp.getTextSelectorProp(elem,animatorProps.s, _co);
     this.s.t = animatorProps.s.t;
 }
 function LetterProps(o, sw, sc, fc, m, p){
@@ -4768,12 +4769,12 @@
 	}
 	return updated;
 }
-function _ar(elem, data, dynamicProperties){
+function _ar(elem, data, _co){
 	this._frameId = initialDefaultFrame;
 	this.pv = '';
 	this.v = '';
 	this.kf = false;
-	this.firstFrame = true;
+	this._ch = true;
 	this.mdf = true;
 	this.data = data;
 	this.elem = elem;
@@ -4807,7 +4808,7 @@
 
 	}
 	if(this.searchProperty()) {
-		dynamicProperties.push(this);
+		_co.push(this);
 	} else {
 		this.getValue(true);
 	}
@@ -4850,7 +4851,7 @@
 _ar.prototype.getValue = function() {
 	this.mdf = false;
 	var frameId = this.elem._x.frameId;
-	if((frameId === this._frameId || !this.kf) && !this.firstFrame) {
+	if((frameId === this._frameId || !this.kf) && !this._ch) {
 		return;
 	}
 	var textKeys = this.data.d.k, textDocumentData;
@@ -4867,7 +4868,7 @@
             this.completeTextData(textDocumentData);
         }
         this.setCurrentData(textDocumentData);
-        this.mdf = this.firstFrame ? false : true;
+        this.mdf = this._ch ? false : true;
         this.pv = this.v = this.currentData.t;
         this.keysIndex = i;
     }
@@ -4876,7 +4877,7 @@
 
 _ar.prototype.completeTextData = function(documentData) {
     documentData.__complete = true;
-    var fontManager = this.elem._x.fontManager;
+    var _cr = this.elem._x._cr;
     var data = this.data;
     var letters = [];
     var i, len;
@@ -4886,7 +4887,7 @@
     var lineWidth = 0;
     var maxLineWidth = 0;
     var j, jLen;
-    var fontData = fontManager.getFontByName(documentData.f);
+    var fontData = _cr.getFontByName(documentData.f);
     var charData, cLength = 0;
     var styles = fontData.fStyle.split(' ');
 
@@ -4932,12 +4933,12 @@
                 lineWidth = 0;
                 newLineFlag = true;
             }
-            if(fontManager.chars){
-                charData = fontManager.getCharData(documentData.t.charAt(i), fontData.fStyle, fontData.fFamily);
+            if(_cr.chars){
+                charData = _cr.getCharData(documentData.t.charAt(i), fontData.fStyle, fontData.fFamily);
                 cLength = newLineFlag ? 0 : charData.w*documentData.s/100;
             }else{
                 //tCanvasHelper.font = documentData.s + 'px '+ fontData.fFamily;
-                cLength = fontManager.measureText(documentData.t.charAt(i), documentData.f, documentData.s);
+                cLength = _cr.measureText(documentData.t.charAt(i), documentData.f, documentData.s);
             }
             if(lineWidth + cLength > boxWidth && documentData.t.charAt(i) !== ' '){
                 if(lastSpaceIndex === -1){
@@ -4975,13 +4976,13 @@
         }else{
             val = documentData.t.charAt(i);
         }
-        if(fontManager.chars){
-            charData = fontManager.getCharData(currentChar, fontData.fStyle, fontManager.getFontByName(documentData.f).fFamily);
+        if(_cr.chars){
+            charData = _cr.getCharData(currentChar, fontData.fStyle, _cr.getFontByName(documentData.f).fFamily);
             cLength = newLineFlag ? 0 : charData.w*documentData.s/100;
         }else{
-            //var charWidth = fontManager.measureText(val, documentData.f, documentData.s);
-            //tCanvasHelper.font = documentData.s + 'px '+ fontManager.getFontByName(documentData.f).fFamily;
-            cLength = fontManager.measureText(val, documentData.f, documentData.s);
+            //var charWidth = _cr.measureText(val, documentData.f, documentData.s);
+            //tCanvasHelper.font = documentData.s + 'px '+ _cr.getFontByName(documentData.f).fFamily;
+            cLength = _cr.measureText(val, documentData.f, documentData.s);
         }
 
         //
@@ -5099,7 +5100,7 @@
     dData.__complete = false;
     dData.t = newData.t;
     this.keysIndex = -1;
-    this.firstFrame = true;
+    this._ch = true;
     this.getValue();
 }
 
@@ -5109,11 +5110,11 @@
     var floor = Math.floor;
     function updateRange(newCharsFlag){
         this.mdf = newCharsFlag || false;
-        if(this.dynamicProperties.length){
-            var i, len = this.dynamicProperties.length;
+        if(this._co.length){
+            var i, len = this._co.length;
             for(i=0;i<len;i+=1){
-                this.dynamicProperties[i].getValue();
-                if(this.dynamicProperties[i].mdf){
+                this._co[i].getValue();
+                if(this._co[i].mdf){
                     this.mdf = true;
                 }
             }
@@ -5211,24 +5212,24 @@
         this.mdf = false;
         this.k = false;
         this.data = data;
-        this.dynamicProperties = [];
+        this._co = [];
         this.getValue = updateRange;
         this.getMult = getMult;
         this.elem = elem;
         this.comp = elem.comp;
         this.finalS = 0;
         this.finalE = 0;
-        this.s = _ai._bo(elem,data.s || {k:0},0,0,this.dynamicProperties);
+        this.s = _ai._bo(elem,data.s || {k:0},0,0,this._co);
         if('e' in data){
-            this.e = _ai._bo(elem,data.e,0,0,this.dynamicProperties);
+            this.e = _ai._bo(elem,data.e,0,0,this._co);
         }else{
             this.e = {v:100};
         }
-        this.o = _ai._bo(elem,data.o || {k:0},0,0,this.dynamicProperties);
-        this.xe = _ai._bo(elem,data.xe || {k:0},0,0,this.dynamicProperties);
-        this.ne = _ai._bo(elem,data.ne || {k:0},0,0,this.dynamicProperties);
-        this.a = _ai._bo(elem,data.a,0,0.01,this.dynamicProperties);
-        if(this.dynamicProperties.length){
+        this.o = _ai._bo(elem,data.o || {k:0},0,0,this._co);
+        this.xe = _ai._bo(elem,data.xe || {k:0},0,0,this._co);
+        this.ne = _ai._bo(elem,data.ne || {k:0},0,0,this._co);
+        this.a = _ai._bo(elem,data.a,0,0.01,this._co);
+        if(this._co.length){
             arr.push(this);
         }else{
             this.getValue();
@@ -5250,7 +5251,7 @@
 
 		var _length = 0;
 		var _maxLength = initialLength;
-		var pool = Array.apply(null, {length: _maxLength});
+		var pool = _cv(_maxLength);
 
 		var ob = {
 			newElement: newElement,
@@ -5293,7 +5294,7 @@
 var pooling = (function(){
 
 	function double(arr){
-		return arr.concat(Array.apply(null,{length:arr.length}))
+		return arr.concat(_cv(arr.length));
 	}
 
 	return {
@@ -5303,7 +5304,7 @@
 var point_pool = (function(){
 
 	function create() {
-		return createTypedArray('float32', 2);
+		return _cs('float32', 2);
 	}
 	return pool_factory(8, create);
 }());
@@ -5353,7 +5354,7 @@
 
 	var _length = 0;
 	var _maxLength = 4;
-	var pool = Array.apply(null,{length:_maxLength});
+	var pool = _cv(_maxLength);
 
 	function _al(){
 		var shapeCollection;
@@ -5407,8 +5408,8 @@
 	function create() {
 		return {
             addedLength: 0,
-            percents: createTypedArray('float32', defaultCurveSegments),
-            lengths: createTypedArray('float32', defaultCurveSegments),
+            percents: _cs('float32', defaultCurveSegments),
+            lengths: _cs('float32', defaultCurveSegments),
         };
 	}
 	return pool_factory(8, create);
@@ -5416,7 +5417,7 @@
 function _l(){}
 _l.prototype.checkLayers = function(num){
     var i, len = this.layers.length, data;
-    this.completeLayers = true;
+    this._db = true;
     for (i = len - 1; i >= 0; i--) {
         if (!this._br[i]) {
             data = this.layers[i];
@@ -5425,7 +5426,7 @@
                 this.buildItem(i);
             }
         }
-        this.completeLayers = this._br[i] ? this.completeLayers:false;
+        this._db = this._br[i] ? this._db:false;
     }
     this.checkPendingElements();
 };
@@ -5465,7 +5466,7 @@
 };
 
 _l.prototype.includeLayers = function(newLayers){
-    this.completeLayers = false;
+    this._db = false;
     var i, len = newLayers.length;
     var j, jLen = this.layers.length;
     for(i=0;i<len;i+=1){
@@ -5489,7 +5490,7 @@
         this.buildAllItems();
     }
 };
-_l.prototype.buildElementParenting = function(element, parentName, hierarchy) {
+_l.prototype.buildElementParenting = function(element, parentName, _dd) {
     var _br = this._br;
     var layers = this.layers;
     var i=0, len = layers.length;
@@ -5499,13 +5500,13 @@
                 this.buildItem(i);
                 this.addPendingElement(element);
             } else if(layers[i].parent !== undefined) {
-                hierarchy.push(_br[i]);
+                _dd.push(_br[i]);
                 _br[i]._isParent = true;
-                this.buildElementParenting(element, layers[i].parent, hierarchy);
+                this.buildElementParenting(element, layers[i].parent, _dd);
             } else {
-                hierarchy.push(_br[i]);
+                _dd.push(_br[i]);
                 _br[i]._isParent = true;
-                element.setHierarchy(hierarchy);
+                element.setHierarchy(_dd);
             }
         }
         i += 1;
@@ -5513,17 +5514,17 @@
 };
 
 _l.prototype.addPendingElement = function(element){
-    this.pendingElements.push(element);
+    this._dc.push(element);
 };
-function _ao(animationItem, config){
-    this.animationItem = animationItem;
+function _ao(_cq, config){
+    this._cq = _cq;
     this.layers = null;
     this.renderedFrame = -1;
-    this._cf = createNS('svg');
-    var maskElement = createNS('g');
+    this._cf = _ct('svg');
+    var maskElement = _ct('g');
     this._cf.appendChild(maskElement);
     this._bx = maskElement;
-    var defs = createNS( 'defs');
+    var defs = _ct( 'defs');
     this._cf.appendChild(defs);
     this.renderConfig = {
         preserveAspectRatio: (config && config.preserveAspectRatio) || 'xMidYMid meet',
@@ -5538,12 +5539,12 @@
         frameNum: -1,
         defs: defs,
         frameId: 0,
-        compSize: {w:0,h:0},
+        _de: {w:0,h:0},
         renderConfig: this.renderConfig,
-        fontManager: new FontManager()
+        _cr: new FontManager()
     };
     this._br = [];
-    this.pendingElements = [];
+    this._dc = [];
     this.destroyed = false;
 
 }
@@ -5559,11 +5560,11 @@
 };
 
 _ao.prototype.createShape = function (data) {
-    return new _f(data,this._x,this);
+    return new SVGShapeElement(data,this._x,this);
 };
 
 _ao.prototype.createText = function (data) {
-    return new SVGTextElement(data,this._x,this);
+    return new _cw(data,this._x,this);
 
 };
 
@@ -5600,21 +5601,21 @@
     this._cf.setAttribute('preserveAspectRatio',this.renderConfig.preserveAspectRatio);
     //this._bx.style.transform = 'translate3d(0,0,0)';
     //this._bx.style.transformOrigin = this._bx.style.mozTransformOrigin = this._bx.style.webkitTransformOrigin = this._bx.style['-webkit-transform'] = "0px 0px 0px";
-    this.animationItem.wrapper.appendChild(this._cf);
+    this._cq.wrapper.appendChild(this._cf);
     //Mask animation
     var defs = this._x.defs;
 
-    this._x.getAssetData = this.animationItem.getAssetData.bind(this.animationItem);
-    this._x.getAssetsPath = this.animationItem.getAssetsPath.bind(this.animationItem);
+    this._x.getAssetData = this._cq.getAssetData.bind(this._cq);
+    this._x.getAssetsPath = this._cq.getAssetsPath.bind(this._cq);
     this._x.progressiveLoad = this.renderConfig.progressiveLoad;
     this._x.nm = animData.nm;
-    this._x.compSize.w = animData.w;
-    this._x.compSize.h = animData.h;
+    this._x._de.w = animData.w;
+    this._x._de.h = animData.h;
     this._x.frameRate = animData.fr;
     this.data = animData;
 
-    var maskElement = createNS( 'clipPath');
-    var rect = createNS('rect');
+    var maskElement = _ct( 'clipPath');
+    var rect = _ct('rect');
     rect.setAttribute('width',animData.w);
     rect.setAttribute('height',animData.h);
     rect.setAttribute('x',0);
@@ -5626,14 +5627,14 @@
 
     defs.appendChild(maskElement);
     this.layers = animData.layers;
-    this._x.fontManager.addChars(animData.chars);
-    this._x.fontManager.addFonts(animData.fonts,defs);
-    this._br = Array.apply(null,{length:animData.layers.length});
+    this._x._cr.addChars(animData.chars);
+    this._x._cr.addFonts(animData.fonts,defs);
+    this._br = _cv(animData.layers.length);
 };
 
 
 _ao.prototype.destroy = function () {
-    this.animationItem.wrapper.innerHTML = '';
+    this._cq.wrapper.innerHTML = '';
     this._bx = null;
     this._x.defs = null;
     var i, len = this.layers ? this.layers.length : 0;
@@ -5644,7 +5645,7 @@
     }
     this._br.length = 0;
     this.destroyed = true;
-    this.animationItem = null;
+    this._cq = null;
 };
 
 _ao.prototype.updateContainerSize = function () {
@@ -5677,8 +5678,8 @@
 };
 
 _ao.prototype.checkPendingElements  = function(){
-    while(this.pendingElements.length){
-        var element = this.pendingElements.pop();
+    while(this._dc.length){
+        var element = this._dc.pop();
         element.checkParenting();
         if(element.data.tt){
             var i = 0, len = this._br.length;
@@ -5709,16 +5710,16 @@
     this._x.frameId += 1;
     this._x.projectInterface.currentFrame = num;
     var i, len = this.layers.length;
-    if(!this.completeLayers){
+    if(!this._db){
         this.checkLayers(num);
     }
     for (i = len - 1; i >= 0; i--) {
-        if(this.completeLayers || this._br[i]){
+        if(this._db || this._br[i]){
             this._br[i]._az(num - this.layers[i].st);
         }
     }
     for (i = 0; i < len; i += 1) {
-        if(this.completeLayers || this._br[i]){
+        if(this._db || this._br[i]){
             this._br[i]._ba();
         }
     }
@@ -5754,7 +5755,7 @@
 
 _ao.prototype.searchExtraCompositions = function(assets){
     var i, len = assets.length;
-    var floatingContainer = createNS('g');
+    var floatingContainer = _ct('g');
     for(i=0;i<len;i+=1){
         if(assets[i].xt){
             var comp = this.createComp(assets[i],floatingContainer,this._x.comp,null);
@@ -5766,660 +5767,19 @@
     }
 };
 
-function _aq(animationItem, config){
-    this.animationItem = animationItem;
-    this.renderConfig = {
-        clearCanvas: (config && config.clearCanvas !== undefined) ? config.clearCanvas : true,
-        context: (config && config.context) || null,
-        progressiveLoad: (config && config.progressiveLoad) || false,
-        preserveAspectRatio: (config && config.preserveAspectRatio) || 'xMidYMid meet',
-        className: (config && config.className) || ''
-    };
-    this.renderConfig.dpr = (config && config.dpr) || 1;
-    if (this.animationItem.wrapper) {
-        this.renderConfig.dpr = (config && config.dpr) || window.devicePixelRatio || 1;
-    }
-    //TODO remove this when fixed
-    // this.renderConfig.dpr = 1;
-    this.renderedFrame = -1;
-    this._x = {
-        frameNum: -1,
-        mdf: false,
-        renderConfig: this.renderConfig
-    };
-    var i, len = 15;
-    this.contextData = new _n();
-    this._br = [];
-    this.pendingElements = [];
-    this.transformMat = new Matrix();
-    this.completeLayers = false;
-}
-extendPrototype([_l],_aq);
-
-_aq.prototype.createBase = function (data) {
-    return new _c(data, this._x, this);
-};
-
-_aq.prototype.createShape = function (data) {
-    return new _r(data, this._x, this);
-};
-
-_aq.prototype.createText = function (data) {
-    return new _t(data, this._x, this);
-};
-
-_aq.prototype.createImage = function (data) {
-    return new _p(data, this._x, this);
-};
-
-_aq.prototype.createComp = function (data) {
-    return new _m(data, this._x, this);
-};
-
-_aq.prototype.createSolid = function (data) {
-    return new _s(data, this._x, this);
-};
-
-_aq.prototype.createNull = _ao.prototype.createNull;
-
-_aq.prototype.ctxTransform = function(props){
-    if(props[0] === 1 && props[1] === 0 && props[4] === 0 && props[5] === 1 && props[12] === 0 && props[13] === 0){
-        return;
-    }
-    if(!this.renderConfig.clearCanvas){
-        this.canvasContext.transform(props[0],props[1],props[4],props[5],props[12],props[13]);
-        return;
-    }
-    this.transformMat.cloneFromProps(props);
-    var cProps = this.contextData.cTr.props;
-    this.transformMat.transform(cProps[0],cProps[1],cProps[2],cProps[3],cProps[4],cProps[5],cProps[6],cProps[7],cProps[8],cProps[9],cProps[10],cProps[11],cProps[12],cProps[13],cProps[14],cProps[15]);
-    //this.contextData.cTr.transform(props[0],props[1],props[2],props[3],props[4],props[5],props[6],props[7],props[8],props[9],props[10],props[11],props[12],props[13],props[14],props[15]);
-    this.contextData.cTr.cloneFromProps(this.transformMat.props);
-    var trProps = this.contextData.cTr.props;
-    this.canvasContext.setTransform(trProps[0],trProps[1],trProps[4],trProps[5],trProps[12],trProps[13]);
-};
-
-_aq.prototype.ctxOpacity = function(op){
-    /*if(op === 1){
-        return;
-    }*/
-    if(!this.renderConfig.clearCanvas){
-        this.canvasContext.globalAlpha *= op < 0 ? 0 : op;
-        return;
-    }
-    this.contextData.cO *= op < 0 ? 0 : op;
-    this.canvasContext.globalAlpha = this.contextData.cO;
-};
-
-_aq.prototype.reset = function(){
-    if(!this.renderConfig.clearCanvas){
-        this.canvasContext.restore();
-        return;
-    }
-    this.contextData.reset();
-};
-
-_aq.prototype.save = function(actionFlag){
-    if(!this.renderConfig.clearCanvas){
-        this.canvasContext.save();
-        return;
-    }
-    if(actionFlag){
-        this.canvasContext.save();
-    }
-    var props = this.contextData.cTr.props;
-    if(this.contextData._length <= this.contextData.cArrPos) {
-        this.contextData.duplicate();
-    }
-    var i, arr = this.contextData.saved[this.contextData.cArrPos];
-    for (i = 0; i < 16; i += 1) {
-        arr[i] = props[i];
-    }
-    this.contextData.savedOp[this.contextData.cArrPos] = this.contextData.cO;
-    this.contextData.cArrPos += 1;
-};
-
-_aq.prototype.restore = function(actionFlag){
-    if(!this.renderConfig.clearCanvas){
-        this.canvasContext.restore();
-        return;
-    }
-    if(actionFlag){
-        this.canvasContext.restore();
-        this._x.blendMode = 'source-over';
-    }
-    this.contextData.cArrPos -= 1;
-    var popped = this.contextData.saved[this.contextData.cArrPos];
-    var i,arr = this.contextData.cTr.props;
-    for(i=0;i<16;i+=1){
-        arr[i] = popped[i];
-    }
-    this.canvasContext.setTransform(popped[0],popped[1],popped[4],popped[5],popped[12],popped[13]);
-    popped = this.contextData.savedOp[this.contextData.cArrPos];
-    this.contextData.cO = popped;
-    this.canvasContext.globalAlpha = popped;
-};
-
-_aq.prototype.configAnimation = function(animData){
-    if(this.animationItem.wrapper){
-        this.animationItem.container = createTag('canvas');
-        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.webkitTransform = '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);
-        this.canvasContext = this.animationItem.container.getContext('2d');
-        if(this.renderConfig.className) {
-            this.animationItem.container.setAttribute('class', this.renderConfig.className);
-        }
-    }else{
-        this.canvasContext = this.renderConfig.context;
-    }
-    this.data = animData;
-    this._x.canvasContext = this.canvasContext;
-    this._x.renderer = this;
-    this._x.isDashed = false;
-    this._x.totalFrames = Math.floor(animData.tf);
-    this._x.compWidth = animData.w;
-    this._x.compHeight = animData.h;
-    this._x.frameRate = animData.fr;
-    this._x.frameId = 0;
-    this._x.compSize = {
-        w: animData.w,
-        h: animData.h
-    };
-    this._x.progressiveLoad = this.renderConfig.progressiveLoad;
-    this.layers = animData.layers;
-    this.transformCanvas = {};
-    this.transformCanvas.w = animData.w;
-    this.transformCanvas.h = animData.h;
-    this._x.fontManager = new FontManager();
-    this._x.fontManager.addChars(animData.chars);
-    this._x.fontManager.addFonts(animData.fonts,document.body);
-    this._x.getAssetData = this.animationItem.getAssetData.bind(this.animationItem);
-    this._x.getAssetsPath = this.animationItem.getAssetsPath.bind(this.animationItem);
-    this._x.elementLoaded = this.animationItem.elementLoaded.bind(this.animationItem);
-    this._x.addPendingElement = this.animationItem.addPendingElement.bind(this.animationItem);
-    this._x.transformCanvas = this.transformCanvas;
-    this._br = Array.apply(null,{length:animData.layers.length});
-
-    this.updateContainerSize();
-};
-
-_aq.prototype.updateContainerSize = function () {
-    this.reset();
-    var elementWidth,elementHeight;
-    if(this.animationItem.wrapper && this.animationItem.container){
-        elementWidth = this.animationItem.wrapper.offsetWidth;
-        elementHeight = this.animationItem.wrapper.offsetHeight;
-        this.animationItem.container.setAttribute('width',elementWidth * this.renderConfig.dpr );
-        this.animationItem.container.setAttribute('height',elementHeight * this.renderConfig.dpr);
-    }else{
-        elementWidth = this.canvasContext.canvas.width * this.renderConfig.dpr;
-        elementHeight = this.canvasContext.canvas.height * this.renderConfig.dpr;
-    }
-    var elementRel,animationRel;
-    if(this.renderConfig.preserveAspectRatio.indexOf('meet') !== -1 || this.renderConfig.preserveAspectRatio.indexOf('slice') !== -1){
-        var par = this.renderConfig.preserveAspectRatio.split(' ');
-        var fillType = par[1] || 'meet';
-        var pos = par[0] || 'xMidYMid';
-        var xPos = pos.substr(0,4);
-        var yPos = pos.substr(4);
-        elementRel = elementWidth/elementHeight;
-        animationRel = this.transformCanvas.w/this.transformCanvas.h;
-        if(animationRel>elementRel && fillType === 'meet' || animationRel<elementRel && fillType === 'slice'){
-            this.transformCanvas.sx = elementWidth/(this.transformCanvas.w/this.renderConfig.dpr);
-            this.transformCanvas.sy = elementWidth/(this.transformCanvas.w/this.renderConfig.dpr);
-        }else{
-            this.transformCanvas.sx = elementHeight/(this.transformCanvas.h / this.renderConfig.dpr);
-            this.transformCanvas.sy = elementHeight/(this.transformCanvas.h / this.renderConfig.dpr);
-        }
-
-        if(xPos === 'xMid' && ((animationRel<elementRel && fillType==='meet') || (animationRel>elementRel && fillType === 'slice'))){
-            this.transformCanvas.tx = (elementWidth-this.transformCanvas.w*(elementHeight/this.transformCanvas.h))/2*this.renderConfig.dpr;
-        } else if(xPos === 'xMax' && ((animationRel<elementRel && fillType==='meet') || (animationRel>elementRel && fillType === 'slice'))){
-            this.transformCanvas.tx = (elementWidth-this.transformCanvas.w*(elementHeight/this.transformCanvas.h))*this.renderConfig.dpr;
-        } else {
-            this.transformCanvas.tx = 0;
-        }
-        if(yPos === 'YMid' && ((animationRel>elementRel && fillType==='meet') || (animationRel<elementRel && fillType === 'slice'))){
-            this.transformCanvas.ty = ((elementHeight-this.transformCanvas.h*(elementWidth/this.transformCanvas.w))/2)*this.renderConfig.dpr;
-        } else if(yPos === 'YMax' && ((animationRel>elementRel && fillType==='meet') || (animationRel<elementRel && fillType === 'slice'))){
-            this.transformCanvas.ty = ((elementHeight-this.transformCanvas.h*(elementWidth/this.transformCanvas.w)))*this.renderConfig.dpr;
-        } else {
-            this.transformCanvas.ty = 0;
-        }
-
-    }else if(this.renderConfig.preserveAspectRatio == 'none'){
-        this.transformCanvas.sx = elementWidth/(this.transformCanvas.w/this.renderConfig.dpr);
-        this.transformCanvas.sy = elementHeight/(this.transformCanvas.h/this.renderConfig.dpr);
-        this.transformCanvas.tx = 0;
-        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];
-    /*var i, len = this._br.length;
-    for(i=0;i<len;i+=1){
-        if(this._br[i] && this._br[i].data.ty === 0){
-            this._br[i].resize(this._x.transformCanvas);
-        }
-    }*/
-    this.ctxTransform(this.transformCanvas.props);
-};
-
-_aq.prototype.destroy = function () {
-    if(this.renderConfig.clearCanvas) {
-        this.animationItem.wrapper.innerHTML = '';
-    }
-    var i, len = this.layers ? this.layers.length : 0;
-    for (i = len - 1; i >= 0; i-=1) {
-        if(this._br[i]) {
-            this._br[i].destroy();
-        }
-    }
-    this._br.length = 0;
-    this._x.canvasContext = null;
-    this.animationItem.container = null;
-    this.destroyed = true;
-};
-
-_aq.prototype._ba = function(num){
-    if((this.renderedFrame == num && this.renderConfig.clearCanvas === true) || this.destroyed || num === null){
-        return;
-    }
-    this.renderedFrame = num;
-    this._x.frameNum = num - this.animationItem.firstFrame;
-    this._x.frameId += 1;
-    this._x.projectInterface.currentFrame = num;
-    if(this.renderConfig.clearCanvas === true){
-        //this.reset();
-        //this.canvasContext.save();
-        //this.canvasContext.canvas.width = this.canvasContext.canvas.width;
-        this.canvasContext.clearRect(this.transformCanvas.tx, this.transformCanvas.ty, this.transformCanvas.w*this.transformCanvas.sx, this.transformCanvas.h*this.transformCanvas.sy);
-    }else{
-        this.save();
-    }
-    this.canvasContext.beginPath();
-    this.canvasContext.rect(0,0,this.transformCanvas.w,this.transformCanvas.h);
-    this.canvasContext.closePath();
-    this.canvasContext.clip();
-
-     // console.log('--------');
-     // console.log('NEW: ',num);
-    var i, len = this.layers.length;
-    if(!this.completeLayers){
-        this.checkLayers(num);
-    }
-
-    for (i = 0; i < len; i++) {
-        if(this.completeLayers || this._br[i]){
-            this._br[i]._az(num - this.layers[i].st);
-        }
-    }
-    for (i = len - 1; i >= 0; i-=1) {
-        if(this.completeLayers || this._br[i]){
-            this._br[i]._ba();
-        }
-    }
-    if(this.renderConfig.clearCanvas !== true){
-        this.restore();
-    } else {
-        //this.canvasContext.restore();
-    }
-    // console.log(this.contextData.cTr.props)
-};
-
-_aq.prototype.buildItem = function(pos){
-    var _br = this._br;
-    if(_br[pos] || this.layers[pos].ty == 99){
-        return;
-    }
-    var element = this.createItem(this.layers[pos], this,this._x);
-    _br[pos] = element;
-    element.initExpressions();
-    /*if(this.layers[pos].ty === 0){
-        element.resize(this._x.transformCanvas);
-    }*/
-};
-
-_aq.prototype.checkPendingElements  = function(){
-    while(this.pendingElements.length){
-        var element = this.pendingElements.pop();
-        element.checkParenting();
-    }
-};
-
-_aq.prototype.hide = function(){
-    this.animationItem.container.style.display = 'none';
-};
-
-_aq.prototype.show = function(){
-    this.animationItem.container.style.display = 'block';
-};
-
-_aq.prototype.searchExtraCompositions = function(assets){
-    var i, len = assets.length;
-    var floatingContainer = createNS('g');
-    for(i=0;i<len;i+=1){
-        if(assets[i].xt){
-            var comp = this.createComp(assets[i],this._x.comp,this._x);
-            comp.initExpressions();
-            //comp.compInterface = CompExpressionInterface(comp);
-            //Expressions.addLayersInterface(comp._br, this._x.projectInterface);
-            this._x.projectInterface.registerComposition(comp);
-        }
-    }
-};
-
-function _ap(animationItem, config){
-    this.animationItem = animationItem;
-    this.layers = null;
-    this.renderedFrame = -1;
-    this.renderConfig = {
-        className: (config && config.className) || '',
-        hideOnTransparent: (config && config.hideOnTransparent === false) ? false : true
-    };
-    this._x = {
-        mdf: false,
-        frameNum: -1,
-        renderConfig: this.renderConfig
-    };
-    this.pendingElements = [];
-    this._br = [];
-    this.threeDElements = [];
-    this.destroyed = false;
-    this.camera = null;
-    this.supports3d = true;
-
-}
-
-extendPrototype([_l],_ap);
-
-_ap.prototype.buildItem = _ao.prototype.buildItem;
-
-_ap.prototype.checkPendingElements  = function(){
-    while(this.pendingElements.length){
-        var element = this.pendingElements.pop();
-        element.checkParenting();
-    }
-};
-
-_ap.prototype.appendElementInPos = function(element, pos){
-    var newDOMElement = element.get_e();
-    if(!newDOMElement){
-        return;
-    }
-    var layer = this.layers[pos];
-    if(!layer.ddd || !this.supports3d){
-        var i = 0;
-        var nextDOMElement, nextLayer;
-        while(i<pos){
-            if(this._br[i] && this._br[i]!== true && this._br[i].get_e){
-                nextLayer = this._br[i];
-                nextDOMElement = this.layers[i].ddd ? this.getThreeDContainerByPos(i) : nextLayer.get_e();
-            }
-            i += 1;
-        }
-        if(nextDOMElement){
-            if(!layer.ddd || !this.supports3d){
-                this._bx.insertBefore(newDOMElement, nextDOMElement);
-            }
-        } else {
-            if(!layer.ddd || !this.supports3d){
-                this._bx.appendChild(newDOMElement);
-            }
-        }
-    } else {
-        this.addTo3dContainer(newDOMElement,pos);
-    }
-};
-
-
-_ap.prototype.createBase = function (data) {
-    return new _d(data, this._x, this);
-};
-
-_ap.prototype.createShape = function (data) {
-    if(!this.supports3d){
-        return new _f(data, this._x, this);
-    }
-    return new _z(data, this._x, this);
-};
-
-_ap.prototype.createText = function (data) {
-    if(!this.supports3d){
-        return new SVGTextElement(data, this._x, this);
-    }
-    return new _ab(data, this._x, this);
-};
-
-_ap.prototype.createCamera = function (data) {
-    this.camera = new _v(data, this._x, this);
-    return this.camera;
-};
-
-_ap.prototype.createImage = function (data) {
-    if(!this.supports3d){
-        return new _h(data, this._x, this);
-    }
-    return new _y(data, this._x, this);
-};
-
-_ap.prototype.createComp = function (data) {
-    if(!this.supports3d){
-        return new _g(data, this._x, this);
-    }
-    return new _w(data, this._x, this);
-
-};
-
-_ap.prototype.createSolid = function (data) {
-    if(!this.supports3d){
-        return new _j(data, this._x, this);
-    }
-    return new _aa(data, this._x, this);
-};
-
-_ap.prototype.createNull = _ao.prototype.createNull;
-
-_ap.prototype.getThreeDContainerByPos = function(pos){
-    var i = 0, len = this.threeDElements.length;
-    while(i<len) {
-        if(this.threeDElements[i].startPos <= pos && this.threeDElements[i].endPos >= pos) {
-            return this.threeDElements[i].perspectiveElem;
-        }
-        i += 1;
-    }
-}
-
-_ap.prototype.createThreeDContainer = function(pos){
-    var perspectiveElem = createTag('div');
-    styleDiv(perspectiveElem);
-    perspectiveElem.style.width = this._x.compSize.w+'px';
-    perspectiveElem.style.height = this._x.compSize.h+'px';
-    perspectiveElem.style.transformOrigin = perspectiveElem.style.mozTransformOrigin = perspectiveElem.style.webkitTransformOrigin = "50% 50%";
-    var container = createTag('div');
-    styleDiv(container);
-    container.style.transform = container.style.webkitTransform = 'matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1)';
-    perspectiveElem.appendChild(container);
-    this.resizerElem.appendChild(perspectiveElem);
-    var threeDContainerData = {
-        container:container,
-        perspectiveElem:perspectiveElem,
-        startPos: pos,
-        endPos: pos
-    };
-    this.threeDElements.push(threeDContainerData);
-    return threeDContainerData;
-};
-
-_ap.prototype.build3dContainers = function(){
-    var i, len = this.layers.length;
-    var lastThreeDContainerData;
-    for(i=0;i<len;i+=1){
-        if(this.layers[i].ddd){
-            if(!lastThreeDContainerData){
-                lastThreeDContainerData = this.createThreeDContainer(i);
-            }
-            lastThreeDContainerData.endPos = Math.max(lastThreeDContainerData.endPos,i);
-        } else {
-            lastThreeDContainerData = null;
-        }
-    }
-};
-
-_ap.prototype.addTo3dContainer = function(elem,pos){
-    var i = 0, len = this.threeDElements.length;
-    while(i<len){
-        if(pos <= this.threeDElements[i].endPos){
-            var j = this.threeDElements[i].startPos;
-            var nextElement;
-            while(j<pos){
-                if(this._br[j] && this._br[j].get_e){
-                    nextElement = this._br[j].get_e();
-                }
-                j += 1;
-            }
-            if(nextElement){
-                this.threeDElements[i].container.insertBefore(elem, nextElement);
-            } else {
-                this.threeDElements[i].container.appendChild(elem);
-            }
-            break;
-        }
-        i += 1;
-    }
-};
-
-_ap.prototype.configAnimation = function(animData){
-    var resizerElem = createTag('div');
-    var wrapper = this.animationItem.wrapper;
-    resizerElem.style.width = animData.w+'px';
-    resizerElem.style.height = animData.h+'px';
-    this.resizerElem = resizerElem;
-    styleDiv(resizerElem);
-    resizerElem.style.transformStyle = resizerElem.style.webkitTransformStyle = resizerElem.style.mozTransformStyle = "flat";
-    if(this.renderConfig.className) {
-      wrapper.setAttribute('class', this.renderConfig.className);
-    }
-    wrapper.appendChild(resizerElem);
-
-    resizerElem.style.overflow = 'hidden';
-    var svg = createNS('svg');
-    svg.setAttribute('width','1');
-    svg.setAttribute('height','1');
-    styleDiv(svg);
-    this.resizerElem.appendChild(svg);
-    var defs = createNS('defs');
-    svg.appendChild(defs);
-    this._x.defs = defs;
-    this.data = animData;
-    //Mask animation
-    this._x.getAssetData = this.animationItem.getAssetData.bind(this.animationItem);
-    this._x.getAssetsPath = this.animationItem.getAssetsPath.bind(this.animationItem);
-    this._x.elementLoaded = this.animationItem.elementLoaded.bind(this.animationItem);
-    this._x.frameId = 0;
-    this._x.compSize = {
-        w: animData.w,
-        h: animData.h
-    };
-    this._x.frameRate = animData.fr;
-    this.layers = animData.layers;
-    this._x.fontManager = new FontManager();
-    this._x.fontManager.addChars(animData.chars);
-    this._x.fontManager.addFonts(animData.fonts,svg);
-    this._bx = this.resizerElem;
-    this.build3dContainers();
-    this.updateContainerSize();
-};
-
-_ap.prototype.destroy = function () {
-    this.animationItem.wrapper.innerHTML = '';
-    this.animationItem.container = null;
-    this._x.defs = null;
-    var i, len = this.layers ? this.layers.length : 0;
-    for (i = 0; i < len; i++) {
-        this._br[i].destroy();
-    }
-    this._br.length = 0;
-    this.destroyed = true;
-    this.animationItem = null;
-};
-
-_ap.prototype.updateContainerSize = function () {
-    var elementWidth = this.animationItem.wrapper.offsetWidth;
-    var elementHeight = this.animationItem.wrapper.offsetHeight;
-    var elementRel = elementWidth/elementHeight;
-    var animationRel = this._x.compSize.w/this._x.compSize.h;
-    var sx,sy,tx,ty;
-    if(animationRel>elementRel){
-        sx = elementWidth/(this._x.compSize.w);
-        sy = elementWidth/(this._x.compSize.w);
-        tx = 0;
-        ty = ((elementHeight-this._x.compSize.h*(elementWidth/this._x.compSize.w))/2);
-    }else{
-        sx = elementHeight/(this._x.compSize.h);
-        sy = elementHeight/(this._x.compSize.h);
-        tx = (elementWidth-this._x.compSize.w*(elementHeight/this._x.compSize.h))/2;
-        ty = 0;
-    }
-    this.resizerElem.style.transform = this.resizerElem.style.webkitTransform = 'matrix3d(' + sx + ',0,0,0,0,'+sy+',0,0,0,0,1,0,'+tx+','+ty+',0,1)';
-};
-
-_ap.prototype._ba = _ao.prototype._ba;
-
-_ap.prototype.hide = function(){
-    this.resizerElem.style.display = 'none';
-};
-
-_ap.prototype.show = function(){
-    this.resizerElem.style.display = 'block';
-};
-
-_ap.prototype.initItems = function(){
-    this.buildAllItems();
-    if(this.camera){
-        this.camera.setup();
-    } else {
-        var cWidth = this._x.compSize.w;
-        var cHeight = this._x.compSize.h;
-        var i, len = this.threeDElements.length;
-        for(i=0;i<len;i+=1){
-            this.threeDElements[i].perspectiveElem.style.perspective = this.threeDElements[i].perspectiveElem.style.webkitPerspective = Math.sqrt(Math.pow(cWidth,2) + Math.pow(cHeight,2)) + 'px';
-        }
-    }
-};
-
-_ap.prototype.searchExtraCompositions = function(assets){
-    var i, len = assets.length;
-    var floatingContainer = createTag('div');
-    for(i=0;i<len;i+=1){
-        if(assets[i].xt){
-            var comp = this.createComp(assets[i],floatingContainer,this._x.comp,null);
-            comp.initExpressions();
-            this._x.projectInterface.registerComposition(comp);
-        }
-    }
-};
-
 function _ay(data,element,_x) {
     //TODO: check if dynamic properties array can be used from element
-    this.dynamicProperties = [];
+    this._co = [];
     this.data = data;
     this.element = element;
     this._x = _x;
     this.storedData = [];
     this.masksProperties = this.data.masksProperties || [];
     this.maskElement = null;
-    this.firstFrame = true;
+    this._ch = true;
     var defs = this._x.defs;
     var i, len = this.masksProperties ? this.masksProperties.length : 0;
-    this.viewData = Array.apply(null,{length:len});
+    this.viewData = _cv(len);
     this.solidPath = '';
 
 
@@ -6438,7 +5798,7 @@
         }
 
         if((properties[i].mode == 's' || properties[i].mode == 'i') && count == 0){
-            rect = createNS( 'rect');
+            rect = _ct( 'rect');
             rect.setAttribute('fill', '#ffffff');
             rect.setAttribute('width', this.element.comp.data.w);
             rect.setAttribute('height', this.element.comp.data.h);
@@ -6447,12 +5807,12 @@
             rect = null;
         }
 
-        path = createNS( 'path');
+        path = _ct( 'path');
         if(properties[i].mode == 'n') {
             // TODO move this to a factory or to a constructor
             this.viewData[i] = {
-                op: _ai._bo(this.element,properties[i].o,0,0.01,this.dynamicProperties),
-                prop: _ah._bp(this.element,properties[i],3,this.dynamicProperties,null),
+                op: _ai._bo(this.element,properties[i].o,0,0.01,this._co),
+                prop: _ah._bp(this.element,properties[i],3,this._co,null),
                 elem: path
             };
             defs.appendChild(path);
@@ -6466,11 +5826,11 @@
         if (properties[i].x.k !== 0) {
             maskType = 'mask';
             maskRef = 'mask';
-            x = _ai._bo(this.element,properties[i].x,0,null,this.dynamicProperties);
+            x = _ai._bo(this.element,properties[i].x,0,null,this._co);
             var filterID = 'fi_'+randomString(10);
-            expansor = createNS('filter');
+            expansor = _ct('filter');
             expansor.setAttribute('id',filterID);
-            feMorph = createNS('feMorphology');
+            feMorph = _ct('feMorphology');
             feMorph.setAttribute('operator','dilate');
             feMorph.setAttribute('in','SourceGraphic');
             feMorph.setAttribute('radius','0');
@@ -6494,11 +5854,11 @@
         };
         if(properties[i].mode == 'i'){
             jLen = currentMasks.length;
-            var g = createNS('g');
+            var g = _ct('g');
             for(j=0;j<jLen;j+=1){
                 g.appendChild(currentMasks[j]);
             }
-            var mask = createNS('mask');
+            var mask = _ct('mask');
             mask.setAttribute('mask-type','alpha');
             mask.setAttribute('id',layerId+'_'+count);
             mask.appendChild(path);
@@ -6517,8 +5877,8 @@
         this.viewData[i] = {
             elem: path,
             lastPath: '',
-            op: _ai._bo(this.element,properties[i].o,0,0.01,this.dynamicProperties),
-            prop:_ah._bp(this.element,properties[i],3,this.dynamicProperties,null)
+            op: _ai._bo(this.element,properties[i].o,0,0.01,this._co),
+            prop:_ah._bp(this.element,properties[i],3,this._co,null)
         };
         if(rect){
             //TODO: move the invRect property to the object definition in order to prevent a new hidden class creation.
@@ -6529,7 +5889,7 @@
         }
     }
 
-    this.maskElement = createNS( maskType);
+    this.maskElement = _ct( maskType);
 
     len = currentMasks.length;
     for(i=0;i<len;i+=1){
@@ -6549,9 +5909,9 @@
 };
 
 _ay.prototype._az = function(){
-    var i, len = this.dynamicProperties.length;
+    var i, len = this._co.length;
     for(i=0;i<len;i+=1){
-        this.dynamicProperties[i].getValue();
+        this._co[i].getValue();
 
     }
 };
@@ -6559,18 +5919,18 @@
 _ay.prototype._ba = function (finalMat) {
     var i, len = this.masksProperties.length;
     for (i = 0; i < len; i++) {
-        if(this.viewData[i].prop.mdf || this.firstFrame){
+        if(this.viewData[i].prop.mdf || this._ch){
             this.drawPath(this.masksProperties[i],this.viewData[i].prop.v,this.viewData[i]);
         }
-        if(this.viewData[i].op.mdf || this.firstFrame){
+        if(this.viewData[i].op.mdf || this._ch){
             this.viewData[i].elem.setAttribute('fill-opacity',this.viewData[i].op.v);
         }
         if(this.masksProperties[i].mode !== 'n'){
-            if(this.viewData[i].invRect && (this.element.finalTransform.mProp.mdf || this.firstFrame)){
+            if(this.viewData[i].invRect && (this.element.finalTransform.mProp.mdf || this._ch)){
                 this.viewData[i].invRect.setAttribute('x', -finalMat.props[12]);
                 this.viewData[i].invRect.setAttribute('y', -finalMat.props[13]);
             }
-            if(this.storedData[i].x && (this.storedData[i].x.mdf || this.firstFrame)){
+            if(this.storedData[i].x && (this.storedData[i].x.mdf || this._ch)){
                 var feMorph = this.storedData[i].expan;
                 if(this.storedData[i].x.v < 0){
                     if(this.storedData[i].lastOperator !== 'erode'){
@@ -6589,7 +5949,7 @@
             }
         }
     }
-    this.firstFrame = false;
+    this._ch = false;
 };
 
 _ay.prototype.getMaskelement = function () {
@@ -6598,10 +5958,10 @@
 
 _ay.prototype.createLayerSolidPath = function(){
     var path = 'M0,0 ';
-    path += ' h' + this._x.compSize.w ;
-    path += ' v' + this._x.compSize.h ;
-    path += ' h-' + this._x.compSize.w ;
-    path += ' v-' + this._x.compSize.h + ' ';
+    path += ' h' + this._x._de.w ;
+    path += ' v' + this._x._de.h ;
+    path += ' h-' + this._x._de.w ;
+    path += ' v-' + this._x._de.h + ' ';
     return path;
 };
 
@@ -6642,21 +6002,21 @@
 function _ad(){}
 
 _ad.prototype.initHierarchy = function() {
-    this.hierarchy = [];
+    this._dd = [];
     this._isParent = false;
     this.checkParenting();
 }
 
 _ad.prototype.resetHierarchy = function() {
-    this.hierarchy.length = 0;
+    this._dd.length = 0;
 };
 
 _ad.prototype.getHierarchy = function() {
-    return this.hierarchy;
+    return this._dd;
 };
 
-_ad.prototype.setHierarchy = function(hierarchy){
-    this.hierarchy = hierarchy;
+_ad.prototype.setHierarchy = function(_dd){
+    this._dd = _dd;
 };
 
 _ad.prototype.checkParenting = function(){
@@ -6685,9 +6045,9 @@
 
 _ac.prototype.initFrame = function(){
 	//set to true when inpoint is rendered
-	this.firstFrame = false;
+	this._ch = false;
 	//list of animated properties
-	this.dynamicProperties = [];
+	this._co = [];
 }
 
 
@@ -6700,12 +6060,12 @@
  * 
  */
 _ac.prototype.prepareProperties = function(num, isVisible) {
-    var i, len = this.dynamicProperties.length;
+    var i, len = this._co.length;
     for (i = 0;i < len; i += 1) {
         //TODO change .type to .propType
-        if (isVisible || (this._isParent && this.dynamicProperties[i].propType === 'transform')) {
-            this.dynamicProperties[i].getValue(this.firstFrame);
-            if (this.dynamicProperties[i].mdf) {
+        if (isVisible || (this._isParent && this._co[i].propType === 'transform')) {
+            this._co[i].getValue(this._ch);
+            if (this._co[i].mdf) {
                 this._x.mdf = true;
             }
         }
@@ -6715,7 +6075,7 @@
 
 _af.prototype.initTransform = function() {
     this.finalTransform = {
-        mProp: this.data.ks ? _ag._bj(this, this.data.ks, this.dynamicProperties) : {o:0},
+        mProp: this.data.ks ? _ag._bj(this, this.data.ks, this._co) : {o:0},
         matMdf: false,
         opMdf: false,
         mat: new Matrix()
@@ -6732,17 +6092,17 @@
 
 _af.prototype.renderTransform = function() {
 
-	this.finalTransform.opMdf = this.finalTransform.mProp.o.mdf || this.firstFrame;
-    this.finalTransform.matMdf = this.finalTransform.mProp.mdf || this.firstFrame;
+	this.finalTransform.opMdf = this.finalTransform.mProp.o.mdf || this._ch;
+    this.finalTransform.matMdf = this.finalTransform.mProp.mdf || this._ch;
 
-    if (this.hierarchy) {
+    if (this._dd) {
         var mat;
         var finalMat = this.finalTransform.mat;
-        var i = 0, len = this.hierarchy.length;
-        //Checking if any of the transformation matrices in the hierarchy chain has changed.
+        var i = 0, len = this._dd.length;
+        //Checking if any of the transformation matrices in the _dd chain has changed.
         if (!this.finalTransform.matMdf) {
             while (i < len) {
-                if (this.hierarchy[i].finalTransform.mProp.mdf) {
+                if (this._dd[i].finalTransform.mProp.mdf) {
                     this.finalTransform.matMdf = true;
                     break;
                 }
@@ -6754,7 +6114,7 @@
             mat = this.finalTransform.mProp.v.props;
             finalMat.cloneFromProps(mat);
             for (i = 0; i < len; i += 1) {
-                mat = this.hierarchy[i].finalTransform.mProp.v.props;
+                mat = this._dd[i].finalTransform.mProp.v.props;
                 finalMat.transform(mat[0], mat[1], mat[2], mat[3], mat[4], mat[5], mat[6], mat[7], mat[8], mat[9], mat[10], mat[11], mat[12], mat[13], mat[14], mat[15]);
             }
         }
@@ -6778,8 +6138,8 @@
     }
     var i, len = transforms.length,ptNew;
     for (i = 0; i < len; i += 1) {
-        ptNew = transforms[i].mat.applyToPointArray(0, 0, 0);
-        //ptNew = transforms[i].mat.applyToPointArray(pt[0],pt[1],pt[2]);
+        ptNew = transforms[i].mat._cn(0, 0, 0);
+        //ptNew = transforms[i].mat._cn(pt[0],pt[1],pt[2]);
         pt = [pt[0] - ptNew[0], pt[1] - ptNew[1], 0];
     }
     return pt;
@@ -6847,7 +6207,7 @@
 
 _ae.prototype.renderRenderable = function() {
     this.maskManager._ba(this.finalTransform.mat);
-    this.effectsManager._ba(this.firstFrame);
+    this.effectsManager._ba(this._ch);
 }
 
 _ae.prototype.sourceRectAtTime = function(){
@@ -6866,12 +6226,12 @@
         return {w:this.data.width,h:this.data.height};
     }
 };
-function RenderableDOMElement() {
+function _ci() {
 
 }
-extendPrototype([_ae], RenderableDOMElement);
+extendPrototype([_ae], _ci);
 
-RenderableDOMElement.prototype.initElement = function(data,_x,comp) {
+_ci.prototype._cz = function(data,_x,comp) {
     this.initFrame();
     this.initBaseData(data, _x, comp);
     this.initTransform(data, _x, comp);
@@ -6884,25 +6244,25 @@
     this.hide();
 }
 
-RenderableDOMElement.prototype.hide = function(){
+_ci.prototype.hide = function(){
     if (!this.hidden && (!this.isInRange || this.isTransparent)) {
         this._bx.style.display = 'none';
         this.hidden = true;
     }
 };
 
-RenderableDOMElement.prototype.show = function(){
+_ci.prototype.show = function(){
     if (this.isInRange && !this.isTransparent){
         if (!this.data.hd) {
             this._bx.style.display = 'block';
         }
         this.hidden = false;
-        this.firstFrame = true;
-        this.maskManager.firstFrame = true;
+        this._ch = true;
+        this.maskManager._ch = true;
     }
 };
 
-RenderableDOMElement.prototype._ba = function() {
+_ci.prototype._ba = function() {
     //If it is exported as hidden (data.hd === true) no need to render
     //If it is not visible no need to render
     if (this.data.hd || this.hidden) {
@@ -6912,19 +6272,19 @@
     this.renderRenderable();
     this.renderElement();
     this.renderInnerContent();
-    if (this.firstFrame) {
-        this.firstFrame = false;
+    if (this._ch) {
+        this._ch = false;
     }
 };
 
-RenderableDOMElement.prototype.renderInnerContent = function() {};
+_ci.prototype.renderInnerContent = function() {};
 
-RenderableDOMElement.prototype.destroy = function(){
+_ci.prototype.destroy = function(){
     this._cc =  null;
     this.destroy_e();
 };
 
-RenderableDOMElement.prototype._az = function(num) {
+_ci.prototype._az = function(num) {
     this.prepareRenderableFrame(num);
     this.prepareProperties(num, this.isInRange);
 };
@@ -6939,7 +6299,7 @@
 	this.lvl = level;
 	this.mdf = false;
 	this.closed = false;
-	this.pElem = createNS('path');
+	this.pElem = _ct('path');
 	this.msElem = null;
 }
 
@@ -6962,29 +6322,29 @@
 	}
 	this._br = []
 }
-function SVGStrokeStyleData(elem, data, dynamicProperties, styleOb){
-	this.o = _ai._bo(elem,data.o,0,0.01,dynamicProperties);
-	this.w = _ai._bo(elem,data.w,0,null,dynamicProperties);
-	this.d = new DashProperty(elem,data.d||{},'svg',dynamicProperties);
-	this.c = _ai._bo(elem,data.c,1,255,dynamicProperties);
+function SVGStrokeStyleData(elem, data, _co, styleOb){
+	this.o = _ai._bo(elem,data.o,0,0.01,_co);
+	this.w = _ai._bo(elem,data.w,0,null,_co);
+	this.d = new DashProperty(elem,data.d||{},'svg',_co);
+	this.c = _ai._bo(elem,data.c,1,255,_co);
 	this.style = styleOb;
 }
-function SVGFillStyleData(elem, data, dynamicProperties, styleOb){
-	this.o = _ai._bo(elem,data.o,0,0.01,dynamicProperties);
-	this.c = _ai._bo(elem,data.c,1,255,dynamicProperties);
+function SVGFillStyleData(elem, data, _co, styleOb){
+	this.o = _ai._bo(elem,data.o,0,0.01,_co);
+	this.c = _ai._bo(elem,data.c,1,255,_co);
 	this.style = styleOb;
 }
-function SVGGradientFillStyleData(elem, data, dynamicProperties, styleOb){
-    this.initGradientData(elem, data, dynamicProperties, styleOb);
+function _ck(elem, data, _co, styleOb){
+    this.initGradientData(elem, data, _co, styleOb);
 }
 
-SVGGradientFillStyleData.prototype.initGradientData = function(elem, data, dynamicProperties, styleOb){
-    this.o = _ai._bo(elem,data.o,0,0.01,dynamicProperties);
-    this.s = _ai._bo(elem,data.s,1,null,dynamicProperties);
-    this.e = _ai._bo(elem,data.e,1,null,dynamicProperties);
-    this.h = _ai._bo(elem,data.h||{k:0},0,0.01,dynamicProperties);
-    this.a = _ai._bo(elem,data.a||{k:0},0,degToRads,dynamicProperties);
-    this.g = new GradientProperty(elem,data.g,dynamicProperties);
+_ck.prototype.initGradientData = function(elem, data, _co, styleOb){
+    this.o = _ai._bo(elem,data.o,0,0.01,_co);
+    this.s = _ai._bo(elem,data.s,1,null,_co);
+    this.e = _ai._bo(elem,data.e,1,null,_co);
+    this.h = _ai._bo(elem,data.h||{k:0},0,0.01,_co);
+    this.a = _ai._bo(elem,data.a||{k:0},0,degToRads,_co);
+    this.g = new GradientProperty(elem,data.g,_co);
     this.style = styleOb;
     this.stops = [];
     this.setGradientData(styleOb.pElem, data);
@@ -6992,10 +6352,10 @@
 
 }
 
-SVGGradientFillStyleData.prototype.setGradientData = function(pathElement,data){
+_ck.prototype.setGradientData = function(pathElement,data){
 
     var gradientId = 'gr_'+randomString(10);
-    var gfill = createNS(data.t === 1 ? 'linearGradient' : 'radialGradient');
+    var gfill = _ct(data.t === 1 ? 'linearGradient' : 'radialGradient');
     gfill.setAttribute('id',gradientId);
     gfill.setAttribute('spreadMethod','pad');
     gfill.setAttribute('gradientUnits','userSpaceOnUse');
@@ -7003,7 +6363,7 @@
     var stop, j, jLen;
     jLen = data.g.p*4;
     for(j=0;j<jLen;j+=4){
-        stop = createNS('stop');
+        stop = _ct('stop');
         gfill.appendChild(stop);
         stops.push(stop);
     }
@@ -7013,23 +6373,23 @@
     this.cst = stops;
 }
 
-SVGGradientFillStyleData.prototype.setGradientOpacity = function(data, styleOb){
+_ck.prototype.setGradientOpacity = function(data, styleOb){
     if(this.g._hasOpacity && !this.g._collapsable){
         var stop, j, jLen;
-        var mask = createNS("mask");
-        var maskElement = createNS( 'path');
+        var mask = _ct("mask");
+        var maskElement = _ct( 'path');
         mask.appendChild(maskElement);
         var opacityId = 'op_'+randomString(10);
         var maskId = 'mk_'+randomString(10);
         mask.setAttribute('id',maskId);
-        var opFill = createNS(data.t === 1 ? 'linearGradient' : 'radialGradient');
+        var opFill = _ct(data.t === 1 ? 'linearGradient' : 'radialGradient');
         opFill.setAttribute('id',opacityId);
         opFill.setAttribute('spreadMethod','pad');
         opFill.setAttribute('gradientUnits','userSpaceOnUse');
         jLen = data.g.k.k[0].s ? data.g.k.k[0].s.length : data.g.k.k.length;
         var stops = this.stops;
         for(j=data.g.p*4;j<jLen;j+=2){
-            stop = createNS('stop');
+            stop = _ct('stop');
             stop.setAttribute('stop-color','rgb(255,255,255)');
             opFill.appendChild(stop);
             stops.push(stop);
@@ -7042,19 +6402,19 @@
         styleOb.msElem = maskElement;
     }
 };
-function SVGGradientStrokeStyleData(elem, data, dynamicProperties, styleOb){
-	this.w = _ai._bo(elem,data.w,0,null,dynamicProperties);
-	this.d = new DashProperty(elem,data.d||{},'svg',dynamicProperties);
-    this.initGradientData(elem, data, dynamicProperties, styleOb);
+function _cj(elem, data, _co, styleOb){
+	this.w = _ai._bo(elem,data.w,0,null,_co);
+	this.d = new DashProperty(elem,data.d||{},'svg',_co);
+    this.initGradientData(elem, data, _co, styleOb);
 }
 
-SVGGradientStrokeStyleData.prototype.initGradientData = SVGGradientFillStyleData.prototype.initGradientData;
-SVGGradientStrokeStyleData.prototype.setGradientData = SVGGradientFillStyleData.prototype.setGradientData;
-SVGGradientStrokeStyleData.prototype.setGradientOpacity = SVGGradientFillStyleData.prototype.setGradientOpacity;
+_cj.prototype.initGradientData = _ck.prototype.initGradientData;
+_cj.prototype.setGradientData = _ck.prototype.setGradientData;
+_cj.prototype.setGradientOpacity = _ck.prototype.setGradientOpacity;
 function ShapeGroupData() {
 	this.it = [];
     this.prevViewData = [];
-    this.gr = createNS('g');
+    this.gr = _ct('g');
 }
 function _e(){
 };
@@ -7091,56 +6451,26 @@
     }
 }
 
+_e.prototype.blendModeEnums = {
+    1:'multiply',
+    2:'screen',
+    3:'overlay',
+    4:'darken',
+    5:'lighten',
+    6:'color-dodge',
+    7:'color-burn',
+    8:'hard-light',
+    9:'soft-light',
+    10:'difference',
+    11:'exclusion',
+    12:'hue',
+    13:'saturation',
+    14:'color',
+    15:'luminosity'
+}
+
 _e.prototype.getBlendMode = function(){
-    var blendModeValue = '';
-    switch(this.data.bm){
-        case 1:
-            blendModeValue = 'multiply';
-            break;
-        case 2:
-            blendModeValue = 'screen';
-            break;
-        case 3:
-            blendModeValue = 'overlay';
-            break;
-        case 4:
-            blendModeValue = 'darken';
-            break;
-        case 5:
-            blendModeValue = 'lighten';
-            break;
-        case 6:
-            blendModeValue = 'color-dodge';
-            break;
-        case 7:
-            blendModeValue = 'color-burn';
-            break;
-        case 8:
-            blendModeValue = 'hard-light';
-            break;
-        case 9:
-            blendModeValue = 'soft-light';
-            break;
-        case 10:
-            blendModeValue = 'difference';
-            break;
-        case 11:
-            blendModeValue = 'exclusion';
-            break;
-        case 12:
-            blendModeValue = 'hue';
-            break;
-        case 13:
-            blendModeValue = 'saturation';
-            break;
-        case 14:
-            blendModeValue = 'color';
-            break;
-        case 15:
-            blendModeValue = 'luminosity';
-            break;
-    }
-    return blendModeValue;
+    return this.blendModeEnums[this.data.bm] || '';
 }
 
 _e.prototype.setBlendMode = function(){
@@ -7161,7 +6491,7 @@
         this.data.sr = 1;
     }
     // effects manager
-    this.effects = new EffectsManager(this.data,this,this.dynamicProperties);
+    this.effects = new EffectsManager(this.data,this,this._co);
     
 };
 
@@ -7203,11 +6533,11 @@
 };
 
 _d.prototype.initRendererElement = function() {
-    this._bx = createNS('g');
+    this._bx = _ct('g');
 }
 
 _d.prototype.createContainerElements = function(){
-    this.matteElement = createNS('g');
+    this.matteElement = _ct('g');
     this._bz = this._bx;
     this._ca = this._bx;
     this._sizeChanged = false;
@@ -7215,7 +6545,7 @@
     //If this layer acts as a mask for the following layer
     if (this.data.td) {
         if (this.data.td == 3 || this.data.td == 1) {
-            var masker = createNS('mask');
+            var masker = _ct('mask');
             masker.setAttribute('id', this.layerId);
             masker.setAttribute('mask-type', this.data.td == 3 ? 'luminance' : 'alpha');
             masker.appendChild(this._bx);
@@ -7228,38 +6558,38 @@
                 var fil = filtersFactory.createFilter(filId);
                 this._x.defs.appendChild(fil);
                 fil.appendChild(filtersFactory.createAlphaToLuminanceFilter());
-                var gg = createNS('g');
+                var gg = _ct('g');
                 gg.appendChild(this._bx);
                 _bw = gg;
                 masker.appendChild(gg);
                 gg.setAttribute('filter','url(' + locationHref + '#' + filId + ')');
             }
         } else if(this.data.td == 2) {
-            var maskGroup = createNS('mask');
+            var maskGroup = _ct('mask');
             maskGroup.setAttribute('id', this.layerId);
             maskGroup.setAttribute('mask-type','alpha');
-            var maskGrouper = createNS('g');
+            var maskGrouper = _ct('g');
             maskGroup.appendChild(maskGrouper);
             var filId = randomString(10);
             var fil = filtersFactory.createFilter(filId);
             ////
 
-            var feColorMatrix = createNS('feColorMatrix');
+            var feColorMatrix = _ct('feColorMatrix');
             feColorMatrix.setAttribute('type', 'matrix');
             feColorMatrix.setAttribute('color-interpolation-filters', 'sRGB');
             feColorMatrix.setAttribute('values','1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 -1 1');
             fil.appendChild(feColorMatrix);
 
             ////
-            /*var feCTr = createNS('feComponentTransfer');
+            /*var feCTr = _ct('feComponentTransfer');
             feCTr.setAttribute('in','SourceGraphic');
             fil.appendChild(feCTr);
-            var feFunc = createNS('feFuncA');
+            var feFunc = _ct('feFuncA');
             feFunc.setAttribute('type','table');
             feFunc.setAttribute('tableValues','1.0 0.0');
             feCTr.appendChild(feFunc);*/
             this._x.defs.appendChild(fil);
-            var alphaRect = createNS('rect');
+            var alphaRect = _ct('rect');
             alphaRect.setAttribute('width',  this.comp.data.w);
             alphaRect.setAttribute('height', this.comp.data.h);
             alphaRect.setAttribute('x','0');
@@ -7273,7 +6603,7 @@
             if (!featureSupport.maskType) {
                 maskGroup.setAttribute('mask-type', 'luminance');
                 fil.appendChild(filtersFactory.createAlphaToLuminanceFilter());
-                var gg = createNS('g');
+                var gg = _ct('g');
                 maskGrouper.appendChild(alphaRect);
                 gg.appendChild(this._bx);
                 _bw = gg;
@@ -7298,8 +6628,8 @@
     }
     //Clipping compositions to hide content that exceeds boundaries. If collapsed transformations is on, component should not be clipped
     if (this.data.ty === 0 && !this.data.hd) {
-        var cp = createNS( 'clipPath');
-        var pt = createNS('path');
+        var cp = _ct( 'clipPath');
+        var pt = _ct('path');
         pt.setAttribute('d','M0,0 L' + this.data.w + ',0' + ' L' + this.data.w + ',' + this.data.h + ' L0,' + this.data.h + 'z');
         var clipId = 'cp_'+randomString(8);
         cp.setAttribute('id',clipId);
@@ -7307,7 +6637,7 @@
         this._x.defs.appendChild(cp);
 
         if (this.checkMasks()) {
-            var cpGroup = createNS('g');
+            var cpGroup = _ct('g');
             cpGroup.setAttribute('clip-path','url(' + locationHref + '#'+clipId + ')');
             cpGroup.appendChild(this._bx);
             this._bz = cpGroup;
@@ -7360,524 +6690,94 @@
     this.matteElement.setAttribute("mask", "url(" + locationHref + "#" + id + ")");
 };
 
-function _f(data,_x,comp){
-    //List of drawable _br
-    this.shapes = [];
-    // Full shape data
-    this.shapesData = data.shapes;
-    //List of styles that will be applied to shapes
-    this.stylesList = [];
-    //List of modifiers that will be applied to shapes
-    this.shapeModifiers = [];
-    //List of items in shape tree
-    this.itemsData = [];
-    //List of items in previous shape tree
-    this.processedElements = [];
-    this.initElement(data,_x,comp);
-    //Moving any property that doesn't get too much access after initialization because of v8 way of handling more than 10 properties.
-    // List of _br that have been created
-    this.prevViewData = [];
+function _f(){
 }
 
-extendPrototype([_e,_af,_d,_ad,_ac,RenderableDOMElement], _f);
-
-_f.prototype.initSecondaryElement = function() {
-}
-
-_f.prototype.identityMatrix = new Matrix();
-
-_f.prototype.lcEnum = {
-    '1': 'butt',
-    '2': 'round',
-    '3': 'square'
-}
-
-_f.prototype.ljEnum = {
-    '1': 'miter',
-    '2': 'round',
-    '3': 'butt'
-}
-
-_f.prototype.searchProcessedElement = function(elem){
-    var i = 0, len = this.processedElements.length;
-    while(i < len){
-        if(this.processedElements[i].elem === elem){
-            return this.processedElements[i].pos;
+_f.prototype = {
+    addShapeToModifiers: function(data) {
+        var i, len = this.shapeModifiers.length;
+        for(i=0;i<len;i+=1){
+            this.shapeModifiers[i].addShape(data);
         }
-        i += 1;
-    }
-    return 0;
-};
-
-_f.prototype.addProcessedElement = function(elem, pos){
-    var i = this.processedElements.length;
-    while(i){
-        i -= 1;
-        if(this.processedElements[i].elem === elem){
-            this.processedElements[i].pos = pos;
-            break;
+    },
+    renderModifiers: function() {
+        if(!this.shapeModifiers.length){
+            return;
         }
-    }
-    if(i === 0){
-        this.processedElements.push(new ProcessedElement(elem, pos));
-    }
-};
-
-_f.prototype.buildExpressionInterface = function(){};
-
-_f.prototype.createContent = function(){
-    this.searchShapes(this.shapesData,this.itemsData,this.prevViewData,this._bx,this.dynamicProperties, 0, [], true);
-};
-
-_f.prototype.createStyleElement = function(data, level, dynamicProperties){
-    //TODO: prevent drawing of hidden styles
-    var elementData;
-    var styleOb = new SVGStyleData(data, level);
-
-    var pathElement = styleOb.pElem;
-    if(data.ty === 'st') {
-        elementData = new SVGStrokeStyleData(this, data, dynamicProperties, styleOb);
-    } else if(data.ty === 'fl') {
-        elementData = new SVGFillStyleData(this, data, dynamicProperties, styleOb);
-    } else if(data.ty === 'gf' || data.ty === 'gs') {
-        var gradientConstructor = data.ty === 'gf' ? SVGGradientFillStyleData : SVGGradientStrokeStyleData;
-        elementData = new gradientConstructor(this, data, dynamicProperties, styleOb);
-        this._x.defs.appendChild(elementData.gf);
-        if (elementData.maskId) {
-            this._x.defs.appendChild(elementData.ms);
-            this._x.defs.appendChild(elementData.of);
-            pathElement.setAttribute('mask','url(#' + elementData.maskId + ')');
+        var i, len = this.shapes.length;
+        for(i=0;i<len;i+=1){
+            this.shapes[i].reset();
         }
-    }
-    
-    if(data.ty === 'st' || data.ty === 'gs') {
-        pathElement.setAttribute('stroke-linecap', this.lcEnum[data.lc] || 'round');
-        pathElement.setAttribute('stroke-linejoin',this.ljEnum[data.lj] || 'round');
-        pathElement.setAttribute('fill-opacity','0');
-        if(data.lj === 1) {
-            pathElement.setAttribute('stroke-miterlimit',data.ml);
+
+        len = this.shapeModifiers.length;
+        for(i=len-1;i>=0;i-=1){
+            this.shapeModifiers[i].processShapes(this._ch);
         }
-    }
-
-    if(data.r === 2) {
-        pathElement.setAttribute('fill-rule', 'evenodd');
-    }
-
-    if(data.ln){
-        pathElement.setAttribute('id',data.ln);
-    }
-    if(data.cl){
-        pathElement.setAttribute('class',data.cl);
-    }
-    this.stylesList.push(styleOb);
-    return elementData;
-}
-
-_f.prototype.createGroupElement = function(data) {
-    var elementData = new ShapeGroupData();
-    if(data.ln){
-        elementData.gr.setAttribute('id',data.ln);
-    }
-    return elementData;
-}
-
-_f.prototype.create_af = function(data, dynamicProperties) {
-    return new SVGTransformData(_ag._bj(this,data,dynamicProperties), _ai._bo(this,data.o,0,0.01,dynamicProperties))
-}
-
-_f.prototype.createShapeElement = function(data, ownTransformers, level, dynamicProperties) {
-    var ty = 4;
-    if(data.ty === 'rc'){
-        ty = 5;
-    }else if(data.ty === 'el'){
-        ty = 6;
-    }else if(data.ty === 'sr'){
-        ty = 7;
-    }
-    var shapeProperty = _ah._bp(this,data,ty,dynamicProperties);
-    var elementData = new SVGShapeData(ownTransformers, level, shapeProperty)
-    this.shapes.push(elementData.sh);
-    this.addShapeToModifiers(elementData);
-    return elementData;
-}
-
-_f.prototype.setElementStyles = function(elementData){
-    var arr = elementData.styles;
-    var j, jLen = this.stylesList.length;
-    for (j = 0; j < jLen; j += 1) {
-        if (!this.stylesList[j].closed) {
-            arr.push(this.stylesList[j]);
+    },
+    lcEnum: {
+        '1': 'butt',
+        '2': 'round',
+        '3': 'square'
+    },
+    ljEnum: {
+        '1': 'miter',
+        '2': 'round',
+        '3': 'butt'
+    },
+    searchProcessedElement: function(elem){
+        var i = 0, len = this.processedElements.length;
+        while(i < len){
+            if(this.processedElements[i].elem === elem){
+                return this.processedElements[i].pos;
+            }
+            i += 1;
         }
-    }
-}
-
-_f.prototype.reloadShapes = function(){
-    this.firstFrame = true;
-    var i, len = this.itemsData.length;
-    for( i = 0; i < len; i += 1) {
-        this.prevViewData[i] = this.itemsData[i];
-    }
-    this.searchShapes(this.shapesData,this.itemsData,this.prevViewData,this._bx,this.dynamicProperties, 0, [], true);
-    var i, len = this.dynamicProperties.length;
-    for(i = 0; i < len; i += 1) {
-        this.dynamicProperties[i].getValue();
-    }
-    this.renderModifiers();
-}
-
-_f.prototype.searchShapes = function(arr,itemsData,prevViewData,container,dynamicProperties, level, transformers, render){
-    var ownTransformers = [].concat(transformers);
-    var i, len = arr.length - 1;
-    var j, jLen;
-    var ownStyles = [], ownModifiers = [], styleOb, currentTransform, modifier, processedPos;
-    for(i=len;i>=0;i-=1){
-        processedPos = this.searchProcessedElement(arr[i]);
-        if(!processedPos){
-            arr[i]._render = render;
-        } else {
-            itemsData[i] = prevViewData[processedPos - 1];
+        return 0;
+    },
+    addProcessedElement: function(elem, pos){
+        var i = this.processedElements.length;
+        while(i){
+            i -= 1;
+            if(this.processedElements[i].elem === elem){
+                this.processedElements[i].pos = pos;
+                break;
+            }
         }
-        if(arr[i].ty == 'fl' || arr[i].ty == 'st' || arr[i].ty == 'gf' || arr[i].ty == 'gs'){
-            if(!processedPos){
-                itemsData[i] = this.createStyleElement(arr[i], level, dynamicProperties);
-            } else {
-                itemsData[i].style.closed = false;
-            }
-            if(arr[i]._render){
-                container.appendChild(itemsData[i].style.pElem);
-            }
-            ownStyles.push(itemsData[i].style);
-        }else if(arr[i].ty == 'gr'){
-            if(!processedPos){
-                itemsData[i] = this.createGroupElement(arr[i]);
-            } else {
-                jLen = itemsData[i].it.length;
-                for(j=0;j<jLen;j+=1){
-                    itemsData[i].prevViewData[j] = itemsData[i].it[j];
-                }
-            }
-            this.searchShapes(arr[i].it,itemsData[i].it,itemsData[i].prevViewData,itemsData[i].gr,dynamicProperties, level + 1, ownTransformers, render);
-            if(arr[i]._render){
-                container.appendChild(itemsData[i].gr);
-            }
-        }else if(arr[i].ty == 'tr'){
-            if(!processedPos){
-                itemsData[i] = this.create_af(arr[i], dynamicProperties);
-            }
-            currentTransform = itemsData[i].transform;
-            ownTransformers.push(currentTransform);
-        }else if(arr[i].ty == 'sh' || arr[i].ty == 'rc' || arr[i].ty == 'el' || arr[i].ty == 'sr'){
-            if(!processedPos){
-                itemsData[i] = this.createShapeElement(arr[i], ownTransformers, level, dynamicProperties);
-            }
-            this.setElementStyles(itemsData[i]);
-
-        }else if(arr[i].ty == 'tm' || arr[i].ty == 'rd' || arr[i].ty == 'ms'){
-            if(!processedPos){
-                modifier = _as.getModifier(arr[i].ty);
-                modifier.init(this,arr[i],dynamicProperties);
-                itemsData[i] = modifier;
-                this.shapeModifiers.push(modifier);
-            } else {
-                modifier = itemsData[i];
-                modifier.closed = false;
-            }
-            ownModifiers.push(modifier);
-        }else if(arr[i].ty == 'rp'){
-            if(!processedPos){
-                modifier = _as.getModifier(arr[i].ty);
-                itemsData[i] = modifier;
-                modifier.init(this,arr,i,itemsData,dynamicProperties);
-                this.shapeModifiers.push(modifier);
-                render = false;
-            }else{
-                modifier = itemsData[i];
-                modifier.closed = true;
-            }
-            ownModifiers.push(modifier);
+        if(i === 0){
+            this.processedElements.push(new ProcessedElement(elem, pos));
         }
-        this.addProcessedElement(arr[i], i + 1);
-    }
-    len = ownStyles.length;
-    for(i=0;i<len;i+=1){
-        ownStyles[i].closed = true;
-    }
-    len = ownModifiers.length;
-    for(i=0;i<len;i+=1){
-        ownModifiers[i].closed = true;
-    }
-};
-
-_f.prototype.addShapeToModifiers = function(data) {
-    var i, len = this.shapeModifiers.length;
-    for(i=0;i<len;i+=1){
-        this.shapeModifiers[i].addShape(data);
-    }
-};
-
-_f.prototype.renderModifiers = function() {
-    if(!this.shapeModifiers.length){
-        return;
-    }
-    var i, len = this.shapes.length;
-    for(i=0;i<len;i+=1){
-        this.shapes[i].reset();
-    }
-
-    len = this.shapeModifiers.length;
-    for(i=len-1;i>=0;i-=1){
-        this.shapeModifiers[i].processShapes(this.firstFrame);
-    }
-};
-
-_f.prototype._az = function(num) {
-    this.prepareRenderableFrame(num);
-    this.prepareProperties(num, this.isInRange);
-};
-
-_f.prototype.renderInnerContent = function() {
-    this.renderModifiers();
-    var i, len = this.stylesList.length;
-    for(i=0;i<len;i+=1){
-        this.stylesList[i].reset();
-    }
-    this.renderShape(this.shapesData,this.itemsData, null);
-
-    for (i = 0; i < len; i += 1) {
-        if (this.stylesList[i].mdf || this.firstFrame) {
-            if(this.stylesList[i].msElem){
-                this.stylesList[i].msElem.setAttribute('d', this.stylesList[i].d);
-                //Adding M0 0 fixes same mask bug on all browsers
-                this.stylesList[i].d = 'M0 0' + this.stylesList[i].d;
+    },
+    _az: function(num) {
+        this.prepareRenderableFrame(num);
+        this.prepareProperties(num, this.isInRange);
+    },
+    buildShapeString: function(pathNodes, length, closed, mat) {
+        var i, shapeString = '';
+        for(i = 1; i < length; i += 1) {
+            if (i === 1) {
+                shapeString += " M" + mat.applyToPointStringified(pathNodes.v[0][0], pathNodes.v[0][1]);
             }
-            this.stylesList[i].pElem.setAttribute('d', this.stylesList[i].d || 'M0 0');
+            shapeString += " C" + mat.applyToPointStringified(pathNodes.o[i - 1][0], pathNodes.o[i - 1][1]) + " " + mat.applyToPointStringified(pathNodes.i[i][0], pathNodes.i[i][1]) + " " + mat.applyToPointStringified(pathNodes.v[i][0], pathNodes.v[i][1]);
         }
-    }
-};
-
-
-_f.prototype.renderShape = function(items, data, container) {
-    //TODO: find out why a container could be missing
-    var i, len = items.length - 1;
-    var ty;
-    for(i=0;i<=len;i+=1){
-        ty = items[i].ty;
-        if(ty == 'tr'){
-            if(this.firstFrame || data[i].transform.op.mdf && container){
-                container.setAttribute('opacity',data[i].transform.op.v);
-            }
-            if(this.firstFrame || data[i].transform.mProps.mdf && container){
-                container.setAttribute('transform',data[i].transform.mProps.v.to2dCSS());
-            }
-        }else if(items[i]._render && (ty == 'sh' || ty == 'el' || ty == 'rc' || ty == 'sr')){
-            this.renderPath(data[i]);
-        }else if(ty == 'fl'){
-            this.renderFill(items[i],data[i]);
-        }else if(ty == 'gf'){
-            this.renderGradient(items[i],data[i]);
-        }else if(ty == 'gs'){
-            this.renderGradient(items[i],data[i]);
-            this.renderStroke(items[i],data[i]);
-        }else if(ty == 'st'){
-            this.renderStroke(items[i],data[i]);
-        }else if(ty == 'gr'){
-            this.renderShape(items[i].it,data[i].it, data[i].gr);
-        }else if(ty == 'tm'){
-            //
-        }
-    }
-
-};
-
-_f.prototype.buildShapeString = function(pathNodes, length, closed, mat) {
-    var i, shapeString = '';
-    for(i = 1; i < length; i += 1) {
-        if (i === 1) {
+        if (length === 1) {
             shapeString += " M" + mat.applyToPointStringified(pathNodes.v[0][0], pathNodes.v[0][1]);
         }
-        shapeString += " C" + mat.applyToPointStringified(pathNodes.o[i - 1][0], pathNodes.o[i - 1][1]) + " " + mat.applyToPointStringified(pathNodes.i[i][0], pathNodes.i[i][1]) + " " + mat.applyToPointStringified(pathNodes.v[i][0], pathNodes.v[i][1]);
-    }
-    if (length === 1) {
-        shapeString += " M" + mat.applyToPointStringified(pathNodes.v[0][0], pathNodes.v[0][1]);
-    }
-    if (closed && length) {
-        shapeString += " C" + mat.applyToPointStringified(pathNodes.o[i - 1][0], pathNodes.o[i - 1][1]) + " " + mat.applyToPointStringified(pathNodes.i[0][0], pathNodes.i[0][1]) + " " + mat.applyToPointStringified(pathNodes.v[0][0], pathNodes.v[0][1]);
-        shapeString += 'z';
-    }
-    return shapeString;
-};
-
-_f.prototype.renderPath = function(itemData){
-    var j, jLen,pathStringTransformed,redraw,pathNodes,l, lLen = itemData.styles.length;
-    var lvl = itemData.lvl;
-    var paths, mat, props, iterations, k;
-    for(l=0;l<lLen;l+=1){
-        redraw = itemData.sh.mdf || this.firstFrame;
-        if(itemData.styles[l].lvl < lvl){
-            mat = this.mHelper.reset();
-            iterations = lvl - itemData.styles[l].lvl;
-            k = itemData.transformers.length-1;
-            while(iterations > 0) {
-                redraw = itemData.transformers[k].mProps.mdf || redraw;
-                props = itemData.transformers[k].mProps.v.props;
-                mat.transform(props[0],props[1],props[2],props[3],props[4],props[5],props[6],props[7],props[8],props[9],props[10],props[11],props[12],props[13],props[14],props[15]);
-                iterations --;
-                k --;
-            }
-        } else {
-            mat = this.identityMatrix;
+        if (closed && length) {
+            shapeString += " C" + mat.applyToPointStringified(pathNodes.o[i - 1][0], pathNodes.o[i - 1][1]) + " " + mat.applyToPointStringified(pathNodes.i[0][0], pathNodes.i[0][1]) + " " + mat.applyToPointStringified(pathNodes.v[0][0], pathNodes.v[0][1]);
+            shapeString += 'z';
         }
-        paths = itemData.sh.paths;
-        jLen = paths._length;
-        if(redraw){
-            pathStringTransformed = '';
-            for(j=0;j<jLen;j+=1){
-                pathNodes = paths.shapes[j];
-                if(pathNodes && pathNodes._length){
-                    pathStringTransformed += this.buildShapeString(pathNodes, pathNodes._length, pathNodes.c, mat);
-                }
-            }
-            itemData.caches[l] = pathStringTransformed;
-        } else {
-            pathStringTransformed = itemData.caches[l];
-        }
-        itemData.styles[l].d += pathStringTransformed;
-        itemData.styles[l].mdf = redraw || itemData.styles[l].mdf;
+        return shapeString;
     }
-};
-
-_f.prototype.renderFill = function(styleData,itemData){
-    var styleElem = itemData.style;
-
-    if(itemData.c.mdf || this.firstFrame){
-        styleElem.pElem.setAttribute('fill','rgb('+bm_floor(itemData.c.v[0])+','+bm_floor(itemData.c.v[1])+','+bm_floor(itemData.c.v[2])+')');
-    }
-    if(itemData.o.mdf || this.firstFrame){
-        styleElem.pElem.setAttribute('fill-opacity',itemData.o.v);
-    }
-};
-
-_f.prototype.renderGradient = function(styleData, itemData) {
-    var gfill = itemData.gf;
-    var hasOpacity = itemData.g._hasOpacity;
-    var pt1 = itemData.s.v, pt2 = itemData.e.v;
-
-    if (itemData.o.mdf || this.firstFrame) {
-        var attr = styleData.ty === 'gf' ? 'fill-opacity' : 'stroke-opacity';
-        itemData.style.pElem.setAttribute(attr, itemData.o.v);
-    }
-    if (itemData.s.mdf || this.firstFrame) {
-        var attr1 = styleData.t === 1 ? 'x1' : 'cx';
-        var attr2 = attr1 === 'x1' ? 'y1' : 'cy';
-        gfill.setAttribute(attr1, pt1[0]);
-        gfill.setAttribute(attr2, pt1[1]);
-        if (hasOpacity && !itemData.g._collapsable) {
-            itemData.of.setAttribute(attr1, pt1[0]);
-            itemData.of.setAttribute(attr2, pt1[1]);
-        }
-    }
-    var stops, i, len, stop;
-    if (itemData.g.cmdf || this.firstFrame) {
-        stops = itemData.cst;
-        var cValues = itemData.g.c;
-        len = stops.length;
-        for (i = 0; i < len; i += 1){
-            stop = stops[i];
-            stop.setAttribute('offset', cValues[i * 4] + '%');
-            stop.setAttribute('stop-color','rgb('+ cValues[i * 4 + 1] + ',' + cValues[i * 4 + 2] + ','+cValues[i * 4 + 3] + ')');
-        }
-    }
-    if (hasOpacity && (itemData.g.omdf || this.firstFrame)) {
-        var oValues = itemData.g.o;
-        if(itemData.g._collapsable) {
-            stops = itemData.cst;
-        } else {
-            stops = itemData.ost;
-        }
-        len = stops.length;
-        for (i = 0; i < len; i += 1) {
-            stop = stops[i];
-            if(!itemData.g._collapsable) {
-                stop.setAttribute('offset', oValues[i * 2] + '%');
-            }
-            stop.setAttribute('stop-opacity', oValues[i * 2 + 1]);
-        }
-    }
-    if (styleData.t === 1) {
-        if (itemData.e.mdf  || this.firstFrame) {
-            gfill.setAttribute('x2', pt2[0]);
-            gfill.setAttribute('y2', pt2[1]);
-            if (hasOpacity && !itemData.g._collapsable) {
-                itemData.of.setAttribute('x2', pt2[0]);
-                itemData.of.setAttribute('y2', pt2[1]);
-            }
-        }
-    } else {
-        var rad;
-        if (itemData.s.mdf || itemData.e.mdf || this.firstFrame) {
-            rad = Math.sqrt(Math.pow(pt1[0] - pt2[0], 2) + Math.pow(pt1[1] - pt2[1], 2));
-            gfill.setAttribute('r', rad);
-            if(hasOpacity && !itemData.g._collapsable){
-                itemData.of.setAttribute('r', rad);
-            }
-        }
-        if (itemData.e.mdf || itemData.h.mdf || itemData.a.mdf || this.firstFrame) {
-            if (!rad) {
-                rad = Math.sqrt(Math.pow(pt1[0] - pt2[0], 2) + Math.pow(pt1[1] - pt2[1], 2));
-            }
-            var ang = Math.atan2(pt2[1] - pt1[1], pt2[0] - pt1[0]);
-
-            var percent = itemData.h.v >= 1 ? 0.99 : itemData.h.v <= -1 ? -0.99: itemData.h.v;
-            var dist = rad * percent;
-            var x = Math.cos(ang + itemData.a.v) * dist + pt1[0];
-            var y = Math.sin(ang + itemData.a.v) * dist + pt1[1];
-            gfill.setAttribute('fx', x);
-            gfill.setAttribute('fy', y);
-            if (hasOpacity && !itemData.g._collapsable) {
-                itemData.of.setAttribute('fx', x);
-                itemData.of.setAttribute('fy', y);
-            }
-        }
-        //gfill.setAttribute('fy','200');
-    }
-};
-
-_f.prototype.renderStroke = function(styleData, itemData) {
-    var styleElem = itemData.style;
-    var d = itemData.d;
-    if (d && (d.mdf || this.firstFrame)) {
-        styleElem.pElem.setAttribute('stroke-dasharray', d.dashStr);
-        styleElem.pElem.setAttribute('stroke-dashoffset', d.dashoffset[0]);
-    }
-    if(itemData.c && (itemData.c.mdf || this.firstFrame)){
-        styleElem.pElem.setAttribute('stroke','rgb(' + bm_floor(itemData.c.v[0]) + ',' + bm_floor(itemData.c.v[1]) + ',' + bm_floor(itemData.c.v[2]) + ')');
-    }
-    if(itemData.o.mdf || this.firstFrame){
-        styleElem.pElem.setAttribute('stroke-opacity', itemData.o.v);
-    }
-    if(itemData.w.mdf || this.firstFrame){
-        styleElem.pElem.setAttribute('stroke-width', itemData.w.v);
-        if(styleElem.msElem){
-            styleElem.msElem.setAttribute('stroke-width', itemData.w.v);
-        }
-    }
-};
-
-_f.prototype.destroy = function(){
-    this.destroy_e();
-    this.shapeData = null;
-    this.itemsData = null;
-};
-
+}
 function _k(){
 }
 
-_k.prototype.initElement = function(data,_x,comp){
+_k.prototype._cz = function(data,_x,comp){
     this.lettersChangedFlag = true;
     this.initFrame();
     this.initBaseData(data, _x, comp);
     this.textAnimator = new _bl(data.t, this.renderType, this);
-    this.textProperty = new _ar(this, data.t, this.dynamicProperties);
+    this.textProperty = new _ar(this, data.t, this._co);
     this.initTransform(data, _x, comp);
     this.initHierarchy();
     this.initRenderable();
@@ -7885,15 +6785,15 @@
     this.createContainerElements();
     this.addMasks();
     this.createContent();
-    this.textAnimator.searchProperties(this.dynamicProperties);
+    this.textAnimator.searchProperties(this._co);
 };
 
 _k.prototype._az = function(num) {
     this.prepareRenderableFrame(num);
     this.prepareProperties(num, this.isInRange);
-    if(this.textProperty.mdf || this.textProperty.firstFrame) {
+    if(this.textProperty.mdf || this.textProperty._ch) {
         this.buildNewText();
-        this.textProperty.firstFrame = false;
+        this.textProperty._ch = false;
     }
 }
 
@@ -7941,9 +6841,9 @@
 };
 function _g(){}
 
-extendPrototype([_e, _af, _ad, _ac, RenderableDOMElement], _g);
+extendPrototype([_e, _af, _ad, _ac, _ci], _g);
 
-_g.prototype.initElement = function(data,_x,comp) {
+_g.prototype._cz = function(data,_x,comp) {
     this.initFrame();
     this.initBaseData(data, _x, comp);
     this.initTransform(data, _x, comp);
@@ -7987,11 +6887,11 @@
         this.renderedFrame = num/this.data.sr;
     }
     var i,len = this._br.length;
-    if(!this.completeLayers){
+    if(!this._db){
         this.checkLayers(this.renderedFrame);
     }
     for( i = 0; i < len; i+=1 ){
-        if(this.completeLayers || this._br[i]){
+        if(this._db || this._br[i]){
             this._br[i]._az(this.renderedFrame - this.layers[i].st);
         }
     }
@@ -8000,7 +6900,7 @@
 _g.prototype.renderInnerContent = function() {
     var i,len = this.layers.length;
     for( i = 0; i < len; i += 1 ){
-        if(this.completeLayers || this._br[i]){
+        if(this._db || this._br[i]){
             this._br[i]._ba();
         }
     }
@@ -8030,16 +6930,16 @@
 
 function _h(data,_x,comp){
     this.assetData = _x.getAssetData(data.refId);
-    this.initElement(data,_x,comp);
+    this._cz(data,_x,comp);
 }
 
-extendPrototype([_e,_af,_d,_ad,_ac,RenderableDOMElement], _h);
+extendPrototype([_e,_af,_d,_ad,_ac,_ci], _h);
 
 _h.prototype.createContent = function(){
 
     var assetPath = this._x.getAssetsPath(this.assetData);
 
-    this._cc = createNS('image');
+    this._cc = _ct('image');
     this._cc.setAttribute('width',this.assetData.w+"px");
     this._cc.setAttribute('height',this.assetData.h+"px");
     this._cc.setAttribute('preserveAspectRatio','xMidYMid slice');
@@ -8051,13 +6951,13 @@
 };
 
 function _j(data,_x,comp){
-    this.initElement(data,_x,comp);
+    this._cz(data,_x,comp);
 }
 extendPrototype([_h], _j);
 
 _j.prototype.createContent = function(){
 
-    var rect = createNS('rect');
+    var rect = _ct('rect');
     ////rect.style.width = this.data.sw;
     ////rect.style.height = this.data.sh;
     ////rect.style.fill = this.data.sc;
@@ -8069,24 +6969,24 @@
 function SVGCompElement(data,_x,comp){
     this.layers = data.layers;
     this.supports3d = true;
-    this.completeLayers = false;
-    this.pendingElements = [];
-    this._br = this.layers ? Array.apply(null,{length:this.layers.length}) : [];
-    //this._bx = createNS('g');
-    this.initElement(data,_x,comp);
-    this.tm = data.tm ? _ai._bo(this,data.tm,0,_x.frameRate,this.dynamicProperties) : {_placeholder:true};
+    this._db = false;
+    this._dc = [];
+    this._br = this.layers ? _cv(this.layers.length) : [];
+    //this._bx = _ct('g');
+    this._cz(data,_x,comp);
+    this.tm = data.tm ? _ai._bo(this,data.tm,0,_x.frameRate,this._co) : {_placeholder:true};
 }
 
 extendPrototype([_ao, _g, _d], SVGCompElement);
-function SVGTextElement(data,_x,comp){
+function _cw(data,_x,comp){
     this.textSpans = [];
     this.renderType = 'svg';
-    this.initElement(data,_x,comp);
+    this._cz(data,_x,comp);
 }
 
-extendPrototype([_e,_af,_d,_ad,_ac,RenderableDOMElement,_k], SVGTextElement);
+extendPrototype([_e,_af,_d,_ad,_ac,_ci,_k], _cw);
 
-SVGTextElement.prototype.createContent = function(){
+_cw.prototype.createContent = function(){
 
     if(this.data.ln){
         this._bx.setAttribute('id',this.data.ln);
@@ -8094,16 +6994,16 @@
     if(this.data.cl){
         this._bx.setAttribute('class',this.data.cl);
     }
-    if (this.data.singleShape && !this._x.fontManager.chars) {
-        this.textContainer = createNS('text');
+    if (this.data.singleShape && !this._x._cr.chars) {
+        this.textContainer = _ct('text');
     }
 };
 
-SVGTextElement.prototype.buildNewText = function(){
+_cw.prototype.buildNewText = function(){
     var i, len;
 
     var documentData = this.textProperty.currentData;
-    this._bt = Array.apply(null,{length:documentData ? documentData.l.length : 0});
+    this._bt = _cv(documentData ? documentData.l.length : 0);
     if(documentData.fc) {
         this._bx.setAttribute('fill', this.buildColor(documentData.fc));
     }else{
@@ -8114,7 +7014,7 @@
         this._bx.setAttribute('stroke-width', documentData.sw);
     }
     this._bx.setAttribute('font-size', documentData.s);
-    var fontData = this._x.fontManager.getFontByName(documentData.f);
+    var fontData = this._x._cr.getFontByName(documentData.f);
     if(fontData.fClass){
         this._bx.setAttribute('class',fontData.fClass);
     } else {
@@ -8125,7 +7025,7 @@
     }
 
     var letters = documentData.l || [];
-    var usesGlyphs = this._x.fontManager.chars;
+    var usesGlyphs = this._x._cr.chars;
     len = letters.length;
     if(!len){
         return;
@@ -8155,7 +7055,7 @@
         len = textContent.length;
         var yPos = documentData.ps ? documentData.ps[1] + documentData.ascent : 0;
         for ( i = 0; i < len; i += 1) {
-            tSpan = this.textSpans[i] || createNS('tspan');
+            tSpan = this.textSpans[i] || _ct('tspan');
             tSpan.textContent = textContent[i];
             tSpan.setAttribute('x', 0);
             tSpan.setAttribute('y', yPos);
@@ -8171,7 +7071,7 @@
         var shapeData, charData;
         for (i = 0; i < len; i += 1) {
             if(!usesGlyphs || !singleShape || i === 0){
-                tSpan = cachedSpansLength > i ? this.textSpans[i] : createNS(usesGlyphs?'path':'text');
+                tSpan = cachedSpansLength > i ? this.textSpans[i] : _ct(usesGlyphs?'path':'text');
                 if (cachedSpansLength <= i) {
                     tSpan.setAttribute('stroke-linecap', 'butt');
                     tSpan.setAttribute('stroke-linejoin','round');
@@ -8197,7 +7097,7 @@
                     //xPos += letters[i].val === ' ' ? 0 : trackingOffset;
                     xPos += trackingOffset;
                 }
-                charData = this._x.fontManager.getCharData(documentData.t.charAt(i), fontData.fStyle, this._x.fontManager.getFontByName(documentData.f).fFamily);
+                charData = this._x._cr.getCharData(documentData.t.charAt(i), fontData.fStyle, this._x._cr.getFontByName(documentData.f).fFamily);
                 shapeData = charData && charData.data || {};
                 shapes = shapeData.shapes ? shapeData.shapes[0].it : [];
                 if(!singleShape){
@@ -8223,7 +7123,7 @@
     this._sizeChanged = true;
 }
 
-SVGTextElement.prototype.sourceRectAtTime = function(time){
+_cw.prototype.sourceRectAtTime = function(time){
     this._az(this.comp.renderedFrame - this.data.st);
     this.renderInnerContent();
     if(this._sizeChanged){
@@ -8239,7 +7139,7 @@
     return this.bbox;
 }
 
-SVGTextElement.prototype.renderInnerContent = function(){
+_cw.prototype.renderInnerContent = function(){
 
     if(!this.data.singleShape){
         this.textAnimator.getMeasures(this.textProperty.currentData, this.lettersChangedFlag);
@@ -8277,45 +7177,472 @@
         }
     }
 }
-function _bb(filter, filterManager){
-    this.filterManager = filterManager;
-    var feColorMatrix = createNS('feColorMatrix');
+function SVGShapeElement(data,_x,comp){
+    //List of drawable _br
+    this.shapes = [];
+    // Full shape data
+    this.shapesData = data.shapes;
+    //List of styles that will be applied to shapes
+    this.stylesList = [];
+    //List of modifiers that will be applied to shapes
+    this.shapeModifiers = [];
+    //List of items in shape tree
+    this.itemsData = [];
+    //List of items in previous shape tree
+    this.processedElements = [];
+    this._cz(data,_x,comp);
+    //Moving any property that doesn't get too much access after initialization because of v8 way of handling more than 10 properties.
+    // List of _br that have been created
+    this.prevViewData = [];
+}
+
+extendPrototype([_e,_af,_d,_f,_ad,_ac,_ci], SVGShapeElement);
+
+SVGShapeElement.prototype.initSecondaryElement = function() {
+}
+
+SVGShapeElement.prototype.identityMatrix = new Matrix();
+
+SVGShapeElement.prototype.buildExpressionInterface = function(){};
+
+SVGShapeElement.prototype.createContent = function(){
+    this.searchShapes(this.shapesData,this.itemsData,this.prevViewData,this._bx,this._co, 0, [], true);
+};
+
+SVGShapeElement.prototype.createStyleElement = function(data, level, _co){
+    //TODO: prevent drawing of hidden styles
+    var elementData;
+    var styleOb = new SVGStyleData(data, level);
+
+    var pathElement = styleOb.pElem;
+    if(data.ty === 'st') {
+        elementData = new SVGStrokeStyleData(this, data, _co, styleOb);
+    } else if(data.ty === 'fl') {
+        elementData = new SVGFillStyleData(this, data, _co, styleOb);
+    } else if(data.ty === 'gf' || data.ty === 'gs') {
+        var gradientConstructor = data.ty === 'gf' ? _ck : _cj;
+        elementData = new gradientConstructor(this, data, _co, styleOb);
+        this._x.defs.appendChild(elementData.gf);
+        if (elementData.maskId) {
+            this._x.defs.appendChild(elementData.ms);
+            this._x.defs.appendChild(elementData.of);
+            pathElement.setAttribute('mask','url(#' + elementData.maskId + ')');
+        }
+    }
+    
+    if(data.ty === 'st' || data.ty === 'gs') {
+        pathElement.setAttribute('stroke-linecap', this.lcEnum[data.lc] || 'round');
+        pathElement.setAttribute('stroke-linejoin',this.ljEnum[data.lj] || 'round');
+        pathElement.setAttribute('fill-opacity','0');
+        if(data.lj === 1) {
+            pathElement.setAttribute('stroke-miterlimit',data.ml);
+        }
+    }
+
+    if(data.r === 2) {
+        pathElement.setAttribute('fill-rule', 'evenodd');
+    }
+
+    if(data.ln){
+        pathElement.setAttribute('id',data.ln);
+    }
+    if(data.cl){
+        pathElement.setAttribute('class',data.cl);
+    }
+    this.stylesList.push(styleOb);
+    return elementData;
+}
+
+SVGShapeElement.prototype.createGroupElement = function(data) {
+    var elementData = new ShapeGroupData();
+    if(data.ln){
+        elementData.gr.setAttribute('id',data.ln);
+    }
+    return elementData;
+}
+
+SVGShapeElement.prototype._cp = function(data, _co) {
+    return new SVGTransformData(_ag._bj(this,data,_co), _ai._bo(this,data.o,0,0.01,_co))
+}
+
+SVGShapeElement.prototype.createShapeElement = function(data, ownTransformers, level, _co) {
+    var ty = 4;
+    if(data.ty === 'rc'){
+        ty = 5;
+    }else if(data.ty === 'el'){
+        ty = 6;
+    }else if(data.ty === 'sr'){
+        ty = 7;
+    }
+    var shapeProperty = _ah._bp(this,data,ty,_co);
+    var elementData = new SVGShapeData(ownTransformers, level, shapeProperty)
+    this.shapes.push(elementData.sh);
+    this.addShapeToModifiers(elementData);
+    return elementData;
+}
+
+SVGShapeElement.prototype.setElementStyles = function(elementData){
+    var arr = elementData.styles;
+    var j, jLen = this.stylesList.length;
+    for (j = 0; j < jLen; j += 1) {
+        if (!this.stylesList[j].closed) {
+            arr.push(this.stylesList[j]);
+        }
+    }
+}
+
+SVGShapeElement.prototype.reloadShapes = function(){
+    this._ch = true;
+    var i, len = this.itemsData.length;
+    for( i = 0; i < len; i += 1) {
+        this.prevViewData[i] = this.itemsData[i];
+    }
+    this.searchShapes(this.shapesData,this.itemsData,this.prevViewData,this._bx,this._co, 0, [], true);
+    var i, len = this._co.length;
+    for(i = 0; i < len; i += 1) {
+        this._co[i].getValue();
+    }
+    this.renderModifiers();
+}
+
+SVGShapeElement.prototype.searchShapes = function(arr,itemsData,prevViewData,container,_co, level, transformers, render){
+    var ownTransformers = [].concat(transformers);
+    var i, len = arr.length - 1;
+    var j, jLen;
+    var ownStyles = [], ownModifiers = [], styleOb, currentTransform, modifier, processedPos;
+    for(i=len;i>=0;i-=1){
+        processedPos = this.searchProcessedElement(arr[i]);
+        if(!processedPos){
+            arr[i]._render = render;
+        } else {
+            itemsData[i] = prevViewData[processedPos - 1];
+        }
+        if(arr[i].ty == 'fl' || arr[i].ty == 'st' || arr[i].ty == 'gf' || arr[i].ty == 'gs'){
+            if(!processedPos){
+                itemsData[i] = this.createStyleElement(arr[i], level, _co);
+            } else {
+                itemsData[i].style.closed = false;
+            }
+            if(arr[i]._render){
+                container.appendChild(itemsData[i].style.pElem);
+            }
+            ownStyles.push(itemsData[i].style);
+        }else if(arr[i].ty == 'gr'){
+            if(!processedPos){
+                itemsData[i] = this.createGroupElement(arr[i]);
+            } else {
+                jLen = itemsData[i].it.length;
+                for(j=0;j<jLen;j+=1){
+                    itemsData[i].prevViewData[j] = itemsData[i].it[j];
+                }
+            }
+            this.searchShapes(arr[i].it,itemsData[i].it,itemsData[i].prevViewData,itemsData[i].gr,_co, level + 1, ownTransformers, render);
+            if(arr[i]._render){
+                container.appendChild(itemsData[i].gr);
+            }
+        }else if(arr[i].ty == 'tr'){
+            if(!processedPos){
+                itemsData[i] = this._cp(arr[i], _co);
+            }
+            currentTransform = itemsData[i].transform;
+            ownTransformers.push(currentTransform);
+        }else if(arr[i].ty == 'sh' || arr[i].ty == 'rc' || arr[i].ty == 'el' || arr[i].ty == 'sr'){
+            if(!processedPos){
+                itemsData[i] = this.createShapeElement(arr[i], ownTransformers, level, _co);
+            }
+            this.setElementStyles(itemsData[i]);
+
+        }else if(arr[i].ty == 'tm' || arr[i].ty == 'rd' || arr[i].ty == 'ms'){
+            if(!processedPos){
+                modifier = _as.getModifier(arr[i].ty);
+                modifier.init(this,arr[i],_co);
+                itemsData[i] = modifier;
+                this.shapeModifiers.push(modifier);
+            } else {
+                modifier = itemsData[i];
+                modifier.closed = false;
+            }
+            ownModifiers.push(modifier);
+        }else if(arr[i].ty == 'rp'){
+            if(!processedPos){
+                modifier = _as.getModifier(arr[i].ty);
+                itemsData[i] = modifier;
+                modifier.init(this,arr,i,itemsData,_co);
+                this.shapeModifiers.push(modifier);
+                render = false;
+            }else{
+                modifier = itemsData[i];
+                modifier.closed = true;
+            }
+            ownModifiers.push(modifier);
+        }
+        this.addProcessedElement(arr[i], i + 1);
+    }
+    len = ownStyles.length;
+    for(i=0;i<len;i+=1){
+        ownStyles[i].closed = true;
+    }
+    len = ownModifiers.length;
+    for(i=0;i<len;i+=1){
+        ownModifiers[i].closed = true;
+    }
+};
+
+SVGShapeElement.prototype.renderInnerContent = function() {
+    this.renderModifiers();
+    var i, len = this.stylesList.length;
+    for(i=0;i<len;i+=1){
+        this.stylesList[i].reset();
+    }
+    this.renderShape(this.shapesData,this.itemsData, null);
+
+    for (i = 0; i < len; i += 1) {
+        if (this.stylesList[i].mdf || this._ch) {
+            if(this.stylesList[i].msElem){
+                this.stylesList[i].msElem.setAttribute('d', this.stylesList[i].d);
+                //Adding M0 0 fixes same mask bug on all browsers
+                this.stylesList[i].d = 'M0 0' + this.stylesList[i].d;
+            }
+            this.stylesList[i].pElem.setAttribute('d', this.stylesList[i].d || 'M0 0');
+        }
+    }
+};
+
+
+SVGShapeElement.prototype.renderShape = function(items, data, container) {
+    //TODO: find out why a container could be missing
+    var i, len = items.length - 1;
+    var ty;
+    for(i=0;i<=len;i+=1){
+        ty = items[i].ty;
+        if(ty == 'tr'){
+            if(this._ch || data[i].transform.op.mdf && container){
+                container.setAttribute('opacity',data[i].transform.op.v);
+            }
+            if(this._ch || data[i].transform.mProps.mdf && container){
+                container.setAttribute('transform',data[i].transform.mProps.v.to2dCSS());
+            }
+        }else if(items[i]._render && (ty == 'sh' || ty == 'el' || ty == 'rc' || ty == 'sr')){
+            this.renderPath(data[i]);
+        }else if(ty == 'fl'){
+            this.renderFill(items[i],data[i]);
+        }else if(ty == 'gf'){
+            this.renderGradient(items[i],data[i]);
+        }else if(ty == 'gs'){
+            this.renderGradient(items[i],data[i]);
+            this.renderStroke(items[i],data[i]);
+        }else if(ty == 'st'){
+            this.renderStroke(items[i],data[i]);
+        }else if(ty == 'gr'){
+            this.renderShape(items[i].it,data[i].it, data[i].gr);
+        }else if(ty == 'tm'){
+            //
+        }
+    }
+
+};
+
+SVGShapeElement.prototype.renderPath = function(itemData){
+    var j, jLen,pathStringTransformed,redraw,pathNodes,l, lLen = itemData.styles.length;
+    var lvl = itemData.lvl;
+    var paths, mat, props, iterations, k;
+    for(l=0;l<lLen;l+=1){
+        redraw = itemData.sh.mdf || this._ch;
+        if(itemData.styles[l].lvl < lvl){
+            mat = this.mHelper.reset();
+            iterations = lvl - itemData.styles[l].lvl;
+            k = itemData.transformers.length-1;
+            while(iterations > 0) {
+                redraw = itemData.transformers[k].mProps.mdf || redraw;
+                props = itemData.transformers[k].mProps.v.props;
+                mat.transform(props[0],props[1],props[2],props[3],props[4],props[5],props[6],props[7],props[8],props[9],props[10],props[11],props[12],props[13],props[14],props[15]);
+                iterations --;
+                k --;
+            }
+        } else {
+            mat = this.identityMatrix;
+        }
+        paths = itemData.sh.paths;
+        jLen = paths._length;
+        if(redraw){
+            pathStringTransformed = '';
+            for(j=0;j<jLen;j+=1){
+                pathNodes = paths.shapes[j];
+                if(pathNodes && pathNodes._length){
+                    pathStringTransformed += this.buildShapeString(pathNodes, pathNodes._length, pathNodes.c, mat);
+                }
+            }
+            itemData.caches[l] = pathStringTransformed;
+        } else {
+            pathStringTransformed = itemData.caches[l];
+        }
+        itemData.styles[l].d += pathStringTransformed;
+        itemData.styles[l].mdf = redraw || itemData.styles[l].mdf;
+    }
+};
+
+SVGShapeElement.prototype.renderFill = function(styleData,itemData){
+    var styleElem = itemData.style;
+
+    if(itemData.c.mdf || this._ch){
+        styleElem.pElem.setAttribute('fill','rgb('+bm_floor(itemData.c.v[0])+','+bm_floor(itemData.c.v[1])+','+bm_floor(itemData.c.v[2])+')');
+    }
+    if(itemData.o.mdf || this._ch){
+        styleElem.pElem.setAttribute('fill-opacity',itemData.o.v);
+    }
+};
+
+SVGShapeElement.prototype.renderGradient = function(styleData, itemData) {
+    var gfill = itemData.gf;
+    var hasOpacity = itemData.g._hasOpacity;
+    var pt1 = itemData.s.v, pt2 = itemData.e.v;
+
+    if (itemData.o.mdf || this._ch) {
+        var attr = styleData.ty === 'gf' ? 'fill-opacity' : 'stroke-opacity';
+        itemData.style.pElem.setAttribute(attr, itemData.o.v);
+    }
+    if (itemData.s.mdf || this._ch) {
+        var attr1 = styleData.t === 1 ? 'x1' : 'cx';
+        var attr2 = attr1 === 'x1' ? 'y1' : 'cy';
+        gfill.setAttribute(attr1, pt1[0]);
+        gfill.setAttribute(attr2, pt1[1]);
+        if (hasOpacity && !itemData.g._collapsable) {
+            itemData.of.setAttribute(attr1, pt1[0]);
+            itemData.of.setAttribute(attr2, pt1[1]);
+        }
+    }
+    var stops, i, len, stop;
+    if (itemData.g.cmdf || this._ch) {
+        stops = itemData.cst;
+        var cValues = itemData.g.c;
+        len = stops.length;
+        for (i = 0; i < len; i += 1){
+            stop = stops[i];
+            stop.setAttribute('offset', cValues[i * 4] + '%');
+            stop.setAttribute('stop-color','rgb('+ cValues[i * 4 + 1] + ',' + cValues[i * 4 + 2] + ','+cValues[i * 4 + 3] + ')');
+        }
+    }
+    if (hasOpacity && (itemData.g.omdf || this._ch)) {
+        var oValues = itemData.g.o;
+        if(itemData.g._collapsable) {
+            stops = itemData.cst;
+        } else {
+            stops = itemData.ost;
+        }
+        len = stops.length;
+        for (i = 0; i < len; i += 1) {
+            stop = stops[i];
+            if(!itemData.g._collapsable) {
+                stop.setAttribute('offset', oValues[i * 2] + '%');
+            }
+            stop.setAttribute('stop-opacity', oValues[i * 2 + 1]);
+        }
+    }
+    if (styleData.t === 1) {
+        if (itemData.e.mdf  || this._ch) {
+            gfill.setAttribute('x2', pt2[0]);
+            gfill.setAttribute('y2', pt2[1]);
+            if (hasOpacity && !itemData.g._collapsable) {
+                itemData.of.setAttribute('x2', pt2[0]);
+                itemData.of.setAttribute('y2', pt2[1]);
+            }
+        }
+    } else {
+        var rad;
+        if (itemData.s.mdf || itemData.e.mdf || this._ch) {
+            rad = Math.sqrt(Math.pow(pt1[0] - pt2[0], 2) + Math.pow(pt1[1] - pt2[1], 2));
+            gfill.setAttribute('r', rad);
+            if(hasOpacity && !itemData.g._collapsable){
+                itemData.of.setAttribute('r', rad);
+            }
+        }
+        if (itemData.e.mdf || itemData.h.mdf || itemData.a.mdf || this._ch) {
+            if (!rad) {
+                rad = Math.sqrt(Math.pow(pt1[0] - pt2[0], 2) + Math.pow(pt1[1] - pt2[1], 2));
+            }
+            var ang = Math.atan2(pt2[1] - pt1[1], pt2[0] - pt1[0]);
+
+            var percent = itemData.h.v >= 1 ? 0.99 : itemData.h.v <= -1 ? -0.99: itemData.h.v;
+            var dist = rad * percent;
+            var x = Math.cos(ang + itemData.a.v) * dist + pt1[0];
+            var y = Math.sin(ang + itemData.a.v) * dist + pt1[1];
+            gfill.setAttribute('fx', x);
+            gfill.setAttribute('fy', y);
+            if (hasOpacity && !itemData.g._collapsable) {
+                itemData.of.setAttribute('fx', x);
+                itemData.of.setAttribute('fy', y);
+            }
+        }
+        //gfill.setAttribute('fy','200');
+    }
+};
+
+SVGShapeElement.prototype.renderStroke = function(styleData, itemData) {
+    var styleElem = itemData.style;
+    var d = itemData.d;
+    if (d && (d.mdf || this._ch)) {
+        styleElem.pElem.setAttribute('stroke-dasharray', d.dashStr);
+        styleElem.pElem.setAttribute('stroke-dashoffset', d.dashoffset[0]);
+    }
+    if(itemData.c && (itemData.c.mdf || this._ch)){
+        styleElem.pElem.setAttribute('stroke','rgb(' + bm_floor(itemData.c.v[0]) + ',' + bm_floor(itemData.c.v[1]) + ',' + bm_floor(itemData.c.v[2]) + ')');
+    }
+    if(itemData.o.mdf || this._ch){
+        styleElem.pElem.setAttribute('stroke-opacity', itemData.o.v);
+    }
+    if(itemData.w.mdf || this._ch){
+        styleElem.pElem.setAttribute('stroke-width', itemData.w.v);
+        if(styleElem.msElem){
+            styleElem.msElem.setAttribute('stroke-width', itemData.w.v);
+        }
+    }
+};
+
+SVGShapeElement.prototype.destroy = function(){
+    this.destroy_e();
+    this.shapeData = null;
+    this.itemsData = null;
+};
+
+function _bb(filter, _cl){
+    this._cl = _cl;
+    var feColorMatrix = _ct('feColorMatrix');
     feColorMatrix.setAttribute('type','matrix');
     feColorMatrix.setAttribute('color-interpolation-filters','linearRGB');
     feColorMatrix.setAttribute('values','0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0 0 0 1 0');
     feColorMatrix.setAttribute('result','f1');
     filter.appendChild(feColorMatrix);
-    feColorMatrix = createNS('feColorMatrix');
+    feColorMatrix = _ct('feColorMatrix');
     feColorMatrix.setAttribute('type','matrix');
     feColorMatrix.setAttribute('color-interpolation-filters','sRGB');
     feColorMatrix.setAttribute('values','1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0');
     feColorMatrix.setAttribute('result','f2');
     filter.appendChild(feColorMatrix);
     this.matrixFilter = feColorMatrix;
-    if(filterManager.effectElements[2].p.v !== 100 || filterManager.effectElements[2].p.k){
-        var feMerge = createNS('feMerge');
+    if(_cl._cm[2].p.v !== 100 || _cl._cm[2].p.k){
+        var feMerge = _ct('feMerge');
         filter.appendChild(feMerge);
         var feMergeNode;
-        feMergeNode = createNS('feMergeNode');
+        feMergeNode = _ct('feMergeNode');
         feMergeNode.setAttribute('in','SourceGraphic');
         feMerge.appendChild(feMergeNode);
-        feMergeNode = createNS('feMergeNode');
+        feMergeNode = _ct('feMergeNode');
         feMergeNode.setAttribute('in','f2');
         feMerge.appendChild(feMergeNode);
     }
 }
 
 _bb.prototype._ba = function(forceRender){
-    if(forceRender || this.filterManager.mdf){
-        var colorBlack = this.filterManager.effectElements[0].p.v;
-        var colorWhite = this.filterManager.effectElements[1].p.v;
-        var opacity = this.filterManager.effectElements[2].p.v/100;
+    if(forceRender || this._cl.mdf){
+        var colorBlack = this._cl._cm[0].p.v;
+        var colorWhite = this._cl._cm[1].p.v;
+        var opacity = this._cl._cm[2].p.v/100;
         this.matrixFilter.setAttribute('values',(colorWhite[0]- colorBlack[0])+' 0 0 0 '+ colorBlack[0] +' '+ (colorWhite[1]- colorBlack[1]) +' 0 0 0 '+ colorBlack[1] +' '+ (colorWhite[2]- colorBlack[2]) +' 0 0 0 '+ colorBlack[2] +' 0 0 0 ' + opacity + ' 0');
     }
 };
-function _bc(filter, filterManager){
-    this.filterManager = filterManager;
-    var feColorMatrix = createNS('feColorMatrix');
+function _bc(filter, _cl){
+    this._cl = _cl;
+    var feColorMatrix = _ct('feColorMatrix');
     feColorMatrix.setAttribute('type','matrix');
     feColorMatrix.setAttribute('color-interpolation-filters','sRGB');
     feColorMatrix.setAttribute('values','1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0');
@@ -8323,15 +7650,15 @@
     this.matrixFilter = feColorMatrix;
 }
 _bc.prototype._ba = function(forceRender){
-    if(forceRender || this.filterManager.mdf){
-        var color = this.filterManager.effectElements[2].p.v;
-        var opacity = this.filterManager.effectElements[6].p.v;
+    if(forceRender || this._cl.mdf){
+        var color = this._cl._cm[2].p.v;
+        var opacity = this._cl._cm[6].p.v;
         this.matrixFilter.setAttribute('values','0 0 0 0 '+color[0]+' 0 0 0 0 '+color[1]+' 0 0 0 0 '+color[2]+' 0 0 0 '+opacity+' 0');
     }
 };
-function _bd(elem, filterManager){
+function _bd(elem, _cl){
     this.initialized = false;
-    this.filterManager = filterManager;
+    this._cl = _cl;
     this.elem = elem;
     this.paths = [];
 }
@@ -8340,30 +7667,30 @@
 
     var elemChildren = this.elem._bx.children || this.elem._bx.childNodes;
     var path,groupPath, i, len;
-    if(this.filterManager.effectElements[1].p.v === 1){
+    if(this._cl._cm[1].p.v === 1){
         len = this.elem.maskManager.masksProperties.length;
         i = 0;
     } else {
-        i = this.filterManager.effectElements[0].p.v - 1;
+        i = this._cl._cm[0].p.v - 1;
         len = i + 1;
     }
-    groupPath = createNS('g'); 
+    groupPath = _ct('g'); 
     groupPath.setAttribute('fill','none');
     groupPath.setAttribute('stroke-linecap','round');
     groupPath.setAttribute('stroke-dashoffset',1);
     for(i;i<len;i+=1){
-        path = createNS('path');
+        path = _ct('path');
         groupPath.appendChild(path);
         this.paths.push({p:path,m:i});
     }
-    if(this.filterManager.effectElements[10].p.v === 3){
-        var mask = createNS('mask');
+    if(this._cl._cm[10].p.v === 3){
+        var mask = _ct('mask');
         var id = 'stms_' + randomString(10);
         mask.setAttribute('id',id);
         mask.setAttribute('mask-type','alpha');
         mask.appendChild(groupPath);
         this.elem._x.defs.appendChild(mask);
-        var g = createNS('g');
+        var g = _ct('g');
         g.setAttribute('mask','url(' + locationHref + '#'+id+')');
         if(elemChildren[0]){
             g.appendChild(elemChildren[0]);
@@ -8371,8 +7698,8 @@
         this.elem._bx.appendChild(g);
         this.masker = mask;
         groupPath.setAttribute('stroke','#fff');
-    } else if(this.filterManager.effectElements[10].p.v === 1 || this.filterManager.effectElements[10].p.v === 2){
-        if(this.filterManager.effectElements[10].p.v === 2){
+    } else if(this._cl._cm[10].p.v === 1 || this._cl._cm[10].p.v === 2){
+        if(this._cl._cm[10].p.v === 2){
             var elemChildren = this.elem._bx.children || this.elem._bx.childNodes;
             while(elemChildren.length){
                 this.elem._bx.removeChild(elemChildren[0]);
@@ -8395,111 +7722,111 @@
     for(i=0;i<len;i+=1){
         mask = this.elem.maskManager.viewData[this.paths[i].m];
         path = this.paths[i].p;
-        if(forceRender || this.filterManager.mdf || mask.prop.mdf){
+        if(forceRender || this._cl.mdf || mask.prop.mdf){
             path.setAttribute('d',mask.lastPath);
         }
-        if(forceRender || this.filterManager.effectElements[9].p.mdf || this.filterManager.effectElements[4].p.mdf || this.filterManager.effectElements[7].p.mdf || this.filterManager.effectElements[8].p.mdf || mask.prop.mdf){
+        if(forceRender || this._cl._cm[9].p.mdf || this._cl._cm[4].p.mdf || this._cl._cm[7].p.mdf || this._cl._cm[8].p.mdf || mask.prop.mdf){
             var dasharrayValue;
-            if(this.filterManager.effectElements[7].p.v !== 0 || this.filterManager.effectElements[8].p.v !== 100){
-                var s = Math.min(this.filterManager.effectElements[7].p.v,this.filterManager.effectElements[8].p.v)/100;
-                var e = Math.max(this.filterManager.effectElements[7].p.v,this.filterManager.effectElements[8].p.v)/100;
+            if(this._cl._cm[7].p.v !== 0 || this._cl._cm[8].p.v !== 100){
+                var s = Math.min(this._cl._cm[7].p.v,this._cl._cm[8].p.v)/100;
+                var e = Math.max(this._cl._cm[7].p.v,this._cl._cm[8].p.v)/100;
                 var l = path.getTotalLength();
                 dasharrayValue = '0 0 0 ' + l*s + ' ';
                 var lineLength = l*(e-s);
-                var segment = 1+this.filterManager.effectElements[4].p.v*2*this.filterManager.effectElements[9].p.v/100;
+                var segment = 1+this._cl._cm[4].p.v*2*this._cl._cm[9].p.v/100;
                 var units = Math.floor(lineLength/segment);
                 var j;
                 for(j=0;j<units;j+=1){
-                    dasharrayValue += '1 ' + this.filterManager.effectElements[4].p.v*2*this.filterManager.effectElements[9].p.v/100 + ' ';
+                    dasharrayValue += '1 ' + this._cl._cm[4].p.v*2*this._cl._cm[9].p.v/100 + ' ';
                 }
                 dasharrayValue += '0 ' + l*10 + ' 0 0';
             } else {
-                dasharrayValue = '1 ' + this.filterManager.effectElements[4].p.v*2*this.filterManager.effectElements[9].p.v/100;
+                dasharrayValue = '1 ' + this._cl._cm[4].p.v*2*this._cl._cm[9].p.v/100;
             }
             path.setAttribute('stroke-dasharray',dasharrayValue);
         }
     }
-    if(forceRender || this.filterManager.effectElements[4].p.mdf){
-        this.pathMasker.setAttribute('stroke-width',this.filterManager.effectElements[4].p.v*2);
+    if(forceRender || this._cl._cm[4].p.mdf){
+        this.pathMasker.setAttribute('stroke-width',this._cl._cm[4].p.v*2);
     }
     
-    if(forceRender || this.filterManager.effectElements[6].p.mdf){
-        this.pathMasker.setAttribute('opacity',this.filterManager.effectElements[6].p.v);
+    if(forceRender || this._cl._cm[6].p.mdf){
+        this.pathMasker.setAttribute('opacity',this._cl._cm[6].p.v);
     }
-    if(this.filterManager.effectElements[10].p.v === 1 || this.filterManager.effectElements[10].p.v === 2){
-        if(forceRender || this.filterManager.effectElements[3].p.mdf){
-            var color = this.filterManager.effectElements[3].p.v;
+    if(this._cl._cm[10].p.v === 1 || this._cl._cm[10].p.v === 2){
+        if(forceRender || this._cl._cm[3].p.mdf){
+            var color = this._cl._cm[3].p.v;
             this.pathMasker.setAttribute('stroke','rgb('+bm_floor(color[0]*255)+','+bm_floor(color[1]*255)+','+bm_floor(color[2]*255)+')');
         }
     }
 };
-function _be(filter, filterManager){
-    this.filterManager = filterManager;
-    var feColorMatrix = createNS('feColorMatrix');
+function _be(filter, _cl){
+    this._cl = _cl;
+    var feColorMatrix = _ct('feColorMatrix');
     feColorMatrix.setAttribute('type','matrix');
     feColorMatrix.setAttribute('color-interpolation-filters','linearRGB');
     feColorMatrix.setAttribute('values','0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0 0 0 1 0');
     feColorMatrix.setAttribute('result','f1');
     filter.appendChild(feColorMatrix);
-    var feComponentTransfer = createNS('feComponentTransfer');
+    var feComponentTransfer = _ct('feComponentTransfer');
     feComponentTransfer.setAttribute('color-interpolation-filters','sRGB');
     filter.appendChild(feComponentTransfer);
     this.matrixFilter = feComponentTransfer;
-    var feFuncR = createNS('feFuncR');
+    var feFuncR = _ct('feFuncR');
     feFuncR.setAttribute('type','table');
     feComponentTransfer.appendChild(feFuncR);
     this.feFuncR = feFuncR;
-    var feFuncG = createNS('feFuncG');
+    var feFuncG = _ct('feFuncG');
     feFuncG.setAttribute('type','table');
     feComponentTransfer.appendChild(feFuncG);
     this.feFuncG = feFuncG;
-    var feFuncB = createNS('feFuncB');
+    var feFuncB = _ct('feFuncB');
     feFuncB.setAttribute('type','table');
     feComponentTransfer.appendChild(feFuncB);
     this.feFuncB = feFuncB;
 }
 
 _be.prototype._ba = function(forceRender){
-    if(forceRender || this.filterManager.mdf){
-        var color1 = this.filterManager.effectElements[0].p.v;
-        var color2 = this.filterManager.effectElements[1].p.v;
-        var color3 = this.filterManager.effectElements[2].p.v;
+    if(forceRender || this._cl.mdf){
+        var color1 = this._cl._cm[0].p.v;
+        var color2 = this._cl._cm[1].p.v;
+        var color3 = this._cl._cm[2].p.v;
         var tableR = color3[0] + ' ' + color2[0] + ' ' + color1[0]
         var tableG = color3[1] + ' ' + color2[1] + ' ' + color1[1]
         var tableB = color3[2] + ' ' + color2[2] + ' ' + color1[2]
         this.feFuncR.setAttribute('tableValues', tableR);
         this.feFuncG.setAttribute('tableValues', tableG);
         this.feFuncB.setAttribute('tableValues', tableB);
-        //var opacity = this.filterManager.effectElements[2].p.v/100;
+        //var opacity = this._cl._cm[2].p.v/100;
         //this.matrixFilter.setAttribute('values',(colorWhite[0]- colorBlack[0])+' 0 0 0 '+ colorBlack[0] +' '+ (colorWhite[1]- colorBlack[1]) +' 0 0 0 '+ colorBlack[1] +' '+ (colorWhite[2]- colorBlack[2]) +' 0 0 0 '+ colorBlack[2] +' 0 0 0 ' + opacity + ' 0');
     }
 };
-function _bf(filter, filterManager){
-    this.filterManager = filterManager;
-    var effectElements = this.filterManager.effectElements;
-    var feComponentTransfer = createNS('feComponentTransfer');
+function _bf(filter, _cl){
+    this._cl = _cl;
+    var _cm = this._cl._cm;
+    var feComponentTransfer = _ct('feComponentTransfer');
     var feFuncR, feFuncG, feFuncB;
     
-    if(effectElements[10].p.k || effectElements[10].p.v !== 0 || effectElements[11].p.k || effectElements[11].p.v !== 1 || effectElements[12].p.k || effectElements[12].p.v !== 1 || effectElements[13].p.k || effectElements[13].p.v !== 0 || effectElements[14].p.k || effectElements[14].p.v !== 1){
+    if(_cm[10].p.k || _cm[10].p.v !== 0 || _cm[11].p.k || _cm[11].p.v !== 1 || _cm[12].p.k || _cm[12].p.v !== 1 || _cm[13].p.k || _cm[13].p.v !== 0 || _cm[14].p.k || _cm[14].p.v !== 1){
         this.feFuncR = this.createFeFunc('feFuncR', feComponentTransfer);
     }
-    if(effectElements[17].p.k || effectElements[17].p.v !== 0 || effectElements[18].p.k || effectElements[18].p.v !== 1 || effectElements[19].p.k || effectElements[19].p.v !== 1 || effectElements[20].p.k || effectElements[20].p.v !== 0 || effectElements[21].p.k || effectElements[21].p.v !== 1){
+    if(_cm[17].p.k || _cm[17].p.v !== 0 || _cm[18].p.k || _cm[18].p.v !== 1 || _cm[19].p.k || _cm[19].p.v !== 1 || _cm[20].p.k || _cm[20].p.v !== 0 || _cm[21].p.k || _cm[21].p.v !== 1){
         this.feFuncG = this.createFeFunc('feFuncG', feComponentTransfer);
     }
-    if(effectElements[24].p.k || effectElements[24].p.v !== 0 || effectElements[25].p.k || effectElements[25].p.v !== 1 || effectElements[26].p.k || effectElements[26].p.v !== 1 || effectElements[27].p.k || effectElements[27].p.v !== 0 || effectElements[28].p.k || effectElements[28].p.v !== 1){
+    if(_cm[24].p.k || _cm[24].p.v !== 0 || _cm[25].p.k || _cm[25].p.v !== 1 || _cm[26].p.k || _cm[26].p.v !== 1 || _cm[27].p.k || _cm[27].p.v !== 0 || _cm[28].p.k || _cm[28].p.v !== 1){
         this.feFuncB = this.createFeFunc('feFuncB', feComponentTransfer);
     }
-    if(effectElements[31].p.k || effectElements[31].p.v !== 0 || effectElements[32].p.k || effectElements[32].p.v !== 1 || effectElements[33].p.k || effectElements[33].p.v !== 1 || effectElements[34].p.k || effectElements[34].p.v !== 0 || effectElements[35].p.k || effectElements[35].p.v !== 1){
+    if(_cm[31].p.k || _cm[31].p.v !== 0 || _cm[32].p.k || _cm[32].p.v !== 1 || _cm[33].p.k || _cm[33].p.v !== 1 || _cm[34].p.k || _cm[34].p.v !== 0 || _cm[35].p.k || _cm[35].p.v !== 1){
         this.feFuncA = this.createFeFunc('feFuncA', feComponentTransfer);
     }
     
     if(this.feFuncR || this.feFuncG || this.feFuncB || this.feFuncA){
         feComponentTransfer.setAttribute('color-interpolation-filters','sRGB');
         filter.appendChild(feComponentTransfer);
-        feComponentTransfer = createNS('feComponentTransfer');
+        feComponentTransfer = _ct('feComponentTransfer');
     }
 
-    if(effectElements[3].p.k || effectElements[3].p.v !== 0 || effectElements[4].p.k || effectElements[4].p.v !== 1 || effectElements[5].p.k || effectElements[5].p.v !== 1 || effectElements[6].p.k || effectElements[6].p.v !== 0 || effectElements[7].p.k || effectElements[7].p.v !== 1){
+    if(_cm[3].p.k || _cm[3].p.v !== 0 || _cm[4].p.k || _cm[4].p.v !== 1 || _cm[5].p.k || _cm[5].p.v !== 1 || _cm[6].p.k || _cm[6].p.v !== 0 || _cm[7].p.k || _cm[7].p.v !== 1){
 
         feComponentTransfer.setAttribute('color-interpolation-filters','sRGB');
         filter.appendChild(feComponentTransfer);
@@ -8510,7 +7837,7 @@
 }
 
 _bf.prototype.createFeFunc = function(type, feComponentTransfer) {
-    var feFunc = createNS(type);
+    var feFunc = _ct(type);
     feFunc.setAttribute('type','table');
     feComponentTransfer.appendChild(feFunc);
     return feFunc;
@@ -8543,40 +7870,40 @@
 };
 
 _bf.prototype._ba = function(forceRender){
-    if(forceRender || this.filterManager.mdf){
+    if(forceRender || this._cl.mdf){
         var val, cnt, perc, bezier;
-        var effectElements = this.filterManager.effectElements;
-        if(this.feFuncRComposed && (forceRender || effectElements[3].p.mdf || effectElements[4].p.mdf || effectElements[5].p.mdf || effectElements[6].p.mdf || effectElements[7].p.mdf)){
-            val = this.getTableValue(effectElements[3].p.v,effectElements[4].p.v,effectElements[5].p.v,effectElements[6].p.v,effectElements[7].p.v);
+        var _cm = this._cl._cm;
+        if(this.feFuncRComposed && (forceRender || _cm[3].p.mdf || _cm[4].p.mdf || _cm[5].p.mdf || _cm[6].p.mdf || _cm[7].p.mdf)){
+            val = this.getTableValue(_cm[3].p.v,_cm[4].p.v,_cm[5].p.v,_cm[6].p.v,_cm[7].p.v);
             this.feFuncRComposed.setAttribute('tableValues',val);
             this.feFuncGComposed.setAttribute('tableValues',val);
             this.feFuncBComposed.setAttribute('tableValues',val);
         }
 
 
-        if(this.feFuncR && (forceRender || effectElements[10].p.mdf || effectElements[11].p.mdf || effectElements[12].p.mdf || effectElements[13].p.mdf || effectElements[14].p.mdf)){
-            val = this.getTableValue(effectElements[10].p.v,effectElements[11].p.v,effectElements[12].p.v,effectElements[13].p.v,effectElements[14].p.v);
+        if(this.feFuncR && (forceRender || _cm[10].p.mdf || _cm[11].p.mdf || _cm[12].p.mdf || _cm[13].p.mdf || _cm[14].p.mdf)){
+            val = this.getTableValue(_cm[10].p.v,_cm[11].p.v,_cm[12].p.v,_cm[13].p.v,_cm[14].p.v);
             this.feFuncR.setAttribute('tableValues',val);
         }
 
-        if(this.feFuncG && (forceRender || effectElements[17].p.mdf || effectElements[18].p.mdf || effectElements[19].p.mdf || effectElements[20].p.mdf || effectElements[21].p.mdf)){
-            val = this.getTableValue(effectElements[17].p.v,effectElements[18].p.v,effectElements[19].p.v,effectElements[20].p.v,effectElements[21].p.v);
+        if(this.feFuncG && (forceRender || _cm[17].p.mdf || _cm[18].p.mdf || _cm[19].p.mdf || _cm[20].p.mdf || _cm[21].p.mdf)){
+            val = this.getTableValue(_cm[17].p.v,_cm[18].p.v,_cm[19].p.v,_cm[20].p.v,_cm[21].p.v);
             this.feFuncG.setAttribute('tableValues',val);
         }
 
-        if(this.feFuncB && (forceRender || effectElements[24].p.mdf || effectElements[25].p.mdf || effectElements[26].p.mdf || effectElements[27].p.mdf || effectElements[28].p.mdf)){
-            val = this.getTableValue(effectElements[24].p.v,effectElements[25].p.v,effectElements[26].p.v,effectElements[27].p.v,effectElements[28].p.v);
+        if(this.feFuncB && (forceRender || _cm[24].p.mdf || _cm[25].p.mdf || _cm[26].p.mdf || _cm[27].p.mdf || _cm[28].p.mdf)){
+            val = this.getTableValue(_cm[24].p.v,_cm[25].p.v,_cm[26].p.v,_cm[27].p.v,_cm[28].p.v);
             this.feFuncB.setAttribute('tableValues',val);
         }
 
-        if(this.feFuncA && (forceRender || effectElements[31].p.mdf || effectElements[32].p.mdf || effectElements[33].p.mdf || effectElements[34].p.mdf || effectElements[35].p.mdf)){
-            val = this.getTableValue(effectElements[31].p.v,effectElements[32].p.v,effectElements[33].p.v,effectElements[34].p.v,effectElements[35].p.v);
+        if(this.feFuncA && (forceRender || _cm[31].p.mdf || _cm[32].p.mdf || _cm[33].p.mdf || _cm[34].p.mdf || _cm[35].p.mdf)){
+            val = this.getTableValue(_cm[31].p.v,_cm[32].p.v,_cm[33].p.v,_cm[34].p.v,_cm[35].p.v);
             this.feFuncA.setAttribute('tableValues',val);
         }
         
     }
 };
-function _bg(filter, filterManager){
+function _bg(filter, _cl){
     /*<feGaussianBlur in="SourceAlpha" stdDeviation="3"/> <!-- stdDeviation is how much to blur -->
   <feOffset dx="2" dy="2" result="offsetblur"/> <!-- how much to offset -->
   <feMerge> 
@@ -8588,30 +7915,30 @@
     filter.setAttribute('y','-100%');
     filter.setAttribute('width','400%');
     filter.setAttribute('height','400%');
-    this.filterManager = filterManager;
+    this._cl = _cl;
 
-    var feGaussianBlur = createNS('feGaussianBlur');
+    var feGaussianBlur = _ct('feGaussianBlur');
     feGaussianBlur.setAttribute('in','SourceAlpha');
     feGaussianBlur.setAttribute('result','drop_shadow_1');
     feGaussianBlur.setAttribute('stdDeviation','0');
     this.feGaussianBlur = feGaussianBlur;
     filter.appendChild(feGaussianBlur);
 
-    var feOffset = createNS('feOffset');
+    var feOffset = _ct('feOffset');
     feOffset.setAttribute('dx','25');
     feOffset.setAttribute('dy','0');
     feOffset.setAttribute('in','drop_shadow_1');
     feOffset.setAttribute('result','drop_shadow_2');
     this.feOffset = feOffset;
     filter.appendChild(feOffset);
-    var feFlood = createNS('feFlood');
+    var feFlood = _ct('feFlood');
     feFlood.setAttribute('flood-color','#00ff00');
     feFlood.setAttribute('flood-opacity','1');
     feFlood.setAttribute('result','drop_shadow_3');
     this.feFlood = feFlood;
     filter.appendChild(feFlood);
 
-    var feComposite = createNS('feComposite');
+    var feComposite = _ct('feComposite');
     feComposite.setAttribute('in','drop_shadow_3');
     feComposite.setAttribute('in2','drop_shadow_2');
     feComposite.setAttribute('operator','in');
@@ -8619,12 +7946,12 @@
     filter.appendChild(feComposite);
 
 
-    var feMerge = createNS('feMerge');
+    var feMerge = _ct('feMerge');
     filter.appendChild(feMerge);
     var feMergeNode;
-    feMergeNode = createNS('feMergeNode');
+    feMergeNode = _ct('feMergeNode');
     feMerge.appendChild(feMergeNode);
-    feMergeNode = createNS('feMergeNode');
+    feMergeNode = _ct('feMergeNode');
     feMergeNode.setAttribute('in','SourceGraphic');
     this.feMergeNode = feMergeNode;
     this.feMerge = feMerge;
@@ -8633,30 +7960,30 @@
 }
 
 _bg.prototype._ba = function(forceRender){
-    if(forceRender || this.filterManager.mdf){
-        if(forceRender || this.filterManager.effectElements[4].p.mdf){
-            this.feGaussianBlur.setAttribute('stdDeviation', this.filterManager.effectElements[4].p.v / 4);
+    if(forceRender || this._cl.mdf){
+        if(forceRender || this._cl._cm[4].p.mdf){
+            this.feGaussianBlur.setAttribute('stdDeviation', this._cl._cm[4].p.v / 4);
         }
-        if(forceRender || this.filterManager.effectElements[0].p.mdf){
-            var col = this.filterManager.effectElements[0].p.v;
+        if(forceRender || this._cl._cm[0].p.mdf){
+            var col = this._cl._cm[0].p.v;
             this.feFlood.setAttribute('flood-color',rgbToHex(Math.round(col[0]*255),Math.round(col[1]*255),Math.round(col[2]*255)));
         }
-        if(forceRender || this.filterManager.effectElements[1].p.mdf){
-            this.feFlood.setAttribute('flood-opacity',this.filterManager.effectElements[1].p.v/255);
+        if(forceRender || this._cl._cm[1].p.mdf){
+            this.feFlood.setAttribute('flood-opacity',this._cl._cm[1].p.v/255);
         }
-        if(forceRender || this.filterManager.effectElements[2].p.mdf || this.filterManager.effectElements[3].p.mdf){
-            var distance = this.filterManager.effectElements[3].p.v
-            var angle = (this.filterManager.effectElements[2].p.v - 90) * degToRads
+        if(forceRender || this._cl._cm[2].p.mdf || this._cl._cm[3].p.mdf){
+            var distance = this._cl._cm[3].p.v
+            var angle = (this._cl._cm[2].p.v - 90) * degToRads
             var x = distance * Math.cos(angle)
             var y = distance * Math.sin(angle)
             this.feOffset.setAttribute('dx', x);
             this.feOffset.setAttribute('dy', y);
         }
-        /*if(forceRender || this.filterManager.effectElements[5].p.mdf){
-            if(this.filterManager.effectElements[5].p.v === 1 && this.originalNodeAdded) {
+        /*if(forceRender || this._cl._cm[5].p.mdf){
+            if(this._cl._cm[5].p.v === 1 && this.originalNodeAdded) {
                 this.feMerge.removeChild(this.feMergeNode);
                 this.originalNodeAdded = false;
-            } else if(this.filterManager.effectElements[5].p.v === 0 && !this.originalNodeAdded) {
+            } else if(this._cl._cm[5].p.v === 0 && !this.originalNodeAdded) {
                 this.feMerge.appendChild(this.feMergeNode);
                 this.originalNodeAdded = true;
             }
@@ -8666,12 +7993,12 @@
 var _svgMatteSymbols = [];
 var _svgMatteMaskCounter = 0;
 
-function _bh(filterElem, filterManager, elem){
+function _bh(filterElem, _cl, elem){
     this.initialized = false;
-    this.filterManager = filterManager;
+    this._cl = _cl;
     this.filterElem = filterElem;
     this.elem = elem;
-    elem.matteElement = createNS('g');
+    elem.matteElement = _ct('g');
     elem.matteElement.appendChild(elem._bx);
     elem.matteElement.appendChild(elem._bz);
     elem._by = elem.matteElement;
@@ -8705,7 +8032,7 @@
     if (i <= len - 2) {
         nextChild = children[i + 1];
     }
-    var useElem = createNS('use');
+    var useElem = _ct('use');
     useElem.setAttribute('href', '#' + symbolId);
     if(nextChild) {
         parentNode.insertBefore(useElem, nextChild);
@@ -8717,18 +8044,18 @@
 _bh.prototype.setElementAsMask = function(elem, mask) {
     if(!this.findSymbol(mask)) {
         var symbolId = 'matte_' + randomString(5) + '_' + _svgMatteMaskCounter++;
-        var masker = createNS('mask');
+        var masker = _ct('mask');
         masker.setAttribute('id', mask.layerId);
         masker.setAttribute('mask-type', 'alpha');
         _svgMatteSymbols.push(mask);
         var defs = elem._x.defs;
         defs.appendChild(masker);
-        var symbol = createNS('symbol');
+        var symbol = _ct('symbol');
         symbol.setAttribute('id', symbolId);
         this.replaceInParent(mask, symbolId);
         symbol.appendChild(mask._bx);
         defs.appendChild(symbol);
-        useElem = createNS('use');
+        useElem = _ct('use');
         useElem.setAttribute('href', '#' + symbolId);
         masker.appendChild(useElem);
         mask.data.hd = false;
@@ -8738,7 +8065,7 @@
 }
 
 _bh.prototype.initialize = function() {
-    var ind = this.filterManager.effectElements[0].p.v;
+    var ind = this._cl._cm[0].p.v;
     var i = 0, len = this.elem.comp._br.length;
     while (i < len) {
     	if (this.elem.comp._br[i].data.ind === ind) {
@@ -8760,35 +8087,35 @@
     var fil = filtersFactory.createFilter(filId);
     var count = 0;
     this.filters = [];
-    var filterManager;
+    var _cl;
     for(i=0;i<len;i+=1){
         if(elem.data.ef[i].ty === 20){
             count += 1;
-            filterManager = new _bb(fil, elem.effects.effectElements[i]);
-            this.filters.push(filterManager);
+            _cl = new _bb(fil, elem.effects._cm[i]);
+            this.filters.push(_cl);
         }else if(elem.data.ef[i].ty === 21){
             count += 1;
-            filterManager = new _bc(fil, elem.effects.effectElements[i]);
-            this.filters.push(filterManager);
+            _cl = new _bc(fil, elem.effects._cm[i]);
+            this.filters.push(_cl);
         }else if(elem.data.ef[i].ty === 22){
-            filterManager = new _bd(elem, elem.effects.effectElements[i]);
-            this.filters.push(filterManager);
+            _cl = new _bd(elem, elem.effects._cm[i]);
+            this.filters.push(_cl);
         }else if(elem.data.ef[i].ty === 23){
             count += 1;
-            filterManager = new _be(fil, elem.effects.effectElements[i]);
-            this.filters.push(filterManager);
+            _cl = new _be(fil, elem.effects._cm[i]);
+            this.filters.push(_cl);
         }else if(elem.data.ef[i].ty === 24){
             count += 1;
-            filterManager = new _bf(fil, elem.effects.effectElements[i]);
-            this.filters.push(filterManager);
+            _cl = new _bf(fil, elem.effects._cm[i]);
+            this.filters.push(_cl);
         }else if(elem.data.ef[i].ty === 25){
             count += 1;
-            filterManager = new _bg(fil, elem.effects.effectElements[i]);
-            this.filters.push(filterManager);
+            _cl = new _bg(fil, elem.effects._cm[i]);
+            this.filters.push(_cl);
         }else if(elem.data.ef[i].ty === 28){
             //count += 1;
-            filterManager = new _bh(fil, elem.effects.effectElements[i], elem);
-            this.filters.push(filterManager);
+            _cl = new _bh(fil, elem.effects._cm[i], elem);
+            this.filters.push(_cl);
         }
     }
     if(count){
@@ -8797,1543 +8124,12 @@
     }
 }
 
-_bi.prototype._ba = function(firstFrame){
+_bi.prototype._ba = function(_ch){
     var i, len = this.filters.length;
     for(i=0;i<len;i+=1){
-        this.filters[i]._ba(firstFrame);
+        this.filters[i]._ba(_ch);
     }
 };
-function _n() {
-	this.saved = [];
-    this.cArrPos = 0;
-    this.cTr = new Matrix();
-    this.cO = 1;
-    var i, len = 15;
-    this.savedOp = createTypedArray('float32', len);
-    for(i=0;i<len;i+=1){
-        this.saved[i] = createTypedArray('float32', 16);
-    }
-    this._length = len;
-}
-
-_n.prototype.duplicate = function() {
-	var newLength = this._length * 2;
-	var currentSavedOp = this.savedOp;
-    this.savedOp = createTypedArray('float32', newLength);
-    this.savedOp.set(currentSavedOp);
-    var i = 0;
-    for(i = this._length; i < newLength; i += 1) {
-        this.saved[i] = createTypedArray('float32', 16);
-    }
-    this._length = newLength;
-}
-
-_n.prototype.reset = function() {
-	this.cArrPos = 0;
-	this.cTr.reset();
-    this.cO = 1;
-}
-function _c(data, comp, _x){
-}
-
-_c.prototype.createElements = function(){
-    this.checkParenting();
-};
-
-_c.prototype.initRendererElement = function(){
-
-};
-_c.prototype.createContainerElements = function(){
-    this.canvasContext = this._x.canvasContext;
-    this.effectsManager = new _o(this);
-};
-_c.prototype.createContent = function(){};
-
-_c.prototype.setBlendMode = function(){
-    var _x = this._x;
-    if(_x.blendMode !== this.data.bm) {
-        _x.blendMode = this.data.bm;
-        var blendModeValue = this.getBlendMode();
-        _x.canvasContext.globalCompositeOperation = blendModeValue;
-    }
-};
-
-_c.prototype.addMasks = function(){
-    this.maskManager = new _q(this.data, this, this._x);
-};
-
-_c.prototype.hideElement = function(){
-    if (!this.hidden && (!this.isInRange || this.isTransparent)) {
-        this.hidden = true;
-    }
-};
-
-_c.prototype.showElement = function(){
-    if (this.isInRange && !this.isTransparent){
-        this.hidden = false;
-        this.firstFrame = true;
-        this.maskManager.firstFrame = true;
-    }
-};
-
-_c.prototype._ba = function() {
-    if (this.hidden) {
-        return;
-    }
-    this.renderTransform();
-    this.renderRenderable();
-    this.setBlendMode();
-    this._x.renderer.save();
-    this._x.renderer.ctxTransform(this.finalTransform.mat.props);
-    this._x.renderer.ctxOpacity(this.finalTransform.mProp.o.v);
-    this.renderInnerContent();
-    this._x.renderer.restore();
-    if(this.maskManager.hasMasks) {
-        this._x.renderer.restore(true);
-    }
-    if (this.firstFrame) {
-        this.firstFrame = false;
-    }
-};
-
-_c.prototype.hide = _c.prototype.hideElement;
-_c.prototype.show = _c.prototype.showElement;
-
-_c.prototype.destroy = function(){
-    this.canvasContext = null;
-    this.data = null;
-    this._x = null;
-    this.maskManager.destroy();
-};
-
-_c.prototype.mHelper = new Matrix();
-
-function _p(data, _x, comp){
-    this.failed = false;
-    this.img = new Image();
-    this.assetData = _x.getAssetData(data.refId);
-    this.initElement(data,_x,comp);
-    this._x.addPendingElement();
-}
-extendPrototype([_e, _af, _c, _ad, _ac, _ae], _p);
-
-_p.prototype.initElement = _f.prototype.initElement;
-_p.prototype._az = _h.prototype._az;
-
-_p.prototype.imageLoaded = function() {
-    this._x.elementLoaded();
-    if(this.assetData.w !== this.img.width || this.assetData.h !== this.img.height){
-        var canvas = createTag('canvas');
-        canvas.width = this.assetData.w;
-        canvas.height = this.assetData.h;
-        var ctx = canvas.getContext('2d');
-
-        var imgW = this.img.width;
-        var imgH = this.img.height;
-        var imgRel = imgW / imgH;
-        var canvasRel = this.assetData.w/this.assetData.h;
-        var widthCrop, heightCrop;
-        if(imgRel>canvasRel){
-            heightCrop = imgH;
-            widthCrop = heightCrop*canvasRel;
-        } else {
-            widthCrop = imgW;
-            heightCrop = widthCrop/canvasRel;
-        }
-        ctx.drawImage(this.img,(imgW-widthCrop)/2,(imgH-heightCrop)/2,widthCrop,heightCrop,0,0,this.assetData.w,this.assetData.h);
-        this.img = canvas;
-    }
-}
-
-_p.prototype.imageFailed = function() {
-    this.failed = true;
-    this._x.elementLoaded();
-}
-
-_p.prototype.createContent = function(){
-    var img = this.img;
-    img.addEventListener('load', this.imageLoaded.bind(this), false);
-    img.addEventListener('error', this.imageFailed.bind(this), false);
-    var assetPath = this._x.getAssetsPath(this.assetData);
-    img.src = assetPath;
-
-};
-
-_p.prototype.renderInnerContent = function(parentMatrix){
-    if (this.failed) {
-        return;
-    }
-    this.canvasContext.drawImage(this.img, 0, 0);
-};
-
-_p.prototype.destroy = function(){
-    this.img = null;
-    this.destroy_e();
-};
-function _m(data, _x, comp) {
-    this.completeLayers = false;
-    this.layers = data.layers;
-    this.pendingElements = [];
-    this._br = Array.apply(null,{length:this.layers.length});
-    this.initElement(data, _x, comp);
-    this.tm = data.tm ? _ai._bo(this,data.tm,0,_x.frameRate,this.dynamicProperties) : {_placeholder:true};
-}
-
-extendPrototype([_aq, _g, _c], _m);
-
-_m.prototype.renderInnerContent = function() {
-    var i,len = this.layers.length;
-    for( i = len - 1; i >= 0; i -= 1 ){
-        if(this.completeLayers || this._br[i]){
-            this._br[i]._ba();
-        }
-    }
-};
-
-_m.prototype.destroy = function(){
-    var i,len = this.layers.length;
-    for( i = len - 1; i >= 0; i -= 1 ){
-        this._br[i].destroy();
-    }
-    this.layers = null;
-    this._br = null;
-};
-
-function _q(data,element){
-    this.data = data;
-    this.element = element;
-    this.dynamicProperties = [];
-    this.masksProperties = this.data.masksProperties || [];
-    this.viewData = Array.apply(null,{length:this.masksProperties.length});
-    var i, len = this.masksProperties.length, hasMasks = false;
-    for (i = 0; i < len; i++) {
-        if(this.masksProperties[i].mode !== 'n'){
-            hasMasks = true;
-        }
-        this.viewData[i] = _ah._bp(this.element,this.masksProperties[i],3,this.dynamicProperties,null);
-    }
-    this.hasMasks = hasMasks;
-}
-
-_q.prototype._az = function(num){
-    var i, len = this.dynamicProperties.length;
-    for(i=0;i<len;i+=1){
-        this.dynamicProperties[i].getValue(num);
-        if(this.dynamicProperties[i].mdf){
-            this.element._x.mdf = true;
-        }
-    }
-};
-
-_q.prototype._ba = function (transform) {
-    if(!this.hasMasks){
-        return;
-    }
-    var ctx = this.element.canvasContext;
-    var i, len = this.masksProperties.length;
-    var pt,pt2,pt3,data;
-    ctx.beginPath();
-    for (i = 0; i < len; i++) {
-        if(this.masksProperties[i].mode !== 'n'){
-            if (this.masksProperties[i].inv) {
-                ctx.moveTo(0, 0);
-                ctx.lineTo(this.element._x.compWidth, 0);
-                ctx.lineTo(this.element._x.compWidth, this.element._x.compHeight);
-                ctx.lineTo(0, this.element._x.compHeight);
-                ctx.lineTo(0, 0);
-            }
-            data = this.viewData[i].v;
-            pt = transform ? transform.applyToPointArray(data.v[0][0],data.v[0][1],0):data.v[0];
-            ctx.moveTo(pt[0], pt[1]);
-            var j, jLen = data._length;
-            for (j = 1; j < jLen; j++) {
-                pt = transform ? transform.applyToPointArray(data.o[j - 1][0],data.o[j - 1][1],0) : data.o[j - 1];
-                pt2 = transform ? transform.applyToPointArray(data.i[j][0],data.i[j][1],0) : data.i[j];
-                pt3 = transform ? transform.applyToPointArray(data.v[j][0],data.v[j][1],0) : data.v[j];
-                ctx.bezierCurveTo(pt[0], pt[1], pt2[0], pt2[1], pt3[0], pt3[1]);
-            }
-            pt = transform ? transform.applyToPointArray(data.o[j - 1][0],data.o[j - 1][1],0) : data.o[j - 1];
-            pt2 = transform ? transform.applyToPointArray(data.i[0][0],data.i[0][1],0) : data.i[0];
-            pt3 = transform ? transform.applyToPointArray(data.v[0][0],data.v[0][1],0) : data.v[0];
-            ctx.bezierCurveTo(pt[0], pt[1], pt2[0], pt2[1], pt3[0], pt3[1]);
-        }
-    }
-    this.element._x.renderer.save(true);
-    ctx.clip();
-};
-
-_q.prototype.getMaskProperty = _ay.prototype.getMaskProperty;
-
-_q.prototype.destroy = function(){
-    this.element = null;
-};
-function _r(data, _x, comp) {
-    this.shapes = [];
-    this.shapesData = data.shapes;
-    this.stylesList = [];
-    this.itemsData = [];
-    this.prevViewData = [];
-    this.shapeModifiers = [];
-    this.processedElements = [];
-    this.initElement(data, _x, comp);
-}
-
-extendPrototype([_e,_af,_c,_ad,_ac,_ae], _r);
-
-_r.prototype.initElement = function(data,_x,comp) {
-    this.initFrame();
-    this.initBaseData(data, _x, comp);
-    this.initTransform(data, _x, comp);
-    this.initHierarchy();
-    this.initRenderable();
-    this.initRendererElement();
-    this.createContainerElements();
-    this.addMasks();
-    this.createContent();
-    this.hide();
-}
-
-_r.prototype.transformHelper = {opacity:1,mat:new Matrix(),matMdf:false,opMdf:false};
-
-_r.prototype.dashResetter = [];
-
-_r.prototype.createContent = function(){
-    this.searchShapes(this.shapesData,this.itemsData,this.prevViewData,this.dynamicProperties, true);
-};
-
-_r.prototype.createStyleElement = function(data, dynamicProperties){
-    var styleElem = {
-        data: data,
-        type: data.ty,
-        _br: []
-    };
-    var elementData = {};
-    if(data.ty == 'fl' || data.ty == 'st'){
-        elementData.c = _ai._bo(this,data.c,1,255,dynamicProperties);
-        if(!elementData.c.k){
-            styleElem.co = 'rgb('+bm_floor(elementData.c.v[0])+','+bm_floor(elementData.c.v[1])+','+bm_floor(elementData.c.v[2])+')';
-        }
-    }
-    elementData.o = _ai._bo(this,data.o,0,0.01,dynamicProperties);
-    if(data.ty == 'st') {
-        styleElem.lc = this.lcEnum[data.lc] || 'round';
-        styleElem.lj = this.ljEnum[data.lj] || 'round';
-        if(data.lj == 1) {
-            styleElem.ml = data.ml;
-        }
-        elementData.w = _ai._bo(this,data.w,0,null,dynamicProperties);
-        if(!elementData.w.k){
-            styleElem.wi = elementData.w.v;
-        }
-        if(data.d){
-            var d = new DashProperty(this,data.d,'canvas',dynamicProperties);
-            elementData.d = d;
-            if(!elementData.d.k){
-                styleElem.da = elementData.d.dashArray;
-                styleElem.do = elementData.d.dashoffset[0];
-            }
-        }
-
-    } else {
-
-        styleElem.r = data.r === 2 ? 'evenodd' : 'nonzero';
-    }
-    this.stylesList.push(styleElem);
-    elementData.style = styleElem;
-    return elementData;
-}
-
-_r.prototype.createGroupElement = function(data) {
-    var elementData = {
-        it: [],
-        prevViewData: []
-    };
-    return elementData;
-}
-
-_r.prototype.create_af = function(data, dynamicProperties) {
-    var elementData = {
-        transform : {
-            mat: new Matrix(),
-            opacity: 1,
-            matMdf:false,
-            opMdf:false,
-            op: _ai._bo(this,data.o,0,0.01,dynamicProperties),
-            //mProps: _ai._bo(this,data,2,null,dynamicProperties)
-            mProps: _ag._bj(this,data,dynamicProperties)
-        },
-        _br: []
-    };
-    return elementData;
-}
-
-_r.prototype.createShapeElement = function(data, dynamicProperties) {
-    var elementData = {
-        nodes:[],
-        trNodes:[],
-        tr:[0,0,0,0,0,0]
-    };
-    var ty = 4;
-    if(data.ty == 'rc'){
-        ty = 5;
-    }else if(data.ty == 'el'){
-        ty = 6;
-    }else if(data.ty == 'sr'){
-        ty = 7;
-    }
-    elementData.sh = _ah._bp(this,data,ty,dynamicProperties);
-    this.shapes.push(elementData.sh);
-    this.addShapeToModifiers(elementData);
-    var j, jLen = this.stylesList.length;
-    var hasStrokes = false, hasFills = false;
-    for(j=0;j<jLen;j+=1){
-        if(!this.stylesList[j].closed){
-            this.stylesList[j]._br.push(elementData);
-            if(this.stylesList[j].type === 'st'){
-                hasStrokes = true;
-            }else{
-                hasFills = true;
-            }
-        }
-    }
-    elementData.st = hasStrokes;
-    elementData.fl = hasFills;
-    return elementData;
-}
-
-_r.prototype.reloadShapes = function(){
-    this.firstFrame = true;
-    var i, len = this.itemsData.length;
-    for(i=0;i<len;i+=1){
-        this.prevViewData[i] = this.itemsData[i];
-    }
-    this.searchShapes(this.shapesData,this.itemsData,this.prevViewData,this.dynamicProperties, true);
-    var i, len = this.dynamicProperties.length;
-    for(i=0;i<len;i+=1){
-        this.dynamicProperties[i].getValue();
-    }
-    this.renderModifiers();
-}
-
-_r.prototype.searchShapes = function(arr,itemsData, prevViewData,dynamicProperties, render){
-    var i, len = arr.length - 1;
-    var j, jLen;
-    var ownArrays = [], ownModifiers = [], processedPos;
-    for(i=len;i>=0;i-=1){
-        processedPos = this.searchProcessedElement(arr[i]);
-        if(!processedPos){
-            arr[i]._render = render;
-        } else {
-            itemsData[i] = prevViewData[processedPos - 1];
-        }
-        if(arr[i].ty == 'fl' || arr[i].ty == 'st'){
-            if(!processedPos){
-                itemsData[i] = this.createStyleElement(arr[i], dynamicProperties);
-            } else {
-                itemsData[i].style.closed = false;
-            }
-            
-            ownArrays.push(itemsData[i].style);
-        }else if(arr[i].ty == 'gr'){
-            if(!processedPos){
-                itemsData[i] = this.createGroupElement(arr[i]);
-            } else {
-                jLen = itemsData[i].it.length;
-                for(j=0;j<jLen;j+=1){
-                    itemsData[i].prevViewData[j] = itemsData[i].it[j];
-                }
-            }
-            this.searchShapes(arr[i].it,itemsData[i].it,itemsData[i].prevViewData,dynamicProperties, render);
-        }else if(arr[i].ty == 'tr'){
-            if(!processedPos){
-                itemsData[i] = this.create_af(arr[i], dynamicProperties);
-            }
-        }else if(arr[i].ty == 'sh' || arr[i].ty == 'rc' || arr[i].ty == 'el' || arr[i].ty == 'sr'){
-            if(!processedPos){
-                itemsData[i] = this.createShapeElement(arr[i], dynamicProperties);
-            }
-            
-        }else if(arr[i].ty == 'tm' || arr[i].ty == 'rd'){
-            if(!processedPos){
-                var modifier = _as.getModifier(arr[i].ty);
-                modifier.init(this,arr[i],dynamicProperties);
-                itemsData[i] = modifier;
-                this.shapeModifiers.push(modifier);
-            } else {
-                modifier = itemsData[i];
-                modifier.closed = false;
-            }
-            ownModifiers.push(modifier);
-        } else if(arr[i].ty == 'rp'){
-            if(!processedPos){
-                modifier = _as.getModifier(arr[i].ty);
-                itemsData[i] = modifier;
-                modifier.init(this,arr,i,itemsData,dynamicProperties);
-                this.shapeModifiers.push(modifier);
-                render = false;
-            }else{
-                modifier = itemsData[i];
-                modifier.closed = true;
-            }
-            ownModifiers.push(modifier);
-        }
-        this.addProcessedElement(arr[i], i + 1);
-    }
-    len = ownArrays.length;
-    for(i=0;i<len;i+=1){
-        ownArrays[i].closed = true;
-    }
-    len = ownModifiers.length;
-    for(i=0;i<len;i+=1){
-        ownModifiers[i].closed = true;
-    }
-};
-
-_r.prototype.addShapeToModifiers = _f.prototype.addShapeToModifiers;
-_r.prototype.renderModifiers = _f.prototype.renderModifiers;
-_r.prototype.lcEnum = _f.prototype.lcEnum;
-_r.prototype.ljEnum = _f.prototype.ljEnum;
-_r.prototype.searchProcessedElement = _f.prototype.searchProcessedElement;
-_r.prototype.addProcessedElement = _f.prototype.addProcessedElement;
-_r.prototype._az = _f.prototype._az;
-
-_r.prototype.renderInnerContent = function() {
-
-    this.transformHelper.mat.reset();
-    this.transformHelper.opacity = this.finalTransform.mProp.o.v;
-    this.transformHelper.matMdf = false;
-    this.transformHelper.opMdf = this.finalTransform.opMdf;
-    this.renderModifiers();
-    this.renderShape(this.transformHelper,null,null,true);
-}
-
-_r.prototype.renderShape = function(parentTransform,items,data,isMain){
-    var i, len;
-    if(!items){
-        items = this.shapesData;
-        len = this.stylesList.length;
-        for(i=0;i<len;i+=1){
-            this.stylesList[i].d = '';
-            this.stylesList[i].mdf = false;
-        }
-    }
-    if(!data){
-        data = this.itemsData;
-    }
-    ///
-    ///
-    len = items.length - 1;
-    var groupTransform,groupMatrix;
-    groupTransform = parentTransform;
-    for(i=len;i>=0;i-=1){
-        if(items[i].ty == 'tr'){
-            groupTransform = data[i].transform;
-            var mtArr = data[i].transform.mProps.v.props;
-            groupTransform.matMdf = groupTransform.mProps.mdf;
-            groupTransform.opMdf = groupTransform.op.mdf;
-            groupMatrix = groupTransform.mat;
-            groupMatrix.cloneFromProps(mtArr);
-            if(parentTransform){
-                var props = parentTransform.mat.props;
-                groupTransform.opacity = parentTransform.opacity;
-                groupTransform.opacity *= data[i].transform.op.v;
-                groupTransform.matMdf = parentTransform.matMdf ? true : groupTransform.matMdf;
-                groupTransform.opMdf = parentTransform.opMdf ? true : groupTransform.opMdf;
-                groupMatrix.transform(props[0],props[1],props[2],props[3],props[4],props[5],props[6],props[7],props[8],props[9],props[10],props[11],props[12],props[13],props[14],props[15]);
-            }else{
-                groupTransform.opacity = groupTransform.op.o;
-            }
-        }else if(items[i].ty == 'sh' || items[i].ty == 'el' || items[i].ty == 'rc' || items[i].ty == 'sr'){
-            this.renderPath(items[i],data[i],groupTransform);
-        }else if(items[i].ty == 'fl'){
-            this.renderFill(items[i],data[i],groupTransform);
-        }else if(items[i].ty == 'st'){
-            this.renderStroke(items[i],data[i],groupTransform);
-        }else if(items[i].ty == 'gr'){
-            this.renderShape(groupTransform,items[i].it,data[i].it);
-        }else if(items[i].ty == 'tm'){
-            //
-        }
-    }
-    if(!isMain){
-        return;
-    }
-    len = this.stylesList.length;
-    var j, jLen, k, kLen,elems,nodes, renderer = this._x.renderer, ctx = this._x.canvasContext, type;
-    //renderer.save();
-    //renderer.ctxTransform(this.finalTransform.mat.props);
-    for(i=0;i<len;i+=1){
-        type = this.stylesList[i].type;
-        if((type === 'st' && this.stylesList[i].wi === 0) || !this.stylesList[i].data._render){
-            continue;
-        }
-        renderer.save();
-        elems = this.stylesList[i]._br;
-        if(type === 'st'){
-            ctx.strokeStyle = this.stylesList[i].co;
-            ctx.lineWidth = this.stylesList[i].wi;
-            ctx.lineCap = this.stylesList[i].lc;
-            ctx.lineJoin = this.stylesList[i].lj;
-            ctx.miterLimit = this.stylesList[i].ml || 0;
-        }else{
-            ctx.fillStyle = this.stylesList[i].co;
-        }
-        renderer.ctxOpacity(this.stylesList[i].coOp);
-        if(type !== 'st'){
-            ctx.beginPath();
-        }
-        jLen = elems.length;
-        for(j=0;j<jLen;j+=1){
-            if(type === 'st'){
-                ctx.beginPath();
-                if(this.stylesList[i].da){
-                    ctx.setLineDash(this.stylesList[i].da);
-                    ctx.lineDashOffset = this.stylesList[i].do;
-                    this._x.isDashed = true;
-                }else if(this._x.isDashed){
-                    ctx.setLineDash(this.dashResetter);
-                    this._x.isDashed = false;
-                }
-            }
-            nodes = elems[j].trNodes;
-            kLen = nodes.length;
-
-            for(k=0;k<kLen;k+=1){
-                if(nodes[k].t == 'm'){
-                    ctx.moveTo(nodes[k].p[0],nodes[k].p[1]);
-                }else if(nodes[k].t == 'c'){
-                    ctx.bezierCurveTo(nodes[k].p1[0],nodes[k].p1[1],nodes[k].p2[0],nodes[k].p2[1],nodes[k].p3[0],nodes[k].p3[1]);
-                }else{
-                    ctx.closePath();
-                }
-            }
-            if(type === 'st'){
-                ctx.stroke();
-            }
-        }
-        if(type !== 'st'){
-            ctx.fill(this.stylesList[i].r);
-        }
-        renderer.restore();
-    }
-    //renderer.restore();
-    if(this.firstFrame){
-        this.firstFrame = false;
-    }
-};
-_r.prototype.renderPath = function(pathData,itemData,groupTransform){
-    var len, i, j,jLen;
-    var redraw = groupTransform.matMdf || itemData.sh.mdf || this.firstFrame;
-    if(redraw) {
-        var paths = itemData.sh.paths, groupTransformMat = groupTransform.mat;
-        jLen = pathData._render === false ? 0 : paths._length;
-        var pathStringTransformed = itemData.trNodes;
-        pathStringTransformed.length = 0;
-        for(j=0;j<jLen;j+=1){
-            var pathNodes = paths.shapes[j];
-            if(pathNodes && pathNodes.v){
-                len = pathNodes._length;
-                for (i = 1; i < len; i += 1) {
-                    if (i == 1) {
-                        pathStringTransformed.push({
-                            t: 'm',
-                            p: groupTransformMat.applyToPointArray(pathNodes.v[0][0], pathNodes.v[0][1], 0)
-                        });
-                    }
-                    pathStringTransformed.push({
-                        t: 'c',
-                        p1: groupTransformMat.applyToPointArray(pathNodes.o[i - 1][0], pathNodes.o[i - 1][1], 0),
-                        p2: groupTransformMat.applyToPointArray(pathNodes.i[i][0], pathNodes.i[i][1], 0),
-                        p3: groupTransformMat.applyToPointArray(pathNodes.v[i][0], pathNodes.v[i][1], 0)
-                    });
-                }
-                if (len == 1) {
-                    pathStringTransformed.push({
-                        t: 'm',
-                        p: groupTransformMat.applyToPointArray(pathNodes.v[0][0], pathNodes.v[0][1], 0)
-                    });
-                }
-                if (pathNodes.c && len) {
-                    pathStringTransformed.push({
-                        t: 'c',
-                        p1: groupTransformMat.applyToPointArray(pathNodes.o[i - 1][0], pathNodes.o[i - 1][1], 0),
-                        p2: groupTransformMat.applyToPointArray(pathNodes.i[0][0], pathNodes.i[0][1], 0),
-                        p3: groupTransformMat.applyToPointArray(pathNodes.v[0][0], pathNodes.v[0][1], 0)
-                    });
-                    pathStringTransformed.push({
-                        t: 'z'
-                    });
-                }
-                itemData.lStr = pathStringTransformed;
-            }
-
-        }
-
-        if (itemData.st) {
-            for (i = 0; i < 16; i += 1) {
-                itemData.tr[i] = groupTransform.mat.props[i];
-            }
-        }
-        itemData.trNodes = pathStringTransformed;
-
-    }
-};
-
-
-
-_r.prototype.renderFill = function(styleData,itemData, groupTransform){
-    var styleElem = itemData.style;
-
-    if(itemData.c.mdf || this.firstFrame){
-        styleElem.co = 'rgb('+bm_floor(itemData.c.v[0])+','+bm_floor(itemData.c.v[1])+','+bm_floor(itemData.c.v[2])+')';
-    }
-    if(itemData.o.mdf || groupTransform.opMdf || this.firstFrame){
-        styleElem.coOp = itemData.o.v*groupTransform.opacity;
-    }
-};
-
-_r.prototype.renderStroke = function(styleData,itemData, groupTransform){
-    var styleElem = itemData.style;
-    //TODO fix dashes
-    var d = itemData.d;
-    if(d && (d.mdf  || this.firstFrame)){
-        styleElem.da = d.dashArray;
-        styleElem.do = d.dashoffset[0];
-    }
-    if(itemData.c.mdf || this.firstFrame){
-        styleElem.co = 'rgb('+bm_floor(itemData.c.v[0])+','+bm_floor(itemData.c.v[1])+','+bm_floor(itemData.c.v[2])+')';
-    }
-    if(itemData.o.mdf || groupTransform.opMdf || this.firstFrame){
-        styleElem.coOp = itemData.o.v*groupTransform.opacity;
-    }
-    if(itemData.w.mdf || this.firstFrame){
-        styleElem.wi = itemData.w.v;
-    }
-};
-
-
-_r.prototype.destroy = function(){
-    this.shapesData = null;
-    this._x = null;
-    this.canvasContext = null;
-    this.stylesList.length = 0;
-    this.itemsData.length = 0;
-};
-
-
-function _s(data, _x, comp) {
-    this.initElement(data,_x,comp);
-}
-extendPrototype([_e, _af, _c, _ad, _ac, _ae], _s);
-
-_s.prototype.initElement = _f.prototype.initElement;
-_s.prototype._az = _h.prototype._az;
-
-_s.prototype.renderInnerContent = function() {
-    var ctx = this.canvasContext;
-    ctx.fillStyle = this.data.sc;
-    ctx.fillRect(0, 0, this.data.sw, this.data.sh);
-    //
-};
-function _t(data, _x, comp){
-    this.textSpans = [];
-    this.yOffset = 0;
-    this.fillColorAnim = false;
-    this.strokeColorAnim = false;
-    this.strokeWidthAnim = false;
-    this.stroke = false;
-    this.fill = false;
-    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.initElement(data,_x,comp);
-}
-extendPrototype([_e,_af,_c,_ad,_ac,_ae,_k], _t);
-
-_t.prototype.tHelper = createTag('canvas').getContext('2d');
-
-_t.prototype.buildNewText = function(){
-    var documentData = this.textProperty.currentData;
-    this._bt = Array.apply(null,{length:documentData.l ? documentData.l.length : 0});
-
-    var hasFill = false;
-    if(documentData.fc) {
-        hasFill = true;
-        this.values.fill = this.buildColor(documentData.fc);
-    }else{
-        this.values.fill = 'rgba(0,0,0,0)';
-    }
-    this.fill = hasFill;
-    var hasStroke = false;
-    if(documentData.sc){
-        hasStroke = true;
-        this.values.stroke = this.buildColor(documentData.sc);
-        this.values.sWidth = documentData.sw;
-    }
-    var fontData = this._x.fontManager.getFontByName(documentData.f);
-    var i, len;
-    var letters = documentData.l;
-    var matrixHelper = this.mHelper;
-    this.stroke = hasStroke;
-    this.values.fValue = documentData.s + 'px '+ this._x.fontManager.getFontByName(documentData.f).fFamily;
-    len = documentData.t.length;
-    //this.tHelper.font = this.values.fValue;
-    var charData, shapeData, k, kLen, shapes, j, jLen, pathNodes, commands, pathArr, singleShape = this.data.singleShape;
-    var trackingOffset = documentData.tr/1000*documentData.s;
-    var xPos = 0, yPos = 0, firstLine = true;
-    var cnt = 0;
-    for (i = 0; i < len; i += 1) {
-        charData = this._x.fontManager.getCharData(documentData.t.charAt(i), fontData.fStyle, this._x.fontManager.getFontByName(documentData.f).fFamily);
-        shapeData = charData && charData.data || {};
-        matrixHelper.reset();
-        if(singleShape && letters[i].n) {
-            xPos = -trackingOffset;
-            yPos += documentData.yOffset;
-            yPos += firstLine ? 1 : 0;
-            firstLine = false;
-        }
-
-        shapes = shapeData.shapes ? shapeData.shapes[0].it : [];
-        jLen = shapes.length;
-        matrixHelper.scale(documentData.s/100,documentData.s/100);
-        if(singleShape){
-            this.applyTextPropertiesToMatrix(documentData, matrixHelper, letters[i].line, xPos, yPos);
-        }
-        commands = Array.apply(null,{length:jLen})
-        for(j=0;j<jLen;j+=1){
-            kLen = shapes[j].ks.k.i.length;
-            pathNodes = shapes[j].ks.k;
-            pathArr = [];
-            for(k=1;k<kLen;k+=1){
-                if(k==1){
-                    pathArr.push(matrixHelper.applyToX(pathNodes.v[0][0],pathNodes.v[0][1],0),matrixHelper.applyToY(pathNodes.v[0][0],pathNodes.v[0][1],0));
-                }
-                pathArr.push(matrixHelper.applyToX(pathNodes.o[k-1][0],pathNodes.o[k-1][1],0),matrixHelper.applyToY(pathNodes.o[k-1][0],pathNodes.o[k-1][1],0),matrixHelper.applyToX(pathNodes.i[k][0],pathNodes.i[k][1],0),matrixHelper.applyToY(pathNodes.i[k][0],pathNodes.i[k][1],0),matrixHelper.applyToX(pathNodes.v[k][0],pathNodes.v[k][1],0),matrixHelper.applyToY(pathNodes.v[k][0],pathNodes.v[k][1],0));
-            }
-            pathArr.push(matrixHelper.applyToX(pathNodes.o[k-1][0],pathNodes.o[k-1][1],0),matrixHelper.applyToY(pathNodes.o[k-1][0],pathNodes.o[k-1][1],0),matrixHelper.applyToX(pathNodes.i[0][0],pathNodes.i[0][1],0),matrixHelper.applyToY(pathNodes.i[0][0],pathNodes.i[0][1],0),matrixHelper.applyToX(pathNodes.v[0][0],pathNodes.v[0][1],0),matrixHelper.applyToY(pathNodes.v[0][0],pathNodes.v[0][1],0));
-            commands[j] = pathArr;
-        }
-        if(singleShape){
-            xPos += letters[i].l;
-            xPos += trackingOffset;
-        }
-        if(this.textSpans[cnt]){
-            this.textSpans[cnt].elem = commands;
-        } else {
-            this.textSpans[cnt] = {elem: commands};
-        }
-        cnt +=1;
-    }
-}
-
-_t.prototype.renderInnerContent = function(){
-    var ctx = this.canvasContext;
-    var finalMat = this.finalTransform.mat.props;
-    ctx.font = this.values.fValue;
-    ctx.lineCap = 'butt';
-    ctx.lineJoin = 'miter';
-    ctx.miterLimit = 4;
-
-    if(!this.data.singleShape){
-        this.textAnimator.getMeasures(this.textProperty.currentData, this.lettersChangedFlag);
-    }
-
-    var  i,len, j, jLen, k, kLen;
-    var _bt = this.textAnimator._bt;
-
-    var letters = this.textProperty.currentData.l;
-
-    len = letters.length;
-    var _bu;
-    var lastFill = null, lastStroke = null, lastStrokeW = null, commands, pathArr;
-    for(i=0;i<len;i+=1){
-        if(letters[i].n){
-            continue;
-        }
-        _bu = _bt[i];
-        if(_bu){
-            this._x.renderer.save();
-            this._x.renderer.ctxTransform(_bu.p);
-            this._x.renderer.ctxOpacity(_bu.o);
-        }
-        if(this.fill){
-            if(_bu && _bu.fc){
-                if(lastFill !== _bu.fc){
-                    lastFill = _bu.fc;
-                    ctx.fillStyle = _bu.fc;
-                }
-            }else if(lastFill !== this.values.fill){
-                lastFill = this.values.fill;
-                ctx.fillStyle = this.values.fill;
-            }
-            commands = this.textSpans[i].elem;
-            jLen = commands.length;
-            this._x.canvasContext.beginPath();
-            for(j=0;j<jLen;j+=1) {
-                pathArr = commands[j];
-                kLen = pathArr.length;
-                this._x.canvasContext.moveTo(pathArr[0], pathArr[1]);
-                for (k = 2; k < kLen; k += 6) {
-                    this._x.canvasContext.bezierCurveTo(pathArr[k], pathArr[k + 1], pathArr[k + 2], pathArr[k + 3], pathArr[k + 4], pathArr[k + 5]);
-                }
-            }
-            this._x.canvasContext.closePath();
-            this._x.canvasContext.fill();
-            ///ctx.fillText(this.textSpans[i].val,0,0);
-        }
-        if(this.stroke){
-            if(_bu && _bu.sw){
-                if(lastStrokeW !== _bu.sw){
-                    lastStrokeW = _bu.sw;
-                    ctx.lineWidth = _bu.sw;
-                }
-            }else if(lastStrokeW !== this.values.sWidth){
-                lastStrokeW = this.values.sWidth;
-                ctx.lineWidth = this.values.sWidth;
-            }
-            if(_bu && _bu.sc){
-                if(lastStroke !== _bu.sc){
-                    lastStroke = _bu.sc;
-                    ctx.strokeStyle = _bu.sc;
-                }
-            }else if(lastStroke !== this.values.stroke){
-                lastStroke = this.values.stroke;
-                ctx.strokeStyle = this.values.stroke;
-            }
-            commands = this.textSpans[i].elem;
-            jLen = commands.length;
-            this._x.canvasContext.beginPath();
-            for(j=0;j<jLen;j+=1) {
-                pathArr = commands[j];
-                kLen = pathArr.length;
-                this._x.canvasContext.moveTo(pathArr[0], pathArr[1]);
-                for (k = 2; k < kLen; k += 6) {
-                    this._x.canvasContext.bezierCurveTo(pathArr[k], pathArr[k + 1], pathArr[k + 2], pathArr[k + 3], pathArr[k + 4], pathArr[k + 5]);
-                }
-            }
-            this._x.canvasContext.closePath();
-            this._x.canvasContext.stroke();
-            ///ctx.strokeText(letters[i].val,0,0);
-        }
-        if(_bu) {
-            this._x.renderer.restore();
-        }
-    }
-    /*if(this.data.hasMask){
-     this._x.renderer.restore(true);
-     }*/
-};
-function _o() {
-
-}
-_o.prototype._ba = function(){}
-function _b(data,_x,comp){
-};
-
-_b.prototype.checkBlendMode = function(){
-};
-
-_b.prototype.get_e = _d.prototype.get_e;
-
-_b.prototype.initRendererElement = function(){
-    this._by = createTag('div');
-    if(this.data.hasMask) {
-        this._cf = createNS('svg');
-        this._bx = createNS('g');
-        this._ca = this._bx;
-        this._cf.appendChild(this._bx);
-        this._by.appendChild(this._cf);
-    } else {
-        this._bx = this._by;
-    }
-    styleDiv(this._by);
-}
-
-_b.prototype.createContainerElements = function(){
-    this.effectsManager = new _o(this);
-    this._bz = this._by;
-    this._ca = this._bx;
-    if (this.data.ln) {
-        this._bx.setAttribute('id',this.data.ln);
-    }
-    if (this.data.bm !== 0) {
-        this.setBlendMode();
-    }
-    this.checkParenting();
-};
-
-_b.prototype.renderElement = function() {
-    if(this.finalTransform.matMdf){
-        this._bz.style.transform = this._bz.style.webkitTransform = this.finalTransform.mat.toCSS();
-    }
-    if(this.finalTransform.opMdf){
-        this._bz.style.opacity = this.finalTransform.mProp.o.v;
-    }
-};
-
-_b.prototype._ba = function() {
-    //If it is exported as hidden (data.hd === true) no need to render
-    //If it is not visible no need to render
-    if (this.data.hd || this.hidden) {
-        return;
-    }
-    this.renderTransform();
-    this.renderRenderable();
-    this.renderElement();
-    this.renderInnerContent();
-    if (this.firstFrame) {
-        this.firstFrame = false;
-    }
-};
-
-_b.prototype.destroy = function(){
-    this._bx = null;
-    this._bz = null;
-    if(this.matteElement) {
-        this.matteElement = null;
-    }
-    if(this.maskManager) {
-        this.maskManager.destroy();
-        this.maskManager = null;
-    }
-};
-
-_b.prototype.getDomElement = function(){
-    return this._bx;
-};
-_b.prototype.addMasks = function(){
-    this.maskManager = new _ay(this.data, this, this._x);
-};
-
-_b.prototype.setMatte = function(){
-
-}
-
-_b.prototype.buildElementParenting = _ap.prototype.buildElementParenting;
-function _aa(data,_x,comp){
-    this.initElement(data,_x,comp);
-}
-extendPrototype([_e,_af,_b,_ad,_ac,RenderableDOMElement], _aa);
-
-_aa.prototype.createContent = function(){
-    var rect;
-    if(this.data.hasMask){
-        rect = createNS('rect');
-        rect.setAttribute('width',this.data.sw);
-        rect.setAttribute('height',this.data.sh);
-        rect.setAttribute('fill',this.data.sc);
-        this._cf.setAttribute('width',this.data.sw);
-        this._cf.setAttribute('height',this.data.sh);
-    } else {
-        rect = createTag('div');
-        rect.style.width = this.data.sw + 'px';
-        rect.style.height = this.data.sh + 'px';
-        rect.style.backgroundColor = this.data.sc;
-    }
-    this._bx.appendChild(rect);
-};
-
-function _w(data,_x,comp){
-    this.layers = data.layers;
-    this.supports3d = !data.hasMask;
-    this.completeLayers = false;
-    this.pendingElements = [];
-    this._br = this.layers ? Array.apply(null,{length:this.layers.length}) : [];
-    this.tm = data.tm ? _ai._bo(this,data.tm,0,_x.frameRate,this.dynamicProperties) : {_placeholder:true};
-    
-    this.initElement(data,_x,comp);
-}
-
-extendPrototype([_ap, _g, _b], _w);
-
-_w.prototype.createContainerElements = function(){
-    //divElement.style.clip = 'rect(0px, '+this.data.w+'px, '+this.data.h+'px, 0px)';
-    if(this.data.hasMask){
-        this._bz = this._bx;
-        this._cf.setAttribute('width',this.data.w);
-        this._cf.setAttribute('height',this.data.h);
-    }else{
-        this._bz = this._bx;
-
-    }
-    //this.appendNodeToParent(this._bx);
-    this.effectsManager = new _o(this);
-    this.checkParenting();
-};
-function _z(data,_x,comp){
-    //List of drawable _br
-    this.shapes = [];
-    // Full shape data
-    this.shapesData = data.shapes;
-    //List of styles that will be applied to shapes
-    this.stylesList = [];
-    //List of modifiers that will be applied to shapes
-    this.shapeModifiers = [];
-    //List of items in shape tree
-    this.itemsData = [];
-    //List of items in previous shape tree
-    this.processedElements = [];
-    this.shapesContainer = createNS('g');
-    this.initElement(data,_x,comp);
-    //Moving any property that doesn't get too much access after initialization because of v8 way of handling more than 10 properties.
-    // List of _br that have been created
-    this.prevViewData = [];
-    this._cg = {
-        x:999999,
-        y: -999999,
-        h: 0,
-        w: 0
-    };
-}
-extendPrototype([_e,_af,_aa,_f,_b,_ad,_ac,_ae], _z);
-_z.prototype._renderShapeFrame = _z.prototype.renderInnerContent;
-
-_z.prototype.createContent = function(){
-    var cont;
-    if (this.data.hasMask) {
-        this._bx.appendChild(this.shapesContainer);
-        cont = this._cf;
-    } else {
-        cont = createNS('svg');
-        var size = this.comp.data ? this.comp.data : this._x.compSize;
-        cont.setAttribute('width',size.w);
-        cont.setAttribute('height',size.h);
-        cont.appendChild(this.shapesContainer);
-        this._bx.appendChild(cont);
-    }
-
-    this.searchShapes(this.shapesData,this.itemsData,this.prevViewData,this.shapesContainer,this.dynamicProperties,0, [], true);
-    this.shapeCont = cont;
-};
-
-_z.prototype.renderInnerContent = function() {
-    this._renderShapeFrame();
-
-    //TODO: this also needs to be recalculated every time a property changes. Check how canvas renderer uses _x.mdf. Also would be great to calculate size from shapes and not from DOM.
-    if(!this.hidden && this.firstFrame) {
-        var boundingBox = this.shapeCont.getBBox();
-        var changed = false;
-        if(this._cg.w !== boundingBox.width){
-            this._cg.w = boundingBox.width;
-            this.shapeCont.setAttribute('width',boundingBox.width);
-            changed = true;
-        }
-        if(this._cg.h !== boundingBox.height){
-            this._cg.h = boundingBox.height;
-            this.shapeCont.setAttribute('height',boundingBox.height);
-            changed = true;
-        }
-        if(changed  || this._cg.x !== boundingBox.x  || this._cg.y !== boundingBox.y){
-            this._cg.w = boundingBox.width;
-            this._cg.h = boundingBox.height;
-            this._cg.x = boundingBox.x;
-            this._cg.y = boundingBox.y;
-
-            this.shapeCont.setAttribute('viewBox',this._cg.x+' '+this._cg.y+' '+this._cg.w+' '+this._cg.h);
-            this.shapeCont.style.transform = this.shapeCont.style.webkitTransform = 'translate(' + this._cg.x + 'px,' + this._cg.y + 'px)';
-        }
-    }
-
-};
-function _ab(data,_x,comp){
-    this.textSpans = [];
-    this.textPaths = [];
-    this._cg = {
-        x:999999,
-        y: -999999,
-        h: 0,
-        w: 0
-    }
-    this.renderType = 'svg';
-    this.isMasked = false;
-    this.initElement(data,_x,comp);
-
-}
-extendPrototype([_e,_af,_b,_ad,_ac,RenderableDOMElement,_k], _ab);
-
-_ab.prototype.createContent = function(){
-    this.isMasked = this.checkMasks();
-    if(this.isMasked){
-        this.renderType = 'svg';
-        this.compW = this.comp.data.w;
-        this.compH = this.comp.data.h;
-        this._cf.setAttribute('width',this.compW);
-        this._cf.setAttribute('height',this.compH);
-        var g = createNS('g');
-        this._ca.appendChild(g);
-        this._cc = g;
-    } else {
-        this.renderType = 'html';
-        this._cc = this._bx;
-    }
-
-    this.checkParenting();
-
-};
-
-_ab.prototype.buildNewText = function(){
-    var documentData = this.textProperty.currentData;
-    this._bt = Array.apply(null,{length:this.textProperty.currentData.l ? this.textProperty.currentData.l.length : 0});
-    var _cb = this._cc.style;
-    _cb.color = _cb.fill = documentData.fc ? this.buildColor(documentData.fc) : 'rgba(0,0,0,0)';
-    if(documentData.sc){
-        _cb.stroke = this.buildColor(documentData.sc);
-        _cb.strokeWidth = documentData.sw+'px';
-    }
-    var fontData = this._x.fontManager.getFontByName(documentData.f);
-    if(!this._x.fontManager.chars){
-        _cb.fontSize = documentData.s+'px';
-        _cb.lineHeight = documentData.s+'px';
-        if(fontData.fClass){
-            this._cc.className = fontData.fClass;
-        } else {
-            _cb.fontFamily = fontData.fFamily;
-            var fWeight = documentData.fWeight, fStyle = documentData.fStyle;
-            _cb.fontStyle = fStyle;
-            _cb.fontWeight = fWeight;
-        }
-    }
-    var i, len;
-
-    var letters = documentData.l;
-    len = letters.length;
-    var tSpan,tParent,tCont;
-    var matrixHelper = this.mHelper;
-    var shapes, shapeStr = '';
-    var cnt = 0;
-    for (i = 0;i < len ;i += 1) {
-        if(this._x.fontManager.chars){
-            if(!this.textPaths[cnt]){
-                tSpan = createNS('path');
-                tSpan.setAttribute('stroke-linecap', 'butt');
-                tSpan.setAttribute('stroke-linejoin','round');
-                tSpan.setAttribute('stroke-miterlimit','4');
-            } else {
-                tSpan = this.textPaths[cnt];
-            }
-            if(!this.isMasked){
-                if(this.textSpans[cnt]){
-                    tParent = this.textSpans[cnt];
-                    tCont = tParent.children[0];
-                } else {
-
-                    tParent = createTag('div');
-                    tCont = createNS('svg');
-                    tCont.appendChild(tSpan);
-                    styleDiv(tParent);
-                }
-            }
-        }else{
-            if(!this.isMasked){
-                if(this.textSpans[cnt]){
-                    tParent = this.textSpans[cnt];
-                    tSpan = this.textPaths[cnt];
-                } else {
-                    tParent = createTag('span');
-                    styleDiv(tParent);
-                    tSpan = createTag('span');
-                    styleDiv(tSpan);
-                    tParent.appendChild(tSpan);
-                }
-            } else {
-                tSpan = this.textPaths[cnt] ? this.textPaths[cnt] : createNS('text');
-            }
-        }
-        //tSpan.setAttribute('visibility', 'hidden');
-        if(this._x.fontManager.chars){
-            var charData = this._x.fontManager.getCharData(documentData.t.charAt(i), fontData.fStyle, this._x.fontManager.getFontByName(documentData.f).fFamily);
-            var shapeData;
-            if(charData){
-                shapeData = charData.data;
-            } else {
-                shapeData = null;
-            }
-            matrixHelper.reset();
-            if(shapeData && shapeData.shapes){
-                shapes = shapeData.shapes[0].it;
-                matrixHelper.scale(documentData.s/100,documentData.s/100);
-                shapeStr = this.createPathShape(matrixHelper,shapes);
-                tSpan.setAttribute('d',shapeStr);
-            }
-            if(!this.isMasked){
-                this._cc.appendChild(tParent);
-                if(shapeData && shapeData.shapes){
-
-                    var boundingBox = tCont.getBBox();
-                    tCont.setAttribute('width',boundingBox.width + 2);
-                    tCont.setAttribute('height',boundingBox.height + 2);
-                    tCont.setAttribute('viewBox',(boundingBox.x-1)+' '+ (boundingBox.y-1)+' '+ (boundingBox.width+2)+' '+ (boundingBox.height+2));
-                    tCont.style.transform = tCont.style.webkitTransform = 'translate(' + (boundingBox.x-1) + 'px,' + (boundingBox.y-1) + 'px)';
-
-                    letters[i].yOffset = boundingBox.y-1;
-                    tParent.appendChild(tCont);
-
-                } else{
-                    tCont.setAttribute('width',1);
-                    tCont.setAttribute('height',1);
-                }
-            }else{
-                this._cc.appendChild(tSpan);
-            }
-        }else{
-            tSpan.textContent = letters[i].val;
-            tSpan.setAttributeNS("http://www.w3.org/XML/1998/namespace", "xml:space","preserve");
-            if(!this.isMasked){
-                this._cc.appendChild(tParent);
-                //
-                tSpan.style.transform = tSpan.style.webkitTransform = 'translate3d(0,'+ -documentData.s/1.2+'px,0)';
-            } else {
-                this._cc.appendChild(tSpan);
-            }
-        }
-        //
-        if(!this.isMasked){
-            this.textSpans[cnt] = tParent;
-        }else{
-            this.textSpans[cnt] = tSpan;
-        }
-        this.textSpans[cnt].style.display = 'block';
-        this.textPaths[cnt] = tSpan;
-        cnt += 1;
-    }
-    while(cnt < this.textSpans.length){
-        this.textSpans[cnt].style.display = 'none';
-        cnt += 1;
-    }
-}
-
-_ab.prototype.renderInnerContent = function() {
-
-    if(this.data.singleShape){
-        if(!this.firstFrame && !this.lettersChangedFlag){
-            return;
-        } else {
-            // Todo Benchmark if using this is better than getBBox
-             if(this.isMasked && this.finalTransform.matMdf){
-                 this._cf.setAttribute('viewBox',-this.finalTransform.mProp.p.v[0]+' '+ -this.finalTransform.mProp.p.v[1]+' '+this.compW+' '+this.compH);
-                this._cf.style.transform = this._cf.style.webkitTransform = 'translate(' + -this.finalTransform.mProp.p.v[0] + 'px,' + -this.finalTransform.mProp.p.v[1] + 'px)';
-             }
-        }
-    }
-
-    this.textAnimator.getMeasures(this.textProperty.currentData, this.lettersChangedFlag);
-    if(!this.lettersChangedFlag && !this.textAnimator.lettersChangedFlag){
-        return;
-    }
-    var  i,len, count = 0;
-    var _bt = this.textAnimator._bt;
-
-    var letters = this.textProperty.currentData.l;
-
-    len = letters.length;
-    var _bu, textSpan, textPath;
-    for(i=0;i<len;i+=1){
-        if(letters[i].n){
-            count += 1;
-            continue;
-        }
-        textSpan = this.textSpans[i];
-        textPath = this.textPaths[i];
-        _bu = _bt[count];
-        count += 1;
-        if(!this.isMasked){
-            textSpan.style.transform = textSpan.style.webkitTransform = _bu.m;
-        }else{
-            textSpan.setAttribute('transform',_bu.m);
-        }
-        ////textSpan.setAttribute('opacity',_bu.o);
-        textSpan.style.opacity = _bu.o;
-        if(_bu.sw){
-            textPath.setAttribute('stroke-width',_bu.sw);
-        }
-        if(_bu.sc){
-            textPath.setAttribute('stroke',_bu.sc);
-        }
-        if(_bu.fc){
-            textPath.setAttribute('fill',_bu.fc);
-            textPath.style.color = _bu.fc;
-        }
-    }
-
-    //TODO: this also needs to be recalculated every time a property changes. Check how canvas renderer uses _x.mdf. Also would be great to calculate size from shapes and not from DOM.
-    if(this.isVisible && (this.firstFrame)){
-        if(this._cc.getBBox){
-            var boundingBox = this._cc.getBBox();
-
-            if(this._cg.w !== boundingBox.width){
-                this._cg.w = boundingBox.width;
-                this._cf.setAttribute('width',boundingBox.width);
-            }
-            if(this._cg.h !== boundingBox.height){
-                this._cg.h = boundingBox.height;
-                this._cf.setAttribute('height',boundingBox.height);
-            }
-
-            var margin = 1;
-            if(this._cg.w !== (boundingBox.width + margin*2) || this._cg.h !== (boundingBox.height + margin*2)  || this._cg.x !== (boundingBox.x - margin)  || this._cg.y !== (boundingBox.y - margin)){
-                this._cg.w = boundingBox.width + margin*2;
-                this._cg.h = boundingBox.height + margin*2;
-                this._cg.x = boundingBox.x - margin;
-                this._cg.y = boundingBox.y - margin;
-
-                this._cf.setAttribute('viewBox',this._cg.x+' '+this._cg.y+' '+this._cg.w+' '+this._cg.h);
-                this._cf.style.transform = this._cf.style.webkitTransform = 'translate(' + this._cg.x + 'px,' + this._cg.y + 'px)';
-            }
-        }
-    }
-}
-function _y(data,_x,comp){
-    this.assetData = _x.getAssetData(data.refId);
-    this.initElement(data,_x,comp);
-}
-
-extendPrototype([_e,_af,_b,_aa,_ad,_ac,_ae], _y);
-
-
-_y.prototype.createContent = function(){
-    var assetPath = this._x.getAssetsPath(this.assetData);
-    var img = new Image();
-
-    if(this.data.hasMask){
-        this.imageElem = createNS('image');
-        this.imageElem.setAttribute('width',this.assetData.w+"px");
-        this.imageElem.setAttribute('height',this.assetData.h+"px");
-        this.imageElem.setAttributeNS('http://www.w3.org/1999/xlink','href',assetPath);
-        this._bx.appendChild(this.imageElem);
-        this._by.setAttribute('width',this.assetData.w);
-        this._by.setAttribute('height',this.assetData.h);
-    } else {
-        this._bx.appendChild(img);
-    }
-    img.src = assetPath;
-    if(this.data.ln){
-        this._cc.setAttribute('id',this.data.ln);
-    }
-    this.checkParenting();
-};
-function _v(data,_x,comp){
-    this.initFrame();
-    this.initBaseData(data,_x,comp);
-    var _bo = _ai._bo;
-    this.pe = _bo(this,data.pe,0,0,this.dynamicProperties);
-    if(data.ks.p.s){
-        this.px = _bo(this,data.ks.p.x,1,0,this.dynamicProperties);
-        this.py = _bo(this,data.ks.p.y,1,0,this.dynamicProperties);
-        this.pz = _bo(this,data.ks.p.z,1,0,this.dynamicProperties);
-    }else{
-        this.p = _bo(this,data.ks.p,1,0,this.dynamicProperties);
-    }
-    if(data.ks.a){
-        this.a = _bo(this,data.ks.a,1,0,this.dynamicProperties);
-    }
-    if(data.ks.or.k.length && data.ks.or.k[0].to){
-        var i,len = data.ks.or.k.length;
-        for(i=0;i<len;i+=1){
-            data.ks.or.k[i].to = null;
-            data.ks.or.k[i].ti = null;
-        }
-    }
-    this.or = _bo(this,data.ks.or,1,degToRads,this.dynamicProperties);
-    this.or.sh = true;
-    this.rx = _bo(this,data.ks.rx,0,degToRads,this.dynamicProperties);
-    this.ry = _bo(this,data.ks.ry,0,degToRads,this.dynamicProperties);
-    this.rz = _bo(this,data.ks.rz,0,degToRads,this.dynamicProperties);
-    this.mat = new Matrix();
-    this._prevMat = new Matrix();
-    this.firstFrame = true;
-}
-extendPrototype([_e, _ac], _v);
-
-_v.prototype.setup = function() {
-    var i, len = this.comp.threeDElements.length, comp;
-    for(i=0;i<len;i+=1){
-        //[perspectiveElem,container]
-        comp = this.comp.threeDElements[i];
-        comp.perspectiveElem.style.perspective = comp.perspectiveElem.style.webkitPerspective = this.pe.v+'px';
-        comp.container.style.transformOrigin = comp.container.style.mozTransformOrigin = comp.container.style.webkitTransformOrigin = "0px 0px 0px";
-        comp.perspectiveElem.style.transform = comp.perspectiveElem.style.webkitTransform = 'matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1)';
-    }
-};
-
-_v.prototype.createElements = function(){
-};
-
-_v.prototype.hide = function(){
-};
-
-_v.prototype._ba = function(){
-    var mdf = this.firstFrame;
-    var i, len;
-    if(this.hierarchy){
-        len = this.hierarchy.length;
-        for(i=0;i<len;i+=1){
-            mdf = this.hierarchy[i].finalTransform.mProp.mdf ? true : mdf;
-        }
-    }
-    if(mdf || (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)) {
-        this.mat.reset();
-
-        if(this.p){
-            this.mat.translate(-this.p.v[0],-this.p.v[1],this.p.v[2]);
-        }else{
-            this.mat.translate(-this.px.v,-this.py.v,this.pz.v);
-        }
-        if(this.a){
-            var diffVector = [this.p.v[0]-this.a.v[0],this.p.v[1]-this.a.v[1],this.p.v[2]-this.a.v[2]];
-            var mag = Math.sqrt(Math.pow(diffVector[0],2)+Math.pow(diffVector[1],2)+Math.pow(diffVector[2],2));
-            //var lookDir = getNormalizedPoint(getDiffVector(this.a.v,this.p.v));
-            var lookDir = [diffVector[0]/mag,diffVector[1]/mag,diffVector[2]/mag];
-            var lookLengthOnXZ = Math.sqrt( lookDir[2]*lookDir[2] + lookDir[0]*lookDir[0] );
-            var m_rotationX = (Math.atan2( lookDir[1], lookLengthOnXZ ));
-            var m_rotationY = (Math.atan2( lookDir[0], -lookDir[2]));
-            this.mat.rotateY(m_rotationY).rotateX(-m_rotationX);
-
-        }
-        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._x.compSize.w/2,this._x.compSize.h/2,0);
-        this.mat.translate(0,0,this.pe.v);
-        if(this.hierarchy){
-            var mat;
-            len = this.hierarchy.length;
-            for(i=0;i<len;i+=1){
-                mat = this.hierarchy[i].finalTransform.mProp.iv.props;
-                this.mat.transform(mat[0],mat[1],mat[2],mat[3],mat[4],mat[5],mat[6],mat[7],mat[8],mat[9],mat[10],mat[11],-mat[12],-mat[13],mat[14],mat[15]);
-            }
-        }
-        if(!this._prevMat.equals(this.mat)) {
-            len = this.comp.threeDElements.length;
-            var comp;
-            for(i=0;i<len;i+=1){
-                comp = this.comp.threeDElements[i];
-                comp.container.style.transform = comp.container.style.webkitTransform = this.mat.toCSS();
-            }
-            this.mat.clone(this._prevMat);
-        }
-    } else {
-
-        //console.log('NO ENTRO')
-    }
-    this.firstFrame = false;
-};
-
-_v.prototype._az = function(num) {
-    this.prepareProperties(num, true);
-};
-
-_v.prototype.destroy = function(){
-};
-_v.prototype.initExpressions = function(){};
-_v.prototype.get_e = function(){return null};
-function _bv() {
-}
-_bv.prototype._ba = function(){}
 var animationManager = (function(){
     var moduleOb = {};
     var registeredAnimations = [];
@@ -10502,7 +8298,7 @@
             }
             var body = document.getElementsByTagName('body')[0];
             body.innerHTML = '';
-            var div = createTag('div');
+            var div = _cu('div');
             div.style.width = '100%';
             div.style.height = '100%';
             div.setAttribute('data-bm-type',renderer);
@@ -10565,7 +8361,7 @@
     this.frameMult = 0;
     this.playSpeed = 1;
     this.playDirection = 1;
-    this.pendingElements = 0;
+    this._dc = 0;
     this.playCount = 0;
     this.animationData = {};
     this.layers = [];
@@ -10585,6 +8381,8 @@
     this.projectInterface = ProjectInterface();
 };
 
+extendPrototype([BaseEvent], _a);
+
 _a.prototype.setParams = function(params) {
     var self = this;
     if(params.context){
@@ -10710,8 +8508,8 @@
         }
     }
     if(data.chars || data.fonts){
-        this.renderer._x.fontManager.addChars(data.chars);
-        this.renderer._x.fontManager.addFonts(data.fonts, this.renderer._x.defs);
+        this.renderer._x._cr.addChars(data.chars);
+        this.renderer._x._cr.addFonts(data.fonts, this.renderer._x.defs);
     }
     if(data.assets){
         len = data.assets.length;
@@ -10722,7 +8520,7 @@
     //this.totalFrames = 50;
     //this.animationData.tf = 50;
     this.animationData.__complete = false;
-    dataManager.completeData(this.animationData,this.renderer._x.fontManager);
+    dataManager.completeData(this.animationData,this.renderer._x._cr);
     this.renderer.includeLayers(data.layers);
     if(expressionsPlugin){
         expressionsPlugin.initExpressions(this);
@@ -10793,7 +8591,7 @@
     this.layers = this.animationData.layers;
     this.assets = this.animationData.assets;
     this.frameRate = this.animationData.fr;
-    this.firstFrame = Math.round(this.animationData.ip);
+    this._ch = Math.round(this.animationData.ip);
     this.frameMult = this.animationData.fr / 1000;
     this.trigger('config_ready');
     this.imagePreloader = new ImagePreloader();
@@ -10806,18 +8604,18 @@
     });
     this.loadSegments();
     this.updaFrameModifier();
-    if(this.renderer._x.fontManager){
+    if(this.renderer._x._cr){
         this.waitForFontsLoaded();
     }else{
-        dataManager.completeData(this.animationData,this.renderer._x.fontManager);
+        dataManager.completeData(this.animationData,this.renderer._x._cr);
         this.checkLoaded();
     }
 };
 
 _a.prototype.waitForFontsLoaded = (function(){
     function checkFontsLoaded(){
-        if(this.renderer._x.fontManager.loaded){
-            dataManager.completeData(this.animationData,this.renderer._x.fontManager);
+        if(this.renderer._x._cr.loaded){
+            dataManager.completeData(this.animationData,this.renderer._x._cr);
             //this.renderer.buildItems(this.animationData.layers);
             this.checkLoaded();
         }else{
@@ -10831,16 +8629,16 @@
 }());
 
 _a.prototype.addPendingElement = function () {
-    this.pendingElements += 1;
+    this._dc += 1;
 };
 
 _a.prototype.elementLoaded = function () {
-    this.pendingElements--;
+    this._dc--;
     this.checkLoaded();
 };
 
 _a.prototype.checkLoaded = function () {
-    if (this.pendingElements === 0) {
+    if (this._dc === 0) {
         if(expressionsPlugin){
             expressionsPlugin.initExpressions(this);
         }
@@ -10878,8 +8676,8 @@
     if(this.isLoaded === false){
         return;
     }
-    //console.log('this.currentFrame:',this.currentFrame + this.firstFrame);
-    this.renderer._ba(this.currentFrame + this.firstFrame);
+    //console.log('this.currentFrame:',this.currentFrame + this._ch);
+    this.renderer._ba(this.currentFrame + this._ch);
 };
 
 _a.prototype.play = function (name) {
@@ -10983,7 +8781,7 @@
             }
         }
         this.totalFrames = arr[0] - arr[1];
-        this.firstFrame = arr[1];
+        this._ch = arr[1];
         this.setCurrentRawFrameValue(this.totalFrames - 0.001);
     } else if(arr[1] > arr[0]){
         if(this.frameModifier < 0){
@@ -10994,7 +8792,7 @@
             }
         }
         this.totalFrames = arr[1] - arr[0];
-        this.firstFrame = arr[0];
+        this._ch = arr[0];
         this.setCurrentRawFrameValue(0.001);
     }
     this.trigger('segmentStart');
@@ -11002,14 +8800,14 @@
 _a.prototype.setSegment = function (init,end) {
     var pendingFrame = -1;
     if(this.isPaused) {
-        if (this.currentRawFrame + this.firstFrame < init) {
+        if (this.currentRawFrame + this._ch < init) {
             pendingFrame = init;
-        } else if (this.currentRawFrame + this.firstFrame > end) {
+        } else if (this.currentRawFrame + this._ch > end) {
             pendingFrame = end - init;
         }
     }
 
-    this.firstFrame = init;
+    this._ch = init;
     this.totalFrames = end - init;
     if(pendingFrame !== -1) {
         this.goToAndStop(pendingFrame,true);
@@ -11166,22 +8964,22 @@
     if(this._cbs && this._cbs[name]){
         switch(name){
             case 'enterFrame':
-                this.triggerEvent(name,new BMEnterFrameEvent(name,this.currentFrame,this.totalFrames,this.frameMult));
+                this._cy(name,new BMEnterFrameEvent(name,this.currentFrame,this.totalFrames,this.frameMult));
                 break;
             case 'loopComplete':
-                this.triggerEvent(name,new BMCompleteLoopEvent(name,this.loop,this.playCount,this.frameMult));
+                this._cy(name,new BMCompleteLoopEvent(name,this.loop,this.playCount,this.frameMult));
                 break;
             case 'complete':
-                this.triggerEvent(name,new BMCompleteEvent(name,this.frameMult));
+                this._cy(name,new BMCompleteEvent(name,this.frameMult));
                 break;
             case 'segmentStart':
-                this.triggerEvent(name,new BMSegmentStartEvent(name,this.firstFrame,this.totalFrames));
+                this._cy(name,new BMSegmentStartEvent(name,this._ch,this.totalFrames));
                 break;
             case 'destroy':
-                this.triggerEvent(name,new BMDestroyEvent(name,this));
+                this._cy(name,new BMDestroyEvent(name,this));
                 break;
             default:
-                this.triggerEvent(name);
+                this._cy(name);
         }
     }
     if(name === 'enterFrame' && this.onEnterFrame){
@@ -11194,2346 +8992,12 @@
         this.onComplete.call(this,new BMCompleteEvent(name,this.frameMult));
     }
     if(name === 'segmentStart' && this.onSegmentStart){
-        this.onSegmentStart.call(this,new BMSegmentStartEvent(name,this.firstFrame,this.totalFrames));
+        this.onSegmentStart.call(this,new BMSegmentStartEvent(name,this._ch,this.totalFrames));
     }
     if(name === 'destroy' && this.onDestroy){
         this.onDestroy.call(this,new BMDestroyEvent(name,this));
     }
 };
-
-_a.prototype.addEventListener = _addEventListener;
-_a.prototype.removeEventListener = _removeEventListener;
-_a.prototype.triggerEvent = _triggerEvent;
-
-var Expressions = (function(){
-    var ob = {};
-    ob.initExpressions = initExpressions;
-
-
-    function initExpressions(animation){
-        animation.renderer.compInterface = CompExpressionInterface(animation.renderer);
-        animation.renderer._x.projectInterface.registerComposition(animation.renderer);
-    }
-   return ob;
-}());
-
-expressionsPlugin = Expressions;
-
-var ExpressionManager = (function(){
-    "use strict";
-    var ob = {};
-    var Math = BMMath;
-    var window = null;
-    var document = null;
-
-    function duplicatePropertyValue(value, mult) {
-        mult = mult || 1;
-
-        if (typeof value === 'number'  || value instanceof Number) {
-            return value * mult;
-        } else if(value.i) {
-            return shape_pool.clone(value);
-        } else {
-            var arr = createTypedArray('float32', value.length);
-            var i, len = value.length;
-            for (i = 0; i < len; i += 1) {
-                arr[i] = value[i] * mult;
-            }
-            return arr;
-        }
-    }
-
-    function isTypeOfArray(arr) {
-        return arr.constructor === Array || arr.constructor === Float32Array;
-    }
-
-    function shapesEqual(shape1, shape2) {
-        if(shape1._length !== shape2._length || shape1.c !== shape2.c){
-            return false;
-        }
-        var i, len = shape1._length;
-        for(i = 0; i < len; i += 1) {
-            if(shape1.v[i][0] !== shape2.v[i][0] || shape1.v[i][1] !== shape2.v[i][1]
-                || shape1.o[i][0] !== shape2.o[i][0] || shape1.o[i][1] !== shape2.o[i][1]
-                || shape1.i[i][0] !== shape2.i[i][0] || shape1.i[i][1] !== shape2.i[i][1]){
-                return false;
-            }
-        }
-        return true;
-    }
-
-    function $bm_neg(a){
-        var tOfA = typeof a;
-        if(tOfA === 'number' || tOfA === 'boolean'  || a instanceof Number ){
-            return -a;
-        }
-        if(isTypeOfArray(a)){
-            var i, lenA = a.length;
-            var retArr = [];
-            for(i=0;i<lenA;i+=1){
-                retArr[i] = -a[i];
-            }
-            return retArr;
-        }
-    }
-
-    function sum(a,b) {
-        var tOfA = typeof a;
-        var tOfB = typeof b;
-        if(tOfA === 'string' || tOfB === 'string'){
-            return a + b;
-        }
-        if((tOfA === 'number' || tOfA === 'boolean' || tOfA === 'string' || a instanceof Number) && (tOfB === 'number' || tOfB === 'boolean' || tOfB === 'string'  || b instanceof Number)) {
-            return a + b;
-        }
-        if(isTypeOfArray(a) && (tOfB === 'number' || tOfB === 'boolean' || tOfB === 'string' || b instanceof Number )){
-            a[0] = a[0] + b;
-            return a;
-        }
-        if((tOfA === 'number' || tOfA === 'boolean' || tOfA === 'string' || a instanceof Number ) && isTypeOfArray(b)){
-            b[0] = a + b[0];
-            return b;
-        }
-        if(isTypeOfArray(a) && isTypeOfArray(b)){
-            
-            var i = 0, lenA = a.length, lenB = b.length;
-            var retArr = [];
-            while(i<lenA || i < lenB){
-                if((typeof a[i] === 'number' || a[i] instanceof Number) && (typeof b[i] === 'number' || b[i] instanceof Number)){
-                    retArr[i] = a[i] + b[i];
-                }else{
-                    retArr[i] = b[i] == undefined ? a[i] : a[i] || b[i];
-                }
-                i += 1;
-            }
-            return retArr;
-        }
-        return 0;
-    }
-    var add = sum;
-
-    function sub(a,b) {
-        var tOfA = typeof a;
-        var tOfB = typeof b;
-        if((tOfA === 'number' || tOfA === 'boolean' || tOfA === 'string' || a instanceof Number ) && (tOfB === 'number' || tOfB === 'boolean' || tOfB === 'string' || b instanceof Number )) {
-            if(tOfA === 'string') {
-                a = parseInt(a);
-            }
-            if(tOfB === 'string') {
-                b = parseInt(b);
-            }
-            return a - b;
-        }
-        if( isTypeOfArray(a) && (tOfB === 'number' || tOfB === 'boolean' || tOfB === 'string' || b instanceof Number )){
-            a[0] = a[0] - b;
-            return a;
-        }
-        if((tOfA === 'number' || tOfA === 'boolean' || tOfA === 'string' || a instanceof Number ) &&  isTypeOfArray(b)){
-            b[0] = a - b[0];
-            return b;
-        }
-        if(isTypeOfArray(a) && isTypeOfArray(b)){
-            var i = 0, lenA = a.length, lenB = b.length;
-            var retArr = [];
-            while(i<lenA || i < lenB){
-                if((typeof a[i] === 'number' || a[i] instanceof Number) && typeof (typeof b[i] === 'number' || b[i] instanceof Number)){
-                    retArr[i] = a[i] - b[i];
-                }else{
-                    retArr[i] = b[i] == undefined ? a[i] : a[i] || b[i];
-                }
-                i += 1;
-            }
-            return retArr;
-        }
-        return 0;
-    }
-
-    function mul(a,b) {
-        var tOfA = typeof a;
-        var tOfB = typeof b;
-        var arr;
-        if((tOfA === 'number' || tOfA === 'boolean' || tOfA === 'string' || a instanceof Number ) && (tOfB === 'number' || tOfB === 'boolean' || tOfB === 'string' || b instanceof Number )) {
-            return a * b;
-        }
-
-        var i, len;
-        if(isTypeOfArray(a) && (tOfB === 'number' || tOfB === 'boolean' || tOfB === 'string' || b instanceof Number )){
-            len = a.length;
-            arr = createTypedArray('float32', len);
-            for(i=0;i<len;i+=1){
-                arr[i] = a[i] * b;
-            }
-            return arr;
-        }
-        if((tOfA === 'number' || tOfA === 'boolean' || tOfA === 'string' || a instanceof Number ) && isTypeOfArray(b)){
-            len = b.length;
-            arr = createTypedArray('float32', len);
-            for(i=0;i<len;i+=1){
-                arr[i] = a * b[i];
-            }
-            return arr;
-        }
-        return 0;
-    }
-
-    function div(a,b) {
-        var tOfA = typeof a;
-        var tOfB = typeof b;
-        var arr;
-        if((tOfA === 'number' || tOfA === 'boolean' || tOfA === 'string' || a instanceof Number ) && (tOfB === 'number' || tOfB === 'boolean' || tOfB === 'string' || b instanceof Number )) {
-            return a / b;
-        }
-        var i, len;
-        if(isTypeOfArray(a) && (tOfB === 'number' || tOfB === 'boolean' || tOfB === 'string' || b instanceof Number  )){
-            len = a.length;
-            arr = createTypedArray('float32', len);
-            for(i=0;i<len;i+=1){
-                arr[i] = a[i] / b;
-            }
-            return arr;
-        }
-        if((tOfA === 'number' || tOfA === 'boolean' || tOfA === 'string' || a instanceof Number ) && isTypeOfArray(b)){
-            len = b.length;
-            arr = createTypedArray('float32', len);
-            for(i=0;i<len;i+=1){
-                arr[i] = a / b[i];
-            }
-            return arr;
-        }
-        return 0;
-    }
-    function mod(a,b) {
-        if(typeof a === 'string') {
-            a = parseInt(a);
-        }
-        if(typeof b === 'string') {
-            b = parseInt(b);
-        }
-        return a % b;
-    }
-
-    function clamp(num, min, max) {
-        if(min > max){
-            var mm = max;
-            max = min;
-            min = mm;
-        }
-        return Math.min(Math.max(num, min), max);
-    }
-
-    function radiansToDegrees(val) {
-        return val/degToRads;
-    }
-    var radians_to_degrees = radiansToDegrees;
-
-    function degreesToRadians(val) {
-        return val*degToRads;
-    }
-    var degrees_to_radians = radiansToDegrees;
-
-    var helperLengthArray = [0,0,0,0,0,0];
-
-    function length(arr1, arr2) {
-        if (typeof arr1 === 'number' || arr1 instanceof Number) {
-            arr2 = arr2 || 0;
-            return Math.abs(arr1 - arr2);
-        }
-        if(!arr2) {
-            arr2 = helperLengthArray;
-        }
-        var i, len = Math.min(arr1.length, arr2.length);
-        var addedLength = 0;
-        for (i = 0; i < len; i += 1) {
-            addedLength += Math.pow(arr2[i] - arr1[i], 2);
-        }
-        return Math.sqrt(addedLength);
-    }
-
-    function normalize(vec) {
-        return div(vec, length(vec));
-    }
-
-    function rgbToHsl(val) {
-        var r = val[0]; var g = val[1]; var b = val[2];
-        var max = Math.max(r, g, b), min = Math.min(r, g, b);
-        var h, s, l = (max + min) / 2;
-
-        if(max == min){
-            h = s = 0; // achromatic
-        }else{
-            var d = max - min;
-            s = l > 0.5 ? d / (2 - max - min) : d / (max + min);
-            switch(max){
-                case r: h = (g - b) / d + (g < b ? 6 : 0); break;
-                case g: h = (b - r) / d + 2; break;
-                case b: h = (r - g) / d + 4; break;
-            }
-            h /= 6;
-        }
-
-        return [h, s, l,val[3]];
-    }
-    function hslToRgb(val){
-        var h = val[0];
-        var s = val[1];
-        var l = val[2];
-
-        var r, g, b;
-
-        if(s == 0){
-            r = g = b = l; // achromatic
-        }else{
-            function hue2rgb(p, q, t){
-                if(t < 0) t += 1;
-                if(t > 1) t -= 1;
-                if(t < 1/6) return p + (q - p) * 6 * t;
-                if(t < 1/2) return q;
-                if(t < 2/3) return p + (q - p) * (2/3 - t) * 6;
-                return p;
-            }
-
-            var q = l < 0.5 ? l * (1 + s) : l + s - l * s;
-            var p = 2 * l - q;
-            r = hue2rgb(p, q, h + 1/3);
-            g = hue2rgb(p, q, h);
-            b = hue2rgb(p, q, h - 1/3);
-        }
-
-        return [r, g , b, val[3]];
-    }
-
-    function linear(t, tMin, tMax, value1, value2){
-        if(value1 === undefined || value2 === undefined){
-            return linear(t,0,1,tMin,tMax);
-        }
-        if(t <= tMin) {
-            return value1;
-        }else if(t >= tMax){
-            return value2;
-        }
-        var perc = tMax === tMin ? 0 : (t-tMin)/(tMax-tMin);
-        if(!value1.length){
-            return value1 + (value2-value1)*perc;
-        }
-        var i, len = value1.length;
-        var arr = createTypedArray('float32', len);
-        for(i=0;i<len;i+=1){
-            arr[i] = value1[i] + (value2[i]-value1[i])*perc;
-        }
-        return arr;
-    }
-    function random(min,max){
-        if(max === undefined){
-            if(min === undefined){
-                min = 0;
-                max = 1;
-            } else {
-                max = min;
-                min = undefined;
-            }
-        }
-        if(max.length){
-            var i, len = max.length;
-            if(!min){
-                min = createTypedArray('float32', len);
-            }
-            var arr = createTypedArray('float32', len);
-            var rnd = BMMath.random();
-            for(i=0;i<len;i+=1){
-                arr[i] = min[i] + rnd*(max[i]-min[i])
-            }
-            return arr;
-        }
-        if(min === undefined){
-            min = 0;
-        }
-        var rndm = BMMath.random();
-        return min + rndm*(max-min);
-    }
-
-    function createPath(points, inTangents, outTangents, closed) {
-        inTangents = inTangents && inTangents.length ? inTangents : points;
-        outTangents = outTangents && outTangents.length ? outTangents : points;
-        var path = shape_pool.newElement();
-        var len = points.length;
-        path.setPathData(closed, len);
-        for(i = 0; i < len; i += 1) {
-            path._aw(points[i][0],points[i][1],outTangents[i][0] + points[i][0],outTangents[i][1] + points[i][1],inTangents[i][0] + points[i][0],inTangents[i][1] + points[i][1],i,true)
-        }
-        return path
-    }
-
-    function initiateExpression(elem,data,property){
-        var val = data.x;
-        var needsVelocity = /velocity(?![\w\d])/.test(val);
-        var _needsRandom = val.indexOf('random') !== -1;
-        var elemType = elem.data.ty;
-        var transform,content,effect;
-        var thisComp = elem.comp;
-        var thisProperty = property;
-        elem.comp.frameDuration = 1/elem.comp._x.frameRate;
-        var inPoint = elem.data.ip/elem.comp._x.frameRate;
-        var outPoint = elem.data.op/elem.comp._x.frameRate;
-        var width = elem.data.sw ? elem.data.sw : 0;
-        var height = elem.data.sh ? elem.data.sh : 0;
-        var loopIn, loop_in, loopOut, loop_out;
-        var toWorld,fromWorld,fromComp,fromCompToSurface,anchorPoint,thisLayer,thisComp,mask,valueAtTime,velocityAtTime;
-
-        var scoped_bm_rt;
-        var expression_function = eval('[function _expression_function(){' + val+';scoped_bm_rt=$bm_rt}' + ']')[0];
-        var numKeys = property.kf ? data.k.length : 0;
-
-        var wiggle = function wiggle(freq,amp){
-            var i,j, len = this.pv.length ? this.pv.length : 1;
-            var addedAmps = createTypedArray('float32', len);
-            freq = 5;
-            var iterations = Math.floor(time*freq);
-            i = 0;
-            j = 0;
-            while(i<iterations){
-                //var rnd = BMMath.random();
-                for(j=0;j<len;j+=1){
-                    addedAmps[j] += -amp + amp*2*BMMath.random();
-                    //addedAmps[j] += -amp + amp*2*rnd;
-                }
-                i += 1;
-            }
-            //var rnd2 = BMMath.random();
-            var periods = time*freq;
-            var perc = periods - Math.floor(periods);
-            var arr = createTypedArray('float32', len);
-            if(len>1){
-                for(j=0;j<len;j+=1){
-                    arr[j] = this.pv[j] + addedAmps[j] + (-amp + amp*2*BMMath.random())*perc;
-                    //arr[j] = this.pv[j] + addedAmps[j] + (-amp + amp*2*rnd)*perc;
-                    //arr[i] = this.pv[i] + addedAmp + amp1*perc + amp2*(1-perc);
-                }
-                return arr;
-            } else {
-                return this.pv + addedAmps[0] + (-amp + amp*2*BMMath.random())*perc;
-            }
-        }.bind(this);
-
-        if(thisProperty.loopIn) {
-            loopIn = thisProperty.loopIn.bind(thisProperty);
-            loop_in = loopIn;
-        }
-
-        if(thisProperty.loopOut) {
-            loopOut = thisProperty.loopOut.bind(thisProperty);
-            loop_out = loopOut;
-        }
-
-        var loopInDuration = function loopInDuration(type,duration){
-            return loopIn(type,duration,true);
-        }.bind(this);
-
-        var loopOutDuration = function loopOutDuration(type,duration){
-            return loopOut(type,duration,true);
-        }.bind(this);
-
-        if(this.getValueAtTime) {
-            valueAtTime = this.getValueAtTime.bind(this);
-        }
-
-        if(this.getVelocityAtTime) {
-            velocityAtTime = this.getVelocityAtTime.bind(this);
-        }
-
-        var comp = elem.comp._x.projectInterface.bind(elem.comp._x.projectInterface);
-
-        function lookAt(elem1,elem2){
-            var fVec = [elem2[0]-elem1[0],elem2[1]-elem1[1],elem2[2]-elem1[2]];
-            var pitch = Math.atan2(fVec[0],Math.sqrt(fVec[1]*fVec[1]+fVec[2]*fVec[2]))/degToRads;
-            var yaw = -Math.atan2(fVec[1],fVec[2])/degToRads;
-            return [yaw,pitch,0];
-        };
-
-        function easeOut(t, tMin, tMax, val1, val2){
-            if(val1 === undefined){
-                val1 = tMin;
-                val2 = tMax;
-            } else {
-                t = (t - tMin) / (tMax - tMin);
-            }
-            return -(val2-val1) * t*(t-2) + val1;
-        };
-
-        function easeIn(t, tMin, tMax, val1, val2){
-            if(val1 === undefined){
-                val1 = tMin;
-                val2 = tMax;
-            } else {
-                t = (t - tMin) / (tMax - tMin);
-            }
-            return (val2-val1)*t*t + val1;
-        };
-
-        function nearestKey(time){
-            var i, len = data.k.length,index,keyTime;
-            if(!data.k.length || typeof(data.k[0]) === 'number'){
-                index = 0;
-                keyTime = 0;
-            } else {
-                index = -1;
-                time *= elem.comp._x.frameRate;
-                if (time < data.k[0].t) {
-                    index = 1;
-                    keyTime = data.k[0].t;
-                } else {
-                    for(i=0;i<len-1;i+=1){
-                        if(time === data.k[i].t){
-                            index = i + 1;
-                            keyTime = data.k[i].t;
-                            break;
-                        }else if(time>data.k[i].t && time<data.k[i+1].t){
-                            if(time-data.k[i].t > data.k[i+1].t - time){
-                                index = i + 2;
-                                keyTime = data.k[i+1].t;
-                            } else {
-                                index = i + 1;
-                                keyTime = data.k[i].t;
-                            }
-                            break;
-                        }
-                    }
-                    if(index === -1){
-                        index = i + 1;
-                        keyTime = data.k[i].t;
-                    }
-                }
-                
-            }
-            var ob = {};
-            ob.index = index;
-            ob.time = keyTime/elem.comp._x.frameRate;
-            return ob;
-        };
-
-        function key(ind){
-            var ob, i, len;
-            if(!data.k.length || typeof(data.k[0]) === 'number'){
-                throw new Error('The property has no keyframe at index ' + ind);
-            }
-            ind -= 1;
-            ob = {
-                time: data.k[ind].t/elem.comp._x.frameRate
-            };
-            var arr;
-            if(ind === data.k.length - 1 && !data.k[ind].h){
-                arr = data.k[ind-1].e;
-            }else{
-                arr = data.k[ind].s;
-            }
-            len = arr.length;
-            for(i=0;i<len;i+=1){
-                ob[i] = arr[i];
-            }
-            return ob;
-        };
-
-        function framesToTime(frames, fps) { 
-            if (!fps) {
-                fps = elem.comp._x.frameRate;
-            }
-            return frames / fps;
-        };
-
-        function timeToFrames(t, fps) {
-            if (!t && t !== 0) {
-                t = time;
-            }
-            if (!fps) {
-                fps = elem.comp._x.frameRate;
-            }
-            return t * fps;
-        };
-
-        function seedRandom(seed){
-            BMMath.seedrandom(randSeed + seed);
-        };
-
-        function sourceRectAtTime() {
-            return elem.sourceRectAtTime();
-        }
-
-        var time, velocity, value, textIndex, textTotal, selectorValue;
-        var index = elem.data.ind;
-        var hasParent = !!(elem.hierarchy && elem.hierarchy.length);
-        var parent;
-        var randSeed = Math.floor(Math.random()*1000000);
-        function executeExpression() {
-            if (_needsRandom) {
-                seedRandom(randSeed);
-            }
-            if (this.frameExpressionId === elem._x.frameId && this.propType !== 'textSelector') {
-                return;
-            }
-            if(this.lock){
-                this.v = duplicatePropertyValue(this.pv,this.mult);
-                return true;
-            }
-            if(this.propType === 'textSelector'){
-                textIndex = this.textIndex;
-                textTotal = this.textTotal;
-                selectorValue = this.selectorValue;
-            }
-            if (!thisLayer) {
-                thisLayer = elem.layerInterface;
-                thisComp = elem.comp.compInterface;
-                toWorld = thisLayer.toWorld.bind(thisLayer);
-                fromWorld = thisLayer.fromWorld.bind(thisLayer);
-                fromComp = thisLayer.fromComp.bind(thisLayer);
-                mask = thisLayer.mask ? thisLayer.mask.bind(thisLayer) : null;
-                fromCompToSurface = fromComp;
-            }
-            if (!transform) {
-                transform = elem.layerInterface("ADBE Transform Group");
-                anchorPoint = transform.anchorPoint;
-            }
-            
-            if (elemType === 4 && !content) {
-                content = thisLayer("ADBE Root Vectors Group");
-            }
-            if (!effect) {
-                effect = thisLayer(4);
-            }
-            hasParent = !!(elem.hierarchy && elem.hierarchy.length);
-            if (hasParent && !parent) {
-                parent = elem.hierarchy[0].layerInterface;
-            }
-            this.lock = true;
-            if (this.getPreValue) {
-                this.getPreValue();
-            }
-            value = this.pv;
-            time = this.comp.renderedFrame/this.comp._x.frameRate;
-            if (needsVelocity) {
-                velocity = velocityAtTime(time);
-            }
-            expression_function();
-            if (scoped_bm_rt.propType === "shape") {
-                this.v = shape_pool.clone(scoped_bm_rt.v);
-            } else {
-                this.v = scoped_bm_rt;
-            }
-
-            this.frameExpressionId = elem._x.frameId;
-            var i,len;
-            if(this.mult){
-                if(this.propType === 'unidimensional'){
-                    this.v *= this.mult;
-                }else if(this.v.length === 1){
-                    this.v = this.v[0] * this.mult;
-                }else{
-                    len = this.v.length;
-                    if(value === this.v){
-                        this.v = len === 2 ? [value[0],value[1]] : [value[0],value[1],value[2]];
-                    }
-                    for(i = 0; i < len; i += 1){
-                        this.v[i] *= this.mult;
-                    }
-                }
-            }
-            if (this.v.length === 1) {
-                this.v = this.v[0];
-            }
-            if (this.propType === 'unidimensional') {
-                if(this.lastValue !== this.v){
-                    this.lastValue = this.v;
-                    this.mdf = true;
-                }
-            } else if (this.propType === 'shape') {
-                if (!shapesEqual(this.v, this._ak.shapes[0])) {
-                    this.mdf = true;
-                    this._ak.releaseShapes();
-                    this._ak.addShape(shape_pool.clone(this.v));
-                }
-            } else {
-                len = this.v.length;
-                for (i = 0; i < len; i += 1) {
-                    if (this.v[i] !== this.lastValue[i]) {
-                        this.lastValue[i] = this.v[i];
-                        this.mdf = true;
-                    }
-                }
-            }
-            this.lock = false;
-        }
-        return executeExpression;
-    };
-
-    ob.initiateExpression = initiateExpression;
-    return ob;
-}());
-(function addPropertyDecorator() {
-
-    function getStaticValueAtTime() {
-        return this.pv;
-    }
-
-    function loopOut(type,duration,durationFlag){
-        if(!this.k || !this.keyframes){
-            return this.pv;
-        }
-        type = type ? type.toLowerCase() : '';
-        var currentFrame = this.comp.renderedFrame;
-        var keyframes = this.keyframes;
-        var lastKeyFrame = keyframes[keyframes.length - 1].t;
-        if(currentFrame<=lastKeyFrame){
-            return this.pv;
-        }else{
-            var cycleDuration, firstKeyFrame;
-            if(!durationFlag){
-                if(!duration || duration > keyframes.length - 1){
-                    duration = keyframes.length - 1;
-                }
-                firstKeyFrame = keyframes[keyframes.length - 1 - duration].t;
-                cycleDuration = lastKeyFrame - firstKeyFrame;
-            } else {
-                if(!duration){
-                    cycleDuration = Math.max(0,lastKeyFrame - this.elem.data.ip);
-                } else {
-                    cycleDuration = Math.abs(lastKeyFrame - elem.comp._x.frameRate*duration);
-                }
-                firstKeyFrame = lastKeyFrame - cycleDuration;
-            }
-            var i, len, ret;
-            if(type === 'pingpong') {
-                var iterations = Math.floor((currentFrame - firstKeyFrame)/cycleDuration);
-                if(iterations % 2 !== 0){
-                    return this.getValueAtTime(((cycleDuration - (currentFrame - firstKeyFrame) % cycleDuration +  firstKeyFrame)) / this.comp._x.frameRate, 0);
-                }
-            } else if(type === 'offset'){
-                var initV = this.getValueAtTime(firstKeyFrame / this.comp._x.frameRate, 0);
-                var endV = this.getValueAtTime(lastKeyFrame / this.comp._x.frameRate, 0);
-                var current = this.getValueAtTime(((currentFrame - firstKeyFrame) % cycleDuration +  firstKeyFrame) / this.comp._x.frameRate, 0);
-                var repeats = Math.floor((currentFrame - firstKeyFrame)/cycleDuration);
-                if(this.pv.length){
-                    ret = new Array(initV.length);
-                    len = ret.length;
-                    for(i=0;i<len;i+=1){
-                        ret[i] = (endV[i]-initV[i])*repeats + current[i];
-                    }
-                    return ret;
-                }
-                return (endV-initV)*repeats + current;
-            } else if(type === 'continue'){
-                var lastValue = this.getValueAtTime(lastKeyFrame / this.comp._x.frameRate, 0);
-                var nextLastValue = this.getValueAtTime((lastKeyFrame - 0.001) / this.comp._x.frameRate, 0);
-                if(this.pv.length){
-                    ret = new Array(lastValue.length);
-                    len = ret.length;
-                    for(i=0;i<len;i+=1){
-                        ret[i] = lastValue[i] + (lastValue[i]-nextLastValue[i])*((currentFrame - lastKeyFrame)/ this.comp._x.frameRate)/0.0005;
-                    }
-                    return ret;
-                }
-                return lastValue + (lastValue-nextLastValue)*(((currentFrame - lastKeyFrame))/0.001);
-            }
-            return this.getValueAtTime((((currentFrame - firstKeyFrame) % cycleDuration +  firstKeyFrame)) / this.comp._x.frameRate, 0);
-        }
-    }
-
-    function loopIn(type,duration, durationFlag) {
-        if(!this.k){
-            return this.pv;
-        }
-        type = type ? type.toLowerCase() : '';
-        var currentFrame = this.comp.renderedFrame;
-        var keyframes = this.keyframes;
-        var firstKeyFrame = keyframes[0].t;
-        if(currentFrame>=firstKeyFrame){
-            return this.pv;
-        }else{
-            var cycleDuration, lastKeyFrame;
-            if(!durationFlag){
-                if(!duration || duration > keyframes.length - 1){
-                    duration = keyframes.length - 1;
-                }
-                lastKeyFrame = keyframes[duration].t;
-                cycleDuration = lastKeyFrame - firstKeyFrame;
-            } else {
-                if(!duration){
-                    cycleDuration = Math.max(0,this.elem.data.op - firstKeyFrame);
-                } else {
-                    cycleDuration = Math.abs(elem.comp._x.frameRate*duration);
-                }
-                lastKeyFrame = firstKeyFrame + cycleDuration;
-            }
-            var i, len, ret;
-            if(type === 'pingpong') {
-                var iterations = Math.floor((firstKeyFrame - currentFrame)/cycleDuration);
-                if(iterations % 2 === 0){
-                    return this.getValueAtTime((((firstKeyFrame - currentFrame)%cycleDuration +  firstKeyFrame)) / this.comp._x.frameRate, 0);
-                }
-            } else if(type === 'offset'){
-                var initV = this.getValueAtTime(firstKeyFrame / this.comp._x.frameRate, 0);
-                var endV = this.getValueAtTime(lastKeyFrame / this.comp._x.frameRate, 0);
-                var current = this.getValueAtTime((cycleDuration - (firstKeyFrame - currentFrame)%cycleDuration +  firstKeyFrame) / this.comp._x.frameRate, 0);
-                var repeats = Math.floor((firstKeyFrame - currentFrame)/cycleDuration)+1;
-                if(this.pv.length){
-                    ret = new Array(initV.length);
-                    len = ret.length;
-                    for(i=0;i<len;i+=1){
-                        ret[i] = current[i]-(endV[i]-initV[i])*repeats;
-                    }
-                    return ret;
-                }
-                return current-(endV-initV)*repeats;
-            } else if(type === 'continue'){
-                var firstValue = this.getValueAtTime(firstKeyFrame / this.comp._x.frameRate, 0);
-                var nextFirstValue = this.getValueAtTime((firstKeyFrame + 0.001) / this.comp._x.frameRate, 0);
-                if(this.pv.length){
-                    ret = new Array(firstValue.length);
-                    len = ret.length;
-                    for(i=0;i<len;i+=1){
-                        ret[i] = firstValue[i] + (firstValue[i]-nextFirstValue[i])*(firstKeyFrame - currentFrame)/0.001;
-                    }
-                    return ret;
-                }
-                return firstValue + (firstValue-nextFirstValue)*(firstKeyFrame - currentFrame)/0.001;
-            }
-            return this.getValueAtTime(((cycleDuration - (firstKeyFrame - currentFrame) % cycleDuration +  firstKeyFrame)) / this.comp._x.frameRate, 0);
-        }
-    }
-
-    function getValueAtTime(frameNum) {
-        //TODO this shouldn't be necessary anymore
-        if(!this._cachingAtTime) {
-            this._cachingAtTime = {lastValue:initialDefaultFrame,lastIndex:0};
-        }
-        if(frameNum !== this._cachingAtTime.lastFrame) {
-            frameNum *= this.elem._x.frameRate;
-            frameNum -= this.offsetTime;
-            this._cachingAtTime.lastIndex = this._cachingAtTime.lastFrame < frameNum ? this._cachingAtTime.lastIndex : 0;
-            this._cachingAtTime.value = this.interpolateValue(frameNum, this.pv, this._cachingAtTime);
-            this._cachingAtTime.lastFrame = frameNum;
-        }
-        return this._cachingAtTime.value;
-
-    }
-
-    function getVelocityAtTime(frameNum) {
-        if(this.vel !== undefined){
-            return this.vel;
-        }
-        var delta = -0.01;
-        //frameNum += this.elem.data.st;
-        var v1 = this.getValueAtTime(frameNum);
-        var v2 = this.getValueAtTime(frameNum + delta);
-        var velocity;
-        if(v1.length){
-            velocity = createTypedArray('float32', v1.length);
-            var i;
-            for(i=0;i<v1.length;i+=1){
-                //removing frameRate
-                //if needed, don't add it here
-                //velocity[i] = this.elem._x.frameRate*((v2[i] - v1[i])/delta);
-                velocity[i] = (v2[i] - v1[i])/delta;
-            }
-        } else {
-            velocity = (v2 - v1)/delta;
-        }
-        return velocity;
-    };
-
-    function _ce(propertyGroup){
-        this.propertyGroup = propertyGroup;
-    }
-
-    function searchExpressions(elem,data,prop){
-        if(data.x){
-            prop.k = true;
-            prop.x = true;
-            if(prop.getValue) {
-                prop.getPreValue = prop.getValue;
-            }
-
-            prop.initiateExpression = ExpressionManager.initiateExpression;
-            prop.getValue = prop.initiateExpression(elem,data,prop);
-        }
-    }
-
-    function getTransformValueAtTime(time) {
-        //console.log('time:', time)
-    }
-
-    function getTransformStaticValueAtTime(time) {
-
-    }
-
-    var TextExpressionSelectorProp = (function(){
-
-        function getValueProxy(index,total){
-            this.textIndex = index+1;
-            this.textTotal = total;
-            this.getValue();
-            return this.v;
-        }
-
-        return function TextExpressionSelectorProp(elem,data){
-            this.pv = 1;
-            this.comp = elem.comp;
-            this.elem = elem;
-            this.mult = .01;
-            this.propType = 'textSelector';
-            this.textTotal = data.totalChars;
-            this.selectorValue = 100;
-            this.lastValue = [1,1,1];
-            searchExpressions.bind(this)(elem,data,this);
-            this.getMult = getValueProxy;
-            this.getVelocityAtTime = getVelocityAtTime;
-            if(this.kf){
-                this.getValueAtTime = getValueAtTime.bind(this);
-            } else {
-                this.getValueAtTime = getStaticValueAtTime.bind(this);
-            }
-            this._ce = _ce;
-        }
-    }());
-
-    var _bj = _ag._bj;
-    _ag._bj = function(elem, data, arr) {
-        var prop = _bj(elem, data, arr);
-        if(prop.dynamicProperties.length) {
-            prop.getValueAtTime = getTransformValueAtTime.bind(prop);
-        } else {
-            prop.getValueAtTime = getTransformStaticValueAtTime.bind(prop);
-        }
-        prop._ce = _ce;
-        return prop;
-    }
-
-    var propertyGetProp = _ai._bo;
-    _ai._bo = function(elem,data,type, mult, arr){
-        var prop = propertyGetProp(elem,data,type, mult, arr);
-        //prop.getVelocityAtTime = getVelocityAtTime;
-        //prop.loopOut = loopOut;
-        //prop.loopIn = loopIn;
-        if(prop.kf){
-            prop.getValueAtTime = getValueAtTime.bind(prop);
-        } else {
-            prop.getValueAtTime = getStaticValueAtTime.bind(prop);
-        }
-        prop._ce = _ce;
-        prop.loopOut = loopOut;
-        prop.loopIn = loopIn;
-        prop.getVelocityAtTime = getVelocityAtTime;
-        prop.numKeys = data.a === 1 ? data.k.length : 0;
-        var isAdded = prop.k;
-        prop.propertyIndex = data.ix;
-        prop._cachingAtTime={lastFrame:initialDefaultFrame,lastIndex:0,value:type === 0 ? 0 : createTypedArray('float32', 3)}
-        searchExpressions(elem,data,prop);
-        if(!isAdded && prop.x){
-            arr.push(prop);
-        }
-
-        return prop;
-    }
-
-    function getShapeValueAtTime(frameNum) {
-        //TODO test this
-        if (!this._cachingAtTime) {
-            this._cachingAtTime = {
-                shapeValue: shape_pool.clone(this.pv),
-                lastIndex: 0,
-                lastTime: initialDefaultFrame
-            }
-        }
-        if(frameNum !== this._cachingAtTime.lastTime) {
-            this._cachingAtTime.lastTime = frameNum;
-            frameNum *= this.elem._x.frameRate;
-            this.interpolateShape(frameNum, this._cachingAtTime.shapeValue, false, this._cachingAtTime);
-        }
-        return this._cachingAtTime.shapeValue;
-    }
-
-    var ShapePropertyConstructorFunction = _ah.getConstructorFunction();
-    var KeyframedShapePropertyConstructorFunction = _ah.getKeyframedConstructorFunction();
-
-    function ShapeExpressions(){}
-    ShapeExpressions.prototype = {
-        vertices: function(prop, time){
-            var shapePath = this.v;
-            if(time !== undefined) {
-                shapePath = this.getValueAtTime(time, 0);
-            }
-            var i, len = shapePath._length;
-            var vertices = shapePath[prop];
-            var points = shapePath.v;
-            var arr = Array.apply(null,{length:len})
-            for(i = 0; i < len; i += 1) {
-                if(prop === 'i' || prop === 'o') {
-                    arr[i] = [vertices[i][0] - points[i][0], vertices[i][1] - points[i][1]]
-                } else {
-                    arr[i] = [vertices[i][0], vertices[i][1]]
-                }
-                
-            }
-            return arr;
-        },
-        points: function(time){
-            return this.vertices('v', time);
-        },
-        inTangents: function(time){
-            return this.vertices('i', time);
-        },
-        outTangents: function(time){
-            return this.vertices('o', time);
-        },
-        isClosed: function(){
-            return this.v.c;
-        },
-        pointOnPath: function(perc, time){
-            var shapePath = this.v;
-            if(time !== undefined) {
-                shapePath = this.getValueAtTime(time, 0);
-            }
-            if(!this._segmentsLength) {
-                this._segmentsLength = bez.getSegmentsLength(shapePath);
-            }
-
-            var segmentsLength = this._segmentsLength;
-            var lengths = segmentsLength.lengths;
-            var lengthPos = segmentsLength.totalLength * perc;
-            var i = 0, len = lengths.length;
-            var j = 0, jLen;
-            var accumulatedLength = 0;
-            while(i < len) {
-                if(accumulatedLength + lengths[i].addedLength > lengthPos) {
-                    var initIndex = i;
-                    var endIndex = (shapePath.c && i === len - 1) ? 0 : i + 1;
-                    var segmentPerc = (lengthPos - accumulatedLength)/lengths[i].addedLength;
-                    var pt = bez.getPointInSegment(shapePath.v[initIndex], shapePath.v[endIndex], shapePath.o[initIndex], shapePath.i[endIndex], segmentPerc, lengths[i])
-                    break;
-                } else {
-                    accumulatedLength += lengths[i].addedLength;
-                }
-                i += 1;
-            }
-            if(!pt){
-                pt = shapePath.c ? [shapePath.v[0][0],shapePath.v[0][1]]:[shapePath.v[shapePath._length-1][0],shapePath.v[shapePath._length-1][1]]
-            }
-            return pt;
-        },
-        vectorOnPath: function(perc, time, vectorType){
-            //perc doesn't use triple equality because it can be a Number object as well as a primitive.
-            perc = perc == 1 ? this.v.c ? 0 : 0.999 : perc;
-            var pt1 = this.pointOnPath(perc, time);
-            var pt2 = this.pointOnPath(perc + 0.001, time);
-            var xLength = pt2[0] - pt1[0];
-            var yLength = pt2[1] - pt1[1];
-            var magnitude = Math.sqrt(Math.pow(xLength,2) + Math.pow(yLength,2));
-            var unitVector = vectorType === 'tangent' ? [xLength/magnitude, yLength/magnitude] : [-yLength/magnitude, xLength/magnitude];
-            return unitVector;
-        },
-        tangentOnPath: function(perc, time){
-            return this.vectorOnPath(perc, time, 'tangent');
-        },
-        normalOnPath: function(perc, time){
-            return this.vectorOnPath(perc, time, 'normal');
-        },
-        _ce: _ce,
-        getValueAtTime: getStaticValueAtTime
-    }
-    extendPrototype([ShapeExpressions], ShapePropertyConstructorFunction);
-    extendPrototype([ShapeExpressions], KeyframedShapePropertyConstructorFunction);
-    KeyframedShapePropertyConstructorFunction.prototype.getValueAtTime = getShapeValueAtTime;
-    KeyframedShapePropertyConstructorFunction.prototype.initiateExpression = ExpressionManager.initiateExpression;
-
-    var propertyGetShapeProp = _ah._bp;
-    _ah._bp = function(elem,data,type, arr, trims){
-        var prop = propertyGetShapeProp(elem,data,type, arr, trims);
-        var isAdded = prop.k;
-        prop.propertyIndex = data.ix;
-        prop.lock = false;
-        if(type === 3){
-            searchExpressions(elem,data.pt,prop);
-        } else if(type === 4){
-            searchExpressions(elem,data.ks,prop);
-        }
-        if(!isAdded && prop.x){
-            arr.push(prop);
-        }
-        return prop;
-    }
-
-    var propertyGetTextProp = TextSelectorProp.getTextSelectorProp;
-    TextSelectorProp.getTextSelectorProp = function(elem, data,arr){
-        if(data.t === 1){
-            return new TextExpressionSelectorProp(elem, data,arr);
-        } else {
-            return propertyGetTextProp(elem,data,arr);
-        }
-    }
-}());
-(function addDecorator() {
-
-    function searchExpressions(){
-        if(this.data.d.x){
-            this.comp = this.elem.comp;
-            if(this.getValue) {
-                this.getPreValue = this.getValue;
-            }
-            this.calculateExpression = ExpressionManager.initiateExpression.bind(this)(this.elem,this.data.d,this);
-            this.getValue = this.getExpressionValue;
-            return true;
-        }
-        return false;
-    }
-
-    _ar.prototype.searchProperty = function(){
-        this.kf = this.searchExpressions() || this.data.d.k.length > 1;
-        return this.kf;
-    }
-
-    _ar.prototype.getExpressionValue = function(num){
-        this.calculateExpression();
-        if(this.mdf) {
-            this.currentData.t = this.v.toString();
-            this.completeTextData(this.currentData);
-        }
-    }
-
-    _ar.prototype.searchExpressions = searchExpressions;
-    
-}());
-var ShapeExpressionInterface = (function(){
-
-    function iterateElements(shapes,view, propertyGroup){
-        var arr = [];
-        var i, len = shapes ? shapes.length : 0;
-        for(i=0;i<len;i+=1){
-            if(shapes[i].ty == 'gr'){
-                arr.push(groupInterfaceFactory(shapes[i],view[i],propertyGroup));
-            }else if(shapes[i].ty == 'fl'){
-                arr.push(fillInterfaceFactory(shapes[i],view[i],propertyGroup));
-            }else if(shapes[i].ty == 'st'){
-                arr.push(strokeInterfaceFactory(shapes[i],view[i],propertyGroup));
-            }else if(shapes[i].ty == 'tm'){
-                arr.push(trimInterfaceFactory(shapes[i],view[i],propertyGroup));
-            }else if(shapes[i].ty == 'tr'){
-                //arr.push(transformInterfaceFactory(shapes[i],view[i],propertyGroup));
-            }else if(shapes[i].ty == 'el'){
-                arr.push(ellipseInterfaceFactory(shapes[i],view[i],propertyGroup));
-            }else if(shapes[i].ty == 'sr'){
-                arr.push(starInterfaceFactory(shapes[i],view[i],propertyGroup));
-            } else if(shapes[i].ty == 'sh'){
-                arr.push(pathInterfaceFactory(shapes[i],view[i],propertyGroup));
-            } else if(shapes[i].ty == 'rc'){
-                arr.push(rectInterfaceFactory(shapes[i],view[i],propertyGroup));
-            } else if(shapes[i].ty == 'rd'){
-                arr.push(roundedInterfaceFactory(shapes[i],view[i],propertyGroup));
-            } else if(shapes[i].ty == 'rp'){
-                arr.push(repeaterInterfaceFactory(shapes[i],view[i],propertyGroup));
-            } else{
-                //console.log(shapes[i].ty);
-            }
-        }
-        return arr;
-    }
-
-    function contentsInterfaceFactory(shape,view, propertyGroup){
-       var interfaces;
-       var interfaceFunction = function _interfaceFunction(value){
-           var i = 0, len = interfaces.length;
-            while(i<len){
-                if(interfaces[i]._name === value || interfaces[i].mn === value || interfaces[i].propertyIndex === value || interfaces[i].ix === value || interfaces[i].ind === value){
-                   return interfaces[i];
-                }
-                i+=1;
-            }
-            if(typeof value === 'number'){
-               return interfaces[value-1];
-            }
-       };
-       interfaceFunction.propertyGroup = function(val){
-           if(val === 1){
-               return interfaceFunction;
-           } else{
-               return propertyGroup(val-1);
-           }
-       };
-       interfaces = iterateElements(shape.it, view.it, interfaceFunction.propertyGroup);
-       interfaceFunction.numProperties = interfaces.length;
-       interfaceFunction.propertyIndex = shape.cix;
-
-       return interfaceFunction;
-   }
-
-    function groupInterfaceFactory(shape,view, propertyGroup){
-        var interfaceFunction = function _interfaceFunction(value){
-            switch(value){
-                case 'ADBE Vectors Group':
-                case 'Contents':
-                case 2:
-                    return interfaceFunction.content;
-                case 'ADBE Vector Transform Group':
-                case 3:
-                default:
-                    return interfaceFunction.transform;
-            }
-        }
-        interfaceFunction.propertyGroup = function(val){
-            if(val === 1){
-                return interfaceFunction;
-            } else{
-                return propertyGroup(val-1);
-            }
-        };
-        var content = contentsInterfaceFactory(shape,view,interfaceFunction.propertyGroup);
-        var transformInterface = transformInterfaceFactory(shape.it[shape.it.length - 1],view.it[view.it.length - 1],interfaceFunction.propertyGroup);
-        interfaceFunction.content = content;
-        interfaceFunction.transform = transformInterface;
-        Object.defineProperty(interfaceFunction, '_name', {
-            get: function(){
-                return shape.nm;
-            }
-        });
-        //interfaceFunction.content = interfaceFunction;
-        interfaceFunction.numProperties = shape.np;
-        interfaceFunction.propertyIndex = shape.ix;
-        interfaceFunction.nm = shape.nm;
-        interfaceFunction.mn = shape.mn;
-        return interfaceFunction;
-    }
-
-    function fillInterfaceFactory(shape,view,propertyGroup){
-        function interfaceFunction(val){
-            if(val === 'Color' || val === 'color'){
-                return interfaceFunction.color;
-            } else if(val === 'Opacity' || val === 'opacity'){
-                return interfaceFunction.opacity;
-            }
-        }
-        Object.defineProperties(interfaceFunction, {
-            'color': {
-                get: function() {
-                    return ExpressionValue(view.c, 1 / view.c.mult, 'color');
-                }
-            },
-            'opacity': {
-                get: function() {
-                    return ExpressionValue(view.o, 100);
-                }
-            },
-            '_name': { value: shape.nm },
-            'mn': { value: shape.mn }
-        })
-
-        view.c._ce(propertyGroup);
-        view.o._ce(propertyGroup);
-        return interfaceFunction;
-    }
-
-    function strokeInterfaceFactory(shape,view,propertyGroup){
-        function _propertyGroup(val){
-            if(val === 1){
-                return ob;
-            } else{
-                return propertyGroup(val-1);
-            }
-        };
-        function _dashPropertyGroup(val){
-            if(val === 1){
-                return dashOb;
-            } else{
-                return _propertyGroup(val-1);
-            }
-        };
-        function addPropertyToDashOb(i) {
-            Object.defineProperty(dashOb, shape.d[i].nm, {
-                get: function(){
-                    return ExpressionValue(view.d.dataProps[i].p)
-                }
-            });
-        }
-        var i, len = shape.d ? shape.d.length : 0;
-        var dashOb = {}
-        for (i = 0; i < len; i += 1) {
-            addPropertyToDashOb(i);
-            view.d.dataProps[i].p._ce(_dashPropertyGroup);
-        }
-
-        function interfaceFunction(val){
-            if(val === 'Color' || val === 'color'){
-                return interfaceFunction.color;
-            } else if(val === 'Opacity' || val === 'opacity'){
-                return interfaceFunction.opacity;
-            } else if(val === 'Stroke Width' || val === 'stroke width'){
-                return interfaceFunction.strokeWidth;
-            }
-        }
-        Object.defineProperties(interfaceFunction, {
-            'color': {
-                get: function() {
-                    return ExpressionValue(view.c, 1 / view.c.mult, 'color');
-                }
-            },
-            'opacity': {
-                get: function() {
-                    return ExpressionValue(view.o, 100);
-                }
-            },
-            'strokeWidth': {
-                get: function() {
-                    return ExpressionValue(view.w);
-                }
-            },
-            'dash': {
-                get: function() {
-                    return dashOb;
-                }
-            },
-            '_name': { value: shape.nm },
-            'mn': { value: shape.mn }
-        });
-
-        view.c._ce(_propertyGroup);
-        view.o._ce(_propertyGroup);
-        view.w._ce(_propertyGroup);
-        return interfaceFunction;
-    }
-
-    function trimInterfaceFactory(shape,view,propertyGroup){
-        function _propertyGroup(val){
-            if(val == 1){
-                return interfaceFunction;
-            } else {
-                return propertyGroup(--val);
-            }
-        }
-        interfaceFunction.propertyIndex = shape.ix;
-
-        view.s._ce(_propertyGroup);
-        view.e._ce(_propertyGroup);
-        view.o._ce(_propertyGroup);
-
-        function interfaceFunction(val){
-            if(val === shape.e.ix || val === 'End' || val === 'end'){
-                return interfaceFunction.end;
-            }
-            if(val === shape.s.ix){
-                return interfaceFunction.start;
-            }
-            if(val === shape.o.ix){
-                return interfaceFunction.offset;
-            }
-        }
-        interfaceFunction.propertyIndex = shape.ix;
-
-        Object.defineProperties(interfaceFunction, {
-            'start': {
-                get: function() {
-                    return ExpressionValue(view.s, 1 / view.s.mult);
-                }
-            },
-            'end': {
-                get: function() {
-                    return ExpressionValue(view.e, 1 / view.e.mult);
-                }
-            },
-            'offset': {
-                get: function() {
-                    return ExpressionValue(view.o);
-                }
-            },
-            '_name': { value: shape.nm }
-        });
-        interfaceFunction.mn = shape.mn;
-        return interfaceFunction;
-    }
-
-    function transformInterfaceFactory(shape,view,propertyGroup){
-        function _propertyGroup(val){
-            if(val == 1){
-                return interfaceFunction;
-            } else {
-                return propertyGroup(--val);
-            }
-        }
-        view.transform.mProps.o._ce(_propertyGroup);
-        view.transform.mProps.p._ce(_propertyGroup);
-        view.transform.mProps.a._ce(_propertyGroup);
-        view.transform.mProps.s._ce(_propertyGroup);
-        view.transform.mProps.r._ce(_propertyGroup);
-        if(view.transform.mProps.sk){
-            view.transform.mProps.sk._ce(_propertyGroup);
-            view.transform.mProps.sa._ce(_propertyGroup);
-        }
-        view.transform.op._ce(_propertyGroup);
-
-        function interfaceFunction(value){
-            if(shape.a.ix === value || value === 'Anchor Point'){
-                return interfaceFunction.anchorPoint;
-            }
-            if(shape.o.ix === value || value === 'Opacity'){
-                return interfaceFunction.opacity;
-            }
-            if(shape.p.ix === value || value === 'Position'){
-                return interfaceFunction.position;
-            }
-            if(shape.r.ix === value || value === 'Rotation' || value === 'ADBE Vector Rotation'){
-                return interfaceFunction.rotation;
-            }
-            if(shape.s.ix === value || value === 'Scale'){
-                return interfaceFunction.scale;
-            }
-            if(shape.sk && shape.sk.ix === value || value === 'Skew'){
-                return interfaceFunction.skew;
-            }
-            if(shape.sa && shape.sa.ix === value || value === 'Skew Axis'){
-                return interfaceFunction.skewAxis;
-            }
-
-        }
-        Object.defineProperties(interfaceFunction, {
-            'opacity': {
-                get: function(){
-                    return ExpressionValue(view.transform.mProps.o, 1/view.transform.mProps.o.mult);
-                }
-            },
-            'position': {
-                get: function(){
-                    return ExpressionValue(view.transform.mProps.p);
-                }
-            },
-            'anchorPoint': {
-                get: function(){
-                    return ExpressionValue(view.transform.mProps.a);
-                }
-            },
-            'scale': {
-                get: function(){
-                    return ExpressionValue(view.transform.mProps.s, 1 / view.transform.mProps.s.mult);
-                }
-            },
-            'rotation': {
-                get: function(){
-                    return ExpressionValue(view.transform.mProps.r, 1 / view.transform.mProps.r.mult);
-                }
-            },
-            'skew': {
-                get: function(){
-                    return ExpressionValue(view.transform.mProps.sk);
-                }
-            },
-            'skewAxis': {
-                get: function(){
-                    return ExpressionValue(view.transform.mProps.sa);
-                }
-            },
-            '_name': { value: shape.nm }
-        });
-        interfaceFunction.ty = 'tr';
-        interfaceFunction.mn = shape.mn;
-        return interfaceFunction;
-    }
-
-    function ellipseInterfaceFactory(shape,view,propertyGroup){
-        function _propertyGroup(val){
-            if(val == 1){
-                return interfaceFunction;
-            } else {
-                return propertyGroup(--val);
-            }
-        }
-        interfaceFunction.propertyIndex = shape.ix;
-        var prop = view.sh.ty === 'tm' ? view.sh.prop : view.sh;
-        prop.s._ce(_propertyGroup);
-        prop.p._ce(_propertyGroup);
-        function interfaceFunction(value){
-            if(shape.p.ix === value){
-                return interfaceFunction.position;
-            }
-            if(shape.s.ix === value){
-                return interfaceFunction.size;
-            }
-        }
-        Object.defineProperties(interfaceFunction, {
-            'size': {
-                get: function(){
-                    return ExpressionValue(prop.s);
-                }
-            },
-            'position': {
-                get: function(){
-                    return ExpressionValue(prop.p);
-                }
-            },
-            '_name': { value: shape.nm }
-        });
-        interfaceFunction.mn = shape.mn;
-        return interfaceFunction;
-    }
-
-    function starInterfaceFactory(shape,view,propertyGroup){
-        function _propertyGroup(val){
-            if(val == 1){
-                return interfaceFunction;
-            } else {
-                return propertyGroup(--val);
-            }
-        }
-        var prop = view.sh.ty === 'tm' ? view.sh.prop : view.sh;
-        interfaceFunction.propertyIndex = shape.ix;
-        prop.or._ce(_propertyGroup);
-        prop.os._ce(_propertyGroup);
-        prop.pt._ce(_propertyGroup);
-        prop.p._ce(_propertyGroup);
-        prop.r._ce(_propertyGroup);
-        if(shape.ir){
-            prop.ir._ce(_propertyGroup);
-            prop.is._ce(_propertyGroup);
-        }
-
-        function interfaceFunction(value){
-            if(shape.p.ix === value){
-                return interfaceFunction.position;
-            }
-            if(shape.r.ix === value){
-                return interfaceFunction.rotation;
-            }
-            if(shape.pt.ix === value){
-                return interfaceFunction.points;
-            }
-            if(shape.or.ix === value || 'ADBE Vector Star Outer Radius' === value){
-                return interfaceFunction.outerRadius;
-            }
-            if(shape.os.ix === value){
-                return interfaceFunction.outerRoundness;
-            }
-            if(shape.ir && (shape.ir.ix === value || 'ADBE Vector Star Inner Radius' === value)){
-                return interfaceFunction.innerRadius;
-            }
-            if(shape.is && shape.is.ix === value){
-                return interfaceFunction.innerRoundness;
-            }
-
-        }
-        Object.defineProperties(interfaceFunction, {
-            'position': {
-                get: function() {
-                    return ExpressionValue(prop.p);
-                }
-            },
-            'rotation': {
-                get: function() {
-                    return ExpressionValue(prop.r, 1 / prop.r.mult);
-                }
-            },
-            'points': {
-                get: function() {
-                    return ExpressionValue(prop.pt);
-                }
-            },
-            'outerRadius': {
-                get: function() {
-                    return ExpressionValue(prop.or);
-                }
-            },
-            'outerRoundness': {
-                get: function(){
-                    return ExpressionValue(prop.os);
-                }
-            },
-            'innerRadius': {
-                get: function(){
-                    if(!prop.ir){
-                        return 0;
-                    }
-                    return ExpressionValue(prop.ir);
-                }
-            },
-            'innerRoundness': {
-                get: function(){
-                    if(!prop.is){
-                        return 0;
-                    }
-                    return ExpressionValue(prop.is, 1 / prop.is.mult);
-                }
-            },
-            '_name': { value: shape.nm }
-        });
-        interfaceFunction.mn = shape.mn;
-        return interfaceFunction;
-    }
-
-    function rectInterfaceFactory(shape,view,propertyGroup){
-        function _propertyGroup(val){
-            if(val == 1){
-                return interfaceFunction;
-            } else {
-                return propertyGroup(--val);
-            }
-        }
-        var prop = view.sh.ty === 'tm' ? view.sh.prop : view.sh;
-        interfaceFunction.propertyIndex = shape.ix;
-        prop.p._ce(_propertyGroup);
-        prop.s._ce(_propertyGroup);
-        prop.r._ce(_propertyGroup);
-
-        function interfaceFunction(value){
-            if(shape.p.ix === value){
-                return interfaceFunction.position;
-            }
-            if(shape.r.ix === value){
-                return interfaceFunction.roundness;
-            }
-            if(shape.s.ix === value || value === 'Size' || value === 'ADBE Vector Rect Size'){
-                return interfaceFunction.size;
-            }
-
-        }
-        Object.defineProperties(interfaceFunction, {
-            'position': {
-                get: function(){
-                    return ExpressionValue(prop.p);
-                }
-            },
-            'roundness': {
-                get: function(){
-                    return ExpressionValue(prop.r);
-                }
-            },
-            'size': {
-                get: function(){
-                    return ExpressionValue(prop.s);
-                }
-            },
-            '_name': { value: shape.nm }
-        });
-        interfaceFunction.mn = shape.mn;
-        return interfaceFunction;
-    }
-
-    function roundedInterfaceFactory(shape,view,propertyGroup){
-        function _propertyGroup(val){
-            if(val == 1){
-                return interfaceFunction;
-            } else {
-                return propertyGroup(--val);
-            }
-        }
-        var prop = view;
-        interfaceFunction.propertyIndex = shape.ix;
-        prop.rd._ce(_propertyGroup);
-
-        function interfaceFunction(value){
-            if(shape.r.ix === value || 'Round Corners 1' === value){
-                return interfaceFunction.radius;
-            }
-
-        }
-        Object.defineProperties(interfaceFunction, {
-            'radius': {
-                get: function() {
-                    return ExpressionValue(prop.rd);
-                }
-            },
-            '_name': { value: shape.nm }
-        });
-        interfaceFunction.mn = shape.mn;
-        return interfaceFunction;
-    }
-
-    function repeaterInterfaceFactory(shape,view,propertyGroup){
-        function _propertyGroup(val){
-            if(val == 1){
-                return interfaceFunction;
-            } else {
-                return propertyGroup(--val);
-            }
-        }
-        var prop = view;
-        interfaceFunction.propertyIndex = shape.ix;
-        prop.c._ce(_propertyGroup);
-        prop.o._ce(_propertyGroup);
-
-        function interfaceFunction(value){
-            if(shape.c.ix === value || 'Copies' === value){
-                return interfaceFunction.copies;
-            } else if(shape.o.ix === value || 'Offset' === value){
-                return interfaceFunction.offset;
-            }
-
-        }
-        Object.defineProperties(interfaceFunction, {
-            'copies': {
-                get: function(){
-                    return ExpressionValue(prop.c);
-                }
-            },
-            'offset': {
-                get: function(){
-                    return ExpressionValue(prop.o);
-                }
-            },
-            '_name': { value: shape.nm }
-        });
-        interfaceFunction.mn = shape.mn;
-        return interfaceFunction;
-    }
-
-    function pathInterfaceFactory(shape,view,propertyGroup){
-        var prop = view.sh;
-        function _propertyGroup(val){
-            if(val == 1){
-                return interfaceFunction;
-            } else {
-                return propertyGroup(--val);
-            }
-        }
-        prop._ce(_propertyGroup);
-
-        function interfaceFunction(val){
-            if(val === 'Shape' || val === 'shape' || val === 'Path' || val === 'path' || val === 'ADBE Vector Shape' || val === 2){
-                return interfaceFunction.path;
-            }
-        }
-        Object.defineProperties(interfaceFunction, {
-            'path': {
-                get: function(){
-                    if(prop.k){
-                        prop.getValue();
-                    }
-                    return prop;
-                }
-            },
-            'shape': {
-                get: function(){
-                    if(prop.k){
-                        prop.getValue();
-                    }
-                    return prop;
-                }
-            },
-            '_name': { value: shape.nm },
-            'ix': { value: shape.ix },
-            'mn': { value: shape.mn }
-        });
-        return interfaceFunction;
-    }
-
-    return function(shapes,view,propertyGroup) {
-        var interfaces;
-        function _interfaceFunction(value){
-            if(typeof value === 'number'){
-                return interfaces[value-1];
-            } else {
-                var i = 0, len = interfaces.length;
-                while(i<len){
-                    if(interfaces[i]._name === value){
-                        return interfaces[i];
-                    }
-                    i+=1;
-                }
-            }
-        }
-        _interfaceFunction.propertyGroup = propertyGroup;
-        interfaces = iterateElements(shapes, view, _interfaceFunction);
-        return _interfaceFunction;
-    }
-}())
-
-var TextExpressionInterface = (function(){
-	return function(elem){
-        var _prevValue, _sourceText;
-        function _cd(){
-        }
-        Object.defineProperty(_cd, "sourceText", {
-            get: function(){
-                var stringValue = elem.textProperty.currentData.t;
-                if(elem.textProperty.currentData.t !== _prevValue) {
-                    elem.textProperty.currentData.t = _prevValue;
-                    _sourceText = new String(stringValue);
-                    //If stringValue is an empty string, eval returns undefined, so it has to be returned as a String primitive
-                    _sourceText.value = stringValue ? stringValue : new String(stringValue);
-                }
-                return _sourceText;
-            }
-        });
-        return _cd;
-    }
-}())
-var LayerExpressionInterface = (function (){
-    function toWorld(arr, time){
-        var toWorldMat = new Matrix();
-        toWorldMat.reset();
-        var transformMat;
-        if(time) {
-            //Todo implement value at time on transform properties
-            //transformMat = this._elem.finalTransform.mProp.getValueAtTime(time);
-            transformMat = this._elem.finalTransform.mProp;
-        } else {
-            transformMat = this._elem.finalTransform.mProp;
-        }
-        transformMat.applyToMatrix(toWorldMat);
-        if(this._elem.hierarchy && this._elem.hierarchy.length){
-            var i, len = this._elem.hierarchy.length;
-            for(i=0;i<len;i+=1){
-                this._elem.hierarchy[i].finalTransform.mProp.applyToMatrix(toWorldMat);
-            }
-            return toWorldMat.applyToPointArray(arr[0],arr[1],arr[2]||0);
-        }
-        return toWorldMat.applyToPointArray(arr[0],arr[1],arr[2]||0);
-    }
-    function fromWorld(arr, time){
-        var toWorldMat = new Matrix();
-        toWorldMat.reset();
-        var transformMat;
-        if(time) {
-            //Todo implement value at time on transform properties
-            //transformMat = this._elem.finalTransform.mProp.getValueAtTime(time);
-            transformMat = this._elem.finalTransform.mProp;
-        } else {
-            transformMat = this._elem.finalTransform.mProp;
-        }
-        transformMat.applyToMatrix(toWorldMat);
-        if(this._elem.hierarchy && this._elem.hierarchy.length){
-            var i, len = this._elem.hierarchy.length;
-            for(i=0;i<len;i+=1){
-                this._elem.hierarchy[i].finalTransform.mProp.applyToMatrix(toWorldMat);
-            }
-            return toWorldMat.inversePoint(arr);
-        }
-        return toWorldMat.inversePoint(arr);
-    }
-    function fromComp(arr){
-        var toWorldMat = new Matrix();
-        toWorldMat.reset();
-        this._elem.finalTransform.mProp.applyToMatrix(toWorldMat);
-        if(this._elem.hierarchy && this._elem.hierarchy.length){
-            var i, len = this._elem.hierarchy.length;
-            for(i=0;i<len;i+=1){
-                this._elem.hierarchy[i].finalTransform.mProp.applyToMatrix(toWorldMat);
-            }
-            return toWorldMat.inversePoint(arr);
-        }
-        return toWorldMat.inversePoint(arr);
-    }
-
-
-    return function(elem){
-
-        var transformInterface;
-
-        function _registerMaskInterface(maskManager){
-            _cd.mask = new MaskManagerInterface(maskManager, elem);
-        }
-        function _registerEffectsInterface(effects){
-            _cd.effect = effects;
-        }
-
-        function _cd(name){
-            switch(name){
-                case "ADBE Root Vectors Group":
-                case "Contents":
-                case 2:
-                    return _cd.shapeInterface;
-                case 1:
-                case 6:
-                case "Transform":
-                case "transform":
-                case "ADBE Transform Group":
-                    return transformInterface;
-                case 4:
-                case "ADBE Effect Parade":
-                    return _cd.effect;
-            }
-        }
-        _cd.toWorld = toWorld;
-        _cd.fromWorld = fromWorld;
-        _cd.toComp = toWorld;
-        _cd.fromComp = fromComp;
-        _cd.sourceRectAtTime = elem.sourceRectAtTime.bind(elem);
-        _cd._elem = elem;
-        transformInterface = TransformExpressionInterface(elem.finalTransform.mProp);
-        var anchorPointDescriptor = getDescriptor(transformInterface, 'anchorPoint');
-        Object.defineProperties(_cd,{
-            hasParent: {
-                get: function(){
-                    return elem.hierarchy.length;
-                }
-            },
-            parent: {
-                get: function(){
-                    return elem.hierarchy[0].layerInterface;
-                }
-            },
-            rotation: getDescriptor(transformInterface, 'rotation'),
-            scale: getDescriptor(transformInterface, 'scale'),
-            position: getDescriptor(transformInterface, 'position'),
-            opacity: getDescriptor(transformInterface, 'opacity'),
-            anchorPoint: anchorPointDescriptor,
-            anchor_point: anchorPointDescriptor,
-            transform: {
-                get: function () {
-                    return transformInterface;
-                }
-            },
-            active: {
-                get: function(){
-                    return elem.isInRange;
-                }
-            }
-        });
-
-        _cd.startTime = elem.data.st;
-        _cd.index = elem.data.ind;
-        _cd.source = elem.data.refId;
-        _cd.height = elem.data.ty === 0 ? elem.data.h : 100;
-        _cd.width = elem.data.ty === 0 ? elem.data.w : 100;
-
-        _cd.registerMaskInterface = _registerMaskInterface;
-        _cd.registerEffectsInterface = _registerEffectsInterface;
-        return _cd;
-    }
-}());
-
-var CompExpressionInterface = (function (){
-    return function(comp){
-        function _cd(name){
-            var i=0, len = comp.layers.length;
-            while(i<len){
-                if(comp.layers[i].nm === name || comp.layers[i].ind === name){
-                    return comp._br[i].layerInterface;
-                }
-                i += 1;
-            }
-            return {active:false}
-        }
-        Object.defineProperty(_cd, "_name", { value:comp.data.nm });
-        _cd.layer = _cd;
-        _cd.pixelAspect = 1;
-        _cd.height = comp._x.compSize.h;
-        _cd.width = comp._x.compSize.w;
-        _cd.pixelAspect = 1;
-        _cd.frameDuration = 1/comp._x.frameRate;
-        return _cd;
-    }
-}());
-var TransformExpressionInterface = (function (){
-    return function(transform){
-        function _thisFunction(name){
-            switch(name){
-                case "scale":
-                case "Scale":
-                case "ADBE Scale":
-                case 6:
-                    return _thisFunction.scale;
-                case "rotation":
-                case "Rotation":
-                case "ADBE Rotation":
-                case "ADBE Rotate Z":
-                case 10:
-                    return _thisFunction.rotation;
-                case "position":
-                case "Position":
-                case "ADBE Position":
-                case 2:
-                    return _thisFunction.position;
-                case "anchorPoint":
-                case "AnchorPoint":
-                case "Anchor Point":
-                case "ADBE AnchorPoint":
-                case 1:
-                    return _thisFunction.anchorPoint;
-                case "opacity":
-                case "Opacity":
-                case 11:
-                    return _thisFunction.opacity;
-            }
-        }
-
-        Object.defineProperty(_thisFunction, "rotation", {
-            get: function(){
-                if(transform.r) {
-                    return ExpressionValue(transform.r, 1/degToRads);
-                } else {
-                    return ExpressionValue(transform.rz, 1/degToRads);
-                }
-            }
-        });
-        Object.defineProperty(_thisFunction, "scale", {
-            get: function () {
-                return ExpressionValue(transform.s, 100);
-            }
-        });
-
-        Object.defineProperty(_thisFunction, "position", {
-            get: function () {
-                if(transform.p) {
-                    return ExpressionValue(transform.p);
-                } else {
-                    return [transform.px.v, transform.py.v, transform.pz ? transform.pz.v : 0];
-                };
-            }
-        });
-
-        Object.defineProperty(_thisFunction, "xPosition", {
-            get: function () {
-                return ExpressionValue(transform.px);
-            }
-        });
-
-        Object.defineProperty(_thisFunction, "yPosition", {
-            get: function () {
-                return ExpressionValue(transform.py);
-            }
-        });
-
-        Object.defineProperty(_thisFunction, "zPosition", {
-            get: function () {
-                return ExpressionValue(transform.pz);
-            }
-        });
-
-        Object.defineProperty(_thisFunction, "anchorPoint", {
-            get: function () {
-                return ExpressionValue(transform.a);
-            }
-        });
-
-        Object.defineProperty(_thisFunction, "opacity", {
-            get: function () {
-                return ExpressionValue(transform.o, 100);
-            }
-        });
-
-        Object.defineProperty(_thisFunction, "skew", {
-            get: function () {
-                return ExpressionValue(transform.sk);
-            }
-        });
-
-        Object.defineProperty(_thisFunction, "skewAxis", {
-            get: function () {
-                return ExpressionValue(transform.sa);
-            }
-        });
-
-        Object.defineProperty(_thisFunction, "orientation", {
-            get: function () {
-                return ExpressionValue(transform.or);
-            }
-        });
-
-        return _thisFunction;
-    }
-}());
-var ProjectInterface = (function (){
-
-    function registerComposition(comp){
-        this.compositions.push(comp);
-    }
-
-    return function(){
-        function _thisProjectFunction(name){
-            var i = 0, len = this.compositions.length;
-            while(i<len){
-                if(this.compositions[i].data && this.compositions[i].data.nm === name){
-                    if(this.compositions[i]._az) {
-                        this.compositions[i]._az(this.compositions[i].data.xt ? this.currentFrame : this.compositions[i].renderedFrame);
-                    }
-                    return this.compositions[i].compInterface;
-                }
-                i+=1;
-            }
-        }
-
-        _thisProjectFunction.compositions = [];
-        _thisProjectFunction.currentFrame = 0;
-
-        _thisProjectFunction.registerComposition = registerComposition;
-
-
-
-        return _thisProjectFunction;
-    }
-}());
-var EffectsExpressionInterface = (function (){
-    var ob = {
-        createEffectsInterface: createEffectsInterface
-    };
-
-    function createEffectsInterface(elem, propertyGroup){
-        if(elem.effects){
-
-            var effectElements = [];
-            var effectsData = elem.data.ef;
-            var i, len = elem.effects.effectElements.length;
-            for(i=0;i<len;i+=1){
-                effectElements.push(createGroupInterface(effectsData[i],elem.effects.effectElements[i],propertyGroup,elem));
-            }
-
-            return function(name){
-                var effects = elem.data.ef, i = 0, len = effects.length;
-                while(i<len) {
-                    if(name === effects[i].nm || name === effects[i].mn || name === effects[i].ix){
-                        return effectElements[i];
-                    }
-                    i += 1;
-                }
-            }
-        }
-    }
-
-    function createGroupInterface(data,_br, propertyGroup, elem){
-        var effectElements = [];
-        var i, len = data.ef.length;
-        for(i=0;i<len;i+=1){
-            if(data.ef[i].ty === 5){
-                effectElements.push(createGroupInterface(data.ef[i],_br.effectElements[i],_br.effectElements[i].propertyGroup, elem));
-            } else {
-                effectElements.push(createValueInterface(_br.effectElements[i],data.ef[i].ty, elem, _propertyGroup));
-            }
-        }
-
-        function _propertyGroup(val) {
-            if(val === 1){
-               return groupInterface;
-            } else{
-               return propertyGroup(val-1);
-            }
-        }
-
-        var groupInterface = function(name){
-            var effects = data.ef, i = 0, len = effects.length;
-            while(i<len) {
-                if(name === effects[i].nm || name === effects[i].mn || name === effects[i].ix){
-                    if(effects[i].ty === 5){
-                        return effectElements[i];
-                    } else {
-                        return effectElements[i]();
-                    }
-                }
-                i += 1;
-            }
-            return effectElements[0]();
-        }
-
-        groupInterface.propertyGroup = _propertyGroup;
-
-        if(data.mn === 'ADBE Color Control'){
-            Object.defineProperty(groupInterface, 'color', {
-                get: function(){
-                    return effectElements[0]();
-                }
-            });
-        }
-        Object.defineProperty(groupInterface, 'numProperties', {
-            get: function(){
-                return data.np;
-            }
-        });
-        groupInterface.active = data.en !== 0;
-        return groupInterface
-    }
-
-    function createValueInterface(element, type, elem, propertyGroup){
-        function interfaceFunction(){
-            if(type === 10){
-                return elem.comp.compInterface(element.p.v);
-            }
-            return ExpressionValue(element.p);
-        }
-
-        if(element.p._ce) {
-            element.p._ce(propertyGroup);
-        }
-
-        return interfaceFunction;
-    }
-
-    return ob;
-
-}());
-var MaskManagerInterface = (function(){
-
-	function MaskInterface(mask, data){
-		this._mask = mask;
-		this._data = data;
-	}
-	Object.defineProperty(MaskInterface.prototype, 'maskPath', {
-        get: function(){
-                if(this._mask.prop.k){
-                    this._mask.prop.getValue();
-                }
-                return this._mask.prop;
-            }
-        });
-
-	var MaskManager = function(maskManager, elem){
-		var _maskManager = maskManager;
-		var _elem = elem;
-		var _masksInterfaces = Array.apply(null,{length: maskManager.viewData.length});
-		var i, len = maskManager.viewData.length;
-		for(i = 0; i < len; i += 1) {
-			_masksInterfaces[i] = new MaskInterface(maskManager.viewData[i], maskManager.masksProperties[i]);
-		}
-
-		var maskFunction = function(name){
-			i = 0;
-		    while(i<len){
-		        if(maskManager.masksProperties[i].nm === name){
-		            return _masksInterfaces[i];
-		        }
-		        i += 1;
-		    }
-		}
-		return maskFunction
-	}
-	return MaskManager
-}())
-
-
-var ExpressionValue = (function() {
-	return function(elementProp, mult, type) {
-        var expressionValue, arrayValue;
-
-		if (elementProp.k) {
-            elementProp.getValue();
-        }
-        var i, len, arrValue;
-        if (type) {
-        	if(type === 'color') {
-        		len = 4;
-                expressionValue = createTypedArray('float32', len);
-                arrValue = createTypedArray('float32', len);
-		        for (i = 0; i < len; i += 1) {
-		            expressionValue[i] = arrValue[i] = (mult && i < 3) ? elementProp.v[i] * mult : 1;
-		        }
-	        	expressionValue.value = arrValue;
-        	}
-        } else if (typeof elementProp.v === 'number' || elementProp.v instanceof Number){
-            expressionValue = mult ? new Number(elementProp.v * mult) : new Number(elementProp.v);
-            expressionValue.value = mult ? elementProp.v * mult : elementProp.v;
-        } else {
-        	len = elementProp.v.length;
-            expressionValue = createTypedArray('float32', len);
-            arrValue = createTypedArray('float32', len);
-	        for (i = 0; i < len; i += 1) {
-	            expressionValue[i] = arrValue[i] = mult ? elementProp.v[i] * mult : elementProp.v[i];
-	        }
-	        expressionValue.value = arrValue;
-        }
-        
-        expressionValue.numKeys = elementProp.keyframes ? elementProp.keyframes.length : 0;
-        expressionValue.key = function(pos) {
-            if (!expressionValue.numKeys) {
-                return 0;
-            } else {
-                return elementProp.keyframes[pos-1].t;
-            }
-        };
-        expressionValue.valueAtTime = elementProp.getValueAtTime;
-        expressionValue.propertyGroup = elementProp.propertyGroup;
-        return expressionValue;
-	}
-}())
-function SliderEffect(data,elem, dynamicProperties){
-    this.p = _ai._bo(elem,data.v,0,0,dynamicProperties);
-}
-function AngleEffect(data,elem, dynamicProperties){
-    this.p = _ai._bo(elem,data.v,0,0,dynamicProperties);
-}
-function ColorEffect(data,elem, dynamicProperties){
-    this.p = _ai._bo(elem,data.v,1,0,dynamicProperties);
-}
-function PointEffect(data,elem, dynamicProperties){
-    this.p = _ai._bo(elem,data.v,1,0,dynamicProperties);
-}
-function LayerIndexEffect(data,elem, dynamicProperties){
-    this.p = _ai._bo(elem,data.v,0,0,dynamicProperties);
-}
-function MaskIndexEffect(data,elem, dynamicProperties){
-    this.p = _ai._bo(elem,data.v,0,0,dynamicProperties);
-}
-function CheckboxEffect(data,elem, dynamicProperties){
-    this.p = _ai._bo(elem,data.v,0,0,dynamicProperties);
-}
-function NoValueEffect(){
-    this.p = {};
-}
-function EffectsManager(data,element,dynamicProperties){
-    var effects = data.ef || [];
-    this.effectElements = [];
-    var i,len = effects.length;
-    var effectItem;
-    for(i=0;i<len;i++) {
-        effectItem = new GroupEffect(effects[i],element,dynamicProperties);
-        this.effectElements.push(effectItem);
-    }
-}
-
-function GroupEffect(data,element,dynamicProperties){
-    this.dynamicProperties = [];
-    this.init(data,element,this.dynamicProperties);
-    if(this.dynamicProperties.length){
-        dynamicProperties.push(this);
-    }
-}
-
-GroupEffect.prototype.getValue = function(){
-    this.mdf = false;
-    var i, len = this.dynamicProperties.length;
-    for(i=0;i<len;i+=1){
-        this.dynamicProperties[i].getValue();
-        this.mdf = this.dynamicProperties[i].mdf ? true : this.mdf;
-    }
-};
-
-GroupEffect.prototype.init = function(data,element,dynamicProperties){
-    this.data = data;
-    this.mdf = false;
-    this.effectElements = [];
-    var i, len = this.data.ef.length;
-    var eff, effects = this.data.ef;
-    for(i=0;i<len;i+=1){
-        switch(effects[i].ty){
-            case 0:
-                eff = new SliderEffect(effects[i],element,dynamicProperties);
-                this.effectElements.push(eff);
-                break;
-            case 1:
-                eff = new AngleEffect(effects[i],element,dynamicProperties);
-                this.effectElements.push(eff);
-                break;
-            case 2:
-                eff = new ColorEffect(effects[i],element,dynamicProperties);
-                this.effectElements.push(eff);
-                break;
-            case 3:
-                eff = new PointEffect(effects[i],element,dynamicProperties);
-                this.effectElements.push(eff);
-                break;
-            case 4:
-            case 7:
-                eff = new CheckboxEffect(effects[i],element,dynamicProperties);
-                this.effectElements.push(eff);
-                break;
-            case 10:
-                eff = new LayerIndexEffect(effects[i],element,dynamicProperties);
-                this.effectElements.push(eff);
-                break;
-            case 11:
-                eff = new MaskIndexEffect(effects[i],element,dynamicProperties);
-                this.effectElements.push(eff);
-                break;
-            case 5:
-                eff = new EffectsManager(effects[i],element,dynamicProperties);
-                this.effectElements.push(eff);
-                break;
-            case 6:
-            default:
-                eff = new NoValueEffect(effects[i],element,dynamicProperties);
-                this.effectElements.push(eff);
-                break;
-        }
-    }
-};
     var lottiejs = {};
 
     function setLocationHref (href) {
diff --git a/build/player/lottie_light.min.js b/build/player/lottie_light.min.js
index 24bc160..23456e6 100644
--- a/build/player/lottie_light.min.js
+++ b/build/player/lottie_light.min.js
@@ -1,8 +1,5 @@
-!function(t,e){"function"==typeof define&&define.amd?define(function(){return e(t)}):"object"==typeof module&&module.exports?module.exports=e(t):(t.lottie=e(t),t.bodymovin=t.lottie)}(window||{},function(window){"use strict";function ProjectInterface(){return{}}function roundValues(t){bm_rnd=t?Math.round:function(t){return t}}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 BMEnterFrameEvent(t,e,r,s){this.type=t,this.currentTime=e,this.totalTime=r,this.direction=s<0?-1:1}function BMCompleteEvent(t,e){this.type=t,this.direction=e<0?-1:1}function BMCompleteLoopEvent(t,e,r,s){this.type=t,this.currentLoop=e,this.totalLoops=r,this.direction=s<0?-1:1}function BMSegmentStartEvent(t,e,r){this.type=t,this.firstFrame=e,this.totalFrames=r}function BMDestroyEvent(t,e){this.type=t,this.target=e}function _addEventListener(t,e){return this._cbs[t]||(this._cbs[t]=[]),this._cbs[t].push(e),function(){this.removeEventListener(t,e)}.bind(this)}function _removeEventListener(t,e){if(e){if(this._cbs[t]){for(var r=0,s=this._cbs[t].length;r<s;)this._cbs[t][r]===e&&(this._cbs[t].splice(r,1),r-=1,s-=1),r+=1;this._cbs[t].length||(this._cbs[t]=null)}}else this._cbs[t]=null}function _triggerEvent(t,e){if(this._cbs[t])for(var r=this._cbs[t].length,s=0;s<r;s++)this._cbs[t][s](e)}function randomString(t,e){void 0===e&&(e="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890");var r,s="";for(r=t;r>0;--r)s+=e[Math.round(Math.random()*(e.length-1))];return s}function HSVtoRGB(t,e,r){var s,i,a,n,o,h,l,p;switch(1===arguments.length&&(e=t.s,r=t.v,t=t.h),n=Math.floor(6*t),o=6*t-n,h=r*(1-e),l=r*(1-o*e),p=r*(1-(1-o)*e),n%6){case 0:s=r,i=p,a=h;break;case 1:s=l,i=r,a=h;break;case 2:s=h,i=r,a=p;break;case 3:s=h,i=l,a=r;break;case 4:s=p,i=h,a=r;break;case 5:s=r,i=h,a=l}return[s,i,a]}function RGBtoHSV(t,e,r){1===arguments.length&&(e=t.g,r=t.b,t=t.r);var s,i=Math.max(t,e,r),a=Math.min(t,e,r),n=i-a,o=0===i?0:n/i,h=i/255;switch(i){case a:s=0;break;case t:s=e-r+n*(e<r?6:0),s/=6*n;break;case e:s=r-t+2*n,s/=6*n;break;case r:s=t-e+4*n,s/=6*n}return[s,o,h]}function addSaturationToRGB(t,e){var r=RGBtoHSV(255*t[0],255*t[1],255*t[2]);return r[1]+=e,r[1]>1?r[1]=1:r[1]<=0&&(r[1]=0),HSVtoRGB(r[0],r[1],r[2])}function addBrightnessToRGB(t,e){var r=RGBtoHSV(255*t[0],255*t[1],255*t[2]);return r[2]+=e,r[2]>1?r[2]=1:r[2]<0&&(r[2]=0),HSVtoRGB(r[0],r[1],r[2])}function addHueToRGB(t,e){var r=RGBtoHSV(255*t[0],255*t[1],255*t[2]);return r[0]+=e/360,r[0]>1?r[0]-=1:r[0]<0&&(r[0]+=1),HSVtoRGB(r[0],r[1],r[2])}function createNS(t){return document.createElementNS(svgNS,t)}function createTag(t){return document.createElement(t)}function extendPrototype(t,e){var r,s,i=t.length;for(r=0;r<i;r+=1){s=t[r].prototype;for(var a in s)s.hasOwnProperty(a)&&(e.prototype[a]=s[a])}}function getDescriptor(t,e){return Object.getOwnPropertyDescriptor(t,e)}function bezFunction(){function t(t,e,r,s,i,a){var n=t*s+e*i+r*a-i*s-a*t-r*e;return n>-1e-4&&n<1e-4}function e(e,r,s,i,a,n,o,h,l){if(0===s&&0===n&&0===l)return t(e,r,i,a,o,h);var p,m=Math.sqrt(Math.pow(i-e,2)+Math.pow(a-r,2)+Math.pow(n-s,2)),f=Math.sqrt(Math.pow(o-e,2)+Math.pow(h-r,2)+Math.pow(l-s,2)),c=Math.sqrt(Math.pow(o-i,2)+Math.pow(h-a,2)+Math.pow(l-n,2));return p=m>f?m>c?m-f-c:c-f-m:c>f?c-f-m:f-m-c,p>-1e-4&&p<1e-4}function r(t){var e,r=segments_length_pool.newElement(),s=t.c,i=t.v,a=t.o,n=t.i,o=t._length,l=r.lengths,p=0;for(e=0;e<o-1;e+=1)l[e]=h(i[e],i[e+1],a[e],n[e+1]),p+=l[e].addedLength;return s&&(l[e]=h(i[e],i[0],a[e],n[0]),p+=l[e].addedLength),r.totalLength=p,r}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 r=e.percents,s=e.lengths,i=r.length,a=bm_floor((i-1)*t),n=t*e.addedLength,o=0;if(a===i-1||0===a||n===s[a])return r[a];for(var h=s[a]>n?-1:1,l=!0;l;)if(s[a]<=n&&s[a+1]>n?(o=(n-s[a])/(s[a+1]-s[a]),l=!1):a+=h,a<0||a>=i-1){if(a===i-1)return r[a];l=!1}return r[a]+(r[a+1]-r[a])*o}function n(t,e,r,s,i,n){var o=a(i,n),h=1-o,l=Math.round(1e3*(h*h*h*t[0]+(o*h*h+h*o*h+h*h*o)*r[0]+(o*o*h+h*o*o+o*h*o)*s[0]+o*o*o*e[0]))/1e3,p=Math.round(1e3*(h*h*h*t[1]+(o*h*h+h*o*h+h*h*o)*r[1]+(o*o*h+h*o*o+o*h*o)*s[1]+o*o*o*e[1]))/1e3;return[l,p]}function o(t,e,r,s,i,n,o){i=i<0?0:i>1?1:i;var h=a(i,o);n=n>1?1:n;var l,m=a(n,o),f=t.length,c=1-h,d=1-m,u=c*c*c,y=h*c*c*3,g=h*h*c*3,v=h*h*h,b=c*c*d,E=h*c*d+c*h*d+c*c*m,P=h*h*d+c*h*m+h*c*m,x=h*h*m,S=c*d*d,C=h*d*d+c*m*d+c*d*m,A=h*m*d+c*m*m+h*d*m,k=h*m*m,M=d*d*d,T=m*d*d+d*m*d+d*d*m,D=m*m*d+d*m*m+m*d*m,w=m*m*m;for(l=0;l<f;l+=1)p[4*l]=Math.round(1e3*(u*t[l]+y*r[l]+g*s[l]+v*e[l]))/1e3,p[4*l+1]=Math.round(1e3*(b*t[l]+E*r[l]+P*s[l]+x*e[l]))/1e3,p[4*l+2]=Math.round(1e3*(S*t[l]+C*r[l]+A*s[l]+k*e[l]))/1e3,p[4*l+3]=Math.round(1e3*(M*t[l]+T*r[l]+D*s[l]+w*e[l]))/1e3;return p}var h=(Math,function(){return function(t,e,r,s){var i,a,n,o,h,l,p=defaultCurveSegments,m=0,f=[],c=[],d=bezier_length_pool.newElement();for(n=r.length,i=0;i<p;i+=1){for(h=i/(p-1),l=0,a=0;a<n;a+=1)o=bm_pow(1-h,3)*t[a]+3*bm_pow(1-h,2)*h*r[a]+3*(1-h)*bm_pow(h,2)*s[a]+bm_pow(h,3)*e[a],f[a]=o,null!==c[a]&&(l+=bm_pow(f[a]-c[a],2)),c[a]=f[a];l&&(l=bm_sqrt(l),m+=l),d.percents[i]=h,d.lengths[i]=m}return d.addedLength=m,d}}()),l=function(){var e={};return function(r){var a=r.s,n=r.e,o=r.to,h=r.ti,l=(a[0]+"_"+a[1]+"_"+n[0]+"_"+n[1]+"_"+o[0]+"_"+o[1]+"_"+h[0]+"_"+h[1]).replace(/\./g,"p");if(e[l])return void(r.bezierData=e[l]);var p,m,f,c,d,u,y,g=defaultCurveSegments,v=0,b=null;2===a.length&&(a[0]!=n[0]||a[1]!=n[1])&&t(a[0],a[1],n[0],n[1],a[0]+o[0],a[1]+o[1])&&t(a[0],a[1],n[0],n[1],n[0]+h[0],n[1]+h[1])&&(g=2);var E=new s(g);for(f=o.length,p=0;p<g;p+=1){for(y=Array.apply(null,{length:f}),d=p/(g-1),u=0,m=0;m<f;m+=1)c=bm_pow(1-d,3)*a[m]+3*bm_pow(1-d,2)*d*(a[m]+o[m])+3*(1-d)*bm_pow(d,2)*(n[m]+h[m])+bm_pow(d,3)*n[m],y[m]=c,null!==b&&(u+=bm_pow(y[m]-b[m],2));u=bm_sqrt(u),v+=u,E.points[p]=new i(u,y),b=y}E.segmentLength=v,r.bezierData=E,e[l]=E}}(),p=createTypedArray("float32",8);return{getSegmentsLength:r,getNewSegment:o,getPointInSegment:n,buildBezierData:l,pointOnLine2D:t,pointOnLine3D:e}}function dataFunctionManager(){function t(i,a,o){var h,l,p,m,f,c,d,u,y=i.length;for(m=0;m<y;m+=1)if(h=i[m],"ks"in h&&!h.completed){if(h.completed=!0,h.tt&&(i[m-1].td=h.tt),l=[],p=-1,h.hasMask){var g=h.masksProperties;for(c=g.length,f=0;f<c;f+=1)if(g[f].pt.k.i)s(g[f].pt.k);else for(u=g[f].pt.k.length,d=0;d<u;d+=1)g[f].pt.k[d].s&&s(g[f].pt.k[d].s[0]),g[f].pt.k[d].e&&s(g[f].pt.k[d].e[0])}0===h.ty?(h.layers=e(h.refId,a),t(h.layers,a,o)):4===h.ty?r(h.shapes):5==h.ty&&n(h,o)}}function e(t,e){for(var r=0,s=e.length;r<s;){if(e[r].id===t)return e[r].layers.__used?JSON.parse(JSON.stringify(e[r].layers)):(e[r].layers.__used=!0,e[r].layers);r+=1}}function r(t){var e,i,a,n=t.length,o=!1;for(e=n-1;e>=0;e-=1)if("sh"==t[e].ty){if(t[e].ks.k.i)s(t[e].ks.k);else for(a=t[e].ks.k.length,i=0;i<a;i+=1)t[e].ks.k[i].s&&s(t[e].ks.k[i].s[0]),t[e].ks.k[i].e&&s(t[e].ks.k[i].e[0]);o=!0}else"gr"==t[e].ty&&r(t[e].it)}function s(t){var e,r=t.i.length;for(e=0;e<r;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 i(t,e){var r=e?e.split("."):[100,100,100];return t[0]>r[0]||!(r[0]>t[0])&&(t[1]>r[1]||!(r[1]>t[1])&&(t[2]>r[2]||!(r[2]>t[2])&&void 0))}function a(e,r){e.__complete||(l(e),o(e),h(e),p(e),t(e.layers,e.assets,r),e.__complete=!0)}function n(t,e){0!==t.t.a.length||"m"in t.t.p||(t.singleShape=!0)}var o=function(){function t(t){var e=t.t.d;t.t.d={k:[{s:e,t:0}]}}function e(e){var r,s=e.length;for(r=0;r<s;r+=1)5===e[r].ty&&t(e[r])}var r=[4,4,14];return function(t){if(i(r,t.v)&&(e(t.layers),t.assets)){var s,a=t.assets.length;for(s=0;s<a;s+=1)t.assets[s].layers&&e(t.assets[s].layers)}}}(),h=function(){var t=[4,7,99];return function(e){if(e.chars&&!i(t,e.v)){var r,a,n,o,h,l=e.chars.length;for(r=0;r<l;r+=1)if(e.chars[r].data&&e.chars[r].data.shapes)for(h=e.chars[r].data.shapes[0].it,n=h.length,a=0;a<n;a+=1)o=h[a].ks.k,o.__converted||(s(h[a].ks.k),o.__converted=!0)}}}(),l=function(){function t(e){var r,s,i,a=e.length;for(r=0;r<a;r+=1)if("gr"===e[r].ty)t(e[r].it);else if("fl"===e[r].ty||"st"===e[r].ty)if(e[r].c.k&&e[r].c.k[0].i)for(i=e[r].c.k.length,s=0;s<i;s+=1)e[r].c.k[s].s&&(e[r].c.k[s].s[0]/=255,e[r].c.k[s].s[1]/=255,e[r].c.k[s].s[2]/=255,e[r].c.k[s].s[3]/=255),e[r].c.k[s].e&&(e[r].c.k[s].e[0]/=255,e[r].c.k[s].e[1]/=255,e[r].c.k[s].e[2]/=255,e[r].c.k[s].e[3]/=255);else e[r].c.k[0]/=255,e[r].c.k[1]/=255,e[r].c.k[2]/=255,e[r].c.k[3]/=255}function e(e){var r,s=e.length;for(r=0;r<s;r+=1)4===e[r].ty&&t(e[r].shapes)}var r=[4,1,9];return function(t){if(i(r,t.v)&&(e(t.layers),t.assets)){var s,a=t.assets.length;for(s=0;s<a;s+=1)t.assets[s].layers&&e(t.assets[s].layers)}}}(),p=function(){function t(e){var r,s,i,a=e.length,n=!1;for(r=a-1;r>=0;r-=1)if("sh"==e[r].ty){if(e[r].ks.k.i)e[r].ks.k.c=e[r].closed;else for(i=e[r].ks.k.length,s=0;s<i;s+=1)e[r].ks.k[s].s&&(e[r].ks.k[s].s[0].c=e[r].closed),e[r].ks.k[s].e&&(e[r].ks.k[s].e[0].c=e[r].closed);n=!0}else"gr"==e[r].ty&&t(e[r].it)}function e(e){var r,s,i,a,n,o,h=e.length;for(s=0;s<h;s+=1){if(r=e[s],r.hasMask){var l=r.masksProperties;for(a=l.length,i=0;i<a;i+=1)if(l[i].pt.k.i)l[i].pt.k.c=l[i].cl;else for(o=l[i].pt.k.length,n=0;n<o;n+=1)l[i].pt.k[n].s&&(l[i].pt.k[n].s[0].c=l[i].cl),l[i].pt.k[n].e&&(l[i].pt.k[n].e[0].c=l[i].cl)}4===r.ty&&t(r.shapes)}}var r=[4,4,18];return function(t){if(i(r,t.v)&&(e(t.layers),t.assets)){var s,a=t.assets.length;for(s=0;s<a;s+=1)t.assets[s].layers&&e(t.assets[s].layers)}}}(),m={};return m.completeData=a,m}function _av(){this.c=!1,this._length=0,this._maxLength=8,this.v=Array.apply(null,{length:this._maxLength}),this.o=Array.apply(null,{length:this._maxLength}),this.i=Array.apply(null,{length:this._maxLength})}function _at(){}function _an(){}function _au(){}function _aj(){}function _am(){this._length=0,this._maxLength=4,this.shapes=Array.apply(null,{length:this._maxLength})}function DashProperty(t,e,r,s){this.elem=t,this.frameId=-1,this.dataProps=Array.apply(null,{length:e.length}),this.renderer=r,this.mdf=!1,this.k=!1,this.dashStr="",this.dashArray=createTypedArray("float32",e.length-1),this.dashoffset=createTypedArray("float32",1);var i,a,n=e.length;for(i=0;i<n;i+=1)a=_ai._bo(t,e[i].v,0,0,s),this.k=!!a.k||this.k,this.dataProps[i]={n:e[i].n,p:a};this.k?s.push(this):this.getValue(!0)}function GradientProperty(t,e,r){this.prop=_ai._bo(t,e.k,1,null,[]),this.data=e,this.k=this.prop.k,this.c=createTypedArray("uint8c",4*e.p);var s=e.k.k[0].s?e.k.k[0].s.length-4*e.p:e.k.k.length-4*e.p;this.o=createTypedArray("float32",s),this.cmdf=!1,this.omdf=!1,this._collapsable=this.checkCollapsable(),this._hasOpacity=s,this.prop.k&&r.push(this),this.getValue(!0)}function _bl(t,e,r){this.mdf=!1,this._firstFrame=!0,this._hasMaskedPath=!1,this._frameId=-1,this._dynamicProperties=[],this._textData=t,this._renderType=e,this._elem=r,this._animatorsData=Array.apply(null,{length:this._textData.a.length}),this._pathData={},this._moreOptions={alignment:{}},this._bt=[],this.lettersChangedFlag=!1}function TextAnimatorDataProperty(t,e,r){var s={propType:!1},i=_ai._bo,a=e.a;this.a={r:a.r?i(t,a.r,0,degToRads,r):s,rx:a.rx?i(t,a.rx,0,degToRads,r):s,ry:a.ry?i(t,a.ry,0,degToRads,r):s,sk:a.sk?i(t,a.sk,0,degToRads,r):s,sa:a.sa?i(t,a.sa,0,degToRads,r):s,s:a.s?i(t,a.s,1,.01,r):s,a:a.a?i(t,a.a,1,0,r):s,o:a.o?i(t,a.o,0,.01,r):s,p:a.p?i(t,a.p,1,0,r):s,sw:a.sw?i(t,a.sw,0,0,r):s,sc:a.sc?i(t,a.sc,1,0,r):s,fc:a.fc?i(t,a.fc,1,0,r):s,fh:a.fh?i(t,a.fh,0,0,r):s,fs:a.fs?i(t,a.fs,0,.01,r):s,fb:a.fb?i(t,a.fb,0,.01,r):s,t:a.t?i(t,a.t,0,0,r):s},this.s=TextSelectorProp.getTextSelectorProp(t,e.s,r),this.s.t=e.s.t}function LetterProps(t,e,r,s,i,a){this.o=t,this.sw=e,this.sc=r,this.fc=s,this.m=i,this.p=a,this.mdf={o:!0,sw:!!e,sc:!!r,fc:!!s,m:!0,p:!0}}function _ar(t,e,r){this._frameId=initialDefaultFrame,this.pv="",this.v="",this.kf=!1,this.firstFrame=!0,this.mdf=!0,this.data=e,this.elem=t,this.keysIndex=-1,this.currentData={ascent:0,boxWidth:[0,0],f:"",fStyle:"",fWeight:"",fc:"",j:"",justifyOffset:"",l:[],lh:0,lineWidths:[],ls:"",of:"",s:"",sc:"",sw:0,t:0,tr:0,sz:0,ps:[0,0],fillColorAnim:!1,strokeColorAnim:!1,strokeWidthAnim:!1,yOffset:0,__complete:!1},this.searchProperty()?r.push(this):this.getValue(!0)}function _l(){}function _ao(t,e){this.animationItem=t,this.layers=null,this.renderedFrame=-1,this._cf=createNS("svg");var r=createNS("g");this._cf.appendChild(r),this._bx=r;var s=createNS("defs");this._cf.appendChild(s),this.renderConfig={preserveAspectRatio:e&&e.preserveAspectRatio||"xMidYMid meet",progressiveLoad:e&&e.progressiveLoad||!1,hideOnTransparent:!e||e.hideOnTransparent!==!1,viewBoxOnly:e&&e.viewBoxOnly||!1,viewBoxSize:e&&e.viewBoxSize||!1,className:e&&e.className||""},this._x={mdf:!1,frameNum:-1,defs:s,frameId:0,compSize:{w:0,h:0},renderConfig:this.renderConfig,fontManager:new FontManager},this._br=[],this.pendingElements=[],this.destroyed=!1}function _aq(t,e){this.animationItem=t,this.renderConfig={clearCanvas:!e||void 0===e.clearCanvas||e.clearCanvas,context:e&&e.context||null,progressiveLoad:e&&e.progressiveLoad||!1,preserveAspectRatio:e&&e.preserveAspectRatio||"xMidYMid meet",className:e&&e.className||""},this.renderConfig.dpr=e&&e.dpr||1,this.animationItem.wrapper&&(this.renderConfig.dpr=e&&e.dpr||window.devicePixelRatio||1),this.renderedFrame=-1,this._x={frameNum:-1,mdf:!1,renderConfig:this.renderConfig};this.contextData=new _n,this._br=[],this.pendingElements=[],this.transformMat=new Matrix,this.completeLayers=!1}function _ap(t,e){this.animationItem=t,this.layers=null,this.renderedFrame=-1,this.renderConfig={className:e&&e.className||"",hideOnTransparent:!e||e.hideOnTransparent!==!1},this._x={mdf:!1,frameNum:-1,renderConfig:this.renderConfig},this.pendingElements=[],this._br=[],this.threeDElements=[],this.destroyed=!1,this.camera=null,this.supports3d=!0}function _ay(t,e,r){this.dynamicProperties=[],this.data=t,this.element=e,this._x=r,this.storedData=[],this.masksProperties=this.data.masksProperties||[],this.maskElement=null,this.firstFrame=!0;var s,i=this._x.defs,a=this.masksProperties?this.masksProperties.length:0;this.viewData=Array.apply(null,{length:a}),this.solidPath="";var n,o,h,l,p,m,f,c=this.masksProperties,d=0,u=[],y=randomString(10),g="clipPath",v="clip-path";for(s=0;s<a;s++)if(("a"!==c[s].mode&&"n"!==c[s].mode||c[s].inv||100!==c[s].o.k)&&(g="mask",v="mask"),"s"!=c[s].mode&&"i"!=c[s].mode||0!=d?l=null:(l=createNS("rect"),l.setAttribute("fill","#ffffff"),l.setAttribute("width",this.element.comp.data.w),l.setAttribute("height",this.element.comp.data.h),u.push(l)),n=createNS("path"),"n"!=c[s].mode){if(d+=1,n.setAttribute("fill","s"===c[s].mode?"#000000":"#ffffff"),n.setAttribute("clip-rule","nonzero"),0!==c[s].x.k){g="mask",v="mask",f=_ai._bo(this.element,c[s].x,0,null,this.dynamicProperties);var b="fi_"+randomString(10);p=createNS("filter"),p.setAttribute("id",b),m=createNS("feMorphology"),m.setAttribute("operator","dilate"),m.setAttribute("in","SourceGraphic"),m.setAttribute("radius","0"),p.appendChild(m),i.appendChild(p),n.setAttribute("stroke","s"===c[s].mode?"#000000":"#ffffff")}else m=null,f=null;if(this.storedData[s]={elem:n,x:f,expan:m,lastPath:"",lastOperator:"",filterId:b,lastRadius:0},"i"==c[s].mode){h=u.length;var E=createNS("g");for(o=0;o<h;o+=1)E.appendChild(u[o]);var P=createNS("mask");P.setAttribute("mask-type","alpha"),P.setAttribute("id",y+"_"+d),P.appendChild(n),i.appendChild(P),E.setAttribute("mask","url("+locationHref+"#"+y+"_"+d+")"),u.length=0,u.push(E)}else u.push(n);c[s].inv&&!this.solidPath&&(this.solidPath=this.createLayerSolidPath()),this.viewData[s]={elem:n,lastPath:"",op:_ai._bo(this.element,c[s].o,0,.01,this.dynamicProperties),prop:_ah._bp(this.element,c[s],3,this.dynamicProperties,null)},l&&(this.viewData[s].invRect=l),this.viewData[s].prop.k||this.drawPath(c[s],this.viewData[s].prop.v,this.viewData[s])}else this.viewData[s]={op:_ai._bo(this.element,c[s].o,0,.01,this.dynamicProperties),prop:_ah._bp(this.element,c[s],3,this.dynamicProperties,null),elem:n},i.appendChild(n);for(this.maskElement=createNS(g),a=u.length,s=0;s<a;s+=1)this.maskElement.appendChild(u[s]);d>0&&(this.maskElement.setAttribute("id",y),this.element._ca.setAttribute(v,"url("+locationHref+"#"+y+")"),i.appendChild(this.maskElement))}function _ad(){}function _ac(){}function _af(){}function _ae(){}function RenderableDOMElement(){}function ProcessedElement(t,e){this.elem=t,this.pos=e}function SVGStyleData(t,e){this.data=t,this.type=t.ty,this.d="",this.lvl=e,this.mdf=!1,this.closed=!1,this.pElem=createNS("path"),this.msElem=null}function SVGShapeData(t,e,r){this.caches=[],this.styles=[],this.transformers=t,this.lStr="",this.sh=r,this.lvl=e}function SVGTransformData(t,e){this.transform={mProps:t,op:e},this._br=[]}function SVGStrokeStyleData(t,e,r,s){this.o=_ai._bo(t,e.o,0,.01,r),this.w=_ai._bo(t,e.w,0,null,r),this.d=new DashProperty(t,e.d||{},"svg",r),this.c=_ai._bo(t,e.c,1,255,r),this.style=s}function SVGFillStyleData(t,e,r,s){this.o=_ai._bo(t,e.o,0,.01,r),this.c=_ai._bo(t,e.c,1,255,r),this.style=s}function SVGGradientFillStyleData(t,e,r,s){this.initGradientData(t,e,r,s)}function SVGGradientStrokeStyleData(t,e,r,s){this.w=_ai._bo(t,e.w,0,null,r),this.d=new DashProperty(t,e.d||{},"svg",r),this.initGradientData(t,e,r,s)}function ShapeGroupData(){this.it=[],this.prevViewData=[],this.gr=createNS("g")}function _e(){}function _i(t,e,r){this.initFrame(),this.initBaseData(t,e,r),this.initFrame(),this.initTransform(t,e,r),this.initHierarchy()}function _d(){}function _f(t,e,r){this.shapes=[],this.shapesData=t.shapes,this.stylesList=[],this.shapeModifiers=[],this.itemsData=[],this.processedElements=[],this.initElement(t,e,r),this.prevViewData=[]}function _k(){}function _g(){}function _h(t,e,r){this.assetData=e.getAssetData(t.refId),this.initElement(t,e,r)}function _j(t,e,r){this.initElement(t,e,r)}function SVGCompElement(t,e,r){this.layers=t.layers,this.supports3d=!0,this.completeLayers=!1,this.pendingElements=[],this._br=this.layers?Array.apply(null,{length:this.layers.length}):[],this.initElement(t,e,r),this.tm=t.tm?_ai._bo(this,t.tm,0,e.frameRate,this.dynamicProperties):{_placeholder:!0}}function SVGTextElement(t,e,r){this.textSpans=[],this.renderType="svg",this.initElement(t,e,r)}function _bb(t,e){this.filterManager=e;var r=createNS("feColorMatrix");if(r.setAttribute("type","matrix"),r.setAttribute("color-interpolation-filters","linearRGB"),r.setAttribute("values","0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0 0 0 1 0"),r.setAttribute("result","f1"),t.appendChild(r),r=createNS("feColorMatrix"),r.setAttribute("type","matrix"),r.setAttribute("color-interpolation-filters","sRGB"),r.setAttribute("values","1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0"),r.setAttribute("result","f2"),t.appendChild(r),this.matrixFilter=r,100!==e.effectElements[2].p.v||e.effectElements[2].p.k){var s=createNS("feMerge");t.appendChild(s);var i;i=createNS("feMergeNode"),i.setAttribute("in","SourceGraphic"),s.appendChild(i),i=createNS("feMergeNode"),i.setAttribute("in","f2"),s.appendChild(i)}}function _bc(t,e){this.filterManager=e;var r=createNS("feColorMatrix");r.setAttribute("type","matrix"),r.setAttribute("color-interpolation-filters","sRGB"),r.setAttribute("values","1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0"),t.appendChild(r),this.matrixFilter=r}function _bd(t,e){this.initialized=!1,this.filterManager=e,this.elem=t,this.paths=[]}function _be(t,e){this.filterManager=e;var r=createNS("feColorMatrix");r.setAttribute("type","matrix"),r.setAttribute("color-interpolation-filters","linearRGB"),r.setAttribute("values","0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0 0 0 1 0"),r.setAttribute("result","f1"),t.appendChild(r);var s=createNS("feComponentTransfer");s.setAttribute("color-interpolation-filters","sRGB"),t.appendChild(s),this.matrixFilter=s;var i=createNS("feFuncR");i.setAttribute("type","table"),s.appendChild(i),this.feFuncR=i;var a=createNS("feFuncG");a.setAttribute("type","table"),s.appendChild(a),this.feFuncG=a;var n=createNS("feFuncB");n.setAttribute("type","table"),s.appendChild(n),this.feFuncB=n}function _bf(t,e){this.filterManager=e;var r=this.filterManager.effectElements,s=createNS("feComponentTransfer");(r[10].p.k||0!==r[10].p.v||r[11].p.k||1!==r[11].p.v||r[12].p.k||1!==r[12].p.v||r[13].p.k||0!==r[13].p.v||r[14].p.k||1!==r[14].p.v)&&(this.feFuncR=this.createFeFunc("feFuncR",s)),(r[17].p.k||0!==r[17].p.v||r[18].p.k||1!==r[18].p.v||r[19].p.k||1!==r[19].p.v||r[20].p.k||0!==r[20].p.v||r[21].p.k||1!==r[21].p.v)&&(this.feFuncG=this.createFeFunc("feFuncG",s)),(r[24].p.k||0!==r[24].p.v||r[25].p.k||1!==r[25].p.v||r[26].p.k||1!==r[26].p.v||r[27].p.k||0!==r[27].p.v||r[28].p.k||1!==r[28].p.v)&&(this.feFuncB=this.createFeFunc("feFuncB",s)),(r[31].p.k||0!==r[31].p.v||r[32].p.k||1!==r[32].p.v||r[33].p.k||1!==r[33].p.v||r[34].p.k||0!==r[34].p.v||r[35].p.k||1!==r[35].p.v)&&(this.feFuncA=this.createFeFunc("feFuncA",s)),(this.feFuncR||this.feFuncG||this.feFuncB||this.feFuncA)&&(s.setAttribute("color-interpolation-filters","sRGB"),t.appendChild(s),s=createNS("feComponentTransfer")),(r[3].p.k||0!==r[3].p.v||r[4].p.k||1!==r[4].p.v||r[5].p.k||1!==r[5].p.v||r[6].p.k||0!==r[6].p.v||r[7].p.k||1!==r[7].p.v)&&(s.setAttribute("color-interpolation-filters","sRGB"),t.appendChild(s),this.feFuncRComposed=this.createFeFunc("feFuncR",s),this.feFuncGComposed=this.createFeFunc("feFuncG",s),this.feFuncBComposed=this.createFeFunc("feFuncB",s))}function _bg(t,e){t.setAttribute("x","-100%"),t.setAttribute("y","-100%"),t.setAttribute("width","400%"),t.setAttribute("height","400%"),this.filterManager=e;var r=createNS("feGaussianBlur");r.setAttribute("in","SourceAlpha"),r.setAttribute("result","drop_shadow_1"),r.setAttribute("stdDeviation","0"),this.feGaussianBlur=r,t.appendChild(r);var s=createNS("feOffset");s.setAttribute("dx","25"),s.setAttribute("dy","0"),s.setAttribute("in","drop_shadow_1"),s.setAttribute("result","drop_shadow_2"),this.feOffset=s,t.appendChild(s);var i=createNS("feFlood");i.setAttribute("flood-color","#00ff00"),i.setAttribute("flood-opacity","1"),i.setAttribute("result","drop_shadow_3"),this.feFlood=i,t.appendChild(i);var a=createNS("feComposite");a.setAttribute("in","drop_shadow_3"),a.setAttribute("in2","drop_shadow_2"),a.setAttribute("operator","in"),a.setAttribute("result","drop_shadow_4"),t.appendChild(a);var n=createNS("feMerge");t.appendChild(n);var o;o=createNS("feMergeNode"),n.appendChild(o),o=createNS("feMergeNode"),o.setAttribute("in","SourceGraphic"),this.feMergeNode=o,this.feMerge=n,this.originalNodeAdded=!1,n.appendChild(o)}function _bh(t,e,r){this.initialized=!1,this.filterManager=e,this.filterElem=t,this.elem=r,r.matteElement=createNS("g"),r.matteElement.appendChild(r._bx),r.matteElement.appendChild(r._bz),r._by=r.matteElement}function _bi(t){var e,r=t.data.ef?t.data.ef.length:0,s=randomString(10),i=filtersFactory.createFilter(s),a=0;this.filters=[];var n;for(e=0;e<r;e+=1)20===t.data.ef[e].ty?(a+=1,n=new _bb(i,t.effects.effectElements[e]),this.filters.push(n)):21===t.data.ef[e].ty?(a+=1,n=new _bc(i,t.effects.effectElements[e]),this.filters.push(n)):22===t.data.ef[e].ty?(n=new _bd(t,t.effects.effectElements[e]),this.filters.push(n)):23===t.data.ef[e].ty?(a+=1,n=new _be(i,t.effects.effectElements[e]),this.filters.push(n)):24===t.data.ef[e].ty?(a+=1,n=new _bf(i,t.effects.effectElements[e]),this.filters.push(n)):25===t.data.ef[e].ty?(a+=1,n=new _bg(i,t.effects.effectElements[e]),this.filters.push(n)):28===t.data.ef[e].ty&&(n=new _bh(i,t.effects.effectElements[e],t),this.filters.push(n));a&&(t._x.defs.appendChild(i),t._bx.setAttribute("filter","url("+locationHref+"#"+s+")"))}function _n(){this.saved=[],this.cArrPos=0,this.cTr=new Matrix,this.cO=1;var t,e=15;for(this.savedOp=createTypedArray("float32",e),t=0;t<e;t+=1)this.saved[t]=createTypedArray("float32",16);this._length=e}function _c(t,e,r){}function _p(t,e,r){this.failed=!1,this.img=new Image,this.assetData=e.getAssetData(t.refId),this.initElement(t,e,r),this._x.addPendingElement()}function _m(t,e,r){this.completeLayers=!1,this.layers=t.layers,this.pendingElements=[],this._br=Array.apply(null,{length:this.layers.length}),this.initElement(t,e,r),this.tm=t.tm?_ai._bo(this,t.tm,0,e.frameRate,this.dynamicProperties):{_placeholder:!0}}function _q(t,e){this.data=t,this.element=e,this.dynamicProperties=[],this.masksProperties=this.data.masksProperties||[],this.viewData=Array.apply(null,{length:this.masksProperties.length});var r,s=this.masksProperties.length,i=!1;for(r=0;r<s;r++)"n"!==this.masksProperties[r].mode&&(i=!0),this.viewData[r]=_ah._bp(this.element,this.masksProperties[r],3,this.dynamicProperties,null);this.hasMasks=i}function _r(t,e,r){this.shapes=[],this.shapesData=t.shapes,this.stylesList=[],this.itemsData=[],this.prevViewData=[],this.shapeModifiers=[],this.processedElements=[],this.initElement(t,e,r)}function _s(t,e,r){this.initElement(t,e,r)}function _t(t,e,r){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.initElement(t,e,r)}function _o(){}function _b(t,e,r){}function _aa(t,e,r){this.initElement(t,e,r)}function _w(t,e,r){this.layers=t.layers,this.supports3d=!t.hasMask,this.completeLayers=!1,this.pendingElements=[],this._br=this.layers?Array.apply(null,{length:this.layers.length}):[],this.tm=t.tm?_ai._bo(this,t.tm,0,e.frameRate,this.dynamicProperties):{_placeholder:!0},this.initElement(t,e,r)}function _z(t,e,r){this.shapes=[],this.shapesData=t.shapes,this.stylesList=[],this.shapeModifiers=[],this.itemsData=[],this.processedElements=[],this.shapesContainer=createNS("g"),this.initElement(t,e,r),this.prevViewData=[],this._cg={x:999999,y:-999999,h:0,w:0}}function _ab(t,e,r){this.textSpans=[],this.textPaths=[],this._cg={x:999999,y:-999999,h:0,w:0},this.renderType="svg",this.isMasked=!1,this.initElement(t,e,r)}function _y(t,e,r){this.assetData=e.getAssetData(t.refId),this.initElement(t,e,r)}function _v(t,e,r){this.initFrame(),this.initBaseData(t,e,r);var s=_ai._bo;if(this.pe=s(this,t.pe,0,0,this.dynamicProperties),t.ks.p.s?(this.px=s(this,t.ks.p.x,1,0,this.dynamicProperties),this.py=s(this,t.ks.p.y,1,0,this.dynamicProperties),this.pz=s(this,t.ks.p.z,1,0,this.dynamicProperties)):this.p=s(this,t.ks.p,1,0,this.dynamicProperties),t.ks.a&&(this.a=s(this,t.ks.a,1,0,this.dynamicProperties)),t.ks.or.k.length&&t.ks.or.k[0].to){var i,a=t.ks.or.k.length;for(i=0;i<a;i+=1)t.ks.or.k[i].to=null,t.ks.or.k[i].ti=null}this.or=s(this,t.ks.or,1,degToRads,this.dynamicProperties),this.or.sh=!0,this.rx=s(this,t.ks.rx,0,degToRads,this.dynamicProperties),this.ry=s(this,t.ks.ry,0,degToRads,this.dynamicProperties),this.rz=s(this,t.ks.rz,0,degToRads,this.dynamicProperties),this.mat=new Matrix,this._prevMat=new Matrix,this.firstFrame=!0}function _bv(){}function SliderEffect(t,e,r){this.p=_ai._bo(e,t.v,0,0,r)}function AngleEffect(t,e,r){this.p=_ai._bo(e,t.v,0,0,r)}function ColorEffect(t,e,r){this.p=_ai._bo(e,t.v,1,0,r)}function PointEffect(t,e,r){this.p=_ai._bo(e,t.v,1,0,r)}function LayerIndexEffect(t,e,r){this.p=_ai._bo(e,t.v,0,0,r)}function MaskIndexEffect(t,e,r){this.p=_ai._bo(e,t.v,0,0,r)}function CheckboxEffect(t,e,r){this.p=_ai._bo(e,t.v,0,0,r)}function NoValueEffect(){this.p={}}function EffectsManager(t,e,r){var s=t.ef||[];this.effectElements=[];var i,a,n=s.length;for(i=0;i<n;i++)a=new GroupEffect(s[i],e,r),this.effectElements.push(a)}function GroupEffect(t,e,r){this.dynamicProperties=[],this.init(t,e,this.dynamicProperties),this.dynamicProperties.length&&r.push(this)}function setLocationHref(t){locationHref=t}function play(t){animationManager.play(t)}function pause(t){animationManager.pause(t)}function togglePause(t){animationManager.togglePause(t)}function setSpeed(t,e){animationManager.setSpeed(t,e)}function setDirection(t,e){animationManager.setDirection(t,e)}function stop(t){animationManager.stop(t)}function moveFrame(t){animationManager.moveFrame(t)}function searchAnimations(){standalone===!0?animationManager.searchAnimations(animationData,standalone,renderer):animationManager.searchAnimations()}function registerAnimation(t){return animationManager.registerAnimation(t)}function resize(){animationManager.resize()}function goToAndStop(t,e,r){animationManager.goToAndStop(t,e,r)}function setSubframeRendering(t){subframeEnabled=t}function loadAnimation(t){return standalone===!0&&(t.animationData=JSON.parse(animationData)),animationManager.loadAnimation(t)}function destroy(t){return animationManager.destroy(t)}function setQuality(t){if("string"==typeof t)switch(t){case"high":defaultCurveSegments=200;break;case"medium":defaultCurveSegments=50;break;case"low":defaultCurveSegments=10}else!isNaN(t)&&t>1&&(defaultCurveSegments=t);roundValues(!(defaultCurveSegments>=50))}function inBrowser(){return"undefined"!=typeof navigator}function installPlugin(t,e){"expressions"===t&&(expressionsPlugin=e)}function getFactory(t){switch(t){case"propertyFactory":return _ai;case"shape_ai":return _ah;case"matrix":return Matrix}}function checkReady(){"complete"===document.readyState&&(clearInterval(readyStateCheckInterval),searchAnimations())}function getQueryVariable(t){for(var e=queryString.split("&"),r=0;r<e.length;r++){var s=e[r].split("=");if(decodeURIComponent(s[0])==t)return decodeURIComponent(s[1])}}var svgNS="http://www.w3.org/2000/svg",locationHref="",initialDefaultFrame=-999999,subframeEnabled=!0,expressionsPlugin,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,blitter=10,BMMath={};!function(){var t,e=Object.getOwnPropertyNames(Math),r=e.length;for(t=0;t<r;t+=1)BMMath[e[t]]=Math[e[t]]}(),BMMath.random=Math.random,BMMath.abs=function(t){var e=typeof t;if("object"===e&&t.length){var r,s=Array.apply(null,{length:t.length}),i=t.length;for(r=0;r<i;r+=1)s[r]=Math.abs(t[r]);return s}return Math.abs(t)};var defaultCurveSegments=150,degToRads=Math.PI/180,roundCorner=.5519;roundValues(!1);var rgbToHex=function(){var t,e,r=[];for(t=0;t<256;t+=1)e=t.toString(16),r[t]=1==e.length?"0"+e:e;return function(t,e,s){return t<0&&(t=0),e<0&&(e=0),s<0&&(s=0),"#"+r[t]+r[e]+r[s]}}(),createTypedArray=function(){function t(t,e){var r,s=0,i=[];switch(t){case"int16":
-case"uint8c":r=1;break;default:r=1.1}for(s=0;s<e;s+=1)i.push(r);return i}function e(t,e){return"float32"===t?new Float32Array(e):"int16"===t?new Int16Array(e):"uint8c"===t?new Uint8ClampedArray(e):void 0}return"function"==typeof Uint8ClampedArray&&"function"==typeof Float32Array?e:t}(),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=k(t),r=M(t);return this._t(e,-r,0,0,r,e,0,0,0,0,1,0,0,0,0,1)}function r(t){if(0===t)return this;var e=k(t),r=M(t);return this._t(1,0,0,0,0,e,-r,0,0,r,e,0,0,0,0,1)}function s(t){if(0===t)return this;var e=k(t),r=M(t);return this._t(e,0,r,0,0,1,0,0,-r,0,e,0,0,0,0,1)}function i(t){if(0===t)return this;var e=k(t),r=M(t);return this._t(e,-r,0,0,r,e,0,0,0,0,1,0,0,0,0,1)}function a(t,e){return this._t(1,e,t,1,0,0)}function n(t,e){return this.shear(T(t),T(e))}function o(t,e){var r=k(e),s=M(e);return this._t(r,s,0,0,-s,r,0,0,0,0,1,0,0,0,0,1)._t(1,0,0,0,T(t),1,0,0,0,0,1,0,0,0,0,1)._t(r,-s,0,0,s,r,0,0,0,0,1,0,0,0,0,1)}function h(t,e,r){return r=isNaN(r)?1:r,1==t&&1==e&&1==r?this:this._t(t,0,0,0,0,e,0,0,0,0,r,0,0,0,0,1)}function l(t,e,r,s,i,a,n,o,h,l,p,m,f,c,d,u){return this.props[0]=t,this.props[1]=e,this.props[2]=r,this.props[3]=s,this.props[4]=i,this.props[5]=a,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]=c,this.props[14]=d,this.props[15]=u,this}function p(t,e,r){return r=r||0,0!==t||0!==e||0!==r?this._t(1,0,0,0,0,1,0,0,0,0,1,0,t,e,r,1):this}function m(t,e,r,s,i,a,n,o,h,l,p,m,f,c,d,u){if(1===t&&0===e&&0===r&&0===s&&0===i&&1===a&&0===n&&0===o&&0===h&&0===l&&1===p&&0===m)return this.props[12]=this.props[12]*t+this.props[15]*f,this.props[13]=this.props[13]*a+this.props[15]*c,this.props[14]=this.props[14]*p+this.props[15]*d,this.props[15]=this.props[15]*u,this._identityCalculated=!1,this;var y=this.props[0],g=this.props[1],v=this.props[2],b=this.props[3],E=this.props[4],P=this.props[5],x=this.props[6],S=this.props[7],C=this.props[8],A=this.props[9],k=this.props[10],M=this.props[11],T=this.props[12],D=this.props[13],w=this.props[14],F=this.props[15];return this.props[0]=y*t+g*i+v*h+b*f,this.props[1]=y*e+g*a+v*l+b*c,this.props[2]=y*r+g*n+v*p+b*d,this.props[3]=y*s+g*o+v*m+b*u,this.props[4]=E*t+P*i+x*h+S*f,this.props[5]=E*e+P*a+x*l+S*c,this.props[6]=E*r+P*n+x*p+S*d,this.props[7]=E*s+P*o+x*m+S*u,this.props[8]=C*t+A*i+k*h+M*f,this.props[9]=C*e+A*a+k*l+M*c,this.props[10]=C*r+A*n+k*p+M*d,this.props[11]=C*s+A*o+k*m+M*u,this.props[12]=T*t+D*i+w*h+F*f,this.props[13]=T*e+D*a+w*l+F*c,this.props[14]=T*r+D*n+w*p+F*d,this.props[15]=T*s+D*o+w*m+F*u,this._identityCalculated=!1,this}function f(){return this._identityCalculated||(this._identity=!(1!==this.props[0]||0!==this.props[1]||0!==this.props[2]||0!==this.props[3]||0!==this.props[4]||1!==this.props[5]||0!==this.props[6]||0!==this.props[7]||0!==this.props[8]||0!==this.props[9]||1!==this.props[10]||0!==this.props[11]||0!==this.props[12]||0!==this.props[13]||0!==this.props[14]||1!==this.props[15]),this._identityCalculated=!0),this._identity}function c(t){for(var e=0;e<16;){if(t.props[e]!==this.props[e])return!1;e+=1}return!0}function d(t){var e;for(e=0;e<16;e+=1)t.props[e]=this.props[e]}function u(t){var e;for(e=0;e<16;e+=1)this.props[e]=t[e]}function y(t,e,r){return{x:t*this.props[0]+e*this.props[4]+r*this.props[8]+this.props[12],y:t*this.props[1]+e*this.props[5]+r*this.props[9]+this.props[13],z:t*this.props[2]+e*this.props[6]+r*this.props[10]+this.props[14]}}function g(t,e,r){return t*this.props[0]+e*this.props[4]+r*this.props[8]+this.props[12]}function v(t,e,r){return t*this.props[1]+e*this.props[5]+r*this.props[9]+this.props[13]}function b(t,e,r){return t*this.props[2]+e*this.props[6]+r*this.props[10]+this.props[14]}function E(t){var e=this.props[0]*this.props[5]-this.props[1]*this.props[4],r=this.props[5]/e,s=-this.props[1]/e,i=-this.props[4]/e,a=this.props[0]/e,n=(this.props[4]*this.props[13]-this.props[5]*this.props[12])/e,o=-(this.props[0]*this.props[13]-this.props[1]*this.props[12])/e;return[t[0]*r+t[1]*i+n,t[0]*s+t[1]*a+o,0]}function P(t){var e,r=t.length,s=[];for(e=0;e<r;e+=1)s[e]=E(t[e]);return s}function x(t,e,r,s){if(s&&2===s){var i=point_pool.newElement();return i[0]=t*this.props[0]+e*this.props[4]+r*this.props[8]+this.props[12],i[1]=t*this.props[1]+e*this.props[5]+r*this.props[9]+this.props[13],i}return[t*this.props[0]+e*this.props[4]+r*this.props[8]+this.props[12],t*this.props[1]+e*this.props[5]+r*this.props[9]+this.props[13],t*this.props[2]+e*this.props[6]+r*this.props[10]+this.props[14]]}function S(t,e){return this.isIdentity()?t+","+e:t*this.props[0]+e*this.props[4]+this.props[12]+","+(t*this.props[1]+e*this.props[5]+this.props[13])}function C(){for(var t=0,e=this.props,r="matrix3d(",s=1e4;t<16;)r+=D(e[t]*s)/s,r+=15===t?")":",",t+=1;return r}function A(){var t=1e4,e=this.props;return"matrix("+D(e[0]*t)/t+","+D(e[1]*t)/t+","+D(e[4]*t)/t+","+D(e[5]*t)/t+","+D(e[12]*t)/t+","+D(e[13]*t)/t+")"}var k=Math.cos,M=Math.sin,T=Math.tan,D=Math.round;return function(){this.reset=t,this.rotate=e,this.rotateX=r,this.rotateY=s,this.rotateZ=i,this.skew=n,this.skewFromAxis=o,this.shear=a,this.scale=h,this.setTransform=l,this.translate=p,this.transform=m,this.applyToPoint=y,this.applyToX=g,this.applyToY=v,this.applyToZ=b,this.applyToPointArray=x,this.applyToPointStringified=S,this.toCSS=C,this.to2dCSS=A,this.clone=d,this.cloneFromProps=u,this.equals=c,this.inversePoints=P,this.inversePoint=E,this._t=this.transform,this.isIdentity=f,this._identity=!0,this._identityCalculated=!1,this.props=createTypedArray("float32",16),this.reset()}}();!function(t,e){function r(r,l,p){var c=[];l=1==l?{entropy:!0}:l||{};var v=n(a(l.entropy?[r,h(t)]:null==r?o():r,3),c),b=new s(c),E=function(){for(var t=b.g(f),e=u,r=0;t<y;)t=(t+r)*m,e*=m,r=b.g(1);for(;t>=g;)t/=2,e/=2,r>>>=1;return(t+r)/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,r,s,a){return a&&(a.S&&i(a,b),t.state=function(){return i(b,{})}),s?(e[d]=t,r):t})(E,v,"global"in l?l.global:this==e,l.state)}function s(t){var e,r=t.length,s=this,i=0,a=s.i=s.j=0,n=s.S=[];for(r||(t=[r++]);i<m;)n[i]=i++;for(i=0;i<m;i++)n[i]=n[a=v&a+t[i%r]+(e=n[i])],n[a]=e;(s.g=function(t){for(var e,r=0,i=s.i,a=s.j,n=s.S;t--;)e=n[i=v&i+1],r=r*m+n[v&(n[i]=n[a=v&a+e])+(n[a]=e)];return s.i=i,s.j=a,r})(m)}function i(t,e){return e.i=t.i,e.j=t.j,e.S=t.S.slice(),e}function a(t,e){var r,s=[],i=typeof t;if(e&&"object"==i)for(r in t)try{s.push(a(t[r],e-1))}catch(n){}return s.length?s:"string"==i?t:t+"\0"}function n(t,e){for(var r,s=t+"",i=0;i<s.length;)e[v&i]=v&(r^=19*e[v&i])+s.charCodeAt(i++);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(r){var s=p.navigator,i=s&&s.plugins;return[+new Date,p,i,p.screen,h(t)]}}function h(t){return String.fromCharCode.apply(0,t)}var l,p=this,m=256,f=6,c=52,d="random",u=e.pow(m,f),y=e.pow(2,c),g=2*y,v=m-1;e["seed"+d]=r,n(e.random(),t)}([],BMMath);var BezierFactory=function(){function t(t,e,r,s,i){var a=i||("bez_"+t+"_"+e+"_"+r+"_"+s).replace(/\./g,"p");if(p[a])return p[a];var n=new h([t,e,r,s]);return p[a]=n,n}function e(t,e){return 1-3*e+3*t}function r(t,e){return 3*e-6*t}function s(t){return 3*t}function i(t,i,a){return((e(i,a)*t+r(i,a))*t+s(i))*t}function a(t,i,a){return 3*e(i,a)*t*t+2*r(i,a)*t+s(i)}function n(t,e,r,s,a){var n,o,h=0;do o=e+(r-e)/2,n=i(o,s,a)-t,n>0?r=o:e=o;while(Math.abs(n)>c&&++h<d);return o}function o(t,e,r,s){for(var n=0;n<m;++n){var o=a(e,r,s);if(0===o)return e;var h=i(e,r,s)-t;e-=h/o}return e}function h(t){this._p=t,this._mSampleValues=g?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,c=1e-7,d=10,u=11,y=1/(u-1),g="function"==typeof Float32Array;return h.prototype={get:function(t){var e=this._p[0],r=this._p[1],s=this._p[2],a=this._p[3];return this._precomputed||this._precompute(),e===r&&s===a?t:0===t?0:1===t?1:i(this._getTForX(t),r,a)},_precompute:function(){var t=this._p[0],e=this._p[1],r=this._p[2],s=this._p[3];this._precomputed=!0,t===e&&r===s||this._calcSampleValues()},_calcSampleValues:function(){for(var t=this._p[0],e=this._p[2],r=0;r<u;++r)this._mSampleValues[r]=i(r*y,t,e)},_getTForX:function(t){for(var e=this._p[0],r=this._p[2],s=this._mSampleValues,i=0,h=1,l=u-1;h!==l&&s[h]<=t;++h)i+=y;--h;var p=(t-s[h])/(s[h+1]-s[h]),m=i+p*y,c=a(m,e,r);return c>=f?o(t,m,e,r):0===c?m:n(t,i,i+y,e,r)}},l}();!function(){for(var t=0,e=["ms","moz","webkit","o"],r=0;r<e.length&&!window.requestAnimationFrame;++r)window.requestAnimationFrame=window[e[r]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[e[r]+"CancelAnimationFrame"]||window[e[r]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(e,r){var s=(new Date).getTime(),i=Math.max(0,16-(s-t)),a=setTimeout(function(){e(s+i)},i);return t=s+i,a}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)})}();var bez=bezFunction(),dataManager=dataFunctionManager(),FontManager=function(){function t(t,e){var r=createTag("span");r.style.fontFamily=e;var s=createTag("span");s.innerHTML="giItT1WQy@!-/#",r.style.position="absolute",r.style.left="-10000px",r.style.top="-10000px",r.style.fontSize="300px",r.style.fontVariant="normal",r.style.fontStyle="normal",r.style.fontWeight="normal",r.style.letterSpacing="0",r.appendChild(s),document.body.appendChild(r);var i=s.offsetWidth;return s.style.fontFamily=t+", "+e,{node:s,w:i,parent:r}}function e(){var t,r,s,i=this.fonts.length,a=i;for(t=0;t<i;t+=1)if(this.fonts[t].loaded)a-=1;else if("t"===this.fonts[t].fOrigin||2===this.fonts[t].origin){if(window.Typekit&&window.Typekit.load&&0===this.typekitLoaded){this.typekitLoaded=1;try{window.Typekit.load({async:!0,active:function(){this.typekitLoaded=2}.bind(this)})}catch(n){}}2===this.typekitLoaded&&(this.fonts[t].loaded=!0)}else"n"===this.fonts[t].fOrigin||0===this.fonts[t].origin?this.fonts[t].loaded=!0:(r=this.fonts[t].monoCase.node,s=this.fonts[t].monoCase.w,r.offsetWidth!==s?(a-=1,this.fonts[t].loaded=!0):(r=this.fonts[t].sansCase.node,s=this.fonts[t].sansCase.w,r.offsetWidth!==s&&(a-=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!==a&&Date.now()-this.initTime<h?setTimeout(e.bind(this),20):setTimeout(function(){this.loaded=!0}.bind(this),0)}function r(t,e){var r=createNS("text");r.style.fontSize="100px",r.style.fontFamily=e.fFamily,r.textContent="1",e.fClass?(r.style.fontFamily="inherit",r.className=e.fClass):r.style.fontFamily=e.fFamily,t.appendChild(r);var s=createTag("canvas").getContext("2d");return s.font="100px "+e.fFamily,s}function s(s,i){if(!s)return void(this.loaded=!0);if(this.chars)return this.loaded=!0,void(this.fonts=s.list);var a,n=s.list,o=n.length;for(a=0;a<o;a+=1){if(n[a].loaded=!1,n[a].monoCase=t(n[a].fFamily,"monospace"),n[a].sansCase=t(n[a].fFamily,"sans-serif"),n[a].fPath){if("p"===n[a].fOrigin||3===n[a].origin){var h=createTag("style");h.type="text/css",h.innerHTML="@font-face {font-family: "+n[a].fFamily+"; font-style: normal; src: url('"+n[a].fPath+"');}",i.appendChild(h)}else if("g"===n[a].fOrigin||1===n[a].origin){var l=createTag("link");l.type="text/css",l.rel="stylesheet",l.href=n[a].fPath,i.appendChild(l)}else if("t"===n[a].fOrigin||2===n[a].origin){var p=createTag("script");p.setAttribute("src",n[a].fPath),i.appendChild(p)}}else n[a].loaded=!0;n[a].helper=r(i,n[a]),this.fonts.push(n[a])}e.bind(this)()}function i(t){if(t){this.chars||(this.chars=[]);var e,r,s,i=t.length,a=this.chars.length;for(e=0;e<i;e+=1){for(r=0,s=!1;r<a;)this.chars[r].style===t[e].style&&this.chars[r].fFamily===t[e].fFamily&&this.chars[r].ch===t[e].ch&&(s=!0),r+=1;s||(this.chars.push(t[e]),a+=1)}}}function a(t,e,r){for(var s=0,i=this.chars.length;s<i;){if(this.chars[s].ch===t&&this.chars[s].style===e&&this.chars[s].fFamily===r)return this.chars[s];s+=1}return console&&console.warn&&console.warn("Missing character from exported characters list: ",t,e,r),l}function n(t,e,r){var s=this.getFontByName(e),i=s.helper;return i.measureText(t).width*r/100}function o(t){for(var e=0,r=this.fonts.length;e<r;){if(this.fonts[e].fName===t)return this.fonts[e];e+=1}return"sans-serif"}var h=5e3,l={w:0,size:0,shapes:[]},p=function(){this.fonts=[],this.chars=null,this.typekitLoaded=0,this.loaded=!1,this.initTime=Date.now()};return p.prototype.addChars=i,p.prototype.addFonts=s,p.prototype.getCharData=a,p.prototype.getFontByName=o,p.prototype.measureText=n,p}(),_ai=function(){function t(t,e,r){var s,i=this.offsetTime;"multidimensional"===this.propType&&(s=createTypedArray("float32",e.length));for(var a,n,o=r.lastIndex,h=o,l=this.keyframes.length-1,p=!0;p;){if(a=this.keyframes[h],n=this.keyframes[h+1],h==l-1&&t>=n.t-i){a.h&&(a=n),o=0;break}if(n.t-i>t){o=h;break}h<l-1?h+=1:(o=0,p=!1)}var m,f,c,d,u,y;if(a.to){a.bezierData||bez.buildBezierData(a);var g=a.bezierData;if(t>=n.t-i||t<a.t-i){var v=t>=n.t-i?g.points.length-1:0;for(f=g.points[v].point.length,m=0;m<f;m+=1)s[m]=g.points[v].point[m];r._lastBezierData=null}else{a.__fnct?y=a.__fnct:(y=BezierFactory.getBezierEasing(a.o.x,a.o.y,a.i.x,a.i.y,a.n).get,a.__fnct=y),c=y((t-(a.t-i))/(n.t-i-(a.t-i)));var b,E=g.segmentLength*c,P=r.lastFrame<t&&r._lastBezierData===g?r._lastAddedLength:0;for(u=r.lastFrame<t&&r._lastBezierData===g?r._lastPoint:0,p=!0,d=g.points.length;p;){if(P+=g.points[u].partialLength,0===E||0===c||u==g.points.length-1){for(f=g.points[u].point.length,m=0;m<f;m+=1)s[m]=g.points[u].point[m];break}if(E>=P&&E<P+g.points[u+1].partialLength){for(b=(E-P)/g.points[u+1].partialLength,f=g.points[u].point.length,m=0;m<f;m+=1)s[m]=g.points[u].point[m]+(g.points[u+1].point[m]-g.points[u].point[m])*b;break}u<d-1?u+=1:p=!1}r._lastPoint=u,r._lastAddedLength=P-g.points[u].partialLength,r._lastBezierData=g}}else{var x,S,C,A,k;for(l=a.s.length,h=0;h<l;h+=1){if(1!==a.h&&(t>=n.t-i?c=1:t<a.t-i?c=0:(a.o.x.constructor===Array?(a.__fnct||(a.__fnct=[]),a.__fnct[h]?y=a.__fnct[h]:(x=a.o.x[h]||a.o.x[0],S=a.o.y[h]||a.o.y[0],C=a.i.x[h]||a.i.x[0],A=a.i.y[h]||a.i.y[0],y=BezierFactory.getBezierEasing(x,S,C,A).get,a.__fnct[h]=y)):a.__fnct?y=a.__fnct:(x=a.o.x,S=a.o.y,C=a.i.x,A=a.i.y,y=BezierFactory.getBezierEasing(x,S,C,A).get,a.__fnct=y),c=y((t-(a.t-i))/(n.t-i-(a.t-i))))),this.sh&&1!==a.h){var M=a.s[h],T=a.e[h];M-T<-180?M+=360:M-T>180&&(M-=360),k=M+(T-M)*c}else k=1===a.h?a.s[h]:a.s[h]+(a.e[h]-a.s[h])*c;1===l?s=k:s[h]=k}}return r.lastIndex=o,s}function e(t){for(var e=0;e<this.v.length;)this.pv[e]=t[e],this.v[e]=this.mult?this.pv[e]*this.mult:this.pv[e],this.lastPValue[e]!==this.pv[e]&&(this.mdf=!0,this.lastPValue[e]=this.pv[e]),e+=1}function r(t){this.pv=t,this.v=this.mult?this.pv*this.mult:this.pv,this.lastPValue!=this.pv&&(this.mdf=!0,this.lastPValue=this.pv)}function s(){if(this.elem._x.frameId!==this.frameId){this.mdf=!1;var t=this.comp.renderedFrame-this.offsetTime,e=this.keyframes[0].t-this.offsetTime,r=this.keyframes[this.keyframes.length-1].t-this.offsetTime;if(!(t===this._caching.lastFrame||this._caching.lastFrame!==p&&(this._caching.lastFrame>=r&&t>=r||this._caching.lastFrame<e&&t<e))){this._caching.lastIndex=this._caching.lastFrame<t?this._caching.lastIndex:0;var s=this.interpolateValue(t,this.pv,this._caching);this.calculateValueAtCurrentTime(s)}this._caching.lastFrame=t,this.frameId=this.elem._x.frameId}}function i(){}function a(t,e,r){this.propType="unidimensional",this.mult=r,this.v=r?e.k*r:e.k,this.pv=e.k,this.mdf=!1,this.comp=t.comp,this.k=!1,this.kf=!1,this.vel=0,this.getValue=i}function n(t,e,r){this.propType="multidimensional",this.mult=r,this.data=e,this.mdf=!1,this.comp=t.comp,this.k=!1,this.kf=!1,this.frameId=-1,this.v=createTypedArray("float32",e.k.length),this.pv=createTypedArray("float32",e.k.length),this.lastValue=createTypedArray("float32",e.k.length);createTypedArray("float32",e.k.length);this.vel=createTypedArray("float32",e.k.length);var s,a=e.k.length;for(s=0;s<a;s+=1)this.v[s]=r?e.k[s]*r:e.k[s],this.pv[s]=e.k[s];this.getValue=i}function o(e,i,a){this.propType="unidimensional",this.keyframes=i.k,this.offsetTime=e.data.st,this.lastValue=p,this.lastPValue=p,this.frameId=-1,this._caching={lastFrame:p,lastIndex:0,value:0},this.k=!0,this.kf=!0,this.data=i,this.mult=a,this.elem=e,this.firstFrame=!1,this.comp=e.comp,this.v=a?i.k[0].s[0]*a:i.k[0].s[0],this.pv=i.k[0].s[0],this.getValue=s,this.calculateValueAtCurrentTime=r,this.interpolateValue=t}function h(r,i,a){this.propType="multidimensional";var n,o,h,l,m,f=i.k.length;for(n=0;n<f-1;n+=1)i.k[n].to&&i.k[n].s&&i.k[n].e&&(o=i.k[n].s,h=i.k[n].e,l=i.k[n].to,m=i.k[n].ti,(2===o.length&&(o[0]!==h[0]||o[1]!==h[1])&&bez.pointOnLine2D(o[0],o[1],h[0],h[1],o[0]+l[0],o[1]+l[1])&&bez.pointOnLine2D(o[0],o[1],h[0],h[1],h[0]+m[0],h[1]+m[1])||3===o.length&&(o[0]!==h[0]||o[1]!==h[1]||o[2]!==h[2])&&bez.pointOnLine3D(o[0],o[1],o[2],h[0],h[1],h[2],o[0]+l[0],o[1]+l[1],o[2]+l[2])&&bez.pointOnLine3D(o[0],o[1],o[2],h[0],h[1],h[2],h[0]+m[0],h[1]+m[1],h[2]+m[2]))&&(i.k[n].to=null,i.k[n].ti=null),o[0]===h[0]&&o[1]===h[1]&&0===l[0]&&0===l[1]&&0===m[0]&&0===m[1]&&(2===o.length||o[2]===h[2]&&0===l[2]&&0===m[2])&&(i.k[n].to=null,i.k[n].ti=null));this.keyframes=i.k,this.offsetTime=r.data.st,this.k=!0,this.kf=!0,this.firstFrame=!0,this.mult=a,this.elem=r,this.comp=r.comp,this.getValue=s,this.calculateValueAtCurrentTime=e,this.interpolateValue=t,this.frameId=-1;var c=i.k[0].s.length;this.v=createTypedArray("float32",c),this.pv=createTypedArray("float32",c),this.lastValue=createTypedArray("float32",c),this.lastPValue=createTypedArray("float32",c),this._caching={lastFrame:p,lastIndex:0,value:createTypedArray("float32",c)}}function l(t,e,r,s,i){var l;if(0===e.a)l=0===r?new a(t,e,s):new n(t,e,s);else if(1===e.a)l=0===r?new o(t,e,s):new h(t,e,s);else if(e.k.length)if("number"==typeof e.k[0])l=new n(t,e,s);else switch(r){case 0:l=new o(t,e,s);break;case 1:l=new h(t,e,s)}else l=new a(t,e,s);return l.k&&i.push(l),l}var p=initialDefaultFrame,m={_bo:l};return m}(),_ag=function(){function t(t){var e,r=this.dynamicProperties.length;for(e=0;e<r;e+=1)this.dynamicProperties[e].getValue(),this.dynamicProperties[e].mdf&&(this.mdf=!0);this.a&&t.translate(-this.a.v[0],-this.a.v[1],this.a.v[2]),this.s&&t.scale(this.s.v[0],this.s.v[1],this.s.v[2]),this.r?t.rotate(-this.r.v):t.rotateZ(-this.rz.v).rotateY(this.ry.v).rotateX(this.rx.v).rotateZ(-this.or.v[2]).rotateY(this.or.v[1]).rotateX(this.or.v[0]),this.data.p.s?this.data.p.z?t.translate(this.px.v,this.py.v,-this.pz.v):t.translate(this.px.v,this.py.v,0):t.translate(this.p.v[0],this.p.v[1],-this.p.v[2])}function e(t){if(this.elem._x.frameId!==this.frameId){this.mdf=t;var e,r=this.dynamicProperties.length;for(e=0;e<r;e+=1)this.dynamicProperties[e].getValue(),this.dynamicProperties[e].mdf&&(this.mdf=!0);if(this.mdf){if(this.v.reset(),this.a&&this.v.translate(-this.a.v[0],-this.a.v[1],this.a.v[2]),this.s&&this.v.scale(this.s.v[0],this.s.v[1],this.s.v[2]),this.sk&&this.v.skewFromAxis(-this.sk.v,this.sa.v),this.r?this.v.rotate(-this.r.v):this.v.rotateZ(-this.rz.v).rotateY(this.ry.v).rotateX(this.rx.v).rotateZ(-this.or.v[2]).rotateY(this.or.v[1]).rotateX(this.or.v[0]),this.autoOriented&&this.p.keyframes&&this.p.getValueAtTime){var s,i;this.p._caching.lastFrame+this.p.offsetTime<=this.p.keyframes[0].t?(s=this.p.getValueAtTime((this.p.keyframes[0].t+.01)/this.elem._x.frameRate,0),i=this.p.getValueAtTime(this.p.keyframes[0].t/this.elem._x.frameRate,0)):this.p._caching.lastFrame+this.p.offsetTime>=this.p.keyframes[this.p.keyframes.length-1].t?(s=this.p.getValueAtTime(this.p.keyframes[this.p.keyframes.length-1].t/this.elem._x.frameRate,0),i=this.p.getValueAtTime((this.p.keyframes[this.p.keyframes.length-1].t-.01)/this.elem._x.frameRate,0)):(s=this.p.pv,i=this.p.getValueAtTime((this.p._caching.lastFrame+this.p.offsetTime-.01)/this.elem._x.frameRate,this.p.offsetTime)),this.v.rotate(-Math.atan2(s[1]-i[1],s[0]-i[0]))}this.data.p.s?this.data.p.z?this.v.translate(this.px.v,this.py.v,-this.pz.v):this.v.translate(this.px.v,this.py.v,0):this.v.translate(this.p.v[0],this.p.v[1],-this.p.v[2])}this.frameId=this.elem._x.frameId}}function r(){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]))}function s(){}function i(t,e,r){if(this.elem=t,this.frameId=-1,this.propType="transform",this.dynamicProperties=[],this.mdf=!1,this.data=e,this.v=new Matrix,e.p.s?(this.px=_ai._bo(t,e.p.x,0,0,this.dynamicProperties),this.py=_ai._bo(t,e.p.y,0,0,this.dynamicProperties),e.p.z&&(this.pz=_ai._bo(t,e.p.z,0,0,this.dynamicProperties))):this.p=_ai._bo(t,e.p,1,0,this.dynamicProperties),e.r)this.r=_ai._bo(t,e.r,0,degToRads,this.dynamicProperties);else if(e.rx){if(this.rx=_ai._bo(t,e.rx,0,degToRads,this.dynamicProperties),this.ry=_ai._bo(t,e.ry,0,degToRads,this.dynamicProperties),this.rz=_ai._bo(t,e.rz,0,degToRads,this.dynamicProperties),e.or.k[0].ti){var s,i=e.or.k.length;for(s=0;s<i;s+=1)e.or.k[s].to=e.or.k[s].ti=null}this.or=_ai._bo(t,e.or,1,degToRads,this.dynamicProperties),this.or.sh=!0}e.sk&&(this.sk=_ai._bo(t,e.sk,0,degToRads,this.dynamicProperties),this.sa=_ai._bo(t,e.sa,0,degToRads,this.dynamicProperties)),e.a&&(this.a=_ai._bo(t,e.a,1,0,this.dynamicProperties)),e.s&&(this.s=_ai._bo(t,e.s,1,.01,this.dynamicProperties)),e.o?this.o=_ai._bo(t,e.o,0,.01,r):this.o={mdf:!1,v:1},this.dynamicProperties.length?r.push(this):this.getValue(!0)}function a(t,e,r){return new i(t,e,r)}return i.prototype.applyToMatrix=t,i.prototype.getValue=e,i.prototype.setInverted=r,i.prototype.autoOrient=s,{_bj:a}}();_av.prototype.setPathData=function(t,e){this.c=t,this.setLength(e);for(var r=0;r<e;)this.v[r]=point_pool.newElement(),this.o[r]=point_pool.newElement(),this.i[r]=point_pool.newElement(),r+=1},_av.prototype.setLength=function(t){for(;this._maxLength<t;)this.doubleArrayLength();this._length=t},_av.prototype.doubleArrayLength=function(){this.v=this.v.concat(Array.apply(null,{length:this._maxLength})),this.i=this.i.concat(Array.apply(null,{length:this._maxLength})),this.o=this.o.concat(Array.apply(null,{length:this._maxLength})),this._maxLength*=2},_av.prototype._ax=function(t,e,r,s,i){var a;switch(this._length=Math.max(this._length,s+1),this._length>=this._maxLength&&this.doubleArrayLength(),r){case"v":a=this.v;break;case"i":a=this.i;break;case"o":a=this.o}(!a[s]||a[s]&&!i)&&(a[s]=point_pool.newElement()),a[s][0]=t,a[s][1]=e},_av.prototype._aw=function(t,e,r,s,i,a,n,o){this._ax(t,e,"v",n,o),this._ax(r,s,"o",n,o),this._ax(i,a,"i",n,o)},_av.prototype.reverse=function(){var t=new _av;t.setPathData(this.c,this._length);var e=this.v,r=this.o,s=this.i,a=0;this.c&&(t._aw(e[0][0],e[0][1],s[0][0],s[0][1],r[0][0],r[0][1],0,!1),a=1);var n=this._length-1,o=this._length;for(i=a;i<o;i+=1)t._aw(e[n][0],e[n][1],s[n][0],s[n][1],r[n][0],r[n][1],i,!1),n-=1;return t};var _ah=function(){function t(t,e,r,s){var i,a,n,o=s.lastIndex;if(t<this.keyframes[0].t-this.offsetTime)i=this.keyframes[0].s[0],n=!0,o=0;else if(t>=this.keyframes[this.keyframes.length-1].t-this.offsetTime)i=1===this.keyframes[this.keyframes.length-2].h?this.keyframes[this.keyframes.length-1].s[0]:this.keyframes[this.keyframes.length-2].e[0],n=!0;else{for(var h,l,p,m,f,c,d=o,u=this.keyframes.length-1,y=!0;y&&(h=this.keyframes[d],l=this.keyframes[d+1],!(l.t-this.offsetTime>t));)d<u-1?d+=1:y=!1;n=1===h.h,o=d;var g;if(!n){if(t>=l.t-this.offsetTime)g=1;else if(t<h.t-this.offsetTime)g=0;else{var v;h.__fnct?v=h.__fnct:(v=BezierFactory.getBezierEasing(h.o.x,h.o.y,h.i.x,h.i.y).get,h.__fnct=v),g=v((t-(h.t-this.offsetTime))/(l.t-this.offsetTime-(h.t-this.offsetTime)))}a=h.e[0]}i=h.s[0]}m=e._length,c=i.i[0].length;var b,E=!1;s.lastIndex=o;var p,f,b,m=e._length,c=i.i[0].length,E=!1;for(p=0;p<m;p+=1)for(f=0;f<c;f+=1)b=n?i.i[p][f]:i.i[p][f]+(a.i[p][f]-i.i[p][f])*g,e.i[p][f]!==b&&(e.i[p][f]=b,r&&(this.pv.i[p][f]=b),E=!0),b=n?i.o[p][f]:i.o[p][f]+(a.o[p][f]-i.o[p][f])*g,e.o[p][f]!==b&&(e.o[p][f]=b,r&&(this.pv.o[p][f]=b),E=!0),b=n?i.v[p][f]:i.v[p][f]+(a.v[p][f]-i.v[p][f])*g,e.v[p][f]!==b&&(e.v[p][f]=b,r&&(this.pv.v[p][f]=b),E=!0);return E}function e(){if(this.elem._x.frameId!==this.frameId){this.mdf=!1;var t=this.comp.renderedFrame-this.offsetTime,e=this.keyframes[0].t-this.offsetTime,r=this.keyframes[this.keyframes.length-1].t-this.offsetTime,s=this._caching.lastFrame;if(s===l||!(s<e&&t<e||s>r&&t>r)){this._caching.lastIndex=s<t?this._caching.lastIndex:0;var i=this.interpolateShape(t,this.v,!0,this._caching);this.mdf=i,i&&(this.paths=this._ak)}this._caching.lastFrame=t,this.frameId=this.elem._x.frameId}}function r(){return this.v}function s(){this.paths=this._ak,this.k||(this.mdf=!1)}function i(t,e,r){this.propType="shape",this.comp=t.comp,this.k=!1,this.mdf=!1;var i=3===r?e.pt.k:e.ks.k;this.v=shape_pool.clone(i),this.pv=shape_pool.clone(this.v),this._ak=shapeCollection_pool._al(),this.paths=this._ak,this.paths.addShape(this.v),this.reset=s}function a(t,e,r){this.propType="shape",this.comp=t.comp,this.elem=t,this.offsetTime=t.data.st,this.keyframes=3===r?e.pt.k:e.ks.k,this.k=!0,this.kf=!0;var i=this.keyframes[0].s[0].i.length;this.keyframes[0].s[0].i[0].length;this.v=shape_pool.newElement(),this.v.setPathData(this.keyframes[0].s[0].c,i),this.pv=shape_pool.clone(this.v),this._ak=shapeCollection_pool._al(),this.paths=this._ak,this.paths.addShape(this.v),this.lastFrame=l,this.reset=s,this._caching={lastFrame:l,lastIndex:0}}function n(t,e,r,s){var n;if(3===r||4===r){var o=3===r?e.pt:e.ks,h=o.k;n=1===o.a||h.length?new a(t,e,r):new i(t,e,r)}else 5===r?n=new f(t,e):6===r?n=new p(t,e):7===r&&(n=new m(t,e));return n.k&&s.push(n),n}function o(){return i}function h(){return a}var l=-999999;i.prototype.interpolateShape=t,i.prototype.getValue=r,a.prototype.getValue=e,a.prototype.interpolateShape=t;var p=function(){function t(){var t=this.p.v[0],e=this.p.v[1],s=this.s.v[0]/2,i=this.s.v[1]/2,a=3!==this.d,n=this.v;3!==this.d&&(n.v[0][0]=t,n.v[0][1]=e-i,n.v[1][0]=a?t+s:t-s,n.v[1][1]=e,n.v[2][0]=t,n.v[2][1]=e+i,n.v[3][0]=a?t-s:t+s,n.v[3][1]=e,n.i[0][0]=a?t-s*r:t+s*r,n.i[0][1]=e-i,n.i[1][0]=a?t+s:t-s,n.i[1][1]=e-i*r,n.i[2][0]=a?t+s*r:t-s*r,n.i[2][1]=e+i,n.i[3][0]=a?t-s:t+s,n.i[3][1]=e+i*r,n.o[0][0]=a?t+s*r:t-s*r,n.o[0][1]=e-i,n.o[1][0]=a?t+s:t-s,n.o[1][1]=e+i*r,n.o[2][0]=a?t-s*r:t+s*r,n.o[2][1]=e+i,n.o[3][0]=a?t-s:t+s,n.o[3][1]=e-i*r)}function e(t){var e,r=this.dynamicProperties.length;if(this.elem._x.frameId!==this.frameId){for(this.mdf=!1,this.frameId=this.elem._x.frameId,e=0;e<r;e+=1)this.dynamicProperties[e].getValue(t),this.dynamicProperties[e].mdf&&(this.mdf=!0);this.mdf&&this.convertEllToPath()}}var r=roundCorner;return function(r,i){this.v=shape_pool.newElement(),this.v.setPathData(!0,4),this._ak=shapeCollection_pool._al(),this.paths=this._ak,this._ak.addShape(this.v),this.d=i.d,this.dynamicProperties=[],this.elem=r,this.comp=r.comp,this.frameId=-1,this.mdf=!1,this.getValue=e,this.convertEllToPath=t,this.reset=s,this.p=_ai._bo(r,i.p,1,0,this.dynamicProperties),this.s=_ai._bo(r,i.s,1,0,this.dynamicProperties),this.dynamicProperties.length?this.k=!0:this.convertEllToPath()}}(),m=function(){function t(){var t,e=Math.floor(this.pt.v),r=2*Math.PI/e,s=this.or.v,i=this.os.v,a=2*Math.PI*s/(4*e),n=-Math.PI/2,o=3===this.data.d?-1:1;for(n+=this.r.v,this.v._length=0,t=0;t<e;t+=1){var h=s*Math.cos(n),l=s*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._aw(h,l,h-p*a*i*o,l-m*a*i*o,h+p*a*i*o,l+m*a*i*o,t,!0),n+=r*o}this.paths.length=0,this.paths[0]=this.v}function e(){var t,e,r,s,i=2*Math.floor(this.pt.v),a=2*Math.PI/i,n=!0,o=this.or.v,h=this.ir.v,l=this.os.v,p=this.is.v,m=2*Math.PI*o/(2*i),f=2*Math.PI*h/(2*i),c=-Math.PI/2;c+=this.r.v;var d=3===this.data.d?-1:1;for(this.v._length=0,t=0;t<i;t+=1){e=n?o:h,r=n?l:p,s=n?m:f;var u=e*Math.cos(c),y=e*Math.sin(c),g=0===u&&0===y?0:y/Math.sqrt(u*u+y*y),v=0===u&&0===y?0:-u/Math.sqrt(u*u+y*y);u+=+this.p.v[0],y+=+this.p.v[1],this.v._aw(u,y,u-g*s*r*d,y-v*s*r*d,u+g*s*r*d,y+v*s*r*d,t,!0),n=!n,c+=a*d}}function r(){if(this.elem._x.frameId!==this.frameId){this.mdf=!1,this.frameId=this.elem._x.frameId;var t,e=this.dynamicProperties.length;for(t=0;t<e;t+=1)this.dynamicProperties[t].getValue(),this.dynamicProperties[t].mdf&&(this.mdf=!0);this.mdf&&this.convertToPath()}}return function(i,a){this.v=shape_pool.newElement(),this.v.setPathData(!0,0),this.elem=i,this.comp=i.comp,this.data=a,this.frameId=-1,this.d=a.d,this.dynamicProperties=[],this.mdf=!1,this.getValue=r,this.reset=s,1===a.sy?(this.ir=_ai._bo(i,a.ir,0,0,this.dynamicProperties),this.is=_ai._bo(i,a.is,0,.01,this.dynamicProperties),this.convertToPath=e):this.convertToPath=t,this.pt=_ai._bo(i,a.pt,0,0,this.dynamicProperties),this.p=_ai._bo(i,a.p,1,0,this.dynamicProperties),this.r=_ai._bo(i,a.r,0,degToRads,this.dynamicProperties),this.or=_ai._bo(i,a.or,0,0,this.dynamicProperties),this.os=_ai._bo(i,a.os,0,.01,this.dynamicProperties),this._ak=shapeCollection_pool._al(),this._ak.addShape(this.v),this.paths=this._ak,this.dynamicProperties.length?this.k=!0:this.convertToPath()}}(),f=function(){function t(t){if(this.elem._x.frameId!==this.frameId){this.mdf=!1,this.frameId=this.elem._x.frameId;var e,r=this.dynamicProperties.length;for(e=0;e<r;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],r=this.s.v[0]/2,s=this.s.v[1]/2,i=bm_min(r,s,this.r.v),a=i*(1-roundCorner);this.v._length=0,2===this.d||1===this.d?(this.v._aw(t+r,e-s+i,t+r,e-s+i,t+r,e-s+a,0,!0),this.v._aw(t+r,e+s-i,t+r,e+s-a,t+r,e+s-i,1,!0),0!==i?(this.v._aw(t+r-i,e+s,t+r-i,e+s,t+r-a,e+s,2,!0),this.v._aw(t-r+i,e+s,t-r+a,e+s,t-r+i,e+s,3,!0),this.v._aw(t-r,e+s-i,t-r,e+s-i,t-r,e+s-a,4,!0),this.v._aw(t-r,e-s+i,t-r,e-s+a,t-r,e-s+i,5,!0),this.v._aw(t-r+i,e-s,t-r+i,e-s,t-r+a,e-s,6,!0),this.v._aw(t+r-i,e-s,t+r-a,e-s,t+r-i,e-s,7,!0)):(this.v._aw(t-r,e+s,t-r+a,e+s,t-r,e+s,2),this.v._aw(t-r,e-s,t-r,e-s+a,t-r,e-s,3))):(this.v._aw(t+r,e-s+i,t+r,e-s+a,t+r,e-s+i,0,!0),0!==i?(this.v._aw(t+r-i,e-s,t+r-i,e-s,t+r-a,e-s,1,!0),this.v._aw(t-r+i,e-s,t-r+a,e-s,t-r+i,e-s,2,!0),this.v._aw(t-r,e-s+i,t-r,e-s+i,t-r,e-s+a,3,!0),this.v._aw(t-r,e+s-i,t-r,e+s-a,t-r,e+s-i,4,!0),this.v._aw(t-r+i,e+s,t-r+i,e+s,t-r+a,e+s,5,!0),
-this.v._aw(t+r-i,e+s,t+r-a,e+s,t+r-i,e+s,6,!0),this.v._aw(t+r,e+s-i,t+r,e+s-i,t+r,e+s-a,7,!0)):(this.v._aw(t-r,e-s,t-r+a,e-s,t-r,e-s,1,!0),this.v._aw(t-r,e+s,t-r,e+s-a,t-r,e+s,2,!0),this.v._aw(t+r,e+s,t+r-a,e+s,t+r,e+s,3,!0)))}return function(r,i){this.v=shape_pool.newElement(),this.v.c=!0,this._ak=shapeCollection_pool._al(),this._ak.addShape(this.v),this.paths=this._ak,this.elem=r,this.comp=r.comp,this.frameId=-1,this.d=i.d,this.dynamicProperties=[],this.mdf=!1,this.getValue=t,this.convertRectToPath=e,this.reset=s,this.p=_ai._bo(r,i.p,1,0,this.dynamicProperties),this.s=_ai._bo(r,i.s,1,0,this.dynamicProperties),this.r=_ai._bo(r,i.r,0,0,this.dynamicProperties),this.dynamicProperties.length?this.k=!0:this.convertRectToPath()}}(),c={};return c._bp=n,c.getConstructorFunction=o,c.getKeyframedConstructorFunction=h,c}(),_as=function(){function t(t,e){s[t]||(s[t]=e)}function e(t,e,r,i){return new s[t](e,r,i)}var r={},s={};return r.registerModifier=t,r.getModifier=e,r}();_at.prototype.initModifierProperties=function(){},_at.prototype.addShapeToModifier=function(){},_at.prototype.addShape=function(t){if(!this.closed){var e={shape:t.sh,data:t,_ak:shapeCollection_pool._al()};this.shapes.push(e),this.addShapeToModifier(e)}},_at.prototype.init=function(t,e,r){this.dynamicProperties=[],this.shapes=[],this.elem=t,this.initModifierProperties(t,e),this.frameId=initialDefaultFrame,this.mdf=!1,this.closed=!1,this.k=!1,this.dynamicProperties.length?(this.k=!0,r.push(this)):this.getValue(!0)},extendPrototype([_at],_an),_an.prototype.processKeys=function(t){if(this.elem._x.frameId!==this.frameId||t){this.mdf=t,this.frameId=this.elem._x.frameId;var e,r=this.dynamicProperties.length;for(e=0;e<r;e+=1)this.dynamicProperties[e].getValue(),this.dynamicProperties[e].mdf&&(this.mdf=!0);if(this.mdf||t){var s=this.o.v%360/360;s<0&&(s+=1);var i=this.s.v+s,a=this.e.v+s;if(i>a){var n=i;i=a,a=n}this.sValue=i,this.eValue=a,this.oValue=s}}},_an.prototype.initModifierProperties=function(t,e){this.s=_ai._bo(t,e.s,0,.01,this.dynamicProperties),this.e=_ai._bo(t,e.e,0,.01,this.dynamicProperties),this.o=_ai._bo(t,e.o,0,0,this.dynamicProperties),this.sValue=0,this.eValue=0,this.oValue=0,this.getValue=this.processKeys,this.m=e.m},_an.prototype.addShapeToModifier=function(t){t.pathsData=[]},_an.prototype.calculateShapeEdges=function(t,e,r,s,i){var a=[];e<=1?a.push({s:t,e:e}):t>=1?a.push({s:t-1,e:e-1}):(a.push({s:t,e:1}),a.push({s:0,e:e-1}));var n,o,h=[],l=a.length;for(n=0;n<l;n+=1)if(o=a[n],o.e*i<s||o.s*i>s+r);else{var p,m;p=o.s*i<=s?0:(o.s*i-s)/r,m=o.e*i>=s+r?1:(o.e*i-s)/r,h.push([p,m])}return h.length||h.push([0,0]),h},_an.prototype.releasePathsData=function(t){var e,r=t.length;for(e=0;e<r;e+=1)segments_length_pool.release(t[e]);return t.length=0,t},_an.prototype.processShapes=function(t){var e,r,s,i,a,n,o,h=this.shapes.length,l=this.sValue,p=this.eValue,m=0;if(p===l)for(r=0;r<h;r+=1)this.shapes[r]._ak.releaseShapes(),this.shapes[r].shape.mdf=!0,this.shapes[r].shape.paths=this.shapes[r]._ak;else if(1===p&&0===l||0===p&&1===l){if(this.mdf)for(r=0;r<h;r+=1)this.shapes[r].shape.mdf=!0}else{var f,c,d=[];for(r=0;r<h;r+=1)if(f=this.shapes[r],f.shape.mdf||this.mdf||t||2===this.m){if(e=f.shape.paths,i=e._length,o=0,!f.shape.mdf&&f.pathsData.length)o=f.totalShapeLength;else{for(a=this.releasePathsData(f.pathsData),s=0;s<i;s+=1)n=bez.getSegmentsLength(e.shapes[s]),a.push(n),o+=n.totalLength;f.totalShapeLength=o,f.pathsData=a}m+=o,f.shape.mdf=!0}else f.shape.paths=f._ak;var s,i,u=l,y=p,g=0;for(r=h-1;r>=0;r-=1)if(f=this.shapes[r],f.shape.mdf){if(c=f._ak,c.releaseShapes(),2===this.m&&h>1){var v=this.calculateShapeEdges(l,p,f.totalShapeLength,g,m);g+=f.totalShapeLength}else v=[[u,y]];for(i=v.length,s=0;s<i;s+=1){u=v[s][0],y=v[s][1],d.length=0,y<=1?d.push({s:f.totalShapeLength*u,e:f.totalShapeLength*y}):u>=1?d.push({s:f.totalShapeLength*(u-1),e:f.totalShapeLength*(y-1)}):(d.push({s:f.totalShapeLength*u,e:f.totalShapeLength}),d.push({s:0,e:f.totalShapeLength*(y-1)}));var b=this.addShapes(f,d[0]);if(d[0].s!==d[0].e){if(d.length>1)if(f.shape.v.c){var E=b.pop();this.addPaths(b,c),b=this.addShapes(f,d[1],E)}else this.addPaths(b,c),b=this.addShapes(f,d[1]);this.addPaths(b,c)}}f.shape.paths=c}}this.dynamicProperties.length||(this.mdf=!1)},_an.prototype.addPaths=function(t,e){var r,s=t.length;for(r=0;r<s;r+=1)e.addShape(t[r])},_an.prototype.addSegment=function(t,e,r,s,i,a,n){i._ax(e[0],e[1],"o",a),i._ax(r[0],r[1],"i",a+1),n&&i._ax(t[0],t[1],"v",a),i._ax(s[0],s[1],"v",a+1)},_an.prototype.addSegmentFromArray=function(t,e,r,s){e._ax(t[1],t[5],"o",r),e._ax(t[2],t[6],"i",r+1),s&&e._ax(t[0],t[4],"v",r),e._ax(t[3],t[7],"v",r+1)},_an.prototype.addShapes=function(t,e,r){var s,i,a,n,o,h,l,p,m=t.pathsData,f=t.shape.paths.shapes,c=t.shape.paths._length,d=0,u=[],y=!0;for(r?(o=r._length,p=r._length):(r=shape_pool.newElement(),o=0,p=0),u.push(r),s=0;s<c;s+=1){for(h=m[s].lengths,r.c=f[s].c,a=f[s].c?h.length:h.length+1,i=1;i<a;i+=1)if(n=h[i-1],d+n.addedLength<e.s)d+=n.addedLength,r.c=!1;else{if(d>e.e){r.c=!1;break}e.s<=d&&e.e>=d+n.addedLength?(this.addSegment(f[s].v[i-1],f[s].o[i-1],f[s].i[i],f[s].v[i],r,o,y),y=!1):(l=bez.getNewSegment(f[s].v[i-1],f[s].v[i],f[s].o[i-1],f[s].i[i],(e.s-d)/n.addedLength,(e.e-d)/n.addedLength,h[i-1]),this.addSegmentFromArray(l,r,o,y),y=!1,r.c=!1),d+=n.addedLength,o+=1}if(f[s].c){if(n=h[i-1],d<=e.e){var g=h[i-1].addedLength;e.s<=d&&e.e>=d+g?(this.addSegment(f[s].v[i-1],f[s].o[i-1],f[s].i[0],f[s].v[0],r,o,y),y=!1):(l=bez.getNewSegment(f[s].v[i-1],f[s].v[0],f[s].o[i-1],f[s].i[0],(e.s-d)/g,(e.e-d)/g,h[i-1]),this.addSegmentFromArray(l,r,o,y),y=!1,r.c=!1)}else r.c=!1;d+=n.addedLength,o+=1}if(r._length&&(r._ax(r.v[p][0],r.v[p][1],"i",p),r._ax(r.v[r._length-1][0],r.v[r._length-1][1],"o",r._length-1)),d>e.e)break;s<c-1&&(r=shape_pool.newElement(),y=!0,u.push(r),o=0)}return u},_as.registerModifier("tm",_an),extendPrototype([_at],_au),_au.prototype.processKeys=function(t){if(this.elem._x.frameId!==this.frameId||t){this.mdf=!!t,this.frameId=this.elem._x.frameId;var e,r=this.dynamicProperties.length;for(e=0;e<r;e+=1)this.dynamicProperties[e].getValue(),this.dynamicProperties[e].mdf&&(this.mdf=!0)}},_au.prototype.initModifierProperties=function(t,e){this.getValue=this.processKeys,this.rd=_ai._bo(t,e.r,0,null,this.dynamicProperties)},_au.prototype.processPath=function(t,e){var r=shape_pool.newElement();r.c=t.c;var s,i,a,n,o,h,l,p,m,f,c,d,u,y=t._length,g=0;for(s=0;s<y;s+=1)i=t.v[s],n=t.o[s],a=t.i[s],i[0]===n[0]&&i[1]===n[1]&&i[0]===a[0]&&i[1]===a[1]?0!==s&&s!==y-1||t.c?(o=0===s?t.v[y-1]:t.v[s-1],h=Math.sqrt(Math.pow(i[0]-o[0],2)+Math.pow(i[1]-o[1],2)),l=h?Math.min(h/2,e)/h:0,p=d=i[0]+(o[0]-i[0])*l,m=u=i[1]-(i[1]-o[1])*l,f=p-(p-i[0])*roundCorner,c=m-(m-i[1])*roundCorner,r._aw(p,m,f,c,d,u,g),g+=1,o=s===y-1?t.v[0]:t.v[s+1],h=Math.sqrt(Math.pow(i[0]-o[0],2)+Math.pow(i[1]-o[1],2)),l=h?Math.min(h/2,e)/h:0,p=f=i[0]+(o[0]-i[0])*l,m=c=i[1]+(o[1]-i[1])*l,d=p-(p-i[0])*roundCorner,u=m-(m-i[1])*roundCorner,r._aw(p,m,f,c,d,u,g),g+=1):(r._aw(i[0],i[1],n[0],n[1],a[0],a[1],g),g+=1):(r._aw(t.v[s][0],t.v[s][1],t.o[s][0],t.o[s][1],t.i[s][0],t.i[s][1],g),g+=1);return r},_au.prototype.processShapes=function(t){var e,r,s,i,a=this.shapes.length,n=this.rd.v;if(0!==n){var o,h,l;for(r=0;r<a;r+=1){if(o=this.shapes[r],h=o.shape.paths,l=o._ak,o.shape.mdf||this.mdf||t)for(l.releaseShapes(),o.shape.mdf=!0,e=o.shape.paths.shapes,i=o.shape.paths._length,s=0;s<i;s+=1)l.addShape(this.processPath(e[s],n));o.shape.paths=o._ak}}this.dynamicProperties.length||(this.mdf=!1)},_as.registerModifier("rd",_au),_aj.prototype.processKeys=function(t){if(this.elem._x.frameId!==this.frameId||t){this.mdf=!!t;var e,r=this.dynamicProperties.length;for(e=0;e<r;e+=1)this.dynamicProperties[e].getValue(),this.dynamicProperties[e].mdf&&(this.mdf=!0)}},_aj.prototype.initModifierProperties=function(t,e){this.getValue=this.processKeys,this.c=_ai._bo(t,e.c,0,null,this.dynamicProperties),this.o=_ai._bo(t,e.o,0,null,this.dynamicProperties),this.tr=_ag._bj(t,e.tr,this.dynamicProperties),this.data=e,this.dynamicProperties.length||this.getValue(!0),this.pMatrix=new Matrix,this.rMatrix=new Matrix,this.sMatrix=new Matrix,this.tMatrix=new Matrix,this.matrix=new Matrix},_aj.prototype.applyTransforms=function(t,e,r,s,i,a){var n=a?-1:1,o=s.s.v[0]+(1-s.s.v[0])*(1-i),h=s.s.v[1]+(1-s.s.v[1])*(1-i);t.translate(s.p.v[0]*n*i,s.p.v[1]*n*i,s.p.v[2]),e.translate(-s.a.v[0],-s.a.v[1],s.a.v[2]),e.rotate(-s.r.v*n*i),e.translate(s.a.v[0],s.a.v[1],s.a.v[2]),r.translate(-s.a.v[0],-s.a.v[1],s.a.v[2]),r.scale(a?1/o:o,a?1/h:h),r.translate(s.a.v[0],s.a.v[1],s.a.v[2])},_aj.prototype.init=function(t,e,r,s,i){this.elem=t,this.arr=e,this.pos=r,this.elemsData=s,this._currentCopies=0,this._bq=[],this._groups=[],this.dynamicProperties=[],this.frameId=-1,this.initModifierProperties(t,e[r]);for(var a=0;r>0;)r-=1,this._bq.unshift(e[r]),a+=1;this.dynamicProperties.length?(this.k=!0,i.push(this)):this.getValue(!0)},_aj.prototype.resetElements=function(t){var e,r=t.length;for(e=0;e<r;e+=1)t[e]._processed=!1,"gr"===t[e].ty&&this.resetElements(t[e].it)},_aj.prototype.cloneElements=function(t){var e=(t.length,JSON.parse(JSON.stringify(t)));return this.resetElements(e),e},_aj.prototype.changeGroupRender=function(t,e){var r,s=t.length;for(r=0;r<s;r+=1)t[r]._render=e,"gr"===t[r].ty&&this.changeGroupRender(t[r].it,e)},_aj.prototype.processShapes=function(t){if(this.elem._x.frameId!==this.frameId&&(this.frameId=this.elem._x.frameId,this.dynamicProperties.length||t||(this.mdf=!1),this.mdf)){var e=Math.ceil(this.c.v);if(this._groups.length<e){for(;this._groups.length<e;){var r={it:this.cloneElements(this._bq),ty:"gr"};r.it.push({a:{a:0,ix:1,k:[0,0]},nm:"Transform",o:{a:0,ix:7,k:100},p:{a:0,ix:2,k:[0,0]},r:{a:0,ix:6,k:0},s:{a:0,ix:3,k:[100,100]},sa:{a:0,ix:5,k:0},sk:{a:0,ix:4,k:0},ty:"tr"}),this.arr.splice(0,0,r),this._groups.splice(0,0,r),this._currentCopies+=1}this.elem.reloadShapes()}var s,i,a=0;for(s=0;s<=this._groups.length-1;s+=1)i=a<e,this._groups[s]._render=i,this.changeGroupRender(this._groups[s].it,i),a+=1;this._currentCopies=e,this.elem.firstFrame=!0;var n=this.o.v,o=n%1,h=n>0?Math.floor(n):Math.ceil(n),l=(this.tr.v.props,this.pMatrix.props),p=this.rMatrix.props,m=this.sMatrix.props;this.pMatrix.reset(),this.rMatrix.reset(),this.sMatrix.reset(),this.tMatrix.reset(),this.matrix.reset();var f=0;if(n>0){for(;f<h;)this.applyTransforms(this.pMatrix,this.rMatrix,this.sMatrix,this.tr,1,!1),f+=1;o&&(this.applyTransforms(this.pMatrix,this.rMatrix,this.sMatrix,this.tr,o,!1),f+=o)}else if(n<0){for(;f>h;)this.applyTransforms(this.pMatrix,this.rMatrix,this.sMatrix,this.tr,1,!0),f-=1;o&&(this.applyTransforms(this.pMatrix,this.rMatrix,this.sMatrix,this.tr,-o,!0),f-=o)}s=1===this.data.m?0:this._currentCopies-1;var c=1===this.data.m?1:-1;for(a=this._currentCopies;a;){if(0!==f){(0!==s&&1===c||s!==this._currentCopies-1&&c===-1)&&this.applyTransforms(this.pMatrix,this.rMatrix,this.sMatrix,this.tr,1,!1),this.matrix.transform(p[0],p[1],p[2],p[3],p[4],p[5],p[6],p[7],p[8],p[9],p[10],p[11],p[12],p[13],p[14],p[15]),this.matrix.transform(m[0],m[1],m[2],m[3],m[4],m[5],m[6],m[7],m[8],m[9],m[10],m[11],m[12],m[13],m[14],m[15]),this.matrix.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]);var d,u=this.elemsData[s].it,y=u[u.length-1].transform.mProps.v.props,g=y.length;for(d=0;d<g;d+=1)y[d]=this.matrix.props[d];this.matrix.reset()}else{this.matrix.reset();var d,u=this.elemsData[s].it,y=u[u.length-1].transform.mProps.v.props,g=y.length;for(d=0;d<g;d+=1)y[d]=this.matrix.props[d]}f+=1,a-=1,s+=c}}},_aj.prototype.addShape=function(){},_as.registerModifier("rp",_aj),_am.prototype.addShape=function(t){this._length===this._maxLength&&(this.shapes=this.shapes.concat(Array.apply(null,{length:this._maxLength})),this._maxLength*=2),this.shapes[this._length]=t,this._length+=1},_am.prototype.releaseShapes=function(){var t;for(t=0;t<this._length;t+=1)shape_pool.release(this.shapes[t]);this._length=0},DashProperty.prototype.getValue=function(t){if(this.elem._x.frameId!==this.frameId||t){var e=0,r=this.dataProps.length;for(this.mdf=!1,this.frameId=this.elem._x.frameId;e<r;){if(this.dataProps[e].p.mdf){this.mdf=!t;break}e+=1}if(this.mdf||t)for("svg"===this.renderer&&(this.dashStr=""),e=0;e<r;e+=1)"o"!=this.dataProps[e].n?"svg"===this.renderer?this.dashStr+=" "+this.dataProps[e].p.v:this.dashArray[e]=this.dataProps[e].p.v:this.dashoffset[0]=this.dataProps[e].p.v}},GradientProperty.prototype.comparePoints=function(t,e){for(var r,s=0,i=this.o.length/2;s<i;){if(r=Math.abs(t[4*s]-t[4*e+2*s]),r>.01)return!1;s+=1}return!0},GradientProperty.prototype.checkCollapsable=function(){if(this.o.length/2!==this.c.length/4)return!1;if(this.data.k.k[0].s)for(var t=0,e=this.data.k.k.length;t<e;){if(!this.comparePoints(this.data.k.k[t].s,this.data.p))return!1;t+=1}else if(!this.comparePoints(this.data.k.k,this.data.p))return!1;return!0},GradientProperty.prototype.getValue=function(t){if(this.prop.getValue(),this.cmdf=!1,this.omdf=!1,this.prop.mdf||t){var e,r,s,i=4*this.data.p;for(e=0;e<i;e+=1)r=e%4===0?100:255,s=Math.round(this.prop.v[e]*r),this.c[e]!==s&&(this.c[e]=s,this.cmdf=!t);if(this.o.length)for(i=this.prop.v.length,e=4*this.data.p;e<i;e+=1)r=e%2===0?100:1,s=e%2===0?Math.round(100*this.prop.v[e]):this.prop.v[e],this.o[e-4*this.data.p]!==s&&(this.o[e-4*this.data.p]=s,this.omdf=!t)}};var ImagePreloader=function(){function t(){this.loadedAssets+=1,this.loadedAssets===this.totalImages&&this.imagesLoadedCb&&this.imagesLoadedCb(null)}function e(t){var e="";if(this.assetsPath){var r=t.p;r.indexOf("images/")!==-1&&(r=r.split("/")[1]),e=this.assetsPath+r}else e=this.path,e+=t.u?t.u:"",e+=t.p;return e}function r(e){var r=createTag("img");r.addEventListener("load",t.bind(this),!1),r.addEventListener("error",t.bind(this),!1),r.src=e}function s(t,s){this.imagesLoadedCb=s,this.totalAssets=t.length;var i;for(i=0;i<this.totalAssets;i+=1)t[i].layers||(r.bind(this)(e.bind(this)(t[i])),this.totalImages+=1)}function i(t){this.path=t||""}function a(t){this.assetsPath=t||""}function n(){this.imagesLoadedCb=null}return function(){this.loadAssets=s,this.setAssetsPath=a,this.setPath=i,this.destroy=n,this.assetsPath="",this.path="",this.totalAssets=0,this.totalImages=0,this.loadedAssets=0,this.imagesLoadedCb=null}}(),featureSupport=function(){var t={maskType:!0};return(/MSIE 10/i.test(navigator.userAgent)||/MSIE 9/i.test(navigator.userAgent)||/rv:11.0/i.test(navigator.userAgent)||/Edge\/\d./i.test(navigator.userAgent))&&(t.maskType=!1),t}(),filtersFactory=function(){function t(t){var e=createNS("filter");return e.setAttribute("id",t),e.setAttribute("filterUnits","objectBoundingBox"),e.setAttribute("x","0%"),e.setAttribute("y","0%"),e.setAttribute("width","100%"),e.setAttribute("height","100%"),e}function e(){var t=createNS("feColorMatrix");return t.setAttribute("type","matrix"),t.setAttribute("color-interpolation-filters","sRGB"),t.setAttribute("values","0 0 0 1 0  0 0 0 1 0  0 0 0 1 0  0 0 0 1 1"),t}var r={};return r.createFilter=t,r.createAlphaToLuminanceFilter=e,r}();_bl.prototype.searchProperties=function(t){var e,r,s=this._textData.a.length,i=_ai._bo;for(e=0;e<s;e+=1)r=this._textData.a[e],this._animatorsData[e]=new TextAnimatorDataProperty(this._elem,r,this._dynamicProperties);this._textData.p&&"m"in this._textData.p?(this._pathData={f:i(this._elem,this._textData.p.f,0,0,this._dynamicProperties),l:i(this._elem,this._textData.p.l,0,0,this._dynamicProperties),r:this._textData.p.r,m:this._elem.maskManager.getMaskProperty(this._textData.p.m)},this._hasMaskedPath=!0):this._hasMaskedPath=!1,this._moreOptions.alignment=i(this._elem,this._textData.m.a,1,0,this._dynamicProperties),this._dynamicProperties.length&&t.push(this)},_bl.prototype.getMeasures=function(t,e){if(this.lettersChangedFlag=e,this.mdf||this._firstFrame||e||this._hasMaskedPath&&this._pathData.m.mdf){this._firstFrame=!1;var r,s,i,a,n=this._moreOptions.alignment.v,o=this._animatorsData,h=this._textData,l=this.mHelper,p=this._renderType,m=this._bt.length,f=(this.data,t.l);if(this._hasMaskedPath){var c=this._pathData.m;if(!this._pathData.n||this._pathData.mdf){var d=c.v;this._pathData.r&&(d=d.reverse());var u={tLength:0,segments:[]};a=d._length-1;var y,g=0;for(i=0;i<a;i+=1)y={s:d.v[i],e:d.v[i+1],to:[d.o[i][0]-d.v[i][0],d.o[i][1]-d.v[i][1]],ti:[d.i[i+1][0]-d.v[i+1][0],d.i[i+1][1]-d.v[i+1][1]]},bez.buildBezierData(y),u.tLength+=y.bezierData.segmentLength,u.segments.push(y),g+=y.bezierData.segmentLength;i=a,c.v.c&&(y={s:d.v[i],e:d.v[0],to:[d.o[i][0]-d.v[i][0],d.o[i][1]-d.v[i][1]],ti:[d.i[0][0]-d.v[0][0],d.i[0][1]-d.v[0][1]]},bez.buildBezierData(y),u.tLength+=y.bezierData.segmentLength,u.segments.push(y),g+=y.bezierData.segmentLength),this._pathData.pi=u}var v,b,E,u=this._pathData.pi,P=this._pathData.f.v,x=0,S=1,C=0,A=!0,k=u.segments;if(P<0&&c.v.c)for(u.tLength<Math.abs(P)&&(P=-Math.abs(P)%u.tLength),x=k.length-1,E=k[x].bezierData.points,S=E.length-1;P<0;)P+=E[S].partialLength,S-=1,S<0&&(x-=1,E=k[x].bezierData.points,S=E.length-1);E=k[x].bezierData.points,b=E[S-1],v=E[S];var M,T,D=v.partialLength}a=f.length,r=0,s=0;var w,F,_,I,V,R=1.2*t.s*.714,B=!0;I=o.length;var L,G,N,O,z,H,j,W,q,Y,X,K,J,Z=-1,U=P,Q=x,$=S,tt=-1,et=0,rt="",st=this.defaultPropsArray;for(i=0;i<a;i+=1){if(l.reset(),z=1,f[i].n)r=0,s+=t.yOffset,s+=B?1:0,P=U,B=!1,et=0,this._hasMaskedPath&&(x=Q,S=$,E=k[x].bezierData.points,b=E[S-1],v=E[S],D=v.partialLength,C=0),J=Y=K=rt="",st=this.defaultPropsArray;else{if(this._hasMaskedPath){if(tt!==f[i].line){switch(t.j){case 1:P+=g-t.lineWidths[f[i].line];break;case 2:P+=(g-t.lineWidths[f[i].line])/2}tt=f[i].line}Z!==f[i].ind&&(f[Z]&&(P+=f[Z].extra),P+=f[i].an/2,Z=f[i].ind),P+=n[0]*f[i].an/200;var it=0;for(_=0;_<I;_+=1)w=o[_].a,w.p.propType&&(F=o[_].s,L=F.getMult(f[i].anIndexes[_],h.a[_].s.totalChars),it+=L.length?w.p.v[0]*L[0]:w.p.v[0]*L),w.a.propType&&(F=o[_].s,L=F.getMult(f[i].anIndexes[_],h.a[_].s.totalChars),it+=L.length?w.a.v[0]*L[0]:w.a.v[0]*L);for(A=!0;A;)C+D>=P+it||!E?(M=(P+it-C)/v.partialLength,N=b.point[0]+(v.point[0]-b.point[0])*M,O=b.point[1]+(v.point[1]-b.point[1])*M,l.translate(-n[0]*f[i].an/200,-(n[1]*R/100)),A=!1):E&&(C+=v.partialLength,S+=1,S>=E.length&&(S=0,x+=1,k[x]?E=k[x].bezierData.points:c.v.c?(S=0,x=0,E=k[x].bezierData.points):(C-=v.partialLength,E=null)),E&&(b=v,v=E[S],D=v.partialLength));G=f[i].an/2-f[i].add,l.translate(-G,0,0)}else G=f[i].an/2-f[i].add,l.translate(-G,0,0),l.translate(-n[0]*f[i].an/200,-n[1]*R/100,0);for(et+=f[i].l/2,_=0;_<I;_+=1)w=o[_].a,w.t.propType&&(F=o[_].s,L=F.getMult(f[i].anIndexes[_],h.a[_].s.totalChars),this._hasMaskedPath?P+=L.length?w.t*L[0]:w.t*L:r+=L.length?w.t.v*L[0]:w.t.v*L);for(et+=f[i].l/2,t.strokeWidthAnim&&(j=t.sw||0),t.strokeColorAnim&&(H=t.sc?[t.sc[0],t.sc[1],t.sc[2]]:[0,0,0]),t.fillColorAnim&&t.fc&&(W=[t.fc[0],t.fc[1],t.fc[2]]),_=0;_<I;_+=1)w=o[_].a,w.a.propType&&(F=o[_].s,L=F.getMult(f[i].anIndexes[_],h.a[_].s.totalChars),L.length?l.translate(-w.a.v[0]*L[0],-w.a.v[1]*L[1],w.a.v[2]*L[2]):l.translate(-w.a.v[0]*L,-w.a.v[1]*L,w.a.v[2]*L));for(_=0;_<I;_+=1)w=o[_].a,w.s.propType&&(F=o[_].s,L=F.getMult(f[i].anIndexes[_],h.a[_].s.totalChars),L.length?l.scale(1+(w.s.v[0]-1)*L[0],1+(w.s.v[1]-1)*L[1],1):l.scale(1+(w.s.v[0]-1)*L,1+(w.s.v[1]-1)*L,1));for(_=0;_<I;_+=1){if(w=o[_].a,F=o[_].s,L=F.getMult(f[i].anIndexes[_],h.a[_].s.totalChars),w.sk.propType&&(L.length?l.skewFromAxis(-w.sk.v*L[0],w.sa.v*L[1]):l.skewFromAxis(-w.sk.v*L,w.sa.v*L)),w.r.propType&&(L.length?l.rotateZ(-w.r.v*L[2]):l.rotateZ(-w.r.v*L)),w.ry.propType&&(L.length?l.rotateY(w.ry.v*L[1]):l.rotateY(w.ry.v*L)),w.rx.propType&&(L.length?l.rotateX(w.rx.v*L[0]):l.rotateX(w.rx.v*L)),w.o.propType&&(z+=L.length?(w.o.v*L[0]-z)*L[0]:(w.o.v*L-z)*L),t.strokeWidthAnim&&w.sw.propType&&(j+=L.length?w.sw.v*L[0]:w.sw.v*L),t.strokeColorAnim&&w.sc.propType)for(q=0;q<3;q+=1)L.length?H[q]=H[q]+(w.sc.v[q]-H[q])*L[0]:H[q]=H[q]+(w.sc.v[q]-H[q])*L;if(t.fillColorAnim&&t.fc){if(w.fc.propType)for(q=0;q<3;q+=1)L.length?W[q]=W[q]+(w.fc.v[q]-W[q])*L[0]:W[q]=W[q]+(w.fc.v[q]-W[q])*L;w.fh.propType&&(W=L.length?addHueToRGB(W,w.fh.v*L[0]):addHueToRGB(W,w.fh.v*L)),w.fs.propType&&(W=L.length?addSaturationToRGB(W,w.fs.v*L[0]):addSaturationToRGB(W,w.fs.v*L)),w.fb.propType&&(W=L.length?addBrightnessToRGB(W,w.fb.v*L[0]):addBrightnessToRGB(W,w.fb.v*L))}}for(_=0;_<I;_+=1)w=o[_].a,w.p.propType&&(F=o[_].s,L=F.getMult(f[i].anIndexes[_],h.a[_].s.totalChars),this._hasMaskedPath?L.length?l.translate(0,w.p.v[1]*L[0],-w.p.v[2]*L[1]):l.translate(0,w.p.v[1]*L,-w.p.v[2]*L):L.length?l.translate(w.p.v[0]*L[0],w.p.v[1]*L[1],-w.p.v[2]*L[2]):l.translate(w.p.v[0]*L,w.p.v[1]*L,-w.p.v[2]*L));if(t.strokeWidthAnim&&(Y=j<0?0:j),t.strokeColorAnim&&(X="rgb("+Math.round(255*H[0])+","+Math.round(255*H[1])+","+Math.round(255*H[2])+")"),t.fillColorAnim&&t.fc&&(K="rgb("+Math.round(255*W[0])+","+Math.round(255*W[1])+","+Math.round(255*W[2])+")"),this._hasMaskedPath){if(l.translate(0,-t.ls),l.translate(0,n[1]*R/100+s,0),h.p.p){T=(v.point[1]-b.point[1])/(v.point[0]-b.point[0]);var at=180*Math.atan(T)/Math.PI;v.point[0]<b.point[0]&&(at+=180),l.rotate(-at*Math.PI/180)}l.translate(N,O,0),P-=n[0]*f[i].an/200,f[i+1]&&Z!==f[i+1].ind&&(P+=f[i].an/2,P+=t.tr/1e3*t.s)}else{switch(l.translate(r,s,0),t.ps&&l.translate(t.ps[0],t.ps[1]+t.ascent,0),t.j){case 1:l.translate(t.justifyOffset+(t.boxWidth-t.lineWidths[f[i].line]),0,0);break;case 2:l.translate(t.justifyOffset+(t.boxWidth-t.lineWidths[f[i].line])/2,0,0)}l.translate(0,-t.ls),l.translate(G,0,0),l.translate(n[0]*f[i].an/200,n[1]*R/100,0),r+=f[i].l+t.tr/1e3*t.s}"html"===p?rt=l.toCSS():"svg"===p?rt=l.to2dCSS():st=[l.props[0],l.props[1],l.props[2],l.props[3],l.props[4],l.props[5],l.props[6],l.props[7],l.props[8],l.props[9],l.props[10],l.props[11],l.props[12],l.props[13],l.props[14],l.props[15]],J=z}m<=i?(V=new LetterProps(J,Y,X,K,rt,st),this._bt.push(V),m+=1,this.lettersChangedFlag=!0):(V=this._bt[i],this.lettersChangedFlag=V.update(J,Y,X,K,rt,st)||this.lettersChangedFlag)}}},_bl.prototype.getValue=function(){if(this._elem._x.frameId!==this._frameId){this._frameId=this._elem._x.frameId;var t,e=this._dynamicProperties.length;for(this.mdf=!1,t=0;t<e;t+=1)this._dynamicProperties[t].getValue(),this.mdf=this._dynamicProperties[t].mdf||this.mdf}},_bl.prototype.mHelper=new Matrix,_bl.prototype.defaultPropsArray=[],LetterProps.prototype.update=function(t,e,r,s,i,a){this.mdf.o=!1,this.mdf.sw=!1,this.mdf.sc=!1,this.mdf.fc=!1,this.mdf.m=!1,this.mdf.p=!1;var n=!1;return this.o!==t&&(this.o=t,this.mdf.o=!0,n=!0),this.sw!==e&&(this.sw=e,this.mdf.sw=!0,n=!0),this.sc!==r&&(this.sc=r,this.mdf.sc=!0,n=!0),this.fc!==s&&(this.fc=s,this.mdf.fc=!0,n=!0),this.m!==i&&(this.m=i,this.mdf.m=!0,n=!0),!a.length||this.p[0]===a[0]&&this.p[1]===a[1]&&this.p[4]===a[4]&&this.p[5]===a[5]&&this.p[12]===a[12]&&this.p[13]===a[13]||(this.p=a,this.mdf.p=!0,n=!0),n},_ar.prototype.setCurrentData=function(t){var e=this.currentData;e.ascent=t.ascent,e.boxWidth=t.boxWidth?t.boxWidth:e.boxWidth,e.f=t.f,e.fStyle=t.fStyle,e.fWeight=t.fWeight,e.fc=t.fc,e.j=t.j,e.justifyOffset=t.justifyOffset,e.l=t.l,e.lh=t.lh,e.lineWidths=t.lineWidths,e.ls=t.ls,e.of=t.of,e.s=t.s,e.sc=t.sc,e.sw=t.sw,e.sz=t.sz,e.ps=t.ps,e.t=t.t,e.tr=t.tr,e.fillColorAnim=t.fillColorAnim||e.fillColorAnim,e.strokeColorAnim=t.strokeColorAnim||e.strokeColorAnim,e.strokeWidthAnim=t.strokeWidthAnim||e.strokeWidthAnim,e.yOffset=t.yOffset,e.__complete=!1},_ar.prototype.searchProperty=function(){return this.kf=this.data.d.k.length>1,this.kf},_ar.prototype.getValue=function(){this.mdf=!1;var t=this.elem._x.frameId;if(t!==this._frameId&&this.kf||this.firstFrame){for(var e,r=this.data.d.k,s=0,i=r.length;s<=i-1&&(e=r[s].s,!(s===i-1||r[s+1].t>t));)s+=1;this.keysIndex!==s&&(e.__complete||this.completeTextData(e),this.setCurrentData(e),this.mdf=!this.firstFrame,this.pv=this.v=this.currentData.t,this.keysIndex=s),this._frameId=t}},_ar.prototype.completeTextData=function(t){t.__complete=!0;var e,r,s,i,a,n,o,h=this.elem._x.fontManager,l=this.data,p=[],m=0,f=l.m.g,c=0,d=0,u=0,y=[],g=0,v=0,b=h.getFontByName(t.f),E=0,P=b.fStyle.split(" "),x="normal",S="normal";r=P.length;var C;for(e=0;e<r;e+=1)switch(C=P[e].toLowerCase()){case"italic":S="italic";break;case"bold":x="700";break;case"black":x="900";break;case"medium":x="500";break;case"regular":case"normal":x="400";case"light":case"thin":x="200"}t.fWeight=x,t.fStyle=S,r=t.t.length;var A=t.tr/1e3*t.s;if(t.sz){var k=t.sz[0],M=-1;for(e=0;e<r;e+=1)s=!1," "===t.t.charAt(e)?M=e:13===t.t.charCodeAt(e)&&(g=0,s=!0),h.chars?(o=h.getCharData(t.t.charAt(e),b.fStyle,b.fFamily),E=s?0:o.w*t.s/100):E=h.measureText(t.t.charAt(e),t.f,t.s),g+E>k&&" "!==t.t.charAt(e)?(M===-1?r+=1:e=M,t.t=t.t.substr(0,e)+"\r"+t.t.substr(e===M?e+1:e),M=-1,g=0):(g+=E,g+=A);r=t.t.length}g=-A,E=0;var T,D=0;for(e=0;e<r;e+=1)if(s=!1,T=t.t.charAt(e)," "===T?i="\xa0":13===T.charCodeAt(0)?(D=0,y.push(g),v=g>v?g:v,g=-2*A,i="",s=!0,u+=1):i=t.t.charAt(e),h.chars?(o=h.getCharData(T,b.fStyle,h.getFontByName(t.f).fFamily),E=s?0:o.w*t.s/100):E=h.measureText(i,t.f,t.s)," "===T?D+=E+A:(g+=E+A+D,D=0),p.push({l:E,an:E,add:c,n:s,anIndexes:[],val:i,line:u}),2==f){if(c+=E,""==i||"\xa0"==i||e==r-1){for(""!=i&&"\xa0"!=i||(c-=E);d<=e;)p[d].an=c,p[d].ind=m,p[d].extra=E,d+=1;m+=1,c=0}}else if(3==f){if(c+=E,""==i||e==r-1){for(""==i&&(c-=E);d<=e;)p[d].an=c,p[d].ind=m,p[d].extra=E,d+=1;c=0,m+=1}}else p[m].ind=m,p[m].extra=0,m+=1;if(t.l=p,v=g>v?g:v,y.push(g),t.sz)t.boxWidth=t.sz[0],t.justifyOffset=0;else switch(t.boxWidth=v,t.j){case 1:t.justifyOffset=-t.boxWidth;break;case 2:t.justifyOffset=-t.boxWidth/2;break;default:t.justifyOffset=0}t.lineWidths=y;var w,F,_=l.a;n=_.length;var I,V,R=[];for(a=0;a<n;a+=1){for(w=_[a],w.a.sc&&(t.strokeColorAnim=!0),w.a.sw&&(t.strokeWidthAnim=!0),(w.a.fc||w.a.fh||w.a.fs||w.a.fb)&&(t.fillColorAnim=!0),V=0,I=w.s.b,e=0;e<r;e+=1)F=p[e],F.anIndexes[a]=V,(1==I&&""!=F.val||2==I&&""!=F.val&&"\xa0"!=F.val||3==I&&(F.n||"\xa0"==F.val||e==r-1)||4==I&&(F.n||e==r-1))&&(1===w.s.rn&&R.push(V),V+=1);l.a[a].s.totalChars=V;var B,L=-1;if(1===w.s.rn)for(e=0;e<r;e+=1)F=p[e],L!=F.anIndexes[a]&&(L=F.anIndexes[a],B=R.splice(Math.floor(Math.random()*R.length),1)[0]),F.anIndexes[a]=B}t.yOffset=t.lh||1.2*t.s,t.ls=t.ls||0,t.ascent=b.ascent*t.s/100},_ar.prototype.updateDocumentData=function(t,e){e=void 0===e?this.keysIndex:e;var r=this.data.d.k[e].s;r.__complete=!1,r.t=t.t,this.keysIndex=-1,this.firstFrame=!0,this.getValue()};var TextSelectorProp=function(){function t(t){if(this.mdf=t||!1,this.dynamicProperties.length){var e,r=this.dynamicProperties.length;for(e=0;e<r;e+=1)this.dynamicProperties[e].getValue(),this.dynamicProperties[e].mdf&&(this.mdf=!0)}var s=this.elem.textProperty.currentData?this.elem.textProperty.currentData.l.length:0;t&&2===this.data.r&&(this.e.v=s);var i=2===this.data.r?1:100/s,a=this.o.v/i,n=this.s.v/i+a,o=this.e.v/i+a;if(n>o){var h=n;n=o,o=h}this.finalS=n,this.finalE=o}function e(t){var e=BezierFactory.getBezierEasing(this.ne.v/100,0,1-this.xe.v/100,1).get,r=0,s=this.finalS,o=this.finalE,h=this.data.sh;if(2==h)r=o===s?t>=o?1:0:i(0,a(.5/(o-s)+(t-s)/(o-s),1)),r=e(r);else if(3==h)r=o===s?t>=o?0:1:1-i(0,a(.5/(o-s)+(t-s)/(o-s),1)),r=e(r);else if(4==h)o===s?r=0:(r=i(0,a(.5/(o-s)+(t-s)/(o-s),1)),r<.5?r*=2:r=1-2*(r-.5)),r=e(r);else if(5==h){if(o===s)r=0;else{var l=o-s;t=a(i(0,t+.5-s),o-s);var p=-l/2+t,m=l/2;r=Math.sqrt(1-p*p/(m*m))}r=e(r)}else 6==h?(o===s?r=0:(t=a(i(0,t+.5-s),o-s),r=(1+Math.cos(Math.PI+2*Math.PI*t/(o-s)))/2),r=e(r)):(t>=n(s)&&(r=t-s<0?1-(s-t):i(0,a(o-t,1))),r=e(r));return r*this.a.v}function r(r,s,i){this.mdf=!1,this.k=!1,this.data=s,this.dynamicProperties=[],this.getValue=t,this.getMult=e,this.elem=r,this.comp=r.comp,this.finalS=0,this.finalE=0,this.s=_ai._bo(r,s.s||{k:0},0,0,this.dynamicProperties),"e"in s?this.e=_ai._bo(r,s.e,0,0,this.dynamicProperties):this.e={v:100},this.o=_ai._bo(r,s.o||{k:0},0,0,this.dynamicProperties),this.xe=_ai._bo(r,s.xe||{k:0},0,0,this.dynamicProperties),this.ne=_ai._bo(r,s.ne||{k:0},0,0,this.dynamicProperties),this.a=_ai._bo(r,s.a,0,.01,this.dynamicProperties),this.dynamicProperties.length?i.push(this):this.getValue()}function s(t,e,s){return new r(t,e,s)}var i=Math.max,a=Math.min,n=Math.floor;return{getTextSelectorProp:s}}(),pool_factory=function(){return function(t,e,r,s){function i(){var t;return n?(n-=1,t=h[n]):t=e(),t}function a(t){n===o&&(h=pooling["double"](h),o=2*o),r&&r(t),h[n]=t,n+=1}var n=0,o=t,h=Array.apply(null,{length:o}),l={newElement:i,release:a};return l}}(),pooling=function(){function t(t){return t.concat(Array.apply(null,{length:t.length}))}return{"double":t}}(),point_pool=function(){function t(){return createTypedArray("float32",2)}return pool_factory(8,t)}(),shape_pool=function(){function t(){return new _av}function e(t){var e,r=t._length;for(e=0;e<r;e+=1)point_pool.release(t.v[e]),point_pool.release(t.i[e]),point_pool.release(t.o[e]),t.v[e]=null,t.i[e]=null,t.o[e]=null;t._length=0,t.c=!1}function r(t){var e,r=s.newElement(),i=void 0===t._length?t.v.length:t._length;r.setLength(i),r.c=t.c;for(e=0;e<i;e+=1)r._aw(t.v[e][0],t.v[e][1],t.o[e][0],t.o[e][1],t.i[e][0],t.i[e][1],e);return r}var s=pool_factory(4,t,e);return s.clone=r,s}(),shapeCollection_pool=function(){function t(){var t;return s?(s-=1,t=a[s]):t=new _am,t}function e(t){var e,r=t._length;for(e=0;e<r;e+=1)shape_pool.release(t.shapes[e]);t._length=0,s===i&&(a=pooling["double"](a),i=2*i),a[s]=t,s+=1}var r={_al:t,release:e},s=0,i=4,a=Array.apply(null,{length:i});return r}(),segments_length_pool=function(){function t(){return{lengths:[],totalLength:0}}function e(t){var e,r=t.lengths.length;for(e=0;e<r;e+=1)bezier_length_pool.release(t.lengths[e]);t.lengths.length=0}return pool_factory(8,t,e)}(),bezier_length_pool=function(){function t(){return{addedLength:0,percents:createTypedArray("float32",defaultCurveSegments),lengths:createTypedArray("float32",defaultCurveSegments)}}return pool_factory(8,t)}();_l.prototype.checkLayers=function(t){var e,r,s=this.layers.length;for(this.completeLayers=!0,e=s-1;e>=0;e--)this._br[e]||(r=this.layers[e],r.ip-r.st<=t-this.layers[e].st&&r.op-r.st>t-this.layers[e].st&&this.buildItem(e)),this.completeLayers=!!this._br[e]&&this.completeLayers;this.checkPendingElements()},_l.prototype.createItem=function(t){switch(t.ty){case 2:return this.createImage(t);case 0:return this.createComp(t);case 1:return this.createSolid(t);case 3:return this.createNull(t);case 4:return this.createShape(t);case 5:return this.createText(t);case 13:return this.createCamera(t);case 99:return null}return this.createBase(t)},_l.prototype.createCamera=function(){throw new Error("You're using a 3d camera. Try the html renderer.")},_l.prototype.buildAllItems=function(){
-var t,e=this.layers.length;for(t=0;t<e;t+=1)this.buildItem(t);this.checkPendingElements()},_l.prototype.includeLayers=function(t){this.completeLayers=!1;var e,r,s=t.length,i=this.layers.length;for(e=0;e<s;e+=1)for(r=0;r<i;){if(this.layers[r].id==t[e].id){this.layers[r]=t[e];break}r+=1}},_l.prototype.setProjectInterface=function(t){this._x.projectInterface=t},_l.prototype.initItems=function(){this._x.progressiveLoad||this.buildAllItems()},_l.prototype.buildElementParenting=function(t,e,r){for(var s=this._br,i=this.layers,a=0,n=i.length;a<n;)i[a].ind==e&&(s[a]&&s[a]!==!0?void 0!==i[a].parent?(r.push(s[a]),s[a]._isParent=!0,this.buildElementParenting(t,i[a].parent,r)):(r.push(s[a]),s[a]._isParent=!0,t.setHierarchy(r)):(this.buildItem(a),this.addPendingElement(t))),a+=1},_l.prototype.addPendingElement=function(t){this.pendingElements.push(t)},extendPrototype([_l],_ao),_ao.prototype.createBase=function(t){return new _d(t,this._x,this)},_ao.prototype.createNull=function(t){return new _i(t,this._x,this)},_ao.prototype.createShape=function(t){return new _f(t,this._x,this)},_ao.prototype.createText=function(t){return new SVGTextElement(t,this._x,this)},_ao.prototype.createImage=function(t){return new _h(t,this._x,this)},_ao.prototype.createComp=function(t){return new SVGCompElement(t,this._x,this)},_ao.prototype.createSolid=function(t){return new _j(t,this._x,this)},_ao.prototype.configAnimation=function(t){this._cf.setAttribute("xmlns","http://www.w3.org/2000/svg"),this.renderConfig.viewBoxSize?this._cf.setAttribute("viewBox",this.renderConfig.viewBoxSize):this._cf.setAttribute("viewBox","0 0 "+t.w+" "+t.h),this.renderConfig.viewBoxOnly||(this._cf.setAttribute("width",t.w),this._cf.setAttribute("height",t.h),this._cf.style.width="100%",this._cf.style.height="100%"),this.renderConfig.className&&this._cf.setAttribute("class",this.renderConfig.className),this._cf.setAttribute("preserveAspectRatio",this.renderConfig.preserveAspectRatio),this.animationItem.wrapper.appendChild(this._cf);var e=this._x.defs;this._x.getAssetData=this.animationItem.getAssetData.bind(this.animationItem),this._x.getAssetsPath=this.animationItem.getAssetsPath.bind(this.animationItem),this._x.progressiveLoad=this.renderConfig.progressiveLoad,this._x.nm=t.nm,this._x.compSize.w=t.w,this._x.compSize.h=t.h,this._x.frameRate=t.fr,this.data=t;var r=createNS("clipPath"),s=createNS("rect");s.setAttribute("width",t.w),s.setAttribute("height",t.h),s.setAttribute("x",0),s.setAttribute("y",0);var i="animationMask_"+randomString(10);r.setAttribute("id",i),r.appendChild(s),this._bx.setAttribute("clip-path","url("+locationHref+"#"+i+")"),e.appendChild(r),this.layers=t.layers,this._x.fontManager.addChars(t.chars),this._x.fontManager.addFonts(t.fonts,e),this._br=Array.apply(null,{length:t.layers.length})},_ao.prototype.destroy=function(){this.animationItem.wrapper.innerHTML="",this._bx=null,this._x.defs=null;var t,e=this.layers?this.layers.length:0;for(t=0;t<e;t++)this._br[t]&&this._br[t].destroy();this._br.length=0,this.destroyed=!0,this.animationItem=null},_ao.prototype.updateContainerSize=function(){},_ao.prototype.buildItem=function(t){var e=this._br;if(!e[t]&&99!=this.layers[t].ty){e[t]=!0;var r=this.createItem(this.layers[t]);e[t]=r,expressionsPlugin&&(0===this.layers[t].ty&&this._x.projectInterface.registerComposition(r),r.initExpressions()),this.appendElementInPos(r,t),this.layers[t].tt&&(this._br[t-1]&&this._br[t-1]!==!0?r.setMatte(e[t-1].layerId):(this.buildItem(t-1),this.addPendingElement(r)))}},_ao.prototype.checkPendingElements=function(){for(;this.pendingElements.length;){var t=this.pendingElements.pop();if(t.checkParenting(),t.data.tt)for(var e=0,r=this._br.length;e<r;){if(this._br[e]===t){t.setMatte(this._br[e-1].layerId);break}e+=1}}},_ao.prototype._ba=function(t){if(this.renderedFrame!==t&&!this.destroyed){null===t?t=this.renderedFrame:this.renderedFrame=t,this._x.frameNum=t,this._x.frameId+=1,this._x.projectInterface.currentFrame=t;var e,r=this.layers.length;for(this.completeLayers||this.checkLayers(t),e=r-1;e>=0;e--)(this.completeLayers||this._br[e])&&this._br[e]._az(t-this.layers[e].st);for(e=0;e<r;e+=1)(this.completeLayers||this._br[e])&&this._br[e]._ba()}},_ao.prototype.appendElementInPos=function(t,e){var r=t.get_e();if(r){for(var s,i=0;i<e;)this._br[i]&&this._br[i]!==!0&&this._br[i].get_e()&&(s=this._br[i].get_e()),i+=1;s?this._bx.insertBefore(r,s):this._bx.appendChild(r)}},_ao.prototype.hide=function(){this._bx.style.display="none"},_ao.prototype.show=function(){this._bx.style.display="block"},_ao.prototype.searchExtraCompositions=function(t){var e,r=t.length,s=createNS("g");for(e=0;e<r;e+=1)if(t[e].xt){var i=this.createComp(t[e],s,this._x.comp,null);i.initExpressions(),this._x.projectInterface.registerComposition(i)}},extendPrototype([_l],_aq),_aq.prototype.createBase=function(t){return new _c(t,this._x,this)},_aq.prototype.createShape=function(t){return new _r(t,this._x,this)},_aq.prototype.createText=function(t){return new _t(t,this._x,this)},_aq.prototype.createImage=function(t){return new _p(t,this._x,this)},_aq.prototype.createComp=function(t){return new _m(t,this._x,this)},_aq.prototype.createSolid=function(t){return new _s(t,this._x,this)},_aq.prototype.createNull=_ao.prototype.createNull,_aq.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);var e=this.contextData.cTr.props;this.transformMat.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.contextData.cTr.cloneFromProps(this.transformMat.props);var r=this.contextData.cTr.props;this.canvasContext.setTransform(r[0],r[1],r[4],r[5],r[12],r[13])}},_aq.prototype.ctxOpacity=function(t){return this.renderConfig.clearCanvas?(this.contextData.cO*=t<0?0:t,void(this.canvasContext.globalAlpha=this.contextData.cO)):void(this.canvasContext.globalAlpha*=t<0?0:t)},_aq.prototype.reset=function(){return this.renderConfig.clearCanvas?void this.contextData.reset():void this.canvasContext.restore()},_aq.prototype.save=function(t){if(!this.renderConfig.clearCanvas)return void this.canvasContext.save();t&&this.canvasContext.save();var e=this.contextData.cTr.props;this.contextData._length<=this.contextData.cArrPos&&this.contextData.duplicate();var r,s=this.contextData.saved[this.contextData.cArrPos];for(r=0;r<16;r+=1)s[r]=e[r];this.contextData.savedOp[this.contextData.cArrPos]=this.contextData.cO,this.contextData.cArrPos+=1},_aq.prototype.restore=function(t){if(!this.renderConfig.clearCanvas)return void this.canvasContext.restore();t&&(this.canvasContext.restore(),this._x.blendMode="source-over"),this.contextData.cArrPos-=1;var e,r=this.contextData.saved[this.contextData.cArrPos],s=this.contextData.cTr.props;for(e=0;e<16;e+=1)s[e]=r[e];this.canvasContext.setTransform(r[0],r[1],r[4],r[5],r[12],r[13]),r=this.contextData.savedOp[this.contextData.cArrPos],this.contextData.cO=r,this.canvasContext.globalAlpha=r},_aq.prototype.configAnimation=function(t){this.animationItem.wrapper?(this.animationItem.container=createTag("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.renderConfig.className&&this.animationItem.container.setAttribute("class",this.renderConfig.className)):this.canvasContext=this.renderConfig.context,this.data=t,this._x.canvasContext=this.canvasContext,this._x.renderer=this,this._x.isDashed=!1,this._x.totalFrames=Math.floor(t.tf),this._x.compWidth=t.w,this._x.compHeight=t.h,this._x.frameRate=t.fr,this._x.frameId=0,this._x.compSize={w:t.w,h:t.h},this._x.progressiveLoad=this.renderConfig.progressiveLoad,this.layers=t.layers,this.transformCanvas={},this.transformCanvas.w=t.w,this.transformCanvas.h=t.h,this._x.fontManager=new FontManager,this._x.fontManager.addChars(t.chars),this._x.fontManager.addFonts(t.fonts,document.body),this._x.getAssetData=this.animationItem.getAssetData.bind(this.animationItem),this._x.getAssetsPath=this.animationItem.getAssetsPath.bind(this.animationItem),this._x.elementLoaded=this.animationItem.elementLoaded.bind(this.animationItem),this._x.addPendingElement=this.animationItem.addPendingElement.bind(this.animationItem),this._x.transformCanvas=this.transformCanvas,this._br=Array.apply(null,{length:t.layers.length}),this.updateContainerSize()},_aq.prototype.updateContainerSize=function(){this.reset();var t,e;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);var r,s;if(this.renderConfig.preserveAspectRatio.indexOf("meet")!==-1||this.renderConfig.preserveAspectRatio.indexOf("slice")!==-1){var i=this.renderConfig.preserveAspectRatio.split(" "),a=i[1]||"meet",n=i[0]||"xMidYMid",o=n.substr(0,4),h=n.substr(4);r=t/e,s=this.transformCanvas.w/this.transformCanvas.h,s>r&&"meet"===a||s<r&&"slice"===a?(this.transformCanvas.sx=t/(this.transformCanvas.w/this.renderConfig.dpr),this.transformCanvas.sy=t/(this.transformCanvas.w/this.renderConfig.dpr)):(this.transformCanvas.sx=e/(this.transformCanvas.h/this.renderConfig.dpr),this.transformCanvas.sy=e/(this.transformCanvas.h/this.renderConfig.dpr)),"xMid"===o&&(s<r&&"meet"===a||s>r&&"slice"===a)?this.transformCanvas.tx=(t-this.transformCanvas.w*(e/this.transformCanvas.h))/2*this.renderConfig.dpr:"xMax"===o&&(s<r&&"meet"===a||s>r&&"slice"===a)?this.transformCanvas.tx=(t-this.transformCanvas.w*(e/this.transformCanvas.h))*this.renderConfig.dpr:this.transformCanvas.tx=0,"YMid"===h&&(s>r&&"meet"===a||s<r&&"slice"===a)?this.transformCanvas.ty=(e-this.transformCanvas.h*(t/this.transformCanvas.w))/2*this.renderConfig.dpr:"YMax"===h&&(s>r&&"meet"===a||s<r&&"slice"===a)?this.transformCanvas.ty=(e-this.transformCanvas.h*(t/this.transformCanvas.w))*this.renderConfig.dpr:this.transformCanvas.ty=0}else"none"==this.renderConfig.preserveAspectRatio?(this.transformCanvas.sx=t/(this.transformCanvas.w/this.renderConfig.dpr),this.transformCanvas.sy=e/(this.transformCanvas.h/this.renderConfig.dpr),this.transformCanvas.tx=0,this.transformCanvas.ty=0):(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.ctxTransform(this.transformCanvas.props)},_aq.prototype.destroy=function(){this.renderConfig.clearCanvas&&(this.animationItem.wrapper.innerHTML="");var t,e=this.layers?this.layers.length:0;for(t=e-1;t>=0;t-=1)this._br[t]&&this._br[t].destroy();this._br.length=0,this._x.canvasContext=null,this.animationItem.container=null,this.destroyed=!0},_aq.prototype._ba=function(t){if(!(this.renderedFrame==t&&this.renderConfig.clearCanvas===!0||this.destroyed||null===t)){this.renderedFrame=t,this._x.frameNum=t-this.animationItem.firstFrame,this._x.frameId+=1,this._x.projectInterface.currentFrame=t,this.renderConfig.clearCanvas===!0?this.canvasContext.clearRect(this.transformCanvas.tx,this.transformCanvas.ty,this.transformCanvas.w*this.transformCanvas.sx,this.transformCanvas.h*this.transformCanvas.sy):this.save(),this.canvasContext.beginPath(),this.canvasContext.rect(0,0,this.transformCanvas.w,this.transformCanvas.h),this.canvasContext.closePath(),this.canvasContext.clip();var e,r=this.layers.length;for(this.completeLayers||this.checkLayers(t),e=0;e<r;e++)(this.completeLayers||this._br[e])&&this._br[e]._az(t-this.layers[e].st);for(e=r-1;e>=0;e-=1)(this.completeLayers||this._br[e])&&this._br[e]._ba();this.renderConfig.clearCanvas!==!0&&this.restore()}},_aq.prototype.buildItem=function(t){var e=this._br;if(!e[t]&&99!=this.layers[t].ty){var r=this.createItem(this.layers[t],this,this._x);e[t]=r,r.initExpressions()}},_aq.prototype.checkPendingElements=function(){for(;this.pendingElements.length;){var t=this.pendingElements.pop();t.checkParenting()}},_aq.prototype.hide=function(){this.animationItem.container.style.display="none"},_aq.prototype.show=function(){this.animationItem.container.style.display="block"},_aq.prototype.searchExtraCompositions=function(t){var e,r=t.length;createNS("g");for(e=0;e<r;e+=1)if(t[e].xt){var s=this.createComp(t[e],this._x.comp,this._x);s.initExpressions(),this._x.projectInterface.registerComposition(s)}},extendPrototype([_l],_ap),_ap.prototype.buildItem=_ao.prototype.buildItem,_ap.prototype.checkPendingElements=function(){for(;this.pendingElements.length;){var t=this.pendingElements.pop();t.checkParenting()}},_ap.prototype.appendElementInPos=function(t,e){var r=t.get_e();if(r){var s=this.layers[e];if(s.ddd&&this.supports3d)this.addTo3dContainer(r,e);else{for(var i,a,n=0;n<e;)this._br[n]&&this._br[n]!==!0&&this._br[n].get_e&&(a=this._br[n],i=this.layers[n].ddd?this.getThreeDContainerByPos(n):a.get_e()),n+=1;i?s.ddd&&this.supports3d||this._bx.insertBefore(r,i):s.ddd&&this.supports3d||this._bx.appendChild(r)}}},_ap.prototype.createBase=function(t){return new _d(t,this._x,this)},_ap.prototype.createShape=function(t){return this.supports3d?new _z(t,this._x,this):new _f(t,this._x,this)},_ap.prototype.createText=function(t){return this.supports3d?new _ab(t,this._x,this):new SVGTextElement(t,this._x,this)},_ap.prototype.createCamera=function(t){return this.camera=new _v(t,this._x,this),this.camera},_ap.prototype.createImage=function(t){return this.supports3d?new _y(t,this._x,this):new _h(t,this._x,this)},_ap.prototype.createComp=function(t){return this.supports3d?new _w(t,this._x,this):new _g(t,this._x,this)},_ap.prototype.createSolid=function(t){return this.supports3d?new _aa(t,this._x,this):new _j(t,this._x,this)},_ap.prototype.createNull=_ao.prototype.createNull,_ap.prototype.getThreeDContainerByPos=function(t){for(var e=0,r=this.threeDElements.length;e<r;){if(this.threeDElements[e].startPos<=t&&this.threeDElements[e].endPos>=t)return this.threeDElements[e].perspectiveElem;e+=1}},_ap.prototype.createThreeDContainer=function(t){var e=createTag("div");styleDiv(e),e.style.width=this._x.compSize.w+"px",e.style.height=this._x.compSize.h+"px",e.style.transformOrigin=e.style.mozTransformOrigin=e.style.webkitTransformOrigin="50% 50%";var r=createTag("div");styleDiv(r),r.style.transform=r.style.webkitTransform="matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1)",e.appendChild(r),this.resizerElem.appendChild(e);var s={container:r,perspectiveElem:e,startPos:t,endPos:t};return this.threeDElements.push(s),s},_ap.prototype.build3dContainers=function(){var t,e,r=this.layers.length;for(t=0;t<r;t+=1)this.layers[t].ddd?(e||(e=this.createThreeDContainer(t)),e.endPos=Math.max(e.endPos,t)):e=null},_ap.prototype.addTo3dContainer=function(t,e){for(var r=0,s=this.threeDElements.length;r<s;){if(e<=this.threeDElements[r].endPos){for(var i,a=this.threeDElements[r].startPos;a<e;)this._br[a]&&this._br[a].get_e&&(i=this._br[a].get_e()),a+=1;i?this.threeDElements[r].container.insertBefore(t,i):this.threeDElements[r].container.appendChild(t);break}r+=1}},_ap.prototype.configAnimation=function(t){var e=createTag("div"),r=this.animationItem.wrapper;e.style.width=t.w+"px",e.style.height=t.h+"px",this.resizerElem=e,styleDiv(e),e.style.transformStyle=e.style.webkitTransformStyle=e.style.mozTransformStyle="flat",this.renderConfig.className&&r.setAttribute("class",this.renderConfig.className),r.appendChild(e),e.style.overflow="hidden";var s=createNS("svg");s.setAttribute("width","1"),s.setAttribute("height","1"),styleDiv(s),this.resizerElem.appendChild(s);var i=createNS("defs");s.appendChild(i),this._x.defs=i,this.data=t,this._x.getAssetData=this.animationItem.getAssetData.bind(this.animationItem),this._x.getAssetsPath=this.animationItem.getAssetsPath.bind(this.animationItem),this._x.elementLoaded=this.animationItem.elementLoaded.bind(this.animationItem),this._x.frameId=0,this._x.compSize={w:t.w,h:t.h},this._x.frameRate=t.fr,this.layers=t.layers,this._x.fontManager=new FontManager,this._x.fontManager.addChars(t.chars),this._x.fontManager.addFonts(t.fonts,s),this._bx=this.resizerElem,this.build3dContainers(),this.updateContainerSize()},_ap.prototype.destroy=function(){this.animationItem.wrapper.innerHTML="",this.animationItem.container=null,this._x.defs=null;var t,e=this.layers?this.layers.length:0;for(t=0;t<e;t++)this._br[t].destroy();this._br.length=0,this.destroyed=!0,this.animationItem=null},_ap.prototype.updateContainerSize=function(){var t,e,r,s,i=this.animationItem.wrapper.offsetWidth,a=this.animationItem.wrapper.offsetHeight,n=i/a,o=this._x.compSize.w/this._x.compSize.h;o>n?(t=i/this._x.compSize.w,e=i/this._x.compSize.w,r=0,s=(a-this._x.compSize.h*(i/this._x.compSize.w))/2):(t=a/this._x.compSize.h,e=a/this._x.compSize.h,r=(i-this._x.compSize.w*(a/this._x.compSize.h))/2,s=0),this.resizerElem.style.transform=this.resizerElem.style.webkitTransform="matrix3d("+t+",0,0,0,0,"+e+",0,0,0,0,1,0,"+r+","+s+",0,1)"},_ap.prototype._ba=_ao.prototype._ba,_ap.prototype.hide=function(){this.resizerElem.style.display="none"},_ap.prototype.show=function(){this.resizerElem.style.display="block"},_ap.prototype.initItems=function(){if(this.buildAllItems(),this.camera)this.camera.setup();else{var t,e=this._x.compSize.w,r=this._x.compSize.h,s=this.threeDElements.length;for(t=0;t<s;t+=1)this.threeDElements[t].perspectiveElem.style.perspective=this.threeDElements[t].perspectiveElem.style.webkitPerspective=Math.sqrt(Math.pow(e,2)+Math.pow(r,2))+"px"}},_ap.prototype.searchExtraCompositions=function(t){var e,r=t.length,s=createTag("div");for(e=0;e<r;e+=1)if(t[e].xt){var i=this.createComp(t[e],s,this._x.comp,null);i.initExpressions(),this._x.projectInterface.registerComposition(i)}},_ay.prototype.getMaskProperty=function(t){return this.viewData[t].prop},_ay.prototype._az=function(){var t,e=this.dynamicProperties.length;for(t=0;t<e;t+=1)this.dynamicProperties[t].getValue()},_ay.prototype._ba=function(t){var e,r=this.masksProperties.length;for(e=0;e<r;e++)if((this.viewData[e].prop.mdf||this.firstFrame)&&this.drawPath(this.masksProperties[e],this.viewData[e].prop.v,this.viewData[e]),(this.viewData[e].op.mdf||this.firstFrame)&&this.viewData[e].elem.setAttribute("fill-opacity",this.viewData[e].op.v),"n"!==this.masksProperties[e].mode&&(this.viewData[e].invRect&&(this.element.finalTransform.mProp.mdf||this.firstFrame)&&(this.viewData[e].invRect.setAttribute("x",-t.props[12]),this.viewData[e].invRect.setAttribute("y",-t.props[13])),this.storedData[e].x&&(this.storedData[e].x.mdf||this.firstFrame))){var s=this.storedData[e].expan;this.storedData[e].x.v<0?("erode"!==this.storedData[e].lastOperator&&(this.storedData[e].lastOperator="erode",this.storedData[e].elem.setAttribute("filter","url("+locationHref+"#"+this.storedData[e].filterId+")")),s.setAttribute("radius",-this.storedData[e].x.v)):("dilate"!==this.storedData[e].lastOperator&&(this.storedData[e].lastOperator="dilate",this.storedData[e].elem.setAttribute("filter",null)),this.storedData[e].elem.setAttribute("stroke-width",2*this.storedData[e].x.v))}this.firstFrame=!1},_ay.prototype.getMaskelement=function(){return this.maskElement},_ay.prototype.createLayerSolidPath=function(){var t="M0,0 ";return t+=" h"+this._x.compSize.w,t+=" v"+this._x.compSize.h,t+=" h-"+this._x.compSize.w,t+=" v-"+this._x.compSize.h+" "},_ay.prototype.drawPath=function(t,e,r){var s,i,a=" M"+e.v[0][0]+","+e.v[0][1];for(i=e._length,s=1;s<i;s+=1)a+=" C"+e.o[s-1][0]+","+e.o[s-1][1]+" "+e.i[s][0]+","+e.i[s][1]+" "+e.v[s][0]+","+e.v[s][1];if(e.c&&i>1&&(a+=" C"+e.o[s-1][0]+","+e.o[s-1][1]+" "+e.i[0][0]+","+e.i[0][1]+" "+e.v[0][0]+","+e.v[0][1]),r.lastPath!==a){var n="";r.elem&&(e.c&&(n=t.inv?this.solidPath+a:a),r.elem.setAttribute("d",n)),r.lastPath=a}},_ay.prototype.destroy=function(){this.element=null,this._x=null,this.maskElement=null,this.data=null,this.masksProperties=null},_ad.prototype.initHierarchy=function(){this.hierarchy=[],this._isParent=!1,this.checkParenting()},_ad.prototype.resetHierarchy=function(){this.hierarchy.length=0},_ad.prototype.getHierarchy=function(){return this.hierarchy},_ad.prototype.setHierarchy=function(t){this.hierarchy=t},_ad.prototype.checkParenting=function(){void 0!==this.data.parent&&this.comp.buildElementParenting(this,this.data.parent,[])},_ad.prototype.prepareHierarchy=function(){},_ac.prototype.initFrame=function(){this.firstFrame=!1,this.dynamicProperties=[]},_ac.prototype.prepareProperties=function(t,e){var r,s=this.dynamicProperties.length;for(r=0;r<s;r+=1)(e||this._isParent&&"transform"===this.dynamicProperties[r].propType)&&(this.dynamicProperties[r].getValue(this.firstFrame),this.dynamicProperties[r].mdf&&(this._x.mdf=!0))},_af.prototype.initTransform=function(){this.finalTransform={mProp:this.data.ks?_ag._bj(this,this.data.ks,this.dynamicProperties):{o:0},matMdf:!1,opMdf:!1,mat:new Matrix},this.data.ao&&(this.finalTransform.mProp.autoOriented=!0),11!==this.data.ty},_af.prototype.renderTransform=function(){if(this.finalTransform.opMdf=this.finalTransform.mProp.o.mdf||this.firstFrame,this.finalTransform.matMdf=this.finalTransform.mProp.mdf||this.firstFrame,this.hierarchy){var t,e=this.finalTransform.mat,r=0,s=this.hierarchy.length;if(!this.finalTransform.matMdf)for(;r<s;){if(this.hierarchy[r].finalTransform.mProp.mdf){this.finalTransform.matMdf=!0;break}r+=1}if(this.finalTransform.matMdf)for(t=this.finalTransform.mProp.v.props,e.cloneFromProps(t),r=0;r<s;r+=1)t=this.hierarchy[r].finalTransform.mProp.v.props,e.transform(t[0],t[1],t[2],t[3],t[4],t[5],t[6],t[7],t[8],t[9],t[10],t[11],t[12],t[13],t[14],t[15])}},_af.prototype.globalToLocal=function(t){var e=[];e.push(this.finalTransform);for(var r=!0,s=this.comp;r;)s.finalTransform?(s.data.hasMask&&e.splice(0,0,s.finalTransform),s=s.comp):r=!1;var i,a,n=e.length;for(i=0;i<n;i+=1)a=e[i].mat.applyToPointArray(0,0,0),t=[t[0]-a[0],t[1]-a[1],0];return t},_af.prototype.mHelper=new Matrix,_ae.prototype.initRenderable=function(){this.isInRange=!1,this.hidden=!1,this.isTransparent=!1},_ae.prototype.prepareRenderableFrame=function(t){this.checkLayerLimits(t),this.prepareMasks(t),this.finalTransform.mProp.o.v<=0?!this.isTransparent&&this._x.renderConfig.hideOnTransparent&&(this.isTransparent=!0,this.hide()):this.isTransparent&&(this.isTransparent=!1,this.show())},_ae.prototype.checkLayerLimits=function(t){this.data.ip-this.data.st<=t&&this.data.op-this.data.st>t?this.isInRange!==!0&&(this._x.mdf=!0,this.isInRange=!0,this.show()):this.isInRange!==!1&&(this._x.mdf=!0,this.isInRange=!1,this.hide())},_ae.prototype.prepareMasks=function(){this.isInRange&&this.maskManager._az()},_ae.prototype.renderRenderable=function(){this.maskManager._ba(this.finalTransform.mat),this.effectsManager._ba(this.firstFrame)},_ae.prototype.sourceRectAtTime=function(){return{top:0,left:0,width:100,height:100}},_ae.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}},extendPrototype([_ae],RenderableDOMElement),RenderableDOMElement.prototype.initElement=function(t,e,r){this.initFrame(),this.initBaseData(t,e,r),this.initTransform(t,e,r),this.initHierarchy(),this.initRenderable(),this.initRendererElement(),this.createContainerElements(),this.addMasks(),this.createContent(),this.hide()},RenderableDOMElement.prototype.hide=function(){this.hidden||this.isInRange&&!this.isTransparent||(this._bx.style.display="none",this.hidden=!0)},RenderableDOMElement.prototype.show=function(){this.isInRange&&!this.isTransparent&&(this.data.hd||(this._bx.style.display="block"),this.hidden=!1,this.firstFrame=!0,this.maskManager.firstFrame=!0)},RenderableDOMElement.prototype._ba=function(){this.data.hd||this.hidden||(this.renderTransform(),this.renderRenderable(),this.renderElement(),this.renderInnerContent(),this.firstFrame&&(this.firstFrame=!1))},RenderableDOMElement.prototype.renderInnerContent=function(){},RenderableDOMElement.prototype.destroy=function(){this._cc=null,this.destroy_e()},RenderableDOMElement.prototype._az=function(t){this.prepareRenderableFrame(t),this.prepareProperties(t,this.isInRange)},SVGStyleData.prototype.reset=function(){this.d="",this.mdf=!1},SVGGradientFillStyleData.prototype.initGradientData=function(t,e,r,s){this.o=_ai._bo(t,e.o,0,.01,r),this.s=_ai._bo(t,e.s,1,null,r),this.e=_ai._bo(t,e.e,1,null,r),this.h=_ai._bo(t,e.h||{k:0},0,.01,r),this.a=_ai._bo(t,e.a||{k:0},0,degToRads,r),this.g=new GradientProperty(t,e.g,r),this.style=s,this.stops=[],this.setGradientData(s.pElem,e),this.setGradientOpacity(e,s)},SVGGradientFillStyleData.prototype.setGradientData=function(t,e){var r="gr_"+randomString(10),s=createNS(1===e.t?"linearGradient":"radialGradient");s.setAttribute("id",r),s.setAttribute("spreadMethod","pad"),s.setAttribute("gradientUnits","userSpaceOnUse");var i,a,n,o=[];for(n=4*e.g.p,a=0;a<n;a+=4)i=createNS("stop"),s.appendChild(i),o.push(i);t.setAttribute("gf"===e.ty?"fill":"stroke","url(#"+r+")"),this.gf=s,this.cst=o},SVGGradientFillStyleData.prototype.setGradientOpacity=function(t,e){if(this.g._hasOpacity&&!this.g._collapsable){var r,s,i,a=createNS("mask"),n=createNS("path");a.appendChild(n);var o="op_"+randomString(10),h="mk_"+randomString(10);a.setAttribute("id",h);var l=createNS(1===t.t?"linearGradient":"radialGradient");l.setAttribute("id",o),l.setAttribute("spreadMethod","pad"),l.setAttribute("gradientUnits","userSpaceOnUse"),i=t.g.k.k[0].s?t.g.k.k[0].s.length:t.g.k.k.length;var p=this.stops;for(s=4*t.g.p;s<i;s+=2)r=createNS("stop"),r.setAttribute("stop-color","rgb(255,255,255)"),l.appendChild(r),p.push(r);n.setAttribute("gf"===t.ty?"fill":"stroke","url(#"+o+")"),this.of=l,this.ms=a,this.ost=p,this.maskId=h,e.msElem=n}},SVGGradientStrokeStyleData.prototype.initGradientData=SVGGradientFillStyleData.prototype.initGradientData,SVGGradientStrokeStyleData.prototype.setGradientData=SVGGradientFillStyleData.prototype.setGradientData,SVGGradientStrokeStyleData.prototype.setGradientOpacity=SVGGradientFillStyleData.prototype.setGradientOpacity,_e.prototype.checkMasks=function(){if(!this.data.hasMask)return!1;for(var t=0,e=this.data.masksProperties.length;t<e;){if("n"!==this.data.masksProperties[t].mode&&this.data.masksProperties[t].cl!==!1)return!0;t+=1}return!1},_e.prototype.initExpressions=function(){this.layerInterface=LayerExpressionInterface(this),this.data.hasMask&&this.layerInterface.registerMaskInterface(this.maskManager);var t=EffectsExpressionInterface.createEffectsInterface(this,this.layerInterface);this.layerInterface.registerEffectsInterface(t),0===this.data.ty||this.data.xt?this.compInterface=CompExpressionInterface(this):4===this.data.ty?(this.layerInterface.shapeInterface=ShapeExpressionInterface(this.shapesData,this.itemsData,this.layerInterface),this.layerInterface.content=this.layerInterface.shapeInterface):5===this.data.ty&&(this.layerInterface.textInterface=TextExpressionInterface(this),this.layerInterface.text=this.layerInterface.textInterface)},_e.prototype.getBlendMode=function(){var t="";switch(this.data.bm){case 1:t="multiply";break;case 2:t="screen";break;case 3:t="overlay";break;case 4:t="darken";break;case 5:t="lighten";break;case 6:t="color-dodge";break;case 7:t="color-burn";break;case 8:t="hard-light";break;case 9:t="soft-light";break;case 10:t="difference";break;case 11:t="exclusion";break;case 12:t="hue";break;case 13:t="saturation";break;case 14:t="color";break;case 15:t="luminosity"}return t},_e.prototype.setBlendMode=function(){var t=this.getBlendMode(),e=this._by||this._bx;e.style["mix-blend-mode"]=t},_e.prototype.initBaseData=function(t,e,r){this._x=e,this.comp=r,this.data=t,this.layerId="ly_"+randomString(10),this.data.sr||(this.data.sr=1),this.effects=new EffectsManager(this.data,this,this.dynamicProperties)},_e.prototype.getType=function(){return this.type},_i.prototype._az=function(t){this.prepareProperties(t,!0)},_i.prototype._ba=function(){},_i.prototype.get_e=function(){return null},_i.prototype.destroy=function(){},_i.prototype.sourceRectAtTime=function(){},_i.prototype.hide=function(){},extendPrototype([_e,_af,_ad,_ac],_i),_d.prototype.initRendererElement=function(){this._bx=createNS("g")},_d.prototype.createContainerElements=function(){this.matteElement=createNS("g"),this._bz=this._bx,
-this._ca=this._bx,this._sizeChanged=!1;var t=null;if(this.data.td){if(3==this.data.td||1==this.data.td){var e=createNS("mask");if(e.setAttribute("id",this.layerId),e.setAttribute("mask-type",3==this.data.td?"luminance":"alpha"),e.appendChild(this._bx),t=e,this._x.defs.appendChild(e),!featureSupport.maskType&&1==this.data.td){e.setAttribute("mask-type","luminance");var r=randomString(10),s=filtersFactory.createFilter(r);this._x.defs.appendChild(s),s.appendChild(filtersFactory.createAlphaToLuminanceFilter());var i=createNS("g");i.appendChild(this._bx),t=i,e.appendChild(i),i.setAttribute("filter","url("+locationHref+"#"+r+")")}}else if(2==this.data.td){var a=createNS("mask");a.setAttribute("id",this.layerId),a.setAttribute("mask-type","alpha");var n=createNS("g");a.appendChild(n);var r=randomString(10),s=filtersFactory.createFilter(r),o=createNS("feColorMatrix");o.setAttribute("type","matrix"),o.setAttribute("color-interpolation-filters","sRGB"),o.setAttribute("values","1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 -1 1"),s.appendChild(o),this._x.defs.appendChild(s);var h=createNS("rect");if(h.setAttribute("width",this.comp.data.w),h.setAttribute("height",this.comp.data.h),h.setAttribute("x","0"),h.setAttribute("y","0"),h.setAttribute("fill","#ffffff"),h.setAttribute("opacity","0"),n.setAttribute("filter","url("+locationHref+"#"+r+")"),n.appendChild(h),n.appendChild(this._bx),t=n,!featureSupport.maskType){a.setAttribute("mask-type","luminance"),s.appendChild(filtersFactory.createAlphaToLuminanceFilter());var i=createNS("g");n.appendChild(h),i.appendChild(this._bx),t=i,n.appendChild(i)}this._x.defs.appendChild(a)}}else this.data.tt?(this.matteElement.appendChild(this._bx),t=this.matteElement,this._by=this.matteElement):this._by=this._bx;if(!this.data.ln&&!this.data.cl||4!==this.data.ty&&0!==this.data.ty||(this.data.ln&&this._bx.setAttribute("id",this.data.ln),this.data.cl&&this._bx.setAttribute("class",this.data.cl)),0===this.data.ty&&!this.data.hd){var l=createNS("clipPath"),p=createNS("path");p.setAttribute("d","M0,0 L"+this.data.w+",0 L"+this.data.w+","+this.data.h+" L0,"+this.data.h+"z");var m="cp_"+randomString(8);if(l.setAttribute("id",m),l.appendChild(p),this._x.defs.appendChild(l),this.checkMasks()){var f=createNS("g");f.setAttribute("clip-path","url("+locationHref+"#"+m+")"),f.appendChild(this._bx),this._bz=f,t?t.appendChild(this._bz):this._by=this._bz}else this._bx.setAttribute("clip-path","url("+locationHref+"#"+m+")")}0!==this.data.bm&&this.setBlendMode(),this.effectsManager=new _bi(this)},_d.prototype.renderElement=function(){this.finalTransform.matMdf&&this._bz.setAttribute("transform",this.finalTransform.mat.to2dCSS()),this.finalTransform.opMdf&&this._bz.setAttribute("opacity",this.finalTransform.mProp.o.v)},_d.prototype.destroy_e=function(){this._bx=null,this.matteElement=null,this.maskManager.destroy()},_d.prototype.get_e=function(){return this.data.hd?null:this._by},_d.prototype.addMasks=function(){this.maskManager=new _ay(this.data,this,this._x)},_d.prototype.setMatte=function(t){this.matteElement&&this.matteElement.setAttribute("mask","url("+locationHref+"#"+t+")")},extendPrototype([_e,_af,_d,_ad,_ac,RenderableDOMElement],_f),_f.prototype.initSecondaryElement=function(){},_f.prototype.identityMatrix=new Matrix,_f.prototype.lcEnum={1:"butt",2:"round",3:"square"},_f.prototype.ljEnum={1:"miter",2:"round",3:"butt"},_f.prototype.searchProcessedElement=function(t){for(var e=0,r=this.processedElements.length;e<r;){if(this.processedElements[e].elem===t)return this.processedElements[e].pos;e+=1}return 0},_f.prototype.addProcessedElement=function(t,e){for(var r=this.processedElements.length;r;)if(r-=1,this.processedElements[r].elem===t){this.processedElements[r].pos=e;break}0===r&&this.processedElements.push(new ProcessedElement(t,e))},_f.prototype.buildExpressionInterface=function(){},_f.prototype.createContent=function(){this.searchShapes(this.shapesData,this.itemsData,this.prevViewData,this._bx,this.dynamicProperties,0,[],!0)},_f.prototype.createStyleElement=function(t,e,r){var s,i=new SVGStyleData(t,e),a=i.pElem;if("st"===t.ty)s=new SVGStrokeStyleData(this,t,r,i);else if("fl"===t.ty)s=new SVGFillStyleData(this,t,r,i);else if("gf"===t.ty||"gs"===t.ty){var n="gf"===t.ty?SVGGradientFillStyleData:SVGGradientStrokeStyleData;s=new n(this,t,r,i),this._x.defs.appendChild(s.gf),s.maskId&&(this._x.defs.appendChild(s.ms),this._x.defs.appendChild(s.of),a.setAttribute("mask","url(#"+s.maskId+")"))}return"st"!==t.ty&&"gs"!==t.ty||(a.setAttribute("stroke-linecap",this.lcEnum[t.lc]||"round"),a.setAttribute("stroke-linejoin",this.ljEnum[t.lj]||"round"),a.setAttribute("fill-opacity","0"),1===t.lj&&a.setAttribute("stroke-miterlimit",t.ml)),2===t.r&&a.setAttribute("fill-rule","evenodd"),t.ln&&a.setAttribute("id",t.ln),t.cl&&a.setAttribute("class",t.cl),this.stylesList.push(i),s},_f.prototype.createGroupElement=function(t){var e=new ShapeGroupData;return t.ln&&e.gr.setAttribute("id",t.ln),e},_f.prototype.create_af=function(t,e){return new SVGTransformData(_ag._bj(this,t,e),_ai._bo(this,t.o,0,.01,e))},_f.prototype.createShapeElement=function(t,e,r,s){var i=4;"rc"===t.ty?i=5:"el"===t.ty?i=6:"sr"===t.ty&&(i=7);var a=_ah._bp(this,t,i,s),n=new SVGShapeData(e,r,a);return this.shapes.push(n.sh),this.addShapeToModifiers(n),n},_f.prototype.setElementStyles=function(t){var e,r=t.styles,s=this.stylesList.length;for(e=0;e<s;e+=1)this.stylesList[e].closed||r.push(this.stylesList[e])},_f.prototype.reloadShapes=function(){this.firstFrame=!0;var t,e=this.itemsData.length;for(t=0;t<e;t+=1)this.prevViewData[t]=this.itemsData[t];this.searchShapes(this.shapesData,this.itemsData,this.prevViewData,this._bx,this.dynamicProperties,0,[],!0);var t,e=this.dynamicProperties.length;for(t=0;t<e;t+=1)this.dynamicProperties[t].getValue();this.renderModifiers()},_f.prototype.searchShapes=function(t,e,r,s,i,a,n,o){var h,l,p,m,f,c,d=[].concat(n),u=t.length-1,y=[],g=[];for(h=u;h>=0;h-=1){if(c=this.searchProcessedElement(t[h]),c?e[h]=r[c-1]:t[h]._render=o,"fl"==t[h].ty||"st"==t[h].ty||"gf"==t[h].ty||"gs"==t[h].ty)c?e[h].style.closed=!1:e[h]=this.createStyleElement(t[h],a,i),t[h]._render&&s.appendChild(e[h].style.pElem),y.push(e[h].style);else if("gr"==t[h].ty){if(c)for(p=e[h].it.length,l=0;l<p;l+=1)e[h].prevViewData[l]=e[h].it[l];else e[h]=this.createGroupElement(t[h]);this.searchShapes(t[h].it,e[h].it,e[h].prevViewData,e[h].gr,i,a+1,d,o),t[h]._render&&s.appendChild(e[h].gr)}else"tr"==t[h].ty?(c||(e[h]=this.create_af(t[h],i)),m=e[h].transform,d.push(m)):"sh"==t[h].ty||"rc"==t[h].ty||"el"==t[h].ty||"sr"==t[h].ty?(c||(e[h]=this.createShapeElement(t[h],d,a,i)),this.setElementStyles(e[h])):"tm"==t[h].ty||"rd"==t[h].ty||"ms"==t[h].ty?(c?(f=e[h],f.closed=!1):(f=_as.getModifier(t[h].ty),f.init(this,t[h],i),e[h]=f,this.shapeModifiers.push(f)),g.push(f)):"rp"==t[h].ty&&(c?(f=e[h],f.closed=!0):(f=_as.getModifier(t[h].ty),e[h]=f,f.init(this,t,h,e,i),this.shapeModifiers.push(f),o=!1),g.push(f));this.addProcessedElement(t[h],h+1)}for(u=y.length,h=0;h<u;h+=1)y[h].closed=!0;for(u=g.length,h=0;h<u;h+=1)g[h].closed=!0},_f.prototype.addShapeToModifiers=function(t){var e,r=this.shapeModifiers.length;for(e=0;e<r;e+=1)this.shapeModifiers[e].addShape(t)},_f.prototype.renderModifiers=function(){if(this.shapeModifiers.length){var t,e=this.shapes.length;for(t=0;t<e;t+=1)this.shapes[t].reset();for(e=this.shapeModifiers.length,t=e-1;t>=0;t-=1)this.shapeModifiers[t].processShapes(this.firstFrame)}},_f.prototype._az=function(t){this.prepareRenderableFrame(t),this.prepareProperties(t,this.isInRange)},_f.prototype.renderInnerContent=function(){this.renderModifiers();var t,e=this.stylesList.length;for(t=0;t<e;t+=1)this.stylesList[t].reset();for(this.renderShape(this.shapesData,this.itemsData,null),t=0;t<e;t+=1)(this.stylesList[t].mdf||this.firstFrame)&&(this.stylesList[t].msElem&&(this.stylesList[t].msElem.setAttribute("d",this.stylesList[t].d),this.stylesList[t].d="M0 0"+this.stylesList[t].d),this.stylesList[t].pElem.setAttribute("d",this.stylesList[t].d||"M0 0"))},_f.prototype.renderShape=function(t,e,r){var s,i,a=t.length-1;for(s=0;s<=a;s+=1)i=t[s].ty,"tr"==i?((this.firstFrame||e[s].transform.op.mdf&&r)&&r.setAttribute("opacity",e[s].transform.op.v),(this.firstFrame||e[s].transform.mProps.mdf&&r)&&r.setAttribute("transform",e[s].transform.mProps.v.to2dCSS())):!t[s]._render||"sh"!=i&&"el"!=i&&"rc"!=i&&"sr"!=i?"fl"==i?this.renderFill(t[s],e[s]):"gf"==i?this.renderGradient(t[s],e[s]):"gs"==i?(this.renderGradient(t[s],e[s]),this.renderStroke(t[s],e[s])):"st"==i?this.renderStroke(t[s],e[s]):"gr"==i&&this.renderShape(t[s].it,e[s].it,e[s].gr):this.renderPath(e[s])},_f.prototype.buildShapeString=function(t,e,r,s){var i,a="";for(i=1;i<e;i+=1)1===i&&(a+=" M"+s.applyToPointStringified(t.v[0][0],t.v[0][1])),a+=" C"+s.applyToPointStringified(t.o[i-1][0],t.o[i-1][1])+" "+s.applyToPointStringified(t.i[i][0],t.i[i][1])+" "+s.applyToPointStringified(t.v[i][0],t.v[i][1]);return 1===e&&(a+=" M"+s.applyToPointStringified(t.v[0][0],t.v[0][1])),r&&e&&(a+=" C"+s.applyToPointStringified(t.o[i-1][0],t.o[i-1][1])+" "+s.applyToPointStringified(t.i[0][0],t.i[0][1])+" "+s.applyToPointStringified(t.v[0][0],t.v[0][1]),a+="z"),a},_f.prototype.renderPath=function(t){var e,r,s,i,a,n,o,h,l,p,m,f=t.styles.length,c=t.lvl;for(n=0;n<f;n+=1){if(i=t.sh.mdf||this.firstFrame,t.styles[n].lvl<c)for(h=this.mHelper.reset(),p=c-t.styles[n].lvl,m=t.transformers.length-1;p>0;)i=t.transformers[m].mProps.mdf||i,l=t.transformers[m].mProps.v.props,h.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]),p--,m--;else h=this.identityMatrix;if(o=t.sh.paths,r=o._length,i){for(s="",e=0;e<r;e+=1)a=o.shapes[e],a&&a._length&&(s+=this.buildShapeString(a,a._length,a.c,h));t.caches[n]=s}else s=t.caches[n];t.styles[n].d+=s,t.styles[n].mdf=i||t.styles[n].mdf}},_f.prototype.renderFill=function(t,e){var r=e.style;(e.c.mdf||this.firstFrame)&&r.pElem.setAttribute("fill","rgb("+bm_floor(e.c.v[0])+","+bm_floor(e.c.v[1])+","+bm_floor(e.c.v[2])+")"),(e.o.mdf||this.firstFrame)&&r.pElem.setAttribute("fill-opacity",e.o.v)},_f.prototype.renderGradient=function(t,e){var r=e.gf,s=e.g._hasOpacity,i=e.s.v,a=e.e.v;if(e.o.mdf||this.firstFrame){var n="gf"===t.ty?"fill-opacity":"stroke-opacity";e.style.pElem.setAttribute(n,e.o.v)}if(e.s.mdf||this.firstFrame){var o=1===t.t?"x1":"cx",h="x1"===o?"y1":"cy";r.setAttribute(o,i[0]),r.setAttribute(h,i[1]),s&&!e.g._collapsable&&(e.of.setAttribute(o,i[0]),e.of.setAttribute(h,i[1]))}var l,p,m,f;if(e.g.cmdf||this.firstFrame){l=e.cst;var c=e.g.c;for(m=l.length,p=0;p<m;p+=1)f=l[p],f.setAttribute("offset",c[4*p]+"%"),f.setAttribute("stop-color","rgb("+c[4*p+1]+","+c[4*p+2]+","+c[4*p+3]+")")}if(s&&(e.g.omdf||this.firstFrame)){var d=e.g.o;for(l=e.g._collapsable?e.cst:e.ost,m=l.length,p=0;p<m;p+=1)f=l[p],e.g._collapsable||f.setAttribute("offset",d[2*p]+"%"),f.setAttribute("stop-opacity",d[2*p+1])}if(1===t.t)(e.e.mdf||this.firstFrame)&&(r.setAttribute("x2",a[0]),r.setAttribute("y2",a[1]),s&&!e.g._collapsable&&(e.of.setAttribute("x2",a[0]),e.of.setAttribute("y2",a[1])));else{var u;if((e.s.mdf||e.e.mdf||this.firstFrame)&&(u=Math.sqrt(Math.pow(i[0]-a[0],2)+Math.pow(i[1]-a[1],2)),r.setAttribute("r",u),s&&!e.g._collapsable&&e.of.setAttribute("r",u)),e.e.mdf||e.h.mdf||e.a.mdf||this.firstFrame){u||(u=Math.sqrt(Math.pow(i[0]-a[0],2)+Math.pow(i[1]-a[1],2)));var y=Math.atan2(a[1]-i[1],a[0]-i[0]),g=e.h.v>=1?.99:e.h.v<=-1?-.99:e.h.v,v=u*g,b=Math.cos(y+e.a.v)*v+i[0],E=Math.sin(y+e.a.v)*v+i[1];r.setAttribute("fx",b),r.setAttribute("fy",E),s&&!e.g._collapsable&&(e.of.setAttribute("fx",b),e.of.setAttribute("fy",E))}}},_f.prototype.renderStroke=function(t,e){var r=e.style,s=e.d;s&&(s.mdf||this.firstFrame)&&(r.pElem.setAttribute("stroke-dasharray",s.dashStr),r.pElem.setAttribute("stroke-dashoffset",s.dashoffset[0])),e.c&&(e.c.mdf||this.firstFrame)&&r.pElem.setAttribute("stroke","rgb("+bm_floor(e.c.v[0])+","+bm_floor(e.c.v[1])+","+bm_floor(e.c.v[2])+")"),(e.o.mdf||this.firstFrame)&&r.pElem.setAttribute("stroke-opacity",e.o.v),(e.w.mdf||this.firstFrame)&&(r.pElem.setAttribute("stroke-width",e.w.v),r.msElem&&r.msElem.setAttribute("stroke-width",e.w.v))},_f.prototype.destroy=function(){this.destroy_e(),this.shapeData=null,this.itemsData=null},_k.prototype.initElement=function(t,e,r){this.lettersChangedFlag=!0,this.initFrame(),this.initBaseData(t,e,r),this.textAnimator=new _bl(t.t,this.renderType,this),this.textProperty=new _ar(this,t.t,this.dynamicProperties),this.initTransform(t,e,r),this.initHierarchy(),this.initRenderable(),this.initRendererElement(),this.createContainerElements(),this.addMasks(),this.createContent(),this.textAnimator.searchProperties(this.dynamicProperties)},_k.prototype._az=function(t){this.prepareRenderableFrame(t),this.prepareProperties(t,this.isInRange),(this.textProperty.mdf||this.textProperty.firstFrame)&&(this.buildNewText(),this.textProperty.firstFrame=!1)},_k.prototype.createPathShape=function(t,e){var r,s,i=e.length,a="";for(r=0;r<i;r+=1)s=e[r].ks.k,a+=this.buildShapeString(s,s.i.length,!0,t);return a},_k.prototype.updateDocumentData=function(t,e){this.textProperty.updateDocumentData(t,e)},_k.prototype.applyTextPropertiesToMatrix=function(t,e,r,s,i){switch(t.ps&&e.translate(t.ps[0],t.ps[1]+t.ascent,0),e.translate(0,-t.ls,0),t.j){case 1:e.translate(t.justifyOffset+(t.boxWidth-t.lineWidths[r]),0,0);break;case 2:e.translate(t.justifyOffset+(t.boxWidth-t.lineWidths[r])/2,0,0)}e.translate(s,i,0)},_k.prototype.buildColor=function(t){return"rgb("+Math.round(255*t[0])+","+Math.round(255*t[1])+","+Math.round(255*t[2])+")"},_k.prototype.buildShapeString=_f.prototype.buildShapeString,_k.prototype.emptyProp=new LetterProps,_k.prototype.destroy=function(){},extendPrototype([_e,_af,_ad,_ac,RenderableDOMElement],_g),_g.prototype.initElement=function(t,e,r){this.initFrame(),this.initBaseData(t,e,r),this.initTransform(t,e,r),this.initRenderable(),this.initHierarchy(),this.initRendererElement(),this.createContainerElements(),this.addMasks(),!this.data.xt&&e.progressiveLoad||this.buildAllItems(),this.hide()},_g.prototype._az=function(t){if(this.prepareRenderableFrame(t),this.prepareProperties(t,this.isInRange),this.isInRange||this.data.xt){if(this.tm._placeholder)this.renderedFrame=t/this.data.sr;else{var e=this.tm.v;e===this.data.op&&(e=this.data.op-1),this.renderedFrame=e}var r,s=this._br.length;for(this.completeLayers||this.checkLayers(this.renderedFrame),r=0;r<s;r+=1)(this.completeLayers||this._br[r])&&this._br[r]._az(this.renderedFrame-this.layers[r].st)}},_g.prototype.renderInnerContent=function(){var t,e=this.layers.length;for(t=0;t<e;t+=1)(this.completeLayers||this._br[t])&&this._br[t]._ba()},_g.prototype.setElements=function(t){this._br=t},_g.prototype.getElements=function(){return this._br},_g.prototype.destroyElements=function(){var t,e=this.layers.length;for(t=0;t<e;t+=1)this._br[t]&&this._br[t].destroy()},_g.prototype.destroy=function(){this.destroyElements(),this.destroy_e()},extendPrototype([_e,_af,_d,_ad,_ac,RenderableDOMElement],_h),_h.prototype.createContent=function(){var t=this._x.getAssetsPath(this.assetData);this._cc=createNS("image"),this._cc.setAttribute("width",this.assetData.w+"px"),this._cc.setAttribute("height",this.assetData.h+"px"),this._cc.setAttribute("preserveAspectRatio","xMidYMid slice"),this._cc.setAttributeNS("http://www.w3.org/1999/xlink","href",t),this._bx.appendChild(this._cc)},extendPrototype([_h],_j),_j.prototype.createContent=function(){var t=createNS("rect");t.setAttribute("width",this.data.sw),t.setAttribute("height",this.data.sh),t.setAttribute("fill",this.data.sc),this._bx.appendChild(t)},extendPrototype([_ao,_g,_d],SVGCompElement),extendPrototype([_e,_af,_d,_ad,_ac,RenderableDOMElement,_k],SVGTextElement),SVGTextElement.prototype.createContent=function(){this.data.ln&&this._bx.setAttribute("id",this.data.ln),this.data.cl&&this._bx.setAttribute("class",this.data.cl),this.data.singleShape&&!this._x.fontManager.chars&&(this.textContainer=createNS("text"))},SVGTextElement.prototype.buildNewText=function(){var t,e,r=this.textProperty.currentData;this._bt=Array.apply(null,{length:r?r.l.length:0}),r.fc?this._bx.setAttribute("fill",this.buildColor(r.fc)):this._bx.setAttribute("fill","rgba(0,0,0,0)"),r.sc&&(this._bx.setAttribute("stroke",this.buildColor(r.sc)),this._bx.setAttribute("stroke-width",r.sw)),this._bx.setAttribute("font-size",r.s);var s=this._x.fontManager.getFontByName(r.f);if(s.fClass)this._bx.setAttribute("class",s.fClass);else{this._bx.setAttribute("font-family",s.fFamily);var i=r.fWeight,a=r.fStyle;this._bx.setAttribute("font-style",a),this._bx.setAttribute("font-weight",i)}var n=r.l||[],o=this._x.fontManager.chars;if(e=n.length){var h,l,p=this.mHelper,m="",f=this.data.singleShape,c=0,d=0,u=!0,y=r.tr/1e3*r.s;if(f&&!o){var g=this.textContainer,v="";switch(r.j){case 1:v="end";break;case 2:v="middle";break;case 2:v="start"}g.setAttribute("text-anchor",v),g.setAttribute("letter-spacing",y);var b=r.t.split(String.fromCharCode(13));e=b.length;var d=r.ps?r.ps[1]+r.ascent:0;for(t=0;t<e;t+=1)h=this.textSpans[t]||createNS("tspan"),h.textContent=b[t],h.setAttribute("x",0),h.setAttribute("y",d),h.style.display="inherit",g.appendChild(h),this.textSpans[t]=h,d+=r.lh;this._bx.appendChild(g)}else{var E,P,x=this.textSpans.length;for(t=0;t<e;t+=1)o&&f&&0!==t||(h=x>t?this.textSpans[t]:createNS(o?"path":"text"),x<=t&&(h.setAttribute("stroke-linecap","butt"),h.setAttribute("stroke-linejoin","round"),h.setAttribute("stroke-miterlimit","4"),this.textSpans[t]=h,this._bx.appendChild(h)),h.style.display="inherit"),p.reset(),o?(p.scale(r.s/100,r.s/100),f&&(n[t].n&&(c=-y,d+=r.yOffset,d+=u?1:0,u=!1),this.applyTextPropertiesToMatrix(r,p,n[t].line,c,d),c+=n[t].l||0,c+=y),P=this._x.fontManager.getCharData(r.t.charAt(t),s.fStyle,this._x.fontManager.getFontByName(r.f).fFamily),E=P&&P.data||{},l=E.shapes?E.shapes[0].it:[],f?m+=this.createPathShape(p,l):h.setAttribute("d",this.createPathShape(p,l))):(h.textContent=n[t].val,h.setAttributeNS("http://www.w3.org/XML/1998/namespace","xml:space","preserve"));f&&h.setAttribute("d",m)}for(;t<this.textSpans.length;)this.textSpans[t].style.display="none",t+=1;this._sizeChanged=!0}},SVGTextElement.prototype.sourceRectAtTime=function(t){if(this._az(this.comp.renderedFrame-this.data.st),this.renderInnerContent(),this._sizeChanged){this._sizeChanged=!1;var e=this._bx.getBBox();this.bbox={top:e.y,left:e.x,width:e.width,height:e.height}}return this.bbox},SVGTextElement.prototype.renderInnerContent=function(){if(!this.data.singleShape&&(this.textAnimator.getMeasures(this.textProperty.currentData,this.lettersChangedFlag),this.lettersChangedFlag||this.textAnimator.lettersChangedFlag)){this._sizeChanged=!0;var t,e,r=this.textAnimator._bt,s=this.textProperty.currentData.l;e=s.length;var i,a;for(t=0;t<e;t+=1)s[t].n||(i=r[t],a=this.textSpans[t],i.mdf.m&&a.setAttribute("transform",i.m),i.mdf.o&&a.setAttribute("opacity",i.o),i.mdf.sw&&a.setAttribute("stroke-width",i.sw),i.mdf.sc&&a.setAttribute("stroke",i.sc),i.mdf.fc&&a.setAttribute("fill",i.fc))}},_bb.prototype._ba=function(t){if(t||this.filterManager.mdf){var e=this.filterManager.effectElements[0].p.v,r=this.filterManager.effectElements[1].p.v,s=this.filterManager.effectElements[2].p.v/100;this.matrixFilter.setAttribute("values",r[0]-e[0]+" 0 0 0 "+e[0]+" "+(r[1]-e[1])+" 0 0 0 "+e[1]+" "+(r[2]-e[2])+" 0 0 0 "+e[2]+" 0 0 0 "+s+" 0")}},_bc.prototype._ba=function(t){if(t||this.filterManager.mdf){var e=this.filterManager.effectElements[2].p.v,r=this.filterManager.effectElements[6].p.v;this.matrixFilter.setAttribute("values","0 0 0 0 "+e[0]+" 0 0 0 0 "+e[1]+" 0 0 0 0 "+e[2]+" 0 0 0 "+r+" 0")}},_bd.prototype.initialize=function(){var t,e,r,s,i=this.elem._bx.children||this.elem._bx.childNodes;for(1===this.filterManager.effectElements[1].p.v?(s=this.elem.maskManager.masksProperties.length,r=0):(r=this.filterManager.effectElements[0].p.v-1,s=r+1),e=createNS("g"),e.setAttribute("fill","none"),e.setAttribute("stroke-linecap","round"),e.setAttribute("stroke-dashoffset",1),r;r<s;r+=1)t=createNS("path"),e.appendChild(t),this.paths.push({p:t,m:r});if(3===this.filterManager.effectElements[10].p.v){var a=createNS("mask"),n="stms_"+randomString(10);a.setAttribute("id",n),a.setAttribute("mask-type","alpha"),a.appendChild(e),this.elem._x.defs.appendChild(a);var o=createNS("g");o.setAttribute("mask","url("+locationHref+"#"+n+")"),i[0]&&o.appendChild(i[0]),this.elem._bx.appendChild(o),this.masker=a,e.setAttribute("stroke","#fff")}else if(1===this.filterManager.effectElements[10].p.v||2===this.filterManager.effectElements[10].p.v){if(2===this.filterManager.effectElements[10].p.v)for(var i=this.elem._bx.children||this.elem._bx.childNodes;i.length;)this.elem._bx.removeChild(i[0]);this.elem._bx.appendChild(e),this.elem._bx.removeAttribute("mask"),e.setAttribute("stroke","#fff")}this.initialized=!0,this.pathMasker=e},_bd.prototype._ba=function(t){this.initialized||this.initialize();var e,r,s,i=this.paths.length;for(e=0;e<i;e+=1)if(r=this.elem.maskManager.viewData[this.paths[e].m],s=this.paths[e].p,(t||this.filterManager.mdf||r.prop.mdf)&&s.setAttribute("d",r.lastPath),t||this.filterManager.effectElements[9].p.mdf||this.filterManager.effectElements[4].p.mdf||this.filterManager.effectElements[7].p.mdf||this.filterManager.effectElements[8].p.mdf||r.prop.mdf){var a;if(0!==this.filterManager.effectElements[7].p.v||100!==this.filterManager.effectElements[8].p.v){var n=Math.min(this.filterManager.effectElements[7].p.v,this.filterManager.effectElements[8].p.v)/100,o=Math.max(this.filterManager.effectElements[7].p.v,this.filterManager.effectElements[8].p.v)/100,h=s.getTotalLength();a="0 0 0 "+h*n+" ";var l,p=h*(o-n),m=1+2*this.filterManager.effectElements[4].p.v*this.filterManager.effectElements[9].p.v/100,f=Math.floor(p/m);for(l=0;l<f;l+=1)a+="1 "+2*this.filterManager.effectElements[4].p.v*this.filterManager.effectElements[9].p.v/100+" ";a+="0 "+10*h+" 0 0"}else a="1 "+2*this.filterManager.effectElements[4].p.v*this.filterManager.effectElements[9].p.v/100;s.setAttribute("stroke-dasharray",a)}if((t||this.filterManager.effectElements[4].p.mdf)&&this.pathMasker.setAttribute("stroke-width",2*this.filterManager.effectElements[4].p.v),(t||this.filterManager.effectElements[6].p.mdf)&&this.pathMasker.setAttribute("opacity",this.filterManager.effectElements[6].p.v),(1===this.filterManager.effectElements[10].p.v||2===this.filterManager.effectElements[10].p.v)&&(t||this.filterManager.effectElements[3].p.mdf)){var c=this.filterManager.effectElements[3].p.v;this.pathMasker.setAttribute("stroke","rgb("+bm_floor(255*c[0])+","+bm_floor(255*c[1])+","+bm_floor(255*c[2])+")")}},_be.prototype._ba=function(t){if(t||this.filterManager.mdf){var e=this.filterManager.effectElements[0].p.v,r=this.filterManager.effectElements[1].p.v,s=this.filterManager.effectElements[2].p.v,i=s[0]+" "+r[0]+" "+e[0],a=s[1]+" "+r[1]+" "+e[1],n=s[2]+" "+r[2]+" "+e[2];this.feFuncR.setAttribute("tableValues",i),this.feFuncG.setAttribute("tableValues",a),this.feFuncB.setAttribute("tableValues",n)}},_bf.prototype.createFeFunc=function(t,e){var r=createNS(t);return r.setAttribute("type","table"),e.appendChild(r),r},_bf.prototype.getTableValue=function(t,e,r,s,i){for(var a,n,o=0,h=256,l=Math.min(t,e),p=Math.max(t,e),m=Array.call(null,{length:h}),f=0,c=i-s,d=e-t;o<=256;)a=o/256,n=a<=l?d<0?i:s:a>=p?d<0?s:i:s+c*Math.pow((a-t)/d,1/r),m[f++]=n,o+=256/(h-1);return m.join(" ")},_bf.prototype._ba=function(t){if(t||this.filterManager.mdf){var e,r=this.filterManager.effectElements;this.feFuncRComposed&&(t||r[3].p.mdf||r[4].p.mdf||r[5].p.mdf||r[6].p.mdf||r[7].p.mdf)&&(e=this.getTableValue(r[3].p.v,r[4].p.v,r[5].p.v,r[6].p.v,r[7].p.v),this.feFuncRComposed.setAttribute("tableValues",e),this.feFuncGComposed.setAttribute("tableValues",e),this.feFuncBComposed.setAttribute("tableValues",e)),this.feFuncR&&(t||r[10].p.mdf||r[11].p.mdf||r[12].p.mdf||r[13].p.mdf||r[14].p.mdf)&&(e=this.getTableValue(r[10].p.v,r[11].p.v,r[12].p.v,r[13].p.v,r[14].p.v),this.feFuncR.setAttribute("tableValues",e)),this.feFuncG&&(t||r[17].p.mdf||r[18].p.mdf||r[19].p.mdf||r[20].p.mdf||r[21].p.mdf)&&(e=this.getTableValue(r[17].p.v,r[18].p.v,r[19].p.v,r[20].p.v,r[21].p.v),this.feFuncG.setAttribute("tableValues",e)),this.feFuncB&&(t||r[24].p.mdf||r[25].p.mdf||r[26].p.mdf||r[27].p.mdf||r[28].p.mdf)&&(e=this.getTableValue(r[24].p.v,r[25].p.v,r[26].p.v,r[27].p.v,r[28].p.v),this.feFuncB.setAttribute("tableValues",e)),this.feFuncA&&(t||r[31].p.mdf||r[32].p.mdf||r[33].p.mdf||r[34].p.mdf||r[35].p.mdf)&&(e=this.getTableValue(r[31].p.v,r[32].p.v,r[33].p.v,r[34].p.v,r[35].p.v),this.feFuncA.setAttribute("tableValues",e))}},_bg.prototype._ba=function(t){if(t||this.filterManager.mdf){if((t||this.filterManager.effectElements[4].p.mdf)&&this.feGaussianBlur.setAttribute("stdDeviation",this.filterManager.effectElements[4].p.v/4),t||this.filterManager.effectElements[0].p.mdf){var e=this.filterManager.effectElements[0].p.v;this.feFlood.setAttribute("flood-color",rgbToHex(Math.round(255*e[0]),Math.round(255*e[1]),Math.round(255*e[2])))}if((t||this.filterManager.effectElements[1].p.mdf)&&this.feFlood.setAttribute("flood-opacity",this.filterManager.effectElements[1].p.v/255),t||this.filterManager.effectElements[2].p.mdf||this.filterManager.effectElements[3].p.mdf){var r=this.filterManager.effectElements[3].p.v,s=(this.filterManager.effectElements[2].p.v-90)*degToRads,i=r*Math.cos(s),a=r*Math.sin(s);this.feOffset.setAttribute("dx",i),this.feOffset.setAttribute("dy",a)}}};var _svgMatteSymbols=[],_svgMatteMaskCounter=0;_bh.prototype.findSymbol=function(t){for(var e=0,r=_svgMatteSymbols.length;e<r;){if(_svgMatteSymbols[e]===t)return _svgMatteSymbols[e];e+=1}return null},_bh.prototype.replaceInParent=function(t,e){var r=t._bx.parentNode;if(r){for(var s=r.children,i=0,a=s.length;i<a&&s[i]!==t._bx;)i+=1;var n;i<=a-2&&(n=s[i+1]);var o=createNS("use");o.setAttribute("href","#"+e),n?r.insertBefore(o,n):r.appendChild(o)}},_bh.prototype.setElementAsMask=function(t,e){if(!this.findSymbol(e)){var r="matte_"+randomString(5)+"_"+_svgMatteMaskCounter++,s=createNS("mask");s.setAttribute("id",e.layerId),s.setAttribute("mask-type","alpha"),_svgMatteSymbols.push(e);var i=t._x.defs;i.appendChild(s);var a=createNS("symbol");a.setAttribute("id",r),this.replaceInParent(e,r),a.appendChild(e._bx),i.appendChild(a),useElem=createNS("use"),useElem.setAttribute("href","#"+r),s.appendChild(useElem),e.data.hd=!1,e.show()}t.setMatte(e.layerId)},_bh.prototype.initialize=function(){for(var t=this.filterManager.effectElements[0].p.v,e=0,r=this.elem.comp._br.length;e<r;)this.elem.comp._br[e].data.ind===t&&this.setElementAsMask(this.elem,this.elem.comp._br[e]),e+=1;this.initialized=!0},_bh.prototype._ba=function(){this.initialized||this.initialize()},_bi.prototype._ba=function(t){var e,r=this.filters.length;for(e=0;e<r;e+=1)this.filters[e]._ba(t)},_n.prototype.duplicate=function(){var t=2*this._length,e=this.savedOp;this.savedOp=createTypedArray("float32",t),this.savedOp.set(e);var r=0;for(r=this._length;r<t;r+=1)this.saved[r]=createTypedArray("float32",16);this._length=t},_n.prototype.reset=function(){this.cArrPos=0,this.cTr.reset(),this.cO=1},_c.prototype.createElements=function(){this.checkParenting()},_c.prototype.initRendererElement=function(){},_c.prototype.createContainerElements=function(){this.canvasContext=this._x.canvasContext,this.effectsManager=new _o(this)},_c.prototype.createContent=function(){},_c.prototype.setBlendMode=function(){var t=this._x;if(t.blendMode!==this.data.bm){t.blendMode=this.data.bm;var e=this.getBlendMode();t.canvasContext.globalCompositeOperation=e}},_c.prototype.addMasks=function(){this.maskManager=new _q(this.data,this,this._x)},_c.prototype.hideElement=function(){this.hidden||this.isInRange&&!this.isTransparent||(this.hidden=!0)},_c.prototype.showElement=function(){this.isInRange&&!this.isTransparent&&(this.hidden=!1,this.firstFrame=!0,this.maskManager.firstFrame=!0)},_c.prototype._ba=function(){this.hidden||(this.renderTransform(),this.renderRenderable(),this.setBlendMode(),this._x.renderer.save(),this._x.renderer.ctxTransform(this.finalTransform.mat.props),this._x.renderer.ctxOpacity(this.finalTransform.mProp.o.v),this.renderInnerContent(),this._x.renderer.restore(),this.maskManager.hasMasks&&this._x.renderer.restore(!0),this.firstFrame&&(this.firstFrame=!1))},_c.prototype.hide=_c.prototype.hideElement,_c.prototype.show=_c.prototype.showElement,_c.prototype.destroy=function(){this.canvasContext=null,this.data=null,this._x=null,this.maskManager.destroy()},_c.prototype.mHelper=new Matrix,extendPrototype([_e,_af,_c,_ad,_ac,_ae],_p),_p.prototype.initElement=_f.prototype.initElement,_p.prototype._az=_h.prototype._az,_p.prototype.imageLoaded=function(){if(this._x.elementLoaded(),this.assetData.w!==this.img.width||this.assetData.h!==this.img.height){var t=createTag("canvas");t.width=this.assetData.w,t.height=this.assetData.h;var e,r,s=t.getContext("2d"),i=this.img.width,a=this.img.height,n=i/a,o=this.assetData.w/this.assetData.h;n>o?(r=a,e=r*o):(e=i,r=e/o),s.drawImage(this.img,(i-e)/2,(a-r)/2,e,r,0,0,this.assetData.w,this.assetData.h),this.img=t}},_p.prototype.imageFailed=function(){this.failed=!0,this._x.elementLoaded()},_p.prototype.createContent=function(){var t=this.img;t.addEventListener("load",this.imageLoaded.bind(this),!1),t.addEventListener("error",this.imageFailed.bind(this),!1);var e=this._x.getAssetsPath(this.assetData);
-t.src=e},_p.prototype.renderInnerContent=function(t){this.failed||this.canvasContext.drawImage(this.img,0,0)},_p.prototype.destroy=function(){this.img=null,this.destroy_e()},extendPrototype([_aq,_g,_c],_m),_m.prototype.renderInnerContent=function(){var t,e=this.layers.length;for(t=e-1;t>=0;t-=1)(this.completeLayers||this._br[t])&&this._br[t]._ba()},_m.prototype.destroy=function(){var t,e=this.layers.length;for(t=e-1;t>=0;t-=1)this._br[t].destroy();this.layers=null,this._br=null},_q.prototype._az=function(t){var e,r=this.dynamicProperties.length;for(e=0;e<r;e+=1)this.dynamicProperties[e].getValue(t),this.dynamicProperties[e].mdf&&(this.element._x.mdf=!0)},_q.prototype._ba=function(t){if(this.hasMasks){var e,r,s,i,a,n=this.element.canvasContext,o=this.masksProperties.length;for(n.beginPath(),e=0;e<o;e++)if("n"!==this.masksProperties[e].mode){this.masksProperties[e].inv&&(n.moveTo(0,0),n.lineTo(this.element._x.compWidth,0),n.lineTo(this.element._x.compWidth,this.element._x.compHeight),n.lineTo(0,this.element._x.compHeight),n.lineTo(0,0)),a=this.viewData[e].v,r=t?t.applyToPointArray(a.v[0][0],a.v[0][1],0):a.v[0],n.moveTo(r[0],r[1]);var h,l=a._length;for(h=1;h<l;h++)r=t?t.applyToPointArray(a.o[h-1][0],a.o[h-1][1],0):a.o[h-1],s=t?t.applyToPointArray(a.i[h][0],a.i[h][1],0):a.i[h],i=t?t.applyToPointArray(a.v[h][0],a.v[h][1],0):a.v[h],n.bezierCurveTo(r[0],r[1],s[0],s[1],i[0],i[1]);r=t?t.applyToPointArray(a.o[h-1][0],a.o[h-1][1],0):a.o[h-1],s=t?t.applyToPointArray(a.i[0][0],a.i[0][1],0):a.i[0],i=t?t.applyToPointArray(a.v[0][0],a.v[0][1],0):a.v[0],n.bezierCurveTo(r[0],r[1],s[0],s[1],i[0],i[1])}this.element._x.renderer.save(!0),n.clip()}},_q.prototype.getMaskProperty=_ay.prototype.getMaskProperty,_q.prototype.destroy=function(){this.element=null},extendPrototype([_e,_af,_c,_ad,_ac,_ae],_r),_r.prototype.initElement=function(t,e,r){this.initFrame(),this.initBaseData(t,e,r),this.initTransform(t,e,r),this.initHierarchy(),this.initRenderable(),this.initRendererElement(),this.createContainerElements(),this.addMasks(),this.createContent(),this.hide()},_r.prototype.transformHelper={opacity:1,mat:new Matrix,matMdf:!1,opMdf:!1},_r.prototype.dashResetter=[],_r.prototype.createContent=function(){this.searchShapes(this.shapesData,this.itemsData,this.prevViewData,this.dynamicProperties,!0)},_r.prototype.createStyleElement=function(t,e){var r={data:t,type:t.ty,_br:[]},s={};if("fl"!=t.ty&&"st"!=t.ty||(s.c=_ai._bo(this,t.c,1,255,e),s.c.k||(r.co="rgb("+bm_floor(s.c.v[0])+","+bm_floor(s.c.v[1])+","+bm_floor(s.c.v[2])+")")),s.o=_ai._bo(this,t.o,0,.01,e),"st"==t.ty){if(r.lc=this.lcEnum[t.lc]||"round",r.lj=this.ljEnum[t.lj]||"round",1==t.lj&&(r.ml=t.ml),s.w=_ai._bo(this,t.w,0,null,e),s.w.k||(r.wi=s.w.v),t.d){var i=new DashProperty(this,t.d,"canvas",e);s.d=i,s.d.k||(r.da=s.d.dashArray,r["do"]=s.d.dashoffset[0])}}else r.r=2===t.r?"evenodd":"nonzero";return this.stylesList.push(r),s.style=r,s},_r.prototype.createGroupElement=function(t){var e={it:[],prevViewData:[]};return e},_r.prototype.create_af=function(t,e){var r={transform:{mat:new Matrix,opacity:1,matMdf:!1,opMdf:!1,op:_ai._bo(this,t.o,0,.01,e),mProps:_ag._bj(this,t,e)},_br:[]};return r},_r.prototype.createShapeElement=function(t,e){var r={nodes:[],trNodes:[],tr:[0,0,0,0,0,0]},s=4;"rc"==t.ty?s=5:"el"==t.ty?s=6:"sr"==t.ty&&(s=7),r.sh=_ah._bp(this,t,s,e),this.shapes.push(r.sh),this.addShapeToModifiers(r);var i,a=this.stylesList.length,n=!1,o=!1;for(i=0;i<a;i+=1)this.stylesList[i].closed||(this.stylesList[i]._br.push(r),"st"===this.stylesList[i].type?n=!0:o=!0);return r.st=n,r.fl=o,r},_r.prototype.reloadShapes=function(){this.firstFrame=!0;var t,e=this.itemsData.length;for(t=0;t<e;t+=1)this.prevViewData[t]=this.itemsData[t];this.searchShapes(this.shapesData,this.itemsData,this.prevViewData,this.dynamicProperties,!0);var t,e=this.dynamicProperties.length;for(t=0;t<e;t+=1)this.dynamicProperties[t].getValue();this.renderModifiers()},_r.prototype.searchShapes=function(t,e,r,s,i){var a,n,o,h,l=t.length-1,p=[],m=[];for(a=l;a>=0;a-=1){if(h=this.searchProcessedElement(t[a]),h?e[a]=r[h-1]:t[a]._render=i,"fl"==t[a].ty||"st"==t[a].ty)h?e[a].style.closed=!1:e[a]=this.createStyleElement(t[a],s),p.push(e[a].style);else if("gr"==t[a].ty){if(h)for(o=e[a].it.length,n=0;n<o;n+=1)e[a].prevViewData[n]=e[a].it[n];else e[a]=this.createGroupElement(t[a]);this.searchShapes(t[a].it,e[a].it,e[a].prevViewData,s,i)}else if("tr"==t[a].ty)h||(e[a]=this.create_af(t[a],s));else if("sh"==t[a].ty||"rc"==t[a].ty||"el"==t[a].ty||"sr"==t[a].ty)h||(e[a]=this.createShapeElement(t[a],s));else if("tm"==t[a].ty||"rd"==t[a].ty){if(h)f=e[a],f.closed=!1;else{var f=_as.getModifier(t[a].ty);f.init(this,t[a],s),e[a]=f,this.shapeModifiers.push(f)}m.push(f)}else"rp"==t[a].ty&&(h?(f=e[a],f.closed=!0):(f=_as.getModifier(t[a].ty),e[a]=f,f.init(this,t,a,e,s),this.shapeModifiers.push(f),i=!1),m.push(f));this.addProcessedElement(t[a],a+1)}for(l=p.length,a=0;a<l;a+=1)p[a].closed=!0;for(l=m.length,a=0;a<l;a+=1)m[a].closed=!0},_r.prototype.addShapeToModifiers=_f.prototype.addShapeToModifiers,_r.prototype.renderModifiers=_f.prototype.renderModifiers,_r.prototype.lcEnum=_f.prototype.lcEnum,_r.prototype.ljEnum=_f.prototype.ljEnum,_r.prototype.searchProcessedElement=_f.prototype.searchProcessedElement,_r.prototype.addProcessedElement=_f.prototype.addProcessedElement,_r.prototype._az=_f.prototype._az,_r.prototype.renderInnerContent=function(){this.transformHelper.mat.reset(),this.transformHelper.opacity=this.finalTransform.mProp.o.v,this.transformHelper.matMdf=!1,this.transformHelper.opMdf=this.finalTransform.opMdf,this.renderModifiers(),this.renderShape(this.transformHelper,null,null,!0)},_r.prototype.renderShape=function(t,e,r,s){var i,a;if(!e)for(e=this.shapesData,a=this.stylesList.length,i=0;i<a;i+=1)this.stylesList[i].d="",this.stylesList[i].mdf=!1;r||(r=this.itemsData),a=e.length-1;var n,o;for(n=t,i=a;i>=0;i-=1)if("tr"==e[i].ty){n=r[i].transform;var h=r[i].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*=r[i].transform.op.v,n.matMdf=!!t.matMdf||n.matMdf,n.opMdf=!!t.opMdf||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[i].ty||"el"==e[i].ty||"rc"==e[i].ty||"sr"==e[i].ty?this.renderPath(e[i],r[i],n):"fl"==e[i].ty?this.renderFill(e[i],r[i],n):"st"==e[i].ty?this.renderStroke(e[i],r[i],n):"gr"==e[i].ty?this.renderShape(n,e[i].it,r[i].it):"tm"==e[i].ty;if(s){a=this.stylesList.length;var p,m,f,c,d,u,y,g=this._x.renderer,v=this._x.canvasContext;for(i=0;i<a;i+=1)if(y=this.stylesList[i].type,("st"!==y||0!==this.stylesList[i].wi)&&this.stylesList[i].data._render){for(g.save(),d=this.stylesList[i]._br,"st"===y?(v.strokeStyle=this.stylesList[i].co,v.lineWidth=this.stylesList[i].wi,v.lineCap=this.stylesList[i].lc,v.lineJoin=this.stylesList[i].lj,v.miterLimit=this.stylesList[i].ml||0):v.fillStyle=this.stylesList[i].co,g.ctxOpacity(this.stylesList[i].coOp),"st"!==y&&v.beginPath(),m=d.length,p=0;p<m;p+=1){for("st"===y&&(v.beginPath(),this.stylesList[i].da?(v.setLineDash(this.stylesList[i].da),v.lineDashOffset=this.stylesList[i]["do"],this._x.isDashed=!0):this._x.isDashed&&(v.setLineDash(this.dashResetter),this._x.isDashed=!1)),u=d[p].trNodes,c=u.length,f=0;f<c;f+=1)"m"==u[f].t?v.moveTo(u[f].p[0],u[f].p[1]):"c"==u[f].t?v.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]):v.closePath();"st"===y&&v.stroke()}"st"!==y&&v.fill(this.stylesList[i].r),g.restore()}this.firstFrame&&(this.firstFrame=!1)}},_r.prototype.renderPath=function(t,e,r){var s,i,a,n,o=r.matMdf||e.sh.mdf||this.firstFrame;if(o){var h=e.sh.paths,l=r.mat;n=t._render===!1?0:h._length;var p=e.trNodes;for(p.length=0,a=0;a<n;a+=1){var m=h.shapes[a];if(m&&m.v){for(s=m._length,i=1;i<s;i+=1)1==i&&p.push({t:"m",p:l.applyToPointArray(m.v[0][0],m.v[0][1],0)}),p.push({t:"c",p1:l.applyToPointArray(m.o[i-1][0],m.o[i-1][1],0),p2:l.applyToPointArray(m.i[i][0],m.i[i][1],0),p3:l.applyToPointArray(m.v[i][0],m.v[i][1],0)});1==s&&p.push({t:"m",p:l.applyToPointArray(m.v[0][0],m.v[0][1],0)}),m.c&&s&&(p.push({t:"c",p1:l.applyToPointArray(m.o[i-1][0],m.o[i-1][1],0),p2:l.applyToPointArray(m.i[0][0],m.i[0][1],0),p3:l.applyToPointArray(m.v[0][0],m.v[0][1],0)}),p.push({t:"z"})),e.lStr=p}}if(e.st)for(i=0;i<16;i+=1)e.tr[i]=r.mat.props[i];e.trNodes=p}},_r.prototype.renderFill=function(t,e,r){var s=e.style;(e.c.mdf||this.firstFrame)&&(s.co="rgb("+bm_floor(e.c.v[0])+","+bm_floor(e.c.v[1])+","+bm_floor(e.c.v[2])+")"),(e.o.mdf||r.opMdf||this.firstFrame)&&(s.coOp=e.o.v*r.opacity)},_r.prototype.renderStroke=function(t,e,r){var s=e.style,i=e.d;i&&(i.mdf||this.firstFrame)&&(s.da=i.dashArray,s["do"]=i.dashoffset[0]),(e.c.mdf||this.firstFrame)&&(s.co="rgb("+bm_floor(e.c.v[0])+","+bm_floor(e.c.v[1])+","+bm_floor(e.c.v[2])+")"),(e.o.mdf||r.opMdf||this.firstFrame)&&(s.coOp=e.o.v*r.opacity),(e.w.mdf||this.firstFrame)&&(s.wi=e.w.v)},_r.prototype.destroy=function(){this.shapesData=null,this._x=null,this.canvasContext=null,this.stylesList.length=0,this.itemsData.length=0},extendPrototype([_e,_af,_c,_ad,_ac,_ae],_s),_s.prototype.initElement=_f.prototype.initElement,_s.prototype._az=_h.prototype._az,_s.prototype.renderInnerContent=function(){var t=this.canvasContext;t.fillStyle=this.data.sc,t.fillRect(0,0,this.data.sw,this.data.sh)},extendPrototype([_e,_af,_c,_ad,_ac,_ae,_k],_t),_t.prototype.tHelper=createTag("canvas").getContext("2d"),_t.prototype.buildNewText=function(){var t=this.textProperty.currentData;this._bt=Array.apply(null,{length:t.l?t.l.length:0});var e=!1;t.fc?(e=!0,this.values.fill=this.buildColor(t.fc)):this.values.fill="rgba(0,0,0,0)",this.fill=e;var r=!1;t.sc&&(r=!0,this.values.stroke=this.buildColor(t.sc),this.values.sWidth=t.sw);var s,i,a=this._x.fontManager.getFontByName(t.f),n=t.l,o=this.mHelper;this.stroke=r,this.values.fValue=t.s+"px "+this._x.fontManager.getFontByName(t.f).fFamily,i=t.t.length;var h,l,p,m,f,c,d,u,y,g,v=this.data.singleShape,b=t.tr/1e3*t.s,E=0,P=0,x=!0,S=0;for(s=0;s<i;s+=1){for(h=this._x.fontManager.getCharData(t.t.charAt(s),a.fStyle,this._x.fontManager.getFontByName(t.f).fFamily),l=h&&h.data||{},o.reset(),v&&n[s].n&&(E=-b,P+=t.yOffset,P+=x?1:0,x=!1),f=l.shapes?l.shapes[0].it:[],d=f.length,o.scale(t.s/100,t.s/100),v&&this.applyTextPropertiesToMatrix(t,o,n[s].line,E,P),y=Array.apply(null,{length:d}),c=0;c<d;c+=1){for(m=f[c].ks.k.i.length,u=f[c].ks.k,g=[],p=1;p<m;p+=1)1==p&&g.push(o.applyToX(u.v[0][0],u.v[0][1],0),o.applyToY(u.v[0][0],u.v[0][1],0)),g.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));g.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[c]=g}v&&(E+=n[s].l,E+=b),this.textSpans[S]?this.textSpans[S].elem=y:this.textSpans[S]={elem:y},S+=1}},_t.prototype.renderInnerContent=function(){var t=this.canvasContext;this.finalTransform.mat.props;t.font=this.values.fValue,t.lineCap="butt",t.lineJoin="miter",t.miterLimit=4,this.data.singleShape||this.textAnimator.getMeasures(this.textProperty.currentData,this.lettersChangedFlag);var e,r,s,i,a,n,o=this.textAnimator._bt,h=this.textProperty.currentData.l;r=h.length;var l,p,m,f=null,c=null,d=null;for(e=0;e<r;e+=1)if(!h[e].n){if(l=o[e],l&&(this._x.renderer.save(),this._x.renderer.ctxTransform(l.p),this._x.renderer.ctxOpacity(l.o)),this.fill){for(l&&l.fc?f!==l.fc&&(f=l.fc,t.fillStyle=l.fc):f!==this.values.fill&&(f=this.values.fill,t.fillStyle=this.values.fill),p=this.textSpans[e].elem,i=p.length,this._x.canvasContext.beginPath(),s=0;s<i;s+=1)for(m=p[s],n=m.length,this._x.canvasContext.moveTo(m[0],m[1]),a=2;a<n;a+=6)this._x.canvasContext.bezierCurveTo(m[a],m[a+1],m[a+2],m[a+3],m[a+4],m[a+5]);this._x.canvasContext.closePath(),this._x.canvasContext.fill()}if(this.stroke){for(l&&l.sw?d!==l.sw&&(d=l.sw,t.lineWidth=l.sw):d!==this.values.sWidth&&(d=this.values.sWidth,t.lineWidth=this.values.sWidth),l&&l.sc?c!==l.sc&&(c=l.sc,t.strokeStyle=l.sc):c!==this.values.stroke&&(c=this.values.stroke,t.strokeStyle=this.values.stroke),p=this.textSpans[e].elem,i=p.length,this._x.canvasContext.beginPath(),s=0;s<i;s+=1)for(m=p[s],n=m.length,this._x.canvasContext.moveTo(m[0],m[1]),a=2;a<n;a+=6)this._x.canvasContext.bezierCurveTo(m[a],m[a+1],m[a+2],m[a+3],m[a+4],m[a+5]);this._x.canvasContext.closePath(),this._x.canvasContext.stroke()}l&&this._x.renderer.restore()}},_o.prototype._ba=function(){},_b.prototype.checkBlendMode=function(){},_b.prototype.get_e=_d.prototype.get_e,_b.prototype.initRendererElement=function(){this._by=createTag("div"),this.data.hasMask?(this._cf=createNS("svg"),this._bx=createNS("g"),this._ca=this._bx,this._cf.appendChild(this._bx),this._by.appendChild(this._cf)):this._bx=this._by,styleDiv(this._by)},_b.prototype.createContainerElements=function(){this.effectsManager=new _o(this),this._bz=this._by,this._ca=this._bx,this.data.ln&&this._bx.setAttribute("id",this.data.ln),0!==this.data.bm&&this.setBlendMode(),this.checkParenting()},_b.prototype.renderElement=function(){this.finalTransform.matMdf&&(this._bz.style.transform=this._bz.style.webkitTransform=this.finalTransform.mat.toCSS()),this.finalTransform.opMdf&&(this._bz.style.opacity=this.finalTransform.mProp.o.v)},_b.prototype._ba=function(){this.data.hd||this.hidden||(this.renderTransform(),this.renderRenderable(),this.renderElement(),this.renderInnerContent(),this.firstFrame&&(this.firstFrame=!1))},_b.prototype.destroy=function(){this._bx=null,this._bz=null,this.matteElement&&(this.matteElement=null),this.maskManager&&(this.maskManager.destroy(),this.maskManager=null)},_b.prototype.getDomElement=function(){return this._bx},_b.prototype.addMasks=function(){this.maskManager=new _ay(this.data,this,this._x)},_b.prototype.setMatte=function(){},_b.prototype.buildElementParenting=_ap.prototype.buildElementParenting,extendPrototype([_e,_af,_b,_ad,_ac,RenderableDOMElement],_aa),_aa.prototype.createContent=function(){var t;this.data.hasMask?(t=createNS("rect"),t.setAttribute("width",this.data.sw),t.setAttribute("height",this.data.sh),t.setAttribute("fill",this.data.sc),this._cf.setAttribute("width",this.data.sw),this._cf.setAttribute("height",this.data.sh)):(t=createTag("div"),t.style.width=this.data.sw+"px",t.style.height=this.data.sh+"px",t.style.backgroundColor=this.data.sc),this._bx.appendChild(t)},extendPrototype([_ap,_g,_b],_w),_w.prototype.createContainerElements=function(){this.data.hasMask?(this._bz=this._bx,this._cf.setAttribute("width",this.data.w),this._cf.setAttribute("height",this.data.h)):this._bz=this._bx,this.effectsManager=new _o(this),this.checkParenting()},extendPrototype([_e,_af,_aa,_f,_b,_ad,_ac,_ae],_z),_z.prototype._renderShapeFrame=_z.prototype.renderInnerContent,_z.prototype.createContent=function(){var t;if(this.data.hasMask)this._bx.appendChild(this.shapesContainer),t=this._cf;else{t=createNS("svg");var e=this.comp.data?this.comp.data:this._x.compSize;t.setAttribute("width",e.w),t.setAttribute("height",e.h),t.appendChild(this.shapesContainer),this._bx.appendChild(t)}this.searchShapes(this.shapesData,this.itemsData,this.prevViewData,this.shapesContainer,this.dynamicProperties,0,[],!0),this.shapeCont=t},_z.prototype.renderInnerContent=function(){if(this._renderShapeFrame(),!this.hidden&&this.firstFrame){var t=this.shapeCont.getBBox(),e=!1;this._cg.w!==t.width&&(this._cg.w=t.width,this.shapeCont.setAttribute("width",t.width),e=!0),this._cg.h!==t.height&&(this._cg.h=t.height,this.shapeCont.setAttribute("height",t.height),e=!0),(e||this._cg.x!==t.x||this._cg.y!==t.y)&&(this._cg.w=t.width,this._cg.h=t.height,this._cg.x=t.x,this._cg.y=t.y,this.shapeCont.setAttribute("viewBox",this._cg.x+" "+this._cg.y+" "+this._cg.w+" "+this._cg.h),this.shapeCont.style.transform=this.shapeCont.style.webkitTransform="translate("+this._cg.x+"px,"+this._cg.y+"px)")}},extendPrototype([_e,_af,_b,_ad,_ac,RenderableDOMElement,_k],_ab),_ab.prototype.createContent=function(){if(this.isMasked=this.checkMasks(),this.isMasked){this.renderType="svg",this.compW=this.comp.data.w,this.compH=this.comp.data.h,this._cf.setAttribute("width",this.compW),this._cf.setAttribute("height",this.compH);var t=createNS("g");this._ca.appendChild(t),this._cc=t}else this.renderType="html",this._cc=this._bx;this.checkParenting()},_ab.prototype.buildNewText=function(){var t=this.textProperty.currentData;this._bt=Array.apply(null,{length:this.textProperty.currentData.l?this.textProperty.currentData.l.length:0});var e=this._cc.style;e.color=e.fill=t.fc?this.buildColor(t.fc):"rgba(0,0,0,0)",t.sc&&(e.stroke=this.buildColor(t.sc),e.strokeWidth=t.sw+"px");var r=this._x.fontManager.getFontByName(t.f);if(!this._x.fontManager.chars)if(e.fontSize=t.s+"px",e.lineHeight=t.s+"px",r.fClass)this._cc.className=r.fClass;else{e.fontFamily=r.fFamily;var s=t.fWeight,i=t.fStyle;e.fontStyle=i,e.fontWeight=s}var a,n,o=t.l;n=o.length;var h,l,p,m,f=this.mHelper,c="",d=0;for(a=0;a<n;a+=1){if(this._x.fontManager.chars?(this.textPaths[d]?h=this.textPaths[d]:(h=createNS("path"),h.setAttribute("stroke-linecap","butt"),h.setAttribute("stroke-linejoin","round"),h.setAttribute("stroke-miterlimit","4")),this.isMasked||(this.textSpans[d]?(l=this.textSpans[d],p=l.children[0]):(l=createTag("div"),p=createNS("svg"),p.appendChild(h),styleDiv(l)))):this.isMasked?h=this.textPaths[d]?this.textPaths[d]:createNS("text"):this.textSpans[d]?(l=this.textSpans[d],h=this.textPaths[d]):(l=createTag("span"),styleDiv(l),h=createTag("span"),styleDiv(h),l.appendChild(h)),this._x.fontManager.chars){var u,y=this._x.fontManager.getCharData(t.t.charAt(a),r.fStyle,this._x.fontManager.getFontByName(t.f).fFamily);if(u=y?y.data:null,f.reset(),u&&u.shapes&&(m=u.shapes[0].it,f.scale(t.s/100,t.s/100),c=this.createPathShape(f,m),h.setAttribute("d",c)),this.isMasked)this._cc.appendChild(h);else if(this._cc.appendChild(l),u&&u.shapes){var g=p.getBBox();p.setAttribute("width",g.width+2),p.setAttribute("height",g.height+2),p.setAttribute("viewBox",g.x-1+" "+(g.y-1)+" "+(g.width+2)+" "+(g.height+2)),p.style.transform=p.style.webkitTransform="translate("+(g.x-1)+"px,"+(g.y-1)+"px)",o[a].yOffset=g.y-1,l.appendChild(p)}else p.setAttribute("width",1),p.setAttribute("height",1)}else h.textContent=o[a].val,h.setAttributeNS("http://www.w3.org/XML/1998/namespace","xml:space","preserve"),this.isMasked?this._cc.appendChild(h):(this._cc.appendChild(l),h.style.transform=h.style.webkitTransform="translate3d(0,"+-t.s/1.2+"px,0)");this.isMasked?this.textSpans[d]=h:this.textSpans[d]=l,this.textSpans[d].style.display="block",this.textPaths[d]=h,d+=1}for(;d<this.textSpans.length;)this.textSpans[d].style.display="none",d+=1},_ab.prototype.renderInnerContent=function(){if(this.data.singleShape){if(!this.firstFrame&&!this.lettersChangedFlag)return;this.isMasked&&this.finalTransform.matMdf&&(this._cf.setAttribute("viewBox",-this.finalTransform.mProp.p.v[0]+" "+-this.finalTransform.mProp.p.v[1]+" "+this.compW+" "+this.compH),this._cf.style.transform=this._cf.style.webkitTransform="translate("+-this.finalTransform.mProp.p.v[0]+"px,"+-this.finalTransform.mProp.p.v[1]+"px)")}if(this.textAnimator.getMeasures(this.textProperty.currentData,this.lettersChangedFlag),this.lettersChangedFlag||this.textAnimator.lettersChangedFlag){var t,e,r=0,s=this.textAnimator._bt,i=this.textProperty.currentData.l;e=i.length;var a,n,o;for(t=0;t<e;t+=1)i[t].n?r+=1:(n=this.textSpans[t],o=this.textPaths[t],a=s[r],r+=1,this.isMasked?n.setAttribute("transform",a.m):n.style.transform=n.style.webkitTransform=a.m,n.style.opacity=a.o,a.sw&&o.setAttribute("stroke-width",a.sw),a.sc&&o.setAttribute("stroke",a.sc),a.fc&&(o.setAttribute("fill",a.fc),o.style.color=a.fc));if(this.isVisible&&this.firstFrame&&this._cc.getBBox){var h=this._cc.getBBox();this._cg.w!==h.width&&(this._cg.w=h.width,this._cf.setAttribute("width",h.width)),this._cg.h!==h.height&&(this._cg.h=h.height,this._cf.setAttribute("height",h.height));var l=1;this._cg.w===h.width+2*l&&this._cg.h===h.height+2*l&&this._cg.x===h.x-l&&this._cg.y===h.y-l||(this._cg.w=h.width+2*l,this._cg.h=h.height+2*l,this._cg.x=h.x-l,this._cg.y=h.y-l,this._cf.setAttribute("viewBox",this._cg.x+" "+this._cg.y+" "+this._cg.w+" "+this._cg.h),this._cf.style.transform=this._cf.style.webkitTransform="translate("+this._cg.x+"px,"+this._cg.y+"px)")}}},extendPrototype([_e,_af,_b,_aa,_ad,_ac,_ae],_y),_y.prototype.createContent=function(){var t=this._x.getAssetsPath(this.assetData),e=new Image;this.data.hasMask?(this.imageElem=createNS("image"),this.imageElem.setAttribute("width",this.assetData.w+"px"),this.imageElem.setAttribute("height",this.assetData.h+"px"),this.imageElem.setAttributeNS("http://www.w3.org/1999/xlink","href",t),this._bx.appendChild(this.imageElem),this._by.setAttribute("width",this.assetData.w),this._by.setAttribute("height",this.assetData.h)):this._bx.appendChild(e),e.src=t,this.data.ln&&this._cc.setAttribute("id",this.data.ln),this.checkParenting()},extendPrototype([_e,_ac],_v),_v.prototype.setup=function(){var t,e,r=this.comp.threeDElements.length;for(t=0;t<r;t+=1)e=this.comp.threeDElements[t],e.perspectiveElem.style.perspective=e.perspectiveElem.style.webkitPerspective=this.pe.v+"px",e.container.style.transformOrigin=e.container.style.mozTransformOrigin=e.container.style.webkitTransformOrigin="0px 0px 0px",e.perspectiveElem.style.transform=e.perspectiveElem.style.webkitTransform="matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1)"},_v.prototype.createElements=function(){},_v.prototype.hide=function(){},_v.prototype._ba=function(){var t,e,r=this.firstFrame;if(this.hierarchy)for(e=this.hierarchy.length,t=0;t<e;t+=1)r=!!this.hierarchy[t].finalTransform.mProp.mdf||r;if(r||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 s=[this.p.v[0]-this.a.v[0],this.p.v[1]-this.a.v[1],this.p.v[2]-this.a.v[2]],i=Math.sqrt(Math.pow(s[0],2)+Math.pow(s[1],2)+Math.pow(s[2],2)),a=[s[0]/i,s[1]/i,s[2]/i],n=Math.sqrt(a[2]*a[2]+a[0]*a[0]),o=Math.atan2(a[1],n),h=Math.atan2(a[0],-a[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._x.compSize.w/2,this._x.compSize.h/2,0),this.mat.translate(0,0,this.pe.v),this.hierarchy){var l;for(e=this.hierarchy.length,t=0;t<e;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])}if(!this._prevMat.equals(this.mat)){e=this.comp.threeDElements.length;var p;for(t=0;t<e;t+=1)p=this.comp.threeDElements[t],p.container.style.transform=p.container.style.webkitTransform=this.mat.toCSS();this.mat.clone(this._prevMat)}}this.firstFrame=!1},_v.prototype._az=function(t){this.prepareProperties(t,!0)},_v.prototype.destroy=function(){},_v.prototype.initExpressions=function(){},_v.prototype.get_e=function(){return null},_bv.prototype._ba=function(){};var animationManager=function(){function t(t){for(var e=0,r=t.target;e<S;)P[e].animation===r&&(P.splice(e,1),e-=1,S-=1,r.isPaused||s()),e+=1}function e(t,e){if(!t)return null;for(var r=0;r<S;){if(P[r].elem==t&&null!==P[r].elem)return P[r].animation;r+=1}var s=new _a;return i(s,t),s.setData(t,e),s}function r(){A+=1,b()}function s(){A-=1,0===A&&(C=!0)}function i(e,i){e.addEventListener("destroy",t),e.addEventListener("_active",r),e.addEventListener("_idle",s),P.push({elem:i,animation:e}),S+=1}function a(t){var e=new _a;return i(e,null),e.setParams(t),e}function n(t,e){var r;for(r=0;r<S;r+=1)P[r].animation.setSpeed(t,e)}function o(t,e){var r;for(r=0;r<S;r+=1)P[r].animation.setDirection(t,e)}function h(t){var e;for(e=0;e<S;e+=1)P[e].animation.play(t)}function l(t,e){x=Date.now();var r;for(r=0;r<S;r+=1)P[r].animation.moveFrame(t,e)}function p(t){var e,r=t-x;for(e=0;e<S;e+=1)P[e].animation.advanceTime(r);x=t,C?k=!0:window.requestAnimationFrame(p)}function m(t){x=t,window.requestAnimationFrame(p)}function f(t){var e;for(e=0;e<S;e+=1)P[e].animation.pause(t)}function c(t,e,r){var s;for(s=0;s<S;s+=1)P[s].animation.goToAndStop(t,e,r)}function d(t){var e;for(e=0;e<S;e+=1)P[e].animation.stop(t)}function u(t){var e;for(e=0;e<S;e+=1)P[e].animation.togglePause(t)}function y(t){var e;for(e=S-1;e>=0;e-=1)P[e].animation.destroy(t)}function g(t,r,s){var i,a=[].concat([].slice.call(document.getElementsByClassName("lottie")),[].slice.call(document.getElementsByClassName("bodymovin"))),n=a.length;for(i=0;i<n;i+=1)s&&a[i].setAttribute("data-bm-type",s),e(a[i],t);if(r&&0===n){s||(s="svg");var o=document.getElementsByTagName("body")[0];o.innerHTML="";var h=createTag("div");h.style.width="100%",h.style.height="100%",h.setAttribute("data-bm-type",s),o.appendChild(h),e(h,t)}}function v(){var t;for(t=0;t<S;t+=1)P[t].animation.resize()}function b(){C&&(C=!1,k&&(window.requestAnimationFrame(m),k=!1))}var E={},P=[],x=0,S=0,C=!0,A=0,k=!0;return E.registerAnimation=e,E.loadAnimation=a,E.setSpeed=n,E.setDirection=o,E.play=h,E.moveFrame=l,E.pause=f,E.stop=d,E.togglePause=u,E.searchAnimations=g,E.resize=v,E.goToAndStop=c,E.destroy=y,E}(),_a=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.animationData={},this.layers=[],this.assets=[],this.isPaused=!0,this.autoplay=!1,this.loop=!0,this.renderer=null,this.animationID=randomString(10),this.assetsPath="",this.timeCompleted=0,this.segmentPos=0,this.subframeEnabled=subframeEnabled,this.segments=[],this.pendingSegment=!1,this._idle=!0,this.projectInterface=ProjectInterface()};_a.prototype.setParams=function(t){var e=this;t.context&&(this.context=t.context),(t.wrapper||t.container)&&(this.wrapper=t.wrapper||t.container);var r=t.animType?t.animType:t.renderer?t.renderer:"svg";switch(r){case"canvas":this.renderer=new _aq(this,t.rendererSettings);break;case"svg":this.renderer=new _ao(this,t.rendererSettings);break;case"hybrid":case"html":default:this.renderer=new _ap(this,t.rendererSettings)}if(this.renderer.setProjectInterface(this.projectInterface),this.animType=r,""===t.loop||null===t.loop||(t.loop===!1?this.loop=!1:t.loop===!0?this.loop=!0:this.loop=parseInt(t.loop)),this.autoplay=!("autoplay"in t)||t.autoplay,this.name=t.name?t.name:"",this.autoloadSegments=!t.hasOwnProperty("autoloadSegments")||t.autoloadSegments,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 s=new XMLHttpRequest;t.path.lastIndexOf("\\")!=-1?this.path=t.path.substr(0,t.path.lastIndexOf("\\")+1):this.path=t.path.substr(0,t.path.lastIndexOf("/")+1),this.assetsPath=t.assetsPath,this.fileName=t.path.substr(t.path.lastIndexOf("/")+1),this.fileName=this.fileName.substr(0,this.fileName.lastIndexOf(".json")),s.open("GET",t.path,!0),s.send(),s.onreadystatechange=function(){if(4==s.readyState)if(200==s.status)e.configAnimation(JSON.parse(s.responseText));else try{var t=JSON.parse(s.responseText);e.configAnimation(t)}catch(r){}}}},_a.prototype.setData=function(t,e){var r={wrapper:t,animationData:e?"object"==typeof e?e:JSON.parse(e):null},s=t.attributes;r.path=s.getNamedItem("data-animation-path")?s.getNamedItem("data-animation-path").value:s.getNamedItem("data-bm-path")?s.getNamedItem("data-bm-path").value:s.getNamedItem("bm-path")?s.getNamedItem("bm-path").value:"",r.animType=s.getNamedItem("data-anim-type")?s.getNamedItem("data-anim-type").value:s.getNamedItem("data-bm-type")?s.getNamedItem("data-bm-type").value:s.getNamedItem("bm-type")?s.getNamedItem("bm-type").value:s.getNamedItem("data-bm-renderer")?s.getNamedItem("data-bm-renderer").value:s.getNamedItem("bm-renderer")?s.getNamedItem("bm-renderer").value:"canvas";var i=s.getNamedItem("data-anim-loop")?s.getNamedItem("data-anim-loop").value:s.getNamedItem("data-bm-loop")?s.getNamedItem("data-bm-loop").value:s.getNamedItem("bm-loop")?s.getNamedItem("bm-loop").value:"";""===i||("false"===i?r.loop=!1:"true"===i?r.loop=!0:r.loop=parseInt(i));var a=s.getNamedItem("data-anim-autoplay")?s.getNamedItem("data-anim-autoplay").value:s.getNamedItem("data-bm-autoplay")?s.getNamedItem("data-bm-autoplay").value:!s.getNamedItem("bm-autoplay")||s.getNamedItem("bm-autoplay").value;r.autoplay="false"!==a,
-r.name=s.getNamedItem("data-name")?s.getNamedItem("data-name").value:s.getNamedItem("data-bm-name")?s.getNamedItem("data-bm-name").value:s.getNamedItem("bm-name")?s.getNamedItem("bm-name").value:"";var n=s.getNamedItem("data-anim-prerender")?s.getNamedItem("data-anim-prerender").value:s.getNamedItem("data-bm-prerender")?s.getNamedItem("data-bm-prerender").value:s.getNamedItem("bm-prerender")?s.getNamedItem("bm-prerender").value:"";"false"===n&&(r.prerender=!1),this.setParams(r)},_a.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,r,s=this.animationData.layers,i=s.length,a=t.layers,n=a.length;for(r=0;r<n;r+=1)for(e=0;e<i;){if(s[e].id==a[r].id){s[e]=a[r];break}e+=1}if((t.chars||t.fonts)&&(this.renderer._x.fontManager.addChars(t.chars),this.renderer._x.fontManager.addFonts(t.fonts,this.renderer._x.defs)),t.assets)for(i=t.assets.length,e=0;e<i;e+=1)this.animationData.assets.push(t.assets[e]);this.animationData.__complete=!1,dataManager.completeData(this.animationData,this.renderer._x.fontManager),this.renderer.includeLayers(t.layers),expressionsPlugin&&expressionsPlugin.initExpressions(this),this.renderer._ba(null),this.loadNextSegment()},_a.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 r=new XMLHttpRequest,s=this,i=this.path+this.fileName+"_"+this.segmentPos+".json";this.segmentPos+=1,r.open("GET",i,!0),r.send(),r.onreadystatechange=function(){if(4==r.readyState)if(200==r.status)s.includeLayers(JSON.parse(r.responseText));else try{var t=JSON.parse(r.responseText);s.includeLayers(t)}catch(e){}}},_a.prototype.loadSegments=function(){var t=this.animationData.segments;t||(this.timeCompleted=this.animationData.tf),this.loadNextSegment()},_a.prototype.configAnimation=function(t){var e=this;this.renderer&&this.renderer.destroyed||(this.animationData=t,this.totalFrames=Math.floor(this.animationData.op-this.animationData.ip),this.animationData.tf=this.totalFrames,this.renderer.configAnimation(t),t.assets||(t.assets=[]),t.comps&&(t.assets=t.assets.concat(t.comps),t.comps=null),this.renderer.searchExtraCompositions(t.assets),this.layers=this.animationData.layers,this.assets=this.animationData.assets,this.frameRate=this.animationData.fr,this.firstFrame=Math.round(this.animationData.ip),this.frameMult=this.animationData.fr/1e3,this.trigger("config_ready"),this.imagePreloader=new ImagePreloader,this.imagePreloader.setAssetsPath(this.assetsPath),this.imagePreloader.setPath(this.path),this.imagePreloader.loadAssets(t.assets,function(t){t||e.trigger("loaded_images")}),this.loadSegments(),this.updaFrameModifier(),this.renderer._x.fontManager?this.waitForFontsLoaded():(dataManager.completeData(this.animationData,this.renderer._x.fontManager),this.checkLoaded()))},_a.prototype.waitForFontsLoaded=function(){function t(){this.renderer._x.fontManager.loaded?(dataManager.completeData(this.animationData,this.renderer._x.fontManager),this.checkLoaded()):setTimeout(t.bind(this),20)}return function(){t.bind(this)()}}(),_a.prototype.addPendingElement=function(){this.pendingElements+=1},_a.prototype.elementLoaded=function(){this.pendingElements--,this.checkLoaded()},_a.prototype.checkLoaded=function(){0===this.pendingElements&&(expressionsPlugin&&expressionsPlugin.initExpressions(this),this.renderer.initItems(),setTimeout(function(){this.trigger("DOMLoaded")}.bind(this),0),this.isLoaded=!0,this.gotoFrame(),this.autoplay&&this.play())},_a.prototype.resize=function(){this.renderer.updateContainerSize()},_a.prototype.setSubframe=function(t){this.subframeEnabled=!!t},_a.prototype.gotoFrame=function(){this.currentFrame=this.subframeEnabled?this.currentRawFrame:~~this.currentRawFrame,this.timeCompleted!==this.totalFrames&&this.currentFrame>this.timeCompleted&&(this.currentFrame=this.timeCompleted),this.trigger("enterFrame"),this._ba()},_a.prototype._ba=function(){this.isLoaded!==!1&&this.renderer._ba(this.currentFrame+this.firstFrame)},_a.prototype.play=function(t){t&&this.name!=t||this.isPaused===!0&&(this.isPaused=!1,this._idle&&(this._idle=!1,this.trigger("_active")))},_a.prototype.pause=function(t){t&&this.name!=t||this.isPaused===!1&&(this.isPaused=!0,this.pendingSegment||(this._idle=!0,this.trigger("_idle")))},_a.prototype.togglePause=function(t){t&&this.name!=t||(this.isPaused===!0?this.play():this.pause())},_a.prototype.stop=function(t){t&&this.name!=t||(this.pause(),this.currentFrame=this.currentRawFrame=0,this.playCount=0,this.gotoFrame())},_a.prototype.goToAndStop=function(t,e,r){r&&this.name!=r||(e?this.setCurrentRawFrameValue(t):this.setCurrentRawFrameValue(t*this.frameModifier),this.pause())},_a.prototype.goToAndPlay=function(t,e,r){this.goToAndStop(t,e,r),this.play()},_a.prototype.advanceTime=function(t){return this.pendingSegment?(this.pendingSegment=!1,this.adjustSegment(this.segments.shift()),void(this.isPaused&&this.play())):void(this.isPaused!==!0&&this.isLoaded!==!1&&this.setCurrentRawFrameValue(this.currentRawFrame+t*this.frameModifier))},_a.prototype.updateAnimation=function(t){this.setCurrentRawFrameValue(this.totalFrames*t)},_a.prototype.moveFrame=function(t,e){e&&this.name!=e||this.setCurrentRawFrameValue(this.currentRawFrame+t)},_a.prototype.adjustSegment=function(t){this.playCount=0,t[1]<t[0]?(this.frameModifier>0&&(this.playSpeed<0?this.setSpeed(-this.playSpeed):this.setDirection(-1)),this.totalFrames=t[0]-t[1],this.firstFrame=t[1],this.setCurrentRawFrameValue(this.totalFrames-.001)):t[1]>t[0]&&(this.frameModifier<0&&(this.playSpeed<0?this.setSpeed(-this.playSpeed):this.setDirection(1)),this.totalFrames=t[1]-t[0],this.firstFrame=t[0],this.setCurrentRawFrameValue(.001)),this.trigger("segmentStart")},_a.prototype.setSegment=function(t,e){var r=-1;this.isPaused&&(this.currentRawFrame+this.firstFrame<t?r=t:this.currentRawFrame+this.firstFrame>e&&(r=e-t)),this.firstFrame=t,this.totalFrames=e-t,r!==-1&&this.goToAndStop(r,!0)},_a.prototype.playSegments=function(t,e){if("object"==typeof t[0]){var r,s=t.length;for(r=0;r<s;r+=1)this.segments.push(t[r])}else this.segments.push(t);e&&this.adjustSegment(this.segments.shift()),this.isPaused&&this.play()},_a.prototype.resetSegments=function(t){this.segments.length=0,this.segments.push([this.animationData.ip,this.animationData.op]),t&&this.adjustSegment(this.segments.shift())},_a.prototype.checkSegments=function(){this.segments.length&&(this.pendingSegment=!0)},_a.prototype.remove=function(t){t&&this.name!=t||this.renderer.destroy()},_a.prototype.destroy=function(t){t&&this.name!=t||this.renderer&&this.renderer.destroyed||(this.renderer.destroy(),this.trigger("destroy"),this._cbs=null,this.onEnterFrame=this.onLoopComplete=this.onComplete=this.onSegmentStart=this.onDestroy=null,this.renderer=null)},_a.prototype.setCurrentRawFrameValue=function(t){this.currentRawFrame=t;var e=!1;this.currentRawFrame>=this.totalFrames?(this.checkSegments(),this.loop===!1?(this.currentRawFrame=this.totalFrames,e=!0):(this.trigger("loopComplete"),this.playCount+=1,this.loop!==!0&&this.playCount==this.loop||this.pendingSegment?(this.currentRawFrame=this.totalFrames,e=!0):this.currentRawFrame=this.currentRawFrame%this.totalFrames)):this.currentRawFrame<0&&(this.checkSegments(),this.playCount-=1,this.playCount<0&&(this.playCount=0),this.loop===!1||this.pendingSegment?(this.currentRawFrame=0,e=!0):(this.trigger("loopComplete"),this.currentRawFrame=(this.totalFrames+this.currentRawFrame)%this.totalFrames)),this.gotoFrame(),e&&(this.pause(),this.trigger("complete"))},_a.prototype.setSpeed=function(t){this.playSpeed=t,this.updaFrameModifier()},_a.prototype.setDirection=function(t){this.playDirection=t<0?-1:1,this.updaFrameModifier()},_a.prototype.updaFrameModifier=function(){this.frameModifier=this.frameMult*this.playSpeed*this.playDirection},_a.prototype.getPath=function(){return this.path},_a.prototype.getAssetsPath=function(t){var e="";if(this.assetsPath){var r=t.p;r.indexOf("images/")!==-1&&(r=r.split("/")[1]),e=this.assetsPath+r}else e=this.path,e+=t.u?t.u:"",e+=t.p;return e},_a.prototype.getAssetData=function(t){for(var e=0,r=this.assets.length;e<r;){if(t==this.assets[e].id)return this.assets[e];e+=1}},_a.prototype.hide=function(){this.renderer.hide()},_a.prototype.show=function(){this.renderer.show()},_a.prototype.getAssets=function(){return this.assets},_a.prototype.trigger=function(t){if(this._cbs&&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))},_a.prototype.addEventListener=_addEventListener,_a.prototype.removeEventListener=_removeEventListener,_a.prototype.triggerEvent=_triggerEvent;var Expressions=function(){function t(t){t.renderer.compInterface=CompExpressionInterface(t.renderer),t.renderer._x.projectInterface.registerComposition(t.renderer)}var e={};return e.initExpressions=t,e}();expressionsPlugin=Expressions;var ExpressionManager=function(){function duplicatePropertyValue(t,e){if(e=e||1,"number"==typeof t||t instanceof Number)return t*e;if(t.i)return shape_pool.clone(t);var r,s=createTypedArray("float32",t.length),i=t.length;for(r=0;r<i;r+=1)s[r]=t[r]*e;return s}function isTypeOfArray(t){return t.constructor===Array||t.constructor===Float32Array}function shapesEqual(t,e){if(t._length!==e._length||t.c!==e.c)return!1;var r,s=t._length;for(r=0;r<s;r+=1)if(t.v[r][0]!==e.v[r][0]||t.v[r][1]!==e.v[r][1]||t.o[r][0]!==e.o[r][0]||t.o[r][1]!==e.o[r][1]||t.i[r][0]!==e.i[r][0]||t.i[r][1]!==e.i[r][1])return!1;return!0}function $bm_neg(t){var e=typeof t;if("number"===e||"boolean"===e||t instanceof Number)return-t;if(isTypeOfArray(t)){var r,s=t.length,i=[];for(r=0;r<s;r+=1)i[r]=-t[r];return i}}function sum(t,e){var r=typeof t,s=typeof e;if("string"===r||"string"===s)return t+e;if(("number"===r||"boolean"===r||"string"===r||t instanceof Number)&&("number"===s||"boolean"===s||"string"===s||e instanceof Number))return t+e;if(isTypeOfArray(t)&&("number"===s||"boolean"===s||"string"===s||e instanceof Number))return t[0]=t[0]+e,t;if(("number"===r||"boolean"===r||"string"===r||t instanceof Number)&&isTypeOfArray(e))return e[0]=t+e[0],e;if(isTypeOfArray(t)&&isTypeOfArray(e)){for(var i=0,a=t.length,n=e.length,o=[];i<a||i<n;)("number"==typeof t[i]||t[i]instanceof Number)&&("number"==typeof e[i]||e[i]instanceof Number)?o[i]=t[i]+e[i]:o[i]=void 0==e[i]?t[i]:t[i]||e[i],i+=1;return o}return 0}function sub(t,e){var r=typeof t,s=typeof e;if(("number"===r||"boolean"===r||"string"===r||t instanceof Number)&&("number"===s||"boolean"===s||"string"===s||e instanceof Number))return"string"===r&&(t=parseInt(t)),"string"===s&&(e=parseInt(e)),t-e;if(isTypeOfArray(t)&&("number"===s||"boolean"===s||"string"===s||e instanceof Number))return t[0]=t[0]-e,t;if(("number"===r||"boolean"===r||"string"===r||t instanceof Number)&&isTypeOfArray(e))return e[0]=t-e[0],e;if(isTypeOfArray(t)&&isTypeOfArray(e)){for(var i=0,a=t.length,n=e.length,o=[];i<a||i<n;)"number"==typeof t[i]||t[i]instanceof Number?o[i]=t[i]-e[i]:o[i]=void 0==e[i]?t[i]:t[i]||e[i],i+=1;return o}return 0}function mul(t,e){var r,s=typeof t,i=typeof e;if(("number"===s||"boolean"===s||"string"===s||t instanceof Number)&&("number"===i||"boolean"===i||"string"===i||e instanceof Number))return t*e;var a,n;if(isTypeOfArray(t)&&("number"===i||"boolean"===i||"string"===i||e instanceof Number)){for(n=t.length,r=createTypedArray("float32",n),a=0;a<n;a+=1)r[a]=t[a]*e;return r}if(("number"===s||"boolean"===s||"string"===s||t instanceof Number)&&isTypeOfArray(e)){for(n=e.length,r=createTypedArray("float32",n),a=0;a<n;a+=1)r[a]=t*e[a];return r}return 0}function div(t,e){var r,s=typeof t,i=typeof e;if(("number"===s||"boolean"===s||"string"===s||t instanceof Number)&&("number"===i||"boolean"===i||"string"===i||e instanceof Number))return t/e;var a,n;if(isTypeOfArray(t)&&("number"===i||"boolean"===i||"string"===i||e instanceof Number)){for(n=t.length,r=createTypedArray("float32",n),a=0;a<n;a+=1)r[a]=t[a]/e;return r}if(("number"===s||"boolean"===s||"string"===s||t instanceof Number)&&isTypeOfArray(e)){for(n=e.length,r=createTypedArray("float32",n),a=0;a<n;a+=1)r[a]=t/e[a];return r}return 0}function mod(t,e){return"string"==typeof t&&(t=parseInt(t)),"string"==typeof e&&(e=parseInt(e)),t%e}function clamp(t,e,r){if(e>r){var s=r;r=e,e=s}return Math.min(Math.max(t,e),r)}function radiansToDegrees(t){return t/degToRads}function degreesToRadians(t){return t*degToRads}function length(t,e){if("number"==typeof t||t instanceof Number)return e=e||0,Math.abs(t-e);e||(e=helperLengthArray);var r,s=Math.min(t.length,e.length),i=0;for(r=0;r<s;r+=1)i+=Math.pow(e[r]-t[r],2);return Math.sqrt(i)}function normalize(t){return div(t,length(t))}function rgbToHsl(t){var e,r,s=t[0],i=t[1],a=t[2],n=Math.max(s,i,a),o=Math.min(s,i,a),h=(n+o)/2;if(n==o)e=r=0;else{var l=n-o;switch(r=h>.5?l/(2-n-o):l/(n+o),n){case s:e=(i-a)/l+(i<a?6:0);break;case i:e=(a-s)/l+2;break;case a:e=(s-i)/l+4}e/=6}return[e,r,h,t[3]]}function hslToRgb(t){function e(t,e,r){return r<0&&(r+=1),r>1&&(r-=1),r<1/6?t+6*(e-t)*r:r<.5?e:r<2/3?t+(e-t)*(2/3-r)*6:t}var r,s,i,a=t[0],n=t[1],o=t[2];if(0==n)r=s=i=o;else{var h=o<.5?o*(1+n):o+n-o*n,l=2*o-h;r=e(l,h,a+1/3),s=e(l,h,a),i=e(l,h,a-1/3)}return[r,s,i,t[3]]}function linear(t,e,r,s,i){if(void 0===s||void 0===i)return linear(t,0,1,e,r);if(t<=e)return s;if(t>=r)return i;var a=r===e?0:(t-e)/(r-e);if(!s.length)return s+(i-s)*a;var n,o=s.length,h=createTypedArray("float32",o);for(n=0;n<o;n+=1)h[n]=s[n]+(i[n]-s[n])*a;return h}function random(t,e){if(void 0===e&&(void 0===t?(t=0,e=1):(e=t,t=void 0)),e.length){var r,s=e.length;t||(t=createTypedArray("float32",s));var i=createTypedArray("float32",s),a=BMMath.random();for(r=0;r<s;r+=1)i[r]=t[r]+a*(e[r]-t[r]);return i}void 0===t&&(t=0);var n=BMMath.random();return t+n*(e-t)}function createPath(t,e,r,s){e=e&&e.length?e:t,r=r&&r.length?r:t;var a=shape_pool.newElement(),n=t.length;for(a.setPathData(s,n),i=0;i<n;i+=1)a._aw(t[i][0],t[i][1],r[i][0]+t[i][0],r[i][1]+t[i][1],e[i][0]+t[i][0],e[i][1]+t[i][1],i,!0);return a}function initiateExpression(elem,data,property){function lookAt(t,e){var r=[e[0]-t[0],e[1]-t[1],e[2]-t[2]],s=Math.atan2(r[0],Math.sqrt(r[1]*r[1]+r[2]*r[2]))/degToRads,i=-Math.atan2(r[1],r[2])/degToRads;return[i,s,0]}function easeOut(t,e,r,s,i){return void 0===s?(s=e,i=r):t=(t-e)/(r-e),-(i-s)*t*(t-2)+s}function easeIn(t,e,r,s,i){return void 0===s?(s=e,i=r):t=(t-e)/(r-e),(i-s)*t*t+s}function nearestKey(t){var e,r,s,i=data.k.length;if(data.k.length&&"number"!=typeof data.k[0])if(r=-1,t*=elem.comp._x.frameRate,t<data.k[0].t)r=1,s=data.k[0].t;else{for(e=0;e<i-1;e+=1){if(t===data.k[e].t){r=e+1,s=data.k[e].t;break}if(t>data.k[e].t&&t<data.k[e+1].t){t-data.k[e].t>data.k[e+1].t-t?(r=e+2,s=data.k[e+1].t):(r=e+1,s=data.k[e].t);break}}r===-1&&(r=e+1,s=data.k[e].t)}else r=0,s=0;var a={};return a.index=r,a.time=s/elem.comp._x.frameRate,a}function key(t){var e,r,s;if(!data.k.length||"number"==typeof data.k[0])throw new Error("The property has no keyframe at index "+t);t-=1,e={time:data.k[t].t/elem.comp._x.frameRate};var i;for(i=t!==data.k.length-1||data.k[t].h?data.k[t].s:data.k[t-1].e,s=i.length,r=0;r<s;r+=1)e[r]=i[r];return e}function framesToTime(t,e){return e||(e=elem.comp._x.frameRate),t/e}function timeToFrames(t,e){return t||0===t||(t=time),e||(e=elem.comp._x.frameRate),t*e}function seedRandom(t){BMMath.seedrandom(randSeed+t)}function sourceRectAtTime(){return elem.sourceRectAtTime()}function executeExpression(){if(_needsRandom&&seedRandom(randSeed),this.frameExpressionId!==elem._x.frameId||"textSelector"===this.propType){if(this.lock)return this.v=duplicatePropertyValue(this.pv,this.mult),!0;"textSelector"===this.propType&&(textIndex=this.textIndex,textTotal=this.textTotal,selectorValue=this.selectorValue),thisLayer||(thisLayer=elem.layerInterface,thisComp=elem.comp.compInterface,toWorld=thisLayer.toWorld.bind(thisLayer),fromWorld=thisLayer.fromWorld.bind(thisLayer),fromComp=thisLayer.fromComp.bind(thisLayer),mask=thisLayer.mask?thisLayer.mask.bind(thisLayer):null,fromCompToSurface=fromComp),transform||(transform=elem.layerInterface("ADBE Transform Group"),anchorPoint=transform.anchorPoint),4!==elemType||content||(content=thisLayer("ADBE Root Vectors Group")),effect||(effect=thisLayer(4)),hasParent=!(!elem.hierarchy||!elem.hierarchy.length),hasParent&&!parent&&(parent=elem.hierarchy[0].layerInterface),this.lock=!0,this.getPreValue&&this.getPreValue(),value=this.pv,time=this.comp.renderedFrame/this.comp._x.frameRate,needsVelocity&&(velocity=velocityAtTime(time)),expression_function(),"shape"===scoped_bm_rt.propType?this.v=shape_pool.clone(scoped_bm_rt.v):this.v=scoped_bm_rt,this.frameExpressionId=elem._x.frameId;var t,e;if(this.mult)if("unidimensional"===this.propType)this.v*=this.mult;else if(1===this.v.length)this.v=this.v[0]*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;t<e;t+=1)this.v[t]*=this.mult;if(1===this.v.length&&(this.v=this.v[0]),"unidimensional"===this.propType)this.lastValue!==this.v&&(this.lastValue=this.v,this.mdf=!0);else if("shape"===this.propType)shapesEqual(this.v,this._ak.shapes[0])||(this.mdf=!0,this._ak.releaseShapes(),this._ak.addShape(shape_pool.clone(this.v)));else for(e=this.v.length,t=0;t<e;t+=1)this.v[t]!==this.lastValue[t]&&(this.lastValue[t]=this.v[t],this.mdf=!0);this.lock=!1}}var val=data.x,needsVelocity=/velocity(?![\w\d])/.test(val),_needsRandom=val.indexOf("random")!==-1,elemType=elem.data.ty,transform,content,effect,thisComp=elem.comp,thisProperty=property;elem.comp.frameDuration=1/elem.comp._x.frameRate;var inPoint=elem.data.ip/elem.comp._x.frameRate,outPoint=elem.data.op/elem.comp._x.frameRate,width=elem.data.sw?elem.data.sw:0,height=elem.data.sh?elem.data.sh:0,loopIn,loop_in,loopOut,loop_out,toWorld,fromWorld,fromComp,fromCompToSurface,anchorPoint,thisLayer,thisComp,mask,valueAtTime,velocityAtTime,scoped_bm_rt,expression_function=eval("[function _expression_function(){"+val+";scoped_bm_rt=$bm_rt}]")[0],numKeys=property.kf?data.k.length:0,wiggle=function(t,e){var r,s,i=this.pv.length?this.pv.length:1,a=createTypedArray("float32",i);t=5;var n=Math.floor(time*t);for(r=0,s=0;r<n;){for(s=0;s<i;s+=1)a[s]+=-e+2*e*BMMath.random();r+=1}var o=time*t,h=o-Math.floor(o),l=createTypedArray("float32",i);if(i>1){for(s=0;s<i;s+=1)l[s]=this.pv[s]+a[s]+(-e+2*e*BMMath.random())*h;return l}return this.pv+a[0]+(-e+2*e*BMMath.random())*h}.bind(this);thisProperty.loopIn&&(loopIn=thisProperty.loopIn.bind(thisProperty),loop_in=loopIn),thisProperty.loopOut&&(loopOut=thisProperty.loopOut.bind(thisProperty),loop_out=loopOut);var loopInDuration=function(t,e){return loopIn(t,e,!0)}.bind(this),loopOutDuration=function(t,e){return loopOut(t,e,!0)}.bind(this);this.getValueAtTime&&(valueAtTime=this.getValueAtTime.bind(this)),this.getVelocityAtTime&&(velocityAtTime=this.getVelocityAtTime.bind(this));var comp=elem.comp._x.projectInterface.bind(elem.comp._x.projectInterface),time,velocity,value,textIndex,textTotal,selectorValue,index=elem.data.ind,hasParent=!(!elem.hierarchy||!elem.hierarchy.length),parent,randSeed=Math.floor(1e6*Math.random());return executeExpression}var ob={},Math=BMMath,window=null,document=null,add=sum,radians_to_degrees=radiansToDegrees,degrees_to_radians=radiansToDegrees,helperLengthArray=[0,0,0,0,0,0];return ob.initiateExpression=initiateExpression,ob}();!function(){function t(){return this.pv}function e(t,e,r){if(!this.k||!this.keyframes)return this.pv;t=t?t.toLowerCase():"";var s=this.comp.renderedFrame,i=this.keyframes,a=i[i.length-1].t;if(s<=a)return this.pv;var n,o;r?(n=e?Math.abs(a-elem.comp._x.frameRate*e):Math.max(0,a-this.elem.data.ip),o=a-n):((!e||e>i.length-1)&&(e=i.length-1),o=i[i.length-1-e].t,n=a-o);var h,l,p;if("pingpong"===t){var m=Math.floor((s-o)/n);if(m%2!==0)return this.getValueAtTime((n-(s-o)%n+o)/this.comp._x.frameRate,0)}else{if("offset"===t){var f=this.getValueAtTime(o/this.comp._x.frameRate,0),c=this.getValueAtTime(a/this.comp._x.frameRate,0),d=this.getValueAtTime(((s-o)%n+o)/this.comp._x.frameRate,0),u=Math.floor((s-o)/n);if(this.pv.length){for(p=new Array(f.length),l=p.length,h=0;h<l;h+=1)p[h]=(c[h]-f[h])*u+d[h];return p}return(c-f)*u+d}if("continue"===t){var y=this.getValueAtTime(a/this.comp._x.frameRate,0),g=this.getValueAtTime((a-.001)/this.comp._x.frameRate,0);if(this.pv.length){for(p=new Array(y.length),l=p.length,h=0;h<l;h+=1)p[h]=y[h]+(y[h]-g[h])*((s-a)/this.comp._x.frameRate)/5e-4;return p}return y+(y-g)*((s-a)/.001)}}return this.getValueAtTime(((s-o)%n+o)/this.comp._x.frameRate,0)}function r(t,e,r){if(!this.k)return this.pv;t=t?t.toLowerCase():"";var s=this.comp.renderedFrame,i=this.keyframes,a=i[0].t;if(s>=a)return this.pv;var n,o;r?(n=e?Math.abs(elem.comp._x.frameRate*e):Math.max(0,this.elem.data.op-a),o=a+n):((!e||e>i.length-1)&&(e=i.length-1),o=i[e].t,n=o-a);var h,l,p;if("pingpong"===t){var m=Math.floor((a-s)/n);if(m%2===0)return this.getValueAtTime(((a-s)%n+a)/this.comp._x.frameRate,0)}else{if("offset"===t){var f=this.getValueAtTime(a/this.comp._x.frameRate,0),c=this.getValueAtTime(o/this.comp._x.frameRate,0),d=this.getValueAtTime((n-(a-s)%n+a)/this.comp._x.frameRate,0),u=Math.floor((a-s)/n)+1;if(this.pv.length){for(p=new Array(f.length),l=p.length,h=0;h<l;h+=1)p[h]=d[h]-(c[h]-f[h])*u;return p}return d-(c-f)*u}if("continue"===t){var y=this.getValueAtTime(a/this.comp._x.frameRate,0),g=this.getValueAtTime((a+.001)/this.comp._x.frameRate,0);if(this.pv.length){for(p=new Array(y.length),l=p.length,h=0;h<l;h+=1)p[h]=y[h]+(y[h]-g[h])*(a-s)/.001;return p}return y+(y-g)*(a-s)/.001}}return this.getValueAtTime((n-(a-s)%n+a)/this.comp._x.frameRate,0)}function s(t){return this._cachingAtTime||(this._cachingAtTime={lastValue:initialDefaultFrame,lastIndex:0}),t!==this._cachingAtTime.lastFrame&&(t*=this.elem._x.frameRate,t-=this.offsetTime,this._cachingAtTime.lastIndex=this._cachingAtTime.lastFrame<t?this._cachingAtTime.lastIndex:0,this._cachingAtTime.value=this.interpolateValue(t,this.pv,this._cachingAtTime),this._cachingAtTime.lastFrame=t),this._cachingAtTime.value}function i(t){if(void 0!==this.vel)return this.vel;var e,r=-.01,s=this.getValueAtTime(t),i=this.getValueAtTime(t+r);if(s.length){e=createTypedArray("float32",s.length);var a;for(a=0;a<s.length;a+=1)e[a]=(i[a]-s[a])/r}else e=(i-s)/r;return e}function a(t){this.propertyGroup=t}function n(t,e,r){e.x&&(r.k=!0,r.x=!0,r.getValue&&(r.getPreValue=r.getValue),r.initiateExpression=ExpressionManager.initiateExpression,r.getValue=r.initiateExpression(t,e,r))}function o(t){}function h(t){}function l(t){return this._cachingAtTime||(this._cachingAtTime={shapeValue:shape_pool.clone(this.pv),lastIndex:0,lastTime:initialDefaultFrame}),t!==this._cachingAtTime.lastTime&&(this._cachingAtTime.lastTime=t,t*=this.elem._x.frameRate,this.interpolateShape(t,this._cachingAtTime.shapeValue,!1,this._cachingAtTime)),this._cachingAtTime.shapeValue}function p(){}var m=function(){function e(t,e){return this.textIndex=t+1,this.textTotal=e,this.getValue(),this.v}return function(r,o){this.pv=1,this.comp=r.comp,this.elem=r,this.mult=.01,this.propType="textSelector",this.textTotal=o.totalChars,this.selectorValue=100,this.lastValue=[1,1,1],n.bind(this)(r,o,this),this.getMult=e,this.getVelocityAtTime=i,this.kf?this.getValueAtTime=s.bind(this):this.getValueAtTime=t.bind(this),this._ce=a}}(),f=_ag._bj;_ag._bj=function(t,e,r){var s=f(t,e,r);return s.dynamicProperties.length?s.getValueAtTime=o.bind(s):s.getValueAtTime=h.bind(s),s._ce=a,s};var c=_ai._bo;_ai._bo=function(o,h,l,p,m){var f=c(o,h,l,p,m);f.kf?f.getValueAtTime=s.bind(f):f.getValueAtTime=t.bind(f),f._ce=a,f.loopOut=e,f.loopIn=r,f.getVelocityAtTime=i,f.numKeys=1===h.a?h.k.length:0;var d=f.k;return f.propertyIndex=h.ix,f._cachingAtTime={lastFrame:initialDefaultFrame,lastIndex:0,value:0===l?0:createTypedArray("float32",3)},n(o,h,f),!d&&f.x&&m.push(f),f};var d=_ah.getConstructorFunction(),u=_ah.getKeyframedConstructorFunction();p.prototype={vertices:function(t,e){var r=this.v;void 0!==e&&(r=this.getValueAtTime(e,0));var s,i=r._length,a=r[t],n=r.v,o=Array.apply(null,{length:i});for(s=0;s<i;s+=1)"i"===t||"o"===t?o[s]=[a[s][0]-n[s][0],a[s][1]-n[s][1]]:o[s]=[a[s][0],a[s][1]];return o},points:function(t){return this.vertices("v",t)},inTangents:function(t){return this.vertices("i",t)},outTangents:function(t){return this.vertices("o",t)},isClosed:function(){return this.v.c},pointOnPath:function(t,e){var r=this.v;void 0!==e&&(r=this.getValueAtTime(e,0)),this._segmentsLength||(this._segmentsLength=bez.getSegmentsLength(r));for(var s=this._segmentsLength,i=s.lengths,a=s.totalLength*t,n=0,o=i.length,h=0;n<o;){if(h+i[n].addedLength>a){var l=n,p=r.c&&n===o-1?0:n+1,m=(a-h)/i[n].addedLength,f=bez.getPointInSegment(r.v[l],r.v[p],r.o[l],r.i[p],m,i[n]);break}h+=i[n].addedLength,n+=1}return f||(f=r.c?[r.v[0][0],r.v[0][1]]:[r.v[r._length-1][0],r.v[r._length-1][1]]),f},vectorOnPath:function(t,e,r){t=1==t?this.v.c?0:.999:t;var s=this.pointOnPath(t,e),i=this.pointOnPath(t+.001,e),a=i[0]-s[0],n=i[1]-s[1],o=Math.sqrt(Math.pow(a,2)+Math.pow(n,2)),h="tangent"===r?[a/o,n/o]:[-n/o,a/o];return h},tangentOnPath:function(t,e){return this.vectorOnPath(t,e,"tangent")},normalOnPath:function(t,e){return this.vectorOnPath(t,e,"normal")},_ce:a,getValueAtTime:t},extendPrototype([p],d),extendPrototype([p],u),u.prototype.getValueAtTime=l,u.prototype.initiateExpression=ExpressionManager.initiateExpression;var y=_ah._bp;_ah._bp=function(t,e,r,s,i){var a=y(t,e,r,s,i),o=a.k;return a.propertyIndex=e.ix,a.lock=!1,3===r?n(t,e.pt,a):4===r&&n(t,e.ks,a),!o&&a.x&&s.push(a),a};var g=TextSelectorProp.getTextSelectorProp;TextSelectorProp.getTextSelectorProp=function(t,e,r){return 1===e.t?new m(t,e,r):g(t,e,r)}}(),function(){function t(){return!!this.data.d.x&&(this.comp=this.elem.comp,this.getValue&&(this.getPreValue=this.getValue),this.calculateExpression=ExpressionManager.initiateExpression.bind(this)(this.elem,this.data.d,this),this.getValue=this.getExpressionValue,!0)}_ar.prototype.searchProperty=function(){return this.kf=this.searchExpressions()||this.data.d.k.length>1,this.kf},_ar.prototype.getExpressionValue=function(t){this.calculateExpression(),this.mdf&&(this.currentData.t=this.v.toString(),this.completeTextData(this.currentData))},_ar.prototype.searchExpressions=t}();var ShapeExpressionInterface=function(){function t(t,e,n){var c,d=[],u=t?t.length:0;for(c=0;c<u;c+=1)"gr"==t[c].ty?d.push(r(t[c],e[c],n)):"fl"==t[c].ty?d.push(s(t[c],e[c],n)):"st"==t[c].ty?d.push(i(t[c],e[c],n)):"tm"==t[c].ty?d.push(a(t[c],e[c],n)):"tr"==t[c].ty||("el"==t[c].ty?d.push(o(t[c],e[c],n)):"sr"==t[c].ty?d.push(h(t[c],e[c],n)):"sh"==t[c].ty?d.push(f(t[c],e[c],n)):"rc"==t[c].ty?d.push(l(t[c],e[c],n)):"rd"==t[c].ty?d.push(p(t[c],e[c],n)):"rp"==t[c].ty&&d.push(m(t[c],e[c],n)));return d}function e(e,r,s){var i,a=function(t){for(var e=0,r=i.length;e<r;){if(i[e]._name===t||i[e].mn===t||i[e].propertyIndex===t||i[e].ix===t||i[e].ind===t)return i[e];e+=1}if("number"==typeof t)return i[t-1]};return a.propertyGroup=function(t){return 1===t?a:s(t-1)},i=t(e.it,r.it,a.propertyGroup),a.numProperties=i.length,a.propertyIndex=e.cix,a}function r(t,r,s){var i=function(t){switch(t){case"ADBE Vectors Group":case"Contents":case 2:return i.content;case"ADBE Vector Transform Group":case 3:default:return i.transform}};i.propertyGroup=function(t){return 1===t?i:s(t-1)};var a=e(t,r,i.propertyGroup),o=n(t.it[t.it.length-1],r.it[r.it.length-1],i.propertyGroup);return i.content=a,i.transform=o,Object.defineProperty(i,"_name",{get:function(){return t.nm}}),i.numProperties=t.np,i.propertyIndex=t.ix,i.nm=t.nm,i.mn=t.mn,i}function s(t,e,r){function s(t){return"Color"===t||"color"===t?s.color:"Opacity"===t||"opacity"===t?s.opacity:void 0}return Object.defineProperties(s,{color:{get:function(){return ExpressionValue(e.c,1/e.c.mult,"color")}},opacity:{get:function(){return ExpressionValue(e.o,100)}},_name:{value:t.nm},mn:{value:t.mn}}),e.c._ce(r),e.o._ce(r),s}function i(t,e,r){function s(t){return 1===t?ob:r(t-1)}function i(t){return 1===t?l:s(t-1)}function a(r){Object.defineProperty(l,t.d[r].nm,{get:function(){return ExpressionValue(e.d.dataProps[r].p)}})}function n(t){return"Color"===t||"color"===t?n.color:"Opacity"===t||"opacity"===t?n.opacity:"Stroke Width"===t||"stroke width"===t?n.strokeWidth:void 0}var o,h=t.d?t.d.length:0,l={};for(o=0;o<h;o+=1)a(o),e.d.dataProps[o].p._ce(i);return Object.defineProperties(n,{color:{get:function(){return ExpressionValue(e.c,1/e.c.mult,"color")}},opacity:{get:function(){return ExpressionValue(e.o,100)}},strokeWidth:{get:function(){return ExpressionValue(e.w)}},dash:{get:function(){return l}},_name:{value:t.nm},mn:{value:t.mn}}),e.c._ce(s),e.o._ce(s),e.w._ce(s),n}function a(t,e,r){function s(t){return 1==t?i:r(--t)}function i(e){return e===t.e.ix||"End"===e||"end"===e?i.end:e===t.s.ix?i.start:e===t.o.ix?i.offset:void 0}return i.propertyIndex=t.ix,e.s._ce(s),e.e._ce(s),e.o._ce(s),i.propertyIndex=t.ix,Object.defineProperties(i,{start:{get:function(){return ExpressionValue(e.s,1/e.s.mult)}},end:{get:function(){return ExpressionValue(e.e,1/e.e.mult)}},offset:{get:function(){return ExpressionValue(e.o)}},_name:{value:t.nm}}),i.mn=t.mn,i}function n(t,e,r){function s(t){return 1==t?i:r(--t)}function i(e){return t.a.ix===e||"Anchor Point"===e?i.anchorPoint:t.o.ix===e||"Opacity"===e?i.opacity:t.p.ix===e||"Position"===e?i.position:t.r.ix===e||"Rotation"===e||"ADBE Vector Rotation"===e?i.rotation:t.s.ix===e||"Scale"===e?i.scale:t.sk&&t.sk.ix===e||"Skew"===e?i.skew:t.sa&&t.sa.ix===e||"Skew Axis"===e?i.skewAxis:void 0;
-}return e.transform.mProps.o._ce(s),e.transform.mProps.p._ce(s),e.transform.mProps.a._ce(s),e.transform.mProps.s._ce(s),e.transform.mProps.r._ce(s),e.transform.mProps.sk&&(e.transform.mProps.sk._ce(s),e.transform.mProps.sa._ce(s)),e.transform.op._ce(s),Object.defineProperties(i,{opacity:{get:function(){return ExpressionValue(e.transform.mProps.o,1/e.transform.mProps.o.mult)}},position:{get:function(){return ExpressionValue(e.transform.mProps.p)}},anchorPoint:{get:function(){return ExpressionValue(e.transform.mProps.a)}},scale:{get:function(){return ExpressionValue(e.transform.mProps.s,1/e.transform.mProps.s.mult)}},rotation:{get:function(){return ExpressionValue(e.transform.mProps.r,1/e.transform.mProps.r.mult)}},skew:{get:function(){return ExpressionValue(e.transform.mProps.sk)}},skewAxis:{get:function(){return ExpressionValue(e.transform.mProps.sa)}},_name:{value:t.nm}}),i.ty="tr",i.mn=t.mn,i}function o(t,e,r){function s(t){return 1==t?i:r(--t)}function i(e){return t.p.ix===e?i.position:t.s.ix===e?i.size:void 0}i.propertyIndex=t.ix;var a="tm"===e.sh.ty?e.sh.prop:e.sh;return a.s._ce(s),a.p._ce(s),Object.defineProperties(i,{size:{get:function(){return ExpressionValue(a.s)}},position:{get:function(){return ExpressionValue(a.p)}},_name:{value:t.nm}}),i.mn=t.mn,i}function h(t,e,r){function s(t){return 1==t?i:r(--t)}function i(e){return t.p.ix===e?i.position:t.r.ix===e?i.rotation:t.pt.ix===e?i.points:t.or.ix===e||"ADBE Vector Star Outer Radius"===e?i.outerRadius:t.os.ix===e?i.outerRoundness:!t.ir||t.ir.ix!==e&&"ADBE Vector Star Inner Radius"!==e?t.is&&t.is.ix===e?i.innerRoundness:void 0:i.innerRadius}var a="tm"===e.sh.ty?e.sh.prop:e.sh;return i.propertyIndex=t.ix,a.or._ce(s),a.os._ce(s),a.pt._ce(s),a.p._ce(s),a.r._ce(s),t.ir&&(a.ir._ce(s),a.is._ce(s)),Object.defineProperties(i,{position:{get:function(){return ExpressionValue(a.p)}},rotation:{get:function(){return ExpressionValue(a.r,1/a.r.mult)}},points:{get:function(){return ExpressionValue(a.pt)}},outerRadius:{get:function(){return ExpressionValue(a.or)}},outerRoundness:{get:function(){return ExpressionValue(a.os)}},innerRadius:{get:function(){return a.ir?ExpressionValue(a.ir):0}},innerRoundness:{get:function(){return a.is?ExpressionValue(a.is,1/a.is.mult):0}},_name:{value:t.nm}}),i.mn=t.mn,i}function l(t,e,r){function s(t){return 1==t?i:r(--t)}function i(e){return t.p.ix===e?i.position:t.r.ix===e?i.roundness:t.s.ix===e||"Size"===e||"ADBE Vector Rect Size"===e?i.size:void 0}var a="tm"===e.sh.ty?e.sh.prop:e.sh;return i.propertyIndex=t.ix,a.p._ce(s),a.s._ce(s),a.r._ce(s),Object.defineProperties(i,{position:{get:function(){return ExpressionValue(a.p)}},roundness:{get:function(){return ExpressionValue(a.r)}},size:{get:function(){return ExpressionValue(a.s)}},_name:{value:t.nm}}),i.mn=t.mn,i}function p(t,e,r){function s(t){return 1==t?i:r(--t)}function i(e){if(t.r.ix===e||"Round Corners 1"===e)return i.radius}var a=e;return i.propertyIndex=t.ix,a.rd._ce(s),Object.defineProperties(i,{radius:{get:function(){return ExpressionValue(a.rd)}},_name:{value:t.nm}}),i.mn=t.mn,i}function m(t,e,r){function s(t){return 1==t?i:r(--t)}function i(e){return t.c.ix===e||"Copies"===e?i.copies:t.o.ix===e||"Offset"===e?i.offset:void 0}var a=e;return i.propertyIndex=t.ix,a.c._ce(s),a.o._ce(s),Object.defineProperties(i,{copies:{get:function(){return ExpressionValue(a.c)}},offset:{get:function(){return ExpressionValue(a.o)}},_name:{value:t.nm}}),i.mn=t.mn,i}function f(t,e,r){function s(t){return 1==t?i:r(--t)}function i(t){if("Shape"===t||"shape"===t||"Path"===t||"path"===t||"ADBE Vector Shape"===t||2===t)return i.path}var a=e.sh;return a._ce(s),Object.defineProperties(i,{path:{get:function(){return a.k&&a.getValue(),a}},shape:{get:function(){return a.k&&a.getValue(),a}},_name:{value:t.nm},ix:{value:t.ix},mn:{value:t.mn}}),i}return function(e,r,s){function i(t){if("number"==typeof t)return a[t-1];for(var e=0,r=a.length;e<r;){if(a[e]._name===t)return a[e];e+=1}}var a;return i.propertyGroup=s,a=t(e,r,i),i}}(),TextExpressionInterface=function(){return function(t){function e(){}var r,s;return Object.defineProperty(e,"sourceText",{get:function(){var e=t.textProperty.currentData.t;return t.textProperty.currentData.t!==r&&(t.textProperty.currentData.t=r,s=new String(e),s.value=e?e:new String(e)),s}}),e}}(),LayerExpressionInterface=function(){function t(t,e){var r=new Matrix;r.reset();var s;if(s=e?this._elem.finalTransform.mProp:this._elem.finalTransform.mProp,s.applyToMatrix(r),this._elem.hierarchy&&this._elem.hierarchy.length){var i,a=this._elem.hierarchy.length;for(i=0;i<a;i+=1)this._elem.hierarchy[i].finalTransform.mProp.applyToMatrix(r);return r.applyToPointArray(t[0],t[1],t[2]||0)}return r.applyToPointArray(t[0],t[1],t[2]||0)}function e(t,e){var r=new Matrix;r.reset();var s;if(s=e?this._elem.finalTransform.mProp:this._elem.finalTransform.mProp,s.applyToMatrix(r),this._elem.hierarchy&&this._elem.hierarchy.length){var i,a=this._elem.hierarchy.length;for(i=0;i<a;i+=1)this._elem.hierarchy[i].finalTransform.mProp.applyToMatrix(r);return r.inversePoint(t)}return r.inversePoint(t)}function r(t){var e=new Matrix;if(e.reset(),this._elem.finalTransform.mProp.applyToMatrix(e),this._elem.hierarchy&&this._elem.hierarchy.length){var r,s=this._elem.hierarchy.length;for(r=0;r<s;r+=1)this._elem.hierarchy[r].finalTransform.mProp.applyToMatrix(e);return e.inversePoint(t)}return e.inversePoint(t)}return function(s){function i(t){n.mask=new MaskManagerInterface(t,s)}function a(t){n.effect=t}function n(t){switch(t){case"ADBE Root Vectors Group":case"Contents":case 2:return n.shapeInterface;case 1:case 6:case"Transform":case"transform":case"ADBE Transform Group":return o;case 4:case"ADBE Effect Parade":return n.effect}}var o;n.toWorld=t,n.fromWorld=e,n.toComp=t,n.fromComp=r,n.sourceRectAtTime=s.sourceRectAtTime.bind(s),n._elem=s,o=TransformExpressionInterface(s.finalTransform.mProp);var h=getDescriptor(o,"anchorPoint");return Object.defineProperties(n,{hasParent:{get:function(){return s.hierarchy.length}},parent:{get:function(){return s.hierarchy[0].layerInterface}},rotation:getDescriptor(o,"rotation"),scale:getDescriptor(o,"scale"),position:getDescriptor(o,"position"),opacity:getDescriptor(o,"opacity"),anchorPoint:h,anchor_point:h,transform:{get:function(){return o}},active:{get:function(){return s.isInRange}}}),n.startTime=s.data.st,n.index=s.data.ind,n.source=s.data.refId,n.height=0===s.data.ty?s.data.h:100,n.width=0===s.data.ty?s.data.w:100,n.registerMaskInterface=i,n.registerEffectsInterface=a,n}}(),CompExpressionInterface=function(){return function(t){function e(e){for(var r=0,s=t.layers.length;r<s;){if(t.layers[r].nm===e||t.layers[r].ind===e)return t._br[r].layerInterface;r+=1}return{active:!1}}return Object.defineProperty(e,"_name",{value:t.data.nm}),e.layer=e,e.pixelAspect=1,e.height=t._x.compSize.h,e.width=t._x.compSize.w,e.pixelAspect=1,e.frameDuration=1/t._x.frameRate,e}}(),TransformExpressionInterface=function(){return function(t){function e(t){switch(t){case"scale":case"Scale":case"ADBE Scale":case 6:return e.scale;case"rotation":case"Rotation":case"ADBE Rotation":case"ADBE Rotate Z":case 10:return e.rotation;case"position":case"Position":case"ADBE Position":case 2:return e.position;case"anchorPoint":case"AnchorPoint":case"Anchor Point":case"ADBE AnchorPoint":case 1:return e.anchorPoint;case"opacity":case"Opacity":case 11:return e.opacity}}return Object.defineProperty(e,"rotation",{get:function(){return t.r?ExpressionValue(t.r,1/degToRads):ExpressionValue(t.rz,1/degToRads)}}),Object.defineProperty(e,"scale",{get:function(){return ExpressionValue(t.s,100)}}),Object.defineProperty(e,"position",{get:function(){return t.p?ExpressionValue(t.p):[t.px.v,t.py.v,t.pz?t.pz.v:0]}}),Object.defineProperty(e,"xPosition",{get:function(){return ExpressionValue(t.px)}}),Object.defineProperty(e,"yPosition",{get:function(){return ExpressionValue(t.py)}}),Object.defineProperty(e,"zPosition",{get:function(){return ExpressionValue(t.pz)}}),Object.defineProperty(e,"anchorPoint",{get:function(){return ExpressionValue(t.a)}}),Object.defineProperty(e,"opacity",{get:function(){return ExpressionValue(t.o,100)}}),Object.defineProperty(e,"skew",{get:function(){return ExpressionValue(t.sk)}}),Object.defineProperty(e,"skewAxis",{get:function(){return ExpressionValue(t.sa)}}),Object.defineProperty(e,"orientation",{get:function(){return ExpressionValue(t.or)}}),e}}(),ProjectInterface=function(){function t(t){this.compositions.push(t)}return function(){function e(t){for(var e=0,r=this.compositions.length;e<r;){if(this.compositions[e].data&&this.compositions[e].data.nm===t)return this.compositions[e]._az&&this.compositions[e]._az(this.compositions[e].data.xt?this.currentFrame:this.compositions[e].renderedFrame),this.compositions[e].compInterface;e+=1}}return e.compositions=[],e.currentFrame=0,e.registerComposition=t,e}}(),EffectsExpressionInterface=function(){function t(t,r){if(t.effects){var s,i=[],a=t.data.ef,n=t.effects.effectElements.length;for(s=0;s<n;s+=1)i.push(e(a[s],t.effects.effectElements[s],r,t));return function(e){for(var r=t.data.ef,s=0,a=r.length;s<a;){if(e===r[s].nm||e===r[s].mn||e===r[s].ix)return i[s];s+=1}}}}function e(t,s,i,a){function n(t){return 1===t?p:i(t-1)}var o,h=[],l=t.ef.length;for(o=0;o<l;o+=1)5===t.ef[o].ty?h.push(e(t.ef[o],s.effectElements[o],s.effectElements[o].propertyGroup,a)):h.push(r(s.effectElements[o],t.ef[o].ty,a,n));var p=function(e){for(var r=t.ef,s=0,i=r.length;s<i;){if(e===r[s].nm||e===r[s].mn||e===r[s].ix)return 5===r[s].ty?h[s]:h[s]();s+=1}return h[0]()};return p.propertyGroup=n,"ADBE Color Control"===t.mn&&Object.defineProperty(p,"color",{get:function(){return h[0]()}}),Object.defineProperty(p,"numProperties",{get:function(){return t.np}}),p.active=0!==t.en,p}function r(t,e,r,s){function i(){return 10===e?r.comp.compInterface(t.p.v):ExpressionValue(t.p)}return t.p._ce&&t.p._ce(s),i}var s={createEffectsInterface:t};return s}(),MaskManagerInterface=function(){function t(t,e){this._mask=t,this._data=e}Object.defineProperty(t.prototype,"maskPath",{get:function(){return this._mask.prop.k&&this._mask.prop.getValue(),this._mask.prop}});var e=function(e,r){var s,i=Array.apply(null,{length:e.viewData.length}),a=e.viewData.length;for(s=0;s<a;s+=1)i[s]=new t(e.viewData[s],e.masksProperties[s]);var n=function(t){for(s=0;s<a;){if(e.masksProperties[s].nm===t)return i[s];s+=1}};return n};return e}(),ExpressionValue=function(){return function(t,e,r){var s;t.k&&t.getValue();var i,a,n;if(r){if("color"===r){for(a=4,s=createTypedArray("float32",a),n=createTypedArray("float32",a),i=0;i<a;i+=1)s[i]=n[i]=e&&i<3?t.v[i]*e:1;s.value=n}}else if("number"==typeof t.v||t.v instanceof Number)s=e?new Number(t.v*e):new Number(t.v),s.value=e?t.v*e:t.v;else{for(a=t.v.length,s=createTypedArray("float32",a),n=createTypedArray("float32",a),i=0;i<a;i+=1)s[i]=n[i]=e?t.v[i]*e:t.v[i];s.value=n}return s.numKeys=t.keyframes?t.keyframes.length:0,s.key=function(e){return s.numKeys?t.keyframes[e-1].t:0},s.valueAtTime=t.getValueAtTime,s.propertyGroup=t.propertyGroup,s}}();GroupEffect.prototype.getValue=function(){this.mdf=!1;var t,e=this.dynamicProperties.length;for(t=0;t<e;t+=1)this.dynamicProperties[t].getValue(),this.mdf=!!this.dynamicProperties[t].mdf||this.mdf},GroupEffect.prototype.init=function(t,e,r){this.data=t,this.mdf=!1,this.effectElements=[];var s,i,a=this.data.ef.length,n=this.data.ef;for(s=0;s<a;s+=1)switch(n[s].ty){case 0:i=new SliderEffect(n[s],e,r),this.effectElements.push(i);break;case 1:i=new AngleEffect(n[s],e,r),this.effectElements.push(i);break;case 2:i=new ColorEffect(n[s],e,r),this.effectElements.push(i);break;case 3:i=new PointEffect(n[s],e,r),this.effectElements.push(i);break;case 4:case 7:i=new CheckboxEffect(n[s],e,r),this.effectElements.push(i);break;case 10:i=new LayerIndexEffect(n[s],e,r),this.effectElements.push(i);break;case 11:i=new MaskIndexEffect(n[s],e,r),this.effectElements.push(i);break;case 5:i=new EffectsManager(n[s],e,r),this.effectElements.push(i);break;case 6:default:i=new NoValueEffect(n[s],e,r),this.effectElements.push(i)}};var lottiejs={};lottiejs.play=play,lottiejs.pause=pause,lottiejs.setLocationHref=setLocationHref,lottiejs.togglePause=togglePause,lottiejs.setSpeed=setSpeed,lottiejs.setDirection=setDirection,lottiejs.stop=stop,lottiejs.moveFrame=moveFrame,lottiejs.searchAnimations=searchAnimations,lottiejs.registerAnimation=registerAnimation,lottiejs.loadAnimation=loadAnimation,lottiejs.setSubframeRendering=setSubframeRendering,lottiejs.resize=resize,lottiejs.goToAndStop=goToAndStop,lottiejs.destroy=destroy,lottiejs.setQuality=setQuality,lottiejs.inBrowser=inBrowser,lottiejs.installPlugin=installPlugin,lottiejs.__getFactory=getFactory,lottiejs.version="5.0.6";var standalone="__[STANDALONE]__",animationData="__[ANIMATIONDATA]__",renderer="";if(standalone){var scripts=document.getElementsByTagName("script"),index=scripts.length-1,myScript=scripts[index]||{src:""},queryString=myScript.src.replace(/^[^\?]+\??/,"");renderer=getQueryVariable("renderer")}var readyStateCheckInterval=setInterval(checkReady,100);return lottiejs});
\ No newline at end of file
+!function(t,e){"function"==typeof define&&define.amd?define(function(){return e(t)}):"object"==typeof module&&module.exports?module.exports=e(t):(t.lottie=e(t),t.bodymovin=t.lottie)}(window||{},function(t){"use strict";function e(){return{}}function s(t){zt=t?Math.round:function(t){return t}}function a(t,e,s,i){this.type=t,this.currentTime=e,this.totalTime=s,this.direction=i<0?-1:1}function r(t,e){this.type=t,this.direction=e<0?-1:1}function n(t,e,s,i){this.type=t,this.currentLoop=e,this.totalLoops=s,this.direction=i<0?-1:1}function h(t,e,s){this.type=t,this._ch=e,this.totalFrames=s}function o(t,e){this.type=t,this.target=e}function p(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 l(t,e,s){var i,a,r,n,h,o,p,l;switch(1===arguments.length&&(e=t.s,s=t.v,t=t.h),n=Math.floor(6*t),h=6*t-n,o=s*(1-e),p=s*(1-h*e),l=s*(1-(1-h)*e),n%6){case 0:i=s,a=l,r=o;break;case 1:i=p,a=s,r=o;break;case 2:i=o,a=s,r=l;break;case 3:i=o,a=p,r=s;break;case 4:i=l,a=o,r=s;break;case 5:i=s,a=o,r=p}return[i,a,r]}function f(t,e,s){1===arguments.length&&(e=t.g,s=t.b,t=t.r);var i,a=Math.max(t,e,s),r=Math.min(t,e,s),n=a-r,h=0===a?0:n/a,o=a/255;switch(a){case r:i=0;break;case t:i=e-s+n*(e<s?6:0),i/=6*n;break;case e:i=s-t+2*n,i/=6*n;break;case s:i=t-e+4*n,i/=6*n}return[i,h,o]}function m(t,e){var s=f(255*t[0],255*t[1],255*t[2]);return s[1]+=e,s[1]>1?s[1]=1:s[1]<=0&&(s[1]=0),l(s[0],s[1],s[2])}function d(t,e){var s=f(255*t[0],255*t[1],255*t[2]);return s[2]+=e,s[2]>1?s[2]=1:s[2]<0&&(s[2]=0),l(s[0],s[1],s[2])}function c(t,e){var s=f(255*t[0],255*t[1],255*t[2]);return s[0]+=e/360,s[0]>1?s[0]-=1:s[0]<0&&(s[0]+=1),l(s[0],s[1],s[2])}function u(){}function g(t){return Array.apply(null,{length:t})}function y(t){return document.createElementNS(Bt,t)}function v(t){return document.createElement(t)}function b(t,e){var s,i,a=t.length;for(s=0;s<a;s+=1){i=t[s].prototype;for(var r in i)i.hasOwnProperty(r)&&(e.prototype[r]=i[r])}}function k(){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&&n<1e-4}function e(e,s,i,a,r,n,h,o,p){if(0===i&&0===n&&0===p)return t(e,s,a,r,h,o);var l,f=Math.sqrt(Math.pow(a-e,2)+Math.pow(r-s,2)+Math.pow(n-i,2)),m=Math.sqrt(Math.pow(h-e,2)+Math.pow(o-s,2)+Math.pow(p-i,2)),d=Math.sqrt(Math.pow(h-a,2)+Math.pow(o-r,2)+Math.pow(p-n,2));return l=f>m?f>d?f-m-d:d-m-f:d>m?d-m-f:m-f-d,l>-1e-4&&l<1e-4}function s(t){var e,s=ye.newElement(),i=t.c,a=t.v,r=t.o,n=t.i,h=t._length,p=s.lengths,l=0;for(e=0;e<h-1;e+=1)p[e]=o(a[e],a[e+1],r[e],n[e+1]),l+=p[e].addedLength;return i&&(p[e]=o(a[e],a[0],r[e],n[0]),l+=p[e].addedLength),s.totalLength=l,s}function i(t){this.segmentLength=0,this.points=new Array(t)}function a(t,e){this.partialLength=t,this.point=e}function r(t,e){var s=e.percents,i=e.lengths,a=s.length,r=qt((a-1)*t),n=t*e.addedLength,h=0;if(r===a-1||0===r||n===i[r])return s[r];for(var o=i[r]>n?-1:1,p=!0;p;)if(i[r]<=n&&i[r+1]>n?(h=(n-i[r])/(i[r+1]-i[r]),p=!1):r+=o,r<0||r>=a-1){if(r===a-1)return s[r];p=!1}return s[r]+(s[r+1]-s[r])*h}function n(t,e,s,i,a,n){var h=r(a,n),o=1-h,p=Math.round(1e3*(o*o*o*t[0]+(h*o*o+o*h*o+o*o*h)*s[0]+(h*h*o+o*h*h+h*o*h)*i[0]+h*h*h*e[0]))/1e3,l=Math.round(1e3*(o*o*o*t[1]+(h*o*o+o*h*o+o*o*h)*s[1]+(h*h*o+o*h*h+h*o*h)*i[1]+h*h*h*e[1]))/1e3;return[p,l]}function h(t,e,s,i,a,n,h){a=a<0?0:a>1?1:a;var o=r(a,h);n=n>1?1:n;var p,f=r(n,h),m=t.length,d=1-o,c=1-f,u=d*d*d,g=o*d*d*3,y=o*o*d*3,v=o*o*o,b=d*d*c,k=o*d*c+d*o*c+d*d*f,A=o*o*c+d*o*f+o*d*f,P=o*o*f,M=d*c*c,_=o*c*c+d*f*c+d*c*f,E=o*f*c+d*f*f+o*c*f,w=o*f*f,F=c*c*c,C=f*c*c+c*f*c+c*c*f,x=f*f*c+c*f*f+f*c*f,D=f*f*f;for(p=0;p<m;p+=1)l[4*p]=Math.round(1e3*(u*t[p]+g*s[p]+y*i[p]+v*e[p]))/1e3,l[4*p+1]=Math.round(1e3*(b*t[p]+k*s[p]+A*i[p]+P*e[p]))/1e3,l[4*p+2]=Math.round(1e3*(M*t[p]+_*s[p]+E*i[p]+w*e[p]))/1e3,l[4*p+3]=Math.round(1e3*(F*t[p]+C*s[p]+x*i[p]+D*e[p]))/1e3;return l}var o=(Math,function(){return function(t,e,s,i){var a,r,n,h,o,p,l=Jt,f=0,m=[],d=[],c=ve.newElement();for(n=s.length,a=0;a<l;a+=1){for(o=a/(l-1),p=0,r=0;r<n;r+=1)h=Wt(1-o,3)*t[r]+3*Wt(1-o,2)*o*s[r]+3*(1-o)*Wt(o,2)*i[r]+Wt(o,3)*e[r],m[r]=h,null!==d[r]&&(p+=Wt(m[r]-d[r],2)),d[r]=m[r];p&&(p=Xt(p),f+=p),c.percents[a]=o,c.lengths[a]=f}return c.addedLength=f,c}}()),p=function(){var e={};return function(s){var r=s.s,n=s.e,h=s.to,o=s.ti,p=(r[0]+"_"+r[1]+"_"+n[0]+"_"+n[1]+"_"+h[0]+"_"+h[1]+"_"+o[0]+"_"+o[1]).replace(/\./g,"p");if(e[p])return void(s.bezierData=e[p]);var l,f,m,d,c,u,y,v=Jt,b=0,k=null;2===r.length&&(r[0]!=n[0]||r[1]!=n[1])&&t(r[0],r[1],n[0],n[1],r[0]+h[0],r[1]+h[1])&&t(r[0],r[1],n[0],n[1],n[0]+o[0],n[1]+o[1])&&(v=2);var A=new i(v);for(m=h.length,l=0;l<v;l+=1){for(y=g(m),c=l/(v-1),u=0,f=0;f<m;f+=1)d=Wt(1-c,3)*r[f]+3*Wt(1-c,2)*c*(r[f]+h[f])+3*(1-c)*Wt(c,2)*(n[f]+o[f])+Wt(c,3)*n[f],y[f]=d,null!==k&&(u+=Wt(y[f]-k[f],2));u=Xt(u),b+=u,A.points[l]=new a(u,y),k=y}A.segmentLength=b,s.bezierData=A,e[p]=A}}(),l=Qt("float32",8);return{getSegmentsLength:s,getNewSegment:h,getPointInSegment:n,buildBezierData:p,pointOnLine2D:t,pointOnLine3D:e}}function A(){function t(a,r,h){var o,p,l,f,m,d,c,u,g=a.length;for(f=0;f<g;f+=1)if(o=a[f],"ks"in o&&!o.completed){if(o.completed=!0,o.tt&&(a[f-1].td=o.tt),p=[],l=-1,o.hasMask){var y=o.masksProperties;for(d=y.length,m=0;m<d;m+=1)if(y[m].pt.k.i)i(y[m].pt.k);else for(u=y[m].pt.k.length,c=0;c<u;c+=1)y[m].pt.k[c].s&&i(y[m].pt.k[c].s[0]),y[m].pt.k[c].e&&i(y[m].pt.k[c].e[0])}0===o.ty?(o.layers=e(o.refId,r),t(o.layers,r,h)):4===o.ty?s(o.shapes):5==o.ty&&n(o,h)}}function e(t,e){for(var s=0,i=e.length;s<i;){if(e[s].id===t)return e[s].layers.__used?JSON.parse(JSON.stringify(e[s].layers)):(e[s].layers.__used=!0,e[s].layers);s+=1}}function s(t){var e,a,r,n=t.length,h=!1;for(e=n-1;e>=0;e-=1)if("sh"==t[e].ty){if(t[e].ks.k.i)i(t[e].ks.k);else for(r=t[e].ks.k.length,a=0;a<r;a+=1)t[e].ks.k[a].s&&i(t[e].ks.k[a].s[0]),t[e].ks.k[a].e&&i(t[e].ks.k[a].e[0]);h=!0}else"gr"==t[e].ty&&s(t[e].it)}function i(t){var e,s=t.i.length;for(e=0;e<s;e+=1)t.i[e][0]+=t.v[e][0],t.i[e][1]+=t.v[e][1],t.o[e][0]+=t.v[e][0],t.o[e][1]+=t.v[e][1]}function a(t,e){var s=e?e.split("."):[100,100,100];return t[0]>s[0]||!(s[0]>t[0])&&(t[1]>s[1]||!(s[1]>t[1])&&(t[2]>s[2]||!(s[2]>t[2])&&void 0))}function r(e,s){e.__complete||(p(e),h(e),o(e),l(e),t(e.layers,e.assets,s),e.__complete=!0)}function n(t,e){0!==t.t.a.length||"m"in t.t.p||(t.singleShape=!0)}var h=function(){function t(t){var e=t.t.d;t.t.d={k:[{s:e,t:0}]}}function e(e){var s,i=e.length;for(s=0;s<i;s+=1)5===e[s].ty&&t(e[s])}var s=[4,4,14];return function(t){if(a(s,t.v)&&(e(t.layers),t.assets)){var i,r=t.assets.length;for(i=0;i<r;i+=1)t.assets[i].layers&&e(t.assets[i].layers)}}}(),o=function(){var t=[4,7,99];return function(e){if(e.chars&&!a(t,e.v)){var s,r,n,h,o,p=e.chars.length;for(s=0;s<p;s+=1)if(e.chars[s].data&&e.chars[s].data.shapes)for(o=e.chars[s].data.shapes[0].it,n=o.length,r=0;r<n;r+=1)h=o[r].ks.k,h.__converted||(i(o[r].ks.k),h.__converted=!0)}}}(),p=function(){function t(e){var s,i,a,r=e.length;for(s=0;s<r;s+=1)if("gr"===e[s].ty)t(e[s].it);else if("fl"===e[s].ty||"st"===e[s].ty)if(e[s].c.k&&e[s].c.k[0].i)for(a=e[s].c.k.length,i=0;i<a;i+=1)e[s].c.k[i].s&&(e[s].c.k[i].s[0]/=255,e[s].c.k[i].s[1]/=255,e[s].c.k[i].s[2]/=255,e[s].c.k[i].s[3]/=255),e[s].c.k[i].e&&(e[s].c.k[i].e[0]/=255,e[s].c.k[i].e[1]/=255,e[s].c.k[i].e[2]/=255,e[s].c.k[i].e[3]/=255);else e[s].c.k[0]/=255,e[s].c.k[1]/=255,e[s].c.k[2]/=255,e[s].c.k[3]/=255}function e(e){var s,i=e.length;for(s=0;s<i;s+=1)4===e[s].ty&&t(e[s].shapes)}var s=[4,1,9];return function(t){if(a(s,t.v)&&(e(t.layers),t.assets)){var i,r=t.assets.length;for(i=0;i<r;i+=1)t.assets[i].layers&&e(t.assets[i].layers)}}}(),l=function(){function t(e){var s,i,a,r=e.length,n=!1;for(s=r-1;s>=0;s-=1)if("sh"==e[s].ty){if(e[s].ks.k.i)e[s].ks.k.c=e[s].closed;else for(a=e[s].ks.k.length,i=0;i<a;i+=1)e[s].ks.k[i].s&&(e[s].ks.k[i].s[0].c=e[s].closed),e[s].ks.k[i].e&&(e[s].ks.k[i].e[0].c=e[s].closed);n=!0}else"gr"==e[s].ty&&t(e[s].it)}function e(e){var s,i,a,r,n,h,o=e.length;for(i=0;i<o;i+=1){if(s=e[i],s.hasMask){var p=s.masksProperties;for(r=p.length,a=0;a<r;a+=1)if(p[a].pt.k.i)p[a].pt.k.c=p[a].cl;else for(h=p[a].pt.k.length,n=0;n<h;n+=1)p[a].pt.k[n].s&&(p[a].pt.k[n].s[0].c=p[a].cl),p[a].pt.k[n].e&&(p[a].pt.k[n].e[0].c=p[a].cl)}4===s.ty&&t(s.shapes)}}var s=[4,4,18];return function(t){if(a(s,t.v)&&(e(t.layers),t.assets)){var i,r=t.assets.length;for(i=0;i<r;i+=1)t.assets[i].layers&&e(t.assets[i].layers)}}}(),f={};return f.completeData=r,f}function P(){this.c=!1,this._length=0,this._maxLength=8,this.v=g(this._maxLength),this.o=g(this._maxLength),this.i=g(this._maxLength)}function M(){}function _(){}function E(){}function w(){}function F(){this._length=0,this._maxLength=4,this.shapes=g(this._maxLength)}function C(t,e,s,i){this.elem=t,this.frameId=-1,this.dataProps=g(e.length),this.renderer=s,this.mdf=!1,this.k=!1,this.dashStr="",this.dashArray=Qt("float32",e.length-1),this.dashoffset=Qt("float32",1);var a,r,n=e.length;for(a=0;a<n;a+=1)r=ae._bo(t,e[a].v,0,0,i),this.k=!!r.k||this.k,this.dataProps[a]={n:e[a].n,p:r};this.k?i.push(this):this.getValue(!0)}function x(t,e,s){this.prop=ae._bo(t,e.k,1,null,[]),this.data=e,this.k=this.prop.k,this.c=Qt("uint8c",4*e.p);var i=e.k.k[0].s?e.k.k[0].s.length-4*e.p:e.k.k.length-4*e.p;this.o=Qt("float32",i),this.cmdf=!1,this.omdf=!1,this._collapsable=this.checkCollapsable(),this._hasOpacity=i,this.prop.k&&s.push(this),this.getValue(!0)}function D(t,e,s){this.mdf=!1,this._ch=!0,this._hasMaskedPath=!1,this._frameId=-1,this.__co=[],this._textData=t,this._renderType=e,this._elem=s,this._animatorsData=g(this._textData.a.length),this._pathData={},this._moreOptions={alignment:{}},this._bt=[],this.lettersChangedFlag=!1}function S(t,e,s){var i={propType:!1},a=ae._bo,r=e.a;this.a={r:r.r?a(t,r.r,0,Ut,s):i,rx:r.rx?a(t,r.rx,0,Ut,s):i,ry:r.ry?a(t,r.ry,0,Ut,s):i,sk:r.sk?a(t,r.sk,0,Ut,s):i,sa:r.sa?a(t,r.sa,0,Ut,s):i,s:r.s?a(t,r.s,1,.01,s):i,a:r.a?a(t,r.a,1,0,s):i,o:r.o?a(t,r.o,0,.01,s):i,p:r.p?a(t,r.p,1,0,s):i,sw:r.sw?a(t,r.sw,0,0,s):i,sc:r.sc?a(t,r.sc,1,0,s):i,fc:r.fc?a(t,r.fc,1,0,s):i,fh:r.fh?a(t,r.fh,0,0,s):i,fs:r.fs?a(t,r.fs,0,.01,s):i,fb:r.fb?a(t,r.fb,0,.01,s):i,t:r.t?a(t,r.t,0,0,s):i},this.s=fe.getTextSelectorProp(t,e.s,s),this.s.t=e.s.t}function T(t,e,s,i,a,r){this.o=t,this.sw=e,this.sc=s,this.fc=i,this.m=a,this.p=r,this.mdf={o:!0,sw:!!e,sc:!!s,fc:!!i,m:!0,p:!0}}function I(t,e,s){this._frameId=jt,this.pv="",this.v="",this.kf=!1,this._ch=!0,this.mdf=!0,this.data=e,this.elem=t,this.keysIndex=-1,this.currentData={ascent:0,boxWidth:[0,0],f:"",fStyle:"",fWeight:"",fc:"",j:"",justifyOffset:"",l:[],lh:0,lineWidths:[],ls:"",of:"",s:"",sc:"",sw:0,t:0,tr:0,sz:0,ps:[0,0],fillColorAnim:!1,strokeColorAnim:!1,strokeWidthAnim:!1,yOffset:0,__complete:!1},this.searchProperty()?s.push(this):this.getValue(!0)}function L(){}function R(t,e){this._cq=t,this.layers=null,this.renderedFrame=-1,this._cf=y("svg");var s=y("g");this._cf.appendChild(s),this._bx=s;var i=y("defs");this._cf.appendChild(i),this.renderConfig={preserveAspectRatio:e&&e.preserveAspectRatio||"xMidYMid meet",progressiveLoad:e&&e.progressiveLoad||!1,hideOnTransparent:!e||e.hideOnTransparent!==!1,viewBoxOnly:e&&e.viewBoxOnly||!1,viewBoxSize:e&&e.viewBoxSize||!1,className:e&&e.className||""},this._x={mdf:!1,frameNum:-1,defs:i,frameId:0,_de:{w:0,h:0},renderConfig:this.renderConfig,_cr:new ie},this._br=[],this._dc=[],this.destroyed=!1}function V(t,e,s){this._co=[],this.data=t,this.element=e,this._x=s,this.storedData=[],this.masksProperties=this.data.masksProperties||[],this.maskElement=null,this._ch=!0;var i,a=this._x.defs,r=this.masksProperties?this.masksProperties.length:0;this.viewData=g(r),this.solidPath="";var n,h,o,l,f,m,d,c=this.masksProperties,u=0,v=[],b=p(10),k="clipPath",A="clip-path";for(i=0;i<r;i++)if(("a"!==c[i].mode&&"n"!==c[i].mode||c[i].inv||100!==c[i].o.k)&&(k="mask",A="mask"),"s"!=c[i].mode&&"i"!=c[i].mode||0!=u?l=null:(l=y("rect"),l.setAttribute("fill","#ffffff"),l.setAttribute("width",this.element.comp.data.w),l.setAttribute("height",this.element.comp.data.h),v.push(l)),n=y("path"),"n"!=c[i].mode){if(u+=1,n.setAttribute("fill","s"===c[i].mode?"#000000":"#ffffff"),n.setAttribute("clip-rule","nonzero"),0!==c[i].x.k){k="mask",A="mask",d=ae._bo(this.element,c[i].x,0,null,this._co);var P="fi_"+p(10);f=y("filter"),f.setAttribute("id",P),m=y("feMorphology"),m.setAttribute("operator","dilate"),m.setAttribute("in","SourceGraphic"),m.setAttribute("radius","0"),f.appendChild(m),a.appendChild(f),n.setAttribute("stroke","s"===c[i].mode?"#000000":"#ffffff")}else m=null,d=null;if(this.storedData[i]={elem:n,x:d,expan:m,lastPath:"",lastOperator:"",filterId:P,lastRadius:0},"i"==c[i].mode){o=v.length;var M=y("g");for(h=0;h<o;h+=1)M.appendChild(v[h]);var _=y("mask");_.setAttribute("mask-type","alpha"),_.setAttribute("id",b+"_"+u),_.appendChild(n),a.appendChild(_),M.setAttribute("mask","url("+Ot+"#"+b+"_"+u+")"),v.length=0,v.push(M)}else v.push(n);c[i].inv&&!this.solidPath&&(this.solidPath=this.createLayerSolidPath()),this.viewData[i]={elem:n,lastPath:"",op:ae._bo(this.element,c[i].o,0,.01,this._co),prop:ne._bp(this.element,c[i],3,this._co,null)},l&&(this.viewData[i].invRect=l),this.viewData[i].prop.k||this.drawPath(c[i],this.viewData[i].prop.v,this.viewData[i])}else this.viewData[i]={op:ae._bo(this.element,c[i].o,0,.01,this._co),prop:ne._bp(this.element,c[i],3,this._co,null),elem:n},a.appendChild(n);for(this.maskElement=y(k),r=v.length,i=0;i<r;i+=1)this.maskElement.appendChild(v[i]);u>0&&(this.maskElement.setAttribute("id",b),this.element._ca.setAttribute(A,"url("+Ot+"#"+b+")"),a.appendChild(this.maskElement))}function N(){}function z(){}function B(){}function O(){}function j(){}function G(t,e){this.elem=t,this.pos=e}function W(t,e){this.data=t,this.type=t.ty,this.d="",this.lvl=e,this.mdf=!1,this.closed=!1,this.pElem=y("path"),this.msElem=null}function X(t,e,s){this.caches=[],this.styles=[],this.transformers=t,this.lStr="",this.sh=s,this.lvl=e}function q(t,e){this.transform={mProps:t,op:e},this._br=[]}function Y(t,e,s,i){this.o=ae._bo(t,e.o,0,.01,s),this.w=ae._bo(t,e.w,0,null,s),this.d=new C(t,e.d||{},"svg",s),this.c=ae._bo(t,e.c,1,255,s),this.style=i}function H(t,e,s,i){this.o=ae._bo(t,e.o,0,.01,s),this.c=ae._bo(t,e.c,1,255,s),this.style=i}function J(t,e,s,i){this.initGradientData(t,e,s,i)}function U(t,e,s,i){this.w=ae._bo(t,e.w,0,null,s),this.d=new C(t,e.d||{},"svg",s),this.initGradientData(t,e,s,i)}function Z(){this.it=[],this.prevViewData=[],this.gr=y("g")}function K(){}function Q(t,e,s){this.initFrame(),this.initBaseData(t,e,s),this.initFrame(),this.initTransform(t,e,s),this.initHierarchy()}function $(){}function tt(){}function et(){}function st(){}function it(t,e,s){this.assetData=e.getAssetData(t.refId),this._cz(t,e,s)}function at(t,e,s){this._cz(t,e,s)}function rt(t,e,s){this.layers=t.layers,this.supports3d=!0,this._db=!1,this._dc=[],this._br=this.layers?g(this.layers.length):[],this._cz(t,e,s),this.tm=t.tm?ae._bo(this,t.tm,0,e.frameRate,this._co):{_placeholder:!0}}function nt(t,e,s){this.textSpans=[],this.renderType="svg",this._cz(t,e,s)}function ht(t,e,s){this.shapes=[],this.shapesData=t.shapes,this.stylesList=[],this.shapeModifiers=[],this.itemsData=[],this.processedElements=[],this._cz(t,e,s),this.prevViewData=[]}function ot(t,e){this._cl=e;var s=y("feColorMatrix");if(s.setAttribute("type","matrix"),s.setAttribute("color-interpolation-filters","linearRGB"),s.setAttribute("values","0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0 0 0 1 0"),s.setAttribute("result","f1"),t.appendChild(s),s=y("feColorMatrix"),s.setAttribute("type","matrix"),s.setAttribute("color-interpolation-filters","sRGB"),s.setAttribute("values","1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0"),s.setAttribute("result","f2"),t.appendChild(s),this.matrixFilter=s,100!==e._cm[2].p.v||e._cm[2].p.k){var i=y("feMerge");t.appendChild(i);var a;a=y("feMergeNode"),a.setAttribute("in","SourceGraphic"),i.appendChild(a),a=y("feMergeNode"),a.setAttribute("in","f2"),i.appendChild(a)}}function pt(t,e){this._cl=e;var s=y("feColorMatrix");s.setAttribute("type","matrix"),s.setAttribute("color-interpolation-filters","sRGB"),s.setAttribute("values","1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0"),t.appendChild(s),this.matrixFilter=s}function lt(t,e){this.initialized=!1,this._cl=e,this.elem=t,this.paths=[]}function ft(t,e){this._cl=e;var s=y("feColorMatrix");s.setAttribute("type","matrix"),s.setAttribute("color-interpolation-filters","linearRGB"),s.setAttribute("values","0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0 0 0 1 0"),s.setAttribute("result","f1"),t.appendChild(s);var i=y("feComponentTransfer");i.setAttribute("color-interpolation-filters","sRGB"),t.appendChild(i),this.matrixFilter=i;var a=y("feFuncR");a.setAttribute("type","table"),i.appendChild(a),this.feFuncR=a;var r=y("feFuncG");r.setAttribute("type","table"),i.appendChild(r),this.feFuncG=r;var n=y("feFuncB");n.setAttribute("type","table"),i.appendChild(n),this.feFuncB=n}function mt(t,e){this._cl=e;var s=this._cl._cm,i=y("feComponentTransfer");(s[10].p.k||0!==s[10].p.v||s[11].p.k||1!==s[11].p.v||s[12].p.k||1!==s[12].p.v||s[13].p.k||0!==s[13].p.v||s[14].p.k||1!==s[14].p.v)&&(this.feFuncR=this.createFeFunc("feFuncR",i)),(s[17].p.k||0!==s[17].p.v||s[18].p.k||1!==s[18].p.v||s[19].p.k||1!==s[19].p.v||s[20].p.k||0!==s[20].p.v||s[21].p.k||1!==s[21].p.v)&&(this.feFuncG=this.createFeFunc("feFuncG",i)),(s[24].p.k||0!==s[24].p.v||s[25].p.k||1!==s[25].p.v||s[26].p.k||1!==s[26].p.v||s[27].p.k||0!==s[27].p.v||s[28].p.k||1!==s[28].p.v)&&(this.feFuncB=this.createFeFunc("feFuncB",i)),(s[31].p.k||0!==s[31].p.v||s[32].p.k||1!==s[32].p.v||s[33].p.k||1!==s[33].p.v||s[34].p.k||0!==s[34].p.v||s[35].p.k||1!==s[35].p.v)&&(this.feFuncA=this.createFeFunc("feFuncA",i)),(this.feFuncR||this.feFuncG||this.feFuncB||this.feFuncA)&&(i.setAttribute("color-interpolation-filters","sRGB"),t.appendChild(i),i=y("feComponentTransfer")),(s[3].p.k||0!==s[3].p.v||s[4].p.k||1!==s[4].p.v||s[5].p.k||1!==s[5].p.v||s[6].p.k||0!==s[6].p.v||s[7].p.k||1!==s[7].p.v)&&(i.setAttribute("color-interpolation-filters","sRGB"),t.appendChild(i),this.feFuncRComposed=this.createFeFunc("feFuncR",i),this.feFuncGComposed=this.createFeFunc("feFuncG",i),this.feFuncBComposed=this.createFeFunc("feFuncB",i))}function dt(t,e){t.setAttribute("x","-100%"),t.setAttribute("y","-100%"),t.setAttribute("width","400%"),t.setAttribute("height","400%"),this._cl=e;var s=y("feGaussianBlur");s.setAttribute("in","SourceAlpha"),s.setAttribute("result","drop_shadow_1"),s.setAttribute("stdDeviation","0"),this.feGaussianBlur=s,t.appendChild(s);var i=y("feOffset");i.setAttribute("dx","25"),i.setAttribute("dy","0"),i.setAttribute("in","drop_shadow_1"),i.setAttribute("result","drop_shadow_2"),this.feOffset=i,t.appendChild(i);var a=y("feFlood");a.setAttribute("flood-color","#00ff00"),a.setAttribute("flood-opacity","1"),a.setAttribute("result","drop_shadow_3"),this.feFlood=a,t.appendChild(a);var r=y("feComposite");r.setAttribute("in","drop_shadow_3"),r.setAttribute("in2","drop_shadow_2"),r.setAttribute("operator","in"),r.setAttribute("result","drop_shadow_4"),t.appendChild(r);var n=y("feMerge");t.appendChild(n);var h;h=y("feMergeNode"),n.appendChild(h),h=y("feMergeNode"),h.setAttribute("in","SourceGraphic"),this.feMergeNode=h,this.feMerge=n,this.originalNodeAdded=!1,n.appendChild(h)}function ct(t,e,s){this.initialized=!1,this._cl=e,this.filterElem=t,this.elem=s,s.matteElement=y("g"),s.matteElement.appendChild(s._bx),s.matteElement.appendChild(s._bz),s._by=s.matteElement}function ut(t){var e,s=t.data.ef?t.data.ef.length:0,i=p(10),a=le.createFilter(i),r=0;this.filters=[];var n;for(e=0;e<s;e+=1)20===t.data.ef[e].ty?(r+=1,n=new ot(a,t.effects._cm[e]),this.filters.push(n)):21===t.data.ef[e].ty?(r+=1,n=new pt(a,t.effects._cm[e]),this.filters.push(n)):22===t.data.ef[e].ty?(n=new lt(t,t.effects._cm[e]),this.filters.push(n)):23===t.data.ef[e].ty?(r+=1,n=new ft(a,t.effects._cm[e]),this.filters.push(n)):24===t.data.ef[e].ty?(r+=1,n=new mt(a,t.effects._cm[e]),this.filters.push(n)):25===t.data.ef[e].ty?(r+=1,n=new dt(a,t.effects._cm[e]),this.filters.push(n)):28===t.data.ef[e].ty&&(n=new ct(a,t.effects._cm[e],t),this.filters.push(n));r&&(t._x.defs.appendChild(a),t._bx.setAttribute("filter","url("+Ot+"#"+i+")"))}function gt(t){Ot=t}function yt(t){Ae.play(t)}function vt(t){Ae.pause(t)}function bt(t){Ae.togglePause(t)}function kt(t,e){Ae.setSpeed(t,e)}function At(t,e){Ae.setDirection(t,e)}function Pt(t){Ae.stop(t)}function Mt(t){Ae.moveFrame(t)}function _t(){_e===!0?Ae.searchAnimations(Ee,_e,we):Ae.searchAnimations()}function Et(t){return Ae.registerAnimation(t)}function wt(){Ae.resize()}function Ft(t,e,s){Ae.goToAndStop(t,e,s)}function Ct(t){Gt=t}function xt(t){return _e===!0&&(t.animationData=JSON.parse(Ee)),Ae.loadAnimation(t)}function Dt(t){return Ae.destroy(t)}function St(t){if("string"==typeof t)switch(t){case"high":Jt=200;break;case"medium":Jt=50;break;case"low":Jt=10}else!isNaN(t)&&t>1&&(Jt=t);s(!(Jt>=50))}function Tt(){return"undefined"!=typeof navigator}function It(t,e){"expressions"===t&&(Nt=e)}function Lt(t){switch(t){case"propertyFactory":return ae;case"shape_ai":return ne;case"matrix":return $t}}function Rt(){"complete"===document.readyState&&(clearInterval(Se),_t())}function Vt(t){for(var e=De.split("&"),s=0;s<e.length;s++){var i=e[s].split("=");if(decodeURIComponent(i[0])==t)return decodeURIComponent(i[1])}}var Nt,zt,Bt="http://www.w3.org/2000/svg",Ot="",jt=-999999,Gt=!0,Wt=(/^((?!chrome|android).)*safari/i.test(navigator.userAgent),Math.round,Math.pow),Xt=Math.sqrt,qt=(Math.abs,Math.floor),Yt=(Math.max,Math.min),Ht={};!function(){var t,e=Object.getOwnPropertyNames(Math),s=e.length;for(t=0;t<s;t+=1)Ht[e[t]]=Math[e[t]]}(),Ht.random=Math.random,Ht.abs=function(t){var e=typeof t;if("object"===e&&t.length){var s,i=g(t.length),a=t.length;for(s=0;s<a;s+=1)i[s]=Math.abs(t[s]);return i}return Math.abs(t)};var Jt=150,Ut=Math.PI/180,Zt=.5519;s(!1);var Kt=function(){var t,e,s=[];for(t=0;t<256;t+=1)e=t.toString(16),s[t]=1==e.length?"0"+e:e;return function(t,e,i){return t<0&&(t=0),e<0&&(e=0),i<0&&(i=0),"#"+s[t]+s[e]+s[i]}}();u.prototype={_cy:function(t,e){if(this._cbs[t])for(var s=this._cbs[t].length,i=0;i<s;i++)this._cbs[t][i](e)},addEventListener:function(t,e){return this._cbs[t]||(this._cbs[t]=[]),this._cbs[t].push(e),function(){this.removeEventListener(t,e)}.bind(this)},removeEventListener:function(t,e){if(e){if(this._cbs[t]){for(var s=0,i=this._cbs[t].length;s<i;)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}};var Qt=function(){function t(t,e){var s,i=0,a=[];switch(t){case"int16":case"uint8c":s=1;break;default:s=1.1}for(i=0;i<e;i+=1)a.push(s);return a}function e(t,e){return"float32"===t?new Float32Array(e):"int16"===t?new Int16Array(e):"uint8c"===t?new Uint8ClampedArray(e):void 0}return"function"==typeof Uint8ClampedArray&&"function"==typeof Float32Array?e:t}(),$t=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=w(t),s=F(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=w(t),s=F(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=w(t),s=F(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=w(t),s=F(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(C(t),C(e))}function h(t,e){var s=w(e),i=F(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,C(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 o(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 p(t,e,s,i,a,r,n,h,o,p,l,f,m,d,c,u){return this.props[0]=t,this.props[1]=e,this.props[2]=s,this.props[3]=i,this.props[4]=a,this.props[5]=r,this.props[6]=n,this.props[7]=h,this.props[8]=o,this.props[9]=p,this.props[10]=l,this.props[11]=f,this.props[12]=m,this.props[13]=d,this.props[14]=c,this.props[15]=u,this}function l(t,e,s){return s=s||0,0!==t||0!==e||0!==s?this._t(1,0,0,0,0,1,0,0,0,0,1,0,t,e,s,1):this}function f(t,e,s,i,a,r,n,h,o,p,l,f,m,d,c,u){if(1===t&&0===e&&0===s&&0===i&&0===a&&1===r&&0===n&&0===h&&0===o&&0===p&&1===l&&0===f)return this.props[12]=this.props[12]*t+this.props[15]*m,this.props[13]=this.props[13]*r+this.props[15]*d,this.props[14]=this.props[14]*l+this.props[15]*c,this.props[15]=this.props[15]*u,this._identityCalculated=!1,this;var g=this.props[0],y=this.props[1],v=this.props[2],b=this.props[3],k=this.props[4],A=this.props[5],P=this.props[6],M=this.props[7],_=this.props[8],E=this.props[9],w=this.props[10],F=this.props[11],C=this.props[12],x=this.props[13],D=this.props[14],S=this.props[15];return this.props[0]=g*t+y*a+v*o+b*m,this.props[1]=g*e+y*r+v*p+b*d,this.props[2]=g*s+y*n+v*l+b*c,this.props[3]=g*i+y*h+v*f+b*u,this.props[4]=k*t+A*a+P*o+M*m,this.props[5]=k*e+A*r+P*p+M*d,this.props[6]=k*s+A*n+P*l+M*c,this.props[7]=k*i+A*h+P*f+M*u,this.props[8]=_*t+E*a+w*o+F*m,this.props[9]=_*e+E*r+w*p+F*d,this.props[10]=_*s+E*n+w*l+F*c,this.props[11]=_*i+E*h+w*f+F*u,this.props[12]=C*t+x*a+D*o+S*m,this.props[13]=C*e+x*r+D*p+S*d,this.props[14]=C*s+x*n+D*l+S*c,this.props[15]=C*i+x*h+D*f+S*u,this._identityCalculated=!1,this}function m(){return this._identityCalculated||(this._identity=!(1!==this.props[0]||0!==this.props[1]||0!==this.props[2]||0!==this.props[3]||0!==this.props[4]||1!==this.props[5]||0!==this.props[6]||0!==this.props[7]||0!==this.props[8]||0!==this.props[9]||1!==this.props[10]||0!==this.props[11]||0!==this.props[12]||0!==this.props[13]||0!==this.props[14]||1!==this.props[15]),this._identityCalculated=!0),this._identity}function d(t){for(var e=0;e<16;){if(t.props[e]!==this.props[e])return!1;e+=1}return!0}function c(t){var e;for(e=0;e<16;e+=1)t.props[e]=this.props[e]}function u(t){var e;for(e=0;e<16;e+=1)this.props[e]=t[e]}function g(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 y(t,e,s){return t*this.props[0]+e*this.props[4]+s*this.props[8]+this.props[12]}function v(t,e,s){return t*this.props[1]+e*this.props[5]+s*this.props[9]+this.props[13]}function b(t,e,s){return t*this.props[2]+e*this.props[6]+s*this.props[10]+this.props[14]}function k(t){var e=this.props[0]*this.props[5]-this.props[1]*this.props[4],s=this.props[5]/e,i=-this.props[1]/e,a=-this.props[4]/e,r=this.props[0]/e,n=(this.props[4]*this.props[13]-this.props[5]*this.props[12])/e,h=-(this.props[0]*this.props[13]-this.props[1]*this.props[12])/e;return[t[0]*s+t[1]*a+n,t[0]*i+t[1]*r+h,0]}function A(t){var e,s=t.length,i=[];for(e=0;e<s;e+=1)i[e]=k(t[e]);return i}function P(t,e,s,i){if(i&&2===i){var a=ce.newElement();return a[0]=t*this.props[0]+e*this.props[4]+s*this.props[8]+this.props[12],a[1]=t*this.props[1]+e*this.props[5]+s*this.props[9]+this.props[13],a}return[t*this.props[0]+e*this.props[4]+s*this.props[8]+this.props[12],t*this.props[1]+e*this.props[5]+s*this.props[9]+this.props[13],t*this.props[2]+e*this.props[6]+s*this.props[10]+this.props[14]]}function M(t,e){return this.isIdentity()?t+","+e:t*this.props[0]+e*this.props[4]+this.props[12]+","+(t*this.props[1]+e*this.props[5]+this.props[13])}function _(){for(var t=0,e=this.props,s="matrix3d(",i=1e4;t<16;)s+=x(e[t]*i)/i,s+=15===t?")":",",t+=1;return s}function E(){var t=1e4,e=this.props;return"matrix("+x(e[0]*t)/t+","+x(e[1]*t)/t+","+x(e[4]*t)/t+","+x(e[5]*t)/t+","+x(e[12]*t)/t+","+x(e[13]*t)/t+")"}var w=Math.cos,F=Math.sin,C=Math.tan,x=Math.round;return function(){this.reset=t,this.rotate=e,this.rotateX=s,this.rotateY=i,this.rotateZ=a,this.skew=n,this.skewFromAxis=h,this.shear=r,this.scale=o,this.setTransform=p,this.translate=l,this.transform=f,this.applyToPoint=g,this.applyToX=y,this.applyToY=v,this.applyToZ=b,this._cn=P,this.applyToPointStringified=M,this.toCSS=_,this.to2dCSS=E,this.clone=c,this.cloneFromProps=u,this.equals=d,this.inversePoints=A,this.inversePoint=k,this._t=this.transform,this.isIdentity=m,this._identity=!0,this._identityCalculated=!1,this.props=Qt("float32",16),this.reset()}}();!function(t,e){function s(s,p,l){var d=[];p=1==p?{entropy:!0}:p||{};var v=n(r(p.entropy?[s,o(t)]:null==s?h():s,3),d),b=new i(d),k=function(){for(var t=b.g(m),e=u,s=0;t<g;)t=(t+s)*f,e*=f,s=b.g(1);for(;t>=y;)t/=2,e/=2,s>>>=1;return(t+s)/e};return k.int32=function(){return 0|b.g(4)},k.quick=function(){return b.g(4)/4294967296},k["double"]=k,n(o(b.S),t),(p.pass||l||function(t,s,i,r){return r&&(r.S&&a(r,b),t.state=function(){return a(b,{})}),i?(e[c]=t,s):t})(k,v,"global"in p?p.global:this==e,p.state)}function i(t){var e,s=t.length,i=this,a=0,r=i.i=i.j=0,n=i.S=[];for(s||(t=[s++]);a<f;)n[a]=a++;for(a=0;a<f;a++)n[a]=n[r=v&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=v&a+1],s=s*f+n[v&(n[a]=n[r=v&r+e])+(n[r]=e)];return i.i=a,i.j=r,s})(f)}function a(t,e){return e.i=t.i,e.j=t.j,e.S=t.S.slice(),e}function r(t,e){var s,i=[],a=typeof t;if(e&&"object"==a)for(s in t)try{i.push(r(t[s],e-1))}catch(n){}return i.length?i:"string"==a?t:t+"\0"}function n(t,e){for(var s,i=t+"",a=0;a<i.length;)e[v&a]=v&(s^=19*e[v&a])+i.charCodeAt(a++);return o(e)}function h(){try{if(p)return o(p.randomBytes(f));var e=new Uint8Array(f);return(l.crypto||l.msCrypto).getRandomValues(e),o(e)}catch(s){var i=l.navigator,a=i&&i.plugins;return[+new Date,l,a,l.screen,o(t)]}}function o(t){return String.fromCharCode.apply(0,t)}var p,l=this,f=256,m=6,d=52,c="random",u=e.pow(f,m),g=e.pow(2,d),y=2*g,v=f-1;e["seed"+c]=s,n(e.random(),t)}([],Ht);var te=function(){function t(t,e,s,i,a){var r=a||("bez_"+t+"_"+e+"_"+s+"_"+i).replace(/\./g,"p");if(l[r])return l[r];var n=new o([t,e,s,i]);return l[r]=n,n}function e(t,e){return 1-3*e+3*t}function s(t,e){return 3*e-6*t}function i(t){return 3*t}function a(t,a,r){return((e(a,r)*t+s(a,r))*t+i(a))*t}function r(t,a,r){return 3*e(a,r)*t*t+2*s(a,r)*t+i(a)}function n(t,e,s,i,r){var n,h,o=0;do h=e+(s-e)/2,n=a(h,i,r)-t,n>0?s=h:e=h;while(Math.abs(n)>d&&++o<c);return h}function h(t,e,s,i){for(var n=0;n<f;++n){var h=r(e,s,i);if(0===h)return e;var o=a(e,s,i)-t;e-=o/h}return e}function o(t){this._p=t,this._mSampleValues=y?new Float32Array(u):new Array(u),this._precomputed=!1,this.get=this.get.bind(this)}var p={};p.getBezierEasing=t;var l={},f=4,m=.001,d=1e-7,c=10,u=11,g=1/(u-1),y="function"==typeof Float32Array;return o.prototype={get:function(t){var e=this._p[0],s=this._p[1],i=this._p[2],r=this._p[3];return this._precomputed||this._precompute(),e===s&&i===r?t:0===t?0:1===t?1:a(this._getTForX(t),s,r)},_precompute:function(){var t=this._p[0],e=this._p[1],s=this._p[2],i=this._p[3];this._precomputed=!0,t===e&&s===i||this._calcSampleValues()},_calcSampleValues:function(){for(var t=this._p[0],e=this._p[2],s=0;s<u;++s)this._mSampleValues[s]=a(s*g,t,e)},_getTForX:function(t){for(var e=this._p[0],s=this._p[2],i=this._mSampleValues,a=0,o=1,p=u-1;o!==p&&i[o]<=t;++o)a+=g;
+--o;var l=(t-i[o])/(i[o+1]-i[o]),f=a+l*g,d=r(f,e,s);return d>=m?h(t,f,e,s):0===d?f:n(t,a,a+g,e,s)}},p}();!function(){for(var e=0,s=["ms","moz","webkit","o"],i=0;i<s.length&&!t.requestAnimationFrame;++i)t.requestAnimationFrame=t[s[i]+"RequestAnimationFrame"],t.cancelAnimationFrame=t[s[i]+"CancelAnimationFrame"]||t[s[i]+"CancelRequestAnimationFrame"];t.requestAnimationFrame||(t.requestAnimationFrame=function(t,s){var i=(new Date).getTime(),a=Math.max(0,16-(i-e)),r=setTimeout(function(){t(i+a)},a);return e=i+a,r}),t.cancelAnimationFrame||(t.cancelAnimationFrame=function(t){clearTimeout(t)})}();var ee=k(),se=A(),ie=function(){function e(t,e){var s=v("span");s.style.fontFamily=e;var i=v("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 s(){var e,i,a,r=this.fonts.length,n=r;for(e=0;e<r;e+=1)if(this.fonts[e].loaded)n-=1;else if("t"===this.fonts[e].fOrigin||2===this.fonts[e].origin){if(t.Typekit&&t.Typekit.load&&0===this.typekitLoaded){this.typekitLoaded=1;try{t.Typekit.load({async:!0,active:function(){this.typekitLoaded=2}.bind(this)})}catch(h){}}2===this.typekitLoaded&&(this.fonts[e].loaded=!0)}else"n"===this.fonts[e].fOrigin||0===this.fonts[e].origin?this.fonts[e].loaded=!0:(i=this.fonts[e].monoCase.node,a=this.fonts[e].monoCase.w,i.offsetWidth!==a?(n-=1,this.fonts[e].loaded=!0):(i=this.fonts[e].sansCase.node,a=this.fonts[e].sansCase.w,i.offsetWidth!==a&&(n-=1,this.fonts[e].loaded=!0)),this.fonts[e].loaded&&(this.fonts[e].sansCase.parent.parentNode.removeChild(this.fonts[e].sansCase.parent),this.fonts[e].monoCase.parent.parentNode.removeChild(this.fonts[e].monoCase.parent)));0!==n&&Date.now()-this.initTime<p?setTimeout(s.bind(this),20):setTimeout(function(){this.loaded=!0}.bind(this),0)}function i(t,e){var s=y("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=v("canvas").getContext("2d");return i.font="100px "+e.fFamily,i}function a(t,a){if(!t)return void(this.loaded=!0);if(this.chars)return this.loaded=!0,void(this.fonts=t.list);var r,n=t.list,h=n.length;for(r=0;r<h;r+=1){if(n[r].loaded=!1,n[r].monoCase=e(n[r].fFamily,"monospace"),n[r].sansCase=e(n[r].fFamily,"sans-serif"),n[r].fPath){if("p"===n[r].fOrigin||3===n[r].origin){var o=v("style");o.type="text/css",o.innerHTML="@font-face {font-family: "+n[r].fFamily+"; font-style: normal; src: url('"+n[r].fPath+"');}",a.appendChild(o)}else if("g"===n[r].fOrigin||1===n[r].origin){var p=v("link");p.type="text/css",p.rel="stylesheet",p.href=n[r].fPath,a.appendChild(p)}else if("t"===n[r].fOrigin||2===n[r].origin){var l=v("script");l.setAttribute("src",n[r].fPath),a.appendChild(l)}}else n[r].loaded=!0;n[r].helper=i(a,n[r]),this.fonts.push(n[r])}s.bind(this)()}function r(t){if(t){this.chars||(this.chars=[]);var e,s,i,a=t.length,r=this.chars.length;for(e=0;e<a;e+=1){for(s=0,i=!1;s<r;)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 n(t,e,s){for(var i=0,a=this.chars.length;i<a;){if(this.chars[i].ch===t&&this.chars[i].style===e&&this.chars[i].fFamily===s)return this.chars[i];i+=1}return console&&console.warn&&console.warn("Missing character from exported characters list: ",t,e,s),l}function h(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;e<s;){if(this.fonts[e].fName===t)return this.fonts[e];e+=1}return"sans-serif"}var p=5e3,l={w:0,size:0,shapes:[]},f=function(){this.fonts=[],this.chars=null,this.typekitLoaded=0,this.loaded=!1,this.initTime=Date.now()};return f.prototype.addChars=r,f.prototype.addFonts=a,f.prototype.getCharData=n,f.prototype.getFontByName=o,f.prototype.measureText=h,f}(),ae=function(){function t(t,e,s){var i,a=this.offsetTime;"multidimensional"===this.propType&&(i=Qt("float32",e.length));for(var r,n,h=s.lastIndex,o=h,p=this._df.length-1,l=!0;l;){if(r=this._df[o],n=this._df[o+1],o==p-1&&t>=n.t-a){r.h&&(r=n),h=0;break}if(n.t-a>t){h=o;break}o<p-1?o+=1:(h=0,l=!1)}var f,m,d,c,u,g;if(r.to){r.bezierData||ee.buildBezierData(r);var y=r.bezierData;if(t>=n.t-a||t<r.t-a){var v=t>=n.t-a?y.points.length-1:0;for(m=y.points[v].point.length,f=0;f<m;f+=1)i[f]=y.points[v].point[f];s._lastBezierData=null}else{r.__fnct?g=r.__fnct:(g=te.getBezierEasing(r.o.x,r.o.y,r.i.x,r.i.y,r.n).get,r.__fnct=g),d=g((t-(r.t-a))/(n.t-a-(r.t-a)));var b,k=y.segmentLength*d,A=s.lastFrame<t&&s._lastBezierData===y?s._lastAddedLength:0;for(u=s.lastFrame<t&&s._lastBezierData===y?s._lastPoint:0,l=!0,c=y.points.length;l;){if(A+=y.points[u].partialLength,0===k||0===d||u==y.points.length-1){for(m=y.points[u].point.length,f=0;f<m;f+=1)i[f]=y.points[u].point[f];break}if(k>=A&&k<A+y.points[u+1].partialLength){for(b=(k-A)/y.points[u+1].partialLength,m=y.points[u].point.length,f=0;f<m;f+=1)i[f]=y.points[u].point[f]+(y.points[u+1].point[f]-y.points[u].point[f])*b;break}u<c-1?u+=1:l=!1}s._lastPoint=u,s._lastAddedLength=A-y.points[u].partialLength,s._lastBezierData=y}}else{var P,M,_,E,w;for(p=r.s.length,o=0;o<p;o+=1){if(1!==r.h&&(t>=n.t-a?d=1:t<r.t-a?d=0:(r.o.x.constructor===Array?(r.__fnct||(r.__fnct=[]),r.__fnct[o]?g=r.__fnct[o]:(P=r.o.x[o]||r.o.x[0],M=r.o.y[o]||r.o.y[0],_=r.i.x[o]||r.i.x[0],E=r.i.y[o]||r.i.y[0],g=te.getBezierEasing(P,M,_,E).get,r.__fnct[o]=g)):r.__fnct?g=r.__fnct:(P=r.o.x,M=r.o.y,_=r.i.x,E=r.i.y,g=te.getBezierEasing(P,M,_,E).get,r.__fnct=g),d=g((t-(r.t-a))/(n.t-a-(r.t-a))))),this.sh&&1!==r.h){var F=r.s[o],C=r.e[o];F-C<-180?F+=360:F-C>180&&(F-=360),w=F+(C-F)*d}else w=1===r.h?r.s[o]:r.s[o]+(r.e[o]-r.s[o])*d;1===p?i=w:i[o]=w}}return s.lastIndex=h,i}function e(t){for(var e=0;e<this.v.length;)this.pv[e]=t[e],this.v[e]=this.mult?this.pv[e]*this.mult:this.pv[e],this.lastPValue[e]!==this.pv[e]&&(this.mdf=!0,this.lastPValue[e]=this.pv[e]),e+=1}function s(t){this.pv=t,this.v=this.mult?this.pv*this.mult:this.pv,this.lastPValue!=this.pv&&(this.mdf=!0,this.lastPValue=this.pv)}function i(){if(this.elem._x.frameId!==this.frameId){this.mdf=!1;var t=this.comp.renderedFrame-this.offsetTime,e=this._df[0].t-this.offsetTime,s=this._df[this._df.length-1].t-this.offsetTime;if(!(t===this._caching.lastFrame||this._caching.lastFrame!==l&&(this._caching.lastFrame>=s&&t>=s||this._caching.lastFrame<e&&t<e))){this._caching.lastIndex=this._caching.lastFrame<t?this._caching.lastIndex:0;var i=this.interpolateValue(t,this.pv,this._caching);this.calculateValueAtCurrentTime(i)}this._caching.lastFrame=t,this.frameId=this.elem._x.frameId}}function a(){}function r(t,e,s){this.propType="unidimensional",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,this.kf=!1,this.vel=0,this.getValue=a}function n(t,e,s){this.propType="multidimensional",this.mult=s,this.data=e,this.mdf=!1,this.comp=t.comp,this.k=!1,this.kf=!1,this.frameId=-1,this.v=Qt("float32",e.k.length),this.pv=Qt("float32",e.k.length),this.lastValue=Qt("float32",e.k.length);Qt("float32",e.k.length);this.vel=Qt("float32",e.k.length);var i,r=e.k.length;for(i=0;i<r;i+=1)this.v[i]=s?e.k[i]*s:e.k[i],this.pv[i]=e.k[i];this.getValue=a}function h(e,a,r){this.propType="unidimensional",this._df=a.k,this.offsetTime=e.data.st,this.lastValue=l,this.lastPValue=l,this.frameId=-1,this._caching={lastFrame:l,lastIndex:0,value:0},this.k=!0,this.kf=!0,this.data=a,this.mult=r,this.elem=e,this._ch=!1,this.comp=e.comp,this.v=r?a.k[0].s[0]*r:a.k[0].s[0],this.pv=a.k[0].s[0],this.getValue=i,this.calculateValueAtCurrentTime=s,this.interpolateValue=t}function o(s,a,r){this.propType="multidimensional";var n,h,o,p,f,m=a.k.length;for(n=0;n<m-1;n+=1)a.k[n].to&&a.k[n].s&&a.k[n].e&&(h=a.k[n].s,o=a.k[n].e,p=a.k[n].to,f=a.k[n].ti,(2===h.length&&(h[0]!==o[0]||h[1]!==o[1])&&ee.pointOnLine2D(h[0],h[1],o[0],o[1],h[0]+p[0],h[1]+p[1])&&ee.pointOnLine2D(h[0],h[1],o[0],o[1],o[0]+f[0],o[1]+f[1])||3===h.length&&(h[0]!==o[0]||h[1]!==o[1]||h[2]!==o[2])&&ee.pointOnLine3D(h[0],h[1],h[2],o[0],o[1],o[2],h[0]+p[0],h[1]+p[1],h[2]+p[2])&&ee.pointOnLine3D(h[0],h[1],h[2],o[0],o[1],o[2],o[0]+f[0],o[1]+f[1],o[2]+f[2]))&&(a.k[n].to=null,a.k[n].ti=null),h[0]===o[0]&&h[1]===o[1]&&0===p[0]&&0===p[1]&&0===f[0]&&0===f[1]&&(2===h.length||h[2]===o[2]&&0===p[2]&&0===f[2])&&(a.k[n].to=null,a.k[n].ti=null));this._df=a.k,this.offsetTime=s.data.st,this.k=!0,this.kf=!0,this._ch=!0,this.mult=r,this.elem=s,this.comp=s.comp,this.getValue=i,this.calculateValueAtCurrentTime=e,this.interpolateValue=t,this.frameId=-1;var d=a.k[0].s.length;this.v=Qt("float32",d),this.pv=Qt("float32",d),this.lastValue=Qt("float32",d),this.lastPValue=Qt("float32",d),this._caching={lastFrame:l,lastIndex:0,value:Qt("float32",d)}}function p(t,e,s,i,a){var p;if(0===e.a)p=0===s?new r(t,e,i):new n(t,e,i);else if(1===e.a)p=0===s?new h(t,e,i):new o(t,e,i);else if(e.k.length)if("number"==typeof e.k[0])p=new n(t,e,i);else switch(s){case 0:p=new h(t,e,i);break;case 1:p=new o(t,e,i)}else p=new r(t,e,i);return p.k&&a.push(p),p}var l=jt,f={_bo:p};return f}(),re=function(){function t(t){var e,s=this._co.length;for(e=0;e<s;e+=1)this._co[e].getValue(),this._co[e].mdf&&(this.mdf=!0);this.a&&t.translate(-this.a.v[0],-this.a.v[1],this.a.v[2]),this.s&&t.scale(this.s.v[0],this.s.v[1],this.s.v[2]),this.r?t.rotate(-this.r.v):t.rotateZ(-this.rz.v).rotateY(this.ry.v).rotateX(this.rx.v).rotateZ(-this.or.v[2]).rotateY(this.or.v[1]).rotateX(this.or.v[0]),this.data.p.s?this.data.p.z?t.translate(this.px.v,this.py.v,-this.pz.v):t.translate(this.px.v,this.py.v,0):t.translate(this.p.v[0],this.p.v[1],-this.p.v[2])}function e(t){if(this.elem._x.frameId!==this.frameId){this.mdf=t;var e,s=this._co.length;for(e=0;e<s;e+=1)this._co[e].getValue(),this._co[e].mdf&&(this.mdf=!0);if(this.mdf){if(this.v.reset(),this.a&&this.v.translate(-this.a.v[0],-this.a.v[1],this.a.v[2]),this.s&&this.v.scale(this.s.v[0],this.s.v[1],this.s.v[2]),this.sk&&this.v.skewFromAxis(-this.sk.v,this.sa.v),this.r?this.v.rotate(-this.r.v):this.v.rotateZ(-this.rz.v).rotateY(this.ry.v).rotateX(this.rx.v).rotateZ(-this.or.v[2]).rotateY(this.or.v[1]).rotateX(this.or.v[0]),this.autoOriented&&this.p._df&&this.p._dg){var i,a;this.p._caching.lastFrame+this.p.offsetTime<=this.p._df[0].t?(i=this.p._dg((this.p._df[0].t+.01)/this.elem._x.frameRate,0),a=this.p._dg(this.p._df[0].t/this.elem._x.frameRate,0)):this.p._caching.lastFrame+this.p.offsetTime>=this.p._df[this.p._df.length-1].t?(i=this.p._dg(this.p._df[this.p._df.length-1].t/this.elem._x.frameRate,0),a=this.p._dg((this.p._df[this.p._df.length-1].t-.01)/this.elem._x.frameRate,0)):(i=this.p.pv,a=this.p._dg((this.p._caching.lastFrame+this.p.offsetTime-.01)/this.elem._x.frameRate,this.p.offsetTime)),this.v.rotate(-Math.atan2(i[1]-a[1],i[0]-a[0]))}this.data.p.s?this.data.p.z?this.v.translate(this.px.v,this.py.v,-this.pz.v):this.v.translate(this.px.v,this.py.v,0):this.v.translate(this.p.v[0],this.p.v[1],-this.p.v[2])}this.frameId=this.elem._x.frameId}}function s(){this.inverted=!0,this.iv=new $t,this.k||(this.data.p.s?this.iv.translate(this.px.v,this.py.v,-this.pz.v):this.iv.translate(this.p.v[0],this.p.v[1],-this.p.v[2]),this.r?this.iv.rotate(-this.r.v):this.iv.rotateX(-this.rx.v).rotateY(-this.ry.v).rotateZ(this.rz.v),this.s&&this.iv.scale(this.s.v[0],this.s.v[1],1),this.a&&this.iv.translate(-this.a.v[0],-this.a.v[1],this.a.v[2]))}function i(){}function a(t,e,s){if(this.elem=t,this.frameId=-1,this.propType="transform",this._co=[],this.mdf=!1,this.data=e,this.v=new $t,e.p.s?(this.px=ae._bo(t,e.p.x,0,0,this._co),this.py=ae._bo(t,e.p.y,0,0,this._co),e.p.z&&(this.pz=ae._bo(t,e.p.z,0,0,this._co))):this.p=ae._bo(t,e.p,1,0,this._co),e.r)this.r=ae._bo(t,e.r,0,Ut,this._co);else if(e.rx){if(this.rx=ae._bo(t,e.rx,0,Ut,this._co),this.ry=ae._bo(t,e.ry,0,Ut,this._co),this.rz=ae._bo(t,e.rz,0,Ut,this._co),e.or.k[0].ti){var i,a=e.or.k.length;for(i=0;i<a;i+=1)e.or.k[i].to=e.or.k[i].ti=null}this.or=ae._bo(t,e.or,1,Ut,this._co),this.or.sh=!0}e.sk&&(this.sk=ae._bo(t,e.sk,0,Ut,this._co),this.sa=ae._bo(t,e.sa,0,Ut,this._co)),e.a&&(this.a=ae._bo(t,e.a,1,0,this._co)),e.s&&(this.s=ae._bo(t,e.s,1,.01,this._co)),e.o?this.o=ae._bo(t,e.o,0,.01,s):this.o={mdf:!1,v:1},this._co.length?s.push(this):this.getValue(!0)}function r(t,e,s){return new a(t,e,s)}return a.prototype.applyToMatrix=t,a.prototype.getValue=e,a.prototype.setInverted=s,a.prototype.autoOrient=i,{_bj:r}}();P.prototype.setPathData=function(t,e){this.c=t,this.setLength(e);for(var s=0;s<e;)this.v[s]=ce.newElement(),this.o[s]=ce.newElement(),this.i[s]=ce.newElement(),s+=1},P.prototype.setLength=function(t){for(;this._maxLength<t;)this.doubleArrayLength();this._length=t},P.prototype.doubleArrayLength=function(){this.v=this.v.concat(g(this._maxLength)),this.i=this.i.concat(g(this._maxLength)),this.o=this.o.concat(g(this._maxLength)),this._maxLength*=2},P.prototype._ax=function(t,e,s,i,a){var r;switch(this._length=Math.max(this._length,i+1),this._length>=this._maxLength&&this.doubleArrayLength(),s){case"v":r=this.v;break;case"i":r=this.i;break;case"o":r=this.o}(!r[i]||r[i]&&!a)&&(r[i]=ce.newElement()),r[i][0]=t,r[i][1]=e},P.prototype._aw=function(t,e,s,i,a,r,n,h){this._ax(t,e,"v",n,h),this._ax(s,i,"o",n,h),this._ax(a,r,"i",n,h)},P.prototype.reverse=function(){var t=new P;t.setPathData(this.c,this._length);var e=this.v,s=this.o,a=this.i,r=0;this.c&&(t._aw(e[0][0],e[0][1],a[0][0],a[0][1],s[0][0],s[0][1],0,!1),r=1);var n=this._length-1,h=this._length;for(i=r;i<h;i+=1)t._aw(e[n][0],e[n][1],a[n][0],a[n][1],s[n][0],s[n][1],i,!1),n-=1;return t};var ne=function(){function t(t,e,s,i){var a,r,n,h=i.lastIndex;if(t<this._df[0].t-this.offsetTime)a=this._df[0].s[0],n=!0,h=0;else if(t>=this._df[this._df.length-1].t-this.offsetTime)a=1===this._df[this._df.length-2].h?this._df[this._df.length-1].s[0]:this._df[this._df.length-2].e[0],n=!0;else{for(var o,p,l,f,m,d,c=h,u=this._df.length-1,g=!0;g&&(o=this._df[c],p=this._df[c+1],!(p.t-this.offsetTime>t));)c<u-1?c+=1:g=!1;n=1===o.h,h=c;var y;if(!n){if(t>=p.t-this.offsetTime)y=1;else if(t<o.t-this.offsetTime)y=0;else{var v;o.__fnct?v=o.__fnct:(v=te.getBezierEasing(o.o.x,o.o.y,o.i.x,o.i.y).get,o.__fnct=v),y=v((t-(o.t-this.offsetTime))/(p.t-this.offsetTime-(o.t-this.offsetTime)))}r=o.e[0]}a=o.s[0]}f=e._length,d=a.i[0].length;var b,k=!1;i.lastIndex=h;var l,m,b,f=e._length,d=a.i[0].length,k=!1;for(l=0;l<f;l+=1)for(m=0;m<d;m+=1)b=n?a.i[l][m]:a.i[l][m]+(r.i[l][m]-a.i[l][m])*y,e.i[l][m]!==b&&(e.i[l][m]=b,s&&(this.pv.i[l][m]=b),k=!0),b=n?a.o[l][m]:a.o[l][m]+(r.o[l][m]-a.o[l][m])*y,e.o[l][m]!==b&&(e.o[l][m]=b,s&&(this.pv.o[l][m]=b),k=!0),b=n?a.v[l][m]:a.v[l][m]+(r.v[l][m]-a.v[l][m])*y,e.v[l][m]!==b&&(e.v[l][m]=b,s&&(this.pv.v[l][m]=b),k=!0);return k}function e(){if(this.elem._x.frameId!==this.frameId){this.mdf=!1;var t=this.comp.renderedFrame-this.offsetTime,e=this._df[0].t-this.offsetTime,s=this._df[this._df.length-1].t-this.offsetTime,i=this._caching.lastFrame;if(i===p||!(i<e&&t<e||i>s&&t>s)){this._caching.lastIndex=i<t?this._caching.lastIndex:0;var a=this.interpolateShape(t,this.v,!0,this._caching);this.mdf=a,a&&(this.paths=this._ak)}this._caching.lastFrame=t,this.frameId=this.elem._x.frameId}}function s(){return this.v}function i(){this.paths=this._ak,this.k||(this.mdf=!1)}function a(t,e,s){this.propType="shape",this.comp=t.comp,this.k=!1,this.mdf=!1;var a=3===s?e.pt.k:e.ks.k;this.v=ue.clone(a),this.pv=ue.clone(this.v),this._ak=ge._al(),this.paths=this._ak,this.paths.addShape(this.v),this.reset=i}function r(t,e,s){this.propType="shape",this.comp=t.comp,this.elem=t,this.offsetTime=t.data.st,this._df=3===s?e.pt.k:e.ks.k,this.k=!0,this.kf=!0;var a=this._df[0].s[0].i.length;this._df[0].s[0].i[0].length;this.v=ue.newElement(),this.v.setPathData(this._df[0].s[0].c,a),this.pv=ue.clone(this.v),this._ak=ge._al(),this.paths=this._ak,this.paths.addShape(this.v),this.lastFrame=p,this.reset=i,this._caching={lastFrame:p,lastIndex:0}}function n(t,e,s,i){var n;if(3===s||4===s){var h=3===s?e.pt:e.ks,o=h.k;n=1===h.a||o.length?new r(t,e,s):new a(t,e,s)}else 5===s?n=new m(t,e):6===s?n=new l(t,e):7===s&&(n=new f(t,e));return n.k&&i.push(n),n}function h(){return a}function o(){return r}var p=-999999;a.prototype.interpolateShape=t,a.prototype.getValue=s,r.prototype.getValue=e,r.prototype.interpolateShape=t;var l=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,r=3!==this.d,n=this.v;3!==this.d&&(n.v[0][0]=t,n.v[0][1]=e-a,n.v[1][0]=r?t+i:t-i,n.v[1][1]=e,n.v[2][0]=t,n.v[2][1]=e+a,n.v[3][0]=r?t-i:t+i,n.v[3][1]=e,n.i[0][0]=r?t-i*s:t+i*s,n.i[0][1]=e-a,n.i[1][0]=r?t+i:t-i,n.i[1][1]=e-a*s,n.i[2][0]=r?t+i*s:t-i*s,n.i[2][1]=e+a,n.i[3][0]=r?t-i:t+i,n.i[3][1]=e+a*s,n.o[0][0]=r?t+i*s:t-i*s,n.o[0][1]=e-a,n.o[1][0]=r?t+i:t-i,n.o[1][1]=e+a*s,n.o[2][0]=r?t-i*s:t+i*s,n.o[2][1]=e+a,n.o[3][0]=r?t-i:t+i,n.o[3][1]=e-a*s)}function e(t){var e,s=this._co.length;if(this.elem._x.frameId!==this.frameId){for(this.mdf=!1,this.frameId=this.elem._x.frameId,e=0;e<s;e+=1)this._co[e].getValue(t),this._co[e].mdf&&(this.mdf=!0);this.mdf&&this.convertEllToPath()}}var s=Zt;return function(s,a){this.v=ue.newElement(),this.v.setPathData(!0,4),this._ak=ge._al(),this.paths=this._ak,this._ak.addShape(this.v),this.d=a.d,this._co=[],this.elem=s,this.comp=s.comp,this.frameId=-1,this.mdf=!1,this.getValue=e,this.convertEllToPath=t,this.reset=i,this.p=ae._bo(s,a.p,1,0,this._co),this.s=ae._bo(s,a.s,1,0,this._co),this._co.length?this.k=!0:this.convertEllToPath()}}(),f=function(){function t(){var t,e=Math.floor(this.pt.v),s=2*Math.PI/e,i=this.or.v,a=this.os.v,r=2*Math.PI*i/(4*e),n=-Math.PI/2,h=3===this.data.d?-1:1;for(n+=this.r.v,this.v._length=0,t=0;t<e;t+=1){var o=i*Math.cos(n),p=i*Math.sin(n),l=0===o&&0===p?0:p/Math.sqrt(o*o+p*p),f=0===o&&0===p?0:-o/Math.sqrt(o*o+p*p);o+=+this.p.v[0],p+=+this.p.v[1],this.v._aw(o,p,o-l*r*a*h,p-f*r*a*h,o+l*r*a*h,p+f*r*a*h,t,!0),n+=s*h}this.paths.length=0,this.paths[0]=this.v}function e(){var t,e,s,i,a=2*Math.floor(this.pt.v),r=2*Math.PI/a,n=!0,h=this.or.v,o=this.ir.v,p=this.os.v,l=this.is.v,f=2*Math.PI*h/(2*a),m=2*Math.PI*o/(2*a),d=-Math.PI/2;d+=this.r.v;var c=3===this.data.d?-1:1;for(this.v._length=0,t=0;t<a;t+=1){e=n?h:o,s=n?p:l,i=n?f:m;var u=e*Math.cos(d),g=e*Math.sin(d),y=0===u&&0===g?0:g/Math.sqrt(u*u+g*g),v=0===u&&0===g?0:-u/Math.sqrt(u*u+g*g);u+=+this.p.v[0],g+=+this.p.v[1],this.v._aw(u,g,u-y*i*s*c,g-v*i*s*c,u+y*i*s*c,g+v*i*s*c,t,!0),n=!n,d+=r*c}}function s(){if(this.elem._x.frameId!==this.frameId){this.mdf=!1,this.frameId=this.elem._x.frameId;var t,e=this._co.length;for(t=0;t<e;t+=1)this._co[t].getValue(),this._co[t].mdf&&(this.mdf=!0);this.mdf&&this.convertToPath()}}return function(a,r){this.v=ue.newElement(),this.v.setPathData(!0,0),this.elem=a,this.comp=a.comp,this.data=r,this.frameId=-1,this.d=r.d,this._co=[],this.mdf=!1,this.getValue=s,this.reset=i,1===r.sy?(this.ir=ae._bo(a,r.ir,0,0,this._co),this.is=ae._bo(a,r.is,0,.01,this._co),this.convertToPath=e):this.convertToPath=t,this.pt=ae._bo(a,r.pt,0,0,this._co),this.p=ae._bo(a,r.p,1,0,this._co),this.r=ae._bo(a,r.r,0,Ut,this._co),this.or=ae._bo(a,r.or,0,0,this._co),this.os=ae._bo(a,r.os,0,.01,this._co),this._ak=ge._al(),this._ak.addShape(this.v),this.paths=this._ak,this._co.length?this.k=!0:this.convertToPath()}}(),m=function(){function t(t){if(this.elem._x.frameId!==this.frameId){this.mdf=!1,this.frameId=this.elem._x.frameId;var e,s=this._co.length;for(e=0;e<s;e+=1)this._co[e].getValue(t),this._co[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=Yt(s,i,this.r.v),r=a*(1-Zt);this.v._length=0,2===this.d||1===this.d?(this.v._aw(t+s,e-i+a,t+s,e-i+a,t+s,e-i+r,0,!0),this.v._aw(t+s,e+i-a,t+s,e+i-r,t+s,e+i-a,1,!0),0!==a?(this.v._aw(t+s-a,e+i,t+s-a,e+i,t+s-r,e+i,2,!0),this.v._aw(t-s+a,e+i,t-s+r,e+i,t-s+a,e+i,3,!0),this.v._aw(t-s,e+i-a,t-s,e+i-a,t-s,e+i-r,4,!0),this.v._aw(t-s,e-i+a,t-s,e-i+r,t-s,e-i+a,5,!0),this.v._aw(t-s+a,e-i,t-s+a,e-i,t-s+r,e-i,6,!0),this.v._aw(t+s-a,e-i,t+s-r,e-i,t+s-a,e-i,7,!0)):(this.v._aw(t-s,e+i,t-s+r,e+i,t-s,e+i,2),this.v._aw(t-s,e-i,t-s,e-i+r,t-s,e-i,3))):(this.v._aw(t+s,e-i+a,t+s,e-i+r,t+s,e-i+a,0,!0),0!==a?(this.v._aw(t+s-a,e-i,t+s-a,e-i,t+s-r,e-i,1,!0),this.v._aw(t-s+a,e-i,t-s+r,e-i,t-s+a,e-i,2,!0),this.v._aw(t-s,e-i+a,t-s,e-i+a,t-s,e-i+r,3,!0),this.v._aw(t-s,e+i-a,t-s,e+i-r,t-s,e+i-a,4,!0),this.v._aw(t-s+a,e+i,t-s+a,e+i,t-s+r,e+i,5,!0),this.v._aw(t+s-a,e+i,t+s-r,e+i,t+s-a,e+i,6,!0),this.v._aw(t+s,e+i-a,t+s,e+i-a,t+s,e+i-r,7,!0)):(this.v._aw(t-s,e-i,t-s+r,e-i,t-s,e-i,1,!0),this.v._aw(t-s,e+i,t-s,e+i-r,t-s,e+i,2,!0),this.v._aw(t+s,e+i,t+s-r,e+i,t+s,e+i,3,!0)))}return function(s,a){this.v=ue.newElement(),this.v.c=!0,this._ak=ge._al(),this._ak.addShape(this.v),this.paths=this._ak,this.elem=s,this.comp=s.comp,this.frameId=-1,this.d=a.d,this._co=[],this.mdf=!1,this.getValue=t,this.convertRectToPath=e,this.reset=i,this.p=ae._bo(s,a.p,1,0,this._co),this.s=ae._bo(s,a.s,1,0,this._co),this.r=ae._bo(s,a.r,0,0,this._co),this._co.length?this.k=!0:this.convertRectToPath()}}(),d={};return d._bp=n,d.getConstructorFunction=h,d.getKeyframedConstructorFunction=o,d}(),he=function(){function t(t,e){i[t]||(i[t]=e)}function e(t,e,s,a){return new i[t](e,s,a)}var s={},i={};return s.registerModifier=t,s.getModifier=e,s}();M.prototype.initModifierProperties=function(){},M.prototype.addShapeToModifier=function(){},M.prototype.addShape=function(t){if(!this.closed){var e={shape:t.sh,data:t,_ak:ge._al()};this.shapes.push(e),this.addShapeToModifier(e)}},M.prototype.init=function(t,e,s){this._co=[],this.shapes=[],this.elem=t,this.initModifierProperties(t,e),this.frameId=jt,this.mdf=!1,this.closed=!1,this.k=!1,this._co.length?(this.k=!0,s.push(this)):this.getValue(!0)},b([M],_),_.prototype.processKeys=function(t){if(this.elem._x.frameId!==this.frameId||t){this.mdf=t,this.frameId=this.elem._x.frameId;var e,s=this._co.length;for(e=0;e<s;e+=1)this._co[e].getValue(),this._co[e].mdf&&(this.mdf=!0);if(this.mdf||t){var i=this.o.v%360/360;i<0&&(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}}},_.prototype.initModifierProperties=function(t,e){this.s=ae._bo(t,e.s,0,.01,this._co),this.e=ae._bo(t,e.e,0,.01,this._co),this.o=ae._bo(t,e.o,0,0,this._co),this.sValue=0,this.eValue=0,this.oValue=0,this.getValue=this.processKeys,this.m=e.m},_.prototype.addShapeToModifier=function(t){t.pathsData=[]},_.prototype.calculateShapeEdges=function(t,e,s,i,a){var r=[];e<=1?r.push({s:t,e:e}):t>=1?r.push({s:t-1,e:e-1}):(r.push({s:t,e:1}),r.push({s:0,e:e-1}));var n,h,o=[],p=r.length;for(n=0;n<p;n+=1)if(h=r[n],h.e*a<i||h.s*a>i+s);else{var l,f;l=h.s*a<=i?0:(h.s*a-i)/s,f=h.e*a>=i+s?1:(h.e*a-i)/s,o.push([l,f])}return o.length||o.push([0,0]),o},_.prototype.releasePathsData=function(t){var e,s=t.length;for(e=0;e<s;e+=1)ye.release(t[e]);return t.length=0,t},_.prototype.processShapes=function(t){var e,s,i,a,r,n,h,o=this.shapes.length,p=this.sValue,l=this.eValue,f=0;if(l===p)for(s=0;s<o;s+=1)this.shapes[s]._ak.releaseShapes(),this.shapes[s].shape.mdf=!0,this.shapes[s].shape.paths=this.shapes[s]._ak;else if(1===l&&0===p||0===l&&1===p){if(this.mdf)for(s=0;s<o;s+=1)this.shapes[s].shape.mdf=!0}else{var m,d,c=[];for(s=0;s<o;s+=1)if(m=this.shapes[s],m.shape.mdf||this.mdf||t||2===this.m){if(e=m.shape.paths,a=e._length,h=0,!m.shape.mdf&&m.pathsData.length)h=m.totalShapeLength;else{for(r=this.releasePathsData(m.pathsData),i=0;i<a;i+=1)n=ee.getSegmentsLength(e.shapes[i]),r.push(n),h+=n.totalLength;m.totalShapeLength=h,m.pathsData=r}f+=h,m.shape.mdf=!0}else m.shape.paths=m._ak;var i,a,u=p,g=l,y=0;for(s=o-1;s>=0;s-=1)if(m=this.shapes[s],m.shape.mdf){if(d=m._ak,d.releaseShapes(),2===this.m&&o>1){var v=this.calculateShapeEdges(p,l,m.totalShapeLength,y,f);y+=m.totalShapeLength}else v=[[u,g]];for(a=v.length,i=0;i<a;i+=1){u=v[i][0],g=v[i][1],c.length=0,g<=1?c.push({s:m.totalShapeLength*u,e:m.totalShapeLength*g}):u>=1?c.push({s:m.totalShapeLength*(u-1),e:m.totalShapeLength*(g-1)}):(c.push({s:m.totalShapeLength*u,e:m.totalShapeLength}),c.push({s:0,e:m.totalShapeLength*(g-1)}));var b=this.addShapes(m,c[0]);if(c[0].s!==c[0].e){if(c.length>1)if(m.shape.v.c){var k=b.pop();this.addPaths(b,d),b=this.addShapes(m,c[1],k)}else this.addPaths(b,d),b=this.addShapes(m,c[1]);this.addPaths(b,d)}}m.shape.paths=d}}this._co.length||(this.mdf=!1)},_.prototype.addPaths=function(t,e){var s,i=t.length;for(s=0;s<i;s+=1)e.addShape(t[s])},_.prototype.addSegment=function(t,e,s,i,a,r,n){a._ax(e[0],e[1],"o",r),a._ax(s[0],s[1],"i",r+1),n&&a._ax(t[0],t[1],"v",r),a._ax(i[0],i[1],"v",r+1)},_.prototype.addSegmentFromArray=function(t,e,s,i){e._ax(t[1],t[5],"o",s),e._ax(t[2],t[6],"i",s+1),i&&e._ax(t[0],t[4],"v",s),e._ax(t[3],t[7],"v",s+1)},_.prototype.addShapes=function(t,e,s){var i,a,r,n,h,o,p,l,f=t.pathsData,m=t.shape.paths.shapes,d=t.shape.paths._length,c=0,u=[],g=!0;for(s?(h=s._length,l=s._length):(s=ue.newElement(),h=0,l=0),u.push(s),i=0;i<d;i+=1){for(o=f[i].lengths,s.c=m[i].c,r=m[i].c?o.length:o.length+1,a=1;a<r;a+=1)if(n=o[a-1],c+n.addedLength<e.s)c+=n.addedLength,s.c=!1;else{if(c>e.e){s.c=!1;break}e.s<=c&&e.e>=c+n.addedLength?(this.addSegment(m[i].v[a-1],m[i].o[a-1],m[i].i[a],m[i].v[a],s,h,g),g=!1):(p=ee.getNewSegment(m[i].v[a-1],m[i].v[a],m[i].o[a-1],m[i].i[a],(e.s-c)/n.addedLength,(e.e-c)/n.addedLength,o[a-1]),this.addSegmentFromArray(p,s,h,g),g=!1,s.c=!1),c+=n.addedLength,h+=1}if(m[i].c){if(n=o[a-1],c<=e.e){var y=o[a-1].addedLength;e.s<=c&&e.e>=c+y?(this.addSegment(m[i].v[a-1],m[i].o[a-1],m[i].i[0],m[i].v[0],s,h,g),g=!1):(p=ee.getNewSegment(m[i].v[a-1],m[i].v[0],m[i].o[a-1],m[i].i[0],(e.s-c)/y,(e.e-c)/y,o[a-1]),this.addSegmentFromArray(p,s,h,g),g=!1,s.c=!1)}else s.c=!1;c+=n.addedLength,h+=1}if(s._length&&(s._ax(s.v[l][0],s.v[l][1],"i",l),s._ax(s.v[s._length-1][0],s.v[s._length-1][1],"o",s._length-1)),c>e.e)break;i<d-1&&(s=ue.newElement(),g=!0,u.push(s),h=0)}return u},he.registerModifier("tm",_),b([M],E),E.prototype.processKeys=function(t){if(this.elem._x.frameId!==this.frameId||t){this.mdf=!!t,this.frameId=this.elem._x.frameId;var e,s=this._co.length;for(e=0;e<s;e+=1)this._co[e].getValue(),this._co[e].mdf&&(this.mdf=!0)}},E.prototype.initModifierProperties=function(t,e){this.getValue=this.processKeys,this.rd=ae._bo(t,e.r,0,null,this._co)},E.prototype.processPath=function(t,e){var s=ue.newElement();s.c=t.c;var i,a,r,n,h,o,p,l,f,m,d,c,u,g=t._length,y=0;for(i=0;i<g;i+=1)a=t.v[i],n=t.o[i],r=t.i[i],a[0]===n[0]&&a[1]===n[1]&&a[0]===r[0]&&a[1]===r[1]?0!==i&&i!==g-1||t.c?(h=0===i?t.v[g-1]:t.v[i-1],o=Math.sqrt(Math.pow(a[0]-h[0],2)+Math.pow(a[1]-h[1],2)),p=o?Math.min(o/2,e)/o:0,l=c=a[0]+(h[0]-a[0])*p,f=u=a[1]-(a[1]-h[1])*p,m=l-(l-a[0])*Zt,d=f-(f-a[1])*Zt,s._aw(l,f,m,d,c,u,y),y+=1,h=i===g-1?t.v[0]:t.v[i+1],o=Math.sqrt(Math.pow(a[0]-h[0],2)+Math.pow(a[1]-h[1],2)),p=o?Math.min(o/2,e)/o:0,l=m=a[0]+(h[0]-a[0])*p,f=d=a[1]+(h[1]-a[1])*p,c=l-(l-a[0])*Zt,u=f-(f-a[1])*Zt,s._aw(l,f,m,d,c,u,y),y+=1):(s._aw(a[0],a[1],n[0],n[1],r[0],r[1],y),y+=1):(s._aw(t.v[i][0],t.v[i][1],t.o[i][0],t.o[i][1],t.i[i][0],t.i[i][1],y),y+=1);return s},E.prototype.processShapes=function(t){var e,s,i,a,r=this.shapes.length,n=this.rd.v;if(0!==n){var h,o,p;for(s=0;s<r;s+=1){if(h=this.shapes[s],o=h.shape.paths,p=h._ak,h.shape.mdf||this.mdf||t)for(p.releaseShapes(),h.shape.mdf=!0,e=h.shape.paths.shapes,a=h.shape.paths._length,i=0;i<a;i+=1)p.addShape(this.processPath(e[i],n));h.shape.paths=h._ak}}this._co.length||(this.mdf=!1)},he.registerModifier("rd",E),w.prototype.processKeys=function(t){if(this.elem._x.frameId!==this.frameId||t){this.mdf=!!t;var e,s=this._co.length;for(e=0;e<s;e+=1)this._co[e].getValue(),this._co[e].mdf&&(this.mdf=!0)}},w.prototype.initModifierProperties=function(t,e){this.getValue=this.processKeys,this.c=ae._bo(t,e.c,0,null,this._co),this.o=ae._bo(t,e.o,0,null,this._co),this.tr=re._bj(t,e.tr,this._co),this.data=e,this._co.length||this.getValue(!0),this.pMatrix=new $t,this.rMatrix=new $t,this.sMatrix=new $t,this.tMatrix=new $t,this.matrix=new $t},w.prototype.applyTransforms=function(t,e,s,i,a,r){var n=r?-1:1,h=i.s.v[0]+(1-i.s.v[0])*(1-a),o=i.s.v[1]+(1-i.s.v[1])*(1-a);t.translate(i.p.v[0]*n*a,i.p.v[1]*n*a,i.p.v[2]),e.translate(-i.a.v[0],-i.a.v[1],i.a.v[2]),e.rotate(-i.r.v*n*a),e.translate(i.a.v[0],i.a.v[1],i.a.v[2]),s.translate(-i.a.v[0],-i.a.v[1],i.a.v[2]),s.scale(r?1/h:h,r?1/o:o),s.translate(i.a.v[0],i.a.v[1],i.a.v[2])},w.prototype.init=function(t,e,s,i,a){this.elem=t,this.arr=e,this.pos=s,this.elemsData=i,this._currentCopies=0,this._bq=[],this._groups=[],this._co=[],this.frameId=-1,this.initModifierProperties(t,e[s]);for(var r=0;s>0;)s-=1,this._bq.unshift(e[s]),r+=1;this._co.length?(this.k=!0,a.push(this)):this.getValue(!0)},w.prototype.resetElements=function(t){var e,s=t.length;for(e=0;e<s;e+=1)t[e]._processed=!1,"gr"===t[e].ty&&this.resetElements(t[e].it)},w.prototype.cloneElements=function(t){var e=(t.length,JSON.parse(JSON.stringify(t)));return this.resetElements(e),e},w.prototype.changeGroupRender=function(t,e){var s,i=t.length;for(s=0;s<i;s+=1)t[s]._render=e,"gr"===t[s].ty&&this.changeGroupRender(t[s].it,e)},w.prototype.processShapes=function(t){if(this.elem._x.frameId!==this.frameId&&(this.frameId=this.elem._x.frameId,this._co.length||t||(this.mdf=!1),this.mdf)){var e=Math.ceil(this.c.v);if(this._groups.length<e){for(;this._groups.length<e;){var s={it:this.cloneElements(this._bq),
+ty:"gr"};s.it.push({a:{a:0,ix:1,k:[0,0]},nm:"Transform",o:{a:0,ix:7,k:100},p:{a:0,ix:2,k:[0,0]},r:{a:0,ix:6,k:0},s:{a:0,ix:3,k:[100,100]},sa:{a:0,ix:5,k:0},sk:{a:0,ix:4,k:0},ty:"tr"}),this.arr.splice(0,0,s),this._groups.splice(0,0,s),this._currentCopies+=1}this.elem.reloadShapes()}var i,a,r=0;for(i=0;i<=this._groups.length-1;i+=1)a=r<e,this._groups[i]._render=a,this.changeGroupRender(this._groups[i].it,a),r+=1;this._currentCopies=e,this.elem._ch=!0;var n=this.o.v,h=n%1,o=n>0?Math.floor(n):Math.ceil(n),p=(this.tr.v.props,this.pMatrix.props),l=this.rMatrix.props,f=this.sMatrix.props;this.pMatrix.reset(),this.rMatrix.reset(),this.sMatrix.reset(),this.tMatrix.reset(),this.matrix.reset();var m=0;if(n>0){for(;m<o;)this.applyTransforms(this.pMatrix,this.rMatrix,this.sMatrix,this.tr,1,!1),m+=1;h&&(this.applyTransforms(this.pMatrix,this.rMatrix,this.sMatrix,this.tr,h,!1),m+=h)}else if(n<0){for(;m>o;)this.applyTransforms(this.pMatrix,this.rMatrix,this.sMatrix,this.tr,1,!0),m-=1;h&&(this.applyTransforms(this.pMatrix,this.rMatrix,this.sMatrix,this.tr,-h,!0),m-=h)}i=1===this.data.m?0:this._currentCopies-1;var d=1===this.data.m?1:-1;for(r=this._currentCopies;r;){if(0!==m){(0!==i&&1===d||i!==this._currentCopies-1&&d===-1)&&this.applyTransforms(this.pMatrix,this.rMatrix,this.sMatrix,this.tr,1,!1),this.matrix.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]),this.matrix.transform(f[0],f[1],f[2],f[3],f[4],f[5],f[6],f[7],f[8],f[9],f[10],f[11],f[12],f[13],f[14],f[15]),this.matrix.transform(p[0],p[1],p[2],p[3],p[4],p[5],p[6],p[7],p[8],p[9],p[10],p[11],p[12],p[13],p[14],p[15]);var c,u=this.elemsData[i].it,g=u[u.length-1].transform.mProps.v.props,y=g.length;for(c=0;c<y;c+=1)g[c]=this.matrix.props[c];this.matrix.reset()}else{this.matrix.reset();var c,u=this.elemsData[i].it,g=u[u.length-1].transform.mProps.v.props,y=g.length;for(c=0;c<y;c+=1)g[c]=this.matrix.props[c]}m+=1,r-=1,i+=d}}},w.prototype.addShape=function(){},he.registerModifier("rp",w),F.prototype.addShape=function(t){this._length===this._maxLength&&(this.shapes=this.shapes.concat(g(this._maxLength)),this._maxLength*=2),this.shapes[this._length]=t,this._length+=1},F.prototype.releaseShapes=function(){var t;for(t=0;t<this._length;t+=1)ue.release(this.shapes[t]);this._length=0},C.prototype.getValue=function(t){if(this.elem._x.frameId!==this.frameId||t){var e=0,s=this.dataProps.length;for(this.mdf=!1,this.frameId=this.elem._x.frameId;e<s;){if(this.dataProps[e].p.mdf){this.mdf=!t;break}e+=1}if(this.mdf||t)for("svg"===this.renderer&&(this.dashStr=""),e=0;e<s;e+=1)"o"!=this.dataProps[e].n?"svg"===this.renderer?this.dashStr+=" "+this.dataProps[e].p.v:this.dashArray[e]=this.dataProps[e].p.v:this.dashoffset[0]=this.dataProps[e].p.v}},x.prototype.comparePoints=function(t,e){for(var s,i=0,a=this.o.length/2;i<a;){if(s=Math.abs(t[4*i]-t[4*e+2*i]),s>.01)return!1;i+=1}return!0},x.prototype.checkCollapsable=function(){if(this.o.length/2!==this.c.length/4)return!1;if(this.data.k.k[0].s)for(var t=0,e=this.data.k.k.length;t<e;){if(!this.comparePoints(this.data.k.k[t].s,this.data.p))return!1;t+=1}else if(!this.comparePoints(this.data.k.k,this.data.p))return!1;return!0},x.prototype.getValue=function(t){if(this.prop.getValue(),this.cmdf=!1,this.omdf=!1,this.prop.mdf||t){var e,s,i,a=4*this.data.p;for(e=0;e<a;e+=1)s=e%4===0?100:255,i=Math.round(this.prop.v[e]*s),this.c[e]!==i&&(this.c[e]=i,this.cmdf=!t);if(this.o.length)for(a=this.prop.v.length,e=4*this.data.p;e<a;e+=1)s=e%2===0?100:1,i=e%2===0?Math.round(100*this.prop.v[e]):this.prop.v[e],this.o[e-4*this.data.p]!==i&&(this.o[e-4*this.data.p]=i,this.omdf=!t)}};var oe=function(){function t(){this.loadedAssets+=1,this.loadedAssets===this.totalImages&&this.imagesLoadedCb&&this.imagesLoadedCb(null)}function e(t){var e="";if(this.assetsPath){var s=t.p;s.indexOf("images/")!==-1&&(s=s.split("/")[1]),e=this.assetsPath+s}else e=this.path,e+=t.u?t.u:"",e+=t.p;return e}function s(e){var s=v("img");s.addEventListener("load",t.bind(this),!1),s.addEventListener("error",t.bind(this),!1),s.src=e}function i(t,i){this.imagesLoadedCb=i,this.totalAssets=t.length;var a;for(a=0;a<this.totalAssets;a+=1)t[a].layers||(s.bind(this)(e.bind(this)(t[a])),this.totalImages+=1)}function a(t){this.path=t||""}function r(t){this.assetsPath=t||""}function n(){this.imagesLoadedCb=null}return function(){this.loadAssets=i,this.setAssetsPath=r,this.setPath=a,this.destroy=n,this.assetsPath="",this.path="",this.totalAssets=0,this.totalImages=0,this.loadedAssets=0,this.imagesLoadedCb=null}}(),pe=function(){var t={maskType:!0};return(/MSIE 10/i.test(navigator.userAgent)||/MSIE 9/i.test(navigator.userAgent)||/rv:11.0/i.test(navigator.userAgent)||/Edge\/\d./i.test(navigator.userAgent))&&(t.maskType=!1),t}(),le=function(){function t(t){var e=y("filter");return e.setAttribute("id",t),e.setAttribute("filterUnits","objectBoundingBox"),e.setAttribute("x","0%"),e.setAttribute("y","0%"),e.setAttribute("width","100%"),e.setAttribute("height","100%"),e}function e(){var t=y("feColorMatrix");return t.setAttribute("type","matrix"),t.setAttribute("color-interpolation-filters","sRGB"),t.setAttribute("values","0 0 0 1 0  0 0 0 1 0  0 0 0 1 0  0 0 0 1 1"),t}var s={};return s.createFilter=t,s.createAlphaToLuminanceFilter=e,s}();D.prototype.searchProperties=function(t){var e,s,i=this._textData.a.length,a=ae._bo;for(e=0;e<i;e+=1)s=this._textData.a[e],this._animatorsData[e]=new S(this._elem,s,this.__co);this._textData.p&&"m"in this._textData.p?(this._pathData={f:a(this._elem,this._textData.p.f,0,0,this.__co),l:a(this._elem,this._textData.p.l,0,0,this.__co),r:this._textData.p.r,m:this._elem.maskManager.getMaskProperty(this._textData.p.m)},this._hasMaskedPath=!0):this._hasMaskedPath=!1,this._moreOptions.alignment=a(this._elem,this._textData.m.a,1,0,this.__co),this.__co.length&&t.push(this)},D.prototype.getMeasures=function(t,e){if(this.lettersChangedFlag=e,this.mdf||this._ch||e||this._hasMaskedPath&&this._pathData.m.mdf){this._ch=!1;var s,i,a,r,n=this._moreOptions.alignment.v,h=this._animatorsData,o=this._textData,p=this.mHelper,l=this._renderType,f=this._bt.length,u=(this.data,t.l);if(this._hasMaskedPath){var g=this._pathData.m;if(!this._pathData.n||this._pathData.mdf){var y=g.v;this._pathData.r&&(y=y.reverse());var v={tLength:0,segments:[]};r=y._length-1;var b,k=0;for(a=0;a<r;a+=1)b={s:y.v[a],e:y.v[a+1],to:[y.o[a][0]-y.v[a][0],y.o[a][1]-y.v[a][1]],ti:[y.i[a+1][0]-y.v[a+1][0],y.i[a+1][1]-y.v[a+1][1]]},ee.buildBezierData(b),v.tLength+=b.bezierData.segmentLength,v.segments.push(b),k+=b.bezierData.segmentLength;a=r,g.v.c&&(b={s:y.v[a],e:y.v[0],to:[y.o[a][0]-y.v[a][0],y.o[a][1]-y.v[a][1]],ti:[y.i[0][0]-y.v[0][0],y.i[0][1]-y.v[0][1]]},ee.buildBezierData(b),v.tLength+=b.bezierData.segmentLength,v.segments.push(b),k+=b.bezierData.segmentLength),this._pathData.pi=v}var A,P,M,v=this._pathData.pi,_=this._pathData.f.v,E=0,w=1,F=0,C=!0,x=v.segments;if(_<0&&g.v.c)for(v.tLength<Math.abs(_)&&(_=-Math.abs(_)%v.tLength),E=x.length-1,M=x[E].bezierData.points,w=M.length-1;_<0;)_+=M[w].partialLength,w-=1,w<0&&(E-=1,M=x[E].bezierData.points,w=M.length-1);M=x[E].bezierData.points,P=M[w-1],A=M[w];var D,S,I=A.partialLength}r=u.length,s=0,i=0;var L,R,V,N,z,B=1.2*t.s*.714,O=!0;N=h.length;var j,G,W,X,q,Y,H,J,U,Z,K,Q,$,tt=-1,et=_,st=E,it=w,at=-1,rt=0,nt="",ht=this.defaultPropsArray;for(a=0;a<r;a+=1){if(p.reset(),q=1,u[a].n)s=0,i+=t.yOffset,i+=O?1:0,_=et,O=!1,rt=0,this._hasMaskedPath&&(E=st,w=it,M=x[E].bezierData.points,P=M[w-1],A=M[w],I=A.partialLength,F=0),$=Z=Q=nt="",ht=this.defaultPropsArray;else{if(this._hasMaskedPath){if(at!==u[a].line){switch(t.j){case 1:_+=k-t.lineWidths[u[a].line];break;case 2:_+=(k-t.lineWidths[u[a].line])/2}at=u[a].line}tt!==u[a].ind&&(u[tt]&&(_+=u[tt].extra),_+=u[a].an/2,tt=u[a].ind),_+=n[0]*u[a].an/200;var ot=0;for(V=0;V<N;V+=1)L=h[V].a,L.p.propType&&(R=h[V].s,j=R.getMult(u[a].anIndexes[V],o.a[V].s.totalChars),ot+=j.length?L.p.v[0]*j[0]:L.p.v[0]*j),L.a.propType&&(R=h[V].s,j=R.getMult(u[a].anIndexes[V],o.a[V].s.totalChars),ot+=j.length?L.a.v[0]*j[0]:L.a.v[0]*j);for(C=!0;C;)F+I>=_+ot||!M?(D=(_+ot-F)/A.partialLength,W=P.point[0]+(A.point[0]-P.point[0])*D,X=P.point[1]+(A.point[1]-P.point[1])*D,p.translate(-n[0]*u[a].an/200,-(n[1]*B/100)),C=!1):M&&(F+=A.partialLength,w+=1,w>=M.length&&(w=0,E+=1,x[E]?M=x[E].bezierData.points:g.v.c?(w=0,E=0,M=x[E].bezierData.points):(F-=A.partialLength,M=null)),M&&(P=A,A=M[w],I=A.partialLength));G=u[a].an/2-u[a].add,p.translate(-G,0,0)}else G=u[a].an/2-u[a].add,p.translate(-G,0,0),p.translate(-n[0]*u[a].an/200,-n[1]*B/100,0);for(rt+=u[a].l/2,V=0;V<N;V+=1)L=h[V].a,L.t.propType&&(R=h[V].s,j=R.getMult(u[a].anIndexes[V],o.a[V].s.totalChars),this._hasMaskedPath?_+=j.length?L.t*j[0]:L.t*j:s+=j.length?L.t.v*j[0]:L.t.v*j);for(rt+=u[a].l/2,t.strokeWidthAnim&&(H=t.sw||0),t.strokeColorAnim&&(Y=t.sc?[t.sc[0],t.sc[1],t.sc[2]]:[0,0,0]),t.fillColorAnim&&t.fc&&(J=[t.fc[0],t.fc[1],t.fc[2]]),V=0;V<N;V+=1)L=h[V].a,L.a.propType&&(R=h[V].s,j=R.getMult(u[a].anIndexes[V],o.a[V].s.totalChars),j.length?p.translate(-L.a.v[0]*j[0],-L.a.v[1]*j[1],L.a.v[2]*j[2]):p.translate(-L.a.v[0]*j,-L.a.v[1]*j,L.a.v[2]*j));for(V=0;V<N;V+=1)L=h[V].a,L.s.propType&&(R=h[V].s,j=R.getMult(u[a].anIndexes[V],o.a[V].s.totalChars),j.length?p.scale(1+(L.s.v[0]-1)*j[0],1+(L.s.v[1]-1)*j[1],1):p.scale(1+(L.s.v[0]-1)*j,1+(L.s.v[1]-1)*j,1));for(V=0;V<N;V+=1){if(L=h[V].a,R=h[V].s,j=R.getMult(u[a].anIndexes[V],o.a[V].s.totalChars),L.sk.propType&&(j.length?p.skewFromAxis(-L.sk.v*j[0],L.sa.v*j[1]):p.skewFromAxis(-L.sk.v*j,L.sa.v*j)),L.r.propType&&(j.length?p.rotateZ(-L.r.v*j[2]):p.rotateZ(-L.r.v*j)),L.ry.propType&&(j.length?p.rotateY(L.ry.v*j[1]):p.rotateY(L.ry.v*j)),L.rx.propType&&(j.length?p.rotateX(L.rx.v*j[0]):p.rotateX(L.rx.v*j)),L.o.propType&&(q+=j.length?(L.o.v*j[0]-q)*j[0]:(L.o.v*j-q)*j),t.strokeWidthAnim&&L.sw.propType&&(H+=j.length?L.sw.v*j[0]:L.sw.v*j),t.strokeColorAnim&&L.sc.propType)for(U=0;U<3;U+=1)j.length?Y[U]=Y[U]+(L.sc.v[U]-Y[U])*j[0]:Y[U]=Y[U]+(L.sc.v[U]-Y[U])*j;if(t.fillColorAnim&&t.fc){if(L.fc.propType)for(U=0;U<3;U+=1)j.length?J[U]=J[U]+(L.fc.v[U]-J[U])*j[0]:J[U]=J[U]+(L.fc.v[U]-J[U])*j;L.fh.propType&&(J=j.length?c(J,L.fh.v*j[0]):c(J,L.fh.v*j)),L.fs.propType&&(J=j.length?m(J,L.fs.v*j[0]):m(J,L.fs.v*j)),L.fb.propType&&(J=j.length?d(J,L.fb.v*j[0]):d(J,L.fb.v*j))}}for(V=0;V<N;V+=1)L=h[V].a,L.p.propType&&(R=h[V].s,j=R.getMult(u[a].anIndexes[V],o.a[V].s.totalChars),this._hasMaskedPath?j.length?p.translate(0,L.p.v[1]*j[0],-L.p.v[2]*j[1]):p.translate(0,L.p.v[1]*j,-L.p.v[2]*j):j.length?p.translate(L.p.v[0]*j[0],L.p.v[1]*j[1],-L.p.v[2]*j[2]):p.translate(L.p.v[0]*j,L.p.v[1]*j,-L.p.v[2]*j));if(t.strokeWidthAnim&&(Z=H<0?0:H),t.strokeColorAnim&&(K="rgb("+Math.round(255*Y[0])+","+Math.round(255*Y[1])+","+Math.round(255*Y[2])+")"),t.fillColorAnim&&t.fc&&(Q="rgb("+Math.round(255*J[0])+","+Math.round(255*J[1])+","+Math.round(255*J[2])+")"),this._hasMaskedPath){if(p.translate(0,-t.ls),p.translate(0,n[1]*B/100+i,0),o.p.p){S=(A.point[1]-P.point[1])/(A.point[0]-P.point[0]);var pt=180*Math.atan(S)/Math.PI;A.point[0]<P.point[0]&&(pt+=180),p.rotate(-pt*Math.PI/180)}p.translate(W,X,0),_-=n[0]*u[a].an/200,u[a+1]&&tt!==u[a+1].ind&&(_+=u[a].an/2,_+=t.tr/1e3*t.s)}else{switch(p.translate(s,i,0),t.ps&&p.translate(t.ps[0],t.ps[1]+t.ascent,0),t.j){case 1:p.translate(t.justifyOffset+(t.boxWidth-t.lineWidths[u[a].line]),0,0);break;case 2:p.translate(t.justifyOffset+(t.boxWidth-t.lineWidths[u[a].line])/2,0,0)}p.translate(0,-t.ls),p.translate(G,0,0),p.translate(n[0]*u[a].an/200,n[1]*B/100,0),s+=u[a].l+t.tr/1e3*t.s}"html"===l?nt=p.toCSS():"svg"===l?nt=p.to2dCSS():ht=[p.props[0],p.props[1],p.props[2],p.props[3],p.props[4],p.props[5],p.props[6],p.props[7],p.props[8],p.props[9],p.props[10],p.props[11],p.props[12],p.props[13],p.props[14],p.props[15]],$=q}f<=a?(z=new T($,Z,K,Q,nt,ht),this._bt.push(z),f+=1,this.lettersChangedFlag=!0):(z=this._bt[a],this.lettersChangedFlag=z.update($,Z,K,Q,nt,ht)||this.lettersChangedFlag)}}},D.prototype.getValue=function(){if(this._elem._x.frameId!==this._frameId){this._frameId=this._elem._x.frameId;var t,e=this.__co.length;for(this.mdf=!1,t=0;t<e;t+=1)this.__co[t].getValue(),this.mdf=this.__co[t].mdf||this.mdf}},D.prototype.mHelper=new $t,D.prototype.defaultPropsArray=[],T.prototype.update=function(t,e,s,i,a,r){this.mdf.o=!1,this.mdf.sw=!1,this.mdf.sc=!1,this.mdf.fc=!1,this.mdf.m=!1,this.mdf.p=!1;var n=!1;return this.o!==t&&(this.o=t,this.mdf.o=!0,n=!0),this.sw!==e&&(this.sw=e,this.mdf.sw=!0,n=!0),this.sc!==s&&(this.sc=s,this.mdf.sc=!0,n=!0),this.fc!==i&&(this.fc=i,this.mdf.fc=!0,n=!0),this.m!==a&&(this.m=a,this.mdf.m=!0,n=!0),!r.length||this.p[0]===r[0]&&this.p[1]===r[1]&&this.p[4]===r[4]&&this.p[5]===r[5]&&this.p[12]===r[12]&&this.p[13]===r[13]||(this.p=r,this.mdf.p=!0,n=!0),n},I.prototype.setCurrentData=function(t){var e=this.currentData;e.ascent=t.ascent,e.boxWidth=t.boxWidth?t.boxWidth:e.boxWidth,e.f=t.f,e.fStyle=t.fStyle,e.fWeight=t.fWeight,e.fc=t.fc,e.j=t.j,e.justifyOffset=t.justifyOffset,e.l=t.l,e.lh=t.lh,e.lineWidths=t.lineWidths,e.ls=t.ls,e.of=t.of,e.s=t.s,e.sc=t.sc,e.sw=t.sw,e.sz=t.sz,e.ps=t.ps,e.t=t.t,e.tr=t.tr,e.fillColorAnim=t.fillColorAnim||e.fillColorAnim,e.strokeColorAnim=t.strokeColorAnim||e.strokeColorAnim,e.strokeWidthAnim=t.strokeWidthAnim||e.strokeWidthAnim,e.yOffset=t.yOffset,e.__complete=!1},I.prototype.searchProperty=function(){return this.kf=this.data.d.k.length>1,this.kf},I.prototype.getValue=function(){this.mdf=!1;var t=this.elem._x.frameId;if(t!==this._frameId&&this.kf||this._ch){for(var e,s=this.data.d.k,i=0,a=s.length;i<=a-1&&(e=s[i].s,!(i===a-1||s[i+1].t>t));)i+=1;this.keysIndex!==i&&(e.__complete||this.completeTextData(e),this.setCurrentData(e),this.mdf=!this._ch,this.pv=this.v=this.currentData.t,this.keysIndex=i),this._frameId=t}},I.prototype.completeTextData=function(t){t.__complete=!0;var e,s,i,a,r,n,h,o=this.elem._x._cr,p=this.data,l=[],f=0,m=p.m.g,d=0,c=0,u=0,g=[],y=0,v=0,b=o.getFontByName(t.f),k=0,A=b.fStyle.split(" "),P="normal",M="normal";s=A.length;var _;for(e=0;e<s;e+=1)switch(_=A[e].toLowerCase()){case"italic":M="italic";break;case"bold":P="700";break;case"black":P="900";break;case"medium":P="500";break;case"regular":case"normal":P="400";case"light":case"thin":P="200"}t.fWeight=P,t.fStyle=M,s=t.t.length;var E=t.tr/1e3*t.s;if(t.sz){var w=t.sz[0],F=-1;for(e=0;e<s;e+=1)i=!1," "===t.t.charAt(e)?F=e:13===t.t.charCodeAt(e)&&(y=0,i=!0),o.chars?(h=o.getCharData(t.t.charAt(e),b.fStyle,b.fFamily),k=i?0:h.w*t.s/100):k=o.measureText(t.t.charAt(e),t.f,t.s),y+k>w&&" "!==t.t.charAt(e)?(F===-1?s+=1:e=F,t.t=t.t.substr(0,e)+"\r"+t.t.substr(e===F?e+1:e),F=-1,y=0):(y+=k,y+=E);s=t.t.length}y=-E,k=0;var C,x=0;for(e=0;e<s;e+=1)if(i=!1,C=t.t.charAt(e)," "===C?a="\xa0":13===C.charCodeAt(0)?(x=0,g.push(y),v=y>v?y:v,y=-2*E,a="",i=!0,u+=1):a=t.t.charAt(e),o.chars?(h=o.getCharData(C,b.fStyle,o.getFontByName(t.f).fFamily),k=i?0:h.w*t.s/100):k=o.measureText(a,t.f,t.s)," "===C?x+=k+E:(y+=k+E+x,x=0),l.push({l:k,an:k,add:d,n:i,anIndexes:[],val:a,line:u}),2==m){if(d+=k,""==a||"\xa0"==a||e==s-1){for(""!=a&&"\xa0"!=a||(d-=k);c<=e;)l[c].an=d,l[c].ind=f,l[c].extra=k,c+=1;f+=1,d=0}}else if(3==m){if(d+=k,""==a||e==s-1){for(""==a&&(d-=k);c<=e;)l[c].an=d,l[c].ind=f,l[c].extra=k,c+=1;d=0,f+=1}}else l[f].ind=f,l[f].extra=0,f+=1;if(t.l=l,v=y>v?y:v,g.push(y),t.sz)t.boxWidth=t.sz[0],t.justifyOffset=0;else switch(t.boxWidth=v,t.j){case 1:t.justifyOffset=-t.boxWidth;break;case 2:t.justifyOffset=-t.boxWidth/2;break;default:t.justifyOffset=0}t.lineWidths=g;var D,S,T=p.a;n=T.length;var I,L,R=[];for(r=0;r<n;r+=1){for(D=T[r],D.a.sc&&(t.strokeColorAnim=!0),D.a.sw&&(t.strokeWidthAnim=!0),(D.a.fc||D.a.fh||D.a.fs||D.a.fb)&&(t.fillColorAnim=!0),L=0,I=D.s.b,e=0;e<s;e+=1)S=l[e],S.anIndexes[r]=L,(1==I&&""!=S.val||2==I&&""!=S.val&&"\xa0"!=S.val||3==I&&(S.n||"\xa0"==S.val||e==s-1)||4==I&&(S.n||e==s-1))&&(1===D.s.rn&&R.push(L),L+=1);p.a[r].s.totalChars=L;var V,N=-1;if(1===D.s.rn)for(e=0;e<s;e+=1)S=l[e],N!=S.anIndexes[r]&&(N=S.anIndexes[r],V=R.splice(Math.floor(Math.random()*R.length),1)[0]),S.anIndexes[r]=V}t.yOffset=t.lh||1.2*t.s,t.ls=t.ls||0,t.ascent=b.ascent*t.s/100},I.prototype.updateDocumentData=function(t,e){e=void 0===e?this.keysIndex:e;var s=this.data.d.k[e].s;s.__complete=!1,s.t=t.t,this.keysIndex=-1,this._ch=!0,this.getValue()};var fe=function(){function t(t){if(this.mdf=t||!1,this._co.length){var e,s=this._co.length;for(e=0;e<s;e+=1)this._co[e].getValue(),this._co[e].mdf&&(this.mdf=!0)}var i=this.elem.textProperty.currentData?this.elem.textProperty.currentData.l.length:0;t&&2===this.data.r&&(this.e.v=i);var a=2===this.data.r?1:100/i,r=this.o.v/a,n=this.s.v/a+r,h=this.e.v/a+r;if(n>h){var o=n;n=h,h=o}this.finalS=n,this.finalE=h}function e(t){var e=te.getBezierEasing(this.ne.v/100,0,1-this.xe.v/100,1).get,s=0,i=this.finalS,h=this.finalE,o=this.data.sh;if(2==o)s=h===i?t>=h?1:0:a(0,r(.5/(h-i)+(t-i)/(h-i),1)),s=e(s);else if(3==o)s=h===i?t>=h?0:1:1-a(0,r(.5/(h-i)+(t-i)/(h-i),1)),s=e(s);else if(4==o)h===i?s=0:(s=a(0,r(.5/(h-i)+(t-i)/(h-i),1)),s<.5?s*=2:s=1-2*(s-.5)),s=e(s);else if(5==o){if(h===i)s=0;else{var p=h-i;t=r(a(0,t+.5-i),h-i);var l=-p/2+t,f=p/2;s=Math.sqrt(1-l*l/(f*f))}s=e(s)}else 6==o?(h===i?s=0:(t=r(a(0,t+.5-i),h-i),s=(1+Math.cos(Math.PI+2*Math.PI*t/(h-i)))/2),s=e(s)):(t>=n(i)&&(s=t-i<0?1-(i-t):a(0,r(h-t,1))),s=e(s));return s*this.a.v}function s(s,i,a){this.mdf=!1,this.k=!1,this.data=i,this._co=[],this.getValue=t,this.getMult=e,this.elem=s,this.comp=s.comp,this.finalS=0,this.finalE=0,this.s=ae._bo(s,i.s||{k:0},0,0,this._co),"e"in i?this.e=ae._bo(s,i.e,0,0,this._co):this.e={v:100},this.o=ae._bo(s,i.o||{k:0},0,0,this._co),this.xe=ae._bo(s,i.xe||{k:0},0,0,this._co),this.ne=ae._bo(s,i.ne||{k:0},0,0,this._co),this.a=ae._bo(s,i.a,0,.01,this._co),this._co.length?a.push(this):this.getValue()}function i(t,e,i){return new s(t,e,i)}var a=Math.max,r=Math.min,n=Math.floor;return{getTextSelectorProp:i}}(),me=function(){return function(t,e,s,i){function a(){var t;return n?(n-=1,t=o[n]):t=e(),t}function r(t){n===h&&(o=de["double"](o),h=2*h),s&&s(t),o[n]=t,n+=1}var n=0,h=t,o=g(h),p={newElement:a,release:r};return p}}(),de=function(){function t(t){return t.concat(g(t.length))}return{"double":t}}(),ce=function(){function t(){return Qt("float32",2)}return me(8,t)}(),ue=function(){function t(){return new P}function e(t){var e,s=t._length;for(e=0;e<s;e+=1)ce.release(t.v[e]),ce.release(t.i[e]),ce.release(t.o[e]),t.v[e]=null,t.i[e]=null,t.o[e]=null;t._length=0,t.c=!1}function s(t){var e,s=i.newElement(),a=void 0===t._length?t.v.length:t._length;s.setLength(a),s.c=t.c;for(e=0;e<a;e+=1)s._aw(t.v[e][0],t.v[e][1],t.o[e][0],t.o[e][1],t.i[e][0],t.i[e][1],e);return s}var i=me(4,t,e);return i.clone=s,i}(),ge=function(){function t(){var t;return i?(i-=1,t=r[i]):t=new F,t}function e(t){var e,s=t._length;for(e=0;e<s;e+=1)ue.release(t.shapes[e]);t._length=0,i===a&&(r=de["double"](r),a=2*a),r[i]=t,i+=1}var s={_al:t,release:e},i=0,a=4,r=g(a);return s}(),ye=function(){function t(){return{lengths:[],totalLength:0}}function e(t){var e,s=t.lengths.length;for(e=0;e<s;e+=1)ve.release(t.lengths[e]);t.lengths.length=0}return me(8,t,e)}(),ve=function(){function t(){return{addedLength:0,percents:Qt("float32",Jt),lengths:Qt("float32",Jt)}}return me(8,t)}();L.prototype.checkLayers=function(t){var e,s,i=this.layers.length;for(this._db=!0,e=i-1;e>=0;e--)this._br[e]||(s=this.layers[e],s.ip-s.st<=t-this.layers[e].st&&s.op-s.st>t-this.layers[e].st&&this.buildItem(e)),this._db=!!this._br[e]&&this._db;this.checkPendingElements()},L.prototype.createItem=function(t){switch(t.ty){case 2:return this.createImage(t);case 0:return this.createComp(t);case 1:return this.createSolid(t);case 3:return this.createNull(t);case 4:return this.createShape(t);case 5:return this.createText(t);case 13:return this.createCamera(t);case 99:return null}return this.createBase(t)},L.prototype.createCamera=function(){throw new Error("You're using a 3d camera. Try the html renderer.")},L.prototype.buildAllItems=function(){var t,e=this.layers.length;for(t=0;t<e;t+=1)this.buildItem(t);this.checkPendingElements()},L.prototype.includeLayers=function(t){this._db=!1;var e,s,i=t.length,a=this.layers.length;for(e=0;e<i;e+=1)for(s=0;s<a;){if(this.layers[s].id==t[e].id){this.layers[s]=t[e];break}s+=1}},L.prototype.setProjectInterface=function(t){this._x.projectInterface=t},L.prototype.initItems=function(){this._x.progressiveLoad||this.buildAllItems()},L.prototype.buildElementParenting=function(t,e,s){for(var i=this._br,a=this.layers,r=0,n=a.length;r<n;)a[r].ind==e&&(i[r]&&i[r]!==!0?void 0!==a[r].parent?(s.push(i[r]),i[r]._isParent=!0,this.buildElementParenting(t,a[r].parent,s)):(s.push(i[r]),i[r]._isParent=!0,t.setHierarchy(s)):(this.buildItem(r),this.addPendingElement(t))),r+=1},L.prototype.addPendingElement=function(t){this._dc.push(t)},b([L],R),R.prototype.createBase=function(t){return new $(t,this._x,this)},R.prototype.createNull=function(t){return new Q(t,this._x,this)},R.prototype.createShape=function(t){return new ht(t,this._x,this)},R.prototype.createText=function(t){return new nt(t,this._x,this)},R.prototype.createImage=function(t){return new it(t,this._x,this)},R.prototype.createComp=function(t){return new rt(t,this._x,this)},R.prototype.createSolid=function(t){return new at(t,this._x,this)},R.prototype.configAnimation=function(t){this._cf.setAttribute("xmlns","http://www.w3.org/2000/svg"),this.renderConfig.viewBoxSize?this._cf.setAttribute("viewBox",this.renderConfig.viewBoxSize):this._cf.setAttribute("viewBox","0 0 "+t.w+" "+t.h),this.renderConfig.viewBoxOnly||(this._cf.setAttribute("width",t.w),this._cf.setAttribute("height",t.h),this._cf.style.width="100%",this._cf.style.height="100%"),this.renderConfig.className&&this._cf.setAttribute("class",this.renderConfig.className),this._cf.setAttribute("preserveAspectRatio",this.renderConfig.preserveAspectRatio),this._cq.wrapper.appendChild(this._cf);var e=this._x.defs;this._x.getAssetData=this._cq.getAssetData.bind(this._cq),this._x.getAssetsPath=this._cq.getAssetsPath.bind(this._cq),this._x.progressiveLoad=this.renderConfig.progressiveLoad,this._x.nm=t.nm,this._x._de.w=t.w,this._x._de.h=t.h,this._x.frameRate=t.fr,this.data=t;var s=y("clipPath"),i=y("rect");i.setAttribute("width",t.w),i.setAttribute("height",t.h),i.setAttribute("x",0),i.setAttribute("y",0);var a="animationMask_"+p(10);s.setAttribute("id",a),s.appendChild(i),this._bx.setAttribute("clip-path","url("+Ot+"#"+a+")"),e.appendChild(s),this.layers=t.layers,this._x._cr.addChars(t.chars),this._x._cr.addFonts(t.fonts,e),this._br=g(t.layers.length)},R.prototype.destroy=function(){this._cq.wrapper.innerHTML="",this._bx=null,this._x.defs=null;var t,e=this.layers?this.layers.length:0;for(t=0;t<e;t++)this._br[t]&&this._br[t].destroy();this._br.length=0,this.destroyed=!0,this._cq=null},R.prototype.updateContainerSize=function(){},R.prototype.buildItem=function(t){var e=this._br;if(!e[t]&&99!=this.layers[t].ty){e[t]=!0;var s=this.createItem(this.layers[t]);e[t]=s,Nt&&(0===this.layers[t].ty&&this._x.projectInterface.registerComposition(s),s.initExpressions()),this.appendElementInPos(s,t),this.layers[t].tt&&(this._br[t-1]&&this._br[t-1]!==!0?s.setMatte(e[t-1].layerId):(this.buildItem(t-1),this.addPendingElement(s)))}},R.prototype.checkPendingElements=function(){for(;this._dc.length;){var t=this._dc.pop();if(t.checkParenting(),t.data.tt)for(var e=0,s=this._br.length;e<s;){if(this._br[e]===t){t.setMatte(this._br[e-1].layerId);break}e+=1}}},R.prototype._ba=function(t){if(this.renderedFrame!==t&&!this.destroyed){null===t?t=this.renderedFrame:this.renderedFrame=t,this._x.frameNum=t,this._x.frameId+=1,this._x.projectInterface.currentFrame=t;var e,s=this.layers.length;for(this._db||this.checkLayers(t),e=s-1;e>=0;e--)(this._db||this._br[e])&&this._br[e]._az(t-this.layers[e].st);for(e=0;e<s;e+=1)(this._db||this._br[e])&&this._br[e]._ba()}},R.prototype.appendElementInPos=function(t,e){var s=t.get_e();if(s){for(var i,a=0;a<e;)this._br[a]&&this._br[a]!==!0&&this._br[a].get_e()&&(i=this._br[a].get_e()),a+=1;i?this._bx.insertBefore(s,i):this._bx.appendChild(s)}},R.prototype.hide=function(){this._bx.style.display="none"},R.prototype.show=function(){this._bx.style.display="block"},R.prototype.searchExtraCompositions=function(t){var e,s=t.length,i=y("g");for(e=0;e<s;e+=1)if(t[e].xt){var a=this.createComp(t[e],i,this._x.comp,null);a.initExpressions(),this._x.projectInterface.registerComposition(a)}},V.prototype.getMaskProperty=function(t){return this.viewData[t].prop},V.prototype._az=function(){var t,e=this._co.length;for(t=0;t<e;t+=1)this._co[t].getValue()},V.prototype._ba=function(t){var e,s=this.masksProperties.length;for(e=0;e<s;e++)if((this.viewData[e].prop.mdf||this._ch)&&this.drawPath(this.masksProperties[e],this.viewData[e].prop.v,this.viewData[e]),(this.viewData[e].op.mdf||this._ch)&&this.viewData[e].elem.setAttribute("fill-opacity",this.viewData[e].op.v),"n"!==this.masksProperties[e].mode&&(this.viewData[e].invRect&&(this.element.finalTransform.mProp.mdf||this._ch)&&(this.viewData[e].invRect.setAttribute("x",-t.props[12]),this.viewData[e].invRect.setAttribute("y",-t.props[13])),this.storedData[e].x&&(this.storedData[e].x.mdf||this._ch))){var i=this.storedData[e].expan;this.storedData[e].x.v<0?("erode"!==this.storedData[e].lastOperator&&(this.storedData[e].lastOperator="erode",this.storedData[e].elem.setAttribute("filter","url("+Ot+"#"+this.storedData[e].filterId+")")),i.setAttribute("radius",-this.storedData[e].x.v)):("dilate"!==this.storedData[e].lastOperator&&(this.storedData[e].lastOperator="dilate",this.storedData[e].elem.setAttribute("filter",null)),this.storedData[e].elem.setAttribute("stroke-width",2*this.storedData[e].x.v))}this._ch=!1},V.prototype.getMaskelement=function(){return this.maskElement},V.prototype.createLayerSolidPath=function(){var t="M0,0 ";return t+=" h"+this._x._de.w,t+=" v"+this._x._de.h,t+=" h-"+this._x._de.w,t+=" v-"+this._x._de.h+" "},V.prototype.drawPath=function(t,e,s){var i,a,r=" M"+e.v[0][0]+","+e.v[0][1];for(a=e._length,i=1;i<a;i+=1)r+=" C"+e.o[i-1][0]+","+e.o[i-1][1]+" "+e.i[i][0]+","+e.i[i][1]+" "+e.v[i][0]+","+e.v[i][1];if(e.c&&a>1&&(r+=" C"+e.o[i-1][0]+","+e.o[i-1][1]+" "+e.i[0][0]+","+e.i[0][1]+" "+e.v[0][0]+","+e.v[0][1]),s.lastPath!==r){var n="";s.elem&&(e.c&&(n=t.inv?this.solidPath+r:r),s.elem.setAttribute("d",n)),s.lastPath=r}},V.prototype.destroy=function(){this.element=null,this._x=null,this.maskElement=null,this.data=null,this.masksProperties=null},N.prototype.initHierarchy=function(){this._dd=[],this._isParent=!1,this.checkParenting()},N.prototype.resetHierarchy=function(){this._dd.length=0},N.prototype.getHierarchy=function(){return this._dd},N.prototype.setHierarchy=function(t){this._dd=t},N.prototype.checkParenting=function(){void 0!==this.data.parent&&this.comp.buildElementParenting(this,this.data.parent,[])},N.prototype.prepareHierarchy=function(){},z.prototype.initFrame=function(){this._ch=!1,this._co=[]},z.prototype.prepareProperties=function(t,e){var s,i=this._co.length;for(s=0;s<i;s+=1)(e||this._isParent&&"transform"===this._co[s].propType)&&(this._co[s].getValue(this._ch),this._co[s].mdf&&(this._x.mdf=!0))},B.prototype.initTransform=function(){this.finalTransform={mProp:this.data.ks?re._bj(this,this.data.ks,this._co):{o:0},matMdf:!1,opMdf:!1,mat:new $t},this.data.ao&&(this.finalTransform.mProp.autoOriented=!0),11!==this.data.ty},B.prototype.renderTransform=function(){if(this.finalTransform.opMdf=this.finalTransform.mProp.o.mdf||this._ch,this.finalTransform.matMdf=this.finalTransform.mProp.mdf||this._ch,this._dd){var t,e=this.finalTransform.mat,s=0,i=this._dd.length;if(!this.finalTransform.matMdf)for(;s<i;){if(this._dd[s].finalTransform.mProp.mdf){this.finalTransform.matMdf=!0;break}s+=1}if(this.finalTransform.matMdf)for(t=this.finalTransform.mProp.v.props,e.cloneFromProps(t),s=0;s<i;s+=1)t=this._dd[s].finalTransform.mProp.v.props,e.transform(t[0],t[1],t[2],t[3],t[4],t[5],t[6],t[7],t[8],t[9],t[10],t[11],t[12],t[13],t[14],t[15])}},B.prototype.globalToLocal=function(t){var e=[];e.push(this.finalTransform);for(var s=!0,i=this.comp;s;)i.finalTransform?(i.data.hasMask&&e.splice(0,0,i.finalTransform),i=i.comp):s=!1;var a,r,n=e.length;for(a=0;a<n;a+=1)r=e[a].mat._cn(0,0,0),t=[t[0]-r[0],t[1]-r[1],0];return t},B.prototype.mHelper=new $t,O.prototype.initRenderable=function(){this.isInRange=!1,this.hidden=!1,this.isTransparent=!1},O.prototype.prepareRenderableFrame=function(t){this.checkLayerLimits(t),this.prepareMasks(t),this.finalTransform.mProp.o.v<=0?!this.isTransparent&&this._x.renderConfig.hideOnTransparent&&(this.isTransparent=!0,this.hide()):this.isTransparent&&(this.isTransparent=!1,this.show())},O.prototype.checkLayerLimits=function(t){this.data.ip-this.data.st<=t&&this.data.op-this.data.st>t?this.isInRange!==!0&&(this._x.mdf=!0,this.isInRange=!0,this.show()):this.isInRange!==!1&&(this._x.mdf=!0,this.isInRange=!1,this.hide())},O.prototype.prepareMasks=function(){this.isInRange&&this.maskManager._az()},O.prototype.renderRenderable=function(){this.maskManager._ba(this.finalTransform.mat),this.effectsManager._ba(this._ch)},O.prototype.sourceRectAtTime=function(){return{top:0,left:0,width:100,height:100}},O.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}},b([O],j),j.prototype._cz=function(t,e,s){this.initFrame(),this.initBaseData(t,e,s),this.initTransform(t,e,s),this.initHierarchy(),this.initRenderable(),this.initRendererElement(),this.createContainerElements(),this.addMasks(),this.createContent(),this.hide()},j.prototype.hide=function(){this.hidden||this.isInRange&&!this.isTransparent||(this._bx.style.display="none",this.hidden=!0)},j.prototype.show=function(){this.isInRange&&!this.isTransparent&&(this.data.hd||(this._bx.style.display="block"),this.hidden=!1,this._ch=!0,this.maskManager._ch=!0)},j.prototype._ba=function(){this.data.hd||this.hidden||(this.renderTransform(),this.renderRenderable(),this.renderElement(),this.renderInnerContent(),this._ch&&(this._ch=!1))},j.prototype.renderInnerContent=function(){},j.prototype.destroy=function(){this._cc=null,this.destroy_e()},j.prototype._az=function(t){this.prepareRenderableFrame(t),this.prepareProperties(t,this.isInRange)},W.prototype.reset=function(){this.d="",this.mdf=!1},J.prototype.initGradientData=function(t,e,s,i){this.o=ae._bo(t,e.o,0,.01,s),
+this.s=ae._bo(t,e.s,1,null,s),this.e=ae._bo(t,e.e,1,null,s),this.h=ae._bo(t,e.h||{k:0},0,.01,s),this.a=ae._bo(t,e.a||{k:0},0,Ut,s),this.g=new x(t,e.g,s),this.style=i,this.stops=[],this.setGradientData(i.pElem,e),this.setGradientOpacity(e,i)},J.prototype.setGradientData=function(t,e){var s="gr_"+p(10),i=y(1===e.t?"linearGradient":"radialGradient");i.setAttribute("id",s),i.setAttribute("spreadMethod","pad"),i.setAttribute("gradientUnits","userSpaceOnUse");var a,r,n,h=[];for(n=4*e.g.p,r=0;r<n;r+=4)a=y("stop"),i.appendChild(a),h.push(a);t.setAttribute("gf"===e.ty?"fill":"stroke","url(#"+s+")"),this.gf=i,this.cst=h},J.prototype.setGradientOpacity=function(t,e){if(this.g._hasOpacity&&!this.g._collapsable){var s,i,a,r=y("mask"),n=y("path");r.appendChild(n);var h="op_"+p(10),o="mk_"+p(10);r.setAttribute("id",o);var l=y(1===t.t?"linearGradient":"radialGradient");l.setAttribute("id",h),l.setAttribute("spreadMethod","pad"),l.setAttribute("gradientUnits","userSpaceOnUse"),a=t.g.k.k[0].s?t.g.k.k[0].s.length:t.g.k.k.length;var f=this.stops;for(i=4*t.g.p;i<a;i+=2)s=y("stop"),s.setAttribute("stop-color","rgb(255,255,255)"),l.appendChild(s),f.push(s);n.setAttribute("gf"===t.ty?"fill":"stroke","url(#"+h+")"),this.of=l,this.ms=r,this.ost=f,this.maskId=o,e.msElem=n}},U.prototype.initGradientData=J.prototype.initGradientData,U.prototype.setGradientData=J.prototype.setGradientData,U.prototype.setGradientOpacity=J.prototype.setGradientOpacity,K.prototype.checkMasks=function(){if(!this.data.hasMask)return!1;for(var t=0,e=this.data.masksProperties.length;t<e;){if("n"!==this.data.masksProperties[t].mode&&this.data.masksProperties[t].cl!==!1)return!0;t+=1}return!1},K.prototype.initExpressions=function(){this.layerInterface=LayerExpressionInterface(this),this.data.hasMask&&this.layerInterface.registerMaskInterface(this.maskManager);var t=EffectsExpressionInterface.createEffectsInterface(this,this.layerInterface);this.layerInterface.registerEffectsInterface(t),0===this.data.ty||this.data.xt?this.compInterface=CompExpressionInterface(this):4===this.data.ty?(this.layerInterface.shapeInterface=ShapeExpressionInterface(this.shapesData,this.itemsData,this.layerInterface),this.layerInterface.content=this.layerInterface.shapeInterface):5===this.data.ty&&(this.layerInterface.textInterface=TextExpressionInterface(this),this.layerInterface.text=this.layerInterface.textInterface)},K.prototype.blendModeEnums={1:"multiply",2:"screen",3:"overlay",4:"darken",5:"lighten",6:"color-dodge",7:"color-burn",8:"hard-light",9:"soft-light",10:"difference",11:"exclusion",12:"hue",13:"saturation",14:"color",15:"luminosity"},K.prototype.getBlendMode=function(){return this.blendModeEnums[this.data.bm]||""},K.prototype.setBlendMode=function(){var t=this.getBlendMode(),e=this._by||this._bx;e.style["mix-blend-mode"]=t},K.prototype.initBaseData=function(t,e,s){this._x=e,this.comp=s,this.data=t,this.layerId="ly_"+p(10),this.data.sr||(this.data.sr=1),this.effects=new EffectsManager(this.data,this,this._co)},K.prototype.getType=function(){return this.type},Q.prototype._az=function(t){this.prepareProperties(t,!0)},Q.prototype._ba=function(){},Q.prototype.get_e=function(){return null},Q.prototype.destroy=function(){},Q.prototype.sourceRectAtTime=function(){},Q.prototype.hide=function(){},b([K,B,N,z],Q),$.prototype.initRendererElement=function(){this._bx=y("g")},$.prototype.createContainerElements=function(){this.matteElement=y("g"),this._bz=this._bx,this._ca=this._bx,this._sizeChanged=!1;var t=null;if(this.data.td){if(3==this.data.td||1==this.data.td){var e=y("mask");if(e.setAttribute("id",this.layerId),e.setAttribute("mask-type",3==this.data.td?"luminance":"alpha"),e.appendChild(this._bx),t=e,this._x.defs.appendChild(e),!pe.maskType&&1==this.data.td){e.setAttribute("mask-type","luminance");var s=p(10),i=le.createFilter(s);this._x.defs.appendChild(i),i.appendChild(le.createAlphaToLuminanceFilter());var a=y("g");a.appendChild(this._bx),t=a,e.appendChild(a),a.setAttribute("filter","url("+Ot+"#"+s+")")}}else if(2==this.data.td){var r=y("mask");r.setAttribute("id",this.layerId),r.setAttribute("mask-type","alpha");var n=y("g");r.appendChild(n);var s=p(10),i=le.createFilter(s),h=y("feColorMatrix");h.setAttribute("type","matrix"),h.setAttribute("color-interpolation-filters","sRGB"),h.setAttribute("values","1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 -1 1"),i.appendChild(h),this._x.defs.appendChild(i);var o=y("rect");if(o.setAttribute("width",this.comp.data.w),o.setAttribute("height",this.comp.data.h),o.setAttribute("x","0"),o.setAttribute("y","0"),o.setAttribute("fill","#ffffff"),o.setAttribute("opacity","0"),n.setAttribute("filter","url("+Ot+"#"+s+")"),n.appendChild(o),n.appendChild(this._bx),t=n,!pe.maskType){r.setAttribute("mask-type","luminance"),i.appendChild(le.createAlphaToLuminanceFilter());var a=y("g");n.appendChild(o),a.appendChild(this._bx),t=a,n.appendChild(a)}this._x.defs.appendChild(r)}}else this.data.tt?(this.matteElement.appendChild(this._bx),t=this.matteElement,this._by=this.matteElement):this._by=this._bx;if(!this.data.ln&&!this.data.cl||4!==this.data.ty&&0!==this.data.ty||(this.data.ln&&this._bx.setAttribute("id",this.data.ln),this.data.cl&&this._bx.setAttribute("class",this.data.cl)),0===this.data.ty&&!this.data.hd){var l=y("clipPath"),f=y("path");f.setAttribute("d","M0,0 L"+this.data.w+",0 L"+this.data.w+","+this.data.h+" L0,"+this.data.h+"z");var m="cp_"+p(8);if(l.setAttribute("id",m),l.appendChild(f),this._x.defs.appendChild(l),this.checkMasks()){var d=y("g");d.setAttribute("clip-path","url("+Ot+"#"+m+")"),d.appendChild(this._bx),this._bz=d,t?t.appendChild(this._bz):this._by=this._bz}else this._bx.setAttribute("clip-path","url("+Ot+"#"+m+")")}0!==this.data.bm&&this.setBlendMode(),this.effectsManager=new ut(this)},$.prototype.renderElement=function(){this.finalTransform.matMdf&&this._bz.setAttribute("transform",this.finalTransform.mat.to2dCSS()),this.finalTransform.opMdf&&this._bz.setAttribute("opacity",this.finalTransform.mProp.o.v)},$.prototype.destroy_e=function(){this._bx=null,this.matteElement=null,this.maskManager.destroy()},$.prototype.get_e=function(){return this.data.hd?null:this._by},$.prototype.addMasks=function(){this.maskManager=new V(this.data,this,this._x)},$.prototype.setMatte=function(t){this.matteElement&&this.matteElement.setAttribute("mask","url("+Ot+"#"+t+")")},tt.prototype={addShapeToModifiers:function(t){var e,s=this.shapeModifiers.length;for(e=0;e<s;e+=1)this.shapeModifiers[e].addShape(t)},renderModifiers:function(){if(this.shapeModifiers.length){var t,e=this.shapes.length;for(t=0;t<e;t+=1)this.shapes[t].reset();for(e=this.shapeModifiers.length,t=e-1;t>=0;t-=1)this.shapeModifiers[t].processShapes(this._ch)}},lcEnum:{1:"butt",2:"round",3:"square"},ljEnum:{1:"miter",2:"round",3:"butt"},searchProcessedElement:function(t){for(var e=0,s=this.processedElements.length;e<s;){if(this.processedElements[e].elem===t)return this.processedElements[e].pos;e+=1}return 0},addProcessedElement:function(t,e){for(var s=this.processedElements.length;s;)if(s-=1,this.processedElements[s].elem===t){this.processedElements[s].pos=e;break}0===s&&this.processedElements.push(new G(t,e))},_az:function(t){this.prepareRenderableFrame(t),this.prepareProperties(t,this.isInRange)},buildShapeString:function(t,e,s,i){var a,r="";for(a=1;a<e;a+=1)1===a&&(r+=" M"+i.applyToPointStringified(t.v[0][0],t.v[0][1])),r+=" C"+i.applyToPointStringified(t.o[a-1][0],t.o[a-1][1])+" "+i.applyToPointStringified(t.i[a][0],t.i[a][1])+" "+i.applyToPointStringified(t.v[a][0],t.v[a][1]);return 1===e&&(r+=" M"+i.applyToPointStringified(t.v[0][0],t.v[0][1])),s&&e&&(r+=" C"+i.applyToPointStringified(t.o[a-1][0],t.o[a-1][1])+" "+i.applyToPointStringified(t.i[0][0],t.i[0][1])+" "+i.applyToPointStringified(t.v[0][0],t.v[0][1]),r+="z"),r}},et.prototype._cz=function(t,e,s){this.lettersChangedFlag=!0,this.initFrame(),this.initBaseData(t,e,s),this.textAnimator=new D(t.t,this.renderType,this),this.textProperty=new I(this,t.t,this._co),this.initTransform(t,e,s),this.initHierarchy(),this.initRenderable(),this.initRendererElement(),this.createContainerElements(),this.addMasks(),this.createContent(),this.textAnimator.searchProperties(this._co)},et.prototype._az=function(t){this.prepareRenderableFrame(t),this.prepareProperties(t,this.isInRange),(this.textProperty.mdf||this.textProperty._ch)&&(this.buildNewText(),this.textProperty._ch=!1)},et.prototype.createPathShape=function(t,e){var s,i,a=e.length,r="";for(s=0;s<a;s+=1)i=e[s].ks.k,r+=this.buildShapeString(i,i.i.length,!0,t);return r},et.prototype.updateDocumentData=function(t,e){this.textProperty.updateDocumentData(t,e)},et.prototype.applyTextPropertiesToMatrix=function(t,e,s,i,a){switch(t.ps&&e.translate(t.ps[0],t.ps[1]+t.ascent,0),e.translate(0,-t.ls,0),t.j){case 1:e.translate(t.justifyOffset+(t.boxWidth-t.lineWidths[s]),0,0);break;case 2:e.translate(t.justifyOffset+(t.boxWidth-t.lineWidths[s])/2,0,0)}e.translate(i,a,0)},et.prototype.buildColor=function(t){return"rgb("+Math.round(255*t[0])+","+Math.round(255*t[1])+","+Math.round(255*t[2])+")"},et.prototype.buildShapeString=tt.prototype.buildShapeString,et.prototype.emptyProp=new T,et.prototype.destroy=function(){},b([K,B,N,z,j],st),st.prototype._cz=function(t,e,s){this.initFrame(),this.initBaseData(t,e,s),this.initTransform(t,e,s),this.initRenderable(),this.initHierarchy(),this.initRendererElement(),this.createContainerElements(),this.addMasks(),!this.data.xt&&e.progressiveLoad||this.buildAllItems(),this.hide()},st.prototype._az=function(t){if(this.prepareRenderableFrame(t),this.prepareProperties(t,this.isInRange),this.isInRange||this.data.xt){if(this.tm._placeholder)this.renderedFrame=t/this.data.sr;else{var e=this.tm.v;e===this.data.op&&(e=this.data.op-1),this.renderedFrame=e}var s,i=this._br.length;for(this._db||this.checkLayers(this.renderedFrame),s=0;s<i;s+=1)(this._db||this._br[s])&&this._br[s]._az(this.renderedFrame-this.layers[s].st)}},st.prototype.renderInnerContent=function(){var t,e=this.layers.length;for(t=0;t<e;t+=1)(this._db||this._br[t])&&this._br[t]._ba()},st.prototype.setElements=function(t){this._br=t},st.prototype.getElements=function(){return this._br},st.prototype.destroyElements=function(){var t,e=this.layers.length;for(t=0;t<e;t+=1)this._br[t]&&this._br[t].destroy()},st.prototype.destroy=function(){this.destroyElements(),this.destroy_e()},b([K,B,$,N,z,j],it),it.prototype.createContent=function(){var t=this._x.getAssetsPath(this.assetData);this._cc=y("image"),this._cc.setAttribute("width",this.assetData.w+"px"),this._cc.setAttribute("height",this.assetData.h+"px"),this._cc.setAttribute("preserveAspectRatio","xMidYMid slice"),this._cc.setAttributeNS("http://www.w3.org/1999/xlink","href",t),this._bx.appendChild(this._cc)},b([it],at),at.prototype.createContent=function(){var t=y("rect");t.setAttribute("width",this.data.sw),t.setAttribute("height",this.data.sh),t.setAttribute("fill",this.data.sc),this._bx.appendChild(t)},b([R,st,$],rt),b([K,B,$,N,z,j,et],nt),nt.prototype.createContent=function(){this.data.ln&&this._bx.setAttribute("id",this.data.ln),this.data.cl&&this._bx.setAttribute("class",this.data.cl),this.data.singleShape&&!this._x._cr.chars&&(this.textContainer=y("text"))},nt.prototype.buildNewText=function(){var t,e,s=this.textProperty.currentData;this._bt=g(s?s.l.length:0),s.fc?this._bx.setAttribute("fill",this.buildColor(s.fc)):this._bx.setAttribute("fill","rgba(0,0,0,0)"),s.sc&&(this._bx.setAttribute("stroke",this.buildColor(s.sc)),this._bx.setAttribute("stroke-width",s.sw)),this._bx.setAttribute("font-size",s.s);var i=this._x._cr.getFontByName(s.f);if(i.fClass)this._bx.setAttribute("class",i.fClass);else{this._bx.setAttribute("font-family",i.fFamily);var a=s.fWeight,r=s.fStyle;this._bx.setAttribute("font-style",r),this._bx.setAttribute("font-weight",a)}var n=s.l||[],h=this._x._cr.chars;if(e=n.length){var o,p,l=this.mHelper,f="",m=this.data.singleShape,d=0,c=0,u=!0,v=s.tr/1e3*s.s;if(m&&!h){var b=this.textContainer,k="";switch(s.j){case 1:k="end";break;case 2:k="middle";break;case 2:k="start"}b.setAttribute("text-anchor",k),b.setAttribute("letter-spacing",v);var A=s.t.split(String.fromCharCode(13));e=A.length;var c=s.ps?s.ps[1]+s.ascent:0;for(t=0;t<e;t+=1)o=this.textSpans[t]||y("tspan"),o.textContent=A[t],o.setAttribute("x",0),o.setAttribute("y",c),o.style.display="inherit",b.appendChild(o),this.textSpans[t]=o,c+=s.lh;this._bx.appendChild(b)}else{var P,M,_=this.textSpans.length;for(t=0;t<e;t+=1)h&&m&&0!==t||(o=_>t?this.textSpans[t]:y(h?"path":"text"),_<=t&&(o.setAttribute("stroke-linecap","butt"),o.setAttribute("stroke-linejoin","round"),o.setAttribute("stroke-miterlimit","4"),this.textSpans[t]=o,this._bx.appendChild(o)),o.style.display="inherit"),l.reset(),h?(l.scale(s.s/100,s.s/100),m&&(n[t].n&&(d=-v,c+=s.yOffset,c+=u?1:0,u=!1),this.applyTextPropertiesToMatrix(s,l,n[t].line,d,c),d+=n[t].l||0,d+=v),M=this._x._cr.getCharData(s.t.charAt(t),i.fStyle,this._x._cr.getFontByName(s.f).fFamily),P=M&&M.data||{},p=P.shapes?P.shapes[0].it:[],m?f+=this.createPathShape(l,p):o.setAttribute("d",this.createPathShape(l,p))):(o.textContent=n[t].val,o.setAttributeNS("http://www.w3.org/XML/1998/namespace","xml:space","preserve"));m&&o.setAttribute("d",f)}for(;t<this.textSpans.length;)this.textSpans[t].style.display="none",t+=1;this._sizeChanged=!0}},nt.prototype.sourceRectAtTime=function(t){if(this._az(this.comp.renderedFrame-this.data.st),this.renderInnerContent(),this._sizeChanged){this._sizeChanged=!1;var e=this._bx.getBBox();this.bbox={top:e.y,left:e.x,width:e.width,height:e.height}}return this.bbox},nt.prototype.renderInnerContent=function(){if(!this.data.singleShape&&(this.textAnimator.getMeasures(this.textProperty.currentData,this.lettersChangedFlag),this.lettersChangedFlag||this.textAnimator.lettersChangedFlag)){this._sizeChanged=!0;var t,e,s=this.textAnimator._bt,i=this.textProperty.currentData.l;e=i.length;var a,r;for(t=0;t<e;t+=1)i[t].n||(a=s[t],r=this.textSpans[t],a.mdf.m&&r.setAttribute("transform",a.m),a.mdf.o&&r.setAttribute("opacity",a.o),a.mdf.sw&&r.setAttribute("stroke-width",a.sw),a.mdf.sc&&r.setAttribute("stroke",a.sc),a.mdf.fc&&r.setAttribute("fill",a.fc))}},b([K,B,$,tt,N,z,j],ht),ht.prototype.initSecondaryElement=function(){},ht.prototype.identityMatrix=new $t,ht.prototype.buildExpressionInterface=function(){},ht.prototype.createContent=function(){this.searchShapes(this.shapesData,this.itemsData,this.prevViewData,this._bx,this._co,0,[],!0)},ht.prototype.createStyleElement=function(t,e,s){var i,a=new W(t,e),r=a.pElem;if("st"===t.ty)i=new Y(this,t,s,a);else if("fl"===t.ty)i=new H(this,t,s,a);else if("gf"===t.ty||"gs"===t.ty){var n="gf"===t.ty?J:U;i=new n(this,t,s,a),this._x.defs.appendChild(i.gf),i.maskId&&(this._x.defs.appendChild(i.ms),this._x.defs.appendChild(i.of),r.setAttribute("mask","url(#"+i.maskId+")"))}return"st"!==t.ty&&"gs"!==t.ty||(r.setAttribute("stroke-linecap",this.lcEnum[t.lc]||"round"),r.setAttribute("stroke-linejoin",this.ljEnum[t.lj]||"round"),r.setAttribute("fill-opacity","0"),1===t.lj&&r.setAttribute("stroke-miterlimit",t.ml)),2===t.r&&r.setAttribute("fill-rule","evenodd"),t.ln&&r.setAttribute("id",t.ln),t.cl&&r.setAttribute("class",t.cl),this.stylesList.push(a),i},ht.prototype.createGroupElement=function(t){var e=new Z;return t.ln&&e.gr.setAttribute("id",t.ln),e},ht.prototype._cp=function(t,e){return new q(re._bj(this,t,e),ae._bo(this,t.o,0,.01,e))},ht.prototype.createShapeElement=function(t,e,s,i){var a=4;"rc"===t.ty?a=5:"el"===t.ty?a=6:"sr"===t.ty&&(a=7);var r=ne._bp(this,t,a,i),n=new X(e,s,r);return this.shapes.push(n.sh),this.addShapeToModifiers(n),n},ht.prototype.setElementStyles=function(t){var e,s=t.styles,i=this.stylesList.length;for(e=0;e<i;e+=1)this.stylesList[e].closed||s.push(this.stylesList[e])},ht.prototype.reloadShapes=function(){this._ch=!0;var t,e=this.itemsData.length;for(t=0;t<e;t+=1)this.prevViewData[t]=this.itemsData[t];this.searchShapes(this.shapesData,this.itemsData,this.prevViewData,this._bx,this._co,0,[],!0);var t,e=this._co.length;for(t=0;t<e;t+=1)this._co[t].getValue();this.renderModifiers()},ht.prototype.searchShapes=function(t,e,s,i,a,r,n,h){var o,p,l,f,m,d,c=[].concat(n),u=t.length-1,g=[],y=[];for(o=u;o>=0;o-=1){if(d=this.searchProcessedElement(t[o]),d?e[o]=s[d-1]:t[o]._render=h,"fl"==t[o].ty||"st"==t[o].ty||"gf"==t[o].ty||"gs"==t[o].ty)d?e[o].style.closed=!1:e[o]=this.createStyleElement(t[o],r,a),t[o]._render&&i.appendChild(e[o].style.pElem),g.push(e[o].style);else if("gr"==t[o].ty){if(d)for(l=e[o].it.length,p=0;p<l;p+=1)e[o].prevViewData[p]=e[o].it[p];else e[o]=this.createGroupElement(t[o]);this.searchShapes(t[o].it,e[o].it,e[o].prevViewData,e[o].gr,a,r+1,c,h),t[o]._render&&i.appendChild(e[o].gr)}else"tr"==t[o].ty?(d||(e[o]=this._cp(t[o],a)),f=e[o].transform,c.push(f)):"sh"==t[o].ty||"rc"==t[o].ty||"el"==t[o].ty||"sr"==t[o].ty?(d||(e[o]=this.createShapeElement(t[o],c,r,a)),this.setElementStyles(e[o])):"tm"==t[o].ty||"rd"==t[o].ty||"ms"==t[o].ty?(d?(m=e[o],m.closed=!1):(m=he.getModifier(t[o].ty),m.init(this,t[o],a),e[o]=m,this.shapeModifiers.push(m)),y.push(m)):"rp"==t[o].ty&&(d?(m=e[o],m.closed=!0):(m=he.getModifier(t[o].ty),e[o]=m,m.init(this,t,o,e,a),this.shapeModifiers.push(m),h=!1),y.push(m));this.addProcessedElement(t[o],o+1)}for(u=g.length,o=0;o<u;o+=1)g[o].closed=!0;for(u=y.length,o=0;o<u;o+=1)y[o].closed=!0},ht.prototype.renderInnerContent=function(){this.renderModifiers();var t,e=this.stylesList.length;for(t=0;t<e;t+=1)this.stylesList[t].reset();for(this.renderShape(this.shapesData,this.itemsData,null),t=0;t<e;t+=1)(this.stylesList[t].mdf||this._ch)&&(this.stylesList[t].msElem&&(this.stylesList[t].msElem.setAttribute("d",this.stylesList[t].d),this.stylesList[t].d="M0 0"+this.stylesList[t].d),this.stylesList[t].pElem.setAttribute("d",this.stylesList[t].d||"M0 0"))},ht.prototype.renderShape=function(t,e,s){var i,a,r=t.length-1;for(i=0;i<=r;i+=1)a=t[i].ty,"tr"==a?((this._ch||e[i].transform.op.mdf&&s)&&s.setAttribute("opacity",e[i].transform.op.v),(this._ch||e[i].transform.mProps.mdf&&s)&&s.setAttribute("transform",e[i].transform.mProps.v.to2dCSS())):!t[i]._render||"sh"!=a&&"el"!=a&&"rc"!=a&&"sr"!=a?"fl"==a?this.renderFill(t[i],e[i]):"gf"==a?this.renderGradient(t[i],e[i]):"gs"==a?(this.renderGradient(t[i],e[i]),this.renderStroke(t[i],e[i])):"st"==a?this.renderStroke(t[i],e[i]):"gr"==a&&this.renderShape(t[i].it,e[i].it,e[i].gr):this.renderPath(e[i])},ht.prototype.renderPath=function(t){var e,s,i,a,r,n,h,o,p,l,f,m=t.styles.length,d=t.lvl;for(n=0;n<m;n+=1){if(a=t.sh.mdf||this._ch,t.styles[n].lvl<d)for(o=this.mHelper.reset(),l=d-t.styles[n].lvl,f=t.transformers.length-1;l>0;)a=t.transformers[f].mProps.mdf||a,p=t.transformers[f].mProps.v.props,o.transform(p[0],p[1],p[2],p[3],p[4],p[5],p[6],p[7],p[8],p[9],p[10],p[11],p[12],p[13],p[14],p[15]),l--,f--;else o=this.identityMatrix;if(h=t.sh.paths,s=h._length,a){for(i="",e=0;e<s;e+=1)r=h.shapes[e],r&&r._length&&(i+=this.buildShapeString(r,r._length,r.c,o));t.caches[n]=i}else i=t.caches[n];t.styles[n].d+=i,t.styles[n].mdf=a||t.styles[n].mdf}},ht.prototype.renderFill=function(t,e){var s=e.style;(e.c.mdf||this._ch)&&s.pElem.setAttribute("fill","rgb("+qt(e.c.v[0])+","+qt(e.c.v[1])+","+qt(e.c.v[2])+")"),(e.o.mdf||this._ch)&&s.pElem.setAttribute("fill-opacity",e.o.v)},ht.prototype.renderGradient=function(t,e){var s=e.gf,i=e.g._hasOpacity,a=e.s.v,r=e.e.v;if(e.o.mdf||this._ch){var n="gf"===t.ty?"fill-opacity":"stroke-opacity";e.style.pElem.setAttribute(n,e.o.v)}if(e.s.mdf||this._ch){var h=1===t.t?"x1":"cx",o="x1"===h?"y1":"cy";s.setAttribute(h,a[0]),s.setAttribute(o,a[1]),i&&!e.g._collapsable&&(e.of.setAttribute(h,a[0]),e.of.setAttribute(o,a[1]))}var p,l,f,m;if(e.g.cmdf||this._ch){p=e.cst;var d=e.g.c;for(f=p.length,l=0;l<f;l+=1)m=p[l],m.setAttribute("offset",d[4*l]+"%"),m.setAttribute("stop-color","rgb("+d[4*l+1]+","+d[4*l+2]+","+d[4*l+3]+")")}if(i&&(e.g.omdf||this._ch)){var c=e.g.o;for(p=e.g._collapsable?e.cst:e.ost,f=p.length,l=0;l<f;l+=1)m=p[l],e.g._collapsable||m.setAttribute("offset",c[2*l]+"%"),m.setAttribute("stop-opacity",c[2*l+1])}if(1===t.t)(e.e.mdf||this._ch)&&(s.setAttribute("x2",r[0]),s.setAttribute("y2",r[1]),i&&!e.g._collapsable&&(e.of.setAttribute("x2",r[0]),e.of.setAttribute("y2",r[1])));else{var u;if((e.s.mdf||e.e.mdf||this._ch)&&(u=Math.sqrt(Math.pow(a[0]-r[0],2)+Math.pow(a[1]-r[1],2)),s.setAttribute("r",u),i&&!e.g._collapsable&&e.of.setAttribute("r",u)),e.e.mdf||e.h.mdf||e.a.mdf||this._ch){u||(u=Math.sqrt(Math.pow(a[0]-r[0],2)+Math.pow(a[1]-r[1],2)));var g=Math.atan2(r[1]-a[1],r[0]-a[0]),y=e.h.v>=1?.99:e.h.v<=-1?-.99:e.h.v,v=u*y,b=Math.cos(g+e.a.v)*v+a[0],k=Math.sin(g+e.a.v)*v+a[1];s.setAttribute("fx",b),s.setAttribute("fy",k),i&&!e.g._collapsable&&(e.of.setAttribute("fx",b),e.of.setAttribute("fy",k))}}},ht.prototype.renderStroke=function(t,e){var s=e.style,i=e.d;i&&(i.mdf||this._ch)&&(s.pElem.setAttribute("stroke-dasharray",i.dashStr),s.pElem.setAttribute("stroke-dashoffset",i.dashoffset[0])),e.c&&(e.c.mdf||this._ch)&&s.pElem.setAttribute("stroke","rgb("+qt(e.c.v[0])+","+qt(e.c.v[1])+","+qt(e.c.v[2])+")"),(e.o.mdf||this._ch)&&s.pElem.setAttribute("stroke-opacity",e.o.v),(e.w.mdf||this._ch)&&(s.pElem.setAttribute("stroke-width",e.w.v),s.msElem&&s.msElem.setAttribute("stroke-width",e.w.v))},ht.prototype.destroy=function(){this.destroy_e(),this.shapeData=null,this.itemsData=null},ot.prototype._ba=function(t){if(t||this._cl.mdf){var e=this._cl._cm[0].p.v,s=this._cl._cm[1].p.v,i=this._cl._cm[2].p.v/100;this.matrixFilter.setAttribute("values",s[0]-e[0]+" 0 0 0 "+e[0]+" "+(s[1]-e[1])+" 0 0 0 "+e[1]+" "+(s[2]-e[2])+" 0 0 0 "+e[2]+" 0 0 0 "+i+" 0")}},pt.prototype._ba=function(t){if(t||this._cl.mdf){var e=this._cl._cm[2].p.v,s=this._cl._cm[6].p.v;this.matrixFilter.setAttribute("values","0 0 0 0 "+e[0]+" 0 0 0 0 "+e[1]+" 0 0 0 0 "+e[2]+" 0 0 0 "+s+" 0")}},lt.prototype.initialize=function(){var t,e,s,i,a=this.elem._bx.children||this.elem._bx.childNodes;for(1===this._cl._cm[1].p.v?(i=this.elem.maskManager.masksProperties.length,s=0):(s=this._cl._cm[0].p.v-1,i=s+1),e=y("g"),e.setAttribute("fill","none"),e.setAttribute("stroke-linecap","round"),e.setAttribute("stroke-dashoffset",1),s;s<i;s+=1)t=y("path"),e.appendChild(t),this.paths.push({p:t,m:s});if(3===this._cl._cm[10].p.v){var r=y("mask"),n="stms_"+p(10);r.setAttribute("id",n),r.setAttribute("mask-type","alpha"),r.appendChild(e),this.elem._x.defs.appendChild(r);var h=y("g");h.setAttribute("mask","url("+Ot+"#"+n+")"),a[0]&&h.appendChild(a[0]),this.elem._bx.appendChild(h),this.masker=r,e.setAttribute("stroke","#fff")}else if(1===this._cl._cm[10].p.v||2===this._cl._cm[10].p.v){if(2===this._cl._cm[10].p.v)for(var a=this.elem._bx.children||this.elem._bx.childNodes;a.length;)this.elem._bx.removeChild(a[0]);this.elem._bx.appendChild(e),this.elem._bx.removeAttribute("mask"),e.setAttribute("stroke","#fff")}this.initialized=!0,this.pathMasker=e},lt.prototype._ba=function(t){this.initialized||this.initialize();var e,s,i,a=this.paths.length;for(e=0;e<a;e+=1)if(s=this.elem.maskManager.viewData[this.paths[e].m],i=this.paths[e].p,(t||this._cl.mdf||s.prop.mdf)&&i.setAttribute("d",s.lastPath),t||this._cl._cm[9].p.mdf||this._cl._cm[4].p.mdf||this._cl._cm[7].p.mdf||this._cl._cm[8].p.mdf||s.prop.mdf){var r;if(0!==this._cl._cm[7].p.v||100!==this._cl._cm[8].p.v){var n=Math.min(this._cl._cm[7].p.v,this._cl._cm[8].p.v)/100,h=Math.max(this._cl._cm[7].p.v,this._cl._cm[8].p.v)/100,o=i.getTotalLength();r="0 0 0 "+o*n+" ";var p,l=o*(h-n),f=1+2*this._cl._cm[4].p.v*this._cl._cm[9].p.v/100,m=Math.floor(l/f);for(p=0;p<m;p+=1)r+="1 "+2*this._cl._cm[4].p.v*this._cl._cm[9].p.v/100+" ";r+="0 "+10*o+" 0 0"}else r="1 "+2*this._cl._cm[4].p.v*this._cl._cm[9].p.v/100;i.setAttribute("stroke-dasharray",r)}if((t||this._cl._cm[4].p.mdf)&&this.pathMasker.setAttribute("stroke-width",2*this._cl._cm[4].p.v),(t||this._cl._cm[6].p.mdf)&&this.pathMasker.setAttribute("opacity",this._cl._cm[6].p.v),(1===this._cl._cm[10].p.v||2===this._cl._cm[10].p.v)&&(t||this._cl._cm[3].p.mdf)){var d=this._cl._cm[3].p.v;this.pathMasker.setAttribute("stroke","rgb("+qt(255*d[0])+","+qt(255*d[1])+","+qt(255*d[2])+")")}},ft.prototype._ba=function(t){if(t||this._cl.mdf){var e=this._cl._cm[0].p.v,s=this._cl._cm[1].p.v,i=this._cl._cm[2].p.v,a=i[0]+" "+s[0]+" "+e[0],r=i[1]+" "+s[1]+" "+e[1],n=i[2]+" "+s[2]+" "+e[2];this.feFuncR.setAttribute("tableValues",a),this.feFuncG.setAttribute("tableValues",r),this.feFuncB.setAttribute("tableValues",n)}},mt.prototype.createFeFunc=function(t,e){var s=y(t);return s.setAttribute("type","table"),e.appendChild(s),s},mt.prototype.getTableValue=function(t,e,s,i,a){for(var r,n,h=0,o=256,p=Math.min(t,e),l=Math.max(t,e),f=Array.call(null,{length:o}),m=0,d=a-i,c=e-t;h<=256;)r=h/256,n=r<=p?c<0?a:i:r>=l?c<0?i:a:i+d*Math.pow((r-t)/c,1/s),f[m++]=n,h+=256/(o-1);return f.join(" ")},mt.prototype._ba=function(t){if(t||this._cl.mdf){var e,s=this._cl._cm;this.feFuncRComposed&&(t||s[3].p.mdf||s[4].p.mdf||s[5].p.mdf||s[6].p.mdf||s[7].p.mdf)&&(e=this.getTableValue(s[3].p.v,s[4].p.v,s[5].p.v,s[6].p.v,s[7].p.v),this.feFuncRComposed.setAttribute("tableValues",e),this.feFuncGComposed.setAttribute("tableValues",e),this.feFuncBComposed.setAttribute("tableValues",e)),this.feFuncR&&(t||s[10].p.mdf||s[11].p.mdf||s[12].p.mdf||s[13].p.mdf||s[14].p.mdf)&&(e=this.getTableValue(s[10].p.v,s[11].p.v,s[12].p.v,s[13].p.v,s[14].p.v),this.feFuncR.setAttribute("tableValues",e)),this.feFuncG&&(t||s[17].p.mdf||s[18].p.mdf||s[19].p.mdf||s[20].p.mdf||s[21].p.mdf)&&(e=this.getTableValue(s[17].p.v,s[18].p.v,s[19].p.v,s[20].p.v,s[21].p.v),this.feFuncG.setAttribute("tableValues",e)),this.feFuncB&&(t||s[24].p.mdf||s[25].p.mdf||s[26].p.mdf||s[27].p.mdf||s[28].p.mdf)&&(e=this.getTableValue(s[24].p.v,s[25].p.v,s[26].p.v,s[27].p.v,s[28].p.v),this.feFuncB.setAttribute("tableValues",e)),this.feFuncA&&(t||s[31].p.mdf||s[32].p.mdf||s[33].p.mdf||s[34].p.mdf||s[35].p.mdf)&&(e=this.getTableValue(s[31].p.v,s[32].p.v,s[33].p.v,s[34].p.v,s[35].p.v),this.feFuncA.setAttribute("tableValues",e))}},dt.prototype._ba=function(t){if(t||this._cl.mdf){if((t||this._cl._cm[4].p.mdf)&&this.feGaussianBlur.setAttribute("stdDeviation",this._cl._cm[4].p.v/4),t||this._cl._cm[0].p.mdf){var e=this._cl._cm[0].p.v;this.feFlood.setAttribute("flood-color",Kt(Math.round(255*e[0]),Math.round(255*e[1]),Math.round(255*e[2])))}if((t||this._cl._cm[1].p.mdf)&&this.feFlood.setAttribute("flood-opacity",this._cl._cm[1].p.v/255),t||this._cl._cm[2].p.mdf||this._cl._cm[3].p.mdf){var s=this._cl._cm[3].p.v,i=(this._cl._cm[2].p.v-90)*Ut,a=s*Math.cos(i),r=s*Math.sin(i);this.feOffset.setAttribute("dx",a),this.feOffset.setAttribute("dy",r)}}};var be=[],ke=0;ct.prototype.findSymbol=function(t){for(var e=0,s=be.length;e<s;){if(be[e]===t)return be[e];e+=1}return null},ct.prototype.replaceInParent=function(t,e){var s=t._bx.parentNode;if(s){for(var i=s.children,a=0,r=i.length;a<r&&i[a]!==t._bx;)a+=1;var n;a<=r-2&&(n=i[a+1]);var h=y("use");h.setAttribute("href","#"+e),n?s.insertBefore(h,n):s.appendChild(h)}},ct.prototype.setElementAsMask=function(t,e){if(!this.findSymbol(e)){var s="matte_"+p(5)+"_"+ke++,i=y("mask");i.setAttribute("id",e.layerId),i.setAttribute("mask-type","alpha"),be.push(e);var a=t._x.defs;a.appendChild(i);var r=y("symbol");r.setAttribute("id",s),this.replaceInParent(e,s),r.appendChild(e._bx),a.appendChild(r),useElem=y("use"),useElem.setAttribute("href","#"+s),i.appendChild(useElem),e.data.hd=!1,e.show()}t.setMatte(e.layerId)},ct.prototype.initialize=function(){for(var t=this._cl._cm[0].p.v,e=0,s=this.elem.comp._br.length;e<s;)this.elem.comp._br[e].data.ind===t&&this.setElementAsMask(this.elem,this.elem.comp._br[e]),e+=1;this.initialized=!0},ct.prototype._ba=function(){this.initialized||this.initialize()},ut.prototype._ba=function(t){var e,s=this.filters.length;for(e=0;e<s;e+=1)this.filters[e]._ba(t)};var Ae=function(){function e(t){for(var e=0,s=t.target;e<E;)M[e].animation===s&&(M.splice(e,1),e-=1,E-=1,s.isPaused||a()),e+=1}function s(t,e){if(!t)return null;for(var s=0;s<E;){if(M[s].elem==t&&null!==M[s].elem)return M[s].animation;s+=1}var i=new Pe;return r(i,t),i.setData(t,e),i}function i(){F+=1,A()}function a(){F-=1,0===F&&(w=!0)}function r(t,s){t.addEventListener("destroy",e),t.addEventListener("_active",i),t.addEventListener("_idle",a),M.push({elem:s,animation:t}),E+=1}function n(t){var e=new Pe;return r(e,null),e.setParams(t),e}function h(t,e){var s;for(s=0;s<E;s+=1)M[s].animation.setSpeed(t,e)}function o(t,e){var s;for(s=0;s<E;s+=1)M[s].animation.setDirection(t,e)}function p(t){var e;for(e=0;e<E;e+=1)M[e].animation.play(t)}function l(t,e){_=Date.now();var s;for(s=0;s<E;s+=1)M[s].animation.moveFrame(t,e)}function f(e){var s,i=e-_;for(s=0;s<E;s+=1)M[s].animation.advanceTime(i);_=e,w?C=!0:t.requestAnimationFrame(f)}function m(e){_=e,t.requestAnimationFrame(f)}function d(t){var e;for(e=0;e<E;e+=1)M[e].animation.pause(t)}function c(t,e,s){var i;for(i=0;i<E;i+=1)M[i].animation.goToAndStop(t,e,s)}function u(t){var e;for(e=0;e<E;e+=1)M[e].animation.stop(t)}function g(t){var e;for(e=0;e<E;e+=1)M[e].animation.togglePause(t)}function y(t){var e;for(e=E-1;e>=0;e-=1)M[e].animation.destroy(t)}function b(t,e,i){var a,r=[].concat([].slice.call(document.getElementsByClassName("lottie")),[].slice.call(document.getElementsByClassName("bodymovin"))),n=r.length;for(a=0;a<n;a+=1)i&&r[a].setAttribute("data-bm-type",i),s(r[a],t);if(e&&0===n){i||(i="svg");var h=document.getElementsByTagName("body")[0];h.innerHTML="";var o=v("div");o.style.width="100%",o.style.height="100%",o.setAttribute("data-bm-type",i),
+h.appendChild(o),s(o,t)}}function k(){var t;for(t=0;t<E;t+=1)M[t].animation.resize()}function A(){w&&(w=!1,C&&(t.requestAnimationFrame(m),C=!1))}var P={},M=[],_=0,E=0,w=!0,F=0,C=!0;return P.registerAnimation=s,P.loadAnimation=n,P.setSpeed=h,P.setDirection=o,P.play=p,P.moveFrame=l,P.pause=d,P.stop=u,P.togglePause=g,P.searchAnimations=b,P.resize=k,P.goToAndStop=c,P.destroy=y,P}(),Pe=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._dc=0,this.playCount=0,this.animationData={},this.layers=[],this.assets=[],this.isPaused=!0,this.autoplay=!1,this.loop=!0,this.renderer=null,this.animationID=p(10),this.assetsPath="",this.timeCompleted=0,this.segmentPos=0,this.subframeEnabled=Gt,this.segments=[],this.pendingSegment=!1,this._idle=!0,this.projectInterface=e()};b([u],Pe),Pe.prototype.setParams=function(t){var e=this;t.context&&(this.context=t.context),(t.wrapper||t.container)&&(this.wrapper=t.wrapper||t.container);var s=t.animType?t.animType:t.renderer?t.renderer:"svg";switch(s){case"canvas":this.renderer=new _aq(this,t.rendererSettings);break;case"svg":this.renderer=new R(this,t.rendererSettings);break;case"hybrid":case"html":default:this.renderer=new _ap(this,t.rendererSettings)}if(this.renderer.setProjectInterface(this.projectInterface),this.animType=s,""===t.loop||null===t.loop||(t.loop===!1?this.loop=!1:t.loop===!0?this.loop=!0:this.loop=parseInt(t.loop)),this.autoplay=!("autoplay"in t)||t.autoplay,this.name=t.name?t.name:"",this.autoloadSegments=!t.hasOwnProperty("autoloadSegments")||t.autoloadSegments,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;t.path.lastIndexOf("\\")!=-1?this.path=t.path.substr(0,t.path.lastIndexOf("\\")+1):this.path=t.path.substr(0,t.path.lastIndexOf("/")+1),this.assetsPath=t.assetsPath,this.fileName=t.path.substr(t.path.lastIndexOf("/")+1),this.fileName=this.fileName.substr(0,this.fileName.lastIndexOf(".json")),i.open("GET",t.path,!0),i.send(),i.onreadystatechange=function(){if(4==i.readyState)if(200==i.status)e.configAnimation(JSON.parse(i.responseText));else try{var t=JSON.parse(i.responseText);e.configAnimation(t)}catch(s){}}}},Pe.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||("false"===a?s.loop=!1:"true"===a?s.loop=!0:s.loop=parseInt(a));var r=i.getNamedItem("data-anim-autoplay")?i.getNamedItem("data-anim-autoplay").value:i.getNamedItem("data-bm-autoplay")?i.getNamedItem("data-bm-autoplay").value:!i.getNamedItem("bm-autoplay")||i.getNamedItem("bm-autoplay").value;s.autoplay="false"!==r,s.name=i.getNamedItem("data-name")?i.getNamedItem("data-name").value:i.getNamedItem("data-bm-name")?i.getNamedItem("data-bm-name").value:i.getNamedItem("bm-name")?i.getNamedItem("bm-name").value:"";var n=i.getNamedItem("data-anim-prerender")?i.getNamedItem("data-anim-prerender").value:i.getNamedItem("data-bm-prerender")?i.getNamedItem("data-bm-prerender").value:i.getNamedItem("bm-prerender")?i.getNamedItem("bm-prerender").value:"";"false"===n&&(s.prerender=!1),this.setParams(s)},Pe.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;s<n;s+=1)for(e=0;e<a;){if(i[e].id==r[s].id){i[e]=r[s];break}e+=1}if((t.chars||t.fonts)&&(this.renderer._x._cr.addChars(t.chars),this.renderer._x._cr.addFonts(t.fonts,this.renderer._x.defs)),t.assets)for(a=t.assets.length,e=0;e<a;e+=1)this.animationData.assets.push(t.assets[e]);this.animationData.__complete=!1,se.completeData(this.animationData,this.renderer._x._cr),this.renderer.includeLayers(t.layers),Nt&&Nt.initExpressions(this),this.renderer._ba(null),this.loadNextSegment()},Pe.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){}}},Pe.prototype.loadSegments=function(){var t=this.animationData.segments;t||(this.timeCompleted=this.animationData.tf),this.loadNextSegment()},Pe.prototype.configAnimation=function(t){var e=this;this.renderer&&this.renderer.destroyed||(this.animationData=t,this.totalFrames=Math.floor(this.animationData.op-this.animationData.ip),this.animationData.tf=this.totalFrames,this.renderer.configAnimation(t),t.assets||(t.assets=[]),t.comps&&(t.assets=t.assets.concat(t.comps),t.comps=null),this.renderer.searchExtraCompositions(t.assets),this.layers=this.animationData.layers,this.assets=this.animationData.assets,this.frameRate=this.animationData.fr,this._ch=Math.round(this.animationData.ip),this.frameMult=this.animationData.fr/1e3,this.trigger("config_ready"),this.imagePreloader=new oe,this.imagePreloader.setAssetsPath(this.assetsPath),this.imagePreloader.setPath(this.path),this.imagePreloader.loadAssets(t.assets,function(t){t||e.trigger("loaded_images")}),this.loadSegments(),this.updaFrameModifier(),this.renderer._x._cr?this.waitForFontsLoaded():(se.completeData(this.animationData,this.renderer._x._cr),this.checkLoaded()))},Pe.prototype.waitForFontsLoaded=function(){function t(){this.renderer._x._cr.loaded?(se.completeData(this.animationData,this.renderer._x._cr),this.checkLoaded()):setTimeout(t.bind(this),20)}return function(){t.bind(this)()}}(),Pe.prototype.addPendingElement=function(){this._dc+=1},Pe.prototype.elementLoaded=function(){this._dc--,this.checkLoaded()},Pe.prototype.checkLoaded=function(){0===this._dc&&(Nt&&Nt.initExpressions(this),this.renderer.initItems(),setTimeout(function(){this.trigger("DOMLoaded")}.bind(this),0),this.isLoaded=!0,this.gotoFrame(),this.autoplay&&this.play())},Pe.prototype.resize=function(){this.renderer.updateContainerSize()},Pe.prototype.setSubframe=function(t){this.subframeEnabled=!!t},Pe.prototype.gotoFrame=function(){this.currentFrame=this.subframeEnabled?this.currentRawFrame:~~this.currentRawFrame,this.timeCompleted!==this.totalFrames&&this.currentFrame>this.timeCompleted&&(this.currentFrame=this.timeCompleted),this.trigger("enterFrame"),this._ba()},Pe.prototype._ba=function(){this.isLoaded!==!1&&this.renderer._ba(this.currentFrame+this._ch)},Pe.prototype.play=function(t){t&&this.name!=t||this.isPaused===!0&&(this.isPaused=!1,this._idle&&(this._idle=!1,this.trigger("_active")))},Pe.prototype.pause=function(t){t&&this.name!=t||this.isPaused===!1&&(this.isPaused=!0,this.pendingSegment||(this._idle=!0,this.trigger("_idle")))},Pe.prototype.togglePause=function(t){t&&this.name!=t||(this.isPaused===!0?this.play():this.pause())},Pe.prototype.stop=function(t){t&&this.name!=t||(this.pause(),this.currentFrame=this.currentRawFrame=0,this.playCount=0,this.gotoFrame())},Pe.prototype.goToAndStop=function(t,e,s){s&&this.name!=s||(e?this.setCurrentRawFrameValue(t):this.setCurrentRawFrameValue(t*this.frameModifier),this.pause())},Pe.prototype.goToAndPlay=function(t,e,s){this.goToAndStop(t,e,s),this.play()},Pe.prototype.advanceTime=function(t){return this.pendingSegment?(this.pendingSegment=!1,this.adjustSegment(this.segments.shift()),void(this.isPaused&&this.play())):void(this.isPaused!==!0&&this.isLoaded!==!1&&this.setCurrentRawFrameValue(this.currentRawFrame+t*this.frameModifier))},Pe.prototype.updateAnimation=function(t){this.setCurrentRawFrameValue(this.totalFrames*t)},Pe.prototype.moveFrame=function(t,e){e&&this.name!=e||this.setCurrentRawFrameValue(this.currentRawFrame+t)},Pe.prototype.adjustSegment=function(t){this.playCount=0,t[1]<t[0]?(this.frameModifier>0&&(this.playSpeed<0?this.setSpeed(-this.playSpeed):this.setDirection(-1)),this.totalFrames=t[0]-t[1],this._ch=t[1],this.setCurrentRawFrameValue(this.totalFrames-.001)):t[1]>t[0]&&(this.frameModifier<0&&(this.playSpeed<0?this.setSpeed(-this.playSpeed):this.setDirection(1)),this.totalFrames=t[1]-t[0],this._ch=t[0],this.setCurrentRawFrameValue(.001)),this.trigger("segmentStart")},Pe.prototype.setSegment=function(t,e){var s=-1;this.isPaused&&(this.currentRawFrame+this._ch<t?s=t:this.currentRawFrame+this._ch>e&&(s=e-t)),this._ch=t,this.totalFrames=e-t,s!==-1&&this.goToAndStop(s,!0)},Pe.prototype.playSegments=function(t,e){if("object"==typeof t[0]){var s,i=t.length;for(s=0;s<i;s+=1)this.segments.push(t[s])}else this.segments.push(t);e&&this.adjustSegment(this.segments.shift()),this.isPaused&&this.play()},Pe.prototype.resetSegments=function(t){this.segments.length=0,this.segments.push([this.animationData.ip,this.animationData.op]),t&&this.adjustSegment(this.segments.shift())},Pe.prototype.checkSegments=function(){this.segments.length&&(this.pendingSegment=!0)},Pe.prototype.remove=function(t){t&&this.name!=t||this.renderer.destroy()},Pe.prototype.destroy=function(t){t&&this.name!=t||this.renderer&&this.renderer.destroyed||(this.renderer.destroy(),this.trigger("destroy"),this._cbs=null,this.onEnterFrame=this.onLoopComplete=this.onComplete=this.onSegmentStart=this.onDestroy=null,this.renderer=null)},Pe.prototype.setCurrentRawFrameValue=function(t){this.currentRawFrame=t;var e=!1;this.currentRawFrame>=this.totalFrames?(this.checkSegments(),this.loop===!1?(this.currentRawFrame=this.totalFrames,e=!0):(this.trigger("loopComplete"),this.playCount+=1,this.loop!==!0&&this.playCount==this.loop||this.pendingSegment?(this.currentRawFrame=this.totalFrames,e=!0):this.currentRawFrame=this.currentRawFrame%this.totalFrames)):this.currentRawFrame<0&&(this.checkSegments(),this.playCount-=1,this.playCount<0&&(this.playCount=0),this.loop===!1||this.pendingSegment?(this.currentRawFrame=0,e=!0):(this.trigger("loopComplete"),this.currentRawFrame=(this.totalFrames+this.currentRawFrame)%this.totalFrames)),this.gotoFrame(),e&&(this.pause(),this.trigger("complete"))},Pe.prototype.setSpeed=function(t){this.playSpeed=t,this.updaFrameModifier()},Pe.prototype.setDirection=function(t){this.playDirection=t<0?-1:1,this.updaFrameModifier()},Pe.prototype.updaFrameModifier=function(){this.frameModifier=this.frameMult*this.playSpeed*this.playDirection},Pe.prototype.getPath=function(){return this.path},Pe.prototype.getAssetsPath=function(t){var e="";if(this.assetsPath){var s=t.p;s.indexOf("images/")!==-1&&(s=s.split("/")[1]),e=this.assetsPath+s}else e=this.path,e+=t.u?t.u:"",e+=t.p;return e},Pe.prototype.getAssetData=function(t){for(var e=0,s=this.assets.length;e<s;){if(t==this.assets[e].id)return this.assets[e];e+=1}},Pe.prototype.hide=function(){this.renderer.hide()},Pe.prototype.show=function(){this.renderer.show()},Pe.prototype.getAssets=function(){return this.assets},Pe.prototype.trigger=function(t){if(this._cbs&&this._cbs[t])switch(t){case"enterFrame":this._cy(t,new a(t,this.currentFrame,this.totalFrames,this.frameMult));break;case"loopComplete":this._cy(t,new n(t,this.loop,this.playCount,this.frameMult));break;case"complete":this._cy(t,new r(t,this.frameMult));break;case"segmentStart":this._cy(t,new h(t,this._ch,this.totalFrames));break;case"destroy":this._cy(t,new o(t,this));break;default:this._cy(t)}"enterFrame"===t&&this.onEnterFrame&&this.onEnterFrame.call(this,new a(t,this.currentFrame,this.totalFrames,this.frameMult)),"loopComplete"===t&&this.onLoopComplete&&this.onLoopComplete.call(this,new n(t,this.loop,this.playCount,this.frameMult)),"complete"===t&&this.onComplete&&this.onComplete.call(this,new r(t,this.frameMult)),"segmentStart"===t&&this.onSegmentStart&&this.onSegmentStart.call(this,new h(t,this._ch,this.totalFrames)),"destroy"===t&&this.onDestroy&&this.onDestroy.call(this,new o(t,this))};var Me={};Me.play=yt,Me.pause=vt,Me.setLocationHref=gt,Me.togglePause=bt,Me.setSpeed=kt,Me.setDirection=At,Me.stop=Pt,Me.moveFrame=Mt,Me.searchAnimations=_t,Me.registerAnimation=Et,Me.loadAnimation=xt,Me.setSubframeRendering=Ct,Me.resize=wt,Me.goToAndStop=Ft,Me.destroy=Dt,Me.setQuality=St,Me.inBrowser=Tt,Me.installPlugin=It,Me.__getFactory=Lt,Me.version="5.0.6";var _e="__[STANDALONE]__",Ee="__[ANIMATIONDATA]__",we="";if(_e){var Fe=document.getElementsByTagName("script"),Ce=Fe.length-1,xe=Fe[Ce]||{src:""},De=xe.src.replace(/^[^\?]+\??/,"");we=Vt("renderer")}var Se=setInterval(Rt,100);return Me});
\ No newline at end of file
diff --git a/gulpfile.js b/gulpfile.js
index 94cfd5d..4d1f21d 100644
--- a/gulpfile.js
+++ b/gulpfile.js
@@ -81,7 +81,7 @@
 var srcs = [];
 
 var demoBuiltData = '';
-var uglifyOptions = {output: {ascii_only:true}};
+var uglifyOptions = {output: {ascii_only:true},toplevel:true};
 
 
 gulp.task('getBuildSources', function(cb) {
@@ -269,6 +269,23 @@
     ['effectElements', '_cm'],
     ['applyToPointArray', '_cn'],
     ['dynamicProperties', '_co'],
+    ['animationItem', '_cq'],
+    ['fontManager', '_cr'],
+    ['createTypedArray', '_cs'],
+    ['createNS', '_ct'],
+    ['createTag', '_cu'],
+    ['createSizedArray', '_cv'],
+    ['SVGTextElement', '_cw'],
+    ['transformCanvas', '_cx'],
+    ['triggerEvent', '_cy'],
+    ['initElement', '_cz'],
+    ['canvasContext', '_da'],
+    ['completeLayers', '_db'],
+    ['pendingElements', '_dc'],
+    ['hierarchy', '_dd'],
+    ['compSize', '_de'],
+    ['keyframes', '_df'],
+    ['getValueAtTime', '_dg'],
 ]
 
 gulp.task('buildTest',['buildSources'], function() {
diff --git a/player/js/elements/BaseElement.js b/player/js/elements/BaseElement.js
index 928634e..ed38026 100644
--- a/player/js/elements/BaseElement.js
+++ b/player/js/elements/BaseElement.js
@@ -33,56 +33,26 @@
     }
 }
 
+BaseElement.prototype.blendModeEnums = {
+    1:'multiply',
+    2:'screen',
+    3:'overlay',
+    4:'darken',
+    5:'lighten',
+    6:'color-dodge',
+    7:'color-burn',
+    8:'hard-light',
+    9:'soft-light',
+    10:'difference',
+    11:'exclusion',
+    12:'hue',
+    13:'saturation',
+    14:'color',
+    15:'luminosity'
+}
+
 BaseElement.prototype.getBlendMode = function(){
-    var blendModeValue = '';
-    switch(this.data.bm){
-        case 1:
-            blendModeValue = 'multiply';
-            break;
-        case 2:
-            blendModeValue = 'screen';
-            break;
-        case 3:
-            blendModeValue = 'overlay';
-            break;
-        case 4:
-            blendModeValue = 'darken';
-            break;
-        case 5:
-            blendModeValue = 'lighten';
-            break;
-        case 6:
-            blendModeValue = 'color-dodge';
-            break;
-        case 7:
-            blendModeValue = 'color-burn';
-            break;
-        case 8:
-            blendModeValue = 'hard-light';
-            break;
-        case 9:
-            blendModeValue = 'soft-light';
-            break;
-        case 10:
-            blendModeValue = 'difference';
-            break;
-        case 11:
-            blendModeValue = 'exclusion';
-            break;
-        case 12:
-            blendModeValue = 'hue';
-            break;
-        case 13:
-            blendModeValue = 'saturation';
-            break;
-        case 14:
-            blendModeValue = 'color';
-            break;
-        case 15:
-            blendModeValue = 'luminosity';
-            break;
-    }
-    return blendModeValue;
+    return this.blendModeEnums[this.data.bm] || '';
 }
 
 BaseElement.prototype.setBlendMode = function(){
diff --git a/player/js/elements/canvasElements/CVCompElement.js b/player/js/elements/canvasElements/CVCompElement.js
index 8c9a5f2..d986055 100644
--- a/player/js/elements/canvasElements/CVCompElement.js
+++ b/player/js/elements/canvasElements/CVCompElement.js
@@ -2,7 +2,7 @@
     this.completeLayers = false;
     this.layers = data.layers;
     this.pendingElements = [];
-    this.elements = Array.apply(null,{length:this.layers.length});
+    this.elements = createSizedArray(this.layers.length);
     this.initElement(data, globalData, comp);
     this.tm = data.tm ? PropertyFactory.getProp(this,data.tm,0,globalData.frameRate,this.dynamicProperties) : {_placeholder:true};
 }
diff --git a/player/js/elements/canvasElements/CVMaskElement.js b/player/js/elements/canvasElements/CVMaskElement.js
index d49d316..ece4cd7 100644
--- a/player/js/elements/canvasElements/CVMaskElement.js
+++ b/player/js/elements/canvasElements/CVMaskElement.js
@@ -4,7 +4,7 @@
     this.element = element;
     this.dynamicProperties = [];
     this.masksProperties = this.data.masksProperties || [];
-    this.viewData = Array.apply(null,{length:this.masksProperties.length});
+    this.viewData = createSizedArray(this.masksProperties.length);
     var i, len = this.masksProperties.length, hasMasks = false;
     for (i = 0; i < len; i++) {
         if(this.masksProperties[i].mode !== 'n'){
diff --git a/player/js/elements/canvasElements/CVTextElement.js b/player/js/elements/canvasElements/CVTextElement.js
index f697e24..485200a 100644
--- a/player/js/elements/canvasElements/CVTextElement.js
+++ b/player/js/elements/canvasElements/CVTextElement.js
@@ -23,7 +23,7 @@
 
 CVTextElement.prototype.buildNewText = function(){
     var documentData = this.textProperty.currentData;
-    this.renderedLetters = Array.apply(null,{length:documentData.l ? documentData.l.length : 0});
+    this.renderedLetters = createSizedArray(documentData.l ? documentData.l.length : 0);
 
     var hasFill = false;
     if(documentData.fc) {
@@ -68,7 +68,7 @@
         if(singleShape){
             this.applyTextPropertiesToMatrix(documentData, matrixHelper, letters[i].line, xPos, yPos);
         }
-        commands = Array.apply(null,{length:jLen})
+        commands = createSizedArray(jLen)
         for(j=0;j<jLen;j+=1){
             kLen = shapes[j].ks.k.i.length;
             pathNodes = shapes[j].ks.k;
diff --git a/player/js/elements/htmlElements/HCompElement.js b/player/js/elements/htmlElements/HCompElement.js
index 2124a77..802622e 100644
--- a/player/js/elements/htmlElements/HCompElement.js
+++ b/player/js/elements/htmlElements/HCompElement.js
@@ -3,7 +3,7 @@
     this.supports3d = !data.hasMask;
     this.completeLayers = false;
     this.pendingElements = [];
-    this.elements = this.layers ? Array.apply(null,{length:this.layers.length}) : [];
+    this.elements = this.layers ? createSizedArray(this.layers.length) : [];
     this.tm = data.tm ? PropertyFactory.getProp(this,data.tm,0,globalData.frameRate,this.dynamicProperties) : {_placeholder:true};
     
     this.initElement(data,globalData,comp);
diff --git a/player/js/elements/htmlElements/HTextElement.js b/player/js/elements/htmlElements/HTextElement.js
index 01e80fa..8a6546c 100644
--- a/player/js/elements/htmlElements/HTextElement.js
+++ b/player/js/elements/htmlElements/HTextElement.js
@@ -36,7 +36,7 @@
 
 HTextElement.prototype.buildNewText = function(){
     var documentData = this.textProperty.currentData;
-    this.renderedLetters = Array.apply(null,{length:this.textProperty.currentData.l ? this.textProperty.currentData.l.length : 0});
+    this.renderedLetters = createSizedArray(this.textProperty.currentData.l ? this.textProperty.currentData.l.length : 0);
     var innerElemStyle = this.innerElem.style;
     innerElemStyle.color = innerElemStyle.fill = documentData.fc ? this.buildColor(documentData.fc) : 'rgba(0,0,0,0)';
     if(documentData.sc){
diff --git a/player/js/elements/svgElements/SVGCompElement.js b/player/js/elements/svgElements/SVGCompElement.js
index af69d66..f13841d 100644
--- a/player/js/elements/svgElements/SVGCompElement.js
+++ b/player/js/elements/svgElements/SVGCompElement.js
@@ -3,7 +3,7 @@
     this.supports3d = true;
     this.completeLayers = false;
     this.pendingElements = [];
-    this.elements = this.layers ? Array.apply(null,{length:this.layers.length}) : [];
+    this.elements = this.layers ? createSizedArray(this.layers.length) : [];
     //this.layerElement = createNS('g');
     this.initElement(data,globalData,comp);
     this.tm = data.tm ? PropertyFactory.getProp(this,data.tm,0,globalData.frameRate,this.dynamicProperties) : {_placeholder:true};
diff --git a/player/js/elements/svgElements/SVGTextElement.js b/player/js/elements/svgElements/SVGTextElement.js
index 04a6bc0..5c0a77c 100644
--- a/player/js/elements/svgElements/SVGTextElement.js
+++ b/player/js/elements/svgElements/SVGTextElement.js
@@ -23,7 +23,7 @@
     var i, len;
 
     var documentData = this.textProperty.currentData;
-    this.renderedLetters = Array.apply(null,{length:documentData ? documentData.l.length : 0});
+    this.renderedLetters = createSizedArray(documentData ? documentData.l.length : 0);
     if(documentData.fc) {
         this.layerElement.setAttribute('fill', this.buildColor(documentData.fc));
     }else{
diff --git a/player/js/mask.js b/player/js/mask.js
index 591bd8d..41a14bf 100644
--- a/player/js/mask.js
+++ b/player/js/mask.js
@@ -10,7 +10,7 @@
     this.firstFrame = true;
     var defs = this.globalData.defs;
     var i, len = this.masksProperties ? this.masksProperties.length : 0;
-    this.viewData = Array.apply(null,{length:len});
+    this.viewData = createSizedArray(len);
     this.solidPath = '';
 
 
diff --git a/player/js/renderers/CanvasRenderer.js b/player/js/renderers/CanvasRenderer.js
index 42c0efd..3111fbe 100644
--- a/player/js/renderers/CanvasRenderer.js
+++ b/player/js/renderers/CanvasRenderer.js
@@ -174,7 +174,7 @@
     this.globalData.elementLoaded = this.animationItem.elementLoaded.bind(this.animationItem);
     this.globalData.addPendingElement = this.animationItem.addPendingElement.bind(this.animationItem);
     this.globalData.transformCanvas = this.transformCanvas;
-    this.elements = Array.apply(null,{length:animData.layers.length});
+    this.elements = createSizedArray(animData.layers.length);
 
     this.updateContainerSize();
 };
diff --git a/player/js/renderers/SVGRenderer.js b/player/js/renderers/SVGRenderer.js
index e696aef..d182a39 100644
--- a/player/js/renderers/SVGRenderer.js
+++ b/player/js/renderers/SVGRenderer.js
@@ -111,7 +111,7 @@
     this.layers = animData.layers;
     this.globalData.fontManager.addChars(animData.chars);
     this.globalData.fontManager.addFonts(animData.fonts,defs);
-    this.elements = Array.apply(null,{length:animData.layers.length});
+    this.elements = createSizedArray(animData.layers.length);
 };
 
 
diff --git a/player/js/utils/bez.js b/player/js/utils/bez.js
index c338072..87334e1 100644
--- a/player/js/utils/bez.js
+++ b/player/js/utils/bez.js
@@ -120,7 +120,7 @@
             var bezierData = new BezierData(curveSegments);
             len = pt3.length;
             for (k = 0; k < curveSegments; k += 1) {
-                point = Array.apply(null,{length:len});
+                point = createSizedArray(len);
                 perc = k / (curveSegments - 1);
                 ptDistance = 0;
                 for (i = 0; i < len; i += 1){
diff --git a/player/js/utils/common.js b/player/js/utils/common.js
index 791d93f..fdb94f3 100644
--- a/player/js/utils/common.js
+++ b/player/js/utils/common.js
@@ -28,7 +28,7 @@
 BMMath.abs = function(val){
     var tOfVal = typeof val;
     if(tOfVal === 'object' && val.length){
-        var absArr = Array.apply(null,{length:val.length});
+        var absArr = createSizedArray(val.length);
         var i, len = val.length;
         for(i=0;i<len;i+=1){
             absArr[i] = Math.abs(val[i]);
diff --git a/player/js/utils/expressions/ExpressionPropertyDecorator.js b/player/js/utils/expressions/ExpressionPropertyDecorator.js
index 326ac97..2ee0e27 100644
--- a/player/js/utils/expressions/ExpressionPropertyDecorator.js
+++ b/player/js/utils/expressions/ExpressionPropertyDecorator.js
@@ -294,7 +294,7 @@
             var i, len = shapePath._length;
             var vertices = shapePath[prop];
             var points = shapePath.v;
-            var arr = Array.apply(null,{length:len})
+            var arr = createSizedArray(len);
             for(i = 0; i < len; i += 1) {
                 if(prop === 'i' || prop === 'o') {
                     arr[i] = [vertices[i][0] - points[i][0], vertices[i][1] - points[i][1]]
diff --git a/player/js/utils/expressions/MaskInterface.js b/player/js/utils/expressions/MaskInterface.js
index ce4b109..06971c9 100644
--- a/player/js/utils/expressions/MaskInterface.js
+++ b/player/js/utils/expressions/MaskInterface.js
@@ -16,7 +16,7 @@
 	var MaskManager = function(maskManager, elem){
 		var _maskManager = maskManager;
 		var _elem = elem;
-		var _masksInterfaces = Array.apply(null,{length: maskManager.viewData.length});
+		var _masksInterfaces = createSizedArray(maskManager.viewData.length);
 		var i, len = maskManager.viewData.length;
 		for(i = 0; i < len; i += 1) {
 			_masksInterfaces[i] = new MaskInterface(maskManager.viewData[i], maskManager.masksProperties[i]);
diff --git a/player/js/utils/helpers/arrays.js b/player/js/utils/helpers/arrays.js
index 6ce7ce7..d154233 100644
--- a/player/js/utils/helpers/arrays.js
+++ b/player/js/utils/helpers/arrays.js
@@ -29,4 +29,8 @@
 	} else {
 		return createRegularArray
 	}
-}())
\ No newline at end of file
+}())
+
+function createSizedArray(len) {
+	return Array.apply(null,{length:len})
+}
\ No newline at end of file
diff --git a/player/js/utils/pooling/pool_factory.js b/player/js/utils/pooling/pool_factory.js
index 00fd6bd..2e8718b 100644
--- a/player/js/utils/pooling/pool_factory.js
+++ b/player/js/utils/pooling/pool_factory.js
@@ -3,7 +3,7 @@
 
 		var _length = 0;
 		var _maxLength = initialLength;
-		var pool = Array.apply(null, {length: _maxLength});
+		var pool = createSizedArray(_maxLength);
 
 		var ob = {
 			newElement: newElement,
diff --git a/player/js/utils/pooling/pooling.js b/player/js/utils/pooling/pooling.js
index a8c19ba..0b88ab6 100644
--- a/player/js/utils/pooling/pooling.js
+++ b/player/js/utils/pooling/pooling.js
@@ -1,7 +1,7 @@
 var pooling = (function(){
 
 	function double(arr){
-		return arr.concat(Array.apply(null,{length:arr.length}))
+		return arr.concat(createSizedArray(arr.length));
 	}
 
 	return {
diff --git a/player/js/utils/pooling/shapeCollection_pool.js b/player/js/utils/pooling/shapeCollection_pool.js
index 6f41d06..c4a0ad9 100644
--- a/player/js/utils/pooling/shapeCollection_pool.js
+++ b/player/js/utils/pooling/shapeCollection_pool.js
@@ -6,7 +6,7 @@
 
 	var _length = 0;
 	var _maxLength = 4;
-	var pool = Array.apply(null,{length:_maxLength});
+	var pool = createSizedArray(_maxLength);
 
 	function newShapeCollection(){
 		var shapeCollection;
diff --git a/player/js/utils/shapes/DashProperty.js b/player/js/utils/shapes/DashProperty.js
index b4e8369..7d0c98c 100644
--- a/player/js/utils/shapes/DashProperty.js
+++ b/player/js/utils/shapes/DashProperty.js
@@ -1,7 +1,7 @@
 function DashProperty(elem, data, renderer, dynamicProperties) {
     this.elem = elem;
     this.frameId = -1;
-    this.dataProps = Array.apply(null,{length:data.length});
+    this.dataProps = createSizedArray(data.length);
     this.renderer = renderer;
     this.mdf = false;
     this.k = false;
diff --git a/player/js/utils/shapes/ShapeCollection.js b/player/js/utils/shapes/ShapeCollection.js
index a7d1b22..811dc7f 100644
--- a/player/js/utils/shapes/ShapeCollection.js
+++ b/player/js/utils/shapes/ShapeCollection.js
@@ -1,12 +1,12 @@
 function ShapeCollection(){
 	this._length = 0;
 	this._maxLength = 4;
-	this.shapes = Array.apply(null,{length:this._maxLength});
+	this.shapes = createSizedArray(this._maxLength);
 };
 
 ShapeCollection.prototype.addShape = function(shapeData){
 	if(this._length === this._maxLength){
-		this.shapes = this.shapes.concat(Array.apply(null,{length:this._maxLength}));
+		this.shapes = this.shapes.concat(createSizedArray(this._maxLength));
 		this._maxLength *= 2;
 	}
 	this.shapes[this._length] = shapeData;
diff --git a/player/js/utils/shapes/ShapePath.js b/player/js/utils/shapes/ShapePath.js
index fd65fbe..89c5501 100644
--- a/player/js/utils/shapes/ShapePath.js
+++ b/player/js/utils/shapes/ShapePath.js
@@ -2,9 +2,9 @@
 	this.c = false;
 	this._length = 0;
 	this._maxLength = 8;
-	this.v = Array.apply(null,{length:this._maxLength});
-	this.o = Array.apply(null,{length:this._maxLength});
-	this.i = Array.apply(null,{length:this._maxLength});
+	this.v = createSizedArray(this._maxLength);
+	this.o = createSizedArray(this._maxLength);
+	this.i = createSizedArray(this._maxLength);
 };
 
 ShapePath.prototype.setPathData = function(closed, len) {
@@ -27,9 +27,9 @@
 }
 
 ShapePath.prototype.doubleArrayLength = function() {
-	this.v = this.v.concat(Array.apply(null,{length:this._maxLength}))
-	this.i = this.i.concat(Array.apply(null,{length:this._maxLength}))
-	this.o = this.o.concat(Array.apply(null,{length:this._maxLength}))
+	this.v = this.v.concat(createSizedArray(this._maxLength))
+	this.i = this.i.concat(createSizedArray(this._maxLength))
+	this.o = this.o.concat(createSizedArray(this._maxLength))
 	this._maxLength *= 2;
 };
 
diff --git a/player/js/utils/shapes/ShapeProperty.js b/player/js/utils/shapes/ShapeProperty.js
index 9947641..db24974 100644
--- a/player/js/utils/shapes/ShapeProperty.js
+++ b/player/js/utils/shapes/ShapeProperty.js
@@ -227,9 +227,9 @@
 
         return function EllShapeProperty(elem,data) {
             /*this.v = {
-                v: Array.apply(null,{length:4}),
-                i: Array.apply(null,{length:4}),
-                o: Array.apply(null,{length:4}),
+                v: createSizedArray(4),
+                i: createSizedArray(4),
+                o: createSizedArray(4),
                 c: true
             };*/
             this.v = shape_pool.newElement();
diff --git a/player/js/utils/text/TextAnimatorProperty.js b/player/js/utils/text/TextAnimatorProperty.js
index 4b4c903..545d462 100644
--- a/player/js/utils/text/TextAnimatorProperty.js
+++ b/player/js/utils/text/TextAnimatorProperty.js
@@ -7,7 +7,7 @@
 	this._textData = textData;
 	this._renderType = renderType;
 	this._elem = elem;
-	this._animatorsData = Array.apply(null,{length:this._textData.a.length});
+	this._animatorsData = createSizedArray(this._textData.a.length);
 	this._pathData = {}
 	this._moreOptions = {
 		alignment: {}
