font fixes
diff --git a/player/index.html b/player/index.html
index e62da68..2c7e787 100644
--- a/player/index.html
+++ b/player/index.html
@@ -120,7 +120,7 @@
     var animData = {
         container: elem,
         renderer: 'svg',
-        loop: true,
+        loop: false,
         autoplay: true,
         rendererSettings: {
             progressiveLoad:false
diff --git a/player/js/utils/FontManager.js b/player/js/utils/FontManager.js
index 21fa53e..e08041f 100644
--- a/player/js/utils/FontManager.js
+++ b/player/js/utils/FontManager.js
@@ -37,7 +37,7 @@
                 loadedCount -= 1;
                 continue;
             }
-            if(this.fonts[i].fOrigin === 't'){
+            if(this.fonts[i].fOrigin === 't' || this.fonts[i].origin === 2){
                 if(window.Typekit && window.Typekit.load && this.typekitLoaded === 0){
                     this.typekitLoaded = 1;
                     try{window.Typekit.load({
@@ -50,7 +50,7 @@
                 if(this.typekitLoaded === 2) {
                     this.fonts[i].loaded = true;
                 }
-            } else if(this.fonts[i].fOrigin === 'n'){
+            } else if(this.fonts[i].fOrigin === 'n' || this.fonts[i].origin === 0){
                 this.fonts[i].loaded = true;
             } else{
                 node = this.fonts[i].monoCase.node;
@@ -118,19 +118,19 @@
             fontArr[i].sansCase = setUpNode(fontArr[i].fFamily,'sans-serif');
             if(!fontArr[i].fPath) {
                 fontArr[i].loaded = true;
-            }else if(fontArr[i].fOrigin === 'p'){
+            }else if(fontArr[i].fOrigin === 'p' || fontArr[i].origin === 3){
                 var s = document.createElement('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'){
+            } 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 = document.createElement('link');
                 l.type = "text/css";
                 l.rel = "stylesheet";
                 l.href = fontArr[i].fPath;
                 defs.appendChild(l);
-            } else if(fontArr[i].fOrigin === 't'){
+            } 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 = document.createElement('script');
                 sc.setAttribute('src',fontArr[i].fPath);
diff --git a/player/js/utils/expressions/ExpressionManager.js b/player/js/utils/expressions/ExpressionManager.js
index ea967d0..b330971 100644
--- a/player/js/utils/expressions/ExpressionManager.js
+++ b/player/js/utils/expressions/ExpressionManager.js
@@ -69,10 +69,11 @@
             return b;
         }
         if(a.constructor === Array && b.constructor === Array){
+            
             var i = 0, lenA = a.length, lenB = b.length;
             var retArr = [];
             while(i<lenA || i < lenB){
-                if(typeof a[i] === 'number' && typeof b[i] === 'number'){
+                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];
@@ -103,7 +104,7 @@
             var i = 0, lenA = a.length, lenB = b.length;
             var retArr = [];
             while(i<lenA || i < lenB){
-                if(typeof a[i] === 'number' && typeof b[i] === 'number'){
+                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];
@@ -322,7 +323,7 @@
         var outPoint = elem.data.op/elem.comp.globalData.frameRate;
         var width = elem.data.sw ? elem.data.sw : 0;
         var height = elem.data.sh ? elem.data.sh : 0;
-        var thisLayer,thisComp;
+        var toWorld,fromWorld,anchorPoint,thisLayer,thisComp;
         var fn = new Function();
         //var fnStr = 'var fn = function(){'+val+';this.v = $bm_rt;}';
         //eval(fnStr);
@@ -596,9 +597,8 @@
             }
             return t*fps;
         }
-
-        var toworldMatrix = new Matrix();
-        function toWorld(arr){
+        /*var toworldMatrix = new Matrix();
+        function toWorld(arr, time){
             toworldMatrix.reset();
             elem.finalTransform.mProp.applyToMatrix(toworldMatrix);
             if(elem.hierarchy && elem.hierarchy.length){
@@ -609,9 +609,9 @@
                 return toworldMatrix.applyToPointArray(arr[0],arr[1],arr[2]||0);
             }
             return toworldMatrix.applyToPointArray(arr[0],arr[1],arr[2]||0);
-        }
+        }*/
 
-        var fromworldMatrix = new Matrix();
+        /*var fromworldMatrix = new Matrix();
         function fromWorld(arr){
             fromworldMatrix.reset();
             var pts = [];
@@ -625,7 +625,7 @@
                 return fromworldMatrix.inversePoints(pts)[0];
             }
             return fromworldMatrix.inversePoints(pts)[0];
-        }
+        }*/
 
         function seedRandom(seed){
             BMMath.seedrandom(randSeed + seed);
@@ -655,10 +655,14 @@
             if(!thisLayer){
                 thisLayer = elem.layerInterface;
                 thisComp = elem.comp.compInterface;
+                 toWorld = thisLayer.toWorld.bind(thisLayer);
+                 fromWorld = thisLayer.fromWorld.bind(thisLayer);
             }
             if(!transform){
                 transform = elem.layerInterface("ADBE Transform Group");
             }
+            anchorPoint = transform.anchorPoint
+            
             if(elemType === 4 && !content){
                 content = thisLayer("ADBE Root Vectors Group");
             }
@@ -678,6 +682,7 @@
             if(needsVelocity){
                 velocity = velocityAtTime(time);
             }
+
             bindedFn();
             this.frameExpressionId = elem.globalData.frameId;
             var i,len;
diff --git a/player/js/utils/expressions/ExpressionPropertyDecorator.js b/player/js/utils/expressions/ExpressionPropertyDecorator.js
index b8c75bd..3c6cb10 100644
--- a/player/js/utils/expressions/ExpressionPropertyDecorator.js
+++ b/player/js/utils/expressions/ExpressionPropertyDecorator.js
@@ -194,6 +194,14 @@
         }
     }
 
+    function getTransformValueAtTime(time) {
+        console.log('time:', time)
+    }
+
+    function getTransformStaticValueAtTime(time) {
+
+    }
+
     var TextExpressionSelectorProp = (function(){
 
         function getValueProxy(index,total){
@@ -229,10 +237,18 @@
     PropertyFactory.getProp = function(elem,data,type, mult, arr){
         var prop = propertyGetProp(elem,data,type, mult, arr);
         prop.getVelocityAtTime = getVelocityAtTime;
-        if(prop.kf){
-            prop.getValueAtTime = getValueAtTime.bind(prop);
+        if(type === 2) {
+            if(prop.dynamicProperties.length) {
+                prop.getValueAtTime = getTransformValueAtTime.bind(prop);
+            } else {
+                prop.getValueAtTime = getTransformStaticValueAtTime.bind(prop);
+            }
         } else {
-            prop.getValueAtTime = getStaticValueAtTime.bind(prop);
+            if(prop.kf){
+                prop.getValueAtTime = getValueAtTime.bind(prop);
+            } else {
+                prop.getValueAtTime = getStaticValueAtTime.bind(prop);
+            }
         }
         prop.setGroupProperty = setGroupProperty;
         var isAdded = prop.k;
diff --git a/player/js/utils/expressions/LayerInterface.js b/player/js/utils/expressions/LayerInterface.js
index f47ef8e..9e568c3 100644
--- a/player/js/utils/expressions/LayerInterface.js
+++ b/player/js/utils/expressions/LayerInterface.js
@@ -1,8 +1,16 @@
 var LayerExpressionInterface = (function (){
-    function toWorld(arr){
+    function toWorld(arr, time){
         var toWorldMat = new Matrix();
         toWorldMat.reset();
-        this._elem.finalTransform.mProp.applyToMatrix(toWorldMat);
+        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){
@@ -12,6 +20,28 @@
         }
         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){
+                console.log(this._elem.hierarchy[i].finalTransform.mProp.getValueAtTime)
+                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();
@@ -55,6 +85,7 @@
             }
         }
         _thisLayerFunction.toWorld = toWorld;
+        _thisLayerFunction.fromWorld = fromWorld;
         _thisLayerFunction.toComp = toWorld;
         _thisLayerFunction.fromComp = fromComp;
         _thisLayerFunction._elem = elem;