function ExpressionValue(elementProp, mult, type) {
  mult = mult || 1;
  var expressionValue, arrayValue;

  if (elementProp.k) {
    elementProp.getValue();
  }
  var i, len, arrValue, val;
  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] = (i < 3) ? elementProp.v[i] * mult : 1;
      }
      expressionValue.value = arrValue;
    }
  } else if (elementProp.propType === 'unidimensional') {
    val = elementProp.v * mult;
    expressionValue = new Number(val);
    expressionValue.value = val;
  } else {
    len = elementProp.pv.length;
    expressionValue = createTypedArray('float32', len);
    arrValue = createTypedArray('float32', len);
    for (i = 0; i < len; i += 1) {
      expressionValue[i] = arrValue[i] = elementProp.v[i] * mult;
    }
    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.speedAtTime = elementProp.getSpeedAtTime;
  expressionValue.velocityAtTime = elementProp.getVelocityAtTime;
  expressionValue.propertyGroup = elementProp.propertyGroup;
  Object.defineProperty(expressionValue, 'velocity', {
    get: function () {
      return elementProp.getVelocityAtTime(elementProp.comp.currentFrame);
    },
  });
  return expressionValue;
};
