var Smokescreen = function(url, element, width, height, name, params) {
    goog = {};
    goog.global = this;
    goog.provide = function(a) {
        a = a.split(".");
        var b = goog.global;
        for (var c in a) {
            var d = a[c];
            d in b || (b[d] = {});
            b = b[d]
        }
    };
    goog.require = function() {};
    var fljs = {},
    BrowserDetect = {
        init: function() {
            this.browser = this.searchString(this.dataBrowser) || "An unknown browser";
            this.version = this.searchVersion(navigator.userAgent) || this.searchVersion(navigator.appVersion) || "an unknown version";
            this.OS = this.searchString(this.dataOS) || "an unknown OS"
        },
        searchString: function(a) {
            for (var b = 0; b < a.length; b++) {
                var c = a[b].string,
                d = a[b].prop;
                this.versionSearchString = a[b].versionSearch || a[b].identity;
                if (c) {
                    if (c.indexOf(a[b].subString) != -1) return a[b].identity
                } else if (d) return a[b].identity
            }
        },
        searchVersion: function(a) {
            var b = a.indexOf(this.versionSearchString);
            if (b != -1) return parseFloat(a.substring(b + this.versionSearchString.length + 1))
        },
        dataBrowser: [{
            string: navigator.userAgent,
            subString: "Chrome",
            identity: "Chrome"
        },
        {
            string: navigator.vendor,
            subString: "Apple",
            identity: "Safari",
            versionSearch: "Version"
        },
        {
            prop: window.opera,
            identity: "Opera"
        },
        {
            string: navigator.userAgent,
            subString: "Firefox",
            identity: "Firefox"
        },
        {
            string: navigator.userAgent,
            subString: "MSIE",
            identity: "Explorer",
            versionSearch: "MSIE"
        }],
        dataOS: [{
            string: navigator.platform,
            subString: "Win",
            identity: "Windows"
        },
        {
            string: navigator.userAgent,
            subString: "iPad",
            identity: "iPad"
        },
        {
            string: navigator.userAgent,
            subString: "iPhone",
            identity: "iPhone"
        },
        {
            string: navigator.platform,
            subString: "Mac",
            identity: "Mac"
        }]
    };
    BrowserDetect.init();
    fljs.agent = BrowserDetect;
    fljs.addConstants = function(a, b) {
        for (var c in b) a[c] = b[c]
    };
    fljs.addMethods = function(a, b) {
        for (var c in b) a.prototype[c] = b[c]
    };
    fljs.addStaticMethods = function(a, b) {
        for (var c in b) a[c] = b[c]
    };
    fljs.addEvents = function(a, b) {
        for (var c in b) {
            var d = b[c],
            e = d[0],
            f = d[2];
            a.prototype["__add" + e] = d[1];
            a.prototype["__remove" + e] = f
        }
    };
    fljs.now = function() {
        return + new Date
    };
    fljs.inherits = function(a, b) {
        function c() {}
        c.prototype = b.prototype;
        a.superClass_ = b.prototype;
        a.prototype = new c;
        a.prototype.constructor = a
    };
    fljs.base = function(a, b) {
        var c = arguments.callee.caller;
        if (c.superClass_) return c.superClass_.constructor.apply(a, Array.prototype.slice.call(arguments, 1));
        for (var d = Array.prototype.slice.call(arguments, 2), e = false, f = a.constructor; f; f = f.superClass_ && f.superClass_.constructor) if (f.prototype[b] === c) e = true;
        else if (e) return f.prototype[b].apply(a, d);
        if (a[b] === c) return a.constructor.prototype[b].apply(a, d);
        else throw Error("invalid base call");
    };
    fljs.bind = function(a, b) {
        var c = b || this;
        if (arguments.length > 2) {
            var d = Array.prototype.slice.call(arguments, 2);
            return function() {
                var e = Array.prototype.slice.call(arguments);
                Array.prototype.unshift.apply(e, d);
                return a.apply(c, e)
            }
        } else return function() {
            return a.apply(c, arguments)
        }
    };
    fljs.DummyConsole = function() {};
    fljs.addMethods(fljs.DummyConsole, {
        info: function() {}
    });
    fljs.DummyConsole._instance = new fljs.DummyConsole;
    fljs.console = function() {
        return fljs.debug ? console: fljs.DummyConsole._instance
    };
    fljs.ext = {};
    var flash = {};
    flash.display = {};
    flash.display.BlendMode = function() {};
    fljs.addConstants(flash.display.BlendMode, {
        ADD: "add",
        ALPHA: "alpha",
        DARKEN: "darken",
        DIFFERENCE: "difference",
        ERASE: "erase",
        HARDLIGHT: "hardlight",
        INVERT: "invert",
        LAYER: "layer",
        LIGHTEN: "lighten",
        MULTIPLY: "multiply",
        NORMAL: "normal",
        OVERLAY: "overlay",
        SCREEN: "screen",
        SUBTRACT: "subtract"
    });
    flash.events = {};
    flash.events.Event = function(a, b, c) {
        this.type = a;
        this.bubbles = b;
        this.cancelable = c
    };
    fljs.addConstants(flash.events.Event, {
        ACTIVATE: "activate",
        ADDED: "added",
        ADDED_TO_STAGE: "addedToStage",
        CANCEL: "cancel",
        CHANGE: "change",
        CLOSE: "close",
        COMPLETE: "complete",
        CONNECT: "connect",
        DEACTIVATE: "deactivate",
        DISPLAYING: "displaying",
        ENTER_FRAME: "enterFrame",
        FULLSCREEN: "fullscreen",
        ID3: "id3",
        INIT: "init",
        MOUSE_LEAVE: "mouseLeave",
        OPEN: "open",
        REMOVED: "removed",
        REMOVED_FROM_STAGE: "removedFromStage",
        RENDER: "render",
        RESIZE: "resize",
        SCROLL: "scroll",
        SELECT: "select",
        SOUND_COMPLETE: "soundComplete",
        TAB_CHILDREN_CHANGE: "tabChildrenChange",
        TAB_ENABLED_CHANGE: "tabEnabledChange",
        TAB_INDEX_CHANGE: "tabIndexChange",
        UNLOAD: "unload"
    });
    fljs.addMethods(flash.events.Event, {
        clone: function() {},
        formatToString: function(a) {
            return "[" + a + this.buildPropertiesString_(arguments) + "]"
        },
        buildPropertiesString_: function(a) {
            for (var b = [], c = 0; c < a.length; c++) c > 0 && b.push(a[c] + "=" + this[a[c]]);
            return b.join(" ")
        },
        isDefaultPrevented: function() {
            return this.returnValue_
        },
        stopImmediatePropagation: function() {
            this.stopPropagation()
        },
        toString: function() {
            return this.formatToString("Event", "type", "bubbles", "cancelable")
        }
    });
    flash.events.MouseEvent = function(a, b, c, d, e, f, g, j, h, m, k, l, n, p) {
        flash.events.Event.call(this, a, b, c);
        this.localX = d;
        this.localY = e;
        this.relatedObject = f;
        this.ctrlKey = g;
        this.altKey = j;
        this.shiftKey = h;
        this.buttonDown = m;
        this.delta = k;
        this.commandKey = l;
        this.controlKey = n;
        this.clickCount = p
    };
    fljs.inherits(flash.events.MouseEvent, flash.events.Event);
    fljs.addConstants(flash.events.MouseEvent, {
        CLICK: "click",
        DOUBLE_CLICK: "doubleClick",
        MOUSE_DOWN: "mouseDown",
        MOUSE_MOVE: "mouseMove",
        MOUSE_OUT: "mouseOut",
        MOUSE_OVER: "mouseOver",
        MOUSE_UP: "mouseUp",
        MOUSE_WHEEL: "mouseWheel",
        ROLL_OUT: "rollOut",
        ROLL_OVER: "rollOver"
    });
    flash.events.FullScreenEvent = function() {};
    fljs.addConstants(flash.events.FullScreenEvent, {
        FULL_SCREEN: "fullScreen"
    });
    flash.events.KeyboardEvent = function(a, b, c, d, e, f, g, j, h) {
        flash.events.Event(a, b, c);
        this.charCode = d;
        this.keyCode = e;
        this.keyLocation = f;
        this.ctrlKey = g;
        this.altKey = j;
        this.shiftKey = h
    };
    fljs.inherits(flash.events.KeyboardEvent, flash.events.Event);
    fljs.addConstants(flash.events.KeyboardEvent, {
        KEY_DOWN: "keyDown",
        KEY_UP: "keyUp"
    });
    flash.events.FocusEvent = function() {};
    fljs.addConstants(flash.events.FocusEvent, {
        KEY_FOCUS_CHANGE: "keyFocusChange",
        MOUSE_FOCUS_CHANGE: "mouseFocusChange"
    });
    flash.events.IEventDispatcher = function() {};
    fljs.addMethods(flash.events.IEventDispatcher, {
        addEventListener: function() {},
        dispatchEvent: function() {},
        hasEventListener: function() {},
        removeEventListener: function() {},
        willTrigger: function() {}
    });
    flash.events.EventDispatcher = function() {
        this._listenerCount = {};
        this._listeners = {}
    };
    fljs.addMethods(flash.events.EventDispatcher, {
        addEventListener: function(a, b, c, d, e) {
            a in this._listeners || (this._listeners[a] = []);
            this._listeners[a].push([b, c, d, e]);
            if (!this._listenerCount[a]) {
                this["__add" + a] && this["__add" + a]();
                this._listenerCount[a] = 0
            }
            this._listenerCount[a] += 1
        },
        dispatchEvent: function(a) {
            var b = this._listeners[a.type];
            for (var c in b) b[c][0](a)
        },
        hasEventListener: function(a) {
            return this._listeners[a] && this._listeners[a].length > 0
        },
        removeEventListener: function(a, b, c) {
            var d = this._listeners[a];
            for (var e in d) d[e][0] == b && d[e][1] == c && d.splice(e, 1);
            this._listenerCount[a] -= 1;
            if (!this._listenerCount[a]) {
                this["__remove" + a] && this["__remove" + a]();
                this._listenerCount[a] = 0
            }
        },
        willTrigger: function(a) {
            return this.hasEventListener(a)
        }
    });
    flash.geom = {};
    flash.geom.ColorTransform = function(a, b, c, d, e, f, g, j) {
        if (typeof a == "undefined") a = 1;
        if (typeof b == "undefined") b = 1;
        if (typeof c == "undefined") c = 1;
        if (typeof d == "undefined") d = 1;
        if (typeof e == "undefined") e = 0;
        if (typeof f == "undefined") f = 0;
        if (typeof g == "undefined") g = 0;
        if (typeof j == "undefined") j = 0;
        this.alphaMultiplier = d;
        this.alphaOffset = j;
        this.blueMultiplier = c;
        this.blueOffset = g;
        this.greenMultiplier = b;
        this.greenOffset = f;
        this.redMultiplier = a;
        this.redOffset = e;
        this.__default = this.alphaMultiplier == 1 && this.blueMultiplier ==
        1 && this.greenMultiplier == 1 && this.redMultiplier == 1 && this.alphaOffset == 0 && this.blueOffset == 0 && this.greenOffset == 0 && this.redOffset == 0;
        fljs.console("cxform")
    };
    fljs.addMethods(flash.geom.ColorTransform, {
        concat: function(a) {
            return new flash.geom.ColorTransform(this.redMultiplier * a.redMultiplier, this.greenMultiplier * a.greenMultiplier, this.blueMultiplier * a.blueMultiplier, this.alphaMultiplier * a.alphaMultiplier, Math.min(255, this.redOffset + a.redOffset), Math.min(255, this.greenOffset + a.greenOffset), Math.min(255, this.blueOffset + a.blueOffset), Math.min(255, this.alphaOffset + a.alphaOffset))
        },
        toString: function() {},
        __toSvgString: function() {
            return [this.redMultiplier, 0, 0,
            0, this.redOffset, 0, this.greenMultiplier, 0, 0, this.greenOffset, 0, 0, this.blueMultiplier, 0, this.blueOffset, 0, 0, 0, this.alphaMultiplier, this.alphaOffset].toString()
        }
    });
    flash.geom.ColorTransform.identity = new flash.geom.ColorTransform;
    flash.geom.Matrix = function(a, b, c, d, e, f) {
        if (typeof a == "undefined") a = 1;
        if (typeof b == "undefined") b = 0;
        if (typeof c == "undefined") c = 0;
        if (typeof d == "undefined") d = 1;
        if (typeof e == "undefined") e = 0;
        if (typeof f == "undefined") f = 0;
        this.a = a;
        this.b = b;
        this.c = c;
        this.d = d;
        this.tx = e;
        this.ty = f;
        this.__default = this.a == 1 && this.b == 0 && this.c == 0 && this.d == 1 && this.tx == 0 && this.ty == 0
    };
    fljs.addMethods(flash.geom.Matrix, {
        clone: function() {
            return new flash.geom.Matrix(this.a, this.b, this.c, this.d, this.tx, this.ty)
        },
        concat: function(a) {
            var b = this.a * a.b + this.b * a.d,
            c = this.c * a.a + this.d * a.c,
            d = this.c * a.b + this.d * a.d,
            e = this.tx * a.a + this.ty * a.c + a.tx,
            f = this.tx * a.b + this.ty * a.d + a.ty;
            this.a = this.a * a.a + this.b * a.c;
            this.b = b;
            this.c = c;
            this.d = d;
            this.tx = e;
            this.ty = f
        },
        createBox: function() {},
        createGradientBox: function() {},
        deltaTransformPoint: function() {},
        identity: function() {},
        invert: function() {},
        rotate: function() {},
        scale: function(a, b) {
            this.a *= a;
            this.d *= b;
            this.tx *= a;
            this.ty *= b
        },
        toString: function() {},
        transformPoint: function() {},
        translate: function() {},
        __toSvgString: function() {
            return "matrix(" + [this.a, this.b, this.c, this.d, this.tx, this.ty] + ")"
        }
    });
    flash.geom.Transform = function(a) {
        this._target = a;
        this._colorTransform = new flash.geom.ColorTransform;
        this._matrix = new flash.geom.Matrix
    };
    fljs.addMethods(flash.geom.Transform, {
        setTarget: function(a) {
            this._target = a
        },
        getColorTransform: function() {
            return this._colorTransform
        },
        setColorTransform: function(a) {
            this._colorTransform = a;
            this._target.__setColorTransform(a)
        },
        getConcatenatedColorTransform: function() {
            for (var a = this._colorTransform, b = this._target, c = fljs.Player.getInstance(); b && b != c;) {
                var d = b.getTransform().getColorTransform();
                if (!d.__default) {
                    a = d;
                    break
                }
                b = b.getParent()
            }
            return a
        },
        getMatrix: function() {
            return this._matrix
        },
        setMatrix: function(a) {
            this._matrix =
            a;
            this._target.__setMatrix(a)
        },
        notify: function() {
            this._target.__setMatrix(this._matrix);
            this._target.__setColorTransform(this._colorTransform)
        }
    });
    flash.display.DisplayObject = function() {
        flash.events.EventDispatcher.call(this);
        this._alpha = 1;
        this.blendMode_ = flash.display.BlendMode.NORMAL;
        this._transform = new flash.geom.Transform(this);
        this.enterFrameListener = fljs.bind(this.onEnterFrame_, this);
        fljs.Player.getInstance().dispatcher.addEventListener(flash.events.Event.ENTER_FRAME, this.enterFrameListener);
        this.__simpleColorTransform = true;
        this.__asContext = null; (this._clipElement = new fljs.dom.Element).create(fljs.dom.Namespace.Svg, "g");
        this.id = "clip" +
        flash.display.DisplayObject.id++;
        this._mouseEventHandler = fljs.bind(this.dispatchMouseEvent, this)
    };
    fljs.inherits(flash.display.DisplayObject, flash.events.EventDispatcher);
    fljs.addMethods(flash.display.DisplayObject, {
        getBounds: function(a) {
            var b = this.element_.getElement().getBBox();
            if (a == this) return new flash.geom.Rectangle(b.x, b.y, b.width, b.height);
            else {
                var c = new flash.geom.Point(b.x, b.y);
                c = a.globalToLocal(this.localToGlobal(c));
                b = new flash.geom.Point(b.x + b.width, b.y + b.height);
                b = a.globalToLocal(this.localToGlobal(b));
                return new flash.geom.Rectangle(c.x, c.y, b.x - c.x, b.y - c.y)
            }
        },
        getRect: function() {},
        globalToLocal: function(a) {
            var b = this._svgCtm();
            a = this._SvgApplyMatrixToPoint(a,
            b);
            return new flash.geom.Point(a.x, a.y)
        },
        hitTestObject: function(a) {
            a = a.getBounds(this);
            var b = this.getBounds(this);
            return a.x + a.width <= b.x && a.x >= b.x + b.width && a.y + a.height <= b.y && a.y >= b.y + b.height
        },
        hitTestPoint: function(a, b) {
            a = new flash.geom.Point(a, b);
            a = this.globalToLocal(a);
            b = this.getBounds(this);
            return a.x >= b.x && a.x <= b.x + b.width && a.y > b.y && a.y <= b.y + b.height
        },
        _svgApplyMatrixToPoint: function(a, b) {
            var c = fljs.Player.getInstance().element.getElement().createSVGPoint();
            c.x = a.x;
            c.y = a.y;
            return c = c.matrixTransform(b)
        },
        _svgCtm: function() {
            var a = this.element_.getElement(),
            b;
            try {
                b = a.parentNode.getScreenCTM()
            } catch(c) {
                b = getScreenCTM(a.parentNode)
            }
            return b
        },
        localToGlobal: function(a) {
            var b = this._svgCtm();
            a = this._SvgApplyMatrixToPoint(a, b.inverse());
            return new flash.geom.Point(a.x, a.y)
        },
        onEnterFrame_: function() {},
        __setColorTransform: function(a) {
            this.element_.getElement().setAttributeNS(null, "opacity", a.alphaMultiplier);
            this.element_.getElement().setAttributeNS(null, "stroke-opacity", a.alphaMultiplier);
            this.element_.getElement().setAttributeNS(null,
            "fill-opacity", a.alphaMultiplier);
            this.__simpleColorTransform = true
        },
        setColorTransform: function() {},
        __setHitTarget: function(a) {
            this.setVisible(false);
            this.element_.getElement().setAttributeNS(null, "pointer-events", "all");
            this._hitTargetFor = a;
            this.addEventListeners()
        },
        makeClipPath: function() {
            this.getClipPath()
        },
        getClipPath: function() {
            this._clipPath || this.buildClipPath();
            return this._clipPath
        },
        buildClipPath: function() {
            var a = new fljs.dom.Element;
            a.create(fljs.dom.Namespace.Svg, "clipPath");
            var b = "clip" +
            flash.display.DisplayObject.id++;
            a.sets([["id", b], [null, "clipPathUnits", "userSpaceOnUse"]]);
            a.update();
            this.__clipElement = a;
            a = this._clipPath = new fljs.dom.Element;
            a.create(fljs.dom.Namespace.Svg, "g");
            a.set(null, "clip-path", "url(#" + b + ")");
            a.update();
            this._clipElement.element.parentNode.replaceChild(a.element, this._clipElement.element);
            this._clipElement = a;
            this.buildClipParts(this);
            fljs.Player.getInstance().defs.append(this.__clipElement)
        },
        buildClipParts: function(a) {
            if (!this._parentClipPaths) this._parentClipPaths =
            {};
            this._parentClipPaths[a.id] = a
        },
        __setMatrix: function(a) {
            this.element_.getElement().setAttributeNS(null, "transform", a.__toSvgString());
            if (this._parentClipPaths) for (var b in this._parentClipPaths) {
                a = this._parentClipPaths[b];
                this.updateClipParts && this.updateClipParts(a)
            }
        },
        addEventListeners: function() {
            var a = this._buttonEventHandler = fljs.bind(this._hitTargetFor.updateButtonState, this._hitTargetFor),
            b = flash.events.MouseEvent;
            this.addEventListener(b.CLICK, a, true);
            this.addEventListener(b.MOUSE_OVER, a, true);
            this.addEventListener(b.MOUSE_OUT, a, true);
            this.addEventListener(b.MOUSE_DOWN, a, true);
            this.addEventListener(b.MOUSE_UP, a, true)
        },
        removeFromStage: function() {
            fljs.Player.getInstance().dispatcher.removeEventListener(flash.events.Event.ENTER_FRAME, this.enterFrameListener)
        },
        updateClipDepth: function(a) {
            if (this.__clipDepth) {
                if (a != this.__clipDepth) if (a < this.__clipDepth) {;
                } else if (a > this.__clipDepth) {}
            } else {
                this.makeClipPath();
                this.__clipDepth = a;
                var b = this._parent;
                b.element_.getElement();
                var c = b.clipPathForDepth(this._depth);
                c && c.getClipPath();
                var d = document.createDocumentFragment();
                for (var e in b.displayList_) {
                    var f = b.displayList_[e].displayObject;
                    if (e > this._depth && e <= a && f._mask == c) {
                        d.appendChild(f._clipElement.element);
                        f._mask = this
                    }
                }
                this.getClipPath().element.appendChild(d)
            }
        },
        getName: function() {
            return this._name
        },
        setName: function(a) {
            this._parent && this._parent.setChildName(this, a);
            this._name = a
        },
        getStage: function() {
            return this._parent && this._parent.getStage ? this._parent.getStage() : null
        },
        getTransform: function() {
            return this._transform
        },
        setTransform: function(a) {
            this._transform = a;
            this._transform.setTarget(this);
            this._transform.notify()
        },
        getMatrix: function() {
            return this._transform._matrix
        },
        setMatrix: function(a) {
            this._transform.setMatrix(a)
        },
        getVisible: function() {
            return this._visible
        },
        setVisible: function(a) {
            a = (this._visible = !!a) ? "visible": "hidden";
            this.element_.getElement().setAttributeNS(null, "visibility", a)
        },
        getParent: function() {
            return this._parent
        },
        setParent: function(a) {
            if (this._parent != a) this._parent = a
        },
        getAs2Object: function() {
            if (!this._as2Object) this._as2Object =
            new fljs.swf.act.MovieClip(this);
            return this._as2Object
        },
        dispatchMouseEvent: function(a) {
            var b = {};
            b.click = flash.events.MouseEvent.CLICK;
            b.touchend = flash.events.MouseEvent.CLICK;
            b.mouseover = flash.events.MouseEvent.MOUSE_OVER;
            b.mouseout = flash.events.MouseEvent.MOUSE_OUT;
            b.mousedown = flash.events.MouseEvent.MOUSE_DOWN;
            b.mouseup = flash.events.MouseEvent.MOUSE_UP;
            b.touchstart = flash.events.MouseEvent.MOUSE_DOWN;
            b.touchend = flash.events.MouseEvent.MOUSE_UP;
            this.dispatchEvent(new flash.events.MouseEvent(b[a.type]))
        },
        getWidth: function() {
            return this.element_.element.getBBox().width
        },
        setWidth: function(a) {
            var b = this.getWidth(),
            c = this.getMatrix(),
            d = new flash.geom.Matrix;
            d.scale(a / b, 1);
            d.concat(c);
            d.tx = c.tx;
            d.ty = c.ty;
            this.setMatrix(d)
        },
        getHeight: function() {
            return this.element_.element.getBBox().height
        }
    });
    fljs.addEvents(flash.display.DisplayObject, [[flash.events.MouseEvent.MOUSE_OVER,
    function() {
        this.element_.element.addEventListener("mouseover", this._mouseEventHandler, false)
    },
    function() {
        this.element_.element.removeEventListener("mouseover", this._mouseEventHandler)
    }], [flash.events.MouseEvent.MOUSE_OUT,
    function() {
        this.element_.element.addEventListener("mouseout", this._mouseEventHandler, false)
    },
    function() {
        this.element_.element.removeEventListener("mouseout", this._mouseEventHandler)
    }], [flash.events.MouseEvent.MOUSE_DOWN,
    function() {
        this.element_.element.addEventListener("mousedown", this._mouseEventHandler, false)
    },
    function() {
        this.element_.element.removeEventListener("mousedown", this._mouseEventHandler)
    }], [flash.events.MouseEvent.MOUSE_UP,
    function() {
        this.element_.element.addEventListener("mouseup", this._mouseEventHandler, false)
    },
    function() {
        this.element_.element.removeEventListener("mouseup", this._mouseEventHandler)
    }]]);
    flash.display.DisplayObject.id = 1;
    flash.display.InteractiveObject = function() {
        flash.display.DisplayObject.call(this)
    };
    fljs.inherits(flash.display.InteractiveObject, flash.display.DisplayObject);
    flash.display.DisplayObjectContainer = function() {
        flash.display.InteractiveObject.call(this);
        this.element_ = this._clipElement;
        this.graphics_ = new flash.display.Graphics(this);
        this.displayList_ = [];
        this.__childNames = {}
    };
    fljs.inherits(flash.display.DisplayObjectContainer, flash.display.InteractiveObject);
    fljs.addMethods(flash.display.DisplayObjectContainer, {
        addChild: function(a) {
            var b = 0;
            for (var c in this.displayList_) b = Math.max(c, b);
            return this.addChildAt(a, b + 1)
        },
        addChildAt: function(a, b) {
            a._depth = b;
            a.setParent(this);
            var c = this.element_.getElement(),
            d = this.clipPathForDepth(b);
            if (d) c = d.getClipPath().element;
            var e = this.displayList_[b],
            f;
            if (e) f = e.displayObject;
            if (e && !f.__clipDepth) {
                c.replaceChild(a._clipElement.element, f._clipElement.element);
                f.removeFromStage()
            } else {
                e && this.removeChildAt(b);
                if ((e = this.dispObjAfterIndex(b)) &&
                d) if (e._mask != d) e = null;
                e ? c.insertBefore(a._clipElement.element, e._clipElement.element) : c.appendChild(a._clipElement.element)
            }
            this.displayList_[b] = {
                displayObject: a
            };
            a.__name && this.setChildName(a, null, a.__name);
            if (this._parentClipPaths) for (var g in this._parentClipPaths) a.buildClipParts(this._parentClipPaths[g]);
            if (d) a._mask = d;
            return a
        },
        dispObjAfterIndex: function(a) {
            var b,
            c = null;
            for (var d in this.displayList_) if (d > a) {
                b = c ? Math.min(b, d) : d;
                c = this.displayList_[b].displayObject
            }
            return c
        },
        areInaccessibleObjectsUnderPoint: function() {
            return false
        },
        contains: function() {},
        getChildAt: function(a) {
            return (a = this.displayList_[a]) ? a.displayObject: null
        },
        getChildByName: function(a) {
            return this.childrenByName_[a]
        },
        removeChildAt: function(a) {
            var b = this.displayList_[a];
            if (b) {
                b = b.displayObject;
                var c;
                c = (c = this.clipPathForDepth(a)) ? c.getClipPath().element: this.element_.getElement();
                var d = b._clipElement.element;
                if (b.__clipDepth) {
                    b.getClipPath();
                    var e = document.createDocumentFragment();
                    for (var f in this.displayList_) {
                        var g = this.displayList_[f].displayObject;
                        if (g._mask ==
                        b) {
                            g._mask = null;
                            e.appendChild(g._clipElement.element)
                        }
                    }
                    c.replaceChild(e, d)
                } else c.removeChild(d);
                b.setParent(null);
                b.removeFromStage();
                b._name && delete this.__childNames[b._name];
                delete this.displayList_[a];
                return b
            } else fljs.console("doc").info("removeChildAt:" + a + " failed")
        },
        removeChildren: function() {
            for (var a in this.displayList_) this.removeChildAt(a)
        },
        setChildIndex: function() {},
        swapChildren: function() {},
        swapChildrenAt: function() {},
        setChildName: function(a, b) {
            a._name && delete this.__childNames[a._name];
            this.__childNames[b] = a
        },
        buildClipParts: function(a) {
            fljs.base(this, "buildClipParts", a);
            this.graphics_.buildClipParts(a);
            for (var b in this.displayList_) {
                var c = this.displayList_[b].displayObject;
                c.buildClipParts && c.buildClipParts(a)
            }
        },
        updateClipParts: function(a) {
            this.graphics_.updateClipParts(a);
            for (var b in this.displayList_) {
                var c = this.displayList_[b].displayObject;
                c.updateClipParts && c.updateClipParts(a)
            }
        },
        updateColorTransform: function() {
            for (var a in this.displayList_) {
                var b = this.displayList_[a].displayObject;
                b.updateColorTransform && b.updateColorTransform()
            }
        },
        __setColorTransform: function(a) {
            fljs.base(this, "__setColorTransform", a);
            this.updateColorTransform()
        },
        clipPathForDepth: function(a) {
            var b = -1;
            for (var c in this.displayList_) {
                var d = this.displayList_[c].displayObject;
                if (d.__clipDepth) if (a > c && a <= d.__clipDepth) b = Math.max(c, b)
            }
            return b > -1 ? this.displayList_[b].displayObject: null
        }
    });
    flash.display.Stage = function() {
        flash.display.DisplayObjectContainer.call(this);
        var a = fljs.Player.getInstance(),
        b = a.header.FrameSize.Xmax - a.header.FrameSize.Xmin,
        c = a.header.FrameSize.Ymax - a.header.FrameSize.Ymin;
        this._clipElement.sets([[null, "width", b], [null, "height", c]]);
        this._clipElement.update();
        this.align_ = flash.display.StageAlign.TOP_LEFT;
        this.displayState_ = flash.display.StageDisplayState.NORMAL;
        this.frameRate_ = 30;
        a = fljs.Player.getInstance();
        b = a.header.FrameSize.Xmax - a.header.FrameSize.Xmin;
        c =
        a.header.FrameSize.Ymax - a.header.FrameSize.Ymin;
        a = this._bg = new fljs.dom.Element;
        a.create(fljs.dom.Namespace.Svg, "rect");
        a.sets([[null, "x", 0], [null, "y", 0], [null, "width", b], [null, "height", c], [null, "stroke", "none"], [null, "fill", this.colorToSvgString(0)]]);
        a.update(); (b = this._clipElement.element.firstChild) ? this._clipElement.getElement().insertBefore(a.element, b) : this._clipElement.getElement().appendChild(a.element)
    };
    fljs.inherits(flash.display.Stage, flash.display.DisplayObjectContainer);
    fljs.addMethods(flash.display.Stage, {
        initialize: function() {
            this.setBackgroundColor_(0)
        },
        invalidate: function() {},
        isFocusInaccessible: function() {},
        runFrameLoop_: function() {},
        onEnterFrame_: function() {
            for (var a in this.children_) this.children_.onEnterFrame()
        },
        colorToSvgString: function(a) {
            return "rgb(" + [a >> 16 & 255, a >> 8 & 255, a & 255] + ")"
        },
        setBackgroundColor_: function(a) {
            this._bg.set(null, "fill", this.colorToSvgString(a));
            this._bg.update()
        },
        onMouseMove: function(a) {
            this._mouseX = a.clientX;
            this._mouseY = a.clientY
        },
        getStage: function() {
            return this
        },
        getFrameRate: function() {
            return this.frameRate_
        },
        setFrameRate: function(a) {
            this.frameRate_ = a = Math.max(Math.min(a, 1E3), 0.01)
        }
    });
    flash.display.GradientType = function() {};
    fljs.addConstants(flash.display.GradientType, {
        LINEAR: "linear",
        RADIAL: "radial"
    });
    flash.display.SpreadMethod = function() {};
    fljs.addConstants(flash.display.SpreadMethod, {
        PAD: "pad",
        REFLECT: "reflect",
        REPEAT: "repeat"
    });
    flash.display.InterpolationMethod = function() {};
    fljs.addConstants(flash.display.InterpolationMethod, {
        LINEAR_RGB: "linearRGB",
        RGB: "rgb"
    });
    flash.display.Graphics = function(a) {
        this.__target = a;
        this.setDisplayObject(a);
        this._parentClipPaths = {};
        this._clipParts = {};
        this._parts = []
    };
    fljs.addMethods(flash.display.Graphics, {
        clear: function() {
            for (var a in this._parts) this.parentEl.removeChild(this._parts[a]);
            this._parts = [];
            this._clipParts = {};
            this._parentClipPaths = {}
        },
        opacityWithXform: function(a) {
            var b = this.displayObject_.getTransform().getConcatenatedColorTransform();
            return b.__default ? a: Math.max(0, Math.min(255, Math.round(a * 255 * b.alphaMultiplier + b.alphaOffset))) / 255
        },
        setDisplayObject: function(a) {
            this.displayObject_ = a;
            this.parentEl = this.displayObject_.element_.element
        },
        __colorToSvgString: function(a) {
            var b =
            a >> 16 & 255,
            c = a >> 8 & 255;
            a = a & 255;
            if (!this.displayObject_.getTransform().getConcatenatedColorTransform().__default) {
                var d = this.displayObject_.getTransform().getConcatenatedColorTransform();
                b = Math.max(0, Math.min(255, Math.round(b * d.redMultiplier + d.redOffset)));
                c = Math.max(0, Math.min(255, Math.round(c * d.greenMultiplier + d.greenOffset)));
                a = Math.max(0, Math.min(255, Math.round(a * d.blueMultiplier + d.blueOffset)))
            }
            return "rgb(" + [b, c, a] + ")"
        },
        clipTransforms: function(a) {
            for (var b = [], c = this.displayObject_;;) {
                var d = c.getMatrix().__toSvgString();
                b.push(d);
                if (c == a) break;
                c = c.getParent()
            }
            return b
        },
        buildClipParts: function(a) {
            this._parentClipPaths[a.id] = a;
            var b = this.clipTransforms(a).join(" ");
            if (this.tag) {
                var c = this.tag.def.paths;
                for (var d in c) {
                    var e = c[d],
                    f;
                    f = fljs.agent.browser == "Safari" ? e.clone() : e.use();
                    f.set(null, "transform", b);
                    f.update();
                    this.addClipPart(a, e, f)
                }
            }
        },
        addClipPart: function(a, b, c) {
            this._clipParts[a.id] || (this._clipParts[a.id] = {});
            this._clipParts[a.id][b.id] = c;
            a.__clipElement.append(c)
        },
        updateClipParts: function(a) {
            var b = this.clipTransforms(a);
            for (a = a;;) {
                if (this._parentClipPaths[a.id]) {
                    var c = b.join(" "),
                    d = this._clipParts[a.id];
                    for (var e in d) {
                        var f = d[e];
                        f.set(null, "transform", c);
                        f.update()
                    }
                }
                if (!a || !a.getTransform) break;
                c = a.getMatrix().__toSvgString();
                b.push(c);
                a = a.getParent()
            }
        },
        useTag: function(a, b, c) {
            var d = this.displayObject_.getTransform().getConcatenatedColorTransform();
            d.__default || (b = d);
            this.tag = a;
            this.cloning = c;
            this.use = a.def.use(b, null, this.cloning);
            this.parentEl.appendChild(this.use.element)
        },
        setColorTransform: function(a) {
            if (this.use) {
                var b =
                this.use.element;
                this.use = this.tag.def.use(a, null, this.cloning);
                this.parentEl.replaceChild(this.use.element, b)
            }
        }
    });
    flash.display.Graphics.patternId = 1;
    flash.display.Graphics.pathId = 1;
    flash.display.IBitmapDrawable = function() {};
    flash.display.StageAlign = function() {};
    fljs.addConstants(flash.display.StageAlign, {
        TOP: "top",
        BOTTOM: "bottom",
        LEFT: "left",
        RIGHT: "right",
        TOP_LEFT: "topLeft",
        TOP_RIGHT: "topRight",
        BOTTOM_LEFT: "bottomLeft",
        BOTTOM_RIGHT: "bottomRight"
    });
    flash.display.StageDisplayState = function() {};
    fljs.addConstants(flash.display.StageDisplayState, {
        FULL_SCREEN: "fullScreen",
        NORMAL: "normal"
    });
    fljs.swf = {};
    fljs.swf.tag = {};
    fljs.swf.tag.End = function() {};
    fljs.addMethods(fljs.swf.tag.End, {
        read: function() {},
        evaluate: function() {}
    });
    fljs.swf.tag.ShowFrame = function() {};
    fljs.addMethods(fljs.swf.tag.ShowFrame, {
        read: function() {},
        evaluate: function() {}
    });
    flash.display.Shape = function() {
        flash.display.DisplayObject.call(this);
        this.element_ = this._clipElement;
        this.graphics_ = new flash.display.Graphics(this)
    };
    fljs.inherits(flash.display.Shape, flash.display.DisplayObject);
    fljs.addMethods(flash.display.Shape, {
        buildClipParts: function(a) {
            fljs.base(this, "buildClipParts", a);
            this.graphics_.buildClipParts(a)
        },
        updateClipParts: function(a) {
            this.graphics_.updateClipParts(a)
        },
        useTag: function(a, b, c) {
            this.tag = a;
            this.graphics_.useTag(a, b, c);
            if (b) {
                this.setColorTransform(b);
                this.element_.getElement().setAttributeNS(null, "opacity", b.alphaMultiplier)
            }
        },
        updateColorTransform: function() {
            this.graphics_.setColorTransform(this.getTransform().getConcatenatedColorTransform())
        },
        __setColorTransform: function(a) {
            fljs.base(this,
            "__setColorTransform", a);
            this.graphics_.setColorTransform(a)
        }
    });
    fljs.swf.tag.PlaceObject = function() {};
    fljs.addMethods(fljs.swf.tag.PlaceObject, {
        read: function(a, b) {
            var c = a.stream.byteIndex;
            this.CharacterId = a.readUI16();
            this.Depth = a.readUI16();
            this.Matrix = a.readMATRIX();
            a.stream.align();
            if (a.stream.byteIndex != c + b.TagLength) {
                fljs.console("parse").info("reading cxform");
                this.ColorTransform = a.readCXFORM()
            }
            a.stream.align()
        },
        buildMatrix_: function() {
            return new flash.geom.Matrix(this.Matrix.ScaleX, this.Matrix.RotateSkew0, this.Matrix.RotateSkew1, this.Matrix.ScaleY, this.Matrix.TranslateX, this.Matrix.TranslateY)
        },
        buildColorTransform_: function() {
            var a = this.ColorTransform;
            return new flash.geom.ColorTransform(a.RedMultTerm, a.GreenMultTerm, a.BlueMultTerm, a.AlphaMultTerm, a.RedAddTerm, a.GreenAddTerm, a.BlueAddTerm, a.AlphaAddTerm)
        },
        evaluate: function(a, b, c, d) {
            b = fljs.console("eval");
            c = a.dictionary[this.CharacterId];
            var e;
            if (c instanceof fljs.swf.tag.DefineShape || c instanceof fljs.swf.tag.DefineShape2) {
                e = new flash.display.Shape;
                e.getTransform().setMatrix(this.buildMatrix_());
                this.ColorTransform && e.getTransform().setColorTransform(this.buildColorTransform_());
                e.useTag(c)
            } else if (c instanceof fljs.swf.tag.DefineBitsJPEG2) {
                e = c.buildBitmap(fljs.Player.getInstance());
                e.getTransform().setMatrix(this.buildMatrix_())
            } else if (c instanceof fljs.swf.tag.DefineButton2) {
                e = c.build(a);
                e.getTransform().setMatrix(this.buildMatrix_())
            }
            e ? d.addChildAt(e, this.Depth) : b.info("not recognized: " + [this.CharacterId, this.Name])
        }
    });
    fljs.swf.tag.RemoveObject = function() {};
    fljs.addMethods(fljs.swf.tag.RemoveObject, {
        read: function(a) {
            this.CharacterId = a.readUI16();
            this.Depth = a.readUI16()
        },
        evaluate: function(a, b, c, d) {
            d.removeChildAt(this.Depth)
        }
    });
    fljs.swf.tag.PlaceObject2 = function() {};
    fljs.addMethods(fljs.swf.tag.PlaceObject2, {
        read: function(a) {
            this.startByteIndex = a.stream.byteIndex;
            fljs.console("parse");
            this.PlaceFlagHasClipActions = a.readUB(1);
            this.PlaceFlagHasClipDepth = a.readUB(1);
            this.PlaceFlagHasName = a.readUB(1);
            this.PlaceFlagHasRatio = a.readUB(1);
            this.PlaceFlagHasColorTransform = a.readUB(1);
            this.PlaceFlagHasMatrix = a.readUB(1);
            this.PlaceFlagHasCharacter = a.readUB(1);
            this.PlaceFlagMove = a.readUB(1);
            this.Depth = a.readUI16();
            if (this.PlaceFlagHasCharacter) this.CharacterId = a.readUI16();
            if (this.PlaceFlagHasMatrix) this.Matrix = a.readMATRIX();
            if (this.PlaceFlagHasColorTransform) this.ColorTransform = a.readCXFORMWITHALPHA();
            if (this.PlaceFlagHasRatio) this.Ratio = a.readUI16();
            if (this.PlaceFlagHasName) this.Name = a.readSTRING();
            if (this.PlaceFlagHasClipDepth) this.ClipDepth = a.readUI16();
            if (this.PlaceFlagHasClipActions) this.ClipActions = a.readCLIPACTIONS()
        },
        buildMatrix_: function() {
            return new flash.geom.Matrix(this.Matrix.ScaleX, this.Matrix.RotateSkew0, this.Matrix.RotateSkew1, this.Matrix.ScaleY, this.Matrix.TranslateX,
            this.Matrix.TranslateY)
        },
        buildColorTransform_: function() {
            var a = this.ColorTransform;
            return new flash.geom.ColorTransform(a.RedMultTerm, a.GreenMultTerm, a.BlueMultTerm, a.AlphaMultTerm, a.RedAddTerm, a.GreenAddTerm, a.BlueAddTerm, a.AlphaAddTerm)
        },
        evaluate: function(a, b, c, d) {
            var e;
            c = fljs.console("place");
            if (this.PlaceFlagMove && this.PlaceFlagHasCharacter) e = d.getChildAt(this.Depth);
            var f;
            if (this.ColorTransform) f = this.buildColorTransform_();
            if (this.PlaceFlagHasCharacter) {
                b = a.dictionary[this.CharacterId];
                var g;
                if (b instanceof fljs.swf.tag.DefineShape || b instanceof fljs.swf.tag.DefineEditText || b instanceof fljs.swf.tag.DefineText || b instanceof fljs.swf.tag.DefineSprite || b instanceof fljs.swf.tag.DefineButton2) g = b.build(a, f);
                if (g) {
                    this.Matrix && g.getTransform().setMatrix(this.buildMatrix_());
                    d.addChildAt(g, this.Depth);
                    if (e) this.Matrix || g.getTransform().setMatrix(e.getTransform().getMatrix());
                    if (g.__clipActions == null) g.__clipActions = {};
                    if (this.ClipActions) {
                        f = fljs.swf.ClipEventFlags;
                        d = this.ClipActions.ClipActionRecords;
                        for (var j in d) {
                            e = d[j];
                            for (var h in fljs.swf.ClipEventFlags) if (e.EventFlags & f[h]) {
                                g.__clipActions[h] || (g.__clipActions[h] = []);
                                g.__clipActions[h].push(e)
                            }
                        }
                    }
                    if (b instanceof fljs.swf.tag.DefineSprite || b instanceof fljs.swf.tag.DefineButton2) g.onCreate()
                } else {
                    c.info("not recognized: " + [this.CharacterId, this.Name]);
                    e && d.removeChildAt(this.Depth)
                }
            } else if (this.PlaceFlagMove) {
                g = d.getChildAt(this.Depth);
                if (!g) return;
                h = false;
                if (this.Matrix) {
                    g.getTransform().setMatrix(this.buildMatrix_());
                    h = true
                }
                if (f) {
                    g.getTransform().setColorTransform(f);
                    h = true
                }
                if (h && a.renderTextAsGlyphs) if (g.text_ || g._text) if (g.getParent()) {
                    j = 0;
                    h = g._clipElement.element;
                    h = b = h.parentNode;
                    b = h.parentNode;
                    d = h.nextSibling;
                    b.removeChild(h);
                    f && g.getTransform().setColorTransform(f);
                    this.Matrix && g.getTransform().setMatrix(this.buildMatrix_());
                    d ? b.insertBefore(h, d) : b.appendChild(h)
                }
            }
            if (g) {
                this.PlaceFlagHasClipDepth && g.updateClipDepth(this.ClipDepth);
                this.Name && g.setName(this.Name);
                if (g && this.PlaceFlagHasCharacter) {
                    if (g.__clipActions.ClipEventInitialize) {
                        f = [];
                        for (j in g.__clipActions.ClipEventInitialize) f.push.apply(f,
                        g.__clipActions.ClipEventInitialize[j].Actions);
                        a.doActions(g, f)
                    }
                    if (g.__clipActions.ClipEventLoad) {
                        f = [];
                        for (j in g.__clipActions.ClipEventLoad) f.push.apply(f, g.__clipActions.ClipEventLoad[j].Actions);
                        a.doActions(g, f)
                    }
                    if (g.__clipActions.ClipEventEnterFrame) {
                        f = [];
                        for (j in g.__clipActions.ClipEventEnterFrame) f.push.apply(f, g.__clipActions.ClipEventEnterFrame[j].Actions);
                        a.dispatcher.addEventListener(flash.events.Event.ENTER_FRAME, fljs.bind(a.doActions, a, g, f))
                    }
                }
            }
        }
    });
    fljs.swf.build = {};
    fljs.swf.build.SvgUtils = function() {};
    fljs.addMethods(fljs.swf.build.SvgUtils, {
        toSvgColorString: function(a) {
            return "rgb(" + [a.Red, a.Green, a.Blue] + ")"
        },
        toSvgOpacity: function(a) {
            return a.Alpha == null ? 1: a.Alpha / 255
        },
        toSvgMatrixString: function(a) {
            return (new flash.geom.Matrix(a.ScaleX, a.RotateSkew0, a.RotateSkew1, a.ScaleY, a.TranslateX, a.TranslateY)).__toSvgString()
        },
        toMatrix: function(a) {
            return new flash.geom.Matrix(a.ScaleX, a.RotateSkew0, a.RotateSkew1, a.ScaleY, a.TranslateX, a.TranslateY)
        }
    });
    fljs.swf.def = {};
    fljs.swf.def.BitmapDef = function() { (this.element = new fljs.dom.Element).create(fljs.dom.Namespace.Svg, "image")
    };
    fljs.addMethods(fljs.swf.def.BitmapDef, {
        setCharaId: function(a) {
            this.id = "bitmap-" + a;
            this.ref = "#" + this.id;
            this.element.set("id", this.id)
        },
        define: function() {
            this.element.update();
            this._define(this.element.element)
        },
        use: function() {
            var a = new fljs.dom.Element;
            a.create(fljs.dom.Namespace.Svg, "use");
            a.sets([[fljs.dom.Namespace.Xlink, "xlink:href", this.ref]]);
            a.update();
            return a
        },
        _define: function(a) {
            fljs.Player.getInstance().defs.element.appendChild(a)
        }
    });
    fljs.swf.def.BitmapFillDef = function() {
        var a = this.element = new fljs.dom.Element;
        a.create(fljs.dom.Namespace.Svg, "pattern");
        this.type = "Bitmap";
        this.id = "pattern-" + fljs.swf.def.BitmapFillDef.patternId++;
        this.ref = "#" + this.id;
        a.set("id", this.id)
    };
    fljs.addMethods(fljs.swf.def.BitmapFillDef, {
        setBitmapId: function(a) {
            a = fljs.Player.getInstance().dictionary[a];
            if (!a) return false;
            this.bitmap = a;
            this.element.append(a.def.use());
            return true
        },
        define: function() {
            this.element.update();
            this._define(this.element.element)
        },
        use: function() {
            var a = new fljs.dom.Element;
            a.create(fljs.dom.Namespace.Svg, "use");
            a.sets([[fljs.dom.Namespace.Xlink, "xlink:href", this.ref]]);
            a.update();
            return a
        },
        _define: function(a) {
            fljs.Player.getInstance().defs.element.appendChild(a)
        }
    });
    fljs.swf.def.BitmapFillDef.patternId = 1;
    fljs.swf.def.GradientFillDef = function() {
        this.element = new fljs.dom.Element;
        this.stops = [];
        this.type = "Gradient"
    };
    fljs.addMethods(fljs.swf.def.GradientFillDef, {
        create: function(a) {
            var b = this.element;
            b.create(fljs.dom.Namespace.Svg, a);
            this.id = "gradient-" + fljs.swf.def.GradientFillDef.gradientId++;
            this.ref = "#" + this.id;
            b.set("id", this.id)
        },
        addStop: function(a) {
            this.stops.push(a);
            this.element.append(a.element)
        },
        define: function() {
            this.element.update();
            this._define(this.element.element)
        },
        use: function(a) {
            var b = this.element.clone(false);
            b.id = "gradient-" + fljs.swf.def.GradientFillDef.gradientId++;
            b.ref = "#" + b.id;
            b.set("id",
            b.id);
            for (var c in this.stops) b.append(this.stops[c].use(a));
            b.update();
            this._define(b.element);
            return b
        },
        _define: function(a) {
            fljs.Player.getInstance().defs.element.appendChild(a)
        }
    });
    fljs.swf.def.GradientFillDef.gradientId = 1;
    fljs.swf.def.GradientFillStopDef = function() { (this.element = new fljs.dom.Element).create(fljs.dom.Namespace.Svg, "stop")
    };
    fljs.addMethods(fljs.swf.def.GradientFillStopDef, {
        create: function(a) {
            var b = this.element;
            b.create(fljs.dom.Namespace.Svg, a);
            b.set("id", this.id)
        },
        setColor: function(a, b) {
            this.rgba = a;
            this.element.sets([[null, "stop-color", this._colorToSvgColor(a, b)], [null, "stop-opacity", this._colorToSvgOpacity(a)]])
        },
        define: function() {
            this.element.update();
            this._define(this.element.element)
        },
        use: function(a) {
            var b = this.element.clone(false);
            a = [[null, "stop-color", this._colorToSvgColor(this.rgba, a)]];
            b.sets(a);
            b.update();
            return b
        },
        _define: function(a) {
            fljs.Player.getInstance().defs.element.appendChild(a)
        },
        _colorToSvgColor: function(a, b) {
            var c = a >> 24 & 255,
            d = a >> 16 & 255;
            a = a >> 8 & 255;
            if (b) {
                c = Math.max(0, Math.min(255, Math.round(c * b.redMultiplier + b.redOffset)));
                d = Math.max(0, Math.min(255, Math.round(d * b.greenMultiplier + b.greenOffset)));
                a = Math.max(0, Math.min(255, Math.round(a * b.blueMultiplier + b.blueOffset)))
            }
            return "rgb(" + [c, d, a] + ")"
        },
        _colorToSvgOpacity: function(a, b) {
            a = (a & 255) / 255;
            if (b) a = Math.max(0, Math.min(1, Math.round(a * b.alphaMultiplier +
            b.alphaOffset)));
            return a
        }
    });
    fljs.swf.def.GradientFillStopDef.gradientStopId = 1;
    fljs.swf.def.PathDef = function() {
        var a = this.element = new fljs.dom.Element;
        a.create(fljs.dom.Namespace.Svg, "path");
        this.id = "path" + fljs.swf.def.PathDef.pathId++;
        this.ref = "#" + this.id;
        a.set("id", this.id);
        a.update()
    };
    fljs.addMethods(fljs.swf.def.PathDef, {
        setStroke: function(a) { (this.stroke = a) ? this.element.sets([[null, "stroke-width", a.thickness], [null, "stroke", this._colorToSvgColor(a.color)], [null, "stroke-opacity", this._colorToSvgOpacity(a.color)]]) : this.element.set(null, "stroke", "none")
        },
        setFill: function(a) {
            if (this.fill = a) switch (a.type) {
            case "Solid":
                this._setSolidFill(a);
                break;
            case "Bitmap":
                this._setBitmapFill(a);
                break;
            case "Gradient":
                this._setGradientFill(a);
                break
            } else this.element.set(null, "fill", "none")
        },
        _setSolidFill: function() {},
        _setBitmapFill: function(a) {
            this.element.sets([[null, "fill", "url(" + a.ref + ")"], [null, "fill-opacity", 1]])
        },
        _setGradientFill: function() {},
        define: function() {
            this.element.update();
            this._define(this.element.element)
        },
        use: function(a, b) {
            var c = new fljs.dom.Element;
            c.create(fljs.dom.Namespace.Svg, "use");
            document.getElementById(this.id);
            var d = [[fljs.dom.Namespace.Xlink, "xlink:href", this.ref]],
            e = this.stroke;
            e && c.sets([[null, "stroke-width", e.thickness], [null, "stroke", this._colorToSvgColor(e.color, a)], [null, "stroke-opacity",
            this._colorToSvgOpacity(e.color)]]);
            if (e = this.fill) switch (e.type) {
            case "Solid":
                c.set(null, "fill", this._colorToSvgColor(e.color, a));
                c.set(null, "fill-opacity", this._colorToSvgOpacity(e.color));
                break;
            case "Bitmap":
                break;
            case "Gradient":
                c.sets([[null, "fill", "url(" + e.use(a).ref + ")"], [null, "fill-opacity", 1]]);
                break
            }
            c.sets(d);
            b && b.append(c);
            c.update();
            return c
        },
        clone: function() {
            var a = this.element.clone(true);
            a.set("id", null);
            return a
        },
        _colorToSvgColor: function(a, b) {
            var c = a >> 24 & 255,
            d = a >> 16 & 255;
            a = a >> 8 & 255;
            if (b) {
                c = Math.max(0, Math.min(255, Math.round(c * b.redMultiplier + b.redOffset)));
                d = Math.max(0, Math.min(255, Math.round(d * b.greenMultiplier + b.greenOffset)));
                a = Math.max(0, Math.min(255, Math.round(a * b.blueMultiplier + b.blueOffset)))
            }
            return "rgb(" + [c, d, a] + ")"
        },
        _colorToSvgOpacity: function(a, b) {
            a = (a & 255) / 255;
            if (b) a = Math.max(0, Math.min(1, Math.round(a * b.alphaMultiplier + b.alphaOffset)));
            return a
        },
        _define: function(a) {
            fljs.Player.getInstance().defs.element.appendChild(a)
        }
    });
    fljs.swf.def.PathDef.pathId = 1;
    fljs.swf.def.ShapeDef = function() { (this.element = new fljs.dom.Element).create(fljs.dom.Namespace.Svg, "g");
        this.parts = [];
        this.paths = [];
        this.images = [];
        this.cxforms = {};
        this.cxformCount = 0
    };
    fljs.addMethods(fljs.swf.def.ShapeDef, {
        setCharaId: function(a) {
            this.id = "chara-" + a;
            this.ref = "#" + this.id;
            this.element.set("id", this.id)
        },
        addPath: function(a) {
            this.paths.push(a);
            this.parts.push(a);
            this.element.append(a.element)
        },
        addImage: function(a) {
            this.images.push(a);
            this.parts.push(a);
            this.element.append(a.element)
        },
        define: function() {
            this.element.update();
            fljs.Player.getInstance();
            this._define(this.element.element)
        },
        use: function(a, b, c) {
            if (c) {
                a = this.element.clone(true);
                b && b.append(a);
                return a
            }
            if (!a) a =
            flash.geom.ColorTransform.identity;
            c = a.__toSvgString();
            a = c in this.cxforms ? this.cxforms[c] : (this.cxforms[c] = this.useDef(a));
            c = new fljs.dom.Element;
            c.create(fljs.dom.Namespace.Svg, "use");
            document.getElementById(a.id);
            b && b.append(c);
            c.element.setAttributeNS(fljs.dom.Namespace.Xlink, "xlink:href", a.ref);
            return c
        },
        useDef: function(a) {
            var b = new fljs.dom.Element;
            b.create(fljs.dom.Namespace.Svg, "g");
            var c = [this.id, this.cxformCount++].join("-");
            b.sets([["id", c]]);
            b.update();
            this._define(b.element);
            var d = this.parts;
            for (var e in d) d[e].use(a, b);
            return {
                element: b,
                id: c,
                ref: "#" + c
            }
        },
        _define: function(a) {
            fljs.Player.getInstance().defs.element.appendChild(a)
        }
    });
    fljs.swf.def.ImageDef = function() {
        var a = this.element = new fljs.dom.Element;
        a.create(fljs.dom.Namespace.Svg, "g");
        this.id = "image-def-" + fljs.swf.def.ImageDef.id++;
        this.ref = "#" + this.id;
        a.set("id", this.id)
    };
    fljs.addMethods(fljs.swf.def.ImageDef, {
        setBitmapId: function(a) {
            a = fljs.Player.getInstance().dictionary[a];
            if (!a) return false;
            this.bitmap = a;
            this._use = a.def.use();
            this.element.append(this._use);
            return true
        },
        define: function() {
            this.element.update();
            this._define(this.element.element)
        },
        use: function(a, b) {
            a = new fljs.dom.Element;
            a.create(fljs.dom.Namespace.Svg, "use");
            a.sets([[fljs.dom.Namespace.Xlink, "xlink:href", this.ref]]);
            a.update();
            b && b.append(a);
            return a
        },
        _define: function(a) {
            fljs.Player.getInstance().defs.element.appendChild(a)
        }
    });
    fljs.swf.def.ImageDef.id = 1;
    fljs.swf.BigEndianStringStream = function(a) {
        this.buffer = a;
        this.bitIndex = this.byteIndex = this._byte = 0;
        this.byteIndexForBits = -1;
        this.logger = fljs.console("parse")
    };
    fljs.addMethods(fljs.swf.BigEndianStringStream, {
        length: function() {
            return this.buffer.length
        },
        hasMore: function() {
            return this.byteIndex < this.buffer.length
        },
        skipBytes: function(a) {
            this.byteIndex += a
        },
        readBytes: function(a) {
            for (var b = [], c = 0; c < a; c++) b.push(this.buffer.charCodeAt(this.byteIndex++) & 255);
            return b
        },
        align: function() {
            this.bitIndex = 8
        },
        nextUByte: function() {
            return this.buffer.charCodeAt(this.byteIndex++) & 255
        },
        nextSByte: function() {
            var a = this.buffer.charCodeAt(this.byteIndex++) & 255;
            if (a >= 128) a -= 256;
            return a
        },
        nextUShort: function() {
            var a = ((this.buffer.charCodeAt(this.byteIndex++) & 255) << 8) + (this.buffer.charCodeAt(this.byteIndex++) & 255);
            if (a < 0) a += 65536;
            return a
        }
    });
    fljs.swf.ClipEventFlags = {
        ClipEventKeyUp: -2147483648,
        ClipEventKeyDown: 1073741824,
        ClipEventMouseUp: 536870912,
        ClipEventMouseDown: 268435456,
        ClipEventMouseMove: 134217728,
        ClipEventUnload: 67108864,
        ClipEventEnterFrame: 33554432,
        ClipEventLoad: 16777216,
        ClipEventDragOver: 8388608,
        ClipEventRollOut: 4194304,
        ClipEventRollOver: 2097152,
        ClipEventReleaseOutside: 1048576,
        ClipEventRelease: 524288,
        ClipEventPress: 262144,
        ClipEventInitialize: 131072,
        ClipEventData: 65536,
        ClipEventConstruct: 1024,
        ClipEventKeyPress: 512,
        ClipEventDragOut: 256
    };
    fljs.swf.FillStyleTypes = {
        SolidFill: 0,
        LinearGradientFill: 16,
        RadialGradientFill: 18,
        FocalRadialGradientFill: 19,
        RepeatingBitmapFill: 64,
        ClippedBitmapFill: 65,
        NonSmoothedRepeatingBitmapFill: 66,
        NonSmoothedClippedBitmapFill: 67
    };
    fljs.swf.SpreadMethods = {
        Pad: 0,
        Reflect: 1,
        Repeat: 2
    };
    fljs.swf.InterpolationMethods = {
        Rgb: 0,
        LinearRgb: 1
    };
    fljs.swf.build.ShapeBuilder = function(a) {
        this.context = a;
        this.utils = new fljs.swf.build.SvgUtils
    };
    fljs.addMethods(fljs.swf.build.ShapeBuilder, {
        build: function(a) {
            var b = this.parseSwfPaths(a),
            c = [];
            for (var d in b) c.push([this.buildPaths(b[d][0]), this.buildPaths(b[d][1])]);
            return this.buildDefinition(a, c)
        },
        parseSwfPaths: function(a) {
            var b = 0,
            c = 0,
            d = 0,
            e = 0,
            f = 0,
            g = 0,
            j = a.Shapes.ShapeRecords,
            h = this.stateNewStyles(a.Shapes.FillStyles),
            m = this.stateNewStyles(a.Shapes.LineStyles),
            k = [],
            l = 0,
            n = 0,
            p = 0,
            u = 1,
            o = {
                x1: 0,
                y1: 0
            },
            q = [],
            s = this;
            a = function() {
                o.parts = q;
                o.flipped = false;
                o.x2 = q[q.length - 1].x2;
                o.y2 = q[q.length - 1].y2;
                o.key1 =
                s.pointKey(o.x1, o.y1);
                o.key2 = s.pointKey(o.x2, o.y2);
                o.key = u += 1;
                l && h[l].edges.push(o);
                if (n) h[n].edges.push({
                    parts: q,
                    flipped: true,
                    x1: o.x2,
                    y1: o.y2,
                    x2: o.x1,
                    y2: o.y1,
                    key1: o.key2,
                    key2: o.key1,
                    key: u += 1
                });
                p && m[p].edges.push(o);
                o = {
                    x1: o.x2,
                    y1: o.y2
                };
                q = []
            };
            var r = function() {
                k.push([h, m])
            },
            t = function(w) {
                return Math.round(w * 100) / 100
            };
            for (var v in j) {
                g = j[v];
                switch (g.type) {
                case "STRAIGHT":
                    f = b + g.DeltaX;
                    g = c + g.DeltaY;
                    q.push({
                        x1: t(b),
                        y1: t(c),
                        x2: t(f),
                        y2: t(g)
                    });
                    b = f;
                    c = g;
                    break;
                case "CURVED":
                    d = b + g.ControlDeltaX;
                    e = c + g.ControlDeltaY;
                    f = d + g.AnchorDeltaX;
                    g = e + g.AnchorDeltaY;
                    q.push({
                        x1: t(b),
                        y1: t(c),
                        cx: t(d),
                        cy: t(e),
                        x2: t(f),
                        y2: t(g)
                    });
                    b = f;
                    c = g;
                    break;
                case "NONEDGE":
                    q.length && a();
                    if (g.StateNewStyles) {
                        r();
                        h = this.stateNewStyles(g.FillStyles);
                        m = this.stateNewStyles(g.LineStyles)
                    }
                    if (g.StateLineStyle) p = g.LineStyle;
                    if (g.StateFillStyle0) l = g.FillStyle0;
                    if (g.StateFillStyle1) n = g.FillStyle1;
                    if (g.StateMoveTo) {
                        b = g.MoveDeltaX;
                        c = g.MoveDeltaY;
                        o.x1 = b;
                        o.y1 = c
                    }
                    break
                }
            }
            q.length && a();
            r();
            return k
        },
        stateNewStyles: function(a) {
            var b = [{
                edges: [],
                style: null
            }];
            for (var c in a) b.push({
                edges: [],
                style: a[c]
            });
            return b
        },
        buildPaths: function(a) {
            var b = [],
            c,
            d,
            e,
            f,
            g,
            j,
            h,
            m,
            k,
            l;
            for (e = 0; e < a.length; e++) {
                d = a[e].edges;
                if (d.length != 0) {
                    j = {};
                    edgeIndexCount = {};
                    m = [];
                    for (f = h = 0; f < d.length; f++) {
                        c = d[f];
                        if (c.key1 == c.key2) {
                            c.picked = true;
                            h += 1;
                            m.push([c])
                        } else {
                            c.picked = false;
                            j[c.key1] || (j[c.key1] = []);
                            j[c.key1].push(c)
                        }
                    }
                    for (f = 0; f < d.length; f++) {
                        if (h == d.length) break;
                        c = d[f];
                        if (!c.picked) {
                            k = [c];
                            c.picked = true;
                            h += 1;
                            l = j[c.key1];
                            for (g = 0; g < l.length; g++) if (l[g] == c) {
                                l.splice(g, 1);
                                break
                            }
                            g = c.key1;
                            for (c = c.key2; c != g;) {
                                l = j[c];
                                if (typeof l ==
                                "undefined") break;
                                if (l.length == 0) break;
                                c = l.shift();
                                k.push(c);
                                c.picked = true;
                                h += 1;
                                c = c.key2
                            }
                            m.push(k)
                        }
                    }
                    m.length && b.push({
                        path: m,
                        style: a[e].style
                    })
                }
            }
            return b
        },
        pointKey: function(a, b) {
            return [a, b].join(",")
        },
        buildDefinition: function(a, b) {
            var c = new fljs.swf.def.ShapeDef;
            c.setCharaId(a.ShapeId);
            for (var d in b) {
                a = b[d][0];
                for (var e in a) {
                    var f = a[e];
                    if (this.isImagePath(f)) {
                        var g = new fljs.swf.def.ImageDef;
                        this.buildImageDef(g, f);
                        c.addImage(g)
                    } else {
                        f.style.def = this.buildFillDef(f.style);
                        f = this.buildPathDefinition(f.path,
                        f.style, null);
                        c.addPath(f)
                    }
                }
                a = b[d][1];
                for (e in a) {
                    f = a[e];
                    f = this.buildPathDefinition(f.path, null, f.style);
                    c.addPath(f)
                }
            }
            c.define();
            return c
        },
        sameStyle: function(a, b) {
            if (!a || !b) return false;
            if (a.def && b.def && a.def.fill && b.def.fill) if (a.def.fill.type == "Solid" && b.def.fill.type == "Solid") {
                if (a.def.fill.color != b.def.fill.color) return false
            } else return false;
            else if (a.def && b.def && (a.def.fill || b.def.fill)) return false;
            var c,
            d;
            c = a.HasFillFlag && a.FillType.Color ? a.FillType.Color: a.Color;
            if (b.HasFillFlag && b.FillType.Color) bcolor =
            b.FillType.Color;
            else d = b.Color;
            if (c && d) {
                if (this.rgbaToColor(c) != this.rgbaToColor(d)) return false;
                if (a.Width != b.Width) return false
            } else if (c || d) return false;
            return true
        },
        buildPathDefinition: function(a, b, c) {
            var d = new fljs.swf.def.PathDef;
            this.setPathLineStyle(d, c);
            this.setPathFillStyle(d, b);
            d.element.set(null, "d", this.pathToString(a));
            d.define();
            return d
        },
        isImagePath: function(a) {
            if (a.path.length != 1 || a.path[0].length != 1 || a.path[0][0].parts.length != 4 || !a.style) return false;
            var b = a.style.FillStyleType,
            c = fljs.swf.FillStyleTypes;
            if (! (b == c.RepeatingBitmapFill || b == c.ClippedBitmapFill || b == c.NonSmoothedRepeatingBitmapFill || b == c.NonSmoothedClippedBitmapFill)) return false;
            if (!fljs.Player.getInstance().dictionary[a.style.BitmapId]) return false;
            a = a.path[0][0].parts;
            for (b = 0; b < a.length; b++) {
                if (typeof a[b].cx != "undefined") return false;
                if (b < a.length - 1) {
                    var d = a[b],
                    e = a[b + 1],
                    f,
                    g,
                    j;
                    if (d.flipped) {
                        f = d.x2;
                        c = d.y2;
                        g = d.x1;
                        d = d.y1
                    } else {
                        f = d.x1;
                        c = d.y1;
                        g = d.x2;
                        d = d.y2
                    }
                    if (e.flipped) {
                        j = e.x1;
                        e = e.y1
                    } else {
                        j = e.x2;
                        e = e.y2
                    }
                    f = (f - g) * (j -
                    g);
                    c = (c - d) * (e - d);
                    g = f + c;
                    if (Math.abs(g) > 0.01) {
                        if (!f || !c) return false;
                        if (Math.abs(g / f) > 0.01 || Math.abs(g / c) > 0.01) return false
                    }
                }
            }
            return true
        },
        buildImageDef: function(a, b) {
            a.setBitmapId(b.style.BitmapId);
            for (var c = [], d = 0, e = 0, f = b.path[0][0].parts, g = 0; g < f.length; g++) {
                var j = f[g],
                h = Math.abs(j.x2 - j.x1);
                j = Math.abs(j.y2 - j.y1);
                if (h > d) d = h;
                if (j > e) e = j
            }
            a._use.set(null, "x", 0);
            a._use.set(null, "y", 0);
            a._use.set(null, "width", d);
            a._use.set(null, "height", e);
            if (b = b.style.BitmapMatrix) {
                b = this.utils.toMatrix(b);
                b.a /= 20;
                b.b /=
                20;
                b.c /= 20;
                b.d /= 20;
                c.push("translate(" + [b.tx, b.ty] + ")");
                b.tx = 0;
                b.ty = 0;
                c.push(b.__toSvgString())
            }
            a._use.set(null, "transform", c.toString());
            a._use.update();
            a.element.update();
            a.define()
        },
        appendPathToDef: function(a, b) {
            a = a.element.element;
            b = a.getAttributeNS(null, "d") + " " + this.pathToString(b);
            a.setAttributeNS(null, "d", b)
        },
        pathToString: function(a) {
            var b,
            c,
            d = [];
            for (var e in a) {
                var f = a[e];
                d.push("M", f[0].x1, f[0].y1);
                for (var g in f) {
                    b = f[g];
                    if (b.flipped) for (var j = b.parts.length - 1; j >= 0; j--) {
                        c = b.parts[j];
                        typeof c.cx ==
                        "undefined" ? d.push("L", c.x1, c.y1) : d.push("Q", c.cx, c.cy, c.x1, c.y1)
                    } else for (j in b.parts) {
                        c = b.parts[j];
                        typeof c.cx == "undefined" ? d.push("L", c.x2, c.y2) : d.push("Q", c.cx, c.cy, c.x2, c.y2)
                    }
                }
            }
            return d.join(" ")
        },
        setPathLineStyle: function(a, b) {
            if (b) {
                var c = {};
                c = b.HasFillFlag ? b.FillType.Color ? {
                    thickness: Math.max(b.Width, 1),
                    color: this.rgbaToColor(b.FillType.Color)
                }: {
                    thickness: 1,
                    color: 0
                }: {
                    thickness: Math.max(b.Width, 1),
                    color: this.rgbaToColor(b.Color)
                };
                a.setStroke(c)
            } else a.setStroke(null)
        },
        setPathFillStyle: function(a,
        b) {
            if (b) if (b.FillStyleType == fljs.swf.FillStyleTypes.SolidFill) this.setPathSolidFillStyle(a, b);
            else b.def && a.setFill(b.def);
            else a.setFill(null)
        },
        setPathSolidFillStyle: function(a, b) {
            a.setFill({
                type: "Solid",
                color: this.rgbaToColor(b.Color)
            })
        },
        buildFillDef: function(a) {
            if (!a) return null;
            var b = a.FillStyleType,
            c = fljs.swf.FillStyleTypes;
            return b == c.LinearGradientFill || b == c.RadialGradientFill || b == c.FocalRadialGradientFill ? this.buildGradientFillDef(a) : b == c.RepeatingBitmapFill || b == c.ClippedBitmapFill || b == c.NonSmoothedRepeatingBitmapFill ||
            b == c.NonSmoothedClippedBitmapFill ? this.buildBitmapFillDef(a) : null
        },
        buildGradientFillDef: function(a) {
            var b = new fljs.swf.def.GradientFillDef,
            c = [];
            if (a.FillStyleType == fljs.swf.FillStyleTypes.LinearGradientFill) {
                b.create("linearGradient");
                c.push([null, "x1", -819.2], [null, "x2", 819.2])
            } else {
                b.create("radialGradient");
                c.push([null, "cx", 0], [null, "cy", 0], [null, "r", 819.2])
            }
            c.push([null, "gradientUnits", "userSpaceOnUse"]);
            c.push([null, "gradientTransform", this.utils.toSvgMatrixString(a.GradientMatrix)]);
            var d,
            e = fljs.swf.SpreadMethods;
            switch (a.Gradient.SpreadMode) {
            case e.Pad:
                d = "pad";
                break;
            case e.Reflect:
                d = "reflect";
                break;
            case e.Repeat:
                d = "repeat";
                break
            }
            c.push([null, "spreadMethod", d]);
            var f;
            d = fljs.swf.InterpolationMethods;
            switch (a.Gradient.InterpolationMode) {
            case d.LinearRgb:
                f = "linearRGB";
                break;
            case d.Rgb:
                f = "rgb";
                break
            }
            c.push([null, "color-interpolation", f]);
            a = a.Gradient.GradientRecords;
            for (var g in a) {
                f = a[g];
                d = new fljs.swf.def.GradientFillStopDef;
                d.setColor(this.rgbaToColor(f.Color));
                e = [];
                e.push([null, "offset",
                f.Ratio / 255]);
                d.element.sets(e);
                d.element.update();
                b.addStop(d)
            }
            b.element.sets(c);
            b.define();
            return b
        },
        buildBitmapFillDef: function(a) {
            var b = new fljs.swf.def.BitmapFillDef;
            if (!b.setBitmapId(a.BitmapId)) {
                b.define();
                return b
            }
            var c = [];
            c.push([null, "patternUnits", "userSpaceOnUse"], [null, "x", 0], [null, "y", 0], [null, "width", b.bitmap.Width], [null, "height", b.bitmap.Height]);
            var d = [];
            if (a = a.BitmapMatrix) {
                a = this.utils.toMatrix(a);
                a.a /= 20;
                a.b /= 20;
                a.c /= 20;
                a.d /= 20;
                d.push("translate(" + [a.tx, a.ty] + ")");
                a.tx = 0;
                a.ty =
                0;
                d.push(a.__toSvgString())
            }
            c.push([null, "patternTransform", d.toString()]);
            b.element.sets(c);
            b.define();
            return b
        },
        rgbaToColor: function(a) {
            var b = (a.Red << 24) + (a.Green << 16) + (a.Blue << 8);
            b |= typeof a.Alpha != "undefined" ? a.Alpha: 255;
            return b
        }
    });
    fljs.swf.tag.DefineShape = function() {};
    fljs.addMethods(fljs.swf.tag.DefineShape, {
        read: function(a) {
            a.beginContext(fljs.swf.tag.DefineShape);
            this.defId = this.ShapeId = a.readUI16();
            this.ShapeBounds = a.readRECT();
            a.stream.align();
            this.Shapes = a.readSHAPEWITHSTYLE();
            a.endContext()
        },
        waitForBitmaps: function() {
            var a = fljs.Player.getInstance();
            this.bitmapIds = this.findBitmaps(this);
            this.waiting = 0;
            var b = fljs.Player.getInstance().mainTimeline.resources,
            c = [];
            for (var d in this.bitmapIds) if (b.waiting(d)) {
                this.waiting += 1;
                b.listen(d, fljs.bind(this.onLoad, this,
                a))
            } else c.push(d);
            for (var e in c) delete this.bitmapIds[c[e]]
        },
        onLoad: function(a, b) {
            if (this.bitmapIds[b]) {
                delete this.bitmapIds[b];
                this.waiting -= 1
            }
            this.waiting == 0 && this.evaluate(a)
        },
        evaluate: function(a) {
            this.bitmapIds || this.waitForBitmaps();
            if (! (this.waiting > 0)) {
                this.def = (new fljs.swf.build.ShapeBuilder).build(this);
                a.addDefinition(this, this.ShapeId)
            }
        },
        findBitmaps: function(a) {
            var b = {};
            this.findBitmapsForStyles(b, a.Shapes.FillStyles);
            a = a.Shapes.ShapeRecords;
            for (var c in a) {
                var d = a[c];
                d.type == "NONEDGE" &&
                d.StateNewStyles && this.findBitmapsForStyles(b, d.FillStyles)
            }
            return b
        },
        findBitmapsForStyles: function(a, b) {
            var c = fljs.swf.FillStyleTypes;
            for (var d in b) {
                var e = b[d],
                f = e.FillStyleType;
                if (f == c.RepeatingBitmapFill || f == c.ClippedBitmapFill || f == c.NonSmoothedRepeatingBitmapFill || f == c.NonSmoothedClippedBitmapFill) a[e.BitmapId] = true
            }
        },
        build: function(a, b, c) {
            a = new flash.display.Shape;
            a.useTag(this, b, c);
            return a
        }
    });
    fljs.dom = {};
    fljs.dom.Namespace = {
        Svg: "http://www.w3.org/2000/svg",
        Xlink: "http://www.w3.org/1999/xlink"
    };
    fljs.dom.Element = function(a) {
        this.element = a;
        this.changes = []
    };
    fljs.addMethods(fljs.dom.Element, {
        create: function(a, b) {
            if (arguments.length == 1) {
                b = a;
                this.element = document.createElement(b)
            } else this.element = document.createElementNS(a, b);
            this.changes = []
        },
        set: function(a, b, c) {
            if (arguments.length == 2) {
                c = b;
                b = a;
                this.changes.push([b, c])
            } else this.changes.push([a, b, c])
        },
        sets: function(a) {
            this.changes.push.apply(this.changes, a)
        },
        update: function() {
            var a = this.element,
            b = this.changes;
            for (var c in b) {
                var d = b[c];
                d.length == 2 ? a.setAttribute(d[0], d[1]) : a.setAttributeNS(d[0], d[1], d[2])
            }
            this.changes =
            []
        },
        append: function(a) {
            this.element.appendChild(a.element)
        },
        appendText: function(a) {
            this.element.appendChild(document.createTextNode(a))
        },
        clone: function(a) {
            var b = new fljs.dom.Element;
            b.element = this.element.cloneNode(a);
            b.changes = [];
            return b
        },
        remove: function(a) {
            this.element.removeChild(a.element)
        },
        getElement: function() {
            return this.element
        }
    });
    fljs.swf.build.FontBuilder = function(a, b) {
        this.tag = a;
        this.player = b
    };
    fljs.addMethods(fljs.swf.build.FontBuilder, {
        buildDef: function() {
            var a = this.buildGlyphPaths();
            return this.player.renderTextAsGlyphs ? this.buildFontDef(a) : this.buildShapeDef(a)
        },
        buildFontDef: function(a) {
            var b = this.tag,
            c = this.player.element.getElement().ownerDocument,
            d = c.createElementNS("http://www.w3.org/2000/svg", "font"),
            e = c.createElementNS("http://www.w3.org/2000/svg", "font-face");
            e.setAttributeNS(null, "font-family", "font-" + b.FontId);
            e.setAttributeNS(null, "units-per-em", 51.2);
            d.appendChild(e);
            for (var f in a) {
                e =
                c.createElementNS("http://www.w3.org/2000/svg", "glyph");
                e.setAttributeNS(null, "unicode", String.fromCharCode(b.CodeTable[f]));
                b.FontAdvanceTable && e.setAttributeNS(null, "horiz-adv-x", b.FontAdvanceTable[f] / 20);
                e.setAttributeNS(null, "d", a[f]);
                d.appendChild(e)
            }
            return [{
                element: d
            }]
        },
        buildShapeDef: function(a) {
            var b = this.tag,
            c = [];
            for (var d in a) {
                var e = new fljs.dom.Element;
                e.create(fljs.dom.Namespace.Svg, "path");
                var f = ["font", b.FontId, b.FontFlagsBold, b.FontFlagsItalic, b.CodeTable[d]].join("-");
                if (document.getElementById(f)) rar.rar =
                rar;
                e.sets([["id", f], ["d", a[d]]]);
                e.update();
                c.push(e)
            }
            return c
        },
        buildGlyphPaths: function() {
            for (var a = [], b = this.tag.GlyphShapeTable, c = 0, d = b.length; c < d; c++) {
                var e = this.buildPath(this.buildGlyph(b[c]));
                a.push(e)
            }
            return a
        },
        buildGlyph: function(a) {
            var b = 0,
            c = 0,
            d = 0,
            e = 0,
            f = 0,
            g = 0;
            a = a.ShapeRecords;
            var j = [],
            h = [],
            m = 1;
            if (this.tag instanceof fljs.swf.tag.DefineFont3) m = 20;
            var k = function(n) {
                return Math.round(n * 100) / 100 / m
            };
            for (var l in a) {
                g = a[l];
                switch (g.type) {
                case "STRAIGHT":
                    f = b + g.DeltaX;
                    g = c + g.DeltaY;
                    h.push({
                        x1: k(b),
                        y1: k(c),
                        x2: k(f),
                        y2: k(g)
                    });
                    b = f;
                    c = g;
                    break;
                case "CURVED":
                    d = b + g.ControlDeltaX;
                    e = c + g.ControlDeltaY;
                    f = d + g.AnchorDeltaX;
                    g = e + g.AnchorDeltaY;
                    h.push({
                        x1: k(b),
                        y1: k(c),
                        cx: k(d),
                        cy: k(e),
                        x2: k(f),
                        y2: k(g)
                    });
                    b = f;
                    c = g;
                    break;
                case "NONEDGE":
                    if (g.StateMoveTo) {
                        h.length && j.push(h);
                        b = g.MoveDeltaX;
                        c = g.MoveDeltaY;
                        h = []
                    }
                    break
                }
            }
            h.length && j.push(h);
            return j
        },
        buildPath: function(a) {
            var b = [],
            c = this.player.renderTextAsGlyphs ? -1: 1,
            d;
            for (var e in a) {
                var f = a[e];
                b.push("M", f[0].x1, f[0].y1 * c);
                for (var g in f) {
                    d = f[g];
                    typeof d.cx == "undefined" ?
                    b.push("L", d.x2, d.y2 * c) : b.push("Q", d.cx, d.cy * c, d.x2, d.y2 * c)
                }
            }
            b.length == 0 && b.push("M", 0, 0);
            return b.join(" ")
        }
    });
    fljs.swf.build.FontBuilder.id = 1;
    fljs.swf.tag.DefineFont = function() {};
    fljs.addMethods(fljs.swf.tag.DefineFont, {
        read: function(a) {
            this.FontId = a.readUI16();
            this.OffsetTable = [a.readUI16()];
            var b = this.OffsetTable[0] / 2;
            this.NumGlyphs = b;
            for (var c = 1; c < b; c++) this.OffsetTable.push(a.readUI16());
            this.GlyphShapeTable = [];
            for (c = 0; c < b; c++) this.GlyphShapeTable.push(a.readSHAPE())
        },
        evaluate: function(a) {
            this.CodeTable = [];
            for (var b in this.GlyphShapeTable) this.CodeTable.push(b);
            this.FontName = "font-no-info-" + this.FontId;
            this.FontFlagsItalic = this.FontFlagsBold = false;
            a.fontsWithoutInfo[this.FontId] =
            this;
            b = (new fljs.swf.build.FontBuilder(this, a)).buildDef();
            a.defineFont2(this.FontId, this.GlyphShapeTable, b, this.FontName, this.FontFlagsBold, this.FontFlagsItalic, this.CodeTable)
        }
    });
    fljs.swf.tag.SetBackgroundColor = function() {};
    fljs.addMethods(fljs.swf.tag.SetBackgroundColor, {
        read: function(a) {
            this.BackgroundColor = a.readRGB()
        },
        evaluate: function(a) {
            a.stage.setBackgroundColor_((this.BackgroundColor.Red << 16) + (this.BackgroundColor.Green << 8) + this.BackgroundColor.Blue)
        }
    });
    fljs.swf.tag.DoAbc = function() {};
    fljs.addMethods(fljs.swf.tag.DoAbc, {
        read: function(a, b) {
            var c = a.stream.byteIndex;
            this.Flags = a.readUI32();
            this.Name = a.readString();
            b = b.TagLength - (a.stream.byteIndex - c);
            c = [];
            for (var d = 0; d < b; d++) c.push(String.fromCharCode(a.readUB()));
            this.AbcData = c.join("")
        },
        evaluate: function() {}
    });
    fljs.swf.tag.SoundStreamBlock = function() {};
    fljs.addMethods(fljs.swf.tag.SoundStreamBlock, {
        read: function(a, b) {
            this.SampleCount = a.readUI16();
            this.Mp3SoundData = a.readMp3SoundData(b.TagLength - 2)
        },
        evaluate: function(a, b, c, d) {
            if (d == a.mainTimeline) if (b = d.audioStream) {
                b.shouldBuffer() && b.buffer();
                c = a.mainTimeline.currentFrameIndex_;
                if (!b.playing && b.frameShouldPlay(c)) {
                    b.playFrame(c);
                    a.sync.start(c)
                }
            }
        },
        duration: function() {
            var a = 0;
            for (var b in this.Mp3SoundData.Mp3Frames) {
                var c = this.Mp3SoundData.Mp3Frames[b],
                d;
                d = c.MpegVersion == 3 ? 1152: 576;
                var e = {
                    0: 11025,
                    1: 12E3,
                    2: 8E3
                } [c.SamplingRate];
                e *= {
                    0: 1,
                    2: 2,
                    3: 4
                } [c.MpegVersion];
                a += 1E3 * d / e / (c.ChannelMode == 3 ? 1: 2)
            }
            return a
        }
    });
    fljs.swf.SwfStreamingSoundReader = function(a, b) {
        this.stream = new fljs.swf.SwfStream(new fljs.swf.StringStream(a));
        this.container = b;
        b.soundStream = this;
        this.tagMap = {
            19: fljs.swf.tag.SoundStreamBlock
        };
        this.currentTimeOffset = this.currentPlayer = 0;
        this.data = [];
        this.dataDurations = [];
        this.container.needAudio();
        for (a = 0; a < 2; a++) {
            b = this.container.audio[a];
            b.currentTimeOffset = 0;
            b.addEventListener("load", fljs.bind(this.onLoadSrc, this, a), true)
        }
        this.lastBufferAt = null;
        this.swfFrames = {};
        this.duration = this.swfFrameNum =
        0;
        this.playing = false;
        this.nextTime = null;
        this.waitingForLoad = false;
        this.dataOffset = 0;
        this.player = fljs.Player.getInstance()
    };
    fljs.addMethods(fljs.swf.SwfStreamingSoundReader, {
        controlFrame: function() {},
        timeDiff: function(a) {
            var b = this.container.audio[this.currentPlayer];
            return 1E3 * (b.currentTime + b.currentTimeOffset) - this.swfFrames[a]
        },
        currentTime: function() {
            var a = this.container.audio[this.currentPlayer];
            return 1E3 * (a.currentTime + a.currentTimeOffset)
        },
        play: function(a) {
            a = this.swfFrames[a];
            if (a == null) a = 0;
            a /= 1E3;
            this.nextTime = a;
            this.playing = true;
            if (!this.waitingForLoad) {
                var b = this.container.audio[this.currentPlayer];
                b.currentTime =
                a - b.currentTimeOffset;
                b.fljsPlaying = true;
                this.player.playing && b.play()
            }
        },
        stop: function() {
            this.playing = false;
            var a = this.container.audio[this.currentPlayer];
            a.fljsPlaying = false;
            a.pause()
        },
        silence: function() {
            return ""
        },
        onLoadSrc: function(a) {
            var b = this.container.audio[a],
            c = this.container.audio[1 - a];
            b.fljsWaiting = false;
            if (this.nextTime != null) {
                b.currentTime = this.nextTime - b.currentTimeOffset;
                this.nextTime = null
            } else b.currentTime = c.currentTime + c.currentTimeOffset - b.currentTimeOffset;
            if (this.playing) {
                b.fljsPlaying =
                true;
                this.player.playing && b.play()
            }
            c.fljsPlaying = false;
            c.pause();
            this.currentPlayer = a;
            this.waitingForLoad = false
        },
        processBlock: function(a, b) {
            a = new fljs.swf.StringStream(this.stream.stream.buffer);
            a.byteIndex = b.Mp3SoundData.byteIndex;
            a = a.readBytes(b.Mp3SoundData.byteCount).join("");
            this.data.push(String(a));
            if (b.SampleCount) {
                a = b.duration();
                b = a * (b.Mp3SoundData.SeekSamples / b.SampleCount);
                this.swfFrames[this.swfFrameNum] = this.duration + b;
                this.sync && this.sync.setFrameTime(this.swfFrameNum, this.duration +
                b);
                this.duration += a
            } else a = 0;
            this.dataDurations.push(a / 1E3);
            this.blocks += 1;
            return this.blocks < fljs.swf.SwfStreamingSoundReader.bufferBlocks
        },
        buffer: function() {
            this.blocks = 0;
            this.readTags(fljs.bind(this.processBlock, this), this.stream.stream.byteIndex);
            for (var a = this.container.audio[this.currentPlayer], b = this.container.audio[1 - this.currentPlayer]; this.currentTimeOffset + this.dataDurations[this.dataOffset] < a.currentTime + a.currentTimeOffset;) {
                this.currentTimeOffset += this.dataDurations[this.dataOffset];
                this.dataOffset += 1
            }
            a = "data:audio/mpeg;base64," + btoa(this.data.slice(this.dataOffset).join(""));
            b.currentTimeOffset = this.currentTimeOffset;
            b.setAttribute("src", a);
            this.waitingForLoad = true;
            b.fljsWaiting = true;
            b.load();
            this.lastBufferAt = fljs.now()
        },
        readTags: function(a, b) {
            var c = fljs.console("soundstream");
            if (b) this.stream.stream.seek(b);
            else this.stream.header = this.stream.readSwfHeader();
            for (var d, e; this.stream.hasMore();) {
                d = this.stream.readRecordHeader();
                e = this.tagMap[d.TagType];
                b = this.stream.stream.byteIndex;
                if (e) {
                    e = new e;
                    e.read(this.stream, d, this, a, fljs.Player.getInstance().stage);
                    if (!a(d, e)) return
                } else {
                    this.stream.skipBytes(d.TagLength);
                    if (d.TagType == 1) this.swfFrameNum += 1
                }
                if (this.stream.stream.byteIndex != b + d.TagLength) {
                    c.info("expected " + (b + d.TagLength) + " but got " + this.stream.stream.byteIndex);
                    return
                }
            }
        }
    });
    fljs.swf.SwfStreamingSoundReader.rebufferDuration = 9E4;
    fljs.swf.SwfStreamingSoundReader.bufferBlocks = 4500;
    fljs.swf.tag.SoundStreamHead = function() {};
    fljs.addMethods(fljs.swf.tag.SoundStreamHead, {
        read: function(a) {
            a.readUB(4);
            this.PlaybackSoundRate = a.readUB(2);
            this.PlaybackSoundSize = a.readUB(1);
            this.PlaybackSoundType = a.readUB(1);
            this.StreamSoundCompression = a.readUB(4);
            this.StreamSoundRate = a.readUB(2);
            this.StreamSoundSize = a.readUB(1);
            this.StreamSoundType = a.readUB(1);
            this.StreamSoundSampleCount = a.readUI16();
            if (this.StreamSoundCompression == 2) this.LatencySeek = a.readSI16()
        },
        evaluate: function(a, b, c, d) {
            if (!this.processed) {
                d.soundStreamHead = this;
                if (d ==
                a.mainTimeline) {
                    d.audioStream = fljs.agent.browser == "Firefox" ? new fljs.player.ExtAudioStream(a, d, "audio/" + a.name + "-" + (d.def ? d.def.defId: "main") + ".wav") : new fljs.player.SwfAudioStream(a, d);
                    a.sync = new fljs.player.AudioSync(a.header.FrameRate);
                    a.sync.setAudio(d.audioStream);
                    d.audioStream.buffer()
                }
                this.processed = true
            }
        }
    });
    fljs.swf.tag.DefineFont2 = function() {};
    fljs.addMethods(fljs.swf.tag.DefineFont2, {
        read: function(a) {
            var b;
            this.FontId = a.readUI16();
            this.FontFlagsHasLayout = a.readUB(1);
            this.FontFlagsShiftJIS = a.readUB(1);
            this.FontFlagsSmallText = a.readUB(1);
            this.FontFlagsANSI = a.readUB(1);
            this.FontFlagsWideOffsets = a.readUB(1);
            this.FontFlagsWideCodes = a.readUB(1);
            a.FontFlagsWideCodes = this.FontFlagsWideCodes;
            this.FontFlagsItalic = a.readUB(1);
            this.FontFlagsBold = a.readUB(1);
            this.LanguageCode = a.readLangCode();
            this.FontNameLen = a.readUI8();
            var c = [];
            for (b = 0; b < this.FontNameLen; b++) c.push(String.fromCharCode(a.readUI8()));
            this.FontName = c.join("");
            this.NumGlyphs = a.readUI16();
            this.OffsetTable = [];
            if (this.FontFlagsWideOffsets) {
                for (b = 0; b < this.NumGlyphs; b++) this.OffsetTable.push(a.readUI32());
                this.CodeTableOffset = a.readUI32()
            } else {
                for (b = 0; b < this.NumGlyphs; b++) this.OffsetTable.push(a.readUI16());
                this.CodeTableOffset = a.readUI16()
            }
            this.GlyphShapeTable = [];
            for (b = 0; b < this.NumGlyphs; b++) this.GlyphShapeTable.push(a.readShape());
            this.CodeTable = [];
            if (this.FontFlagsWideCodes) for (b = 0; b < this.NumGlyphs; b++) this.CodeTable.push(a.readUI16());
            else for (b = 0; b < this.NumGlyphs; b++) this.CodeTable.push(a.readUI8());
            if (this.FontFlagsHasLayout) {
                this.FontAscent = a.readSI16();
                this.FontDescent = a.readSI16();
                this.FontLeading = a.readSI16();
                this.FontAdvanceTable = [];
                for (b = 0; b < this.NumGlyphs; b++) this.FontAdvanceTable.push(a.readSI16());
                this.FontBoundsTable = [];
                for (b = 0; b < this.NumGlyphs; b++) {
                    this.FontBoundsTable.push(a.readRECT());
                    a.stream.align()
                }
                this.KerningCount = a.readUI16();
                this.FontKerningTable = [];
                for (b = 0; b < this.KerningCount; b++) this.FontKerningTable.push(a.readKerningRecord())
            }
        },
        evaluate: function(a) {
            var b = (new fljs.swf.build.FontBuilder(this, a)).buildDef();
            a.defineFont2(this.FontId, this.GlyphShapeTable.length, b, this.FontName, this.FontFlagsBold, this.FontFlagsItalic, this.CodeTable, this)
        }
    });
    flash.text = {};
    flash.text.TextFormatAlign = function() {};
    fljs.addConstants(flash.text.TextFormatAlign, {
        CENTER: "center",
        JUSTIFY: "justify",
        LEFT: "left",
        RIGHT: "right"
    });
    flash.text.TextFormat = function(a, b, c, d, e, f, g, j, h, m, k, l, n, p) {
        if (typeof a == "undefined") a = null;
        this.font = a;
        if (typeof b == "undefined") b = null;
        this.size = b;
        if (typeof c == "undefined") c = null;
        this.color = c;
        if (typeof d == "undefined") d = null;
        this.bold = d;
        if (typeof e == "undefined") e = null;
        this.italic = e;
        if (typeof f == "undefined") f = null;
        this.underline = f;
        if (typeof g == "undefined") g = null;
        this.url = g;
        if (typeof j == "undefined") j = null;
        this.target = j;
        if (typeof h == "undefined") h = flash.text.TextFormatAlign.LEFT;
        this.align = h;
        if (typeof m ==
        "undefined") m = null;
        this.leftMargin = m;
        if (typeof k == "undefined") k = null;
        this.rightMargin = k;
        if (typeof l == "undefined") l = null;
        this.indent = l;
        if (typeof n == "undefined") n = null;
        this.leading = n;
        if (typeof p == "undefined") p = 1;
        this.alpha = p
    };
    flash.text.TextField = function() {
        flash.display.InteractiveObject.call(this);
        var a = this.element_ = new fljs.dom.Element;
        a.create(fljs.dom.Namespace.Svg, "g");
        this._clipElement.element.appendChild(this.element_.getElement());
        this.font_ = {
            family: "times",
            size: 12
        };
        this.fill_ = {
            color: 0
        };
        this.textFormat_ = new flash.text.TextFormat(this.font_.family, this.font_.size, this.fill_.color, false, false, false, null, null, flash.text.TextFormatAlign.LEFT, 0, 0, 0, 0);
        if (fljs.Player.getInstance().renderTextAsGlyphs) {
            a = Math.round(this.font_.size *
            0.85);
            var b = Math.round(0 - this.font_.size / 2 + a);
            a = this._text = this.text_ = new fljs.dom.Element;
            a.create(fljs.dom.Namespace.Svg, "text");
            a.sets([[null, "fill", this.__colorToSvgString(this.font_.color)], [null, "font-family", this.font_.family], [null, "font-size", this.font_.size], [null, "font-family", this.font_.family], [null, "x", 0], [null, "y", b]]);
            a.update();
            this.element_.append(a)
        } else {
            a = this._text = new fljs.dom.Element;
            a.create(fljs.dom.Namespace.Svg, "g");
            a.update();
            this.element_.append(a)
        }
        this._textContent = ""
    };
    fljs.inherits(flash.text.TextField, flash.display.InteractiveObject);
    fljs.addMethods(flash.text.TextField, {
        setTextMatrix: function(a) {
            this._textMatrix = a;
            this._text.set(null, 'transform', a.__toSvgString());
            this._text.update()
        },
        __setSpans: function(a) {
            var b = [];
            this.spans = [];
            if (fljs.Player.getInstance().renderTextAsGlyphs) {
                var c = this.text_.getElement().ownerDocument;
                for (var d in a) {
                    var e = a[d],
                    f = c.createElementNS("http://www.w3.org/2000/svg", "tspan"),
                    g = e.format.indent,
                    j = [g];
                    for (var h in e.advances) {
                        g += e.advances[h];
                        j.push(g)
                    }
                    f.appendChild(c.createTextNode(e.text));
                    f.setAttributeNS(null, "x", j.join(" "));
                    f.setAttributeNS(null, "y", e.format.leading);
                    f.setAttributeNS(null, "font-size", e.format.size);
                    f.setAttributeNS(null, "fill", this.__colorToSvgString(e.format.color));
                    f.setAttributeNS(null, "fill-opacity", this.textOpacityWithXform(e.format.alpha));
                    this.text_.getElement().appendChild(f);
                    this.spans.push({
                        def: e,
                        element: f
                    });
                    b.push(e.text)
                }
            } else {
                fljs.Player.getInstance();
                c = this._text;
                for (d in a) {
                    e = a[d];
                    f = e.format;
                    j = e.advances;
                    var m = new fljs.dom.Element;
                    m.create(fljs.dom.Namespace.Svg, "g");
                    m.sets([["transform", ["translate(", f.indent, ",", f.leading, ")"].join("")], ["fill", this.__colorToSvgString(f.color)],
                    ["fill-opacity", this.opacityWithXform(f.alpha)]]);
                    m.update();
                    h = g = 0;
                    for (var k = e.text.length; h < k; h++) {
                        var l = new fljs.dom.Element;
                        l.create(fljs.dom.Namespace.Svg, "use");
                        var n = ["font", f.fontid, f.bold, f.italic, e.text.charCodeAt(h)].join("-");
                        l.sets([[fljs.dom.Namespace.Xlink, "xlink:href", "#" + n], ["transform", ["translate(", g, ")scale(", f.size * 20 / 1024, ")"].join("")]]);
                        l.update();
                        m.append(l);
                        g += j[h]
                    }
                    c.append(m);
                    this.spans.push({
                        def: e,
                        element: m
                    });
                    b.push(e.text)
                }
            }
            this._textContent = b.join("")
        },
        __colorToSvgString: function(a) {
            var b =
            a >> 16 & 255,
            c = a >> 8 & 255;
            a = a & 255;
            var d = this.getTransform().getConcatenatedColorTransform();
            if (!d.__default) {
                b = Math.max(0, Math.min(255, Math.round(b * d.redMultiplier + d.redOffset)));
                c = Math.max(0, Math.min(255, Math.round(c * d.greenMultiplier + d.greenOffset)));
                a = Math.max(0, Math.min(255, Math.round(a * d.blueMultiplier + d.blueOffset)))
            }
            return "rgb(" + [b, c, a] + ")"
        },
        opacityWithXform: function(a) {
            return a
        },
        textOpacityWithXform: function(a) {
            var b = this.getTransform().getConcatenatedColorTransform();
            return b.__default ? a: Math.max(0,
            Math.min(255, Math.round(a * 255 * b.alphaMultiplier + b.alphaOffset))) / 255
        },
        __setColorTransform: function(a) {
            if (fljs.Player.getInstance().renderTextAsGlyphs) for (var b in this.spans) {
                var c = this.spans[b];
                a = c.def;
                c = c.element;
                c.setAttributeNS(null, "color", this.__colorToSvgString(a.format.color));
                c.setAttributeNS(null, "fill-opacity", this.textOpacityWithXform(a.format.alpha))
            } else {
                fljs.base(this, "__setColorTransform", a);
                for (b in this.spans) {
                    c = this.spans[b];
                    a = c.def;
                    c = c.element;
                    c.sets([[null, "color", this.__colorToSvgString(a.format.color)]]);
                    c.update()
                }
            }
        },
        setHeight: function(a) {
            this.height_ = a
        },
        setWidth: function(a) {
            this.width_ = a
        },
        getDefaultTextFormat: function() {
            return this.textFormat_
        },
        setDefaultTextFormat: function(a) {
            if (fljs.Player.getInstance().renderTextAsGlyphs) {
                var b = this.textFormat_;
                this.textFormat_ = a;
                if (b.align != this.textFormat_.align) switch (this.textFormat_.align) {
                case flash.text.TextFormatAlign.LEFT:
                    this.text_.getElement().setAttribute("x", this.x);
                    this.text_.getElement().setAttribute("text-anchor", "start");
                    break;
                case flash.text.TextFormatAlign.CENTER:
                    this.text_.getElement().setAttribute("x",
                    this.x + this.width / 2);
                    this.text_.getElement().setAttribute("text-anchor", "middle");
                    break;
                case flash.text.TextFormatAlign.LEFT:
                    this.text_.getElement().setAttribute("x", this.x + this.width);
                    this.text_.getElement().setAttribute("text-anchor", "end");
                    break;
                default:
                }
                if (b.font != this.textFormat_.font) {
                    a = fljs.Player.getInstance().lookupFontByStyle(this.textFormat_.font, this.textFormat_.bold, this.textFormat_.italic);
                    this.text_.getElement().setAttributeNS(null, "font-family", a)
                }
                if (b.bold != this.textFormat_.bold) {
                    a =
                    this.textFormat_.bold ? "bold": "";
                    this.text_.getElement().setAttribute("font-weight", a)
                }
                if (b.italic != this.textFormat_.italic) {
                    a = this.textFormat_.italic ? "italic": "";
                    this.text_.getElement().setAttribute("font-style", a)
                }
                if (b.color != this.textFormat_.color) {
                    this.fill_ = {
                        color: this.textFormat_.color
                    };
                    this.text_.set(null, "fill", this.__colorToSvgString(this.fill_.color))
                }
                if (b.size != this.textFormat_.size) {
                    this.font_ = {
                        size: this.textFormat_.size,
                        family: this.textFormat_.font
                    };
                    this.text_.getElement().setAttribute("font-size",
                    this.textFormat_.size)
                }
                b.alpha != this.textFormat_.alpha && this.text_.getElement().setAttribute("opacity", this.textFormat_.alpha)
            }
        }
    });
    fljs.swf.tag.DefineEditText = function() {};
    fljs.addMethods(fljs.swf.tag.DefineEditText, {
        read: function(a) {
            this.CharacterId = a.readUI16();
            this.Bounds = a.readRECT();
            a.stream.align();
            this.HasText = a.readUB(1);
            this.WordWrap = a.readUB(1);
            this.Multiline = a.readUB(1);
            this.Password = a.readUB(1);
            this.ReadOnly = a.readUB(1);
            this.HasTextColor = a.readUB(1);
            this.HasMaxLength = a.readUB(1);
            this.HasFont = a.readUB(1);
            this.HasFontClass = a.readUB(1);
            this.AutoSize = a.readUB(1);
            this.HasLayout = a.readUB(1);
            this.NoSelect = a.readUB(1);
            this.Border = a.readUB(1);
            this.WasStatic = a.readUB(1);
            this.HTML = a.readUB(1);
            this.UseOutlines = a.readUB(1);
            if (this.HasFont) this.FontId = a.readUI16();
            if (this.HasFontClass) this.FontClass = a.readString();
            if (this.HasFont) this.FontHeight = a.readUI16() / a.twipsPerPixel;
            if (this.HasTextColor) this.TextColor = a.readRGBA();
            if (this.HasMaxLength) this.MaxLength = a.readUI16();
            if (this.HasLayout) {
                this.Align = a.readUI8();
                this.LeftMargin = a.readUI16();
                this.RightMargin = a.readUI16();
                this.Indent = a.readUI16();
                this.Leading = a.readUI16()
            }
            this.VariableName = a.readString();
            if (this.HasText) this.InitialText =
            a.readString()
        },
        evaluate: function(a) {
            a.addDefinition(this, this.CharacterId)
        },
        _build: function(a) {
            a = a.element.getElement().ownerDocument;
            var b = a.createElement("text");
            b.setAttribute("font-family", "font-" + String(this.FontId));
            b.setAttribute("font-size", this.FontHeight);
            var c = this.TextColor,
            d = 0;
            d += c.Red << 16;
            d += c.Green << 8;
            d += c.Blue;
            b.setAttribute("fill", d);
            var e,
            f;
            if (this.Align) {
                if (this.Align == 1) {
                    e = this.Bounds.Xmax;
                    f = "end"
                }
            } else {
                e = this.Bounds.Xmin;
                f = "start"
            }
            b.setAttribute("x", e);
            b.setAttribute("text-anchor",
            f);
            b.setAttribute("y", this.Bounds.Ymax);
            b.appendChild(a.createTextNode(this.InitialText ? this.InitialText: ""));
            return b
        },
        build: function(a, b) {
            return this._buildTextField(a, b)
        },
        _buildTextField: function(a, b) {
            var c = new flash.text.TextField;
            b && c.getTransform().setColorTransform(b);
            c.text = this.InitialText;
            c.x = this.Bounds.Xmin;
            c.y = this.Bounds.Ymin;
            c.setWidth(this.Bounds.Xmax - this.Bounds.Xmin);
            c.setHeight(this.Bounds.Ymax - this.Bounds.Ymin);
            b = new flash.text.TextFormat;
            switch (this.Align) {
            case 0:
                b.align = flash.text.TextFormatAlign.LEFT;
                break;
            case 1:
                b.align = flash.text.TextFormatAlign.RIGHT;
                break;
            case 2:
                b.align = flash.text.TextFormatAlign.CENTER;
                break;
            case 3:
                b.align = flash.text.TextFormatAlign.JUSTIFY;
                break
            }
            if (a = a.fonts2[this.FontId]) {
                b.bold = a.bold;
                b.italic = a.italic;
                b.font = a.name
            }
            a = this.TextColor;
            var d = 0;
            d += a.Red << 16;
            d += a.Green << 8;
            d += a.Blue;
            b.color = d;
            b.leading = this.Leading;
            b.leftMargin = this.LeftMargin;
            b.rightMargin = this.RightMargin;
            b.indent = this.Indent;
            b.size = this.FontHeight;
            c.setDefaultTextFormat(b);
            return c
        }
    });
    fljs.swf.tag.RemoveObject2 = function() {};
    fljs.addMethods(fljs.swf.tag.RemoveObject2, {
        read: function(a) {
            this.Depth = a.readUI16()
        },
        evaluate: function(a, b, c, d) {
            d.removeChildAt(this.Depth)
        }
    });
    fljs.swf.build.JpegBuilder = function() {};
    fljs.addMethods(fljs.swf.build.JpegBuilder, {
        parseJpeg: function(a, b, c, d) {
            b = String(b.readBytes(c).join(""));
            var e = new fljs.swf.BigEndianStringStream(b),
            f,
            g,
            j = fljs.Player.getInstance(),
            h;
            if (e.nextUShort() == 65497) {
                h = d && j.jpegTables ? 6: 4;
                e.nextUShort();
                e.nextUShort()
            } else h = d && j.jpegTables ? 2: 0;
            for (var m = 0; e.byteIndex < c;) {
                f = e.nextUShort();
                g = e.nextUShort();
                if (f == 65472) {
                    e.nextUByte();
                    a.Height = e.nextUShort();
                    a.Width = e.nextUShort();
                    break
                }
                if (f == 65497) m = e.byteIndex - 6;
                else e.skipBytes(g - 2)
            }
            if (m) b = b.substr(0, m) +
            b.substr(m + 6);
            if (h) b = b.substr(h);
            a.DataUri = "data:image/jpeg;base64," + btoa((d && j.jpegTables ? j.jpegTables: "") + b)
        },
        parseJpegTables: function(a, b, c) {
            b = String(b.readBytes(c).join(""));
            var d = new fljs.swf.BigEndianStringStream(b),
            e = 0;
            if (d.nextUShort() == 65497) {
                e = 4;
                d.nextUShort();
                d.nextUShort()
            }
            a.JpegTables = b.substr(e, c - e - 2)
        }
    });
    fljs.swf.tag.DefineBitsJPEG2 = function() {};
    fljs.addMethods(fljs.swf.tag.DefineBitsJPEG2, {
        read: function(a, b) {
            this.CharacterId = a.readUI16();
            b = b.TagLength - 2; (new fljs.swf.build.JpegBuilder).parseJpeg(this, a, b, true)
        },
        evaluate: function(a) {
            this.defId = "image" + this.CharacterId;
            a.addDefinition(this, this.CharacterId);
            a = new fljs.swf.def.BitmapDef;
            a.setCharaId(this.defId);
            a.element.sets([[fljs.dom.Namespace.Xlink, "xlink:href", this.DataUri], [null, "x", 0], [null, "y", 0], [null, "width", this.Width], [null, "height", this.Height]]);
            a.define();
            this.def = a
        }
    });
    flash.display.Sprite = function() {
        flash.display.DisplayObjectContainer.call(this)
    };
    fljs.inherits(flash.display.Sprite, flash.display.DisplayObjectContainer);
    fljs.addMethods(flash.display.Sprite, {
        startDrag: function() {},
        stopDrag: function() {},
        getGraphics: function() {
            return this.graphics_
        }
    });
    flash.display.Scene = function() {};
    flash.ui = {};
    flash.ui.Keyboard = function() {};
    fljs.addStaticMethods(flash.ui.Keyboard, {
        isAccessible: function() {}
    });
    fljs.addConstants(flash.ui.Keyboard, {
        BACKSPACE: 8,
        CAPS_LOCK: 20,
        CONTROL: 17,
        DELETE: 46,
        DOWN: 40,
        END: 35,
        ENTER: 13,
        ESCAPE: 27,
        F1: 112,
        F10: 121,
        F11: 122,
        F12: 123,
        F13: 124,
        F14: 125,
        F15: 126,
        F2: 113,
        F3: 114,
        F4: 115,
        F5: 116,
        F6: 117,
        F7: 118,
        F8: 119,
        F9: 120,
        HOME: 36,
        INSERT: 45,
        LEFT: 37,
        NUMPAD_0: 96,
        NUMPAD_1: 97,
        NUMPAD_2: 98,
        NUMPAD_3: 99,
        NUMPAD_4: 100,
        NUMPAD_5: 101,
        NUMPAD_6: 102,
        NUMPAD_7: 103,
        NUMPAD_8: 104,
        NUMPAD_9: 105,
        NUMPAD_ADD: 107,
        NUMPAD_DECIMAL: 110,
        NUMPAD_DIVIDE: 111,
        NUMPAD_ENTER: 108,
        NUMPAD_MULTIPLY: 106,
        NUMPAD_SUBTRACT: 109,
        PAGE_DOWN: 34,
        PAGE_UP: 33,
        RIGHT: 39,
        SHIFT: 16,
        SPACE: 32,
        TAB: 9,
        UP: 38
    });
    fljs.swf.AudioStreamReader = function(a, b) {
        this.player = a;
        this.delegate = b;
        this.reader = new fljs.swf.TagReader(a.parser.reader.stream.stream.buffer);
        this.reader.readSwfHeader()
    };
    fljs.addMethods(fljs.swf.AudioStreamReader, {
        hasMore: function() {
            return this.reader.stream.hasMore()
        },
        read: function(a) {
            for (var b = 0, c = this.delegate, d = this.reader, e = [0]; d.stream.hasMore();) {
                var f = d.readTagHeader();
                switch (f.tagClass()) {
                case fljs.swf.tag.SoundStreamBlock:
                    f = d.readTag(f);
                    c.onSoundStreamBlockTag(f, null, e[0]);
                    b++;
                    if (b == a) return;
                    break;
                case fljs.swf.tag.ShowFrame:
                    f = d.readTag(f);
                    c.onShowFrameTag(f, null, e[0]);
                    e[0] += 1;
                    break;
                default:
                    d.skipTag(f);
                    c.onUnknownTag && c.onUnknownTag(f, null, e[0]);
                    break
                }
            }
        }
    });
    fljs.player = {};
    fljs.player.ResourceManager = function() {
        this.frames = {};
        this.res = {};
        this.streams = {};
        this.listeners = {}
    };
    fljs.addMethods(fljs.player.ResourceManager, {
        addToFrame: function(a, b) {
            this.frames[b] || (this.frames[b] = {});
            this.frames[b][a] = true;
            this.res[a] = b
        },
        remove: function(a) {
            if (this.listeners[a]) for (var b in this.listeners[a]) this.listeners[a][b](a);
            b = this.res[a];
            delete this.listeners[a];
            delete this.frames[b][a];
            delete this.res[a]
        },
        addStream: function(a) {
            this.streams[a.id] = a
        },
        frameReady: function(a) {
            for (var b = 0; b <= a; b++) {
                var c = this.frames[a];
                if (c) for (var d in c) return false
            }
            for (b in this.streams) if (!this.streams[b].frameReady(a)) return false;
            return true
        },
        listen: function(a, b) {
            var c = this.listeners[a];
            c || (c = this.listeners[a] = []);
            c.push(b)
        },
        waiting: function(a) {
            return a in this.res
        },
        newId: function() {
            return fljs.player.ResourceManager.id++
        }
    });
    fljs.player.ResourceManager.id = 1;
    fljs.player.ExtAudioStream = function(a, b, c) {
        this.id = b.resources.newId();
        b.resources.addStream(this);
        b = this.audio = a.allocAudio();
        b.addEventListener("canplaythrough", fljs.bind(this.onAudioLoad, this), true);
        b.setAttribute("src", c);
        b.load();
        this.frames = {};
        this.playing = false;
        this.audioStreamReader = new fljs.swf.AudioStreamReader(a, this);
        this.duration = 0;
        this.maxFrame = -1
    };
    fljs.addMethods(fljs.player.ExtAudioStream, {
        pingLoad: function() {},
        frameReady: function(a) {
            if (this.maxFrame < a) return false;
            if (typeof this.frames[a] != "undefined") return true;
            else {
                for (a = a; a > 0 && typeof this.frames[a] == "undefined";) a--;
                return a == 0 ? true: this.frameReady(a)
            }
        },
        frameShouldPlay: function(a) {
            for (a = a; a > 0;) {
                if (a in this.frames) return !! this.frames[a];
                a--
            }
            return false
        },
        setFrameDuration: function(a, b) {
            this.frames[a] = b
        },
        onAudioLoad: function() {
            fljs.console("audio").info("onAudioLoad: " + this.audio.readyState +
            ", " + this.audio.duration);
            if (!this.started && this.playing) {
                this.audio.currentTime = this.frames[this.frame];
                this.audio.play()
            }
            this.started = true
        },
        playFrame: function(a) {
            fljs.console("audio").info("playFrame:" + this.audio.readyState);
            if (this.audio.readyState >= 2) {
                this.frame = a;
                this.audio.currentTime = this.frames[a];
                this.audio.play();
                this.started = true
            }
            this.playing = true
        },
        pause: function() {
            this.audio.pause();
            this.playing = false
        },
        controlsFrame: function() {},
        currentTime: function() {
            return this.audio.currentTime * 1E3
        },
        setSync: function(a) {
            this.sync = a
        },
        shouldBuffer: function() {
            var a = fljs.now() - this.lastBufferAt;
            return ! this.lastBufferAt || a > fljs.swf.SwfStreamingSoundReader.rebufferDuration
        },
        buffer: function() {
            var a = this.audioStreamReader;
            a.hasMore() && a.read(fljs.swf.SwfStreamingSoundReader.bufferBlocks);
            this.lastBufferAt = fljs.now()
        },
        onSoundStreamBlockTag: function(a, b, c) {
            this.maxFrame = c;
            b = a.duration();
            a = this.duration + b * (a.Mp3SoundData.SeekSamples / a.SampleCount);
            this.frames[c] = a / 1E3;
            this.duration += b;
            this.sync.setFrameTime(c,
            a)
        },
        onShowFrameTag: function() {}
    });
    fljs.player.SwfAudioStream = function(a, b) {
        this.id = b.resources.newId();
        b.resources.addStream(this);
        this.player = a;
        this.target = b;
        this.soundStream = new fljs.swf.SwfStreamingSoundReader(a.parser.reader.stream.stream.buffer, b);
        this.playing = false
    };
    fljs.addMethods(fljs.player.SwfAudioStream, {
        pingLoad: function() {},
        frameReady: function(a) {
            if (typeof this.soundStream.swfFrames[a] != "undefined") return this.soundStream.duration >= this.soundStream.swfFrames[a];
            else {
                for (a = a; a > 0 && typeof this.soundStream.swfFrames[a] == "undefined";) a--;
                return a == 0 ? true: this.frameReady(a)
            }
        },
        frameShouldPlay: function(a) {
            for (a = a; a > 0;) {
                if (a in this.soundStream.swfFrames) return true;
                a--
            }
            return false
        },
        setFrameDuration: function() {},
        playFrame: function(a) {
            this.soundStream.play(a);
            this.playing = true
        },
        pause: function() {
            this.soundStream.stop();
            this.playing = false
        },
        controlsFrame: function(a) {
            return this.soundStream.controlFrame(a)
        },
        timeDiff: function(a) {
            return this.soundStream.timeDiff(a)
        },
        currentTime: function() {
            return this.soundStream.currentTime()
        },
        setSync: function(a) {
            this.soundStream.sync = a
        },
        shouldBuffer: function() {
            var a = fljs.now() - this.soundStream.lastBufferAt;
            return ! this.soundStream.lastBufferAt || a > fljs.swf.SwfStreamingSoundReader.rebufferDuration
        },
        buffer: function() {
            this.soundStream.buffer()
        }
    });
    flash.display.MovieClip = function() {
        flash.display.Sprite.call(this);
        var a = new flash.display.Scene;
        a.labels = [];
        a.name = "Scene 1";
        a.numFrames = 1;
        this.frameData_ = [{
            scripts: [],
            parts: [],
            tags: [],
            label: "",
            repeat: false
        }];
        this.labels_ = {};
        this.sceneIndices_ = {};
        this.currentSceneIndex_ = 0;
        this.scenes_ = [a];
        this.currentFrameIndex_ = 0;
        this.currentLabel_ = null;
        this._enabled = false;
        this.totalFrames_ = this.framesLoaded_ = 1;
        this.next_ = null;
        this.playing_ = true;
        this.audio = [];
        fljs.Player.getInstance();
        this.id = flash.display.MovieClip.id++;
        this.element_.getElement().setAttribute("id", "mc" + this.id);
        this.__buttonStateDown = this.__buttonStateOver = this.firstFrame = false;
        this.resources = new fljs.player.ResourceManager
    };
    fljs.inherits(flash.display.MovieClip, flash.display.Sprite);
    fljs.addMethods(flash.display.MovieClip, {
        gotoAndPlay: function(a, b) {
            this.gotoAnd_(a, b, true)
        },
        gotoAndStop: function(a, b) {
            this.gotoAnd_(a, b, false)
        },
        gotoAnd_: function(a, b, c) {
            var d,
            e;
            if (typeof a.valueOf() == "string") if (d = this.labels_[a]) {
                d = d.frame - 1;
                e = 0
            } else return;
            else if (!b) {
                d = a - 1;
                if (d == -1) d = 0;
                a = this.globalFrameIndexToLocal_(d);
                d = a[0];
                e = a[1]
            }
            this.next_ = {
                frameIndex: d,
                sceneIndex: e,
                play: c
            };
            this.next_.clear = d != this.currentFrameIndex_ + 1
        },
        globalFrameIndexToLocal_: function(a) {
            for (var b = 0; a >= this.scenes_[b].numFrames;) {
                a -=
                this.scenes_[b].numFrames;
                b += 1
            }
            return [a, b]
        },
        nextFrame: function() {
            var a = this.currentFrameIndex_ + 1,
            b = this.currentSceneIndex_;
            if (a == this.scenes_[this.currentSceneIndex_].numFrames) if (this.totalFrames_ > 1) {
                a = 0;
                b += 1;
                if (b == this.scenes_.length) b = 0
            } else {
                this.next_ = null;
                return
            }
            this.next_ = {
                frameIndex: a,
                sceneIndex: b,
                play: this.next_ ? this.next_.play: this.playing_
            }
        },
        nextScene: function() {
            var a = this.currentSceneIndex_ + 1;
            if (a == this.scenes_.length) a = 0;
            this.next_ = {
                frameIndex: 0,
                sceneIndex: a,
                play: true
            }
        },
        play: function() {
            this.next_ =
            this.next_ ? {
                frameIndex: this.next_.frameIndex,
                sceneIndex: this.next_.sceneIndex,
                play: true,
                clear: this.next_.clear
            }: {
                frameIndex: this.currentFrameIndex_,
                sceneIndex: this.currentSceneIndex_,
                play: true
            }
        },
        prevFrame: function() {
            var a = this.currentFrameIndex_ - 1,
            b = this.currentSceneIndex_;
            if (a == -1) {
                b -= 1;
                if (b == -1) b = this.scenes_.length - 1;
                a = this.scenes_[b].numFrames - 1
            }
            this.next_ = {
                frameIndex: a,
                sceneIndex: b,
                play: this.next_ ? this.next_.play: this.playing_
            }
        },
        prevScene: function() {
            var a = this.currentSceneIndex_ - 1;
            if (a == -1) a =
            this.scenes_.length - 1;
            frameIndex = this.scenes_[a].numFrames - 1;
            this.next_ = {
                frameIndex: frameIndex,
                sceneIndex: a,
                play: true
            }
        },
        stop: function() {
            var a;
            if (this.next_) a = this.next_.clear;
            this.next_ = {
                frameIndex: this.currentFrameIndex_,
                sceneIndex: this.currentSceneIndex_,
                play: false,
                stop: true,
                clear: a
            }
        },
        clear: function() {
            for (var a in this.displayList_) this.removeChildAt(a)
        },
        onNewFrame: function() {
            if (this.getStage()) if (this.frameReady(this.currentFrameIndex_)) {
                this.pendingFrame = false;
                var a = this.frameData_[this.currentFrameIndex_];
                if (a.label) this.currentLabel_ = a.label;
                for (var b = 0; b < a.tags.length; b++) {
                    var c = a.tags[b];
                    c[0] && c[0].evaluate(fljs.Player.getInstance(), null, null, this)
                }
                if (a.parts) for (b in a.parts) this.addChildAt(a.parts[b], b)
            } else this.pendingFrame = true
        },
        onEnterFrame: function() {
            var a = false;
            if (a = this.pendingFrame ? true: this.pickNextFrame()) {
                this.onNewFrame();
                if (this.pendingFrame) return
            } (a = this._as2Object) && a._onEnterFrame && fljs.Player.getInstance().interpreter.callback(a, a._onEnterFrame)
        },
        onCreate: function() {
            this.next_ =
            {
                frameIndex: 0,
                sceneIndex: 0,
                play: !this._enabled && this.totalFrames_ > 1
            };
            this.setCurrentFrame();
            this.onNewFrame()
        },
        setCurrentFrame: function() {
            this.updateSoundStream();
            this.currentFrameIndex_ = this.next_.frameIndex;
            this.currentSceneIndex_ = this.next_.sceneIndex;
            this.playing_ = this.next_.play;
            this.next_ = null
        },
        pickNextFrame: function() {
            if (this.playing_) if (!this.next_) {
                var a = this.currentFrameIndex_ + 1,
                b = this.currentSceneIndex_;
                if (a == this.scenes_[this.currentSceneIndex_].numFrames) if (a == this.totalFrames_) if (this.totalFrames_ >
                1) {
                    this.clear();
                    this.next_ = {
                        frameIndex: 0,
                        sceneIndex: 0,
                        play: true
                    }
                } else {
                    this.playing_ = false;
                    this.next_ = null
                } else this.next_ = {
                    frameIndex: a,
                    sceneIndex: b + 1,
                    play: true
                };
                else this.next_ = {
                    frameIndex: a,
                    sceneIndex: b,
                    play: this.playing_
                }
            }
            if (this.next_) if (this._enabled) this.next_.play = false;
            a = this.next_ && !this.next_.stop && this.next_.frameIndex != this.currentFrameIndex_;
            if (this.next_) {
                a && this.next_.clear && this.removeChildren();
                this.setCurrentFrame();
                this.next_ = null
            }
            return a
        },
        onEnterFrame_: function(a) {
            fljs.console("mc").info("mc#" +
            this.id + " frame#" + this.currentFrameIndex_);
            this.onEnterFrame(a)
        },
        updateSoundStream: function() {
            if (this.audioStream) if (this.next_) if (this.next_.play != this.playing_) if (this.next_.playing) this.audioStream.frameShouldPlay(this.next_.frameIndex) && this.audioStream.playFrame(this.next_.frameIndex);
            else this.audioStream.pause();
            else this.next_.play && this.next_.frameIndex != this.currentFrameIndex_ + 1 && this.audioStream.frameShouldPlay(this.next_.frameIndex) && this.audioStream.playFrame(this.next_.frameIndex);
            else this.audioStream.pause()
        },
        addFrameScript: function() {
            for (var a, b, c = 0; c < arguments.length; c += 2) {
                a = arguments[c];
                b = this.globalFrameIndexToLocal_(a);
                a = b[0];
                b = b[1];
                this.scenes_[b].frameData_[a].scripts.push(arguments[c + 1])
            }
        },
        updateButtonState: function(a) {
            if (this._enabled) {
                var b = flash.events.MouseEvent,
                c = flash.events.KeyboardEvent,
                d,
                e;
                switch (a.type) {
                case b.CLICK:
                    e = d = true;
                    break;
                case b.MOUSE_OVER:
                    d = true;
                    e = this.__buttonStateDown;
                    break;
                case b.MOUSE_OUT:
                    d = false;
                    e = this.__buttonStateDown;
                    break;
                case b.MOUSE_DOWN:
                    d = this.__buttonStateOver;
                    e = true;
                    break;
                case b.MOUSE_UP:
                    d = this.__buttonStateOver;
                    e = false;
                    break;
                case c.KEY_DOWN:
                    d = this.__buttonStateOver;
                    e = true;
                    break;
                case c.KEY_UP:
                    d = this.__buttonStateOver;
                    e = false;
                    break
                }
                var f;
                if (this.__buttonStateOver != d) f = d ? e ? this.__buttonStateDown ? "CondOutDownToOverDown": "CondIdleToOverDown": "CondIdleToOverUp": e ? "CondOverDownToOutDown": "CondOverUpToIdle";
                else if (this.__buttonStateDown != e) if (e) {
                    if (d) f = "CondOverUpToOverDown"
                } else f = d ? "CondOverDownToOverUp": "CondOutDownToIdle";
                a = d ? e ? "down": "over": "up";
                this.__buttonStateOver =
                d;
                this.__buttonStateDown = e;
                this.gotoAndStop("_" + a);
                if (f) for (var g in this.__buttonActions) {
                    d = this.__buttonActions[g];
                    d[f] && fljs.Player.getInstance().doActions(this, d.Actions)
                }
            }
        },
        needAudio: function() {
            for (var a = fljs.Player.getInstance(), b = 0; b < 2; b++) this.audio[b] = a.allocAudio()
        },
        frameReady: function(a) {
            return this.frameData_[a] && this.frameData_[a].loaded && this.resources.frameReady(a)
        },
        getEnabled: function() {
            return this._enabled
        },
        setEnabled: function(a) {
            this._enabled = !!a
        }
    });
    flash.display.MovieClip.id = 1;
    fljs.swf.tag.DefineSprite = function() {};
    fljs.addMethods(fljs.swf.tag.DefineSprite, {
        read: function(a) {
            this.defId = this.SpriteId = a.readUI16();
            this.FrameCount = a.readUI16();
            this.frameData_ = [{
                tags: []
            }];
            this.labels_ = {};
            this.framesLoaded_ = 0;
            this.totalFrames_ = this.FrameCount
        },
        evaluate: function(a) {
            a.addDefinition(this, this.SpriteId)
        },
        build: function(a, b) {
            a = new flash.display.MovieClip;
            a.def = this;
            b && a.getTransform().setColorTransform(b);
            b = new flash.display.Scene;
            b.labels = [];
            b.name = "Scene 1";
            b.numFrames = this.FrameCount;
            a.frameData_ = [];
            for (var c = 0; c < this.FrameCount; c++) {
                var d =
                {
                    scripts: [],
                    parts: [],
                    tags: [],
                    label: ""
                };
                d.tags = this.frameData_[c].tags;
                d.loaded = this.frameData_[c].loaded;
                a.frameData_.push(d)
            }
            a.labels_ = this.labels_;
            a.sceneIndices_ = {};
            a.currentSceneIndex_ = 0;
            a.scenes_ = [b];
            a.currentFrameIndex_ = 0;
            a.currentLabel_ = null;
            a._enabled = false;
            a.framesLoaded_ = this.FrameCount;
            a.totalFrames_ = this.FrameCount;
            a.next_ = null;
            a.playing_ = true;
            return a
        }
    });
    fljs.swf.tag.DefineSound = function() {};
    fljs.addMethods(fljs.swf.tag.DefineSound, {
        read: function(a, b) {
            this.SoundId = a.readUI16();
            this.SoundFormat = a.readUB(4);
            this.SoundRate = a.readUB(2);
            this.SoundSize = a.readUB(1);
            this.SoundType = a.readUB(1);
            this.SoundSampleCount = a.readUI32();
            this.Mp3SoundData = this.SoundData = a.readMp3SoundData(b.TagLength - 2 - 1 - 4)
        },
        evaluate: function(a) {
            a.sounds[this.SoundId] = this
        }
    });
    fljs.swf.tag.StartSound = function() {};
    fljs.addMethods(fljs.swf.tag.StartSound, {
        read: function(a) {
            this.SoundId = a.readUI16();
            this.SoundInfo = a.readSoundInfo()
        },
        evaluate: function(a, b) {
            var c = a.sounds[this.SoundId];
            if (!c.player) {
                c.player = a.allocAudio();
                b = new fljs.swf.StringStream(a.reader.stream.stream.buffer);
                b.byteIndex = c.Mp3SoundData.byteIndex;
                b = b.readBytes(c.Mp3SoundData.byteCount).join("");
                b = "data:audio/mpeg;base64," + btoa(b);
                c.player.setAttribute("src", b)
            }
            var d = c.player;
            if (this.SoundInfo.SyncStop) {
                d.fljsPlaying = false;
                d.pause()
            } else if (this.SoundInfo.SyncNoMultiple) {
                d.fljsPlaying =
                true;
                a.playing && d.play()
            } else {
                d.addEventListener("load",
                function() {
                    d.currentTime = 0;
                    d.fljsPlaying = true;
                    a.playing && d.play()
                },
                true);
                d.load()
            }
        }
    });
    fljs.swf.tag.DefineShape2 = function() {};
    fljs.inherits(fljs.swf.tag.DefineShape2, fljs.swf.tag.DefineShape);
    fljs.addMethods(fljs.swf.tag.DefineShape2, {
        read: function(a, b) {
            a.beginContext(fljs.swf.tag.DefineShape2);
            a.endByteIndex = a.stream.byteIndex + b.TagLength;
            this.ShapeId = a.readUI16();
            this.ShapeBounds = a.readRECT();
            a.stream.align();
            this.Shapes = a.readSHAPEWITHSTYLE();
            a.endContext()
        }
    });
    fljs.swf.tag.SoundStreamHead2 = function() {};
    fljs.inherits(fljs.swf.tag.SoundStreamHead2, fljs.swf.tag.SoundStreamHead);
    fljs.swf.tag.DefineFontInfo = function() {};
    fljs.addMethods(fljs.swf.tag.DefineFontInfo, {
        read: function(a) {
            this.FontId = a.readUI16();
            this.FontNameLen = a.readUI8();
            var b = [];
            for (i = 0; i < this.FontNameLen; i++) b.push(String.fromCharCode(a.readUI8()));
            this.FontName = b.join("");
            a.readUB(2);
            this.FontFlagsSmallText = a.readUB(1);
            this.FontFlagsShiftJis = a.readUB(1);
            this.FontFlagsAnsi = a.readUB(1);
            this.FontFlagsItalic = a.readUB(1);
            this.FontFlagsBold = a.readUB(1);
            this.FontFlagsWideCodes = a.readUB(1);
            b = fljs.Player.getInstance().fontsWithoutInfo[this.FontId];
            this.CodeTable =
            [];
            if (this.FontFlagsWideCodes) for (i = 0; i < b.NumGlyphs; i++) this.CodeTable.push(a.readUI16());
            else for (i = 0; i < this.NumGlyphs; i++) this.CodeTable.push(a.readUI8());
            this.GlyphShapeTable = b.GlyphShapeTable
        },
        evaluate: function(a) {
            var b = (new fljs.swf.build.FontBuilder(this, a)).buildDef();
            a.defineFont2(this.FontId, this.GlyphShapeTable.length, b, this.FontName, this.FontFlagsBold, this.FontFlagsItalic, this.CodeTable)
        }
    });
    fljs.swf.tag.DefineText = function() {};
    fljs.addMethods(fljs.swf.tag.DefineText, {
        read: function(a) {
            this.CharacterId = a.readUI16();
            this.TextBounds = a.readRECT();
            a.stream.align();
            this.TextMatrix = a.readMATRIX();
            this.GlyphBits = a.readUI8();
            this.AdvanceBits = a.readUI8();
            a.GlyphBits = this.GlyphBits;
            a.AdvanceBits = this.AdvanceBits;
            a.context = fljs.swf.tag.DefineText;
            this.TextRecords = a.readTEXTRECORDS();
            a.context = null
        },
        buildMatrix_: function() {
            return new flash.geom.Matrix(this.TextMatrix.ScaleX, this.TextMatrix.RotateSkew0, this.TextMatrix.RotateSkew1, this.TextMatrix.ScaleY,
            this.TextMatrix.TranslateX, this.TextMatrix.TranslateY)
        },
        evaluate: function(a) {
            a.addDefinition(this, this.CharacterId)
        },
        build: function(a, b) {
            return this._buildTextField(a, b)
        },
        _buildTextField: function(a, b) {
            if (!this.TextRecords || !this.TextRecords.length) return null;
            this.FontId = this.TextRecords[0].FontId;
            this.Bounds = this.TextBounds;
            var c = a.fonts2[this.FontId];
            a = [];
            var d;
            fljs.console("definetext");
            var e,
            f,
            g = 0,
            j;
            for (var h in this.TextRecords) {
                var m = this.TextRecords[h];
                d = new flash.text.TextFormat;
                if (c) {
                    d.bold = c.bold;
                    d.italic = c.italic;
                    d.font = c.name;
                    d.fontid = this.FontId
                }
                if (m.TextColor) {
                    var k = m.TextColor;
                    e = 0;
                    e += k.Red << 16;
                    e += k.Green << 8;
                    e += k.Blue;
                    if (typeof m.TextColor.Alpha != "undefined") d.alpha = m.TextColor.Alpha / 255
                }
                d.color = e;
                if (m.YOffset != null) {
                    f = m.YOffset;
                    g = 0
                };
                d.leading = f;
                if (m.XOffset != null) g = m.XOffset;
                d.indent = g;
                if (m.TextHeight != null) j = m.TextHeight;
                d.size = j;
                m = m.GlyphEntries;
                k = [];
                var l = [];
                if (m) for (var n in m) {
                    var p = m[n];
                    c ? k.push(String.fromCharCode(c.codeTable[p.GlyphIndex])) : k.push(String.fromCharCode(p.GlyphIndex));
                    l.push(p.GlyphAdvance);
                    g += p.GlyphAdvance
                }
                a.push({
                    text: k.join(""),
                    advances: l,
                    format: d
                })
            }
            this.Indent = this.RightMargin = this.LeftMargin = this.Leading = this.Align = 0;
            this.FontHeight = this.TextRecords[0].TextHeight;
            this.TextColor = this.TextRecords[0].TextColor;
            e = new flash.text.TextField;
            e.setTextMatrix(this.buildMatrix_());
            b && e.getTransform().setColorTransform(b);
            e.x = this.Bounds.Xmin;
            e.y = this.Bounds.Ymin;
            e.setWidth(this.Bounds.Xmax - this.Bounds.Xmin);
            e.setHeight(this.Bounds.Ymax - this.Bounds.Ymin);
            e.setDefaultTextFormat(d);
            e.__setSpans(a);
            return e
        }
    });
    fljs.swf.tag.DefineFontInfo2 = function() {};
    fljs.addMethods(fljs.swf.tag.DefineFontInfo2, {
        read: function(a, b) {
            var c = a.stream.byteIndex;
            this.FontId = a.readUI16();
            this.FontNameLen = a.readUI8();
            var d = [];
            for (i = 0; i < this.FontNameLen; i++) d.push(String.fromCharCode(a.readUI8()));
            this.FontName = d.join("");
            a.readUB(2);
            this.FontFlagsSmallText = a.readUB(1);
            this.FontFlagsShiftJis = a.readUB(1);
            this.FontFlagsAnsi = a.readUB(1);
            this.FontFlagsItalic = a.readUB(1);
            this.FontFlagsBold = a.readUB(1);
            this.FontFlagsWideCodes = a.readUB(1);
            this.LanguageCode = a.readLangCode();
            b =
            b.TagLength - (a.stream.byteIndex - c);
            this.CodeTable = [];
            if (this.FontFlagsWideCodes) {
                b = b / 2;
                for (i = 0; i < b; i++) this.CodeTable.push(a.readUI16())
            } else {
                b = b;
                for (i = 0; i < b; i++) this.CodeTable.push(a.readUI8())
            }
        },
        evaluate: function(a) {
            this.GlyphShapeTable = a.fontsWithoutInfo[this.FontId].GlyphShapeTable;
            var b = (new fljs.swf.build.FontBuilder(this, a)).buildDef();
            a.defineFont2(this.FontId, this.GlyphShapeTable.length, b, this.FontName, this.FontFlagsBold, this.FontFlagsItalic, this.CodeTable)
        }
    });
    fljs.swf.tag.DefineShape3 = function() {};
    fljs.inherits(fljs.swf.tag.DefineShape3, fljs.swf.tag.DefineShape);
    fljs.addMethods(fljs.swf.tag.DefineShape3, {
        read: function(a) {
            a.beginContext(fljs.swf.tag.DefineShape3);
            this.ShapeId = a.readUI16();
            this.ShapeBounds = a.readRECT();
            a.stream.align();
            this.Shapes = a.readSHAPEWITHSTYLE();
            a.endContext()
        }
    });
    fljs.swf.tag.DoAction = function() {};
    fljs.addMethods(fljs.swf.tag.DoAction, {
        read: function(a, b) {
            this.Actions = a.readActionRecords(b.TagLength)
        },
        evaluate: function(a, b, c, d) {
            a.doActions(d, this.Actions)
        }
    });
    fljs.swf.tag.Protect = function() {};
    fljs.addMethods(fljs.swf.tag.Protect, {
        read: function(a, b) {
            a.skipBytes(b.TagLength)
        },
        evaluate: function() {}
    });
    flash.display.FrameLabel = function() {};
    fljs.swf.tag.DefineButton2 = function() {};
    fljs.addMethods(fljs.swf.tag.DefineButton2, {
        read: function(a, b) {
            var c = a.stream.byteIndex;
            a.context = fljs.swf.tag.DefineButton2;
            this.ButtonId = a.readUI16();
            a.readUB(7);
            this.TrackAsMenu = a.readUB(1);
            this.ActionOffset = a.readUI16();
            this.Characters = a.readButtonRecords();
            this.Actions = this.ActionOffset ? a.readButtonCondActions(b.TagLength - (a.stream.byteIndex - c)) : [];
            a.context = null
        },
        evaluate: function(a) {
            a.addDefinition(this, this.ButtonId)
        },
        build: function(a, b) {
            if (b && b.__default) b = null;
            var c = new flash.display.MovieClip;
            c.def = this;
            c.setEnabled(true);
            c.trackAsMenu = this.TrackAsMenu;
            c.__buttonActions = this.Actions;
            var d = [["ButtonStateUp", "up"], ["ButtonStateDown", "down"], ["ButtonStateOver", "over"], ["ButtonStateHitTest", "hitTest"]],
            e = new flash.display.Scene;
            e.labels = [];
            e.name = "Scene 1";
            e.numFrames = 3;
            c.frameData_ = [];
            c.labels_ = {};
            var f,
            g = 0;
            for (var j in d) {
                var h = d[j][0],
                m = d[j][1];
                f = null;
                for (var k in this.Characters) {
                    var l = this.Characters[k];
                    if (l[h]) {
                        f || (f = new flash.display.Sprite);
                        var n = this.buildStateDisplayObject(a, l, false);
                        n && f.addChildAt(n, l.PlaceDepth)
                    }
                }
                for (k in this.Characters) {
                    l = this.Characters[k];
                    if (l.ButtonStateHitTest) {
                        f || (f = new flash.display.Sprite);
                        if (n = this.buildStateDisplayObject(a, l, true)) {
                            n.__setHitTarget(c);
                            f.addChild(n)
                        }
                    }
                }
                if (m != "hitTest") {
                    h = new flash.display.FrameLabel;
                    h.name = "_" + m;
                    h.frame = g + 1;
                    m = {
                        scripts: [],
                        parts: [],
                        tags: [],
                        label: h.name,
                        loaded: true
                    };
                    f && m.parts.push(f);
                    c.frameData_.push(m);
                    c.labels_[h.name] = h
                }
                g += 1
            }
            c.sceneIndices_ = {};
            c.currentSceneIndex_ = 0;
            c.scenes_ = [e];
            c.currentFrameIndex_ = 0;
            c.currentLabel_ =
            c.frameData_[c.currentFrameIndex_].label;
            c._enabled = true;
            c.framesLoaded_ = 3;
            c.totalFrames_ = 3;
            c.next_ = null;
            c.playing_ = false;
            c.gotoAndStop(1);
            b && c.getTransform().setColorTransform(b);
            return c
        },
        buildStateDisplayObject: function(a, b, c) {
            var d = this.buildColorTransform(b.ColorTransform),
            e = this.buildMatrix(b.PlaceMatrix);
            c = (fljs.agent.OS == "iPad" || fljs.agent.OS == "iPhone") && c;
            b = a.dictionary[b.CharacterId];
            var f;
            if (b instanceof fljs.swf.tag.DefineShape || b instanceof fljs.swf.tag.DefineEditText || b instanceof fljs.swf.tag.DefineText ||
            b instanceof fljs.swf.tag.DefineSprite) f = b.build(a, d, c);
            if (f) {
                f.setMatrix(e);
                f.__clipActions = {};
                b instanceof fljs.swf.tag.DefineSprite && f.onCreate()
            }
            return f
        },
        buildMatrix: function(a) {
            return new flash.geom.Matrix(a.ScaleX, a.RotateSkew0, a.RotateSkew1, a.ScaleY, a.TranslateX, a.TranslateY)
        },
        buildColorTransform: function(a) {
            a = new flash.geom.ColorTransform(a.RedMultTerm, a.GreenMultTerm, a.BlueMultTerm, a.AlphaMultTerm, a.RedAddTerm, a.GreenAddTerm, a.BlueAddTerm, a.AlphaAddTerm);
            return a.__default ? null: a
        }
    });
    fljs.swf.tag.DefineText2 = function() {};
    fljs.inherits(fljs.swf.tag.DefineText2, fljs.swf.tag.DefineText);
    fljs.addMethods(fljs.swf.tag.DefineText2, {
        read: function(a) {
            this.CharacterId = a.readUI16();
            this.TextBounds = a.readRECT();
            a.stream.align();
            this.TextMatrix = a.readMATRIX();
            this.GlyphBits = a.readUI8();
            this.AdvanceBits = a.readUI8();
            a.GlyphBits = this.GlyphBits;
            a.AdvanceBits = this.AdvanceBits;
            a.context = fljs.swf.tag.DefineText2;
            this.TextRecords = a.readTEXTRECORDS();
            a.context = null
        }
    });
    fljs.swf.tag.JpegTables = function() {};
    fljs.addMethods(fljs.swf.tag.JpegTables, {
        read: function(a, b) {
            if (b.TagLength != 0) {
                a = a.readBytes(b.TagLength).join("");
                var c = new fljs.swf.BigEndianStringStream(a);
                fljs.console("jpeg").info("" + b.TagType);
                b = 0;
                if (c.nextUShort() == 65497) {
                    b = 4;
                    c.nextUShort();
                    c.nextUShort()
                }
                this.JPEGData = a.substr(b, a.length - b - 2)
            }
        },
        evaluate: function(a) {
            a.jpegTables = this.JPEGData
        }
    });
    fljs.swf.tag.DefineBits = function() {};
    fljs.inherits(fljs.swf.tag.DefineBits, fljs.swf.tag.DefineBitsJPEG2);
    fljs.addMethods(fljs.swf.tag.DefineBits, {
        read: function(a, b) {
            this.CharacterId = a.readUI16();
            b = b.TagLength - 2; (new fljs.swf.build.JpegBuilder).parseJpeg(this, a, b, true)
        }
    });
    fljs.swf.tag.FrameLabel = function() {};
    fljs.addMethods(fljs.swf.tag.FrameLabel, {
        read: function(a) {
            this.Name = a.readString()
        },
        evaluate: function(a, b, c, d) {
            if (d == a.stage) d = a.mainTimeline;
            d.frameData_[d.framesLoaded_].label = this.Name;
            a = d.labels_[this.Name] = new flash.display.FrameLabel;
            a.frame = d.framesLoaded_ + 1;
            a.name = this.Name
        }
    });
    fljs.zip_inflate = {};
    var zip_WSIZE = 32768,
    zip_STORED_BLOCK = 0,
    zip_STATIC_TREES = 1,
    zip_DYN_TREES = 2,
    zip_lbits = 9,
    zip_dbits = 6,
    zip_INBUFSIZ = 32768,
    zip_INBUF_EXTRA = 64,
    zip_slide,
    zip_wp,
    zip_fixed_tl = null,
    zip_fixed_td,
    zip_fixed_bl,
    fixed_bd,
    zip_bit_buf,
    zip_bit_len,
    zip_method,
    zip_eof,
    zip_copy_leng,
    zip_copy_dist,
    zip_tl,
    zip_td,
    zip_bl,
    zip_bd,
    zip_inflate_data,
    zip_inflate_pos,
    zip_MASK_BITS = new Array(0, 1, 3, 7, 15, 31, 63, 127, 255, 511, 1023, 2047, 4095, 8191, 16383, 32767, 65535),
    zip_cplens = new Array(3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, 35, 43, 51,
    59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0),
    zip_cplext = new Array(0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0, 99, 99),
    zip_cpdist = new Array(1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, 8193, 12289, 16385, 24577),
    zip_cpdext = new Array(0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13),
    zip_border = new Array(16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15);
    function zip_HuftList() {
        this.list = this.next = null
    }
    function zip_HuftNode() {
        this.n = this.b = this.e = 0;
        this.t = null
    }
    function zip_HuftBuild(a, b, c, d, e, f) {
        this.BMAX = 16;
        this.N_MAX = 288;
        this.status = 0;
        this.root = null;
        this.m = 0;
        var g = new Array(this.BMAX + 1),
        j,
        h,
        m,
        k,
        l,
        n,
        p,
        u = new Array(this.BMAX + 1),
        o,
        q,
        s,
        r = new zip_HuftNode,
        t = new Array(this.BMAX);
        k = new Array(this.N_MAX);
        var v,
        w = new Array(this.BMAX + 1),
        y,
        x,
        z;
        z = this.root = null;
        for (l = 0; l < g.length; l++) g[l] = 0;
        for (l = 0; l < u.length; l++) u[l] = 0;
        for (l = 0; l < t.length; l++) t[l] = null;
        for (l = 0; l < k.length; l++) k[l] = 0;
        for (l = 0; l < w.length; l++) w[l] = 0;
        j = b > 256 ? a[256] : this.BMAX;
        o = a;
        q = 0;
        l = b;
        do {
            g[o[q]]++;
            q++
        }
        while (--l >
        0);
        if (g[0] == b) {
            this.root = null;
            this.status = this.m = 0
        } else {
            for (n = 1; n <= this.BMAX; n++) if (g[n] != 0) break;
            p = n;
            if (f < n) f = n;
            for (l = this.BMAX; l != 0; l--) if (g[l] != 0) break;
            m = l;
            if (f > l) f = l;
            for (y = 1 << n; n < l; n++, y <<= 1) if ((y -= g[n]) < 0) {
                this.status = 2;
                this.m = f;
                return
            }
            if ((y -= g[l]) < 0) {
                this.status = 2;
                this.m = f
            } else {
                g[l] += y;
                w[1] = n = 0;
                o = g;
                q = 1;
                for (s = 2; --l > 0;) w[s++] = n += o[q++];
                o = a;
                l = q = 0;
                do
                if ((n = o[q++]) != 0) k[w[n]++] = l;
                while (++l < b);
                b = w[m];
                w[0] = l = 0;
                o = k;
                q = 0;
                k = -1;
                v = u[0] = 0;
                s = null;
                for (x = 0; p <= m; p++) for (a = g[p]; a-->0;) {
                    for (; p > v + u[1 + k];) {
                        v += u[1 +
                        k];
                        k++;
                        x = (x = m - v) > f ? f: x;
                        if ((h = 1 << (n = p - v)) > a + 1) {
                            h -= a + 1;
                            for (s = p; ++n < x;) {
                                if ((h <<= 1) <= g[++s]) break;
                                h -= g[s]
                            }
                        }
                        if (v + n > j && v < j) n = j - v;
                        x = 1 << n;
                        u[1 + k] = n;
                        s = new Array(x);
                        for (h = 0; h < x; h++) s[h] = new zip_HuftNode;
                        z = z == null ? (this.root = new zip_HuftList) : (z.next = new zip_HuftList);
                        z.next = null;
                        z.list = s;
                        t[k] = s;
                        if (k > 0) {
                            w[k] = l;
                            r.b = u[k];
                            r.e = 16 + n;
                            r.t = s;
                            n = (l & (1 << v) - 1) >> v - u[k];
                            t[k - 1][n].e = r.e;
                            t[k - 1][n].b = r.b;
                            t[k - 1][n].n = r.n;
                            t[k - 1][n].t = r.t
                        }
                    }
                    r.b = p - v;
                    if (q >= b) r.e = 99;
                    else if (o[q] < c) {
                        r.e = o[q] < 256 ? 16: 15;
                        r.n = o[q++]
                    } else {
                        r.e = e[o[q] - c];
                        r.n =
                        d[o[q++] - c]
                    }
                    h = 1 << p - v;
                    for (n = l >> v; n < x; n += h) {
                        s[n].e = r.e;
                        s[n].b = r.b;
                        s[n].n = r.n;
                        s[n].t = r.t
                    }
                    for (n = 1 << p - 1; (l & n) != 0; n >>= 1) l ^= n;
                    for (l ^= n; (l & (1 << v) - 1) != w[k];) {
                        v -= u[k];
                        k--
                    }
                }
                this.m = u[1];
                this.status = y != 0 && m != 1 ? 1: 0
            }
        }
    }
    function zip_GET_BYTE() {
        if (zip_inflate_data.length == zip_inflate_pos) return - 1;
        return zip_inflate_data.charCodeAt(zip_inflate_pos++) & 255
    }
    function zip_NEEDBITS(a) {
        for (; zip_bit_len < a;) {
            zip_bit_buf |= zip_GET_BYTE() << zip_bit_len;
            zip_bit_len += 8
        }
    }
    function zip_GETBITS(a) {
        return zip_bit_buf & zip_MASK_BITS[a]
    }
    function zip_DUMPBITS(a) {
        zip_bit_buf >>= a;
        zip_bit_len -= a
    }
    function zip_inflate_codes(a, b, c) {
        var d,
        e,
        f;
        if (c == 0) return 0;
        for (f = 0;;) {
            zip_NEEDBITS(zip_bl);
            e = zip_tl.list[zip_GETBITS(zip_bl)];
            for (d = e.e; d > 16;) {
                if (d == 99) return - 1;
                zip_DUMPBITS(e.b);
                d -= 16;
                zip_NEEDBITS(d);
                e = e.t[zip_GETBITS(d)];
                d = e.e
            }
            zip_DUMPBITS(e.b);
            if (d == 16) {
                zip_wp &= zip_WSIZE - 1;
                a[b + f++] = zip_slide[zip_wp++] = e.n
            } else {
                if (d == 15) break;
                zip_NEEDBITS(d);
                zip_copy_leng = e.n + zip_GETBITS(d);
                zip_DUMPBITS(d);
                zip_NEEDBITS(zip_bd);
                e = zip_td.list[zip_GETBITS(zip_bd)];
                for (d = e.e; d > 16;) {
                    if (d == 99) return - 1;
                    zip_DUMPBITS(e.b);
                    d -= 16;
                    zip_NEEDBITS(d);
                    e = e.t[zip_GETBITS(d)];
                    d = e.e
                }
                zip_DUMPBITS(e.b);
                zip_NEEDBITS(d);
                zip_copy_dist = zip_wp - e.n - zip_GETBITS(d);
                for (zip_DUMPBITS(d); zip_copy_leng > 0 && f < c;) {
                    zip_copy_leng--;
                    zip_copy_dist &= zip_WSIZE - 1;
                    zip_wp &= zip_WSIZE - 1;
                    a[b + f++] = zip_slide[zip_wp++] = zip_slide[zip_copy_dist++]
                }
            }
            if (f == c) return c
        }
        zip_method = -1;
        return f
    }
    function zip_inflate_stored(a, b, c) {
        var d;
        d = zip_bit_len & 7;
        zip_DUMPBITS(d);
        zip_NEEDBITS(16);
        d = zip_GETBITS(16);
        zip_DUMPBITS(16);
        zip_NEEDBITS(16);
        if (d != (~zip_bit_buf & 65535)) return - 1;
        zip_DUMPBITS(16);
        zip_copy_leng = d;
        for (d = 0; zip_copy_leng > 0 && d < c;) {
            zip_copy_leng--;
            zip_wp &= zip_WSIZE - 1;
            zip_NEEDBITS(8);
            a[b + d++] = zip_slide[zip_wp++] = zip_GETBITS(8);
            zip_DUMPBITS(8)
        }
        if (zip_copy_leng == 0) zip_method = -1;
        return d
    }
    function zip_inflate_fixed(a, b, c) {
        if (zip_fixed_tl == null) {
            var d,
            e = new Array(288);
            for (d = 0; d < 144; d++) e[d] = 8;
            for (; d < 256; d++) e[d] = 9;
            for (; d < 280; d++) e[d] = 7;
            for (; d < 288; d++) e[d] = 8;
            zip_fixed_bl = 7;
            d = new zip_HuftBuild(e, 288, 257, zip_cplens, zip_cplext, zip_fixed_bl);
            if (d.status != 0) {
                alert("HufBuild error: " + d.status);
                return - 1
            }
            zip_fixed_tl = d.root;
            zip_fixed_bl = d.m;
            for (d = 0; d < 30; d++) e[d] = 5;
            zip_fixed_bd = 5;
            d = new zip_HuftBuild(e, 30, 0, zip_cpdist, zip_cpdext, zip_fixed_bd);
            if (d.status > 1) {
                zip_fixed_tl = null;
                alert("HufBuild error: " +
                d.status);
                return - 1
            }
            zip_fixed_td = d.root;
            zip_fixed_bd = d.m
        }
        zip_tl = zip_fixed_tl;
        zip_td = zip_fixed_td;
        zip_bl = zip_fixed_bl;
        zip_bd = zip_fixed_bd;
        return zip_inflate_codes(a, b, c)
    }
    function zip_inflate_dynamic(a, b, c) {
        var d,
        e,
        f,
        g,
        j,
        h,
        m,
        k = new Array(316);
        for (d = 0; d < k.length; d++) k[d] = 0;
        zip_NEEDBITS(5);
        h = 257 + zip_GETBITS(5);
        zip_DUMPBITS(5);
        zip_NEEDBITS(5);
        m = 1 + zip_GETBITS(5);
        zip_DUMPBITS(5);
        zip_NEEDBITS(4);
        d = 4 + zip_GETBITS(4);
        zip_DUMPBITS(4);
        if (h > 286 || m > 30) return - 1;
        for (e = 0; e < d; e++) {
            zip_NEEDBITS(3);
            k[zip_border[e]] = zip_GETBITS(3);
            zip_DUMPBITS(3)
        }
        for (; e < 19; e++) k[zip_border[e]] = 0;
        zip_bl = 7;
        e = new zip_HuftBuild(k, 19, 19, null, null, zip_bl);
        if (e.status != 0) return - 1;
        zip_tl = e.root;
        zip_bl = e.m;
        g = h +
        m;
        for (d = f = 0; d < g;) {
            zip_NEEDBITS(zip_bl);
            j = zip_tl.list[zip_GETBITS(zip_bl)];
            e = j.b;
            zip_DUMPBITS(e);
            e = j.n;
            if (e < 16) k[d++] = f = e;
            else if (e == 16) {
                zip_NEEDBITS(2);
                e = 3 + zip_GETBITS(2);
                zip_DUMPBITS(2);
                if (d + e > g) return - 1;
                for (; e-->0;) k[d++] = f
            } else {
                if (e == 17) {
                    zip_NEEDBITS(3);
                    e = 3 + zip_GETBITS(3);
                    zip_DUMPBITS(3)
                } else {
                    zip_NEEDBITS(7);
                    e = 11 + zip_GETBITS(7);
                    zip_DUMPBITS(7)
                }
                if (d + e > g) return - 1;
                for (; e-->0;) k[d++] = 0;
                f = 0
            }
        }
        zip_bl = zip_lbits;
        e = new zip_HuftBuild(k, h, 257, zip_cplens, zip_cplext, zip_bl);
        if (zip_bl == 0) e.status = 1;
        if (e.status !=
        0) return - 1;
        zip_tl = e.root;
        zip_bl = e.m;
        for (d = 0; d < m; d++) k[d] = k[d + h];
        zip_bd = zip_dbits;
        e = new zip_HuftBuild(k, m, 0, zip_cpdist, zip_cpdext, zip_bd);
        zip_td = e.root;
        zip_bd = e.m;
        if (zip_bd == 0 && h > 257) return - 1;
        if (e.status != 0) return - 1;
        return zip_inflate_codes(a, b, c)
    }
    function zip_inflate_start() {
        if (zip_slide == null) zip_slide = new Array(2 * zip_WSIZE);
        zip_bit_len = zip_bit_buf = zip_wp = 0;
        zip_method = -1;
        zip_eof = false;
        zip_copy_leng = zip_copy_dist = 0;
        zip_tl = null
    }
    function zip_inflate_internal(a, b, c) {
        var d,
        e;
        for (d = 0; d < c;) {
            if (zip_eof && zip_method == -1) return d;
            if (zip_copy_leng > 0) {
                if (zip_method != zip_STORED_BLOCK) for (; zip_copy_leng > 0 && d < c;) {
                    zip_copy_leng--;
                    zip_copy_dist &= zip_WSIZE - 1;
                    zip_wp &= zip_WSIZE - 1;
                    a[b + d++] = zip_slide[zip_wp++] = zip_slide[zip_copy_dist++]
                } else {
                    for (; zip_copy_leng > 0 && d < c;) {
                        zip_copy_leng--;
                        zip_wp &= zip_WSIZE - 1;
                        zip_NEEDBITS(8);
                        a[b + d++] = zip_slide[zip_wp++] = zip_GETBITS(8);
                        zip_DUMPBITS(8)
                    }
                    if (zip_copy_leng == 0) zip_method = -1
                }
                if (d == c) return d
            }
            if (zip_method ==
            -1) {
                if (zip_eof) break;
                zip_NEEDBITS(1);
                if (zip_GETBITS(1) != 0) zip_eof = true;
                zip_DUMPBITS(1);
                zip_NEEDBITS(2);
                zip_method = zip_GETBITS(2);
                zip_DUMPBITS(2);
                zip_tl = null;
                zip_copy_leng = 0
            }
            switch (zip_method) {
            case 0:
                e = zip_inflate_stored(a, b + d, c - d);
                break;
            case 1:
                e = zip_tl != null ? zip_inflate_codes(a, b + d, c - d) : zip_inflate_fixed(a, b + d, c - d);
                break;
            case 2:
                e = zip_tl != null ? zip_inflate_codes(a, b + d, c - d) : zip_inflate_dynamic(a, b + d, c - d);
                break;
            default:
                e = -1;
                break
            }
            if (e == -1) {
                if (zip_eof) return 0;
                return - 1
            }
            d += e
        }
        return d
    }
    function zip_inflate(a) {
        var b,
        c,
        d;
        zip_inflate_start();
        zip_inflate_data = a;
        zip_inflate_pos = 0;
        b = new Array(1024);
        for (a = ""; (c = zip_inflate_internal(b, 0, b.length)) > 0;) for (d = 0; d < c; d++) a += String.fromCharCode(b[d]);
        zip_inflate_data = null;
        return a
    }
    fljs.swf.tag.DefineBitsJpeg3 = function() {};
    fljs.inherits(fljs.swf.tag.DefineBitsJpeg3, fljs.swf.tag.DefineBitsJPEG2);
    fljs.addMethods(fljs.swf.tag.DefineBitsJpeg3, {
        read: function(a, b) {
            var c = a.stream.byteIndex;
            this.CharacterId = a.readUI16();
            var d = fljs.Player.getInstance();
            d.mainTimeline && d.mainTimeline.resources.addToFrame(this.CharacterId, d.mainTimeline.framesLoaded_);
            if (d.loadExtResources) {
                a.skipBytes(b.TagLength - 2);
                d = "img/" + d.name + "-" + this.CharacterId + ".png";
                fljs.console("image").info(d);
                c = new Image;
                c.addEventListener("load", fljs.bind(this.onLoadImage, this, a, b, c), false);
                fljs.Player.getInstance().delayFrame++;
                c.src =
                d
            } else {
                d = this.AlphaDataOffset = a.readUI32(); (new fljs.swf.build.JpegBuilder).parseJpeg(this, a, d, true);
                d = b.TagLength - (a.stream.byteIndex - c);
                c = a.stream.byteIndex;
                var e = new Image;
                e.width = this.Width;
                e.height = this.Height;
                e.addEventListener("load", fljs.bind(this.onLoadData, this, a, b, e, c, d));
                fljs.Player.getInstance().delayFrame++;
                e.src = this.DataUri
            }
        },
        onLoadData: function(a, b, c, d, e) {
            a = a.stream.buffer.substr(d + 2, e - 2);
            a = zip_inflate(a);
            a = new fljs.swf.SwfStream(new fljs.swf.StringStream(a));
            b = document.createElement("canvas");
            b.width = this.Width;
            b.height = this.Height;
            d = b.getContext("2d");
            d.drawImage(c, 0, 0);
            c = d.getImageData(0, 0, this.Width, this.Height);
            e = c.data;
            for (var f = 0; f < this.Width * this.Height * 4;) {
                e[f + 3] = a.readUI8();
                f += 4
            }
            d.putImageData(c, 0, 0);
            this.DataUri = b.toDataURL();
            c = fljs.Player.getInstance();
            if (c.dictionary) {
                this.evaluate(c);
                c.delayFrame--;
                c.mainTimeline.resources.remove(this.CharacterId)
            } else this.callback(this);
            return true
        },
        onLoadImage: function(a, b, c) {
            this.Width = c.width;
            this.Height = c.height;
            a = document.createElement("canvas");
            a.width = this.Width;
            a.height = this.Height;
            a.getContext("2d").drawImage(c, 0, 0);
            this.DataUri = a.toDataURL();
            c = fljs.Player.getInstance();
            this.evaluate(c);
            c.setTimeout(fljs.bind(this.afterLoadImage, this));
            return true
        },
        afterLoadImage: function() {
            c = fljs.Player.getInstance();
            c.delayFrame--;
            c.mainTimeline.resources.remove(this.CharacterId)
        },
        evaluate: function(a) {
            this.defId = "image" + this.CharacterId;
            a.addDefinition(this, this.CharacterId);
            a = new fljs.swf.def.BitmapDef;
            a.setCharaId(this.defId);
            a.element.sets([[fljs.dom.Namespace.Xlink, "xlink:href", this.DataUri], [null, "x", 0], [null, "y", 0], [null, "width", this.Width], [null,
            "height", this.Height]]);
            a.define();
            this.def = a
        }
    });
    fljs.swf.tag.ExportAssets = function() {};
    fljs.addMethods(fljs.swf.tag.ExportAssets, {
        read: function(a) {
            this.Count = a.readUI16();
            this.Tags = [];
            this.Names = [];
            for (var b = 0; b < this.Count; b++) {
                this.Tags[b] = a.readUI16();
                this.Names[b] = a.readString()
            }
        },
        evaluate: function(a) {
            for (var b = 0; b < this.Tags.length; b++) a.assets[this.Names[b]] = this.Tags[b]
        }
    });
    fljs.swf.tag.PlaceObject3 = function() {};
    fljs.inherits(fljs.swf.tag.PlaceObject3, fljs.swf.tag.PlaceObject2);
    fljs.addMethods(fljs.swf.tag.PlaceObject3, {
        read: function(a) {
            this.startByteIndex = a.stream.byteIndex;
            this.PlaceFlagHasClipActions = a.readUB(1);
            this.PlaceFlagHasClipDepth = a.readUB(1);
            this.PlaceFlagHasName = a.readUB(1);
            this.PlaceFlagHasRatio = a.readUB(1);
            this.PlaceFlagHasColorTransform = a.readUB(1);
            this.PlaceFlagHasMatrix = a.readUB(1);
            this.PlaceFlagHasCharacter = a.readUB(1);
            this.PlaceFlagMove = a.readUB(1);
            a.readUB(3);
            this.PlaceFlagHasImage = a.readUB(1);
            this.PlaceFlagHasClassName = a.readUB(1);
            this.PlaceFlagHasCacheAsBitmap =
            a.readUB(1);
            this.PlaceFlagHasBlendMode = a.readUB(1);
            this.PlaceFlagHasFilterList = a.readUB(1);
            this.Depth = a.readUI16();
            if (this.PlaceFlagHasClassName || this.PlaceFlagHasImage && this.PlaceFlagHasCharacter) this.ClassName = a.readString();
            if (this.PlaceFlagHasCharacter) this.CharacterId = a.readUI16();
            if (this.PlaceFlagHasMatrix) this.Matrix = a.readMATRIX();
            if (this.PlaceFlagHasColorTransform) this.ColorTransform = a.readCXFORMWITHALPHA();
            if (this.PlaceFlagHasRatio) this.Ratio = a.readUI16();
            if (this.PlaceFlagHasName) this.Name =
            a.readSTRING();
            if (this.PlaceFlagHasClipDepth) this.ClipDepth = a.readUI16();
            if (this.PlaceFlagHasFilterList) this.SurfaceFilterList = a.readFilterList();
            if (this.PlaceFlagHasBlendMode) this.BlendMode = a.readUI8();
            if (this.PlaceFlagHasClipActions) this.ClipActions = a.readCLIPACTIONS()
        }
    });
    fljs.swf.tag.DefineShape4 = function() {};
    fljs.inherits(fljs.swf.tag.DefineShape4, fljs.swf.tag.DefineShape);
    fljs.addMethods(fljs.swf.tag.DefineShape4, {
        read: function(a) {
            a.beginContext(fljs.swf.tag.DefineShape4);
            this.ShapeId = a.readUI16();
            this.ShapeBounds = a.readRECT();
            this.EdgeBounds = a.readRECT();
            a.readUB(6);
            this.UsesNonScalingStrokes = a.readUB(1);
            this.UsesScalingStrokes = a.readUB(1);
            this.Shapes = a.readSHAPEWITHSTYLE();
            a.endContext()
        }
    });
    fljs.swf.tag.DefineBitsLossless2 = function() {};
    fljs.addMethods(fljs.swf.tag.DefineBitsLossless2, {
        read: function(a, b) {
            var c = a.stream.byteIndex;
            this.CharacterId = a.readUI16();
            this.BitmapFormat = a.readUI8();
            this.BitmapWidth = a.readUI16();
            this.BitmapHeight = a.readUI16();
            if (this.BitmapFormat == 3) this.BitmapColorTableSize = a.readUI8();
            a = a.stream.buffer.substr(a.stream.byteIndex + 2, b.TagLength - (a.stream.byteIndex - c) - 2);
            a = zip_inflate(a);
            a = new fljs.swf.SwfStream(new fljs.swf.StringStream(a));
            b = document.createElement("canvas");
            b.width = this.BitmapWidth;
            b.height =
            this.BitmapHeight;
            c = b.getContext("2d");
            var d = c.createImageData(this.BitmapWidth, this.BitmapHeight),
            e = d.data;
            if (this.BitmapFormat == 3) {
                this.ColorTableRgb = [];
                for (var f = 0; f < this.BitmapColorTableSize + 1; f++) this.ColorTableRgb[f] = a.readRGBA();
                var g = Math.floor((this.BitmapWidth + 3) / 4) * 4;
                for (var j = f = 0; f < this.BitmapWidth * this.BitmapHeight * 4;) {
                    var h = this.ColorTableRgb[a.readUI8()];
                    e[f++] = h.Red;
                    e[f++] = h.Green;
                    e[f++] = h.Blue;
                    e[f++] = h.Alpha;
                    j++;
                    if (j == this.BitmapWidth) {
                        a.skipBytes(g - this.BitmapWidth);
                        j = 0
                    }
                }
            } else for (f =
            0; f < this.BitmapWidth * this.BitmapHeight * 4;) {
                h = a.readARGB();
                e[f++] = h.Red;
                e[f++] = h.Green;
                e[f++] = h.Blue;
                e[f++] = h.Alpha
            }
            c.putImageData(d, 0, 0);
            this.DataUri = b.toDataURL()
        },
        evaluate: function(a) {
            a.addDefinition(this, this.CharacterId);
            this.Width = this.BitmapWidth;
            this.Height = this.BitmapHeight;
            this.defId = "image" + this.CharacterId;
            a = new fljs.swf.def.BitmapDef;
            a.setCharaId(this.defId);
            a.element.sets([[fljs.dom.Namespace.Xlink, "xlink:href", this.DataUri], [null, "x", 0], [null, "y", 0], [null, "width", this.Width], [null, "height",
            this.Height]]);
            a.define();
            this.def = a
        }
    });
    fljs.swf.tag.DefineBitsLossless = function() {};
    fljs.addMethods(fljs.swf.tag.DefineBitsLossless, {
        read: function(a, b) {
            var c = a.stream.byteIndex;
            this.CharacterId = a.readUI16();
            this.BitmapFormat = a.readUI8();
            this.BitmapWidth = a.readUI16();
            this.BitmapHeight = a.readUI16();
            if (this.BitmapFormat == 3) this.BitmapColorTableSize = a.readUI8();
            a = a.stream.buffer.substr(a.stream.byteIndex + 2, b.TagLength - (a.stream.byteIndex - c) - 2);
            a = zip_inflate(a);
            a = new fljs.swf.SwfStream(new fljs.swf.StringStream(a));
            b = document.createElement("canvas");
            b.width = this.BitmapWidth;
            b.height =
            this.BitmapHeight;
            c = b.getContext("2d");
            var d = c.createImageData(this.BitmapWidth, this.BitmapHeight),
            e = d.data;
            if (this.BitmapFormat == 3) {
                this.ColorTableRgb = [];
                for (var f = 0; f < this.BitmapColorTableSize + 1; f++) this.ColorTableRgb[f] = a.readRGB();
                var g = Math.floor((this.BitmapWidth + 3) / 4) * 4;
                for (var j = f = 0; f < this.BitmapWidth * this.BitmapHeight * 4;) {
                    var h = this.ColorTableRgb[a.readUI8()];
                    e[f++] = h.Red;
                    e[f++] = h.Green;
                    e[f++] = h.Blue;
                    e[f++] = 255;
                    j++;
                    if (j == this.BitmapWidth) {
                        a.skipBytes(g - this.BitmapWidth);
                        j = 0
                    }
                }
            } else if (this.BitmapFormat ==
            4) {
                g = Math.floor((this.BitmapWidth * 2 + 3) / 4) * 4;
                for (j = f = 0; f < this.BitmapWidth * this.BitmapHeight * 4;) {
                    h = a.readPix15();
                    e[f++] = h.Red;
                    e[f++] = h.Green;
                    e[f++] = h.Blue;
                    e[f++] = 255;
                    j++;
                    if (j == this.BitmapWidth) {
                        a.skipBytes(g - this.BitmapWidth);
                        j = 0
                    }
                }
            } else if (this.BitmapFormat == 5) for (f = 0; f < this.BitmapWidth * this.BitmapHeight * 4;) {
                h = a.readARGB();
                e[f++] = h.Red;
                e[f++] = h.Green;
                e[f++] = h.Blue;
                e[f++] = 255
            }
            c.putImageData(d, 0, 0);
            this.DataUri = b.toDataURL()
        },
        evaluate: function(a) {
            a.addDefinition(this, this.CharacterId);
            this.Width = this.BitmapWidth;
            this.Height = this.BitmapHeight;
            this.defId = "image" + this.CharacterId;
            a = new fljs.swf.def.BitmapDef;
            a.setCharaId(this.defId);
            a.element.sets([[fljs.dom.Namespace.Xlink, "xlink:href", this.DataUri], [null, "x", 0], [null, "y", 0], [null, "width", this.Width], [null, "height", this.Height]]);
            a.define();
            this.def = a
        }
    });
    fljs.swf.tag.DefineFont3 = function() {};
    fljs.addMethods(fljs.swf.tag.DefineFont3, {
        read: function(a) {
            var b;
            this.FontId = a.readUI16();
            this.FontFlagsHasLayout = a.readUB(1);
            this.FontFlagsShiftJIS = a.readUB(1);
            this.FontFlagsSmallText = a.readUB(1);
            this.FontFlagsANSI = a.readUB(1);
            this.FontFlagsWideOffsets = a.readUB(1);
            this.FontFlagsWideCodes = a.readUB(1);
            a.FontFlagsWideCodes = this.FontFlagsWideCodes;
            this.FontFlagsItalic = a.readUB(1);
            this.FontFlagsBold = a.readUB(1);
            this.LanguageCode = a.readLangCode();
            this.FontNameLen = a.readUI8();
            var c = [];
            for (b = 0; b < this.FontNameLen; b++) c.push(String.fromCharCode(a.readUI8()));
            this.FontName = c.join("");
            this.NumGlyphs = a.readUI16();
            this.OffsetTable = [];
            if (this.FontFlagsWideOffsets) {
                for (b = 0; b < this.NumGlyphs; b++) this.OffsetTable.push(a.readUI32());
                this.CodeTableOffset = a.readUI32()
            } else {
                for (b = 0; b < this.NumGlyphs; b++) this.OffsetTable.push(a.readUI16());
                this.CodeTableOffset = a.readUI16()
            }
            this.GlyphShapeTable = [];
            for (b = 0; b < this.NumGlyphs; b++) this.GlyphShapeTable.push(a.readShape());
            this.CodeTable = [];
            for (b = 0; b < this.NumGlyphs; b++) this.CodeTable.push(a.readUI16());
            if (this.FontFlagsHasLayout) {
                this.FontAscent =
                a.readSI16();
                this.FontDescent = a.readSI16();
                this.FontLeading = a.readSI16();
                this.FontAdvanceTable = [];
                for (b = 0; b < this.NumGlyphs; b++) this.FontAdvanceTable.push(a.readSI16());
                this.FontBoundsTable = [];
                for (b = 0; b < this.NumGlyphs; b++) {
                    this.FontBoundsTable.push(a.readRECT());
                    a.stream.align()
                }
                this.KerningCount = a.readUI16();
                this.FontKerningTable = [];
                for (b = 0; b < this.KerningCount; b++) this.FontKerningTable.push(a.readKerningRecord())
            }
        },
        evaluate: function(a) {
            var b = (new fljs.swf.build.FontBuilder(this, a)).buildDef();
            a.defineFont2(this.FontId,
            this.GlyphShapeTable.length, b, this.FontName, this.FontFlagsBold, this.FontFlagsItalic, this.CodeTable, this)
        }
    });
    fljs.swf.tag.DoInitAction = function() {};
    fljs.addMethods(fljs.swf.tag.DoInitAction, {
        read: function(a, b) {
            this.SpriteId = a.readUI16();
            this.Actions = a.readActionRecords(b.TagLength - 2 - 1);
            this.ActionEndFlag = a.readUI8()
        },
        evaluate: function(a) {
            if (!this.processed) {
                this.processed = true;
                a.doInitAction(this)
            }
        }
    });
    fljs.swf.tag.tagMap = {
        0: fljs.swf.tag.End,
        1: fljs.swf.tag.ShowFrame,
        2: fljs.swf.tag.DefineShape,
        4: fljs.swf.tag.PlaceObject,
        5: fljs.swf.tag.RemoveObject,
        6: fljs.swf.tag.DefineBits,
        8: fljs.swf.tag.JpegTables,
        9: fljs.swf.tag.SetBackgroundColor,
        10: fljs.swf.tag.DefineFont,
        11: fljs.swf.tag.DefineText,
        12: fljs.swf.tag.DoAction,
        13: fljs.swf.tag.DefineFontInfo,
        14: fljs.swf.tag.DefineSound,
        15: fljs.swf.tag.StartSound,
        18: fljs.swf.tag.SoundStreamHead,
        19: fljs.swf.tag.SoundStreamBlock,
        20: fljs.swf.tag.DefineBitsLossless,
        21: fljs.swf.tag.DefineBitsJPEG2,
        22: fljs.swf.tag.DefineShape2,
        24: fljs.swf.tag.Protect,
        26: fljs.swf.tag.PlaceObject2,
        28: fljs.swf.tag.RemoveObject2,
        32: fljs.swf.tag.DefineShape3,
        33: fljs.swf.tag.DefineText2,
        34: fljs.swf.tag.DefineButton2,
        35: fljs.swf.tag.DefineBitsJpeg3,
        36: fljs.swf.tag.DefineBitsLossless2,
        37: fljs.swf.tag.DefineEditText,
        39: fljs.swf.tag.DefineSprite,
        43: fljs.swf.tag.FrameLabel,
        45: fljs.swf.tag.SoundStreamHead2,
        48: fljs.swf.tag.DefineFont2,
        56: fljs.swf.tag.ExportAssets,
        59: fljs.swf.tag.DoInitAction,
        62: fljs.swf.tag.DefineFontInfo2,
        70: fljs.swf.tag.PlaceObject3,
        75: fljs.swf.tag.DefineFont3,
        82: fljs.swf.tag.DoAbc,
        83: fljs.swf.tag.DefineShape4
    };
    fljs.swf.SwfStream = function(a) {
        this.stream = a;
        this.twipsPerPixel = 20;
        this.logger = fljs.console("parse")
    };
    fljs.addMethods(fljs.swf.SwfStream, {
        _mark: function(a, b) {
            this.debug && this.logger.info(a + ": " + b)
        },
        hasMore: function() {
            return this.stream.hasMore()
        },
        skipBytes: function(a) {
            this.stream.skipBytes(a)
        },
        readBytes: function(a) {
            return this.stream.readBytes(a)
        },
        readUI8: function() {
            return this.stream.nextUByte()
        },
        readUI16: function() {
            var a = this.stream.nextUShort();
            this._mark("readUI16", a);
            return a
        },
        readUI32: function() {
            return this.stream.nextULong()
        },
        readSI8: function() {
            return this.stream.nextSByte()
        },
        readSI16: function() {
            return this.stream.nextSShort()
        },
        readSI32: function() {
            return this.stream.nextSLong()
        },
        readUB: function(a) {
            return this.stream.nextUBits(a)
        },
        readSB: function(a) {
            return this.stream.nextSBits(a)
        },
        readFB: function(a) {
            return this.stream.nextFBits(a)
        },
        readFIXED: function() {
            return this.readFixed()
        },
        readFixed: function() {
            return this.stream.nextFLong()
        },
        readFIXED8: function() {
            return this.readFixed8()
        },
        readFixed8: function() {
            return this.stream.nextFShort()
        },
        readFLOAT16: function() {
            return this.stream.nextHalfFloat()
        },
        readFLOAT: function() {
            return this.readFloat()
        },
        readFloat: function() {
            return this.stream.nextSingleFloat()
        },
        readFloats: function(a) {
            for (var b = [], c = 0; c < a; c++) b.push(this.readFloat());
            return b
        },
        readDOUBLE: function() {
            return this.stream.nextDoubleFloat()
        },
        readDouble: function() {
            return this.stream.nextDoubleFloat()
        },
        readEncodedU32: function() {
            return this.stream.nextEncodedULong()
        },
        readString: function() {
            return this.stream.nextString()
        },
        readSTRING: function() {
            return this.stream.nextString()
        },
        readSwfHeader: function() {
            var a = String.fromCharCode(this.readUI8(),
            this.readUI8(), this.readUI8()),
            b = this.readUI8(),
            c = this.readUI32();
            if (a == "CWS") {
                var d = fljs.console("rar");
                d.info("deflating...");
                var e = this.stream.buffer.substr(this.stream.byteIndex + 2);
                d.info("unzipping...");
                e = zip_inflate(e);
                d.info("streaming...");
                this.stream = new fljs.swf.StringStream(e);
                d.info("done");
                d.info(this.stream.buffer.length)
            }
            d = this.readRECT();
            e = this.readFIXED8();
            var f = this.readUI16();
            return this.header = {
                Signature: a,
                Version: b,
                FileLength: c,
                FrameSize: d,
                FrameRate: e,
                FrameCount: f
            }
        },
        readLANGCODE: function() {
            return {
                LanguageCode: this.readUI8()
            }
        },
        readRecordHeader: function() {
            var a = this.readUI16(),
            b = a & 63;
            a = a >> 6 & 1023;
            if (b == 63) b = this.readSI32();
            return {
                TagType: a,
                TagLength: b,
                byteIndex: this.stream.byteIndex
            }
        },
        readMATRIX: function() {
            return this.readMatrix()
        },
        readCXFORM: function() {
            var a = this.readUB(1),
            b = this.readUB(1),
            c = this.readUB(4),
            d = 1,
            e = 1,
            f = 1;
            if (b) {
                d = this.readSB(c) / 256;
                e = this.readSB(c) / 256;
                f = this.readSB(c) / 256
            }
            var g = 0,
            j = 0,
            h = 0;
            if (a) {
                g = this.readSB(c);
                j = this.readSB(c);
                h = this.readSB(c)
            }
            return {
                HasAddTerms: a,
                HasMultTerms: b,
                Nbits: c,
                RedMultTerm: d,
                GreenMultTerm: e,
                BlueMultTerm: f,
                RedAddTerm: g,
                GreenAddTerm: j,
                BlueAddTerm: h,
                AlphaMultTerm: 1,
                AlphaAddTerm: 0
            }
        },
        readCXFORMWITHALPHA: function() {
            this.stream.align();
            var a = this.readUB(1),
            b = this.readUB(1),
            c = this.readUB(4),
            d = 1,
            e = 1,
            f = 1,
            g = 1;
            if (b) {
                d = this.readSB(c) / 256;
                e = this.readSB(c) / 256;
                f = this.readSB(c) / 256;
                g = this.readSB(c) / 256
            }
            var j = 0,
            h = 0,
            m = 0,
            k = 0;
            if (a) {
                j = this.readSB(c);
                h = this.readSB(c);
                m = this.readSB(c);
                k = this.readSB(c)
            }
            return {
                HasAddTerms: a,
                HasMultTerms: b,
                Nbits: c,
                RedMultTerm: d,
                GreenMultTerm: e,
                BlueMultTerm: f,
                AlphaMultTerm: g,
                RedAddTerm: j,
                GreenAddTerm: h,
                BlueAddTerm: m,
                AlphaAddTerm: k
            }
        },
        readFILTERLIST: function() {},
        readCLIPACTIONS: function() {
            this.readUI16();
            var a = this.readClipEventFlags(),
            b = this.readClipActionRecords();
            return {
                AllEventFlags: a,
                ClipActionRecords: b
            }
        },
        readClipActionRecords: function() {
            for (var a = [], b; b = this.readClipActionRecord();) a.push(b);
            return a
        },
        readClipActionRecord: function() {
            var a = this.readClipEventFlags();
            if (!a) return null;
            var b = this.readUI32(),
            c = b,
            d;
            if (a & fljs.swf.ClipEventFlags.ClipEventKeyPress) {
                d = this.readUI8();
                c -= 1
            }
            c = this.readActionRecords(c);
            return {
                EventFlags: a,
                ActionRecordSize: b,
                KeyCode: d,
                Actions: c
            }
        },
        readActionRecords: function(a) {
            for (var b = this.stream.byteIndex, c = []; this.stream.byteIndex != b + a;) c.push(this.readActionRecord());
            if (c.length) {
                a = c[c.length - 1];
                a.ActionCode != 0 && c.push({
                    code: "0x0",
                    address: a.address + a.Length,
                    ActionCode: 0,
                    Action: "End"
                })
            }
            return c
        },
        readActionRecord: function() {
            var a = this.stream.byteIndex,
            b = this.readUI8();
            a = {
                code: "0x" + b.toString(16),
                address: a,
                ActionCode: b
            };
            if (b >= 128) a.Length = this.readUI16();
            switch (b) {
            case 129:
                a.Action = "ActionGotoFrame";
                a.Frame = this.readUI16();
                break;
            case 131:
                a.Action = "ActionGetUrl";
                a.UrlString = this.readString();
                a.TargetString = this.readString();
                break;
            case 4:
                a.Action = "ActionNextFrame";
                break;
            case 5:
                a.Action = "ActionPrevFrame";
                break;
            case 6:
                a.Action = "ActionPlay";
                break;
            case 7:
                a.Action = "ActionStop";
                break;
            case 8:
                a.Action = "ActionToggleQuality";
                break;
            case 9:
                a.Action = "ActionStopSounds";
                break;
            case 138:
                a.Action = "ActionWaitForFrame";
                a.Frame = this.readUI16();
                a.SkipCount = this.readUI8();
                break;
            case 139:
                a.Action = "ActionSetTarget";
                a.TargetName = this.readString();
                break;
            case 8:
                a.Action = "ActionToggleQuality";
                break;
            case 139:
                a.Action = "ActionSetTarget";
                a.TargetName = this.readString();
                break;
            case 140:
                a.Action = "ActionGotoLabel";
                a.Label = this.readString();
                break;
            case 150:
                this.readActionPush(a);
                break;
            case 153:
                a.Action = "ActionJump";
                a.BranchOffset = this.readSI16();
                break;
            case 157:
                a.Action = "ActionIf";
                a.BranchOffset = this.readSI16();
                break;
            case 154:
                a.Action = "ActionGetUrl2";
                a.SendVarsMethod = this.readUB(2);
                a.Reserved = this.readUB(4);
                a.LoadTargetFlag = this.readUB(1);
                a.LoadVariablesFlag = this.readUB(1);
                break;
            case 159:
                this.readActionGotoFrame2(a);
                break;
            case 141:
                a.Action = "ActionWaitForFrame2";
                a.SkipCount = this.readUI8();
                break;
            case 136:
                this.readActionConstantPool(a);
                break;
            case 155:
                this.readActionDefineFunction(a);
                break;
            case 148:
                this.readActionWith(a);
                break;
            case 135:
                a.Action = "ActionStoreRegister";
                a.RegisterNumber = this.readUI8();
                break;
            case 142:
                this.readActionDefineFunction2(a);
                break;
            case 143:
                this.readActionTry(a);
                break;
            default:
                a.Action = "Unknown";
                break
            }
            return a
        },
        readActionPush: function(a) {
            for (var b = a.Length, c = this.stream.byteIndex, d = []; this.stream.byteIndex < c + b;) {
                var e = this.readUI8(),
                f;
                switch (e) {
                case 0:
                    f = this.readString();
                    break;
                case 1:
                    f = this.readFloat();
                    break;
                case 4:
                case 5:
                case 8:
                    f = this.readUI8();
                    break;
                case 6:
                    f = this.readDouble();
                    break;
                case 7:
                    f = this.readUI32();
                    break;
                case 9:
                    f = this.readUI16();
                    break
                }
                d.push({
                    Type: e,
                    Value: f
                })
            }
            a.Action = "ActionPush";
            a.Values = d
        },
        readActionGotoFrame2: function(a) {
            this.readUB(6);
            var b =
            this.readUB(1),
            c = this.readUB(1),
            d;
            if (b) d = this.readUI16();
            a.Action = "ActionGotoFrame2";
            a.SceneBiasFlag = b;
            a.PlayFlag = c;
            a.SceneBias = d
        },
        readActionConstantPool: function(a) {
            for (var b = a.Length, c = this.stream.byteIndex, d = [], e = 0; this.stream.byteIndex < c + b;) {
                var f = this.readString();
                e > 0 && d.push(f);
                e++
            }
            a.Action = "ActionConstantPool";
            a.Count = b;
            a.ConstantPool = d
        },
        readActionDefineFunction: function(a) {
            for (var b = this.readString(), c = this.readUI16(), d = [], e = 0; e < c; e++) d.push(this.readString());
            e = this.readUI16();
            var f = this.readActionRecords(e);
            a.Action = "ActionDefineFunction";
            a.FunctionName = b;
            a.NumParams = c;
            a.Params = d;
            a.CodeSize = e;
            a.Code = f
        },
        readActionWith: function(a) {
            var b = this.readUI16(),
            c = this.readActionRecords(b);
            a.Action = "ActionWith";
            a.Size = b;
            a.Code = c
        },
        readActionDefineFunction2: function(a) {
            a.FunctionName = this.readString();
            a.NumParams = this.readUI16();
            a.RegisterCount = this.readUI8();
            a.PreloadParentFlag = this.readUB(1);
            a.PreloadRootFlag = this.readUB(1);
            a.SupressSuperFlag = this.readUB(1);
            a.PreloadSuperFlag = this.readUB(1);
            a.SupressArgumentsFlag =
            this.readUB(1);
            a.PreloadArgumentsFlag = this.readUB(1);
            a.SupressThisFlag = this.readUB(1);
            a.PreloadThisFlag = this.readUB(1);
            this.readUB(7);
            a.PreloadGlobalFlag = this.readUB(1);
            a.Parameters = [];
            for (var b = 0; b < a.NumParams; b++) a.Parameters.push(this.readRegisterParam());
            a.CodeSize = this.readUI16();
            b = this.readActionRecords(a.CodeSize);
            a.Action = "ActionDefineFunction2";
            a.Code = b
        },
        readRegisterParam: function() {
            return {
                Register: this.readUI8(),
                ParamName: this.readString()
            }
        },
        readActionTry: function(a) {
            this.readUB(5);
            a.CatchInRegisterFlag =
            this.readUB(1);
            a.FinallyBlockFlag = this.readUB(1);
            a.CatchBlockFlag = this.readUB(1);
            a.TrySize = this.readUI16();
            a.CatchSize = this.readUI16();
            a.FinallySize = this.readUI16();
            if (a.CatchInRegisterFlag) a.CatchRegister = this.readUI8();
            else a.CatchName = this.readString();
            this.skipBytes(a.TrySize);
            this.skipBytes(a.CatchSize);
            this.skipBytes(a.FinallySize)
        },
        readClipEventFlags: function() {
            return this.header.Version <= 5 ? this.readUB(16) << 16: this.readUB(32)
        },
        readRGB: function() {
            return {
                Red: this.readUI8(),
                Green: this.readUI8(),
                Blue: this.readUI8()
            }
        },
        readRGBA: function() {
            return {
                Red: this.readUI8(),
                Green: this.readUI8(),
                Blue: this.readUI8(),
                Alpha: this.readUI8()
            }
        },
        readARGB: function() {
            return {
                Alpha: this.readUI8(),
                Red: this.readUI8(),
                Green: this.readUI8(),
                Blue: this.readUI8()
            }
        },
        readRect: function() {
            this.stream.align();
            var a = this.readUB(5);
            return {
                Nbits: a,
                Xmin: this.readSB(a) / this.twipsPerPixel,
                Xmax: this.readSB(a) / this.twipsPerPixel,
                Ymin: this.readSB(a) / this.twipsPerPixel,
                Ymax: this.readSB(a) / this.twipsPerPixel
            }
        },
        readRECT: function() {
            return this.readRect()
        },
        readShapeWithStyle: function() {
            this.stream.align();
            var a = this.readFILLSTYLEARRAY(),
            b = this.readLINESTYLEARRAY();
            this.stream.align();
            var c = this.readUB(4),
            d = this.readUB(4);
            this.NumFillBits = c;
            this.NumLineBits = d;
            var e = this.readSHAPERECORDS();
            return {
                FillStyles: a,
                LineStyles: b,
                NumFillBits: c,
                NumLineBits: d,
                ShapeRecords: e
            }
        },
        readSHAPEWITHSTYLE: function() {
            return this.readShapeWithStyle()
        },
        readSHAPERECORDS: function() {
            for (var a = [], b = this.readSHAPERECORD(); ! b.isEndOfShape;) {
                a.push(b);
                b = this.readSHAPERECORD()
            }
            this.stream.align();
            return a
        },
        readSHAPERECORD: function() {
            return this.readUB(1) == 0 ? this.readNonEdgeSHAPERECORD() : this.readEdgeSHAPERECORD()
        },
        readNonEdgeSHAPERECORD: function() {
            var a = this.readUB(1),
            b = this.readUB(1),
            c = this.readUB(1),
            d = this.readUB(1),
            e = this.readUB(1);
            if (a == 0 && b == 0 && c == 0 && d == 0 && e == 0) return {
                isEndOfShape: true,
                type: "END"
            };
            else {
                var f,
                g,
                j;
                if (e) {
                    f = this.readUB(5);
                    g = this.readSB(f);
                    j = this.readSB(f)
                }
                var h;
                if (d) h = this.readUB(this.NumFillBits);
                var m;
                if (c) m = this.readUB(this.NumFillBits);
                var k;
                if (b) k = this.readUB(this.NumLineBits);
                var l,
                n,
                p,
                u;
                if (a) {
                    l = this.readFILLSTYLEARRAY();
                    n = this.readLINESTYLEARRAY();
                    this.stream.align();
                    p = this.readUB(4);
                    u = this.readUB(4);
                    this.NumFillBits = p;
                    this.NumLineBits = u
                }
                return {
                    isEndOfShape: false,
                    type: "NONEDGE",
                    StateNewStyles: a,
                    StateLineStyle: b,
                    StateFillStyle1: c,
                    StateFillStyle0: d,
                    StateMoveTo: e,
                    MoveBits: f,
                    MoveDeltaX: g / this.twipsPerPixel,
                    MoveDeltaY: j / this.twipsPerPixel,
                    FillStyle0: h,
                    FillStyle1: m,
                    LineStyle: k,
                    FillStyles: l,
                    LineStyles: n,
                    NumFillBits: p,
                    NumLineBits: u
                }
            }
        },
        readEdgeSHAPERECORD: function() {
            return this.readUB(1) ==
            1 ? this.readSTRAIGHTEDGERECORD() : this.readCURVEDEDGERECORD()
        },
        readSTRAIGHTEDGERECORD: function() {
            var a = this.readUB(4),
            b = this.readUB(1),
            c;
            if (b == 0) c = this.readUB(1);
            var d;
            if (b == 1 || c == 0) {
                d = this.readSB(a + 2);
                if (c == 0) e = 0
            }
            var e;
            if (b == 1 || c == 1) {
                e = this.readSB(a + 2);
                if (c == 1) d = 0
            }
            return {
                isStraightEdge: true,
                type: "STRAIGHT",
                NumBits: a,
                GeneralLineFlag: b,
                VertLineFlag: c,
                DeltaX: d / this.twipsPerPixel,
                DeltaY: e / this.twipsPerPixel
            }
        },
        readCURVEDEDGERECORD: function() {
            var a = this.readUB(4),
            b = this.readSB(a + 2),
            c = this.readSB(a + 2),
            d =
            this.readSB(a + 2),
            e = this.readSB(a + 2);
            return {
                isCurvedEdge: true,
                type: "CURVED",
                NumBits: a,
                ControlDeltaX: b / this.twipsPerPixel,
                ControlDeltaY: c / this.twipsPerPixel,
                AnchorDeltaX: d / this.twipsPerPixel,
                AnchorDeltaY: e / this.twipsPerPixel
            }
        },
        readFILLSTYLEARRAY: function() {
            var a = this.readUI8();
            if (this.context == fljs.swf.tag.DefineShape2 || this.context == fljs.swf.tag.DefineShape3 || this.context == fljs.swf.tag.DefineShape4) if (a == 255) a = a = this.readUI16();
            for (var b = [], c = 0; c < a; c++) b[c] = this.readFILLSTYLE();
            return b
        },
        readFILLSTYLE: function() {
            var a =
            this.readUI8(),
            b;
            if (a == 0) b = this.context == fljs.swf.tag.DefineShape3 || this.context == fljs.swf.tag.DefineShape4 ? this.readRGBA() : this.readRGB();
            var c,
            d;
            if (a == 16 || a == 18) {
                c = this.readMatrix();
                d = this.readGRADIENT()
            }
            if (a == 19) {
                c = this.readMatrix();
                d = this.readFOCALGRADIENT()
            }
            var e,
            f;
            if (a == 64 || a == 65 || a == 66 || a == 67) {
                e = this.readUI16();
                f = this.readMatrix()
            }
            this.stream.align();
            return {
                FillStyleType: a,
                Color: b,
                GradientMatrix: c,
                Gradient: d,
                BitmapId: e,
                BitmapMatrix: f
            }
        },
        readLINESTYLEARRAY: function() {
            var a = this.readUI8();
            if (a ==
            255) a = a = this.readUI16();
            var b = [];
            if (this.context == fljs.swf.tag.DefineShape4) for (var c = 0; c < a; c++) b[c] = this.readLINESTYLE2();
            else for (c = 0; c < a; c++) b[c] = this.readLINESTYLE();
            return b
        },
        readLINESTYLE: function() {
            var a = this.readUI16(),
            b;
            b = this.context == fljs.swf.tag.DefineShape || this.context == fljs.swf.tag.DefineShape2 ? this.readRGB() : this.readRGBA();
            return {
                Width: a / this.twipsPerPixel,
                Color: b
            }
        },
        readLINESTYLE2: function() {
            var a = this.readUI16(),
            b = this.readUB(2),
            c = this.readUB(2),
            d = this.readUB(1),
            e = this.readUB(1),
            f = this.readUB(1),
            g = this.readUB(1);
            this.readUB(5);
            var j = this.readUB(1),
            h = this.readUB(2),
            m;
            if (c == 2) m = this.readUI16();
            var k;
            if (d == 0) k = this.readRGBA();
            var l;
            if (d == 1) l = this.readFILLSTYLE();
            return {
                Width: a / this.twipsPerPixel,
                StartCapStyle: b,
                JoinStyle: c,
                HasFillFlag: d,
                NoHScaleFlag: e,
                NoVScaleFlag: f,
                PixelHintingFlag: g,
                NoClose: j,
                EndCapStyle: h,
                MiterLimitFactor: m,
                Color: k,
                FillType: l
            }
        },
        readGRADIENT: function() {
            this.stream.align();
            for (var a = this.readUB(2), b = this.readUB(2), c = this.readUB(4), d = [], e = 0; e < c; e++) d.push(this.readGRADRECORD());
            return {
                SpreadMode: a,
                InterpolationMode: b,
                NumGradients: c,
                GradientRecords: d
            }
        },
        readFOCALGRADIENT: function() {
            this.stream.align();
            for (var a = this.readUB(2), b = this.readUB(2), c = this.readUB(4), d = [], e = 0; e < c; e++) d.push(this.readGRADRECORD());
            e = this.readFIXED8();
            return {
                SpreadMode: a,
                InterpolationMode: b,
                NumGradients: c,
                GradientRecords: d,
                FocalPoint: e
            }
        },
        readGRADRECORD: function() {
            var a = this.readUI8(),
            b;
            b = this.context == fljs.swf.tag.DefineShape || this.context == fljs.swf.tag.DefineShape2 ? this.readRGB() : this.readRGBA();
            return {
                Ratio: a,
                Color: b
            }
        },
        readID: function() {},
        readMatrix: function() {
            this.stream.align();
            var a = this.readUB(1),
            b,
            c,
            d;
            if (a) {
                b = this.readUB(5);
                c = this.readFB(b);
                d = this.readFB(b)
            }
            var e = this.readUB(1),
            f,
            g,
            j;
            if (e) {
                f = this.readUB(5);
                g = this.readFB(f);
                j = this.readFB(f)
            }
            var h = this.readUB(5),
            m = this.readSB(h),
            k = this.readSB(h);
            return {
                HasScale: a,
                NScaleBits: b,
                ScaleX: c,
                ScaleY: d,
                HasRotate: e,
                NRotateBits: f,
                RotateSkew0: g,
                RotateSkew1: j,
                NTranslateBits: h,
                TranslateX: m / this.twipsPerPixel,
                TranslateY: k / this.twipsPerPixel
            }
        },
        readSHAPE: function() {
            var a =
            this.readUB(4),
            b = this.readUB(4);
            this.NumFillBits = a;
            this.NumLineBits = b;
            var c = this.readSHAPERECORDS();
            return {
                NumFillBits: a,
                NumLineBits: b,
                ShapeRecords: c
            }
        },
        readShape: function() {
            return this.readSHAPE()
        },
        readTEXTRECORDS: function() {
            for (var a = [];;) {
                this.stream.align();
                if (this.readUB(1)) a.push(this.readTEXTRECORD());
                else {
                    this.stream.align();
                    break
                }
            }
            return a
        },
        readTEXTRECORD: function() {
            var a = this.readUB(3),
            b = this.readUB(1),
            c = this.readUB(1),
            d = this.readUB(1),
            e = this.readUB(1),
            f;
            if (b) f = this.readUI16();
            var g;
            if (c) g =
            this.context == fljs.swf.tag.DefineText2 ? this.readRGBA() : this.readRGB();
            var j;
            if (e) j = this.readSI16() / this.twipsPerPixel;
            var h;
            if (d) h = this.readSI16() / this.twipsPerPixel;
            var m;
            if (b) m = this.readUI16() / this.twipsPerPixel;
            for (var k = this.readUI8(), l = [], n = 0; n < k; n++) l.push(this.readGLYPHENTRY());
            return {
                StyleFlagsReserved: a,
                StyleFlagsHasFont: b,
                StyleFlagsHasColor: c,
                StyleFlagsHasYOffset: d,
                StyleFlagsHasXOffset: e,
                FontId: f,
                TextColor: g,
                XOffset: j,
                YOffset: h,
                TextHeight: m,
                GlyphCount: k,
                GlyphEntries: l
            }
        },
        readGLYPHENTRY: function() {
            return {
                GlyphIndex: this.readUB(this.GlyphBits),
                GlyphAdvance: this.readSB(this.AdvanceBits) / this.twipsPerPixel
            }
        },
        readLangCode: function() {
            return this.readUI8()
        },
        readKerningRecord: function() {
            var a,
            b;
            if (this.FontFlagsWideCodes) {
                a = this.readUI16();
                b = this.readUI16()
            } else {
                a = this.readUI8();
                b = this.readUI8()
            }
            var c = this.readSI16();
            return {
                FontKerningCode1: a,
                FontKerningCode2: b,
                FontKerningAdjustment: c
            }
        },
        readMp3SoundData: function(a) {
            for (var b = this.stream.byteIndex, c = this.readSI16(), d = this.stream.byteIndex, e = []; this.stream.byteIndex < b + a;) e.push(this.readMp3Frame(e.length));
            a = this.stream.byteIndex - d;
            return {
                SeekSamples: c,
                Mp3Frames: e,
                byteIndex: d,
                byteCount: a,
                buffer: this.stream.buffer
            }
        },
        readMp3Frame: function(a) {
            var b = this.readUB(11);
            if (b != 2047) throw new Error("readMp3Frame: Syncword is wrong in frame# " + a + " @ " + this.stream.byteIndex);
            a = this.readUB(2);
            var c = this.readUB(2),
            d = this.readUB(1),
            e = this.readUB(4),
            f = this.readUB(2),
            g = this.readUB(1);
            this.readUB(1);
            var j = this.readUB(2),
            h = this.readUB(2),
            m = this.readUB(1),
            k = this.readUB(1),
            l = this.readUB(2);
            d == 0 && this.readUI16();
            var n = Math.floor((a ==
            {
                MPEG2_5: 0,
                MPEG2: 2,
                MPEG1: 3
            }.MPEG1 ? 144: 72) * {
                1: [null, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320],
                2: [null, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160]
            } [{
                0: 2,
                2: 2,
                3: 1
            } [a]][e] * 1E3 / {
                0: [11025, 12E3, 8E3],
                2: [22050, 24E3, 16E3],
                3: [44100, 48E3, 32E3]
            } [a][f]) + g - 4,
            p = this.readBytes(n);
            return {
                Syncword: b,
                MpegVersion: a,
                Layer: c,
                ProtectionBit: d,
                Bitrate: e,
                SamplingRate: f,
                PaddingBit: g,
                ChannelMode: j,
                ModeExtension: h,
                Copyright: m,
                Original: k,
                Emphasis: l,
                byteCount: n,
                SampleData: p
            }
        },
        readSoundInfo: function() {
            this.readUB(2);
            var a =
            this.readUB(1),
            b = this.readUB(1),
            c = this.readUB(1),
            d = this.readUB(1),
            e = this.readUB(1),
            f = this.readUB(1),
            g;
            if (f) g = this.readUI32();
            var j;
            if (e) j = this.readUI32();
            var h;
            if (d) h = this.readUI16();
            var m,
            k;
            if (c) {
                m = this.readUI8();
                k = [];
                for (var l = 0; l < m; l++) k.push(this.readEnvelopeRecord())
            }
            return {
                SyncStop: a,
                SyncNoMultiple: b,
                HasEnvelope: c,
                HasLoops: d,
                HasOutPoint: e,
                HasInPoint: f,
                InPoint: g,
                OutPoint: j,
                LoopCount: h,
                EnvPoints: m,
                EnvelopeRecords: k
            }
        },
        readEnvelopeRecord: function() {
            return {
                Pos44: this.readUI32(),
                LeftLevel: this.readUI16(),
                RightLevel: this.readUI16()
            }
        },
        readButtonRecords: function() {
            for (var a = [], b; b = this.readButtonRecord();) a.push(b);
            return a
        },
        readButtonRecord: function() {
            var a = {};
            this.stream.align();
            this.readUB(2);
            a.ButtonHasBlendMode = this.readUB(1);
            a.ButtonHasFilterList = this.readUB(1);
            a.ButtonStateHitTest = this.readUB(1);
            a.ButtonStateDown = this.readUB(1);
            a.ButtonStateOver = this.readUB(1);
            a.ButtonStateUp = this.readUB(1);
            if (!a.ButtonHasBlendMode && !a.ButtonHasFilterList && !a.ButtonStateHitTest && !a.ButtonStateDown && !a.ButtonStateOver &&
            !a.ButtonStateUp) return null;
            a.CharacterId = this.readUI16();
            a.PlaceDepth = this.readUI16();
            a.PlaceMatrix = this.readMatrix();
            if (this.context == fljs.swf.tag.DefineButton2) {
                a.ColorTransform = this.readCXFORMWITHALPHA();
                if (a.ButtonHasFilterList) a.FilterList = this.readFilterList();
                if (a.ButtonHasBlendMode) a.BlendMode = this.readUI8()
            }
            return a
        },
        readFilterList: function() {
            for (var a = [], b = this.readUI8(), c = 0; c < b; c++) a.push(this.readFilter());
            return a
        },
        readFilter: function() {
            var a = {};
            a.FilterId = this.readUI8();
            switch (a.FilterId) {
            case 0:
                a.DropShadowFilter =
                this.readDropShadowFilter();
                break;
            case 1:
                a.BlurFilter = this.readBlurFilter();
                break;
            case 2:
                a.GlowFilter = this.readGlowFilter();
                break;
            case 3:
                a.BevelFilter = this.readBevelFilter();
                break;
            case 4:
                a.GradientGlowFilter = this.readGradientGlowFilter();
                break;
            case 5:
                a.ConvolutionFilter = this.readConvolutionFilter();
                break;
            case 6:
                a.ColorMatrixFilter = this.readColorMatrixFilter();
                break;
            case 7:
                a.GradientBevelFitler = this.readGradientBevelFilter();
                break
            }
            return a
        },
        readColorMatrixFilter: function() {
            return {
                Matrix: this.readFloats(20)
            }
        },
        readConvolutionFilter: function() {
            var a = {};
            a.MatrixX = this.readUI8();
            a.MatrixY = this.readUI8();
            a.Divisor = this.readFloat();
            a.Bias = this.readFloat();
            a.Matrix = this.readFloats(a.MatrixX * a.MatrixY);
            a.DefaultColor = this.readRGBA();
            this.readUB(6);
            a.Clamp = this.readUB(1);
            a.PreserveAlpha = this.readUB(1);
            return a
        },
        readBlurFilter: function() {
            var a = {
                BlurX: this.readFixed(),
                BlurY: this.readFixed(),
                Passes: this.readUB(5)
            };
            this.readUB(3);
            return a
        },
        readDropShadowFilter: function() {
            return {
                DropShadowColor: this.readRGBA(),
                BlurX: this.readFixed(),
                BlurY: this.readFixed(),
                Angle: this.readFixed(),
                Distance: this.readFixed(),
                Strength: this.readFixed8(),
                InnerShadow: this.readUB(1),
                Knockout: this.readUB(1),
                CompositeSource: this.readUB(1),
                Passes: this.readUB(5)
            }
        },
        readGlowFilter: function() {
            return {
                GlowColor: this.readRGBA(),
                BlurX: this.readFixed(),
                BlurY: this.readFixed(),
                Strength: this.readFixed8(),
                InnerGlow: this.readUB(1),
                Knockout: this.readUB(1),
                CompositeSource: this.readUB(1),
                Passes: this.readUB(5)
            }
        },
        readBevelFilter: function() {
            return {
                ShadowColor: this.readRGBA(),
                HighlightColor: this.readRGBA(),
                BlurX: this.readFixed(),
                BlurY: this.readFixed(),
                Angle: this.readFixed(),
                Distance: this.readFixed(),
                Strength: this.readFixed8(),
                InnerShadow: this.readUB(1),
                Knockout: this.readUB(1),
                CompositeSource: this.readUB(1),
                OnTop: this.readUB(1),
                Passes: this.readUB(4)
            }
        },
        readGradientGlowFilter: function() {
            var a = {};
            a.NumColors = this.readUI8();
            a.GradientColors = [];
            for (var b = 0; b < a.NumColors; b++) a.GradientColors.push(this.readRGBA());
            a.GradientRatios = [];
            for (b = 0; b < a.NumColors; b++) a.GradientRatios.push(this.readUI8());
            a.BlurX = this.readFixed();
            a.BlurY = this.readFixed();
            a.Angle = this.readFixed();
            a.Distance = this.readFixed();
            a.Strength = this.readFixed8();
            a.InnerShadow = this.readUB(1);
            a.Knockout = this.readUB(1);
            a.CompositeSource = this.readUB(1);
            a.OnTop = this.readUB(1);
            a.Passes = this.readUB(4);
            return a
        },
        readGradientBevelFilter: function() {
            var a = {};
            a.NumColors = this.readUI8();
            a.GradientColors = [];
            for (var b = 0; b < a.NumColors; b++) a.GradientColors.push(this.readRGBA());
            a.GradientRatios = [];
            for (b = 0; b < a.NumColors; b++) a.GradientRatios.push(this.readUI8());
            a.BlurX = this.readFixed();
            a.BlurY = this.readFixed();
            a.Angle = this.readFixed();
            a.Distance = this.readFixed();
            a.Strength = this.readFixed8();
            a.InnerShadow = this.readUB(1);
            a.Knockout = this.readUB(1);
            a.CompositeSource = this.readUB(1);
            a.OnTop = this.readUB(1);
            a.Passes = this.readUB(4);
            return a
        },
        readButtonCondActions: function(a) {
            for (var b = [], c = this.stream.byteIndex, d; d = this.readUI16();) b.push(this.readButtonCondAction(d - 2));
            b.push(this.readButtonCondAction(a - (this.stream.byteIndex - c)));
            return b
        },
        readButtonCondAction: function(a) {
            var b =
            {};
            b.CondActionSize = a + 2;
            b.CondIdleToOverDown = this.readUB(1);
            b.CondOutDownToIdle = this.readUB(1);
            b.CondOutDownToOverDown = this.readUB(1);
            b.CondOverDownToOutDown = this.readUB(1);
            b.CondOverDownToOverUp = this.readUB(1);
            b.CondOverUpToOverDown = this.readUB(1);
            b.CondOverUpToIdle = this.readUB(1);
            b.CondIdleToOverUp = this.readUB(1);
            b.CondKeyPress = this.readUB(7);
            b.CondOverDownToIdle = this.readUB(1);
            b.Actions = this.readActionRecords(a - 2);
            return b
        },
        readPix15: function() {
            this.stream.align();
            this.readUB(1);
            return {
                Red: Math.floor(this.readUB(5) *
                8.226),
                Green: Math.floor(this.readUB(5) * 8.226),
                Blue: Math.floor(this.readUB(5) * 8.226)
            }
        },
        beginContext: function(a) {
            this.context = a
        },
        endContext: function() {
            this.NumLineBits = this.NumFillBits = this.context = null
        }
    });
    fljs.swf.StringStream = function(a) {
        this.buffer = String(a);
        this.bitIndex = this.byteIndex = this._byte = 0;
        this.byteIndexForBits = -1;
        this.logger = fljs.console("parse")
    };
    fljs.addMethods(fljs.swf.StringStream, {
        length: function() {
            return this.buffer.length
        },
        hasMore: function() {
            return this.byteIndex < this.buffer.length
        },
        seek: function(a) {
            this._byte = 0;
            this.byteIndex = a;
            this.bitIndex = 0;
            this.byteIndexForBits = -1
        },
        skipBytes: function(a) {
            this.byteIndex += a
        },
        readBytes: function(a) {
            for (var b = [], c = 0; c < a; c++) b.push(String.fromCharCode(this.buffer.charCodeAt(this.byteIndex++) & 255));
            return b
        },
        readBytesRev: function(a) {
            for (var b = [], c = 0; c < a; c++) b.unshift(String.fromCharCode(this.buffer.charCodeAt(this.byteIndex++) &
            255));
            return b
        },
        align: function() {
            this.bitIndex = 8
        },
        nextUByte: function() {
            return this.buffer.charCodeAt(this.byteIndex++) & 255
        },
        nextSByte: function() {
            var a = this.buffer.charCodeAt(this.byteIndex++) & 255;
            if (a >= 128) a -= 256;
            return a
        },
        nextUShort: function() {
            var a = (this.buffer.charCodeAt(this.byteIndex++) & 255) + ((this.buffer.charCodeAt(this.byteIndex++) & 255) << 8);
            if (a < 0) a += 65536;
            return a
        },
        nextSShort: function() {
            var a = this.nextUShort();
            if (a > 32767) a -= 65536;
            return a
        },
        nextULong: function() {
            var a = this.buffer.charCodeAt(this.byteIndex++) &
            255,
            b = this.buffer.charCodeAt(this.byteIndex++) & 255,
            c = this.buffer.charCodeAt(this.byteIndex++) & 255,
            d = this.buffer.charCodeAt(this.byteIndex++) & 255;
            a = a + (b << 8) + (c << 16) + (d << 24);
            if (a < 0) a += 4294967296;
            return a
        },
        nextSLong: function() {
            var a = this.nextULong();
            if (a > 2147483647) a -= 4294967296;
            return a
        },
        nextEncodedULong: function() {
            var a = this.buffer.charCodeAt(this.byteIndex++) & 255;
            if (! (a & 128)) return a;
            a = a & 127 | (this.buffer.charCodeAt(this.byteIndex++) & 255) << 7;
            if (! (a & 16384)) return a;
            a = a & 16383 | (this.buffer.charCodeAt(this.byteIndex++) &
            255) << 14;
            if (! (a & 2097152)) return a;
            a = a & 2097151 | (this.buffer.charCodeAt(this.byteIndex++) & 255) << 21;
            if (! (a & 268435456)) return a;
            return a = a & 268435455 | (this.buffer.charCodeAt(this.byteIndex++) & 255) << 28
        },
        nextString: function() {
            for (var a = [], b; b = this.nextUByte();) a.push(String.fromCharCode(b));
            return a.join("")
        },
        _nextByteForBits: function() {
            this._byte = this.nextUByte();
            this.bitIndex = 0;
            this.byteIndexForBits = this.byteIndex
        },
        nextUBits: function(a) {
            this.byteIndex != this.byteIndexForBits && this._nextByteForBits();
            for (var b =
            0, c = 0; c < a; c++) {
                this.bitIndex == 8 && this._nextByteForBits();
                b = (b << 1) + (this._byte >> 7 - this.bitIndex & 1);
                this.bitIndex += 1
            }
            return b
        },
        nextSBits: function(a, b) {
            b = this.nextUBits(a, b);
            if (b >> a - 1) b -= Math.pow(2, a);
            return b
        },
        nextFShort: function() {
            return this.nextSShort() * Math.pow(2, -8)
        },
        nextFLong: function() {
            return this.nextSLong() * Math.pow(2, -16)
        },
        nextFBits: function(a) {
            return this.nextSBits(a) * Math.pow(2, -16)
        },
        nextHalfFloat: function() {
            return this.nextUShort()
        },
        nextSingleFloat: function() {
            return this.nextULong()
        },
        nextDoubleFloat: function() {
            return this.nextULong() +
            this.nextULong()
        }
    });
    fljs.swf.TagHeader = function() {};
    fljs.addMethods(fljs.swf.TagHeader, {
        tagClass: function() {
            return fljs.swf.tag.tagMap[this.type]
        }
    });
    fljs.swf.TagReader = function(a) {
        this.stream = new fljs.swf.SwfStream(new fljs.swf.StringStream(a));
        this.tagMap = fljs.swf.tag.tagMap
    };
    fljs.addMethods(fljs.swf.TagReader, {
        position: function() {
            return this.stream.stream.byteIndex
        },
        readSwfHeader: function() {
            return this.stream.readSwfHeader()
        },
        readTagHeader: function() {
            var a = this.stream.readRecordHeader(),
            b = new fljs.swf.TagHeader;
            b.data = a;
            b.type = a.TagType;
            b.length = a.TagLength;
            return b
        },
        readTag: function(a, b) {
            var c = a.tagClass();
            if (c) {
                var d = new c;
                c = this.stream.stream.byteIndex;
                d.read(this.stream, a.data, this, null, fljs.Player.getInstance().stage);
                d.header = a;
                d.byteIndex = c;
                if (!b && this.stream.stream.byteIndex <
                c + a.length) this.stream.skipBytes(c + a.length - this.stream.stream.byteIndex);
                else b || this.checkLocation(d)
            }
            return d
        },
        skipTag: function(a) {
            this.stream.skipBytes(a.length)
        },
        checkLocation: function(a) {
            if (this.stream.stream.byteIndex != a.byteIndex + a.header.length) {
                fljs.console("parse");
            }
        }
    });
    fljs.swf.DefinitionParser = function(a) {
        this.reader = new fljs.swf.TagReader(a);
        this.pendingSprite = this.pendingHeader = null;
        this.done = false
    };
    fljs.addMethods(fljs.swf.DefinitionParser, {
        readHeader: function() {
            var a = this.reader.readSwfHeader();
            return this.reader.stream.header = a
        },
        readSomeTags: function(a) {
            fljs.console("parse");
            if (!this.done) {
                var b;
                b = this.pendingSprite ? this.pendingSprite.tag: a.mainTimeline;
                for (var c = this.reader, d = 0, e = c.stream.stream.byteIndex; c.stream.hasMore();) {
                    var f = c.stream.stream.byteIndex,
                    g;
                    if (this.pendingHeader) {
                        g = this.pendingHeader;
                        this.pendingHeader = null
                    } else g = c.readTagHeader();
                    if (d > 0 && g.length > 2E4) {
                        this.pendingHeader =
                        g;
                        a.mainTimeline.__bytesLoaded += e - c.stream.stream.byteIndex;
                        return
                    }
                    var j = c.stream.stream.byteIndex;
                    switch (g.tagClass()) {
                    case fljs.swf.tag.DefineShape:
                    case fljs.swf.tag.DefineShape2:
                    case fljs.swf.tag.DefineShape3:
                    case fljs.swf.tag.DefineShape4:
                    case fljs.swf.tag.DefineFont:
                    case fljs.swf.tag.DefineFont2:
                    case fljs.swf.tag.DefineFont3:
                    case fljs.swf.tag.DefineFontInfo:
                    case fljs.swf.tag.DefineFontInfo2:
                    case fljs.swf.tag.DefineText:
                    case fljs.swf.tag.DefineText2:
                    case fljs.swf.tag.DefineEditText:
                    case fljs.swf.tag.DefineSound:
                    case fljs.swf.tag.JpegTables:
                    case fljs.swf.tag.DefineBits:
                    case fljs.swf.tag.DefineBitsJPEG2:
                    case fljs.swf.tag.DefineBitsLossless:
                    case fljs.swf.tag.DefineBitsLossless2:
                    case fljs.swf.tag.DefineButton2:
                    case fljs.swf.tag.FrameLabel:
                    case fljs.swf.tag.ExportAssets:
                        var h =
                        c.readTag(g);
                        if (c.stream.stream.byteIndex != j + g.length) {
                            rar.rar = true;
                            return
                        }
                        h.evaluate(a, this, null, b);
                        break;
                    case fljs.swf.tag.DefineBitsJpeg3:
                        c.readTag(g);
                        if (c.stream.stream.byteIndex != j + g.length) {
                            rar.rar = true;
                            return
                        }
                        break;
                    case fljs.swf.tag.DefineSprite:
                        h = c.readTag(g, true);
                        h.evaluate(a, this, null, a.stage);
                        this.pendingSprite = {
                            header: g,
                            tag: h,
                            endByteIndex: j + g.length
                        };
                        b = h;
                        break;
                    case fljs.swf.tag.PlaceObject:
                    case fljs.swf.tag.RemoveObject:
                    case fljs.swf.tag.SetBackgroundColor:
                    case fljs.swf.tag.DoAction:
                    case fljs.swf.tag.DoInitAction:
                    case fljs.swf.tag.Protect:
                    case fljs.swf.tag.StartSound:
                    case fljs.swf.tag.SoundStreamHead:
                    case fljs.swf.tag.SoundStreamBlock:
                    case fljs.swf.tag.PlaceObject2:
                    case fljs.swf.tag.PlaceObject3:
                    case fljs.swf.tag.RemoveObject2:
                    case fljs.swf.tag.SoundStreamHead2:
                    case fljs.swf.tag.DoAbc:
                    case fljs.swf.tag.End:
                        h =
                        c.readTag(g);
                        b.frameData_[b.framesLoaded_].tags.push([h, g]);
                        if (c.stream.stream.byteIndex != j + g.length) {
                            rar.rar = true;
                            return
                        }
                        break;
                    case fljs.swf.tag.ShowFrame:
                        c.readTag(g);
                        b.frameData_[b.framesLoaded_].loaded = true;
                        b.framesLoaded_ += 1;
                        if (b.framesLoaded_ == b.totalFrames_) if (this.pendingSprite) {
                            c.stream.stream.byteIndex < this.pendingSprite.endByteIndex && c.stream.skipBytes(this.pendingSprite.endByteIndex - c.stream.stream.byteIndex);
                            b.__bytesLoaded = b.__bytesTotal;
                            this.pendingSprite = null;
                            b = a.mainTimeline
                        } else {
                            b.__bytesLoaded =
                            b.__bytesTotal;
                            this.done = true;
                            return
                        } else b.frameData_[b.framesLoaded_] = {
                            tags: []
                        };
                        break;
                    default:
                        fljs.console("unk");
                        c.skipTag(g)
                    }
                    d += c.stream.stream.byteIndex - f;
                    if (d > 2E4) {
                        a.mainTimeline.__bytesLoaded += c.stream.stream.byteIndex - e;
                        return
                    }
                }
            }
        }
    });
    fljs.swf.DefParser = fljs.swf.DefinitionParser;
    fljs.swf.act = {};
    fljs.swf.act.ActionInterpreter = function(a) {
        this.player = a;
        this.trace = false;
        this.consts = new fljs.swf.act.ConstantsPool;
        this.globals = new fljs.swf.act.Globals(a);
        this.traceLogger = fljs.console("trace")
    };
    fljs.swf.act.ActionInterpreter.ActionCode = {
        End: 0,
        NextFrame: 4,
        PreviousFrame: 5,
        Play: 6,
        Stop: 7,
        Subtract: 11,
        Multiply: 12,
        Divide: 13,
        Not: 18,
        Pop: 23,
        ToInteger: 24,
        GetVariable: 28,
        SetVariable: 29,
        Trace: 38,
        StartDrag: 39,
        EndDrag: 40,
        GetTime: 52,
        Delete: 58,
        DefineLocal: 60,
        CallFunction: 61,
        Return: 62,
        NewObject: 64,
        DefineLocal2: 65,
        InitObject: 67,
        TypeOf: 68,
        Add2: 71,
        Less2: 72,
        Equals2: 73,
        PushDuplicate: 76,
        GetMember: 78,
        SetMember: 79,
        Increment: 80,
        Decrement: 81,
        CallMethod: 82,
        Greater: 103,
        GotoFrame: 129,
        GetUrl: 131,
        StoreRegister: 135,
        ConstantPool: 136,
        WaitForFrame: 138,
        SetTarget: 139,
        GotoLabel: 140,
        DefineFunction2: 142,
        With: 148,
        Push: 150,
        Jump: 153,
        GetUrl2: 154,
        DefineFunction: 155,
        If: 157,
        GotoFrame2: 159
    };
    fljs.addMethods(fljs.swf.act.ActionInterpreter, {
        value: function(a, b) {
            switch (b.Type) {
            case 0:
            case 2:
            case 3:
            case 5:
            case 10:
            case 11:
                return b;
            case 1:
            case 6:
            case 7:
                return {
                    Type:
                    1,
                    Value: b.Value
                };
            case 4:
                return a.reg(b.Value);
            case 8:
            case 9:
                return {
                    Type:
                    0,
                    Value: this.consts.lookup(b.Value)
                };
            default:
                return "[ERR: unknown value]"
            }
        },
        callFunction: function(a, b, c, d) {
            a = new fljs.swf.act.Context(c, b.Context, this, false, b.Value.SupressThisFlag);
            for (var e = 0; e < b.Value.NumParams; e++) {
                var f = b.Value.Parameters[e].Register,
                g = d[e];
                g || (g = {
                    Type: 3,
                    Value: undefined
                });
                f ? a.setReg(f, g) : a.setLocal(b.Value.Parameters[e].ParamName, g)
            }
            f = 1;
            if (b.Value.PreloadThisFlag) {
                a.setReg(f, a.locals.get("this"));
                f += 1
            }
            if (b.Value.PreloadArgumentsFlag) {
                a.setReg(f, {
                    Type: 3,
                    Value: undefined
                });
                f += 1
            }
            if (b.Value.PreloadSuperFlag) {
                a.setReg(f, {
                    Type: 3,
                    Value: undefined
                });
                f += 1
            }
            if (b.Value.PreloadRootFlag) {
                a.setReg(f, a.locals.get("_root"));
                f += 1
            }
            if (b.Value.PreloadParentFlag) {
                a.setReg(f, a.locals.get("_parent"));
                f += 1
            }
            b.Value.PreloadGlobalFlag && a.setReg(f, a.locals.get("_global"));
            d = this.consts;
            this.consts = b.Consts;
            b = this.eval(c, b.Value.Code, a);
            this.consts = d;
            return b
        },
        callMethod: function(a, b, c, d) {
            var e;
            switch (b.Type) {
            case 0:
                a = new fljs.swf.act.String(b.Value);
                e = a.get(c).apply(a, d);
                break;
            case 3:
                break;
            case 11:
                c = b.Value.get(c);
                switch (c.Type) {
                case 10:
                    e = c.Value.apply(b.Value, d);
                    break;
                case 12:
                    e = this.callFunction(a, c, b.Value, d);
                    break
                }
                break
            }
            return e
        },
        callWith: function(a, b, c) {
            a = new fljs.swf.act.Context(c, a, this, true);
            this.eval(c, b.Value.Code, a)
        },
        callback: function(a, b, c) {
            c || (c = []);
            switch (b.Type) {
            case 10:
                b.Value.apply(a,
                c);
                break;
            case 12:
                this.callFunction(null, b, a, c);
                break
            }
        },
        eval: function(a, b, c) {
            c || (c = new fljs.swf.act.Context(a, null, this));
            for (var d = fljs.swf.act.ActionInterpreter.ActionCode, e = [], f = 0; f < b.length; f++) {
                var g = b[f];
                g = b[f];
                switch (g.ActionCode) {
                case d.ConstantPool:
                    this.consts = new fljs.swf.act.ConstantsPool;
                    for (var j in g.ConstantPool) this.consts.push(g.ConstantPool[j]);
                    this.trace && e.push("ConstantPool = " + this.consts);
                    break;
                case d.Push:
                    for (j in g.Values) c.stack.push(this.value(c, g.Values[j]));
                    if (this.trace) {
                        var h =
                        [];
                        for (j in g.Values) h.push(this.value(c, g.Values[j]));
                        e.push("Push(" + h + ")")
                    }
                    break;
                case d.GetVariable:
                    g = c.stack.pop().Value;
                    h = c.get(g);
                    c.stack.push(h);
                    this.trace && e.push("GetVariable(" + [g, h] + ")");
                    break;
                case d.CallMethod:
                    g = c.stack.pop().Value;
                    var m = c.stack.pop(),
                    k = c.stack.pop().Value;
                    h = [];
                    for (j = 0; j < k; j++) h.push(c.stack.pop());
                    var l;
                    if (g) l = this.callMethod(c, m, g, h);
                    else switch (m.Type) {
                    case 10:
                        l = m.Value.apply(null, h);
                        break;
                    case 12:
                        l = this.callFunction(c, m, null, h);
                        break
                    }
                    if (typeof l == "undefined") l = {
                        Type: 3,
                        Value: undefined
                    };
                    c.stack.push(l);
                    this.trace && e.push("Call(" + [m, g, h, l] + ")");
                    break;
                case d.SetVariable:
                    h = c.stack.pop();
                    k = c.stack.pop().Value;
                    m = k.split(":");
                    if (m.length == 1) {
                        a = c.self;
                        g = m[0]
                    } else {
                        a = c.resolvePath(m[0]);
                        g = m[1]
                    }
                    switch (h.Type) {
                    case 0:
                    case 1:
                    case 2:
                    case 3:
                    case 5:
                    case 6:
                    case 7:
                        a.set(g, {
                            Type: h.Type,
                            Value: h.Value
                        });
                        break;
                    default:
                        a.set(g, h);
                        break
                    }
                    this.trace && e.push("Set: " + [k, g, h]);
                    break;
                case d.Divide:
                    g = c.stack.pop();
                    h = c.stack.pop();
                    k = {
                        Type: 1,
                        Value: h.Value / g.Value
                    };
                    if (fljs.Player.getInstance().swfVersion ==
                    4 && (isNaN(k.Value) || k.Value == Number.POSITIVE_INFINITY || k.Value == Number.NEGATIVE_INFINITY)) k = {
                        Type: 0,
                        Value: "#ERROR#"
                    };
                    c.stack.push(k);
                    this.trace && e.push([g, "/", h].toString());
                    break;
                case d.Multiply:
                    g = c.stack.pop();
                    h = c.stack.pop();
                    c.stack.push({
                        Type: 1,
                        Value: Number(g.Value) * Number(h.Value)
                    });
                    this.trace && e.push([g, "*", h].toString());
                    break;
                case d.Equals2:
                    g = c.stack.pop();
                    h = c.stack.pop();
                    c.stack.push({
                        Type: 5,
                        Value: g.Value == h.Value
                    });
                    this.trace && e.push([g, "==", h].toString());
                    break;
                case d.Not:
                    g = Number(c.stack.pop().Value);
                    if (fljs.Player.getInstance().swfVersion == 4) g == 0 ? c.stack.push({
                        Type: 1,
                        Value: 1
                    }) : c.stack.push({
                        Type: 1,
                        Value: 0
                    });
                    else c.stack.push({
                        Type: 5,
                        Value: !g
                    });
                    this.trace && e.push(["!", g].toString());
                    break;
                case d.If:
                    h = c.stack.pop();
                    if (h.Value) {
                        for (j = f + 1; b[j] && b[j].address != b[f + 1].address + g.BranchOffset;) if (g.BranchOffset > 0) j += 1;
                        else j -= 1;
                        f = j - 1
                    }
                    this.trace && e.push(["if(", h, ")", f].toString());
                    break;
                case d.Pop:
                    c.stack.pop();
                    this.trace && e.push("pop");
                    break;
                case d.WaitForFrame:
                    if (c.self.get__framesloaded().Value < g.Frame +
                    1) f += 1 + g.SkipCount;
                    this.trace && e.push("waitForFrame(" + [g.Frame + 1, g.SkipCount] + ")");
                    break;
                case d.GotoFrame:
                    c.self.gotoFrame({
                        Type:
                        1,
                        Value: g.Frame + 1
                    });
                    this.trace && e.push("gotoFrame(" + (g.Frame + 1) + ")");
                    break;
                case d.GetUrl:
                    c.self.getUrl({
                        Type:
                        0,
                        Value: g.UrlString
                    },
                    {
                        Type: 0,
                        Value: g.TargetString
                    });
                    this.trace && e.push('getUrl("' + g.UrlString + '")');
                    break;
                case d.GetUrl2:
                    if (g.LoadTargetFlag) this.trace && e.push("unsupported getUrl call");
                    else if (g.LoadVariablesFlag) this.trace && e.push("unsupported getUrl call");
                    else {
                        g.SendVarsMethod &&
                        this.trace && e.push("unsupported getUrl call");
                        g = c.stack.pop();
                        h = c.stack.pop();
                        c.self.getUrl(h, g);
                        this.trace && e.push('getUrl("' + h + '", "' + g + '")')
                    }
                    break;
                case d.Play:
                    c.self.play();
                    this.trace && e.push("play()");
                    break;
                case d.Stop:
                    c.self.stop();
                    this.trace && e.push("stop()");
                    break;
                case d.DefineFunction:
                    if (g.FunctionName) {
                        c.set(g.FunctionName, {
                            Type: 12,
                            Value: g,
                            Consts: this.consts,
                            Context: c
                        });
                        this.trace && e.push(g.FunctionName + " = function() {}")
                    } else {
                        c.stack.push({
                            Type: 12,
                            Value: g,
                            Consts: this.consts,
                            Context: c
                        });
                        this.trace && e.push("Push(function " + g.FunctionName + "() {})")
                    }
                    break;
                case d.SetTarget:
                    c.setTarget(g.TargetName);
                    this.trace && e.push("SetTarget(" + g.TargetName + ")");
                    break;
                case d.PreviousFrame:
                    c.self.prevFrame();
                    this.trace && e.push("PrevFrame()");
                    break;
                case d.NextFrame:
                    c.self.nextFrame();
                    this.trace && e.push("NextFrame()");
                    break;
                case d.Jump:
                    h = g.BranchOffset > 0 ? 1: -1;
                    for (j = f + 1; b[j] && b[j].address != b[f + 1].address + g.BranchOffset;) j += h;
                    f = j - 1;
                    this.trace && e.push("Jump(" + g.BranchOffset + ")");
                    break;
                case d.NewObject:
                    g =
                    c.stack.pop().Value;
                    k = c.stack.pop().Value;
                    h = [];
                    for (j = 0; j < k; j++) h.push(c.stack.pop());
                    k = c.get(g);
                    switch (k.Type) {
                    case 11:
                        a = new k.Value;
                        a.init.apply(a, h);
                        a = {
                            Type: 11,
                            Value: a
                        };
                        break
                    }
                    c.stack.push(a);
                    this.trace && e.push("New(" + g + ")");
                    break;
                case d.GetMember:
                    g = c.stack.pop().Value;
                    a = c.stack.pop();
                    c.stack.push(a.Value.get(g));
                    this.trace && e.push("GetMember (" + [a, g] + ")");
                    break;
                case d.SetMember:
                    h = c.stack.pop();
                    g = c.stack.pop().Value;
                    a = c.stack.pop();
                    a.Value.set(g, h);
                    this.trace && e.push("SetMember (" + [a, g, h] + ")");
                    break;
                case d.InitObject:
                    k = c.stack.pop().Value;
                    a = new fljs.swf.act.Object;
                    for (f = 0; f < k; f++) {
                        h = c.stack.pop();
                        g = c.stack.pop().Value;
                        a.set(g, h)
                    }
                    this.trace && e.push("InitObject (" + [a, k] + ")");
                    break;
                case d.Trace:
                    h = c.stack.pop();
                    this.traceLogger.info(h.Value);
                    this.trace && e.push("Trace (" + h.Value + ")");
                    break;
                case d.Increment:
                    h = c.stack.pop();
                    c.stack.push({
                        Type: h.Type,
                        Value: h.Value + 1
                    });
                    this.trace && e.push("Increment (" + h.Value + ")");
                    break;
                case d.With:
                    a = c.stack.pop();
                    this.callWith(c, g, a.Value);
                    this.trace && e.push("With (" +
                    a + ")");
                    break;
                case d.End:
                    this.trace && e.push("End");
                    break;
                case d.DefineFunction2:
                    if (g.FunctionName) {
                        c.set(g.FunctionName, {
                            Type: 12,
                            Value: g,
                            Consts: this.consts,
                            Context: c
                        });
                        this.trace && e.push(g.FunctionName + " = function() {}")
                    } else {
                        c.stack.push({
                            Type: 12,
                            Value: g,
                            Consts: this.consts,
                            Context: c
                        });
                        this.trace && e.push("Push(function " + g.FunctionName + "() {})")
                    }
                    this.trace && e.push("DefineFunction2(" + g.FunctionName + ")");
                    break;
                case d.StoreRegister:
                    c.setReg(g.RegisterNumber, c.stack[c.stack.length - 1]);
                    this.trace && e.push("StoreRegister(" +
                    g.RegisterNumber + ")");
                    break;
                case d.GotoLabel:
                    c.self.gotoFrame({
                        Type:
                        0,
                        Value: g.Label
                    });
                    this.trace && e.push("GotoLabel(" + g.Label + ")");
                    break;
                case d.StartDrag:
                    c.stack.pop();
                    c.stack.pop();
                    if (c.stack.pop().Value) {
                        c.stack.pop();
                        c.stack.pop();
                        c.stack.pop();
                        c.stack.pop()
                    }
                    break;
                case d.EndDrag:
                    break;
                case d.Add2:
                    h = c.stack.pop();
                    k = c.stack.pop();
                    g = h.Type == 0 || k.Type == 0 ? 0: h.Type == 6 || k.Type == 6 ? 6: h.Type == 1 || k.Type == 1 ? 1: 7;
                    c.stack.push({
                        Type: g,
                        Value: k.Value + h.Value
                    });
                    break;
                case d.Subtract:
                    g = Number(c.stack.pop().Value);
                    h = Number(c.stack.pop().Value);
                    c.stack.push({
                        Type: 1,
                        Value: h - g
                    });
                    break;
                case d.DefineLocal:
                    h = c.stack.pop();
                    g = c.stack.pop().Value;
                    c.setLocal(g, h);
                    break;
                case d.PushDuplicate:
                    h = c.stack[c.stack.length - 1];
                    switch (h.Type) {
                    case 0:
                    case 1:
                    case 2:
                    case 3:
                    case 5:
                    case 6:
                    case 7:
                        g = {
                            Type: h.Type,
                            Value: h.Value
                        };
                        break;
                    default:
                        g = h;
                        break
                    }
                    c.stack.push(g);
                    break;
                case d.GetTime:
                    c.stack.push({
                        Type:
                        1,
                        Value: fljs.now() - fljs.Player.getInstance().startTime
                    });
                    break;
                case d.Greater:
                    h = c.stack.pop();
                    k = c.stack.pop();
                    c.stack.push({
                        Type: 5,
                        Value: k.Value > h.Value
                    });
                    break;
                case d.CallFunction:
                    g = c.stack.pop().Value;
                    k = c.stack.pop().Value;
                    h = [];
                    for (j = 0; j < k; j++) h.push(c.stack.pop());
                    k = c.get(g);
                    if (g) switch (k.Type) {
                    case 10:
                        l = k.Value.apply(null, h);
                        break;
                    case 12:
                        l = this.callFunction(c, k, null, h);
                        break
                    }
                    if (typeof l == "undefined") l = {
                        Type: 3,
                        Value: undefined
                    };
                    c.stack.push(l);
                    break;
                case d.DefineLocal2:
                    g = c.stack.pop().Value;
                    g in c.locals || c.setLocal(g, {
                        Type: 3,
                        Value: undefined
                    });
                    break;
                case d.TypeOf:
                    h = c.stack.pop();
                    g = {
                        0: "string",
                        1: "number",
                        2: "null",
                        3: "undefined",
                        5: "boolean",
                        6: "number",
                        7: "number",
                        10: "function",
                        11: "object",
                        12: "function"
                    } [h.Type];
                    if (h.Value instanceof fljs.swf.act.MovieClip) g = "movieclip";
                    c.stack.push({
                        Type: 0,
                        Value: g
                    });
                    break;
                case d.ToInteger:
                    h = Number(c.stack.pop().Value);
                    h = h >= 0 ? Math.floor(h) : Math.ceil(h);
                    c.stack.push({
                        Type: 1,
                        Value: h
                    });
                    break;
                case d.Return:
                    return c.stack.pop();
                case d.GotoFrame2:
                    h = c.stack.pop();
                    if (h.Type == 0) {
                        m = h.Value.split(":");
                        if (m.length == 1) {
                            a = c.self;
                            h = m[0]
                        } else {
                            a = c.resolvePath(m[0]);
                            h = m[1]
                        }
                        h = parseInt(h) ? {
                            Type: 1,
                            Value: parseInt(h)
                        }:
                        {
                            Type: 0,
                            Value: h
                        }
                    } else {
                        a = c.self;
                        h = h
                    }
                    if (g.SceneBias) h.Value += g.SceneBias;
                    g.PlayFlag ? c.self.gotoandPlay(h) : c.self.gotoFrame(h);
                    break;
                case d.Less2:
                    h = c.stack.pop().Value;
                    k = c.stack.pop().Value;
                    c.stack.push({
                        Type: 5,
                        Value: k < h
                    });
                    break;
                case d.Decrement:
                    h = c.stack.pop();
                    c.stack.push({
                        Type: h.Type,
                        Value: h.Value - 1
                    });
                    break;
                case d.Delete:
                    g = c.stack.pop().Value;
                    a = c.stack.pop();
                    a.Value.del(g);
                    break;
                default:
                    rar.rar = rar;
                    this.trace && e.push("skipped: 0x" + g.ActionCode.toString(16))
                }
            }
            this.trace && fljs.console("actions").info(e.join("n"))
        }
    });
    fljs.swf.act.Context = function(a, b, c, d, e) {
        this.self = a;
        if (this.parent = b) this.root = b.root ? b.root: b;
        this.withCtx = d;
        this.stack = [];
        this.interp = c;
        this.locals = this.withCtx ? this.parent.locals: new fljs.swf.act.Object;
        if (!this.withCtx) {
            a = fljs.Player.getInstance().mainTimeline.getAs2Object();
            this.locals.set("_root", {
                Type: 11,
                Value: a
            });
            this.locals.set("_level0", {
                Type: 11,
                Value: a
            });
            this.locals.set("_global", {
                Type: 11,
                Value: c.globals
            });
            if (this.self) {
                for (c = this; ! c.self;) c = c.parent;
                b = c.self;
                c = b.dispObj.getParent() ? b.dispObj.getParent().getAs2Object() :
                a
            } else b = c = a;
            this.locals.set("_parent", {
                Type: 11,
                Value: c
            });
            e || this.locals.set("this", {
                Type: 11,
                Value: b
            })
        }
        this.regs = []
    };
    fljs.addMethods(fljs.swf.act.Context, {
        set: function(a, b) {
            if (a in this.locals) this.locals.set(a, b);
            else {
                if (this.withCtx) if (a in this.self) {
                    this.self.set(a, b);
                    return
                }
                this.parent ? this.parent.set(a, b) : this.self.set(a, b)
            }
        },
        setLocal: function(a, b) {
            this.parent ? this.locals.set(a, b) : this.set(a, b)
        },
        get: function(a) {
            var b;
            b = this.locals.get(a);
            if (b.Type != 3) return b;
            if (this.withCtx) {
                b = this.self.get(a);
                if (b.Type != 3) return b
            }
            if (this.parent) return this.parent.get(a);
            else b = this.root ? this.root.get(a) : this.self.get(a);
            if (b.Type != 3) return b;
            return this.interp.globals.get(a)
        },
        reg: function(a) {
            return this.regs[a]
        },
        setReg: function(a, b) {
            this.regs[a] = b
        },
        resolvePath: function(a) {
            var b;
            b = a.indexOf(".") == -1 ? "/": ".";
            a = a.split(b);
            b = this.self;
            if (a[0] == "" && a.length > 1) b = this.root ? this.root.self: this.self;
            for (var c in a) {
                var d = a[c];
                if (d) if (d != ".") b = d == ".." ? b.parent.Value: b.dispObj.__childNames[d].getAs2Object()
            }
            return b
        },
        setTarget: function(a) {
            if (a) {
                a = this.resolvePath(a);
                if (!this.origTarget) this.origTarget = this.self
            } else a = this.origTarget;
            this.self = a
        }
    });
    fljs.swf.act.ConstantsPool = function() {
        this.consts = []
    };
    fljs.addMethods(fljs.swf.act.ConstantsPool, {
        clear: function() {
            this.consts = []
        },
        push: function(a) {
            this.consts.push(a)
        },
        lookup: function(a) {
            return this.consts[a]
        }
    });
    fljs.swf.act.Object = function() {
        this.self = {};
        this.funcs = {};
        this.props = {}
    };
    fljs.swf.act.Object.Type = {
        Bool: 5,
        Func: 10
    };
    fljs.addMethods(fljs.swf.act.Object, {
        setNativeFunc: function(a, b) {
            this.funcs[a] = b
        },
        setNativeProperty: function(a, b) {
            this.props[a] = b
        },
        set: function(a, b) {
            if (this.props && a in this.props) this["set_" + this.props[a]](b);
            else this.self[a] = b
        },
        get: function(a) {
            if (this.funcs && a in this.funcs) return {
                Type: 10,
                Value: this[this.funcs[a]]
            };
            if (this.props && a in this.props) return this["get_" + this.props[a]]();
            else if (this.self && a in this.self) {
                a = this.self[a];
                return a == null ? {
                    Type: 2,
                    Value: null
                }: a
            } else return {
                Type: 3,
                Value: undefined
            }
        },
        del: function(a) {
            if (this.props && a in this.props) this["set_" + this.props[a]]({
                Type: 3,
                Value: undefined
            });
            else delete this.self[a]
        }
    });
    fljs.swf.act.MovieClip = function(a) {
        fljs.swf.act.Object.call(this);
        this.dispObj = a;
        this.logger = fljs.console("mcaction");
        this.funcs = fljs.swf.act.MovieClip.funcs;
        this.props = fljs.swf.act.MovieClip.props
    };
    fljs.inherits(fljs.swf.act.MovieClip, fljs.swf.act.Object);
    fljs.swf.act.MovieClip.props = {
        _framesloaded: "_framesloaded",
        _visible: "_visible",
        _x: "_x",
        _y: "_y",
        onEnterFrame: "onEnterFrame",
        onRollOver: "onRollOver",
        onRollOut: "onRollOut",
        onPress: "onPress",
        onRelease: "onRelease",
        _xmouse: "_ymouse",
        _xscale: "_xscale",
        _yscale: "_yscale",
        _width: "_width"
    };
    fljs.swf.act.MovieClip.funcs = {
        nextFrame: "nextFrame",
        prevFrame: "prevFrame",
        gotoFrame: "gotoFrame",
        gotoAndStop: "gotoFrame",
        gotoAndPlay: "gotoAndPlay",
        play: "play",
        stop: "stop",
        localToGlobal: "localToGlobal",
        hitTest: "hitTest",
        getBytesLoaded: "getBytesLoaded",
        getBytesTotal: "getBytesTotal"
    };
    fljs.addMethods(fljs.swf.act.MovieClip, {
        get: function(a) {
            var b = this.dispObj.__childNames[a];
            return b ? {
                Type: 11,
                Value: b.getAs2Object()
            }: fljs.base(this, "get", a)
        },
        nextFrame: function() {
            this.logger.info("nextFrame");
            this.dispObj.currentFrameIndex_ < this.dispObj.totalFrames_ - 1 && this.dispObj.nextFrame()
        },
        prevFrame: function() {
            this.logger.info("prevFrame");
            this.dispObj.currentFrameIndex_ > 0 && this.dispObj.prevFrame()
        },
        gotoFrame: function(a) {
            this.logger.info("gotoFrame: " + a);
            this.dispObj.gotoAndStop(a.Value)
        },
        gotoAndPlay: function(a) {
            this.logger.info("gotoAndPlay: " +
            a);
            this.dispObj.gotoAndPlay(a.Value)
        },
        play: function() {
            this.logger.info("play");
            this.dispObj.play()
        },
        stop: function() {
            this.logger.info("stop");
            this.dispObj.stop()
        },
        getUrl: function(a, b) {
            if (b.Value == "") window.location = a.Value;
            if (a.Value.substr(0, 10) == "FSCommand:") switch (a.Value.substr(10)) {
            case "quit":
                fljs.Player.getInstance().pause();
                break;
            case "fullscreen":
                break;
            case "allowscale":
                break;
            case "showmenu":
                break;
            case "exec":
                break;
            case "trapallkeys":
                break
            } else {
                b = b.Value;
                if (fljs.agent.OS ==
                "iPhone" || fljs.agent.OS == "iPad") if (b == "_blank") b = "_self";
                window.open(a.Value, b);
                return {
                    Type: 0,
                    Value: ""
                }
            }
        },
        localToGlobal: function(a) {
            a = new flash.geom.Point(a.Value.get("x"), a.Value.get("y"));
            a = this.dispObj.localToGlobal(a);
            var b = new fljs.swf.act.Object;
            b.set("x", a.x);
            b.set("y", a.y);
            return {
                Type: 11,
                Value: b
            }
        },
        hitTest: function(a, b, c) {
            if (arguments.length == 1) {
                c = arguments[0];
                var d;
                if (c.Type != 0) d = c.Value;
                return {
                    Type: 5,
                    Value: this.dispObj.hitTestObject(d.Value.dispObj)
                }
            }
        },
        getBytesLoaded: function() {
            return {
                Type: 1,
                Value: this.dispObj.__bytesLoaded
            }
        },
        getBytesTotal: function() {
            return {
                Type: 1,
                Value: this.dispObj.__bytesTotal
            }
        },
        get__framesloaded: function() {
            return {
                Type: 1,
                Value: this.dispObj.framesLoaded_
            }
        },
        get__xscale: function() {
            return {
                Type: 1,
                Value: this.dispObj.scaleX
            }
        },
        set__xscale: function(a) {
            this.dispObj.scaleX = a.Value
        },
        get__yscale: function() {
            return {
                Type: 1,
                Value: this.dispObj.scaleY
            }
        },
        set__yscale: function(a) {
            this.dispObj.scaleY = a.Value
        },
        get__visible: function() {
            return {
                Type: 5,
                Value: this.dispObj.getVisible()
            }
        },
        set__visible: function(a) {
            this.dispObj.setVisible(a.Value)
        },
        get__x: function() {
            return {
                Type: 1,
                Value: this.dispObj.x
            }
        },
        set__x: function(a) {
            this.dispObj.x = a.Value
        },
        get__y: function() {
            return {
                Type: 1,
                Value: this.dispObj.y
            }
        },
        set__y: function(a) {
            this.dispObj.y = a.Value
        },
        set_onEnterFrame: function(a) {
            this._onEnterFrame = a
        },
        set_onRollOver: function(a) {
            this.set_onMouseEvent(flash.events.MouseEvent.MOUSE_OVER, a)
        },
        set_onRollOut: function(a) {
            this.set_onMouseEvent(flash.events.MouseEvent.MOUSE_OUT, a)
        },
        set_onPress: function(a) {
            this.set_onMouseEvent(flash.events.MouseEvent.MOUSE_DOWN,
            a)
        },
        set_onRelease: function(a) {
            this.set_onMouseEvent(flash.events.MouseEvent.MOUSE_UP, a)
        },
        set_onMouseEvent: function(a, b) {
            var c = this["_on" + a] && !(this["_on" + a].Type == 2 || this["_on" + a].Type == 3),
            d = !(b.Type == 2 || b.Type == 3);
            c && !d && this.dispObj.removeEventListener(a, this["_on" + a + "Handler"]);
            if (!c && d) {
                this["_on" + a + "Handler"] || (this["_on" + a + "Handler"] = fljs.bind(this.onMouseEventHandler, this, a));
                this.dispObj.addEventListener(a, this["_on" + a + "Handler"])
            }
            this["_on" + a] = b
        },
        get_xmouse: function() {
            return this.dispObj.get_mouseX()
        },
        get_ymouse: function() {
            return this.dispObj.get_mouseY()
        },
        onMouseEventHandler: function(a) {
            fljs.Player.getInstance().interpreter.callback(this, this["_on" + a])
        },
        get__width: function() {
            return {
                Type: 1,
                Value: this.dispObj.getWidth()
            }
        },
        set__width: function(a) {
            this.dispObj.setWidth(a.Value)
        }
    });
    fljs.swf.act.Mouse = function() {
        fljs.swf.act.Object.call(this);
        this.funcs = fljs.swf.act.Mouse.funcs;
        this.props = fljs.swf.act.Mouse.props
    };
    fljs.inherits(fljs.swf.act.Mouse, fljs.swf.act.Object);
    fljs.swf.act.Mouse.props = {};
    fljs.swf.act.Mouse.funcs = {
        hide: "hide",
        show: "show",
        addListener: "addListener",
        removeListener: "removeListener"
    };
    fljs.addMethods(fljs.swf.act.Mouse, {
        hide: function() {
            fljs.Player.getInstance().element.getElement().setAttributeNS(null, "cursor", 'url("img/nothing.cur")')
        },
        show: function() {
            fljs.Player.getInstance().element.getElement().setAttributeNS(null, "cursor", "")
        },
        addListener: function() {},
        removeListener: function() {}
    });
    fljs.swf.act.Mouse._self = {};
    fljs.swf.act.Mouse._props = {};
    fljs.swf.act.Mouse._funcs = {
        hide: "hide",
        show: "show"
    };
    fljs.addStaticMethods(fljs.swf.act.Mouse, {
        set: function(a, b) {
            delete this._funcs[a];
            delete this._props[a];
            this._self[a] = b
        },
        get: function(a) {
            var b = this._funcs[a];
            if (b) return {
                Type: 10,
                Value: this[b]
            };
            if (b = this._props[a]) return this[b];
            else {
                a = this._self[a];
                return a == null ? {
                    Type: 2,
                    Value: null
                }: a
            }
        },
        hide: function() {
            fljs.Player.getInstance().element.getElement().setAttributeNS(null, "cursor", 'url("img/nothing.cur")')
        },
        show: function() {
            fljs.Player.getInstance().element.getElement().setAttributeNS(null, "cursor", "")
        }
    });
    fljs.swf.act.Sound = function() {
        this.funcs = fljs.swf.act.Sound.funcs;
        this.props = {}
    };
    fljs.inherits(fljs.swf.act.Sound, fljs.swf.act.Object);
    fljs.swf.act.Sound.funcs = {
        attachSound: "attachSound",
        start: "start",
        stop: "stop"
    };
    fljs.addMethods(fljs.swf.act.Sound, {
        init: function(a) {
            this.target = a
        },
        attachSound: function(a) {
            var b = fljs.Player.getInstance();
            this.target = b.sounds[b.assets[a.Value]]
        },
        start: function() {
            var a = fljs.Player.getInstance();
            if (!this.audio) this.audio = a.allocAudio();
            var b = this.audio,
            c = this.target,
            d = new fljs.swf.StringStream(a.reader.stream.stream.buffer);
            d.byteIndex = c.Mp3SoundData.byteIndex;
            c = d.readBytes(c.Mp3SoundData.byteCount).join("");
            c = "data:audio/mpeg;base64," + btoa(c);
            b.setAttribute("src", c);
            b.addEventListener("load",
            function() {
                b.currentTime = 0;
                b.fljsPlaying = true;
                a.playing && b.play()
            },
            true);
            b.load()
        },
        stop: function() {
            if (this.audio) {
                fljs.Player.getInstance();
                var a = this.audio;
                a.fljsPlaying = false;
                a.pause()
            }
        }
    });
    fljs.swf.act.Math = function() {
        this.funcs = fljs.swf.act.Math.funcs;
        this.props = fljs.swf.act.Math.props
    };
    fljs.inherits(fljs.swf.act.Math, fljs.swf.act.Object);
    fljs.swf.act.Math.props = {};
    fljs.swf.act.Math.funcs = {
        floor: "floor"
    };
    fljs.addMethods(fljs.swf.act.Math, {
        floor: function(a) {
            return {
                Type: 1,
                Value: Math.floor(a.Value)
            }
        }
    });
    fljs.swf.act.Math._self = {};
    fljs.swf.act.Math._props = {};
    fljs.swf.act.Math._funcs = {
        floor: "floor",
        random: "random"
    };
    fljs.addStaticMethods(fljs.swf.act.Math, {
        set: function(a, b) {
            delete this._funcs[a];
            delete this._props[a];
            this._self[a] = b
        },
        get: function(a) {
            var b = this._funcs[a];
            if (b) return {
                Type: 10,
                Value: this[b]
            };
            if (b = this._props[a]) return this[b];
            else {
                a = this._self[a];
                return a == null ? {
                    Type: 2,
                    Value: null
                }: a
            }
        },
        floor: function(a) {
            return {
                Type: 1,
                Value: Math.floor(a.Value)
            }
        },
        random: function() {
            return {
                Type: 1,
                Value: Math.random()
            }
        }
    });
    fljs.swf.act.System = function() {
        this.funcs = {};
        this.props = fljs.swf.act.System.props;
        this.security = new fljs.swf.act.SystemSecurity
    };
    fljs.inherits(fljs.swf.act.System, fljs.swf.act.Object);
    fljs.swf.act.System.props = {
        security: "security"
    };
    fljs.swf.act.SystemSecurity = function() {
        this.funcs = fljs.swf.act.SystemSecurity.funcs;
        this.props = {}
    };
    fljs.inherits(fljs.swf.act.SystemSecurity, fljs.swf.act.Object);
    fljs.swf.act.SystemSecurity.funcs = {
        allowDomain: "allowDomain"
    };
    fljs.addMethods(fljs.swf.act.SystemSecurity, {
        allowDomain: function() {},
        get_security: function() {
            return {
                Type: 11,
                Value: this.security
            }
        }
    });
    fljs.swf.act.String = function(a) {
        this.str = a;
        this.funcs = fljs.swf.act.String.funcs;
        this.props = {}
    };
    fljs.inherits(fljs.swf.act.String, fljs.swf.act.Object);
    fljs.swf.act.String.funcs = {
        substr: "substr"
    };
    fljs.addMethods(fljs.swf.act.String, {
        substr: function(a, b) {
            return {
                Type: 0,
                Value: this.str.substr(a.Value, b.Value)
            }
        }
    });
    fljs.swf.act.Globals = function() {
        fljs.swf.act.Object.call(this);
        this.funcs = fljs.swf.act.Globals.funcs;
        this.props = fljs.swf.act.Globals.props;
        this.Mouse = {
            Type: 11,
            Value: fljs.swf.act.Mouse
        };
        this.Sound = {
            Type: 11,
            Value: fljs.swf.act.Sound
        };
        this.System = {
            Type: 11,
            Value: fljs.swf.act.System
        };
        this.Math = {
            Type: 11,
            Value: fljs.swf.act.Math
        }
    };
    fljs.inherits(fljs.swf.act.Globals, fljs.swf.act.Object);
    fljs.swf.act.Globals.props = {
        Mouse: "Mouse",
        Sound: "Sound",
        System: "System",
        Math: "Math",
        setInterval: "setInterval",
        clearInterval: "clearInterval"
    };
    fljs.swf.act.Globals.funcs = {};
    fljs.addMethods(fljs.swf.act.Globals, {
        get_Mouse: function() {
            return this.Mouse
        },
        get_Sound: function() {
            return this.Sound
        },
        get_System: function() {
            return this.System
        },
        get_Math: function() {
            return this.Math
        },
        get_setInterval: function() {
            return {
                Type: 10,
                Value: fljs.bind(this.setInterval, this)
            }
        },
        get_clearInterval: function() {
            return {
                Type: 10,
                Value: fljs.bind(this.clearInterval, this)
            }
        },
        setInterval: function() {
            var a = fljs.Player.getInstance().interpreter,
            b;
            b = [];
            switch (arguments[0].Type) {
            case 10:
                b = [arguments[0].Value, null];
                for (var c = 2; c < arguments.length; c++) b.push(arguments[c]);
                a = fljs.bind.apply(null, b);
                b = arguments[1].Value;
                b = [a, b];
                break;
            case 11:
                b = [];
                for (c = 3; c < arguments.length; c++) b.push(arguments[c]);
                a = fljs.bind(a.callMethod, a, null, arguments[0], arguments[1], b);
                b = arguments[2].Value;
                b = [a, b];
                break;
            case 12:
                b = [];
                for (c = 2; c < arguments.length; c++) b.push(arguments[c]);
                a = fljs.bind(a.callFunction, a, null, arguments[0], null, b);
                b = arguments[1].Value;
                b = [a, b];
                break
            }
            return {
                Type: 1,
                Value: setInterval.apply(null, b)
            }
        },
        clearInterval: function(a) {
            clearInterval(a.Value)
        }
    });
    flash.display.Document = function() {
        flash.display.MovieClip.call(this)
    };
    fljs.inherits(flash.display.Document, flash.display.MovieClip);
    fljs.player.AbsTimeSync = function(a) {
        this.frameRate = a
    };
    fljs.addMethods(fljs.player.AbsTimeSync, {
        start: function() {
            this.frameCount = 1;
            this.frameStart = 0;
            this.startAt = +new Date
        },
        delay: function() {
            this.frameCount++;
            return 1E3 * (this.frameCount - this.frameStart) / this.frameRate - ( + new Date - this.startAt)
        }
    });
    fljs.player.AudioSync = function(a) {
        this.frameRate = a;
        this.oneFrame = 1E3 / this.frameRate;
        this.audio = null;
        this.frames = {};
        this.timeSync = new fljs.player.AbsTimeSync(a)
    };
    fljs.addMethods(fljs.player.AudioSync, {
        setAudio: function(a) {
            this.audio = a;
            this.audio.setSync(this)
        },
        setFrameTime: function(a, b) {
            this.frames[a] = b
        },
        start: function(a) {
            if (this.audio.frameShouldPlay(a) && typeof this.frames[a] != "undefined") this.audioSync = true;
            else {
                this.timeSync.start();
                this.audioSync = false
            }
            this.lastFrame = a
        },
        stop: function() {},
        delay: function(a) {
            if (a != this.lastFrame + 1) {
                this.start(a);
                return this.oneFrame
            }
            this.lastFrame = a;
            if (this.audioSync) if (this.audio.frameShouldPlay(a) && typeof this.frames[a] !=
            "undefined") {
                expTime = this.audio.currentTime();
                time = this.frames[a];
                return time - expTime
            } else {
                this.timeSync.start();
                this.audioSync = false;
                return this.oneFrame
            } else if (this.audio.frameShouldPlay(a) && typeof this.frames[a] != "undefined") {
                this.audioSync = true;
                return this.oneFrame
            } else return this.timeSync.delay(a)
        }
    });
    fljs.enterFrameDispatcher = function() {
        this.enterFrameListeners = []
    };
    fljs.addMethods(fljs.enterFrameDispatcher, {
        addEventListener: function(a, b) {
            this.enterFrameListeners.push(b)
        },
        removeEventListener: function(a, b) {
            for (var c in this.enterFrameListeners) this.enterFrameListeners[c] == b && this.enterFrameListeners.splice(c, 1)
        },
        dispatchEvent: function(a) {
            for (var b in this.enterFrameListeners) this.enterFrameListeners[b](a)
        }
    });
    fljs.Player = function() {
        this.muted = this.debug = this.predefine = false;
        this.playing = true;
        this.audioId = 1;
        this.audios = {};
        this._volume = 1;
        this.params = {};
        this.renderTextAsGlyphs = false;
        this.loadExtResources = fljs.agent.browser == "Safari" || fljs.agent.browser == "Firefox" || fljs.agent.browser == "Opera"
    };
    fljs.Player.getInstance = function() {
        return fljs.Player._instance || (fljs.Player._instance = new fljs.Player)
    };
    fljs.addMethods(fljs.Player, {
        initialize: function(a) {
            fljs.debug = this.debug;
            this.containerElement = a;
            this.dictionary = {};
            this.displayList = [];
            this.frameNum = -1;
            this.fontsWithoutInfo = {};
            this.fonts = {};
            this.fonts2 = {};
            this.fonts2ByName = {};
            this.fonts2ByStyle = {};
            this.sounds = {};
            this.tagMap = fljs.swf.tag.tagMap;
            this.logger = fljs.console("player");
            this.dispatcher = new fljs.enterFrameDispatcher;
            this.buildSvg();
            this.assets = {};
            this.actionQueue = [];
            this.initActionQueue = [];
            this.delayFrame = 0;
            this.startTime = fljs.now();
            this.initTimeoutHandler()
        },
        initTimeoutHandler: function() {
            this.timeouts = [];
            this.timeoutMessageName = "fljs-timeout-message";
            window.addEventListener("message", fljs.bind(this.timeoutHandler, this), true)
        },
        timeoutHandler: function(a) {
            if (a.source == window && a.data == this.timeoutMessageName) {
                a.stopPropagation();
                this.timeouts.length > 0 && this.timeouts.shift()()
            }
        },
        setTimeout: function(a) {
            this.timeouts.push(a);
            window.postMessage(this.timeoutMessageName, "*")
        },
        buildSvg: function() {
            for (var a = this.containerElement.firstChild, b; a;) {
                if (a.nodeName == "SVG") {
                    b =
                    new fljs.dom.Element(a);
                    break
                }
                a = a.nextSibling
            }
            if (!a) {
                for (var a = this.containerElement.firstChild, b; a;) {
                    b = a.nextSibling;
                    this.containerElement.removeChild(a);
                    a = b
                };
                b = new fljs.dom.Element;
                b.create(fljs.dom.Namespace.Svg, "svg")
            }
            b.set(null, "overflow", "hidden");
            b.sets([[null, "width", this.containerElement.offsetWidth], [null, "height", this.containerElement.offsetHeight], [null, "stroke-linecap", "round"], [null, "stroke-linejoin", "round"], [null, "fill-rule", "evenodd"], [null, "clip-rule", "evenodd"]]);
            if (fljs.agent.OS == "iPhone" || fljs.agent.OS == "iPad") b.sets([[null, "color-rendering", "optimizeSpeed"], [null, "image-rendering",
            "optimizeSpeed"]]);
            b.update();
            this.svg = this.element = this.element_ = b;
            a || this.containerElement.appendChild(b.element);
            b = this.defs = new fljs.dom.Element;
            b.create(fljs.dom.Namespace.Svg, "defs");
            this.svg.append(b)
        },
        createStage: function() {
            new flash.display.DisplayObject;
            this.stage = new flash.display.Stage;
            this.stage.setParent(this);
            this.svg.append(this.stage._clipElement);
            this.stage.initialize();
            this.stage.setFrameRate(this.header.FrameRate)
        },
        addDefinition: function(a, b) {
            this.dictionary[b] = a
        },
        defineFont: function(a,
        b, c) {
            this.fonts[a] = {
                glyphCount: b,
                element: c
            };
            this.defs.element.appendChild(c)
        },
        defineFont2: function(a, b, c, d, e, f, g, j) {
            this.fonts2[a] = {
                glyphCount: b,
                element: c,
                name: d,
                bold: e,
                italic: f,
                codeTable: g,
                tag: j
            };
            this.fonts2ByName[d] = a;
            this.fonts2ByStyle[[d, e, f].toString()] = a;
            for (var h in c) this.defs.append(c[h])
        },
        lookupFontByName: function(a) {
            return "font-" + String(this.fonts2ByName[a])
        },
        lookupFontByStyle: function(a, b, c) {
            a = [a, b, c].toString();
            return "font-" + String(this.fonts2ByStyle[a])
        },
        addToDisplayList: function(a,
        b) {
            this.displayList[b] = a
        },
        loadSwf: function(a, b, c, d, e, f) {
            b.style.width = c + "px";
            b.style.height = d + "px";
            this.name = e;
            for (var g in f) this.params[g] = f[g];
            this.initialize(b); (new fljs.swf.SwfLoader).load(a, fljs.bind(this.readSwf, this))
        },
        readSwf: function(a) {
            this.parser = new fljs.swf.DefinitionParser(a.stream.buffer);
            this.readHeader();
            this.createStage();
            this.buildMainTimeline();
            this.interpreter = new fljs.swf.act.ActionInterpreter(this);
            this.sync = new fljs.player.AbsTimeSync(this.header.FrameRate);
            this.sync.start();
            this.enterFrame()
        },
        showFrame: function() {
            delay = this.sync.delay(this.mainTimeline.currentFrameIndex_, this.delayFrame);
            delay = Math.max(0, delay);
            this.lastFrameAt = fljs.now();
            this.waitingOnFrame = true;
            if (fljs.agent.browser == "Opera") {
                this.element.getElement().setAttributeNS(null, "fill-color", "red");
                this.element.getElement().setAttributeNS(null, "fill-color", "none")
            }
            var a = fljs.bind(this.enterFrame, this, this.frameNum);
            delay >= 10 ? setTimeout(a, delay) : this.setTimeout(a)
        },
        enterFrame: function(a) {
            if (!this.delayFrame) {
                this.logger.info("player frame#" +
                a);
                this.waitingOnFrame = false;
                if (!this.playing) return;
                this.frameNum += 1;
                var b;
                if (this.element.getElement().suspendRedraw) b = this.element.getElement().suspendRedraw(100);
                this.dispatcher.dispatchEvent(new flash.events.Event(flash.events.Event.ENTER_FRAME));
                this.parser.readSomeTags(this);
                this.doActionQueue();
                this.element.getElement().unsuspendRedraw && this.element.getElement().unsuspendRedraw(b)
            }
            this.showFrame()
        },
        doActions: function(a, b) {
            this.actionQueue.push({
                target: this.containingDispObj(a).getAs2Object(),
                actions: b
            })
        },
        doInitAction: function(a) {
            this.initActionQueue.push({
                target: null,
                actions: a.Actions
            })
        },
        containingDispObj: function(a) {
            for (; ! (a instanceof flash.display.MovieClip && !a.getEnabled());) a = a.getParent();
            return a
        },
        doActionQueue: function() {
            for (var a in this.initActionQueue) {
                var b = this.initActionQueue[a];
                this.interpreter.eval(null, b.actions)
            }
            this.initActionQueue = [];
            for (a in this.actionQueue) {
                b = this.actionQueue[a];
                this.interpreter.eval(b.target, b.actions)
            }
            this.actionQueue = []
        },
        readHeader: function() {
            var a =
            this.parser.readHeader();
            this.header = a;
            this.swfVersion = a.Version;
            var b = a.FrameSize.Xmin,
            c = a.FrameSize.Ymin;
            this.svg.sets([[null, "viewBox", [b, c, a.FrameSize.Xmax - b, a.FrameSize.Ymax - c].join(" ")], [null, "preserveAspectRatio", "none"]]);
            this.svg.update()
        },
        buildMainTimeline: function() {
            var a = new flash.display.Document;
            a.setName("_root");
            a.__frameNum = 0;
            var b = new flash.display.Scene;
            b.labels = [];
            b.name = "Scene 1";
            b.numFrames = this.header.FrameCount;
            a.frameData_ = [];
            for (var c = 0; c < this.header.FrameCount; c++) a.frameData_.push({
                scripts: [],
                parts: [],
                tags: [],
                label: ""
            });
            a.labels_ = {};
            a.sceneIndices_ = {};
            a.currentSceneIndex_ = 0;
            a.scenes_ = [b];
            a.currentFrameIndex_ = 0;
            a.currentLabel_ = null;
            a._enabled = false;
            a.framesLoaded_ = 0;
            a.totalFrames_ = this.header.FrameCount;
            a.next_ = null;
            a.playing_ = true;
            a.__bytesLoaded = this.parser.reader.stream.stream.byteIndex;
            a.__bytesTotal = this.header.FileLength;
            this.mainTimeline = a;
            b = a.getAs2Object();
            for (c in this.params) b.set(c, {
                Type: 0,
                Value: this.params[c]
            });
            this.stage.addChild(a);
            a.onCreate()
        },
        play: function() {
            if (!this.playing) {
                for (var a in this.audios) {
                    var b =
                    this.audios[a];
                    b.fljsPlaying && b.play()
                }
                this.playing = true;
                this.setPlayingControl();
                this.waitingOnFrame || this.enterFrame()
            }
        },
        pause: function() {
            if (this.playing) {
                this.playing = false;
                this.setPlayingControl();
                for (var a in this.audios) this.audios[a].pause()
            }
        },
        mute: function() {
            this.prevVolume = this.getVolume();
            this.setVolume(0);
            this.setVolumeControl();
            for (var a in this.audios) this.audioSetVolume(this.audios[a])
        },
        unmute: function() {
            this.setVolume(this.prevVolume);
            this.setVolumeControl();
            for (var a in this.audios) this.audioSetVolume(this.audios[a])
        },
        allocAudio: function() {
            var a = new Audio,
            b = this;
            a.addEventListener("loadedmetadata",
            function() {
                b.audioSetVolume(a)
            },
            false);
            a.fljsPlay = a.play;
            a.play = function() {
                a.fljsPlaying = true;
                b.playing && a.fljsPlay()
            };
            a.fljsId = this.audioId++;
            return this.audios[a.fljsId] = a
        },
        releaseAudio: function(a) {
            delete this.audios[a.fljsId]
        },
        audioSetVolume: function(a) {
            if (!a.fljsWaiting) {
                a.volume = Math.max(0, Math.min(this._volume + 0.0010, 1));
                a.volume = Math.max(0, Math.min(this._volume, 1))
            }
        },
        buildControls: function(a) {
            if (fljs.agent.browser !=
            "Explorer") {
                var b = a.ownerDocument,
                c = b.createElement("input");
                c.setAttribute("type", "button");
                var d = this;
                c.addEventListener("click",
                function() {
                    d.playing ? d.pause() : d.play()
                },
                true);
                a.appendChild(c);
                b = b.createElement("input");
                b.setAttribute("type", "button");
                b.addEventListener("click",
                function() {
                    d.getVolume() > 0 ? d.mute() : d.unmute()
                },
                true);
                a.appendChild(b);
                this.controls = {
                    playing: c,
                    volume: b
                };
                this.setPlayingControl();
                this.setVolumeControl()
            }
        },
        setPlayingControl: function() {
            if (this.controls) this.controls.playing.value =
            this.playing ? "pause": "play"
        },
        setVolumeControl: function() {
            if (this.controls) this.controls.volume.value = this.muted ? "unmute": "mute"
        },
        getVolume: function() {
            return this._volume == 0.999 ? 1: this._volume
        },
        setSolume: function(a) {
            this.prevVolume = this._volume;
            this._volume = a;
            this.muted = this._volume == 0;
            if (this._volume == 1) this._volume = 0.999;
            this.setVolumeControl()
        }
    });
    fljs.base64 = {};
    fljs.base64.chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
    fljs.base64.atob = function(a) {
        for (var b = a.length, c = [], d = 0, e, f, g, j, h, m = fljs.base64.chars; d < b;) {
            e = m.indexOf(a.charAt(d++));
            f = m.indexOf(a.charAt(d++));
            g = m.indexOf(a.charAt(d++));
            j = m.indexOf(a.charAt(d++));
            e = e << 2 | f >> 4;
            f = (f & 15) << 4 | g >> 2;
            h = (g & 3) << 6 | j;
            c.push(String.fromCharCode(4096 | e));
            g != 64 && c.push(String.fromCharCode(4096 | f));
            j != 64 && c.push(String.fromCharCode(4096 | h))
        }
        String(c.join(""))
    };
    fljs.swf.SwfLoader = function() {
        var a;
        this.complete = false;
        try {
            a = new XMLHttpRequest
        } catch(b) {
            a = false
        }
        if (!a) return null;
        this.xmlhttp = a
    };
    fljs.addMethods(fljs.swf.SwfLoader, {
        load: function(a, b) {
            if (fljs.agent.browser == "Explorer" || fljs.agent.browser == "Opera") a += ".b64";
            this.logger = fljs.console("demo");
            this.complete = false;
            try {
                this.xmlhttp.overrideMimeType && this.xmlhttp.overrideMimeType("text/plain; charset=x-user-defined");
                this.xmlhttp.open("GET", a, true);
                this.xmlhttp.onreadystatechange = fljs.bind(this.onLoad, this, b);
                this.xmlhttp.send(null)
            } catch(c) {
                return false
            }
            return true
        },
        onLoad: function(a) {
            if (! (this.xmlhttp.readyState != 4 || this.complete)) {
                this.complete =
                true;
                var b;
                b = fljs.agent.browser == "Explorer" ? fljs.base64.atob(this.xmlhttp.responseText) : fljs.agent.browser == "Opera" ? window.atob(this.xmlhttp.responseText) : this.xmlhttp.responseText;
                b = new fljs.swf.StringStream(b);
                b = new fljs.swf.SwfStream(b);
                a(b)
            }
        }
    });
    var player = fljs.Player.getInstance();
    player.loadSwf(url, element, width, height, name, params);
    return player
}
