diff --git a/PVEDiscordDark.py b/PVEDiscordDark.py
index 20e37717f67ba39e1b478e742356c89767b331c4..4cc6c337c2a8f872299c7ff63a8eda2c6522dd5a 100644
--- a/PVEDiscordDark.py
+++ b/PVEDiscordDark.py
@@ -71,7 +71,7 @@ def themeIsInstalled():
     tplFile = open('/usr/share/pve-manager/index.html.tpl')
     tplLines = tplFile.readlines()
     for line in tplLines:
-        if "<link rel='stylesheet' type='text/css' href='/pve2/css/dd_style.css'>" in line:
+        if ("<link rel='stylesheet' type='text/css' href='/pve2/css/dd_style.css'>" in line or "<script type='text/javascript' src='/pve2/js/dd_patcher.js'></script>" in line):
             tplUsesTheme = True
     if (os.path.isfile('/usr/share/pve-manager/css/dd_style.css') or tplUsesTheme):
         return True
@@ -91,11 +91,6 @@ def installTheme():
     with open('/usr/share/pve-manager/index.html.tpl', 'a') as tplFile:
         tplFile.write("<link rel='stylesheet' type='text/css' href='/pve2/css/dd_style.css'>")
         tplFile.write("<script type='text/javascript' src='/pve2/js/dd_patcher.js'></script>")
-    cprint(colors.NORMAL, 'Replacing charts.js..')
-    if os.path.exists('/usr/share/javascript/extjs/charts.js'):
-        shutil.copyfile('/usr/share/javascript/extjs/charts.js', '/usr/share/javascript/extjs/charts.js.bak')
-        os.remove('/usr/share/javascript/extjs/charts.js')
-    urllib.request.urlretrieve(f'{baseURL}/PVEDiscordDark/js/charts.js', '/usr/share/javascript/extjs/charts.js')
     for index, image in enumerate(images):
         cprint(colors.NORMAL, f'Downloading images [{index + 1}/{len(images)}]..\r', False, True)
         urllib.request.urlretrieve(f'{baseURL}/PVEDiscordDark/images/{image}', f'/usr/share/pve-manager/images/{image}')
diff --git a/PVEDiscordDark/js/PVEDiscordDark.js b/PVEDiscordDark/js/PVEDiscordDark.js
index 9cb8d6189bfc3da88dea68db33747667df864a6a..eaa37cf7d5e7091b231cf689075314200e2d1881 100644
--- a/PVEDiscordDark/js/PVEDiscordDark.js
+++ b/PVEDiscordDark/js/PVEDiscordDark.js
@@ -19,6 +19,15 @@ const swapLogo = async function() {
 	};
 };
 
+const patchCharts = function() {
+	Ext.chart.theme.Base.prototype.config.chart.defaults.background = '#23272a';
+	Ext.chart.theme.Base.prototype.config.axis.defaults.label.color = 'white';
+	Ext.chart.theme.Base.prototype.config.axis.defaults.title.color = 'white';
+	Ext.chart.theme.Base.prototype.config.axis.defaults.style.strokeStyle = '#7289DA';
+	Ext.chart.theme.Base.prototype.config.axis.defaults.grid.strokeStyle = 'rgba(44, 47, 51, 1)';
+	Ext.chart.theme.Base.prototype.config.sprites.text.color = 'white';
+};
+
 function patchGaugeWidget() {
 	Proxmox.panel.GaugeWidget.prototype.backgroundColor = '#2C2F33';
 	Proxmox.panel.GaugeWidget.prototype.criticalColor = '#f04747';
@@ -169,6 +178,7 @@ function patchSubscription() {
 }
 
 swapLogo();
+patchCharts();
 patchGaugeWidget();
 patchBackupConfig();
 patchDiskSmartWindow();
diff --git a/PVEDiscordDark/js/charts.js b/PVEDiscordDark/js/charts.js
deleted file mode 100644
index 713bec3b2c8b56c8dac86cc7955bb464a438bf3d..0000000000000000000000000000000000000000
--- a/PVEDiscordDark/js/charts.js
+++ /dev/null
@@ -1,22013 +0,0 @@
-Ext.define("Ext.draw.ContainerBase", {
-    extend: "Ext.panel.Panel",
-    requires: ["Ext.window.Window"],
-    previewTitleText: "Chart Preview",
-    previewAltText: "Chart preview",
-    layout: "container",
-    addElementListener: function() {
-        var b = this,
-            a = arguments;
-        if (b.rendered) {
-            b.el.on.apply(b.el, a)
-        } else {
-            b.on("render", function() {
-                b.el.on.apply(b.el, a)
-            })
-        }
-    },
-    removeElementListener: function() {
-        var b = this,
-            a = arguments;
-        if (b.rendered) {
-            b.el.un.apply(b.el, a)
-        }
-    },
-    afterRender: function() {
-        this.callParent(arguments);
-        this.initAnimator()
-    },
-    getItems: function() {
-        var b = this,
-            a = b.items;
-        if (!a || !a.isMixedCollection) {
-            b.initItems()
-        }
-        return b.items
-    },
-    onRender: function() {
-        this.callParent(arguments);
-        this.element = this.el;
-        this.innerElement = this.body
-    },
-    setItems: function(a) {
-        this.items = a;
-        return a
-    },
-    setSurfaceSize: function(b, a) {
-        this.resizeHandler({
-            width: b,
-            height: a
-        });
-        this.renderFrame()
-    },
-    onResize: function(c, a, b, e) {
-        var d = this;
-        d.callParent([c, a, b, e]);
-        d.setBodySize({
-            width: c,
-            height: a
-        })
-    },
-    preview: function() {
-        var a = this.getImage();
-        new Ext.window.Window({
-            title: this.previewTitleText,
-            closeable: true,
-            renderTo: Ext.getBody(),
-            autoShow: true,
-            maximizeable: true,
-            maximized: true,
-            border: true,
-            layout: {
-                type: "hbox",
-                pack: "center",
-                align: "middle"
-            },
-            items: {
-                xtype: "container",
-                items: {
-                    xtype: "image",
-                    mode: "img",
-                    cls: Ext.baseCSSPrefix + "chart-image",
-                    alt: this.previewAltText,
-                    src: a.data,
-                    listeners: {
-                        afterrender: function() {
-                            var e = this,
-                                b = e.imgEl.dom,
-                                d = a.type === "svg" ? 1 : (window.devicePixelRatio || 1),
-                                c;
-                            if (!b.naturalWidth || !b.naturalHeight) {
-                                b.onload = function() {
-                                    var g = b.naturalWidth,
-                                        f = b.naturalHeight;
-                                    e.setWidth(Math.floor(g / d));
-                                    e.setHeight(Math.floor(f / d))
-                                }
-                            } else {
-                                c = e.getSize();
-                                e.setWidth(Math.floor(c.width / d));
-                                e.setHeight(Math.floor(c.height / d))
-                            }
-                        }
-                    }
-                }
-            }
-        })
-    },
-    privates: {
-        getTargetEl: function() {
-            return this.innerElement
-        },
-        reattachToBody: function() {
-            var a = this;
-            if (a.pendingDetachSize) {
-                a.onBodyResize()
-            }
-            a.pendingDetachSize = false;
-            a.callParent()
-        }
-    }
-});
-Ext.define("Ext.draw.SurfaceBase", {
-    extend: "Ext.Widget",
-    getOwnerBody: function() {
-        return this.ownerCt.body
-    },
-    destroy: function() {
-        var a = this;
-        if (a.hasListeners.destroy) {
-            a.fireEvent("destroy", a)
-        }
-        a.callParent()
-    }
-});
-Ext.define("Ext.draw.Color", {
-    statics: {
-        colorToHexRe: /(.*?)rgb\((\d+),\s*(\d+),\s*(\d+)\)/,
-        rgbToHexRe: /\s*rgb\((\d+),\s*(\d+),\s*(\d+)\)/,
-        rgbaToHexRe: /\s*rgba\((\d+),\s*(\d+),\s*(\d+),\s*([\.\d]+)\)/,
-        hexRe: /\s*#([0-9a-fA-F][0-9a-fA-F]?)([0-9a-fA-F][0-9a-fA-F]?)([0-9a-fA-F][0-9a-fA-F]?)\s*/,
-        NONE: "none",
-        RGBA_NONE: "rgba(0, 0, 0, 0)"
-    },
-    isColor: true,
-    lightnessFactor: 0.2,
-    constructor: function(d, b, a, c) {
-        this.setRGB(d, b, a, c)
-    },
-    setRGB: function(e, c, a, d) {
-        var b = this;
-        b.r = Math.min(255, Math.max(0, e));
-        b.g = Math.min(255, Math.max(0, c));
-        b.b = Math.min(255, Math.max(0, a));
-        if (d === undefined) {
-            b.a = 1
-        } else {
-            b.a = Math.min(1, Math.max(0, d))
-        }
-    },
-    getGrayscale: function() {
-        return this.r * 0.3 + this.g * 0.59 + this.b * 0.11
-    },
-    getHSL: function() {
-        var i = this,
-            a = i.r / 255,
-            f = i.g / 255,
-            j = i.b / 255,
-            k = Math.max(a, f, j),
-            d = Math.min(a, f, j),
-            m = k - d,
-            e, n = 0,
-            c = 0.5 * (k + d);
-        if (d !== k) {
-            n = (c <= 0.5) ? m / (k + d) : m / (2 - k - d);
-            if (a === k) {
-                e = 60 * (f - j) / m
-            } else {
-                if (f === k) {
-                    e = 120 + 60 * (j - a) / m
-                } else {
-                    e = 240 + 60 * (a - f) / m
-                }
-            }
-            if (e < 0) {
-                e += 360
-            }
-            if (e >= 360) {
-                e -= 360
-            }
-        }
-        return [e, n, c]
-    },
-    getHSV: function() {
-        var i = this,
-            a = i.r / 255,
-            f = i.g / 255,
-            j = i.b / 255,
-            k = Math.max(a, f, j),
-            d = Math.min(a, f, j),
-            c = k - d,
-            e, m = 0,
-            l = k;
-        if (d != k) {
-            m = l ? c / l : 0;
-            if (a === k) {
-                e = 60 * (f - j) / c
-            } else {
-                if (f === k) {
-                    e = 60 * (j - a) / c + 120
-                } else {
-                    e = 60 * (a - f) / c + 240
-                }
-            }
-            if (e < 0) {
-                e += 360
-            }
-            if (e >= 360) {
-                e -= 360
-            }
-        }
-        return [e, m, l]
-    },
-    setHSL: function(g, f, e) {
-        var i = this,
-            d = Math.abs,
-            j, b, a;
-        g = (g % 360 + 360) % 360;
-        f = f > 1 ? 1 : f < 0 ? 0 : f;
-        e = e > 1 ? 1 : e < 0 ? 0 : e;
-        if (f === 0 || g === null) {
-            e *= 255;
-            i.setRGB(e, e, e)
-        } else {
-            g /= 60;
-            j = f * (1 - d(2 * e - 1));
-            b = j * (1 - d(g % 2 - 1));
-            a = e - j / 2;
-            a *= 255;
-            j *= 255;
-            b *= 255;
-            switch (Math.floor(g)) {
-                case 0:
-                    i.setRGB(j + a, b + a, a);
-                    break;
-                case 1:
-                    i.setRGB(b + a, j + a, a);
-                    break;
-                case 2:
-                    i.setRGB(a, j + a, b + a);
-                    break;
-                case 3:
-                    i.setRGB(a, b + a, j + a);
-                    break;
-                case 4:
-                    i.setRGB(b + a, a, j + a);
-                    break;
-                case 5:
-                    i.setRGB(j + a, a, b + a);
-                    break
-            }
-        }
-        return i
-    },
-    setHSV: function(f, e, d) {
-        var g = this,
-            i, b, a;
-        f = (f % 360 + 360) % 360;
-        e = e > 1 ? 1 : e < 0 ? 0 : e;
-        d = d > 1 ? 1 : d < 0 ? 0 : d;
-        if (e === 0 || f === null) {
-            d *= 255;
-            g.setRGB(d, d, d)
-        } else {
-            f /= 60;
-            i = d * e;
-            b = i * (1 - Math.abs(f % 2 - 1));
-            a = d - i;
-            a *= 255;
-            i *= 255;
-            b *= 255;
-            switch (Math.floor(f)) {
-                case 0:
-                    g.setRGB(i + a, b + a, a);
-                    break;
-                case 1:
-                    g.setRGB(b + a, i + a, a);
-                    break;
-                case 2:
-                    g.setRGB(a, i + a, b + a);
-                    break;
-                case 3:
-                    g.setRGB(a, b + a, i + a);
-                    break;
-                case 4:
-                    g.setRGB(b + a, a, i + a);
-                    break;
-                case 5:
-                    g.setRGB(i + a, a, b + a);
-                    break
-            }
-        }
-        return g
-    },
-    createLighter: function(b) {
-        if (!b && b !== 0) {
-            b = this.lightnessFactor
-        }
-        var a = this.getHSL();
-        a[2] = Ext.Number.constrain(a[2] + b, 0, 1);
-        return Ext.draw.Color.fromHSL(a[0], a[1], a[2])
-    },
-    createDarker: function(a) {
-        if (!a && a !== 0) {
-            a = this.lightnessFactor
-        }
-        return this.createLighter(-a)
-    },
-    toString: function() {
-        var f = this,
-            c = Math.round;
-        if (f.a === 1) {
-            var e = c(f.r).toString(16),
-                d = c(f.g).toString(16),
-                a = c(f.b).toString(16);
-            e = (e.length === 1) ? "0" + e : e;
-            d = (d.length === 1) ? "0" + d : d;
-            a = (a.length === 1) ? "0" + a : a;
-            return ["#", e, d, a].join("")
-        } else {
-            return "rgba(" + [c(f.r), c(f.g), c(f.b), f.a === 0 ? 0 : f.a.toFixed(15)].join(", ") + ")"
-        }
-    },
-    toHex: function(b) {
-        if (Ext.isArray(b)) {
-            b = b[0]
-        }
-        if (!Ext.isString(b)) {
-            return ""
-        }
-        if (b.substr(0, 1) === "#") {
-            return b
-        }
-        var e = Ext.draw.Color.colorToHexRe.exec(b);
-        if (Ext.isArray(e)) {
-            var f = parseInt(e[2], 10),
-                d = parseInt(e[3], 10),
-                a = parseInt(e[4], 10),
-                c = a | (d << 8) | (f << 16);
-            return e[1] + "#" + ("000000" + c.toString(16)).slice(-6)
-        } else {
-            return ""
-        }
-    },
-    setFromString: function(j) {
-        var e, h, f, c, d = 1,
-            i = parseInt;
-        if (j === Ext.draw.Color.NONE) {
-            this.r = this.g = this.b = this.a = 0;
-            return this
-        }
-        if ((j.length === 4 || j.length === 7) && j.substr(0, 1) === "#") {
-            e = j.match(Ext.draw.Color.hexRe);
-            if (e) {
-                h = i(e[1], 16) >> 0;
-                f = i(e[2], 16) >> 0;
-                c = i(e[3], 16) >> 0;
-                if (j.length === 4) {
-                    h += (h * 16);
-                    f += (f * 16);
-                    c += (c * 16)
-                }
-            }
-        } else {
-            if ((e = j.match(Ext.draw.Color.rgbToHexRe))) {
-                h = +e[1];
-                f = +e[2];
-                c = +e[3]
-            } else {
-                if ((e = j.match(Ext.draw.Color.rgbaToHexRe))) {
-                    h = +e[1];
-                    f = +e[2];
-                    c = +e[3];
-                    d = +e[4]
-                } else {
-                    if (Ext.draw.Color.ColorList.hasOwnProperty(j.toLowerCase())) {
-                        return this.setFromString(Ext.draw.Color.ColorList[j.toLowerCase()])
-                    }
-                }
-            }
-        }
-        if (typeof h === "undefined") {
-            return this
-        }
-        this.r = h;
-        this.g = f;
-        this.b = c;
-        this.a = d;
-        return this
-    }
-}, function() {
-    var a = new this();
-    this.addStatics({
-        fly: function(f, e, c, d) {
-            switch (arguments.length) {
-                case 1:
-                    a.setFromString(f);
-                    break;
-                case 3:
-                case 4:
-                    a.setRGB(f, e, c, d);
-                    break;
-                default:
-                    return null
-            }
-            return a
-        },
-        ColorList: {
-            aliceblue: "#f0f8ff",
-            antiquewhite: "#faebd7",
-            aqua: "#00ffff",
-            aquamarine: "#7fffd4",
-            azure: "#f0ffff",
-            beige: "#f5f5dc",
-            bisque: "#ffe4c4",
-            black: "#000000",
-            blanchedalmond: "#ffebcd",
-            blue: "#0000ff",
-            blueviolet: "#8a2be2",
-            brown: "#a52a2a",
-            burlywood: "#deb887",
-            cadetblue: "#5f9ea0",
-            chartreuse: "#7fff00",
-            chocolate: "#d2691e",
-            coral: "#ff7f50",
-            cornflowerblue: "#6495ed",
-            cornsilk: "#fff8dc",
-            crimson: "#dc143c",
-            cyan: "#00ffff",
-            darkblue: "#00008b",
-            darkcyan: "#008b8b",
-            darkgoldenrod: "#b8860b",
-            darkgray: "#a9a9a9",
-            darkgreen: "#006400",
-            darkkhaki: "#bdb76b",
-            darkmagenta: "#8b008b",
-            darkolivegreen: "#556b2f",
-            darkorange: "#ff8c00",
-            darkorchid: "#9932cc",
-            darkred: "#8b0000",
-            darksalmon: "#e9967a",
-            darkseagreen: "#8fbc8f",
-            darkslateblue: "#483d8b",
-            darkslategray: "#2f4f4f",
-            darkturquoise: "#00ced1",
-            darkviolet: "#9400d3",
-            deeppink: "#ff1493",
-            deepskyblue: "#00bfff",
-            dimgray: "#696969",
-            dodgerblue: "#1e90ff",
-            firebrick: "#b22222",
-            floralwhite: "#fffaf0",
-            forestgreen: "#228b22",
-            fuchsia: "#ff00ff",
-            gainsboro: "#dcdcdc",
-            ghostwhite: "#f8f8ff",
-            gold: "#ffd700",
-            goldenrod: "#daa520",
-            gray: "#808080",
-            green: "#008000",
-            greenyellow: "#adff2f",
-            honeydew: "#f0fff0",
-            hotpink: "#ff69b4",
-            indianred: "#cd5c5c",
-            indigo: "#4b0082",
-            ivory: "#fffff0",
-            khaki: "#f0e68c",
-            lavender: "#e6e6fa",
-            lavenderblush: "#fff0f5",
-            lawngreen: "#7cfc00",
-            lemonchiffon: "#fffacd",
-            lightblue: "#add8e6",
-            lightcoral: "#f08080",
-            lightcyan: "#e0ffff",
-            lightgoldenrodyellow: "#fafad2",
-            lightgray: "#d3d3d3",
-            lightgrey: "#d3d3d3",
-            lightgreen: "#90ee90",
-            lightpink: "#ffb6c1",
-            lightsalmon: "#ffa07a",
-            lightseagreen: "#20b2aa",
-            lightskyblue: "#87cefa",
-            lightslategray: "#778899",
-            lightsteelblue: "#b0c4de",
-            lightyellow: "#ffffe0",
-            lime: "#00ff00",
-            limegreen: "#32cd32",
-            linen: "#faf0e6",
-            magenta: "#ff00ff",
-            maroon: "#800000",
-            mediumaquamarine: "#66cdaa",
-            mediumblue: "#0000cd",
-            mediumorchid: "#ba55d3",
-            mediumpurple: "#9370d8",
-            mediumseagreen: "#3cb371",
-            mediumslateblue: "#7b68ee",
-            mediumspringgreen: "#00fa9a",
-            mediumturquoise: "#48d1cc",
-            mediumvioletred: "#c71585",
-            midnightblue: "#191970",
-            mintcream: "#f5fffa",
-            mistyrose: "#ffe4e1",
-            moccasin: "#ffe4b5",
-            navajowhite: "#ffdead",
-            navy: "#000080",
-            oldlace: "#fdf5e6",
-            olive: "#808000",
-            olivedrab: "#6b8e23",
-            orange: "#ffa500",
-            orangered: "#ff4500",
-            orchid: "#da70d6",
-            palegoldenrod: "#eee8aa",
-            palegreen: "#98fb98",
-            paleturquoise: "#afeeee",
-            palevioletred: "#d87093",
-            papayawhip: "#ffefd5",
-            peachpuff: "#ffdab9",
-            peru: "#cd853f",
-            pink: "#ffc0cb",
-            plum: "#dda0dd",
-            powderblue: "#b0e0e6",
-            purple: "#800080",
-            red: "#ff0000",
-            rosybrown: "#bc8f8f",
-            royalblue: "#4169e1",
-            saddlebrown: "#8b4513",
-            salmon: "#fa8072",
-            sandybrown: "#f4a460",
-            seagreen: "#2e8b57",
-            seashell: "#fff5ee",
-            sienna: "#a0522d",
-            silver: "#c0c0c0",
-            skyblue: "#87ceeb",
-            slateblue: "#6a5acd",
-            slategray: "#708090",
-            snow: "#fffafa",
-            springgreen: "#00ff7f",
-            steelblue: "#4682b4",
-            tan: "#d2b48c",
-            teal: "#008080",
-            thistle: "#d8bfd8",
-            tomato: "#ff6347",
-            turquoise: "#40e0d0",
-            violet: "#ee82ee",
-            wheat: "#f5deb3",
-            white: "#ffffff",
-            whitesmoke: "#f5f5f5",
-            yellow: "#ffff00",
-            yellowgreen: "#9acd32"
-        },
-        fromHSL: function(d, c, b) {
-            return (new this(0, 0, 0, 0)).setHSL(d, c, b)
-        },
-        fromHSV: function(d, c, b) {
-            return (new this(0, 0, 0, 0)).setHSL(d, c, b)
-        },
-        fromString: function(b) {
-            return (new this(0, 0, 0, 0)).setFromString(b)
-        },
-        create: function(b) {
-            if (b instanceof this) {
-                return b
-            } else {
-                if (Ext.isArray(b)) {
-                    return new Ext.draw.Color(b[0], b[1], b[2], b[3])
-                } else {
-                    if (Ext.isString(b)) {
-                        return Ext.draw.Color.fromString(b)
-                    } else {
-                        if (arguments.length > 2) {
-                            return new Ext.draw.Color(arguments[0], arguments[1], arguments[2], arguments[3])
-                        } else {
-                            return new Ext.draw.Color(0, 0, 0, 0)
-                        }
-                    }
-                }
-            }
-        }
-    })
-});
-Ext.define("Ext.draw.sprite.AnimationParser", function() {
-    function a(d, c, b) {
-        return d + (c - d) * b
-    }
-    return {
-        singleton: true,
-        attributeRe: /^url\(#([a-zA-Z\-]+)\)$/,
-        requires: ["Ext.draw.Color"],
-        color: {
-            parseInitial: function(c, b) {
-                if (Ext.isString(c)) {
-                    c = Ext.draw.Color.create(c)
-                }
-                if (Ext.isString(b)) {
-                    b = Ext.draw.Color.create(b)
-                }
-                if ((c instanceof Ext.draw.Color) && (b instanceof Ext.draw.Color)) {
-                    return [
-                        [c.r, c.g, c.b, c.a],
-                        [b.r, b.g, b.b, b.a]
-                    ]
-                } else {
-                    return [c || b, b || c]
-                }
-            },
-            compute: function(d, c, b) {
-                if (!Ext.isArray(d) || !Ext.isArray(c)) {
-                    return c || d
-                } else {
-                    return [a(d[0], c[0], b), a(d[1], c[1], b), a(d[2], c[2], b), a(d[3], c[3], b)]
-                }
-            },
-            serve: function(c) {
-                var b = Ext.draw.Color.fly(c[0], c[1], c[2], c[3]);
-                return b.toString()
-            }
-        },
-        number: {
-            parse: function(b) {
-                return b === null ? null : +b
-            },
-            compute: function(d, c, b) {
-                if (!Ext.isNumber(d) || !Ext.isNumber(c)) {
-                    return c || d
-                } else {
-                    return a(d, c, b)
-                }
-            }
-        },
-        angle: {
-            parseInitial: function(c, b) {
-                if (b - c > Math.PI) {
-                    b -= Math.PI * 2
-                } else {
-                    if (b - c < -Math.PI) {
-                        b += Math.PI * 2
-                    }
-                }
-                return [c, b]
-            },
-            compute: function(d, c, b) {
-                if (!Ext.isNumber(d) || !Ext.isNumber(c)) {
-                    return c || d
-                } else {
-                    return a(d, c, b)
-                }
-            }
-        },
-        path: {
-            parseInitial: function(m, n) {
-                var c = m.toStripes(),
-                    o = n.toStripes(),
-                    e, d, k = c.length,
-                    p = o.length,
-                    h, f, b, g = o[p - 1],
-                    l = [g[g.length - 2], g[g.length - 1]];
-                for (e = k; e < p; e++) {
-                    c.push(c[k - 1].slice(0))
-                }
-                for (e = p; e < k; e++) {
-                    o.push(l.slice(0))
-                }
-                b = c.length;
-                o.path = n;
-                o.temp = new Ext.draw.Path();
-                for (e = 0; e < b; e++) {
-                    h = c[e];
-                    f = o[e];
-                    k = h.length;
-                    p = f.length;
-                    o.temp.commands.push("M");
-                    for (d = p; d < k; d += 6) {
-                        f.push(l[0], l[1], l[0], l[1], l[0], l[1])
-                    }
-                    g = o[o.length - 1];
-                    l = [g[g.length - 2], g[g.length - 1]];
-                    for (d = k; d < p; d += 6) {
-                        h.push(l[0], l[1], l[0], l[1], l[0], l[1])
-                    }
-                    for (e = 0; e < f.length; e++) {
-                        f[e] -= h[e]
-                    }
-                    for (e = 2; e < f.length; e += 6) {
-                        o.temp.commands.push("C")
-                    }
-                }
-                return [c, o]
-            },
-            compute: function(c, l, m) {
-                if (m >= 1) {
-                    return l.path
-                }
-                var e = 0,
-                    f = c.length,
-                    d = 0,
-                    b, k, h, n = l.temp.params,
-                    g = 0;
-                for (; e < f; e++) {
-                    k = c[e];
-                    h = l[e];
-                    b = k.length;
-                    for (d = 0; d < b; d++) {
-                        n[g++] = h[d] * m + k[d]
-                    }
-                }
-                return l.temp
-            }
-        },
-        data: {
-            compute: function(h, j, k, g) {
-                var m = h.length - 1,
-                    b = j.length - 1,
-                    e = Math.max(m, b),
-                    d, l, c;
-                if (!g || g === h) {
-                    g = []
-                }
-                g.length = e + 1;
-                for (c = 0; c <= e; c++) {
-                    d = h[Math.min(c, m)];
-                    l = j[Math.min(c, b)];
-                    if (Ext.isNumber(d)) {
-                        if (!Ext.isNumber(l)) {
-                            l = 0
-                        }
-                        g[c] = (l - d) * k + d
-                    } else {
-                        g[c] = l
-                    }
-                }
-                return g
-            }
-        },
-        text: {
-            compute: function(d, c, b) {
-                return d.substr(0, Math.round(d.length * (1 - b))) + c.substr(Math.round(c.length * (1 - b)))
-            }
-        },
-        limited: "number",
-        limited01: "number"
-    }
-});
-(function() {
-    if (!Ext.global.Float32Array) {
-        var a = function(d) {
-            if (typeof d === "number") {
-                this.length = d
-            } else {
-                if ("length" in d) {
-                    this.length = d.length;
-                    for (var c = 0, b = d.length; c < b; c++) {
-                        this[c] = +d[c]
-                    }
-                }
-            }
-        };
-        a.prototype = [];
-        Ext.global.Float32Array = a
-    }
-})();
-Ext.define("Ext.draw.Draw", {
-    singleton: true,
-    radian: Math.PI / 180,
-    pi2: Math.PI * 2,
-    reflectFn: function(b) {
-        return b
-    },
-    rad: function(a) {
-        return (a % 360) * this.radian
-    },
-    degrees: function(a) {
-        return (a / this.radian) % 360
-    },
-    isBBoxIntersect: function(b, a, c) {
-        c = c || 0;
-        return (Math.max(b.x, a.x) - c > Math.min(b.x + b.width, a.x + a.width)) || (Math.max(b.y, a.y) - c > Math.min(b.y + b.height, a.y + a.height))
-    },
-    isPointInBBox: function(a, c, b) {
-        return !!b && a >= b.x && a <= (b.x + b.width) && c >= b.y && c <= (b.y + b.height)
-    },
-    spline: function(m) {
-        var e, c, k = m.length,
-            b, h, l, f, a = 0,
-            g = new Float32Array(m.length),
-            n = new Float32Array(m.length * 3 - 2);
-        g[0] = 0;
-        g[k - 1] = 0;
-        for (e = 1; e < k - 1; e++) {
-            g[e] = (m[e + 1] + m[e - 1] - 2 * m[e]) - g[e - 1];
-            a = 1 / (4 - a);
-            g[e] *= a
-        }
-        for (e = k - 2; e > 0; e--) {
-            a = 3.732050807568877 + 48.248711305964385 / (-13.928203230275537 + Math.pow(0.07179676972449123, e));
-            g[e] -= g[e + 1] * a
-        }
-        f = m[0];
-        b = f - g[0];
-        for (e = 0, c = 0; e < k - 1; c += 3) {
-            l = f;
-            h = b;
-            e++;
-            f = m[e];
-            b = f - g[e];
-            n[c] = l;
-            n[c + 1] = (b + 2 * h) / 3;
-            n[c + 2] = (b * 2 + h) / 3
-        }
-        n[c] = f;
-        return n
-    },
-    getAnchors: function(e, d, i, h, t, s, o) {
-        o = o || 4;
-        var n = Math.PI,
-            p = n / 2,
-            k = Math.abs,
-            a = Math.sin,
-            b = Math.cos,
-            f = Math.atan,
-            r, q, g, j, m, l, v, u, c;
-        r = (i - e) / o;
-        q = (t - i) / o;
-        if ((h >= d && h >= s) || (h <= d && h <= s)) {
-            g = j = p
-        } else {
-            g = f((i - e) / k(h - d));
-            if (d < h) {
-                g = n - g
-            }
-            j = f((t - i) / k(h - s));
-            if (s < h) {
-                j = n - j
-            }
-        }
-        c = p - ((g + j) % (n * 2)) / 2;
-        if (c > p) {
-            c -= n
-        }
-        g += c;
-        j += c;
-        m = i - r * a(g);
-        l = h + r * b(g);
-        v = i + q * a(j);
-        u = h + q * b(j);
-        if ((h > d && l < d) || (h < d && l > d)) {
-            m += k(d - l) * (m - i) / (l - h);
-            l = d
-        }
-        if ((h > s && u < s) || (h < s && u > s)) {
-            v -= k(s - u) * (v - i) / (u - h);
-            u = s
-        }
-        return {
-            x1: m,
-            y1: l,
-            x2: v,
-            y2: u
-        }
-    },
-    smooth: function(l, j, o) {
-        var k = l.length,
-            h, g, c, b, q, p, n, m, f = [],
-            e = [],
-            d, a;
-        for (d = 0; d < k - 1; d++) {
-            h = l[d];
-            g = j[d];
-            if (d === 0) {
-                n = h;
-                m = g;
-                f.push(n);
-                e.push(m);
-                if (k === 1) {
-                    break
-                }
-            }
-            c = l[d + 1];
-            b = j[d + 1];
-            q = l[d + 2];
-            p = j[d + 2];
-            if (!Ext.isNumber(q + p)) {
-                f.push(n, c, c);
-                e.push(m, b, b);
-                break
-            }
-            a = this.getAnchors(h, g, c, b, q, p, o);
-            f.push(n, a.x1, c);
-            e.push(m, a.y1, b);
-            n = a.x2;
-            m = a.y2
-        }
-        return {
-            smoothX: f,
-            smoothY: e
-        }
-    },
-    beginUpdateIOS: Ext.os.is.iOS ? function() {
-        this.iosUpdateEl = Ext.getBody().createChild({
-            style: "position: absolute; top: 0px; bottom: 0px; left: 0px; right: 0px; background: rgba(0,0,0,0.001); z-index: 100000"
-        })
-    } : Ext.emptyFn,
-    endUpdateIOS: function() {
-        this.iosUpdateEl = Ext.destroy(this.iosUpdateEl)
-    }
-});
-Ext.define("Ext.draw.gradient.Gradient", {
-    requires: ["Ext.draw.Color"],
-    isGradient: true,
-    config: {
-        stops: []
-    },
-    applyStops: function(f) {
-        var e = [],
-            d = f.length,
-            c, b, a;
-        for (c = 0; c < d; c++) {
-            b = f[c];
-            a = b.color;
-            if (!(a && a.isColor)) {
-                a = Ext.draw.Color.fly(a || Ext.draw.Color.NONE)
-            }
-            e.push({
-                offset: Math.min(1, Math.max(0, "offset" in b ? b.offset : b.position || 0)),
-                color: a.toString()
-            })
-        }
-        e.sort(function(h, g) {
-            return h.offset - g.offset
-        });
-        return e
-    },
-    onClassExtended: function(a, b) {
-        if (!b.alias && b.type) {
-            b.alias = "gradient." + b.type
-        }
-    },
-    constructor: function(a) {
-        this.initConfig(a)
-    },
-    generateGradient: Ext.emptyFn
-});
-Ext.define("Ext.draw.gradient.GradientDefinition", {
-    singleton: true,
-    urlStringRe: /^url\(#([\w\-]+)\)$/,
-    gradients: {},
-    add: function(a) {
-        var b = this.gradients,
-            c, e, d;
-        for (c = 0, e = a.length; c < e; c++) {
-            d = a[c];
-            if (Ext.isString(d.id)) {
-                b[d.id] = d
-            }
-        }
-    },
-    get: function(d) {
-        var a = this.gradients,
-            b = d.match(this.urlStringRe),
-            c;
-        if (b && b[1] && (c = a[b[1]])) {
-            return c || d
-        }
-        return d
-    }
-});
-Ext.define("Ext.draw.sprite.AttributeParser", {
-    singleton: true,
-    attributeRe: /^url\(#([a-zA-Z\-]+)\)$/,
-    requires: ["Ext.draw.Color", "Ext.draw.gradient.GradientDefinition"],
-    "default": Ext.identityFn,
-    string: function(a) {
-        return String(a)
-    },
-    number: function(a) {
-        if (Ext.isNumber(+a)) {
-            return a
-        }
-    },
-    angle: function(a) {
-        if (Ext.isNumber(a)) {
-            a %= Math.PI * 2;
-            if (a < -Math.PI) {
-                a += Math.PI * 2
-            } else {
-                if (a >= Math.PI) {
-                    a -= Math.PI * 2
-                }
-            }
-            return a
-        }
-    },
-    data: function(a) {
-        if (Ext.isArray(a)) {
-            return a.slice()
-        } else {
-            if (a instanceof Float32Array) {
-                return new Float32Array(a)
-            }
-        }
-    },
-    bool: function(a) {
-        return !!a
-    },
-    color: function(a) {
-        if (a instanceof Ext.draw.Color) {
-            return a.toString()
-        } else {
-            if (a instanceof Ext.draw.gradient.Gradient) {
-                return a
-            } else {
-                if (!a) {
-                    return Ext.draw.Color.NONE
-                } else {
-                    if (Ext.isString(a)) {
-                        if (a.substr(0, 3) === "url") {
-                            a = Ext.draw.gradient.GradientDefinition.get(a);
-                            if (Ext.isString(a)) {
-                                return a
-                            }
-                        } else {
-                            return Ext.draw.Color.fly(a).toString()
-                        }
-                    }
-                }
-            }
-        }
-        if (a.type === "linear") {
-            return Ext.create("Ext.draw.gradient.Linear", a)
-        } else {
-            if (a.type === "radial") {
-                return Ext.create("Ext.draw.gradient.Radial", a)
-            } else {
-                if (a.type === "pattern") {
-                    return Ext.create("Ext.draw.gradient.Pattern", a)
-                } else {
-                    return Ext.draw.Color.NONE
-                }
-            }
-        }
-    },
-    limited: function(a, b) {
-        return function(c) {
-            c = +c;
-            return Ext.isNumber(c) ? Math.min(Math.max(c, a), b) : undefined
-        }
-    },
-    limited01: function(a) {
-        a = +a;
-        return Ext.isNumber(a) ? Math.min(Math.max(a, 0), 1) : undefined
-    },
-    enums: function() {
-        var d = {},
-            a = Array.prototype.slice.call(arguments, 0),
-            b, c;
-        for (b = 0, c = a.length; b < c; b++) {
-            d[a[b]] = true
-        }
-        return function(e) {
-            return e in d ? e : undefined
-        }
-    }
-});
-Ext.define("Ext.draw.sprite.AttributeDefinition", {
-    requires: ["Ext.draw.sprite.AttributeParser", "Ext.draw.sprite.AnimationParser"],
-    config: {
-        defaults: {
-            $value: {},
-            lazy: true
-        },
-        aliases: {},
-        animationProcessors: {},
-        processors: {
-            $value: {},
-            lazy: true
-        },
-        dirtyTriggers: {},
-        triggers: {},
-        updaters: {}
-    },
-    inheritableStatics: {
-        processorFactoryRe: /^(\w+)\(([\w\-,]*)\)$/
-    },
-    spriteClass: null,
-    constructor: function(a) {
-        var b = this;
-        b.initConfig(a)
-    },
-    applyDefaults: function(b, a) {
-        a = Ext.apply(a || {}, this.normalize(b));
-        return a
-    },
-    applyAliases: function(b, a) {
-        return Ext.apply(a || {}, b)
-    },
-    applyProcessors: function(e, i) {
-        this.getAnimationProcessors();
-        var j = i || {},
-            h = Ext.draw.sprite.AttributeParser,
-            a = this.self.processorFactoryRe,
-            g = {},
-            d, b, c, f;
-        for (b in e) {
-            f = e[b];
-            if (typeof f === "string") {
-                c = f.match(a);
-                if (c) {
-                    f = h[c[1]].apply(h, c[2].split(","))
-                } else {
-                    if (h[f]) {
-                        g[b] = f;
-                        d = true;
-                        f = h[f]
-                    }
-                }
-            }
-            j[b] = f
-        }
-        if (d) {
-            this.setAnimationProcessors(g)
-        }
-        return j
-    },
-    applyAnimationProcessors: function(c, a) {
-        var e = Ext.draw.sprite.AnimationParser,
-            b, d;
-        if (!a) {
-            a = {}
-        }
-        for (b in c) {
-            d = c[b];
-            if (d === "none") {
-                a[b] = null
-            } else {
-                if (Ext.isString(d) && !(b in a)) {
-                    if (d in e) {
-                        while (Ext.isString(e[d])) {
-                            d = e[d]
-                        }
-                        a[b] = e[d]
-                    }
-                } else {
-                    if (Ext.isObject(d)) {
-                        a[b] = d
-                    }
-                }
-            }
-        }
-        return a
-    },
-    updateDirtyTriggers: function(a) {
-        this.setTriggers(a)
-    },
-    applyTriggers: function(b, c) {
-        if (!c) {
-            c = {}
-        }
-        for (var a in b) {
-            c[a] = b[a].split(",")
-        }
-        return c
-    },
-    applyUpdaters: function(b, a) {
-        return Ext.apply(a || {}, b)
-    },
-    batchedNormalize: function(f, n) {
-        if (!f) {
-            return {}
-        }
-        var j = this.getProcessors(),
-            d = this.getAliases(),
-            a = f.translation || f.translate,
-            o = {},
-            g, h, b, e, p, c, m, l, k;
-        if ("rotation" in f) {
-            p = f.rotation
-        } else {
-            p = ("rotate" in f) ? f.rotate : undefined
-        }
-        if ("scaling" in f) {
-            c = f.scaling
-        } else {
-            c = ("scale" in f) ? f.scale : undefined
-        }
-        if (typeof c !== "undefined") {
-            if (Ext.isNumber(c)) {
-                o.scalingX = c;
-                o.scalingY = c
-            } else {
-                if ("x" in c) {
-                    o.scalingX = c.x
-                }
-                if ("y" in c) {
-                    o.scalingY = c.y
-                }
-                if ("centerX" in c) {
-                    o.scalingCenterX = c.centerX
-                }
-                if ("centerY" in c) {
-                    o.scalingCenterY = c.centerY
-                }
-            }
-        }
-        if (typeof p !== "undefined") {
-            if (Ext.isNumber(p)) {
-                p = Ext.draw.Draw.rad(p);
-                o.rotationRads = p
-            } else {
-                if ("rads" in p) {
-                    o.rotationRads = p.rads
-                } else {
-                    if ("degrees" in p) {
-                        if (Ext.isArray(p.degrees)) {
-                            o.rotationRads = Ext.Array.map(p.degrees, function(i) {
-                                return Ext.draw.Draw.rad(i)
-                            })
-                        } else {
-                            o.rotationRads = Ext.draw.Draw.rad(p.degrees)
-                        }
-                    }
-                }
-                if ("centerX" in p) {
-                    o.rotationCenterX = p.centerX
-                }
-                if ("centerY" in p) {
-                    o.rotationCenterY = p.centerY
-                }
-            }
-        }
-        if (typeof a !== "undefined") {
-            if ("x" in a) {
-                o.translationX = a.x
-            }
-            if ("y" in a) {
-                o.translationY = a.y
-            }
-        }
-        if ("matrix" in f) {
-            m = Ext.draw.Matrix.create(f.matrix);
-            k = m.split();
-            o.matrix = m;
-            o.rotationRads = k.rotation;
-            o.rotationCenterX = 0;
-            o.rotationCenterY = 0;
-            o.scalingX = k.scaleX;
-            o.scalingY = k.scaleY;
-            o.scalingCenterX = 0;
-            o.scalingCenterY = 0;
-            o.translationX = k.translateX;
-            o.translationY = k.translateY
-        }
-        for (b in f) {
-            e = f[b];
-            if (typeof e === "undefined") {
-                continue
-            } else {
-                if (Ext.isArray(e)) {
-                    if (b in d) {
-                        b = d[b]
-                    }
-                    if (b in j) {
-                        o[b] = [];
-                        for (g = 0, h = e.length; g < h; g++) {
-                            l = j[b].call(this, e[g]);
-                            if (typeof l !== "undefined") {
-                                o[b][g] = l
-                            }
-                        }
-                    } else {
-                        if (n) {
-                            o[b] = e
-                        }
-                    }
-                } else {
-                    if (b in d) {
-                        b = d[b]
-                    }
-                    if (b in j) {
-                        e = j[b].call(this, e);
-                        if (typeof e !== "undefined") {
-                            o[b] = e
-                        }
-                    } else {
-                        if (n) {
-                            o[b] = e
-                        }
-                    }
-                }
-            }
-        }
-        return o
-    },
-    normalize: function(i, j) {
-        if (!i) {
-            return {}
-        }
-        var f = this.getProcessors(),
-            d = this.getAliases(),
-            a = i.translation || i.translate,
-            k = {},
-            b, e, l, c, h, g;
-        if ("rotation" in i) {
-            l = i.rotation
-        } else {
-            l = ("rotate" in i) ? i.rotate : undefined
-        }
-        if ("scaling" in i) {
-            c = i.scaling
-        } else {
-            c = ("scale" in i) ? i.scale : undefined
-        }
-        if (a) {
-            if ("x" in a) {
-                k.translationX = a.x
-            }
-            if ("y" in a) {
-                k.translationY = a.y
-            }
-        }
-        if (typeof c !== "undefined") {
-            if (Ext.isNumber(c)) {
-                k.scalingX = c;
-                k.scalingY = c
-            } else {
-                if ("x" in c) {
-                    k.scalingX = c.x
-                }
-                if ("y" in c) {
-                    k.scalingY = c.y
-                }
-                if ("centerX" in c) {
-                    k.scalingCenterX = c.centerX
-                }
-                if ("centerY" in c) {
-                    k.scalingCenterY = c.centerY
-                }
-            }
-        }
-        if (typeof l !== "undefined") {
-            if (Ext.isNumber(l)) {
-                l = Ext.draw.Draw.rad(l);
-                k.rotationRads = l
-            } else {
-                if ("rads" in l) {
-                    k.rotationRads = l.rads
-                } else {
-                    if ("degrees" in l) {
-                        k.rotationRads = Ext.draw.Draw.rad(l.degrees)
-                    }
-                }
-                if ("centerX" in l) {
-                    k.rotationCenterX = l.centerX
-                }
-                if ("centerY" in l) {
-                    k.rotationCenterY = l.centerY
-                }
-            }
-        }
-        if ("matrix" in i) {
-            h = Ext.draw.Matrix.create(i.matrix);
-            g = h.split();
-            k.matrix = h;
-            k.rotationRads = g.rotation;
-            k.rotationCenterX = 0;
-            k.rotationCenterY = 0;
-            k.scalingX = g.scaleX;
-            k.scalingY = g.scaleY;
-            k.scalingCenterX = 0;
-            k.scalingCenterY = 0;
-            k.translationX = g.translateX;
-            k.translationY = g.translateY
-        }
-        for (b in i) {
-            e = i[b];
-            if (typeof e === "undefined") {
-                continue
-            }
-            if (b in d) {
-                b = d[b]
-            }
-            if (b in f) {
-                e = f[b].call(this, e);
-                if (typeof e !== "undefined") {
-                    k[b] = e
-                }
-            } else {
-                if (j) {
-                    k[b] = e
-                }
-            }
-        }
-        return k
-    },
-    setBypassingNormalization: function(a, c, b) {
-        return c.pushDown(a, b)
-    },
-    set: function(a, c, b) {
-        b = this.normalize(b);
-        return this.setBypassingNormalization(a, c, b)
-    }
-});
-Ext.define("Ext.draw.Matrix", {
-    isMatrix: true,
-    statics: {
-        createAffineMatrixFromTwoPair: function(h, t, g, s, k, o, i, j) {
-            var v = g - h,
-                u = s - t,
-                e = i - k,
-                q = j - o,
-                d = 1 / (v * v + u * u),
-                p = v * e + u * q,
-                n = e * u - v * q,
-                m = -p * h - n * t,
-                l = n * h - p * t;
-            return new this(p * d, -n * d, n * d, p * d, m * d + k, l * d + o)
-        },
-        createPanZoomFromTwoPair: function(q, e, p, c, h, s, n, g) {
-            if (arguments.length === 2) {
-                return this.createPanZoomFromTwoPair.apply(this, q.concat(e))
-            }
-            var k = p - q,
-                j = c - e,
-                d = (q + p) * 0.5,
-                b = (e + c) * 0.5,
-                o = n - h,
-                a = g - s,
-                f = (h + n) * 0.5,
-                l = (s + g) * 0.5,
-                m = k * k + j * j,
-                i = o * o + a * a,
-                t = Math.sqrt(i / m);
-            return new this(t, 0, 0, t, f - t * d, l - t * b)
-        },
-        fly: (function() {
-            var a = null,
-                b = function(c) {
-                    a.elements = c;
-                    return a
-                };
-            return function(c) {
-                if (!a) {
-                    a = new Ext.draw.Matrix()
-                }
-                a.elements = c;
-                Ext.draw.Matrix.fly = b;
-                return a
-            }
-        })(),
-        create: function(a) {
-            if (a instanceof this) {
-                return a
-            }
-            return new this(a)
-        }
-    },
-    constructor: function(e, d, a, f, c, b) {
-        if (e && e.length === 6) {
-            this.elements = e.slice()
-        } else {
-            if (e !== undefined) {
-                this.elements = [e, d, a, f, c, b]
-            } else {
-                this.elements = [1, 0, 0, 1, 0, 0]
-            }
-        }
-    },
-    prepend: function(a, l, h, g, m, k) {
-        var b = this.elements,
-            d = b[0],
-            j = b[1],
-            e = b[2],
-            c = b[3],
-            i = b[4],
-            f = b[5];
-        b[0] = a * d + h * j;
-        b[1] = l * d + g * j;
-        b[2] = a * e + h * c;
-        b[3] = l * e + g * c;
-        b[4] = a * i + h * f + m;
-        b[5] = l * i + g * f + k;
-        return this
-    },
-    prependMatrix: function(a) {
-        return this.prepend.apply(this, a.elements)
-    },
-    append: function(a, l, h, g, m, k) {
-        var b = this.elements,
-            d = b[0],
-            j = b[1],
-            e = b[2],
-            c = b[3],
-            i = b[4],
-            f = b[5];
-        b[0] = a * d + l * e;
-        b[1] = a * j + l * c;
-        b[2] = h * d + g * e;
-        b[3] = h * j + g * c;
-        b[4] = m * d + k * e + i;
-        b[5] = m * j + k * c + f;
-        return this
-    },
-    appendMatrix: function(a) {
-        return this.append.apply(this, a.elements)
-    },
-    set: function(f, e, a, g, c, b) {
-        var d = this.elements;
-        d[0] = f;
-        d[1] = e;
-        d[2] = a;
-        d[3] = g;
-        d[4] = c;
-        d[5] = b;
-        return this
-    },
-    inverse: function(i) {
-        var g = this.elements,
-            o = g[0],
-            m = g[1],
-            l = g[2],
-            k = g[3],
-            j = g[4],
-            h = g[5],
-            n = 1 / (o * k - m * l);
-        o *= n;
-        m *= n;
-        l *= n;
-        k *= n;
-        if (i) {
-            i.set(k, -m, -l, o, l * h - k * j, m * j - o * h);
-            return i
-        } else {
-            return new Ext.draw.Matrix(k, -m, -l, o, l * h - k * j, m * j - o * h)
-        }
-    },
-    translate: function(a, c, b) {
-        if (b) {
-            return this.prepend(1, 0, 0, 1, a, c)
-        } else {
-            return this.append(1, 0, 0, 1, a, c)
-        }
-    },
-    scale: function(f, e, c, a, b) {
-        var d = this;
-        if (e == null) {
-            e = f
-        }
-        if (c === undefined) {
-            c = 0
-        }
-        if (a === undefined) {
-            a = 0
-        }
-        if (b) {
-            return d.prepend(f, 0, 0, e, c - c * f, a - a * e)
-        } else {
-            return d.append(f, 0, 0, e, c - c * f, a - a * e)
-        }
-    },
-    rotate: function(g, e, c, b) {
-        var d = this,
-            f = Math.cos(g),
-            a = Math.sin(g);
-        e = e || 0;
-        c = c || 0;
-        if (b) {
-            return d.prepend(f, a, -a, f, e - f * e + c * a, c - f * c - e * a)
-        } else {
-            return d.append(f, a, -a, f, e - f * e + c * a, c - f * c - e * a)
-        }
-    },
-    rotateFromVector: function(a, h, c) {
-        var e = this,
-            g = Math.sqrt(a * a + h * h),
-            f = a / g,
-            b = h / g;
-        if (c) {
-            return e.prepend(f, b, -b, f, 0, 0)
-        } else {
-            return e.append(f, b, -b, f, 0, 0)
-        }
-    },
-    clone: function() {
-        return new Ext.draw.Matrix(this.elements)
-    },
-    flipX: function() {
-        return this.append(-1, 0, 0, 1, 0, 0)
-    },
-    flipY: function() {
-        return this.append(1, 0, 0, -1, 0, 0)
-    },
-    skewX: function(a) {
-        return this.append(1, 0, Math.tan(a), 1, 0, 0)
-    },
-    skewY: function(a) {
-        return this.append(1, Math.tan(a), 0, 1, 0, 0)
-    },
-    shearX: function(a) {
-        return this.append(1, 0, a, 1, 0, 0)
-    },
-    shearY: function(a) {
-        return this.append(1, a, 0, 1, 0, 0)
-    },
-    reset: function() {
-        return this.set(1, 0, 0, 1, 0, 0)
-    },
-    precisionCompensate: function(j, g) {
-        var c = this.elements,
-            f = c[0],
-            e = c[1],
-            i = c[2],
-            h = c[3],
-            d = c[4],
-            b = c[5],
-            a = e * i - f * h;
-        g.b = j * e / f;
-        g.c = j * i / h;
-        g.d = j;
-        g.xx = f / j;
-        g.yy = h / j;
-        g.dx = (b * f * i - d * f * h) / a / j;
-        g.dy = (d * e * h - b * f * h) / a / j
-    },
-    precisionCompensateRect: function(j, g) {
-        var b = this.elements,
-            f = b[0],
-            e = b[1],
-            i = b[2],
-            h = b[3],
-            c = b[4],
-            a = b[5],
-            d = i / f;
-        g.b = j * e / f;
-        g.c = j * d;
-        g.d = j * h / f;
-        g.xx = f / j;
-        g.yy = f / j;
-        g.dx = (a * i - c * h) / (e * d - h) / j;
-        g.dy = -(a * f - c * e) / (e * d - h) / j
-    },
-    x: function(a, c) {
-        var b = this.elements;
-        return a * b[0] + c * b[2] + b[4]
-    },
-    y: function(a, c) {
-        var b = this.elements;
-        return a * b[1] + c * b[3] + b[5]
-    },
-    get: function(b, a) {
-        return +this.elements[b + a * 2].toFixed(4)
-    },
-    transformPoint: function(b) {
-        var c = this.elements,
-            a, d;
-        if (b.isPoint) {
-            a = b.x;
-            d = b.y
-        } else {
-            a = b[0];
-            d = b[1]
-        }
-        return [a * c[0] + d * c[2] + c[4], a * c[1] + d * c[3] + c[5]]
-    },
-    transformBBox: function(q, i, j) {
-        var b = this.elements,
-            d = q.x,
-            r = q.y,
-            g = q.width * 0.5,
-            o = q.height * 0.5,
-            a = b[0],
-            s = b[1],
-            n = b[2],
-            k = b[3],
-            e = d + g,
-            c = r + o,
-            p, f, m;
-        if (i) {
-            g -= i;
-            o -= i;
-            m = [Math.sqrt(b[0] * b[0] + b[2] * b[2]), Math.sqrt(b[1] * b[1] + b[3] * b[3])];
-            p = Math.abs(g * a) + Math.abs(o * n) + Math.abs(m[0] * i);
-            f = Math.abs(g * s) + Math.abs(o * k) + Math.abs(m[1] * i)
-        } else {
-            p = Math.abs(g * a) + Math.abs(o * n);
-            f = Math.abs(g * s) + Math.abs(o * k)
-        }
-        if (!j) {
-            j = {}
-        }
-        j.x = e * a + c * n + b[4] - p;
-        j.y = e * s + c * k + b[5] - f;
-        j.width = p + p;
-        j.height = f + f;
-        return j
-    },
-    transformList: function(e) {
-        var b = this.elements,
-            a = b[0],
-            h = b[2],
-            l = b[4],
-            k = b[1],
-            g = b[3],
-            j = b[5],
-            f = e.length,
-            c, d;
-        for (d = 0; d < f; d++) {
-            c = e[d];
-            e[d] = [c[0] * a + c[1] * h + l, c[0] * k + c[1] * g + j]
-        }
-        return e
-    },
-    isIdentity: function() {
-        var a = this.elements;
-        return a[0] === 1 && a[1] === 0 && a[2] === 0 && a[3] === 1 && a[4] === 0 && a[5] === 0
-    },
-    isEqual: function(a) {
-        var c = a && a.isMatrix ? a.elements : a,
-            b = this.elements;
-        return b[0] === c[0] && b[1] === c[1] && b[2] === c[2] && b[3] === c[3] && b[4] === c[4] && b[5] === c[5]
-    },
-    equals: function(a) {
-        return this.isEqual(a)
-    },
-    toArray: function() {
-        var a = this.elements;
-        return [a[0], a[2], a[4], a[1], a[3], a[5]]
-    },
-    toVerticalArray: function() {
-        return this.elements.slice()
-    },
-    toString: function() {
-        var a = this;
-        return [a.get(0, 0), a.get(0, 1), a.get(1, 0), a.get(1, 1), a.get(2, 0), a.get(2, 1)].join(",")
-    },
-    toContext: function(a) {
-        a.transform.apply(a, this.elements);
-        return this
-    },
-    toSvg: function() {
-        var a = this.elements;
-        return "matrix(" + a[0].toFixed(9) + "," + a[1].toFixed(9) + "," + a[2].toFixed(9) + "," + a[3].toFixed(9) + "," + a[4].toFixed(9) + "," + a[5].toFixed(9) + ")"
-    },
-    getScaleX: function() {
-        var a = this.elements;
-        return Math.sqrt(a[0] * a[0] + a[2] * a[2])
-    },
-    getScaleY: function() {
-        var a = this.elements;
-        return Math.sqrt(a[1] * a[1] + a[3] * a[3])
-    },
-    getXX: function() {
-        return this.elements[0]
-    },
-    getXY: function() {
-        return this.elements[1]
-    },
-    getYX: function() {
-        return this.elements[2]
-    },
-    getYY: function() {
-        return this.elements[3]
-    },
-    getDX: function() {
-        return this.elements[4]
-    },
-    getDY: function() {
-        return this.elements[5]
-    },
-    split: function() {
-        var b = this.elements,
-            d = b[0],
-            c = b[1],
-            e = b[3],
-            a = {
-                translateX: b[4],
-                translateY: b[5]
-            };
-        a.rotate = a.rotation = Math.atan2(c, d);
-        a.scaleX = d / Math.cos(a.rotate);
-        a.scaleY = e / d * a.scaleX;
-        return a
-    }
-}, function() {
-    function b(e, c, d) {
-        e[c] = {
-            get: function() {
-                return this.elements[d]
-            },
-            set: function(f) {
-                this.elements[d] = f
-            }
-        }
-    }
-    if (Object.defineProperties) {
-        var a = {};
-        b(a, "a", 0);
-        b(a, "b", 1);
-        b(a, "c", 2);
-        b(a, "d", 3);
-        b(a, "e", 4);
-        b(a, "f", 5);
-        Object.defineProperties(this.prototype, a)
-    }
-    this.prototype.multiply = this.prototype.appendMatrix
-});
-Ext.define("Ext.draw.modifier.Modifier", {
-    mixins: {
-        observable: "Ext.mixin.Observable"
-    },
-    config: {
-        previous: null,
-        next: null,
-        sprite: null
-    },
-    constructor: function(a) {
-        this.mixins.observable.constructor.call(this, a)
-    },
-    updateNext: function(a) {
-        if (a) {
-            a.setPrevious(this)
-        }
-    },
-    updatePrevious: function(a) {
-        if (a) {
-            a.setNext(this)
-        }
-    },
-    prepareAttributes: function(a) {
-        if (this._previous) {
-            this._previous.prepareAttributes(a)
-        }
-    },
-    popUp: function(a, b) {
-        if (this._next) {
-            this._next.popUp(a, b)
-        } else {
-            Ext.apply(a, b)
-        }
-    },
-    pushDown: function(a, c) {
-        if (this._previous) {
-            return this._previous.pushDown(a, c)
-        } else {
-            for (var b in c) {
-                if (c[b] === a[b]) {
-                    delete c[b]
-                }
-            }
-            return c
-        }
-    }
-});
-Ext.define("Ext.draw.modifier.Target", {
-    requires: ["Ext.draw.Matrix"],
-    extend: "Ext.draw.modifier.Modifier",
-    alias: "modifier.target",
-    statics: {
-        uniqueId: 0
-    },
-    prepareAttributes: function(a) {
-        var b = this.getPrevious();
-        if (b) {
-            b.prepareAttributes(a)
-        }
-        a.attributeId = "attribute-" + Ext.draw.modifier.Target.uniqueId++;
-        if (!a.hasOwnProperty("canvasAttributes")) {
-            a.bbox = {
-                plain: {
-                    dirty: true
-                },
-                transform: {
-                    dirty: true
-                }
-            };
-            a.dirty = true;
-            a.pendingUpdaters = {};
-            a.canvasAttributes = {};
-            a.matrix = new Ext.draw.Matrix();
-            a.inverseMatrix = new Ext.draw.Matrix()
-        }
-    },
-    applyChanges: function(f, k) {
-        Ext.apply(f, k);
-        var l = this.getSprite(),
-            o = f.pendingUpdaters,
-            h = l.self.def.getTriggers(),
-            p, a, m, b, e, n, d, c, g;
-        for (b in k) {
-            e = true;
-            if ((p = h[b])) {
-                l.scheduleUpdaters(f, p, [b])
-            }
-            if (f.template && k.removeFromInstance && k.removeFromInstance[b]) {
-                delete f[b]
-            }
-        }
-        if (!e) {
-            return
-        }
-        if (o.canvas) {
-            n = o.canvas;
-            delete o.canvas;
-            for (d = 0, g = n.length; d < g; d++) {
-                b = n[d];
-                f.canvasAttributes[b] = f[b]
-            }
-        }
-        if (f.hasOwnProperty("children")) {
-            a = f.children;
-            for (d = 0, g = a.length; d < g; d++) {
-                m = a[d];
-                Ext.apply(m.pendingUpdaters, o);
-                if (n) {
-                    for (c = 0; c < n.length; c++) {
-                        b = n[c];
-                        m.canvasAttributes[b] = m[b]
-                    }
-                }
-                l.callUpdaters(m)
-            }
-        }
-        l.setDirty(true);
-        l.callUpdaters(f)
-    },
-    popUp: function(a, b) {
-        this.applyChanges(a, b)
-    },
-    pushDown: function(a, b) {
-        var c = this.getPrevious();
-        if (c) {
-            b = c.pushDown(a, b)
-        }
-        this.applyChanges(a, b);
-        return b
-    }
-});
-Ext.define("Ext.draw.TimingFunctions", function() {
-    var g = Math.pow,
-        j = Math.sin,
-        m = Math.cos,
-        l = Math.sqrt,
-        e = Math.PI,
-        b = ["quad", "cube", "quart", "quint"],
-        c = {
-            pow: function(o, i) {
-                return g(o, i || 6)
-            },
-            expo: function(i) {
-                return g(2, 8 * (i - 1))
-            },
-            circ: function(i) {
-                return 1 - l(1 - i * i)
-            },
-            sine: function(i) {
-                return 1 - j((1 - i) * e / 2)
-            },
-            back: function(i, o) {
-                o = o || 1.616;
-                return i * i * ((o + 1) * i - o)
-            },
-            bounce: function(q) {
-                for (var o = 0, i = 1; 1; o += i, i /= 2) {
-                    if (q >= (7 - 4 * o) / 11) {
-                        return i * i - g((11 - 6 * o - 11 * q) / 4, 2)
-                    }
-                }
-            },
-            elastic: function(o, i) {
-                return g(2, 10 * --o) * m(20 * o * e * (i || 1) / 3)
-            }
-        },
-        k = {},
-        a, f, d;
-
-    function h(i) {
-        return function(o) {
-            return g(o, i)
-        }
-    }
-
-    function n(i, o) {
-        k[i + "In"] = function(p) {
-            return o(p)
-        };
-        k[i + "Out"] = function(p) {
-            return 1 - o(1 - p)
-        };
-        k[i + "InOut"] = function(p) {
-            return (p <= 0.5) ? o(2 * p) / 2 : (2 - o(2 * (1 - p))) / 2
-        }
-    }
-    for (d = 0, f = b.length; d < f; ++d) {
-        c[b[d]] = h(d + 2)
-    }
-    for (a in c) {
-        n(a, c[a])
-    }
-    k.linear = Ext.identityFn;
-    k.easeIn = k.quadIn;
-    k.easeOut = k.quadOut;
-    k.easeInOut = k.quadInOut;
-    return {
-        singleton: true,
-        easingMap: k
-    }
-}, function(a) {
-    Ext.apply(a, a.easingMap)
-});
-Ext.define("Ext.draw.Animator", {
-    uses: ["Ext.draw.Draw"],
-    singleton: true,
-    frameCallbacks: {},
-    frameCallbackId: 0,
-    scheduled: 0,
-    frameStartTimeOffset: Ext.now(),
-    animations: [],
-    running: false,
-    animationTime: function() {
-        return Ext.AnimationQueue.frameStartTime - this.frameStartTimeOffset
-    },
-    add: function(b) {
-        var a = this;
-        if (!a.contains(b)) {
-            a.animations.push(b);
-            a.ignite();
-            if ("fireEvent" in b) {
-                b.fireEvent("animationstart", b)
-            }
-        }
-    },
-    remove: function(d) {
-        var c = this,
-            e = c.animations,
-            b = 0,
-            a = e.length;
-        for (; b < a; ++b) {
-            if (e[b] === d) {
-                e.splice(b, 1);
-                if ("fireEvent" in d) {
-                    d.fireEvent("animationend", d)
-                }
-                return
-            }
-        }
-    },
-    contains: function(a) {
-        return Ext.Array.indexOf(this.animations, a) > -1
-    },
-    empty: function() {
-        return this.animations.length === 0
-    },
-    step: function(d) {
-        var c = this,
-            f = c.animations,
-            e, a = 0,
-            b = f.length;
-        for (; a < b; a++) {
-            e = f[a];
-            e.step(d);
-            if (!e.animating) {
-                f.splice(a, 1);
-                a--;
-                b--;
-                if (e.fireEvent) {
-                    e.fireEvent("animationend", e)
-                }
-            }
-        }
-    },
-    schedule: function(c, a) {
-        a = a || this;
-        var b = "frameCallback" + (this.frameCallbackId++);
-        if (Ext.isString(c)) {
-            c = a[c]
-        }
-        Ext.draw.Animator.frameCallbacks[b] = {
-            fn: c,
-            scope: a,
-            once: true
-        };
-        this.scheduled++;
-        Ext.draw.Animator.ignite();
-        return b
-    },
-    scheduleIf: function(e, b) {
-        b = b || this;
-        var c = Ext.draw.Animator.frameCallbacks,
-            a, d;
-        if (Ext.isString(e)) {
-            e = b[e]
-        }
-        for (d in c) {
-            a = c[d];
-            if (a.once && a.fn === e && a.scope === b) {
-                return null
-            }
-        }
-        return this.schedule(e, b)
-    },
-    cancel: function(a) {
-        if (Ext.draw.Animator.frameCallbacks[a] && Ext.draw.Animator.frameCallbacks[a].once) {
-            this.scheduled--;
-            delete Ext.draw.Animator.frameCallbacks[a]
-        }
-    },
-    addFrameCallback: function(c, a) {
-        a = a || this;
-        if (Ext.isString(c)) {
-            c = a[c]
-        }
-        var b = "frameCallback" + (this.frameCallbackId++);
-        Ext.draw.Animator.frameCallbacks[b] = {
-            fn: c,
-            scope: a
-        };
-        return b
-    },
-    removeFrameCallback: function(a) {
-        delete Ext.draw.Animator.frameCallbacks[a]
-    },
-    fireFrameCallbacks: function() {
-        var c = this.frameCallbacks,
-            d, b, a;
-        for (d in c) {
-            a = c[d];
-            b = a.fn;
-            if (Ext.isString(b)) {
-                b = a.scope[b]
-            }
-            b.call(a.scope);
-            if (c[d] && a.once) {
-                this.scheduled--;
-                delete c[d]
-            }
-        }
-    },
-    handleFrame: function() {
-        this.step(this.animationTime());
-        this.fireFrameCallbacks();
-        if (!this.scheduled && this.empty()) {
-            Ext.AnimationQueue.stop(this.handleFrame, this);
-            this.running = false;
-            Ext.draw.Draw.endUpdateIOS()
-        }
-    },
-    ignite: function() {
-        if (!this.running) {
-            this.running = true;
-            Ext.AnimationQueue.start(this.handleFrame, this);
-            Ext.draw.Draw.beginUpdateIOS()
-        }
-    }
-});
-Ext.define("Ext.draw.modifier.Animation", {
-    requires: ["Ext.draw.TimingFunctions", "Ext.draw.Animator"],
-    extend: "Ext.draw.modifier.Modifier",
-    alias: "modifier.animation",
-    config: {
-        easing: Ext.identityFn,
-        duration: 0,
-        customEasings: {},
-        customDurations: {},
-        customDuration: null
-    },
-    constructor: function(a) {
-        var b = this;
-        b.anyAnimation = b.anySpecialAnimations = false;
-        b.animating = 0;
-        b.animatingPool = [];
-        b.callParent([a])
-    },
-    prepareAttributes: function(a) {
-        if (!a.hasOwnProperty("timers")) {
-            a.animating = false;
-            a.timers = {};
-            a.animationOriginal = Ext.Object.chain(a);
-            a.animationOriginal.prototype = a
-        }
-        if (this._previous) {
-            this._previous.prepareAttributes(a.animationOriginal)
-        }
-    },
-    updateSprite: function(a) {
-        this.setConfig(a.config.fx)
-    },
-    updateDuration: function(a) {
-        this.anyAnimation = a > 0
-    },
-    applyEasing: function(a) {
-        if (typeof a === "string") {
-            a = Ext.draw.TimingFunctions.easingMap[a]
-        }
-        return a
-    },
-    applyCustomEasings: function(a, e) {
-        e = e || {};
-        var g, d, b, h, c, f;
-        for (d in a) {
-            g = true;
-            h = a[d];
-            b = d.split(",");
-            if (typeof h === "string") {
-                h = Ext.draw.TimingFunctions.easingMap[h]
-            }
-            for (c = 0, f = b.length; c < f; c++) {
-                e[b[c]] = h
-            }
-        }
-        if (g) {
-            this.anySpecialAnimations = g
-        }
-        return e
-    },
-    setEasingOn: function(a, e) {
-        a = Ext.Array.from(a).slice();
-        var c = {},
-            d = a.length,
-            b = 0;
-        for (; b < d; b++) {
-            c[a[b]] = e
-        }
-        this.setCustomEasings(c)
-    },
-    clearEasingOn: function(a) {
-        a = Ext.Array.from(a, true);
-        var b = 0,
-            c = a.length;
-        for (; b < c; b++) {
-            delete this._customEasings[a[b]]
-        }
-    },
-    applyCustomDurations: function(g, h) {
-        h = h || {};
-        var e, c, f, a, b, d;
-        for (c in g) {
-            e = true;
-            f = g[c];
-            a = c.split(",");
-            for (b = 0, d = a.length; b < d; b++) {
-                h[a[b]] = f
-            }
-        }
-        if (e) {
-            this.anySpecialAnimations = e
-        }
-        return h
-    },
-    applyCustomDuration: function(a, b) {
-        if (a) {
-            this.getCustomDurations();
-            this.setCustomDurations(a)
-        }
-    },
-    setDurationOn: function(b, e) {
-        b = Ext.Array.from(b).slice();
-        var a = {},
-            c = 0,
-            d = b.length;
-        for (; c < d; c++) {
-            a[b[c]] = e
-        }
-        this.setCustomDurations(a)
-    },
-    clearDurationOn: function(a) {
-        a = Ext.Array.from(a, true);
-        var b = 0,
-            c = a.length;
-        for (; b < c; b++) {
-            delete this._customDurations[a[b]]
-        }
-    },
-    setAnimating: function(a, b) {
-        var e = this,
-            d = e.animatingPool;
-        if (a.animating !== b) {
-            a.animating = b;
-            if (b) {
-                d.push(a);
-                if (e.animating === 0) {
-                    Ext.draw.Animator.add(e)
-                }
-                e.animating++
-            } else {
-                for (var c = d.length; c--;) {
-                    if (d[c] === a) {
-                        d.splice(c, 1)
-                    }
-                }
-                e.animating = d.length
-            }
-        }
-    },
-    setAttrs: function(r, t) {
-        var s = this,
-            m = r.timers,
-            h = s._sprite.self.def._animationProcessors,
-            f = s._easing,
-            e = s._duration,
-            j = s._customDurations,
-            i = s._customEasings,
-            g = s.anySpecialAnimations,
-            n = s.anyAnimation || g,
-            o = r.animationOriginal,
-            d = false,
-            k, u, l, p, c, q, a;
-        if (!n) {
-            for (u in t) {
-                if (r[u] === t[u]) {
-                    delete t[u]
-                } else {
-                    r[u] = t[u]
-                }
-                delete o[u];
-                delete m[u]
-            }
-            return t
-        } else {
-            for (u in t) {
-                l = t[u];
-                p = r[u];
-                if (l !== p && p !== undefined && p !== null && (c = h[u])) {
-                    q = f;
-                    a = e;
-                    if (g) {
-                        if (u in i) {
-                            q = i[u]
-                        }
-                        if (u in j) {
-                            a = j[u]
-                        }
-                    }
-                    if (p && p.isGradient || l && l.isGradient) {
-                        a = 0
-                    }
-                    if (a) {
-                        if (!m[u]) {
-                            m[u] = {}
-                        }
-                        k = m[u];
-                        k.start = 0;
-                        k.easing = q;
-                        k.duration = a;
-                        k.compute = c.compute;
-                        k.serve = c.serve || Ext.identityFn;
-                        k.remove = t.removeFromInstance && t.removeFromInstance[u];
-                        if (c.parseInitial) {
-                            var b = c.parseInitial(p, l);
-                            k.source = b[0];
-                            k.target = b[1]
-                        } else {
-                            if (c.parse) {
-                                k.source = c.parse(p);
-                                k.target = c.parse(l)
-                            } else {
-                                k.source = p;
-                                k.target = l
-                            }
-                        }
-                        o[u] = l;
-                        delete t[u];
-                        d = true;
-                        continue
-                    } else {
-                        delete o[u]
-                    }
-                } else {
-                    delete o[u]
-                }
-                delete m[u]
-            }
-        }
-        if (d && !r.animating) {
-            s.setAnimating(r, true)
-        }
-        return t
-    },
-    updateAttributes: function(g) {
-        if (!g.animating) {
-            return {}
-        }
-        var h = {},
-            e = false,
-            d = g.timers,
-            f = g.animationOriginal,
-            c = Ext.draw.Animator.animationTime(),
-            a, b, i;
-        if (g.lastUpdate === c) {
-            return null
-        }
-        for (a in d) {
-            b = d[a];
-            if (!b.start) {
-                b.start = c;
-                i = 0
-            } else {
-                i = (c - b.start) / b.duration
-            }
-            if (i >= 1) {
-                h[a] = f[a];
-                delete f[a];
-                if (d[a].remove) {
-                    h.removeFromInstance = h.removeFromInstance || {};
-                    h.removeFromInstance[a] = true
-                }
-                delete d[a]
-            } else {
-                h[a] = b.serve(b.compute(b.source, b.target, b.easing(i), g[a]));
-                e = true
-            }
-        }
-        g.lastUpdate = c;
-        this.setAnimating(g, e);
-        return h
-    },
-    pushDown: function(a, b) {
-        b = this.callParent([a.animationOriginal, b]);
-        return this.setAttrs(a, b)
-    },
-    popUp: function(a, b) {
-        a = a.prototype;
-        b = this.setAttrs(a, b);
-        if (this._next) {
-            return this._next.popUp(a, b)
-        } else {
-            return Ext.apply(a, b)
-        }
-    },
-    step: function(g) {
-        var f = this,
-            c = f.animatingPool.slice(),
-            e = c.length,
-            b = 0,
-            a, d;
-        for (; b < e; b++) {
-            a = c[b];
-            d = f.updateAttributes(a);
-            if (d && f._next) {
-                f._next.popUp(a, d)
-            }
-        }
-    },
-    stop: function() {
-        this.step();
-        var d = this,
-            b = d.animatingPool,
-            a, c;
-        for (a = 0, c = b.length; a < c; a++) {
-            b[a].animating = false
-        }
-        d.animatingPool.length = 0;
-        d.animating = 0;
-        Ext.draw.Animator.remove(d)
-    },
-    destroy: function() {
-        this.animatingPool.length = 0;
-        this.animating = 0;
-        this.callParent()
-    }
-});
-Ext.define("Ext.draw.modifier.Highlight", {
-    extend: "Ext.draw.modifier.Modifier",
-    alias: "modifier.highlight",
-    config: {
-        enabled: false,
-        highlightStyle: null
-    },
-    preFx: true,
-    applyHighlightStyle: function(b, a) {
-        a = a || {};
-        if (this.getSprite()) {
-            Ext.apply(a, this.getSprite().self.def.normalize(b))
-        } else {
-            Ext.apply(a, b)
-        }
-        return a
-    },
-    prepareAttributes: function(a) {
-        if (!a.hasOwnProperty("highlightOriginal")) {
-            a.highlighted = false;
-            a.highlightOriginal = Ext.Object.chain(a);
-            a.highlightOriginal.prototype = a;
-            a.highlightOriginal.removeFromInstance = {}
-        }
-        if (this._previous) {
-            this._previous.prepareAttributes(a.highlightOriginal)
-        }
-    },
-    updateSprite: function(b, a) {
-        if (b) {
-            if (this.getHighlightStyle()) {
-                this._highlightStyle = b.self.def.normalize(this.getHighlightStyle())
-            }
-            this.setHighlightStyle(b.config.highlight)
-        }
-        b.self.def.setConfig({
-            defaults: {
-                highlighted: false
-            },
-            processors: {
-                highlighted: "bool"
-            }
-        });
-        this.setSprite(b)
-    },
-    filterChanges: function(a, d) {
-        var e = this,
-            f = a.highlightOriginal,
-            c = e.getHighlightStyle(),
-            b;
-        if (a.highlighted) {
-            for (b in d) {
-                if (c.hasOwnProperty(b)) {
-                    f[b] = d[b];
-                    delete d[b]
-                }
-            }
-        }
-        for (b in d) {
-            if (b !== "highlighted" && f[b] === d[b]) {
-                delete d[b]
-            }
-        }
-        return d
-    },
-    pushDown: function(e, g) {
-        var f = this.getHighlightStyle(),
-            c = e.highlightOriginal,
-            i = c.removeFromInstance,
-            d, a, h, b;
-        if (g.hasOwnProperty("highlighted")) {
-            d = g.highlighted;
-            delete g.highlighted;
-            if (this._previous) {
-                g = this._previous.pushDown(c, g)
-            }
-            g = this.filterChanges(e, g);
-            if (d !== e.highlighted) {
-                if (d) {
-                    for (a in f) {
-                        if (a in g) {
-                            c[a] = g[a]
-                        } else {
-                            h = e.template && e.template.ownAttr;
-                            if (h && !e.prototype.hasOwnProperty(a)) {
-                                i[a] = true;
-                                c[a] = h.animationOriginal[a]
-                            } else {
-                                b = c.timers[a];
-                                if (b && b.remove) {
-                                    i[a] = true
-                                }
-                                c[a] = e[a]
-                            }
-                        }
-                        if (c[a] !== f[a]) {
-                            g[a] = f[a]
-                        }
-                    }
-                } else {
-                    for (a in f) {
-                        if (!(a in g)) {
-                            g[a] = c[a]
-                        }
-                        delete c[a]
-                    }
-                    g.removeFromInstance = g.removeFromInstance || {};
-                    Ext.apply(g.removeFromInstance, i);
-                    c.removeFromInstance = {}
-                }
-                g.highlighted = d
-            }
-        } else {
-            if (this._previous) {
-                g = this._previous.pushDown(c, g)
-            }
-            g = this.filterChanges(e, g)
-        }
-        return g
-    },
-    popUp: function(a, b) {
-        b = this.filterChanges(a, b);
-        Ext.draw.modifier.Modifier.prototype.popUp.call(this, a, b)
-    }
-});
-Ext.define("Ext.draw.sprite.Sprite", {
-    alias: "sprite.sprite",
-    mixins: {
-        observable: "Ext.mixin.Observable"
-    },
-    requires: ["Ext.draw.Draw", "Ext.draw.gradient.Gradient", "Ext.draw.sprite.AttributeDefinition", "Ext.draw.modifier.Target", "Ext.draw.modifier.Animation", "Ext.draw.modifier.Highlight"],
-    isSprite: true,
-    statics: {
-        defaultHitTestOptions: {
-            fill: true,
-            stroke: true
-        }
-    },
-    inheritableStatics: {
-        def: {
-            processors: {
-                strokeStyle: "color",
-                fillStyle: "color",
-                strokeOpacity: "limited01",
-                fillOpacity: "limited01",
-                lineWidth: "number",
-                lineCap: "enums(butt,round,square)",
-                lineJoin: "enums(round,bevel,miter)",
-                lineDash: "data",
-                lineDashOffset: "number",
-                miterLimit: "number",
-                shadowColor: "color",
-                shadowOffsetX: "number",
-                shadowOffsetY: "number",
-                shadowBlur: "number",
-                globalAlpha: "limited01",
-                globalCompositeOperation: "enums(source-over,destination-over,source-in,destination-in,source-out,destination-out,source-atop,destination-atop,lighter,xor,copy)",
-                hidden: "bool",
-                transformFillStroke: "bool",
-                zIndex: "number",
-                translationX: "number",
-                translationY: "number",
-                rotationRads: "number",
-                rotationCenterX: "number",
-                rotationCenterY: "number",
-                scalingX: "number",
-                scalingY: "number",
-                scalingCenterX: "number",
-                scalingCenterY: "number",
-                constrainGradients: "bool"
-            },
-            aliases: {
-                stroke: "strokeStyle",
-                fill: "fillStyle",
-                color: "fillStyle",
-                "stroke-width": "lineWidth",
-                "stroke-linecap": "lineCap",
-                "stroke-linejoin": "lineJoin",
-                "stroke-miterlimit": "miterLimit",
-                "text-anchor": "textAlign",
-                opacity: "globalAlpha",
-                translateX: "translationX",
-                translateY: "translationY",
-                rotateRads: "rotationRads",
-                rotateCenterX: "rotationCenterX",
-                rotateCenterY: "rotationCenterY",
-                scaleX: "scalingX",
-                scaleY: "scalingY",
-                scaleCenterX: "scalingCenterX",
-                scaleCenterY: "scalingCenterY"
-            },
-            defaults: {
-                hidden: false,
-                zIndex: 0,
-                strokeStyle: "none",
-                fillStyle: "none",
-                lineWidth: 1,
-                lineDash: [],
-                lineDashOffset: 0,
-                lineCap: "butt",
-                lineJoin: "miter",
-                miterLimit: 10,
-                shadowColor: "none",
-                shadowOffsetX: 0,
-                shadowOffsetY: 0,
-                shadowBlur: 0,
-                globalAlpha: 1,
-                strokeOpacity: 1,
-                fillOpacity: 1,
-                transformFillStroke: false,
-                translationX: 0,
-                translationY: 0,
-                rotationRads: 0,
-                rotationCenterX: null,
-                rotationCenterY: null,
-                scalingX: 1,
-                scalingY: 1,
-                scalingCenterX: null,
-                scalingCenterY: null,
-                constrainGradients: false
-            },
-            triggers: {
-                zIndex: "zIndex",
-                globalAlpha: "canvas",
-                globalCompositeOperation: "canvas",
-                transformFillStroke: "canvas",
-                strokeStyle: "canvas",
-                fillStyle: "canvas",
-                strokeOpacity: "canvas",
-                fillOpacity: "canvas",
-                lineWidth: "canvas",
-                lineCap: "canvas",
-                lineJoin: "canvas",
-                lineDash: "canvas",
-                lineDashOffset: "canvas",
-                miterLimit: "canvas",
-                shadowColor: "canvas",
-                shadowOffsetX: "canvas",
-                shadowOffsetY: "canvas",
-                shadowBlur: "canvas",
-                translationX: "transform",
-                translationY: "transform",
-                rotationRads: "transform",
-                rotationCenterX: "transform",
-                rotationCenterY: "transform",
-                scalingX: "transform",
-                scalingY: "transform",
-                scalingCenterX: "transform",
-                scalingCenterY: "transform",
-                constrainGradients: "canvas"
-            },
-            updaters: {
-                bbox: "bboxUpdater",
-                zIndex: function(a) {
-                    a.dirtyZIndex = true
-                },
-                transform: function(a) {
-                    a.dirtyTransform = true;
-                    a.bbox.transform.dirty = true
-                }
-            }
-        }
-    },
-    config: {
-        parent: null,
-        surface: null
-    },
-    onClassExtended: function(d, c) {
-        var b = d.superclass.self.def.initialConfig,
-            e = c.inheritableStatics && c.inheritableStatics.def,
-            a;
-        if (e) {
-            a = Ext.Object.merge({}, b, e);
-            d.def = new Ext.draw.sprite.AttributeDefinition(a);
-            delete c.inheritableStatics.def
-        } else {
-            d.def = new Ext.draw.sprite.AttributeDefinition(b)
-        }
-        d.def.spriteClass = d
-    },
-    constructor: function(b) {
-        var d = this,
-            c = d.self.def,
-            e = c.getDefaults(),
-            a;
-        b = Ext.isObject(b) ? b : {};
-        d.id = b.id || Ext.id(null, "ext-sprite-");
-        d.attr = {};
-        d.mixins.observable.constructor.apply(d, arguments);
-        a = Ext.Array.from(b.modifiers, true);
-        d.prepareModifiers(a);
-        d.initializeAttributes();
-        d.setAttributes(e, true);
-        d.setAttributes(b)
-    },
-    getDirty: function() {
-        return this.attr.dirty
-    },
-    setDirty: function(b) {
-        this.attr.dirty = b;
-        if (b) {
-            var a = this.getParent();
-            if (a) {
-                a.setDirty(true)
-            }
-        }
-    },
-    addModifier: function(a, b) {
-        var c = this;
-        if (!(a instanceof Ext.draw.modifier.Modifier)) {
-            a = Ext.factory(a, null, null, "modifier")
-        }
-        a.setSprite(c);
-        if (a.preFx || a.config && a.config.preFx) {
-            if (c.fx.getPrevious()) {
-                c.fx.getPrevious().setNext(a)
-            }
-            a.setNext(c.fx)
-        } else {
-            c.topModifier.getPrevious().setNext(a);
-            a.setNext(c.topModifier)
-        }
-        if (b) {
-            c.initializeAttributes()
-        }
-        return a
-    },
-    prepareModifiers: function(d) {
-        var c = this,
-            a, b;
-        c.topModifier = new Ext.draw.modifier.Target({
-            sprite: c
-        });
-        c.fx = new Ext.draw.modifier.Animation({
-            sprite: c
-        });
-        c.fx.setNext(c.topModifier);
-        for (a = 0, b = d.length; a < b; a++) {
-            c.addModifier(d[a], false)
-        }
-    },
-    getAnimation: function() {
-        return this.fx
-    },
-    setAnimation: function(a) {
-        this.fx.setConfig(a)
-    },
-    initializeAttributes: function() {
-        this.topModifier.prepareAttributes(this.attr)
-    },
-    callUpdaters: function(d) {
-        var e = this,
-            h = d.pendingUpdaters,
-            i = e.self.def.getUpdaters(),
-            c = false,
-            a = false,
-            b, g, f;
-        e.callUpdaters = Ext.emptyFn;
-        do {
-            c = false;
-            for (g in h) {
-                c = true;
-                b = h[g];
-                delete h[g];
-                f = i[g];
-                if (typeof f === "string") {
-                    f = e[f]
-                }
-                if (f) {
-                    f.call(e, d, b)
-                }
-            }
-            a = a || c
-        } while (c);
-        delete e.callUpdaters;
-        if (a) {
-            e.setDirty(true)
-        }
-    },
-    scheduleUpdaters: function(a, e, c) {
-        var f;
-        if (c) {
-            for (var b = 0, d = e.length; b < d; b++) {
-                f = e[b];
-                this.scheduleUpdater(a, f, c)
-            }
-        } else {
-            for (f in e) {
-                c = e[f];
-                this.scheduleUpdater(a, f, c)
-            }
-        }
-    },
-    scheduleUpdater: function(a, c, b) {
-        b = b || [];
-        var d = a.pendingUpdaters;
-        if (c in d) {
-            if (b.length) {
-                d[c] = Ext.Array.merge(d[c], b)
-            }
-        } else {
-            d[c] = b
-        }
-    },
-    setAttributes: function(d, g, c) {
-        var a = this.attr,
-            b, e, f;
-        if (g) {
-            if (c) {
-                this.topModifier.pushDown(a, d)
-            } else {
-                f = {};
-                for (b in d) {
-                    e = d[b];
-                    if (e !== a[b]) {
-                        f[b] = e
-                    }
-                }
-                this.topModifier.pushDown(a, f)
-            }
-        } else {
-            this.topModifier.pushDown(a, this.self.def.normalize(d))
-        }
-    },
-    setAttributesBypassingNormalization: function(b, a) {
-        return this.setAttributes(b, true, a)
-    },
-    bboxUpdater: function(b) {
-        var c = b.rotationRads !== 0,
-            a = b.scalingX !== 1 || b.scalingY !== 1,
-            d = b.rotationCenterX === null || b.rotationCenterY === null,
-            e = b.scalingCenterX === null || b.scalingCenterY === null;
-        b.bbox.plain.dirty = true;
-        b.bbox.transform.dirty = true;
-        if (c && d || a && e) {
-            this.scheduleUpdater(b, "transform")
-        }
-    },
-    getBBox: function(d) {
-        var e = this,
-            a = e.attr,
-            f = a.bbox,
-            c = f.plain,
-            b = f.transform;
-        if (c.dirty) {
-            e.updatePlainBBox(c);
-            c.dirty = false
-        }
-        if (!d) {
-            e.applyTransformations();
-            if (b.dirty) {
-                e.updateTransformedBBox(b, c);
-                b.dirty = false
-            }
-            return b
-        }
-        return c
-    },
-    updatePlainBBox: Ext.emptyFn,
-    updateTransformedBBox: function(a, b) {
-        this.attr.matrix.transformBBox(b, 0, a)
-    },
-    getBBoxCenter: function(a) {
-        var b = this.getBBox(a);
-        if (b) {
-            return [b.x + b.width * 0.5, b.y + b.height * 0.5]
-        } else {
-            return [0, 0]
-        }
-    },
-    hide: function() {
-        this.attr.hidden = true;
-        this.setDirty(true);
-        return this
-    },
-    show: function() {
-        this.attr.hidden = false;
-        this.setDirty(true);
-        return this
-    },
-    useAttributes: function(i, f) {
-        this.applyTransformations();
-        var d = this.attr,
-            h = d.canvasAttributes,
-            e = h.strokeStyle,
-            g = h.fillStyle,
-            b = h.lineDash,
-            c = h.lineDashOffset,
-            a;
-        if (e) {
-            if (e.isGradient) {
-                i.strokeStyle = "black";
-                i.strokeGradient = e
-            } else {
-                i.strokeGradient = false
-            }
-        }
-        if (g) {
-            if (g.isGradient) {
-                i.fillStyle = "black";
-                i.fillGradient = g
-            } else {
-                i.fillGradient = false
-            }
-        }
-        if (b) {
-            i.setLineDash(b)
-        }
-        if (Ext.isNumber(c + i.lineDashOffset)) {
-            i.lineDashOffset = c
-        }
-        for (a in h) {
-            if (h[a] !== undefined && h[a] !== i[a]) {
-                i[a] = h[a]
-            }
-        }
-        this.setGradientBBox(i, f)
-    },
-    setGradientBBox: function(b, c) {
-        var a = this.attr;
-        if (a.constrainGradients) {
-            b.setGradientBBox({
-                x: c[0],
-                y: c[1],
-                width: c[2],
-                height: c[3]
-            })
-        } else {
-            b.setGradientBBox(this.getBBox(a.transformFillStroke))
-        }
-    },
-    applyTransformations: function(b) {
-        if (!b && !this.attr.dirtyTransform) {
-            return
-        }
-        var r = this,
-            k = r.attr,
-            p = r.getBBoxCenter(true),
-            g = p[0],
-            f = p[1],
-            q = k.translationX,
-            o = k.translationY,
-            j = k.scalingX,
-            i = k.scalingY === null ? k.scalingX : k.scalingY,
-            m = k.scalingCenterX === null ? g : k.scalingCenterX,
-            l = k.scalingCenterY === null ? f : k.scalingCenterY,
-            s = k.rotationRads,
-            e = k.rotationCenterX === null ? g : k.rotationCenterX,
-            d = k.rotationCenterY === null ? f : k.rotationCenterY,
-            c = Math.cos(s),
-            a = Math.sin(s),
-            n, h;
-        if (j === 1 && i === 1) {
-            m = 0;
-            l = 0
-        }
-        if (s === 0) {
-            e = 0;
-            d = 0
-        }
-        n = m * (1 - j) - e;
-        h = l * (1 - i) - d;
-        k.matrix.elements = [c * j, a * j, -a * i, c * i, c * n - a * h + e + q, a * n + c * h + d + o];
-        k.matrix.inverse(k.inverseMatrix);
-        k.dirtyTransform = false;
-        k.bbox.transform.dirty = true
-    },
-    transform: function(b, c) {
-        var a = this.attr,
-            e = a.matrix,
-            d;
-        if (b && b.isMatrix) {
-            d = b.elements
-        } else {
-            d = b
-        }
-        e.prepend.apply(e, d.slice());
-        e.inverse(a.inverseMatrix);
-        if (c) {
-            this.updateTransformAttributes()
-        }
-        a.dirtyTransform = false;
-        a.bbox.transform.dirty = true;
-        this.setDirty(true);
-        return this
-    },
-    updateTransformAttributes: function() {
-        var a = this.attr,
-            b = a.matrix.split();
-        a.rotationRads = b.rotate;
-        a.rotationCenterX = 0;
-        a.rotationCenterY = 0;
-        a.scalingX = b.scaleX;
-        a.scalingY = b.scaleY;
-        a.scalingCenterX = 0;
-        a.scalingCenterY = 0;
-        a.translationX = b.translateX;
-        a.translationY = b.translateY
-    },
-    resetTransform: function(b) {
-        var a = this.attr;
-        a.matrix.reset();
-        a.inverseMatrix.reset();
-        if (!b) {
-            this.updateTransformAttributes()
-        }
-        a.dirtyTransform = false;
-        a.bbox.transform.dirty = true;
-        this.setDirty(true);
-        return this
-    },
-    setTransform: function(a, b) {
-        this.resetTransform(true);
-        this.transform.call(this, a, b);
-        return this
-    },
-    preRender: Ext.emptyFn,
-    render: Ext.emptyFn,
-    hitTest: function(b, c) {
-        if (this.isVisible()) {
-            var a = b[0],
-                f = b[1],
-                e = this.getBBox(),
-                d = e && a >= e.x && a <= (e.x + e.width) && f >= e.y && f <= (e.y + e.height);
-            if (d) {
-                return {
-                    sprite: this
-                }
-            }
-        }
-        return null
-    },
-    isVisible: function() {
-        var e = this.attr,
-            f = this.getParent(),
-            g = f && (f.isSurface || f.isVisible()),
-            d = g && !e.hidden && e.globalAlpha,
-            b = Ext.draw.Color.NONE,
-            a = Ext.draw.Color.RGBA_NONE,
-            c = e.fillOpacity && e.fillStyle !== b && e.fillStyle !== a,
-            i = e.strokeOpacity && e.strokeStyle !== b && e.strokeStyle !== a,
-            h = d && (c || i);
-        return !!h
-    },
-    repaint: function() {
-        var a = this.getSurface();
-        if (a) {
-            a.renderFrame()
-        }
-    },
-    remove: function() {
-        var a = this.getSurface();
-        if (a && a.isSurface) {
-            return a.remove(this)
-        }
-        return null
-    },
-    destroy: function() {
-        var b = this,
-            a = b.topModifier,
-            c;
-        while (a) {
-            c = a;
-            a = a.getPrevious();
-            c.destroy()
-        }
-        delete b.attr;
-        b.remove();
-        if (b.fireEvent("beforedestroy", b) !== false) {
-            b.fireEvent("destroy", b)
-        }
-        b.callParent()
-    }
-}, function() {
-    this.def = new Ext.draw.sprite.AttributeDefinition(this.def);
-    this.def.spriteClass = this
-});
-Ext.define("Ext.draw.Path", {
-    requires: ["Ext.draw.Draw"],
-    statics: {
-        pathRe: /,?([achlmqrstvxz]),?/gi,
-        pathRe2: /-/gi,
-        pathSplitRe: /\s|,/g
-    },
-    svgString: "",
-    constructor: function(a) {
-        var b = this;
-        b.commands = [];
-        b.params = [];
-        b.cursor = null;
-        b.startX = 0;
-        b.startY = 0;
-        if (a) {
-            b.fromSvgString(a)
-        }
-    },
-    clear: function() {
-        var a = this;
-        a.params.length = 0;
-        a.commands.length = 0;
-        a.cursor = null;
-        a.startX = 0;
-        a.startY = 0;
-        a.dirt()
-    },
-    dirt: function() {
-        this.svgString = ""
-    },
-    moveTo: function(a, c) {
-        var b = this;
-        if (!b.cursor) {
-            b.cursor = [a, c]
-        }
-        b.params.push(a, c);
-        b.commands.push("M");
-        b.startX = a;
-        b.startY = c;
-        b.cursor[0] = a;
-        b.cursor[1] = c;
-        b.dirt()
-    },
-    lineTo: function(a, c) {
-        var b = this;
-        if (!b.cursor) {
-            b.cursor = [a, c];
-            b.params.push(a, c);
-            b.commands.push("M")
-        } else {
-            b.params.push(a, c);
-            b.commands.push("L")
-        }
-        b.cursor[0] = a;
-        b.cursor[1] = c;
-        b.dirt()
-    },
-    bezierCurveTo: function(c, e, b, d, a, g) {
-        var f = this;
-        if (!f.cursor) {
-            f.moveTo(c, e)
-        }
-        f.params.push(c, e, b, d, a, g);
-        f.commands.push("C");
-        f.cursor[0] = a;
-        f.cursor[1] = g;
-        f.dirt()
-    },
-    quadraticCurveTo: function(b, e, a, d) {
-        var c = this;
-        if (!c.cursor) {
-            c.moveTo(b, e)
-        }
-        c.bezierCurveTo((2 * b + c.cursor[0]) / 3, (2 * e + c.cursor[1]) / 3, (2 * b + a) / 3, (2 * e + d) / 3, a, d)
-    },
-    closePath: function() {
-        var a = this;
-        if (a.cursor) {
-            a.cursor = null;
-            a.commands.push("Z");
-            a.dirt()
-        }
-    },
-    arcTo: function(A, f, z, d, j, i, v) {
-        var E = this;
-        if (i === undefined) {
-            i = j
-        }
-        if (v === undefined) {
-            v = 0
-        }
-        if (!E.cursor) {
-            E.moveTo(A, f);
-            return
-        }
-        if (j === 0 || i === 0) {
-            E.lineTo(A, f);
-            return
-        }
-        z -= A;
-        d -= f;
-        var B = E.cursor[0] - A,
-            g = E.cursor[1] - f,
-            C = z * g - d * B,
-            b, a, l, r, k, q, x = Math.sqrt(B * B + g * g),
-            u = Math.sqrt(z * z + d * d),
-            t, e, c;
-        if (C === 0) {
-            E.lineTo(A, f);
-            return
-        }
-        if (i !== j) {
-            b = Math.cos(v);
-            a = Math.sin(v);
-            l = b / j;
-            r = a / i;
-            k = -a / j;
-            q = b / i;
-            var D = l * B + r * g;
-            g = k * B + q * g;
-            B = D;
-            D = l * z + r * d;
-            d = k * z + q * d;
-            z = D
-        } else {
-            B /= j;
-            g /= i;
-            z /= j;
-            d /= i
-        }
-        e = B * u + z * x;
-        c = g * u + d * x;
-        t = 1 / (Math.sin(Math.asin(Math.abs(C) / (x * u)) * 0.5) * Math.sqrt(e * e + c * c));
-        e *= t;
-        c *= t;
-        var o = (e * B + c * g) / (B * B + g * g),
-            m = (e * z + c * d) / (z * z + d * d);
-        var n = B * o - e,
-            p = g * o - c,
-            h = z * m - e,
-            y = d * m - c,
-            w = Math.atan2(p, n),
-            s = Math.atan2(y, h);
-        if (C > 0) {
-            if (s < w) {
-                s += Math.PI * 2
-            }
-        } else {
-            if (w < s) {
-                w += Math.PI * 2
-            }
-        }
-        if (i !== j) {
-            e = b * e * j - a * c * i + A;
-            c = a * c * i + b * c * i + f;
-            E.lineTo(b * j * n - a * i * p + e, a * j * n + b * i * p + c);
-            E.ellipse(e, c, j, i, v, w, s, C < 0)
-        } else {
-            e = e * j + A;
-            c = c * i + f;
-            E.lineTo(j * n + e, i * p + c);
-            E.ellipse(e, c, j, i, v, w, s, C < 0)
-        }
-    },
-    ellipse: function(h, f, c, a, q, n, d, e) {
-        var o = this,
-            g = o.params,
-            b = g.length,
-            m, l, k;
-        if (d - n >= Math.PI * 2) {
-            o.ellipse(h, f, c, a, q, n, n + Math.PI, e);
-            o.ellipse(h, f, c, a, q, n + Math.PI, d, e);
-            return
-        }
-        if (!e) {
-            if (d < n) {
-                d += Math.PI * 2
-            }
-            m = o.approximateArc(g, h, f, c, a, q, n, d)
-        } else {
-            if (n < d) {
-                n += Math.PI * 2
-            }
-            m = o.approximateArc(g, h, f, c, a, q, d, n);
-            for (l = b, k = g.length - 2; l < k; l += 2, k -= 2) {
-                var p = g[l];
-                g[l] = g[k];
-                g[k] = p;
-                p = g[l + 1];
-                g[l + 1] = g[k + 1];
-                g[k + 1] = p
-            }
-        }
-        if (!o.cursor) {
-            o.cursor = [g[g.length - 2], g[g.length - 1]];
-            o.commands.push("M")
-        } else {
-            o.cursor[0] = g[g.length - 2];
-            o.cursor[1] = g[g.length - 1];
-            o.commands.push("L")
-        }
-        for (l = 2; l < m; l += 6) {
-            o.commands.push("C")
-        }
-        o.dirt()
-    },
-    arc: function(b, f, a, d, c, e) {
-        this.ellipse(b, f, a, a, 0, d, c, e)
-    },
-    rect: function(b, e, c, a) {
-        if (c == 0 || a == 0) {
-            return
-        }
-        var d = this;
-        d.moveTo(b, e);
-        d.lineTo(b + c, e);
-        d.lineTo(b + c, e + a);
-        d.lineTo(b, e + a);
-        d.closePath()
-    },
-    approximateArc: function(s, i, f, o, n, d, x, v) {
-        var e = Math.cos(d),
-            z = Math.sin(d),
-            k = Math.cos(x),
-            l = Math.sin(x),
-            q = e * k * o - z * l * n,
-            y = -e * l * o - z * k * n,
-            p = z * k * o + e * l * n,
-            w = -z * l * o + e * k * n,
-            m = Math.PI / 2,
-            r = 2,
-            j = q,
-            u = y,
-            h = p,
-            t = w,
-            b = 0.547443256150549,
-            C, g, A, a, B, c;
-        v -= x;
-        if (v < 0) {
-            v += Math.PI * 2
-        }
-        s.push(q + i, p + f);
-        while (v >= m) {
-            s.push(j + u * b + i, h + t * b + f, j * b + u + i, h * b + t + f, u + i, t + f);
-            r += 6;
-            v -= m;
-            C = j;
-            j = u;
-            u = -C;
-            C = h;
-            h = t;
-            t = -C
-        }
-        if (v) {
-            g = (0.3294738052815987 + 0.012120855841304373 * v) * v;
-            A = Math.cos(v);
-            a = Math.sin(v);
-            B = A + g * a;
-            c = a - g * A;
-            s.push(j + u * g + i, h + t * g + f, j * B + u * c + i, h * B + t * c + f, j * A + u * a + i, h * A + t * a + f);
-            r += 6
-        }
-        return r
-    },
-    arcSvg: function(j, h, r, m, w, t, c) {
-        if (j < 0) {
-            j = -j
-        }
-        if (h < 0) {
-            h = -h
-        }
-        var x = this,
-            u = x.cursor[0],
-            f = x.cursor[1],
-            a = (u - t) / 2,
-            y = (f - c) / 2,
-            d = Math.cos(r),
-            s = Math.sin(r),
-            o = a * d + y * s,
-            v = -a * s + y * d,
-            i = o / j,
-            g = v / h,
-            p = i * i + g * g,
-            e = (u + t) * 0.5,
-            b = (f + c) * 0.5,
-            l = 0,
-            k = 0;
-        if (p >= 1) {
-            p = Math.sqrt(p);
-            j *= p;
-            h *= p
-        } else {
-            p = Math.sqrt(1 / p - 1);
-            if (m === w) {
-                p = -p
-            }
-            l = p * j * g;
-            k = -p * h * i;
-            e += d * l - s * k;
-            b += s * l + d * k
-        }
-        var q = Math.atan2((v - k) / h, (o - l) / j),
-            n = Math.atan2((-v - k) / h, (-o - l) / j) - q;
-        if (w) {
-            if (n <= 0) {
-                n += Math.PI * 2
-            }
-        } else {
-            if (n >= 0) {
-                n -= Math.PI * 2
-            }
-        }
-        x.ellipse(e, b, j, h, r, q, q + n, 1 - w)
-    },
-    fromSvgString: function(e) {
-        if (!e) {
-            return
-        }
-        var m = this,
-            h, l = {
-                a: 7,
-                c: 6,
-                h: 1,
-                l: 2,
-                m: 2,
-                q: 4,
-                s: 4,
-                t: 2,
-                v: 1,
-                z: 0,
-                A: 7,
-                C: 6,
-                H: 1,
-                L: 2,
-                M: 2,
-                Q: 4,
-                S: 4,
-                T: 2,
-                V: 1,
-                Z: 0
-            },
-            k = "",
-            g, f, c = 0,
-            b = 0,
-            d = false,
-            j, n, a;
-        if (Ext.isString(e)) {
-            h = e.replace(Ext.draw.Path.pathRe, " $1 ").replace(Ext.draw.Path.pathRe2, " -").split(Ext.draw.Path.pathSplitRe)
-        } else {
-            if (Ext.isArray(e)) {
-                h = e.join(",").split(Ext.draw.Path.pathSplitRe)
-            }
-        }
-        for (j = 0, n = 0; j < h.length; j++) {
-            if (h[j] !== "") {
-                h[n++] = h[j]
-            }
-        }
-        h.length = n;
-        m.clear();
-        for (j = 0; j < h.length;) {
-            k = d;
-            d = h[j];
-            a = (d.toUpperCase() !== d);
-            j++;
-            switch (d) {
-                case "M":
-                    m.moveTo(c = +h[j], b = +h[j + 1]);
-                    j += 2;
-                    while (j < n && !l.hasOwnProperty(h[j])) {
-                        m.lineTo(c = +h[j], b = +h[j + 1]);
-                        j += 2
-                    }
-                    break;
-                case "L":
-                    m.lineTo(c = +h[j], b = +h[j + 1]);
-                    j += 2;
-                    while (j < n && !l.hasOwnProperty(h[j])) {
-                        m.lineTo(c = +h[j], b = +h[j + 1]);
-                        j += 2
-                    }
-                    break;
-                case "A":
-                    while (j < n && !l.hasOwnProperty(h[j])) {
-                        m.arcSvg(+h[j], +h[j + 1], +h[j + 2] * Math.PI / 180, +h[j + 3], +h[j + 4], c = +h[j + 5], b = +h[j + 6]);
-                        j += 7
-                    }
-                    break;
-                case "C":
-                    while (j < n && !l.hasOwnProperty(h[j])) {
-                        m.bezierCurveTo(+h[j], +h[j + 1], g = +h[j + 2], f = +h[j + 3], c = +h[j + 4], b = +h[j + 5]);
-                        j += 6
-                    }
-                    break;
-                case "Z":
-                    m.closePath();
-                    break;
-                case "m":
-                    m.moveTo(c += +h[j], b += +h[j + 1]);
-                    j += 2;
-                    while (j < n && !l.hasOwnProperty(h[j])) {
-                        m.lineTo(c += +h[j], b += +h[j + 1]);
-                        j += 2
-                    }
-                    break;
-                case "l":
-                    m.lineTo(c += +h[j], b += +h[j + 1]);
-                    j += 2;
-                    while (j < n && !l.hasOwnProperty(h[j])) {
-                        m.lineTo(c += +h[j], b += +h[j + 1]);
-                        j += 2
-                    }
-                    break;
-                case "a":
-                    while (j < n && !l.hasOwnProperty(h[j])) {
-                        m.arcSvg(+h[j], +h[j + 1], +h[j + 2] * Math.PI / 180, +h[j + 3], +h[j + 4], c += +h[j + 5], b += +h[j + 6]);
-                        j += 7
-                    }
-                    break;
-                case "c":
-                    while (j < n && !l.hasOwnProperty(h[j])) {
-                        m.bezierCurveTo(c + (+h[j]), b + (+h[j + 1]), g = c + (+h[j + 2]), f = b + (+h[j + 3]), c += +h[j + 4], b += +h[j + 5]);
-                        j += 6
-                    }
-                    break;
-                case "z":
-                    m.closePath();
-                    break;
-                case "s":
-                    if (!(k === "c" || k === "C" || k === "s" || k === "S")) {
-                        g = c;
-                        f = b
-                    }
-                    while (j < n && !l.hasOwnProperty(h[j])) {
-                        m.bezierCurveTo(c + c - g, b + b - f, g = c + (+h[j]), f = b + (+h[j + 1]), c += +h[j + 2], b += +h[j + 3]);
-                        j += 4
-                    }
-                    break;
-                case "S":
-                    if (!(k === "c" || k === "C" || k === "s" || k === "S")) {
-                        g = c;
-                        f = b
-                    }
-                    while (j < n && !l.hasOwnProperty(h[j])) {
-                        m.bezierCurveTo(c + c - g, b + b - f, g = +h[j], f = +h[j + 1], c = (+h[j + 2]), b = (+h[j + 3]));
-                        j += 4
-                    }
-                    break;
-                case "q":
-                    while (j < n && !l.hasOwnProperty(h[j])) {
-                        m.quadraticCurveTo(g = c + (+h[j]), f = b + (+h[j + 1]), c += +h[j + 2], b += +h[j + 3]);
-                        j += 4
-                    }
-                    break;
-                case "Q":
-                    while (j < n && !l.hasOwnProperty(h[j])) {
-                        m.quadraticCurveTo(g = +h[j], f = +h[j + 1], c = +h[j + 2], b = +h[j + 3]);
-                        j += 4
-                    }
-                    break;
-                case "t":
-                    if (!(k === "q" || k === "Q" || k === "t" || k === "T")) {
-                        g = c;
-                        f = b
-                    }
-                    while (j < n && !l.hasOwnProperty(h[j])) {
-                        m.quadraticCurveTo(g = c + c - g, f = b + b - f, c += +h[j + 1], b += +h[j + 2]);
-                        j += 2
-                    }
-                    break;
-                case "T":
-                    if (!(k === "q" || k === "Q" || k === "t" || k === "T")) {
-                        g = c;
-                        f = b
-                    }
-                    while (j < n && !l.hasOwnProperty(h[j])) {
-                        m.quadraticCurveTo(g = c + c - g, f = b + b - f, c = (+h[j + 1]), b = (+h[j + 2]));
-                        j += 2
-                    }
-                    break;
-                case "h":
-                    while (j < n && !l.hasOwnProperty(h[j])) {
-                        m.lineTo(c += +h[j], b);
-                        j++
-                    }
-                    break;
-                case "H":
-                    while (j < n && !l.hasOwnProperty(h[j])) {
-                        m.lineTo(c = +h[j], b);
-                        j++
-                    }
-                    break;
-                case "v":
-                    while (j < n && !l.hasOwnProperty(h[j])) {
-                        m.lineTo(c, b += +h[j]);
-                        j++
-                    }
-                    break;
-                case "V":
-                    while (j < n && !l.hasOwnProperty(h[j])) {
-                        m.lineTo(c, b = +h[j]);
-                        j++
-                    }
-                    break
-            }
-        }
-    },
-    clone: function() {
-        var a = this,
-            b = new Ext.draw.Path();
-        b.params = a.params.slice(0);
-        b.commands = a.commands.slice(0);
-        b.cursor = a.cursor ? a.cursor.slice(0) : null;
-        b.startX = a.startX;
-        b.startY = a.startY;
-        b.svgString = a.svgString;
-        return b
-    },
-    transform: function(j) {
-        if (j.isIdentity()) {
-            return
-        }
-        var a = j.getXX(),
-            f = j.getYX(),
-            m = j.getDX(),
-            l = j.getXY(),
-            e = j.getYY(),
-            k = j.getDY(),
-            b = this.params,
-            c = 0,
-            d = b.length,
-            h, g;
-        for (; c < d; c += 2) {
-            h = b[c];
-            g = b[c + 1];
-            b[c] = h * a + g * f + m;
-            b[c + 1] = h * l + g * e + k
-        }
-        this.dirt()
-    },
-    getDimension: function(f) {
-        if (!f) {
-            f = {}
-        }
-        if (!this.commands || !this.commands.length) {
-            f.x = 0;
-            f.y = 0;
-            f.width = 0;
-            f.height = 0;
-            return f
-        }
-        f.left = Infinity;
-        f.top = Infinity;
-        f.right = -Infinity;
-        f.bottom = -Infinity;
-        var d = 0,
-            c = 0,
-            b = this.commands,
-            g = this.params,
-            e = b.length,
-            a, h;
-        for (; d < e; d++) {
-            switch (b[d]) {
-                case "M":
-                case "L":
-                    a = g[c];
-                    h = g[c + 1];
-                    f.left = Math.min(a, f.left);
-                    f.top = Math.min(h, f.top);
-                    f.right = Math.max(a, f.right);
-                    f.bottom = Math.max(h, f.bottom);
-                    c += 2;
-                    break;
-                case "C":
-                    this.expandDimension(f, a, h, g[c], g[c + 1], g[c + 2], g[c + 3], a = g[c + 4], h = g[c + 5]);
-                    c += 6;
-                    break
-            }
-        }
-        f.x = f.left;
-        f.y = f.top;
-        f.width = f.right - f.left;
-        f.height = f.bottom - f.top;
-        return f
-    },
-    getDimensionWithTransform: function(n, f) {
-        if (!this.commands || !this.commands.length) {
-            if (!f) {
-                f = {}
-            }
-            f.x = 0;
-            f.y = 0;
-            f.width = 0;
-            f.height = 0;
-            return f
-        }
-        f.left = Infinity;
-        f.top = Infinity;
-        f.right = -Infinity;
-        f.bottom = -Infinity;
-        var a = n.getXX(),
-            k = n.getYX(),
-            q = n.getDX(),
-            p = n.getXY(),
-            h = n.getYY(),
-            o = n.getDY(),
-            e = 0,
-            d = 0,
-            b = this.commands,
-            c = this.params,
-            g = b.length,
-            m, l;
-        for (; e < g; e++) {
-            switch (b[e]) {
-                case "M":
-                case "L":
-                    m = c[d] * a + c[d + 1] * k + q;
-                    l = c[d] * p + c[d + 1] * h + o;
-                    f.left = Math.min(m, f.left);
-                    f.top = Math.min(l, f.top);
-                    f.right = Math.max(m, f.right);
-                    f.bottom = Math.max(l, f.bottom);
-                    d += 2;
-                    break;
-                case "C":
-                    this.expandDimension(f, m, l, c[d] * a + c[d + 1] * k + q, c[d] * p + c[d + 1] * h + o, c[d + 2] * a + c[d + 3] * k + q, c[d + 2] * p + c[d + 3] * h + o, m = c[d + 4] * a + c[d + 5] * k + q, l = c[d + 4] * p + c[d + 5] * h + o);
-                    d += 6;
-                    break
-            }
-        }
-        if (!f) {
-            f = {}
-        }
-        f.x = f.left;
-        f.y = f.top;
-        f.width = f.right - f.left;
-        f.height = f.bottom - f.top;
-        return f
-    },
-    expandDimension: function(i, d, p, k, g, j, e, c, o) {
-        var m = this,
-            f = i.left,
-            a = i.right,
-            q = i.top,
-            n = i.bottom,
-            h = m.dim || (m.dim = []);
-        m.curveDimension(d, k, j, c, h);
-        f = Math.min(f, h[0]);
-        a = Math.max(a, h[1]);
-        m.curveDimension(p, g, e, o, h);
-        q = Math.min(q, h[0]);
-        n = Math.max(n, h[1]);
-        i.left = f;
-        i.right = a;
-        i.top = q;
-        i.bottom = n
-    },
-    curveDimension: function(p, n, k, j, h) {
-        var i = 3 * (-p + 3 * (n - k) + j),
-            g = 6 * (p - 2 * n + k),
-            f = -3 * (p - n),
-            o, m, e = Math.min(p, j),
-            l = Math.max(p, j),
-            q;
-        if (i === 0) {
-            if (g === 0) {
-                h[0] = e;
-                h[1] = l;
-                return
-            } else {
-                o = -f / g;
-                if (0 < o && o < 1) {
-                    m = this.interpolate(p, n, k, j, o);
-                    e = Math.min(e, m);
-                    l = Math.max(l, m)
-                }
-            }
-        } else {
-            q = g * g - 4 * i * f;
-            if (q >= 0) {
-                q = Math.sqrt(q);
-                o = (q - g) / 2 / i;
-                if (0 < o && o < 1) {
-                    m = this.interpolate(p, n, k, j, o);
-                    e = Math.min(e, m);
-                    l = Math.max(l, m)
-                }
-                if (q > 0) {
-                    o -= q / i;
-                    if (0 < o && o < 1) {
-                        m = this.interpolate(p, n, k, j, o);
-                        e = Math.min(e, m);
-                        l = Math.max(l, m)
-                    }
-                }
-            }
-        }
-        h[0] = e;
-        h[1] = l
-    },
-    interpolate: function(f, e, j, i, g) {
-        if (g === 0) {
-            return f
-        }
-        if (g === 1) {
-            return i
-        }
-        var h = (1 - g) / g;
-        return g * g * g * (i + h * (3 * j + h * (3 * e + h * f)))
-    },
-    fromStripes: function(g) {
-        var e = this,
-            c = 0,
-            d = g.length,
-            b, a, f;
-        e.clear();
-        for (; c < d; c++) {
-            f = g[c];
-            e.params.push.apply(e.params, f);
-            e.commands.push("M");
-            for (b = 2, a = f.length; b < a; b += 6) {
-                e.commands.push("C")
-            }
-        }
-        if (!e.cursor) {
-            e.cursor = []
-        }
-        e.cursor[0] = e.params[e.params.length - 2];
-        e.cursor[1] = e.params[e.params.length - 1];
-        e.dirt()
-    },
-    toStripes: function(k) {
-        var o = k || [],
-            p, n, m, b, a, h, g, f, e, c = this.commands,
-            d = this.params,
-            l = c.length;
-        for (f = 0, e = 0; f < l; f++) {
-            switch (c[f]) {
-                case "M":
-                    p = [h = b = d[e++], g = a = d[e++]];
-                    o.push(p);
-                    break;
-                case "L":
-                    n = d[e++];
-                    m = d[e++];
-                    p.push((b + b + n) / 3, (a + a + m) / 3, (b + n + n) / 3, (a + m + m) / 3, b = n, a = m);
-                    break;
-                case "C":
-                    p.push(d[e++], d[e++], d[e++], d[e++], b = d[e++], a = d[e++]);
-                    break;
-                case "Z":
-                    n = h;
-                    m = g;
-                    p.push((b + b + n) / 3, (a + a + m) / 3, (b + n + n) / 3, (a + m + m) / 3, b = n, a = m);
-                    break
-            }
-        }
-        return o
-    },
-    updateSvgString: function() {
-        var b = [],
-            a = this.commands,
-            f = this.params,
-            e = a.length,
-            d = 0,
-            c = 0;
-        for (; d < e; d++) {
-            switch (a[d]) {
-                case "M":
-                    b.push("M" + f[c] + "," + f[c + 1]);
-                    c += 2;
-                    break;
-                case "L":
-                    b.push("L" + f[c] + "," + f[c + 1]);
-                    c += 2;
-                    break;
-                case "C":
-                    b.push("C" + f[c] + "," + f[c + 1] + " " + f[c + 2] + "," + f[c + 3] + " " + f[c + 4] + "," + f[c + 5]);
-                    c += 6;
-                    break;
-                case "Z":
-                    b.push("Z");
-                    break
-            }
-        }
-        this.svgString = b.join("")
-    },
-    toString: function() {
-        if (!this.svgString) {
-            this.updateSvgString()
-        }
-        return this.svgString
-    }
-});
-Ext.define("Ext.draw.overrides.Path", {
-    override: "Ext.draw.Path",
-    rayOrigin: {
-        x: -10000,
-        y: -10000
-    },
-    isPointInPath: function(o, n) {
-        var m = this,
-            c = m.commands,
-            q = Ext.draw.PathUtil,
-            p = m.rayOrigin,
-            f = m.params,
-            l = c.length,
-            e = null,
-            d = null,
-            b = 0,
-            a = 0,
-            k = 0,
-            h, g;
-        for (h = 0, g = 0; h < l; h++) {
-            switch (c[h]) {
-                case "M":
-                    if (e !== null) {
-                        if (q.linesIntersection(e, d, b, a, p.x, p.y, o, n)) {
-                            k += 1
-                        }
-                    }
-                    e = b = f[g];
-                    d = a = f[g + 1];
-                    g += 2;
-                    break;
-                case "L":
-                    if (q.linesIntersection(b, a, f[g], f[g + 1], p.x, p.y, o, n)) {
-                        k += 1
-                    }
-                    b = f[g];
-                    a = f[g + 1];
-                    g += 2;
-                    break;
-                case "C":
-                    k += q.cubicLineIntersections(b, f[g], f[g + 2], f[g + 4], a, f[g + 1], f[g + 3], f[g + 5], p.x, p.y, o, n).length;
-                    b = f[g + 4];
-                    a = f[g + 5];
-                    g += 6;
-                    break;
-                case "Z":
-                    if (e !== null) {
-                        if (q.linesIntersection(e, d, b, a, p.x, p.y, o, n)) {
-                            k += 1
-                        }
-                    }
-                    break
-            }
-        }
-        return k % 2 === 1
-    },
-    isPointOnPath: function(n, m) {
-        var l = this,
-            c = l.commands,
-            o = Ext.draw.PathUtil,
-            f = l.params,
-            k = c.length,
-            e = null,
-            d = null,
-            b = 0,
-            a = 0,
-            h, g;
-        for (h = 0, g = 0; h < k; h++) {
-            switch (c[h]) {
-                case "M":
-                    if (e !== null) {
-                        if (o.pointOnLine(e, d, b, a, n, m)) {
-                            return true
-                        }
-                    }
-                    e = b = f[g];
-                    d = a = f[g + 1];
-                    g += 2;
-                    break;
-                case "L":
-                    if (o.pointOnLine(b, a, f[g], f[g + 1], n, m)) {
-                        return true
-                    }
-                    b = f[g];
-                    a = f[g + 1];
-                    g += 2;
-                    break;
-                case "C":
-                    if (o.pointOnCubic(b, f[g], f[g + 2], f[g + 4], a, f[g + 1], f[g + 3], f[g + 5], n, m)) {
-                        return true
-                    }
-                    b = f[g + 4];
-                    a = f[g + 5];
-                    g += 6;
-                    break;
-                case "Z":
-                    if (e !== null) {
-                        if (o.pointOnLine(e, d, b, a, n, m)) {
-                            return true
-                        }
-                    }
-                    break
-            }
-        }
-        return false
-    },
-    getSegmentIntersections: function(t, d, s, c, r, b, o, a) {
-        var w = this,
-            g = arguments.length,
-            v = Ext.draw.PathUtil,
-            f = w.commands,
-            u = w.params,
-            k = f.length,
-            m = null,
-            l = null,
-            h = 0,
-            e = 0,
-            x = [],
-            q, n, p;
-        for (q = 0, n = 0; q < k; q++) {
-            switch (f[q]) {
-                case "M":
-                    if (m !== null) {
-                        switch (g) {
-                            case 4:
-                                p = v.linesIntersection(m, l, h, e, t, d, s, c);
-                                if (p) {
-                                    x.push(p)
-                                }
-                                break;
-                            case 8:
-                                p = v.cubicLineIntersections(t, s, r, o, d, c, b, a, m, l, h, e);
-                                x.push.apply(x, p);
-                                break
-                        }
-                    }
-                    m = h = u[n];
-                    l = e = u[n + 1];
-                    n += 2;
-                    break;
-                case "L":
-                    switch (g) {
-                        case 4:
-                            p = v.linesIntersection(h, e, u[n], u[n + 1], t, d, s, c);
-                            if (p) {
-                                x.push(p)
-                            }
-                            break;
-                        case 8:
-                            p = v.cubicLineIntersections(t, s, r, o, d, c, b, a, h, e, u[n], u[n + 1]);
-                            x.push.apply(x, p);
-                            break
-                    }
-                    h = u[n];
-                    e = u[n + 1];
-                    n += 2;
-                    break;
-                case "C":
-                    switch (g) {
-                        case 4:
-                            p = v.cubicLineIntersections(h, u[n], u[n + 2], u[n + 4], e, u[n + 1], u[n + 3], u[n + 5], t, d, s, c);
-                            x.push.apply(x, p);
-                            break;
-                        case 8:
-                            p = v.cubicsIntersections(h, u[n], u[n + 2], u[n + 4], e, u[n + 1], u[n + 3], u[n + 5], t, s, r, o, d, c, b, a);
-                            x.push.apply(x, p);
-                            break
-                    }
-                    h = u[n + 4];
-                    e = u[n + 5];
-                    n += 6;
-                    break;
-                case "Z":
-                    if (m !== null) {
-                        switch (g) {
-                            case 4:
-                                p = v.linesIntersection(m, l, h, e, t, d, s, c);
-                                if (p) {
-                                    x.push(p)
-                                }
-                                break;
-                            case 8:
-                                p = v.cubicLineIntersections(t, s, r, o, d, c, b, a, m, l, h, e);
-                                x.push.apply(x, p);
-                                break
-                        }
-                    }
-                    break
-            }
-        }
-        return x
-    },
-    getIntersections: function(o) {
-        var m = this,
-            c = m.commands,
-            g = m.params,
-            l = c.length,
-            f = null,
-            e = null,
-            b = 0,
-            a = 0,
-            d = [],
-            k, h, n;
-        for (k = 0, h = 0; k < l; k++) {
-            switch (c[k]) {
-                case "M":
-                    if (f !== null) {
-                        n = o.getSegmentIntersections.call(o, f, e, b, a);
-                        d.push.apply(d, n)
-                    }
-                    f = b = g[h];
-                    e = a = g[h + 1];
-                    h += 2;
-                    break;
-                case "L":
-                    n = o.getSegmentIntersections.call(o, b, a, g[h], g[h + 1]);
-                    d.push.apply(d, n);
-                    b = g[h];
-                    a = g[h + 1];
-                    h += 2;
-                    break;
-                case "C":
-                    n = o.getSegmentIntersections.call(o, b, a, g[h], g[h + 1], g[h + 2], g[h + 3], g[h + 4], g[h + 5]);
-                    d.push.apply(d, n);
-                    b = g[h + 4];
-                    a = g[h + 5];
-                    h += 6;
-                    break;
-                case "Z":
-                    if (f !== null) {
-                        n = o.getSegmentIntersections.call(o, f, e, b, a);
-                        d.push.apply(d, n)
-                    }
-                    break
-            }
-        }
-        return d
-    }
-});
-Ext.define("Ext.draw.sprite.Path", {
-    extend: "Ext.draw.sprite.Sprite",
-    requires: ["Ext.draw.Draw", "Ext.draw.Path"],
-    alias: ["sprite.path", "Ext.draw.Sprite"],
-    type: "path",
-    isPath: true,
-    inheritableStatics: {
-        def: {
-            processors: {
-                path: function(b, a) {
-                    if (!(b instanceof Ext.draw.Path)) {
-                        b = new Ext.draw.Path(b)
-                    }
-                    return b
-                }
-            },
-            aliases: {
-                d: "path"
-            },
-            triggers: {
-                path: "bbox"
-            },
-            updaters: {
-                path: function(a) {
-                    var b = a.path;
-                    if (!b || b.bindAttr !== a) {
-                        b = new Ext.draw.Path();
-                        b.bindAttr = a;
-                        a.path = b
-                    }
-                    b.clear();
-                    this.updatePath(b, a);
-                    this.scheduleUpdater(a, "bbox", ["path"])
-                }
-            }
-        }
-    },
-    updatePlainBBox: function(a) {
-        if (this.attr.path) {
-            this.attr.path.getDimension(a)
-        }
-    },
-    updateTransformedBBox: function(a) {
-        if (this.attr.path) {
-            this.attr.path.getDimensionWithTransform(this.attr.matrix, a)
-        }
-    },
-    render: function(b, c) {
-        var d = this.attr.matrix,
-            a = this.attr;
-        if (!a.path || a.path.params.length === 0) {
-            return
-        }
-        d.toContext(c);
-        c.appendPath(a.path);
-        c.fillStroke(a)
-    },
-    updatePath: function(b, a) {}
-});
-Ext.define("Ext.draw.overrides.sprite.Path", {
-    override: "Ext.draw.sprite.Path",
-    requires: ["Ext.draw.Color"],
-    isPointInPath: function(c, g) {
-        var b = this.attr;
-        if (b.fillStyle === Ext.draw.Color.RGBA_NONE) {
-            return this.isPointOnPath(c, g)
-        }
-        var e = b.path,
-            d = b.matrix,
-            f, a;
-        if (!d.isIdentity()) {
-            f = e.params.slice(0);
-            e.transform(b.matrix)
-        }
-        a = e.isPointInPath(c, g);
-        if (f) {
-            e.params = f
-        }
-        return a
-    },
-    isPointOnPath: function(c, g) {
-        var b = this.attr,
-            e = b.path,
-            d = b.matrix,
-            f, a;
-        if (!d.isIdentity()) {
-            f = e.params.slice(0);
-            e.transform(b.matrix)
-        }
-        a = e.isPointOnPath(c, g);
-        if (f) {
-            e.params = f
-        }
-        return a
-    },
-    hitTest: function(i, l) {
-        var e = this,
-            c = e.attr,
-            k = c.path,
-            g = c.matrix,
-            h = i[0],
-            f = i[1],
-            d = e.callParent([i, l]),
-            j = null,
-            a, b;
-        if (!d) {
-            return j
-        }
-        l = l || Ext.draw.sprite.Sprite.defaultHitTestOptions;
-        if (!g.isIdentity()) {
-            a = k.params.slice(0);
-            k.transform(c.matrix)
-        }
-        if (l.fill && l.stroke) {
-            b = c.fillStyle !== Ext.draw.Color.NONE && c.fillStyle !== Ext.draw.Color.RGBA_NONE;
-            if (b) {
-                if (k.isPointInPath(h, f)) {
-                    j = {
-                        sprite: e
-                    }
-                }
-            } else {
-                if (k.isPointInPath(h, f) || k.isPointOnPath(h, f)) {
-                    j = {
-                        sprite: e
-                    }
-                }
-            }
-        } else {
-            if (l.stroke && !l.fill) {
-                if (k.isPointOnPath(h, f)) {
-                    j = {
-                        sprite: e
-                    }
-                }
-            } else {
-                if (l.fill && !l.stroke) {
-                    if (k.isPointInPath(h, f)) {
-                        j = {
-                            sprite: e
-                        }
-                    }
-                }
-            }
-        }
-        if (a) {
-            k.params = a
-        }
-        return j
-    },
-    getIntersections: function(j) {
-        if (!(j.isSprite && j.isPath)) {
-            return []
-        }
-        var e = this.attr,
-            d = j.attr,
-            i = e.path,
-            h = d.path,
-            g = e.matrix,
-            a = d.matrix,
-            c, f, b;
-        if (!g.isIdentity()) {
-            c = i.params.slice(0);
-            i.transform(e.matrix)
-        }
-        if (!a.isIdentity()) {
-            f = h.params.slice(0);
-            h.transform(d.matrix)
-        }
-        b = i.getIntersections(h);
-        if (c) {
-            i.params = c
-        }
-        if (f) {
-            h.params = f
-        }
-        return b
-    }
-});
-Ext.define("Ext.draw.sprite.Circle", {
-    extend: "Ext.draw.sprite.Path",
-    alias: "sprite.circle",
-    type: "circle",
-    inheritableStatics: {
-        def: {
-            processors: {
-                cx: "number",
-                cy: "number",
-                r: "number"
-            },
-            aliases: {
-                radius: "r",
-                x: "cx",
-                y: "cy",
-                centerX: "cx",
-                centerY: "cy"
-            },
-            defaults: {
-                cx: 0,
-                cy: 0,
-                r: 4
-            },
-            triggers: {
-                cx: "path",
-                cy: "path",
-                r: "path"
-            }
-        }
-    },
-    updatePlainBBox: function(c) {
-        var b = this.attr,
-            a = b.cx,
-            e = b.cy,
-            d = b.r;
-        c.x = a - d;
-        c.y = e - d;
-        c.width = d + d;
-        c.height = d + d
-    },
-    updateTransformedBBox: function(d) {
-        var g = this.attr,
-            f = g.cx,
-            e = g.cy,
-            a = g.r,
-            h = g.matrix,
-            j = h.getScaleX(),
-            i = h.getScaleY(),
-            c, b;
-        c = j * a;
-        b = i * a;
-        d.x = h.x(f, e) - c;
-        d.y = h.y(f, e) - b;
-        d.width = c + c;
-        d.height = b + b
-    },
-    updatePath: function(b, a) {
-        b.arc(a.cx, a.cy, a.r, 0, Math.PI * 2, false)
-    }
-});
-Ext.define("Ext.draw.sprite.Arc", {
-    extend: "Ext.draw.sprite.Circle",
-    alias: "sprite.arc",
-    type: "arc",
-    inheritableStatics: {
-        def: {
-            processors: {
-                startAngle: "number",
-                endAngle: "number",
-                anticlockwise: "bool"
-            },
-            aliases: {
-                from: "startAngle",
-                to: "endAngle",
-                start: "startAngle",
-                end: "endAngle"
-            },
-            defaults: {
-                startAngle: 0,
-                endAngle: Math.PI * 2,
-                anticlockwise: false
-            },
-            triggers: {
-                startAngle: "path",
-                endAngle: "path",
-                anticlockwise: "path"
-            }
-        }
-    },
-    updatePath: function(b, a) {
-        b.arc(a.cx, a.cy, a.r, a.startAngle, a.endAngle, a.anticlockwise)
-    }
-});
-Ext.define("Ext.draw.sprite.Arrow", {
-    extend: "Ext.draw.sprite.Path",
-    alias: "sprite.arrow",
-    inheritableStatics: {
-        def: {
-            processors: {
-                x: "number",
-                y: "number",
-                size: "number"
-            },
-            defaults: {
-                x: 0,
-                y: 0,
-                size: 4
-            },
-            triggers: {
-                x: "path",
-                y: "path",
-                size: "path"
-            }
-        }
-    },
-    updatePath: function(d, b) {
-        var c = b.size * 1.5,
-            a = b.x - b.lineWidth / 2,
-            e = b.y;
-        d.fromSvgString("M".concat(a - c * 0.7, ",", e - c * 0.4, "l", [c * 0.6, 0, 0, -c * 0.4, c, c * 0.8, -c, c * 0.8, 0, -c * 0.4, -c * 0.6, 0], "z"))
-    }
-});
-Ext.define("Ext.draw.sprite.Composite", {
-    extend: "Ext.draw.sprite.Sprite",
-    alias: "sprite.composite",
-    type: "composite",
-    isComposite: true,
-    config: {
-        sprites: []
-    },
-    constructor: function() {
-        this.sprites = [];
-        this.sprites.map = {};
-        this.callParent(arguments)
-    },
-    add: function(c) {
-        if (!c) {
-            return null
-        }
-        if (!c.isSprite) {
-            c = Ext.create("sprite." + c.type, c);
-            c.setParent(this);
-            c.setSurface(this.getSurface())
-        }
-        var d = this,
-            a = d.attr,
-            b = c.applyTransformations;
-        c.applyTransformations = function() {
-            if (c.attr.dirtyTransform) {
-                a.dirtyTransform = true;
-                a.bbox.plain.dirty = true;
-                a.bbox.transform.dirty = true
-            }
-            b.call(c)
-        };
-        d.sprites.push(c);
-        d.sprites.map[c.id] = c.getId();
-        a.bbox.plain.dirty = true;
-        a.bbox.transform.dirty = true;
-        return c
-    },
-    updateSurface: function(a) {
-        for (var b = 0, c = this.sprites.length; b < c; b++) {
-            this.sprites[b].setSurface(a)
-        }
-    },
-    addAll: function(b) {
-        if (b.isSprite || b.type) {
-            this.add(b)
-        } else {
-            if (Ext.isArray(b)) {
-                var a = 0;
-                while (a < b.length) {
-                    this.add(b[a++])
-                }
-            }
-        }
-    },
-    updatePlainBBox: function(g) {
-        var e = this,
-            b = Infinity,
-            h = -Infinity,
-            f = Infinity,
-            a = -Infinity,
-            j, k, c, d;
-        for (c = 0, d = e.sprites.length; c < d; c++) {
-            j = e.sprites[c];
-            j.applyTransformations();
-            k = j.getBBox();
-            if (b > k.x) {
-                b = k.x
-            }
-            if (h < k.x + k.width) {
-                h = k.x + k.width
-            }
-            if (f > k.y) {
-                f = k.y
-            }
-            if (a < k.y + k.height) {
-                a = k.y + k.height
-            }
-        }
-        g.x = b;
-        g.y = f;
-        g.width = h - b;
-        g.height = a - f
-    },
-    render: function(a, b, f) {
-        var d = this.attr.matrix,
-            c, e;
-        d.toContext(b);
-        for (c = 0, e = this.sprites.length; c < e; c++) {
-            a.renderSprite(this.sprites[c], f)
-        }
-    },
-    destroy: function() {
-        var c = this,
-            d = c.sprites,
-            b = d.length,
-            a;
-        c.callParent();
-        for (a = 0; a < b; a++) {
-            d[a].destroy()
-        }
-        d.length = 0
-    }
-});
-Ext.define("Ext.draw.sprite.Cross", {
-    extend: "Ext.draw.sprite.Path",
-    alias: "sprite.cross",
-    inheritableStatics: {
-        def: {
-            processors: {
-                x: "number",
-                y: "number",
-                size: "number"
-            },
-            defaults: {
-                x: 0,
-                y: 0,
-                size: 4
-            },
-            triggers: {
-                x: "path",
-                y: "path",
-                size: "path"
-            }
-        }
-    },
-    updatePath: function(d, b) {
-        var c = b.size / 1.7,
-            a = b.x - b.lineWidth / 2,
-            e = b.y;
-        d.fromSvgString("M".concat(a - c, ",", e, "l", [-c, -c, c, -c, c, c, c, -c, c, c, -c, c, c, c, -c, c, -c, -c, -c, c, -c, -c, "z"]))
-    }
-});
-Ext.define("Ext.draw.sprite.Diamond", {
-    extend: "Ext.draw.sprite.Path",
-    alias: "sprite.diamond",
-    inheritableStatics: {
-        def: {
-            processors: {
-                x: "number",
-                y: "number",
-                size: "number"
-            },
-            defaults: {
-                x: 0,
-                y: 0,
-                size: 4
-            },
-            triggers: {
-                x: "path",
-                y: "path",
-                size: "path"
-            }
-        }
-    },
-    updatePath: function(d, b) {
-        var c = b.size * 1.25,
-            a = b.x - b.lineWidth / 2,
-            e = b.y;
-        d.fromSvgString(["M", a, e - c, "l", c, c, -c, c, -c, -c, c, -c, "z"])
-    }
-});
-Ext.define("Ext.draw.sprite.Ellipse", {
-    extend: "Ext.draw.sprite.Path",
-    alias: "sprite.ellipse",
-    type: "ellipse",
-    inheritableStatics: {
-        def: {
-            processors: {
-                cx: "number",
-                cy: "number",
-                rx: "number",
-                ry: "number",
-                axisRotation: "number"
-            },
-            aliases: {
-                radius: "r",
-                x: "cx",
-                y: "cy",
-                centerX: "cx",
-                centerY: "cy",
-                radiusX: "rx",
-                radiusY: "ry"
-            },
-            defaults: {
-                cx: 0,
-                cy: 0,
-                rx: 1,
-                ry: 1,
-                axisRotation: 0
-            },
-            triggers: {
-                cx: "path",
-                cy: "path",
-                rx: "path",
-                ry: "path",
-                axisRotation: "path"
-            }
-        }
-    },
-    updatePlainBBox: function(c) {
-        var b = this.attr,
-            a = b.cx,
-            f = b.cy,
-            e = b.rx,
-            d = b.ry;
-        c.x = a - e;
-        c.y = f - d;
-        c.width = e + e;
-        c.height = d + d
-    },
-    updateTransformedBBox: function(d) {
-        var i = this.attr,
-            f = i.cx,
-            e = i.cy,
-            c = i.rx,
-            b = i.ry,
-            l = b / c,
-            m = i.matrix.clone(),
-            a, q, k, j, p, o, n, g;
-        m.append(1, 0, 0, l, 0, e * (1 - l));
-        a = m.getXX();
-        k = m.getYX();
-        p = m.getDX();
-        q = m.getXY();
-        j = m.getYY();
-        o = m.getDY();
-        n = Math.sqrt(a * a + k * k) * c;
-        g = Math.sqrt(q * q + j * j) * c;
-        d.x = f * a + e * k + p - n;
-        d.y = f * q + e * j + o - g;
-        d.width = n + n;
-        d.height = g + g
-    },
-    updatePath: function(b, a) {
-        b.ellipse(a.cx, a.cy, a.rx, a.ry, a.axisRotation, 0, Math.PI * 2, false)
-    }
-});
-Ext.define("Ext.draw.sprite.EllipticalArc", {
-    extend: "Ext.draw.sprite.Ellipse",
-    alias: "sprite.ellipticalArc",
-    type: "ellipticalArc",
-    inheritableStatics: {
-        def: {
-            processors: {
-                startAngle: "number",
-                endAngle: "number",
-                anticlockwise: "bool"
-            },
-            aliases: {
-                from: "startAngle",
-                to: "endAngle",
-                start: "startAngle",
-                end: "endAngle"
-            },
-            defaults: {
-                startAngle: 0,
-                endAngle: Math.PI * 2,
-                anticlockwise: false
-            },
-            triggers: {
-                startAngle: "path",
-                endAngle: "path",
-                anticlockwise: "path"
-            }
-        }
-    },
-    updatePath: function(b, a) {
-        b.ellipse(a.cx, a.cy, a.rx, a.ry, a.axisRotation, a.startAngle, a.endAngle, a.anticlockwise)
-    }
-});
-Ext.define("Ext.draw.sprite.Rect", {
-    extend: "Ext.draw.sprite.Path",
-    alias: "sprite.rect",
-    type: "rect",
-    inheritableStatics: {
-        def: {
-            processors: {
-                x: "number",
-                y: "number",
-                width: "number",
-                height: "number",
-                radius: "number"
-            },
-            aliases: {},
-            triggers: {
-                x: "path",
-                y: "path",
-                width: "path",
-                height: "path",
-                radius: "path"
-            },
-            defaults: {
-                x: 0,
-                y: 0,
-                width: 8,
-                height: 8,
-                radius: 0
-            }
-        }
-    },
-    updatePlainBBox: function(b) {
-        var a = this.attr;
-        b.x = a.x;
-        b.y = a.y;
-        b.width = a.width;
-        b.height = a.height
-    },
-    updateTransformedBBox: function(a, b) {
-        this.attr.matrix.transformBBox(b, this.attr.radius, a)
-    },
-    updatePath: function(f, d) {
-        var c = d.x,
-            g = d.y,
-            e = d.width,
-            b = d.height,
-            a = Math.min(d.radius, Math.abs(d.height) * 0.5, Math.abs(d.width) * 0.5);
-        if (a === 0) {
-            f.rect(c, g, e, b)
-        } else {
-            f.moveTo(c + a, g);
-            f.arcTo(c + e, g, c + e, g + b, a);
-            f.arcTo(c + e, g + b, c, g + b, a);
-            f.arcTo(c, g + b, c, g, a);
-            f.arcTo(c, g, c + a, g, a)
-        }
-    }
-});
-Ext.define("Ext.draw.sprite.Image", {
-    extend: "Ext.draw.sprite.Rect",
-    alias: "sprite.image",
-    type: "image",
-    statics: {
-        imageLoaders: {}
-    },
-    inheritableStatics: {
-        def: {
-            processors: {
-                src: "string"
-            },
-            defaults: {
-                src: "",
-                width: null,
-                height: null
-            }
-        }
-    },
-    render: function(c, o) {
-        var j = this,
-            h = j.attr,
-            n = h.matrix,
-            a = h.src,
-            l = h.x,
-            k = h.y,
-            b = h.width,
-            m = h.height,
-            g = Ext.draw.sprite.Image.imageLoaders[a],
-            f, d, e;
-        if (g && g.done) {
-            n.toContext(o);
-            d = g.image;
-            o.drawImage(d, l, k, b || (d.naturalWidth || d.width) / c.devicePixelRatio, m || (d.naturalHeight || d.height) / c.devicePixelRatio)
-        } else {
-            if (!g) {
-                f = new Image();
-                g = Ext.draw.sprite.Image.imageLoaders[a] = {
-                    image: f,
-                    done: false,
-                    pendingSprites: [j],
-                    pendingSurfaces: [c]
-                };
-                f.width = b;
-                f.height = m;
-                f.onload = function() {
-                    if (!g.done) {
-                        g.done = true;
-                        for (e = 0; e < g.pendingSprites.length; e++) {
-                            g.pendingSprites[e].setDirty(true)
-                        }
-                        for (e in g.pendingSurfaces) {
-                            g.pendingSurfaces[e].renderFrame()
-                        }
-                    }
-                };
-                f.src = a
-            } else {
-                Ext.Array.include(g.pendingSprites, j);
-                Ext.Array.include(g.pendingSurfaces, c)
-            }
-        }
-    }
-});
-Ext.define("Ext.draw.sprite.Instancing", {
-    extend: "Ext.draw.sprite.Sprite",
-    alias: "sprite.instancing",
-    type: "instancing",
-    isInstancing: true,
-    config: {
-        template: null
-    },
-    instances: null,
-    applyTemplate: function(a) {
-        if (!a.isSprite) {
-            if (!a.xclass && !a.type) {
-                a.type = "circle"
-            }
-            a = Ext.create(a.xclass || "sprite." + a.type, a)
-        }
-        a.setParent(this);
-        return a
-    },
-    updateTemplate: function(a, b) {
-        if (b) {
-            delete b.ownAttr
-        }
-        a.setSurface(this.getSurface());
-        a.ownAttr = a.attr;
-        this.clearAll()
-    },
-    updateSurface: function(a) {
-        var b = this.getTemplate();
-        if (b) {
-            b.setSurface(a)
-        }
-    },
-    get: function(a) {
-        return this.instances[a]
-    },
-    getCount: function() {
-        return this.instances.length
-    },
-    clearAll: function() {
-        var a = this.getTemplate();
-        a.attr.children = this.instances = [];
-        this.position = 0
-    },
-    createInstance: function(d, f, c) {
-        var e = this.getTemplate(),
-            b = e.attr,
-            a = Ext.Object.chain(b);
-        e.topModifier.prepareAttributes(a);
-        e.attr = a;
-        e.setAttributes(d, f, c);
-        a.template = e;
-        this.instances.push(a);
-        e.attr = b;
-        this.position++;
-        return a
-    },
-    getBBox: function() {
-        return null
-    },
-    getBBoxFor: function(b, d) {
-        var c = this.getTemplate(),
-            a = c.attr,
-            e;
-        c.attr = this.instances[b];
-        e = c.getBBox(d);
-        c.attr = a;
-        return e
-    },
-    isVisible: function() {
-        var b = this.attr,
-            c = this.getParent(),
-            a;
-        a = c && c.isSurface && !b.hidden && b.globalAlpha;
-        return !!a
-    },
-    isInstanceVisible: function(c) {
-        var e = this,
-            d = e.getTemplate(),
-            b = d.attr,
-            f = e.instances,
-            a = false;
-        if (!Ext.isNumber(c) || c < 0 || c >= f.length || !e.isVisible()) {
-            return a
-        }
-        d.attr = f[c];
-        a = d.isVisible(point, options);
-        d.attr = b;
-        return a
-    },
-    render: function(b, l, d, h) {
-        var g = this,
-            j = g.getTemplate(),
-            k = g.attr.matrix,
-            c = j.attr,
-            a = g.instances,
-            e, f = g.position;
-        k.toContext(l);
-        j.preRender(b, l, d, h);
-        j.useAttributes(l, h);
-        for (e = 0; e < f; e++) {
-            if (a[e].dirtyZIndex) {
-                break
-            }
-        }
-        for (e = 0; e < f; e++) {
-            if (a[e].hidden) {
-                continue
-            }
-            l.save();
-            j.attr = a[e];
-            j.useAttributes(l, h);
-            j.render(b, l, d, h);
-            l.restore()
-        }
-        j.attr = c
-    },
-    setAttributesFor: function(c, e, f) {
-        var d = this.getTemplate(),
-            b = d.attr,
-            a = this.instances[c];
-        if (!a) {
-            return
-        }
-        d.attr = a;
-        if (f) {
-            e = Ext.apply({}, e)
-        } else {
-            e = d.self.def.normalize(e)
-        }
-        d.topModifier.pushDown(a, e);
-        d.attr = b
-    },
-    destroy: function() {
-        var b = this,
-            a = b.getTemplate();
-        b.instances = null;
-        if (a) {
-            a.destroy()
-        }
-        b.callParent()
-    }
-});
-Ext.define("Ext.draw.overrides.sprite.Instancing", {
-    override: "Ext.draw.sprite.Instancing",
-    hitTest: function(f, j) {
-        var e = this,
-            g = e.getTemplate(),
-            b = g.attr,
-            a = e.instances,
-            d = a.length,
-            c = 0,
-            h = null;
-        if (!e.isVisible()) {
-            return h
-        }
-        for (; c < d; c++) {
-            g.attr = a[c];
-            h = g.hitTest(f, j);
-            if (h) {
-                h.isInstance = true;
-                h.template = h.sprite;
-                h.sprite = this;
-                h.instance = a[c];
-                h.index = c;
-                return h
-            }
-        }
-        g.attr = b;
-        return h
-    }
-});
-Ext.define("Ext.draw.sprite.Line", {
-    extend: "Ext.draw.sprite.Sprite",
-    alias: "sprite.line",
-    type: "line",
-    inheritableStatics: {
-        def: {
-            processors: {
-                fromX: "number",
-                fromY: "number",
-                toX: "number",
-                toY: "number"
-            },
-            defaults: {
-                fromX: 0,
-                fromY: 0,
-                toX: 1,
-                toY: 1,
-                strokeStyle: "black"
-            },
-            aliases: {
-                x1: "fromX",
-                y1: "fromY",
-                x2: "toX",
-                y2: "toY"
-            }
-        }
-    },
-    updateLineBBox: function(b, i, s, g, r, f) {
-        var o = this.attr,
-            q = o.matrix,
-            h = o.lineWidth / 2,
-            m, l, d, c, k, j, n;
-        if (i) {
-            n = q.transformPoint([s, g]);
-            s = n[0];
-            g = n[1];
-            n = q.transformPoint([r, f]);
-            r = n[0];
-            f = n[1]
-        }
-        m = Math.min(s, r);
-        d = Math.max(s, r);
-        l = Math.min(g, f);
-        c = Math.max(g, f);
-        var t = Math.atan2(d - m, c - l),
-            a = Math.sin(t),
-            e = Math.cos(t),
-            k = h * e,
-            j = h * a;
-        m -= k;
-        l -= j;
-        d += k;
-        c += j;
-        b.x = m;
-        b.y = l;
-        b.width = d - m;
-        b.height = c - l
-    },
-    updatePlainBBox: function(b) {
-        var a = this.attr;
-        this.updateLineBBox(b, false, a.fromX, a.fromY, a.toX, a.toY)
-    },
-    updateTransformedBBox: function(b, c) {
-        var a = this.attr;
-        this.updateLineBBox(b, true, a.fromX, a.fromY, a.toX, a.toY)
-    },
-    render: function(b, c) {
-        var a = this.attr,
-            d = this.attr.matrix;
-        d.toContext(c);
-        c.beginPath();
-        c.moveTo(a.fromX, a.fromY);
-        c.lineTo(a.toX, a.toY);
-        c.stroke()
-    }
-});
-Ext.define("Ext.draw.sprite.Plus", {
-    extend: "Ext.draw.sprite.Path",
-    alias: "sprite.plus",
-    inheritableStatics: {
-        def: {
-            processors: {
-                x: "number",
-                y: "number",
-                size: "number"
-            },
-            defaults: {
-                x: 0,
-                y: 0,
-                size: 4
-            },
-            triggers: {
-                x: "path",
-                y: "path",
-                size: "path"
-            }
-        }
-    },
-    updatePath: function(d, b) {
-        var c = b.size / 1.3,
-            a = b.x - b.lineWidth / 2,
-            e = b.y;
-        d.fromSvgString("M".concat(a - c / 2, ",", e - c / 2, "l", [0, -c, c, 0, 0, c, c, 0, 0, c, -c, 0, 0, c, -c, 0, 0, -c, -c, 0, 0, -c, "z"]))
-    }
-});
-Ext.define("Ext.draw.sprite.Sector", {
-    extend: "Ext.draw.sprite.Path",
-    alias: "sprite.sector",
-    type: "sector",
-    inheritableStatics: {
-        def: {
-            processors: {
-                centerX: "number",
-                centerY: "number",
-                startAngle: "number",
-                endAngle: "number",
-                startRho: "number",
-                endRho: "number",
-                margin: "number"
-            },
-            aliases: {
-                rho: "endRho"
-            },
-            triggers: {
-                centerX: "path,bbox",
-                centerY: "path,bbox",
-                startAngle: "path,bbox",
-                endAngle: "path,bbox",
-                startRho: "path,bbox",
-                endRho: "path,bbox",
-                margin: "path,bbox"
-            },
-            defaults: {
-                centerX: 0,
-                centerY: 0,
-                startAngle: 0,
-                endAngle: 0,
-                startRho: 0,
-                endRho: 150,
-                margin: 0,
-                path: "M 0,0"
-            }
-        }
-    },
-    getMidAngle: function() {
-        return this.midAngle || 0
-    },
-    updatePath: function(j, h) {
-        var g = Math.min(h.startAngle, h.endAngle),
-            c = Math.max(h.startAngle, h.endAngle),
-            b = this.midAngle = (g + c) * 0.5,
-            d = h.margin,
-            f = h.centerX,
-            e = h.centerY,
-            i = Math.min(h.startRho, h.endRho),
-            a = Math.max(h.startRho, h.endRho);
-        if (d) {
-            f += d * Math.cos(b);
-            e += d * Math.sin(b)
-        }
-        j.moveTo(f + i * Math.cos(g), e + i * Math.sin(g));
-        j.lineTo(f + a * Math.cos(g), e + a * Math.sin(g));
-        j.arc(f, e, a, g, c, false);
-        j.lineTo(f + i * Math.cos(c), e + i * Math.sin(c));
-        j.arc(f, e, i, c, g, true)
-    }
-});
-Ext.define("Ext.draw.sprite.Square", {
-    extend: "Ext.draw.sprite.Rect",
-    alias: "sprite.square",
-    inheritableStatics: {
-        def: {
-            processors: {
-                size: "number"
-            },
-            defaults: {
-                size: 4
-            },
-            triggers: {
-                size: "size"
-            },
-            updaters: {
-                size: function(a) {
-                    var c = a.size,
-                        b = a.lineWidth / 2;
-                    this.setAttributes({
-                        x: a.x - c - b,
-                        y: a.y - c,
-                        height: 2 * c,
-                        width: 2 * c
-                    })
-                }
-            }
-        }
-    }
-});
-Ext.define("Ext.draw.TextMeasurer", {
-    singleton: true,
-    requires: ["Ext.util.TextMetrics"],
-    measureDiv: null,
-    measureCache: {},
-    precise: Ext.isIE8,
-    measureDivTpl: {
-        tag: "div",
-        style: {
-            overflow: "hidden",
-            position: "relative",
-            "float": "left",
-            width: 0,
-            height: 0
-        },
-        children: {
-            tag: "div",
-            style: {
-                display: "block",
-                position: "absolute",
-                x: -100000,
-                y: -100000,
-                padding: 0,
-                margin: 0,
-                "z-index": -100000,
-                "white-space": "nowrap"
-            }
-        }
-    },
-    actualMeasureText: function(g, b) {
-        var e = Ext.draw.TextMeasurer,
-            f = e.measureDiv,
-            a = 100000,
-            c;
-        if (!f) {
-            var d = Ext.Element.create({
-                style: {
-                    overflow: "hidden",
-                    position: "relative",
-                    "float": "left",
-                    width: 0,
-                    height: 0
-                }
-            });
-            e.measureDiv = f = Ext.Element.create({
-                style: {
-                    position: "absolute",
-                    x: a,
-                    y: a,
-                    "z-index": -a,
-                    "white-space": "nowrap",
-                    display: "block",
-                    padding: 0,
-                    margin: 0
-                }
-            });
-            Ext.getBody().appendChild(d);
-            d.appendChild(f)
-        }
-        if (b) {
-            f.setStyle({
-                font: b,
-                lineHeight: "normal"
-            })
-        }
-        f.setText("(" + g + ")");
-        c = f.getSize();
-        f.setText("()");
-        c.width -= f.getSize().width;
-        return c
-    },
-    measureTextSingleLine: function(h, d) {
-        if (this.precise) {
-            return this.preciseMeasureTextSingleLine(h, d)
-        }
-        h = h.toString();
-        var a = this.measureCache,
-            g = h.split(""),
-            c = 0,
-            j = 0,
-            l, b, e, f, k;
-        if (!a[d]) {
-            a[d] = {}
-        }
-        a = a[d];
-        if (a[h]) {
-            return a[h]
-        }
-        for (e = 0, f = g.length; e < f; e++) {
-            b = g[e];
-            if (!(l = a[b])) {
-                k = this.actualMeasureText(b, d);
-                l = a[b] = k
-            }
-            c += l.width;
-            j = Math.max(j, l.height)
-        }
-        return a[h] = {
-            width: c,
-            height: j
-        }
-    },
-    preciseMeasureTextSingleLine: function(c, a) {
-        c = c.toString();
-        var b = this.measureDiv || (this.measureDiv = Ext.getBody().createChild(this.measureDivTpl).down("div"));
-        b.setStyle({
-            font: a || ""
-        });
-        return Ext.util.TextMetrics.measure(b, c)
-    },
-    measureText: function(e, b) {
-        var h = e.split("\n"),
-            d = h.length,
-            f = 0,
-            a = 0,
-            j, c, g;
-        if (d === 1) {
-            return this.measureTextSingleLine(e, b)
-        }
-        g = [];
-        for (c = 0; c < d; c++) {
-            j = this.measureTextSingleLine(h[c], b);
-            g.push(j);
-            f += j.height;
-            a = Math.max(a, j.width)
-        }
-        return {
-            width: a,
-            height: f,
-            sizes: g
-        }
-    }
-});
-Ext.define("Ext.draw.sprite.Text", function() {
-    var d = {
-        "xx-small": true,
-        "x-small": true,
-        small: true,
-        medium: true,
-        large: true,
-        "x-large": true,
-        "xx-large": true
-    };
-    var b = {
-        normal: true,
-        bold: true,
-        bolder: true,
-        lighter: true,
-        100: true,
-        200: true,
-        300: true,
-        400: true,
-        500: true,
-        600: true,
-        700: true,
-        800: true,
-        900: true
-    };
-    var a = {
-        start: "start",
-        left: "start",
-        center: "center",
-        middle: "center",
-        end: "end",
-        right: "end"
-    };
-    var c = {
-        top: "top",
-        hanging: "hanging",
-        middle: "middle",
-        center: "middle",
-        alphabetic: "alphabetic",
-        ideographic: "ideographic",
-        bottom: "bottom"
-    };
-    return {
-        extend: "Ext.draw.sprite.Sprite",
-        requires: ["Ext.draw.TextMeasurer", "Ext.draw.Color"],
-        alias: "sprite.text",
-        type: "text",
-        lineBreakRe: /\r?\n/g,
-        inheritableStatics: {
-            def: {
-                animationProcessors: {
-                    text: "text"
-                },
-                processors: {
-                    x: "number",
-                    y: "number",
-                    text: "string",
-                    fontSize: function(e) {
-                        if (Ext.isNumber(+e)) {
-                            return e + "px"
-                        } else {
-                            if (e.match(Ext.dom.Element.unitRe)) {
-                                return e
-                            } else {
-                                if (e in d) {
-                                    return e
-                                }
-                            }
-                        }
-                    },
-                    fontStyle: "enums(,italic,oblique)",
-                    fontVariant: "enums(,small-caps)",
-                    fontWeight: function(e) {
-                        if (e in b) {
-                            return String(e)
-                        } else {
-                            return ""
-                        }
-                    },
-                    fontFamily: "string",
-                    textAlign: function(e) {
-                        return a[e] || "center"
-                    },
-                    textBaseline: function(e) {
-                        return c[e] || "alphabetic"
-                    },
-                    font: "string"
-                },
-                aliases: {
-                    "font-size": "fontSize",
-                    "font-family": "fontFamily",
-                    "font-weight": "fontWeight",
-                    "font-variant": "fontVariant",
-                    "text-anchor": "textAlign"
-                },
-                defaults: {
-                    fontStyle: "",
-                    fontVariant: "",
-                    fontWeight: "",
-                    fontSize: "10px",
-                    fontFamily: "sans-serif",
-                    font: "10px sans-serif",
-                    textBaseline: "alphabetic",
-                    textAlign: "start",
-                    strokeStyle: "rgba(0, 0, 0, 0)",
-                    fillStyle: "#000",
-                    x: 0,
-                    y: 0,
-                    text: ""
-                },
-                triggers: {
-                    fontStyle: "fontX,bbox",
-                    fontVariant: "fontX,bbox",
-                    fontWeight: "fontX,bbox",
-                    fontSize: "fontX,bbox",
-                    fontFamily: "fontX,bbox",
-                    font: "font,bbox,canvas",
-                    textBaseline: "bbox",
-                    textAlign: "bbox",
-                    x: "bbox",
-                    y: "bbox",
-                    text: "bbox"
-                },
-                updaters: {
-                    fontX: "makeFontShorthand",
-                    font: "parseFontShorthand"
-                }
-            }
-        },
-        constructor: function(e) {
-            if (e && e.font) {
-                e = Ext.clone(e);
-                for (var f in e) {
-                    if (f !== "font" && f.indexOf("font") === 0) {
-                        delete e[f]
-                    }
-                }
-            }
-            Ext.draw.sprite.Sprite.prototype.constructor.call(this, e)
-        },
-        fontValuesMap: {
-            italic: "fontStyle",
-            oblique: "fontStyle",
-            "small-caps": "fontVariant",
-            bold: "fontWeight",
-            bolder: "fontWeight",
-            lighter: "fontWeight",
-            "100": "fontWeight",
-            "200": "fontWeight",
-            "300": "fontWeight",
-            "400": "fontWeight",
-            "500": "fontWeight",
-            "600": "fontWeight",
-            "700": "fontWeight",
-            "800": "fontWeight",
-            "900": "fontWeight",
-            "xx-small": "fontSize",
-            "x-small": "fontSize",
-            small: "fontSize",
-            medium: "fontSize",
-            large: "fontSize",
-            "x-large": "fontSize",
-            "xx-large": "fontSize"
-        },
-        makeFontShorthand: function(e) {
-            var f = [];
-            if (e.fontStyle) {
-                f.push(e.fontStyle)
-            }
-            if (e.fontVariant) {
-                f.push(e.fontVariant)
-            }
-            if (e.fontWeight) {
-                f.push(e.fontWeight)
-            }
-            if (e.fontSize) {
-                f.push(e.fontSize)
-            }
-            if (e.fontFamily) {
-                f.push(e.fontFamily)
-            }
-            this.setAttributes({
-                font: f.join(" ")
-            }, true)
-        },
-        parseFontShorthand: function(j) {
-            var m = j.font,
-                k = m.length,
-                l = {},
-                n = this.fontValuesMap,
-                e = 0,
-                i, g, f, h;
-            while (e < k && i !== -1) {
-                i = m.indexOf(" ", e);
-                if (i < 0) {
-                    f = m.substr(e)
-                } else {
-                    if (i > e) {
-                        f = m.substr(e, i - e)
-                    } else {
-                        continue
-                    }
-                }
-                g = f.indexOf("/");
-                if (g > 0) {
-                    f = f.substr(0, g)
-                } else {
-                    if (g === 0) {
-                        continue
-                    }
-                }
-                if (f !== "normal" && f !== "inherit") {
-                    h = n[f];
-                    if (h) {
-                        l[h] = f
-                    } else {
-                        if (f.match(Ext.dom.Element.unitRe)) {
-                            l.fontSize = f
-                        } else {
-                            l.fontFamily = m.substr(e);
-                            break
-                        }
-                    }
-                }
-                e = i + 1
-            }
-            if (!l.fontStyle) {
-                l.fontStyle = ""
-            }
-            if (!l.fontVariant) {
-                l.fontVariant = ""
-            }
-            if (!l.fontWeight) {
-                l.fontWeight = ""
-            }
-            this.setAttributes(l, true)
-        },
-        fontProperties: {
-            fontStyle: true,
-            fontVariant: true,
-            fontWeight: true,
-            fontSize: true,
-            fontFamily: true
-        },
-        setAttributes: function(g, i, e) {
-            var f, h;
-            if (g && g.font) {
-                h = {};
-                for (f in g) {
-                    if (!(f in this.fontProperties)) {
-                        h[f] = g[f]
-                    }
-                }
-                g = h
-            }
-            this.callParent([g, i, e])
-        },
-        getBBox: function(g) {
-            var h = this,
-                f = h.attr.bbox.plain,
-                e = h.getSurface();
-            if (f.dirty) {
-                h.updatePlainBBox(f);
-                f.dirty = false
-            }
-            if (e.getInherited().rtl && e.getFlipRtlText()) {
-                h.updatePlainBBox(f, true)
-            }
-            return h.callParent([g])
-        },
-        rtlAlignments: {
-            start: "end",
-            center: "center",
-            end: "start"
-        },
-        updatePlainBBox: function(k, B) {
-            var C = this,
-                w = C.attr,
-                o = w.x,
-                n = w.y,
-                q = [],
-                t = w.font,
-                r = w.text,
-                s = w.textBaseline,
-                l = w.textAlign,
-                u = (B && C.oldSize) ? C.oldSize : (C.oldSize = Ext.draw.TextMeasurer.measureText(r, t)),
-                z = C.getSurface(),
-                p = z.getInherited().rtl,
-                v = p && z.getFlipRtlText(),
-                h = z.getRect(),
-                f = u.sizes,
-                g = u.height,
-                j = u.width,
-                m = f ? f.length : 0,
-                e, A = 0;
-            switch (s) {
-                case "hanging":
-                case "top":
-                    break;
-                case "ideographic":
-                case "bottom":
-                    n -= g;
-                    break;
-                case "alphabetic":
-                    n -= g * 0.8;
-                    break;
-                case "middle":
-                    n -= g * 0.5;
-                    break
-            }
-            if (v) {
-                o = h[2] - h[0] - o;
-                l = C.rtlAlignments[l]
-            }
-            switch (l) {
-                case "start":
-                    if (p) {
-                        for (; A < m; A++) {
-                            e = f[A].width;
-                            q.push(-(j - e))
-                        }
-                    }
-                    break;
-                case "end":
-                    o -= j;
-                    if (p) {
-                        break
-                    }
-                    for (; A < m; A++) {
-                        e = f[A].width;
-                        q.push(j - e)
-                    }
-                    break;
-                case "center":
-                    o -= j * 0.5;
-                    for (; A < m; A++) {
-                        e = f[A].width;
-                        q.push((p ? -1 : 1) * (j - e) * 0.5)
-                    }
-                    break
-            }
-            w.textAlignOffsets = q;
-            k.x = o;
-            k.y = n;
-            k.width = j;
-            k.height = g
-        },
-        setText: function(e) {
-            this.setAttributes({
-                text: e
-            }, true)
-        },
-        render: function(e, q, k) {
-            var h = this,
-                g = h.attr,
-                p = Ext.draw.Matrix.fly(g.matrix.elements.slice(0)),
-                o = h.getBBox(true),
-                s = g.textAlignOffsets,
-                m = Ext.draw.Color.RGBA_NONE,
-                l, j, f, r, n;
-            if (g.text.length === 0) {
-                return
-            }
-            r = g.text.split(h.lineBreakRe);
-            n = o.height / r.length;
-            l = g.bbox.plain.x;
-            j = g.bbox.plain.y + n * 0.78;
-            p.toContext(q);
-            if (e.getInherited().rtl) {
-                l += g.bbox.plain.width
-            }
-            for (f = 0; f < r.length; f++) {
-                if (q.fillStyle !== m) {
-                    q.fillText(r[f], l + (s[f] || 0), j + n * f)
-                }
-                if (q.strokeStyle !== m) {
-                    q.strokeText(r[f], l + (s[f] || 0), j + n * f)
-                }
-            }
-        }
-    }
-});
-Ext.define("Ext.draw.sprite.Tick", {
-    extend: "Ext.draw.sprite.Line",
-    alias: "sprite.tick",
-    inheritableStatics: {
-        def: {
-            processors: {
-                x: "number",
-                y: "number",
-                size: "number"
-            },
-            defaults: {
-                x: 0,
-                y: 0,
-                size: 4
-            },
-            triggers: {
-                x: "tick",
-                y: "tick",
-                size: "tick"
-            },
-            updaters: {
-                tick: function(b) {
-                    var d = b.size * 1.5,
-                        c = b.lineWidth / 2,
-                        a = b.x,
-                        e = b.y;
-                    this.setAttributes({
-                        fromX: a - c,
-                        fromY: e - d,
-                        toX: a - c,
-                        toY: e + d
-                    })
-                }
-            }
-        }
-    }
-});
-Ext.define("Ext.draw.sprite.Triangle", {
-    extend: "Ext.draw.sprite.Path",
-    alias: "sprite.triangle",
-    inheritableStatics: {
-        def: {
-            processors: {
-                x: "number",
-                y: "number",
-                size: "number"
-            },
-            defaults: {
-                x: 0,
-                y: 0,
-                size: 4
-            },
-            triggers: {
-                x: "path",
-                y: "path",
-                size: "path"
-            }
-        }
-    },
-    updatePath: function(d, b) {
-        var c = b.size * 2.2,
-            a = b.x,
-            e = b.y;
-        d.fromSvgString("M".concat(a, ",", e, "m0-", c * 0.58, "l", c * 0.5, ",", c * 0.87, "-", c, ",0z"))
-    }
-});
-Ext.define("Ext.draw.gradient.Linear", {
-    extend: "Ext.draw.gradient.Gradient",
-    requires: ["Ext.draw.Color"],
-    type: "linear",
-    config: {
-        degrees: 0,
-        radians: 0
-    },
-    applyRadians: function(b, a) {
-        if (Ext.isNumber(b)) {
-            return b
-        }
-        return a
-    },
-    applyDegrees: function(b, a) {
-        if (Ext.isNumber(b)) {
-            return b
-        }
-        return a
-    },
-    updateRadians: function(a) {
-        this.setDegrees(Ext.draw.Draw.degrees(a))
-    },
-    updateDegrees: function(a) {
-        this.setRadians(Ext.draw.Draw.rad(a))
-    },
-    generateGradient: function(q, o) {
-        var c = this.getRadians(),
-            p = Math.cos(c),
-            j = Math.sin(c),
-            m = o.width,
-            f = o.height,
-            d = o.x + m * 0.5,
-            b = o.y + f * 0.5,
-            n = this.getStops(),
-            g = n.length,
-            k, a, e;
-        if (Ext.isNumber(d + b) && f > 0 && m > 0) {
-            a = (Math.sqrt(f * f + m * m) * Math.abs(Math.cos(c - Math.atan(f / m)))) / 2;
-            k = q.createLinearGradient(d + p * a, b + j * a, d - p * a, b - j * a);
-            for (e = 0; e < g; e++) {
-                k.addColorStop(n[e].offset, n[e].color)
-            }
-            return k
-        }
-        return Ext.draw.Color.NONE
-    }
-});
-Ext.define("Ext.draw.gradient.Radial", {
-    extend: "Ext.draw.gradient.Gradient",
-    type: "radial",
-    config: {
-        start: {
-            x: 0,
-            y: 0,
-            r: 0
-        },
-        end: {
-            x: 0,
-            y: 0,
-            r: 1
-        }
-    },
-    applyStart: function(a, b) {
-        if (!b) {
-            return a
-        }
-        var c = {
-            x: b.x,
-            y: b.y,
-            r: b.r
-        };
-        if ("x" in a) {
-            c.x = a.x
-        } else {
-            if ("centerX" in a) {
-                c.x = a.centerX
-            }
-        }
-        if ("y" in a) {
-            c.y = a.y
-        } else {
-            if ("centerY" in a) {
-                c.y = a.centerY
-            }
-        }
-        if ("r" in a) {
-            c.r = a.r
-        } else {
-            if ("radius" in a) {
-                c.r = a.radius
-            }
-        }
-        return c
-    },
-    applyEnd: function(b, a) {
-        if (!a) {
-            return b
-        }
-        var c = {
-            x: a.x,
-            y: a.y,
-            r: a.r
-        };
-        if ("x" in b) {
-            c.x = b.x
-        } else {
-            if ("centerX" in b) {
-                c.x = b.centerX
-            }
-        }
-        if ("y" in b) {
-            c.y = b.y
-        } else {
-            if ("centerY" in b) {
-                c.y = b.centerY
-            }
-        }
-        if ("r" in b) {
-            c.r = b.r
-        } else {
-            if ("radius" in b) {
-                c.r = b.radius
-            }
-        }
-        return c
-    },
-    generateGradient: function(n, m) {
-        var a = this.getStart(),
-            b = this.getEnd(),
-            k = m.width * 0.5,
-            d = m.height * 0.5,
-            j = m.x + k,
-            f = m.y + d,
-            g = n.createRadialGradient(j + a.x * k, f + a.y * d, a.r * Math.max(k, d), j + b.x * k, f + b.y * d, b.r * Math.max(k, d)),
-            l = this.getStops(),
-            e = l.length,
-            c;
-        for (c = 0; c < e; c++) {
-            g.addColorStop(l[c].offset, l[c].color)
-        }
-        return g
-    }
-});
-Ext.define("Ext.draw.Surface", {
-    extend: "Ext.draw.SurfaceBase",
-    xtype: "surface",
-    requires: ["Ext.draw.sprite.*", "Ext.draw.gradient.*", "Ext.draw.sprite.AttributeDefinition", "Ext.draw.Matrix", "Ext.draw.Draw"],
-    uses: ["Ext.draw.engine.Canvas"],
-    devicePixelRatio: window.devicePixelRatio || window.screen.deviceXDPI / window.screen.logicalXDPI,
-    deprecated: {
-        "5.1.0": {
-            statics: {
-                methods: {
-                    stableSort: function(a) {
-                        return Ext.Array.sort(a, function(d, c) {
-                            return d.attr.zIndex - c.attr.zIndex
-                        })
-                    }
-                }
-            }
-        }
-    },
-    config: {
-        cls: Ext.baseCSSPrefix + "surface",
-        rect: null,
-        background: null,
-        items: [],
-        dirty: false,
-        flipRtlText: false
-    },
-    isSurface: true,
-    isPendingRenderFrame: false,
-    dirtyPredecessorCount: 0,
-    constructor: function(a) {
-        var b = this;
-        b.predecessors = [];
-        b.successors = [];
-        b.map = {};
-        b.callParent([a]);
-        b.matrix = new Ext.draw.Matrix();
-        b.inverseMatrix = b.matrix.inverse()
-    },
-    roundPixel: function(a) {
-        return Math.round(this.devicePixelRatio * a) / this.devicePixelRatio
-    },
-    waitFor: function(a) {
-        var b = this,
-            c = b.predecessors;
-        if (!Ext.Array.contains(c, a)) {
-            c.push(a);
-            a.successors.push(b);
-            if (a.getDirty()) {
-                b.dirtyPredecessorCount++
-            }
-        }
-    },
-    updateDirty: function(d) {
-        var c = this.successors,
-            e = c.length,
-            b = 0,
-            a;
-        for (; b < e; b++) {
-            a = c[b];
-            if (d) {
-                a.dirtyPredecessorCount++;
-                a.setDirty(true)
-            } else {
-                a.dirtyPredecessorCount--;
-                if (a.dirtyPredecessorCount === 0 && a.isPendingRenderFrame) {
-                    a.renderFrame()
-                }
-            }
-        }
-    },
-    applyBackground: function(a, b) {
-        this.setDirty(true);
-        if (Ext.isString(a)) {
-            a = {
-                fillStyle: a
-            }
-        }
-        return Ext.factory(a, Ext.draw.sprite.Rect, b)
-    },
-    applyRect: function(a, b) {
-        if (b && a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3]) {
-            return
-        }
-        if (Ext.isArray(a)) {
-            return [a[0], a[1], a[2], a[3]]
-        } else {
-            if (Ext.isObject(a)) {
-                return [a.x || a.left, a.y || a.top, a.width || (a.right - a.left), a.height || (a.bottom - a.top)]
-            }
-        }
-    },
-    updateRect: function(i) {
-        var h = this,
-            c = i[0],
-            f = i[1],
-            g = c + i[2],
-            a = f + i[3],
-            e = h.getBackground(),
-            d = h.element;
-        d.setLocalXY(Math.floor(c), Math.floor(f));
-        d.setSize(Math.ceil(g - Math.floor(c)), Math.ceil(a - Math.floor(f)));
-        if (e) {
-            e.setAttributes({
-                x: 0,
-                y: 0,
-                width: Math.ceil(g - Math.floor(c)),
-                height: Math.ceil(a - Math.floor(f))
-            })
-        }
-        h.setDirty(true)
-    },
-    resetTransform: function() {
-        this.matrix.set(1, 0, 0, 1, 0, 0);
-        this.inverseMatrix.set(1, 0, 0, 1, 0, 0);
-        this.setDirty(true)
-    },
-    get: function(a) {
-        return this.map[a] || this.getItems()[a]
-    },
-    add: function() {
-        var g = this,
-            e = Array.prototype.slice.call(arguments),
-            j = Ext.isArray(e[0]),
-            a = g.map,
-            c = [],
-            f, k, h, b, d;
-        f = Ext.Array.clean(j ? e[0] : e);
-        if (!f.length) {
-            return c
-        }
-        for (b = 0, d = f.length; b < d; b++) {
-            k = f[b];
-            h = null;
-            if (k.isSprite && !a[k.getId()]) {
-                h = k
-            } else {
-                if (!a[k.id]) {
-                    h = this.createItem(k)
-                }
-            }
-            if (h) {
-                a[h.getId()] = h;
-                c.push(h);
-                h.setParent(g);
-                h.setSurface(g);
-                g.onAdd(h)
-            }
-        }
-        f = g.getItems();
-        if (f) {
-            f.push.apply(f, c)
-        }
-        g.dirtyZIndex = true;
-        g.setDirty(true);
-        if (!j && c.length === 1) {
-            return c[0]
-        } else {
-            return c
-        }
-    },
-    onAdd: Ext.emptyFn,
-    remove: function(a, c) {
-        var b = this,
-            e, d;
-        if (a) {
-            if (a.charAt) {
-                a = b.map[a]
-            }
-            if (!a || !a.isSprite) {
-                return null
-            }
-            if (a.isDestroyed || a.isDestroying) {
-                return a
-            }
-            e = a.getId();
-            d = b.map[e];
-            delete b.map[e];
-            if (c) {
-                a.destroy()
-            }
-            if (!d) {
-                return a
-            }
-            a.setParent(null);
-            a.setSurface(null);
-            Ext.Array.remove(b.getItems(), a);
-            b.dirtyZIndex = true;
-            b.setDirty(true)
-        }
-        return a || null
-    },
-    removeAll: function(d) {
-        var a = this.getItems(),
-            b = a.length - 1,
-            c;
-        if (d) {
-            for (; b >= 0; b--) {
-                a[b].destroy()
-            }
-        } else {
-            for (; b >= 0; b--) {
-                c = a[b];
-                c.setParent(null);
-                c.setSurface(null)
-            }
-        }
-        a.length = 0;
-        this.map = {};
-        this.dirtyZIndex = true
-    },
-    applyItems: function(a) {
-        if (this.getItems()) {
-            this.removeAll(true)
-        }
-        return Ext.Array.from(this.add(a))
-    },
-    createItem: function(a) {
-        return Ext.create(a.xclass || "sprite." + a.type, a)
-    },
-    getBBox: function(f, b) {
-        var f = Ext.Array.from(f),
-            c = Infinity,
-            h = -Infinity,
-            g = Infinity,
-            a = -Infinity,
-            j, k, d, e;
-        for (d = 0, e = f.length; d < e; d++) {
-            j = f[d];
-            k = j.getBBox(b);
-            if (c > k.x) {
-                c = k.x
-            }
-            if (h < k.x + k.width) {
-                h = k.x + k.width
-            }
-            if (g > k.y) {
-                g = k.y
-            }
-            if (a < k.y + k.height) {
-                a = k.y + k.height
-            }
-        }
-        return {
-            x: c,
-            y: g,
-            width: h - c,
-            height: a - g
-        }
-    },
-    emptyRect: [0, 0, 0, 0],
-    getEventXY: function(d) {
-        var g = this,
-            f = g.getInherited().rtl,
-            c = d.getXY(),
-            a = g.getOwnerBody(),
-            i = a.getXY(),
-            h = g.getRect() || g.emptyRect,
-            j = [],
-            b;
-        if (f) {
-            b = a.getWidth();
-            j[0] = i[0] - c[0] - h[0] + b
-        } else {
-            j[0] = c[0] - i[0] - h[0]
-        }
-        j[1] = c[1] - i[1] - h[1];
-        return j
-    },
-    clear: Ext.emptyFn,
-    orderByZIndex: function() {
-        var d = this,
-            a = d.getItems(),
-            e = false,
-            b, c;
-        if (d.getDirty()) {
-            for (b = 0, c = a.length; b < c; b++) {
-                if (a[b].attr.dirtyZIndex) {
-                    e = true;
-                    break
-                }
-            }
-            if (e) {
-                Ext.Array.sort(a, function(g, f) {
-                    return g.attr.zIndex - f.attr.zIndex
-                });
-                this.setDirty(true)
-            }
-            for (b = 0, c = a.length; b < c; b++) {
-                a[b].attr.dirtyZIndex = false
-            }
-        }
-    },
-    repaint: function() {
-        var a = this;
-        a.repaint = Ext.emptyFn;
-        Ext.defer(function() {
-            delete a.repaint;
-            a.element.repaint()
-        }, 1)
-    },
-    renderFrame: function() {
-        var g = this;
-        if (!g.element) {
-            return
-        }
-        if (g.dirtyPredecessorCount > 0) {
-            g.isPendingRenderFrame = true;
-            return
-        }
-        var f = g.getRect(),
-            c = g.getBackground(),
-            a = g.getItems(),
-            e, b, d;
-        if (!f) {
-            return
-        }
-        g.orderByZIndex();
-        if (g.getDirty()) {
-            g.clear();
-            g.clearTransform();
-            if (c) {
-                g.renderSprite(c)
-            }
-            for (b = 0, d = a.length; b < d; b++) {
-                e = a[b];
-                if (g.renderSprite(e) === false) {
-                    return
-                }
-                e.attr.textPositionCount = g.textPosition
-            }
-            g.setDirty(false)
-        }
-    },
-    renderSprite: Ext.emptyFn,
-    clearTransform: Ext.emptyFn,
-    destroy: function() {
-        var a = this;
-        a.removeAll(true);
-        a.predecessors = null;
-        a.successors = null;
-        a.callParent()
-    }
-});
-Ext.define("Ext.draw.overrides.Surface", {
-    override: "Ext.draw.Surface",
-    hitTest: function(b, c) {
-        var f = this,
-            g = f.getItems(),
-            e, d, a;
-        c = c || Ext.draw.sprite.Sprite.defaultHitTestOptions;
-        for (e = g.length - 1; e >= 0; e--) {
-            d = g[e];
-            if (d.hitTest) {
-                a = d.hitTest(b, c);
-                if (a) {
-                    return a
-                }
-            }
-        }
-        return null
-    },
-    hitTestEvent: function(b, a) {
-        var c = this.getEventXY(b);
-        return this.hitTest(c, a)
-    }
-});
-Ext.define("Ext.draw.engine.SvgContext", {
-    requires: ["Ext.draw.Color"],
-    toSave: ["strokeOpacity", "strokeStyle", "fillOpacity", "fillStyle", "globalAlpha", "lineWidth", "lineCap", "lineJoin", "lineDash", "lineDashOffset", "miterLimit", "shadowOffsetX", "shadowOffsetY", "shadowBlur", "shadowColor", "globalCompositeOperation", "position", "fillGradient", "strokeGradient"],
-    strokeOpacity: 1,
-    strokeStyle: "none",
-    fillOpacity: 1,
-    fillStyle: "none",
-    lineDash: [],
-    lineDashOffset: 0,
-    globalAlpha: 1,
-    lineWidth: 1,
-    lineCap: "butt",
-    lineJoin: "miter",
-    miterLimit: 10,
-    shadowOffsetX: 0,
-    shadowOffsetY: 0,
-    shadowBlur: 0,
-    shadowColor: "none",
-    globalCompositeOperation: "src",
-    urlStringRe: /^url\(#([\w\-]+)\)$/,
-    constructor: function(a) {
-        this.surface = a;
-        this.state = [];
-        this.matrix = new Ext.draw.Matrix();
-        this.path = null;
-        this.clear()
-    },
-    clear: function() {
-        this.group = this.surface.mainGroup;
-        this.position = 0;
-        this.path = null
-    },
-    getElement: function(a) {
-        return this.surface.getSvgElement(this.group, a, this.position++)
-    },
-    removeElement: function(d) {
-        var d = Ext.fly(d),
-            h, g, b, f, a, e, c;
-        if (!d) {
-            return
-        }
-        if (d.dom.tagName === "g") {
-            a = d.dom.gradients;
-            for (c in a) {
-                a[c].destroy()
-            }
-        } else {
-            h = d.getAttribute("fill");
-            g = d.getAttribute("stroke");
-            b = h && h.match(this.urlStringRe);
-            f = g && g.match(this.urlStringRe);
-            if (b && b[1]) {
-                e = Ext.fly(b[1]);
-                if (e) {
-                    e.destroy()
-                }
-            }
-            if (f && f[1]) {
-                e = Ext.fly(f[1]);
-                if (e) {
-                    e.destroy()
-                }
-            }
-        }
-        d.destroy()
-    },
-    save: function() {
-        var c = this.toSave,
-            e = {},
-            d = this.getElement("g"),
-            b, a;
-        for (a = 0; a < c.length; a++) {
-            b = c[a];
-            if (b in this) {
-                e[b] = this[b]
-            }
-        }
-        this.position = 0;
-        e.matrix = this.matrix.clone();
-        this.state.push(e);
-        this.group = d;
-        return d
-    },
-    restore: function() {
-        var d = this.toSave,
-            e = this.state.pop(),
-            c = this.group.dom.childNodes,
-            b, a;
-        while (c.length > this.position) {
-            this.removeElement(c[c.length - 1])
-        }
-        for (a = 0; a < d.length; a++) {
-            b = d[a];
-            if (b in e) {
-                this[b] = e[b]
-            } else {
-                delete this[b]
-            }
-        }
-        this.setTransform.apply(this, e.matrix.elements);
-        this.group = this.group.getParent()
-    },
-    transform: function(f, b, e, g, d, c) {
-        if (this.path) {
-            var a = Ext.draw.Matrix.fly([f, b, e, g, d, c]).inverse();
-            this.path.transform(a)
-        }
-        this.matrix.append(f, b, e, g, d, c)
-    },
-    setTransform: function(e, a, d, f, c, b) {
-        if (this.path) {
-            this.path.transform(this.matrix)
-        }
-        this.matrix.reset();
-        this.transform(e, a, d, f, c, b)
-    },
-    scale: function(a, b) {
-        this.transform(a, 0, 0, b, 0, 0)
-    },
-    rotate: function(d) {
-        var c = Math.cos(d),
-            a = Math.sin(d),
-            b = -Math.sin(d),
-            e = Math.cos(d);
-        this.transform(c, a, b, e, 0, 0)
-    },
-    translate: function(a, b) {
-        this.transform(1, 0, 0, 1, a, b)
-    },
-    setGradientBBox: function(a) {
-        this.bbox = a
-    },
-    beginPath: function() {
-        this.path = new Ext.draw.Path()
-    },
-    moveTo: function(a, b) {
-        if (!this.path) {
-            this.beginPath()
-        }
-        this.path.moveTo(a, b);
-        this.path.element = null
-    },
-    lineTo: function(a, b) {
-        if (!this.path) {
-            this.beginPath()
-        }
-        this.path.lineTo(a, b);
-        this.path.element = null
-    },
-    rect: function(b, d, c, a) {
-        this.moveTo(b, d);
-        this.lineTo(b + c, d);
-        this.lineTo(b + c, d + a);
-        this.lineTo(b, d + a);
-        this.closePath()
-    },
-    strokeRect: function(b, d, c, a) {
-        this.beginPath();
-        this.rect(b, d, c, a);
-        this.stroke()
-    },
-    fillRect: function(b, d, c, a) {
-        this.beginPath();
-        this.rect(b, d, c, a);
-        this.fill()
-    },
-    closePath: function() {
-        if (!this.path) {
-            this.beginPath()
-        }
-        this.path.closePath();
-        this.path.element = null
-    },
-    arcSvg: function(d, a, f, g, c, b, e) {
-        if (!this.path) {
-            this.beginPath()
-        }
-        this.path.arcSvg(d, a, f, g, c, b, e);
-        this.path.element = null
-    },
-    arc: function(b, f, a, d, c, e) {
-        if (!this.path) {
-            this.beginPath()
-        }
-        this.path.arc(b, f, a, d, c, e);
-        this.path.element = null
-    },
-    ellipse: function(a, h, g, f, d, c, b, e) {
-        if (!this.path) {
-            this.beginPath()
-        }
-        this.path.ellipse(a, h, g, f, d, c, b, e);
-        this.path.element = null
-    },
-    arcTo: function(b, e, a, d, g, f, c) {
-        if (!this.path) {
-            this.beginPath()
-        }
-        this.path.arcTo(b, e, a, d, g, f, c);
-        this.path.element = null
-    },
-    bezierCurveTo: function(d, f, b, e, a, c) {
-        if (!this.path) {
-            this.beginPath()
-        }
-        this.path.bezierCurveTo(d, f, b, e, a, c);
-        this.path.element = null
-    },
-    strokeText: function(d, a, e) {
-        d = String(d);
-        if (this.strokeStyle) {
-            var b = this.getElement("text"),
-                c = this.surface.getSvgElement(b, "tspan", 0);
-            this.surface.setElementAttributes(b, {
-                x: a,
-                y: e,
-                transform: this.matrix.toSvg(),
-                stroke: this.strokeStyle,
-                fill: "none",
-                opacity: this.globalAlpha,
-                "stroke-opacity": this.strokeOpacity,
-                style: "font: " + this.font,
-                "stroke-dasharray": this.lineDash.join(","),
-                "stroke-dashoffset": this.lineDashOffset
-            });
-            if (this.lineDash.length) {
-                this.surface.setElementAttributes(b, {
-                    "stroke-dasharray": this.lineDash.join(","),
-                    "stroke-dashoffset": this.lineDashOffset
-                })
-            }
-            if (c.dom.firstChild) {
-                c.dom.removeChild(c.dom.firstChild)
-            }
-            this.surface.setElementAttributes(c, {
-                "alignment-baseline": "alphabetic"
-            });
-            c.dom.appendChild(document.createTextNode(Ext.String.htmlDecode(d)))
-        }
-    },
-    fillText: function(d, a, e) {
-        d = String(d);
-        if (this.fillStyle) {
-            var b = this.getElement("text"),
-                c = this.surface.getSvgElement(b, "tspan", 0);
-            this.surface.setElementAttributes(b, {
-                x: a,
-                y: e,
-                transform: this.matrix.toSvg(),
-                fill: this.fillStyle,
-                opacity: this.globalAlpha,
-                "fill-opacity": this.fillOpacity,
-                style: "font: " + this.font
-            });
-            if (c.dom.firstChild) {
-                c.dom.removeChild(c.dom.firstChild)
-            }
-            this.surface.setElementAttributes(c, {
-                "alignment-baseline": "alphabetic"
-            });
-            c.dom.appendChild(document.createTextNode(Ext.String.htmlDecode(d)))
-        }
-    },
-    drawImage: function(c, k, i, l, e, p, n, a, g) {
-        var f = this,
-            d = f.getElement("image"),
-            j = k,
-            h = i,
-            b = typeof l === "undefined" ? c.width : l,
-            m = typeof e === "undefined" ? c.height : e,
-            o = null;
-        if (typeof g !== "undefined") {
-            o = k + " " + i + " " + l + " " + e;
-            j = p;
-            h = n;
-            b = a;
-            m = g
-        }
-        d.dom.setAttributeNS("http://www.w3.org/1999/xlink", "href", c.src);
-        f.surface.setElementAttributes(d, {
-            viewBox: o,
-            x: j,
-            y: h,
-            width: b,
-            height: m,
-            opacity: f.globalAlpha,
-            transform: f.matrix.toSvg()
-        })
-    },
-    fill: function() {
-        if (!this.path) {
-            return
-        }
-        if (this.fillStyle) {
-            var c, a = this.fillGradient,
-                d = this.bbox,
-                b = this.path.element;
-            if (!b) {
-                c = this.path.toString();
-                b = this.path.element = this.getElement("path");
-                this.surface.setElementAttributes(b, {
-                    d: c,
-                    transform: this.matrix.toSvg()
-                })
-            }
-            this.surface.setElementAttributes(b, {
-                fill: a && d ? a.generateGradient(this, d) : this.fillStyle,
-                "fill-opacity": this.fillOpacity * this.globalAlpha
-            })
-        }
-    },
-    stroke: function() {
-        if (!this.path) {
-            return
-        }
-        if (this.strokeStyle) {
-            var c, b = this.strokeGradient,
-                d = this.bbox,
-                a = this.path.element;
-            if (!a || !this.path.svgString) {
-                c = this.path.toString();
-                if (!c) {
-                    return
-                }
-                a = this.path.element = this.getElement("path");
-                this.surface.setElementAttributes(a, {
-                    fill: "none",
-                    d: c,
-                    transform: this.matrix.toSvg()
-                })
-            }
-            this.surface.setElementAttributes(a, {
-                stroke: b && d ? b.generateGradient(this, d) : this.strokeStyle,
-                "stroke-linecap": this.lineCap,
-                "stroke-linejoin": this.lineJoin,
-                "stroke-width": this.lineWidth,
-                "stroke-opacity": this.strokeOpacity * this.globalAlpha,
-                "stroke-dasharray": this.lineDash.join(","),
-                "stroke-dashoffset": this.lineDashOffset
-            });
-            if (this.lineDash.length) {
-                this.surface.setElementAttributes(a, {
-                    "stroke-dasharray": this.lineDash.join(","),
-                    "stroke-dashoffset": this.lineDashOffset
-                })
-            }
-        }
-    },
-    fillStroke: function(a, e) {
-        var b = this,
-            d = b.fillStyle,
-            g = b.strokeStyle,
-            c = b.fillOpacity,
-            f = b.strokeOpacity;
-        if (e === undefined) {
-            e = a.transformFillStroke
-        }
-        if (!e) {
-            a.inverseMatrix.toContext(b)
-        }
-        if (d && c !== 0) {
-            b.fill()
-        }
-        if (g && f !== 0) {
-            b.stroke()
-        }
-    },
-    appendPath: function(a) {
-        this.path = a.clone()
-    },
-    setLineDash: function(a) {
-        this.lineDash = a
-    },
-    getLineDash: function() {
-        return this.lineDash
-    },
-    createLinearGradient: function(d, g, b, e) {
-        var f = this,
-            c = f.surface.getNextDef("linearGradient"),
-            a = f.group.dom.gradients || (f.group.dom.gradients = {}),
-            h;
-        f.surface.setElementAttributes(c, {
-            x1: d,
-            y1: g,
-            x2: b,
-            y2: e,
-            gradientUnits: "userSpaceOnUse"
-        });
-        h = new Ext.draw.engine.SvgContext.Gradient(f, f.surface, c);
-        a[c.dom.id] = h;
-        return h
-    },
-    createRadialGradient: function(b, j, d, a, i, c) {
-        var g = this,
-            e = g.surface.getNextDef("radialGradient"),
-            f = g.group.dom.gradients || (g.group.dom.gradients = {}),
-            h;
-        g.surface.setElementAttributes(e, {
-            fx: b,
-            fy: j,
-            cx: a,
-            cy: i,
-            r: c,
-            gradientUnits: "userSpaceOnUse"
-        });
-        h = new Ext.draw.engine.SvgContext.Gradient(g, g.surface, e, d / c);
-        f[e.dom.id] = h;
-        return h
-    }
-});
-Ext.define("Ext.draw.engine.SvgContext.Gradient", {
-    statics: {
-        map: {}
-    },
-    constructor: function(c, a, d, b) {
-        var f = this.statics().map,
-            e;
-        e = f[d.dom.id];
-        if (e) {
-            e.element = null
-        }
-        f[d.dom.id] = this;
-        this.ctx = c;
-        this.surface = a;
-        this.element = d;
-        this.position = 0;
-        this.compression = b || 0
-    },
-    addColorStop: function(d, b) {
-        var c = this.surface.getSvgElement(this.element, "stop", this.position++),
-            a = this.compression;
-        this.surface.setElementAttributes(c, {
-            offset: (((1 - a) * d + a) * 100).toFixed(2) + "%",
-            "stop-color": b,
-            "stop-opacity": Ext.draw.Color.fly(b).a.toFixed(15)
-        })
-    },
-    toString: function() {
-        var a = this.element.dom.childNodes;
-        while (a.length > this.position) {
-            Ext.fly(a[a.length - 1]).destroy()
-        }
-        return "url(#" + this.element.getId() + ")"
-    },
-    destroy: function() {
-        var b = this.statics().map,
-            a = this.element;
-        if (a && a.dom) {
-            delete b[a.dom.id];
-            a.destroy()
-        }
-        this.callParent()
-    }
-});
-Ext.define("Ext.draw.engine.Svg", {
-    extend: "Ext.draw.Surface",
-    requires: ["Ext.draw.engine.SvgContext"],
-    statics: {
-        BBoxTextCache: {}
-    },
-    config: {
-        highPrecision: false
-    },
-    getElementConfig: function() {
-        return {
-            reference: "element",
-            style: {
-                position: "absolute"
-            },
-            children: [{
-                reference: "innerElement",
-                style: {
-                    width: "100%",
-                    height: "100%",
-                    position: "relative"
-                },
-                children: [{
-                    tag: "svg",
-                    reference: "svgElement",
-                    namespace: "http://www.w3.org/2000/svg",
-                    width: "100%",
-                    height: "100%",
-                    version: 1.1
-                }]
-            }]
-        }
-    },
-    constructor: function(a) {
-        var b = this;
-        b.callParent([a]);
-        b.mainGroup = b.createSvgNode("g");
-        b.defElement = b.createSvgNode("defs");
-        b.svgElement.appendChild(b.mainGroup);
-        b.svgElement.appendChild(b.defElement);
-        b.ctx = new Ext.draw.engine.SvgContext(b)
-    },
-    createSvgNode: function(a) {
-        var b = document.createElementNS("http://www.w3.org/2000/svg", a);
-        return Ext.get(b)
-    },
-    getSvgElement: function(d, b, a) {
-        var c;
-        if (d.dom.childNodes.length > a) {
-            c = d.dom.childNodes[a];
-            if (c.tagName === b) {
-                return Ext.get(c)
-            } else {
-                Ext.destroy(c)
-            }
-        }
-        c = Ext.get(this.createSvgNode(b));
-        if (a === 0) {
-            d.insertFirst(c)
-        } else {
-            c.insertAfter(Ext.fly(d.dom.childNodes[a - 1]))
-        }
-        c.cache = {};
-        return c
-    },
-    setElementAttributes: function(d, b) {
-        var f = d.dom,
-            a = d.cache,
-            c, e;
-        for (c in b) {
-            e = b[c];
-            if (a[c] !== e) {
-                a[c] = e;
-                f.setAttribute(c, e)
-            }
-        }
-    },
-    getNextDef: function(a) {
-        return this.getSvgElement(this.defElement, a, this.defPosition++)
-    },
-    clearTransform: function() {
-        var a = this;
-        a.mainGroup.set({
-            transform: a.matrix.toSvg()
-        })
-    },
-    clear: function() {
-        this.ctx.clear();
-        this.defPosition = 0
-    },
-    renderSprite: function(b) {
-        var d = this,
-            c = d.getRect(),
-            a = d.ctx;
-        if (b.attr.hidden || b.attr.globalAlpha === 0) {
-            a.save();
-            a.restore();
-            return
-        }
-        b.element = a.save();
-        b.preRender(this);
-        b.useAttributes(a, c);
-        if (false === b.render(this, a, [0, 0, c[2], c[3]])) {
-            return false
-        }
-        b.setDirty(false);
-        a.restore()
-    },
-    flatten: function(e, b) {
-        var c = '<?xml version="1.0" standalone="yes"?>',
-            f = Ext.getClassName(this),
-            a, g, d;
-        c += '<svg version="1.1" baseProfile="full" xmlns="http://www.w3.org/2000/svg" width="' + e.width + '" height="' + e.height + '">';
-        for (d = 0; d < b.length; d++) {
-            a = b[d];
-            if (Ext.getClassName(a) !== f) {
-                continue
-            }
-            g = a.getRect();
-            c += '<g transform="translate(' + g[0] + "," + g[1] + ')">';
-            c += this.serializeNode(a.svgElement.dom);
-            c += "</g>"
-        }
-        c += "</svg>";
-        return {
-            data: "data:image/svg+xml;utf8," + encodeURIComponent(c),
-            type: "svg"
-        }
-    },
-    serializeNode: function(d) {
-        var b = "",
-            c, f, a, e;
-        if (d.nodeType === document.TEXT_NODE) {
-            return d.nodeValue
-        }
-        b += "<" + d.nodeName;
-        if (d.attributes.length) {
-            for (c = 0, f = d.attributes.length; c < f; c++) {
-                a = d.attributes[c];
-                b += " " + a.name + '="' + a.value + '"'
-            }
-        }
-        b += ">";
-        if (d.childNodes && d.childNodes.length) {
-            for (c = 0, f = d.childNodes.length; c < f; c++) {
-                e = d.childNodes[c];
-                b += this.serializeNode(e)
-            }
-        }
-        b += "</" + d.nodeName + ">";
-        return b
-    },
-    destroy: function() {
-        var a = this;
-        a.ctx.destroy();
-        a.mainGroup.destroy();
-        delete a.mainGroup;
-        delete a.ctx;
-        a.callParent()
-    },
-    remove: function(a, b) {
-        if (a && a.element) {
-            if (this.ctx) {
-                this.ctx.removeElement(a.element)
-            } else {
-                a.element.destroy()
-            }
-            a.element = null
-        }
-        this.callParent(arguments)
-    }
-});
-Ext.draw || (Ext.draw = {});
-Ext.draw.engine || (Ext.draw.engine = {});
-Ext.draw.engine.excanvas = true;
-if (!document.createElement("canvas").getContext) {
-    (function() {
-        var ab = Math;
-        var n = ab.round;
-        var l = ab.sin;
-        var A = ab.cos;
-        var H = ab.abs;
-        var N = ab.sqrt;
-        var d = 10;
-        var f = d / 2;
-        var z = +navigator.userAgent.match(/MSIE ([\d.]+)?/)[1];
-
-        function y() {
-            return this.context_ || (this.context_ = new D(this))
-        }
-        var t = Array.prototype.slice;
-
-        function g(j, m, p) {
-            var i = t.call(arguments, 2);
-            return function() {
-                return j.apply(m, i.concat(t.call(arguments)))
-            }
-        }
-
-        function af(i) {
-            return String(i).replace(/&/g, "&amp;").replace(/"/g, "&quot;")
-        }
-
-        function Y(m, j, i) {
-            Ext.onReady(function() {
-                if (!m.namespaces[j]) {
-                    m.namespaces.add(j, i, "#default#VML")
-                }
-            })
-        }
-
-        function R(j) {
-            Y(j, "g_vml_", "urn:schemas-microsoft-com:vml");
-            Y(j, "g_o_", "urn:schemas-microsoft-com:office:office");
-            if (!j.styleSheets.ex_canvas_) {
-                var i = j.createStyleSheet();
-                i.owningElement.id = "ex_canvas_";
-                i.cssText = "canvas{display:inline-block;overflow:hidden;text-align:left;width:300px;height:150px}"
-            }
-        }
-        R(document);
-        var e = {
-            init: function(i) {
-                var j = i || document;
-                j.createElement("canvas");
-                j.attachEvent("onreadystatechange", g(this.init_, this, j))
-            },
-            init_: function(p) {
-                var m = p.getElementsByTagName("canvas");
-                for (var j = 0; j < m.length; j++) {
-                    this.initElement(m[j])
-                }
-            },
-            initElement: function(j) {
-                if (!j.getContext) {
-                    j.getContext = y;
-                    R(j.ownerDocument);
-                    j.innerHTML = "";
-                    j.attachEvent("onpropertychange", x);
-                    j.attachEvent("onresize", W);
-                    var i = j.attributes;
-                    if (i.width && i.width.specified) {
-                        j.style.width = i.width.nodeValue + "px"
-                    } else {
-                        j.width = j.clientWidth
-                    }
-                    if (i.height && i.height.specified) {
-                        j.style.height = i.height.nodeValue + "px"
-                    } else {
-                        j.height = j.clientHeight
-                    }
-                }
-                return j
-            }
-        };
-
-        function x(j) {
-            var i = j.srcElement;
-            switch (j.propertyName) {
-                case "width":
-                    i.getContext().clearRect();
-                    i.style.width = i.attributes.width.nodeValue + "px";
-                    i.firstChild.style.width = i.clientWidth + "px";
-                    break;
-                case "height":
-                    i.getContext().clearRect();
-                    i.style.height = i.attributes.height.nodeValue + "px";
-                    i.firstChild.style.height = i.clientHeight + "px";
-                    break
-            }
-        }
-
-        function W(j) {
-            var i = j.srcElement;
-            if (i.firstChild) {
-                i.firstChild.style.width = i.clientWidth + "px";
-                i.firstChild.style.height = i.clientHeight + "px"
-            }
-        }
-        e.init();
-        var k = [];
-        for (var ae = 0; ae < 16; ae++) {
-            for (var ad = 0; ad < 16; ad++) {
-                k[ae * 16 + ad] = ae.toString(16) + ad.toString(16)
-            }
-        }
-
-        function B() {
-            return [
-                [1, 0, 0],
-                [0, 1, 0],
-                [0, 0, 1]
-            ]
-        }
-
-        function J(p, m) {
-            var j = B();
-            for (var i = 0; i < 3; i++) {
-                for (var ah = 0; ah < 3; ah++) {
-                    var Z = 0;
-                    for (var ag = 0; ag < 3; ag++) {
-                        Z += p[i][ag] * m[ag][ah]
-                    }
-                    j[i][ah] = Z
-                }
-            }
-            return j
-        }
-
-        function v(j, i) {
-            i.fillStyle = j.fillStyle;
-            i.lineCap = j.lineCap;
-            i.lineJoin = j.lineJoin;
-            i.lineDash = j.lineDash;
-            i.lineWidth = j.lineWidth;
-            i.miterLimit = j.miterLimit;
-            i.shadowBlur = j.shadowBlur;
-            i.shadowColor = j.shadowColor;
-            i.shadowOffsetX = j.shadowOffsetX;
-            i.shadowOffsetY = j.shadowOffsetY;
-            i.strokeStyle = j.strokeStyle;
-            i.globalAlpha = j.globalAlpha;
-            i.font = j.font;
-            i.textAlign = j.textAlign;
-            i.textBaseline = j.textBaseline;
-            i.arcScaleX_ = j.arcScaleX_;
-            i.arcScaleY_ = j.arcScaleY_;
-            i.lineScale_ = j.lineScale_
-        }
-        var b = {
-            aliceblue: "#F0F8FF",
-            antiquewhite: "#FAEBD7",
-            aquamarine: "#7FFFD4",
-            azure: "#F0FFFF",
-            beige: "#F5F5DC",
-            bisque: "#FFE4C4",
-            black: "#000000",
-            blanchedalmond: "#FFEBCD",
-            blueviolet: "#8A2BE2",
-            brown: "#A52A2A",
-            burlywood: "#DEB887",
-            cadetblue: "#5F9EA0",
-            chartreuse: "#7FFF00",
-            chocolate: "#D2691E",
-            coral: "#FF7F50",
-            cornflowerblue: "#6495ED",
-            cornsilk: "#FFF8DC",
-            crimson: "#DC143C",
-            cyan: "#00FFFF",
-            darkblue: "#00008B",
-            darkcyan: "#008B8B",
-            darkgoldenrod: "#B8860B",
-            darkgray: "#A9A9A9",
-            darkgreen: "#006400",
-            darkgrey: "#A9A9A9",
-            darkkhaki: "#BDB76B",
-            darkmagenta: "#8B008B",
-            darkolivegreen: "#556B2F",
-            darkorange: "#FF8C00",
-            darkorchid: "#9932CC",
-            darkred: "#8B0000",
-            darksalmon: "#E9967A",
-            darkseagreen: "#8FBC8F",
-            darkslateblue: "#483D8B",
-            darkslategray: "#2F4F4F",
-            darkslategrey: "#2F4F4F",
-            darkturquoise: "#00CED1",
-            darkviolet: "#9400D3",
-            deeppink: "#FF1493",
-            deepskyblue: "#00BFFF",
-            dimgray: "#696969",
-            dimgrey: "#696969",
-            dodgerblue: "#1E90FF",
-            firebrick: "#B22222",
-            floralwhite: "#FFFAF0",
-            forestgreen: "#228B22",
-            gainsboro: "#DCDCDC",
-            ghostwhite: "#F8F8FF",
-            gold: "#FFD700",
-            goldenrod: "#DAA520",
-            grey: "#808080",
-            greenyellow: "#ADFF2F",
-            honeydew: "#F0FFF0",
-            hotpink: "#FF69B4",
-            indianred: "#CD5C5C",
-            indigo: "#4B0082",
-            ivory: "#FFFFF0",
-            khaki: "#F0E68C",
-            lavender: "#E6E6FA",
-            lavenderblush: "#FFF0F5",
-            lawngreen: "#7CFC00",
-            lemonchiffon: "#FFFACD",
-            lightblue: "#ADD8E6",
-            lightcoral: "#F08080",
-            lightcyan: "#E0FFFF",
-            lightgoldenrodyellow: "#FAFAD2",
-            lightgreen: "#90EE90",
-            lightgrey: "#D3D3D3",
-            lightpink: "#FFB6C1",
-            lightsalmon: "#FFA07A",
-            lightseagreen: "#20B2AA",
-            lightskyblue: "#87CEFA",
-            lightslategray: "#778899",
-            lightslategrey: "#778899",
-            lightsteelblue: "#B0C4DE",
-            lightyellow: "#FFFFE0",
-            limegreen: "#32CD32",
-            linen: "#FAF0E6",
-            magenta: "#FF00FF",
-            mediumaquamarine: "#66CDAA",
-            mediumblue: "#0000CD",
-            mediumorchid: "#BA55D3",
-            mediumpurple: "#9370DB",
-            mediumseagreen: "#3CB371",
-            mediumslateblue: "#7B68EE",
-            mediumspringgreen: "#00FA9A",
-            mediumturquoise: "#48D1CC",
-            mediumvioletred: "#C71585",
-            midnightblue: "#191970",
-            mintcream: "#F5FFFA",
-            mistyrose: "#FFE4E1",
-            moccasin: "#FFE4B5",
-            navajowhite: "#FFDEAD",
-            oldlace: "#FDF5E6",
-            olivedrab: "#6B8E23",
-            orange: "#FFA500",
-            orangered: "#FF4500",
-            orchid: "#DA70D6",
-            palegoldenrod: "#EEE8AA",
-            palegreen: "#98FB98",
-            paleturquoise: "#AFEEEE",
-            palevioletred: "#DB7093",
-            papayawhip: "#FFEFD5",
-            peachpuff: "#FFDAB9",
-            peru: "#CD853F",
-            pink: "#FFC0CB",
-            plum: "#DDA0DD",
-            powderblue: "#B0E0E6",
-            rosybrown: "#BC8F8F",
-            royalblue: "#4169E1",
-            saddlebrown: "#8B4513",
-            salmon: "#FA8072",
-            sandybrown: "#F4A460",
-            seagreen: "#2E8B57",
-            seashell: "#FFF5EE",
-            sienna: "#A0522D",
-            skyblue: "#87CEEB",
-            slateblue: "#6A5ACD",
-            slategray: "#708090",
-            slategrey: "#708090",
-            snow: "#FFFAFA",
-            springgreen: "#00FF7F",
-            steelblue: "#4682B4",
-            tan: "#D2B48C",
-            thistle: "#D8BFD8",
-            tomato: "#FF6347",
-            turquoise: "#40E0D0",
-            violet: "#EE82EE",
-            wheat: "#F5DEB3",
-            whitesmoke: "#F5F5F5",
-            yellowgreen: "#9ACD32"
-        };
-
-        function M(j) {
-            var p = j.indexOf("(", 3);
-            var i = j.indexOf(")", p + 1);
-            var m = j.substring(p + 1, i).split(",");
-            if (m.length != 4 || j.charAt(3) != "a") {
-                m[3] = 1
-            }
-            return m
-        }
-
-        function c(i) {
-            return parseFloat(i) / 100
-        }
-
-        function r(j, m, i) {
-            return Math.min(i, Math.max(m, j))
-        }
-
-        function I(ag) {
-            var i, ai, aj, ah, ak, Z;
-            ah = parseFloat(ag[0]) / 360 % 360;
-            if (ah < 0) {
-                ah++
-            }
-            ak = r(c(ag[1]), 0, 1);
-            Z = r(c(ag[2]), 0, 1);
-            if (ak == 0) {
-                i = ai = aj = Z
-            } else {
-                var j = Z < 0.5 ? Z * (1 + ak) : Z + ak - Z * ak;
-                var m = 2 * Z - j;
-                i = a(m, j, ah + 1 / 3);
-                ai = a(m, j, ah);
-                aj = a(m, j, ah - 1 / 3)
-            }
-            return "#" + k[Math.floor(i * 255)] + k[Math.floor(ai * 255)] + k[Math.floor(aj * 255)]
-        }
-
-        function a(j, i, m) {
-            if (m < 0) {
-                m++
-            }
-            if (m > 1) {
-                m--
-            }
-            if (6 * m < 1) {
-                return j + (i - j) * 6 * m
-            } else {
-                if (2 * m < 1) {
-                    return i
-                } else {
-                    if (3 * m < 2) {
-                        return j + (i - j) * (2 / 3 - m) * 6
-                    } else {
-                        return j
-                    }
-                }
-            }
-        }
-        var C = {};
-
-        function F(j) {
-            if (j in C) {
-                return C[j]
-            }
-            var ag, Z = 1;
-            j = String(j);
-            if (j.charAt(0) == "#") {
-                ag = j
-            } else {
-                if (/^rgb/.test(j)) {
-                    var p = M(j);
-                    var ag = "#",
-                        ah;
-                    for (var m = 0; m < 3; m++) {
-                        if (p[m].indexOf("%") != -1) {
-                            ah = Math.floor(c(p[m]) * 255)
-                        } else {
-                            ah = +p[m]
-                        }
-                        ag += k[r(ah, 0, 255)]
-                    }
-                    Z = +p[3]
-                } else {
-                    if (/^hsl/.test(j)) {
-                        var p = M(j);
-                        ag = I(p);
-                        Z = p[3]
-                    } else {
-                        ag = b[j] || j
-                    }
-                }
-            }
-            return C[j] = {
-                color: ag,
-                alpha: Z
-            }
-        }
-        var o = {
-            style: "normal",
-            variant: "normal",
-            weight: "normal",
-            size: 10,
-            family: "sans-serif"
-        };
-        var L = {};
-
-        function E(i) {
-            if (L[i]) {
-                return L[i]
-            }
-            var p = document.createElement("div");
-            var m = p.style;
-            try {
-                m.font = i
-            } catch (j) {}
-            return L[i] = {
-                style: m.fontStyle || o.style,
-                variant: m.fontVariant || o.variant,
-                weight: m.fontWeight || o.weight,
-                size: m.fontSize || o.size,
-                family: m.fontFamily || o.family
-            }
-        }
-
-        function u(m, j) {
-            var i = {};
-            for (var ah in m) {
-                i[ah] = m[ah]
-            }
-            var ag = parseFloat(j.currentStyle.fontSize),
-                Z = parseFloat(m.size);
-            if (typeof m.size == "number") {
-                i.size = m.size
-            } else {
-                if (m.size.indexOf("px") != -1) {
-                    i.size = Z
-                } else {
-                    if (m.size.indexOf("em") != -1) {
-                        i.size = ag * Z
-                    } else {
-                        if (m.size.indexOf("%") != -1) {
-                            i.size = (ag / 100) * Z
-                        } else {
-                            if (m.size.indexOf("pt") != -1) {
-                                i.size = Z / 0.75
-                            } else {
-                                i.size = ag
-                            }
-                        }
-                    }
-                }
-            }
-            i.size *= 0.981;
-            return i
-        }
-
-        function ac(i) {
-            return i.style + " " + i.variant + " " + i.weight + " " + i.size + "px " + i.family
-        }
-        var s = {
-            butt: "flat",
-            round: "round"
-        };
-
-        function S(i) {
-            return s[i] || "square"
-        }
-
-        function D(i) {
-            this.m_ = B();
-            this.mStack_ = [];
-            this.aStack_ = [];
-            this.currentPath_ = [];
-            this.strokeStyle = "#000";
-            this.fillStyle = "#000";
-            this.lineWidth = 1;
-            this.lineJoin = "miter";
-            this.lineDash = [];
-            this.lineCap = "butt";
-            this.miterLimit = d * 1;
-            this.globalAlpha = 1;
-            this.font = "10px sans-serif";
-            this.textAlign = "left";
-            this.textBaseline = "alphabetic";
-            this.canvas = i;
-            var m = "width:" + i.clientWidth + "px;height:" + i.clientHeight + "px;overflow:hidden;position:absolute";
-            var j = i.ownerDocument.createElement("div");
-            j.style.cssText = m;
-            i.appendChild(j);
-            var p = j.cloneNode(false);
-            p.style.backgroundColor = "red";
-            p.style.filter = "alpha(opacity=0)";
-            i.appendChild(p);
-            this.element_ = j;
-            this.arcScaleX_ = 1;
-            this.arcScaleY_ = 1;
-            this.lineScale_ = 1
-        }
-        var q = D.prototype;
-        q.clearRect = function() {
-            if (this.textMeasureEl_) {
-                this.textMeasureEl_.removeNode(true);
-                this.textMeasureEl_ = null
-            }
-            this.element_.innerHTML = ""
-        };
-        q.beginPath = function() {
-            this.currentPath_ = []
-        };
-        q.moveTo = function(j, i) {
-            var m = V(this, j, i);
-            this.currentPath_.push({
-                type: "moveTo",
-                x: m.x,
-                y: m.y
-            });
-            this.currentX_ = m.x;
-            this.currentY_ = m.y
-        };
-        q.lineTo = function(j, i) {
-            var m = V(this, j, i);
-            this.currentPath_.push({
-                type: "lineTo",
-                x: m.x,
-                y: m.y
-            });
-            this.currentX_ = m.x;
-            this.currentY_ = m.y
-        };
-        q.bezierCurveTo = function(m, j, ak, aj, ai, ag) {
-            var i = V(this, ai, ag);
-            var ah = V(this, m, j);
-            var Z = V(this, ak, aj);
-            K(this, ah, Z, i)
-        };
-
-        function K(i, Z, m, j) {
-            i.currentPath_.push({
-                type: "bezierCurveTo",
-                cp1x: Z.x,
-                cp1y: Z.y,
-                cp2x: m.x,
-                cp2y: m.y,
-                x: j.x,
-                y: j.y
-            });
-            i.currentX_ = j.x;
-            i.currentY_ = j.y
-        }
-        q.quadraticCurveTo = function(ai, m, j, i) {
-            var ah = V(this, ai, m);
-            var ag = V(this, j, i);
-            var aj = {
-                x: this.currentX_ + 2 / 3 * (ah.x - this.currentX_),
-                y: this.currentY_ + 2 / 3 * (ah.y - this.currentY_)
-            };
-            var Z = {
-                x: aj.x + (ag.x - this.currentX_) / 3,
-                y: aj.y + (ag.y - this.currentY_) / 3
-            };
-            K(this, aj, Z, ag)
-        };
-        q.arc = function(al, aj, ak, ag, j, m) {
-            ak *= d;
-            var ap = m ? "at" : "wa";
-            var am = al + A(ag) * ak - f;
-            var ao = aj + l(ag) * ak - f;
-            var i = al + A(j) * ak - f;
-            var an = aj + l(j) * ak - f;
-            if (am == i && !m) {
-                am += 0.125
-            }
-            var Z = V(this, al, aj);
-            var ai = V(this, am, ao);
-            var ah = V(this, i, an);
-            this.currentPath_.push({
-                type: ap,
-                x: Z.x,
-                y: Z.y,
-                radius: ak,
-                xStart: ai.x,
-                yStart: ai.y,
-                xEnd: ah.x,
-                yEnd: ah.y
-            })
-        };
-        q.rect = function(m, j, i, p) {
-            this.moveTo(m, j);
-            this.lineTo(m + i, j);
-            this.lineTo(m + i, j + p);
-            this.lineTo(m, j + p);
-            this.closePath()
-        };
-        q.strokeRect = function(m, j, i, p) {
-            var Z = this.currentPath_;
-            this.beginPath();
-            this.moveTo(m, j);
-            this.lineTo(m + i, j);
-            this.lineTo(m + i, j + p);
-            this.lineTo(m, j + p);
-            this.closePath();
-            this.stroke();
-            this.currentPath_ = Z
-        };
-        q.fillRect = function(m, j, i, p) {
-            var Z = this.currentPath_;
-            this.beginPath();
-            this.moveTo(m, j);
-            this.lineTo(m + i, j);
-            this.lineTo(m + i, j + p);
-            this.lineTo(m, j + p);
-            this.closePath();
-            this.fill();
-            this.currentPath_ = Z
-        };
-        q.createLinearGradient = function(j, p, i, m) {
-            var Z = new U("gradient");
-            Z.x0_ = j;
-            Z.y0_ = p;
-            Z.x1_ = i;
-            Z.y1_ = m;
-            return Z
-        };
-        q.createRadialGradient = function(p, ag, m, j, Z, i) {
-            var ah = new U("gradientradial");
-            ah.x0_ = p;
-            ah.y0_ = ag;
-            ah.r0_ = m;
-            ah.x1_ = j;
-            ah.y1_ = Z;
-            ah.r1_ = i;
-            return ah
-        };
-        q.drawImage = function(an, j) {
-            var ah, Z, aj, ar, al, ak, ao, av;
-            var ai = an.runtimeStyle.width;
-            var am = an.runtimeStyle.height;
-            an.runtimeStyle.width = "auto";
-            an.runtimeStyle.height = "auto";
-            var ag = an.width;
-            var aq = an.height;
-            an.runtimeStyle.width = ai;
-            an.runtimeStyle.height = am;
-            if (arguments.length == 3) {
-                ah = arguments[1];
-                Z = arguments[2];
-                al = ak = 0;
-                ao = aj = ag;
-                av = ar = aq
-            } else {
-                if (arguments.length == 5) {
-                    ah = arguments[1];
-                    Z = arguments[2];
-                    aj = arguments[3];
-                    ar = arguments[4];
-                    al = ak = 0;
-                    ao = ag;
-                    av = aq
-                } else {
-                    if (arguments.length == 9) {
-                        al = arguments[1];
-                        ak = arguments[2];
-                        ao = arguments[3];
-                        av = arguments[4];
-                        ah = arguments[5];
-                        Z = arguments[6];
-                        aj = arguments[7];
-                        ar = arguments[8]
-                    } else {
-                        throw Error("Invalid number of arguments")
-                    }
-                }
-            }
-            var au = V(this, ah, Z);
-            var at = [];
-            var i = 10;
-            var p = 10;
-            var ap = this.m_;
-            at.push(" <g_vml_:group", ' coordsize="', d * i, ",", d * p, '"', ' coordorigin="0,0"', ' style="width:', n(i * ap[0][0]), "px;height:", n(p * ap[1][1]), "px;position:absolute;", "top:", n(au.y / d), "px;left:", n(au.x / d), "px; rotation:", n(Math.atan(ap[0][1] / ap[1][1]) * 180 / Math.PI), ";");
-            at.push('" >', '<g_vml_:image src="', an.src, '"', ' style="width:', d * aj, "px;", " height:", d * ar, 'px"', ' cropleft="', al / ag, '"', ' croptop="', ak / aq, '"', ' cropright="', (ag - al - ao) / ag, '"', ' cropbottom="', (aq - ak - av) / aq, '"', " />", "</g_vml_:group>");
-            this.element_.insertAdjacentHTML("BeforeEnd", at.join(""))
-        };
-        q.setLineDash = function(i) {
-            if (i.length === 1) {
-                i = i.slice();
-                i[1] = i[0]
-            }
-            this.lineDash = i
-        };
-        q.getLineDash = function() {
-            return this.lineDash
-        };
-        q.stroke = function(ak) {
-            var ai = [];
-            var m = 10;
-            var al = 10;
-            ai.push("<g_vml_:shape", ' filled="', !!ak, '"', ' style="position:absolute;width:', m, "px;height:", al, 'px;left:0px;top:0px;"', ' coordorigin="0,0"', ' coordsize="', d * m, ",", d * al, '"', ' stroked="', !ak, '"', ' path="');
-            var Z = {
-                x: null,
-                y: null
-            };
-            var aj = {
-                x: null,
-                y: null
-            };
-            for (var ag = 0; ag < this.currentPath_.length; ag++) {
-                var j = this.currentPath_[ag];
-                var ah;
-                switch (j.type) {
-                    case "moveTo":
-                        ah = j;
-                        ai.push(" m ", n(j.x), ",", n(j.y));
-                        break;
-                    case "lineTo":
-                        ai.push(" l ", n(j.x), ",", n(j.y));
-                        break;
-                    case "close":
-                        ai.push(" x ");
-                        j = null;
-                        break;
-                    case "bezierCurveTo":
-                        ai.push(" c ", n(j.cp1x), ",", n(j.cp1y), ",", n(j.cp2x), ",", n(j.cp2y), ",", n(j.x), ",", n(j.y));
-                        break;
-                    case "at":
-                    case "wa":
-                        ai.push(" ", j.type, " ", n(j.x - this.arcScaleX_ * j.radius), ",", n(j.y - this.arcScaleY_ * j.radius), " ", n(j.x + this.arcScaleX_ * j.radius), ",", n(j.y + this.arcScaleY_ * j.radius), " ", n(j.xStart), ",", n(j.yStart), " ", n(j.xEnd), ",", n(j.yEnd));
-                        break
-                }
-                if (j) {
-                    if (Z.x == null || j.x < Z.x) {
-                        Z.x = j.x
-                    }
-                    if (aj.x == null || j.x > aj.x) {
-                        aj.x = j.x
-                    }
-                    if (Z.y == null || j.y < Z.y) {
-                        Z.y = j.y
-                    }
-                    if (aj.y == null || j.y > aj.y) {
-                        aj.y = j.y
-                    }
-                }
-            }
-            ai.push(' ">');
-            if (!ak) {
-                w(this, ai)
-            } else {
-                G(this, ai, Z, aj)
-            }
-            ai.push("</g_vml_:shape>");
-            this.element_.insertAdjacentHTML("beforeEnd", ai.join(""))
-        };
-
-        function w(m, ag) {
-            var j = F(m.strokeStyle);
-            var p = j.color;
-            var Z = j.alpha * m.globalAlpha;
-            var i = m.lineScale_ * m.lineWidth;
-            if (i < 1) {
-                Z *= i
-            }
-            ag.push("<g_vml_:stroke", ' opacity="', Z, '"', ' joinstyle="', m.lineJoin, '"', ' dashstyle="', m.lineDash.join(" "), '"', ' miterlimit="', m.miterLimit, '"', ' endcap="', S(m.lineCap), '"', ' weight="', i, 'px"', ' color="', p, '" />')
-        }
-
-        function G(aq, ai, aK, ar) {
-            var aj = aq.fillStyle;
-            var aB = aq.arcScaleX_;
-            var aA = aq.arcScaleY_;
-            var j = ar.x - aK.x;
-            var p = ar.y - aK.y;
-            if (aj instanceof U) {
-                var an = 0;
-                var aF = {
-                    x: 0,
-                    y: 0
-                };
-                var ax = 0;
-                var am = 1;
-                if (aj.type_ == "gradient") {
-                    var al = aj.x0_ / aB;
-                    var m = aj.y0_ / aA;
-                    var ak = aj.x1_ / aB;
-                    var aM = aj.y1_ / aA;
-                    var aJ = V(aq, al, m);
-                    var aI = V(aq, ak, aM);
-                    var ag = aI.x - aJ.x;
-                    var Z = aI.y - aJ.y;
-                    an = Math.atan2(ag, Z) * 180 / Math.PI;
-                    if (an < 0) {
-                        an += 360
-                    }
-                    if (an < 0.000001) {
-                        an = 0
-                    }
-                } else {
-                    var aJ = V(aq, aj.x0_, aj.y0_);
-                    aF = {
-                        x: (aJ.x - aK.x) / j,
-                        y: (aJ.y - aK.y) / p
-                    };
-                    j /= aB * d;
-                    p /= aA * d;
-                    var aD = ab.max(j, p);
-                    ax = 2 * aj.r0_ / aD;
-                    am = 2 * aj.r1_ / aD - ax
-                }
-                var av = aj.colors_;
-                av.sort(function(aN, i) {
-                    return aN.offset - i.offset
-                });
-                var ap = av.length;
-                var au = av[0].color;
-                var at = av[ap - 1].color;
-                var az = av[0].alpha * aq.globalAlpha;
-                var ay = av[ap - 1].alpha * aq.globalAlpha;
-                var aE = [];
-                for (var aH = 0; aH < ap; aH++) {
-                    var ao = av[aH];
-                    aE.push(ao.offset * am + ax + " " + ao.color)
-                }
-                ai.push('<g_vml_:fill type="', aj.type_, '"', ' method="none" focus="100%"', ' color="', au, '"', ' color2="', at, '"', ' colors="', aE.join(","), '"', ' opacity="', ay, '"', ' g_o_:opacity2="', az, '"', ' angle="', an, '"', ' focusposition="', aF.x, ",", aF.y, '" />')
-            } else {
-                if (aj instanceof T) {
-                    if (j && p) {
-                        var ah = -aK.x;
-                        var aC = -aK.y;
-                        ai.push("<g_vml_:fill", ' position="', ah / j * aB * aB, ",", aC / p * aA * aA, '"', ' type="tile"', ' src="', aj.src_, '" />')
-                    }
-                } else {
-                    var aL = F(aq.fillStyle);
-                    var aw = aL.color;
-                    var aG = aL.alpha * aq.globalAlpha;
-                    ai.push('<g_vml_:fill color="', aw, '" opacity="', aG, '" />')
-                }
-            }
-        }
-        q.fill = function() {
-            this.$stroke(true)
-        };
-        q.closePath = function() {
-            this.currentPath_.push({
-                type: "close"
-            })
-        };
-
-        function V(j, Z, p) {
-            var i = j.m_;
-            return {
-                x: d * (Z * i[0][0] + p * i[1][0] + i[2][0]) - f,
-                y: d * (Z * i[0][1] + p * i[1][1] + i[2][1]) - f
-            }
-        }
-        q.save = function() {
-            var i = {};
-            v(this, i);
-            this.aStack_.push(i);
-            this.mStack_.push(this.m_);
-            this.m_ = J(B(), this.m_)
-        };
-        q.restore = function() {
-            if (this.aStack_.length) {
-                v(this.aStack_.pop(), this);
-                this.m_ = this.mStack_.pop()
-            }
-        };
-
-        function h(i) {
-            return isFinite(i[0][0]) && isFinite(i[0][1]) && isFinite(i[1][0]) && isFinite(i[1][1]) && isFinite(i[2][0]) && isFinite(i[2][1])
-        }
-
-        function aa(j, i, p) {
-            if (!h(i)) {
-                return
-            }
-            j.m_ = i;
-            if (p) {
-                var Z = i[0][0] * i[1][1] - i[0][1] * i[1][0];
-                j.lineScale_ = N(H(Z))
-            }
-        }
-        q.translate = function(m, j) {
-            var i = [
-                [1, 0, 0],
-                [0, 1, 0],
-                [m, j, 1]
-            ];
-            aa(this, J(i, this.m_), false)
-        };
-        q.rotate = function(j) {
-            var p = A(j);
-            var m = l(j);
-            var i = [
-                [p, m, 0],
-                [-m, p, 0],
-                [0, 0, 1]
-            ];
-            aa(this, J(i, this.m_), false)
-        };
-        q.scale = function(m, j) {
-            this.arcScaleX_ *= m;
-            this.arcScaleY_ *= j;
-            var i = [
-                [m, 0, 0],
-                [0, j, 0],
-                [0, 0, 1]
-            ];
-            aa(this, J(i, this.m_), true)
-        };
-        q.transform = function(Z, p, ah, ag, j, i) {
-            var m = [
-                [Z, p, 0],
-                [ah, ag, 0],
-                [j, i, 1]
-            ];
-            aa(this, J(m, this.m_), true)
-        };
-        q.setTransform = function(ag, Z, ai, ah, p, j) {
-            var i = [
-                [ag, Z, 0],
-                [ai, ah, 0],
-                [p, j, 1]
-            ];
-            aa(this, i, true)
-        };
-        q.drawText_ = function(am, ak, aj, ap, ai) {
-            var ao = this.m_,
-                at = 1000,
-                j = 0,
-                ar = at,
-                ah = {
-                    x: 0,
-                    y: 0
-                },
-                ag = [];
-            var i = u(E(this.font), this.element_);
-            var p = ac(i);
-            var au = this.element_.currentStyle;
-            var Z = this.textAlign.toLowerCase();
-            switch (Z) {
-                case "left":
-                case "center":
-                case "right":
-                    break;
-                case "end":
-                    Z = au.direction == "ltr" ? "right" : "left";
-                    break;
-                case "start":
-                    Z = au.direction == "rtl" ? "right" : "left";
-                    break;
-                default:
-                    Z = "left"
-            }
-            switch (this.textBaseline) {
-                case "hanging":
-                case "top":
-                    ah.y = i.size / 1.75;
-                    break;
-                case "middle":
-                    break;
-                default:
-                case null:
-                case "alphabetic":
-                case "ideographic":
-                case "bottom":
-                    ah.y = -i.size / 3;
-                    break
-            }
-            switch (Z) {
-                case "right":
-                    j = at;
-                    ar = 0.05;
-                    break;
-                case "center":
-                    j = ar = at / 2;
-                    break
-            }
-            var aq = V(this, ak + ah.x, aj + ah.y);
-            ag.push('<g_vml_:line from="', -j, ' 0" to="', ar, ' 0.05" ', ' coordsize="100 100" coordorigin="0 0"', ' filled="', !ai, '" stroked="', !!ai, '" style="position:absolute;width:1px;height:1px;left:0px;top:0px;">');
-            if (ai) {
-                w(this, ag)
-            } else {
-                G(this, ag, {
-                    x: -j,
-                    y: 0
-                }, {
-                    x: ar,
-                    y: i.size
-                })
-            }
-            var an = ao[0][0].toFixed(3) + "," + ao[1][0].toFixed(3) + "," + ao[0][1].toFixed(3) + "," + ao[1][1].toFixed(3) + ",0,0";
-            var al = n(aq.x / d) + "," + n(aq.y / d);
-            ag.push('<g_vml_:skew on="t" matrix="', an, '" ', ' offset="', al, '" origin="', j, ' 0" />', '<g_vml_:path textpathok="true" />', '<g_vml_:textpath on="true" string="', af(am), '" style="v-text-align:', Z, ";font:", af(p), '" /></g_vml_:line>');
-            this.element_.insertAdjacentHTML("beforeEnd", ag.join(""))
-        };
-        q.fillText = function(m, i, p, j) {
-            this.drawText_(m, i, p, j, false)
-        };
-        q.strokeText = function(m, i, p, j) {
-            this.drawText_(m, i, p, j, true)
-        };
-        q.measureText = function(m) {
-            if (!this.textMeasureEl_) {
-                var i = '<span style="position:absolute;top:-20000px;left:0;padding:0;margin:0;border:none;white-space:pre;"></span>';
-                this.element_.insertAdjacentHTML("beforeEnd", i);
-                this.textMeasureEl_ = this.element_.lastChild
-            }
-            var j = this.element_.ownerDocument;
-            this.textMeasureEl_.innerHTML = "";
-            this.textMeasureEl_.style.font = this.font;
-            this.textMeasureEl_.appendChild(j.createTextNode(m));
-            return {
-                width: this.textMeasureEl_.offsetWidth
-            }
-        };
-        q.clip = function() {};
-        q.arcTo = function() {};
-        q.createPattern = function(j, i) {
-            return new T(j, i)
-        };
-
-        function U(i) {
-            this.type_ = i;
-            this.x0_ = 0;
-            this.y0_ = 0;
-            this.r0_ = 0;
-            this.x1_ = 0;
-            this.y1_ = 0;
-            this.r1_ = 0;
-            this.colors_ = []
-        }
-        U.prototype.addColorStop = function(j, i) {
-            i = F(i);
-            this.colors_.push({
-                offset: j,
-                color: i.color,
-                alpha: i.alpha
-            })
-        };
-
-        function T(j, i) {
-            Q(j);
-            switch (i) {
-                case "repeat":
-                case null:
-                case "":
-                    this.repetition_ = "repeat";
-                    break;
-                case "repeat-x":
-                case "repeat-y":
-                case "no-repeat":
-                    this.repetition_ = i;
-                    break;
-                default:
-                    O("SYNTAX_ERR")
-            }
-            this.src_ = j.src;
-            this.width_ = j.width;
-            this.height_ = j.height
-        }
-
-        function O(i) {
-            throw new P(i)
-        }
-
-        function Q(i) {
-            if (!i || i.nodeType != 1 || i.tagName != "IMG") {
-                O("TYPE_MISMATCH_ERR")
-            }
-            if (i.readyState != "complete") {
-                O("INVALID_STATE_ERR")
-            }
-        }
-
-        function P(i) {
-            this.code = this[i];
-            this.message = i + ": DOM Exception " + this.code
-        }
-        var X = P.prototype = new Error();
-        X.INDEX_SIZE_ERR = 1;
-        X.DOMSTRING_SIZE_ERR = 2;
-        X.HIERARCHY_REQUEST_ERR = 3;
-        X.WRONG_DOCUMENT_ERR = 4;
-        X.INVALID_CHARACTER_ERR = 5;
-        X.NO_DATA_ALLOWED_ERR = 6;
-        X.NO_MODIFICATION_ALLOWED_ERR = 7;
-        X.NOT_FOUND_ERR = 8;
-        X.NOT_SUPPORTED_ERR = 9;
-        X.INUSE_ATTRIBUTE_ERR = 10;
-        X.INVALID_STATE_ERR = 11;
-        X.SYNTAX_ERR = 12;
-        X.INVALID_MODIFICATION_ERR = 13;
-        X.NAMESPACE_ERR = 14;
-        X.INVALID_ACCESS_ERR = 15;
-        X.VALIDATION_ERR = 16;
-        X.TYPE_MISMATCH_ERR = 17;
-        G_vmlCanvasManager = e;
-        CanvasRenderingContext2D = D;
-        CanvasGradient = U;
-        CanvasPattern = T;
-        DOMException = P
-    })()
-}
-Ext.define("Ext.draw.engine.Canvas", {
-    extend: "Ext.draw.Surface",
-    requires: ["Ext.draw.engine.excanvas", "Ext.draw.Animator", "Ext.draw.Color"],
-    config: {
-        highPrecision: false
-    },
-    statics: {
-        contextOverrides: {
-            setGradientBBox: function(a) {
-                this.bbox = a
-            },
-            fill: function() {
-                var c = this.fillStyle,
-                    a = this.fillGradient,
-                    b = this.fillOpacity,
-                    d = this.globalAlpha,
-                    e = this.bbox;
-                if (c !== Ext.draw.Color.RGBA_NONE && b !== 0) {
-                    if (a && e) {
-                        this.fillStyle = a.generateGradient(this, e)
-                    }
-                    if (b !== 1) {
-                        this.globalAlpha = d * b
-                    }
-                    this.$fill();
-                    if (b !== 1) {
-                        this.globalAlpha = d
-                    }
-                    if (a && e) {
-                        this.fillStyle = c
-                    }
-                }
-            },
-            stroke: function() {
-                var e = this.strokeStyle,
-                    c = this.strokeGradient,
-                    a = this.strokeOpacity,
-                    b = this.globalAlpha,
-                    d = this.bbox;
-                if (e !== Ext.draw.Color.RGBA_NONE && a !== 0) {
-                    if (c && d) {
-                        this.strokeStyle = c.generateGradient(this, d)
-                    }
-                    if (a !== 1) {
-                        this.globalAlpha = b * a
-                    }
-                    this.$stroke();
-                    if (a !== 1) {
-                        this.globalAlpha = b
-                    }
-                    if (c && d) {
-                        this.strokeStyle = e
-                    }
-                }
-            },
-            fillStroke: function(d, e) {
-                var j = this,
-                    i = this.fillStyle,
-                    h = this.fillOpacity,
-                    f = this.strokeStyle,
-                    c = this.strokeOpacity,
-                    b = j.shadowColor,
-                    a = j.shadowBlur,
-                    g = Ext.draw.Color.RGBA_NONE;
-                if (e === undefined) {
-                    e = d.transformFillStroke
-                }
-                if (!e) {
-                    d.inverseMatrix.toContext(j)
-                }
-                if (i !== g && h !== 0) {
-                    j.fill();
-                    j.shadowColor = g;
-                    j.shadowBlur = 0
-                }
-                if (f !== g && c !== 0) {
-                    j.stroke()
-                }
-                j.shadowColor = b;
-                j.shadowBlur = a
-            },
-            setLineDash: function(a) {
-                if (this.$setLineDash) {
-                    this.$setLineDash(a)
-                }
-            },
-            getLineDash: function() {
-                if (this.$getLineDash) {
-                    return this.$getLineDash()
-                }
-            },
-            ellipse: function(g, e, c, a, j, b, f, d) {
-                var i = Math.cos(j),
-                    h = Math.sin(j);
-                this.transform(i * c, h * c, -h * a, i * a, g, e);
-                this.arc(0, 0, 1, b, f, d);
-                this.transform(i / c, -h / a, h / c, i / a, -(i * g + h * e) / c, (h * g - i * e) / a)
-            },
-            appendPath: function(f) {
-                var e = this,
-                    c = 0,
-                    b = 0,
-                    a = f.commands,
-                    g = f.params,
-                    d = a.length;
-                e.beginPath();
-                for (; c < d; c++) {
-                    switch (a[c]) {
-                        case "M":
-                            e.moveTo(g[b], g[b + 1]);
-                            b += 2;
-                            break;
-                        case "L":
-                            e.lineTo(g[b], g[b + 1]);
-                            b += 2;
-                            break;
-                        case "C":
-                            e.bezierCurveTo(g[b], g[b + 1], g[b + 2], g[b + 3], g[b + 4], g[b + 5]);
-                            b += 6;
-                            break;
-                        case "Z":
-                            e.closePath();
-                            break
-                    }
-                }
-            },
-            save: function() {
-                var c = this.toSave,
-                    d = c.length,
-                    e = d && {},
-                    b = 0,
-                    a;
-                for (; b < d; b++) {
-                    a = c[b];
-                    if (a in this) {
-                        e[a] = this[a]
-                    }
-                }
-                this.state.push(e);
-                this.$save()
-            },
-            restore: function() {
-                var b = this.state.pop(),
-                    a;
-                if (b) {
-                    for (a in b) {
-                        this[a] = b[a]
-                    }
-                }
-                this.$restore()
-            }
-        }
-    },
-    splitThreshold: 3000,
-    toSave: ["fillGradient", "strokeGradient"],
-    element: {
-        reference: "element",
-        style: {
-            position: "absolute"
-        },
-        children: [{
-            reference: "innerElement",
-            style: {
-                width: "100%",
-                height: "100%",
-                position: "relative"
-            }
-        }]
-    },
-    createCanvas: function() {
-        var c = Ext.Element.create({
-            tag: "canvas",
-            cls: Ext.baseCSSPrefix + "surface-canvas"
-        });
-        window.G_vmlCanvasManager && G_vmlCanvasManager.initElement(c.dom);
-        var d = Ext.draw.engine.Canvas.contextOverrides,
-            a = c.dom.getContext("2d"),
-            b;
-        if (a.ellipse) {
-            delete d.ellipse
-        }
-        a.state = [];
-        a.toSave = this.toSave;
-        for (b in d) {
-            a["$" + b] = a[b]
-        }
-        Ext.apply(a, d);
-        if (this.getHighPrecision()) {
-            this.enablePrecisionCompensation(a)
-        } else {
-            this.disablePrecisionCompensation(a)
-        }
-        this.innerElement.appendChild(c);
-        this.canvases.push(c);
-        this.contexts.push(a)
-    },
-    updateHighPrecision: function(d) {
-        var e = this.contexts,
-            c = e.length,
-            b, a;
-        for (b = 0; b < c; b++) {
-            a = e[b];
-            if (d) {
-                this.enablePrecisionCompensation(a)
-            } else {
-                this.disablePrecisionCompensation(a)
-            }
-        }
-    },
-    precisionNames: ["rect", "fillRect", "strokeRect", "clearRect", "moveTo", "lineTo", "arc", "arcTo", "save", "restore", "updatePrecisionCompensate", "setTransform", "transform", "scale", "translate", "rotate", "quadraticCurveTo", "bezierCurveTo", "createLinearGradient", "createRadialGradient", "fillText", "strokeText", "drawImage"],
-    disablePrecisionCompensation: function(b) {
-        var a = Ext.draw.engine.Canvas.contextOverrides,
-            f = this.precisionNames,
-            e = f.length,
-            d, c;
-        for (d = 0; d < e; d++) {
-            c = f[d];
-            if (!(c in a)) {
-                delete b[c]
-            }
-        }
-        this.setDirty(true)
-    },
-    enablePrecisionCompensation: function(j) {
-        var c = this,
-            a = 1,
-            g = 1,
-            l = 0,
-            k = 0,
-            i = new Ext.draw.Matrix(),
-            b = [],
-            e = {},
-            d = Ext.draw.engine.Canvas.contextOverrides,
-            h = j.constructor.prototype;
-        var f = {
-            toSave: c.toSave,
-            rect: function(m, p, n, o) {
-                return h.rect.call(this, m * a + l, p * g + k, n * a, o * g)
-            },
-            fillRect: function(m, p, n, o) {
-                this.updatePrecisionCompensateRect();
-                h.fillRect.call(this, m * a + l, p * g + k, n * a, o * g);
-                this.updatePrecisionCompensate()
-            },
-            strokeRect: function(m, p, n, o) {
-                this.updatePrecisionCompensateRect();
-                h.strokeRect.call(this, m * a + l, p * g + k, n * a, o * g);
-                this.updatePrecisionCompensate()
-            },
-            clearRect: function(m, p, n, o) {
-                return h.clearRect.call(this, m * a + l, p * g + k, n * a, o * g)
-            },
-            moveTo: function(m, n) {
-                return h.moveTo.call(this, m * a + l, n * g + k)
-            },
-            lineTo: function(m, n) {
-                return h.lineTo.call(this, m * a + l, n * g + k)
-            },
-            arc: function(n, r, m, p, o, q) {
-                this.updatePrecisionCompensateRect();
-                h.arc.call(this, n * a + l, r * a + k, m * a, p, o, q);
-                this.updatePrecisionCompensate()
-            },
-            arcTo: function(o, q, n, p, m) {
-                this.updatePrecisionCompensateRect();
-                h.arcTo.call(this, o * a + l, q * g + k, n * a + l, p * g + k, m * a);
-                this.updatePrecisionCompensate()
-            },
-            save: function() {
-                b.push(i);
-                i = i.clone();
-                d.save.call(this);
-                h.save.call(this)
-            },
-            restore: function() {
-                i = b.pop();
-                d.restore.call(this);
-                h.restore.call(this);
-                this.updatePrecisionCompensate()
-            },
-            updatePrecisionCompensate: function() {
-                i.precisionCompensate(c.devicePixelRatio, e);
-                a = e.xx;
-                g = e.yy;
-                l = e.dx;
-                k = e.dy;
-                h.setTransform.call(this, c.devicePixelRatio, e.b, e.c, e.d, 0, 0)
-            },
-            updatePrecisionCompensateRect: function() {
-                i.precisionCompensateRect(c.devicePixelRatio, e);
-                a = e.xx;
-                g = e.yy;
-                l = e.dx;
-                k = e.dy;
-                h.setTransform.call(this, c.devicePixelRatio, e.b, e.c, e.d, 0, 0)
-            },
-            setTransform: function(q, o, n, m, r, p) {
-                i.set(q, o, n, m, r, p);
-                this.updatePrecisionCompensate()
-            },
-            transform: function(q, o, n, m, r, p) {
-                i.append(q, o, n, m, r, p);
-                this.updatePrecisionCompensate()
-            },
-            scale: function(n, m) {
-                this.transform(n, 0, 0, m, 0, 0)
-            },
-            translate: function(n, m) {
-                this.transform(1, 0, 0, 1, n, m)
-            },
-            rotate: function(o) {
-                var n = Math.cos(o),
-                    m = Math.sin(o);
-                this.transform(n, m, -m, n, 0, 0)
-            },
-            quadraticCurveTo: function(n, p, m, o) {
-                h.quadraticCurveTo.call(this, n * a + l, p * g + k, m * a + l, o * g + k)
-            },
-            bezierCurveTo: function(r, p, o, n, m, q) {
-                h.bezierCurveTo.call(this, r * a + l, p * g + k, o * a + l, n * g + k, m * a + l, q * g + k)
-            },
-            createLinearGradient: function(n, p, m, o) {
-                this.updatePrecisionCompensateRect();
-                var q = h.createLinearGradient.call(this, n * a + l, p * g + k, m * a + l, o * g + k);
-                this.updatePrecisionCompensate();
-                return q
-            },
-            createRadialGradient: function(p, r, o, n, q, m) {
-                this.updatePrecisionCompensateRect();
-                var s = h.createLinearGradient.call(this, p * a + l, r * a + k, o * a, n * a + l, q * a + k, m * a);
-                this.updatePrecisionCompensate();
-                return s
-            },
-            fillText: function(o, m, p, n) {
-                h.setTransform.apply(this, i.elements);
-                if (typeof n === "undefined") {
-                    h.fillText.call(this, o, m, p)
-                } else {
-                    h.fillText.call(this, o, m, p, n)
-                }
-                this.updatePrecisionCompensate()
-            },
-            strokeText: function(o, m, p, n) {
-                h.setTransform.apply(this, i.elements);
-                if (typeof n === "undefined") {
-                    h.strokeText.call(this, o, m, p)
-                } else {
-                    h.strokeText.call(this, o, m, p, n)
-                }
-                this.updatePrecisionCompensate()
-            },
-            fill: function() {
-                var m = this.fillGradient,
-                    n = this.bbox;
-                this.updatePrecisionCompensateRect();
-                if (m && n) {
-                    this.fillStyle = m.generateGradient(this, n)
-                }
-                h.fill.call(this);
-                this.updatePrecisionCompensate()
-            },
-            stroke: function() {
-                var m = this.strokeGradient,
-                    n = this.bbox;
-                this.updatePrecisionCompensateRect();
-                if (m && n) {
-                    this.strokeStyle = m.generateGradient(this, n)
-                }
-                h.stroke.call(this);
-                this.updatePrecisionCompensate()
-            },
-            drawImage: function(u, s, r, q, p, o, n, m, t) {
-                switch (arguments.length) {
-                    case 3:
-                        return h.drawImage.call(this, u, s * a + l, r * g + k);
-                    case 5:
-                        return h.drawImage.call(this, u, s * a + l, r * g + k, q * a, p * g);
-                    case 9:
-                        return h.drawImage.call(this, u, s, r, q, p, o * a + l, n * g * k, m * a, t * g)
-                }
-            }
-        };
-        Ext.apply(j, f);
-        this.setDirty(true)
-    },
-    updateRect: function(a) {
-        this.callParent([a]);
-        var C = this,
-            p = Math.floor(a[0]),
-            e = Math.floor(a[1]),
-            g = Math.ceil(a[0] + a[2]),
-            B = Math.ceil(a[1] + a[3]),
-            u = C.devicePixelRatio,
-            D = C.canvases,
-            d = g - p,
-            y = B - e,
-            n = Math.round(C.splitThreshold / u),
-            c = C.xSplits = Math.ceil(d / n),
-            f = C.ySplits = Math.ceil(y / n),
-            v, s, q, A, z, x, o, m;
-        for (s = 0, z = 0; s < f; s++, z += n) {
-            for (v = 0, A = 0; v < c; v++, A += n) {
-                q = s * c + v;
-                if (q >= D.length) {
-                    C.createCanvas()
-                }
-                x = D[q].dom;
-                x.style.left = A + "px";
-                x.style.top = z + "px";
-                m = Math.min(n, y - z);
-                if (m * u !== x.height) {
-                    x.height = m * u;
-                    x.style.height = m + "px"
-                }
-                o = Math.min(n, d - A);
-                if (o * u !== x.width) {
-                    x.width = o * u;
-                    x.style.width = o + "px"
-                }
-                C.applyDefaults(C.contexts[q])
-            }
-        }
-        for (q += 1; q < D.length; q++) {
-            D[q].destroy()
-        }
-        C.activeCanvases = c * f;
-        D.length = C.activeCanvases;
-        C.clear()
-    },
-    clearTransform: function() {
-        var f = this,
-            a = f.xSplits,
-            g = f.ySplits,
-            d = f.contexts,
-            h = f.splitThreshold,
-            l = f.devicePixelRatio,
-            e, c, b, m;
-        for (e = 0; e < a; e++) {
-            for (c = 0; c < g; c++) {
-                b = c * a + e;
-                m = d[b];
-                m.translate(-h * e, -h * c);
-                m.scale(l, l);
-                f.matrix.toContext(m)
-            }
-        }
-    },
-    renderSprite: function(q) {
-        var C = this,
-            b = C.getRect(),
-            e = C.matrix,
-            g = q.getParent(),
-            v = Ext.draw.Matrix.fly([1, 0, 0, 1, 0, 0]),
-            p = C.splitThreshold / C.devicePixelRatio,
-            c = C.xSplits,
-            m = C.ySplits,
-            A, z, s, a, r, o, d = 0,
-            B, n = 0,
-            f, l = b[2],
-            y = b[3],
-            x, u, t;
-        while (g && (g !== C)) {
-            v.prependMatrix(g.matrix || g.attr && g.attr.matrix);
-            g = g.getParent()
-        }
-        v.prependMatrix(e);
-        a = q.getBBox();
-        if (a) {
-            a = v.transformBBox(a)
-        }
-        q.preRender(C);
-        if (q.attr.hidden || q.attr.globalAlpha === 0) {
-            q.setDirty(false);
-            return
-        }
-        for (u = 0, z = 0; u < m; u++, z += p) {
-            for (x = 0, A = 0; x < c; x++, A += p) {
-                t = u * c + x;
-                s = C.contexts[t];
-                r = Math.min(p, l - A);
-                o = Math.min(p, y - z);
-                d = A;
-                B = d + r;
-                n = z;
-                f = n + o;
-                if (a) {
-                    if (a.x > B || a.x + a.width < d || a.y > f || a.y + a.height < n) {
-                        continue
-                    }
-                }
-                s.save();
-                q.useAttributes(s, b);
-                if (false === q.render(C, s, [d, n, r, o], b)) {
-                    return false
-                }
-                s.restore()
-            }
-        }
-        q.setDirty(false)
-    },
-    flatten: function(n, a) {
-        var k = document.createElement("canvas"),
-            f = Ext.getClassName(this),
-            g = this.devicePixelRatio,
-            l = k.getContext("2d"),
-            b, c, h, e, d, m;
-        k.width = Math.ceil(n.width * g);
-        k.height = Math.ceil(n.height * g);
-        for (e = 0; e < a.length; e++) {
-            b = a[e];
-            if (Ext.getClassName(b) !== f) {
-                continue
-            }
-            h = b.getRect();
-            for (d = 0; d < b.canvases.length; d++) {
-                c = b.canvases[d];
-                m = c.getOffsetsTo(c.getParent());
-                l.drawImage(c.dom, (h[0] + m[0]) * g, (h[1] + m[1]) * g)
-            }
-        }
-        return {
-            data: k.toDataURL(),
-            type: "png"
-        }
-    },
-    applyDefaults: function(a) {
-        var b = Ext.draw.Color.RGBA_NONE;
-        a.strokeStyle = b;
-        a.fillStyle = b;
-        a.textAlign = "start";
-        a.textBaseline = "alphabetic";
-        a.miterLimit = 1
-    },
-    clear: function() {
-        var d = this,
-            e = d.activeCanvases,
-            c, b, a;
-        for (c = 0; c < e; c++) {
-            b = d.canvases[c].dom;
-            a = d.contexts[c];
-            a.setTransform(1, 0, 0, 1, 0, 0);
-            a.clearRect(0, 0, b.width, b.height)
-        }
-        d.setDirty(true)
-    },
-    destroy: function() {
-        var c = this,
-            a, b = c.canvases.length;
-        for (a = 0; a < b; a++) {
-            c.contexts[a] = null;
-            c.canvases[a].destroy();
-            c.canvases[a] = null
-        }
-        delete c.contexts;
-        delete c.canvases;
-        c.callParent()
-    },
-    privates: {
-        initElement: function() {
-            var a = this;
-            a.callParent();
-            a.canvases = [];
-            a.contexts = [];
-            a.activeCanvases = (a.xSplits = 0) * (a.ySplits = 0)
-        }
-    }
-}, function() {
-    var c = this,
-        b = c.prototype,
-        a = 10000000000;
-    if (Ext.os.is.Android4 && Ext.browser.is.Chrome) {
-        a = 3000
-    } else {
-        if (Ext.is.iOS) {
-            a = 2200
-        }
-    }
-    b.splitThreshold = a
-});
-Ext.define("Ext.draw.Container", {
-    extend: "Ext.draw.ContainerBase",
-    alternateClassName: "Ext.draw.Component",
-    xtype: "draw",
-    defaultType: "surface",
-    isDrawContainer: true,
-    requires: ["Ext.draw.Surface", "Ext.draw.engine.Svg", "Ext.draw.engine.Canvas", "Ext.draw.gradient.GradientDefinition"],
-    engine: "Ext.draw.engine.Canvas",
-    config: {
-        cls: Ext.baseCSSPrefix + "draw-container",
-        resizeHandler: null,
-        sprites: null,
-        gradients: []
-    },
-    defaultDownloadServerUrl: "http://svg.sencha.io",
-    supportedFormats: ["png", "pdf", "jpeg", "gif"],
-    supportedOptions: {
-        version: Ext.isNumber,
-        data: Ext.isString,
-        format: function(a) {
-            return Ext.Array.indexOf(this.supportedFormats, a) >= 0
-        },
-        filename: Ext.isString,
-        width: Ext.isNumber,
-        height: Ext.isNumber,
-        scale: Ext.isNumber,
-        pdf: Ext.isObject,
-        jpeg: Ext.isObject
-    },
-    initAnimator: function() {
-        this.frameCallbackId = Ext.draw.Animator.addFrameCallback("renderFrame", this)
-    },
-    applyGradients: function(b) {
-        var a = [],
-            c, f, d, e;
-        if (!Ext.isArray(b)) {
-            return a
-        }
-        for (c = 0, f = b.length; c < f; c++) {
-            d = b[c];
-            if (!Ext.isObject(d)) {
-                continue
-            }
-            if (typeof d.type !== "string") {
-                d.type = "linear"
-            }
-            if (d.angle) {
-                d.degrees = d.angle;
-                delete d.angle
-            }
-            if (Ext.isObject(d.stops)) {
-                d.stops = (function(i) {
-                    var g = [],
-                        h;
-                    for (e in i) {
-                        h = i[e];
-                        h.offset = e / 100;
-                        g.push(h)
-                    }
-                    return g
-                })(d.stops)
-            }
-            a.push(d)
-        }
-        Ext.draw.gradient.GradientDefinition.add(a);
-        return a
-    },
-    applySprites: function(f) {
-        if (!f) {
-            return
-        }
-        f = Ext.Array.from(f);
-        var e = f.length,
-            b = [],
-            d, a, c;
-        for (d = 0; d < e; d++) {
-            c = f[d];
-            a = c.surface;
-            if (!(a && a.isSurface)) {
-                if (Ext.isString(a)) {
-                    a = this.getSurface(a)
-                } else {
-                    a = this.getSurface("main")
-                }
-            }
-            c = a.add(c);
-            b.push(c)
-        }
-        return b
-    },
-    onBodyResize: function() {
-        var b = this.element,
-            a;
-        if (!b) {
-            return
-        }
-        a = b.getSize();
-        if (a.width && a.height) {
-            this.setBodySize(a)
-        }
-    },
-    setBodySize: function(c) {
-        var d = this,
-            b = d.getResizeHandler() || d.defaultResizeHandler,
-            a;
-        d.fireEvent("bodyresize", d, c);
-        a = b.call(d, c);
-        if (a !== false) {
-            d.renderFrame()
-        }
-    },
-    defaultResizeHandler: function(a) {
-        this.getItems().each(function(b) {
-            b.setRect([0, 0, a.width, a.height])
-        })
-    },
-    getSurface: function(d) {
-        d = this.getId() + "-" + (d || "main");
-        var c = this,
-            b = c.getItems(),
-            a = b.get(d);
-        if (!a) {
-            a = c.add({
-                xclass: c.engine,
-                id: d
-            });
-            c.onBodyResize()
-        }
-        return a
-    },
-    renderFrame: function() {
-        var e = this,
-            a = e.getItems(),
-            b, d, c;
-        for (b = 0, d = a.length; b < d; b++) {
-            c = a.items[b];
-            if (c.isSurface) {
-                c.renderFrame()
-            }
-        }
-    },
-    getImage: function(k) {
-        var l = this.innerElement.getSize(),
-            a = Array.prototype.slice.call(this.items.items),
-            d, g, c = this.surfaceZIndexes,
-            f, e, b, h;
-        for (e = 1; e < a.length; e++) {
-            b = a[e];
-            h = c[b.type];
-            f = e - 1;
-            while (f >= 0 && c[a[f].type] > h) {
-                a[f + 1] = a[f];
-                f--
-            }
-            a[f + 1] = b
-        }
-        d = a[0].flatten(l, a);
-        if (k === "image") {
-            g = new Image();
-            g.src = d.data;
-            d.data = g;
-            return d
-        }
-        if (k === "stream") {
-            d.data = d.data.replace(/^data:image\/[^;]+/, "data:application/octet-stream");
-            return d
-        }
-        return d
-    },
-    download: function(d) {
-        var e = this,
-            a = [],
-            b, c, f;
-        d = Ext.apply({
-            version: 2,
-            data: e.getImage().data
-        }, d);
-        for (c in d) {
-            if (d.hasOwnProperty(c)) {
-                f = d[c];
-                if (c in e.supportedOptions) {
-                    if (e.supportedOptions[c].call(e, f)) {
-                        a.push({
-                            tag: "input",
-                            type: "hidden",
-                            name: c,
-                            value: Ext.String.htmlEncode(Ext.isObject(f) ? Ext.JSON.encode(f) : f)
-                        })
-                    }
-                }
-            }
-        }
-        b = Ext.dom.Helper.markup({
-            tag: "html",
-            children: [{
-                tag: "head"
-            }, {
-                tag: "body",
-                children: [{
-                    tag: "form",
-                    method: "POST",
-                    action: d.url || e.defaultDownloadServerUrl,
-                    children: a
-                }, {
-                    tag: "script",
-                    type: "text/javascript",
-                    children: 'document.getElementsByTagName("form")[0].submit();'
-                }]
-            }]
-        });
-        window.open("", "ImageDownload_" + Date.now()).document.write(b)
-    },
-    destroy: function() {
-        var a = this.frameCallbackId;
-        if (a) {
-            Ext.draw.Animator.removeFrameCallback(a)
-        }
-        this.callParent()
-    }
-}, function() {
-    if (location.search.match("svg")) {
-        Ext.draw.Container.prototype.engine = "Ext.draw.engine.Svg"
-    } else {
-        if ((Ext.os.is.BlackBerry && Ext.os.version.getMajor() === 10) || (Ext.browser.is.AndroidStock4 && (Ext.os.version.getMinor() === 1 || Ext.os.version.getMinor() === 2 || Ext.os.version.getMinor() === 3))) {
-            Ext.draw.Container.prototype.engine = "Ext.draw.engine.Svg"
-        }
-    }
-});
-Ext.define("Ext.chart.theme.Base", {
-    mixins: {
-        factoryable: "Ext.mixin.Factoryable"
-    },
-    requires: ["Ext.draw.Color"],
-    factoryConfig: {
-        type: "chart.theme"
-    },
-    isTheme: true,
-    config: {
-        baseColor: null,
-        colors: undefined,
-        gradients: null,
-        chart: {
-            defaults: {
-                background: "#23272a"
-            }
-        },
-        axis: {
-            defaults: {
-                label: {
-                    x: 0,
-                    y: 0,
-                    textBaseline: "middle",
-                    textAlign: "center",
-                    fontSize: "default",
-                    fontFamily: "default",
-                    fontWeight: "default",
-                    fillStyle: "black",
-                    color: "white"
-                },
-                title: {
-                    fillStyle: "black",
-                    fontSize: "default*1.23",
-                    fontFamily: "default",
-                    fontWeight: "default",
-                    color: "white"
-                },
-                style: {
-                    strokeStyle: "black"
-                },
-                grid: {
-                    strokeStyle: "rgba(44, 47, 51, 1)"
-                }
-            },
-            top: {
-                style: {
-                    textPadding: 5
-                }
-            },
-            bottom: {
-                style: {
-                    textPadding: 5
-                }
-            }
-        },
-        series: {
-            defaults: {
-                label: {
-                    fillStyle: "black",
-                    strokeStyle: "none",
-                    fontFamily: "default",
-                    fontWeight: "default",
-                    fontSize: "default*1.077",
-                    textBaseline: "middle",
-                    textAlign: "center"
-                },
-                labelOverflowPadding: 5
-            }
-        },
-        sprites: {
-            text: {
-                fontSize: "default",
-                fontWeight: "default",
-                fontFamily: "default",
-                fillStyle: "black",
-                color: "white"
-            }
-        },
-        seriesThemes: undefined,
-        markerThemes: {
-            type: ["circle", "cross", "plus", "square", "triangle", "diamond"]
-        },
-        useGradients: false,
-        background: null
-    },
-    colorDefaults: ["#94ae0a", "#115fa6", "#a61120", "#ff8809", "#ffd13e", "#a61187", "#24ad9a", "#7c7474", "#a66111"],
-    constructor: function(a) {
-        this.initConfig(a);
-        this.resolveDefaults()
-    },
-    defaultRegEx: /^default([+\-/\*]\d+(?:\.\d+)?)?$/,
-    defaultOperators: {
-        "*": function(b, a) {
-            return b * a
-        },
-        "+": function(b, a) {
-            return b + a
-        },
-        "-": function(b, a) {
-            return b - a
-        }
-    },
-    resolveDefaults: function() {
-        var a = this;
-        Ext.onReady(function() {
-            var f = Ext.clone(a.getSprites()),
-                e = Ext.clone(a.getAxis()),
-                d = Ext.clone(a.getSeries()),
-                g, c, b;
-            if (!a.superclass.defaults) {
-                g = Ext.getBody().createChild({
-                    tag: "div",
-                    cls: "x-component"
-                });
-                a.superclass.defaults = {
-                    fontFamily: g.getStyle("fontFamily"),
-                    fontWeight: g.getStyle("fontWeight"),
-                    fontSize: parseFloat(g.getStyle("fontSize")),
-                    fontVariant: g.getStyle("fontVariant"),
-                    fontStyle: g.getStyle("fontStyle")
-                };
-                g.destroy()
-            }
-            a.replaceDefaults(f.text);
-            a.setSprites(f);
-            for (c in e) {
-                b = e[c];
-                a.replaceDefaults(b.label);
-                a.replaceDefaults(b.title)
-            }
-            a.setAxis(e);
-            for (c in d) {
-                b = d[c];
-                a.replaceDefaults(b.label)
-            }
-            a.setSeries(d)
-        })
-    },
-    replaceDefaults: function(h) {
-        var e = this,
-            g = e.superclass.defaults,
-            a = e.defaultRegEx,
-            d, f, c, b;
-        if (Ext.isObject(h)) {
-            for (d in g) {
-                c = a.exec(h[d]);
-                if (c) {
-                    f = g[d];
-                    c = c[1];
-                    if (c) {
-                        b = e.defaultOperators[c.charAt(0)];
-                        f = Math.round(b(f, parseFloat(c.substr(1))))
-                    }
-                    h[d] = f
-                }
-            }
-        }
-    },
-    applyBaseColor: function(c) {
-        var a, b;
-        if (c) {
-            a = c.isColor ? c : Ext.draw.Color.fromString(c);
-            b = a.getHSL()[2];
-            if (b < 0.15) {
-                a = a.createLighter(0.3)
-            } else {
-                if (b < 0.3) {
-                    a = a.createLighter(0.15)
-                } else {
-                    if (b > 0.85) {
-                        a = a.createDarker(0.3)
-                    } else {
-                        if (b > 0.7) {
-                            a = a.createDarker(0.15)
-                        }
-                    }
-                }
-            }
-            this.setColors([a.createDarker(0.3).toString(), a.createDarker(0.15).toString(), a.toString(), a.createLighter(0.12).toString(), a.createLighter(0.24).toString(), a.createLighter(0.31).toString()])
-        }
-        return c
-    },
-    applyColors: function(a) {
-        return a || this.colorDefaults
-    },
-    updateUseGradients: function(a) {
-        if (a) {
-            this.updateGradients({
-                type: "linear",
-                degrees: 90
-            })
-        }
-    },
-    updateBackground: function(a) {
-        if (a) {
-            var b = this.getChart();
-            b.defaults.background = a;
-            this.setChart(b)
-        }
-    },
-    updateGradients: function(a) {
-        var c = this.getColors(),
-            e = [],
-            h, b, d, f, g;
-        if (Ext.isObject(a)) {
-            for (f = 0, g = c && c.length || 0; f < g; f++) {
-                b = Ext.draw.Color.fromString(c[f]);
-                if (b) {
-                    d = b.createLighter(0.15).toString();
-                    h = Ext.apply(Ext.Object.chain(a), {
-                        stops: [{
-                            offset: 1,
-                            color: b.toString()
-                        }, {
-                            offset: 0,
-                            color: d.toString()
-                        }]
-                    });
-                    e.push(h)
-                }
-            }
-            this.setColors(e)
-        }
-    },
-    applySeriesThemes: function(a) {
-        this.getBaseColor();
-        this.getUseGradients();
-        this.getGradients();
-        var b = this.getColors();
-        if (!a) {
-            a = {
-                fillStyle: Ext.Array.clone(b),
-                strokeStyle: Ext.Array.map(b, function(d) {
-                    var c = Ext.draw.Color.fromString(d.stops ? d.stops[0].color : d);
-                    return c.createDarker(0.15).toString()
-                })
-            }
-        }
-        return a
-    }
-});
-Ext.define("Ext.chart.theme.Default", {
-    extend: "Ext.chart.theme.Base",
-    singleton: true,
-    alias: ["chart.theme.default", "chart.theme.Base"]
-});
-Ext.define("Ext.chart.Markers", {
-    extend: "Ext.draw.sprite.Instancing",
-    isMarkers: true,
-    defaultCategory: "default",
-    constructor: function() {
-        this.callParent(arguments);
-        this.categories = {};
-        this.revisions = {}
-    },
-    destroy: function() {
-        this.categories = null;
-        this.revisions = null;
-        this.callParent()
-    },
-    getMarkerFor: function(b, a) {
-        if (b in this.categories) {
-            var c = this.categories[b];
-            if (a in c) {
-                return this.get(c[a])
-            }
-        }
-    },
-    clear: function(a) {
-        a = a || this.defaultCategory;
-        if (!(a in this.revisions)) {
-            this.revisions[a] = 1
-        } else {
-            this.revisions[a]++
-        }
-    },
-    putMarkerFor: function(e, b, c, h, f) {
-        e = e || this.defaultCategory;
-        var d = this,
-            g = d.categories[e] || (d.categories[e] = {}),
-            a;
-        if (c in g) {
-            d.setAttributesFor(g[c], b, h)
-        } else {
-            g[c] = d.getCount();
-            d.createInstance(b, h)
-        }
-        a = d.get(g[c]);
-        if (a) {
-            a.category = e;
-            if (!f) {
-                a.revision = d.revisions[e] || (d.revisions[e] = 1)
-            }
-        }
-    },
-    getMarkerBBoxFor: function(c, a, b) {
-        if (c in this.categories) {
-            var d = this.categories[c];
-            if (a in d) {
-                return this.getBBoxFor(d[a], b)
-            }
-        }
-    },
-    getBBox: function() {
-        return null
-    },
-    render: function(a, l, b) {
-        var f = this,
-            k = f.revisions,
-            j = f.attr.matrix,
-            h = f.getTemplate(),
-            d = h.attr,
-            g, c, e;
-        j.toContext(l);
-        h.preRender(a, l, b);
-        h.useAttributes(l, b);
-        for (c = 0, e = f.instances.length; c < e; c++) {
-            g = f.get(c);
-            if (g.hidden || g.revision !== k[g.category]) {
-                continue
-            }
-            l.save();
-            h.attr = g;
-            h.useAttributes(l, b);
-            h.render(a, l, b);
-            l.restore()
-        }
-        h.attr = d
-    }
-});
-Ext.define("Ext.chart.label.Callout", {
-    extend: "Ext.draw.modifier.Modifier",
-    prepareAttributes: function(a) {
-        if (!a.hasOwnProperty("calloutOriginal")) {
-            a.calloutOriginal = Ext.Object.chain(a);
-            a.calloutOriginal.prototype = a
-        }
-        if (this._previous) {
-            this._previous.prepareAttributes(a.calloutOriginal)
-        }
-    },
-    setAttrs: function(e, h) {
-        var d = e.callout,
-            i = e.calloutOriginal,
-            l = e.bbox.plain,
-            c = (l.width || 0) + e.labelOverflowPadding,
-            m = (l.height || 0) + e.labelOverflowPadding,
-            p, o;
-        if ("callout" in h) {
-            d = h.callout
-        }
-        if ("callout" in h || "calloutPlaceX" in h || "calloutPlaceY" in h || "x" in h || "y" in h) {
-            var n = "rotationRads" in h ? i.rotationRads = h.rotationRads : i.rotationRads,
-                g = "x" in h ? (i.x = h.x) : i.x,
-                f = "y" in h ? (i.y = h.y) : i.y,
-                b = "calloutPlaceX" in h ? h.calloutPlaceX : e.calloutPlaceX,
-                a = "calloutPlaceY" in h ? h.calloutPlaceY : e.calloutPlaceY,
-                k = "calloutVertical" in h ? h.calloutVertical : e.calloutVertical,
-                j;
-            n %= Math.PI * 2;
-            if (Math.cos(n) < 0) {
-                n = (n + Math.PI) % (Math.PI * 2)
-            }
-            if (n > Math.PI) {
-                n -= Math.PI * 2
-            }
-            if (k) {
-                n = n * (1 - d) - Math.PI / 2 * d;
-                j = c;
-                c = m;
-                m = j
-            } else {
-                n = n * (1 - d)
-            }
-            h.rotationRads = n;
-            h.x = g * (1 - d) + b * d;
-            h.y = f * (1 - d) + a * d;
-            p = b - g;
-            o = a - f;
-            if (Math.abs(o * c) > Math.abs(p * m)) {
-                if (o > 0) {
-                    h.calloutEndX = h.x - (m / 2) * (p / o) * d;
-                    h.calloutEndY = h.y - (m / 2) * d
-                } else {
-                    h.calloutEndX = h.x + (m / 2) * (p / o) * d;
-                    h.calloutEndY = h.y + (m / 2) * d
-                }
-            } else {
-                if (p > 0) {
-                    h.calloutEndX = h.x - c / 2;
-                    h.calloutEndY = h.y - (c / 2) * (o / p) * d
-                } else {
-                    h.calloutEndX = h.x + c / 2;
-                    h.calloutEndY = h.y + (c / 2) * (o / p) * d
-                }
-            }
-            if (h.calloutStartX && h.calloutStartY) {
-                h.calloutHasLine = (p > 0 && h.calloutStartX < h.calloutEndX) || (p <= 0 && h.calloutStartX > h.calloutEndX) || (o > 0 && h.calloutStartY < h.calloutEndY) || (o <= 0 && h.calloutStartY > h.calloutEndY)
-            } else {
-                h.calloutHasLine = true
-            }
-        }
-        return h
-    },
-    pushDown: function(a, b) {
-        b = this.callParent([a.calloutOriginal, b]);
-        return this.setAttrs(a, b)
-    },
-    popUp: function(a, b) {
-        a = a.prototype;
-        b = this.setAttrs(a, b);
-        if (this._next) {
-            return this._next.popUp(a, b)
-        } else {
-            return Ext.apply(a, b)
-        }
-    }
-});
-Ext.define("Ext.chart.label.Label", {
-    extend: "Ext.draw.sprite.Text",
-    requires: ["Ext.chart.label.Callout"],
-    inheritableStatics: {
-        def: {
-            processors: {
-                callout: "limited01",
-                calloutHasLine: "bool",
-                calloutPlaceX: "number",
-                calloutPlaceY: "number",
-                calloutStartX: "number",
-                calloutStartY: "number",
-                calloutEndX: "number",
-                calloutEndY: "number",
-                calloutColor: "color",
-                calloutWidth: "number",
-                calloutVertical: "bool",
-                labelOverflowPadding: "number",
-                display: "enums(none,under,over,rotate,insideStart,insideEnd,inside,outside)",
-                orientation: "enums(horizontal,vertical)",
-                renderer: "default"
-            },
-            defaults: {
-                callout: 0,
-                calloutHasLine: true,
-                calloutPlaceX: 0,
-                calloutPlaceY: 0,
-                calloutStartX: 0,
-                calloutStartY: 0,
-                calloutEndX: 0,
-                calloutEndY: 0,
-                calloutWidth: 1,
-                calloutVertical: false,
-                calloutColor: "black",
-                labelOverflowPadding: 5,
-                display: "none",
-                orientation: "",
-                renderer: null
-            },
-            triggers: {
-                callout: "transform",
-                calloutPlaceX: "transform",
-                calloutPlaceY: "transform",
-                labelOverflowPadding: "transform",
-                calloutRotation: "transform",
-                display: "hidden"
-            },
-            updaters: {
-                hidden: function(a) {
-                    a.hidden = a.display === "none"
-                }
-            }
-        }
-    },
-    config: {
-        fx: {
-            customDurations: {
-                callout: 200
-            }
-        },
-        field: null,
-        calloutLine: true
-    },
-    applyCalloutLine: function(a) {
-        if (a) {
-            return Ext.apply({}, a)
-        }
-    },
-    prepareModifiers: function() {
-        this.callParent(arguments);
-        this.calloutModifier = new Ext.chart.label.Callout({
-            sprite: this
-        });
-        this.fx.setNext(this.calloutModifier);
-        this.calloutModifier.setNext(this.topModifier)
-    },
-    render: function(b, c) {
-        var e = this,
-            a = e.attr,
-            d = a.calloutColor;
-        c.save();
-        c.globalAlpha *= a.callout;
-        if (c.globalAlpha > 0 && a.calloutHasLine) {
-            if (d && d.isGradient) {
-                d = d.getStops()[0].color
-            }
-            c.strokeStyle = d;
-            c.fillStyle = d;
-            c.lineWidth = a.calloutWidth;
-            c.beginPath();
-            c.moveTo(e.attr.calloutStartX, e.attr.calloutStartY);
-            c.lineTo(e.attr.calloutEndX, e.attr.calloutEndY);
-            c.stroke();
-            c.beginPath();
-            c.arc(e.attr.calloutStartX, e.attr.calloutStartY, 1 * a.calloutWidth, 0, 2 * Math.PI, true);
-            c.fill();
-            c.beginPath();
-            c.arc(e.attr.calloutEndX, e.attr.calloutEndY, 1 * a.calloutWidth, 0, 2 * Math.PI, true);
-            c.fill()
-        }
-        c.restore();
-        Ext.draw.sprite.Text.prototype.render.apply(e, arguments)
-    }
-});
-Ext.define("Ext.chart.series.Series", {
-    requires: ["Ext.chart.Markers", "Ext.chart.label.Label", "Ext.tip.ToolTip"],
-    mixins: ["Ext.mixin.Observable", "Ext.mixin.Bindable"],
-    isSeries: true,
-    defaultBindProperty: "store",
-    type: null,
-    seriesType: "sprite",
-    identifiablePrefix: "ext-line-",
-    observableType: "series",
-    darkerStrokeRatio: 0.15,
-    config: {
-        chart: null,
-        title: null,
-        renderer: null,
-        showInLegend: true,
-        triggerAfterDraw: false,
-        style: {},
-        subStyle: {},
-        themeStyle: {},
-        colors: null,
-        useDarkerStrokeColor: true,
-        store: null,
-        label: {},
-        labelOverflowPadding: null,
-        showMarkers: true,
-        marker: null,
-        markerSubStyle: null,
-        itemInstancing: null,
-        background: null,
-        highlightItem: null,
-        surface: null,
-        overlaySurface: null,
-        hidden: false,
-        highlight: false,
-        highlightCfg: {
-            merge: function(a) {
-                return a
-            },
-            $value: {
-                fillStyle: "yellow",
-                strokeStyle: "red"
-            }
-        },
-        animation: null,
-        tooltip: null
-    },
-    directions: [],
-    sprites: null,
-    themeColorCount: function() {
-        return 1
-    },
-    isStoreDependantColorCount: false,
-    themeMarkerCount: function() {
-        return 0
-    },
-    getFields: function(f) {
-        var e = this,
-            a = [],
-            c, b, d;
-        for (b = 0, d = f.length; b < d; b++) {
-            c = e["get" + f[b] + "Field"]();
-            if (Ext.isArray(c)) {
-                a.push.apply(a, c)
-            } else {
-                a.push(c)
-            }
-        }
-        return a
-    },
-    applyAnimation: function(a, b) {
-        if (!a) {
-            a = {
-                duration: 0
-            }
-        } else {
-            if (a === true) {
-                a = {
-                    easing: "easeInOut",
-                    duration: 500
-                }
-            }
-        }
-        return b ? Ext.apply({}, a, b) : a
-    },
-    getAnimation: function() {
-        var a = this.getChart();
-        if (a && a.animationSuspendCount) {
-            return {
-                duration: 0
-            }
-        } else {
-            return this.callParent()
-        }
-    },
-    updateTitle: function(a) {
-        var j = this,
-            g = j.getChart();
-        if (!g || g.isInitializing) {
-            return
-        }
-        a = Ext.Array.from(a);
-        var c = g.getSeries(),
-            b = Ext.Array.indexOf(c, j),
-            e = g.getLegendStore(),
-            h = j.getYField(),
-            d, l, k, f;
-        if (e.getCount() && b !== -1) {
-            f = h ? Math.min(a.length, h.length) : a.length;
-            for (d = 0; d < f; d++) {
-                k = a[d];
-                l = e.getAt(b + d);
-                if (k && l) {
-                    l.set("name", k)
-                }
-            }
-        }
-    },
-    applyHighlight: function(a, b) {
-        if (Ext.isObject(a)) {
-            a = Ext.merge({}, this.config.highlightCfg, a)
-        } else {
-            if (a === true) {
-                a = this.config.highlightCfg
-            }
-        }
-        return Ext.apply(b || {}, a)
-    },
-    updateHighlight: function(a) {
-        this.getStyle();
-        if (!Ext.Object.isEmpty(a)) {
-            this.addItemHighlight()
-        }
-    },
-    updateHighlightCfg: function(a) {
-        if (!Ext.Object.equals(a, this.defaultConfig.highlightCfg)) {
-            this.addItemHighlight()
-        }
-    },
-    applyItemInstancing: function(a, b) {
-        return Ext.merge(b || {}, a)
-    },
-    setAttributesForItem: function(c, d) {
-        var b = c && c.sprite,
-            a;
-        if (b) {
-            if (b.itemsMarker && c.category === "items") {
-                b.putMarker(c.category, d, c.index, false, true)
-            }
-            if (b.isMarkerHolder && c.category === "markers") {
-                b.putMarker(c.category, d, c.index, false, true)
-            } else {
-                if (b.isInstancing) {
-                    b.setAttributesFor(c.index, d)
-                } else {
-                    if (Ext.isArray(b)) {
-                        for (a = 0; a < b.length; a++) {
-                            b[a].setAttributes(d)
-                        }
-                    } else {
-                        b.setAttributes(d)
-                    }
-                }
-            }
-        }
-    },
-    getBBoxForItem: function(a) {
-        if (a && a.sprite) {
-            if (a.sprite.itemsMarker && a.category === "items") {
-                return a.sprite.getMarkerBBox(a.category, a.index)
-            } else {
-                if (a.sprite instanceof Ext.draw.sprite.Instancing) {
-                    return a.sprite.getBBoxFor(a.index)
-                } else {
-                    return a.sprite.getBBox()
-                }
-            }
-        }
-        return null
-    },
-    applyHighlightItem: function(d, a) {
-        if (d === a) {
-            return
-        }
-        if (Ext.isObject(d) && Ext.isObject(a)) {
-            var c = d.sprite === a.sprite,
-                b = d.index === a.index;
-            if (c && b) {
-                return
-            }
-        }
-        return d
-    },
-    updateHighlightItem: function(b, a) {
-        this.setAttributesForItem(a, {
-            highlighted: false
-        });
-        this.setAttributesForItem(b, {
-            highlighted: true
-        })
-    },
-    constructor: function(a) {
-        var b = this,
-            c;
-        a = a || {};
-        if (a.tips) {
-            a = Ext.apply({
-                tooltip: a.tips
-            }, a)
-        }
-        if (a.highlightCfg) {
-            a = Ext.apply({
-                highlight: a.highlightCfg
-            }, a)
-        }
-        if ("id" in a) {
-            c = a.id
-        } else {
-            if ("id" in b.config) {
-                c = b.config.id
-            } else {
-                c = b.getId()
-            }
-        }
-        b.setId(c);
-        b.sprites = [];
-        b.dataRange = [];
-        b.mixins.observable.constructor.call(b, a);
-        b.initBindable()
-    },
-    lookupViewModel: function(a) {
-        var b = this.getChart();
-        return b ? b.lookupViewModel(a) : null
-    },
-    applyTooltip: function(c, b) {
-        var a = Ext.apply({
-            xtype: "tooltip",
-            renderer: Ext.emptyFn,
-            constrainPosition: true,
-            shrinkWrapDock: true,
-            autoHide: true,
-            offsetX: 10,
-            offsetY: 10
-        }, c);
-        return Ext.create(a)
-    },
-    updateTooltip: function() {
-        this.addItemHighlight()
-    },
-    addItemHighlight: function() {
-        var d = this.getChart();
-        if (!d) {
-            return
-        }
-        var e = d.getInteractions(),
-            c, a, b;
-        for (c = 0; c < e.length; c++) {
-            a = e[c];
-            if (a.isItemHighlight || a.isItemEdit) {
-                b = true;
-                break
-            }
-        }
-        if (!b) {
-            e.push("itemhighlight");
-            d.setInteractions(e)
-        }
-    },
-    showTooltip: function(l, m) {
-        var d = this,
-            n = d.getTooltip(),
-            j, a, i, f, h, k, g, e, b, c;
-        if (!n) {
-            return
-        }
-        clearTimeout(d.tooltipTimeout);
-        b = n.config;
-        if (n.trackMouse) {
-            m[0] += b.offsetX;
-            m[1] += b.offsetY
-        } else {
-            j = l.sprite;
-            a = j.getSurface();
-            i = Ext.get(a.getId());
-            if (i) {
-                k = l.series.getBBoxForItem(l);
-                g = k.x + k.width / 2;
-                e = k.y + k.height / 2;
-                h = a.matrix.transformPoint([g, e]);
-                f = i.getXY();
-                c = a.getInherited().rtl;
-                g = c ? f[0] + i.getWidth() - h[0] : f[0] + h[0];
-                e = f[1] + h[1];
-                m = [g, e]
-            }
-        }
-        Ext.callback(n.renderer, n.scope, [n, l.record, l], 0, d);
-        n.show(m)
-    },
-    hideTooltip: function(b) {
-        var a = this,
-            c = a.getTooltip();
-        if (!c) {
-            return
-        }
-        clearTimeout(a.tooltipTimeout);
-        a.tooltipTimeout = Ext.defer(function() {
-            c.hide()
-        }, 1)
-    },
-    applyStore: function(a) {
-        return a && Ext.StoreManager.lookup(a)
-    },
-    getStore: function() {
-        return this._store || this.getChart() && this.getChart().getStore()
-    },
-    updateStore: function(b, a) {
-        var h = this,
-            g = h.getChart(),
-            c = g && g.getStore(),
-            f, j, e, d;
-        a = a || c;
-        if (a && a !== b) {
-            a.un({
-                datachanged: "onDataChanged",
-                update: "onDataChanged",
-                scope: h
-            })
-        }
-        if (b) {
-            b.on({
-                datachanged: "onDataChanged",
-                update: "onDataChanged",
-                scope: h
-            });
-            f = h.getSprites();
-            for (d = 0, e = f.length; d < e; d++) {
-                j = f[d];
-                if (j.setStore) {
-                    j.setStore(b)
-                }
-            }
-            h.onDataChanged()
-        }
-        h.fireEvent("storechange", h, b, a)
-    },
-    onStoreChange: function(b, a, c) {
-        if (!this._store) {
-            this.updateStore(a, c)
-        }
-    },
-    coordinate: function(o, m, e) {
-        var l = this,
-            p = l.getStore(),
-            h = l.getHidden(),
-            k = p.getData().items,
-            b = l["get" + o + "Axis"](),
-            f = {
-                min: Infinity,
-                max: -Infinity
-            },
-            q = l["fieldCategory" + o] || [o],
-            g = l.getFields(q),
-            d, n, c, a = {},
-            j = l.getSprites();
-        if (j.length > 0) {
-            if (!Ext.isBoolean(h) || !h) {
-                for (d = 0; d < q.length; d++) {
-                    n = g[d];
-                    c = l.coordinateData(k, n, b);
-                    l.getRangeOfData(c, f);
-                    a["data" + q[d]] = c
-                }
-            }
-            l.dataRange[m] = f.min;
-            l.dataRange[m + e] = f.max;
-            a["dataMin" + o] = f.min;
-            a["dataMax" + o] = f.max;
-            if (b) {
-                b.range = null;
-                a["range" + o] = b.getRange()
-            }
-            for (d = 0; d < j.length; d++) {
-                j[d].setAttributes(a)
-            }
-        }
-    },
-    coordinateData: function(b, h, d) {
-        var g = [],
-            f = b.length,
-            e = d && d.getLayout(),
-            c, a;
-        for (c = 0; c < f; c++) {
-            a = b[c].data[h];
-            if (!Ext.isEmpty(a, true)) {
-                if (e) {
-                    g[c] = e.getCoordFor(a, h, c, b)
-                } else {
-                    g[c] = +a
-                }
-            } else {
-                g[c] = a
-            }
-        }
-        return g
-    },
-    getRangeOfData: function(g, b) {
-        var e = g.length,
-            d = b.min,
-            a = b.max,
-            c, f;
-        for (c = 0; c < e; c++) {
-            f = g[c];
-            if (f < d) {
-                d = f
-            }
-            if (f > a) {
-                a = f
-            }
-        }
-        b.min = d;
-        b.max = a
-    },
-    updateLabelData: function() {
-        var h = this,
-            l = h.getStore(),
-            g = l.getData().items,
-            f = h.getSprites(),
-            a = h.getLabel().getTemplate(),
-            n = Ext.Array.from(a.getField()),
-            c, b, e, d, m, k;
-        if (!f.length || !n.length) {
-            return
-        }
-        for (c = 0; c < f.length; c++) {
-            d = [];
-            m = f[c];
-            k = m.getField();
-            if (Ext.Array.indexOf(n, k) < 0) {
-                k = n[c]
-            }
-            for (b = 0, e = g.length; b < e; b++) {
-                d.push(g[b].get(k))
-            }
-            m.setAttributes({
-                labels: d
-            })
-        }
-    },
-    processData: function() {
-        if (!this.getStore()) {
-            return
-        }
-        var d = this,
-            f = this.directions,
-            a, c = f.length,
-            e, b;
-        for (a = 0; a < c; a++) {
-            e = f[a];
-            b = d["get" + e + "Axis"]();
-            if (b) {
-                b.processData(d);
-                continue
-            }
-            if (d["coordinate" + e]) {
-                d["coordinate" + e]()
-            }
-        }
-        d.updateLabelData()
-    },
-    applyBackground: function(a) {
-        if (this.getChart()) {
-            this.getSurface().setBackground(a);
-            return this.getSurface().getBackground()
-        } else {
-            return a
-        }
-    },
-    updateChart: function(d, a) {
-        var c = this,
-            b = c._store;
-        if (a) {
-            a.un("axeschange", "onAxesChange", c);
-            c.clearSprites();
-            c.setSurface(null);
-            c.setOverlaySurface(null);
-            a.unregister(c);
-            c.onChartDetached(a);
-            if (!b) {
-                c.updateStore(null)
-            }
-        }
-        if (d) {
-            c.setSurface(d.getSurface("series"));
-            c.setOverlaySurface(d.getSurface("overlay"));
-            d.on("axeschange", "onAxesChange", c);
-            if (d.getAxes()) {
-                c.onAxesChange(d)
-            }
-            c.onChartAttached(d);
-            d.register(c);
-            if (!b) {
-                c.updateStore(d.getStore())
-            }
-        }
-    },
-    onAxesChange: function(h) {
-        var k = this,
-            g = h.getAxes(),
-            c, a = {},
-            b = {},
-            e = false,
-            j = this.directions,
-            l, d, f;
-        for (d = 0, f = j.length; d < f; d++) {
-            l = j[d];
-            b[l] = k.getFields(k["fieldCategory" + l])
-        }
-        for (d = 0, f = g.length; d < f; d++) {
-            c = g[d];
-            if (!a[c.getDirection()]) {
-                a[c.getDirection()] = [c]
-            } else {
-                a[c.getDirection()].push(c)
-            }
-        }
-        for (d = 0, f = j.length; d < f; d++) {
-            l = j[d];
-            if (k["get" + l + "Axis"]()) {
-                continue
-            }
-            if (a[l]) {
-                c = k.findMatchingAxis(a[l], b[l]);
-                if (c) {
-                    k["set" + l + "Axis"](c);
-                    if (c.getNeedHighPrecision()) {
-                        e = true
-                    }
-                }
-            }
-        }
-        this.getSurface().setHighPrecision(e)
-    },
-    findMatchingAxis: function(f, e) {
-        var d, c, b, a;
-        for (b = 0; b < f.length; b++) {
-            d = f[b];
-            c = d.getFields();
-            if (!c.length) {
-                return d
-            } else {
-                if (e) {
-                    for (a = 0; a < e.length; a++) {
-                        if (Ext.Array.indexOf(c, e[a]) >= 0) {
-                            return d
-                        }
-                    }
-                }
-            }
-        }
-    },
-    onChartDetached: function(a) {
-        var b = this;
-        b.fireEvent("chartdetached", a, b);
-        a.un("storechange", "onStoreChange", b)
-    },
-    onChartAttached: function(a) {
-        var b = this;
-        b.setBackground(b.getBackground());
-        b.fireEvent("chartattached", a, b);
-        a.on("storechange", "onStoreChange", b);
-        b.processData()
-    },
-    updateOverlaySurface: function(a) {
-        var b = this;
-        if (a) {
-            if (b.getLabel()) {
-                b.getOverlaySurface().add(b.getLabel())
-            }
-        }
-    },
-    applyLabel: function(a, b) {
-        if (!b) {
-            b = new Ext.chart.Markers({
-                zIndex: 10
-            });
-            b.setTemplate(new Ext.chart.label.Label(a))
-        } else {
-            b.getTemplate().setAttributes(a)
-        }
-        return b
-    },
-    createItemInstancingSprite: function(c, b) {
-        var e = this,
-            f = new Ext.chart.Markers(),
-            a, d;
-        f.setAttributes({
-            zIndex: Number.MAX_VALUE
-        });
-        a = Ext.apply({}, b);
-        if (e.getHighlight()) {
-            a.highlight = e.getHighlight();
-            a.modifiers = ["highlight"]
-        }
-        f.setTemplate(a);
-        d = f.getTemplate();
-        d.setAttributes(e.getStyle());
-        d.fx.on("animationstart", "onSpriteAnimationStart", this);
-        d.fx.on("animationend", "onSpriteAnimationEnd", this);
-        c.bindMarker("items", f);
-        e.getSurface().add(f);
-        return f
-    },
-    getDefaultSpriteConfig: function() {
-        return {
-            type: this.seriesType,
-            renderer: this.getRenderer()
-        }
-    },
-    updateRenderer: function(c) {
-        var b = this,
-            a = b.getChart(),
-            d;
-        if (a && a.isInitializing) {
-            return
-        }
-        d = b.getSprites();
-        if (d.length) {
-            d[0].setAttributes({
-                renderer: c || null
-            });
-            if (a && !a.isInitializing) {
-                a.redraw()
-            }
-        }
-    },
-    updateShowMarkers: function(a) {
-        var d = this.getSprites(),
-            b = d && d[0],
-            c = b && b.getMarker("markers");
-        if (c) {
-            c.getTemplate().setAttributes({
-                hidden: !a
-            })
-        }
-    },
-    createSprite: function() {
-        var f = this,
-            a = f.getSurface(),
-            e = f.getItemInstancing(),
-            d = a.add(f.getDefaultSpriteConfig()),
-            b = f.getMarker(),
-            g, c;
-        d.setAttributes(f.getStyle());
-        d.setSeries(f);
-        if (e) {
-            d.itemsMarker = f.createItemInstancingSprite(d, e)
-        }
-        if (d.bindMarker) {
-            if (b) {
-                g = new Ext.chart.Markers();
-                c = Ext.Object.merge({}, b);
-                if (f.getHighlight()) {
-                    c.highlight = f.getHighlight();
-                    c.modifiers = ["highlight"]
-                }
-                g.setTemplate(c);
-                g.getTemplate().fx.setCustomDurations({
-                    translationX: 0,
-                    translationY: 0
-                });
-                d.dataMarker = g;
-                d.bindMarker("markers", g);
-                f.getOverlaySurface().add(g)
-            }
-            if (f.getLabel().getTemplate().getField()) {
-                d.bindMarker("labels", f.getLabel())
-            }
-        }
-        if (d.setStore) {
-            d.setStore(f.getStore())
-        }
-        d.fx.on("animationstart", "onSpriteAnimationStart", f);
-        d.fx.on("animationend", "onSpriteAnimationEnd", f);
-        f.sprites.push(d);
-        return d
-    },
-    getSprites: Ext.emptyFn,
-    onDataChanged: function() {
-        var d = this,
-            c = d.getChart(),
-            b = c && c.getStore(),
-            a = d.getStore();
-        if (a !== b) {
-            d.processData()
-        }
-    },
-    isXType: function(a) {
-        return a === "series"
-    },
-    getItemId: function() {
-        return this.getId()
-    },
-    applyThemeStyle: function(e, a) {
-        var b = this,
-            d, c;
-        d = e && e.subStyle && e.subStyle.fillStyle;
-        c = d && e.subStyle.strokeStyle;
-        if (d && !c) {
-            e.subStyle.strokeStyle = b.getStrokeColorsFromFillColors(d)
-        }
-        d = e && e.markerSubStyle && e.markerSubStyle.fillStyle;
-        c = d && e.markerSubStyle.strokeStyle;
-        if (d && !c) {
-            e.markerSubStyle.strokeStyle = b.getStrokeColorsFromFillColors(d)
-        }
-        return Ext.apply(a || {}, e)
-    },
-    applyStyle: function(c, b) {
-        var a = Ext.ClassManager.get(Ext.ClassManager.getNameByAlias("sprite." + this.seriesType));
-        if (a && a.def) {
-            c = a.def.normalize(c)
-        }
-        return Ext.apply({}, c, b)
-    },
-    applySubStyle: function(b, c) {
-        var a = Ext.ClassManager.get(Ext.ClassManager.getNameByAlias("sprite." + this.seriesType));
-        if (a && a.def) {
-            b = a.def.batchedNormalize(b, true)
-        }
-        return Ext.merge({}, c, b)
-    },
-    applyMarker: function(c, a) {
-        var d = (c && c.type) || (a && a.type) || "circle",
-            b = Ext.ClassManager.get(Ext.ClassManager.getNameByAlias("sprite." + d));
-        if (b && b.def) {
-            c = b.def.normalize(Ext.isObject(c) ? c : {}, true);
-            c.type = d
-        }
-        return Ext.merge(a || {}, c)
-    },
-    applyMarkerSubStyle: function(c, a) {
-        var d = (c && c.type) || (a && a.type) || "circle",
-            b = Ext.ClassManager.get(Ext.ClassManager.getNameByAlias("sprite." + d));
-        if (b && b.def) {
-            c = b.def.batchedNormalize(c, true)
-        }
-        return Ext.merge(a || {}, c)
-    },
-    updateHidden: function(b) {
-        var a = this;
-        a.getColors();
-        a.getSubStyle();
-        a.setSubStyle({
-            hidden: b
-        });
-        a.processData();
-        a.doUpdateStyles();
-        if (!Ext.isArray(b)) {
-            a.updateLegendStore(b)
-        }
-    },
-    updateLegendStore: function(f, b) {
-        var e = this,
-            d = e.getChart(),
-            c = d.getLegendStore(),
-            g = e.getId(),
-            a;
-        if (c) {
-            if (arguments.length > 1) {
-                a = c.findBy(function(h) {
-                    return h.get("series") === g && h.get("index") === b
-                });
-                if (a !== -1) {
-                    a = c.getAt(a)
-                }
-            } else {
-                a = c.findRecord("series", g)
-            }
-            if (a && a.get("disabled") !== f) {
-                a.set("disabled", f)
-            }
-        }
-    },
-    setHiddenByIndex: function(a, c) {
-        var b = this;
-        if (Ext.isArray(b.getHidden())) {
-            b.getHidden()[a] = c;
-            b.updateHidden(b.getHidden());
-            b.updateLegendStore(c, a)
-        } else {
-            b.setHidden(c)
-        }
-    },
-    getStrokeColorsFromFillColors: function(a) {
-        var c = this,
-            e = c.getUseDarkerStrokeColor(),
-            b = (Ext.isNumber(e) ? e : c.darkerStrokeRatio),
-            d;
-        if (e) {
-            d = Ext.Array.map(a, function(f) {
-                f = Ext.isString(f) ? f : f.stops[0].color;
-                f = Ext.draw.Color.fromString(f);
-                return f.createDarker(b).toString()
-            })
-        } else {
-            d = Ext.Array.clone(a)
-        }
-        return d
-    },
-    updateThemeColors: function(b) {
-        var c = this,
-            d = c.getThemeStyle(),
-            a = Ext.Array.clone(b),
-            f = c.getStrokeColorsFromFillColors(b),
-            e = {
-                fillStyle: a,
-                strokeStyle: f
-            };
-        d.subStyle = Ext.apply(d.subStyle || {}, e);
-        d.markerSubStyle = Ext.apply(d.markerSubStyle || {}, e);
-        c.doUpdateStyles()
-    },
-    themeOnlyIfConfigured: {},
-    updateTheme: function(d) {
-        var h = this,
-            a = d.getSeries(),
-            n = h.getInitialConfig(),
-            c = h.defaultConfig,
-            f = h.getConfigurator().configs,
-            j = a.defaults,
-            k = a[h.type],
-            g = h.themeOnlyIfConfigured,
-            l, i, o, b, m, e;
-        a = Ext.merge({}, j, k);
-        for (l in a) {
-            i = a[l];
-            e = f[l];
-            if (i !== null && i !== undefined && e) {
-                m = n[l];
-                o = Ext.isObject(i);
-                b = m === c[l];
-                if (o) {
-                    if (b && g[l]) {
-                        continue
-                    }
-                    i = Ext.merge({}, i, m)
-                }
-                if (b || o) {
-                    h[e.names.set](i)
-                }
-            }
-        }
-    },
-    updateChartColors: function(a) {
-        var b = this;
-        if (!b.getColors()) {
-            b.updateThemeColors(a)
-        }
-    },
-    updateColors: function(a) {
-        this.updateThemeColors(a)
-    },
-    updateStyle: function() {
-        this.doUpdateStyles()
-    },
-    updateSubStyle: function() {
-        this.doUpdateStyles()
-    },
-    updateThemeStyle: function() {
-        this.doUpdateStyles()
-    },
-    doUpdateStyles: function() {
-        var g = this,
-            h = g.sprites,
-            d = g.getItemInstancing(),
-            c = 0,
-            f = h && h.length,
-            a = g.getConfig("showMarkers", true),
-            b = g.getMarker(),
-            e;
-        for (; c < f; c++) {
-            e = g.getStyleByIndex(c);
-            if (d) {
-                h[c].itemsMarker.getTemplate().setAttributes(e)
-            }
-            h[c].setAttributes(e);
-            if (b && h[c].dataMarker) {
-                h[c].dataMarker.getTemplate().setAttributes(g.getMarkerStyleByIndex(c))
-            }
-        }
-    },
-    getStyleWithTheme: function() {
-        var b = this,
-            c = b.getThemeStyle(),
-            d = (c && c.style) || {},
-            a = Ext.applyIf(Ext.apply({}, b.getStyle()), d);
-        return a
-    },
-    getSubStyleWithTheme: function() {
-        var c = this,
-            d = c.getThemeStyle(),
-            a = (d && d.subStyle) || {},
-            b = Ext.applyIf(Ext.apply({}, c.getSubStyle()), a);
-        return b
-    },
-    getStyleByIndex: function(b) {
-        var e = this,
-            h = e.getThemeStyle(),
-            d, g, c, f, a = {};
-        d = e.getStyle();
-        g = (h && h.style) || {};
-        c = e.styleDataForIndex(e.getSubStyle(), b);
-        f = e.styleDataForIndex((h && h.subStyle), b);
-        Ext.apply(a, g);
-        Ext.apply(a, f);
-        Ext.apply(a, d);
-        Ext.apply(a, c);
-        return a
-    },
-    getMarkerStyleByIndex: function(d) {
-        var g = this,
-            c = g.getThemeStyle(),
-            a, e, k, j, b, l, h, f, m = {};
-        a = g.getStyle();
-        e = (c && c.style) || {};
-        k = g.styleDataForIndex(g.getSubStyle(), d);
-        if (k.hasOwnProperty("hidden")) {
-            k.hidden = k.hidden || !this.getConfig("showMarkers", true)
-        }
-        j = g.styleDataForIndex((c && c.subStyle), d);
-        b = g.getMarker();
-        l = (c && c.marker) || {};
-        h = g.getMarkerSubStyle();
-        f = g.styleDataForIndex((c && c.markerSubStyle), d);
-        Ext.apply(m, e);
-        Ext.apply(m, j);
-        Ext.apply(m, l);
-        Ext.apply(m, f);
-        Ext.apply(m, a);
-        Ext.apply(m, k);
-        Ext.apply(m, b);
-        Ext.apply(m, h);
-        return m
-    },
-    styleDataForIndex: function(d, c) {
-        var e, b, a = {};
-        if (d) {
-            for (b in d) {
-                e = d[b];
-                if (Ext.isArray(e)) {
-                    a[b] = e[c % e.length]
-                } else {
-                    a[b] = e
-                }
-            }
-        }
-        return a
-    },
-    getItemForPoint: Ext.emptyFn,
-    getItemByIndex: function(a, e) {
-        var d = this,
-            f = d.getSprites(),
-            b = f && f[0],
-            c;
-        if (!b) {
-            return
-        }
-        if (e === undefined && b.isMarkerHolder) {
-            e = d.getItemInstancing() ? "items" : "markers"
-        } else {
-            if (!e || e === "" || e === "sprites") {
-                b = f[a]
-            }
-        }
-        if (b) {
-            c = {
-                series: d,
-                category: e,
-                index: a,
-                record: d.getStore().getData().items[a],
-                field: d.getYField(),
-                sprite: b
-            };
-            return c
-        }
-    },
-    onSpriteAnimationStart: function(a) {
-        this.fireEvent("animationstart", this, a)
-    },
-    onSpriteAnimationEnd: function(a) {
-        this.fireEvent("animationend", this, a)
-    },
-    resolveListenerScope: function(e) {
-        var d = this,
-            a = Ext._namedScopes[e],
-            c = d.getChart(),
-            b;
-        if (!a) {
-            b = c ? c.resolveListenerScope(e, false) : (e || d)
-        } else {
-            if (a.isThis) {
-                b = d
-            } else {
-                if (a.isController) {
-                    b = c ? c.resolveListenerScope(e, false) : d
-                } else {
-                    if (a.isSelf) {
-                        b = c ? c.resolveListenerScope(e, false) : d;
-                        if (b === c && !c.getInheritedConfig("defaultListenerScope")) {
-                            b = d
-                        }
-                    }
-                }
-            }
-        }
-        return b
-    },
-    provideLegendInfo: function(a) {
-        a.push({
-            name: this.getTitle() || this.getId(),
-            mark: "black",
-            disabled: this.getHidden(),
-            series: this.getId(),
-            index: 0
-        })
-    },
-    clearSprites: function() {
-        var d = this.sprites,
-            b, a, c;
-        for (a = 0, c = d.length; a < c; a++) {
-            b = d[a];
-            if (b && b.isSprite) {
-                b.destroy()
-            }
-        }
-        this.sprites = []
-    },
-    destroy: function() {
-        var b = this,
-            a = b._store,
-            c = b.getConfig("tooltip", true);
-        if (a && a.getAutoDestroy()) {
-            Ext.destroy(a)
-        }
-        b.setChart(null);
-        b.clearListeners();
-        if (c) {
-            Ext.destroy(c);
-            clearTimeout(b.tooltipTimeout)
-        }
-        b.callParent()
-    }
-});
-Ext.define("Ext.chart.interactions.Abstract", {
-    xtype: "interaction",
-    mixins: {
-        observable: "Ext.mixin.Observable"
-    },
-    config: {
-        gestures: {
-            tap: "onGesture"
-        },
-        chart: null,
-        enabled: true
-    },
-    throttleGap: 0,
-    stopAnimationBeforeSync: false,
-    constructor: function(a) {
-        var b = this,
-            c;
-        a = a || {};
-        if ("id" in a) {
-            c = a.id
-        } else {
-            if ("id" in b.config) {
-                c = b.config.id
-            } else {
-                c = b.getId()
-            }
-        }
-        b.setId(c);
-        b.mixins.observable.constructor.call(b, a)
-    },
-    initialize: Ext.emptyFn,
-    updateChart: function(c, a) {
-        var b = this;
-        if (a === c) {
-            return
-        }
-        if (a) {
-            a.unregister(b);
-            b.removeChartListener(a)
-        }
-        if (c) {
-            c.register(b);
-            b.addChartListener()
-        }
-    },
-    updateEnabled: function(a) {
-        var c = this,
-            b = c.getChart();
-        if (b) {
-            if (a) {
-                c.addChartListener()
-            } else {
-                c.removeChartListener(b)
-            }
-        }
-    },
-    onGesture: Ext.emptyFn,
-    getItemForEvent: function(d) {
-        var b = this,
-            a = b.getChart(),
-            c = a.getEventXY(d);
-        return a.getItemForPoint(c[0], c[1])
-    },
-    getItemsForEvent: function(d) {
-        var b = this,
-            a = b.getChart(),
-            c = a.getEventXY(d);
-        return a.getItemsForPoint(c[0], c[1])
-    },
-    addChartListener: function() {
-        var c = this,
-            b = c.getChart(),
-            e = c.getGestures(),
-            a;
-        if (!c.getEnabled()) {
-            return
-        }
-
-        function d(f, g) {
-            b.addElementListener(f, c.listeners[f] = function(j) {
-                var i = c.getLocks(),
-                    h;
-                if (c.getEnabled() && (!(f in i) || i[f] === c)) {
-                    h = (Ext.isFunction(g) ? g : c[g]).apply(this, arguments);
-                    if (h === false && j && j.stopPropagation) {
-                        j.stopPropagation()
-                    }
-                    return h
-                }
-            }, c)
-        }
-        c.listeners = c.listeners || {};
-        for (a in e) {
-            d(a, e[a])
-        }
-    },
-    removeChartListener: function(c) {
-        var d = this,
-            e = d.getGestures(),
-            b;
-
-        function a(f) {
-            var g = d.listeners[f];
-            if (g) {
-                c.removeElementListener(f, g);
-                delete d.listeners[f]
-            }
-        }
-        if (d.listeners) {
-            for (b in e) {
-                a(b)
-            }
-        }
-    },
-    lockEvents: function() {
-        var d = this,
-            c = d.getLocks(),
-            a = Array.prototype.slice.call(arguments),
-            b = a.length;
-        while (b--) {
-            c[a[b]] = d
-        }
-    },
-    unlockEvents: function() {
-        var c = this.getLocks(),
-            a = Array.prototype.slice.call(arguments),
-            b = a.length;
-        while (b--) {
-            delete c[a[b]]
-        }
-    },
-    getLocks: function() {
-        var a = this.getChart();
-        return a.lockedEvents || (a.lockedEvents = {})
-    },
-    isMultiTouch: function() {
-        if (Ext.browser.is.IE10) {
-            return true
-        }
-        return !Ext.os.is.Desktop
-    },
-    initializeDefaults: Ext.emptyFn,
-    doSync: function() {
-        var b = this,
-            a = b.getChart();
-        if (b.syncTimer) {
-            clearTimeout(b.syncTimer);
-            b.syncTimer = null
-        }
-        if (b.stopAnimationBeforeSync) {
-            a.animationSuspendCount++
-        }
-        a.redraw();
-        if (b.stopAnimationBeforeSync) {
-            a.animationSuspendCount--
-        }
-        b.syncThrottle = Date.now() + b.throttleGap
-    },
-    sync: function() {
-        var a = this;
-        if (a.throttleGap && Ext.frameStartTime < a.syncThrottle) {
-            if (a.syncTimer) {
-                return
-            }
-            a.syncTimer = Ext.defer(function() {
-                a.doSync()
-            }, a.throttleGap)
-        } else {
-            a.doSync()
-        }
-    },
-    getItemId: function() {
-        return this.getId()
-    },
-    isXType: function(a) {
-        return a === "interaction"
-    },
-    destroy: function() {
-        var a = this;
-        a.setChart(null);
-        delete a.listeners;
-        a.callParent()
-    }
-}, function() {
-    if (Ext.os.is.Android4) {
-        this.prototype.throttleGap = 40
-    }
-});
-Ext.define("Ext.chart.MarkerHolder", {
-    extend: "Ext.Mixin",
-    mixinConfig: {
-        id: "markerHolder",
-        after: {
-            constructor: "constructor",
-            preRender: "preRender"
-        },
-        before: {
-            destroy: "destroy"
-        }
-    },
-    isMarkerHolder: true,
-    surfaceMatrix: null,
-    inverseSurfaceMatrix: null,
-    deprecated: {
-        6: {
-            methods: {
-                getBoundMarker: {
-                    message: "Please use the 'getMarker' method instead.",
-                    fn: function(b) {
-                        var a = this.boundMarkers[b];
-                        return a ? [a] : a
-                    }
-                }
-            }
-        }
-    },
-    constructor: function() {
-        this.boundMarkers = {};
-        this.cleanRedraw = false
-    },
-    bindMarker: function(b, a) {
-        var c = this,
-            d = c.boundMarkers;
-        if (a && a.isMarkers) {
-            c.releaseMarker(b);
-            d[b] = a;
-            a.on("destroy", c.onMarkerDestroy, c)
-        }
-    },
-    onMarkerDestroy: function(a) {
-        this.releaseMarker(a)
-    },
-    releaseMarker: function(a) {
-        var c = this.boundMarkers,
-            b;
-        if (a && a.isMarkers) {
-            for (b in c) {
-                if (c[b] === a) {
-                    delete c[b];
-                    break
-                }
-            }
-        } else {
-            b = a;
-            a = c[b];
-            delete c[b]
-        }
-        return a || null
-    },
-    getMarker: function(a) {
-        return this.boundMarkers[a] || null
-    },
-    preRender: function() {
-        var f = this,
-            g = f.getId(),
-            d = f.boundMarkers,
-            e = f.getParent(),
-            c, a, b;
-        if (f.surfaceMatrix) {
-            b = f.surfaceMatrix.set(1, 0, 0, 1, 0, 0)
-        } else {
-            b = f.surfaceMatrix = new Ext.draw.Matrix()
-        }
-        f.cleanRedraw = !f.attr.dirty;
-        if (!f.cleanRedraw) {
-            for (c in d) {
-                a = d[c];
-                if (a) {
-                    a.clear(g)
-                }
-            }
-        }
-        while (e && e.attr && e.attr.matrix) {
-            b.prependMatrix(e.attr.matrix);
-            e = e.getParent()
-        }
-        b.prependMatrix(e.matrix);
-        f.surfaceMatrix = b;
-        f.inverseSurfaceMatrix = b.inverse(f.inverseSurfaceMatrix)
-    },
-    putMarker: function(d, a, c, g, e) {
-        var b = this.boundMarkers[d],
-            f = this.getId();
-        if (b) {
-            b.putMarkerFor(f, a, c, g, e)
-        }
-    },
-    getMarkerBBox: function(c, b, d) {
-        var a = this.boundMarkers[c],
-            e = this.getId();
-        if (a) {
-            return a.getMarkerBBoxFor(e, b, d)
-        }
-    },
-    destroy: function() {
-        var c = this.boundMarkers,
-            b, a;
-        for (b in c) {
-            a = c[b];
-            a.destroy()
-        }
-    }
-});
-Ext.define("Ext.chart.axis.sprite.Axis", {
-    extend: "Ext.draw.sprite.Sprite",
-    alias: "sprite.axis",
-    type: "axis",
-    mixins: {
-        markerHolder: "Ext.chart.MarkerHolder"
-    },
-    requires: ["Ext.draw.sprite.Text"],
-    inheritableStatics: {
-        def: {
-            processors: {
-                grid: "bool",
-                axisLine: "bool",
-                minorTicks: "bool",
-                minorTickSize: "number",
-                majorTicks: "bool",
-                majorTickSize: "number",
-                length: "number",
-                startGap: "number",
-                endGap: "number",
-                dataMin: "number",
-                dataMax: "number",
-                visibleMin: "number",
-                visibleMax: "number",
-                position: "enums(left,right,top,bottom,angular,radial,gauge)",
-                minStepSize: "number",
-                estStepSize: "number",
-                titleOffset: "number",
-                textPadding: "number",
-                min: "number",
-                max: "number",
-                centerX: "number",
-                centerY: "number",
-                radius: "number",
-                totalAngle: "number",
-                baseRotation: "number",
-                data: "default",
-                enlargeEstStepSizeByText: "bool"
-            },
-            defaults: {
-                grid: false,
-                axisLine: true,
-                minorTicks: false,
-                minorTickSize: 3,
-                majorTicks: true,
-                majorTickSize: 5,
-                length: 0,
-                startGap: 0,
-                endGap: 0,
-                visibleMin: 0,
-                visibleMax: 1,
-                dataMin: 0,
-                dataMax: 1,
-                position: "",
-                minStepSize: 0,
-                estStepSize: 20,
-                min: 0,
-                max: 1,
-                centerX: 0,
-                centerY: 0,
-                radius: 1,
-                baseRotation: 0,
-                data: null,
-                titleOffset: 0,
-                textPadding: 0,
-                scalingCenterY: 0,
-                scalingCenterX: 0,
-                strokeStyle: "black",
-                enlargeEstStepSizeByText: false
-            },
-            triggers: {
-                minorTickSize: "bbox",
-                majorTickSize: "bbox",
-                position: "bbox,layout",
-                axisLine: "bbox,layout",
-                min: "layout",
-                max: "layout",
-                length: "layout",
-                minStepSize: "layout",
-                estStepSize: "layout",
-                data: "layout",
-                dataMin: "layout",
-                dataMax: "layout",
-                visibleMin: "layout",
-                visibleMax: "layout",
-                enlargeEstStepSizeByText: "layout"
-            },
-            updaters: {
-                layout: "layoutUpdater"
-            }
-        }
-    },
-    config: {
-        label: null,
-        layout: null,
-        segmenter: null,
-        renderer: null,
-        layoutContext: null,
-        axis: null
-    },
-    thickness: 0,
-    stepSize: 0,
-    getBBox: function() {
-        return null
-    },
-    defaultRenderer: function(a) {
-        return this.segmenter.renderer(a, this)
-    },
-    layoutUpdater: function() {
-        var h = this,
-            f = h.getAxis().getChart();
-        if (f.isInitializing) {
-            return
-        }
-        var e = h.attr,
-            d = h.getLayout(),
-            g = f.getInherited().rtl,
-            b = e.dataMin + (e.dataMax - e.dataMin) * e.visibleMin,
-            i = e.dataMin + (e.dataMax - e.dataMin) * e.visibleMax,
-            c = e.position,
-            a = {
-                attr: e,
-                segmenter: h.getSegmenter(),
-                renderer: h.defaultRenderer
-            };
-        if (c === "left" || c === "right") {
-            e.translationX = 0;
-            e.translationY = i * e.length / (i - b);
-            e.scalingX = 1;
-            e.scalingY = -e.length / (i - b);
-            e.scalingCenterY = 0;
-            e.scalingCenterX = 0;
-            h.applyTransformations(true)
-        } else {
-            if (c === "top" || c === "bottom") {
-                if (g) {
-                    e.translationX = e.length + b * e.length / (i - b) + 1
-                } else {
-                    e.translationX = -b * e.length / (i - b)
-                }
-                e.translationY = 0;
-                e.scalingX = (g ? -1 : 1) * e.length / (i - b);
-                e.scalingY = 1;
-                e.scalingCenterY = 0;
-                e.scalingCenterX = 0;
-                h.applyTransformations(true)
-            }
-        }
-        if (d) {
-            d.calculateLayout(a);
-            h.setLayoutContext(a)
-        }
-    },
-    iterate: function(e, j) {
-        var c, g, a, b, h, d, k = Ext.Array.some,
-            m = Math.abs,
-            f;
-        if (e.getLabel) {
-            if (e.min < e.from) {
-                j.call(this, e.min, e.getLabel(e.min), -1, e)
-            }
-            for (c = 0; c <= e.steps; c++) {
-                j.call(this, e.get(c), e.getLabel(c), c, e)
-            }
-            if (e.max > e.to) {
-                j.call(this, e.max, e.getLabel(e.max), e.steps + 1, e)
-            }
-        } else {
-            b = this.getAxis();
-            h = b.floatingAxes;
-            d = [];
-            f = (e.to - e.from) / (e.steps + 1);
-            if (b.getFloating()) {
-                for (a in h) {
-                    d.push(h[a])
-                }
-            }
-
-            function l(i) {
-                return !d.length || k(d, function(n) {
-                    return m(n - i) > f
-                })
-            }
-            if (e.min < e.from && l(e.min)) {
-                j.call(this, e.min, e.min, -1, e)
-            }
-            for (c = 0; c <= e.steps; c++) {
-                g = e.get(c);
-                if (l(g)) {
-                    j.call(this, g, g, c, e)
-                }
-            }
-            if (e.max > e.to && l(e.max)) {
-                j.call(this, e.max, e.max, e.steps + 1, e)
-            }
-        }
-    },
-    renderTicks: function(l, m, s, p) {
-        var v = this,
-            k = v.attr,
-            u = k.position,
-            n = k.matrix,
-            e = 0.5 * k.lineWidth,
-            f = n.getXX(),
-            i = n.getDX(),
-            j = n.getYY(),
-            h = n.getDY(),
-            o = s.majorTicks,
-            d = k.majorTickSize,
-            a = s.minorTicks,
-            r = k.minorTickSize;
-        if (o) {
-            switch (u) {
-                case "right":
-                    function q(w) {
-                        return function(x, z, y) {
-                            x = l.roundPixel(x * j + h) + e;
-                            m.moveTo(0, x);
-                            m.lineTo(w, x)
-                        }
-                    }
-                    v.iterate(o, q(d));
-                    a && v.iterate(a, q(r));
-                    break;
-                case "left":
-                    function t(w) {
-                        return function(x, z, y) {
-                            x = l.roundPixel(x * j + h) + e;
-                            m.moveTo(p[2] - w, x);
-                            m.lineTo(p[2], x)
-                        }
-                    }
-                    v.iterate(o, t(d));
-                    a && v.iterate(a, t(r));
-                    break;
-                case "bottom":
-                    function c(w) {
-                        return function(x, z, y) {
-                            x = l.roundPixel(x * f + i) - e;
-                            m.moveTo(x, 0);
-                            m.lineTo(x, w)
-                        }
-                    }
-                    v.iterate(o, c(d));
-                    a && v.iterate(a, c(r));
-                    break;
-                case "top":
-                    function b(w) {
-                        return function(x, z, y) {
-                            x = l.roundPixel(x * f + i) - e;
-                            m.moveTo(x, p[3]);
-                            m.lineTo(x, p[3] - w)
-                        }
-                    }
-                    v.iterate(o, b(d));
-                    a && v.iterate(a, b(r));
-                    break;
-                case "angular":
-                    v.iterate(o, function(w, y, x) {
-                        w = w / (k.max + 1) * Math.PI * 2 + k.baseRotation;
-                        m.moveTo(k.centerX + (k.length) * Math.cos(w), k.centerY + (k.length) * Math.sin(w));
-                        m.lineTo(k.centerX + (k.length + d) * Math.cos(w), k.centerY + (k.length + d) * Math.sin(w))
-                    });
-                    break;
-                case "gauge":
-                    var g = v.getGaugeAngles();
-                    v.iterate(o, function(w, y, x) {
-                        w = (w - k.min) / (k.max - k.min + 1) * k.totalAngle - k.totalAngle + g.start;
-                        m.moveTo(k.centerX + (k.length) * Math.cos(w), k.centerY + (k.length) * Math.sin(w));
-                        m.lineTo(k.centerX + (k.length + d) * Math.cos(w), k.centerY + (k.length + d) * Math.sin(w))
-                    });
-                    break
-            }
-        }
-    },
-    renderLabels: function(E, q, D, K) {
-        var o = this,
-            k = o.attr,
-            i = 0.5 * k.lineWidth,
-            u = k.position,
-            y = k.matrix,
-            A = k.textPadding,
-            x = y.getXX(),
-            d = y.getDX(),
-            g = y.getYY(),
-            c = y.getDY(),
-            n = 0,
-            I = D.majorTicks,
-            G = Math.max(k.majorTickSize, k.minorTickSize) + k.lineWidth,
-            f = Ext.draw.Draw.isBBoxIntersect,
-            F = o.getLabel(),
-            J, s, r = null,
-            w = 0,
-            b = 0,
-            m = D.segmenter,
-            B = o.getRenderer(),
-            t = o.getAxis(),
-            z = t.getTitle(),
-            a = z && z.attr.text !== "" && z.getBBox(),
-            l, h = null,
-            p, C, v, e, H;
-        if (I && F && !F.attr.hidden) {
-            J = F.attr.font;
-            if (q.font !== J) {
-                q.font = J
-            }
-            F.setAttributes({
-                translationX: 0,
-                translationY: 0
-            }, true);
-            F.applyTransformations();
-            l = F.attr.inverseMatrix.elements.slice(0);
-            switch (u) {
-                case "left":
-                    e = a ? a.x + a.width : 0;
-                    switch (F.attr.textAlign) {
-                        case "start":
-                            H = E.roundPixel(e + d) - i;
-                            break;
-                        case "end":
-                            H = E.roundPixel(K[2] - G + d) - i;
-                            break;
-                        default:
-                            H = E.roundPixel(e + (K[2] - e - G) / 2 + d) - i
-                    }
-                    F.setAttributes({
-                        translationX: H
-                    }, true);
-                    break;
-                case "right":
-                    e = a ? K[2] - a.x : 0;
-                    switch (F.attr.textAlign) {
-                        case "start":
-                            H = E.roundPixel(G + d) + i;
-                            break;
-                        case "end":
-                            H = E.roundPixel(K[2] - e + d) + i;
-                            break;
-                        default:
-                            H = E.roundPixel(G + (K[2] - G - e) / 2 + d) + i
-                    }
-                    F.setAttributes({
-                        translationX: H
-                    }, true);
-                    break;
-                case "top":
-                    e = a ? a.y + a.height : 0;
-                    F.setAttributes({
-                        translationY: E.roundPixel(e + (K[3] - e - G) / 2) - i
-                    }, true);
-                    break;
-                case "bottom":
-                    e = a ? K[3] - a.y : 0;
-                    F.setAttributes({
-                        translationY: E.roundPixel(G + (K[3] - G - e) / 2) + i
-                    }, true);
-                    break;
-                case "radial":
-                    F.setAttributes({
-                        translationX: k.centerX
-                    }, true);
-                    break;
-                case "angular":
-                    F.setAttributes({
-                        translationY: k.centerY
-                    }, true);
-                    break;
-                case "gauge":
-                    F.setAttributes({
-                        translationY: k.centerY
-                    }, true);
-                    break
-            }
-            if (u === "left" || u === "right") {
-                o.iterate(I, function(L, N, M) {
-                    if (N === undefined) {
-                        return
-                    }
-                    if (B) {
-                        v = Ext.callback(B, null, [t, N, D, r], 0, t)
-                    } else {
-                        v = m.renderer(N, D, r)
-                    }
-                    r = N;
-                    F.setAttributes({
-                        text: String(v),
-                        translationY: E.roundPixel(L * g + c)
-                    }, true);
-                    F.applyTransformations();
-                    n = Math.max(n, F.getBBox().width + G);
-                    if (n <= o.thickness) {
-                        C = Ext.draw.Matrix.fly(F.attr.matrix.elements.slice(0));
-                        p = C.prepend.apply(C, l).transformBBox(F.getBBox(true));
-                        if (h && !f(p, h, A)) {
-                            return
-                        }
-                        E.renderSprite(F);
-                        h = p;
-                        w += p.height;
-                        b++
-                    }
-                })
-            } else {
-                if (u === "top" || u === "bottom") {
-                    o.iterate(I, function(L, N, M) {
-                        if (N === undefined) {
-                            return
-                        }
-                        if (B) {
-                            v = Ext.callback(B, null, [t, N, D, r], 0, t)
-                        } else {
-                            v = m.renderer(N, D, r)
-                        }
-                        r = N;
-                        F.setAttributes({
-                            text: String(v),
-                            translationX: E.roundPixel(L * x + d)
-                        }, true);
-                        F.applyTransformations();
-                        n = Math.max(n, F.getBBox().height + G);
-                        if (n <= o.thickness) {
-                            C = Ext.draw.Matrix.fly(F.attr.matrix.elements.slice(0));
-                            p = C.prepend.apply(C, l).transformBBox(F.getBBox(true));
-                            if (h && !f(p, h, A)) {
-                                return
-                            }
-                            E.renderSprite(F);
-                            h = p;
-                            w += p.width;
-                            b++
-                        }
-                    })
-                } else {
-                    if (u === "radial") {
-                        o.iterate(I, function(L, N, M) {
-                            if (N === undefined) {
-                                return
-                            }
-                            if (B) {
-                                v = Ext.callback(B, null, [t, N, D, r], 0, t)
-                            } else {
-                                v = m.renderer(N, D, r)
-                            }
-                            r = N;
-                            if (typeof v !== "undefined") {
-                                F.setAttributes({
-                                    text: String(v),
-                                    translationX: k.centerX - E.roundPixel(L) / k.max * k.length * Math.cos(k.baseRotation + Math.PI / 2),
-                                    translationY: k.centerY - E.roundPixel(L) / k.max * k.length * Math.sin(k.baseRotation + Math.PI / 2)
-                                }, true);
-                                F.applyTransformations();
-                                p = F.attr.matrix.transformBBox(F.getBBox(true));
-                                if (h && !f(p, h)) {
-                                    return
-                                }
-                                E.renderSprite(F);
-                                h = p;
-                                w += p.width;
-                                b++
-                            }
-                        })
-                    } else {
-                        if (u === "angular") {
-                            s = k.majorTickSize + k.lineWidth * 0.5 + (parseInt(F.attr.fontSize, 10) || 10) / 2;
-                            o.iterate(I, function(L, N, M) {
-                                if (N === undefined) {
-                                    return
-                                }
-                                if (B) {
-                                    v = Ext.callback(B, null, [t, N, D, r], 0, t)
-                                } else {
-                                    v = m.renderer(N, D, r)
-                                }
-                                r = N;
-                                n = Math.max(n, Math.max(k.majorTickSize, k.minorTickSize) + (k.lineCap !== "butt" ? k.lineWidth * 0.5 : 0));
-                                if (typeof v !== "undefined") {
-                                    var O = L / (k.max + 1) * Math.PI * 2 + k.baseRotation;
-                                    F.setAttributes({
-                                        text: String(v),
-                                        translationX: k.centerX + (k.length + s) * Math.cos(O),
-                                        translationY: k.centerY + (k.length + s) * Math.sin(O)
-                                    }, true);
-                                    F.applyTransformations();
-                                    p = F.attr.matrix.transformBBox(F.getBBox(true));
-                                    if (h && !f(p, h)) {
-                                        return
-                                    }
-                                    E.renderSprite(F);
-                                    h = p;
-                                    w += p.width;
-                                    b++
-                                }
-                            })
-                        } else {
-                            if (u === "gauge") {
-                                var j = o.getGaugeAngles();
-                                o.iterate(I, function(L, N, M) {
-                                    if (N === undefined) {
-                                        return
-                                    }
-                                    if (B) {
-                                        v = Ext.callback(B, null, [t, N, D, r], 0, t)
-                                    } else {
-                                        v = m.renderer(N, D, r)
-                                    }
-                                    r = N;
-                                    if (typeof v !== "undefined") {
-                                        var O = (L - k.min) / (k.max - k.min + 1) * k.totalAngle - k.totalAngle + j.start;
-                                        F.setAttributes({
-                                            text: String(v),
-                                            translationX: k.centerX + (k.length + 10) * Math.cos(O),
-                                            translationY: k.centerY + (k.length + 10) * Math.sin(O)
-                                        }, true);
-                                        F.applyTransformations();
-                                        p = F.attr.matrix.transformBBox(F.getBBox(true));
-                                        if (h && !f(p, h)) {
-                                            return
-                                        }
-                                        E.renderSprite(F);
-                                        h = p;
-                                        w += p.width;
-                                        b++
-                                    }
-                                })
-                            }
-                        }
-                    }
-                }
-            }
-            if (k.enlargeEstStepSizeByText && b) {
-                w /= b;
-                w += G;
-                w *= 2;
-                if (k.estStepSize < w) {
-                    k.estStepSize = w
-                }
-            }
-            if (Math.abs(o.thickness - (n)) > 1) {
-                o.thickness = n;
-                k.bbox.plain.dirty = true;
-                k.bbox.transform.dirty = true;
-                o.doThicknessChanged();
-                return false
-            }
-        }
-    },
-    renderAxisLine: function(a, i, e, c) {
-        var h = this,
-            g = h.attr,
-            b = g.lineWidth * 0.5,
-            j = g.position,
-            d, f;
-        if (g.axisLine && g.length) {
-            switch (j) {
-                case "left":
-                    d = a.roundPixel(c[2]) - b;
-                    i.moveTo(d, -g.endGap);
-                    i.lineTo(d, g.length + g.startGap + 1);
-                    break;
-                case "right":
-                    i.moveTo(b, -g.endGap);
-                    i.lineTo(b, g.length + g.startGap + 1);
-                    break;
-                case "bottom":
-                    i.moveTo(-g.startGap, b);
-                    i.lineTo(g.length + g.endGap, b);
-                    break;
-                case "top":
-                    d = a.roundPixel(c[3]) - b;
-                    i.moveTo(-g.startGap, d);
-                    i.lineTo(g.length + g.endGap, d);
-                    break;
-                case "angular":
-                    i.moveTo(g.centerX + g.length, g.centerY);
-                    i.arc(g.centerX, g.centerY, g.length, 0, Math.PI * 2, true);
-                    break;
-                case "gauge":
-                    f = h.getGaugeAngles();
-                    i.moveTo(g.centerX + Math.cos(f.start) * g.length, g.centerY + Math.sin(f.start) * g.length);
-                    i.arc(g.centerX, g.centerY, g.length, f.start, f.end, true);
-                    break
-            }
-        }
-    },
-    getGaugeAngles: function() {
-        var a = this,
-            c = a.attr.totalAngle,
-            b;
-        if (c <= Math.PI) {
-            b = (Math.PI - c) * 0.5
-        } else {
-            b = -(Math.PI * 2 - c) * 0.5
-        }
-        b = Math.PI * 2 - b;
-        return {
-            start: b,
-            end: b - c
-        }
-    },
-    renderGridLines: function(m, n, s, r) {
-        var t = this,
-            b = t.getAxis(),
-            l = t.attr,
-            p = l.matrix,
-            d = l.startGap,
-            a = l.endGap,
-            c = p.getXX(),
-            k = p.getYY(),
-            h = p.getDX(),
-            g = p.getDY(),
-            u = l.position,
-            f = b.getGridAlignment(),
-            q = s.majorTicks,
-            e, o, i;
-        if (l.grid) {
-            if (q) {
-                if (u === "left" || u === "right") {
-                    i = l.min * k + g + a + d;
-                    t.iterate(q, function(j, w, v) {
-                        e = j * k + g + a;
-                        t.putMarker(f + "-" + (v % 2 ? "odd" : "even"), {
-                            y: e,
-                            height: i - e
-                        }, o = v, true);
-                        i = e
-                    });
-                    o++;
-                    e = 0;
-                    t.putMarker(f + "-" + (o % 2 ? "odd" : "even"), {
-                        y: e,
-                        height: i - e
-                    }, o, true)
-                } else {
-                    if (u === "top" || u === "bottom") {
-                        i = l.min * c + h + d;
-                        if (d) {
-                            t.putMarker(f + "-even", {
-                                x: 0,
-                                width: i
-                            }, -1, true)
-                        }
-                        t.iterate(q, function(j, w, v) {
-                            e = j * c + h + d;
-                            t.putMarker(f + "-" + (v % 2 ? "odd" : "even"), {
-                                x: e,
-                                width: i - e
-                            }, o = v, true);
-                            i = e
-                        });
-                        o++;
-                        e = l.length + l.startGap + l.endGap;
-                        t.putMarker(f + "-" + (o % 2 ? "odd" : "even"), {
-                            x: e,
-                            width: i - e
-                        }, o, true)
-                    } else {
-                        if (u === "radial") {
-                            t.iterate(q, function(j, w, v) {
-                                if (!j) {
-                                    return
-                                }
-                                e = j / l.max * l.length;
-                                t.putMarker(f + "-" + (v % 2 ? "odd" : "even"), {
-                                    scalingX: e,
-                                    scalingY: e
-                                }, v, true);
-                                i = e
-                            })
-                        } else {
-                            if (u === "angular") {
-                                t.iterate(q, function(j, w, v) {
-                                    if (!l.length) {
-                                        return
-                                    }
-                                    e = j / (l.max + 1) * Math.PI * 2 + l.baseRotation;
-                                    t.putMarker(f + "-" + (v % 2 ? "odd" : "even"), {
-                                        rotationRads: e,
-                                        rotationCenterX: 0,
-                                        rotationCenterY: 0,
-                                        scalingX: l.length,
-                                        scalingY: l.length
-                                    }, v, true);
-                                    i = e
-                                })
-                            }
-                        }
-                    }
-                }
-            }
-        }
-    },
-    renderLimits: function(o) {
-        var t = this,
-            a = t.getAxis(),
-            h = a.getChart(),
-            p = h.getInnerPadding(),
-            d = Ext.Array.from(a.getLimits());
-        if (!d.length) {
-            return
-        }
-        var r = a.limits.surface.getRect(),
-            m = t.attr,
-            n = m.matrix,
-            u = m.position,
-            k = Ext.Object.chain,
-            v = a.limits.titles,
-            c, j, b, s, l, q, f, g, e;
-        v.instances = [];
-        v.position = 0;
-        if (u === "left" || u === "right") {
-            for (q = 0, f = d.length; q < f; q++) {
-                s = k(d[q]);
-                !s.line && (s.line = {});
-                l = Ext.isString(s.value) ? a.getCoordFor(s.value) : s.value;
-                l = l * n.getYY() + n.getDY();
-                s.line.y = l + p.top;
-                s.line.strokeStyle = s.line.strokeStyle || m.strokeStyle;
-                t.putMarker("horizontal-limit-lines", s.line, q, true);
-                if (s.line.title) {
-                    v.createInstance(s.line.title);
-                    c = v.getBBoxFor(v.position - 1);
-                    j = s.line.title.position || (u === "left" ? "start" : "end");
-                    switch (j) {
-                        case "start":
-                            g = 10;
-                            break;
-                        case "end":
-                            g = r[2] - 10;
-                            break;
-                        case "middle":
-                            g = r[2] / 2;
-                            break
-                    }
-                    v.setAttributesFor(v.position - 1, {
-                        x: g,
-                        y: s.line.y - c.height / 2,
-                        textAlign: j,
-                        fillStyle: s.line.title.fillStyle || s.line.strokeStyle
-                    })
-                }
-            }
-        } else {
-            if (u === "top" || u === "bottom") {
-                for (q = 0, f = d.length; q < f; q++) {
-                    s = k(d[q]);
-                    !s.line && (s.line = {});
-                    l = Ext.isString(s.value) ? a.getCoordFor(s.value) : s.value;
-                    l = l * n.getXX() + n.getDX();
-                    s.line.x = l + p.left;
-                    s.line.strokeStyle = s.line.strokeStyle || m.strokeStyle;
-                    t.putMarker("vertical-limit-lines", s.line, q, true);
-                    if (s.line.title) {
-                        v.createInstance(s.line.title);
-                        c = v.getBBoxFor(v.position - 1);
-                        j = s.line.title.position || (u === "top" ? "end" : "start");
-                        switch (j) {
-                            case "start":
-                                e = r[3] - c.width / 2 - 10;
-                                break;
-                            case "end":
-                                e = c.width / 2 + 10;
-                                break;
-                            case "middle":
-                                e = r[3] / 2;
-                                break
-                        }
-                        v.setAttributesFor(v.position - 1, {
-                            x: s.line.x + c.height / 2,
-                            y: e,
-                            fillStyle: s.line.title.fillStyle || s.line.strokeStyle,
-                            rotationRads: Math.PI / 2
-                        })
-                    }
-                }
-            } else {
-                if (u === "radial") {
-                    for (q = 0, f = d.length; q < f; q++) {
-                        s = k(d[q]);
-                        !s.line && (s.line = {});
-                        l = Ext.isString(s.value) ? a.getCoordFor(s.value) : s.value;
-                        if (l > m.max) {
-                            continue
-                        }
-                        l = l / m.max * m.length;
-                        s.line.cx = m.centerX;
-                        s.line.cy = m.centerY;
-                        s.line.scalingX = l;
-                        s.line.scalingY = l;
-                        s.line.strokeStyle = s.line.strokeStyle || m.strokeStyle;
-                        t.putMarker("circular-limit-lines", s.line, q, true);
-                        if (s.line.title) {
-                            v.createInstance(s.line.title);
-                            c = v.getBBoxFor(v.position - 1);
-                            v.setAttributesFor(v.position - 1, {
-                                x: m.centerX,
-                                y: m.centerY - l - c.height / 2,
-                                fillStyle: s.line.title.fillStyle || s.line.strokeStyle
-                            })
-                        }
-                    }
-                } else {
-                    if (u === "angular") {
-                        for (q = 0, f = d.length; q < f; q++) {
-                            s = k(d[q]);
-                            !s.line && (s.line = {});
-                            l = Ext.isString(s.value) ? a.getCoordFor(s.value) : s.value;
-                            l = l / (m.max + 1) * Math.PI * 2 + m.baseRotation;
-                            s.line.translationX = m.centerX;
-                            s.line.translationY = m.centerY;
-                            s.line.rotationRads = l;
-                            s.line.rotationCenterX = 0;
-                            s.line.rotationCenterY = 0;
-                            s.line.scalingX = m.length;
-                            s.line.scalingY = m.length;
-                            s.line.strokeStyle = s.line.strokeStyle || m.strokeStyle;
-                            t.putMarker("radial-limit-lines", s.line, q, true);
-                            if (s.line.title) {
-                                v.createInstance(s.line.title);
-                                c = v.getBBoxFor(v.position - 1);
-                                b = ((l > -0.5 * Math.PI && l < 0.5 * Math.PI) || (l > 1.5 * Math.PI && l < 2 * Math.PI)) ? 1 : -1;
-                                v.setAttributesFor(v.position - 1, {
-                                    x: m.centerX + 0.5 * m.length * Math.cos(l) + b * c.height / 2 * Math.sin(l),
-                                    y: m.centerY + 0.5 * m.length * Math.sin(l) - b * c.height / 2 * Math.cos(l),
-                                    rotationRads: b === 1 ? l : l - Math.PI,
-                                    fillStyle: s.line.title.fillStyle || s.line.strokeStyle
-                                })
-                            }
-                        }
-                    } else {
-                        if (u === "gauge") {}
-                    }
-                }
-            }
-        }
-    },
-    doThicknessChanged: function() {
-        var a = this.getAxis();
-        if (a) {
-            a.onThicknessChanged()
-        }
-    },
-    render: function(a, c, d) {
-        var e = this,
-            b = e.getLayoutContext();
-        if (b) {
-            if (false === e.renderLabels(a, c, b, d)) {
-                return false
-            }
-            c.beginPath();
-            e.renderTicks(a, c, b, d);
-            e.renderAxisLine(a, c, b, d);
-            e.renderGridLines(a, c, b, d);
-            e.renderLimits(d);
-            c.stroke()
-        }
-    }
-});
-Ext.define("Ext.chart.axis.segmenter.Segmenter", {
-    config: {
-        axis: null
-    },
-    constructor: function(a) {
-        this.initConfig(a)
-    },
-    renderer: function(b, a) {
-        return String(b)
-    },
-    from: function(a) {
-        return a
-    },
-    diff: Ext.emptyFn,
-    align: Ext.emptyFn,
-    add: Ext.emptyFn,
-    preferredStep: Ext.emptyFn
-});
-Ext.define("Ext.chart.axis.segmenter.Names", {
-    extend: "Ext.chart.axis.segmenter.Segmenter",
-    alias: "segmenter.names",
-    renderer: function(b, a) {
-        return b
-    },
-    diff: function(b, a, c) {
-        return Math.floor(a - b)
-    },
-    align: function(c, b, a) {
-        return Math.floor(c)
-    },
-    add: function(c, b, a) {
-        return c + b
-    },
-    preferredStep: function(c, a, b, d) {
-        return {
-            unit: 1,
-            step: 1
-        }
-    }
-});
-Ext.define("Ext.chart.axis.segmenter.Numeric", {
-    extend: "Ext.chart.axis.segmenter.Segmenter",
-    alias: "segmenter.numeric",
-    isNumeric: true,
-    renderer: function(b, a) {
-        return b.toFixed(Math.max(0, a.majorTicks.unit.fixes))
-    },
-    diff: function(b, a, c) {
-        return Math.floor((a - b) / c.scale)
-    },
-    align: function(c, b, a) {
-        return Math.floor(c / (a.scale * b)) * a.scale * b
-    },
-    add: function(c, b, a) {
-        return c + b * a.scale
-    },
-    preferredStep: function(c, b) {
-        var a = Math.floor(Math.log(b) * Math.LOG10E),
-            d = Math.pow(10, a);
-        b /= d;
-        if (b < 2) {
-            b = 2
-        } else {
-            if (b < 5) {
-                b = 5
-            } else {
-                if (b < 10) {
-                    b = 10;
-                    a++
-                }
-            }
-        }
-        return {
-            unit: {
-                fixes: -a,
-                scale: d
-            },
-            step: b
-        }
-    },
-    exactStep: function(c, b) {
-        var a = Math.floor(Math.log(b) * Math.LOG10E),
-            d = Math.pow(10, a);
-        return {
-            unit: {
-                fixes: -a + (b % d === 0 ? 0 : 1),
-                scale: 1
-            },
-            step: b
-        }
-    },
-    adjustByMajorUnit: function(e, g, c) {
-        var d = c[0],
-            b = c[1],
-            a = e * g,
-            f = d % a;
-        if (f !== 0) {
-            c[0] = d - f + (d < 0 ? -a : 0)
-        }
-        f = b % a;
-        if (f !== 0) {
-            c[1] = b - f + (b > 0 ? a : 0)
-        }
-    }
-});
-Ext.define("Ext.chart.axis.segmenter.Time", {
-    extend: "Ext.chart.axis.segmenter.Segmenter",
-    alias: "segmenter.time",
-    config: {
-        step: null
-    },
-    renderer: function(c, b) {
-        var a = Ext.Date;
-        switch (b.majorTicks.unit) {
-            case "y":
-                return a.format(c, "Y");
-            case "mo":
-                return a.format(c, "Y-m");
-            case "d":
-                return a.format(c, "Y-m-d")
-        }
-        return a.format(c, "Y-m-d\nH:i:s")
-    },
-    from: function(a) {
-        return new Date(a)
-    },
-    diff: function(b, a, c) {
-        if (isFinite(b)) {
-            b = new Date(b)
-        }
-        if (isFinite(a)) {
-            a = new Date(a)
-        }
-        return Ext.Date.diff(b, a, c)
-    },
-    align: function(a, c, b) {
-        if (b === "d" && c >= 7) {
-            a = Ext.Date.align(a, "d", c);
-            a.setDate(a.getDate() - a.getDay() + 1);
-            return a
-        } else {
-            return Ext.Date.align(a, b, c)
-        }
-    },
-    add: function(c, b, a) {
-        return Ext.Date.add(new Date(c), a, b)
-    },
-    stepUnits: [
-        [Ext.Date.YEAR, 1, 2, 5, 10, 20, 50, 100, 200, 500],
-        [Ext.Date.MONTH, 1, 3, 6],
-        [Ext.Date.DAY, 1, 7, 14],
-        [Ext.Date.HOUR, 1, 6, 12],
-        [Ext.Date.MINUTE, 1, 5, 15, 30],
-        [Ext.Date.SECOND, 1, 5, 15, 30],
-        [Ext.Date.MILLI, 1, 2, 5, 10, 20, 50, 100, 200, 500]
-    ],
-    preferredStep: function(b, e) {
-        if (this.getStep()) {
-            return this.getStep()
-        }
-        var f = new Date(+b),
-            g = new Date(+b + Math.ceil(e)),
-            d = this.stepUnits,
-            l, k, h, c, a;
-        for (c = 0; c < d.length; c++) {
-            k = d[c][0];
-            h = this.diff(f, g, k);
-            if (h > 0) {
-                for (a = 1; a < d[c].length; a++) {
-                    if (h <= d[c][a]) {
-                        l = {
-                            unit: k,
-                            step: d[c][a]
-                        };
-                        break
-                    }
-                }
-                if (!l) {
-                    c--;
-                    l = {
-                        unit: d[c][0],
-                        step: 1
-                    }
-                }
-                break
-            }
-        }
-        if (!l) {
-            l = {
-                unit: Ext.Date.DAY,
-                step: 1
-            }
-        }
-        return l
-    }
-});
-Ext.define("Ext.chart.axis.layout.Layout", {
-    mixins: {
-        observable: "Ext.mixin.Observable"
-    },
-    config: {
-        axis: null
-    },
-    constructor: function(a) {
-        this.mixins.observable.constructor.call(this, a)
-    },
-    processData: function(b) {
-        var e = this,
-            c = e.getAxis(),
-            f = c.getDirection(),
-            g = c.boundSeries,
-            a, d;
-        if (b) {
-            b["coordinate" + f]()
-        } else {
-            for (a = 0, d = g.length; a < d; a++) {
-                g[a]["coordinate" + f]()
-            }
-        }
-    },
-    calculateMajorTicks: function(a) {
-        var f = this,
-            e = a.attr,
-            d = e.max - e.min,
-            i = d / Math.max(1, e.length) * (e.visibleMax - e.visibleMin),
-            h = e.min + d * e.visibleMin,
-            b = e.min + d * e.visibleMax,
-            g = e.estStepSize * i,
-            c = f.snapEnds(a, e.min, e.max, g);
-        if (c) {
-            f.trimByRange(a, c, h, b);
-            a.majorTicks = c
-        }
-    },
-    calculateMinorTicks: function(a) {
-        if (this.snapMinorEnds) {
-            a.minorTicks = this.snapMinorEnds(a)
-        }
-    },
-    calculateLayout: function(b) {
-        var c = this,
-            a = b.attr;
-        if (a.length === 0) {
-            return null
-        }
-        if (a.majorTicks) {
-            c.calculateMajorTicks(b);
-            if (a.minorTicks) {
-                c.calculateMinorTicks(b)
-            }
-        }
-    },
-    snapEnds: Ext.emptyFn,
-    trimByRange: function(b, f, i, a) {
-        var g = b.segmenter,
-            j = f.unit,
-            h = g.diff(f.from, i, j),
-            d = g.diff(f.from, a, j),
-            c = Math.max(0, Math.ceil(h / f.step)),
-            e = Math.min(f.steps, Math.floor(d / f.step));
-        if (e < f.steps) {
-            f.to = g.add(f.from, e * f.step, j)
-        }
-        if (f.max > a) {
-            f.max = f.to
-        }
-        if (f.from < i) {
-            f.from = g.add(f.from, c * f.step, j);
-            while (f.from < i) {
-                c++;
-                f.from = g.add(f.from, f.step, j)
-            }
-        }
-        if (f.min < i) {
-            f.min = f.from
-        }
-        f.steps = e - c
-    }
-});
-Ext.define("Ext.chart.axis.layout.Discrete", {
-    extend: "Ext.chart.axis.layout.Layout",
-    alias: "axisLayout.discrete",
-    isDiscrete: true,
-    processData: function() {
-        var f = this,
-            d = f.getAxis(),
-            c = d.boundSeries,
-            g = d.getDirection(),
-            b, e, a;
-        f.labels = [];
-        f.labelMap = {};
-        for (b = 0, e = c.length; b < e; b++) {
-            a = c[b];
-            if (a["get" + g + "Axis"]() === d) {
-                a["coordinate" + g]()
-            }
-        }
-        d.getSprites()[0].setAttributes({
-            data: f.labels
-        });
-        f.fireEvent("datachange", f.labels)
-    },
-    calculateLayout: function(a) {
-        a.data = this.labels;
-        this.callParent([a])
-    },
-    calculateMajorTicks: function(a) {
-        var g = this,
-            f = a.attr,
-            d = a.data,
-            e = f.max - f.min,
-            j = e / Math.max(1, f.length) * (f.visibleMax - f.visibleMin),
-            i = f.min + e * f.visibleMin,
-            b = f.min + e * f.visibleMax,
-            h = f.estStepSize * j;
-        var c = g.snapEnds(a, Math.max(0, f.min), Math.min(f.max, d.length - 1), h);
-        if (c) {
-            g.trimByRange(a, c, i, b);
-            a.majorTicks = c
-        }
-    },
-    snapEnds: function(e, d, a, b) {
-        b = Math.ceil(b);
-        var c = Math.floor((a - d) / b),
-            f = e.data;
-        return {
-            min: d,
-            max: a,
-            from: d,
-            to: c * b + d,
-            step: b,
-            steps: c,
-            unit: 1,
-            getLabel: function(g) {
-                return f[this.from + this.step * g]
-            },
-            get: function(g) {
-                return this.from + this.step * g
-            }
-        }
-    },
-    trimByRange: function(b, f, h, a) {
-        var i = f.unit,
-            g = Math.ceil((h - f.from) / i) * i,
-            d = Math.floor((a - f.from) / i) * i,
-            c = Math.max(0, Math.ceil(g / f.step)),
-            e = Math.min(f.steps, Math.floor(d / f.step));
-        if (e < f.steps) {
-            f.to = e
-        }
-        if (f.max > a) {
-            f.max = f.to
-        }
-        if (f.from < h && f.step > 0) {
-            f.from = f.from + c * f.step * i;
-            while (f.from < h) {
-                c++;
-                f.from += f.step * i
-            }
-        }
-        if (f.min < h) {
-            f.min = f.from
-        }
-        f.steps = e - c
-    },
-    getCoordFor: function(c, d, a, b) {
-        this.labels.push(c);
-        return this.labels.length - 1
-    }
-});
-Ext.define("Ext.chart.axis.layout.CombineDuplicate", {
-    extend: "Ext.chart.axis.layout.Discrete",
-    alias: "axisLayout.combineDuplicate",
-    getCoordFor: function(d, e, b, c) {
-        if (!(d in this.labelMap)) {
-            var a = this.labelMap[d] = this.labels.length;
-            this.labels.push(d);
-            return a
-        }
-        return this.labelMap[d]
-    }
-});
-Ext.define("Ext.chart.axis.layout.Continuous", {
-    extend: "Ext.chart.axis.layout.Layout",
-    alias: "axisLayout.continuous",
-    isContinuous: true,
-    config: {
-        adjustMinimumByMajorUnit: false,
-        adjustMaximumByMajorUnit: false
-    },
-    getCoordFor: function(c, d, a, b) {
-        return +c
-    },
-    snapEnds: function(a, d, i, h) {
-        var f = a.segmenter,
-            c = this.getAxis(),
-            l = c.getMajorTickSteps(),
-            e = l && f.exactStep ? f.exactStep(d, (i - d) / l) : f.preferredStep(d, h),
-            k = e.unit,
-            b = e.step,
-            j = f.align(d, b, k),
-            g = (l || f.diff(d, i, k)) + 1;
-        return {
-            min: f.from(d),
-            max: f.from(i),
-            from: j,
-            to: f.add(j, g * b, k),
-            step: b,
-            steps: g,
-            unit: k,
-            get: function(m) {
-                return f.add(this.from, this.step * m, k)
-            }
-        }
-    },
-    snapMinorEnds: function(a) {
-        var e = a.majorTicks,
-            m = this.getAxis().getMinorTickSteps(),
-            f = a.segmenter,
-            d = e.min,
-            i = e.max,
-            k = e.from,
-            l = e.unit,
-            b = e.step / m,
-            n = b * l.scale,
-            j = k - d,
-            c = Math.floor(j / n),
-            h = c + Math.floor((i - e.to) / n) + 1,
-            g = e.steps * m + h;
-        return {
-            min: d,
-            max: i,
-            from: d + j % n,
-            to: f.add(k, g * b, l),
-            step: b,
-            steps: g,
-            unit: l,
-            get: function(o) {
-                return (o % m + c + 1 !== 0) ? f.add(this.from, this.step * o, l) : null
-            }
-        }
-    }
-});
-Ext.define("Ext.chart.axis.Axis", {
-    xtype: "axis",
-    mixins: {
-        observable: "Ext.mixin.Observable"
-    },
-    requires: ["Ext.chart.axis.sprite.Axis", "Ext.chart.axis.segmenter.*", "Ext.chart.axis.layout.*"],
-    isAxis: true,
-    config: {
-        position: "bottom",
-        fields: [],
-        label: undefined,
-        grid: false,
-        limits: null,
-        renderer: null,
-        chart: null,
-        style: null,
-        margin: 0,
-        titleMargin: 4,
-        background: null,
-        minimum: NaN,
-        maximum: NaN,
-        reconcileRange: false,
-        minZoom: 1,
-        maxZoom: 10000,
-        layout: "continuous",
-        segmenter: "numeric",
-        hidden: false,
-        majorTickSteps: 0,
-        minorTickSteps: 0,
-        adjustByMajorUnit: true,
-        title: null,
-        increment: 0.5,
-        length: 0,
-        center: null,
-        radius: null,
-        totalAngle: Math.PI,
-        rotation: null,
-        labelInSpan: null,
-        visibleRange: [0, 1],
-        needHighPrecision: false,
-        linkedTo: null,
-        floating: null
-    },
-    titleOffset: 0,
-    spriteAnimationCount: 0,
-    prevMin: 0,
-    prevMax: 1,
-    boundSeries: [],
-    sprites: null,
-    surface: null,
-    range: null,
-    xValues: [],
-    yValues: [],
-    masterAxis: null,
-    applyRotation: function(b) {
-        var a = Math.PI * 2;
-        return (b % a + Math.PI) % a - Math.PI
-    },
-    updateRotation: function(b) {
-        var c = this.getSprites(),
-            a = this.getPosition();
-        if (!this.getHidden() && a === "angular" && c[0]) {
-            c[0].setAttributes({
-                baseRotation: b
-            })
-        }
-    },
-    applyTitle: function(c, b) {
-        var a;
-        if (Ext.isString(c)) {
-            c = {
-                text: c
-            }
-        }
-        if (!b) {
-            b = Ext.create("sprite.text", c);
-            if ((a = this.getSurface())) {
-                a.add(b)
-            }
-        } else {
-            b.setAttributes(c)
-        }
-        return b
-    },
-    applyFloating: function(b, a) {
-        if (b === null) {
-            b = {
-                value: null,
-                alongAxis: null
-            }
-        } else {
-            if (Ext.isNumber(b)) {
-                b = {
-                    value: b,
-                    alongAxis: null
-                }
-            }
-        }
-        if (Ext.isObject(b)) {
-            if (a && a.alongAxis) {
-                delete this.getChart().getAxis(a.alongAxis).floatingAxes[this.getId()]
-            }
-            return b
-        }
-        return a
-    },
-    constructor: function(a) {
-        var b = this,
-            c;
-        b.sprites = [];
-        b.labels = [];
-        b.floatingAxes = {};
-        a = a || {};
-        if (a.position === "angular") {
-            a.style = a.style || {};
-            a.style.estStepSize = 1
-        }
-        if ("id" in a) {
-            c = a.id
-        } else {
-            if ("id" in b.config) {
-                c = b.config.id
-            } else {
-                c = b.getId()
-            }
-        }
-        b.setId(c);
-        b.mixins.observable.constructor.apply(b, arguments)
-    },
-    getAlignment: function() {
-        switch (this.getPosition()) {
-            case "left":
-            case "right":
-                return "vertical";
-            case "top":
-            case "bottom":
-                return "horizontal";
-            case "radial":
-                return "radial";
-            case "angular":
-                return "angular"
-        }
-    },
-    getGridAlignment: function() {
-        switch (this.getPosition()) {
-            case "left":
-            case "right":
-                return "horizontal";
-            case "top":
-            case "bottom":
-                return "vertical";
-            case "radial":
-                return "circular";
-            case "angular":
-                return "radial"
-        }
-    },
-    getSurface: function() {
-        var e = this,
-            d = e.getChart();
-        if (d && !e.surface) {
-            var b = e.surface = d.getSurface(e.getId(), "axis"),
-                c = e.gridSurface = d.getSurface("main"),
-                a = e.getSprites()[0],
-                f = e.getGridAlignment();
-            c.waitFor(b);
-            e.getGrid();
-            if (e.getLimits() && f) {
-                f = f.replace("3d", "");
-                e.limits = {
-                    surface: d.getSurface("overlay"),
-                    lines: new Ext.chart.Markers(),
-                    titles: new Ext.draw.sprite.Instancing()
-                };
-                e.limits.lines.setTemplate({
-                    xclass: "grid." + f
-                });
-                e.limits.lines.getTemplate().setAttributes({
-                    strokeStyle: "black"
-                }, true);
-                e.limits.surface.add(e.limits.lines);
-                a.bindMarker(f + "-limit-lines", e.limits.lines);
-                e.limitTitleTpl = new Ext.draw.sprite.Text();
-                e.limits.titles.setTemplate(e.limitTitleTpl);
-                e.limits.surface.add(e.limits.titles);
-                d.on("redraw", e.renderLimits, e)
-            }
-        }
-        return e.surface
-    },
-    applyGrid: function(a) {
-        if (a === true) {
-            return {}
-        }
-        return a
-    },
-    updateGrid: function(b) {
-        var e = this,
-            d = e.getChart();
-        if (!d) {
-            e.on({
-                chartattached: Ext.bind(e.updateGrid, e, [b]),
-                single: true
-            });
-            return
-        }
-        var c = e.gridSurface,
-            a = e.getSprites()[0],
-            f = e.getGridAlignment(),
-            g;
-        if (b) {
-            g = e.gridSpriteEven;
-            if (!g) {
-                g = e.gridSpriteEven = new Ext.chart.Markers();
-                g.setTemplate({
-                    xclass: "grid." + f
-                });
-                c.add(g);
-                a.bindMarker(f + "-even", g)
-            }
-            if (Ext.isObject(b)) {
-                g.getTemplate().setAttributes(b);
-                if (Ext.isObject(b.even)) {
-                    g.getTemplate().setAttributes(b.even)
-                }
-            }
-            g = e.gridSpriteOdd;
-            if (!g) {
-                g = e.gridSpriteOdd = new Ext.chart.Markers();
-                g.setTemplate({
-                    xclass: "grid." + f
-                });
-                c.add(g);
-                a.bindMarker(f + "-odd", g)
-            }
-            if (Ext.isObject(b)) {
-                g.getTemplate().setAttributes(b);
-                if (Ext.isObject(b.odd)) {
-                    g.getTemplate().setAttributes(b.odd)
-                }
-            }
-        }
-    },
-    renderLimits: function() {
-        this.getSprites()[0].renderLimits()
-    },
-    getCoordFor: function(c, d, a, b) {
-        return this.getLayout().getCoordFor(c, d, a, b)
-    },
-    applyPosition: function(a) {
-        return a.toLowerCase()
-    },
-    applyLength: function(b, a) {
-        return b > 0 ? b : a
-    },
-    applyLabel: function(b, a) {
-        if (!a) {
-            a = new Ext.draw.sprite.Text({})
-        }
-        if (this.limitTitleTpl) {
-            this.limitTitleTpl.setAttributes(b)
-        }
-        a.setAttributes(b);
-        return a
-    },
-    applyLayout: function(b, a) {
-        b = Ext.factory(b, null, a, "axisLayout");
-        b.setAxis(this);
-        return b
-    },
-    applySegmenter: function(a, b) {
-        a = Ext.factory(a, null, b, "segmenter");
-        a.setAxis(this);
-        return a
-    },
-    updateMinimum: function() {
-        this.range = null
-    },
-    updateMaximum: function() {
-        this.range = null
-    },
-    hideLabels: function() {
-        this.getSprites()[0].setDirty(true);
-        this.setLabel({
-            hidden: true
-        })
-    },
-    showLabels: function() {
-        this.getSprites()[0].setDirty(true);
-        this.setLabel({
-            hidden: false
-        })
-    },
-    renderFrame: function() {
-        this.getSurface().renderFrame()
-    },
-    updateChart: function(d, b) {
-        var c = this,
-            a;
-        if (b) {
-            b.unregister(c);
-            b.un("serieschange", c.onSeriesChange, c);
-            b.un("redraw", c.renderLimits, c);
-            c.linkAxis();
-            c.fireEvent("chartdetached", b, c)
-        }
-        if (d) {
-            d.on("serieschange", c.onSeriesChange, c);
-            c.surface = null;
-            a = c.getSurface();
-            c.getLabel().setSurface(a);
-            a.add(c.getSprites());
-            a.add(c.getTitle());
-            d.register(c);
-            c.fireEvent("chartattached", d, c)
-        }
-    },
-    applyBackground: function(a) {
-        var b = Ext.ClassManager.getByAlias("sprite.rect");
-        return b.def.normalize(a)
-    },
-    processData: function() {
-        this.getLayout().processData();
-        this.range = null
-    },
-    getDirection: function() {
-        return this.getChart().getDirectionForAxis(this.getPosition())
-    },
-    isSide: function() {
-        var a = this.getPosition();
-        return a === "left" || a === "right"
-    },
-    applyFields: function(a) {
-        return Ext.Array.from(a)
-    },
-    applyVisibleRange: function(a, c) {
-        this.getChart();
-        if (a[0] > a[1]) {
-            var b = a[0];
-            a[0] = a[1];
-            a[0] = b
-        }
-        if (a[1] === a[0]) {
-            a[1] += 1 / this.getMaxZoom()
-        }
-        if (a[1] > a[0] + 1) {
-            a[0] = 0;
-            a[1] = 1
-        } else {
-            if (a[0] < 0) {
-                a[1] -= a[0];
-                a[0] = 0
-            } else {
-                if (a[1] > 1) {
-                    a[0] -= a[1] - 1;
-                    a[1] = 1
-                }
-            }
-        }
-        if (c && a[0] === c[0] && a[1] === c[1]) {
-            return undefined
-        }
-        return a
-    },
-    updateVisibleRange: function(a) {
-        this.fireEvent("visiblerangechange", this, a)
-    },
-    onSeriesChange: function(e) {
-        var f = this,
-            b = e.getSeries(),
-            j = "get" + f.getDirection() + "Axis",
-            g = [],
-            c, d = b.length,
-            a, h;
-        for (c = 0; c < d; c++) {
-            if (this === b[c][j]()) {
-                g.push(b[c])
-            }
-        }
-        f.boundSeries = g;
-        a = f.getLinkedTo();
-        h = !Ext.isEmpty(a) && e.getAxis(a);
-        if (h) {
-            f.linkAxis(h)
-        } else {
-            f.getLayout().processData()
-        }
-    },
-    linkAxis: function(a) {
-        var c = this;
-
-        function b(f, d, e) {
-            e.getLayout()[f]("datachange", "onDataChange", d);
-            e[f]("rangechange", "onMasterAxisRangeChange", d)
-        }
-        if (c.masterAxis) {
-            b("un", c, c.masterAxis);
-            c.masterAxis = null
-        }
-        if (a) {
-            if (a.type !== this.type) {
-                Ext.Error.raise("Linked axes must be of the same type.")
-            }
-            b("on", c, a);
-            c.onDataChange(a.getLayout().labels);
-            c.onMasterAxisRangeChange(a, a.range);
-            c.setStyle(Ext.apply({}, c.config.style, a.config.style));
-            c.setTitle(Ext.apply({}, c.config.title, a.config.title));
-            c.setLabel(Ext.apply({}, c.config.label, a.config.label));
-            c.masterAxis = a
-        }
-    },
-    onDataChange: function(a) {
-        this.getLayout().labels = a
-    },
-    onMasterAxisRangeChange: function(b, a) {
-        this.range = a
-    },
-    applyRange: function(a) {
-        if (!a) {
-            return this.dataRange.slice(0)
-        } else {
-            return [a[0] === null ? this.dataRange[0] : a[0], a[1] === null ? this.dataRange[1] : a[1]]
-        }
-    },
-    getRange: function() {
-        var m = this;
-        if (m.range) {
-            return m.range
-        } else {
-            if (m.masterAxis) {
-                return m.masterAxis.range
-            }
-        }
-        if (Ext.isNumber(m.getMinimum() + m.getMaximum())) {
-            return m.range = [m.getMinimum(), m.getMaximum()]
-        }
-        var d = Infinity,
-            n = -Infinity,
-            o = m.boundSeries,
-            h = m.getLayout(),
-            l = m.getSegmenter(),
-            p = m.getVisibleRange(),
-            b = "get" + m.getDirection() + "Range",
-            a, j, g, f, e, k;
-        for (e = 0, k = o.length; e < k; e++) {
-            f = o[e];
-            var c = f[b]();
-            if (c) {
-                if (c[0] < d) {
-                    d = c[0]
-                }
-                if (c[1] > n) {
-                    n = c[1]
-                }
-            }
-        }
-        if (!isFinite(n)) {
-            n = m.prevMax
-        }
-        if (!isFinite(d)) {
-            d = m.prevMin
-        }
-        if (m.getLabelInSpan() || d === n) {
-            n += m.getIncrement();
-            d -= m.getIncrement()
-        }
-        if (Ext.isNumber(m.getMinimum())) {
-            d = m.getMinimum()
-        } else {
-            m.prevMin = d
-        }
-        if (Ext.isNumber(m.getMaximum())) {
-            n = m.getMaximum()
-        } else {
-            m.prevMax = n
-        }
-        m.range = [Ext.Number.correctFloat(d), Ext.Number.correctFloat(n)];
-        if (m.getReconcileRange()) {
-            m.reconcileRange()
-        }
-        if (m.getAdjustByMajorUnit() && l.adjustByMajorUnit && !m.getMajorTickSteps()) {
-            j = Ext.Object.chain(m.getSprites()[0].attr);
-            j.min = m.range[0];
-            j.max = m.range[1];
-            j.visibleMin = p[0];
-            j.visibleMax = p[1];
-            a = {
-                attr: j,
-                segmenter: l
-            };
-            h.calculateLayout(a);
-            g = a.majorTicks;
-            if (g) {
-                l.adjustByMajorUnit(g.step, g.unit.scale, m.range);
-                j.min = m.range[0];
-                j.max = m.range[1];
-                delete a.majorTicks;
-                h.calculateLayout(a);
-                g = a.majorTicks;
-                l.adjustByMajorUnit(g.step, g.unit.scale, m.range)
-            } else {
-                if (!m.hasClearRangePending) {
-                    m.hasClearRangePending = true;
-                    m.getChart().on("layout", "clearRange", m)
-                }
-            }
-        }
-        if (!Ext.Array.equals(m.range, m.oldRange || [])) {
-            m.fireEvent("rangechange", m, m.range);
-            m.oldRange = m.range
-        }
-        return m.range
-    },
-    clearRange: function() {
-        delete this.hasClearRangePending;
-        this.range = null
-    },
-    reconcileRange: function() {
-        var e = this,
-            g = e.getChart().getAxes(),
-            f = e.getDirection(),
-            b, d, c, a;
-        if (!g) {
-            return
-        }
-        for (b = 0, d = g.length; b < d; b++) {
-            c = g[b];
-            a = c.getRange();
-            if (c === e || c.getDirection() !== f || !a || !c.getReconcileRange()) {
-                continue
-            }
-            if (a[0] < e.range[0]) {
-                e.range[0] = a[0]
-            }
-            if (a[1] > e.range[1]) {
-                e.range[1] = a[1]
-            }
-        }
-    },
-    applyStyle: function(c, b) {
-        var a = Ext.ClassManager.getByAlias("sprite." + this.seriesType);
-        if (a && a.def) {
-            c = a.def.normalize(c)
-        }
-        b = Ext.apply(b || {}, c);
-        return b
-    },
-    themeOnlyIfConfigured: {
-        grid: true
-    },
-    updateTheme: function(d) {
-        var i = this,
-            k = d.getAxis(),
-            e = i.getPosition(),
-            o = i.getInitialConfig(),
-            c = i.defaultConfig,
-            g = i.getConfigurator().configs,
-            a = k.defaults,
-            n = k[e],
-            h = i.themeOnlyIfConfigured,
-            l, j, p, b, m, f;
-        k = Ext.merge({}, a, n);
-        for (l in k) {
-            j = k[l];
-            f = g[l];
-            if (j !== null && j !== undefined && f) {
-                m = o[l];
-                p = Ext.isObject(j);
-                b = m === c[l];
-                if (p) {
-                    if (b && h[l]) {
-                        continue
-                    }
-                    j = Ext.merge({}, j, m)
-                }
-                if (b || p) {
-                    i[f.names.set](j)
-                }
-            }
-        }
-    },
-    updateCenter: function(b) {
-        var e = this.getSprites(),
-            a = e[0],
-            d = b[0],
-            c = b[1];
-        if (a) {
-            a.setAttributes({
-                centerX: d,
-                centerY: c
-            })
-        }
-        if (this.gridSpriteEven) {
-            this.gridSpriteEven.getTemplate().setAttributes({
-                translationX: d,
-                translationY: c,
-                rotationCenterX: d,
-                rotationCenterY: c
-            })
-        }
-        if (this.gridSpriteOdd) {
-            this.gridSpriteOdd.getTemplate().setAttributes({
-                translationX: d,
-                translationY: c,
-                rotationCenterX: d,
-                rotationCenterY: c
-            })
-        }
-    },
-    getSprites: function() {
-        if (!this.getChart()) {
-            return
-        }
-        var i = this,
-            e = i.getRange(),
-            f = i.getPosition(),
-            g = i.getChart(),
-            c = g.getAnimation(),
-            d, a, b = i.getLength(),
-            h = i.superclass;
-        if (c === false) {
-            c = {
-                duration: 0
-            }
-        }
-        if (e) {
-            a = Ext.applyIf({
-                position: f,
-                axis: i,
-                min: e[0],
-                max: e[1],
-                length: b,
-                grid: i.getGrid(),
-                hidden: i.getHidden(),
-                titleOffset: i.titleOffset,
-                layout: i.getLayout(),
-                segmenter: i.getSegmenter(),
-                totalAngle: i.getTotalAngle(),
-                label: i.getLabel()
-            }, i.getStyle());
-            if (!i.sprites.length) {
-                while (!h.xtype) {
-                    h = h.superclass
-                }
-                d = Ext.create("sprite." + h.xtype, a);
-                d.fx.setCustomDurations({
-                    baseRotation: 0
-                });
-                d.fx.on("animationstart", "onAnimationStart", i);
-                d.fx.on("animationend", "onAnimationEnd", i);
-                d.setLayout(i.getLayout());
-                d.setSegmenter(i.getSegmenter());
-                d.setLabel(i.getLabel());
-                i.sprites.push(d);
-                i.updateTitleSprite()
-            } else {
-                d = i.sprites[0];
-                d.setAnimation(c);
-                d.setAttributes(a)
-            }
-            if (i.getRenderer()) {
-                d.setRenderer(i.getRenderer())
-            }
-        }
-        return i.sprites
-    },
-    updateTitleSprite: function() {
-        var f = this,
-            b = f.getLength();
-        if (!f.sprites[0] || !Ext.isNumber(b)) {
-            return
-        }
-        var h = this.sprites[0].thickness,
-            a = f.getSurface(),
-            g = f.getTitle(),
-            e = f.getPosition(),
-            c = f.getMargin(),
-            i = f.getTitleMargin(),
-            d = a.roundPixel(b / 2);
-        if (g) {
-            switch (e) {
-                case "top":
-                    g.setAttributes({
-                        x: d,
-                        y: c + i / 2,
-                        textBaseline: "top",
-                        textAlign: "center"
-                    }, true);
-                    g.applyTransformations();
-                    f.titleOffset = g.getBBox().height + i;
-                    break;
-                case "bottom":
-                    g.setAttributes({
-                        x: d,
-                        y: h + i / 2,
-                        textBaseline: "top",
-                        textAlign: "center"
-                    }, true);
-                    g.applyTransformations();
-                    f.titleOffset = g.getBBox().height + i;
-                    break;
-                case "left":
-                    g.setAttributes({
-                        x: c + i / 2,
-                        y: d,
-                        textBaseline: "top",
-                        textAlign: "center",
-                        rotationCenterX: c + i / 2,
-                        rotationCenterY: d,
-                        rotationRads: -Math.PI / 2
-                    }, true);
-                    g.applyTransformations();
-                    f.titleOffset = g.getBBox().width + i;
-                    break;
-                case "right":
-                    g.setAttributes({
-                        x: h - c + i / 2,
-                        y: d,
-                        textBaseline: "bottom",
-                        textAlign: "center",
-                        rotationCenterX: h + i / 2,
-                        rotationCenterY: d,
-                        rotationRads: Math.PI / 2
-                    }, true);
-                    g.applyTransformations();
-                    f.titleOffset = g.getBBox().width + i;
-                    break
-            }
-        }
-    },
-    onThicknessChanged: function() {
-        this.getChart().onThicknessChanged()
-    },
-    getThickness: function() {
-        if (this.getHidden()) {
-            return 0
-        }
-        return (this.sprites[0] && this.sprites[0].thickness || 1) + this.titleOffset + this.getMargin()
-    },
-    onAnimationStart: function() {
-        this.spriteAnimationCount++;
-        if (this.spriteAnimationCount === 1) {
-            this.fireEvent("animationstart", this)
-        }
-    },
-    onAnimationEnd: function() {
-        this.spriteAnimationCount--;
-        if (this.spriteAnimationCount === 0) {
-            this.fireEvent("animationend", this)
-        }
-    },
-    getItemId: function() {
-        return this.getId()
-    },
-    getAncestorIds: function() {
-        return [this.getChart().getId()]
-    },
-    isXType: function(a) {
-        return a === "axis"
-    },
-    resolveListenerScope: function(e) {
-        var d = this,
-            a = Ext._namedScopes[e],
-            c = d.getChart(),
-            b;
-        if (!a) {
-            b = c ? c.resolveListenerScope(e, false) : (e || d)
-        } else {
-            if (a.isThis) {
-                b = d
-            } else {
-                if (a.isController) {
-                    b = c ? c.resolveListenerScope(e, false) : d
-                } else {
-                    if (a.isSelf) {
-                        b = c ? c.resolveListenerScope(e, false) : d;
-                        if (b === c && !c.getInheritedConfig("defaultListenerScope")) {
-                            b = d
-                        }
-                    }
-                }
-            }
-        }
-        return b
-    },
-    destroy: function() {
-        var a = this;
-        a.setChart(null);
-        a.surface.destroy();
-        a.surface = null;
-        a.callParent()
-    }
-});
-Ext.define("Ext.chart.LegendBase", {
-    extend: "Ext.view.View",
-    config: {
-        tpl: ['<div class="', Ext.baseCSSPrefix, 'legend-container">', '<tpl for=".">', '<div class="', Ext.baseCSSPrefix, 'legend-item">', "<span ", 'class="', Ext.baseCSSPrefix, "legend-item-marker {[ values.disabled ? Ext.baseCSSPrefix + 'legend-inactive' : '' ]}\" ", 'style="background:{mark};">', "</span>{name}", "</div>", "</tpl>", "</div>"],
-        nodeContainerSelector: "div." + Ext.baseCSSPrefix + "legend-container",
-        itemSelector: "div." + Ext.baseCSSPrefix + "legend-item",
-        docked: "bottom"
-    },
-    setDocked: function(d) {
-        var c = this,
-            a = c.ownerCt,
-            b;
-        c.docked = d;
-        switch (d) {
-            case "top":
-            case "bottom":
-                c.addCls(Ext.baseCSSPrefix + "horizontal");
-                b = "hbox";
-                break;
-            case "left":
-            case "right":
-                c.removeCls(Ext.baseCSSPrefix + "horizontal");
-                b = "vbox";
-                break
-        }
-        if (a) {
-            a.setDocked(d)
-        }
-    },
-    setStore: function(a) {
-        this.bindStore(a)
-    },
-    clearViewEl: function() {
-        this.callParent(arguments);
-        Ext.removeNode(this.getNodeContainer())
-    },
-    onItemClick: function(a, c, b, d) {
-        this.callParent(arguments);
-        this.toggleItem(b)
-    }
-});
-Ext.define("Ext.chart.Legend", {
-    xtype: "legend",
-    extend: "Ext.chart.LegendBase",
-    config: {
-        baseCls: Ext.baseCSSPrefix + "legend",
-        padding: 5,
-        rect: null,
-        disableSelection: true,
-        toggleable: true
-    },
-    toggleItem: function(c) {
-        if (!this.getToggleable()) {
-            return
-        }
-        var b = this.getStore(),
-            h = 0,
-            e, g = true,
-            d, f, a;
-        if (b) {
-            f = b.getCount();
-            for (d = 0; d < f; d++) {
-                a = b.getAt(d);
-                if (a.get("disabled")) {
-                    h++
-                }
-            }
-            g = f - h > 1;
-            a = b.getAt(c);
-            if (a) {
-                e = a.get("disabled");
-                if (e || g) {
-                    a.set("disabled", !e)
-                }
-            }
-        }
-    }
-});
-Ext.define("Ext.chart.AbstractChart", {
-    extend: "Ext.draw.Container",
-    requires: ["Ext.chart.theme.Default", "Ext.chart.series.Series", "Ext.chart.interactions.Abstract", "Ext.chart.axis.Axis", "Ext.data.StoreManager", "Ext.chart.Legend", "Ext.data.Store"],
-    isChart: true,
-    defaultBindProperty: "store",
-    config: {
-        store: "ext-empty-store",
-        theme: "default",
-        style: null,
-        animation: !Ext.isIE8,
-        series: [],
-        axes: [],
-        legend: null,
-        colors: null,
-        insetPadding: {
-            top: 10,
-            left: 10,
-            right: 10,
-            bottom: 10
-        },
-        background: null,
-        interactions: [],
-        mainRect: null,
-        resizeHandler: null,
-        highlightItem: null
-    },
-    animationSuspendCount: 0,
-    chartLayoutSuspendCount: 0,
-    axisThicknessSuspendCount: 0,
-    isThicknessChanged: false,
-    surfaceZIndexes: {
-        background: 0,
-        main: 1,
-        grid: 2,
-        series: 3,
-        axis: 4,
-        chart: 5,
-        overlay: 6,
-        events: 7
-    },
-    constructor: function(a) {
-        var b = this;
-        b.itemListeners = {};
-        b.surfaceMap = {};
-        b.chartComponents = {};
-        b.isInitializing = true;
-        b.suspendChartLayout();
-        b.animationSuspendCount++;
-        b.callParent(arguments);
-        delete b.isInitializing;
-        b.getSurface("main");
-        b.getSurface("chart").setFlipRtlText(b.getInherited().rtl);
-        b.getSurface("overlay").waitFor(b.getSurface("series"));
-        b.animationSuspendCount--;
-        b.resumeChartLayout()
-    },
-    applyAnimation: function(a, b) {
-        if (!a) {
-            a = {
-                duration: 0
-            }
-        } else {
-            if (a === true) {
-                a = {
-                    easing: "easeInOut",
-                    duration: 500
-                }
-            }
-        }
-        return b ? Ext.apply({}, a, b) : a
-    },
-    getAnimation: function() {
-        if (this.animationSuspendCount) {
-            return {
-                duration: 0
-            }
-        } else {
-            return this.callParent()
-        }
-    },
-    applyInsetPadding: function(b, a) {
-        if (!Ext.isObject(b)) {
-            return Ext.util.Format.parseBox(b)
-        } else {
-            if (!a) {
-                return b
-            } else {
-                return Ext.apply(a, b)
-            }
-        }
-    },
-    suspendAnimation: function() {
-        var d = this,
-            c = d.getSeries(),
-            e = c.length,
-            b = -1,
-            a;
-        d.animationSuspendCount++;
-        if (d.animationSuspendCount === 1) {
-            while (++b < e) {
-                a = c[b];
-                a.setAnimation(a.getAnimation())
-            }
-        }
-    },
-    resumeAnimation: function() {
-        var d = this,
-            c = d.getSeries(),
-            f = c.length,
-            b = -1,
-            a, e;
-        d.animationSuspendCount--;
-        if (d.animationSuspendCount === 0) {
-            while (++b < f) {
-                a = c[b];
-                e = a.getAnimation();
-                a.setAnimation(e.duration && e || d.getAnimation())
-            }
-        }
-    },
-    suspendChartLayout: function() {
-        this.chartLayoutSuspendCount++;
-        if (this.chartLayoutSuspendCount === 1) {
-            if (this.scheduledLayoutId) {
-                this.layoutInSuspension = true;
-                this.cancelChartLayout()
-            } else {
-                this.layoutInSuspension = false
-            }
-        }
-    },
-    resumeChartLayout: function() {
-        this.chartLayoutSuspendCount--;
-        if (this.chartLayoutSuspendCount === 0) {
-            if (this.layoutInSuspension) {
-                this.scheduleLayout()
-            }
-        }
-    },
-    cancelChartLayout: function() {
-        if (this.scheduledLayoutId) {
-            Ext.draw.Animator.cancel(this.scheduledLayoutId);
-            this.scheduledLayoutId = null
-        }
-    },
-    scheduleLayout: function() {
-        var a = this;
-        if (a.allowSchedule() && !a.scheduledLayoutId) {
-            a.scheduledLayoutId = Ext.draw.Animator.schedule("doScheduleLayout", a)
-        }
-    },
-    allowSchedule: function() {
-        return true
-    },
-    doScheduleLayout: function() {
-        if (this.chartLayoutSuspendCount) {
-            this.layoutInSuspension = true
-        } else {
-            this.performLayout()
-        }
-    },
-    suspendThicknessChanged: function() {
-        this.axisThicknessSuspendCount++
-    },
-    resumeThicknessChanged: function() {
-        if (this.axisThicknessSuspendCount > 0) {
-            this.axisThicknessSuspendCount--;
-            if (this.axisThicknessSuspendCount === 0 && this.isThicknessChanged) {
-                this.onThicknessChanged()
-            }
-        }
-    },
-    onThicknessChanged: function() {
-        if (this.axisThicknessSuspendCount === 0) {
-            this.isThicknessChanged = false;
-            this.performLayout()
-        } else {
-            this.isThicknessChanged = true
-        }
-    },
-    applySprites: function(b) {
-        var a = this.getSurface("chart");
-        b = Ext.Array.from(b);
-        a.removeAll(true);
-        a.add(b);
-        return b
-    },
-    initItems: function() {
-        var a = this.items,
-            b, d, c;
-        if (a && !a.isMixedCollection) {
-            this.items = [];
-            a = Ext.Array.from(a);
-            for (b = 0, d = a.length; b < d; b++) {
-                c = a[b];
-                if (c.type) {
-                    Ext.raise("To add custom sprites to the chart use the 'sprites' config.")
-                } else {
-                    this.items.push(c)
-                }
-            }
-        }
-        this.callParent()
-    },
-    applyBackground: function(c, e) {
-        var b = this.getSurface("background"),
-            d, a, f;
-        if (c) {
-            if (e) {
-                d = e.attr.width;
-                a = e.attr.height;
-                f = e.type === (c.type || "rect")
-            }
-            if (c.isSprite) {
-                e = c
-            } else {
-                if (c.type === "image" && Ext.isString(c.src)) {
-                    if (f) {
-                        e.setAttributes({
-                            src: c.src
-                        })
-                    } else {
-                        b.remove(e, true);
-                        e = b.add(c)
-                    }
-                } else {
-                    if (f) {
-                        e.setAttributes({
-                            fillStyle: c
-                        })
-                    } else {
-                        b.remove(e, true);
-                        e = b.add({
-                            type: "rect",
-                            fillStyle: c,
-                            fx: {
-                                customDurations: {
-                                    x: 0,
-                                    y: 0,
-                                    width: 0,
-                                    height: 0
-                                }
-                            }
-                        })
-                    }
-                }
-            }
-        }
-        if (d && a) {
-            e.setAttributes({
-                width: d,
-                height: a
-            })
-        }
-        e.setAnimation(this.getAnimation());
-        return e
-    },
-    getLegendStore: function() {
-        return this.legendStore
-    },
-    refreshLegendStore: function() {
-        if (this.getLegendStore()) {
-            var d, e, c = this.getSeries(),
-                b, a = [];
-            if (c) {
-                for (d = 0, e = c.length; d < e; d++) {
-                    b = c[d];
-                    if (b.getShowInLegend()) {
-                        b.provideLegendInfo(a)
-                    }
-                }
-            }
-            this.getLegendStore().setData(a)
-        }
-    },
-    resetLegendStore: function() {
-        var c = this.getLegendStore(),
-            e, d, a, b;
-        if (c) {
-            e = this.getLegendStore().getData().items;
-            for (d = 0, a = e.length; d < a; d++) {
-                b = e[d];
-                b.beginEdit();
-                b.set("disabled", false);
-                b.commit()
-            }
-        }
-    },
-    onUpdateLegendStore: function(b, a) {
-        var d = this.getSeries(),
-            c;
-        if (a && d) {
-            c = d.map[a.get("series")];
-            if (c) {
-                c.setHiddenByIndex(a.get("index"), a.get("disabled"));
-                this.redraw()
-            }
-        }
-    },
-    defaultResizeHandler: function(a) {
-        this.scheduleLayout();
-        return false
-    },
-    applyMainRect: function(a, b) {
-        if (!b) {
-            return a
-        }
-        this.getSeries();
-        this.getAxes();
-        if (a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3]) {
-            return b
-        } else {
-            return a
-        }
-    },
-    register: function(a) {
-        var b = this.chartComponents,
-            c = a.getId();
-        b[c] = a
-    },
-    unregister: function(a) {
-        var b = this.chartComponents,
-            c = a.getId();
-        delete b[c]
-    },
-    get: function(a) {
-        return this.chartComponents[a]
-    },
-    getAxis: function(a) {
-        if (a instanceof Ext.chart.axis.Axis) {
-            return a
-        } else {
-            if (Ext.isNumber(a)) {
-                return this.getAxes()[a]
-            } else {
-                if (Ext.isString(a)) {
-                    return this.get(a)
-                }
-            }
-        }
-    },
-    getSurface: function(b, c) {
-        b = b || "main";
-        c = c || b;
-        var d = this,
-            a = this.callParent([b]),
-            f = d.surfaceZIndexes,
-            e = d.surfaceMap;
-        if (c in f) {
-            a.element.setStyle("zIndex", f[c])
-        }
-        if (!e[c]) {
-            e[c] = []
-        }
-        if (Ext.Array.indexOf(e[c], a) < 0) {
-            a.type = c;
-            e[c].push(a);
-            a.on("destroy", d.forgetSurface, d)
-        }
-        return a
-    },
-    forgetSurface: function(a) {
-        var d = this.surfaceMap;
-        if (!d || this.isDestroying) {
-            return
-        }
-        var c = d[a.type],
-            b = c ? Ext.Array.indexOf(c, a) : -1;
-        if (b >= 0) {
-            c.splice(b, 1)
-        }
-    },
-    applyAxes: function(b, k) {
-        var l = this,
-            g = {
-                left: "right",
-                right: "left"
-            },
-            m = [],
-            c, d, e, a, f, h, j;
-        l.animationSuspendCount++;
-        l.getStore();
-        if (!k) {
-            k = [];
-            k.map = {}
-        }
-        j = k.map;
-        m.map = {};
-        b = Ext.Array.from(b, true);
-        for (f = 0, h = b.length; f < h; f++) {
-            c = b[f];
-            if (!c) {
-                continue
-            }
-            if (c instanceof Ext.chart.axis.Axis) {
-                d = j[c.getId()];
-                c.setChart(l)
-            } else {
-                c = Ext.Object.chain(c);
-                e = c.linkedTo;
-                a = c.id;
-                if (Ext.isNumber(e)) {
-                    c = Ext.merge({}, b[e], c)
-                } else {
-                    if (Ext.isString(e)) {
-                        Ext.Array.each(b, function(i) {
-                            if (i.id === c.linkedTo) {
-                                c = Ext.merge({}, i, c);
-                                return false
-                            }
-                        })
-                    }
-                }
-                c.id = a;
-                c.chart = l;
-                if (l.getInherited().rtl) {
-                    c.position = g[c.position] || c.position
-                }
-                a = c.getId && c.getId() || c.id;
-                c = Ext.factory(c, null, d = j[a], "axis")
-            }
-            if (c) {
-                m.push(c);
-                m.map[c.getId()] = c;
-                if (!d) {
-                    c.on("animationstart", "onAnimationStart", l);
-                    c.on("animationend", "onAnimationEnd", l)
-                }
-            }
-        }
-        for (f in j) {
-            if (!m.map[f]) {
-                j[f].destroy()
-            }
-        }
-        l.animationSuspendCount--;
-        return m
-    },
-    updateAxes: function() {
-        if (!this.isDestroying) {
-            this.scheduleLayout()
-        }
-    },
-    circularCopyArray: function(e, f, d) {
-        var c = [],
-            b, a = e && e.length;
-        if (a) {
-            for (b = 0; b < d; b++) {
-                c.push(e[(f + b) % a])
-            }
-        }
-        return c
-    },
-    circularCopyObject: function(f, g, d) {
-        var c = this,
-            b, e, a = {};
-        if (d) {
-            for (b in f) {
-                if (f.hasOwnProperty(b)) {
-                    e = f[b];
-                    if (Ext.isArray(e)) {
-                        a[b] = c.circularCopyArray(e, g, d)
-                    } else {
-                        a[b] = e
-                    }
-                }
-            }
-        }
-        return a
-    },
-    getColors: function() {
-        var b = this,
-            a = b.config.colors,
-            c = b.getTheme();
-        if (Ext.isArray(a) && a.length > 0) {
-            a = b.applyColors(a)
-        }
-        return a || (c && c.getColors())
-    },
-    applyColors: function(a) {
-        a = Ext.Array.map(a, function(b) {
-            if (Ext.isString(b)) {
-                return b
-            } else {
-                return b.toString()
-            }
-        });
-        return a
-    },
-    updateColors: function(c) {
-        var k = this,
-            e = k.getTheme(),
-            a = c || (e && e.getColors()),
-            l = 0,
-            f = k.getSeries(),
-            d = f && f.length,
-            g, j, b, h;
-        if (a.length) {
-            for (g = 0; g < d; g++) {
-                j = f[g];
-                h = j.themeColorCount();
-                b = k.circularCopyArray(a, l, h);
-                l += h;
-                j.updateChartColors(b)
-            }
-        }
-        k.refreshLegendStore()
-    },
-    applyTheme: function(a) {
-        if (a && a.isTheme) {
-            return a
-        }
-        return Ext.Factory.chartTheme(a)
-    },
-    updateTheme: function(g) {
-        var e = this,
-            f = e.getAxes(),
-            d = e.getSeries(),
-            a = e.getColors(),
-            c, b;
-        e.updateChartTheme(g);
-        for (b = 0; b < f.length; b++) {
-            f[b].updateTheme(g)
-        }
-        for (b = 0; b < d.length; b++) {
-            c = d[b];
-            c.updateTheme(g)
-        }
-        e.updateSpriteTheme(g);
-        e.updateColors(a);
-        e.redraw()
-    },
-    themeOnlyIfConfigured: {},
-    updateChartTheme: function(c) {
-        var i = this,
-            k = c.getChart(),
-            n = i.getInitialConfig(),
-            b = i.defaultConfig,
-            e = i.getConfigurator().configs,
-            f = k.defaults,
-            g = k[i.xtype],
-            h = i.themeOnlyIfConfigured,
-            l, j, o, a, m, d;
-        k = Ext.merge({}, f, g);
-        for (l in k) {
-            j = k[l];
-            d = e[l];
-            if (j !== null && j !== undefined && d) {
-                m = n[l];
-                o = Ext.isObject(j);
-                a = m === b[l];
-                if (o) {
-                    if (a && h[l]) {
-                        continue
-                    }
-                    j = Ext.merge({}, j, m)
-                }
-                if (a || o) {
-                    i[d.names.set](j)
-                }
-            }
-        }
-    },
-    updateSpriteTheme: function(c) {
-        this.getSprites();
-        var j = this,
-            e = j.getSurface("chart"),
-            h = e.getItems(),
-            m = c.getSprites(),
-            k, a, l, f, d, b, g;
-        for (b = 0, g = h.length; b < g; b++) {
-            k = h[b];
-            a = m[k.type];
-            if (a) {
-                f = {};
-                d = k.type === "text";
-                for (l in a) {
-                    if (!(l in k.config)) {
-                        if (!(d && l.indexOf("font") === 0 && k.config.font)) {
-                            f[l] = a[l]
-                        }
-                    }
-                }
-                k.setAttributes(f)
-            }
-        }
-    },
-    addSeries: function(b) {
-        var a = this.getSeries();
-        Ext.Array.push(a, b);
-        this.setSeries(a)
-    },
-    removeSeries: function(d) {
-        d = Ext.Array.from(d);
-        var b = this.getSeries(),
-            f = [],
-            a = d.length,
-            g = {},
-            c, e;
-        for (c = 0; c < a; c++) {
-            e = d[c];
-            if (typeof e !== "string") {
-                e = e.getId()
-            }
-            g[e] = true
-        }
-        for (c = 0, a = b.length; c < a; c++) {
-            if (!g[b[c].getId()]) {
-                f.push(b[c])
-            }
-        }
-        this.setSeries(f)
-    },
-    applySeries: function(e, d) {
-        var g = this,
-            j = [],
-            h, a, c, f, b;
-        g.animationSuspendCount++;
-        g.getAxes();
-        if (d) {
-            h = d.map
-        } else {
-            d = [];
-            h = d.map = {}
-        }
-        j.map = {};
-        e = Ext.Array.from(e, true);
-        for (c = 0, f = e.length; c < f; c++) {
-            b = e[c];
-            if (!b) {
-                continue
-            }
-            a = h[b.getId && b.getId() || b.id];
-            if (b instanceof Ext.chart.series.Series) {
-                if (a && a !== b) {
-                    a.destroy()
-                }
-                b.setChart(g)
-            } else {
-                if (Ext.isObject(b)) {
-                    if (a) {
-                        a.setConfig(b);
-                        b = a
-                    } else {
-                        if (Ext.isString(b)) {
-                            b = {
-                                type: b
-                            }
-                        }
-                        b.chart = g;
-                        b = Ext.create(b.xclass || ("series." + b.type), b);
-                        b.on("animationstart", "onAnimationStart", g);
-                        b.on("animationend", "onAnimationEnd", g)
-                    }
-                }
-            }
-            j.push(b);
-            j.map[b.getId()] = b
-        }
-        for (c in h) {
-            if (!j.map[h[c].getId()]) {
-                h[c].destroy()
-            }
-        }
-        g.animationSuspendCount--;
-        return j
-    },
-    applyLegend: function(b, a) {
-        return Ext.factory(b, Ext.chart.Legend, a)
-    },
-    updateLegend: function(b, a) {
-        if (a) {
-            a.destroy()
-        }
-        if (b) {
-            this.getItems();
-            this.legendStore = new Ext.data.Store({
-                autoDestroy: true,
-                fields: ["id", "name", "mark", "disabled", "series", "index"]
-            });
-            b.setStore(this.legendStore);
-            this.refreshLegendStore();
-            this.legendStore.on("update", "onUpdateLegendStore", this)
-        }
-    },
-    updateSeries: function(b, a) {
-        var c = this;
-        if (c.isDestroying) {
-            return
-        }
-        c.animationSuspendCount++;
-        c.fireEvent("serieschange", c, b, a);
-        c.refreshLegendStore();
-        if (!Ext.isEmpty(b)) {
-            c.updateTheme(c.getTheme())
-        }
-        c.scheduleLayout();
-        c.animationSuspendCount--
-    },
-    applyInteractions: function(h, d) {
-        if (!d) {
-            d = [];
-            d.map = {}
-        }
-        var g = this,
-            a = [],
-            c = d.map,
-            e, f, b;
-        a.map = {};
-        h = Ext.Array.from(h, true);
-        for (e = 0, f = h.length; e < f; e++) {
-            b = h[e];
-            if (!b) {
-                continue
-            }
-            b = Ext.factory(b, null, c[b.getId && b.getId() || b.id], "interaction");
-            if (b) {
-                b.setChart(g);
-                a.push(b);
-                a.map[b.getId()] = b
-            }
-        }
-        for (e in c) {
-            if (!a.map[e]) {
-                c[e].destroy()
-            }
-        }
-        return a
-    },
-    getInteraction: function(e) {
-        var f = this.getInteractions(),
-            a = f && f.length,
-            c = null,
-            b, d;
-        if (a) {
-            for (d = 0; d < a; ++d) {
-                b = f[d];
-                if (b.type === e) {
-                    c = b;
-                    break
-                }
-            }
-        }
-        return c
-    },
-    applyStore: function(a) {
-        return a && Ext.StoreManager.lookup(a)
-    },
-    updateStore: function(a, c) {
-        var b = this;
-        if (c) {
-            c.un({
-                datachanged: "onDataChanged",
-                update: "onDataChanged",
-                scope: b,
-                order: "after"
-            });
-            if (c.autoDestroy) {
-                c.destroy()
-            }
-        }
-        if (a) {
-            a.on({
-                datachanged: "onDataChanged",
-                update: "onDataChanged",
-                scope: b,
-                order: "after"
-            })
-        }
-        b.fireEvent("storechange", b, a, c);
-        b.onDataChanged()
-    },
-    redraw: function() {
-        this.fireEvent("redraw", this)
-    },
-    performLayout: function() {
-        var d = this,
-            b = d.getChartSize(true),
-            c = [0, 0, b.width, b.height],
-            a = d.getBackground();
-        d.hasFirstLayout = true;
-        d.fireEvent("layout", d);
-        d.cancelChartLayout();
-        d.getSurface("background").setRect(c);
-        d.getSurface("chart").setRect(c);
-        a.setAttributes({
-            width: b.width,
-            height: b.height
-        })
-    },
-    getChartSize: function(b) {
-        var a = this;
-        if (b) {
-            a.chartSize = null
-        }
-        return a.chartSize || (a.chartSize = a.innerElement.getSize())
-    },
-    getEventXY: function(a) {
-        return this.getSurface().getEventXY(a)
-    },
-    getItemForPoint: function(h, g) {
-        var f = this,
-            a = f.getSeries(),
-            e = f.getMainRect(),
-            d = a.length,
-            b = f.hasFirstLayout ? d - 1 : -1,
-            c, j;
-        if (!(e && h >= 0 && h <= e[2] && g >= 0 && g <= e[3])) {
-            return null
-        }
-        for (; b >= 0; b--) {
-            c = a[b];
-            j = c.getItemForPoint(h, g);
-            if (j) {
-                return j
-            }
-        }
-        return null
-    },
-    getItemsForPoint: function(h, g) {
-        var f = this,
-            a = f.getSeries(),
-            d = a.length,
-            b = f.hasFirstLayout ? d - 1 : -1,
-            e = [],
-            c, j;
-        for (; b >= 0; b--) {
-            c = a[b];
-            j = c.getItemForPoint(h, g);
-            if (j) {
-                e.push(j)
-            }
-        }
-        return e
-    },
-    onAnimationStart: function() {
-        this.fireEvent("animationstart", this)
-    },
-    onAnimationEnd: function() {
-        this.fireEvent("animationend", this)
-    },
-    onDataChanged: function() {
-        var d = this;
-        if (d.isInitializing) {
-            return
-        }
-        var c = d.getMainRect(),
-            a = d.getStore(),
-            b = d.getSeries(),
-            e = d.getAxes();
-        if (!a || !e || !b) {
-            return
-        }
-        if (!c) {
-            d.on({
-                redraw: d.onDataChanged,
-                scope: d,
-                single: true
-            });
-            return
-        }
-        d.processData();
-        d.redraw()
-    },
-    recordCount: 0,
-    processData: function() {
-        var g = this,
-            e = g.getStore().getCount(),
-            c = g.getSeries(),
-            f = c.length,
-            d = false,
-            b = 0,
-            a;
-        for (; b < f; b++) {
-            a = c[b];
-            a.processData();
-            if (!d && a.isStoreDependantColorCount) {
-                d = true
-            }
-        }
-        if (d && e > g.recordCount) {
-            g.updateColors(g.getColors());
-            g.recordCount = e
-        }
-    },
-    bindStore: function(a) {
-        this.setStore(a)
-    },
-    applyHighlightItem: function(f, a) {
-        if (f === a) {
-            return
-        }
-        if (Ext.isObject(f) && Ext.isObject(a)) {
-            var e = f,
-                d = a,
-                c = e.sprite && (e.sprite[0] || e.sprite),
-                b = d.sprite && (d.sprite[0] || d.sprite);
-            if (c === b && e.index === d.index) {
-                return
-            }
-        }
-        return f
-    },
-    updateHighlightItem: function(b, a) {
-        if (a) {
-            a.series.setAttributesForItem(a, {
-                highlighted: false
-            })
-        }
-        if (b) {
-            b.series.setAttributesForItem(b, {
-                highlighted: true
-            });
-            this.fireEvent("itemhighlight", this, b, a)
-        }
-        this.fireEvent("itemhighlightchange", this, b, a)
-    },
-    destroyChart: function() {
-        var f = this,
-            d = f.getLegend(),
-            g = f.getAxes(),
-            c = f.getSeries(),
-            h = f.getInteractions(),
-            b = [],
-            a, e;
-        f.surfaceMap = null;
-        for (a = 0, e = h.length; a < e; a++) {
-            h[a].destroy()
-        }
-        for (a = 0, e = g.length; a < e; a++) {
-            g[a].destroy()
-        }
-        for (a = 0, e = c.length; a < e; a++) {
-            c[a].destroy()
-        }
-        f.setInteractions(b);
-        f.setAxes(b);
-        f.setSeries(b);
-        if (d) {
-            d.destroy();
-            f.setLegend(null)
-        }
-        f.legendStore = null;
-        f.setStore(null);
-        f.cancelChartLayout()
-    },
-    getRefItems: function(b) {
-        var g = this,
-            e = g.getSeries(),
-            h = g.getAxes(),
-            a = g.getInteractions(),
-            c = [],
-            d, f;
-        for (d = 0, f = e.length; d < f; d++) {
-            c.push(e[d]);
-            if (e[d].getRefItems) {
-                c.push.apply(c, e[d].getRefItems(b))
-            }
-        }
-        for (d = 0, f = h.length; d < f; d++) {
-            c.push(h[d]);
-            if (h[d].getRefItems) {
-                c.push.apply(c, h[d].getRefItems(b))
-            }
-        }
-        for (d = 0, f = a.length; d < f; d++) {
-            c.push(a[d]);
-            if (a[d].getRefItems) {
-                c.push.apply(c, a[d].getRefItems(b))
-            }
-        }
-        return c
-    }
-});
-Ext.define("Ext.chart.overrides.AbstractChart", {
-    override: "Ext.chart.AbstractChart",
-    updateLegend: function(b, a) {
-        var c;
-        this.callParent([b, a]);
-        if (b) {
-            c = b.docked;
-            this.addDocked({
-                dock: c,
-                xtype: "panel",
-                shrinkWrap: true,
-                scrollable: true,
-                layout: {
-                    type: c === "top" || c === "bottom" ? "hbox" : "vbox",
-                    pack: "center"
-                },
-                items: b,
-                cls: Ext.baseCSSPrefix + "legend-panel"
-            })
-        }
-    },
-    performLayout: function() {
-        if (this.isVisible(true)) {
-            return this.callParent()
-        }
-        this.cancelChartLayout();
-        return false
-    },
-    afterComponentLayout: function(c, a, b, d) {
-        this.callParent([c, a, b, d]);
-        this.scheduleLayout()
-    },
-    allowSchedule: function() {
-        return this.rendered
-    },
-    onDestroy: function() {
-        this.destroyChart();
-        this.callParent(arguments)
-    }
-});
-Ext.define("Ext.chart.grid.HorizontalGrid", {
-    extend: "Ext.draw.sprite.Sprite",
-    alias: "grid.horizontal",
-    inheritableStatics: {
-        def: {
-            processors: {
-                x: "number",
-                y: "number",
-                width: "number",
-                height: "number"
-            },
-            defaults: {
-                x: 0,
-                y: 0,
-                width: 1,
-                height: 1,
-                strokeStyle: "#DDD"
-            }
-        }
-    },
-    render: function(b, c, e) {
-        var a = this.attr,
-            f = b.roundPixel(a.y),
-            d = c.lineWidth * 0.5;
-        c.beginPath();
-        c.rect(e[0] - b.matrix.getDX(), f + d, +e[2], a.height);
-        c.fill();
-        c.beginPath();
-        c.moveTo(e[0] - b.matrix.getDX(), f + d);
-        c.lineTo(e[0] + e[2] - b.matrix.getDX(), f + d);
-        c.stroke()
-    }
-});
-Ext.define("Ext.chart.grid.VerticalGrid", {
-    extend: "Ext.draw.sprite.Sprite",
-    alias: "grid.vertical",
-    inheritableStatics: {
-        def: {
-            processors: {
-                x: "number",
-                y: "number",
-                width: "number",
-                height: "number"
-            },
-            defaults: {
-                x: 0,
-                y: 0,
-                width: 1,
-                height: 1,
-                strokeStyle: "#DDD"
-            }
-        }
-    },
-    render: function(c, d, f) {
-        var b = this.attr,
-            a = c.roundPixel(b.x),
-            e = d.lineWidth * 0.5;
-        d.beginPath();
-        d.rect(a - e, f[1] - c.matrix.getDY(), b.width, f[3]);
-        d.fill();
-        d.beginPath();
-        d.moveTo(a - e, f[1] - c.matrix.getDY());
-        d.lineTo(a - e, f[1] + f[3] - c.matrix.getDY());
-        d.stroke()
-    }
-});
-Ext.define("Ext.chart.CartesianChart", {
-    extend: "Ext.chart.AbstractChart",
-    alternateClassName: "Ext.chart.Chart",
-    requires: ["Ext.chart.grid.HorizontalGrid", "Ext.chart.grid.VerticalGrid"],
-    xtype: ["cartesian", "chart"],
-    isCartesian: true,
-    config: {
-        flipXY: false,
-        innerRect: [0, 0, 1, 1],
-        innerPadding: {
-            top: 0,
-            left: 0,
-            right: 0,
-            bottom: 0
-        }
-    },
-    applyInnerPadding: function(b, a) {
-        if (!Ext.isObject(b)) {
-            return Ext.util.Format.parseBox(b)
-        } else {
-            if (!a) {
-                return b
-            } else {
-                return Ext.apply(a, b)
-            }
-        }
-    },
-    getDirectionForAxis: function(a) {
-        var b = this.getFlipXY();
-        if (a === "left" || a === "right") {
-            if (b) {
-                return "X"
-            } else {
-                return "Y"
-            }
-        } else {
-            if (b) {
-                return "Y"
-            } else {
-                return "X"
-            }
-        }
-    },
-    performLayout: function() {
-        var A = this;
-        A.animationSuspendCount++;
-        if (A.callParent() === false) {
-            --A.animationSuspendCount;
-            return
-        }
-        A.suspendThicknessChanged();
-        var d = A.getSurface("chart").getRect(),
-            o = d[2],
-            n = d[3],
-            z = A.getAxes(),
-            b, q = A.getSeries(),
-            h, l, a, f = A.getInsetPadding(),
-            v = A.getInnerPadding(),
-            r, c, e = Ext.apply({}, f),
-            u, p, s, k, m, y, t, x, g, j = A.getInherited().rtl,
-            w = A.getFlipXY();
-        if (o <= 0 || n <= 0) {
-            return
-        }
-        for (x = 0; x < z.length; x++) {
-            b = z[x];
-            l = b.getSurface();
-            m = b.getFloating();
-            y = m ? m.value : null;
-            a = b.getThickness();
-            switch (b.getPosition()) {
-                case "top":
-                    l.setRect([0, e.top + 1, o, a]);
-                    break;
-                case "bottom":
-                    l.setRect([0, n - (e.bottom + a), o, a]);
-                    break;
-                case "left":
-                    l.setRect([e.left, 0, a, n]);
-                    break;
-                case "right":
-                    l.setRect([o - (e.right + a), 0, a, n]);
-                    break
-            }
-            if (y === null) {
-                e[b.getPosition()] += a
-            }
-        }
-        o -= e.left + e.right;
-        n -= e.top + e.bottom;
-        u = [e.left, e.top, o, n];
-        e.left += v.left;
-        e.top += v.top;
-        e.right += v.right;
-        e.bottom += v.bottom;
-        p = o - v.left - v.right;
-        s = n - v.top - v.bottom;
-        A.setInnerRect([e.left, e.top, p, s]);
-        if (p <= 0 || s <= 0) {
-            return
-        }
-        A.setMainRect(u);
-        A.getSurface().setRect(u);
-        for (x = 0, g = A.surfaceMap.grid && A.surfaceMap.grid.length; x < g; x++) {
-            c = A.surfaceMap.grid[x];
-            c.setRect(u);
-            c.matrix.set(1, 0, 0, 1, v.left, v.top);
-            c.matrix.inverse(c.inverseMatrix)
-        }
-        for (x = 0; x < z.length; x++) {
-            b = z[x];
-            l = b.getSurface();
-            t = l.matrix;
-            k = t.elements;
-            switch (b.getPosition()) {
-                case "top":
-                case "bottom":
-                    k[4] = e.left;
-                    b.setLength(p);
-                    break;
-                case "left":
-                case "right":
-                    k[5] = e.top;
-                    b.setLength(s);
-                    break
-            }
-            b.updateTitleSprite();
-            t.inverse(l.inverseMatrix)
-        }
-        for (x = 0, g = q.length; x < g; x++) {
-            h = q[x];
-            r = h.getSurface();
-            r.setRect(u);
-            if (w) {
-                if (j) {
-                    r.matrix.set(0, -1, -1, 0, v.left + p, v.top + s)
-                } else {
-                    r.matrix.set(0, -1, 1, 0, v.left, v.top + s)
-                }
-            } else {
-                r.matrix.set(1, 0, 0, -1, v.left, v.top + s)
-            }
-            r.matrix.inverse(r.inverseMatrix);
-            h.getOverlaySurface().setRect(u)
-        }
-        A.redraw();
-        A.animationSuspendCount--;
-        A.resumeThicknessChanged()
-    },
-    refloatAxes: function() {
-        var h = this,
-            g = h.getAxes(),
-            o = (g && g.length) || 0,
-            c, d, n, f, l, b, k, r = h.getChartSize(),
-            q = h.getInsetPadding(),
-            p = h.getInnerPadding(),
-            a = r.width - q.left - q.right,
-            m = r.height - q.top - q.bottom,
-            j, e;
-        for (e = 0; e < o; e++) {
-            c = g[e];
-            f = c.getFloating();
-            l = f ? f.value : null;
-            if (l === null) {
-                delete c.floatingAtCoord;
-                continue
-            }
-            d = c.getSurface();
-            n = d.getRect();
-            if (!n) {
-                continue
-            }
-            n = n.slice();
-            b = h.getAxis(f.alongAxis);
-            if (b) {
-                j = b.getAlignment() === "horizontal";
-                if (Ext.isString(l)) {
-                    l = b.getCoordFor(l)
-                }
-                b.floatingAxes[c.getId()] = l;
-                k = b.getSprites()[0].attr.matrix;
-                if (j) {
-                    l = l * k.getXX() + k.getDX();
-                    c.floatingAtCoord = l + p.left + p.right
-                } else {
-                    l = l * k.getYY() + k.getDY();
-                    c.floatingAtCoord = l + p.top + p.bottom
-                }
-            } else {
-                j = c.getAlignment() === "horizontal";
-                if (j) {
-                    c.floatingAtCoord = l + p.top + p.bottom
-                } else {
-                    c.floatingAtCoord = l + p.left + p.right
-                }
-                l = d.roundPixel(0.01 * l * (j ? m : a))
-            }
-            switch (c.getPosition()) {
-                case "top":
-                    n[1] = q.top + p.top + l - n[3] + 1;
-                    break;
-                case "bottom":
-                    n[1] = q.top + p.top + (b ? l : m - l);
-                    break;
-                case "left":
-                    n[0] = q.left + p.left + l - n[2];
-                    break;
-                case "right":
-                    n[0] = q.left + p.left + (b ? l : a - l) - 1;
-                    break
-            }
-            d.setRect(n)
-        }
-    },
-    redraw: function() {
-        var C = this,
-            r = C.getSeries(),
-            z = C.getAxes(),
-            b = C.getMainRect(),
-            p, t, w = C.getInnerPadding(),
-            f, l, s, e, q, A, v, g, d, c, a, k, n, y = C.getFlipXY(),
-            x = 1000,
-            m, u, h, o, B;
-        if (!b) {
-            return
-        }
-        p = b[2] - w.left - w.right;
-        t = b[3] - w.top - w.bottom;
-        for (A = 0; A < r.length; A++) {
-            h = r[A];
-            if ((c = h.getXAxis())) {
-                n = c.getVisibleRange();
-                l = c.getRange();
-                l = [l[0] + (l[1] - l[0]) * n[0], l[0] + (l[1] - l[0]) * n[1]]
-            } else {
-                l = h.getXRange()
-            }
-            if ((a = h.getYAxis())) {
-                n = a.getVisibleRange();
-                s = a.getRange();
-                s = [s[0] + (s[1] - s[0]) * n[0], s[0] + (s[1] - s[0]) * n[1]]
-            } else {
-                s = h.getYRange()
-            }
-            q = {
-                visibleMinX: l[0],
-                visibleMaxX: l[1],
-                visibleMinY: s[0],
-                visibleMaxY: s[1],
-                innerWidth: p,
-                innerHeight: t,
-                flipXY: y
-            };
-            f = h.getSprites();
-            for (v = 0, g = f.length; v < g; v++) {
-                o = f[v];
-                m = o.attr.zIndex;
-                if (m < x) {
-                    m += (A + 1) * 100 + x;
-                    o.attr.zIndex = m;
-                    B = o.getMarker("items");
-                    if (B) {
-                        u = B.attr.zIndex;
-                        if (u === Number.MAX_VALUE) {
-                            B.attr.zIndex = m
-                        } else {
-                            if (u < x) {
-                                B.attr.zIndex = m + u
-                            }
-                        }
-                    }
-                }
-                o.setAttributes(q, true)
-            }
-        }
-        for (A = 0; A < z.length; A++) {
-            d = z[A];
-            e = d.isSide();
-            f = d.getSprites();
-            k = d.getRange();
-            n = d.getVisibleRange();
-            q = {
-                dataMin: k[0],
-                dataMax: k[1],
-                visibleMin: n[0],
-                visibleMax: n[1]
-            };
-            if (e) {
-                q.length = t;
-                q.startGap = w.bottom;
-                q.endGap = w.top
-            } else {
-                q.length = p;
-                q.startGap = w.left;
-                q.endGap = w.right
-            }
-            for (v = 0, g = f.length; v < g; v++) {
-                f[v].setAttributes(q, true)
-            }
-        }
-        C.renderFrame();
-        C.callParent(arguments)
-    },
-    renderFrame: function() {
-        this.refloatAxes();
-        this.callParent()
-    }
-});
-Ext.define("Ext.chart.grid.CircularGrid", {
-    extend: "Ext.draw.sprite.Circle",
-    alias: "grid.circular",
-    inheritableStatics: {
-        def: {
-            defaults: {
-                r: 1,
-                strokeStyle: "#DDD"
-            }
-        }
-    }
-});
-Ext.define("Ext.chart.grid.RadialGrid", {
-    extend: "Ext.draw.sprite.Path",
-    alias: "grid.radial",
-    inheritableStatics: {
-        def: {
-            processors: {
-                startRadius: "number",
-                endRadius: "number"
-            },
-            defaults: {
-                startRadius: 0,
-                endRadius: 1,
-                scalingCenterX: 0,
-                scalingCenterY: 0,
-                strokeStyle: "#DDD"
-            },
-            triggers: {
-                startRadius: "path,bbox",
-                endRadius: "path,bbox"
-            }
-        }
-    },
-    render: function() {
-        this.callParent(arguments)
-    },
-    updatePath: function(d, a) {
-        var b = a.startRadius,
-            c = a.endRadius;
-        d.moveTo(b, 0);
-        d.lineTo(c, 0)
-    }
-});
-Ext.define("Ext.chart.PolarChart", {
-    extend: "Ext.chart.AbstractChart",
-    requires: ["Ext.chart.grid.CircularGrid", "Ext.chart.grid.RadialGrid"],
-    xtype: "polar",
-    isPolar: true,
-    config: {
-        center: [0, 0],
-        radius: 0,
-        innerPadding: 0
-    },
-    getDirectionForAxis: function(a) {
-        return a === "radial" ? "Y" : "X"
-    },
-    applyCenter: function(a, b) {
-        if (b && a[0] === b[0] && a[1] === b[1]) {
-            return
-        }
-        return [+a[0], +a[1]]
-    },
-    updateCenter: function(a) {
-        var g = this,
-            h = g.getAxes(),
-            d = g.getSeries(),
-            c, f, e, b;
-        for (c = 0, f = h.length; c < f; c++) {
-            e = h[c];
-            e.setCenter(a)
-        }
-        for (c = 0, f = d.length; c < f; c++) {
-            b = d[c];
-            b.setCenter(a)
-        }
-    },
-    applyInnerPadding: function(b, a) {
-        return Ext.isNumber(b) ? b : a
-    },
-    doSetSurfaceRect: function(b, c) {
-        var a = this.getMainRect();
-        b.setRect(c);
-        b.matrix.set(1, 0, 0, 1, a[0] - c[0], a[1] - c[1]);
-        b.inverseMatrix.set(1, 0, 0, 1, c[0] - a[0], c[1] - a[1])
-    },
-    applyAxes: function(f, h) {
-        var e = this,
-            g = Ext.Array.from(e.config.series)[0],
-            b, d, c, a;
-        if (g.type === "radar" && f && f.length) {
-            for (b = 0, d = f.length; b < d; b++) {
-                c = f[b];
-                if (c.position === "angular") {
-                    a = true;
-                    break
-                }
-            }
-            if (!a) {
-                f.push({
-                    type: "category",
-                    position: "angular",
-                    fields: g.xField || g.angleField,
-                    style: {
-                        estStepSize: 1
-                    },
-                    grid: true
-                })
-            }
-        }
-        return this.callParent(arguments)
-    },
-    performLayout: function() {
-        var F = this,
-            g = true;
-        try {
-            F.animationSuspendCount++;
-            if (this.callParent() === false) {
-                g = false;
-                return
-            }
-            F.suspendThicknessChanged();
-            var h = F.getSurface("chart").getRect(),
-                v = F.getInsetPadding(),
-                G = F.getInnerPadding(),
-                l = Ext.apply({}, v),
-                d, s = h[2] - v.left - v.right,
-                r = h[3] - v.top - v.bottom,
-                x = [v.left, v.top, s, r],
-                u = F.getSeries(),
-                p, t = s - G * 2,
-                w = r - G * 2,
-                D = [t * 0.5 + G, w * 0.5 + G],
-                j = Math.min(t, w) * 0.5,
-                A = F.getAxes(),
-                f, a, k, m = [],
-                o = [],
-                E = j - G,
-                z, n, b, q, y, c, C;
-            F.setMainRect(x);
-            F.doSetSurfaceRect(F.getSurface(), x);
-            for (z = 0, n = F.surfaceMap.grid && F.surfaceMap.grid.length; z < n; z++) {
-                F.doSetSurfaceRect(F.surfaceMap.grid[z], h)
-            }
-            for (z = 0, n = A.length; z < n; z++) {
-                f = A[z];
-                switch (f.getPosition()) {
-                    case "angular":
-                        m.push(f);
-                        break;
-                    case "radial":
-                        o.push(f);
-                        break
-                }
-            }
-            for (z = 0, n = m.length; z < n; z++) {
-                f = m[z];
-                q = f.getFloating();
-                y = q ? q.value : null;
-                F.doSetSurfaceRect(f.getSurface(), h);
-                a = f.getThickness();
-                for (d in l) {
-                    l[d] += a
-                }
-                s = h[2] - l.left - l.right;
-                r = h[3] - l.top - l.bottom;
-                b = Math.min(s, r) * 0.5;
-                if (z === 0) {
-                    E = b - G
-                }
-                f.setMinimum(0);
-                f.setLength(b);
-                f.getSprites();
-                k = f.sprites[0].attr.lineWidth * 0.5;
-                for (d in l) {
-                    l[d] += k
-                }
-            }
-            for (z = 0, n = o.length; z < n; z++) {
-                f = o[z];
-                F.doSetSurfaceRect(f.getSurface(), h);
-                f.setMinimum(0);
-                f.setLength(E);
-                f.getSprites()
-            }
-            for (z = 0, n = u.length; z < n; z++) {
-                p = u[z];
-                if (p.type === "gauge" && !c) {
-                    c = p
-                } else {
-                    p.setRadius(E)
-                }
-                F.doSetSurfaceRect(p.getSurface(), x)
-            }
-            F.doSetSurfaceRect(F.getSurface("overlay"), h);
-            if (c) {
-                c.setRect(x);
-                C = c.getRadius() - G;
-                F.setRadius(C);
-                F.setCenter(c.getCenter());
-                c.setRadius(C);
-                if (A.length && A[0].getPosition() === "gauge") {
-                    f = A[0];
-                    F.doSetSurfaceRect(f.getSurface(), h);
-                    f.setTotalAngle(c.getTotalAngle());
-                    f.setLength(C)
-                }
-            } else {
-                F.setRadius(j);
-                F.setCenter(D)
-            }
-            F.redraw()
-        } catch (B) {
-            throw B
-        } finally {
-            F.animationSuspendCount--;
-            if (g) {
-                F.resumeThicknessChanged()
-            }
-        }
-    },
-    refloatAxes: function() {
-        var j = this,
-            g = j.getAxes(),
-            h = j.getMainRect(),
-            f, k, b, d, a, c, e;
-        if (!h) {
-            return
-        }
-        e = 0.5 * Math.min(h[2], h[3]);
-        for (d = 0, a = g.length; d < a; d++) {
-            c = g[d];
-            f = c.getFloating();
-            k = f ? f.value : null;
-            if (k !== null) {
-                b = j.getAxis(f.alongAxis);
-                if (c.getPosition() === "angular") {
-                    if (b) {
-                        k = b.getLength() * k / b.getRange()[1]
-                    } else {
-                        k = 0.01 * k * e
-                    }
-                    c.sprites[0].setAttributes({
-                        length: k
-                    }, true)
-                } else {
-                    if (b) {
-                        if (Ext.isString(k)) {
-                            k = b.getCoordFor(k)
-                        }
-                        k = k / (b.getRange()[1] + 1) * Math.PI * 2 - Math.PI * 1.5 + c.getRotation()
-                    } else {
-                        k = Ext.draw.Draw.rad(k)
-                    }
-                    c.sprites[0].setAttributes({
-                        baseRotation: k
-                    }, true)
-                }
-            }
-        }
-    },
-    redraw: function() {
-        var f = this,
-            g = f.getAxes(),
-            d, c = f.getSeries(),
-            b, a, e;
-        for (a = 0, e = g.length; a < e; a++) {
-            d = g[a];
-            d.getSprites()
-        }
-        for (a = 0, e = c.length; a < e; a++) {
-            b = c[a];
-            b.getSprites()
-        }
-        f.renderFrame();
-        f.callParent(arguments)
-    },
-    renderFrame: function() {
-        this.refloatAxes();
-        this.callParent()
-    }
-});
-Ext.define("Ext.chart.SpaceFillingChart", {
-    extend: "Ext.chart.AbstractChart",
-    xtype: "spacefilling",
-    config: {},
-    performLayout: function() {
-        var j = this;
-        try {
-            j.animationSuspendCount++;
-            if (j.callParent() === false) {
-                return
-            }
-            var k = j.getSurface("chart").getRect(),
-                l = j.getInsetPadding(),
-                a = k[2] - l.left - l.right,
-                m = k[3] - l.top - l.bottom,
-                h = [l.left, l.top, a, m],
-                b = j.getSeries(),
-                d, c, g;
-            j.getSurface().setRect(h);
-            j.setMainRect(h);
-            for (c = 0, g = b.length; c < g; c++) {
-                d = b[c];
-                d.getSurface().setRect(h);
-                if (d.setRect) {
-                    d.setRect(h)
-                }
-                d.getOverlaySurface().setRect(k)
-            }
-            j.redraw()
-        } catch (f) {
-            throw f
-        } finally {
-            j.animationSuspendCount--
-        }
-    },
-    redraw: function() {
-        var e = this,
-            c = e.getSeries(),
-            b, a, d;
-        for (a = 0, d = c.length; a < d; a++) {
-            b = c[a];
-            b.getSprites()
-        }
-        e.renderFrame();
-        e.callParent(arguments)
-    }
-});
-Ext.define("Ext.chart.axis.sprite.Axis3D", {
-    extend: "Ext.chart.axis.sprite.Axis",
-    alias: "sprite.axis3d",
-    type: "axis3d",
-    inheritableStatics: {
-        def: {
-            processors: {
-                depth: "number"
-            },
-            defaults: {
-                depth: 0
-            },
-            triggers: {
-                depth: "layout"
-            }
-        }
-    },
-    config: {
-        fx: {
-            customDurations: {
-                depth: 0
-            }
-        }
-    },
-    layoutUpdater: function() {
-        var h = this,
-            f = h.getAxis().getChart();
-        if (f.isInitializing) {
-            return
-        }
-        var e = h.attr,
-            d = h.getLayout(),
-            c = d.isDiscrete ? 0 : e.depth,
-            g = f.getInherited().rtl,
-            b = e.dataMin + (e.dataMax - e.dataMin) * e.visibleMin,
-            i = e.dataMin + (e.dataMax - e.dataMin) * e.visibleMax,
-            a = {
-                attr: e,
-                segmenter: h.getSegmenter(),
-                renderer: h.defaultRenderer
-            };
-        if (e.position === "left" || e.position === "right") {
-            e.translationX = 0;
-            e.translationY = i * (e.length - c) / (i - b) + c;
-            e.scalingX = 1;
-            e.scalingY = (-e.length + c) / (i - b);
-            e.scalingCenterY = 0;
-            e.scalingCenterX = 0;
-            h.applyTransformations(true)
-        } else {
-            if (e.position === "top" || e.position === "bottom") {
-                if (g) {
-                    e.translationX = e.length + b * e.length / (i - b) + 1
-                } else {
-                    e.translationX = -b * e.length / (i - b)
-                }
-                e.translationY = 0;
-                e.scalingX = (g ? -1 : 1) * (e.length - c) / (i - b);
-                e.scalingY = 1;
-                e.scalingCenterY = 0;
-                e.scalingCenterX = 0;
-                h.applyTransformations(true)
-            }
-        }
-        if (d) {
-            d.calculateLayout(a);
-            h.setLayoutContext(a)
-        }
-    },
-    renderAxisLine: function(a, j, f, c) {
-        var i = this,
-            h = i.attr,
-            b = h.lineWidth * 0.5,
-            f = i.getLayout(),
-            d = f.isDiscrete ? 0 : h.depth,
-            k = h.position,
-            e, g;
-        if (h.axisLine && h.length) {
-            switch (k) {
-                case "left":
-                    e = a.roundPixel(c[2]) - b;
-                    j.moveTo(e, -h.endGap + d);
-                    j.lineTo(e, h.length + h.startGap);
-                    break;
-                case "right":
-                    j.moveTo(b, -h.endGap);
-                    j.lineTo(b, h.length + h.startGap);
-                    break;
-                case "bottom":
-                    j.moveTo(-h.startGap, b);
-                    j.lineTo(h.length - d + h.endGap, b);
-                    break;
-                case "top":
-                    e = a.roundPixel(c[3]) - b;
-                    j.moveTo(-h.startGap, e);
-                    j.lineTo(h.length + h.endGap, e);
-                    break;
-                case "angular":
-                    j.moveTo(h.centerX + h.length, h.centerY);
-                    j.arc(h.centerX, h.centerY, h.length, 0, Math.PI * 2, true);
-                    break;
-                case "gauge":
-                    g = i.getGaugeAngles();
-                    j.moveTo(h.centerX + Math.cos(g.start) * h.length, h.centerY + Math.sin(g.start) * h.length);
-                    j.arc(h.centerX, h.centerY, h.length, g.start, g.end, true);
-                    break
-            }
-        }
-    }
-});
-Ext.define("Ext.chart.axis.Axis3D", {
-    extend: "Ext.chart.axis.Axis",
-    xtype: "axis3d",
-    requires: ["Ext.chart.axis.sprite.Axis3D"],
-    config: {
-        depth: 0
-    },
-    onSeriesChange: function(e) {
-        var g = this,
-            b = "depthchange",
-            f = "onSeriesDepthChange",
-            d, c;
-
-        function a(h) {
-            var i = g.boundSeries;
-            for (d = 0; d < i.length; d++) {
-                c = i[d];
-                c[h](b, f, g)
-            }
-        }
-        a("un");
-        g.callParent(arguments);
-        a("on")
-    },
-    onSeriesDepthChange: function(b, f) {
-        var d = this,
-            g = f,
-            e = d.boundSeries,
-            a, c;
-        if (f > d.getDepth()) {
-            g = f
-        } else {
-            for (a = 0; a < e.length; a++) {
-                c = e[a];
-                if (c !== b && c.getDepth) {
-                    f = c.getDepth();
-                    if (f > g) {
-                        g = f
-                    }
-                }
-            }
-        }
-        d.setDepth(g)
-    },
-    updateDepth: function(d) {
-        var b = this,
-            c = b.getSprites(),
-            a = {
-                depth: d
-            };
-        if (c && c.length) {
-            c[0].setAttributes(a)
-        }
-        if (b.gridSpriteEven && b.gridSpriteOdd) {
-            b.gridSpriteEven.getTemplate().setAttributes(a);
-            b.gridSpriteOdd.getTemplate().setAttributes(a)
-        }
-    },
-    getGridAlignment: function() {
-        switch (this.getPosition()) {
-            case "left":
-            case "right":
-                return "horizontal3d";
-            case "top":
-            case "bottom":
-                return "vertical3d"
-        }
-    }
-});
-Ext.define("Ext.chart.axis.Category", {
-    requires: ["Ext.chart.axis.layout.CombineDuplicate", "Ext.chart.axis.segmenter.Names"],
-    extend: "Ext.chart.axis.Axis",
-    alias: "axis.category",
-    type: "category",
-    config: {
-        layout: "combineDuplicate",
-        segmenter: "names"
-    }
-});
-Ext.define("Ext.chart.axis.Category3D", {
-    requires: ["Ext.chart.axis.layout.CombineDuplicate", "Ext.chart.axis.segmenter.Names"],
-    extend: "Ext.chart.axis.Axis3D",
-    alias: "axis.category3d",
-    type: "category3d",
-    config: {
-        layout: "combineDuplicate",
-        segmenter: "names"
-    }
-});
-Ext.define("Ext.chart.axis.Numeric", {
-    extend: "Ext.chart.axis.Axis",
-    type: "numeric",
-    alias: ["axis.numeric", "axis.radial"],
-    requires: ["Ext.chart.axis.layout.Continuous", "Ext.chart.axis.segmenter.Numeric"],
-    config: {
-        layout: "continuous",
-        segmenter: "numeric",
-        aggregator: "double"
-    }
-});
-Ext.define("Ext.chart.axis.Numeric3D", {
-    extend: "Ext.chart.axis.Axis3D",
-    alias: ["axis.numeric3d"],
-    type: "numeric3d",
-    requires: ["Ext.chart.axis.layout.Continuous", "Ext.chart.axis.segmenter.Numeric"],
-    config: {
-        layout: "continuous",
-        segmenter: "numeric",
-        aggregator: "double"
-    }
-});
-Ext.define("Ext.chart.axis.Time", {
-    extend: "Ext.chart.axis.Numeric",
-    alias: "axis.time",
-    type: "time",
-    requires: ["Ext.chart.axis.layout.Continuous", "Ext.chart.axis.segmenter.Time"],
-    config: {
-        calculateByLabelSize: true,
-        dateFormat: null,
-        fromDate: null,
-        toDate: null,
-        step: [Ext.Date.DAY, 1],
-        layout: "continuous",
-        segmenter: "time",
-        aggregator: "time"
-    },
-    updateDateFormat: function(a) {
-        this.setRenderer(function(c, b) {
-            return Ext.Date.format(new Date(b), a)
-        })
-    },
-    updateFromDate: function(a) {
-        this.setMinimum(+a)
-    },
-    updateToDate: function(a) {
-        this.setMaximum(+a)
-    },
-    getCoordFor: function(a) {
-        if (Ext.isString(a)) {
-            a = new Date(a)
-        }
-        return +a
-    }
-});
-Ext.define("Ext.chart.axis.Time3D", {
-    extend: "Ext.chart.axis.Numeric3D",
-    alias: "axis.time3d",
-    type: "time3d",
-    requires: ["Ext.chart.axis.layout.Continuous", "Ext.chart.axis.segmenter.Time"],
-    config: {
-        calculateByLabelSize: true,
-        dateFormat: null,
-        fromDate: null,
-        toDate: null,
-        step: [Ext.Date.DAY, 1],
-        layout: "continuous",
-        segmenter: "time",
-        aggregator: "time"
-    },
-    updateDateFormat: function(a) {
-        this.setRenderer(function(c, b) {
-            return Ext.Date.format(new Date(b), a)
-        })
-    },
-    updateFromDate: function(a) {
-        this.setMinimum(+a)
-    },
-    updateToDate: function(a) {
-        this.setMaximum(+a)
-    },
-    getCoordFor: function(a) {
-        if (Ext.isString(a)) {
-            a = new Date(a)
-        }
-        return +a
-    }
-});
-Ext.define("Ext.chart.grid.HorizontalGrid3D", {
-    extend: "Ext.chart.grid.HorizontalGrid",
-    alias: "grid.horizontal3d",
-    inheritableStatics: {
-        def: {
-            processors: {
-                depth: "number"
-            },
-            defaults: {
-                depth: 0
-            }
-        }
-    },
-    render: function(a, k, d) {
-        var f = this.attr,
-            i = a.roundPixel(f.x),
-            h = a.roundPixel(f.y),
-            l = a.matrix.getDX(),
-            c = k.lineWidth * 0.5,
-            j = f.height,
-            e = f.depth,
-            b, g;
-        if (h <= d[1]) {
-            return
-        }
-        b = d[0] + e - l;
-        g = h + c - e;
-        k.beginPath();
-        k.rect(b, g, d[2], j);
-        k.fill();
-        k.beginPath();
-        k.moveTo(b, g);
-        k.lineTo(b + d[2], g);
-        k.stroke();
-        b = d[0] + i - l;
-        g = h + c;
-        k.beginPath();
-        k.moveTo(b, g);
-        k.lineTo(b + e, g - e);
-        k.lineTo(b + e, g - e + j);
-        k.lineTo(b, g + j);
-        k.closePath();
-        k.fill();
-        k.beginPath();
-        k.moveTo(b, g);
-        k.lineTo(b + e, g - e);
-        k.stroke()
-    }
-});
-Ext.define("Ext.chart.grid.VerticalGrid3D", {
-    extend: "Ext.chart.grid.VerticalGrid",
-    alias: "grid.vertical3d",
-    inheritableStatics: {
-        def: {
-            processors: {
-                depth: "number"
-            },
-            defaults: {
-                depth: 0
-            }
-        }
-    },
-    render_: function(c, d, f) {
-        var b = this.attr,
-            a = c.roundPixel(b.x),
-            e = d.lineWidth * 0.5;
-        d.beginPath();
-        d.rect(a - e, f[1] - c.matrix.getDY(), b.width, f[3]);
-        d.fill();
-        d.beginPath();
-        d.moveTo(a - e, f[1] - c.matrix.getDY());
-        d.lineTo(a - e, f[1] + f[3] - c.matrix.getDY());
-        d.stroke()
-    },
-    render: function(b, j, e) {
-        var g = this.attr,
-            i = b.roundPixel(g.x),
-            k = b.matrix.getDY(),
-            d = j.lineWidth * 0.5,
-            a = g.width,
-            f = g.depth,
-            c, h;
-        if (i >= e[2]) {
-            return
-        }
-        c = i - d + f;
-        h = e[1] - f - k;
-        j.beginPath();
-        j.rect(c, h, a, e[3]);
-        j.fill();
-        j.beginPath();
-        j.moveTo(c, h);
-        j.lineTo(c, h + e[3]);
-        j.stroke();
-        c = i - d;
-        h = e[3];
-        j.beginPath();
-        j.moveTo(c, h);
-        j.lineTo(c + f, h - f);
-        j.lineTo(c + f + a, h - f);
-        j.lineTo(c + a, h);
-        j.closePath();
-        j.fill();
-        c = i - d;
-        h = e[3];
-        j.beginPath();
-        j.moveTo(c, h);
-        j.lineTo(c + f, h - f);
-        j.stroke()
-    }
-});
-Ext.define("Ext.chart.interactions.CrossZoom", {
-    extend: "Ext.chart.interactions.Abstract",
-    type: "crosszoom",
-    alias: "interaction.crosszoom",
-    isCrossZoom: true,
-    config: {
-        axes: true,
-        gestures: {
-            dragstart: "onGestureStart",
-            drag: "onGesture",
-            dragend: "onGestureEnd",
-            dblclick: "onDoubleTap"
-        },
-        undoButton: {}
-    },
-    stopAnimationBeforeSync: false,
-    zoomAnimationInProgress: false,
-    constructor: function() {
-        this.callParent(arguments);
-        this.zoomHistory = []
-    },
-    applyAxes: function(b) {
-        var a = {};
-        if (b === true) {
-            return {
-                top: {},
-                right: {},
-                bottom: {},
-                left: {}
-            }
-        } else {
-            if (Ext.isArray(b)) {
-                a = {};
-                Ext.each(b, function(c) {
-                    a[c] = {}
-                })
-            } else {
-                if (Ext.isObject(b)) {
-                    Ext.iterate(b, function(c, d) {
-                        if (d === true) {
-                            a[c] = {}
-                        } else {
-                            if (d !== false) {
-                                a[c] = d
-                            }
-                        }
-                    })
-                }
-            }
-        }
-        return a
-    },
-    applyUndoButton: function(b, a) {
-        var c = this;
-        if (a) {
-            a.destroy()
-        }
-        if (b) {
-            return Ext.create("Ext.Button", Ext.apply({
-                cls: [],
-                text: "Undo Zoom",
-                disabled: true,
-                handler: function() {
-                    c.undoZoom()
-                }
-            }, b))
-        }
-    },
-    getSurface: function() {
-        return this.getChart() && this.getChart().getSurface("main")
-    },
-    setSeriesOpacity: function(b) {
-        var a = this.getChart() && this.getChart().getSurface("series");
-        if (a) {
-            a.element.setStyle("opacity", b)
-        }
-    },
-    onGestureStart: function(h) {
-        var j = this,
-            i = j.getChart(),
-            d = j.getSurface(),
-            l = i.getInnerRect(),
-            c = i.getInnerPadding(),
-            g = c.left,
-            b = g + l[2],
-            f = c.top,
-            a = f + l[3],
-            n = i.getEventXY(h),
-            m = n[0],
-            k = n[1];
-        if (j.zoomAnimationInProgress) {
-            return
-        }
-        if (m > g && m < b && k > f && k < a) {
-            j.gestureEvent = "drag";
-            j.lockEvents(j.gestureEvent);
-            j.startX = m;
-            j.startY = k;
-            j.selectionRect = d.add({
-                type: "rect",
-                globalAlpha: 0.5,
-                fillStyle: "rgba(80,80,140,0.5)",
-                strokeStyle: "rgba(80,80,140,1)",
-                lineWidth: 2,
-                x: m,
-                y: k,
-                width: 0,
-                height: 0,
-                zIndex: 10000
-            });
-            j.setSeriesOpacity(0.8);
-            return false
-        }
-    },
-    onGesture: function(h) {
-        var j = this;
-        if (j.zoomAnimationInProgress) {
-            return
-        }
-        if (j.getLocks()[j.gestureEvent] === j) {
-            var i = j.getChart(),
-                d = j.getSurface(),
-                l = i.getInnerRect(),
-                c = i.getInnerPadding(),
-                g = c.left,
-                b = g + l[2],
-                f = c.top,
-                a = f + l[3],
-                n = i.getEventXY(h),
-                m = n[0],
-                k = n[1];
-            if (m < g) {
-                m = g
-            } else {
-                if (m > b) {
-                    m = b
-                }
-            }
-            if (k < f) {
-                k = f
-            } else {
-                if (k > a) {
-                    k = a
-                }
-            }
-            j.selectionRect.setAttributes({
-                width: m - j.startX,
-                height: k - j.startY
-            });
-            if (Math.abs(j.startX - m) < 11 || Math.abs(j.startY - k) < 11) {
-                j.selectionRect.setAttributes({
-                    globalAlpha: 0.5
-                })
-            } else {
-                j.selectionRect.setAttributes({
-                    globalAlpha: 1
-                })
-            }
-            d.renderFrame();
-            return false
-        }
-    },
-    onGestureEnd: function(i) {
-        var l = this;
-        if (l.zoomAnimationInProgress) {
-            return
-        }
-        if (l.getLocks()[l.gestureEvent] === l) {
-            var k = l.getChart(),
-                d = l.getSurface(),
-                n = k.getInnerRect(),
-                c = k.getInnerPadding(),
-                g = c.left,
-                b = g + n[2],
-                f = c.top,
-                a = f + n[3],
-                h = n[2],
-                j = n[3],
-                p = k.getEventXY(i),
-                o = p[0],
-                m = p[1];
-            if (o < g) {
-                o = g
-            } else {
-                if (o > b) {
-                    o = b
-                }
-            }
-            if (m < f) {
-                m = f
-            } else {
-                if (m > a) {
-                    m = a
-                }
-            }
-            if (Math.abs(l.startX - o) < 11 || Math.abs(l.startY - m) < 11) {
-                d.remove(l.selectionRect)
-            } else {
-                l.zoomBy([Math.min(l.startX, o) / h, 1 - Math.max(l.startY, m) / j, Math.max(l.startX, o) / h, 1 - Math.min(l.startY, m) / j]);
-                l.selectionRect.setAttributes({
-                    x: Math.min(l.startX, o),
-                    y: Math.min(l.startY, m),
-                    width: Math.abs(l.startX - o),
-                    height: Math.abs(l.startY - m)
-                });
-                l.selectionRect.setAnimation(k.getAnimation() || {
-                    duration: 0
-                });
-                l.selectionRect.setAttributes({
-                    globalAlpha: 0,
-                    x: 0,
-                    y: 0,
-                    width: h,
-                    height: j
-                });
-                l.zoomAnimationInProgress = true;
-                k.suspendThicknessChanged();
-                l.selectionRect.fx.on("animationend", function() {
-                    k.resumeThicknessChanged();
-                    d.remove(l.selectionRect);
-                    l.selectionRect = null;
-                    l.zoomAnimationInProgress = false
-                })
-            }
-            d.renderFrame();
-            l.sync();
-            l.unlockEvents(l.gestureEvent);
-            l.setSeriesOpacity(1);
-            if (!l.zoomAnimationInProgress) {
-                d.remove(l.selectionRect);
-                l.selectionRect = null
-            }
-        }
-    },
-    zoomBy: function(o) {
-        var n = this,
-            a = n.getAxes(),
-            k = n.getChart(),
-            j = k.getAxes(),
-            l = k.getInherited().rtl,
-            f, d = {},
-            c, b;
-        if (l) {
-            o = o.slice();
-            c = 1 - o[0];
-            b = 1 - o[2];
-            o[0] = Math.min(c, b);
-            o[2] = Math.max(c, b)
-        }
-        for (var h = 0; h < j.length; h++) {
-            var g = j[h];
-            f = a[g.getPosition()];
-            if (f && f.allowZoom !== false) {
-                var e = g.isSide(),
-                    m = g.getVisibleRange();
-                d[g.getId()] = m.slice(0);
-                if (!e) {
-                    g.setVisibleRange([(m[1] - m[0]) * o[0] + m[0], (m[1] - m[0]) * o[2] + m[0]])
-                } else {
-                    g.setVisibleRange([(m[1] - m[0]) * o[1] + m[0], (m[1] - m[0]) * o[3] + m[0]])
-                }
-            }
-        }
-        n.zoomHistory.push(d);
-        n.getUndoButton().setDisabled(false)
-    },
-    undoZoom: function() {
-        var c = this.zoomHistory.pop(),
-            d = this.getChart().getAxes();
-        if (c) {
-            for (var a = 0; a < d.length; a++) {
-                var b = d[a];
-                if (c[b.getId()]) {
-                    b.setVisibleRange(c[b.getId()])
-                }
-            }
-        }
-        this.getUndoButton().setDisabled(this.zoomHistory.length === 0);
-        this.sync()
-    },
-    onDoubleTap: function(a) {
-        this.undoZoom()
-    },
-    destroy: function() {
-        this.setUndoButton(null);
-        this.callParent(arguments)
-    }
-});
-Ext.define("Ext.chart.interactions.Crosshair", {
-    extend: "Ext.chart.interactions.Abstract",
-    requires: ["Ext.chart.grid.HorizontalGrid", "Ext.chart.grid.VerticalGrid", "Ext.chart.CartesianChart", "Ext.chart.axis.layout.Discrete"],
-    type: "crosshair",
-    alias: "interaction.crosshair",
-    config: {
-        axes: {
-            top: {
-                label: {},
-                rect: {}
-            },
-            right: {
-                label: {},
-                rect: {}
-            },
-            bottom: {
-                label: {},
-                rect: {}
-            },
-            left: {
-                label: {},
-                rect: {}
-            }
-        },
-        lines: {
-            horizontal: {
-                strokeStyle: "black",
-                lineDash: [5, 5]
-            },
-            vertical: {
-                strokeStyle: "black",
-                lineDash: [5, 5]
-            }
-        },
-        gesture: "drag"
-    },
-    applyAxes: function(b, a) {
-        return Ext.merge(a || {}, b)
-    },
-    applyLines: function(a, b) {
-        return Ext.merge(b || {}, a)
-    },
-    updateChart: function(a) {
-        if (a && !a.isCartesian) {
-            Ext.raise("Crosshair interaction can only be used on cartesian charts.")
-        }
-        this.callParent(arguments)
-    },
-    getGestures: function() {
-        var a = this,
-            b = {};
-        b[a.getGesture()] = "onGesture";
-        b[a.getGesture() + "start"] = "onGestureStart";
-        b[a.getGesture() + "end"] = "onGestureEnd";
-        return b
-    },
-    onGestureStart: function(N) {
-        var m = this,
-            O = m.getChart(),
-            B = O.getTheme().getAxis(),
-            A, F = O.getSurface("overlay"),
-            s = O.getInnerRect(),
-            n = s[2],
-            M = s[3],
-            r = O.getEventXY(N),
-            D = r[0],
-            C = r[1],
-            E = O.getAxes(),
-            u = m.getAxes(),
-            h = m.getLines(),
-            q, v, b, d, k, z, G, L, J, o, I, w, l, f, p, j, t, a, g, H, c, K;
-        if (D > 0 && D < n && C > 0 && C < M) {
-            m.lockEvents(m.getGesture());
-            H = Ext.apply({
-                xclass: "Ext.chart.grid.HorizontalGrid",
-                x: 0,
-                y: C,
-                width: n
-            }, h.horizontal);
-            c = Ext.apply({
-                xclass: "Ext.chart.grid.VerticalGrid",
-                x: D,
-                y: 0,
-                height: M
-            }, h.vertical);
-            m.axesLabels = m.axesLabels || {};
-            for (K = 0; K < E.length; K++) {
-                q = E[K];
-                v = q.getSurface();
-                b = v.getRect();
-                w = q.getSprites()[0];
-                d = b[2];
-                k = b[3];
-                z = q.getPosition();
-                G = q.getAlignment();
-                t = q.getTitle();
-                a = t && t.attr.text !== "" && t.getBBox();
-                l = w.attr;
-                f = w.thickness;
-                p = l.axisLine ? l.lineWidth : 0;
-                j = p / 2;
-                I = Math.max(l.majorTickSize, l.minorTickSize) + p;
-                L = m.axesLabels[z] = v.add({
-                    type: "composite"
-                });
-                L.labelRect = L.add(Ext.apply({
-                    type: "rect",
-                    fillStyle: "white",
-                    x: z === "right" ? p : 0,
-                    y: z === "bottom" ? p : 0,
-                    width: d - p - (G === "vertical" && a ? a.width : 0),
-                    height: k - p - (G === "horizontal" && a ? a.height : 0),
-                    translationX: z === "left" && a ? a.width : 0,
-                    translationY: z === "top" && a ? a.height : 0
-                }, u.rect || u[z].rect));
-                if (G === "vertical" && !c.strokeStyle) {
-                    c.strokeStyle = l.strokeStyle
-                }
-                if (G === "horizontal" && !H.strokeStyle) {
-                    H.strokeStyle = l.strokeStyle
-                }
-                A = Ext.merge({}, B.defaults, B[z]);
-                J = Ext.apply({}, q.config.label, A.label);
-                o = u.label || u[z].label;
-                L.labelText = L.add(Ext.apply(J, o, {
-                    type: "text",
-                    x: (function() {
-                        switch (z) {
-                            case "left":
-                                g = a ? a.x + a.width : 0;
-                                return g + (d - g - I) / 2 - j;
-                            case "right":
-                                g = a ? d - a.x : 0;
-                                return I + (d - I - g) / 2 + j;
-                            default:
-                                return 0
-                        }
-                    })(),
-                    y: (function() {
-                        switch (z) {
-                            case "top":
-                                g = a ? a.y + a.height : 0;
-                                return g + (k - g - I) / 2 - j;
-                            case "bottom":
-                                g = a ? k - a.y : 0;
-                                return I + (k - I - g) / 2 + j;
-                            default:
-                                return 0
-                        }
-                    })()
-                }))
-            }
-            m.horizontalLine = F.add(H);
-            m.verticalLine = F.add(c);
-            return false
-        }
-    },
-    onGesture: function(G) {
-        var K = this;
-        if (K.getLocks()[K.getGesture()] !== K) {
-            return
-        }
-        var u = K.getChart(),
-            z = u.getSurface("overlay"),
-            a = Ext.Array.slice(u.getInnerRect()),
-            r = u.getInnerPadding(),
-            t = r.left,
-            q = r.top,
-            E = a[2],
-            f = a[3],
-            d = u.getEventXY(G),
-            k = d[0],
-            j = d[1],
-            D = u.getAxes(),
-            c, h, m, p, J, w, I, H, s, b, C, g, v, n, l, A, F, o, B;
-        if (k < 0) {
-            k = 0
-        } else {
-            if (k > E) {
-                k = E
-            }
-        }
-        if (j < 0) {
-            j = 0
-        } else {
-            if (j > f) {
-                j = f
-            }
-        }
-        k += t;
-        j += q;
-        for (B = 0; B < D.length; B++) {
-            c = D[B];
-            h = c.getPosition();
-            m = c.getAlignment();
-            p = c.getSurface();
-            J = c.getSprites()[0];
-            w = J.attr.matrix;
-            C = J.attr.textPadding * 2;
-            s = K.axesLabels[h];
-            I = J.getLayoutContext();
-            H = c.getSegmenter();
-            if (s) {
-                if (m === "vertical") {
-                    v = w.getYY();
-                    l = w.getDY();
-                    F = (j - l - q) / v;
-                    if (c.getLayout() instanceof Ext.chart.axis.layout.Discrete) {
-                        j = Math.round(F) * v + l + q;
-                        F = H.from(Math.round(F));
-                        F = J.attr.data[F]
-                    } else {
-                        F = H.from(F)
-                    }
-                    o = H.renderer(F, I);
-                    s.setAttributes({
-                        translationY: j - q
-                    });
-                    s.labelText.setAttributes({
-                        text: o
-                    });
-                    b = s.labelText.getBBox();
-                    s.labelRect.setAttributes({
-                        height: b.height + C,
-                        y: -(b.height + C) / 2
-                    });
-                    p.renderFrame()
-                } else {
-                    g = w.getXX();
-                    n = w.getDX();
-                    A = (k - n - t) / g;
-                    if (c.getLayout() instanceof Ext.chart.axis.layout.Discrete) {
-                        k = Math.round(A) * g + n + t;
-                        A = H.from(Math.round(A));
-                        A = J.attr.data[A]
-                    } else {
-                        A = H.from(A)
-                    }
-                    o = H.renderer(A, I);
-                    s.setAttributes({
-                        translationX: k - t
-                    });
-                    s.labelText.setAttributes({
-                        text: o
-                    });
-                    b = s.labelText.getBBox();
-                    s.labelRect.setAttributes({
-                        width: b.width + C,
-                        x: -(b.width + C) / 2
-                    });
-                    p.renderFrame()
-                }
-            }
-        }
-        K.horizontalLine.setAttributes({
-            y: j,
-            strokeStyle: J.attr.strokeStyle
-        });
-        K.verticalLine.setAttributes({
-            x: k,
-            strokeStyle: J.attr.strokeStyle
-        });
-        z.renderFrame();
-        return false
-    },
-    onGestureEnd: function(h) {
-        var l = this,
-            k = l.getChart(),
-            a = k.getSurface("overlay"),
-            j = k.getAxes(),
-            c, g, d, b, f;
-        a.remove(l.verticalLine);
-        a.remove(l.horizontalLine);
-        for (f = 0; f < j.length; f++) {
-            c = j[f];
-            g = c.getPosition();
-            d = c.getSurface();
-            b = l.axesLabels[g];
-            if (b) {
-                delete l.axesLabels[g];
-                d.remove(b)
-            }
-            d.renderFrame()
-        }
-        a.renderFrame();
-        l.unlockEvents(l.getGesture())
-    }
-});
-Ext.define("Ext.chart.interactions.ItemHighlight", {
-    extend: "Ext.chart.interactions.Abstract",
-    type: "itemhighlight",
-    alias: "interaction.itemhighlight",
-    isItemHighlight: true,
-    config: {
-        gestures: {
-            tap: "onTapGesture",
-            mousemove: "onMouseMoveGesture",
-            mousedown: "onMouseDownGesture",
-            mouseup: "onMouseUpGesture",
-            mouseleave: "onMouseUpGesture"
-        },
-        sticky: false
-    },
-    stickyHighlightItem: null,
-    onMouseMoveGesture: function(g) {
-        var d = this,
-            h = d.tipItem,
-            a = g.pointerType === "mouse",
-            c, f, b;
-        if (d.getSticky()) {
-            return true
-        }
-        if (d.isDragging) {
-            if (h && a) {
-                h.series.hideTooltip(h);
-                d.tipItem = null
-            }
-        } else {
-            if (!d.stickyHighlightItem) {
-                c = d.getItemForEvent(g);
-                b = d.getChart();
-                if (c !== b.getHighlightItem()) {
-                    d.highlight(c);
-                    d.sync()
-                }
-                if (a) {
-                    if (h && (!c || h.field !== c.field || h.record !== c.record)) {
-                        h.series.hideTooltip(h);
-                        d.tipItem = h = null
-                    }
-                    if (c && (f = c.series.getTooltip())) {
-                        if (f.trackMouse || !h) {
-                            c.series.showTooltip(c, g.getXY())
-                        }
-                        d.tipItem = c
-                    }
-                }
-                return false
-            }
-        }
-    },
-    highlight: function(a) {
-        this.getChart().setHighlightItem(a)
-    },
-    showTooltip: function(b, a) {
-        a.series.showTooltip(a, b.getXY());
-        this.tipItem = a
-    },
-    onMouseDownGesture: function() {
-        this.isDragging = true
-    },
-    onMouseUpGesture: function() {
-        this.isDragging = false
-    },
-    onTapGesture: function(c) {
-        var b = this;
-        if (c.pointerType === "mouse" && !b.getSticky()) {
-            return
-        }
-        var a = b.getItemForEvent(c);
-        if (b.stickyHighlightItem && a && (b.stickyHighlightItem.index === a.index)) {
-            a = null
-        }
-        b.stickyHighlightItem = a;
-        b.highlight(a)
-    }
-});
-Ext.define("Ext.chart.interactions.ItemEdit", {
-    extend: "Ext.chart.interactions.ItemHighlight",
-    requires: ["Ext.tip.ToolTip"],
-    type: "itemedit",
-    alias: "interaction.itemedit",
-    isItemEdit: true,
-    config: {
-        style: null,
-        renderer: null,
-        tooltip: true,
-        gestures: {
-            dragstart: "onDragStart",
-            drag: "onDrag",
-            dragend: "onDragEnd"
-        },
-        cursors: {
-            ewResize: "ew-resize",
-            nsResize: "ns-resize",
-            move: "move"
-        }
-    },
-    item: null,
-    applyTooltip: function(b) {
-        if (b) {
-            var a = Ext.apply({}, b, {
-                renderer: this.defaultTooltipRenderer,
-                constrainPosition: true,
-                shrinkWrapDock: true,
-                autoHide: true,
-                offsetX: 10,
-                offsetY: 10
-            });
-            b = new Ext.tip.ToolTip(a)
-        }
-        return b
-    },
-    defaultTooltipRenderer: function(b, a, f, d) {
-        var c = [];
-        if (f.xField) {
-            c.push(f.xField + ": " + f.xValue)
-        }
-        if (f.yField) {
-            c.push(f.yField + ": " + f.yValue)
-        }
-        b.setHtml(c.join("<br>"))
-    },
-    onDragStart: function(d) {
-        var c = this,
-            a = c.getChart(),
-            b = a.getHighlightItem();
-        if (b) {
-            a.fireEvent("beginitemedit", a, c, c.item = b);
-            return false
-        }
-    },
-    onDrag: function(f) {
-        var d = this,
-            b = d.getChart(),
-            c = b.getHighlightItem(),
-            a = c && c.sprite.type;
-        if (c) {
-            switch (a) {
-                case "barSeries":
-                    return d.onDragBar(f);
-                    break;
-                case "scatterSeries":
-                    return d.onDragScatter(f);
-                    break
-            }
-        }
-    },
-    highlight: function(f) {
-        var e = this,
-            d = e.getChart(),
-            a = d.getFlipXY(),
-            g = e.getCursors(),
-            c = f && f.sprite.type,
-            b = d.el.dom.style;
-        e.callParent([f]);
-        if (f) {
-            switch (c) {
-                case "barSeries":
-                    if (a) {
-                        b.cursor = g.ewResize
-                    } else {
-                        b.cursor = g.nsResize
-                    }
-                    break;
-                case "scatterSeries":
-                    b.cursor = g.move;
-                    break
-            }
-        } else {
-            d.el.dom.style.cursor = "default"
-        }
-    },
-    onDragBar: function(i) {
-        var m = this,
-            k = m.getChart(),
-            l = k.getInherited().rtl,
-            f = k.isCartesian && k.getFlipXY(),
-            q = k.getHighlightItem(),
-            g = q.sprite.getMarker("items"),
-            p = g.getMarkerFor(q.sprite.getId(), q.index),
-            b = q.sprite.getSurface(),
-            c = b.getRect(),
-            r = b.getEventXY(i),
-            o = q.sprite.attr.matrix,
-            j = m.getRenderer(),
-            a, n, d, h;
-        if (f) {
-            h = l ? c[2] - r[0] : r[0]
-        } else {
-            h = c[3] - r[1]
-        }
-        a = {
-            x: p.x,
-            y: h,
-            width: p.width,
-            height: p.height + (p.y - h),
-            radius: p.radius,
-            fillStyle: "none",
-            lineDash: [4, 4],
-            zIndex: 100
-        };
-        Ext.apply(a, m.getStyle());
-        if (Ext.isArray(q.series.getYField())) {
-            h = h - p.y - p.height
-        }
-        m.target = {
-            index: q.index,
-            yField: q.field,
-            yValue: (h - o.getDY()) / o.getYY()
-        };
-        d = [k, {
-            target: m.target,
-            style: a,
-            item: q
-        }];
-        n = Ext.callback(j, null, d, 0, k);
-        if (n) {
-            Ext.apply(a, n)
-        }
-        q.sprite.putMarker("items", a, "itemedit");
-        m.showTooltip(i, m.target, q);
-        b.renderFrame()
-    },
-    onDragScatter: function(n) {
-        var t = this,
-            g = t.getChart(),
-            d = g.getInherited().rtl,
-            l = g.isCartesian && g.getFlipXY(),
-            o = g.getHighlightItem(),
-            b = o.sprite.getMarker("items"),
-            p = b.getMarkerFor(o.sprite.getId(), o.index),
-            j = o.sprite.getSurface(),
-            h = j.getRect(),
-            a = j.getEventXY(n),
-            k = o.sprite.attr.matrix,
-            c = o.series.getXAxis(),
-            f = c && c.getLayout().isContinuous,
-            i = t.getRenderer(),
-            m, u, q, s, r;
-        if (l) {
-            r = d ? h[2] - a[0] : a[0]
-        } else {
-            r = h[3] - a[1]
-        }
-        if (f) {
-            if (l) {
-                s = h[3] - a[1]
-            } else {
-                s = a[0]
-            }
-        } else {
-            s = p.translationX
-        }
-        m = {
-            translationX: s,
-            translationY: r,
-            scalingX: p.scalingX,
-            scalingY: p.scalingY,
-            r: p.r,
-            fillStyle: "none",
-            lineDash: [4, 4],
-            zIndex: 100
-        };
-        Ext.apply(m, t.getStyle());
-        t.target = {
-            index: o.index,
-            yField: o.field,
-            yValue: (r - k.getDY()) / k.getYY()
-        };
-        if (f) {
-            Ext.apply(t.target, {
-                xField: o.series.getXField(),
-                xValue: (s - k.getDX()) / k.getXX()
-            })
-        }
-        q = [g, {
-            target: t.target,
-            style: m,
-            item: o
-        }];
-        u = Ext.callback(i, null, q, 0, g);
-        if (u) {
-            Ext.apply(m, u)
-        }
-        o.sprite.putMarker("items", m, "itemedit");
-        t.showTooltip(n, t.target, o);
-        j.renderFrame()
-    },
-    showTooltip: function(g, f, c) {
-        var d = this.getTooltip(),
-            a, b;
-        if (d && Ext.toolkit !== "modern") {
-            a = d.config;
-            b = this.getChart();
-            Ext.callback(a.renderer, null, [d, c, f, g], 0, b);
-            d.show([g.x + a.offsetX, g.y + a.offsetY])
-        }
-    },
-    hideTooltip: function() {
-        var a = this.getTooltip();
-        if (a && Ext.toolkit !== "modern") {
-            a.hide()
-        }
-    },
-    onDragEnd: function(g) {
-        var d = this,
-            f = d.target,
-            c = d.getChart(),
-            b = c.getStore(),
-            a;
-        if (f) {
-            a = b.getAt(f.index);
-            if (f.yField) {
-                a.set(f.yField, f.yValue, {
-                    convert: false
-                })
-            }
-            if (f.xField) {
-                a.set(f.xField, f.xValue, {
-                    convert: false
-                })
-            }
-            if (f.yField || f.xField) {
-                d.getChart().onDataChanged()
-            }
-            d.target = null
-        }
-        d.hideTooltip();
-        if (d.item) {
-            c.fireEvent("enditemedit", c, d, d.item, f)
-        }
-        d.highlight(d.item = null)
-    },
-    destroy: function() {
-        var a = this.getConfig("tooltip", true);
-        Ext.destroy(a);
-        this.callParent()
-    }
-});
-Ext.define("Ext.chart.interactions.PanZoom", {
-    extend: "Ext.chart.interactions.Abstract",
-    type: "panzoom",
-    alias: "interaction.panzoom",
-    requires: ["Ext.draw.Animator"],
-    config: {
-        axes: {
-            top: {},
-            right: {},
-            bottom: {},
-            left: {}
-        },
-        minZoom: null,
-        maxZoom: null,
-        showOverflowArrows: true,
-        panGesture: "drag",
-        zoomGesture: "pinch",
-        zoomOnPanGesture: false,
-        modeToggleButton: {
-            xtype: "segmentedbutton",
-            width: 200,
-            defaults: {
-                ui: "default-toolbar"
-            },
-            cls: Ext.baseCSSPrefix + "panzoom-toggle",
-            items: [{
-                text: "Pan"
-            }, {
-                text: "Zoom"
-            }]
-        },
-        hideLabelInGesture: false
-    },
-    stopAnimationBeforeSync: true,
-    applyAxes: function(b, a) {
-        return Ext.merge(a || {}, b)
-    },
-    applyZoomOnPanGesture: function(a) {
-        this.getChart();
-        if (this.isMultiTouch()) {
-            return false
-        }
-        return a
-    },
-    updateZoomOnPanGesture: function(b) {
-        var a = this.getModeToggleButton();
-        if (!this.isMultiTouch()) {
-            a.show();
-            a.setValue(b ? 1 : 0)
-        } else {
-            a.hide()
-        }
-    },
-    toggleMode: function() {
-        var a = this;
-        if (!a.isMultiTouch()) {
-            a.setZoomOnPanGesture(!a.getZoomOnPanGesture())
-        }
-    },
-    applyModeToggleButton: function(c, b) {
-        var d = this,
-            a = Ext.factory(c, "Ext.button.Segmented", b);
-        if (!a && b) {
-            b.destroy()
-        }
-        if (a && !b) {
-            a.addListener("toggle", function(e) {
-                d.setZoomOnPanGesture(e.getValue() === 1)
-            })
-        }
-        return a
-    },
-    getGestures: function() {
-        var c = this,
-            e = {},
-            d = c.getPanGesture(),
-            b = c.getZoomGesture(),
-            a = Ext.supports.Touch;
-        e[b] = "onZoomGestureMove";
-        e[b + "start"] = "onZoomGestureStart";
-        e[b + "end"] = "onZoomGestureEnd";
-        e[d] = "onPanGestureMove";
-        e[d + "start"] = "onPanGestureStart";
-        e[d + "end"] = "onPanGestureEnd";
-        e.doubletap = "onDoubleTap";
-        return e
-    },
-    onDoubleTap: function(h) {
-        var f = this,
-            c = f.getChart(),
-            g = c.getAxes(),
-            b, a, d;
-        for (a = 0, d = g.length; a < d; a++) {
-            b = g[a];
-            b.setVisibleRange([0, 1])
-        }
-        c.redraw()
-    },
-    onPanGestureStart: function(d) {
-        if (!d || !d.touches || d.touches.length < 2) {
-            var b = this,
-                a = b.getChart().getInnerRect(),
-                c = b.getChart().element.getXY();
-            b.startX = d.getX() - c[0] - a[0];
-            b.startY = d.getY() - c[1] - a[1];
-            b.oldVisibleRanges = null;
-            b.hideLabels();
-            b.getChart().suspendThicknessChanged();
-            b.lockEvents(b.getPanGesture());
-            return false
-        }
-    },
-    onPanGestureMove: function(d) {
-        var b = this;
-        if (b.getLocks()[b.getPanGesture()] === b) {
-            var a = b.getChart().getInnerRect(),
-                c = b.getChart().element.getXY();
-            if (b.getZoomOnPanGesture()) {
-                b.transformAxesBy(b.getZoomableAxes(d), 0, 0, (d.getX() - c[0] - a[0]) / b.startX, b.startY / (d.getY() - c[1] - a[1]))
-            } else {
-                b.transformAxesBy(b.getPannableAxes(d), d.getX() - c[0] - a[0] - b.startX, d.getY() - c[1] - a[1] - b.startY, 1, 1)
-            }
-            b.sync();
-            return false
-        }
-    },
-    onPanGestureEnd: function(b) {
-        var a = this,
-            c = a.getPanGesture();
-        if (a.getLocks()[c] === a) {
-            a.getChart().resumeThicknessChanged();
-            a.showLabels();
-            a.sync();
-            a.unlockEvents(c);
-            return false
-        }
-    },
-    onZoomGestureStart: function(b) {
-        if (b.touches && b.touches.length === 2) {
-            var c = this,
-                i = c.getChart().element.getXY(),
-                f = c.getChart().getInnerRect(),
-                h = i[0] + f[0],
-                d = i[1] + f[1],
-                j = [b.touches[0].point.x - h, b.touches[0].point.y - d, b.touches[1].point.x - h, b.touches[1].point.y - d],
-                g = Math.max(44, Math.abs(j[2] - j[0])),
-                a = Math.max(44, Math.abs(j[3] - j[1]));
-            c.getChart().suspendThicknessChanged();
-            c.lastZoomDistances = [g, a];
-            c.lastPoints = j;
-            c.oldVisibleRanges = null;
-            c.hideLabels();
-            c.lockEvents(c.getZoomGesture());
-            return false
-        }
-    },
-    onZoomGestureMove: function(d) {
-        var f = this;
-        if (f.getLocks()[f.getZoomGesture()] === f) {
-            var i = f.getChart().getInnerRect(),
-                n = f.getChart().element.getXY(),
-                k = n[0] + i[0],
-                h = n[1] + i[1],
-                o = Math.abs,
-                c = f.lastPoints,
-                m = [d.touches[0].point.x - k, d.touches[0].point.y - h, d.touches[1].point.x - k, d.touches[1].point.y - h],
-                g = Math.max(44, o(m[2] - m[0])),
-                b = Math.max(44, o(m[3] - m[1])),
-                a = this.lastZoomDistances || [g, b],
-                l = g / a[0],
-                j = b / a[1];
-            f.transformAxesBy(f.getZoomableAxes(d), i[2] * (l - 1) / 2 + m[2] - c[2] * l, i[3] * (j - 1) / 2 + m[3] - c[3] * j, l, j);
-            f.sync();
-            return false
-        }
-    },
-    onZoomGestureEnd: function(c) {
-        var b = this,
-            a = b.getZoomGesture();
-        if (b.getLocks()[a] === b) {
-            b.getChart().resumeThicknessChanged();
-            b.showLabels();
-            b.sync();
-            b.unlockEvents(a);
-            return false
-        }
-    },
-    hideLabels: function() {
-        if (this.getHideLabelInGesture()) {
-            this.eachInteractiveAxes(function(a) {
-                a.hideLabels()
-            })
-        }
-    },
-    showLabels: function() {
-        if (this.getHideLabelInGesture()) {
-            this.eachInteractiveAxes(function(a) {
-                a.showLabels()
-            })
-        }
-    },
-    isEventOnAxis: function(c, a) {
-        var b = a.getSurface().getRect();
-        return b[0] <= c.getX() && c.getX() <= b[0] + b[2] && b[1] <= c.getY() && c.getY() <= b[1] + b[3]
-    },
-    getPannableAxes: function(d) {
-        var h = this,
-            a = h.getAxes(),
-            f = h.getChart().getAxes(),
-            c, g = f.length,
-            k = [],
-            j = false,
-            b;
-        if (d) {
-            for (c = 0; c < g; c++) {
-                if (this.isEventOnAxis(d, f[c])) {
-                    j = true;
-                    break
-                }
-            }
-        }
-        for (c = 0; c < g; c++) {
-            b = a[f[c].getPosition()];
-            if (b && b.allowPan !== false && (!j || this.isEventOnAxis(d, f[c]))) {
-                k.push(f[c])
-            }
-        }
-        return k
-    },
-    getZoomableAxes: function(f) {
-        var j = this,
-            a = j.getAxes(),
-            g = j.getChart().getAxes(),
-            l = [],
-            d, h = g.length,
-            c, k = false,
-            b;
-        if (f) {
-            for (d = 0; d < h; d++) {
-                if (this.isEventOnAxis(f, g[d])) {
-                    k = true;
-                    break
-                }
-            }
-        }
-        for (d = 0; d < h; d++) {
-            c = g[d];
-            b = a[c.getPosition()];
-            if (b && b.allowZoom !== false && (!k || this.isEventOnAxis(f, c))) {
-                l.push(c)
-            }
-        }
-        return l
-    },
-    eachInteractiveAxes: function(c) {
-        var d = this,
-            b = d.getAxes(),
-            e = d.getChart().getAxes();
-        for (var a = 0; a < e.length; a++) {
-            if (b[e[a].getPosition()]) {
-                if (false === c.call(this, e[a])) {
-                    return
-                }
-            }
-        }
-    },
-    transformAxesBy: function(d, j, g, h, e) {
-        var f = this.getChart().getInnerRect(),
-            a = this.getAxes(),
-            k, b = this.oldVisibleRanges,
-            l = false;
-        if (!b) {
-            this.oldVisibleRanges = b = {};
-            this.eachInteractiveAxes(function(i) {
-                b[i.getId()] = i.getVisibleRange()
-            })
-        }
-        if (!f) {
-            return
-        }
-        for (var c = 0; c < d.length; c++) {
-            k = a[d[c].getPosition()];
-            l = this.transformAxisBy(d[c], b[d[c].getId()], j, g, h, e, this.minZoom || k.minZoom, this.maxZoom || k.maxZoom) || l
-        }
-        return l
-    },
-    transformAxisBy: function(c, o, r, q, k, i, h, m) {
-        var s = this,
-            b = o[1] - o[0],
-            l = c.getVisibleRange(),
-            g = h || s.getMinZoom() || c.config.minZoom,
-            j = m || s.getMaxZoom() || c.config.maxZoom,
-            a = s.getChart().getInnerRect(),
-            f, p;
-        if (!a) {
-            return
-        }
-        var d = c.isSide(),
-            e = d ? a[3] : a[2],
-            n = d ? -q : r;
-        b /= d ? i : k;
-        if (b < 0) {
-            b = -b
-        }
-        if (b * g > 1) {
-            b = 1
-        }
-        if (b * j < 1) {
-            b = 1 / j
-        }
-        f = o[0];
-        p = o[1];
-        l = l[1] - l[0];
-        if (b === l && l === 1) {
-            return
-        }
-        c.setVisibleRange([(o[0] + o[1] - b) * 0.5 - n / e * b, (o[0] + o[1] + b) * 0.5 - n / e * b]);
-        return (Math.abs(f - c.getVisibleRange()[0]) > 1e-10 || Math.abs(p - c.getVisibleRange()[1]) > 1e-10)
-    },
-    destroy: function() {
-        this.setModeToggleButton(null);
-        this.callParent()
-    }
-});
-Ext.define("Ext.chart.interactions.Rotate", {
-    extend: "Ext.chart.interactions.Abstract",
-    type: "rotate",
-    alias: "interaction.rotate",
-    config: {
-        gesture: "rotate",
-        gestures: {
-            rotate: "onRotate",
-            rotateend: "onRotate",
-            dragstart: "onGestureStart",
-            drag: "onGesture",
-            dragend: "onGestureEnd"
-        },
-        rotation: 0
-    },
-    oldRotations: null,
-    getAngle: function(f) {
-        var c = this,
-            b = c.getChart(),
-            d = b.getEventXY(f),
-            a = b.getCenter();
-        return Math.atan2(d[1] - a[1], d[0] - a[0])
-    },
-    getRadius: function(a) {
-        return this.getChart().getRadius()
-    },
-    getEventRadius: function(h) {
-        var f = this,
-            d = f.getChart(),
-            g = d.getEventXY(h),
-            a = d.getCenter(),
-            c = g[0] - a[0],
-            b = g[1] - a[1];
-        return Math.sqrt(c * c + b * b)
-    },
-    onGestureStart: function(d) {
-        var c = this,
-            b = c.getRadius(d),
-            a = c.getEventRadius(d);
-        if (b >= a) {
-            c.lockEvents("drag");
-            c.angle = c.getAngle(d);
-            c.oldRotations = {};
-            return false
-        }
-    },
-    onGesture: function(b) {
-        var a = this,
-            c = a.getAngle(b) - a.angle;
-        if (a.getLocks().drag === a) {
-            a.doRotateTo(c, true);
-            return false
-        }
-    },
-    doRotateTo: function(d, a, b) {
-        var n = this,
-            l = n.getChart(),
-            k = l.getAxes(),
-            f = l.getSeries(),
-            m = n.oldRotations,
-            c, j, g, e, h;
-        if (!b) {
-            l.suspendAnimation()
-        }
-        for (e = 0, h = k.length; e < h; e++) {
-            c = k[e];
-            g = m[c.getId()] || (m[c.getId()] = c.getRotation());
-            c.setRotation(d + (a ? g : 0))
-        }
-        for (e = 0, h = f.length; e < h; e++) {
-            j = f[e];
-            g = m[j.getId()] || (m[j.getId()] = j.getRotation());
-            j.setRotation(d + (a ? g : 0))
-        }
-        n.setRotation(d + (a ? g : 0));
-        n.fireEvent("rotate", n, n.getRotation());
-        n.sync();
-        if (!b) {
-            l.resumeAnimation()
-        }
-    },
-    rotateTo: function(c, b, a) {
-        this.doRotateTo(c, b, a);
-        this.oldRotations = {}
-    },
-    onGestureEnd: function(b) {
-        var a = this;
-        if (a.getLocks().drag === a) {
-            a.onGesture(b);
-            a.unlockEvents("drag");
-            a.fireEvent("rotationEnd", a, a.getRotation());
-            return false
-        }
-    },
-    onRotate: function(a) {}
-});
-Ext.define("Ext.chart.interactions.RotatePie3D", {
-    extend: "Ext.chart.interactions.Rotate",
-    type: "rotatePie3d",
-    alias: "interaction.rotatePie3d",
-    getAngle: function(g) {
-        var a = this.getChart(),
-            f = a.getInherited().rtl,
-            d = f ? -1 : 1,
-            h = g.getXY(),
-            c = a.element.getXY(),
-            b = a.getMainRect();
-        return d * Math.atan2(h[1] - c[1] - b[3] * 0.5, h[0] - c[0] - b[2] * 0.5)
-    },
-    getRadius: function(j) {
-        var f = this.getChart(),
-            a = f.getRadius(),
-            d = f.getSeries(),
-            h = d.length,
-            c = 0,
-            b, g;
-        for (; c < h; c++) {
-            b = d[c];
-            if (b.isPie3D) {
-                g = b.getRadius();
-                if (g > a) {
-                    a = g
-                }
-            }
-        }
-        return a
-    }
-});
-Ext.define("Ext.chart.plugin.ItemEvents", {
-    extend: "Ext.plugin.Abstract",
-    alias: "plugin.chartitemevents",
-    moveEvents: false,
-    mouseMoveEvents: {
-        mousemove: true,
-        mouseover: true,
-        mouseout: true
-    },
-    itemMouseMoveEvents: {
-        itemmousemove: true,
-        itemmouseover: true,
-        itemmouseout: true
-    },
-    init: function(b) {
-        var a = "handleEvent";
-        this.chart = b;
-        b.addElementListener({
-            click: a,
-            dblclick: a,
-            mousedown: a,
-            mousemove: a,
-            mouseup: a,
-            mouseover: a,
-            mouseout: a,
-            priority: 1001,
-            scope: this
-        })
-    },
-    hasItemMouseMoveListeners: function() {
-        var b = this.chart.hasListeners,
-            a;
-        for (a in this.itemMouseMoveEvents) {
-            if (a in b) {
-                return true
-            }
-        }
-        return false
-    },
-    handleEvent: function(g) {
-        var d = this,
-            a = d.chart,
-            h = g.type in d.mouseMoveEvents,
-            c = d.lastItem,
-            f, b;
-        if (h && !d.hasItemMouseMoveListeners() && !d.moveEvents) {
-            return
-        }
-        f = a.getEventXY(g);
-        b = a.getItemForPoint(f[0], f[1]);
-        if (h && !Ext.Object.equals(b, c)) {
-            if (c) {
-                a.fireEvent("itemmouseout", a, c, g);
-                c.series.fireEvent("itemmouseout", c.series, c, g)
-            }
-            if (b) {
-                a.fireEvent("itemmouseover", a, b, g);
-                b.series.fireEvent("itemmouseover", b.series, b, g)
-            }
-        }
-        if (b) {
-            a.fireEvent("item" + g.type, a, b, g);
-            b.series.fireEvent("item" + g.type, b.series, b, g)
-        }
-        d.lastItem = b
-    }
-});
-Ext.define("Ext.chart.series.Cartesian", {
-    extend: "Ext.chart.series.Series",
-    config: {
-        xField: null,
-        yField: null,
-        xAxis: null,
-        yAxis: null
-    },
-    directions: ["X", "Y"],
-    fieldCategoryX: ["X"],
-    fieldCategoryY: ["Y"],
-    applyXAxis: function(a, b) {
-        return this.getChart().getAxis(a) || b
-    },
-    applyYAxis: function(a, b) {
-        return this.getChart().getAxis(a) || b
-    },
-    updateXAxis: function(a) {
-        a.processData(this)
-    },
-    updateYAxis: function(a) {
-        a.processData(this)
-    },
-    coordinateX: function() {
-        return this.coordinate("X", 0, 2)
-    },
-    coordinateY: function() {
-        return this.coordinate("Y", 1, 2)
-    },
-    getItemForPoint: function(a, g) {
-        if (this.getSprites()) {
-            var f = this,
-                d = f.getSprites()[0],
-                b = f.getStore(),
-                e, c;
-            if (f.getHidden()) {
-                return null
-            }
-            if (d) {
-                c = d.getIndexNearPoint(a, g);
-                if (c !== -1) {
-                    e = {
-                        series: f,
-                        category: f.getItemInstancing() ? "items" : "markers",
-                        index: c,
-                        record: b.getData().items[c],
-                        field: f.getYField(),
-                        sprite: d
-                    };
-                    return e
-                }
-            }
-        }
-    },
-    createSprite: function() {
-        var c = this,
-            a = c.callParent(),
-            b = c.getChart(),
-            d = c.getXAxis();
-        a.setAttributes({
-            flipXY: b.getFlipXY(),
-            xAxis: d
-        });
-        if (a.setAggregator && d && d.getAggregator) {
-            if (d.getAggregator) {
-                a.setAggregator({
-                    strategy: d.getAggregator()
-                })
-            } else {
-                a.setAggregator({})
-            }
-        }
-        return a
-    },
-    getSprites: function() {
-        var d = this,
-            c = this.getChart(),
-            e = d.getAnimation() || c && c.getAnimation(),
-            b = d.getItemInstancing(),
-            f = d.sprites,
-            a;
-        if (!c) {
-            return []
-        }
-        if (!f.length) {
-            a = d.createSprite()
-        } else {
-            a = f[0]
-        }
-        if (e) {
-            if (b) {
-                a.itemsMarker.getTemplate().setAnimation(e)
-            }
-            a.setAnimation(e)
-        }
-        return f
-    },
-    provideLegendInfo: function(d) {
-        var b = this,
-            a = b.getSubStyleWithTheme(),
-            c = a.fillStyle;
-        if (Ext.isArray(c)) {
-            c = c[0]
-        }
-        d.push({
-            name: b.getTitle() || b.getYField() || b.getId(),
-            mark: (Ext.isObject(c) ? c.stops && c.stops[0].color : c) || a.strokeStyle || "black",
-            disabled: b.getHidden(),
-            series: b.getId(),
-            index: 0
-        })
-    },
-    getXRange: function() {
-        return [this.dataRange[0], this.dataRange[2]]
-    },
-    getYRange: function() {
-        return [this.dataRange[1], this.dataRange[3]]
-    }
-});
-Ext.define("Ext.chart.series.StackedCartesian", {
-    extend: "Ext.chart.series.Cartesian",
-    config: {
-        stacked: true,
-        splitStacks: true,
-        fullStack: false,
-        fullStackTotal: 100,
-        hidden: []
-    },
-    spriteAnimationCount: 0,
-    themeColorCount: function() {
-        var b = this,
-            a = b.getYField();
-        return Ext.isArray(a) ? a.length : 1
-    },
-    updateStacked: function() {
-        this.processData()
-    },
-    updateSplitStacks: function() {
-        this.processData()
-    },
-    coordinateY: function() {
-        return this.coordinateStacked("Y", 1, 2)
-    },
-    coordinateStacked: function(D, e, m) {
-        var F = this,
-            f = F.getStore(),
-            r = f.getData().items,
-            B = r.length,
-            c = F["get" + D + "Axis"](),
-            x = F.getHidden(),
-            a = F.getSplitStacks(),
-            z = F.getFullStack(),
-            l = F.getFullStackTotal(),
-            p = {
-                min: 0,
-                max: 0
-            },
-            n = F["fieldCategory" + D],
-            C = [],
-            o = [],
-            E = [],
-            h, A = F.getStacked(),
-            g = F.getSprites(),
-            q = [],
-            w, v, u, s, H, y, b, d, G, t;
-        if (!g.length) {
-            return
-        }
-        for (w = 0; w < n.length; w++) {
-            d = n[w];
-            s = F.getFields([d]);
-            H = s.length;
-            for (v = 0; v < B; v++) {
-                C[v] = 0;
-                o[v] = 0;
-                E[v] = 0
-            }
-            for (v = 0; v < H; v++) {
-                if (!x[v]) {
-                    q[v] = F.coordinateData(r, s[v], c)
-                }
-            }
-            if (A && z) {
-                y = [];
-                if (a) {
-                    b = []
-                }
-                for (v = 0; v < B; v++) {
-                    y[v] = 0;
-                    if (a) {
-                        b[v] = 0
-                    }
-                    for (u = 0; u < H; u++) {
-                        G = q[u];
-                        if (!G) {
-                            continue
-                        }
-                        G = G[v];
-                        if (G >= 0 || !a) {
-                            y[v] += G
-                        } else {
-                            if (G < 0) {
-                                b[v] += G
-                            }
-                        }
-                    }
-                }
-            }
-            for (v = 0; v < H; v++) {
-                t = {};
-                if (x[v]) {
-                    t["dataStart" + d] = C;
-                    t["data" + d] = C;
-                    g[v].setAttributes(t);
-                    continue
-                }
-                G = q[v];
-                if (A) {
-                    h = [];
-                    for (u = 0; u < B; u++) {
-                        if (!G[u]) {
-                            G[u] = 0
-                        }
-                        if (G[u] >= 0 || !a) {
-                            if (z && y[u]) {
-                                G[u] *= l / y[u]
-                            }
-                            C[u] = o[u];
-                            o[u] += G[u];
-                            h[u] = o[u]
-                        } else {
-                            if (z && b[u]) {
-                                G[u] *= l / b[u]
-                            }
-                            C[u] = E[u];
-                            E[u] += G[u];
-                            h[u] = E[u]
-                        }
-                    }
-                    t["dataStart" + d] = C;
-                    t["data" + d] = h;
-                    F.getRangeOfData(C, p);
-                    F.getRangeOfData(h, p)
-                } else {
-                    t["dataStart" + d] = C;
-                    t["data" + d] = G;
-                    F.getRangeOfData(G, p)
-                }
-                g[v].setAttributes(t)
-            }
-        }
-        F.dataRange[e] = p.min;
-        F.dataRange[e + m] = p.max;
-        t = {};
-        t["dataMin" + D] = p.min;
-        t["dataMax" + D] = p.max;
-        for (w = 0; w < g.length; w++) {
-            g[w].setAttributes(t)
-        }
-    },
-    getFields: function(f) {
-        var e = this,
-            a = [],
-            c, b, d;
-        for (b = 0, d = f.length; b < d; b++) {
-            c = e["get" + f[b] + "Field"]();
-            if (Ext.isArray(c)) {
-                a.push.apply(a, c)
-            } else {
-                a.push(c)
-            }
-        }
-        return a
-    },
-    updateLabelOverflowPadding: function(a) {
-        this.getLabel().setAttributes({
-            labelOverflowPadding: a
-        })
-    },
-    getSprites: function() {
-        var k = this,
-            j = k.getChart(),
-            c = k.getAnimation() || j && j.getAnimation(),
-            f = k.getFields(k.fieldCategoryY),
-            b = k.getItemInstancing(),
-            h = k.sprites,
-            l, e = k.getHidden(),
-            g = false,
-            d, a = f.length;
-        if (!j) {
-            return []
-        }
-        for (d = 0; d < a; d++) {
-            l = h[d];
-            if (!l) {
-                l = k.createSprite();
-                l.setAttributes({
-                    zIndex: -d
-                });
-                l.setField(f[d]);
-                g = true;
-                e.push(false);
-                if (b) {
-                    l.itemsMarker.getTemplate().setAttributes(k.getStyleByIndex(d))
-                } else {
-                    l.setAttributes(k.getStyleByIndex(d))
-                }
-            }
-            if (c) {
-                if (b) {
-                    l.itemsMarker.getTemplate().setAnimation(c)
-                }
-                l.setAnimation(c)
-            }
-        }
-        if (g) {
-            k.updateHidden(e)
-        }
-        return h
-    },
-    getItemForPoint: function(k, j) {
-        if (this.getSprites()) {
-            var h = this,
-                b, g, m, a = h.getItemInstancing(),
-                f = h.getSprites(),
-                l = h.getStore(),
-                c = h.getHidden(),
-                n, d, e;
-            for (b = 0, g = f.length; b < g; b++) {
-                if (!c[b]) {
-                    m = f[b];
-                    d = m.getIndexNearPoint(k, j);
-                    if (d !== -1) {
-                        e = h.getYField();
-                        n = {
-                            series: h,
-                            index: d,
-                            category: a ? "items" : "markers",
-                            record: l.getData().items[d],
-                            field: typeof e === "string" ? e : e[b],
-                            sprite: m
-                        };
-                        return n
-                    }
-                }
-            }
-            return null
-        }
-    },
-    provideLegendInfo: function(e) {
-        var g = this,
-            f = g.getSprites(),
-            h = g.getTitle(),
-            j = g.getYField(),
-            d = g.getHidden(),
-            k = f.length === 1,
-            b, l, c, a;
-        for (c = 0; c < f.length; c++) {
-            b = g.getStyleByIndex(c);
-            l = b.fillStyle;
-            if (h) {
-                if (Ext.isArray(h)) {
-                    a = h[c]
-                } else {
-                    if (k) {
-                        a = h
-                    }
-                }
-            } else {
-                if (Ext.isArray(j)) {
-                    a = j[c]
-                } else {
-                    a = g.getId()
-                }
-            }
-            e.push({
-                name: a,
-                mark: (Ext.isObject(l) ? l.stops && l.stops[0].color : l) || b.strokeStyle || "black",
-                disabled: d[c],
-                series: g.getId(),
-                index: c
-            })
-        }
-    },
-    onSpriteAnimationStart: function(a) {
-        this.spriteAnimationCount++;
-        if (this.spriteAnimationCount === 1) {
-            this.fireEvent("animationstart")
-        }
-    },
-    onSpriteAnimationEnd: function(a) {
-        this.spriteAnimationCount--;
-        if (this.spriteAnimationCount === 0) {
-            this.fireEvent("animationend")
-        }
-    }
-});
-Ext.define("Ext.chart.series.sprite.Series", {
-    extend: "Ext.draw.sprite.Sprite",
-    mixins: {
-        markerHolder: "Ext.chart.MarkerHolder"
-    },
-    inheritableStatics: {
-        def: {
-            processors: {
-                dataMinX: "number",
-                dataMaxX: "number",
-                dataMinY: "number",
-                dataMaxY: "number",
-                rangeX: "data",
-                rangeY: "data",
-                dataX: "data",
-                dataY: "data"
-            },
-            defaults: {
-                dataMinX: 0,
-                dataMaxX: 1,
-                dataMinY: 0,
-                dataMaxY: 1,
-                rangeX: null,
-                rangeY: null,
-                dataX: null,
-                dataY: null
-            },
-            triggers: {
-                dataX: "bbox",
-                dataY: "bbox",
-                dataMinX: "bbox",
-                dataMaxX: "bbox",
-                dataMinY: "bbox",
-                dataMaxY: "bbox"
-            }
-        }
-    },
-    config: {
-        store: null,
-        series: null,
-        field: null
-    }
-});
-Ext.define("Ext.chart.series.sprite.Cartesian", {
-    extend: "Ext.chart.series.sprite.Series",
-    inheritableStatics: {
-        def: {
-            processors: {
-                labels: "default",
-                labelOverflowPadding: "number",
-                selectionTolerance: "number",
-                flipXY: "bool",
-                renderer: "default",
-                visibleMinX: "number",
-                visibleMinY: "number",
-                visibleMaxX: "number",
-                visibleMaxY: "number",
-                innerWidth: "number",
-                innerHeight: "number"
-            },
-            defaults: {
-                labels: null,
-                labelOverflowPadding: 10,
-                selectionTolerance: 20,
-                flipXY: false,
-                renderer: null,
-                transformFillStroke: false,
-                visibleMinX: 0,
-                visibleMinY: 0,
-                visibleMaxX: 1,
-                visibleMaxY: 1,
-                innerWidth: 1,
-                innerHeight: 1
-            },
-            triggers: {
-                dataX: "dataX,bbox",
-                dataY: "dataY,bbox",
-                visibleMinX: "panzoom",
-                visibleMinY: "panzoom",
-                visibleMaxX: "panzoom",
-                visibleMaxY: "panzoom",
-                innerWidth: "panzoom",
-                innerHeight: "panzoom"
-            },
-            updaters: {
-                dataX: function(a) {
-                    this.processDataX();
-                    this.scheduleUpdater(a, "dataY", ["dataY"])
-                },
-                dataY: function() {
-                    this.processDataY()
-                },
-                panzoom: function(c) {
-                    var e = c.visibleMaxX - c.visibleMinX,
-                        d = c.visibleMaxY - c.visibleMinY,
-                        b = c.flipXY ? c.innerHeight : c.innerWidth,
-                        g = !c.flipXY ? c.innerHeight : c.innerWidth,
-                        a = this.getSurface(),
-                        f = a ? a.getInherited().rtl : false;
-                    if (f && !c.flipXY) {
-                        c.translationX = b + c.visibleMinX * b / e
-                    } else {
-                        c.translationX = -c.visibleMinX * b / e
-                    }
-                    c.translationY = -c.visibleMinY * g / d;
-                    c.scalingX = (f && !c.flipXY ? -1 : 1) * b / e;
-                    c.scalingY = g / d;
-                    c.scalingCenterX = 0;
-                    c.scalingCenterY = 0;
-                    this.applyTransformations(true)
-                }
-            }
-        }
-    },
-    processDataY: Ext.emptyFn,
-    processDataX: Ext.emptyFn,
-    updatePlainBBox: function(b) {
-        var a = this.attr;
-        b.x = a.dataMinX;
-        b.y = a.dataMinY;
-        b.width = a.dataMaxX - a.dataMinX;
-        b.height = a.dataMaxY - a.dataMinY
-    },
-    binarySearch: function(d) {
-        var b = this.attr.dataX,
-            f = 0,
-            a = b.length;
-        if (d <= b[0]) {
-            return f
-        }
-        if (d >= b[a - 1]) {
-            return a - 1
-        }
-        while (f + 1 < a) {
-            var c = (f + a) >> 1,
-                e = b[c];
-            if (e === d) {
-                return c
-            } else {
-                if (e < d) {
-                    f = c
-                } else {
-                    a = c
-                }
-            }
-        }
-        return f
-    },
-    render: function(b, c, g) {
-        var f = this,
-            a = f.attr,
-            e = a.inverseMatrix.clone();
-        e.appendMatrix(b.inverseMatrix);
-        if (a.dataX === null || a.dataX === undefined) {
-            return
-        }
-        if (a.dataY === null || a.dataY === undefined) {
-            return
-        }
-        if (e.getXX() * e.getYX() || e.getXY() * e.getYY()) {
-            console.log("Cartesian Series sprite does not support rotation/sheering");
-            return
-        }
-        var d = e.transformList([
-            [g[0] - 1, g[3] + 1],
-            [g[0] + g[2] + 1, -1]
-        ]);
-        d = d[0].concat(d[1]);
-        f.renderClipped(b, c, d, g)
-    },
-    renderClipped: Ext.emptyFn,
-    getIndexNearPoint: function(f, e) {
-        var w = this,
-            q = w.attr.matrix,
-            h = w.attr.dataX,
-            g = w.attr.dataY,
-            k = w.attr.selectionTolerance,
-            t, r, c = -1,
-            j = q.clone().prependMatrix(w.surfaceMatrix).inverse(),
-            u = j.transformPoint([f, e]),
-            b = j.transformPoint([f - k, e - k]),
-            n = j.transformPoint([f + k, e + k]),
-            a = Math.min(b[0], n[0]),
-            s = Math.max(b[0], n[0]),
-            l = Math.min(b[1], n[1]),
-            d = Math.max(b[1], n[1]),
-            m, v, o, p;
-        for (o = 0, p = h.length; o < p; o++) {
-            m = h[o];
-            v = g[o];
-            if (m > a && m < s && v > l && v < d) {
-                if (c === -1 || (Math.abs(m - u[0]) < t) && (Math.abs(v - u[1]) < r)) {
-                    t = Math.abs(m - u[0]);
-                    r = Math.abs(v - u[1]);
-                    c = o
-                }
-            }
-        }
-        return c
-    }
-});
-Ext.define("Ext.chart.series.sprite.StackedCartesian", {
-    extend: "Ext.chart.series.sprite.Cartesian",
-    inheritableStatics: {
-        def: {
-            processors: {
-                groupCount: "number",
-                groupOffset: "number",
-                dataStartY: "data"
-            },
-            defaults: {
-                selectionTolerance: 20,
-                groupCount: 1,
-                groupOffset: 0,
-                dataStartY: null
-            },
-            triggers: {
-                dataStartY: "dataY,bbox"
-            }
-        }
-    },
-    getIndexNearPoint: function(e, d) {
-        var o = this,
-            q = o.attr.matrix,
-            h = o.attr.dataX,
-            f = o.attr.dataY,
-            u = o.attr.dataStartY,
-            l = o.attr.selectionTolerance,
-            s = 0.5,
-            r = Infinity,
-            b = -1,
-            k = q.clone().prependMatrix(this.surfaceMatrix).inverse(),
-            t = k.transformPoint([e, d]),
-            a = k.transformPoint([e - l, d - l]),
-            n = k.transformPoint([e + l, d + l]),
-            m = Math.min(a[1], n[1]),
-            c = Math.max(a[1], n[1]),
-            j, g;
-        for (var p = 0; p < h.length; p++) {
-            if (Math.min(u[p], f[p]) <= c && m <= Math.max(u[p], f[p])) {
-                j = Math.abs(h[p] - t[0]);
-                g = Math.max(-Math.min(f[p] - t[1], t[1] - u[p]), 0);
-                if (j < s && g <= r) {
-                    s = j;
-                    r = g;
-                    b = p
-                }
-            }
-        }
-        return b
-    }
-});
-Ext.define("Ext.chart.series.sprite.Area", {
-    alias: "sprite.areaSeries",
-    extend: "Ext.chart.series.sprite.StackedCartesian",
-    inheritableStatics: {
-        def: {
-            processors: {
-                step: "bool"
-            },
-            defaults: {
-                step: false
-            }
-        }
-    },
-    renderClipped: function(q, s, A) {
-        var B = this,
-            p = B.attr,
-            l = p.dataX,
-            j = p.dataY,
-            C = p.dataStartY,
-            t = p.matrix,
-            h, g, v, f, d, z, w, e = t.elements[0],
-            m = t.elements[4],
-            o = t.elements[3],
-            k = t.elements[5],
-            c = B.surfaceMatrix,
-            n = {},
-            r = Math.min(A[0], A[2]),
-            u = Math.max(A[0], A[2]),
-            b = Math.max(0, this.binarySearch(r)),
-            a = Math.min(l.length - 1, this.binarySearch(u) + 1);
-        s.beginPath();
-        z = l[b] * e + m;
-        w = j[b] * o + k;
-        s.moveTo(z, w);
-        if (p.step) {
-            d = w;
-            for (v = b; v <= a; v++) {
-                h = l[v] * e + m;
-                g = j[v] * o + k;
-                s.lineTo(h, d);
-                s.lineTo(h, d = g)
-            }
-        } else {
-            for (v = b; v <= a; v++) {
-                h = l[v] * e + m;
-                g = j[v] * o + k;
-                s.lineTo(h, g)
-            }
-        }
-        if (C) {
-            if (p.step) {
-                f = l[a] * e + m;
-                for (v = a; v >= b; v--) {
-                    h = l[v] * e + m;
-                    g = C[v] * o + k;
-                    s.lineTo(f, g);
-                    s.lineTo(f = h, g)
-                }
-            } else {
-                for (v = a; v >= b; v--) {
-                    h = l[v] * e + m;
-                    g = C[v] * o + k;
-                    s.lineTo(h, g)
-                }
-            }
-        } else {
-            s.lineTo(l[a] * e + m, g);
-            s.lineTo(l[a] * e + m, k);
-            s.lineTo(z, k);
-            s.lineTo(z, j[v] * o + k)
-        }
-        if (p.transformFillStroke) {
-            p.matrix.toContext(s)
-        }
-        s.fill();
-        if (p.transformFillStroke) {
-            p.inverseMatrix.toContext(s)
-        }
-        s.beginPath();
-        s.moveTo(z, w);
-        if (p.step) {
-            for (v = b; v <= a; v++) {
-                h = l[v] * e + m;
-                g = j[v] * o + k;
-                s.lineTo(h, d);
-                s.lineTo(h, d = g);
-                n.translationX = c.x(h, g);
-                n.translationY = c.y(h, g);
-                B.putMarker("markers", n, v, !p.renderer)
-            }
-        } else {
-            for (v = b; v <= a; v++) {
-                h = l[v] * e + m;
-                g = j[v] * o + k;
-                s.lineTo(h, g);
-                n.translationX = c.x(h, g);
-                n.translationY = c.y(h, g);
-                B.putMarker("markers", n, v, !p.renderer)
-            }
-        }
-        if (p.transformFillStroke) {
-            p.matrix.toContext(s)
-        }
-        s.stroke()
-    }
-});
-Ext.define("Ext.chart.series.Area", {
-    extend: "Ext.chart.series.StackedCartesian",
-    alias: "series.area",
-    type: "area",
-    seriesType: "areaSeries",
-    requires: ["Ext.chart.series.sprite.Area"],
-    config: {
-        splitStacks: false
-    }
-});
-Ext.define("Ext.chart.series.sprite.Bar", {
-    alias: "sprite.barSeries",
-    extend: "Ext.chart.series.sprite.StackedCartesian",
-    inheritableStatics: {
-        def: {
-            processors: {
-                minBarWidth: "number",
-                maxBarWidth: "number",
-                minGapWidth: "number",
-                radius: "number",
-                inGroupGapWidth: "number"
-            },
-            defaults: {
-                minBarWidth: 2,
-                maxBarWidth: 100,
-                minGapWidth: 5,
-                inGroupGapWidth: 3,
-                radius: 0
-            }
-        }
-    },
-    drawLabel: function(k, i, s, h, o) {
-        var q = this,
-            n = q.attr,
-            f = q.getMarker("labels"),
-            d = f.getTemplate(),
-            l = q.labelCfg || (q.labelCfg = {}),
-            c = q.surfaceMatrix,
-            j = n.labelOverflowPadding,
-            b = d.attr.display,
-            m = d.attr.orientation,
-            g, e, a, r, t, p;
-        l.x = c.x(i, h);
-        l.y = c.y(i, h);
-        if (!n.flipXY) {
-            l.rotationRads = -Math.PI * 0.5
-        } else {
-            l.rotationRads = 0
-        }
-        l.calloutVertical = !n.flipXY;
-        switch (m) {
-            case "horizontal":
-                l.rotationRads = 0;
-                l.calloutVertical = false;
-                break;
-            case "vertical":
-                l.rotationRads = -Math.PI * 0.5;
-                l.calloutVertical = true;
-                break
-        }
-        l.text = k;
-        if (d.attr.renderer) {
-            p = [k, f, l, {
-                store: q.getStore()
-            }, o];
-            r = Ext.callback(d.attr.renderer, null, p, 0, q.getSeries());
-            if (typeof r === "string") {
-                l.text = r
-            } else {
-                if (typeof r === "object") {
-                    if ("text" in r) {
-                        l.text = r.text
-                    }
-                    t = true
-                }
-            }
-        }
-        a = q.getMarkerBBox("labels", o, true);
-        if (!a) {
-            q.putMarker("labels", l, o);
-            a = q.getMarkerBBox("labels", o, true)
-        }
-        e = (a.width / 2 + j);
-        if (s > h) {
-            e = -e
-        }
-        if ((m === "horizontal" && n.flipXY) || (m === "vertical" && !n.flipXY) || !m) {
-            g = (b === "insideStart") ? s + e : h - e
-        } else {
-            g = (b === "insideStart") ? s + j * 2 : h - j * 2
-        }
-        l.x = c.x(i, g);
-        l.y = c.y(i, g);
-        g = (b === "insideStart") ? s - e : h + e;
-        l.calloutPlaceX = c.x(i, g);
-        l.calloutPlaceY = c.y(i, g);
-        g = (b === "insideStart") ? s : h;
-        l.calloutStartX = c.x(i, g);
-        l.calloutStartY = c.y(i, g);
-        if (s > h) {
-            e = -e
-        }
-        if (Math.abs(h - s) <= e * 2 || b === "outside") {
-            l.callout = 1
-        } else {
-            l.callout = 0
-        }
-        if (t) {
-            Ext.apply(l, r)
-        }
-        q.putMarker("labels", l, o)
-    },
-    drawBar: function(l, b, d, c, h, k, a, e) {
-        var g = this,
-            j = {},
-            f = g.attr.renderer,
-            i;
-        j.x = c;
-        j.y = h;
-        j.width = k - c;
-        j.height = a - h;
-        j.radius = g.attr.radius;
-        if (f) {
-            i = Ext.callback(f, null, [g, j, {
-                store: g.getStore()
-            }, e], 0, g.getSeries());
-            Ext.apply(j, i)
-        }
-        g.putMarker("items", j, e, !f)
-    },
-    renderClipped: function(G, u, F, C) {
-        if (this.cleanRedraw) {
-            return
-        }
-        var q = this,
-            o = q.attr,
-            w = o.dataX,
-            v = o.dataY,
-            H = o.labels,
-            n = o.dataStartY,
-            m = o.groupCount,
-            E = o.groupOffset - (m - 1) * 0.5,
-            z = o.inGroupGapWidth,
-            t = u.lineWidth,
-            D = o.matrix,
-            B = D.elements[0],
-            j = D.elements[3],
-            e = D.elements[4],
-            d = G.roundPixel(D.elements[5]) - 1,
-            J = (B < 0 ? -1 : 1) * B - o.minGapWidth,
-            k = (Math.min(J, o.maxBarWidth) - z * (m - 1)) / m,
-            A = G.roundPixel(Math.max(o.minBarWidth, k)),
-            c = q.surfaceMatrix,
-            g, I, b, h, K, a, l = 0.5 * o.lineWidth,
-            L = Math.min(F[0], F[2]),
-            x = Math.max(F[0], F[2]),
-            y = Math.max(0, Math.floor(L)),
-            p = Math.min(w.length - 1, Math.ceil(x)),
-            f = H && q.getMarker("labels"),
-            s, r;
-        for (K = y; K <= p; K++) {
-            s = n ? n[K] : 0;
-            r = v[K];
-            a = w[K] * B + e + E * (A + z);
-            g = G.roundPixel(a - A / 2) + l;
-            h = G.roundPixel(r * j + d + t);
-            I = G.roundPixel(a + A / 2) - l;
-            b = G.roundPixel(s * j + d + t);
-            q.drawBar(u, G, F, g, h - l, I, b - l, K);
-            if (f && H[K] != null) {
-                q.drawLabel(H[K], a, b, h, K)
-            }
-            q.putMarker("markers", {
-                translationX: c.x(a, h),
-                translationY: c.y(a, h)
-            }, K, true)
-        }
-    },
-    getIndexNearPoint: function(l, k) {
-        var m = this,
-            g = m.attr,
-            h = g.dataX,
-            a = m.getSurface(),
-            b = a.getRect() || [0, 0, 0, 0],
-            j = b[3],
-            e, d, c, n, f = -1;
-        if (g.flipXY) {
-            e = j - k;
-            if (a.getInherited().rtl) {
-                d = b[2] - l
-            } else {
-                d = l
-            }
-        } else {
-            e = l;
-            d = j - k
-        }
-        for (c = 0; c < h.length; c++) {
-            n = m.getMarkerBBox("items", c);
-            if (Ext.draw.Draw.isPointInBBox(e, d, n)) {
-                f = c;
-                break
-            }
-        }
-        return f
-    }
-});
-Ext.define("Ext.chart.series.Bar", {
-    extend: "Ext.chart.series.StackedCartesian",
-    alias: "series.bar",
-    type: "bar",
-    seriesType: "barSeries",
-    requires: ["Ext.chart.series.sprite.Bar", "Ext.draw.sprite.Rect"],
-    config: {
-        itemInstancing: {
-            type: "rect",
-            fx: {
-                customDurations: {
-                    x: 0,
-                    y: 0,
-                    width: 0,
-                    height: 0,
-                    radius: 0
-                }
-            }
-        }
-    },
-    getItemForPoint: function(a, f) {
-        if (this.getSprites()) {
-            var d = this,
-                c = d.getChart(),
-                e = c.getInnerPadding(),
-                b = c.getInherited().rtl;
-            arguments[0] = a + (b ? e.right : -e.left);
-            arguments[1] = f + e.bottom;
-            return d.callParent(arguments)
-        }
-    },
-    updateXAxis: function(a) {
-        a.setLabelInSpan(true);
-        this.callParent(arguments)
-    },
-    updateHidden: function(a) {
-        this.callParent(arguments);
-        this.updateStacked()
-    },
-    updateStacked: function(c) {
-        var e = this,
-            g = e.getSprites(),
-            d = g.length,
-            f = [],
-            a = {},
-            b;
-        for (b = 0; b < d; b++) {
-            if (!g[b].attr.hidden) {
-                f.push(g[b])
-            }
-        }
-        d = f.length;
-        if (e.getStacked()) {
-            a.groupCount = 1;
-            a.groupOffset = 0;
-            for (b = 0; b < d; b++) {
-                f[b].setAttributes(a)
-            }
-        } else {
-            a.groupCount = f.length;
-            for (b = 0; b < d; b++) {
-                a.groupOffset = b;
-                f[b].setAttributes(a)
-            }
-        }
-        e.callParent(arguments)
-    }
-});
-Ext.define("Ext.chart.series.sprite.Bar3D", {
-    extend: "Ext.chart.series.sprite.Bar",
-    alias: "sprite.bar3dSeries",
-    requires: ["Ext.draw.gradient.Linear"],
-    inheritableStatics: {
-        def: {
-            processors: {
-                depthWidthRatio: "number",
-                saturationFactor: "number",
-                brightnessFactor: "number",
-                colorSpread: "number"
-            },
-            defaults: {
-                depthWidthRatio: 1 / 3,
-                saturationFactor: 1,
-                brightnessFactor: 1,
-                colorSpread: 1,
-                transformFillStroke: true
-            },
-            triggers: {
-                groupCount: "panzoom"
-            },
-            updaters: {
-                panzoom: function(c) {
-                    var g = this,
-                        e = c.visibleMaxX - c.visibleMinX,
-                        d = c.visibleMaxY - c.visibleMinY,
-                        b = c.flipXY ? c.innerHeight : c.innerWidth,
-                        h = !c.flipXY ? c.innerHeight : c.innerWidth,
-                        a = g.getSurface(),
-                        f = a ? a.getInherited().rtl : false;
-                    if (f && !c.flipXY) {
-                        c.translationX = b + c.visibleMinX * b / e
-                    } else {
-                        c.translationX = -c.visibleMinX * b / e
-                    }
-                    c.translationY = -c.visibleMinY * (h - g.depth) / d;
-                    c.scalingX = (f && !c.flipXY ? -1 : 1) * b / e;
-                    c.scalingY = (h - g.depth) / d;
-                    c.scalingCenterX = 0;
-                    c.scalingCenterY = 0;
-                    g.applyTransformations(true)
-                }
-            }
-        }
-    },
-    config: {
-        showStroke: false
-    },
-    depth: 0,
-    drawBar: function(p, b, d, c, l, o, a, h) {
-        var k = this,
-            i = k.attr,
-            n = {},
-            j = i.renderer,
-            m, g, f, e;
-        n.x = (c + o) * 0.5;
-        n.y = l;
-        n.width = (o - c) * 0.75;
-        n.height = a - l;
-        n.depth = g = n.width * i.depthWidthRatio;
-        n.orientation = i.flipXY ? "horizontal" : "vertical";
-        n.saturationFactor = i.saturationFactor;
-        n.brightnessFactor = i.brightnessFactor;
-        n.colorSpread = i.colorSpread;
-        if (g !== k.depth) {
-            k.depth = g;
-            f = k.getSeries();
-            f.fireEvent("depthchange", f, g)
-        }
-        if (j) {
-            e = [k, n, {
-                store: k.getStore()
-            }, h];
-            m = Ext.callback(j, null, e, 0, k.getSeries());
-            Ext.apply(n, m)
-        }
-        k.putMarker("items", n, h, !j)
-    }
-});
-Ext.define("Ext.chart.series.sprite.Box", {
-    extend: "Ext.draw.sprite.Sprite",
-    alias: "sprite.box",
-    type: "box",
-    inheritableStatics: {
-        def: {
-            processors: {
-                x: "number",
-                y: "number",
-                width: "number",
-                height: "number",
-                depth: "number",
-                orientation: "enums(vertical,horizontal)",
-                showStroke: "bool",
-                saturationFactor: "number",
-                brightnessFactor: "number",
-                colorSpread: "number"
-            },
-            triggers: {
-                x: "bbox",
-                y: "bbox",
-                width: "bbox",
-                height: "bbox",
-                depth: "bbox",
-                orientation: "bbox"
-            },
-            defaults: {
-                x: 0,
-                y: 0,
-                width: 8,
-                height: 8,
-                depth: 8,
-                orientation: "vertical",
-                showStroke: false,
-                saturationFactor: 1,
-                brightnessFactor: 1,
-                colorSpread: 1,
-                lineJoin: "bevel"
-            }
-        }
-    },
-    constructor: function(a) {
-        this.callParent([a]);
-        this.topGradient = new Ext.draw.gradient.Linear({});
-        this.rightGradient = new Ext.draw.gradient.Linear({});
-        this.frontGradient = new Ext.draw.gradient.Linear({})
-    },
-    updatePlainBBox: function(d) {
-        var c = this.attr,
-            b = c.x,
-            g = c.y,
-            e = c.width,
-            a = c.height,
-            f = c.depth;
-        d.x = b - e * 0.5;
-        d.width = e + f;
-        if (a > 0) {
-            d.y = g;
-            d.height = a + f
-        } else {
-            d.y = g + f;
-            d.height = a - f
-        }
-    },
-    render: function(l, m) {
-        var u = this,
-            k = u.attr,
-            r = k.x,
-            j = k.y,
-            f = j + k.height,
-            i = j < f,
-            e = k.width * 0.5,
-            v = k.depth,
-            d = k.orientation === "horizontal",
-            g = k.globalAlpha < 1,
-            c = k.fillStyle,
-            n = Ext.draw.Color.create(c.isGradient ? c.getStops()[0].color : c),
-            h = k.saturationFactor,
-            o = k.brightnessFactor,
-            t = k.colorSpread,
-            b = n.getHSV(),
-            a = {},
-            s, q, p;
-        if (!k.showStroke) {
-            m.strokeStyle = Ext.draw.Color.RGBA_NONE
-        }
-        if (i) {
-            p = j;
-            j = f;
-            f = p
-        }
-        u.topGradient.setDegrees(d ? 0 : 80);
-        u.topGradient.setStops([{
-            offset: 0,
-            color: Ext.draw.Color.fromHSV(b[0], Ext.Number.constrain(b[1] * h, 0, 1), Ext.Number.constrain((0.5 + t * 0.1) * o, 0, 1))
-        }, {
-            offset: 1,
-            color: Ext.draw.Color.fromHSV(b[0], Ext.Number.constrain(b[1] * h, 0, 1), Ext.Number.constrain((0.5 - t * 0.11) * o, 0, 1))
-        }]);
-        u.rightGradient.setDegrees(d ? 45 : 90);
-        u.rightGradient.setStops([{
-            offset: 0,
-            color: Ext.draw.Color.fromHSV(b[0], Ext.Number.constrain(b[1] * h, 0, 1), Ext.Number.constrain((0.5 - t * 0.14) * o, 0, 1))
-        }, {
-            offset: 1,
-            color: Ext.draw.Color.fromHSV(b[0], Ext.Number.constrain(b[1] * (1 + t * 0.4) * h, 0, 1), Ext.Number.constrain((0.5 - t * 0.32) * o, 0, 1))
-        }]);
-        if (d) {
-            u.frontGradient.setDegrees(0)
-        } else {
-            u.frontGradient.setRadians(Math.atan2(j - f, e * 2))
-        }
-        u.frontGradient.setStops([{
-            offset: 0,
-            color: Ext.draw.Color.fromHSV(b[0], Ext.Number.constrain(b[1] * (1 - t * 0.1) * h, 0, 1), Ext.Number.constrain((0.5 + t * 0.1) * o, 0, 1))
-        }, {
-            offset: 1,
-            color: Ext.draw.Color.fromHSV(b[0], Ext.Number.constrain(b[1] * (1 + t * 0.1) * h, 0, 1), Ext.Number.constrain((0.5 - t * 0.23) * o, 0, 1))
-        }]);
-        if (g || i) {
-            m.beginPath();
-            m.moveTo(r - e, f);
-            m.lineTo(r - e + v, f + v);
-            m.lineTo(r + e + v, f + v);
-            m.lineTo(r + e, f);
-            m.closePath();
-            a.x = r - e;
-            a.y = j;
-            a.width = e + v;
-            a.height = v;
-            m.fillStyle = (d ? u.rightGradient : u.topGradient).generateGradient(m, a);
-            m.fillStroke(k)
-        }
-        if (g) {
-            m.beginPath();
-            m.moveTo(r - e, j);
-            m.lineTo(r - e + v, j + v);
-            m.lineTo(r - e + v, f + v);
-            m.lineTo(r - e, f);
-            m.closePath();
-            a.x = r + e;
-            a.y = f;
-            a.width = v;
-            a.height = j + v - f;
-            m.fillStyle = (d ? u.topGradient : u.rightGradient).generateGradient(m, a);
-            m.fillStroke(k)
-        }
-        q = l.roundPixel(j);
-        m.beginPath();
-        m.moveTo(r - e, q);
-        m.lineTo(r - e + v, j + v);
-        m.lineTo(r + e + v, j + v);
-        m.lineTo(r + e, q);
-        m.closePath();
-        a.x = r - e;
-        a.y = j;
-        a.width = e + v;
-        a.height = v;
-        m.fillStyle = (d ? u.rightGradient : u.topGradient).generateGradient(m, a);
-        m.fillStroke(k);
-        s = l.roundPixel(r + e);
-        m.beginPath();
-        m.moveTo(s, l.roundPixel(j));
-        m.lineTo(r + e + v, j + v);
-        m.lineTo(r + e + v, f + v);
-        m.lineTo(s, f);
-        m.closePath();
-        a.x = r + e;
-        a.y = f;
-        a.width = v;
-        a.height = j + v - f;
-        m.fillStyle = (d ? u.topGradient : u.rightGradient).generateGradient(m, a);
-        m.fillStroke(k);
-        s = l.roundPixel(r + e);
-        q = l.roundPixel(j);
-        m.beginPath();
-        m.moveTo(r - e, f);
-        m.lineTo(r - e, q);
-        m.lineTo(s, q);
-        m.lineTo(s, f);
-        m.closePath();
-        a.x = r - e;
-        a.y = f;
-        a.width = e * 2;
-        a.height = j - f;
-        m.fillStyle = u.frontGradient.generateGradient(m, a);
-        m.fillStroke(k)
-    }
-});
-Ext.define("Ext.chart.series.Bar3D", {
-    extend: "Ext.chart.series.Bar",
-    requires: ["Ext.chart.series.sprite.Bar3D", "Ext.chart.series.sprite.Box"],
-    alias: "series.bar3d",
-    type: "bar3d",
-    seriesType: "bar3dSeries",
-    config: {
-        itemInstancing: {
-            type: "box",
-            fx: {
-                customDurations: {
-                    x: 0,
-                    y: 0,
-                    width: 0,
-                    height: 0,
-                    depth: 0
-                }
-            }
-        },
-        highlightCfg: {
-            opacity: 0.8
-        }
-    },
-    getSprites: function() {
-        var c = this.callParent(arguments),
-            b, d, a;
-        for (a = 0; a < c.length; a++) {
-            b = c[a];
-            d = b.attr.zIndex;
-            if (d < 0) {
-                b.setAttributes({
-                    zIndex: -d
-                })
-            }
-            if (b.setSeries) {
-                b.setSeries(this)
-            }
-        }
-        return c
-    },
-    getDepth: function() {
-        var a = this.getSprites()[0];
-        return a ? (a.depth || 0) : 0
-    },
-    getItemForPoint: function(m, k) {
-        if (this.getSprites()) {
-            var j = this,
-                b, o, a = j.getItemInstancing(),
-                h = j.getSprites(),
-                n = j.getStore(),
-                c = j.getHidden(),
-                g = j.getChart(),
-                l = g.getInnerPadding(),
-                f = g.getInherited().rtl,
-                p, d, e;
-            m = m + (f ? l.right : -l.left);
-            k = k + l.bottom;
-            for (b = h.length - 1; b >= 0; b--) {
-                if (!c[b]) {
-                    o = h[b];
-                    d = o.getIndexNearPoint(m, k);
-                    if (d !== -1) {
-                        e = j.getYField();
-                        p = {
-                            series: j,
-                            index: d,
-                            category: a ? "items" : "markers",
-                            record: n.getData().items[d],
-                            field: typeof e === "string" ? e : e[b],
-                            sprite: o
-                        };
-                        return p
-                    }
-                }
-            }
-            return null
-        }
-    }
-});
-Ext.define("Ext.draw.LimitedCache", {
-    config: {
-        limit: 40,
-        feeder: function() {
-            return 0
-        },
-        scope: null
-    },
-    cache: null,
-    constructor: function(a) {
-        this.cache = {};
-        this.cache.list = [];
-        this.cache.tail = 0;
-        this.initConfig(a)
-    },
-    get: function(e) {
-        var c = this.cache,
-            b = this.getLimit(),
-            a = this.getFeeder(),
-            d = this.getScope() || this;
-        if (c[e]) {
-            return c[e].value
-        }
-        if (c.list[c.tail]) {
-            delete c[c.list[c.tail].cacheId]
-        }
-        c[e] = c.list[c.tail] = {
-            value: a.apply(d, Array.prototype.slice.call(arguments, 1)),
-            cacheId: e
-        };
-        c.tail++;
-        if (c.tail === b) {
-            c.tail = 0
-        }
-        return c[e].value
-    },
-    clear: function() {
-        this.cache = {};
-        this.cache.list = [];
-        this.cache.tail = 0
-    }
-});
-Ext.define("Ext.draw.SegmentTree", {
-    config: {
-        strategy: "double"
-    },
-    time: function(m, l, n, c, E, d, e) {
-        var f = 0,
-            o, A, s = new Date(n[m.startIdx[0]]),
-            x = new Date(n[m.endIdx[l - 1]]),
-            D = Ext.Date,
-            u = [
-                [D.MILLI, 1, "ms1", null],
-                [D.MILLI, 2, "ms2", "ms1"],
-                [D.MILLI, 5, "ms5", "ms1"],
-                [D.MILLI, 10, "ms10", "ms5"],
-                [D.MILLI, 50, "ms50", "ms10"],
-                [D.MILLI, 100, "ms100", "ms50"],
-                [D.MILLI, 500, "ms500", "ms100"],
-                [D.SECOND, 1, "s1", "ms500"],
-                [D.SECOND, 10, "s10", "s1"],
-                [D.SECOND, 30, "s30", "s10"],
-                [D.MINUTE, 1, "mi1", "s10"],
-                [D.MINUTE, 5, "mi5", "mi1"],
-                [D.MINUTE, 10, "mi10", "mi5"],
-                [D.MINUTE, 30, "mi30", "mi10"],
-                [D.HOUR, 1, "h1", "mi30"],
-                [D.HOUR, 6, "h6", "h1"],
-                [D.HOUR, 12, "h12", "h6"],
-                [D.DAY, 1, "d1", "h12"],
-                [D.DAY, 7, "d7", "d1"],
-                [D.MONTH, 1, "mo1", "d1"],
-                [D.MONTH, 3, "mo3", "mo1"],
-                [D.MONTH, 6, "mo6", "mo3"],
-                [D.YEAR, 1, "y1", "mo3"],
-                [D.YEAR, 5, "y5", "y1"],
-                [D.YEAR, 10, "y10", "y5"],
-                [D.YEAR, 100, "y100", "y10"]
-            ],
-            z, b, k = f,
-            F = l,
-            j = false,
-            r = m.startIdx,
-            h = m.endIdx,
-            w = m.minIdx,
-            C = m.maxIdx,
-            a = m.open,
-            y = m.close,
-            g = m.minX,
-            q = m.minY,
-            p = m.maxX,
-            B = m.maxY,
-            v, t;
-        for (z = 0; l > f + 1 && z < u.length; z++) {
-            s = new Date(n[r[0]]);
-            b = u[z];
-            s = D.align(s, b[0], b[1]);
-            if (D.diff(s, x, b[0]) > n.length * 2 * b[1]) {
-                continue
-            }
-            if (b[3] && m.map["time_" + b[3]]) {
-                o = m.map["time_" + b[3]][0];
-                A = m.map["time_" + b[3]][1]
-            } else {
-                o = k;
-                A = F
-            }
-            f = l;
-            t = s;
-            j = true;
-            r[l] = r[o];
-            h[l] = h[o];
-            w[l] = w[o];
-            C[l] = C[o];
-            a[l] = a[o];
-            y[l] = y[o];
-            g[l] = g[o];
-            q[l] = q[o];
-            p[l] = p[o];
-            B[l] = B[o];
-            t = Ext.Date.add(t, b[0], b[1]);
-            for (v = o + 1; v < A; v++) {
-                if (n[h[v]] < +t) {
-                    h[l] = h[v];
-                    y[l] = y[v];
-                    if (B[v] > B[l]) {
-                        B[l] = B[v];
-                        p[l] = p[v];
-                        C[l] = C[v]
-                    }
-                    if (q[v] < q[l]) {
-                        q[l] = q[v];
-                        g[l] = g[v];
-                        w[l] = w[v]
-                    }
-                } else {
-                    l++;
-                    r[l] = r[v];
-                    h[l] = h[v];
-                    w[l] = w[v];
-                    C[l] = C[v];
-                    a[l] = a[v];
-                    y[l] = y[v];
-                    g[l] = g[v];
-                    q[l] = q[v];
-                    p[l] = p[v];
-                    B[l] = B[v];
-                    t = Ext.Date.add(t, b[0], b[1])
-                }
-            }
-            if (l > f) {
-                m.map["time_" + b[2]] = [f, l]
-            }
-        }
-    },
-    "double": function(h, u, j, a, t, b, c) {
-        var e = 0,
-            k, f = 1,
-            n, d, v, g, s, l, m, r, q, p, o;
-        while (u > e + 1) {
-            k = e;
-            e = u;
-            f += f;
-            for (n = k; n < e; n += 2) {
-                if (n === e - 1) {
-                    d = h.startIdx[n];
-                    v = h.endIdx[n];
-                    g = h.minIdx[n];
-                    s = h.maxIdx[n];
-                    l = h.open[n];
-                    m = h.close[n];
-                    r = h.minX[n];
-                    q = h.minY[n];
-                    p = h.maxX[n];
-                    o = h.maxY[n]
-                } else {
-                    d = h.startIdx[n];
-                    v = h.endIdx[n + 1];
-                    l = h.open[n];
-                    m = h.close[n];
-                    if (h.minY[n] <= h.minY[n + 1]) {
-                        g = h.minIdx[n];
-                        r = h.minX[n];
-                        q = h.minY[n]
-                    } else {
-                        g = h.minIdx[n + 1];
-                        r = h.minX[n + 1];
-                        q = h.minY[n + 1]
-                    }
-                    if (h.maxY[n] >= h.maxY[n + 1]) {
-                        s = h.maxIdx[n];
-                        p = h.maxX[n];
-                        o = h.maxY[n]
-                    } else {
-                        s = h.maxIdx[n + 1];
-                        p = h.maxX[n + 1];
-                        o = h.maxY[n + 1]
-                    }
-                }
-                h.startIdx[u] = d;
-                h.endIdx[u] = v;
-                h.minIdx[u] = g;
-                h.maxIdx[u] = s;
-                h.open[u] = l;
-                h.close[u] = m;
-                h.minX[u] = r;
-                h.minY[u] = q;
-                h.maxX[u] = p;
-                h.maxY[u] = o;
-                u++
-            }
-            h.map["double_" + f] = [e, u]
-        }
-    },
-    none: Ext.emptyFn,
-    aggregateData: function(h, a, r, c, d) {
-        var b = h.length,
-            e = [],
-            s = [],
-            f = [],
-            q = [],
-            j = [],
-            p = [],
-            n = [],
-            o = [],
-            m = [],
-            k = [],
-            g = {
-                startIdx: e,
-                endIdx: s,
-                minIdx: f,
-                maxIdx: q,
-                open: j,
-                minX: p,
-                minY: n,
-                maxX: o,
-                maxY: m,
-                close: k
-            },
-            l;
-        for (l = 0; l < b; l++) {
-            e[l] = l;
-            s[l] = l;
-            f[l] = l;
-            q[l] = l;
-            j[l] = a[l];
-            p[l] = h[l];
-            n[l] = c[l];
-            o[l] = h[l];
-            m[l] = r[l];
-            k[l] = d[l]
-        }
-        g.map = {
-            original: [0, b]
-        };
-        if (b) {
-            this[this.getStrategy()](g, b, h, a, r, c, d)
-        }
-        return g
-    },
-    binarySearchMin: function(c, g, a, e) {
-        var b = this.dataX;
-        if (e <= b[c.startIdx[0]]) {
-            return g
-        }
-        if (e >= b[c.startIdx[a - 1]]) {
-            return a - 1
-        }
-        while (g + 1 < a) {
-            var d = (g + a) >> 1,
-                f = b[c.startIdx[d]];
-            if (f === e) {
-                return d
-            } else {
-                if (f < e) {
-                    g = d
-                } else {
-                    a = d
-                }
-            }
-        }
-        return g
-    },
-    binarySearchMax: function(c, g, a, e) {
-        var b = this.dataX;
-        if (e <= b[c.endIdx[0]]) {
-            return g
-        }
-        if (e >= b[c.endIdx[a - 1]]) {
-            return a - 1
-        }
-        while (g + 1 < a) {
-            var d = (g + a) >> 1,
-                f = b[c.endIdx[d]];
-            if (f === e) {
-                return d
-            } else {
-                if (f < e) {
-                    g = d
-                } else {
-                    a = d
-                }
-            }
-        }
-        return a
-    },
-    constructor: function(a) {
-        this.initConfig(a)
-    },
-    setData: function(d, a, b, c, e) {
-        if (!b) {
-            e = c = b = a
-        }
-        this.dataX = d;
-        this.dataOpen = a;
-        this.dataHigh = b;
-        this.dataLow = c;
-        this.dataClose = e;
-        if (d.length === b.length && d.length === c.length) {
-            this.cache = this.aggregateData(d, a, b, c, e)
-        }
-    },
-    getAggregation: function(d, k, i) {
-        if (!this.cache) {
-            return null
-        }
-        var c = Infinity,
-            g = this.dataX[this.dataX.length - 1] - this.dataX[0],
-            l = this.cache.map,
-            m = l.original,
-            a, e, j, b, f, h;
-        for (a in l) {
-            e = l[a];
-            j = e[1] - e[0] - 1;
-            b = g / j;
-            if (i <= b && b < c) {
-                m = e;
-                c = b
-            }
-        }
-        f = Math.max(this.binarySearchMin(this.cache, m[0], m[1], d), m[0]);
-        h = Math.min(this.binarySearchMax(this.cache, m[0], m[1], k) + 1, m[1]);
-        return {
-            data: this.cache,
-            start: f,
-            end: h
-        }
-    }
-});
-Ext.define("Ext.chart.series.sprite.Aggregative", {
-    extend: "Ext.chart.series.sprite.Cartesian",
-    requires: ["Ext.draw.LimitedCache", "Ext.draw.SegmentTree"],
-    inheritableStatics: {
-        def: {
-            processors: {
-                dataHigh: "data",
-                dataLow: "data",
-                dataClose: "data"
-            },
-            aliases: {
-                dataOpen: "dataY"
-            },
-            defaults: {
-                dataHigh: null,
-                dataLow: null,
-                dataClose: null
-            }
-        }
-    },
-    config: {
-        aggregator: {}
-    },
-    applyAggregator: function(b, a) {
-        return Ext.factory(b, Ext.draw.SegmentTree, a)
-    },
-    constructor: function() {
-        this.callParent(arguments)
-    },
-    processDataY: function() {
-        var d = this,
-            b = d.attr,
-            e = b.dataHigh,
-            a = b.dataLow,
-            f = b.dataClose,
-            c = b.dataY;
-        d.callParent(arguments);
-        if (b.dataX && c && c.length > 0) {
-            if (e) {
-                d.getAggregator().setData(b.dataX, b.dataY, e, a, f)
-            } else {
-                d.getAggregator().setData(b.dataX, b.dataY)
-            }
-        }
-    },
-    getGapWidth: function() {
-        return 1
-    },
-    renderClipped: function(b, c, g, f) {
-        var e = this,
-            d = Math.min(g[0], g[2]),
-            a = Math.max(g[0], g[2]),
-            h = e.getAggregator() && e.getAggregator().getAggregation(d, a, (a - d) / f[2] * e.getGapWidth());
-        if (h) {
-            e.dataStart = h.data.startIdx[h.start];
-            e.dataEnd = h.data.endIdx[h.end - 1];
-            e.renderAggregates(h.data, h.start, h.end, b, c, g, f)
-        }
-    }
-});
-Ext.define("Ext.chart.series.sprite.CandleStick", {
-    alias: "sprite.candlestickSeries",
-    extend: "Ext.chart.series.sprite.Aggregative",
-    inheritableStatics: {
-        def: {
-            processors: {
-                raiseStyle: function(b, a) {
-                    return Ext.merge({}, a || {}, b)
-                },
-                dropStyle: function(b, a) {
-                    return Ext.merge({}, a || {}, b)
-                },
-                barWidth: "number",
-                padding: "number",
-                ohlcType: "enums(candlestick,ohlc)"
-            },
-            defaults: {
-                raiseStyle: {
-                    strokeStyle: "green",
-                    fillStyle: "green"
-                },
-                dropStyle: {
-                    strokeStyle: "red",
-                    fillStyle: "red"
-                },
-                planar: false,
-                barWidth: 15,
-                padding: 3,
-                lineJoin: "miter",
-                miterLimit: 5,
-                ohlcType: "candlestick"
-            },
-            triggers: {
-                raiseStyle: "raiseStyle",
-                dropStyle: "dropStyle"
-            },
-            updaters: {
-                raiseStyle: function() {
-                    this.raiseTemplate && this.raiseTemplate.setAttributes(this.attr.raiseStyle)
-                },
-                dropStyle: function() {
-                    this.dropTemplate && this.dropTemplate.setAttributes(this.attr.dropStyle)
-                }
-            }
-        }
-    },
-    candlestick: function(i, c, a, e, h, f, b) {
-        var d = Math.min(c, h),
-            g = Math.max(c, h);
-        i.moveTo(f, e);
-        i.lineTo(f, g);
-        i.moveTo(f + b, g);
-        i.lineTo(f + b, d);
-        i.lineTo(f - b, d);
-        i.lineTo(f - b, g);
-        i.closePath();
-        i.moveTo(f, a);
-        i.lineTo(f, d)
-    },
-    ohlc: function(b, d, e, a, f, c, g) {
-        b.moveTo(c, e);
-        b.lineTo(c, a);
-        b.moveTo(c, d);
-        b.lineTo(c - g, d);
-        b.moveTo(c, f);
-        b.lineTo(c + g, f)
-    },
-    constructor: function() {
-        this.callParent(arguments);
-        this.raiseTemplate = new Ext.draw.sprite.Rect({
-            parent: this
-        });
-        this.dropTemplate = new Ext.draw.sprite.Rect({
-            parent: this
-        })
-    },
-    getGapWidth: function() {
-        var a = this.attr,
-            b = a.barWidth,
-            c = a.padding;
-        return b + c
-    },
-    renderAggregates: function(d, c, b, t, u, z) {
-        var D = this,
-            s = this.attr,
-            j = s.dataX,
-            v = s.matrix,
-            e = v.getXX(),
-            r = v.getYY(),
-            l = v.getDX(),
-            h = v.getDY(),
-            o = s.barWidth / e,
-            C, k = s.ohlcType,
-            f = Math.round(o * 0.5 * e),
-            a = d.open,
-            y = d.close,
-            B = d.maxY,
-            p = d.minY,
-            q = d.startIdx,
-            m, g, E, n, A, x, w = s.lineWidth * t.devicePixelRatio / 2;
-        w -= Math.floor(w);
-        u.save();
-        C = this.raiseTemplate;
-        C.useAttributes(u, z);
-        u.beginPath();
-        for (x = c; x < b; x++) {
-            if (a[x] <= y[x]) {
-                m = Math.round(a[x] * r + h) + w;
-                g = Math.round(B[x] * r + h) + w;
-                E = Math.round(p[x] * r + h) + w;
-                n = Math.round(y[x] * r + h) + w;
-                A = Math.round(j[q[x]] * e + l) + w;
-                D[k](u, m, g, E, n, A, f)
-            }
-        }
-        u.fillStroke(C.attr);
-        u.restore();
-        u.save();
-        C = this.dropTemplate;
-        C.useAttributes(u, z);
-        u.beginPath();
-        for (x = c; x < b; x++) {
-            if (a[x] > y[x]) {
-                m = Math.round(a[x] * r + h) + w;
-                g = Math.round(B[x] * r + h) + w;
-                E = Math.round(p[x] * r + h) + w;
-                n = Math.round(y[x] * r + h) + w;
-                A = Math.round(j[q[x]] * e + l) + w;
-                D[k](u, m, g, E, n, A, f)
-            }
-        }
-        u.fillStroke(C.attr);
-        u.restore()
-    }
-});
-Ext.define("Ext.chart.series.CandleStick", {
-    extend: "Ext.chart.series.Cartesian",
-    requires: ["Ext.chart.series.sprite.CandleStick"],
-    alias: "series.candlestick",
-    type: "candlestick",
-    seriesType: "candlestickSeries",
-    config: {
-        openField: null,
-        highField: null,
-        lowField: null,
-        closeField: null
-    },
-    fieldCategoryY: ["Open", "High", "Low", "Close"],
-    themeColorCount: function() {
-        return 2
-    }
-});
-Ext.define("Ext.chart.series.Polar", {
-    extend: "Ext.chart.series.Series",
-    config: {
-        rotation: 0,
-        radius: null,
-        center: [0, 0],
-        offsetX: 0,
-        offsetY: 0,
-        showInLegend: true,
-        xField: null,
-        yField: null,
-        angleField: null,
-        radiusField: null,
-        xAxis: null,
-        yAxis: null
-    },
-    directions: ["X", "Y"],
-    fieldCategoryX: ["X"],
-    fieldCategoryY: ["Y"],
-    deprecatedConfigs: {
-        field: "angleField",
-        lengthField: "radiusField"
-    },
-    constructor: function(b) {
-        var c = this,
-            a = c.getConfigurator(),
-            e = a.configs,
-            d;
-        if (b) {
-            for (d in c.deprecatedConfigs) {
-                if (d in b && !(b in e)) {
-                    Ext.raise("'" + d + "' config has been deprecated. Please use the '" + c.deprecatedConfigs[d] + "' config instead.")
-                }
-            }
-        }
-        c.callParent([b])
-    },
-    getXField: function() {
-        return this.getAngleField()
-    },
-    updateXField: function(a) {
-        this.setAngleField(a)
-    },
-    getYField: function() {
-        return this.getRadiusField()
-    },
-    updateYField: function(a) {
-        this.setRadiusField(a)
-    },
-    applyXAxis: function(a, b) {
-        return this.getChart().getAxis(a) || b
-    },
-    applyYAxis: function(a, b) {
-        return this.getChart().getAxis(a) || b
-    },
-    getXRange: function() {
-        return [this.dataRange[0], this.dataRange[2]]
-    },
-    getYRange: function() {
-        return [this.dataRange[1], this.dataRange[3]]
-    },
-    themeColorCount: function() {
-        var c = this,
-            a = c.getStore(),
-            b = a && a.getCount() || 0;
-        return b
-    },
-    isStoreDependantColorCount: true,
-    getDefaultSpriteConfig: function() {
-        return {
-            type: this.seriesType,
-            renderer: this.getRenderer(),
-            centerX: 0,
-            centerY: 0,
-            rotationCenterX: 0,
-            rotationCenterY: 0
-        }
-    },
-    applyRotation: function(a) {
-        return Ext.draw.sprite.AttributeParser.angle(a)
-    },
-    updateRotation: function(a) {
-        var b = this.getSprites();
-        if (b && b[0]) {
-            b[0].setAttributes({
-                baseRotation: a
-            })
-        }
-    }
-});
-Ext.define("Ext.chart.series.Gauge", {
-    alias: "series.gauge",
-    extend: "Ext.chart.series.Polar",
-    type: "gauge",
-    seriesType: "pieslice",
-    requires: ["Ext.draw.sprite.Sector"],
-    config: {
-        needle: false,
-        needleLength: 90,
-        needleWidth: 4,
-        donut: 30,
-        showInLegend: false,
-        value: null,
-        colors: null,
-        sectors: null,
-        minimum: 0,
-        maximum: 100,
-        rotation: 0,
-        totalAngle: Math.PI / 2,
-        rect: [0, 0, 1, 1],
-        center: [0.5, 0.75],
-        radius: 0.5,
-        wholeDisk: false
-    },
-    coordinateX: function() {
-        return this.coordinate("X", 0, 2)
-    },
-    coordinateY: function() {
-        return this.coordinate("Y", 1, 2)
-    },
-    updateNeedle: function(b) {
-        var a = this,
-            d = a.getSprites(),
-            c = a.valueToAngle(a.getValue());
-        if (d && d.length) {
-            d[0].setAttributes({
-                startAngle: (b ? c : 0),
-                endAngle: c,
-                strokeOpacity: (b ? 1 : 0),
-                lineWidth: (b ? a.getNeedleWidth() : 0)
-            });
-            a.doUpdateStyles()
-        }
-    },
-    themeColorCount: function() {
-        var c = this,
-            a = c.getStore(),
-            b = a && a.getCount() || 0;
-        return b + (c.getNeedle() ? 0 : 1)
-    },
-    updateColors: function(a, b) {
-        var f = this,
-            h = f.getSectors(),
-            j = h && h.length,
-            e = f.getSprites(),
-            c = Ext.Array.clone(a),
-            g = a && a.length,
-            d;
-        if (!g || !a[0]) {
-            return
-        }
-        for (d = 0; d < j; d++) {
-            c[d + 1] = h[d].color || c[d + 1] || a[d % g]
-        }
-        if (e.length) {
-            e[0].setAttributes({
-                strokeStyle: c[0]
-            })
-        }
-        this.setSubStyle({
-            fillStyle: c,
-            strokeStyle: c
-        });
-        this.doUpdateStyles()
-    },
-    updateRect: function(f) {
-        var d = this.getWholeDisk(),
-            c = d ? Math.PI : this.getTotalAngle() / 2,
-            g = this.getDonut() / 100,
-            e, b, a;
-        if (c <= Math.PI / 2) {
-            e = 2 * Math.sin(c);
-            b = 1 - g * Math.cos(c)
-        } else {
-            e = 2;
-            b = 1 - Math.cos(c)
-        }
-        a = Math.min(f[2] / e, f[3] / b);
-        this.setRadius(a);
-        this.setCenter([f[2] / 2, a + (f[3] - b * a) / 2])
-    },
-    updateCenter: function(a) {
-        this.setStyle({
-            centerX: a[0],
-            centerY: a[1],
-            rotationCenterX: a[0],
-            rotationCenterY: a[1]
-        });
-        this.doUpdateStyles()
-    },
-    updateRotation: function(a) {
-        this.setStyle({
-            rotationRads: a - (this.getTotalAngle() + Math.PI) / 2
-        });
-        this.doUpdateStyles()
-    },
-    doUpdateShape: function(b, f) {
-        var a, d = this.getSectors(),
-            c = (d && d.length) || 0,
-            e = this.getNeedleLength() / 100;
-        a = [b * e, b];
-        while (c--) {
-            a.push(b)
-        }
-        this.setSubStyle({
-            endRho: a,
-            startRho: b / 100 * f
-        });
-        this.doUpdateStyles()
-    },
-    updateRadius: function(a) {
-        var b = this.getDonut();
-        this.doUpdateShape(a, b)
-    },
-    updateDonut: function(b) {
-        var a = this.getRadius();
-        this.doUpdateShape(a, b)
-    },
-    valueToAngle: function(a) {
-        a = this.applyValue(a);
-        return this.getTotalAngle() * (a - this.getMinimum()) / (this.getMaximum() - this.getMinimum())
-    },
-    applyValue: function(a) {
-        return Math.min(this.getMaximum(), Math.max(a, this.getMinimum()))
-    },
-    updateValue: function(b) {
-        var a = this,
-            c = a.getNeedle(),
-            e = a.valueToAngle(b),
-            d = a.getSprites();
-        d[0].rendererData.value = b;
-        d[0].setAttributes({
-            startAngle: (c ? e : 0),
-            endAngle: e
-        });
-        a.doUpdateStyles()
-    },
-    processData: function() {
-        var f = this,
-            j = f.getStore(),
-            a, d, h, b, g, e = j && j.first(),
-            c, i;
-        if (e) {
-            c = f.getXField();
-            if (c) {
-                i = e.get(c)
-            }
-        }
-        if (a = f.getXAxis()) {
-            d = a.getMinimum();
-            h = a.getMaximum();
-            b = a.getSprites()[0].fx;
-            g = b.getDuration();
-            b.setDuration(0);
-            if (Ext.isNumber(d)) {
-                f.setMinimum(d)
-            } else {
-                a.setMinimum(f.getMinimum())
-            }
-            if (Ext.isNumber(h)) {
-                f.setMaximum(h)
-            } else {
-                a.setMaximum(f.getMaximum())
-            }
-            b.setDuration(g)
-        }
-        if (!Ext.isNumber(i)) {
-            i = f.getMinimum()
-        }
-        f.setValue(i)
-    },
-    getDefaultSpriteConfig: function() {
-        return {
-            type: this.seriesType,
-            renderer: this.getRenderer(),
-            fx: {
-                customDurations: {
-                    translationX: 0,
-                    translationY: 0,
-                    rotationCenterX: 0,
-                    rotationCenterY: 0,
-                    centerX: 0,
-                    centerY: 0,
-                    startRho: 0,
-                    endRho: 0,
-                    baseRotation: 0
-                }
-            }
-        }
-    },
-    normalizeSectors: function(f) {
-        var d = this,
-            c = (f && f.length) || 0,
-            b, e, g, a;
-        if (c) {
-            for (b = 0; b < c; b++) {
-                e = f[b];
-                if (typeof e === "number") {
-                    f[b] = {
-                        start: (b > 0 ? f[b - 1].end : d.getMinimum()),
-                        end: Math.min(e, d.getMaximum())
-                    };
-                    if (b == (c - 1) && f[b].end < d.getMaximum()) {
-                        f[b + 1] = {
-                            start: f[b].end,
-                            end: d.getMaximum()
-                        }
-                    }
-                } else {
-                    if (typeof e.start === "number") {
-                        g = Math.max(e.start, d.getMinimum())
-                    } else {
-                        g = (b > 0 ? f[b - 1].end : d.getMinimum())
-                    }
-                    if (typeof e.end === "number") {
-                        a = Math.min(e.end, d.getMaximum())
-                    } else {
-                        a = d.getMaximum()
-                    }
-                    f[b].start = g;
-                    f[b].end = a
-                }
-            }
-        } else {
-            f = [{
-                start: d.getMinimum(),
-                end: d.getMaximum()
-            }]
-        }
-        return f
-    },
-    getSprites: function() {
-        var j = this,
-            m = j.getStore(),
-            l = j.getValue(),
-            c, g;
-        if (!m && !Ext.isNumber(l)) {
-            return []
-        }
-        var h = j.getChart(),
-            b = j.getAnimation() || h && h.getAnimation(),
-            f = j.sprites,
-            k = 0,
-            o, n, e, d, a = [];
-        if (f && f.length) {
-            f[0].setAnimation(b);
-            return f
-        }
-        d = {
-            store: m,
-            field: j.getXField(),
-            angleField: j.getXField(),
-            value: l,
-            series: j
-        };
-        o = j.createSprite();
-        o.setAttributes({
-            zIndex: 10
-        }, true);
-        o.rendererData = d;
-        o.rendererIndex = k++;
-        a.push(j.getNeedleWidth());
-        j.getLabel().getTemplate().setField(true);
-        n = j.normalizeSectors(j.getSectors());
-        for (c = 0, g = n.length; c < g; c++) {
-            e = {
-                startAngle: j.valueToAngle(n[c].start),
-                endAngle: j.valueToAngle(n[c].end),
-                label: n[c].label,
-                fillStyle: n[c].color,
-                strokeOpacity: 0,
-                doCallout: false,
-                labelOverflowPadding: -1
-            };
-            Ext.apply(e, n[c].style);
-            o = j.createSprite();
-            o.rendererData = d;
-            o.rendererIndex = k++;
-            o.setAttributes(e, true);
-            a.push(e.lineWidth)
-        }
-        j.setSubStyle({
-            lineWidth: a
-        });
-        j.doUpdateStyles();
-        return f
-    }
-});
-Ext.define("Ext.chart.series.sprite.Line", {
-    alias: "sprite.lineSeries",
-    extend: "Ext.chart.series.sprite.Aggregative",
-    inheritableStatics: {
-        def: {
-            processors: {
-                smooth: "bool",
-                fillArea: "bool",
-                step: "bool",
-                preciseStroke: "bool",
-                xAxis: "default",
-                yCap: "default"
-            },
-            defaults: {
-                smooth: false,
-                fillArea: false,
-                step: false,
-                preciseStroke: true,
-                xAxis: null,
-                yCap: Math.pow(2, 20),
-                yJump: 50
-            },
-            triggers: {
-                dataX: "dataX,bbox,smooth",
-                dataY: "dataY,bbox,smooth",
-                smooth: "smooth"
-            },
-            updaters: {
-                smooth: function(a) {
-                    var c = a.dataX,
-                        b = a.dataY;
-                    if (a.smooth && c && b && c.length > 2 && b.length > 2) {
-                        this.smoothX = Ext.draw.Draw.spline(c);
-                        this.smoothY = Ext.draw.Draw.spline(b)
-                    } else {
-                        delete this.smoothX;
-                        delete this.smoothY
-                    }
-                }
-            }
-        }
-    },
-    list: null,
-    updatePlainBBox: function(d) {
-        var b = this.attr,
-            c = Math.min(0, b.dataMinY),
-            a = Math.max(0, b.dataMaxY);
-        d.x = b.dataMinX;
-        d.y = c;
-        d.width = b.dataMaxX - b.dataMinX;
-        d.height = a - c
-    },
-    drawStrip: function(a, c) {
-        a.moveTo(c[0], c[1]);
-        for (var b = 2, d = c.length; b < d; b += 2) {
-            a.lineTo(c[b], c[b + 1])
-        }
-    },
-    drawStraightStroke: function(p, q, e, d, u, h) {
-        var w = this,
-            o = w.attr,
-            n = o.renderer,
-            g = o.step,
-            a = true,
-            l = {
-                type: "line",
-                smooth: false,
-                step: g
-            },
-            m = [],
-            l, z, v, f, k, j, t, c, s, b, r;
-        for (r = 3; r < u.length; r += 3) {
-            t = u[r - 3];
-            c = u[r - 2];
-            k = u[r];
-            j = u[r + 1];
-            s = u[r + 3];
-            b = u[r + 4];
-            if (n) {
-                l.x = k;
-                l.y = j;
-                l.x0 = t;
-                l.y0 = c;
-                v = [w, l, w.rendererData, e + r / 3];
-                z = Ext.callback(n, null, v, 0, w.getSeries())
-            }
-            if (Ext.isNumber(k + j + t + c)) {
-                if (a) {
-                    q.beginPath();
-                    q.moveTo(t, c);
-                    m.push(t, c);
-                    f = t;
-                    a = false
-                }
-            } else {
-                continue
-            }
-            if (g) {
-                q.lineTo(k, c);
-                m.push(k, c)
-            }
-            q.lineTo(k, j);
-            m.push(k, j);
-            if (z || !(Ext.isNumber(s + b))) {
-                q.save();
-                Ext.apply(q, z);
-                if (o.fillArea) {
-                    q.lineTo(k, h);
-                    q.lineTo(f, h);
-                    q.closePath();
-                    q.fill()
-                }
-                q.beginPath();
-                w.drawStrip(q, m);
-                m = [];
-                q.stroke();
-                q.restore();
-                q.beginPath();
-                a = true
-            }
-        }
-    },
-    calculateScale: function(c, a) {
-        var b = 0,
-            d = c;
-        while (d < a && c > 0) {
-            b++;
-            d += c >> b
-        }
-        return Math.pow(2, b > 0 ? b - 1 : b)
-    },
-    drawSmoothStroke: function(u, v, c, b, C, f) {
-        var G = this,
-            t = G.attr,
-            d = t.step,
-            z = t.matrix,
-            s = t.renderer,
-            e = z.getXX(),
-            p = z.getYY(),
-            m = z.getDX(),
-            k = z.getDY(),
-            r = G.smoothX,
-            q = G.smoothY,
-            I = G.calculateScale(t.dataX.length, b),
-            o, F, n, E, h, g, B, a, A, w, H, D, l = {
-                type: "line",
-                smooth: true,
-                step: d
-            };
-        v.beginPath();
-        v.moveTo(r[c * 3] * e + m, q[c * 3] * p + k);
-        for (A = 0, w = c * 3 + 1; A < C.length - 3; A += 3, w += 3 * I) {
-            o = r[w] * e + m;
-            F = q[w] * p + k;
-            n = r[w + 1] * e + m;
-            E = q[w + 1] * p + k;
-            h = u.roundPixel(C[A + 3]);
-            g = C[A + 4];
-            B = u.roundPixel(C[A]);
-            a = C[A + 1];
-            if (s) {
-                l.x0 = B;
-                l.y0 = a;
-                l.cx1 = o;
-                l.cy1 = F;
-                l.cx2 = n;
-                l.cy2 = E;
-                l.x = h;
-                l.y = g;
-                D = [G, l, G.rendererData, c + A / 3 + 1];
-                H = Ext.callback(s, null, D, 0, G.getSeries());
-                v.save();
-                Ext.apply(v, H)
-            }
-            if (t.fillArea) {
-                v.moveTo(B, a);
-                v.bezierCurveTo(o, F, n, E, h, g);
-                v.lineTo(h, f);
-                v.lineTo(B, f);
-                v.lineTo(B, a);
-                v.closePath();
-                v.fill();
-                v.beginPath()
-            }
-            v.moveTo(B, a);
-            v.bezierCurveTo(o, F, n, E, h, g);
-            v.stroke();
-            v.moveTo(B, a);
-            v.closePath();
-            if (s) {
-                v.restore()
-            }
-            v.beginPath();
-            v.moveTo(h, g)
-        }
-        v.beginPath()
-    },
-    drawLabel: function(k, i, h, o, a) {
-        var q = this,
-            n = q.attr,
-            e = q.getMarker("labels"),
-            d = e.getTemplate(),
-            m = q.labelCfg || (q.labelCfg = {}),
-            c = q.surfaceMatrix,
-            g, f, j = n.labelOverflowPadding,
-            l, b, r, p, s;
-        m.x = c.x(i, h);
-        m.y = c.y(i, h);
-        if (n.flipXY) {
-            m.rotationRads = Math.PI * 0.5
-        } else {
-            m.rotationRads = 0
-        }
-        m.text = k;
-        if (d.attr.renderer) {
-            p = [k, e, m, q.rendererData, o];
-            r = Ext.callback(d.attr.renderer, null, p, 0, q.getSeries());
-            if (typeof r === "string") {
-                m.text = r
-            } else {
-                if (typeof r === "object") {
-                    if ("text" in r) {
-                        m.text = r.text
-                    }
-                    s = true
-                }
-            }
-        }
-        b = q.getMarkerBBox("labels", o, true);
-        if (!b) {
-            q.putMarker("labels", m, o);
-            b = q.getMarkerBBox("labels", o, true)
-        }
-        l = b.height / 2;
-        g = i;
-        switch (d.attr.display) {
-            case "under":
-                f = h - l - j;
-                break;
-            case "rotate":
-                g += j;
-                f = h - j;
-                m.rotationRads = -Math.PI / 4;
-                break;
-            default:
-                f = h + l + j
-        }
-        m.x = c.x(g, f);
-        m.y = c.y(g, f);
-        if (s) {
-            Ext.apply(m, r)
-        }
-        q.putMarker("labels", m, o)
-    },
-    drawMarker: function(j, h, d) {
-        var g = this,
-            e = g.attr,
-            f = e.renderer,
-            c = g.surfaceMatrix,
-            b = {},
-            i, a;
-        if (f && g.getMarker("markers")) {
-            b.type = "marker";
-            b.x = j;
-            b.y = h;
-            a = [g, b, g.rendererData, d];
-            i = Ext.callback(f, null, a, 0, g.getSeries());
-            if (i) {
-                Ext.apply(b, i)
-            }
-        }
-        b.translationX = c.x(j, h);
-        b.translationY = c.y(j, h);
-        delete b.x;
-        delete b.y;
-        g.putMarker("markers", b, d, !f)
-    },
-    drawStroke: function(a, c, h, b, f, e) {
-        var d = this,
-            g = d.attr.smooth && d.smoothX && d.smoothY;
-        if (g) {
-            d.drawSmoothStroke(a, c, h, b, f, e)
-        } else {
-            d.drawStraightStroke(a, c, h, b, f, e)
-        }
-    },
-    renderAggregates: function(B, w, l, N, o, I, D) {
-        var m = this,
-            k = m.attr,
-            s = k.dataX,
-            r = k.dataY,
-            h = k.labels,
-            v = k.xAxis,
-            a = k.yCap,
-            g = k.smooth && m.smoothX && m.smoothY,
-            d = h && m.getMarker("labels"),
-            t = m.getMarker("markers"),
-            E = k.matrix,
-            u = N.devicePixelRatio,
-            C = E.getXX(),
-            f = E.getYY(),
-            c = E.getDX(),
-            b = E.getDY(),
-            q = m.list || (m.list = []),
-            F = B.minX,
-            e = B.maxX,
-            j = B.minY,
-            P = B.maxY,
-            U = B.startIdx,
-            S = true,
-            Q, T, L, K, R, G;
-        m.rendererData = {
-            store: m.getStore()
-        };
-        q.length = 0;
-        for (R = w; R < l; R++) {
-            var O = F[R],
-                p = e[R],
-                M = j[R],
-                n = P[R];
-            if (O < p) {
-                q.push(O * C + c, M * f + b, U[R]);
-                q.push(p * C + c, n * f + b, U[R])
-            } else {
-                if (O > p) {
-                    q.push(p * C + c, n * f + b, U[R]);
-                    q.push(O * C + c, M * f + b, U[R])
-                } else {
-                    q.push(p * C + c, n * f + b, U[R])
-                }
-            }
-        }
-        if (q.length) {
-            for (R = 0; R < q.length; R += 3) {
-                L = q[R];
-                K = q[R + 1];
-                if (Ext.isNumber(L + K)) {
-                    if (K > a) {
-                        K = a
-                    } else {
-                        if (K < -a) {
-                            K = -a
-                        }
-                    }
-                    q[R + 1] = K
-                } else {
-                    S = false;
-                    continue
-                }
-                G = q[R + 2];
-                if (t) {
-                    m.drawMarker(L, K, G)
-                }
-                if (d && h[G]) {
-                    m.drawLabel(h[G], L, K, G, D)
-                }
-            }
-            m.isContinuousLine = S;
-            if (g && !S) {
-                Ext.raise("Line smoothing in only supported for gapless data, where all data points are finite numbers.")
-            }
-            if (v) {
-                T = v.getAlignment() === "vertical";
-                if (Ext.isNumber(v.floatingAtCoord)) {
-                    Q = (T ? D[2] : D[3]) - v.floatingAtCoord
-                } else {
-                    Q = T ? D[0] : D[1]
-                }
-            } else {
-                Q = k.flipXY ? D[0] : D[1]
-            }
-            if (k.preciseStroke) {
-                if (k.fillArea) {
-                    o.fill()
-                }
-                if (k.transformFillStroke) {
-                    k.inverseMatrix.toContext(o)
-                }
-                m.drawStroke(N, o, w, l, q, Q);
-                if (k.transformFillStroke) {
-                    k.matrix.toContext(o)
-                }
-                o.stroke()
-            } else {
-                m.drawStroke(N, o, w, l, q, Q);
-                if (S && g && k.fillArea && !k.renderer) {
-                    var A = s[s.length - 1] * C + c + u,
-                        z = r[r.length - 1] * f + b,
-                        J = s[0] * C + c - u,
-                        H = r[0] * f + b;
-                    o.lineTo(A, z);
-                    o.lineTo(A, Q - k.lineWidth);
-                    o.lineTo(J, Q - k.lineWidth);
-                    o.lineTo(J, H)
-                }
-                if (k.transformFillStroke) {
-                    k.matrix.toContext(o)
-                }
-                if (k.fillArea) {
-                    o.fillStroke(k, true)
-                } else {
-                    o.stroke(true)
-                }
-            }
-        }
-    }
-});
-Ext.define("Ext.chart.series.Line", {
-    extend: "Ext.chart.series.Cartesian",
-    alias: "series.line",
-    type: "line",
-    seriesType: "lineSeries",
-    requires: ["Ext.chart.series.sprite.Line"],
-    config: {
-        selectionTolerance: 20,
-        smooth: false,
-        step: false,
-        fill: undefined,
-        aggregator: {
-            strategy: "double"
-        }
-    },
-    defaultSmoothness: 3,
-    overflowBuffer: 1,
-    themeMarkerCount: function() {
-        return 1
-    },
-    getDefaultSpriteConfig: function() {
-        var d = this,
-            e = d.callParent(arguments),
-            c = Ext.apply({}, d.getStyle()),
-            b, a = false;
-        if (typeof d.config.fill != "undefined") {
-            if (d.config.fill) {
-                a = true;
-                if (typeof c.fillStyle == "undefined") {
-                    if (typeof c.strokeStyle == "undefined") {
-                        b = d.getStyleWithTheme();
-                        c.fillStyle = b.fillStyle;
-                        c.strokeStyle = b.strokeStyle
-                    } else {
-                        c.fillStyle = c.strokeStyle
-                    }
-                }
-            }
-        } else {
-            if (c.fillStyle) {
-                a = true
-            }
-        }
-        if (!a) {
-            delete c.fillStyle
-        }
-        c = Ext.apply(e || {}, c);
-        return Ext.apply(c, {
-            fillArea: a,
-            step: d.config.step,
-            smooth: d.config.smooth,
-            selectionTolerance: d.config.selectionTolerance
-        })
-    },
-    updateStep: function(b) {
-        var a = this.getSprites()[0];
-        if (a && a.attr.step !== b) {
-            a.setAttributes({
-                step: b
-            })
-        }
-    },
-    updateFill: function(b) {
-        var a = this.getSprites()[0];
-        if (a && a.attr.fillArea !== b) {
-            a.setAttributes({
-                fillArea: b
-            })
-        }
-    },
-    updateSmooth: function(a) {
-        var b = this.getSprites()[0];
-        if (b && b.attr.smooth !== a) {
-            b.setAttributes({
-                smooth: a
-            })
-        }
-    }
-});
-Ext.define("Ext.chart.series.sprite.PieSlice", {
-    extend: "Ext.draw.sprite.Sector",
-    mixins: {
-        markerHolder: "Ext.chart.MarkerHolder"
-    },
-    alias: "sprite.pieslice",
-    inheritableStatics: {
-        def: {
-            processors: {
-                doCallout: "bool",
-                label: "string",
-                rotateLabels: "bool",
-                labelOverflowPadding: "number",
-                renderer: "default"
-            },
-            defaults: {
-                doCallout: true,
-                rotateLabels: true,
-                label: "",
-                labelOverflowPadding: 10,
-                renderer: null
-            }
-        }
-    },
-    config: {
-        rendererData: null,
-        rendererIndex: 0,
-        series: null
-    },
-    setGradientBBox: function(q, k) {
-        var j = this,
-            i = j.attr,
-            g = (i.fillStyle && i.fillStyle.isGradient) || (i.strokeStyle && i.strokeStyle.isGradient);
-        if (g && !i.constrainGradients) {
-            var b = j.getMidAngle(),
-                d = i.margin,
-                e = i.centerX,
-                c = i.centerY,
-                a = i.endRho,
-                l = i.matrix,
-                o = l.getScaleX(),
-                n = l.getScaleY(),
-                m = o * a,
-                f = n * a,
-                p = {
-                    width: m + m,
-                    height: f + f
-                };
-            if (d) {
-                e += d * Math.cos(b);
-                c += d * Math.sin(b)
-            }
-            p.x = l.x(e, c) - m;
-            p.y = l.y(e, c) - f;
-            q.setGradientBBox(p)
-        } else {
-            j.callParent([q, k])
-        }
-    },
-    render: function(b, c, g, f) {
-        var e = this,
-            a = e.attr,
-            h = {},
-            d;
-        if (a.renderer) {
-            h = {
-                type: "sector",
-                text: a.text,
-                centerX: a.centerX,
-                centerY: a.centerY,
-                margin: a.margin,
-                startAngle: Math.min(a.startAngle, a.endAngle),
-                endAngle: Math.max(a.startAngle, a.endAngle),
-                startRho: Math.min(a.startRho, a.endRho),
-                endRho: Math.max(a.startRho, a.endRho)
-            };
-            d = Ext.callback(a.renderer, null, [e, h, e.rendererData, e.rendererIndex], 0, e.getSeries());
-            e.setAttributes(d);
-            e.useAttributes(c, g)
-        }
-        e.callParent([b, c, g, f]);
-        if (a.label && e.getMarker("labels")) {
-            e.placeLabel()
-        }
-    },
-    placeLabel: function() {
-        var z = this,
-            s = z.attr,
-            r = s.attributeId,
-            t = Math.min(s.startAngle, s.endAngle),
-            p = Math.max(s.startAngle, s.endAngle),
-            k = (t + p) * 0.5,
-            n = s.margin,
-            h = s.centerX,
-            g = s.centerY,
-            f = Math.sin(k),
-            c = Math.cos(k),
-            v = Math.min(s.startRho, s.endRho) + n,
-            m = Math.max(s.startRho, s.endRho) + n,
-            l = (v + m) * 0.5,
-            b = z.surfaceMatrix,
-            o = z.labelCfg || (z.labelCfg = {}),
-            e = z.getMarker("labels"),
-            d = e.getTemplate(),
-            a = d.getCalloutLine(),
-            q = a && a.length || 40,
-            u, j, i, A, w;
-        b.appendMatrix(s.matrix);
-        o.text = s.label;
-        j = h + c * l;
-        i = g + f * l;
-        o.x = b.x(j, i);
-        o.y = b.y(j, i);
-        j = h + c * m;
-        i = g + f * m;
-        o.calloutStartX = b.x(j, i);
-        o.calloutStartY = b.y(j, i);
-        j = h + c * (m + q);
-        i = g + f * (m + q);
-        o.calloutPlaceX = b.x(j, i);
-        o.calloutPlaceY = b.y(j, i);
-        if (!s.rotateLabels) {
-            o.rotationRads = 0
-        } else {
-            switch (d.attr.orientation) {
-                case "horizontal":
-                    o.rotationRads = k + Math.atan2(b.y(1, 0) - b.y(0, 0), b.x(1, 0) - b.x(0, 0)) + Math.PI / 2;
-                    break;
-                case "vertical":
-                    o.rotationRads = k + Math.atan2(b.y(1, 0) - b.y(0, 0), b.x(1, 0) - b.x(0, 0));
-                    break
-            }
-        }
-        o.calloutColor = (a && a.color) || z.attr.fillStyle;
-        if (a) {
-            if (a.width) {
-                o.calloutWidth = a.width
-            }
-        } else {
-            o.calloutHasLine = false
-        }
-        o.globalAlpha = s.globalAlpha * s.fillOpacity;
-        o.hidden = (s.startAngle == s.endAngle);
-        if (d.attr.renderer) {
-            w = [z.attr.label, e, o, z.rendererData, z.rendererIndex];
-            A = Ext.callback(d.attr.renderer, null, w, 0, z.getSeries());
-            if (typeof A === "string") {
-                o.text = A
-            } else {
-                Ext.apply(o, A)
-            }
-        }
-        z.putMarker("labels", o, r);
-        u = z.getMarkerBBox("labels", r, true);
-        if (u) {
-            if (s.doCallout) {
-                if (d.attr.display === "outside") {
-                    z.putMarker("labels", {
-                        callout: 1
-                    }, r)
-                } else {
-                    if (d.attr.display === "inside") {
-                        z.putMarker("labels", {
-                            callout: 0
-                        }, r)
-                    } else {
-                        z.putMarker("labels", {
-                            callout: 1 - z.sliceContainsLabel(s, u)
-                        }, r)
-                    }
-                }
-            } else {
-                z.putMarker("labels", {
-                    globalAlpha: z.sliceContainsLabel(s, u)
-                }, r)
-            }
-        }
-    },
-    sliceContainsLabel: function(d, f) {
-        var e = d.labelOverflowPadding,
-            h = (d.endRho + d.startRho) / 2,
-            g = h + (f.width + e) / 2,
-            i = h - (f.width + e) / 2,
-            j, c, b, a;
-        if (e < 0) {
-            return 1
-        }
-        if (f.width + e * 2 > (d.endRho - d.startRho)) {
-            return 0
-        }
-        c = Math.sqrt(d.endRho * d.endRho - g * g);
-        b = Math.sqrt(d.endRho * d.endRho - i * i);
-        j = Math.abs(d.endAngle - d.startAngle);
-        a = (j > Math.PI / 2 ? i : Math.abs(Math.tan(j / 2)) * i);
-        if (f.height + e * 2 > Math.min(c, b, a) * 2) {
-            return 0
-        }
-        return 1
-    }
-});
-Ext.define("Ext.chart.series.Pie", {
-    extend: "Ext.chart.series.Polar",
-    requires: ["Ext.chart.series.sprite.PieSlice"],
-    type: "pie",
-    alias: "series.pie",
-    seriesType: "pieslice",
-    config: {
-        donut: 0,
-        rotation: 0,
-        clockwise: true,
-        totalAngle: 2 * Math.PI,
-        hidden: [],
-        radiusFactor: 100,
-        highlightCfg: {
-            margin: 20
-        },
-        style: {}
-    },
-    directions: ["X"],
-    applyLabel: function(a, b) {
-        if (Ext.isObject(a) && !Ext.isString(a.orientation)) {
-            Ext.apply(a = Ext.Object.chain(a), {
-                orientation: "vertical"
-            })
-        }
-        return this.callParent([a, b])
-    },
-    updateLabelData: function() {
-        var h = this,
-            j = h.getStore(),
-            g = j.getData().items,
-            e = h.getSprites(),
-            a = h.getLabel().getTemplate().getField(),
-            d = h.getHidden(),
-            b, f, c, k;
-        if (e.length && a) {
-            c = [];
-            for (b = 0, f = g.length; b < f; b++) {
-                c.push(g[b].get(a))
-            }
-            for (b = 0, f = e.length; b < f; b++) {
-                k = e[b];
-                k.setAttributes({
-                    label: c[b]
-                });
-                k.putMarker("labels", {
-                    hidden: d[b]
-                }, k.attr.attributeId)
-            }
-        }
-    },
-    coordinateX: function() {
-        var t = this,
-            f = t.getStore(),
-            q = f.getData().items,
-            c = q.length,
-            b = t.getXField(),
-            e = t.getYField(),
-            l, a = 0,
-            m, k, s = 0,
-            o = t.getHidden(),
-            d = [],
-            p, g = 0,
-            h = t.getTotalAngle(),
-            r = t.getClockwise() ? 1 : -1,
-            j = t.getSprites(),
-            n;
-        if (!j) {
-            return
-        }
-        for (p = 0; p < c; p++) {
-            l = Math.abs(Number(q[p].get(b))) || 0;
-            k = e && Math.abs(Number(q[p].get(e))) || 0;
-            if (!o[p]) {
-                a += l;
-                if (k > s) {
-                    s = k
-                }
-            }
-            d[p] = a;
-            if (p >= o.length) {
-                o[p] = false
-            }
-        }
-        o.length = c;
-        t.maxY = s;
-        if (a !== 0) {
-            m = h / a
-        }
-        for (p = 0; p < c; p++) {
-            j[p].setAttributes({
-                startAngle: g,
-                endAngle: g = (m ? r * d[p] * m : 0),
-                globalAlpha: 1
-            })
-        }
-        if (c < t.sprites.length) {
-            for (p = c; p < t.sprites.length; p++) {
-                n = t.sprites[p];
-                n.getMarker("labels").clear(n.getId());
-                n.releaseMarker("labels");
-                n.destroy()
-            }
-            t.sprites.length = c
-        }
-        for (p = c; p < t.sprites.length; p++) {
-            j[p].setAttributes({
-                startAngle: h,
-                endAngle: h,
-                globalAlpha: 0
-            })
-        }
-        t.getChart().refreshLegendStore()
-    },
-    updateCenter: function(a) {
-        this.setStyle({
-            translationX: a[0] + this.getOffsetX(),
-            translationY: a[1] + this.getOffsetY()
-        });
-        this.doUpdateStyles()
-    },
-    updateRadius: function(a) {
-        this.setStyle({
-            startRho: a * this.getDonut() * 0.01,
-            endRho: a * this.getRadiusFactor() * 0.01
-        });
-        this.doUpdateStyles()
-    },
-    getStyleByIndex: function(c) {
-        var g = this,
-            j = g.getStore(),
-            k = j.getAt(c),
-            f = g.getYField(),
-            d = g.getRadius(),
-            a = {},
-            e, b, h;
-        if (k) {
-            h = f && Math.abs(Number(k.get(f))) || 0;
-            e = d * g.getDonut() * 0.01;
-            b = d * g.getRadiusFactor() * 0.01;
-            a = g.callParent([c]);
-            a.startRho = e;
-            a.endRho = g.maxY ? (e + (b - e) * h / g.maxY) : b
-        }
-        return a
-    },
-    updateDonut: function(b) {
-        var a = this.getRadius();
-        this.setStyle({
-            startRho: a * b * 0.01,
-            endRho: a * this.getRadiusFactor() * 0.01
-        });
-        this.doUpdateStyles()
-    },
-    rotationOffset: -Math.PI / 2,
-    updateRotation: function(a) {
-        this.setStyle({
-            rotationRads: a + this.rotationOffset
-        });
-        this.doUpdateStyles()
-    },
-    updateTotalAngle: function(a) {
-        this.processData()
-    },
-    getSprites: function() {
-        var k = this,
-            h = k.getChart(),
-            n = k.getStore();
-        if (!h || !n) {
-            return []
-        }
-        k.getColors();
-        k.getSubStyle();
-        var j = n.getData().items,
-            b = j.length,
-            d = k.getAnimation() || h && h.getAnimation(),
-            g = k.sprites,
-            o, l = 0,
-            f, e, c = false,
-            m = k.getLabel(),
-            a = m.getTemplate();
-        f = {
-            store: n,
-            field: k.getXField(),
-            angleField: k.getXField(),
-            radiusField: k.getYField(),
-            series: k
-        };
-        for (e = 0; e < b; e++) {
-            o = g[e];
-            if (!o) {
-                o = k.createSprite();
-                if (k.getHighlight()) {
-                    o.config.highlight = k.getHighlight();
-                    o.addModifier("highlight", true)
-                }
-                if (a.getField()) {
-                    a.setAttributes({
-                        labelOverflowPadding: k.getLabelOverflowPadding()
-                    });
-                    a.fx.setCustomDurations({
-                        callout: 200
-                    })
-                }
-                o.setAttributes(k.getStyleByIndex(e));
-                o.rendererData = f;
-                o.rendererIndex = l++;
-                c = true
-            }
-            o.setAnimation(d)
-        }
-        if (c) {
-            k.doUpdateStyles()
-        }
-        return k.sprites
-    },
-    betweenAngle: function(d, f, c) {
-        var e = Math.PI * 2,
-            g = this.rotationOffset;
-        if (!this.getClockwise()) {
-            d *= -1;
-            f *= -1;
-            c *= -1;
-            f -= g;
-            c -= g
-        } else {
-            f += g;
-            c += g
-        }
-        d -= f;
-        c -= f;
-        d %= e;
-        c %= e;
-        d += e;
-        c += e;
-        d %= e;
-        c %= e;
-        return d < c || c === 0
-    },
-    getItemForAngle: function(a) {
-        var h = this,
-            f = h.getSprites(),
-            d;
-        a %= Math.PI * 2;
-        while (a < 0) {
-            a += Math.PI * 2
-        }
-        if (f) {
-            var j = h.getStore(),
-                g = j.getData().items,
-                c = h.getHidden(),
-                b = 0,
-                e = j.getCount();
-            for (; b < e; b++) {
-                if (!c[b]) {
-                    d = f[b].attr;
-                    if (d.startAngle <= a && d.endAngle >= a) {
-                        return {
-                            series: h,
-                            sprite: f[b],
-                            index: b,
-                            record: g[b],
-                            field: h.getXField()
-                        }
-                    }
-                }
-            }
-        }
-        return null
-    },
-    getItemForPoint: function(f, e) {
-        var t = this,
-            c = t.getSprites();
-        if (c) {
-            var s = t.getCenter(),
-                q = t.getOffsetX(),
-                p = t.getOffsetY(),
-                j = f - s[0] + q,
-                h = e - s[1] + p,
-                b = t.getStore(),
-                g = t.getDonut(),
-                o = b.getData().items,
-                r = Math.atan2(h, j) - t.getRotation(),
-                a = Math.sqrt(j * j + h * h),
-                l = t.getRadius() * g * 0.01,
-                m = t.getHidden(),
-                n, d, k;
-            for (n = 0, d = o.length; n < d; n++) {
-                if (!m[n]) {
-                    k = c[n].attr;
-                    if (a >= l + k.margin && a <= k.endRho + k.margin) {
-                        if (t.betweenAngle(r, k.startAngle, k.endAngle)) {
-                            return {
-                                series: t,
-                                sprite: c[n],
-                                index: n,
-                                record: o[n],
-                                field: t.getXField()
-                            }
-                        }
-                    }
-                }
-            }
-            return null
-        }
-    },
-    provideLegendInfo: function(f) {
-        var h = this,
-            j = h.getStore();
-        if (j) {
-            var g = j.getData().items,
-                b = h.getLabel().getTemplate().getField(),
-                c = h.getXField(),
-                e = h.getHidden(),
-                d, a, k;
-            for (d = 0; d < g.length; d++) {
-                a = h.getStyleByIndex(d);
-                k = a.fillStyle;
-                if (Ext.isObject(k)) {
-                    k = k.stops && k.stops[0].color
-                }
-                f.push({
-                    name: b ? String(g[d].get(b)) : c + " " + d,
-                    mark: k || a.strokeStyle || "black",
-                    disabled: e[d],
-                    series: h.getId(),
-                    index: d
-                })
-            }
-        }
-    }
-});
-Ext.define("Ext.chart.series.sprite.Pie3DPart", {
-    extend: "Ext.draw.sprite.Path",
-    mixins: {
-        markerHolder: "Ext.chart.MarkerHolder"
-    },
-    alias: "sprite.pie3dPart",
-    inheritableStatics: {
-        def: {
-            processors: {
-                centerX: "number",
-                centerY: "number",
-                startAngle: "number",
-                endAngle: "number",
-                startRho: "number",
-                endRho: "number",
-                margin: "number",
-                thickness: "number",
-                bevelWidth: "number",
-                distortion: "number",
-                baseColor: "color",
-                colorSpread: "number",
-                baseRotation: "number",
-                part: "enums(top,bottom,start,end,innerFront,innerBack,outerFront,outerBack)",
-                label: "string"
-            },
-            aliases: {
-                rho: "endRho"
-            },
-            triggers: {
-                centerX: "path,bbox",
-                centerY: "path,bbox",
-                startAngle: "path,partZIndex",
-                endAngle: "path,partZIndex",
-                startRho: "path",
-                endRho: "path,bbox",
-                margin: "path,bbox",
-                thickness: "path",
-                distortion: "path",
-                baseRotation: "path,partZIndex",
-                baseColor: "partZIndex,partColor",
-                colorSpread: "partColor",
-                part: "path,partZIndex",
-                globalAlpha: "canvas,alpha"
-            },
-            defaults: {
-                centerX: 0,
-                centerY: 0,
-                startAngle: Math.PI * 2,
-                endAngle: Math.PI * 2,
-                startRho: 0,
-                endRho: 150,
-                margin: 0,
-                thickness: 35,
-                distortion: 0.5,
-                baseRotation: 0,
-                baseColor: "white",
-                colorSpread: 1,
-                miterLimit: 1,
-                bevelWidth: 5,
-                strokeOpacity: 0,
-                part: "top",
-                label: ""
-            },
-            updaters: {
-                alpha: "alphaUpdater",
-                partColor: "partColorUpdater",
-                partZIndex: "partZIndexUpdater"
-            }
-        }
-    },
-    bevelParams: [],
-    constructor: function(a) {
-        this.callParent([a]);
-        this.bevelGradient = new Ext.draw.gradient.Linear({
-            stops: [{
-                offset: 0,
-                color: "rgba(255,255,255,0)"
-            }, {
-                offset: 0.7,
-                color: "rgba(255,255,255,0.6)"
-            }, {
-                offset: 1,
-                color: "rgba(255,255,255,0)"
-            }]
-        })
-    },
-    alphaUpdater: function(a) {
-        var d = this,
-            c = a.globalAlpha,
-            b = d.oldOpacity;
-        if (c !== b && (c === 1 || b === 1)) {
-            d.scheduleUpdater(a, "path", ["globalAlpha"]);
-            d.oldOpacity = c
-        }
-    },
-    partColorUpdater: function(a) {
-        var d = Ext.draw.Color.fly(a.baseColor),
-            b = d.toString(),
-            e = a.colorSpread,
-            c;
-        switch (a.part) {
-            case "top":
-                c = new Ext.draw.gradient.Radial({
-                    start: {
-                        x: 0,
-                        y: 0,
-                        r: 0
-                    },
-                    end: {
-                        x: 0,
-                        y: 0,
-                        r: 1
-                    },
-                    stops: [{
-                        offset: 0,
-                        color: d.createLighter(0.1 * e)
-                    }, {
-                        offset: 1,
-                        color: d.createDarker(0.1 * e)
-                    }]
-                });
-                break;
-            case "bottom":
-                c = new Ext.draw.gradient.Radial({
-                    start: {
-                        x: 0,
-                        y: 0,
-                        r: 0
-                    },
-                    end: {
-                        x: 0,
-                        y: 0,
-                        r: 1
-                    },
-                    stops: [{
-                        offset: 0,
-                        color: d.createDarker(0.2 * e)
-                    }, {
-                        offset: 1,
-                        color: d.toString()
-                    }]
-                });
-                break;
-            case "outerFront":
-            case "outerBack":
-                c = new Ext.draw.gradient.Linear({
-                    stops: [{
-                        offset: 0,
-                        color: d.createDarker(0.15 * e).toString()
-                    }, {
-                        offset: 0.3,
-                        color: b
-                    }, {
-                        offset: 0.8,
-                        color: d.createLighter(0.2 * e).toString()
-                    }, {
-                        offset: 1,
-                        color: d.createDarker(0.25 * e).toString()
-                    }]
-                });
-                break;
-            case "start":
-                c = new Ext.draw.gradient.Linear({
-                    stops: [{
-                        offset: 0,
-                        color: d.createDarker(0.1 * e).toString()
-                    }, {
-                        offset: 1,
-                        color: d.createLighter(0.2 * e).toString()
-                    }]
-                });
-                break;
-            case "end":
-                c = new Ext.draw.gradient.Linear({
-                    stops: [{
-                        offset: 0,
-                        color: d.createDarker(0.1 * e).toString()
-                    }, {
-                        offset: 1,
-                        color: d.createLighter(0.2 * e).toString()
-                    }]
-                });
-                break;
-            case "innerFront":
-            case "innerBack":
-                c = new Ext.draw.gradient.Linear({
-                    stops: [{
-                        offset: 0,
-                        color: d.createDarker(0.1 * e).toString()
-                    }, {
-                        offset: 0.2,
-                        color: d.createLighter(0.2 * e).toString()
-                    }, {
-                        offset: 0.7,
-                        color: b
-                    }, {
-                        offset: 1,
-                        color: d.createDarker(0.1 * e).toString()
-                    }]
-                });
-                break
-        }
-        a.fillStyle = c;
-        a.canvasAttributes.fillStyle = c
-    },
-    partZIndexUpdater: function(a) {
-        var c = Ext.draw.sprite.AttributeParser.angle,
-            e = a.baseRotation,
-            d = a.startAngle,
-            b = a.endAngle,
-            f;
-        switch (a.part) {
-            case "top":
-                a.zIndex = 5;
-                break;
-            case "outerFront":
-                d = c(d + e);
-                b = c(b + e);
-                if (d >= 0 && b < 0) {
-                    f = Math.sin(d)
-                } else {
-                    if (d <= 0 && b > 0) {
-                        f = Math.sin(b)
-                    } else {
-                        if (d >= 0 && b > 0) {
-                            if (d > b) {
-                                f = 0
-                            } else {
-                                f = Math.max(Math.sin(d), Math.sin(b))
-                            }
-                        } else {
-                            f = 1
-                        }
-                    }
-                }
-                a.zIndex = 4 + f;
-                break;
-            case "outerBack":
-                a.zIndex = 1;
-                break;
-            case "start":
-                a.zIndex = 4 + Math.sin(c(d + e));
-                break;
-            case "end":
-                a.zIndex = 4 + Math.sin(c(b + e));
-                break;
-            case "innerFront":
-                a.zIndex = 2;
-                break;
-            case "innerBack":
-                a.zIndex = 4 + Math.sin(c((d + b) / 2 + e));
-                break;
-            case "bottom":
-                a.zIndex = 0;
-                break
-        }
-        a.dirtyZIndex = true
-    },
-    updatePlainBBox: function(k) {
-        var f = this.attr,
-            a = f.part,
-            b = f.baseRotation,
-            e = f.centerX,
-            d = f.centerY,
-            j, c, i, h, g, l;
-        if (a === "start") {
-            c = f.startAngle + b
-        } else {
-            if (a === "end") {
-                c = f.endAngle + b
-            }
-        }
-        if (Ext.isNumber(c)) {
-            g = Math.sin(c);
-            l = Math.cos(c);
-            i = Math.min(e + l * f.startRho, e + l * f.endRho);
-            h = d + g * f.startRho * f.distortion;
-            k.x = i;
-            k.y = h;
-            k.width = l * (f.endRho - f.startRho);
-            k.height = f.thickness + g * (f.endRho - f.startRho) * 2;
-            return
-        }
-        if (a === "innerFront" || a === "innerBack") {
-            j = f.startRho
-        } else {
-            j = f.endRho
-        }
-        k.width = j * 2;
-        k.height = j * f.distortion * 2 + f.thickness;
-        k.x = f.centerX - j;
-        k.y = f.centerY - j * f.distortion
-    },
-    updateTransformedBBox: function(a) {
-        if (this.attr.part === "start" || this.attr.part === "end") {
-            return this.callParent(arguments)
-        }
-        return this.updatePlainBBox(a)
-    },
-    updatePath: function(a) {
-        if (!this.attr.globalAlpha) {
-            return
-        }
-        if (this.attr.endAngle < this.attr.startAngle) {
-            return
-        }
-        this[this.attr.part + "Renderer"](a)
-    },
-    render: function(b, c) {
-        var d = this,
-            a = d.attr;
-        if (!a.globalAlpha) {
-            return
-        }
-        d.callParent([b, c]);
-        d.bevelRenderer(b, c);
-        if (a.label && d.getMarker("labels")) {
-            d.placeLabel()
-        }
-    },
-    placeLabel: function() {
-        var z = this,
-            u = z.attr,
-            t = u.attributeId,
-            p = u.margin,
-            c = u.distortion,
-            i = u.centerX,
-            h = u.centerY,
-            j = u.baseRotation,
-            v = u.startAngle + j,
-            r = u.endAngle + j,
-            m = (v + r) / 2,
-            w = u.startRho + p,
-            o = u.endRho + p,
-            n = (w + o) / 2,
-            a = Math.sin(m),
-            b = Math.cos(m),
-            e = z.surfaceMatrix,
-            g = z.getMarker("labels"),
-            f = g.getTemplate(),
-            d = f.getCalloutLine(),
-            s = d && d.length || 40,
-            q = {},
-            l, k;
-        e.appendMatrix(u.matrix);
-        q.text = u.label;
-        l = i + b * n;
-        k = h + a * n * c;
-        q.x = e.x(l, k);
-        q.y = e.y(l, k);
-        l = i + b * o;
-        k = h + a * o * c;
-        q.calloutStartX = e.x(l, k);
-        q.calloutStartY = e.y(l, k);
-        l = i + b * (o + s);
-        k = h + a * (o + s) * c;
-        q.calloutPlaceX = e.x(l, k);
-        q.calloutPlaceY = e.y(l, k);
-        q.calloutWidth = 2;
-        z.putMarker("labels", q, t);
-        z.putMarker("labels", {
-            callout: 1
-        }, t)
-    },
-    bevelRenderer: function(b, c) {
-        var f = this,
-            a = f.attr,
-            e = a.bevelWidth,
-            g = f.bevelParams,
-            d;
-        for (d = 0; d < g.length; d++) {
-            c.beginPath();
-            c.ellipse.apply(c, g[d]);
-            c.save();
-            c.lineWidth = e;
-            c.strokeOpacity = e ? 1 : 0;
-            c.strokeGradient = f.bevelGradient;
-            c.stroke(a);
-            c.restore()
-        }
-    },
-    lidRenderer: function(o, m) {
-        var k = this.attr,
-            g = k.margin,
-            c = k.distortion,
-            i = k.centerX,
-            h = k.centerY,
-            f = k.baseRotation,
-            j = k.startAngle + f,
-            e = k.endAngle + f,
-            d = (j + e) / 2,
-            l = k.startRho,
-            b = k.endRho,
-            n = Math.sin(e),
-            a = Math.cos(e);
-        i += Math.cos(d) * g;
-        h += Math.sin(d) * g * c;
-        o.ellipse(i, h + m, l, l * c, 0, j, e, false);
-        o.lineTo(i + a * b, h + m + n * b * c);
-        o.ellipse(i, h + m, b, b * c, 0, e, j, true);
-        o.closePath()
-    },
-    topRenderer: function(a) {
-        this.lidRenderer(a, 0)
-    },
-    bottomRenderer: function(b) {
-        var a = this.attr;
-        if (a.globalAlpha < 1 || a.shadowColor !== Ext.draw.Color.RGBA_NONE) {
-            this.lidRenderer(b, a.thickness)
-        }
-    },
-    sideRenderer: function(l, s) {
-        var o = this.attr,
-            k = o.margin,
-            g = o.centerX,
-            f = o.centerY,
-            e = o.distortion,
-            h = o.baseRotation,
-            p = o.startAngle + h,
-            m = o.endAngle + h,
-            a = o.thickness,
-            q = o.startRho,
-            j = o.endRho,
-            r = (s === "start" && p) || (s === "end" && m),
-            b = Math.sin(r),
-            d = Math.cos(r),
-            c = o.globalAlpha < 1,
-            n = s === "start" && d < 0 || s === "end" && d > 0 || c,
-            i;
-        if (n) {
-            i = (p + m) / 2;
-            g += Math.cos(i) * k;
-            f += Math.sin(i) * k * e;
-            l.moveTo(g + d * q, f + b * q * e);
-            l.lineTo(g + d * j, f + b * j * e);
-            l.lineTo(g + d * j, f + b * j * e + a);
-            l.lineTo(g + d * q, f + b * q * e + a);
-            l.closePath()
-        }
-    },
-    startRenderer: function(a) {
-        this.sideRenderer(a, "start")
-    },
-    endRenderer: function(a) {
-        this.sideRenderer(a, "end")
-    },
-    rimRenderer: function(q, e, o, j) {
-        var w = this,
-            s = w.attr,
-            p = s.margin,
-            h = s.centerX,
-            g = s.centerY,
-            d = s.distortion,
-            i = s.baseRotation,
-            t = Ext.draw.sprite.AttributeParser.angle,
-            u = s.startAngle + i,
-            r = s.endAngle + i,
-            k = t((u + r) / 2),
-            a = s.thickness,
-            b = s.globalAlpha < 1,
-            c, n, v;
-        w.bevelParams = [];
-        u = t(u);
-        r = t(r);
-        h += Math.cos(k) * p;
-        g += Math.sin(k) * p * d;
-        c = u >= 0 && r >= 0;
-        n = u <= 0 && r <= 0;
-
-        function l() {
-            q.ellipse(h, g + a, e, e * d, 0, Math.PI, u, true);
-            q.lineTo(h + Math.cos(u) * e, g + Math.sin(u) * e * d);
-            v = [h, g, e, e * d, 0, u, Math.PI, false];
-            if (!o) {
-                w.bevelParams.push(v)
-            }
-            q.ellipse.apply(q, v);
-            q.closePath()
-        }
-
-        function f() {
-            q.ellipse(h, g + a, e, e * d, 0, 0, r, false);
-            q.lineTo(h + Math.cos(r) * e, g + Math.sin(r) * e * d);
-            v = [h, g, e, e * d, 0, r, 0, true];
-            if (!o) {
-                w.bevelParams.push(v)
-            }
-            q.ellipse.apply(q, v);
-            q.closePath()
-        }
-
-        function x() {
-            q.ellipse(h, g + a, e, e * d, 0, Math.PI, r, false);
-            q.lineTo(h + Math.cos(r) * e, g + Math.sin(r) * e * d);
-            v = [h, g, e, e * d, 0, r, Math.PI, true];
-            if (o) {
-                w.bevelParams.push(v)
-            }
-            q.ellipse.apply(q, v);
-            q.closePath()
-        }
-
-        function m() {
-            q.ellipse(h, g + a, e, e * d, 0, u, 0, false);
-            q.lineTo(h + e, g);
-            v = [h, g, e, e * d, 0, 0, u, true];
-            if (o) {
-                w.bevelParams.push(v)
-            }
-            q.ellipse.apply(q, v);
-            q.closePath()
-        }
-        if (j) {
-            if (!o || b) {
-                if (u >= 0 && r < 0) {
-                    l()
-                } else {
-                    if (u <= 0 && r > 0) {
-                        f()
-                    } else {
-                        if (u <= 0 && r < 0) {
-                            if (u > r) {
-                                q.ellipse(h, g + a, e, e * d, 0, 0, Math.PI, false);
-                                q.lineTo(h - e, g);
-                                v = [h, g, e, e * d, 0, Math.PI, 0, true];
-                                if (!o) {
-                                    w.bevelParams.push(v)
-                                }
-                                q.ellipse.apply(q, v);
-                                q.closePath()
-                            }
-                        } else {
-                            if (u > r) {
-                                l();
-                                f()
-                            } else {
-                                v = [h, g, e, e * d, 0, u, r, false];
-                                if (c && !o || n && o) {
-                                    w.bevelParams.push(v)
-                                }
-                                q.ellipse.apply(q, v);
-                                q.lineTo(h + Math.cos(r) * e, g + Math.sin(r) * e * d + a);
-                                q.ellipse(h, g + a, e, e * d, 0, r, u, true);
-                                q.closePath()
-                            }
-                        }
-                    }
-                }
-            }
-        } else {
-            if (o || b) {
-                if (u >= 0 && r < 0) {
-                    x()
-                } else {
-                    if (u <= 0 && r > 0) {
-                        m()
-                    } else {
-                        if (u <= 0 && r < 0) {
-                            if (u > r) {
-                                x();
-                                m()
-                            } else {
-                                q.ellipse(h, g + a, e, e * d, 0, u, r, false);
-                                q.lineTo(h + Math.cos(r) * e, g + Math.sin(r) * e * d);
-                                v = [h, g, e, e * d, 0, r, u, true];
-                                if (o) {
-                                    w.bevelParams.push(v)
-                                }
-                                q.ellipse.apply(q, v);
-                                q.closePath()
-                            }
-                        } else {
-                            if (u > r) {
-                                q.ellipse(h, g + a, e, e * d, 0, -Math.PI, 0, false);
-                                q.lineTo(h + e, g);
-                                v = [h, g, e, e * d, 0, 0, -Math.PI, true];
-                                if (o) {
-                                    w.bevelParams.push(v)
-                                }
-                                q.ellipse.apply(q, v);
-                                q.closePath()
-                            }
-                        }
-                    }
-                }
-            }
-        }
-    },
-    innerFrontRenderer: function(a) {
-        this.rimRenderer(a, this.attr.startRho, true, true)
-    },
-    innerBackRenderer: function(a) {
-        this.rimRenderer(a, this.attr.startRho, true, false)
-    },
-    outerFrontRenderer: function(a) {
-        this.rimRenderer(a, this.attr.endRho, false, true)
-    },
-    outerBackRenderer: function(a) {
-        this.rimRenderer(a, this.attr.endRho, false, false)
-    }
-});
-Ext.define("Ext.draw.PathUtil", function() {
-    var a = Math.abs,
-        c = Math.pow,
-        e = Math.cos,
-        b = Math.acos,
-        d = Math.sqrt,
-        f = Math.PI;
-    return {
-        singleton: true,
-        requires: ["Ext.draw.overrides.Path", "Ext.draw.overrides.sprite.Path", "Ext.draw.overrides.sprite.Instancing", "Ext.draw.overrides.Surface"],
-        cubicRoots: function(m) {
-            var z = m[0],
-                x = m[1],
-                w = m[2],
-                v = m[3];
-            if (z === 0) {
-                return this.quadraticRoots(x, w, v)
-            }
-            var s = x / z,
-                r = w / z,
-                q = v / z,
-                k = (3 * r - c(s, 2)) / 9,
-                j = (9 * s * r - 27 * q - 2 * c(s, 3)) / 54,
-                p = c(k, 3) + c(j, 2),
-                n = [],
-                h, g, o, l, u, y = Ext.Number.sign;
-            if (p >= 0) {
-                h = y(j + d(p)) * c(a(j + d(p)), 1 / 3);
-                g = y(j - d(p)) * c(a(j - d(p)), 1 / 3);
-                n[0] = -s / 3 + (h + g);
-                n[1] = -s / 3 - (h + g) / 2;
-                n[2] = n[1];
-                o = a(d(3) * (h - g) / 2);
-                if (o !== 0) {
-                    n[1] = -1;
-                    n[2] = -1
-                }
-            } else {
-                l = b(j / d(-c(k, 3)));
-                n[0] = 2 * d(-k) * e(l / 3) - s / 3;
-                n[1] = 2 * d(-k) * e((l + 2 * f) / 3) - s / 3;
-                n[2] = 2 * d(-k) * e((l + 4 * f) / 3) - s / 3
-            }
-            for (u = 0; u < 3; u++) {
-                if (n[u] < 0 || n[u] > 1) {
-                    n[u] = -1
-                }
-            }
-            return n
-        },
-        quadraticRoots: function(h, g, n) {
-            var m, l, k, j;
-            if (h === 0) {
-                return this.linearRoot(g, n)
-            }
-            m = g * g - 4 * h * n;
-            if (m === 0) {
-                k = [-g / (2 * h)]
-            } else {
-                if (m > 0) {
-                    l = d(m);
-                    k = [(-g - l) / (2 * h), (-g + l) / (2 * h)]
-                } else {
-                    return []
-                }
-            }
-            for (j = 0; j < k.length; j++) {
-                if (k[j] < 0 || k[j] > 1) {
-                    k[j] = -1
-                }
-            }
-            return k
-        },
-        linearRoot: function(h, g) {
-            var i = -g / h;
-            if (h === 0 || i < 0 || i > 1) {
-                return []
-            }
-            return [i]
-        },
-        bezierCoeffs: function(h, g, k, j) {
-            var i = [];
-            i[0] = -h + 3 * g - 3 * k + j;
-            i[1] = 3 * h - 6 * g + 3 * k;
-            i[2] = -3 * h + 3 * g;
-            i[3] = h;
-            return i
-        },
-        cubicLineIntersections: function(I, G, F, E, l, k, j, h, M, p, K, n) {
-            var u = [],
-                N = [],
-                D = p - n,
-                z = K - M,
-                y = M * (n - p) - p * (K - M),
-                L = this.bezierCoeffs(I, G, F, E),
-                J = this.bezierCoeffs(l, k, j, h),
-                H, x, w, v, g, q, o, m;
-            u[0] = D * L[0] + z * J[0];
-            u[1] = D * L[1] + z * J[1];
-            u[2] = D * L[2] + z * J[2];
-            u[3] = D * L[3] + z * J[3] + y;
-            x = this.cubicRoots(u);
-            for (H = 0; H < x.length; H++) {
-                v = x[H];
-                if (v < 0 || v > 1) {
-                    continue
-                }
-                g = v * v;
-                q = g * v;
-                o = L[0] * q + L[1] * g + L[2] * v + L[3];
-                m = J[0] * q + J[1] * g + J[2] * v + J[3];
-                if ((K - M) !== 0) {
-                    w = (o - M) / (K - M)
-                } else {
-                    w = (m - p) / (n - p)
-                }
-                if (!(w < 0 || w > 1)) {
-                    N.push([o, m])
-                }
-            }
-            return N
-        },
-        splitCubic: function(g, q, p, o, m) {
-            var j = m * m,
-                n = m * j,
-                i = m - 1,
-                h = i * i,
-                k = i * h,
-                l = n * o - 3 * j * i * p + 3 * m * h * q - k * g;
-            return [
-                [g, m * q - i * g, j * p - 2 * m * i * q + h * g, l],
-                [l, j * o - 2 * m * i * p + h * q, m * o - i * p, o]
-            ]
-        },
-        cubicDimension: function(p, o, l, k) {
-            var j = 3 * (-p + 3 * (o - l) + k),
-                i = 6 * (p - 2 * o + l),
-                h = -3 * (p - o),
-                q, n, g = Math.min(p, k),
-                m = Math.max(p, k),
-                r;
-            if (j === 0) {
-                if (i === 0) {
-                    return [g, m]
-                } else {
-                    q = -h / i;
-                    if (0 < q && q < 1) {
-                        n = this.interpolateCubic(p, o, l, k, q);
-                        g = Math.min(g, n);
-                        m = Math.max(m, n)
-                    }
-                }
-            } else {
-                r = i * i - 4 * j * h;
-                if (r >= 0) {
-                    r = d(r);
-                    q = (r - i) / 2 / j;
-                    if (0 < q && q < 1) {
-                        n = this.interpolateCubic(p, o, l, k, q);
-                        g = Math.min(g, n);
-                        m = Math.max(m, n)
-                    }
-                    if (r > 0) {
-                        q -= r / j;
-                        if (0 < q && q < 1) {
-                            n = this.interpolateCubic(p, o, l, k, q);
-                            g = Math.min(g, n);
-                            m = Math.max(m, n)
-                        }
-                    }
-                }
-            }
-            return [g, m]
-        },
-        interpolateCubic: function(h, g, l, k, i) {
-            if (i === 0) {
-                return h
-            }
-            if (i === 1) {
-                return k
-            }
-            var j = (1 - i) / i;
-            return i * i * i * (k + j * (3 * l + j * (3 * g + j * h)))
-        },
-        cubicsIntersections: function(r, q, p, o, A, z, y, v, g, F, E, D, m, l, k, i) {
-            var C = this,
-                x = C.cubicDimension(r, q, p, o),
-                B = C.cubicDimension(A, z, y, v),
-                n = C.cubicDimension(g, F, E, D),
-                s = C.cubicDimension(m, l, k, i),
-                j, h, u, t, w = [];
-            if (x[0] > n[1] || x[1] < n[0] || B[0] > s[1] || B[1] < s[0]) {
-                return []
-            }
-            if (a(A - z) < 1 && a(y - v) < 1 && a(r - o) < 1 && a(q - p) < 1 && a(m - l) < 1 && a(k - i) < 1 && a(g - D) < 1 && a(F - E) < 1) {
-                return [
-                    [(r + o) * 0.5, (A + z) * 0.5]
-                ]
-            }
-            j = C.splitCubic(r, q, p, o, 0.5);
-            h = C.splitCubic(A, z, y, v, 0.5);
-            u = C.splitCubic(g, F, E, D, 0.5);
-            t = C.splitCubic(m, l, k, i, 0.5);
-            w.push.apply(w, C.cubicsIntersections.apply(C, j[0].concat(h[0], u[0], t[0])));
-            w.push.apply(w, C.cubicsIntersections.apply(C, j[0].concat(h[0], u[1], t[1])));
-            w.push.apply(w, C.cubicsIntersections.apply(C, j[1].concat(h[1], u[0], t[0])));
-            w.push.apply(w, C.cubicsIntersections.apply(C, j[1].concat(h[1], u[1], t[1])));
-            return w
-        },
-        linesIntersection: function(k, p, j, o, h, n, q, m) {
-            var l = (j - k) * (m - n) - (o - p) * (q - h),
-                i, g;
-            if (l === 0) {
-                return null
-            }
-            i = ((q - h) * (p - n) - (k - h) * (m - n)) / l;
-            g = ((j - k) * (p - n) - (o - p) * (k - h)) / l;
-            if (i >= 0 && i <= 1 && g >= 0 && g <= 1) {
-                return [k + i * (j - k), p + i * (o - p)]
-            }
-            return null
-        },
-        pointOnLine: function(j, m, h, l, g, n) {
-            var k, i;
-            if (a(h - j) < a(l - m)) {
-                i = j;
-                j = m;
-                m = i;
-                i = h;
-                h = l;
-                l = i;
-                i = g;
-                g = n;
-                n = i
-            }
-            k = (g - j) / (h - j);
-            if (k < 0 || k > 1) {
-                return false
-            }
-            return a(m + k * (l - m) - n) < 4
-        },
-        pointOnCubic: function(w, u, s, r, l, k, h, g, p, o) {
-            var C = this,
-                B = C.bezierCoeffs(w, u, s, r),
-                A = C.bezierCoeffs(l, k, h, g),
-                z, v, n, m, q;
-            B[3] -= p;
-            A[3] -= o;
-            n = C.cubicRoots(B);
-            m = C.cubicRoots(A);
-            for (z = 0; z < n.length; z++) {
-                q = n[z];
-                for (v = 0; v < m.length; v++) {
-                    if (q >= 0 && q <= 1 && a(q - m[v]) < 0.05) {
-                        return true
-                    }
-                }
-            }
-            return false
-        }
-    }
-});
-Ext.define("Ext.chart.series.Pie3D", {
-    extend: "Ext.chart.series.Polar",
-    requires: ["Ext.chart.series.sprite.Pie3DPart", "Ext.draw.PathUtil"],
-    type: "pie3d",
-    seriesType: "pie3d",
-    alias: "series.pie3d",
-    isPie3D: true,
-    config: {
-        rect: [0, 0, 0, 0],
-        thickness: 35,
-        distortion: 0.5,
-        donut: false,
-        hidden: [],
-        highlightCfg: {
-            margin: 20
-        },
-        shadow: false
-    },
-    rotationOffset: -Math.PI / 2,
-    setField: function(a) {
-        return this.setXField(a)
-    },
-    getField: function() {
-        return this.getXField()
-    },
-    updateRotation: function(a) {
-        this.setStyle({
-            baseRotation: a + this.rotationOffset
-        });
-        this.doUpdateStyles()
-    },
-    updateDistortion: function() {
-        this.setRadius()
-    },
-    updateThickness: function() {
-        this.setRadius()
-    },
-    updateColors: function(a) {
-        this.setSubStyle({
-            baseColor: a
-        })
-    },
-    applyShadow: function(a) {
-        if (a === true) {
-            a = {
-                shadowColor: "rgba(0,0,0,0.8)",
-                shadowBlur: 30
-            }
-        } else {
-            if (!Ext.isObject(a)) {
-                a = {
-                    shadowColor: Ext.draw.Color.RGBA_NONE
-                }
-            }
-        }
-        return a
-    },
-    updateShadow: function(g) {
-        var e = this,
-            f = e.getSprites(),
-            d = e.spritesPerSlice,
-            c = f && f.length,
-            b, a;
-        for (b = 1; b < c; b += d) {
-            a = f[b];
-            if (a.attr.part = "bottom") {
-                a.setAttributes(g)
-            }
-        }
-    },
-    getStyleByIndex: function(b) {
-        var d = this.callParent([b]),
-            c = this.getStyle(),
-            a = d.fillStyle || d.fill || d.color,
-            e = c.strokeStyle || c.stroke;
-        if (a) {
-            d.baseColor = a;
-            delete d.fillStyle;
-            delete d.fill;
-            delete d.color
-        }
-        if (e) {
-            d.strokeStyle = e
-        }
-        return d
-    },
-    doUpdateStyles: function() {
-        var g = this,
-            h = g.getSprites(),
-            f = g.spritesPerSlice,
-            e = h && h.length,
-            c = 0,
-            b = 0,
-            a, d;
-        for (; c < e; c += f, b++) {
-            d = g.getStyleByIndex(b);
-            for (a = 0; a < f; a++) {
-                h[c + a].setAttributes(d)
-            }
-        }
-    },
-    coordinateX: function() {
-        var w = this,
-            m = w.getChart(),
-            u = m && m.getAnimation(),
-            f = w.getStore(),
-            t = f.getData().items,
-            d = t.length,
-            b = w.getXField(),
-            p = w.getRotation(),
-            s = w.getHidden(),
-            n, c = 0,
-            h, e = [],
-            k = w.getSprites(),
-            a = k.length,
-            l = w.spritesPerSlice,
-            g = 0,
-            o = Math.PI * 2,
-            v = 1e-10,
-            r, q;
-        for (r = 0; r < d; r++) {
-            n = Math.abs(Number(t[r].get(b))) || 0;
-            if (!s[r]) {
-                c += n
-            }
-            e[r] = c;
-            if (r >= s.length) {
-                s[r] = false
-            }
-        }
-        s.length = d;
-        if (c === 0) {
-            return
-        }
-        h = 2 * Math.PI / c;
-        for (r = 0; r < d; r++) {
-            e[r] *= h
-        }
-        for (r = 0; r < a; r++) {
-            k[r].setAnimation(u)
-        }
-        for (r = 0; r < d; r++) {
-            for (q = 0; q < l; q++) {
-                k[r * l + q].setAttributes({
-                    startAngle: g,
-                    endAngle: e[r] - v,
-                    globalAlpha: 1,
-                    baseRotation: p
-                })
-            }
-            g = e[r]
-        }
-        for (r *= l; r < a; r++) {
-            k[r].setAnimation(u);
-            k[r].setAttributes({
-                startAngle: o,
-                endAngle: o,
-                globalAlpha: 0,
-                baseRotation: p
-            })
-        }
-    },
-    updateLabelData: function() {
-        var l = this,
-            m = l.getStore(),
-            k = m.getData().items,
-            h = l.getSprites(),
-            b = l.getLabel().getTemplate().getField(),
-            f = l.getHidden(),
-            a = l.spritesPerSlice,
-            d, c, g, e, n;
-        if (h.length && b) {
-            e = [];
-            for (d = 0, g = k.length; d < g; d++) {
-                e.push(k[d].get(b))
-            }
-            for (d = 0, c = 0, g = h.length; d < g; d += a, c++) {
-                n = h[d];
-                n.setAttributes({
-                    label: e[c]
-                });
-                n.putMarker("labels", {
-                    hidden: f[c]
-                }, n.attr.attributeId)
-            }
-        }
-    },
-    applyRadius: function() {
-        var f = this,
-            d = f.getChart(),
-            h = d.getInnerPadding(),
-            e = d.getMainRect() || [0, 0, 1, 1],
-            c = e[2] - h * 2,
-            a = e[3] - h * 2 - f.getThickness(),
-            g = c / 2,
-            b = g * f.getDistortion();
-        if (b > a / 2) {
-            return a / (f.getDistortion() * 2)
-        } else {
-            return g
-        }
-    },
-    getSprites: function() {
-        var y = this,
-            e = y.getStore();
-        if (!e) {
-            return []
-        }
-        var n = y.getChart(),
-            p = y.getSurface(),
-            t = e.getData().items,
-            l = y.spritesPerSlice,
-            a = t.length,
-            v = y.getAnimation() || n && n.getAnimation(),
-            x = y.getCenter(),
-            w = y.getOffsetX(),
-            u = y.getOffsetY(),
-            b = y.getRadius(),
-            q = y.getRotation(),
-            d = y.getHighlight(),
-            c = {
-                centerX: x[0] + w,
-                centerY: x[1] + u - y.getThickness() / 2,
-                endRho: b,
-                startRho: b * y.getDonut() / 100,
-                thickness: y.getThickness(),
-                distortion: y.getDistortion()
-            },
-            k = y.sprites,
-            h = y.getLabel(),
-            f = h.getTemplate(),
-            m, g, o, s, r;
-        for (s = 0; s < a; s++) {
-            g = Ext.apply({}, this.getStyleByIndex(s), c);
-            if (!k[s * l]) {
-                for (r = 0; r < y.partNames.length; r++) {
-                    o = p.add({
-                        type: "pie3dPart",
-                        part: y.partNames[r]
-                    });
-                    if (r === 0 && f.getField()) {
-                        o.bindMarker("labels", h)
-                    }
-                    o.fx.setDurationOn("baseRotation", q);
-                    if (d) {
-                        o.config.highlight = d;
-                        o.addModifier("highlight", true)
-                    }
-                    o.setAttributes(g);
-                    k.push(o)
-                }
-            } else {
-                m = k.slice(s * l, (s + 1) * l);
-                for (r = 0; r < m.length; r++) {
-                    o = m[r];
-                    if (v) {
-                        o.setAnimation(v)
-                    }
-                    o.setAttributes(g)
-                }
-            }
-        }
-        return k
-    },
-    betweenAngle: function(d, f, c) {
-        var e = Math.PI * 2,
-            g = this.rotationOffset;
-        f += g;
-        c += g;
-        d -= f;
-        c -= f;
-        d %= e;
-        c %= e;
-        d += e;
-        c += e;
-        d %= e;
-        c %= e;
-        return d < c || c === 0
-    },
-    getItemForPoint: function(k, j) {
-        var h = this,
-            g = h.getSprites();
-        if (g) {
-            var l = h.getStore(),
-                b = l.getData().items,
-                a = h.spritesPerSlice,
-                e = h.getHidden(),
-                c, f, m, d;
-            for (c = 0, f = b.length; c < f; c++) {
-                if (!e[c]) {
-                    d = c * a;
-                    m = g[d];
-                    if (m.hitTest([k, j])) {
-                        return {
-                            series: h,
-                            sprite: g.slice(d, d + a),
-                            index: c,
-                            record: b[c],
-                            category: "sprites",
-                            field: h.getXField()
-                        }
-                    }
-                }
-            }
-            return null
-        }
-    },
-    provideLegendInfo: function(f) {
-        var h = this,
-            k = h.getStore();
-        if (k) {
-            var g = k.getData().items,
-                b = h.getLabel().getTemplate().getField(),
-                j = h.getField(),
-                e = h.getHidden(),
-                d, a, c;
-            for (d = 0; d < g.length; d++) {
-                a = h.getStyleByIndex(d);
-                c = a.baseColor;
-                f.push({
-                    name: b ? String(g[d].get(b)) : j + " " + d,
-                    mark: c || "black",
-                    disabled: e[d],
-                    series: h.getId(),
-                    index: d
-                })
-            }
-        }
-    }
-}, function() {
-    var b = this.prototype,
-        a = Ext.chart.series.sprite.Pie3DPart.def.getInitialConfig().processors.part;
-    b.partNames = a.replace(/^enums\(|\)/g, "").split(",");
-    b.spritesPerSlice = b.partNames.length
-});
-Ext.define("Ext.chart.series.sprite.Polar", {
-    extend: "Ext.chart.series.sprite.Series",
-    inheritableStatics: {
-        def: {
-            processors: {
-                centerX: "number",
-                centerY: "number",
-                startAngle: "number",
-                endAngle: "number",
-                startRho: "number",
-                endRho: "number",
-                baseRotation: "number",
-                labels: "default",
-                labelOverflowPadding: "number"
-            },
-            defaults: {
-                centerX: 0,
-                centerY: 0,
-                startAngle: 0,
-                endAngle: Math.PI,
-                startRho: 0,
-                endRho: 150,
-                baseRotation: 0,
-                labels: null,
-                labelOverflowPadding: 10
-            },
-            triggers: {
-                centerX: "bbox",
-                centerY: "bbox",
-                startAngle: "bbox",
-                endAngle: "bbox",
-                startRho: "bbox",
-                endRho: "bbox",
-                baseRotation: "bbox"
-            }
-        }
-    },
-    updatePlainBBox: function(b) {
-        var a = this.attr;
-        b.x = a.centerX - a.endRho;
-        b.y = a.centerY + a.endRho;
-        b.width = a.endRho * 2;
-        b.height = a.endRho * 2
-    }
-});
-Ext.define("Ext.chart.series.sprite.Radar", {
-    alias: "sprite.radar",
-    extend: "Ext.chart.series.sprite.Polar",
-    getDataPointXY: function(d) {
-        var u = this,
-            n = u.attr,
-            f = n.centerX,
-            e = n.centerY,
-            o = n.matrix,
-            t = n.dataMinX,
-            s = n.dataMaxX,
-            k = n.dataX,
-            j = n.dataY,
-            l = n.endRho,
-            p = n.startRho,
-            g = n.baseRotation,
-            i, h, m, c, b, a, q;
-        if (n.rangeY) {
-            q = n.rangeY[1]
-        } else {
-            q = n.dataMaxY
-        }
-        c = (k[d] - t) / (s - t + 1) * 2 * Math.PI + g;
-        m = j[d] / q * (l - p) + p;
-        b = f + Math.cos(c) * m;
-        a = e + Math.sin(c) * m;
-        i = o.x(b, a);
-        h = o.y(b, a);
-        return [i, h]
-    },
-    render: function(a, l) {
-        var h = this,
-            f = h.attr,
-            g = f.dataX,
-            b = g.length,
-            e = h.surfaceMatrix,
-            d = {},
-            c, k, j, m;
-        l.beginPath();
-        for (c = 0; c < b; c++) {
-            m = h.getDataPointXY(c);
-            k = m[0];
-            j = m[1];
-            if (c === 0) {
-                l.moveTo(k, j)
-            }
-            l.lineTo(k, j);
-            d.translationX = e.x(k, j);
-            d.translationY = e.y(k, j);
-            h.putMarker("markers", d, c, true)
-        }
-        l.closePath();
-        l.fillStroke(f)
-    }
-});
-Ext.define("Ext.chart.series.Radar", {
-    extend: "Ext.chart.series.Polar",
-    type: "radar",
-    seriesType: "radar",
-    alias: "series.radar",
-    requires: ["Ext.chart.series.sprite.Radar"],
-    themeColorCount: function() {
-        return 1
-    },
-    isStoreDependantColorCount: false,
-    themeMarkerCount: function() {
-        return 1
-    },
-    updateAngularAxis: function(a) {
-        a.processData(this)
-    },
-    updateRadialAxis: function(a) {
-        a.processData(this)
-    },
-    coordinateX: function() {
-        return this.coordinate("X", 0, 2)
-    },
-    coordinateY: function() {
-        return this.coordinate("Y", 1, 2)
-    },
-    updateCenter: function(a) {
-        this.setStyle({
-            translationX: a[0] + this.getOffsetX(),
-            translationY: a[1] + this.getOffsetY()
-        });
-        this.doUpdateStyles()
-    },
-    updateRadius: function(a) {
-        this.setStyle({
-            endRho: a
-        });
-        this.doUpdateStyles()
-    },
-    updateRotation: function(a) {
-        this.setStyle({
-            rotationRads: a
-        });
-        this.doUpdateStyles()
-    },
-    updateTotalAngle: function(a) {
-        this.processData()
-    },
-    getItemForPoint: function(k, j) {
-        var h = this,
-            m = h.sprites && h.sprites[0],
-            f = m.attr,
-            g = f.dataX,
-            a = g.length,
-            l = h.getStore(),
-            e = h.getMarker(),
-            b, o, p, d, n, c;
-        if (h.getHidden()) {
-            return null
-        }
-        if (m && e) {
-            c = m.getMarker("markers");
-            for (d = 0; d < a; d++) {
-                n = c.getBBoxFor(d);
-                b = (n.width + n.height) * 0.25;
-                p = m.getDataPointXY(d);
-                if (Math.abs(p[0] - k) < b && Math.abs(p[1] - j) < b) {
-                    o = {
-                        series: h,
-                        sprite: m,
-                        index: d,
-                        category: "markers",
-                        record: l.getData().items[d],
-                        field: h.getYField()
-                    };
-                    return o
-                }
-            }
-        }
-        return h.callParent(arguments)
-    },
-    getDefaultSpriteConfig: function() {
-        var a = this.callParent(),
-            b = {
-                customDurations: {
-                    translationX: 0,
-                    translationY: 0,
-                    rotationRads: 0,
-                    dataMinX: 0,
-                    dataMaxX: 0
-                }
-            };
-        if (a.fx) {
-            Ext.apply(a.fx, b)
-        } else {
-            a.fx = b
-        }
-        return a
-    },
-    getSprites: function() {
-        var d = this,
-            c = d.getChart(),
-            e = d.getAnimation() || c && c.getAnimation(),
-            b = d.sprites[0],
-            a;
-        if (!c) {
-            return []
-        }
-        if (!b) {
-            b = d.createSprite()
-        }
-        if (e) {
-            a = b.getMarker("markers");
-            if (a) {
-                a.getTemplate().setAnimation(e)
-            }
-            b.setAnimation(e)
-        }
-        return d.sprites
-    },
-    provideLegendInfo: function(d) {
-        var b = this,
-            a = b.getSubStyleWithTheme(),
-            c = a.fillStyle;
-        if (Ext.isArray(c)) {
-            c = c[0]
-        }
-        d.push({
-            name: b.getTitle() || b.getYField() || b.getId(),
-            mark: (Ext.isObject(c) ? c.stops && c.stops[0].color : c) || a.strokeStyle || "black",
-            disabled: b.getHidden(),
-            series: b.getId(),
-            index: 0
-        })
-    }
-});
-Ext.define("Ext.chart.series.sprite.Scatter", {
-    alias: "sprite.scatterSeries",
-    extend: "Ext.chart.series.sprite.Cartesian",
-    renderClipped: function(r, s, w, u) {
-        if (this.cleanRedraw) {
-            return
-        }
-        var C = this,
-            q = C.attr,
-            l = q.dataX,
-            h = q.dataY,
-            z = q.labels,
-            j = C.getSeries(),
-            b = z && C.getMarker("labels"),
-            t = C.attr.matrix,
-            c = t.getXX(),
-            p = t.getYY(),
-            m = t.getDX(),
-            k = t.getDY(),
-            n = {},
-            D, B, d = r.getInherited().rtl && !q.flipXY ? -1 : 1,
-            a, A, o, e, g, f, v;
-        if (q.flipXY) {
-            a = u[1] - c * d;
-            A = u[1] + u[3] + c * d;
-            o = u[0] - p;
-            e = u[0] + u[2] + p
-        } else {
-            a = u[0] - c * d;
-            A = u[0] + u[2] + c * d;
-            o = u[1] - p;
-            e = u[1] + u[3] + p
-        }
-        for (v = 0; v < l.length; v++) {
-            g = l[v];
-            f = h[v];
-            g = g * c + m;
-            f = f * p + k;
-            if (a <= g && g <= A && o <= f && f <= e) {
-                if (q.renderer) {
-                    n = {
-                        type: "items",
-                        translationX: g,
-                        translationY: f
-                    };
-                    B = [C, n, {
-                        store: C.getStore()
-                    }, v];
-                    D = Ext.callback(q.renderer, null, B, 0, j);
-                    n = Ext.apply(n, D)
-                } else {
-                    n.translationX = g;
-                    n.translationY = f
-                }
-                C.putMarker("items", n, v, !q.renderer);
-                if (b && z[v]) {
-                    C.drawLabel(z[v], g, f, v, u)
-                }
-            }
-        }
-    },
-    drawLabel: function(j, h, g, p, a) {
-        var r = this,
-            m = r.attr,
-            d = r.getMarker("labels"),
-            c = d.getTemplate(),
-            l = r.labelCfg || (r.labelCfg = {}),
-            b = r.surfaceMatrix,
-            f, e, i = m.labelOverflowPadding,
-            o = m.flipXY,
-            k, n, s, q;
-        l.text = j;
-        n = r.getMarkerBBox("labels", p, true);
-        if (!n) {
-            r.putMarker("labels", l, p);
-            n = r.getMarkerBBox("labels", p, true)
-        }
-        if (o) {
-            l.rotationRads = Math.PI * 0.5
-        } else {
-            l.rotationRads = 0
-        }
-        k = n.height / 2;
-        f = h;
-        switch (c.attr.display) {
-            case "under":
-                e = g - k - i;
-                break;
-            case "rotate":
-                f += i;
-                e = g - i;
-                l.rotationRads = -Math.PI / 4;
-                break;
-            default:
-                e = g + k + i
-        }
-        l.x = b.x(f, e);
-        l.y = b.y(f, e);
-        if (c.attr.renderer) {
-            q = [j, d, l, {
-                store: r.getStore()
-            }, p];
-            s = Ext.callback(c.attr.renderer, null, q, 0, r.getSeries());
-            if (typeof s === "string") {
-                l.text = s
-            } else {
-                Ext.apply(l, s)
-            }
-        }
-        r.putMarker("labels", l, p)
-    }
-});
-Ext.define("Ext.chart.series.Scatter", {
-    extend: "Ext.chart.series.Cartesian",
-    alias: "series.scatter",
-    type: "scatter",
-    seriesType: "scatterSeries",
-    requires: ["Ext.chart.series.sprite.Scatter"],
-    config: {
-        itemInstancing: {
-            fx: {
-                customDurations: {
-                    translationX: 0,
-                    translationY: 0
-                }
-            }
-        }
-    },
-    themeMarkerCount: function() {
-        return 1
-    },
-    applyMarker: function(b, a) {
-        this.getItemInstancing();
-        this.setItemInstancing(b);
-        return this.callParent(arguments)
-    },
-    provideLegendInfo: function(d) {
-        var b = this,
-            a = b.getMarkerStyleByIndex(0),
-            c = a.fillStyle;
-        d.push({
-            name: b.getTitle() || b.getYField() || b.getId(),
-            mark: (Ext.isObject(c) ? c.stops && c.stops[0].color : c) || a.strokeStyle || "black",
-            disabled: b.getHidden(),
-            series: b.getId(),
-            index: 0
-        })
-    }
-});
-Ext.define("Ext.chart.theme.Blue", {
-    extend: "Ext.chart.theme.Base",
-    singleton: true,
-    alias: ["chart.theme.blue", "chart.theme.Blue"],
-    config: {
-        baseColor: "#4d7fe6"
-    }
-});
-Ext.define("Ext.chart.theme.BlueGradients", {
-    extend: "Ext.chart.theme.Base",
-    singleton: true,
-    alias: ["chart.theme.blue-gradients", "chart.theme.Blue:gradients"],
-    config: {
-        baseColor: "#4d7fe6",
-        gradients: {
-            type: "linear",
-            degrees: 90
-        }
-    }
-});
-Ext.define("Ext.chart.theme.Category1", {
-    extend: "Ext.chart.theme.Base",
-    singleton: true,
-    alias: ["chart.theme.category1", "chart.theme.Category1"],
-    config: {
-        colors: ["#f0a50a", "#c20024", "#2044ba", "#810065", "#7eae29"]
-    }
-});
-Ext.define("Ext.chart.theme.Category1Gradients", {
-    extend: "Ext.chart.theme.Base",
-    singleton: true,
-    alias: ["chart.theme.category1-gradients", "chart.theme.Category1:gradients"],
-    config: {
-        colors: ["#f0a50a", "#c20024", "#2044ba", "#810065", "#7eae29"],
-        gradients: {
-            type: "linear",
-            degrees: 90
-        }
-    }
-});
-Ext.define("Ext.chart.theme.Category2", {
-    extend: "Ext.chart.theme.Base",
-    singleton: true,
-    alias: ["chart.theme.category2", "chart.theme.Category2"],
-    config: {
-        colors: ["#6d9824", "#87146e", "#2a9196", "#d39006", "#1e40ac"]
-    }
-});
-Ext.define("Ext.chart.theme.Category2Gradients", {
-    extend: "Ext.chart.theme.Base",
-    singleton: true,
-    alias: ["chart.theme.category2-gradients", "chart.theme.Category2:gradients"],
-    config: {
-        colors: ["#6d9824", "#87146e", "#2a9196", "#d39006", "#1e40ac"],
-        gradients: {
-            type: "linear",
-            degrees: 90
-        }
-    }
-});
-Ext.define("Ext.chart.theme.Category3", {
-    extend: "Ext.chart.theme.Base",
-    singleton: true,
-    alias: ["chart.theme.category3", "chart.theme.Category3"],
-    config: {
-        colors: ["#fbbc29", "#ce2e4e", "#7e0062", "#158b90", "#57880e"]
-    }
-});
-Ext.define("Ext.chart.theme.Category3Gradients", {
-    extend: "Ext.chart.theme.Base",
-    singleton: true,
-    alias: ["chart.theme.category3-gradients", "chart.theme.Category3:gradients"],
-    config: {
-        colors: ["#fbbc29", "#ce2e4e", "#7e0062", "#158b90", "#57880e"],
-        gradients: {
-            type: "linear",
-            degrees: 90
-        }
-    }
-});
-Ext.define("Ext.chart.theme.Category4", {
-    extend: "Ext.chart.theme.Base",
-    singleton: true,
-    alias: ["chart.theme.category4", "chart.theme.Category4"],
-    config: {
-        colors: ["#ef5773", "#fcbd2a", "#4f770d", "#1d3eaa", "#9b001f"]
-    }
-});
-Ext.define("Ext.chart.theme.Category4Gradients", {
-    extend: "Ext.chart.theme.Base",
-    singleton: true,
-    alias: ["chart.theme.category4-gradients", "chart.theme.Category4:gradients"],
-    config: {
-        colors: ["#ef5773", "#fcbd2a", "#4f770d", "#1d3eaa", "#9b001f"],
-        gradients: {
-            type: "linear",
-            degrees: 90
-        }
-    }
-});
-Ext.define("Ext.chart.theme.Category5", {
-    extend: "Ext.chart.theme.Base",
-    singleton: true,
-    alias: ["chart.theme.category5", "chart.theme.Category5"],
-    config: {
-        colors: ["#7eae29", "#fdbe2a", "#910019", "#27b4bc", "#d74dbc"]
-    }
-});
-Ext.define("Ext.chart.theme.Category5Gradients", {
-    extend: "Ext.chart.theme.Base",
-    singleton: true,
-    alias: ["chart.theme.category5-gradients", "chart.theme.Category5:gradients"],
-    config: {
-        colors: ["#7eae29", "#fdbe2a", "#910019", "#27b4bc", "#d74dbc"],
-        gradients: {
-            type: "linear",
-            degrees: 90
-        }
-    }
-});
-Ext.define("Ext.chart.theme.Category6", {
-    extend: "Ext.chart.theme.Base",
-    singleton: true,
-    alias: ["chart.theme.category6", "chart.theme.Category6"],
-    config: {
-        colors: ["#44dce1", "#0b2592", "#996e05", "#7fb325", "#b821a1"]
-    }
-});
-Ext.define("Ext.chart.theme.Category6Gradients", {
-    extend: "Ext.chart.theme.Base",
-    singleton: true,
-    alias: ["chart.theme.category6-gradients", "chart.theme.Category6:gradients"],
-    config: {
-        colors: ["#44dce1", "#0b2592", "#996e05", "#7fb325", "#b821a1"],
-        gradients: {
-            type: "linear",
-            degrees: 90
-        }
-    }
-});
-Ext.define("Ext.chart.theme.DefaultGradients", {
-    extend: "Ext.chart.theme.Base",
-    singleton: true,
-    alias: ["chart.theme.default-gradients", "chart.theme.Base:gradients"],
-    config: {
-        gradients: {
-            type: "linear",
-            degrees: 90
-        }
-    }
-});
-Ext.define("Ext.chart.theme.Green", {
-    extend: "Ext.chart.theme.Base",
-    singleton: true,
-    alias: ["chart.theme.green", "chart.theme.Green"],
-    config: {
-        baseColor: "#b1da5a"
-    }
-});
-Ext.define("Ext.chart.theme.GreenGradients", {
-    extend: "Ext.chart.theme.Base",
-    singleton: true,
-    alias: ["chart.theme.green-gradients", "chart.theme.Green:gradients"],
-    config: {
-        baseColor: "#b1da5a",
-        gradients: {
-            type: "linear",
-            degrees: 90
-        }
-    }
-});
-Ext.define("Ext.chart.theme.Midnight", {
-    extend: "Ext.chart.theme.Base",
-    singleton: true,
-    alias: ["chart.theme.midnight", "chart.theme.Midnight"],
-    config: {
-        colors: ["#A837FF", "#4AC0F2", "#FF4D35", "#FF8809", "#61C102", "#FF37EA"],
-        chart: {
-            defaults: {
-                background: "rgb(52, 52, 53)"
-            }
-        },
-        axis: {
-            defaults: {
-                style: {
-                    strokeStyle: "rgb(224, 224, 227)"
-                },
-                label: {
-                    fillStyle: "rgb(224, 224, 227)"
-                },
-                title: {
-                    fillStyle: "rgb(224, 224, 227)"
-                },
-                grid: {
-                    strokeStyle: "rgb(112, 112, 115)"
-                }
-            }
-        },
-        series: {
-            defaults: {
-                label: {
-                    fillStyle: "rgb(224, 224, 227)"
-                }
-            }
-        },
-        sprites: {
-            text: {
-                fillStyle: "rgb(224, 224, 227)"
-            }
-        }
-    }
-});
-Ext.define("Ext.chart.theme.Muted", {
-    extend: "Ext.chart.theme.Base",
-    singleton: true,
-    alias: ["chart.theme.muted", "chart.theme.Muted"],
-    config: {
-        colors: ["#8ca640", "#974144", "#4091ba", "#8e658e", "#3b8d8b", "#b86465", "#d2af69", "#6e8852", "#3dcc7e", "#a6bed1", "#cbaa4b", "#998baa"]
-    }
-});
-Ext.define("Ext.chart.theme.Purple", {
-    extend: "Ext.chart.theme.Base",
-    singleton: true,
-    alias: ["chart.theme.purple", "chart.theme.Purple"],
-    config: {
-        baseColor: "#da5abd"
-    }
-});
-Ext.define("Ext.chart.theme.PurpleGradients", {
-    extend: "Ext.chart.theme.Base",
-    singleton: true,
-    alias: ["chart.theme.purple-gradients", "chart.theme.Purple:gradients"],
-    config: {
-        baseColor: "#da5abd",
-        gradients: {
-            type: "linear",
-            degrees: 90
-        }
-    }
-});
-Ext.define("Ext.chart.theme.Red", {
-    extend: "Ext.chart.theme.Base",
-    singleton: true,
-    alias: ["chart.theme.red", "chart.theme.Red"],
-    config: {
-        baseColor: "#e84b67"
-    }
-});
-Ext.define("Ext.chart.theme.RedGradients", {
-    extend: "Ext.chart.theme.Base",
-    singleton: true,
-    alias: ["chart.theme.red-gradients", "chart.theme.Red:gradients"],
-    config: {
-        baseColor: "#e84b67",
-        gradients: {
-            type: "linear",
-            degrees: 90
-        }
-    }
-});
-Ext.define("Ext.chart.theme.Sky", {
-    extend: "Ext.chart.theme.Base",
-    singleton: true,
-    alias: ["chart.theme.sky", "chart.theme.Sky"],
-    config: {
-        baseColor: "#4ce0e7"
-    }
-});
-Ext.define("Ext.chart.theme.SkyGradients", {
-    extend: "Ext.chart.theme.Base",
-    singleton: true,
-    alias: ["chart.theme.sky-gradients", "chart.theme.Sky:gradients"],
-    config: {
-        baseColor: "#4ce0e7",
-        gradients: {
-            type: "linear",
-            degrees: 90
-        }
-    }
-});
-Ext.define("Ext.chart.theme.Yellow", {
-    extend: "Ext.chart.theme.Base",
-    singleton: true,
-    alias: ["chart.theme.yellow", "chart.theme.Yellow"],
-    config: {
-        baseColor: "#fec935"
-    }
-});
-Ext.define("Ext.chart.theme.YellowGradients", {
-    extend: "Ext.chart.theme.Base",
-    singleton: true,
-    alias: ["chart.theme.yellow-gradients", "chart.theme.Yellow:gradients"],
-    config: {
-        baseColor: "#fec935",
-        gradients: {
-            type: "linear",
-            degrees: 90
-        }
-    }
-});
-Ext.define("Ext.draw.Point", {
-    requires: ["Ext.draw.Draw", "Ext.draw.Matrix"],
-    isPoint: true,
-    x: 0,
-    y: 0,
-    length: 0,
-    angle: 0,
-    angleUnits: "degrees",
-    statics: {
-        fly: (function() {
-            var a = null;
-            return function(b, c) {
-                if (!a) {
-                    a = new Ext.draw.Point()
-                }
-                a.constructor(b, c);
-                return a
-            }
-        })()
-    },
-    constructor: function(a, c) {
-        var b = this;
-        if (typeof a === "number") {
-            b.x = a;
-            if (typeof c === "number") {
-                b.y = c
-            } else {
-                b.y = a
-            }
-        } else {
-            if (Ext.isArray(a)) {
-                b.x = a[0];
-                b.y = a[1]
-            } else {
-                if (a) {
-                    b.x = a.x;
-                    b.y = a.y
-                }
-            }
-        }
-        b.calculatePolar()
-    },
-    calculateCartesian: function() {
-        var b = this,
-            a = b.length,
-            c = b.angle;
-        if (b.angleUnits === "degrees") {
-            c = Ext.draw.Draw.rad(c)
-        }
-        b.x = Math.cos(c) * a;
-        b.y = Math.sin(c) * a
-    },
-    calculatePolar: function() {
-        var b = this,
-            a = b.x,
-            c = b.y;
-        b.length = Math.sqrt(a * a + c * c);
-        b.angle = Math.atan2(c, a);
-        if (b.angleUnits === "degrees") {
-            b.angle = Ext.draw.Draw.degrees(b.angle)
-        }
-    },
-    setX: function(a) {
-        this.x = a;
-        this.calculatePolar()
-    },
-    setY: function(a) {
-        this.y = a;
-        this.calculatePolar()
-    },
-    set: function(a, b) {
-        this.constructor(a, b)
-    },
-    setAngle: function(a) {
-        this.angle = a;
-        this.calculateCartesian()
-    },
-    setLength: function(a) {
-        this.length = a;
-        this.calculateCartesian()
-    },
-    setPolar: function(b, a) {
-        this.angle = b;
-        this.length = a;
-        this.calculateCartesian()
-    },
-    clone: function() {
-        return new Ext.draw.Point(this.x, this.y)
-    },
-    add: function(a, c) {
-        var b = Ext.draw.Point.fly(a, c);
-        return new Ext.draw.Point(this.x + b.x, this.y + b.y)
-    },
-    sub: function(a, c) {
-        var b = Ext.draw.Point.fly(a, c);
-        return new Ext.draw.Point(this.x - b.x, this.y - b.y)
-    },
-    mul: function(a) {
-        return new Ext.draw.Point(this.x * a, this.y * a)
-    },
-    div: function(a) {
-        return new Ext.draw.Point(this.x / a, this.y / a)
-    },
-    dot: function(a, c) {
-        var b = Ext.draw.Point.fly(a, c);
-        return this.x * b.x + this.y * b.y
-    },
-    equals: function(a, c) {
-        var b = Ext.draw.Point.fly(a, c);
-        return this.x === b.x && this.y === b.y
-    },
-    rotate: function(f, c) {
-        var d, e, b, g, a;
-        if (this.angleUnits === "degrees") {
-            f = Ext.draw.Draw.rad(f);
-            d = Math.sin(f);
-            e = Math.cos(f)
-        }
-        if (c) {
-            b = c.x;
-            g = c.y
-        } else {
-            b = 0;
-            g = 0
-        }
-        a = Ext.draw.Matrix.fly([e, d, -d, e, b - e * b + g * d, g - e * g + b * -d]).transformPoint(this);
-        return new Ext.draw.Point(a)
-    },
-    transform: function(a) {
-        if (a && a.isMatrix) {
-            return new Ext.draw.Point(a.transformPoint(this))
-        } else {
-            if (arguments.length === 6) {
-                return new Ext.draw.Point(Ext.draw.Matrix.fly(arguments).transformPoint(this))
-            } else {
-                Ext.raise("Invalid parameters.")
-            }
-        }
-    },
-    round: function() {
-        return new Ext.draw.Point(Math.round(this.x), Math.round(this.y))
-    },
-    ceil: function() {
-        return new Ext.draw.Point(Math.ceil(this.x), Math.ceil(this.y))
-    },
-    floor: function() {
-        return new Ext.draw.Point(Math.floor(this.x), Math.floor(this.y))
-    },
-    abs: function(a, b) {
-        return new Ext.draw.Point(Math.abs(this.x), Math.abs(this.y))
-    },
-    normalize: function(c) {
-        var b = this.x,
-            f = this.y,
-            a, e, d;
-        c = c || 1;
-        if (b === 0) {
-            a = 0;
-            e = c * Ext.Number.sign(f)
-        } else {
-            d = f / b;
-            a = c / Math.sqrt(1 + d * d);
-            e = a * d
-        }
-        return new Ext.draw.Point(a, e)
-    },
-    getDistanceToLine: function(c, b) {
-        if (arguments.length === 4) {
-            c = new Ext.draw.Point(arguments[0], arguments[1]);
-            b = new Ext.draw.Point(arguments[2], arguments[3])
-        }
-        var d = b.sub(c).normalize(),
-            a = c.sub(this);
-        return a.sub(d.mul(a.dot(d)))
-    },
-    isZero: function() {
-        return this.x === 0 && this.y === 0
-    },
-    isNumber: function() {
-        return Ext.isNumber(this.x + this.y)
-    }
-});
-Ext.define("Ext.draw.plugin.SpriteEvents", {
-    extend: "Ext.plugin.Abstract",
-    alias: "plugin.spriteevents",
-    requires: ["Ext.draw.PathUtil"],
-    mouseMoveEvents: {
-        mousemove: true,
-        mouseover: true,
-        mouseout: true
-    },
-    spriteMouseMoveEvents: {
-        spritemousemove: true,
-        spritemouseover: true,
-        spritemouseout: true
-    },
-    init: function(a) {
-        var b = "handleEvent";
-        this.drawContainer = a;
-        a.addElementListener({
-            click: b,
-            dblclick: b,
-            mousedown: b,
-            mousemove: b,
-            mouseup: b,
-            mouseover: b,
-            mouseout: b,
-            priority: 1001,
-            scope: this
-        })
-    },
-    hasSpriteMouseMoveListeners: function() {
-        var b = this.drawContainer.hasListeners,
-            a;
-        for (a in this.spriteMouseMoveEvents) {
-            if (a in b) {
-                return true
-            }
-        }
-        return false
-    },
-    hitTestEvent: function(f) {
-        var b = this.drawContainer.getItems(),
-            a, d, c;
-        for (c = b.length - 1; c >= 0; c--) {
-            a = b.get(c);
-            d = a.hitTestEvent(f);
-            if (d) {
-                return d
-            }
-        }
-        return null
-    },
-    handleEvent: function(f) {
-        var d = this,
-            b = d.drawContainer,
-            g = f.type in d.mouseMoveEvents,
-            a = d.lastSprite,
-            c;
-        if (g && !d.hasSpriteMouseMoveListeners()) {
-            return
-        }
-        c = d.hitTestEvent(f);
-        if (g && !Ext.Object.equals(c, a)) {
-            if (a) {
-                b.fireEvent("spritemouseout", a, f)
-            }
-            if (c) {
-                b.fireEvent("spritemouseover", c, f)
-            }
-        }
-        if (c) {
-            b.fireEvent("sprite" + f.type, c, f)
-        }
-        d.lastSprite = c
-    }
-});
-Ext.define("Ext.chart.TipSurface", {
-    extend: "Ext.draw.Container",
-    spriteArray: false,
-    renderFirst: true,
-    constructor: function(a) {
-        this.callParent([a]);
-        if (a.sprites) {
-            this.spriteArray = [].concat(a.sprites);
-            delete a.sprites
-        }
-    },
-    onRender: function() {
-        var c = this,
-            b = 0,
-            a = 0,
-            d, e;
-        this.callParent(arguments);
-        e = c.spriteArray;
-        if (c.renderFirst && e) {
-            c.renderFirst = false;
-            for (a = e.length; b < a; b++) {
-                d = c.surface.add(e[b]);
-                d.setAttributes({
-                    hidden: false
-                }, true)
-            }
-        }
-    }
-});
-Ext.define("Ext.chart.interactions.ItemInfo", {
-    extend: "Ext.chart.interactions.Abstract",
-    type: "iteminfo",
-    alias: "interaction.iteminfo",
-    config: {
-        extjsGestures: {
-            start: {
-                event: "click",
-                handler: "onInfoGesture"
-            },
-            move: {
-                event: "mousemove",
-                handler: "onInfoGesture"
-            },
-            end: {
-                event: "mouseleave",
-                handler: "onInfoGesture"
-            }
-        }
-    },
-    item: null,
-    onInfoGesture: function(f, a) {
-        var c = this,
-            b = c.getItemForEvent(f),
-            d = b && b.series.tooltip;
-        if (d) {
-            d.onMouseMove.call(d, f)
-        }
-        if (b !== c.item) {
-            if (b) {
-                b.series.showTip(b)
-            } else {
-                c.item.series.hideTip(c.item)
-            }
-            c.item = b
-        }
-        return false
-    }
-});
\ No newline at end of file