import Clip from './Clip.js'; 
 | 
import * as color from '../tool/color.js'; 
 | 
import { eqNaN, extend, isArrayLike, isFunction, isGradientObject, isNumber, isString, keys, logError, map } from '../core/util.js'; 
 | 
import easingFuncs from './easing.js'; 
 | 
import { createCubicEasingFunc } from './cubicEasing.js'; 
 | 
import { isLinearGradient, isRadialGradient } from '../svg/helper.js'; 
 | 
; 
 | 
var arraySlice = Array.prototype.slice; 
 | 
function interpolateNumber(p0, p1, percent) { 
 | 
    return (p1 - p0) * percent + p0; 
 | 
} 
 | 
function interpolate1DArray(out, p0, p1, percent) { 
 | 
    var len = p0.length; 
 | 
    for (var i = 0; i < len; i++) { 
 | 
        out[i] = interpolateNumber(p0[i], p1[i], percent); 
 | 
    } 
 | 
    return out; 
 | 
} 
 | 
function interpolate2DArray(out, p0, p1, percent) { 
 | 
    var len = p0.length; 
 | 
    var len2 = len && p0[0].length; 
 | 
    for (var i = 0; i < len; i++) { 
 | 
        if (!out[i]) { 
 | 
            out[i] = []; 
 | 
        } 
 | 
        for (var j = 0; j < len2; j++) { 
 | 
            out[i][j] = interpolateNumber(p0[i][j], p1[i][j], percent); 
 | 
        } 
 | 
    } 
 | 
    return out; 
 | 
} 
 | 
function add1DArray(out, p0, p1, sign) { 
 | 
    var len = p0.length; 
 | 
    for (var i = 0; i < len; i++) { 
 | 
        out[i] = p0[i] + p1[i] * sign; 
 | 
    } 
 | 
    return out; 
 | 
} 
 | 
function add2DArray(out, p0, p1, sign) { 
 | 
    var len = p0.length; 
 | 
    var len2 = len && p0[0].length; 
 | 
    for (var i = 0; i < len; i++) { 
 | 
        if (!out[i]) { 
 | 
            out[i] = []; 
 | 
        } 
 | 
        for (var j = 0; j < len2; j++) { 
 | 
            out[i][j] = p0[i][j] + p1[i][j] * sign; 
 | 
        } 
 | 
    } 
 | 
    return out; 
 | 
} 
 | 
function fillColorStops(val0, val1) { 
 | 
    var len0 = val0.length; 
 | 
    var len1 = val1.length; 
 | 
    var shorterArr = len0 > len1 ? val1 : val0; 
 | 
    var shorterLen = Math.min(len0, len1); 
 | 
    var last = shorterArr[shorterLen - 1] || { color: [0, 0, 0, 0], offset: 0 }; 
 | 
    for (var i = shorterLen; i < Math.max(len0, len1); i++) { 
 | 
        shorterArr.push({ 
 | 
            offset: last.offset, 
 | 
            color: last.color.slice() 
 | 
        }); 
 | 
    } 
 | 
} 
 | 
function fillArray(val0, val1, arrDim) { 
 | 
    var arr0 = val0; 
 | 
    var arr1 = val1; 
 | 
    if (!arr0.push || !arr1.push) { 
 | 
        return; 
 | 
    } 
 | 
    var arr0Len = arr0.length; 
 | 
    var arr1Len = arr1.length; 
 | 
    if (arr0Len !== arr1Len) { 
 | 
        var isPreviousLarger = arr0Len > arr1Len; 
 | 
        if (isPreviousLarger) { 
 | 
            arr0.length = arr1Len; 
 | 
        } 
 | 
        else { 
 | 
            for (var i = arr0Len; i < arr1Len; i++) { 
 | 
                arr0.push(arrDim === 1 ? arr1[i] : arraySlice.call(arr1[i])); 
 | 
            } 
 | 
        } 
 | 
    } 
 | 
    var len2 = arr0[0] && arr0[0].length; 
 | 
    for (var i = 0; i < arr0.length; i++) { 
 | 
        if (arrDim === 1) { 
 | 
            if (isNaN(arr0[i])) { 
 | 
                arr0[i] = arr1[i]; 
 | 
            } 
 | 
        } 
 | 
        else { 
 | 
            for (var j = 0; j < len2; j++) { 
 | 
                if (isNaN(arr0[i][j])) { 
 | 
                    arr0[i][j] = arr1[i][j]; 
 | 
                } 
 | 
            } 
 | 
        } 
 | 
    } 
 | 
} 
 | 
export function cloneValue(value) { 
 | 
    if (isArrayLike(value)) { 
 | 
        var len = value.length; 
 | 
        if (isArrayLike(value[0])) { 
 | 
            var ret = []; 
 | 
            for (var i = 0; i < len; i++) { 
 | 
                ret.push(arraySlice.call(value[i])); 
 | 
            } 
 | 
            return ret; 
 | 
        } 
 | 
        return arraySlice.call(value); 
 | 
    } 
 | 
    return value; 
 | 
} 
 | 
function rgba2String(rgba) { 
 | 
    rgba[0] = Math.floor(rgba[0]) || 0; 
 | 
    rgba[1] = Math.floor(rgba[1]) || 0; 
 | 
    rgba[2] = Math.floor(rgba[2]) || 0; 
 | 
    rgba[3] = rgba[3] == null ? 1 : rgba[3]; 
 | 
    return 'rgba(' + rgba.join(',') + ')'; 
 | 
} 
 | 
function guessArrayDim(value) { 
 | 
    return isArrayLike(value && value[0]) ? 2 : 1; 
 | 
} 
 | 
var VALUE_TYPE_NUMBER = 0; 
 | 
var VALUE_TYPE_1D_ARRAY = 1; 
 | 
var VALUE_TYPE_2D_ARRAY = 2; 
 | 
var VALUE_TYPE_COLOR = 3; 
 | 
var VALUE_TYPE_LINEAR_GRADIENT = 4; 
 | 
var VALUE_TYPE_RADIAL_GRADIENT = 5; 
 | 
var VALUE_TYPE_UNKOWN = 6; 
 | 
function isGradientValueType(valType) { 
 | 
    return valType === VALUE_TYPE_LINEAR_GRADIENT || valType === VALUE_TYPE_RADIAL_GRADIENT; 
 | 
} 
 | 
function isArrayValueType(valType) { 
 | 
    return valType === VALUE_TYPE_1D_ARRAY || valType === VALUE_TYPE_2D_ARRAY; 
 | 
} 
 | 
var tmpRgba = [0, 0, 0, 0]; 
 | 
var Track = (function () { 
 | 
    function Track(propName) { 
 | 
        this.keyframes = []; 
 | 
        this.discrete = false; 
 | 
        this._invalid = false; 
 | 
        this._needsSort = false; 
 | 
        this._lastFr = 0; 
 | 
        this._lastFrP = 0; 
 | 
        this.propName = propName; 
 | 
    } 
 | 
    Track.prototype.isFinished = function () { 
 | 
        return this._finished; 
 | 
    }; 
 | 
    Track.prototype.setFinished = function () { 
 | 
        this._finished = true; 
 | 
        if (this._additiveTrack) { 
 | 
            this._additiveTrack.setFinished(); 
 | 
        } 
 | 
    }; 
 | 
    Track.prototype.needsAnimate = function () { 
 | 
        return this.keyframes.length >= 1; 
 | 
    }; 
 | 
    Track.prototype.getAdditiveTrack = function () { 
 | 
        return this._additiveTrack; 
 | 
    }; 
 | 
    Track.prototype.addKeyframe = function (time, rawValue, easing) { 
 | 
        this._needsSort = true; 
 | 
        var keyframes = this.keyframes; 
 | 
        var len = keyframes.length; 
 | 
        var discrete = false; 
 | 
        var valType = VALUE_TYPE_UNKOWN; 
 | 
        var value = rawValue; 
 | 
        if (isArrayLike(rawValue)) { 
 | 
            var arrayDim = guessArrayDim(rawValue); 
 | 
            valType = arrayDim; 
 | 
            if (arrayDim === 1 && !isNumber(rawValue[0]) 
 | 
                || arrayDim === 2 && !isNumber(rawValue[0][0])) { 
 | 
                discrete = true; 
 | 
            } 
 | 
        } 
 | 
        else { 
 | 
            if (isNumber(rawValue) && !eqNaN(rawValue)) { 
 | 
                valType = VALUE_TYPE_NUMBER; 
 | 
            } 
 | 
            else if (isString(rawValue)) { 
 | 
                if (!isNaN(+rawValue)) { 
 | 
                    valType = VALUE_TYPE_NUMBER; 
 | 
                } 
 | 
                else { 
 | 
                    var colorArray = color.parse(rawValue); 
 | 
                    if (colorArray) { 
 | 
                        value = colorArray; 
 | 
                        valType = VALUE_TYPE_COLOR; 
 | 
                    } 
 | 
                } 
 | 
            } 
 | 
            else if (isGradientObject(rawValue)) { 
 | 
                var parsedGradient = extend({}, value); 
 | 
                parsedGradient.colorStops = map(rawValue.colorStops, function (colorStop) { return ({ 
 | 
                    offset: colorStop.offset, 
 | 
                    color: color.parse(colorStop.color) 
 | 
                }); }); 
 | 
                if (isLinearGradient(rawValue)) { 
 | 
                    valType = VALUE_TYPE_LINEAR_GRADIENT; 
 | 
                } 
 | 
                else if (isRadialGradient(rawValue)) { 
 | 
                    valType = VALUE_TYPE_RADIAL_GRADIENT; 
 | 
                } 
 | 
                value = parsedGradient; 
 | 
            } 
 | 
        } 
 | 
        if (len === 0) { 
 | 
            this.valType = valType; 
 | 
        } 
 | 
        else if (valType !== this.valType || valType === VALUE_TYPE_UNKOWN) { 
 | 
            discrete = true; 
 | 
        } 
 | 
        this.discrete = this.discrete || discrete; 
 | 
        var kf = { 
 | 
            time: time, 
 | 
            value: value, 
 | 
            rawValue: rawValue, 
 | 
            percent: 0 
 | 
        }; 
 | 
        if (easing) { 
 | 
            kf.easing = easing; 
 | 
            kf.easingFunc = isFunction(easing) 
 | 
                ? easing 
 | 
                : easingFuncs[easing] || createCubicEasingFunc(easing); 
 | 
        } 
 | 
        keyframes.push(kf); 
 | 
        return kf; 
 | 
    }; 
 | 
    Track.prototype.prepare = function (maxTime, additiveTrack) { 
 | 
        var kfs = this.keyframes; 
 | 
        if (this._needsSort) { 
 | 
            kfs.sort(function (a, b) { 
 | 
                return a.time - b.time; 
 | 
            }); 
 | 
        } 
 | 
        var valType = this.valType; 
 | 
        var kfsLen = kfs.length; 
 | 
        var lastKf = kfs[kfsLen - 1]; 
 | 
        var isDiscrete = this.discrete; 
 | 
        var isArr = isArrayValueType(valType); 
 | 
        var isGradient = isGradientValueType(valType); 
 | 
        for (var i = 0; i < kfsLen; i++) { 
 | 
            var kf = kfs[i]; 
 | 
            var value = kf.value; 
 | 
            var lastValue = lastKf.value; 
 | 
            kf.percent = kf.time / maxTime; 
 | 
            if (!isDiscrete) { 
 | 
                if (isArr && i !== kfsLen - 1) { 
 | 
                    fillArray(value, lastValue, valType); 
 | 
                } 
 | 
                else if (isGradient) { 
 | 
                    fillColorStops(value.colorStops, lastValue.colorStops); 
 | 
                } 
 | 
            } 
 | 
        } 
 | 
        if (!isDiscrete 
 | 
            && valType !== VALUE_TYPE_RADIAL_GRADIENT 
 | 
            && additiveTrack 
 | 
            && this.needsAnimate() 
 | 
            && additiveTrack.needsAnimate() 
 | 
            && valType === additiveTrack.valType 
 | 
            && !additiveTrack._finished) { 
 | 
            this._additiveTrack = additiveTrack; 
 | 
            var startValue = kfs[0].value; 
 | 
            for (var i = 0; i < kfsLen; i++) { 
 | 
                if (valType === VALUE_TYPE_NUMBER) { 
 | 
                    kfs[i].additiveValue = kfs[i].value - startValue; 
 | 
                } 
 | 
                else if (valType === VALUE_TYPE_COLOR) { 
 | 
                    kfs[i].additiveValue = 
 | 
                        add1DArray([], kfs[i].value, startValue, -1); 
 | 
                } 
 | 
                else if (isArrayValueType(valType)) { 
 | 
                    kfs[i].additiveValue = valType === VALUE_TYPE_1D_ARRAY 
 | 
                        ? add1DArray([], kfs[i].value, startValue, -1) 
 | 
                        : add2DArray([], kfs[i].value, startValue, -1); 
 | 
                } 
 | 
            } 
 | 
        } 
 | 
    }; 
 | 
    Track.prototype.step = function (target, percent) { 
 | 
        if (this._finished) { 
 | 
            return; 
 | 
        } 
 | 
        if (this._additiveTrack && this._additiveTrack._finished) { 
 | 
            this._additiveTrack = null; 
 | 
        } 
 | 
        var isAdditive = this._additiveTrack != null; 
 | 
        var valueKey = isAdditive ? 'additiveValue' : 'value'; 
 | 
        var valType = this.valType; 
 | 
        var keyframes = this.keyframes; 
 | 
        var kfsNum = keyframes.length; 
 | 
        var propName = this.propName; 
 | 
        var isValueColor = valType === VALUE_TYPE_COLOR; 
 | 
        var frameIdx; 
 | 
        var lastFrame = this._lastFr; 
 | 
        var mathMin = Math.min; 
 | 
        var frame; 
 | 
        var nextFrame; 
 | 
        if (kfsNum === 1) { 
 | 
            frame = nextFrame = keyframes[0]; 
 | 
        } 
 | 
        else { 
 | 
            if (percent < 0) { 
 | 
                frameIdx = 0; 
 | 
            } 
 | 
            else if (percent < this._lastFrP) { 
 | 
                var start = mathMin(lastFrame + 1, kfsNum - 1); 
 | 
                for (frameIdx = start; frameIdx >= 0; frameIdx--) { 
 | 
                    if (keyframes[frameIdx].percent <= percent) { 
 | 
                        break; 
 | 
                    } 
 | 
                } 
 | 
                frameIdx = mathMin(frameIdx, kfsNum - 2); 
 | 
            } 
 | 
            else { 
 | 
                for (frameIdx = lastFrame; frameIdx < kfsNum; frameIdx++) { 
 | 
                    if (keyframes[frameIdx].percent > percent) { 
 | 
                        break; 
 | 
                    } 
 | 
                } 
 | 
                frameIdx = mathMin(frameIdx - 1, kfsNum - 2); 
 | 
            } 
 | 
            nextFrame = keyframes[frameIdx + 1]; 
 | 
            frame = keyframes[frameIdx]; 
 | 
        } 
 | 
        if (!(frame && nextFrame)) { 
 | 
            return; 
 | 
        } 
 | 
        this._lastFr = frameIdx; 
 | 
        this._lastFrP = percent; 
 | 
        var interval = (nextFrame.percent - frame.percent); 
 | 
        var w = interval === 0 ? 1 : mathMin((percent - frame.percent) / interval, 1); 
 | 
        if (nextFrame.easingFunc) { 
 | 
            w = nextFrame.easingFunc(w); 
 | 
        } 
 | 
        var targetArr = isAdditive ? this._additiveValue 
 | 
            : (isValueColor ? tmpRgba : target[propName]); 
 | 
        if ((isArrayValueType(valType) || isValueColor) && !targetArr) { 
 | 
            targetArr = this._additiveValue = []; 
 | 
        } 
 | 
        if (this.discrete) { 
 | 
            target[propName] = w < 1 ? frame.rawValue : nextFrame.rawValue; 
 | 
        } 
 | 
        else if (isArrayValueType(valType)) { 
 | 
            valType === VALUE_TYPE_1D_ARRAY 
 | 
                ? interpolate1DArray(targetArr, frame[valueKey], nextFrame[valueKey], w) 
 | 
                : interpolate2DArray(targetArr, frame[valueKey], nextFrame[valueKey], w); 
 | 
        } 
 | 
        else if (isGradientValueType(valType)) { 
 | 
            var val = frame[valueKey]; 
 | 
            var nextVal_1 = nextFrame[valueKey]; 
 | 
            var isLinearGradient_1 = valType === VALUE_TYPE_LINEAR_GRADIENT; 
 | 
            target[propName] = { 
 | 
                type: isLinearGradient_1 ? 'linear' : 'radial', 
 | 
                x: interpolateNumber(val.x, nextVal_1.x, w), 
 | 
                y: interpolateNumber(val.y, nextVal_1.y, w), 
 | 
                colorStops: map(val.colorStops, function (colorStop, idx) { 
 | 
                    var nextColorStop = nextVal_1.colorStops[idx]; 
 | 
                    return { 
 | 
                        offset: interpolateNumber(colorStop.offset, nextColorStop.offset, w), 
 | 
                        color: rgba2String(interpolate1DArray([], colorStop.color, nextColorStop.color, w)) 
 | 
                    }; 
 | 
                }), 
 | 
                global: nextVal_1.global 
 | 
            }; 
 | 
            if (isLinearGradient_1) { 
 | 
                target[propName].x2 = interpolateNumber(val.x2, nextVal_1.x2, w); 
 | 
                target[propName].y2 = interpolateNumber(val.y2, nextVal_1.y2, w); 
 | 
            } 
 | 
            else { 
 | 
                target[propName].r = interpolateNumber(val.r, nextVal_1.r, w); 
 | 
            } 
 | 
        } 
 | 
        else if (isValueColor) { 
 | 
            interpolate1DArray(targetArr, frame[valueKey], nextFrame[valueKey], w); 
 | 
            if (!isAdditive) { 
 | 
                target[propName] = rgba2String(targetArr); 
 | 
            } 
 | 
        } 
 | 
        else { 
 | 
            var value = interpolateNumber(frame[valueKey], nextFrame[valueKey], w); 
 | 
            if (isAdditive) { 
 | 
                this._additiveValue = value; 
 | 
            } 
 | 
            else { 
 | 
                target[propName] = value; 
 | 
            } 
 | 
        } 
 | 
        if (isAdditive) { 
 | 
            this._addToTarget(target); 
 | 
        } 
 | 
    }; 
 | 
    Track.prototype._addToTarget = function (target) { 
 | 
        var valType = this.valType; 
 | 
        var propName = this.propName; 
 | 
        var additiveValue = this._additiveValue; 
 | 
        if (valType === VALUE_TYPE_NUMBER) { 
 | 
            target[propName] = target[propName] + additiveValue; 
 | 
        } 
 | 
        else if (valType === VALUE_TYPE_COLOR) { 
 | 
            color.parse(target[propName], tmpRgba); 
 | 
            add1DArray(tmpRgba, tmpRgba, additiveValue, 1); 
 | 
            target[propName] = rgba2String(tmpRgba); 
 | 
        } 
 | 
        else if (valType === VALUE_TYPE_1D_ARRAY) { 
 | 
            add1DArray(target[propName], target[propName], additiveValue, 1); 
 | 
        } 
 | 
        else if (valType === VALUE_TYPE_2D_ARRAY) { 
 | 
            add2DArray(target[propName], target[propName], additiveValue, 1); 
 | 
        } 
 | 
    }; 
 | 
    return Track; 
 | 
}()); 
 | 
var Animator = (function () { 
 | 
    function Animator(target, loop, allowDiscreteAnimation, additiveTo) { 
 | 
        this._tracks = {}; 
 | 
        this._trackKeys = []; 
 | 
        this._maxTime = 0; 
 | 
        this._started = 0; 
 | 
        this._clip = null; 
 | 
        this._target = target; 
 | 
        this._loop = loop; 
 | 
        if (loop && additiveTo) { 
 | 
            logError('Can\' use additive animation on looped animation.'); 
 | 
            return; 
 | 
        } 
 | 
        this._additiveAnimators = additiveTo; 
 | 
        this._allowDiscrete = allowDiscreteAnimation; 
 | 
    } 
 | 
    Animator.prototype.getMaxTime = function () { 
 | 
        return this._maxTime; 
 | 
    }; 
 | 
    Animator.prototype.getDelay = function () { 
 | 
        return this._delay; 
 | 
    }; 
 | 
    Animator.prototype.getLoop = function () { 
 | 
        return this._loop; 
 | 
    }; 
 | 
    Animator.prototype.getTarget = function () { 
 | 
        return this._target; 
 | 
    }; 
 | 
    Animator.prototype.changeTarget = function (target) { 
 | 
        this._target = target; 
 | 
    }; 
 | 
    Animator.prototype.when = function (time, props, easing) { 
 | 
        return this.whenWithKeys(time, props, keys(props), easing); 
 | 
    }; 
 | 
    Animator.prototype.whenWithKeys = function (time, props, propNames, easing) { 
 | 
        var tracks = this._tracks; 
 | 
        for (var i = 0; i < propNames.length; i++) { 
 | 
            var propName = propNames[i]; 
 | 
            var track = tracks[propName]; 
 | 
            if (!track) { 
 | 
                track = tracks[propName] = new Track(propName); 
 | 
                var initialValue = void 0; 
 | 
                var additiveTrack = this._getAdditiveTrack(propName); 
 | 
                if (additiveTrack) { 
 | 
                    var addtiveTrackKfs = additiveTrack.keyframes; 
 | 
                    var lastFinalKf = addtiveTrackKfs[addtiveTrackKfs.length - 1]; 
 | 
                    initialValue = lastFinalKf && lastFinalKf.value; 
 | 
                    if (additiveTrack.valType === VALUE_TYPE_COLOR && initialValue) { 
 | 
                        initialValue = rgba2String(initialValue); 
 | 
                    } 
 | 
                } 
 | 
                else { 
 | 
                    initialValue = this._target[propName]; 
 | 
                } 
 | 
                if (initialValue == null) { 
 | 
                    continue; 
 | 
                } 
 | 
                if (time > 0) { 
 | 
                    track.addKeyframe(0, cloneValue(initialValue), easing); 
 | 
                } 
 | 
                this._trackKeys.push(propName); 
 | 
            } 
 | 
            track.addKeyframe(time, cloneValue(props[propName]), easing); 
 | 
        } 
 | 
        this._maxTime = Math.max(this._maxTime, time); 
 | 
        return this; 
 | 
    }; 
 | 
    Animator.prototype.pause = function () { 
 | 
        this._clip.pause(); 
 | 
        this._paused = true; 
 | 
    }; 
 | 
    Animator.prototype.resume = function () { 
 | 
        this._clip.resume(); 
 | 
        this._paused = false; 
 | 
    }; 
 | 
    Animator.prototype.isPaused = function () { 
 | 
        return !!this._paused; 
 | 
    }; 
 | 
    Animator.prototype.duration = function (duration) { 
 | 
        this._maxTime = duration; 
 | 
        this._force = true; 
 | 
        return this; 
 | 
    }; 
 | 
    Animator.prototype._doneCallback = function () { 
 | 
        this._setTracksFinished(); 
 | 
        this._clip = null; 
 | 
        var doneList = this._doneCbs; 
 | 
        if (doneList) { 
 | 
            var len = doneList.length; 
 | 
            for (var i = 0; i < len; i++) { 
 | 
                doneList[i].call(this); 
 | 
            } 
 | 
        } 
 | 
    }; 
 | 
    Animator.prototype._abortedCallback = function () { 
 | 
        this._setTracksFinished(); 
 | 
        var animation = this.animation; 
 | 
        var abortedList = this._abortedCbs; 
 | 
        if (animation) { 
 | 
            animation.removeClip(this._clip); 
 | 
        } 
 | 
        this._clip = null; 
 | 
        if (abortedList) { 
 | 
            for (var i = 0; i < abortedList.length; i++) { 
 | 
                abortedList[i].call(this); 
 | 
            } 
 | 
        } 
 | 
    }; 
 | 
    Animator.prototype._setTracksFinished = function () { 
 | 
        var tracks = this._tracks; 
 | 
        var tracksKeys = this._trackKeys; 
 | 
        for (var i = 0; i < tracksKeys.length; i++) { 
 | 
            tracks[tracksKeys[i]].setFinished(); 
 | 
        } 
 | 
    }; 
 | 
    Animator.prototype._getAdditiveTrack = function (trackName) { 
 | 
        var additiveTrack; 
 | 
        var additiveAnimators = this._additiveAnimators; 
 | 
        if (additiveAnimators) { 
 | 
            for (var i = 0; i < additiveAnimators.length; i++) { 
 | 
                var track = additiveAnimators[i].getTrack(trackName); 
 | 
                if (track) { 
 | 
                    additiveTrack = track; 
 | 
                } 
 | 
            } 
 | 
        } 
 | 
        return additiveTrack; 
 | 
    }; 
 | 
    Animator.prototype.start = function (easing) { 
 | 
        if (this._started > 0) { 
 | 
            return; 
 | 
        } 
 | 
        this._started = 1; 
 | 
        var self = this; 
 | 
        var tracks = []; 
 | 
        var maxTime = this._maxTime || 0; 
 | 
        for (var i = 0; i < this._trackKeys.length; i++) { 
 | 
            var propName = this._trackKeys[i]; 
 | 
            var track = this._tracks[propName]; 
 | 
            var additiveTrack = this._getAdditiveTrack(propName); 
 | 
            var kfs = track.keyframes; 
 | 
            var kfsNum = kfs.length; 
 | 
            track.prepare(maxTime, additiveTrack); 
 | 
            if (track.needsAnimate()) { 
 | 
                if (!this._allowDiscrete && track.discrete) { 
 | 
                    var lastKf = kfs[kfsNum - 1]; 
 | 
                    if (lastKf) { 
 | 
                        self._target[track.propName] = lastKf.rawValue; 
 | 
                    } 
 | 
                    track.setFinished(); 
 | 
                } 
 | 
                else { 
 | 
                    tracks.push(track); 
 | 
                } 
 | 
            } 
 | 
        } 
 | 
        if (tracks.length || this._force) { 
 | 
            var clip = new Clip({ 
 | 
                life: maxTime, 
 | 
                loop: this._loop, 
 | 
                delay: this._delay || 0, 
 | 
                onframe: function (percent) { 
 | 
                    self._started = 2; 
 | 
                    var additiveAnimators = self._additiveAnimators; 
 | 
                    if (additiveAnimators) { 
 | 
                        var stillHasAdditiveAnimator = false; 
 | 
                        for (var i = 0; i < additiveAnimators.length; i++) { 
 | 
                            if (additiveAnimators[i]._clip) { 
 | 
                                stillHasAdditiveAnimator = true; 
 | 
                                break; 
 | 
                            } 
 | 
                        } 
 | 
                        if (!stillHasAdditiveAnimator) { 
 | 
                            self._additiveAnimators = null; 
 | 
                        } 
 | 
                    } 
 | 
                    for (var i = 0; i < tracks.length; i++) { 
 | 
                        tracks[i].step(self._target, percent); 
 | 
                    } 
 | 
                    var onframeList = self._onframeCbs; 
 | 
                    if (onframeList) { 
 | 
                        for (var i = 0; i < onframeList.length; i++) { 
 | 
                            onframeList[i](self._target, percent); 
 | 
                        } 
 | 
                    } 
 | 
                }, 
 | 
                ondestroy: function () { 
 | 
                    self._doneCallback(); 
 | 
                } 
 | 
            }); 
 | 
            this._clip = clip; 
 | 
            if (this.animation) { 
 | 
                this.animation.addClip(clip); 
 | 
            } 
 | 
            if (easing) { 
 | 
                clip.setEasing(easing); 
 | 
            } 
 | 
        } 
 | 
        else { 
 | 
            this._doneCallback(); 
 | 
        } 
 | 
        return this; 
 | 
    }; 
 | 
    Animator.prototype.stop = function (forwardToLast) { 
 | 
        if (!this._clip) { 
 | 
            return; 
 | 
        } 
 | 
        var clip = this._clip; 
 | 
        if (forwardToLast) { 
 | 
            clip.onframe(1); 
 | 
        } 
 | 
        this._abortedCallback(); 
 | 
    }; 
 | 
    Animator.prototype.delay = function (time) { 
 | 
        this._delay = time; 
 | 
        return this; 
 | 
    }; 
 | 
    Animator.prototype.during = function (cb) { 
 | 
        if (cb) { 
 | 
            if (!this._onframeCbs) { 
 | 
                this._onframeCbs = []; 
 | 
            } 
 | 
            this._onframeCbs.push(cb); 
 | 
        } 
 | 
        return this; 
 | 
    }; 
 | 
    Animator.prototype.done = function (cb) { 
 | 
        if (cb) { 
 | 
            if (!this._doneCbs) { 
 | 
                this._doneCbs = []; 
 | 
            } 
 | 
            this._doneCbs.push(cb); 
 | 
        } 
 | 
        return this; 
 | 
    }; 
 | 
    Animator.prototype.aborted = function (cb) { 
 | 
        if (cb) { 
 | 
            if (!this._abortedCbs) { 
 | 
                this._abortedCbs = []; 
 | 
            } 
 | 
            this._abortedCbs.push(cb); 
 | 
        } 
 | 
        return this; 
 | 
    }; 
 | 
    Animator.prototype.getClip = function () { 
 | 
        return this._clip; 
 | 
    }; 
 | 
    Animator.prototype.getTrack = function (propName) { 
 | 
        return this._tracks[propName]; 
 | 
    }; 
 | 
    Animator.prototype.getTracks = function () { 
 | 
        var _this = this; 
 | 
        return map(this._trackKeys, function (key) { return _this._tracks[key]; }); 
 | 
    }; 
 | 
    Animator.prototype.stopTracks = function (propNames, forwardToLast) { 
 | 
        if (!propNames.length || !this._clip) { 
 | 
            return true; 
 | 
        } 
 | 
        var tracks = this._tracks; 
 | 
        var tracksKeys = this._trackKeys; 
 | 
        for (var i = 0; i < propNames.length; i++) { 
 | 
            var track = tracks[propNames[i]]; 
 | 
            if (track && !track.isFinished()) { 
 | 
                if (forwardToLast) { 
 | 
                    track.step(this._target, 1); 
 | 
                } 
 | 
                else if (this._started === 1) { 
 | 
                    track.step(this._target, 0); 
 | 
                } 
 | 
                track.setFinished(); 
 | 
            } 
 | 
        } 
 | 
        var allAborted = true; 
 | 
        for (var i = 0; i < tracksKeys.length; i++) { 
 | 
            if (!tracks[tracksKeys[i]].isFinished()) { 
 | 
                allAborted = false; 
 | 
                break; 
 | 
            } 
 | 
        } 
 | 
        if (allAborted) { 
 | 
            this._abortedCallback(); 
 | 
        } 
 | 
        return allAborted; 
 | 
    }; 
 | 
    Animator.prototype.saveTo = function (target, trackKeys, firstOrLast) { 
 | 
        if (!target) { 
 | 
            return; 
 | 
        } 
 | 
        trackKeys = trackKeys || this._trackKeys; 
 | 
        for (var i = 0; i < trackKeys.length; i++) { 
 | 
            var propName = trackKeys[i]; 
 | 
            var track = this._tracks[propName]; 
 | 
            if (!track || track.isFinished()) { 
 | 
                continue; 
 | 
            } 
 | 
            var kfs = track.keyframes; 
 | 
            var kf = kfs[firstOrLast ? 0 : kfs.length - 1]; 
 | 
            if (kf) { 
 | 
                target[propName] = cloneValue(kf.rawValue); 
 | 
            } 
 | 
        } 
 | 
    }; 
 | 
    Animator.prototype.__changeFinalValue = function (finalProps, trackKeys) { 
 | 
        trackKeys = trackKeys || keys(finalProps); 
 | 
        for (var i = 0; i < trackKeys.length; i++) { 
 | 
            var propName = trackKeys[i]; 
 | 
            var track = this._tracks[propName]; 
 | 
            if (!track) { 
 | 
                continue; 
 | 
            } 
 | 
            var kfs = track.keyframes; 
 | 
            if (kfs.length > 1) { 
 | 
                var lastKf = kfs.pop(); 
 | 
                track.addKeyframe(lastKf.time, finalProps[propName]); 
 | 
                track.prepare(this._maxTime, track.getAdditiveTrack()); 
 | 
            } 
 | 
        } 
 | 
    }; 
 | 
    return Animator; 
 | 
}()); 
 | 
export default Animator; 
 |