{
  "version": 3,
  "sources": ["../../../../../node_modules/raphael/raphael.js", "../../../../javascript/performance/rounds/golf_charts.js"],
  "sourcesContent": ["// \u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \\\\\n// \u2502 Rapha\u00EBl 2.3.0 - JavaScript Vector Library                                                             \u2502 \\\\\n// \u251C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524 \\\\\n// \u2502 Copyright \u00A9 2008-2016 Dmitry Baranovskiy (http://raphaeljs.com)                                       \u2502 \\\\\n// \u2502 Copyright \u00A9 2008-2016 Sencha Labs (http://sencha.com)                                                 \u2502 \\\\\n// \u251C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524 \\\\\n// \u2502 Licensed under the MIT (https://github.com/DmitryBaranovskiy/raphael/blob/master/license.txt) license.\u2502 \\\\\n// \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \\\\\n\n(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"Raphael\"] = factory();\n\telse\n\t\troot[\"Raphael\"] = factory();\n})(window, function() {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// define __esModule on exports\n/******/ \t__webpack_require__.r = function(exports) {\n/******/ \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n/******/ \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n/******/ \t\t}\n/******/ \t\tObject.defineProperty(exports, '__esModule', { value: true });\n/******/ \t};\n/******/\n/******/ \t// create a fake namespace object\n/******/ \t// mode & 1: value is a module id, require it\n/******/ \t// mode & 2: merge all properties of value into the ns\n/******/ \t// mode & 4: return value when already ns object\n/******/ \t// mode & 8|1: behave like require\n/******/ \t__webpack_require__.t = function(value, mode) {\n/******/ \t\tif(mode & 1) value = __webpack_require__(value);\n/******/ \t\tif(mode & 8) return value;\n/******/ \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n/******/ \t\tvar ns = Object.create(null);\n/******/ \t\t__webpack_require__.r(ns);\n/******/ \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n/******/ \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n/******/ \t\treturn ns;\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = \"./dev/raphael.amd.js\");\n/******/ })\n/************************************************************************/\n/******/ ({\n\n/***/ \"./dev/raphael.amd.js\":\n/*!****************************!*\\\n  !*** ./dev/raphael.amd.js ***!\n  \\****************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! ./raphael.core */ \"./dev/raphael.core.js\"), __webpack_require__(/*! ./raphael.svg */ \"./dev/raphael.svg.js\"), __webpack_require__(/*! ./raphael.vml */ \"./dev/raphael.vml.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function(R) {\n\n    return R;\n\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\n/***/ }),\n\n/***/ \"./dev/raphael.core.js\":\n/*!*****************************!*\\\n  !*** ./dev/raphael.core.js ***!\n  \\*****************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! eve */ \"./node_modules/eve-raphael/eve.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function(eve) {\n\n    /*\\\n     * Raphael\n     [ method ]\n     **\n     * Creates a canvas object on which to draw.\n     * You must do this first, as all future calls to drawing methods\n     * from this instance will be bound to this canvas.\n     > Parameters\n     **\n     - container (HTMLElement|string) DOM element or its ID which is going to be a parent for drawing surface\n     - width (number)\n     - height (number)\n     - callback (function) #optional callback function which is going to be executed in the context of newly created paper\n     * or\n     - x (number)\n     - y (number)\n     - width (number)\n     - height (number)\n     - callback (function) #optional callback function which is going to be executed in the context of newly created paper\n     * or\n     - all (array) (first 3 or 4 elements in the array are equal to [containerID, width, height] or [x, y, width, height]. The rest are element descriptions in format {type: type, <attributes>}). See @Paper.add.\n     - callback (function) #optional callback function which is going to be executed in the context of newly created paper\n     * or\n     - onReadyCallback (function) function that is going to be called on DOM ready event. You can also subscribe to this event via Eve\u2019s \u201CDOMLoad\u201D event. In this case method returns `undefined`.\n     = (object) @Paper\n     > Usage\n     | // Each of the following examples create a canvas\n     | // that is 320px wide by 200px high.\n     | // Canvas is created at the viewport\u2019s 10,50 coordinate.\n     | var paper = Raphael(10, 50, 320, 200);\n     | // Canvas is created at the top left corner of the #notepad element\n     | // (or its top right corner in dir=\"rtl\" elements)\n     | var paper = Raphael(document.getElementById(\"notepad\"), 320, 200);\n     | // Same as above\n     | var paper = Raphael(\"notepad\", 320, 200);\n     | // Image dump\n     | var set = Raphael([\"notepad\", 320, 200, {\n     |     type: \"rect\",\n     |     x: 10,\n     |     y: 10,\n     |     width: 25,\n     |     height: 25,\n     |     stroke: \"#f00\"\n     | }, {\n     |     type: \"text\",\n     |     x: 30,\n     |     y: 40,\n     |     text: \"Dump\"\n     | }]);\n    \\*/\n    function R(first) {\n        if (R.is(first, \"function\")) {\n            return loaded ? first() : eve.on(\"raphael.DOMload\", first);\n        } else if (R.is(first, array)) {\n            return R._engine.create[apply](R, first.splice(0, 3 + R.is(first[0], nu))).add(first);\n        } else {\n            var args = Array.prototype.slice.call(arguments, 0);\n            if (R.is(args[args.length - 1], \"function\")) {\n                var f = args.pop();\n                return loaded ? f.call(R._engine.create[apply](R, args)) : eve.on(\"raphael.DOMload\", function () {\n                    f.call(R._engine.create[apply](R, args));\n                });\n            } else {\n                return R._engine.create[apply](R, arguments);\n            }\n        }\n    }\n    R.version = \"2.3.0\";\n    R.eve = eve;\n    var loaded,\n        separator = /[, ]+/,\n        elements = {circle: 1, rect: 1, path: 1, ellipse: 1, text: 1, image: 1},\n        formatrg = /\\{(\\d+)\\}/g,\n        proto = \"prototype\",\n        has = \"hasOwnProperty\",\n        g = {\n            doc: document,\n            win: window\n        },\n        oldRaphael = {\n            was: Object.prototype[has].call(g.win, \"Raphael\"),\n            is: g.win.Raphael\n        },\n        Paper = function () {\n            /*\\\n             * Paper.ca\n             [ property (object) ]\n             **\n             * Shortcut for @Paper.customAttributes\n            \\*/\n            /*\\\n             * Paper.customAttributes\n             [ property (object) ]\n             **\n             * If you have a set of attributes that you would like to represent\n             * as a function of some number you can do it easily with custom attributes:\n             > Usage\n             | paper.customAttributes.hue = function (num) {\n             |     num = num % 1;\n             |     return {fill: \"hsb(\" + num + \", 0.75, 1)\"};\n             | };\n             | // Custom attribute \u201Chue\u201D will change fill\n             | // to be given hue with fixed saturation and brightness.\n             | // Now you can use it like this:\n             | var c = paper.circle(10, 10, 10).attr({hue: .45});\n             | // or even like this:\n             | c.animate({hue: 1}, 1e3);\n             |\n             | // You could also create custom attribute\n             | // with multiple parameters:\n             | paper.customAttributes.hsb = function (h, s, b) {\n             |     return {fill: \"hsb(\" + [h, s, b].join(\",\") + \")\"};\n             | };\n             | c.attr({hsb: \"0.5 .8 1\"});\n             | c.animate({hsb: [1, 0, 0.5]}, 1e3);\n            \\*/\n            this.ca = this.customAttributes = {};\n        },\n        paperproto,\n        appendChild = \"appendChild\",\n        apply = \"apply\",\n        concat = \"concat\",\n        //taken from Modernizr touch test: https://github.com/Modernizr/Modernizr/blob/master/feature-detects/touchevents.js#L40\n        supportsTouch = ('ontouchstart' in window) || window.TouchEvent || window.DocumentTouch && document instanceof DocumentTouch,\n        E = \"\",\n        S = \" \",\n        Str = String,\n        split = \"split\",\n        events = \"click dblclick mousedown mousemove mouseout mouseover mouseup touchstart touchmove touchend touchcancel\"[split](S),\n        touchMap = {\n            mousedown: \"touchstart\",\n            mousemove: \"touchmove\",\n            mouseup: \"touchend\"\n        },\n        lowerCase = Str.prototype.toLowerCase,\n        math = Math,\n        mmax = math.max,\n        mmin = math.min,\n        abs = math.abs,\n        pow = math.pow,\n        PI = math.PI,\n        nu = \"number\",\n        string = \"string\",\n        array = \"array\",\n        toString = \"toString\",\n        fillString = \"fill\",\n        objectToString = Object.prototype.toString,\n        paper = {},\n        push = \"push\",\n        ISURL = R._ISURL = /^url\\(['\"]?(.+?)['\"]?\\)$/i,\n        colourRegExp = /^\\s*((#[a-f\\d]{6})|(#[a-f\\d]{3})|rgba?\\(\\s*([\\d\\.]+%?\\s*,\\s*[\\d\\.]+%?\\s*,\\s*[\\d\\.]+%?(?:\\s*,\\s*[\\d\\.]+%?)?)\\s*\\)|hsba?\\(\\s*([\\d\\.]+(?:deg|\\xb0|%)?\\s*,\\s*[\\d\\.]+%?\\s*,\\s*[\\d\\.]+(?:%?\\s*,\\s*[\\d\\.]+)?)%?\\s*\\)|hsla?\\(\\s*([\\d\\.]+(?:deg|\\xb0|%)?\\s*,\\s*[\\d\\.]+%?\\s*,\\s*[\\d\\.]+(?:%?\\s*,\\s*[\\d\\.]+)?)%?\\s*\\))\\s*$/i,\n        isnan = {\"NaN\": 1, \"Infinity\": 1, \"-Infinity\": 1},\n        bezierrg = /^(?:cubic-)?bezier\\(([^,]+),([^,]+),([^,]+),([^\\)]+)\\)/,\n        round = math.round,\n        setAttribute = \"setAttribute\",\n        toFloat = parseFloat,\n        toInt = parseInt,\n        upperCase = Str.prototype.toUpperCase,\n        availableAttrs = R._availableAttrs = {\n            \"arrow-end\": \"none\",\n            \"arrow-start\": \"none\",\n            blur: 0,\n            \"clip-rect\": \"0 0 1e9 1e9\",\n            cursor: \"default\",\n            cx: 0,\n            cy: 0,\n            fill: \"#fff\",\n            \"fill-opacity\": 1,\n            font: '10px \"Arial\"',\n            \"font-family\": '\"Arial\"',\n            \"font-size\": \"10\",\n            \"font-style\": \"normal\",\n            \"font-weight\": 400,\n            gradient: 0,\n            height: 0,\n            href: \"http://raphaeljs.com/\",\n            \"letter-spacing\": 0,\n            opacity: 1,\n            path: \"M0,0\",\n            r: 0,\n            rx: 0,\n            ry: 0,\n            src: \"\",\n            stroke: \"#000\",\n            \"stroke-dasharray\": \"\",\n            \"stroke-linecap\": \"butt\",\n            \"stroke-linejoin\": \"butt\",\n            \"stroke-miterlimit\": 0,\n            \"stroke-opacity\": 1,\n            \"stroke-width\": 1,\n            target: \"_blank\",\n            \"text-anchor\": \"middle\",\n            title: \"Raphael\",\n            transform: \"\",\n            width: 0,\n            x: 0,\n            y: 0,\n            \"class\": \"\"\n        },\n        availableAnimAttrs = R._availableAnimAttrs = {\n            blur: nu,\n            \"clip-rect\": \"csv\",\n            cx: nu,\n            cy: nu,\n            fill: \"colour\",\n            \"fill-opacity\": nu,\n            \"font-size\": nu,\n            height: nu,\n            opacity: nu,\n            path: \"path\",\n            r: nu,\n            rx: nu,\n            ry: nu,\n            stroke: \"colour\",\n            \"stroke-opacity\": nu,\n            \"stroke-width\": nu,\n            transform: \"transform\",\n            width: nu,\n            x: nu,\n            y: nu\n        },\n        whitespace = /[\\x09\\x0a\\x0b\\x0c\\x0d\\x20\\xa0\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000\\u2028\\u2029]/g,\n        commaSpaces = /[\\x09\\x0a\\x0b\\x0c\\x0d\\x20\\xa0\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000\\u2028\\u2029]*,[\\x09\\x0a\\x0b\\x0c\\x0d\\x20\\xa0\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000\\u2028\\u2029]*/,\n        hsrg = {hs: 1, rg: 1},\n        p2s = /,?([achlmqrstvxz]),?/gi,\n        pathCommand = /([achlmrqstvz])[\\x09\\x0a\\x0b\\x0c\\x0d\\x20\\xa0\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000\\u2028\\u2029,]*((-?\\d*\\.?\\d*(?:e[\\-+]?\\d+)?[\\x09\\x0a\\x0b\\x0c\\x0d\\x20\\xa0\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000\\u2028\\u2029]*,?[\\x09\\x0a\\x0b\\x0c\\x0d\\x20\\xa0\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000\\u2028\\u2029]*)+)/ig,\n        tCommand = /([rstm])[\\x09\\x0a\\x0b\\x0c\\x0d\\x20\\xa0\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000\\u2028\\u2029,]*((-?\\d*\\.?\\d*(?:e[\\-+]?\\d+)?[\\x09\\x0a\\x0b\\x0c\\x0d\\x20\\xa0\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000\\u2028\\u2029]*,?[\\x09\\x0a\\x0b\\x0c\\x0d\\x20\\xa0\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000\\u2028\\u2029]*)+)/ig,\n        pathValues = /(-?\\d*\\.?\\d*(?:e[\\-+]?\\d+)?)[\\x09\\x0a\\x0b\\x0c\\x0d\\x20\\xa0\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000\\u2028\\u2029]*,?[\\x09\\x0a\\x0b\\x0c\\x0d\\x20\\xa0\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000\\u2028\\u2029]*/ig,\n        radial_gradient = R._radial_gradient = /^r(?:\\(([^,]+?)[\\x09\\x0a\\x0b\\x0c\\x0d\\x20\\xa0\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000\\u2028\\u2029]*,[\\x09\\x0a\\x0b\\x0c\\x0d\\x20\\xa0\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000\\u2028\\u2029]*([^\\)]+?)\\))?/,\n        eldata = {},\n        sortByKey = function (a, b) {\n            return a.key - b.key;\n        },\n        sortByNumber = function (a, b) {\n            return toFloat(a) - toFloat(b);\n        },\n        fun = function () {},\n        pipe = function (x) {\n            return x;\n        },\n        rectPath = R._rectPath = function (x, y, w, h, r) {\n            if (r) {\n                return [[\"M\", x + r, y], [\"l\", w - r * 2, 0], [\"a\", r, r, 0, 0, 1, r, r], [\"l\", 0, h - r * 2], [\"a\", r, r, 0, 0, 1, -r, r], [\"l\", r * 2 - w, 0], [\"a\", r, r, 0, 0, 1, -r, -r], [\"l\", 0, r * 2 - h], [\"a\", r, r, 0, 0, 1, r, -r], [\"z\"]];\n            }\n            return [[\"M\", x, y], [\"l\", w, 0], [\"l\", 0, h], [\"l\", -w, 0], [\"z\"]];\n        },\n        ellipsePath = function (x, y, rx, ry) {\n            if (ry == null) {\n                ry = rx;\n            }\n            return [[\"M\", x, y], [\"m\", 0, -ry], [\"a\", rx, ry, 0, 1, 1, 0, 2 * ry], [\"a\", rx, ry, 0, 1, 1, 0, -2 * ry], [\"z\"]];\n        },\n        getPath = R._getPath = {\n            path: function (el) {\n                return el.attr(\"path\");\n            },\n            circle: function (el) {\n                var a = el.attrs;\n                return ellipsePath(a.cx, a.cy, a.r);\n            },\n            ellipse: function (el) {\n                var a = el.attrs;\n                return ellipsePath(a.cx, a.cy, a.rx, a.ry);\n            },\n            rect: function (el) {\n                var a = el.attrs;\n                return rectPath(a.x, a.y, a.width, a.height, a.r);\n            },\n            image: function (el) {\n                var a = el.attrs;\n                return rectPath(a.x, a.y, a.width, a.height);\n            },\n            text: function (el) {\n                var bbox = el._getBBox();\n                return rectPath(bbox.x, bbox.y, bbox.width, bbox.height);\n            },\n            set : function(el) {\n                var bbox = el._getBBox();\n                return rectPath(bbox.x, bbox.y, bbox.width, bbox.height);\n            }\n        },\n        /*\\\n         * Raphael.mapPath\n         [ method ]\n         **\n         * Transform the path string with given matrix.\n         > Parameters\n         - path (string) path string\n         - matrix (object) see @Matrix\n         = (string) transformed path string\n        \\*/\n        mapPath = R.mapPath = function (path, matrix) {\n            if (!matrix) {\n                return path;\n            }\n            var x, y, i, j, ii, jj, pathi;\n            path = path2curve(path);\n            for (i = 0, ii = path.length; i < ii; i++) {\n                pathi = path[i];\n                for (j = 1, jj = pathi.length; j < jj; j += 2) {\n                    x = matrix.x(pathi[j], pathi[j + 1]);\n                    y = matrix.y(pathi[j], pathi[j + 1]);\n                    pathi[j] = x;\n                    pathi[j + 1] = y;\n                }\n            }\n            return path;\n        };\n\n    R._g = g;\n    /*\\\n     * Raphael.type\n     [ property (string) ]\n     **\n     * Can be \u201CSVG\u201D, \u201CVML\u201D or empty, depending on browser support.\n    \\*/\n    R.type = (g.win.SVGAngle || g.doc.implementation.hasFeature(\"http://www.w3.org/TR/SVG11/feature#BasicStructure\", \"1.1\") ? \"SVG\" : \"VML\");\n    if (R.type == \"VML\") {\n        var d = g.doc.createElement(\"div\"),\n            b;\n        d.innerHTML = '<v:shape adj=\"1\"/>';\n        b = d.firstChild;\n        b.style.behavior = \"url(#default#VML)\";\n        if (!(b && typeof b.adj == \"object\")) {\n            return (R.type = E);\n        }\n        d = null;\n    }\n    /*\\\n     * Raphael.svg\n     [ property (boolean) ]\n     **\n     * `true` if browser supports SVG.\n    \\*/\n    /*\\\n     * Raphael.vml\n     [ property (boolean) ]\n     **\n     * `true` if browser supports VML.\n    \\*/\n    R.svg = !(R.vml = R.type == \"VML\");\n    R._Paper = Paper;\n    /*\\\n     * Raphael.fn\n     [ property (object) ]\n     **\n     * You can add your own method to the canvas. For example if you want to draw a pie chart,\n     * you can create your own pie chart function and ship it as a Rapha\u00EBl plugin. To do this\n     * you need to extend the `Raphael.fn` object. You should modify the `fn` object before a\n     * Rapha\u00EBl instance is created, otherwise it will take no effect. Please note that the\n     * ability for namespaced plugins was removed in Raphael 2.0. It is up to the plugin to\n     * ensure any namespacing ensures proper context.\n     > Usage\n     | Raphael.fn.arrow = function (x1, y1, x2, y2, size) {\n     |     return this.path( ... );\n     | };\n     | // or create namespace\n     | Raphael.fn.mystuff = {\n     |     arrow: function () {\u2026},\n     |     star: function () {\u2026},\n     |     // etc\u2026\n     | };\n     | var paper = Raphael(10, 10, 630, 480);\n     | // then use it\n     | paper.arrow(10, 10, 30, 30, 5).attr({fill: \"#f00\"});\n     | paper.mystuff.arrow();\n     | paper.mystuff.star();\n    \\*/\n    R.fn = paperproto = Paper.prototype = R.prototype;\n    R._id = 0;\n    /*\\\n     * Raphael.is\n     [ method ]\n     **\n     * Handful of replacements for `typeof` operator.\n     > Parameters\n     - o (\u2026) any object or primitive\n     - type (string) name of the type, i.e. \u201Cstring\u201D, \u201Cfunction\u201D, \u201Cnumber\u201D, etc.\n     = (boolean) is given value is of given type\n    \\*/\n    R.is = function (o, type) {\n        type = lowerCase.call(type);\n        if (type == \"finite\") {\n            return !isnan[has](+o);\n        }\n        if (type == \"array\") {\n            return o instanceof Array;\n        }\n        return  (type == \"null\" && o === null) ||\n                (type == typeof o && o !== null) ||\n                (type == \"object\" && o === Object(o)) ||\n                (type == \"array\" && Array.isArray && Array.isArray(o)) ||\n                objectToString.call(o).slice(8, -1).toLowerCase() == type;\n    };\n\n    function clone(obj) {\n        if (typeof obj == \"function\" || Object(obj) !== obj) {\n            return obj;\n        }\n        var res = new obj.constructor;\n        for (var key in obj) if (obj[has](key)) {\n            res[key] = clone(obj[key]);\n        }\n        return res;\n    }\n\n    /*\\\n     * Raphael.angle\n     [ method ]\n     **\n     * Returns angle between two or three points\n     > Parameters\n     - x1 (number) x coord of first point\n     - y1 (number) y coord of first point\n     - x2 (number) x coord of second point\n     - y2 (number) y coord of second point\n     - x3 (number) #optional x coord of third point\n     - y3 (number) #optional y coord of third point\n     = (number) angle in degrees.\n    \\*/\n    R.angle = function (x1, y1, x2, y2, x3, y3) {\n        if (x3 == null) {\n            var x = x1 - x2,\n                y = y1 - y2;\n            if (!x && !y) {\n                return 0;\n            }\n            return (180 + math.atan2(-y, -x) * 180 / PI + 360) % 360;\n        } else {\n            return R.angle(x1, y1, x3, y3) - R.angle(x2, y2, x3, y3);\n        }\n    };\n    /*\\\n     * Raphael.rad\n     [ method ]\n     **\n     * Transform angle to radians\n     > Parameters\n     - deg (number) angle in degrees\n     = (number) angle in radians.\n    \\*/\n    R.rad = function (deg) {\n        return deg % 360 * PI / 180;\n    };\n    /*\\\n     * Raphael.deg\n     [ method ]\n     **\n     * Transform angle to degrees\n     > Parameters\n     - rad (number) angle in radians\n     = (number) angle in degrees.\n    \\*/\n    R.deg = function (rad) {\n        return Math.round ((rad * 180 / PI% 360)* 1000) / 1000;\n    };\n    /*\\\n     * Raphael.snapTo\n     [ method ]\n     **\n     * Snaps given value to given grid.\n     > Parameters\n     - values (array|number) given array of values or step of the grid\n     - value (number) value to adjust\n     - tolerance (number) #optional tolerance for snapping. Default is `10`.\n     = (number) adjusted value.\n    \\*/\n    R.snapTo = function (values, value, tolerance) {\n        tolerance = R.is(tolerance, \"finite\") ? tolerance : 10;\n        if (R.is(values, array)) {\n            var i = values.length;\n            while (i--) if (abs(values[i] - value) <= tolerance) {\n                return values[i];\n            }\n        } else {\n            values = +values;\n            var rem = value % values;\n            if (rem < tolerance) {\n                return value - rem;\n            }\n            if (rem > values - tolerance) {\n                return value - rem + values;\n            }\n        }\n        return value;\n    };\n\n    /*\\\n     * Raphael.createUUID\n     [ method ]\n     **\n     * Returns RFC4122, version 4 ID\n    \\*/\n    var createUUID = R.createUUID = (function (uuidRegEx, uuidReplacer) {\n        return function () {\n            return \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\".replace(uuidRegEx, uuidReplacer).toUpperCase();\n        };\n    })(/[xy]/g, function (c) {\n        var r = math.random() * 16 | 0,\n            v = c == \"x\" ? r : (r & 3 | 8);\n        return v.toString(16);\n    });\n\n    /*\\\n     * Raphael.setWindow\n     [ method ]\n     **\n     * Used when you need to draw in `&lt;iframe>`. Switched window to the iframe one.\n     > Parameters\n     - newwin (window) new window object\n    \\*/\n    R.setWindow = function (newwin) {\n        eve(\"raphael.setWindow\", R, g.win, newwin);\n        g.win = newwin;\n        g.doc = g.win.document;\n        if (R._engine.initWin) {\n            R._engine.initWin(g.win);\n        }\n    };\n    var toHex = function (color) {\n        if (R.vml) {\n            // http://dean.edwards.name/weblog/2009/10/convert-any-colour-value-to-hex-in-msie/\n            var trim = /^\\s+|\\s+$/g;\n            var bod;\n            try {\n                var docum = new ActiveXObject(\"htmlfile\");\n                docum.write(\"<body>\");\n                docum.close();\n                bod = docum.body;\n            } catch(e) {\n                bod = createPopup().document.body;\n            }\n            var range = bod.createTextRange();\n            toHex = cacher(function (color) {\n                try {\n                    bod.style.color = Str(color).replace(trim, E);\n                    var value = range.queryCommandValue(\"ForeColor\");\n                    value = ((value & 255) << 16) | (value & 65280) | ((value & 16711680) >>> 16);\n                    return \"#\" + (\"000000\" + value.toString(16)).slice(-6);\n                } catch(e) {\n                    return \"none\";\n                }\n            });\n        } else {\n            var i = g.doc.createElement(\"i\");\n            i.title = \"Rapha\\xebl Colour Picker\";\n            i.style.display = \"none\";\n            g.doc.body.appendChild(i);\n            toHex = cacher(function (color) {\n                i.style.color = color;\n                return g.doc.defaultView.getComputedStyle(i, E).getPropertyValue(\"color\");\n            });\n        }\n        return toHex(color);\n    },\n    hsbtoString = function () {\n        return \"hsb(\" + [this.h, this.s, this.b] + \")\";\n    },\n    hsltoString = function () {\n        return \"hsl(\" + [this.h, this.s, this.l] + \")\";\n    },\n    rgbtoString = function () {\n        return this.hex;\n    },\n    prepareRGB = function (r, g, b) {\n        if (g == null && R.is(r, \"object\") && \"r\" in r && \"g\" in r && \"b\" in r) {\n            b = r.b;\n            g = r.g;\n            r = r.r;\n        }\n        if (g == null && R.is(r, string)) {\n            var clr = R.getRGB(r);\n            r = clr.r;\n            g = clr.g;\n            b = clr.b;\n        }\n        if (r > 1 || g > 1 || b > 1) {\n            r /= 255;\n            g /= 255;\n            b /= 255;\n        }\n\n        return [r, g, b];\n    },\n    packageRGB = function (r, g, b, o) {\n        r *= 255;\n        g *= 255;\n        b *= 255;\n        var rgb = {\n            r: r,\n            g: g,\n            b: b,\n            hex: R.rgb(r, g, b),\n            toString: rgbtoString\n        };\n        R.is(o, \"finite\") && (rgb.opacity = o);\n        return rgb;\n    };\n\n    /*\\\n     * Raphael.color\n     [ method ]\n     **\n     * Parses the color string and returns object with all values for the given color.\n     > Parameters\n     - clr (string) color string in one of the supported formats (see @Raphael.getRGB)\n     = (object) Combined RGB & HSB object in format:\n     o {\n     o     r (number) red,\n     o     g (number) green,\n     o     b (number) blue,\n     o     hex (string) color in HTML/CSS format: #\u2022\u2022\u2022\u2022\u2022\u2022,\n     o     error (boolean) `true` if string can\u2019t be parsed,\n     o     h (number) hue,\n     o     s (number) saturation,\n     o     v (number) value (brightness),\n     o     l (number) lightness\n     o }\n    \\*/\n    R.color = function (clr) {\n        var rgb;\n        if (R.is(clr, \"object\") && \"h\" in clr && \"s\" in clr && \"b\" in clr) {\n            rgb = R.hsb2rgb(clr);\n            clr.r = rgb.r;\n            clr.g = rgb.g;\n            clr.b = rgb.b;\n            clr.hex = rgb.hex;\n        } else if (R.is(clr, \"object\") && \"h\" in clr && \"s\" in clr && \"l\" in clr) {\n            rgb = R.hsl2rgb(clr);\n            clr.r = rgb.r;\n            clr.g = rgb.g;\n            clr.b = rgb.b;\n            clr.hex = rgb.hex;\n        } else {\n            if (R.is(clr, \"string\")) {\n                clr = R.getRGB(clr);\n            }\n            if (R.is(clr, \"object\") && \"r\" in clr && \"g\" in clr && \"b\" in clr) {\n                rgb = R.rgb2hsl(clr);\n                clr.h = rgb.h;\n                clr.s = rgb.s;\n                clr.l = rgb.l;\n                rgb = R.rgb2hsb(clr);\n                clr.v = rgb.b;\n            } else {\n                clr = {hex: \"none\"};\n                clr.r = clr.g = clr.b = clr.h = clr.s = clr.v = clr.l = -1;\n            }\n        }\n        clr.toString = rgbtoString;\n        return clr;\n    };\n    /*\\\n     * Raphael.hsb2rgb\n     [ method ]\n     **\n     * Converts HSB values to RGB object.\n     > Parameters\n     - h (number) hue\n     - s (number) saturation\n     - v (number) value or brightness\n     = (object) RGB object in format:\n     o {\n     o     r (number) red,\n     o     g (number) green,\n     o     b (number) blue,\n     o     hex (string) color in HTML/CSS format: #\u2022\u2022\u2022\u2022\u2022\u2022\n     o }\n    \\*/\n    R.hsb2rgb = function (h, s, v, o) {\n        if (this.is(h, \"object\") && \"h\" in h && \"s\" in h && \"b\" in h) {\n            v = h.b;\n            s = h.s;\n            o = h.o;\n            h = h.h;\n        }\n        h *= 360;\n        var R, G, B, X, C;\n        h = (h % 360) / 60;\n        C = v * s;\n        X = C * (1 - abs(h % 2 - 1));\n        R = G = B = v - C;\n\n        h = ~~h;\n        R += [C, X, 0, 0, X, C][h];\n        G += [X, C, C, X, 0, 0][h];\n        B += [0, 0, X, C, C, X][h];\n        return packageRGB(R, G, B, o);\n    };\n    /*\\\n     * Raphael.hsl2rgb\n     [ method ]\n     **\n     * Converts HSL values to RGB object.\n     > Parameters\n     - h (number) hue\n     - s (number) saturation\n     - l (number) luminosity\n     = (object) RGB object in format:\n     o {\n     o     r (number) red,\n     o     g (number) green,\n     o     b (number) blue,\n     o     hex (string) color in HTML/CSS format: #\u2022\u2022\u2022\u2022\u2022\u2022\n     o }\n    \\*/\n    R.hsl2rgb = function (h, s, l, o) {\n        if (this.is(h, \"object\") && \"h\" in h && \"s\" in h && \"l\" in h) {\n            l = h.l;\n            s = h.s;\n            h = h.h;\n        }\n        if (h > 1 || s > 1 || l > 1) {\n            h /= 360;\n            s /= 100;\n            l /= 100;\n        }\n        h *= 360;\n        var R, G, B, X, C;\n        h = (h % 360) / 60;\n        C = 2 * s * (l < .5 ? l : 1 - l);\n        X = C * (1 - abs(h % 2 - 1));\n        R = G = B = l - C / 2;\n\n        h = ~~h;\n        R += [C, X, 0, 0, X, C][h];\n        G += [X, C, C, X, 0, 0][h];\n        B += [0, 0, X, C, C, X][h];\n        return packageRGB(R, G, B, o);\n    };\n    /*\\\n     * Raphael.rgb2hsb\n     [ method ]\n     **\n     * Converts RGB values to HSB object.\n     > Parameters\n     - r (number) red\n     - g (number) green\n     - b (number) blue\n     = (object) HSB object in format:\n     o {\n     o     h (number) hue\n     o     s (number) saturation\n     o     b (number) brightness\n     o }\n    \\*/\n    R.rgb2hsb = function (r, g, b) {\n        b = prepareRGB(r, g, b);\n        r = b[0];\n        g = b[1];\n        b = b[2];\n\n        var H, S, V, C;\n        V = mmax(r, g, b);\n        C = V - mmin(r, g, b);\n        H = (C == 0 ? null :\n             V == r ? (g - b) / C :\n             V == g ? (b - r) / C + 2 :\n                      (r - g) / C + 4\n            );\n        H = ((H + 360) % 6) * 60 / 360;\n        S = C == 0 ? 0 : C / V;\n        return {h: H, s: S, b: V, toString: hsbtoString};\n    };\n    /*\\\n     * Raphael.rgb2hsl\n     [ method ]\n     **\n     * Converts RGB values to HSL object.\n     > Parameters\n     - r (number) red\n     - g (number) green\n     - b (number) blue\n     = (object) HSL object in format:\n     o {\n     o     h (number) hue\n     o     s (number) saturation\n     o     l (number) luminosity\n     o }\n    \\*/\n    R.rgb2hsl = function (r, g, b) {\n        b = prepareRGB(r, g, b);\n        r = b[0];\n        g = b[1];\n        b = b[2];\n\n        var H, S, L, M, m, C;\n        M = mmax(r, g, b);\n        m = mmin(r, g, b);\n        C = M - m;\n        H = (C == 0 ? null :\n             M == r ? (g - b) / C :\n             M == g ? (b - r) / C + 2 :\n                      (r - g) / C + 4);\n        H = ((H + 360) % 6) * 60 / 360;\n        L = (M + m) / 2;\n        S = (C == 0 ? 0 :\n             L < .5 ? C / (2 * L) :\n                      C / (2 - 2 * L));\n        return {h: H, s: S, l: L, toString: hsltoString};\n    };\n    R._path2string = function () {\n        return this.join(\",\").replace(p2s, \"$1\");\n    };\n    function repush(array, item) {\n        for (var i = 0, ii = array.length; i < ii; i++) if (array[i] === item) {\n            return array.push(array.splice(i, 1)[0]);\n        }\n    }\n    function cacher(f, scope, postprocessor) {\n        function newf() {\n            var arg = Array.prototype.slice.call(arguments, 0),\n                args = arg.join(\"\\u2400\"),\n                cache = newf.cache = newf.cache || {},\n                count = newf.count = newf.count || [];\n            if (cache[has](args)) {\n                repush(count, args);\n                return postprocessor ? postprocessor(cache[args]) : cache[args];\n            }\n            count.length >= 1e3 && delete cache[count.shift()];\n            count.push(args);\n            cache[args] = f[apply](scope, arg);\n            return postprocessor ? postprocessor(cache[args]) : cache[args];\n        }\n        return newf;\n    }\n\n    var preload = R._preload = function (src, f) {\n        var img = g.doc.createElement(\"img\");\n        img.style.cssText = \"position:absolute;left:-9999em;top:-9999em\";\n        img.onload = function () {\n            f.call(this);\n            this.onload = null;\n            g.doc.body.removeChild(this);\n        };\n        img.onerror = function () {\n            g.doc.body.removeChild(this);\n        };\n        g.doc.body.appendChild(img);\n        img.src = src;\n    };\n\n    function clrToString() {\n        return this.hex;\n    }\n\n    /*\\\n     * Raphael.getRGB\n     [ method ]\n     **\n     * Parses colour string as RGB object\n     > Parameters\n     - colour (string) colour string in one of formats:\n     # <ul>\n     #     <li>Colour name (\u201C<code>red</code>\u201D, \u201C<code>green</code>\u201D, \u201C<code>cornflowerblue</code>\u201D, etc)</li>\n     #     <li>#\u2022\u2022\u2022 \u2014 shortened HTML colour: (\u201C<code>#000</code>\u201D, \u201C<code>#fc0</code>\u201D, etc)</li>\n     #     <li>#\u2022\u2022\u2022\u2022\u2022\u2022 \u2014 full length HTML colour: (\u201C<code>#000000</code>\u201D, \u201C<code>#bd2300</code>\u201D)</li>\n     #     <li>rgb(\u2022\u2022\u2022, \u2022\u2022\u2022, \u2022\u2022\u2022) \u2014 red, green and blue channels\u2019 values: (\u201C<code>rgb(200,&nbsp;100,&nbsp;0)</code>\u201D)</li>\n     #     <li>rgb(\u2022\u2022\u2022%, \u2022\u2022\u2022%, \u2022\u2022\u2022%) \u2014 same as above, but in %: (\u201C<code>rgb(100%,&nbsp;175%,&nbsp;0%)</code>\u201D)</li>\n     #     <li>hsb(\u2022\u2022\u2022, \u2022\u2022\u2022, \u2022\u2022\u2022) \u2014 hue, saturation and brightness values: (\u201C<code>hsb(0.5,&nbsp;0.25,&nbsp;1)</code>\u201D)</li>\n     #     <li>hsb(\u2022\u2022\u2022%, \u2022\u2022\u2022%, \u2022\u2022\u2022%) \u2014 same as above, but in %</li>\n     #     <li>hsl(\u2022\u2022\u2022, \u2022\u2022\u2022, \u2022\u2022\u2022) \u2014 same as hsb</li>\n     #     <li>hsl(\u2022\u2022\u2022%, \u2022\u2022\u2022%, \u2022\u2022\u2022%) \u2014 same as hsb</li>\n     # </ul>\n     = (object) RGB object in format:\n     o {\n     o     r (number) red,\n     o     g (number) green,\n     o     b (number) blue\n     o     hex (string) color in HTML/CSS format: #\u2022\u2022\u2022\u2022\u2022\u2022,\n     o     error (boolean) true if string can\u2019t be parsed\n     o }\n    \\*/\n    R.getRGB = cacher(function (colour) {\n        if (!colour || !!((colour = Str(colour)).indexOf(\"-\") + 1)) {\n            return {r: -1, g: -1, b: -1, hex: \"none\", error: 1, toString: clrToString};\n        }\n        if (colour == \"none\") {\n            return {r: -1, g: -1, b: -1, hex: \"none\", toString: clrToString};\n        }\n        !(hsrg[has](colour.toLowerCase().substring(0, 2)) || colour.charAt() == \"#\") && (colour = toHex(colour));\n        var res,\n            red,\n            green,\n            blue,\n            opacity,\n            t,\n            values,\n            rgb = colour.match(colourRegExp);\n        if (rgb) {\n            if (rgb[2]) {\n                blue = toInt(rgb[2].substring(5), 16);\n                green = toInt(rgb[2].substring(3, 5), 16);\n                red = toInt(rgb[2].substring(1, 3), 16);\n            }\n            if (rgb[3]) {\n                blue = toInt((t = rgb[3].charAt(3)) + t, 16);\n                green = toInt((t = rgb[3].charAt(2)) + t, 16);\n                red = toInt((t = rgb[3].charAt(1)) + t, 16);\n            }\n            if (rgb[4]) {\n                values = rgb[4][split](commaSpaces);\n                red = toFloat(values[0]);\n                values[0].slice(-1) == \"%\" && (red *= 2.55);\n                green = toFloat(values[1]);\n                values[1].slice(-1) == \"%\" && (green *= 2.55);\n                blue = toFloat(values[2]);\n                values[2].slice(-1) == \"%\" && (blue *= 2.55);\n                rgb[1].toLowerCase().slice(0, 4) == \"rgba\" && (opacity = toFloat(values[3]));\n                values[3] && values[3].slice(-1) == \"%\" && (opacity /= 100);\n            }\n            if (rgb[5]) {\n                values = rgb[5][split](commaSpaces);\n                red = toFloat(values[0]);\n                values[0].slice(-1) == \"%\" && (red *= 2.55);\n                green = toFloat(values[1]);\n                values[1].slice(-1) == \"%\" && (green *= 2.55);\n                blue = toFloat(values[2]);\n                values[2].slice(-1) == \"%\" && (blue *= 2.55);\n                (values[0].slice(-3) == \"deg\" || values[0].slice(-1) == \"\\xb0\") && (red /= 360);\n                rgb[1].toLowerCase().slice(0, 4) == \"hsba\" && (opacity = toFloat(values[3]));\n                values[3] && values[3].slice(-1) == \"%\" && (opacity /= 100);\n                return R.hsb2rgb(red, green, blue, opacity);\n            }\n            if (rgb[6]) {\n                values = rgb[6][split](commaSpaces);\n                red = toFloat(values[0]);\n                values[0].slice(-1) == \"%\" && (red *= 2.55);\n                green = toFloat(values[1]);\n                values[1].slice(-1) == \"%\" && (green *= 2.55);\n                blue = toFloat(values[2]);\n                values[2].slice(-1) == \"%\" && (blue *= 2.55);\n                (values[0].slice(-3) == \"deg\" || values[0].slice(-1) == \"\\xb0\") && (red /= 360);\n                rgb[1].toLowerCase().slice(0, 4) == \"hsla\" && (opacity = toFloat(values[3]));\n                values[3] && values[3].slice(-1) == \"%\" && (opacity /= 100);\n                return R.hsl2rgb(red, green, blue, opacity);\n            }\n            rgb = {r: red, g: green, b: blue, toString: clrToString};\n            rgb.hex = \"#\" + (16777216 | blue | (green << 8) | (red << 16)).toString(16).slice(1);\n            R.is(opacity, \"finite\") && (rgb.opacity = opacity);\n            return rgb;\n        }\n        return {r: -1, g: -1, b: -1, hex: \"none\", error: 1, toString: clrToString};\n    }, R);\n    /*\\\n     * Raphael.hsb\n     [ method ]\n     **\n     * Converts HSB values to hex representation of the colour.\n     > Parameters\n     - h (number) hue\n     - s (number) saturation\n     - b (number) value or brightness\n     = (string) hex representation of the colour.\n    \\*/\n    R.hsb = cacher(function (h, s, b) {\n        return R.hsb2rgb(h, s, b).hex;\n    });\n    /*\\\n     * Raphael.hsl\n     [ method ]\n     **\n     * Converts HSL values to hex representation of the colour.\n     > Parameters\n     - h (number) hue\n     - s (number) saturation\n     - l (number) luminosity\n     = (string) hex representation of the colour.\n    \\*/\n    R.hsl = cacher(function (h, s, l) {\n        return R.hsl2rgb(h, s, l).hex;\n    });\n    /*\\\n     * Raphael.rgb\n     [ method ]\n     **\n     * Converts RGB values to hex representation of the colour.\n     > Parameters\n     - r (number) red\n     - g (number) green\n     - b (number) blue\n     = (string) hex representation of the colour.\n    \\*/\n    R.rgb = cacher(function (r, g, b) {\n        function round(x) { return (x + 0.5) | 0; }\n        return \"#\" + (16777216 | round(b) | (round(g) << 8) | (round(r) << 16)).toString(16).slice(1);\n    });\n    /*\\\n     * Raphael.getColor\n     [ method ]\n     **\n     * On each call returns next colour in the spectrum. To reset it back to red call @Raphael.getColor.reset\n     > Parameters\n     - value (number) #optional brightness, default is `0.75`\n     = (string) hex representation of the colour.\n    \\*/\n    R.getColor = function (value) {\n        var start = this.getColor.start = this.getColor.start || {h: 0, s: 1, b: value || .75},\n            rgb = this.hsb2rgb(start.h, start.s, start.b);\n        start.h += .075;\n        if (start.h > 1) {\n            start.h = 0;\n            start.s -= .2;\n            start.s <= 0 && (this.getColor.start = {h: 0, s: 1, b: start.b});\n        }\n        return rgb.hex;\n    };\n    /*\\\n     * Raphael.getColor.reset\n     [ method ]\n     **\n     * Resets spectrum position for @Raphael.getColor back to red.\n    \\*/\n    R.getColor.reset = function () {\n        delete this.start;\n    };\n\n    // http://schepers.cc/getting-to-the-point\n    function catmullRom2bezier(crp, z) {\n        var d = [];\n        for (var i = 0, iLen = crp.length; iLen - 2 * !z > i; i += 2) {\n            var p = [\n                        {x: +crp[i - 2], y: +crp[i - 1]},\n                        {x: +crp[i],     y: +crp[i + 1]},\n                        {x: +crp[i + 2], y: +crp[i + 3]},\n                        {x: +crp[i + 4], y: +crp[i + 5]}\n                    ];\n            if (z) {\n                if (!i) {\n                    p[0] = {x: +crp[iLen - 2], y: +crp[iLen - 1]};\n                } else if (iLen - 4 == i) {\n                    p[3] = {x: +crp[0], y: +crp[1]};\n                } else if (iLen - 2 == i) {\n                    p[2] = {x: +crp[0], y: +crp[1]};\n                    p[3] = {x: +crp[2], y: +crp[3]};\n                }\n            } else {\n                if (iLen - 4 == i) {\n                    p[3] = p[2];\n                } else if (!i) {\n                    p[0] = {x: +crp[i], y: +crp[i + 1]};\n                }\n            }\n            d.push([\"C\",\n                  (-p[0].x + 6 * p[1].x + p[2].x) / 6,\n                  (-p[0].y + 6 * p[1].y + p[2].y) / 6,\n                  (p[1].x + 6 * p[2].x - p[3].x) / 6,\n                  (p[1].y + 6*p[2].y - p[3].y) / 6,\n                  p[2].x,\n                  p[2].y\n            ]);\n        }\n\n        return d;\n    }\n    /*\\\n     * Raphael.parsePathString\n     [ method ]\n     **\n     * Utility method\n     **\n     * Parses given path string into an array of arrays of path segments.\n     > Parameters\n     - pathString (string|array) path string or array of segments (in the last case it will be returned straight away)\n     = (array) array of segments.\n    \\*/\n    R.parsePathString = function (pathString) {\n        if (!pathString) {\n            return null;\n        }\n        var pth = paths(pathString);\n        if (pth.arr) {\n            return pathClone(pth.arr);\n        }\n\n        var paramCounts = {a: 7, c: 6, h: 1, l: 2, m: 2, r: 4, q: 4, s: 4, t: 2, v: 1, z: 0},\n            data = [];\n        if (R.is(pathString, array) && R.is(pathString[0], array)) { // rough assumption\n            data = pathClone(pathString);\n        }\n        if (!data.length) {\n            Str(pathString).replace(pathCommand, function (a, b, c) {\n                var params = [],\n                    name = b.toLowerCase();\n                c.replace(pathValues, function (a, b) {\n                    b && params.push(+b);\n                });\n                if (name == \"m\" && params.length > 2) {\n                    data.push([b][concat](params.splice(0, 2)));\n                    name = \"l\";\n                    b = b == \"m\" ? \"l\" : \"L\";\n                }\n                if (name == \"r\") {\n                    data.push([b][concat](params));\n                } else while (params.length >= paramCounts[name]) {\n                    data.push([b][concat](params.splice(0, paramCounts[name])));\n                    if (!paramCounts[name]) {\n                        break;\n                    }\n                }\n            });\n        }\n        data.toString = R._path2string;\n        pth.arr = pathClone(data);\n        return data;\n    };\n    /*\\\n     * Raphael.parseTransformString\n     [ method ]\n     **\n     * Utility method\n     **\n     * Parses given path string into an array of transformations.\n     > Parameters\n     - TString (string|array) transform string or array of transformations (in the last case it will be returned straight away)\n     = (array) array of transformations.\n    \\*/\n    R.parseTransformString = cacher(function (TString) {\n        if (!TString) {\n            return null;\n        }\n        var paramCounts = {r: 3, s: 4, t: 2, m: 6},\n            data = [];\n        if (R.is(TString, array) && R.is(TString[0], array)) { // rough assumption\n            data = pathClone(TString);\n        }\n        if (!data.length) {\n            Str(TString).replace(tCommand, function (a, b, c) {\n                var params = [],\n                    name = lowerCase.call(b);\n                c.replace(pathValues, function (a, b) {\n                    b && params.push(+b);\n                });\n                data.push([b][concat](params));\n            });\n        }\n        data.toString = R._path2string;\n        return data;\n    }, this, function(elem) {\n        if (!elem) return elem;\n        var newData = [];\n        for (var i = 0; i < elem.length; i++) {\n            var newLevel = [];\n            for (var j = 0; j < elem[i].length; j++) {\n                newLevel.push(elem[i][j]);\n            }\n            newData.push(newLevel);\n        }\n      return newData; } );\n    // PATHS\n    var paths = function (ps) {\n        var p = paths.ps = paths.ps || {};\n        if (p[ps]) {\n            p[ps].sleep = 100;\n        } else {\n            p[ps] = {\n                sleep: 100\n            };\n        }\n        setTimeout(function () {\n            for (var key in p) if (p[has](key) && key != ps) {\n                p[key].sleep--;\n                !p[key].sleep && delete p[key];\n            }\n        });\n        return p[ps];\n    };\n    /*\\\n     * Raphael.findDotsAtSegment\n     [ method ]\n     **\n     * Utility method\n     **\n     * Find dot coordinates on the given cubic bezier curve at the given t.\n     > Parameters\n     - p1x (number) x of the first point of the curve\n     - p1y (number) y of the first point of the curve\n     - c1x (number) x of the first anchor of the curve\n     - c1y (number) y of the first anchor of the curve\n     - c2x (number) x of the second anchor of the curve\n     - c2y (number) y of the second anchor of the curve\n     - p2x (number) x of the second point of the curve\n     - p2y (number) y of the second point of the curve\n     - t (number) position on the curve (0..1)\n     = (object) point information in format:\n     o {\n     o     x: (number) x coordinate of the point\n     o     y: (number) y coordinate of the point\n     o     m: {\n     o         x: (number) x coordinate of the left anchor\n     o         y: (number) y coordinate of the left anchor\n     o     }\n     o     n: {\n     o         x: (number) x coordinate of the right anchor\n     o         y: (number) y coordinate of the right anchor\n     o     }\n     o     start: {\n     o         x: (number) x coordinate of the start of the curve\n     o         y: (number) y coordinate of the start of the curve\n     o     }\n     o     end: {\n     o         x: (number) x coordinate of the end of the curve\n     o         y: (number) y coordinate of the end of the curve\n     o     }\n     o     alpha: (number) angle of the curve derivative at the point\n     o }\n    \\*/\n    R.findDotsAtSegment = function (p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, t) {\n        var t1 = 1 - t,\n            t13 = pow(t1, 3),\n            t12 = pow(t1, 2),\n            t2 = t * t,\n            t3 = t2 * t,\n            x = t13 * p1x + t12 * 3 * t * c1x + t1 * 3 * t * t * c2x + t3 * p2x,\n            y = t13 * p1y + t12 * 3 * t * c1y + t1 * 3 * t * t * c2y + t3 * p2y,\n            mx = p1x + 2 * t * (c1x - p1x) + t2 * (c2x - 2 * c1x + p1x),\n            my = p1y + 2 * t * (c1y - p1y) + t2 * (c2y - 2 * c1y + p1y),\n            nx = c1x + 2 * t * (c2x - c1x) + t2 * (p2x - 2 * c2x + c1x),\n            ny = c1y + 2 * t * (c2y - c1y) + t2 * (p2y - 2 * c2y + c1y),\n            ax = t1 * p1x + t * c1x,\n            ay = t1 * p1y + t * c1y,\n            cx = t1 * c2x + t * p2x,\n            cy = t1 * c2y + t * p2y,\n            alpha = (90 - math.atan2(mx - nx, my - ny) * 180 / PI);\n        (mx > nx || my < ny) && (alpha += 180);\n        return {\n            x: x,\n            y: y,\n            m: {x: mx, y: my},\n            n: {x: nx, y: ny},\n            start: {x: ax, y: ay},\n            end: {x: cx, y: cy},\n            alpha: alpha\n        };\n    };\n    /*\\\n     * Raphael.bezierBBox\n     [ method ]\n     **\n     * Utility method\n     **\n     * Return bounding box of a given cubic bezier curve\n     > Parameters\n     - p1x (number) x of the first point of the curve\n     - p1y (number) y of the first point of the curve\n     - c1x (number) x of the first anchor of the curve\n     - c1y (number) y of the first anchor of the curve\n     - c2x (number) x of the second anchor of the curve\n     - c2y (number) y of the second anchor of the curve\n     - p2x (number) x of the second point of the curve\n     - p2y (number) y of the second point of the curve\n     * or\n     - bez (array) array of six points for bezier curve\n     = (object) point information in format:\n     o {\n     o     min: {\n     o         x: (number) x coordinate of the left point\n     o         y: (number) y coordinate of the top point\n     o     }\n     o     max: {\n     o         x: (number) x coordinate of the right point\n     o         y: (number) y coordinate of the bottom point\n     o     }\n     o }\n    \\*/\n    R.bezierBBox = function (p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y) {\n        if (!R.is(p1x, \"array\")) {\n            p1x = [p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y];\n        }\n        var bbox = curveDim.apply(null, p1x);\n        return {\n            x: bbox.min.x,\n            y: bbox.min.y,\n            x2: bbox.max.x,\n            y2: bbox.max.y,\n            width: bbox.max.x - bbox.min.x,\n            height: bbox.max.y - bbox.min.y\n        };\n    };\n    /*\\\n     * Raphael.isPointInsideBBox\n     [ method ]\n     **\n     * Utility method\n     **\n     * Returns `true` if given point is inside bounding boxes.\n     > Parameters\n     - bbox (string) bounding box\n     - x (string) x coordinate of the point\n     - y (string) y coordinate of the point\n     = (boolean) `true` if point inside\n    \\*/\n    R.isPointInsideBBox = function (bbox, x, y) {\n        return x >= bbox.x && x <= bbox.x2 && y >= bbox.y && y <= bbox.y2;\n    };\n    /*\\\n     * Raphael.isBBoxIntersect\n     [ method ]\n     **\n     * Utility method\n     **\n     * Returns `true` if two bounding boxes intersect\n     > Parameters\n     - bbox1 (string) first bounding box\n     - bbox2 (string) second bounding box\n     = (boolean) `true` if they intersect\n    \\*/\n    R.isBBoxIntersect = function (bbox1, bbox2) {\n        var i = R.isPointInsideBBox;\n        return i(bbox2, bbox1.x, bbox1.y)\n            || i(bbox2, bbox1.x2, bbox1.y)\n            || i(bbox2, bbox1.x, bbox1.y2)\n            || i(bbox2, bbox1.x2, bbox1.y2)\n            || i(bbox1, bbox2.x, bbox2.y)\n            || i(bbox1, bbox2.x2, bbox2.y)\n            || i(bbox1, bbox2.x, bbox2.y2)\n            || i(bbox1, bbox2.x2, bbox2.y2)\n            || (bbox1.x < bbox2.x2 && bbox1.x > bbox2.x || bbox2.x < bbox1.x2 && bbox2.x > bbox1.x)\n            && (bbox1.y < bbox2.y2 && bbox1.y > bbox2.y || bbox2.y < bbox1.y2 && bbox2.y > bbox1.y);\n    };\n    function base3(t, p1, p2, p3, p4) {\n        var t1 = -3 * p1 + 9 * p2 - 9 * p3 + 3 * p4,\n            t2 = t * t1 + 6 * p1 - 12 * p2 + 6 * p3;\n        return t * t2 - 3 * p1 + 3 * p2;\n    }\n    function bezlen(x1, y1, x2, y2, x3, y3, x4, y4, z) {\n        if (z == null) {\n            z = 1;\n        }\n        z = z > 1 ? 1 : z < 0 ? 0 : z;\n        var z2 = z / 2,\n            n = 12,\n            Tvalues = [-0.1252,0.1252,-0.3678,0.3678,-0.5873,0.5873,-0.7699,0.7699,-0.9041,0.9041,-0.9816,0.9816],\n            Cvalues = [0.2491,0.2491,0.2335,0.2335,0.2032,0.2032,0.1601,0.1601,0.1069,0.1069,0.0472,0.0472],\n            sum = 0;\n        for (var i = 0; i < n; i++) {\n            var ct = z2 * Tvalues[i] + z2,\n                xbase = base3(ct, x1, x2, x3, x4),\n                ybase = base3(ct, y1, y2, y3, y4),\n                comb = xbase * xbase + ybase * ybase;\n            sum += Cvalues[i] * math.sqrt(comb);\n        }\n        return z2 * sum;\n    }\n    function getTatLen(x1, y1, x2, y2, x3, y3, x4, y4, ll) {\n        if (ll < 0 || bezlen(x1, y1, x2, y2, x3, y3, x4, y4) < ll) {\n            return;\n        }\n        var t = 1,\n            step = t / 2,\n            t2 = t - step,\n            l,\n            e = .01;\n        l = bezlen(x1, y1, x2, y2, x3, y3, x4, y4, t2);\n        while (abs(l - ll) > e) {\n            step /= 2;\n            t2 += (l < ll ? 1 : -1) * step;\n            l = bezlen(x1, y1, x2, y2, x3, y3, x4, y4, t2);\n        }\n        return t2;\n    }\n    function intersect(x1, y1, x2, y2, x3, y3, x4, y4) {\n        if (\n            mmax(x1, x2) < mmin(x3, x4) ||\n            mmin(x1, x2) > mmax(x3, x4) ||\n            mmax(y1, y2) < mmin(y3, y4) ||\n            mmin(y1, y2) > mmax(y3, y4)\n        ) {\n            return;\n        }\n        var nx = (x1 * y2 - y1 * x2) * (x3 - x4) - (x1 - x2) * (x3 * y4 - y3 * x4),\n            ny = (x1 * y2 - y1 * x2) * (y3 - y4) - (y1 - y2) * (x3 * y4 - y3 * x4),\n            denominator = (x1 - x2) * (y3 - y4) - (y1 - y2) * (x3 - x4);\n\n        if (!denominator) {\n            return;\n        }\n        var px = nx / denominator,\n            py = ny / denominator,\n            px2 = +px.toFixed(2),\n            py2 = +py.toFixed(2);\n        if (\n            px2 < +mmin(x1, x2).toFixed(2) ||\n            px2 > +mmax(x1, x2).toFixed(2) ||\n            px2 < +mmin(x3, x4).toFixed(2) ||\n            px2 > +mmax(x3, x4).toFixed(2) ||\n            py2 < +mmin(y1, y2).toFixed(2) ||\n            py2 > +mmax(y1, y2).toFixed(2) ||\n            py2 < +mmin(y3, y4).toFixed(2) ||\n            py2 > +mmax(y3, y4).toFixed(2)\n        ) {\n            return;\n        }\n        return {x: px, y: py};\n    }\n    function inter(bez1, bez2) {\n        return interHelper(bez1, bez2);\n    }\n    function interCount(bez1, bez2) {\n        return interHelper(bez1, bez2, 1);\n    }\n    function interHelper(bez1, bez2, justCount) {\n        var bbox1 = R.bezierBBox(bez1),\n            bbox2 = R.bezierBBox(bez2);\n        if (!R.isBBoxIntersect(bbox1, bbox2)) {\n            return justCount ? 0 : [];\n        }\n        var l1 = bezlen.apply(0, bez1),\n            l2 = bezlen.apply(0, bez2),\n            n1 = mmax(~~(l1 / 5), 1),\n            n2 = mmax(~~(l2 / 5), 1),\n            dots1 = [],\n            dots2 = [],\n            xy = {},\n            res = justCount ? 0 : [];\n        for (var i = 0; i < n1 + 1; i++) {\n            var p = R.findDotsAtSegment.apply(R, bez1.concat(i / n1));\n            dots1.push({x: p.x, y: p.y, t: i / n1});\n        }\n        for (i = 0; i < n2 + 1; i++) {\n            p = R.findDotsAtSegment.apply(R, bez2.concat(i / n2));\n            dots2.push({x: p.x, y: p.y, t: i / n2});\n        }\n        for (i = 0; i < n1; i++) {\n            for (var j = 0; j < n2; j++) {\n                var di = dots1[i],\n                    di1 = dots1[i + 1],\n                    dj = dots2[j],\n                    dj1 = dots2[j + 1],\n                    ci = abs(di1.x - di.x) < .001 ? \"y\" : \"x\",\n                    cj = abs(dj1.x - dj.x) < .001 ? \"y\" : \"x\",\n                    is = intersect(di.x, di.y, di1.x, di1.y, dj.x, dj.y, dj1.x, dj1.y);\n                if (is) {\n                    if (xy[is.x.toFixed(4)] == is.y.toFixed(4)) {\n                        continue;\n                    }\n                    xy[is.x.toFixed(4)] = is.y.toFixed(4);\n                    var t1 = di.t + abs((is[ci] - di[ci]) / (di1[ci] - di[ci])) * (di1.t - di.t),\n                        t2 = dj.t + abs((is[cj] - dj[cj]) / (dj1[cj] - dj[cj])) * (dj1.t - dj.t);\n                    if (t1 >= 0 && t1 <= 1.001 && t2 >= 0 && t2 <= 1.001) {\n                        if (justCount) {\n                            res++;\n                        } else {\n                            res.push({\n                                x: is.x,\n                                y: is.y,\n                                t1: mmin(t1, 1),\n                                t2: mmin(t2, 1)\n                            });\n                        }\n                    }\n                }\n            }\n        }\n        return res;\n    }\n    /*\\\n     * Raphael.pathIntersection\n     [ method ]\n     **\n     * Utility method\n     **\n     * Finds intersections of two paths\n     > Parameters\n     - path1 (string) path string\n     - path2 (string) path string\n     = (array) dots of intersection\n     o [\n     o     {\n     o         x: (number) x coordinate of the point\n     o         y: (number) y coordinate of the point\n     o         t1: (number) t value for segment of path1\n     o         t2: (number) t value for segment of path2\n     o         segment1: (number) order number for segment of path1\n     o         segment2: (number) order number for segment of path2\n     o         bez1: (array) eight coordinates representing bezi\u00E9r curve for the segment of path1\n     o         bez2: (array) eight coordinates representing bezi\u00E9r curve for the segment of path2\n     o     }\n     o ]\n    \\*/\n    R.pathIntersection = function (path1, path2) {\n        return interPathHelper(path1, path2);\n    };\n    R.pathIntersectionNumber = function (path1, path2) {\n        return interPathHelper(path1, path2, 1);\n    };\n    function interPathHelper(path1, path2, justCount) {\n        path1 = R._path2curve(path1);\n        path2 = R._path2curve(path2);\n        var x1, y1, x2, y2, x1m, y1m, x2m, y2m, bez1, bez2,\n            res = justCount ? 0 : [];\n        for (var i = 0, ii = path1.length; i < ii; i++) {\n            var pi = path1[i];\n            if (pi[0] == \"M\") {\n                x1 = x1m = pi[1];\n                y1 = y1m = pi[2];\n            } else {\n                if (pi[0] == \"C\") {\n                    bez1 = [x1, y1].concat(pi.slice(1));\n                    x1 = bez1[6];\n                    y1 = bez1[7];\n                } else {\n                    bez1 = [x1, y1, x1, y1, x1m, y1m, x1m, y1m];\n                    x1 = x1m;\n                    y1 = y1m;\n                }\n                for (var j = 0, jj = path2.length; j < jj; j++) {\n                    var pj = path2[j];\n                    if (pj[0] == \"M\") {\n                        x2 = x2m = pj[1];\n                        y2 = y2m = pj[2];\n                    } else {\n                        if (pj[0] == \"C\") {\n                            bez2 = [x2, y2].concat(pj.slice(1));\n                            x2 = bez2[6];\n                            y2 = bez2[7];\n                        } else {\n                            bez2 = [x2, y2, x2, y2, x2m, y2m, x2m, y2m];\n                            x2 = x2m;\n                            y2 = y2m;\n                        }\n                        var intr = interHelper(bez1, bez2, justCount);\n                        if (justCount) {\n                            res += intr;\n                        } else {\n                            for (var k = 0, kk = intr.length; k < kk; k++) {\n                                intr[k].segment1 = i;\n                                intr[k].segment2 = j;\n                                intr[k].bez1 = bez1;\n                                intr[k].bez2 = bez2;\n                            }\n                            res = res.concat(intr);\n                        }\n                    }\n                }\n            }\n        }\n        return res;\n    }\n    /*\\\n     * Raphael.isPointInsidePath\n     [ method ]\n     **\n     * Utility method\n     **\n     * Returns `true` if given point is inside a given closed path.\n     > Parameters\n     - path (string) path string\n     - x (number) x of the point\n     - y (number) y of the point\n     = (boolean) true, if point is inside the path\n    \\*/\n    R.isPointInsidePath = function (path, x, y) {\n        var bbox = R.pathBBox(path);\n        return R.isPointInsideBBox(bbox, x, y) &&\n               interPathHelper(path, [[\"M\", x, y], [\"H\", bbox.x2 + 10]], 1) % 2 == 1;\n    };\n    R._removedFactory = function (methodname) {\n        return function () {\n            eve(\"raphael.log\", null, \"Rapha\\xebl: you are calling to method \\u201c\" + methodname + \"\\u201d of removed object\", methodname);\n        };\n    };\n    /*\\\n     * Raphael.pathBBox\n     [ method ]\n     **\n     * Utility method\n     **\n     * Return bounding box of a given path\n     > Parameters\n     - path (string) path string\n     = (object) bounding box\n     o {\n     o     x: (number) x coordinate of the left top point of the box\n     o     y: (number) y coordinate of the left top point of the box\n     o     x2: (number) x coordinate of the right bottom point of the box\n     o     y2: (number) y coordinate of the right bottom point of the box\n     o     width: (number) width of the box\n     o     height: (number) height of the box\n     o     cx: (number) x coordinate of the center of the box\n     o     cy: (number) y coordinate of the center of the box\n     o }\n    \\*/\n    var pathDimensions = R.pathBBox = function (path) {\n        var pth = paths(path);\n        if (pth.bbox) {\n            return clone(pth.bbox);\n        }\n        if (!path) {\n            return {x: 0, y: 0, width: 0, height: 0, x2: 0, y2: 0};\n        }\n        path = path2curve(path);\n        var x = 0,\n            y = 0,\n            X = [],\n            Y = [],\n            p;\n        for (var i = 0, ii = path.length; i < ii; i++) {\n            p = path[i];\n            if (p[0] == \"M\") {\n                x = p[1];\n                y = p[2];\n                X.push(x);\n                Y.push(y);\n            } else {\n                var dim = curveDim(x, y, p[1], p[2], p[3], p[4], p[5], p[6]);\n                X = X[concat](dim.min.x, dim.max.x);\n                Y = Y[concat](dim.min.y, dim.max.y);\n                x = p[5];\n                y = p[6];\n            }\n        }\n        var xmin = mmin[apply](0, X),\n            ymin = mmin[apply](0, Y),\n            xmax = mmax[apply](0, X),\n            ymax = mmax[apply](0, Y),\n            width = xmax - xmin,\n            height = ymax - ymin,\n                bb = {\n                x: xmin,\n                y: ymin,\n                x2: xmax,\n                y2: ymax,\n                width: width,\n                height: height,\n                cx: xmin + width / 2,\n                cy: ymin + height / 2\n            };\n        pth.bbox = clone(bb);\n        return bb;\n    },\n        pathClone = function (pathArray) {\n            var res = clone(pathArray);\n            res.toString = R._path2string;\n            return res;\n        },\n        pathToRelative = R._pathToRelative = function (pathArray) {\n            var pth = paths(pathArray);\n            if (pth.rel) {\n                return pathClone(pth.rel);\n            }\n            if (!R.is(pathArray, array) || !R.is(pathArray && pathArray[0], array)) { // rough assumption\n                pathArray = R.parsePathString(pathArray);\n            }\n            var res = [],\n                x = 0,\n                y = 0,\n                mx = 0,\n                my = 0,\n                start = 0;\n            if (pathArray[0][0] == \"M\") {\n                x = pathArray[0][1];\n                y = pathArray[0][2];\n                mx = x;\n                my = y;\n                start++;\n                res.push([\"M\", x, y]);\n            }\n            for (var i = start, ii = pathArray.length; i < ii; i++) {\n                var r = res[i] = [],\n                    pa = pathArray[i];\n                if (pa[0] != lowerCase.call(pa[0])) {\n                    r[0] = lowerCase.call(pa[0]);\n                    switch (r[0]) {\n                        case \"a\":\n                            r[1] = pa[1];\n                            r[2] = pa[2];\n                            r[3] = pa[3];\n                            r[4] = pa[4];\n                            r[5] = pa[5];\n                            r[6] = +(pa[6] - x).toFixed(3);\n                            r[7] = +(pa[7] - y).toFixed(3);\n                            break;\n                        case \"v\":\n                            r[1] = +(pa[1] - y).toFixed(3);\n                            break;\n                        case \"m\":\n                            mx = pa[1];\n                            my = pa[2];\n                        default:\n                            for (var j = 1, jj = pa.length; j < jj; j++) {\n                                r[j] = +(pa[j] - ((j % 2) ? x : y)).toFixed(3);\n                            }\n                    }\n                } else {\n                    r = res[i] = [];\n                    if (pa[0] == \"m\") {\n                        mx = pa[1] + x;\n                        my = pa[2] + y;\n                    }\n                    for (var k = 0, kk = pa.length; k < kk; k++) {\n                        res[i][k] = pa[k];\n                    }\n                }\n                var len = res[i].length;\n                switch (res[i][0]) {\n                    case \"z\":\n                        x = mx;\n                        y = my;\n                        break;\n                    case \"h\":\n                        x += +res[i][len - 1];\n                        break;\n                    case \"v\":\n                        y += +res[i][len - 1];\n                        break;\n                    default:\n                        x += +res[i][len - 2];\n                        y += +res[i][len - 1];\n                }\n            }\n            res.toString = R._path2string;\n            pth.rel = pathClone(res);\n            return res;\n        },\n        pathToAbsolute = R._pathToAbsolute = function (pathArray) {\n            var pth = paths(pathArray);\n            if (pth.abs) {\n                return pathClone(pth.abs);\n            }\n            if (!R.is(pathArray, array) || !R.is(pathArray && pathArray[0], array)) { // rough assumption\n                pathArray = R.parsePathString(pathArray);\n            }\n            if (!pathArray || !pathArray.length) {\n                return [[\"M\", 0, 0]];\n            }\n            var res = [],\n                x = 0,\n                y = 0,\n                mx = 0,\n                my = 0,\n                start = 0;\n            if (pathArray[0][0] == \"M\") {\n                x = +pathArray[0][1];\n                y = +pathArray[0][2];\n                mx = x;\n                my = y;\n                start++;\n                res[0] = [\"M\", x, y];\n            }\n            var crz = pathArray.length == 3 && pathArray[0][0] == \"M\" && pathArray[1][0].toUpperCase() == \"R\" && pathArray[2][0].toUpperCase() == \"Z\";\n            for (var r, pa, i = start, ii = pathArray.length; i < ii; i++) {\n                res.push(r = []);\n                pa = pathArray[i];\n                if (pa[0] != upperCase.call(pa[0])) {\n                    r[0] = upperCase.call(pa[0]);\n                    switch (r[0]) {\n                        case \"A\":\n                            r[1] = pa[1];\n                            r[2] = pa[2];\n                            r[3] = pa[3];\n                            r[4] = pa[4];\n                            r[5] = pa[5];\n                            r[6] = +(pa[6] + x);\n                            r[7] = +(pa[7] + y);\n                            break;\n                        case \"V\":\n                            r[1] = +pa[1] + y;\n                            break;\n                        case \"H\":\n                            r[1] = +pa[1] + x;\n                            break;\n                        case \"R\":\n                            var dots = [x, y][concat](pa.slice(1));\n                            for (var j = 2, jj = dots.length; j < jj; j++) {\n                                dots[j] = +dots[j] + x;\n                                dots[++j] = +dots[j] + y;\n                            }\n                            res.pop();\n                            res = res[concat](catmullRom2bezier(dots, crz));\n                            break;\n                        case \"M\":\n                            mx = +pa[1] + x;\n                            my = +pa[2] + y;\n                        default:\n                            for (j = 1, jj = pa.length; j < jj; j++) {\n                                r[j] = +pa[j] + ((j % 2) ? x : y);\n                            }\n                    }\n                } else if (pa[0] == \"R\") {\n                    dots = [x, y][concat](pa.slice(1));\n                    res.pop();\n                    res = res[concat](catmullRom2bezier(dots, crz));\n                    r = [\"R\"][concat](pa.slice(-2));\n                } else {\n                    for (var k = 0, kk = pa.length; k < kk; k++) {\n                        r[k] = pa[k];\n                    }\n                }\n                switch (r[0]) {\n                    case \"Z\":\n                        x = mx;\n                        y = my;\n                        break;\n                    case \"H\":\n                        x = r[1];\n                        break;\n                    case \"V\":\n                        y = r[1];\n                        break;\n                    case \"M\":\n                        mx = r[r.length - 2];\n                        my = r[r.length - 1];\n                    default:\n                        x = r[r.length - 2];\n                        y = r[r.length - 1];\n                }\n            }\n            res.toString = R._path2string;\n            pth.abs = pathClone(res);\n            return res;\n        },\n        l2c = function (x1, y1, x2, y2) {\n            return [x1, y1, x2, y2, x2, y2];\n        },\n        q2c = function (x1, y1, ax, ay, x2, y2) {\n            var _13 = 1 / 3,\n                _23 = 2 / 3;\n            return [\n                    _13 * x1 + _23 * ax,\n                    _13 * y1 + _23 * ay,\n                    _13 * x2 + _23 * ax,\n                    _13 * y2 + _23 * ay,\n                    x2,\n                    y2\n                ];\n        },\n        a2c = function (x1, y1, rx, ry, angle, large_arc_flag, sweep_flag, x2, y2, recursive) {\n            // for more information of where this math came from visit:\n            // http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes\n            var _120 = PI * 120 / 180,\n                rad = PI / 180 * (+angle || 0),\n                res = [],\n                xy,\n                rotate = cacher(function (x, y, rad) {\n                    var X = x * math.cos(rad) - y * math.sin(rad),\n                        Y = x * math.sin(rad) + y * math.cos(rad);\n                    return {x: X, y: Y};\n                });\n            if (!recursive) {\n                xy = rotate(x1, y1, -rad);\n                x1 = xy.x;\n                y1 = xy.y;\n                xy = rotate(x2, y2, -rad);\n                x2 = xy.x;\n                y2 = xy.y;\n                var cos = math.cos(PI / 180 * angle),\n                    sin = math.sin(PI / 180 * angle),\n                    x = (x1 - x2) / 2,\n                    y = (y1 - y2) / 2;\n                var h = (x * x) / (rx * rx) + (y * y) / (ry * ry);\n                if (h > 1) {\n                    h = math.sqrt(h);\n                    rx = h * rx;\n                    ry = h * ry;\n                }\n                var rx2 = rx * rx,\n                    ry2 = ry * ry,\n                    k = (large_arc_flag == sweep_flag ? -1 : 1) *\n                        math.sqrt(abs((rx2 * ry2 - rx2 * y * y - ry2 * x * x) / (rx2 * y * y + ry2 * x * x))),\n                    cx = k * rx * y / ry + (x1 + x2) / 2,\n                    cy = k * -ry * x / rx + (y1 + y2) / 2,\n                    f1 = math.asin(((y1 - cy) / ry).toFixed(9)),\n                    f2 = math.asin(((y2 - cy) / ry).toFixed(9));\n\n                f1 = x1 < cx ? PI - f1 : f1;\n                f2 = x2 < cx ? PI - f2 : f2;\n                f1 < 0 && (f1 = PI * 2 + f1);\n                f2 < 0 && (f2 = PI * 2 + f2);\n                if (sweep_flag && f1 > f2) {\n                    f1 = f1 - PI * 2;\n                }\n                if (!sweep_flag && f2 > f1) {\n                    f2 = f2 - PI * 2;\n                }\n            } else {\n                f1 = recursive[0];\n                f2 = recursive[1];\n                cx = recursive[2];\n                cy = recursive[3];\n            }\n            var df = f2 - f1;\n            if (abs(df) > _120) {\n                var f2old = f2,\n                    x2old = x2,\n                    y2old = y2;\n                f2 = f1 + _120 * (sweep_flag && f2 > f1 ? 1 : -1);\n                x2 = cx + rx * math.cos(f2);\n                y2 = cy + ry * math.sin(f2);\n                res = a2c(x2, y2, rx, ry, angle, 0, sweep_flag, x2old, y2old, [f2, f2old, cx, cy]);\n            }\n            df = f2 - f1;\n            var c1 = math.cos(f1),\n                s1 = math.sin(f1),\n                c2 = math.cos(f2),\n                s2 = math.sin(f2),\n                t = math.tan(df / 4),\n                hx = 4 / 3 * rx * t,\n                hy = 4 / 3 * ry * t,\n                m1 = [x1, y1],\n                m2 = [x1 + hx * s1, y1 - hy * c1],\n                m3 = [x2 + hx * s2, y2 - hy * c2],\n                m4 = [x2, y2];\n            m2[0] = 2 * m1[0] - m2[0];\n            m2[1] = 2 * m1[1] - m2[1];\n            if (recursive) {\n                return [m2, m3, m4][concat](res);\n            } else {\n                res = [m2, m3, m4][concat](res).join()[split](\",\");\n                var newres = [];\n                for (var i = 0, ii = res.length; i < ii; i++) {\n                    newres[i] = i % 2 ? rotate(res[i - 1], res[i], rad).y : rotate(res[i], res[i + 1], rad).x;\n                }\n                return newres;\n            }\n        },\n        findDotAtSegment = function (p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, t) {\n            var t1 = 1 - t;\n            return {\n                x: pow(t1, 3) * p1x + pow(t1, 2) * 3 * t * c1x + t1 * 3 * t * t * c2x + pow(t, 3) * p2x,\n                y: pow(t1, 3) * p1y + pow(t1, 2) * 3 * t * c1y + t1 * 3 * t * t * c2y + pow(t, 3) * p2y\n            };\n        },\n        curveDim = cacher(function (p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y) {\n            var a = (c2x - 2 * c1x + p1x) - (p2x - 2 * c2x + c1x),\n                b = 2 * (c1x - p1x) - 2 * (c2x - c1x),\n                c = p1x - c1x,\n                t1 = (-b + math.sqrt(b * b - 4 * a * c)) / 2 / a,\n                t2 = (-b - math.sqrt(b * b - 4 * a * c)) / 2 / a,\n                y = [p1y, p2y],\n                x = [p1x, p2x],\n                dot;\n            abs(t1) > \"1e12\" && (t1 = .5);\n            abs(t2) > \"1e12\" && (t2 = .5);\n            if (t1 > 0 && t1 < 1) {\n                dot = findDotAtSegment(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, t1);\n                x.push(dot.x);\n                y.push(dot.y);\n            }\n            if (t2 > 0 && t2 < 1) {\n                dot = findDotAtSegment(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, t2);\n                x.push(dot.x);\n                y.push(dot.y);\n            }\n            a = (c2y - 2 * c1y + p1y) - (p2y - 2 * c2y + c1y);\n            b = 2 * (c1y - p1y) - 2 * (c2y - c1y);\n            c = p1y - c1y;\n            t1 = (-b + math.sqrt(b * b - 4 * a * c)) / 2 / a;\n            t2 = (-b - math.sqrt(b * b - 4 * a * c)) / 2 / a;\n            abs(t1) > \"1e12\" && (t1 = .5);\n            abs(t2) > \"1e12\" && (t2 = .5);\n            if (t1 > 0 && t1 < 1) {\n                dot = findDotAtSegment(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, t1);\n                x.push(dot.x);\n                y.push(dot.y);\n            }\n            if (t2 > 0 && t2 < 1) {\n                dot = findDotAtSegment(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, t2);\n                x.push(dot.x);\n                y.push(dot.y);\n            }\n            return {\n                min: {x: mmin[apply](0, x), y: mmin[apply](0, y)},\n                max: {x: mmax[apply](0, x), y: mmax[apply](0, y)}\n            };\n        }),\n        path2curve = R._path2curve = cacher(function (path, path2) {\n            var pth = !path2 && paths(path);\n            if (!path2 && pth.curve) {\n                return pathClone(pth.curve);\n            }\n            var p = pathToAbsolute(path),\n                p2 = path2 && pathToAbsolute(path2),\n                attrs = {x: 0, y: 0, bx: 0, by: 0, X: 0, Y: 0, qx: null, qy: null},\n                attrs2 = {x: 0, y: 0, bx: 0, by: 0, X: 0, Y: 0, qx: null, qy: null},\n                processPath = function (path, d, pcom) {\n                    var nx, ny, tq = {T:1, Q:1};\n                    if (!path) {\n                        return [\"C\", d.x, d.y, d.x, d.y, d.x, d.y];\n                    }\n                    !(path[0] in tq) && (d.qx = d.qy = null);\n                    switch (path[0]) {\n                        case \"M\":\n                            d.X = path[1];\n                            d.Y = path[2];\n                            break;\n                        case \"A\":\n                            path = [\"C\"][concat](a2c[apply](0, [d.x, d.y][concat](path.slice(1))));\n                            break;\n                        case \"S\":\n                            if (pcom == \"C\" || pcom == \"S\") { // In \"S\" case we have to take into account, if the previous command is C/S.\n                                nx = d.x * 2 - d.bx;          // And reflect the previous\n                                ny = d.y * 2 - d.by;          // command's control point relative to the current point.\n                            }\n                            else {                            // or some else or nothing\n                                nx = d.x;\n                                ny = d.y;\n                            }\n                            path = [\"C\", nx, ny][concat](path.slice(1));\n                            break;\n                        case \"T\":\n                            if (pcom == \"Q\" || pcom == \"T\") { // In \"T\" case we have to take into account, if the previous command is Q/T.\n                                d.qx = d.x * 2 - d.qx;        // And make a reflection similar\n                                d.qy = d.y * 2 - d.qy;        // to case \"S\".\n                            }\n                            else {                            // or something else or nothing\n                                d.qx = d.x;\n                                d.qy = d.y;\n                            }\n                            path = [\"C\"][concat](q2c(d.x, d.y, d.qx, d.qy, path[1], path[2]));\n                            break;\n                        case \"Q\":\n                            d.qx = path[1];\n                            d.qy = path[2];\n                            path = [\"C\"][concat](q2c(d.x, d.y, path[1], path[2], path[3], path[4]));\n                            break;\n                        case \"L\":\n                            path = [\"C\"][concat](l2c(d.x, d.y, path[1], path[2]));\n                            break;\n                        case \"H\":\n                            path = [\"C\"][concat](l2c(d.x, d.y, path[1], d.y));\n                            break;\n                        case \"V\":\n                            path = [\"C\"][concat](l2c(d.x, d.y, d.x, path[1]));\n                            break;\n                        case \"Z\":\n                            path = [\"C\"][concat](l2c(d.x, d.y, d.X, d.Y));\n                            break;\n                    }\n                    return path;\n                },\n                fixArc = function (pp, i) {\n                    if (pp[i].length > 7) {\n                        pp[i].shift();\n                        var pi = pp[i];\n                        while (pi.length) {\n                            pcoms1[i]=\"A\"; // if created multiple C:s, their original seg is saved\n                            p2 && (pcoms2[i]=\"A\"); // the same as above\n                            pp.splice(i++, 0, [\"C\"][concat](pi.splice(0, 6)));\n                        }\n                        pp.splice(i, 1);\n                        ii = mmax(p.length, p2 && p2.length || 0);\n                    }\n                },\n                fixM = function (path1, path2, a1, a2, i) {\n                    if (path1 && path2 && path1[i][0] == \"M\" && path2[i][0] != \"M\") {\n                        path2.splice(i, 0, [\"M\", a2.x, a2.y]);\n                        a1.bx = 0;\n                        a1.by = 0;\n                        a1.x = path1[i][1];\n                        a1.y = path1[i][2];\n                        ii = mmax(p.length, p2 && p2.length || 0);\n                    }\n                },\n                pcoms1 = [], // path commands of original path p\n                pcoms2 = [], // path commands of original path p2\n                pfirst = \"\", // temporary holder for original path command\n                pcom = \"\"; // holder for previous path command of original path\n            for (var i = 0, ii = mmax(p.length, p2 && p2.length || 0); i < ii; i++) {\n                p[i] && (pfirst = p[i][0]); // save current path command\n\n                if (pfirst != \"C\") // C is not saved yet, because it may be result of conversion\n                {\n                    pcoms1[i] = pfirst; // Save current path command\n                    i && ( pcom = pcoms1[i-1]); // Get previous path command pcom\n                }\n                p[i] = processPath(p[i], attrs, pcom); // Previous path command is inputted to processPath\n\n                if (pcoms1[i] != \"A\" && pfirst == \"C\") pcoms1[i] = \"C\"; // A is the only command\n                // which may produce multiple C:s\n                // so we have to make sure that C is also C in original path\n\n                fixArc(p, i); // fixArc adds also the right amount of A:s to pcoms1\n\n                if (p2) { // the same procedures is done to p2\n                    p2[i] && (pfirst = p2[i][0]);\n                    if (pfirst != \"C\")\n                    {\n                        pcoms2[i] = pfirst;\n                        i && (pcom = pcoms2[i-1]);\n                    }\n                    p2[i] = processPath(p2[i], attrs2, pcom);\n\n                    if (pcoms2[i]!=\"A\" && pfirst==\"C\") pcoms2[i]=\"C\";\n\n                    fixArc(p2, i);\n                }\n                fixM(p, p2, attrs, attrs2, i);\n                fixM(p2, p, attrs2, attrs, i);\n                var seg = p[i],\n                    seg2 = p2 && p2[i],\n                    seglen = seg.length,\n                    seg2len = p2 && seg2.length;\n                attrs.x = seg[seglen - 2];\n                attrs.y = seg[seglen - 1];\n                attrs.bx = toFloat(seg[seglen - 4]) || attrs.x;\n                attrs.by = toFloat(seg[seglen - 3]) || attrs.y;\n                attrs2.bx = p2 && (toFloat(seg2[seg2len - 4]) || attrs2.x);\n                attrs2.by = p2 && (toFloat(seg2[seg2len - 3]) || attrs2.y);\n                attrs2.x = p2 && seg2[seg2len - 2];\n                attrs2.y = p2 && seg2[seg2len - 1];\n            }\n            if (!p2) {\n                pth.curve = pathClone(p);\n            }\n            return p2 ? [p, p2] : p;\n        }, null, pathClone),\n        parseDots = R._parseDots = cacher(function (gradient) {\n            var dots = [];\n            for (var i = 0, ii = gradient.length; i < ii; i++) {\n                var dot = {},\n                    par = gradient[i].match(/^([^:]*):?([\\d\\.]*)/);\n                dot.color = R.getRGB(par[1]);\n                if (dot.color.error) {\n                    return null;\n                }\n                dot.opacity = dot.color.opacity;\n                dot.color = dot.color.hex;\n                par[2] && (dot.offset = par[2] + \"%\");\n                dots.push(dot);\n            }\n            for (i = 1, ii = dots.length - 1; i < ii; i++) {\n                if (!dots[i].offset) {\n                    var start = toFloat(dots[i - 1].offset || 0),\n                        end = 0;\n                    for (var j = i + 1; j < ii; j++) {\n                        if (dots[j].offset) {\n                            end = dots[j].offset;\n                            break;\n                        }\n                    }\n                    if (!end) {\n                        end = 100;\n                        j = ii;\n                    }\n                    end = toFloat(end);\n                    var d = (end - start) / (j - i + 1);\n                    for (; i < j; i++) {\n                        start += d;\n                        dots[i].offset = start + \"%\";\n                    }\n                }\n            }\n            return dots;\n        }),\n        tear = R._tear = function (el, paper) {\n            el == paper.top && (paper.top = el.prev);\n            el == paper.bottom && (paper.bottom = el.next);\n            el.next && (el.next.prev = el.prev);\n            el.prev && (el.prev.next = el.next);\n        },\n        tofront = R._tofront = function (el, paper) {\n            if (paper.top === el) {\n                return;\n            }\n            tear(el, paper);\n            el.next = null;\n            el.prev = paper.top;\n            paper.top.next = el;\n            paper.top = el;\n        },\n        toback = R._toback = function (el, paper) {\n            if (paper.bottom === el) {\n                return;\n            }\n            tear(el, paper);\n            el.next = paper.bottom;\n            el.prev = null;\n            paper.bottom.prev = el;\n            paper.bottom = el;\n        },\n        insertafter = R._insertafter = function (el, el2, paper) {\n            tear(el, paper);\n            el2 == paper.top && (paper.top = el);\n            el2.next && (el2.next.prev = el);\n            el.next = el2.next;\n            el.prev = el2;\n            el2.next = el;\n        },\n        insertbefore = R._insertbefore = function (el, el2, paper) {\n            tear(el, paper);\n            el2 == paper.bottom && (paper.bottom = el);\n            el2.prev && (el2.prev.next = el);\n            el.prev = el2.prev;\n            el2.prev = el;\n            el.next = el2;\n        },\n        /*\\\n         * Raphael.toMatrix\n         [ method ]\n         **\n         * Utility method\n         **\n         * Returns matrix of transformations applied to a given path\n         > Parameters\n         - path (string) path string\n         - transform (string|array) transformation string\n         = (object) @Matrix\n        \\*/\n        toMatrix = R.toMatrix = function (path, transform) {\n            var bb = pathDimensions(path),\n                el = {\n                    _: {\n                        transform: E\n                    },\n                    getBBox: function () {\n                        return bb;\n                    }\n                };\n            extractTransform(el, transform);\n            return el.matrix;\n        },\n        /*\\\n         * Raphael.transformPath\n         [ method ]\n         **\n         * Utility method\n         **\n         * Returns path transformed by a given transformation\n         > Parameters\n         - path (string) path string\n         - transform (string|array) transformation string\n         = (string) path\n        \\*/\n        transformPath = R.transformPath = function (path, transform) {\n            return mapPath(path, toMatrix(path, transform));\n        },\n        extractTransform = R._extractTransform = function (el, tstr) {\n            if (tstr == null) {\n                return el._.transform;\n            }\n            tstr = Str(tstr).replace(/\\.{3}|\\u2026/g, el._.transform || E);\n            var tdata = R.parseTransformString(tstr),\n                deg = 0,\n                dx = 0,\n                dy = 0,\n                sx = 1,\n                sy = 1,\n                _ = el._,\n                m = new Matrix;\n            _.transform = tdata || [];\n            if (tdata) {\n                for (var i = 0, ii = tdata.length; i < ii; i++) {\n                    var t = tdata[i],\n                        tlen = t.length,\n                        command = Str(t[0]).toLowerCase(),\n                        absolute = t[0] != command,\n                        inver = absolute ? m.invert() : 0,\n                        x1,\n                        y1,\n                        x2,\n                        y2,\n                        bb;\n                    if (command == \"t\" && tlen == 3) {\n                        if (absolute) {\n                            x1 = inver.x(0, 0);\n                            y1 = inver.y(0, 0);\n                            x2 = inver.x(t[1], t[2]);\n                            y2 = inver.y(t[1], t[2]);\n                            m.translate(x2 - x1, y2 - y1);\n                        } else {\n                            m.translate(t[1], t[2]);\n                        }\n                    } else if (command == \"r\") {\n                        if (tlen == 2) {\n                            bb = bb || el.getBBox(1);\n                            m.rotate(t[1], bb.x + bb.width / 2, bb.y + bb.height / 2);\n                            deg += t[1];\n                        } else if (tlen == 4) {\n                            if (absolute) {\n                                x2 = inver.x(t[2], t[3]);\n                                y2 = inver.y(t[2], t[3]);\n                                m.rotate(t[1], x2, y2);\n                            } else {\n                                m.rotate(t[1], t[2], t[3]);\n                            }\n                            deg += t[1];\n                        }\n                    } else if (command == \"s\") {\n                        if (tlen == 2 || tlen == 3) {\n                            bb = bb || el.getBBox(1);\n                            m.scale(t[1], t[tlen - 1], bb.x + bb.width / 2, bb.y + bb.height / 2);\n                            sx *= t[1];\n                            sy *= t[tlen - 1];\n                        } else if (tlen == 5) {\n                            if (absolute) {\n                                x2 = inver.x(t[3], t[4]);\n                                y2 = inver.y(t[3], t[4]);\n                                m.scale(t[1], t[2], x2, y2);\n                            } else {\n                                m.scale(t[1], t[2], t[3], t[4]);\n                            }\n                            sx *= t[1];\n                            sy *= t[2];\n                        }\n                    } else if (command == \"m\" && tlen == 7) {\n                        m.add(t[1], t[2], t[3], t[4], t[5], t[6]);\n                    }\n                    _.dirtyT = 1;\n                    el.matrix = m;\n                }\n            }\n\n            /*\\\n             * Element.matrix\n             [ property (object) ]\n             **\n             * Keeps @Matrix object, which represents element transformation\n            \\*/\n            el.matrix = m;\n\n            _.sx = sx;\n            _.sy = sy;\n            _.deg = deg;\n            _.dx = dx = m.e;\n            _.dy = dy = m.f;\n\n            if (sx == 1 && sy == 1 && !deg && _.bbox) {\n                _.bbox.x += +dx;\n                _.bbox.y += +dy;\n            } else {\n                _.dirtyT = 1;\n            }\n        },\n        getEmpty = function (item) {\n            var l = item[0];\n            switch (l.toLowerCase()) {\n                case \"t\": return [l, 0, 0];\n                case \"m\": return [l, 1, 0, 0, 1, 0, 0];\n                case \"r\": if (item.length == 4) {\n                    return [l, 0, item[2], item[3]];\n                } else {\n                    return [l, 0];\n                }\n                case \"s\": if (item.length == 5) {\n                    return [l, 1, 1, item[3], item[4]];\n                } else if (item.length == 3) {\n                    return [l, 1, 1];\n                } else {\n                    return [l, 1];\n                }\n            }\n        },\n        equaliseTransform = R._equaliseTransform = function (t1, t2) {\n            t2 = Str(t2).replace(/\\.{3}|\\u2026/g, t1);\n            t1 = R.parseTransformString(t1) || [];\n            t2 = R.parseTransformString(t2) || [];\n            var maxlength = mmax(t1.length, t2.length),\n                from = [],\n                to = [],\n                i = 0, j, jj,\n                tt1, tt2;\n            for (; i < maxlength; i++) {\n                tt1 = t1[i] || getEmpty(t2[i]);\n                tt2 = t2[i] || getEmpty(tt1);\n                if ((tt1[0] != tt2[0]) ||\n                    (tt1[0].toLowerCase() == \"r\" && (tt1[2] != tt2[2] || tt1[3] != tt2[3])) ||\n                    (tt1[0].toLowerCase() == \"s\" && (tt1[3] != tt2[3] || tt1[4] != tt2[4]))\n                    ) {\n                    return;\n                }\n                from[i] = [];\n                to[i] = [];\n                for (j = 0, jj = mmax(tt1.length, tt2.length); j < jj; j++) {\n                    j in tt1 && (from[i][j] = tt1[j]);\n                    j in tt2 && (to[i][j] = tt2[j]);\n                }\n            }\n            return {\n                from: from,\n                to: to\n            };\n        };\n    R._getContainer = function (x, y, w, h) {\n        var container;\n        container = h == null && !R.is(x, \"object\") ? g.doc.getElementById(x) : x;\n        if (container == null) {\n            return;\n        }\n        if (container.tagName) {\n            if (y == null) {\n                return {\n                    container: container,\n                    width: container.style.pixelWidth || container.offsetWidth,\n                    height: container.style.pixelHeight || container.offsetHeight\n                };\n            } else {\n                return {\n                    container: container,\n                    width: y,\n                    height: w\n                };\n            }\n        }\n        return {\n            container: 1,\n            x: x,\n            y: y,\n            width: w,\n            height: h\n        };\n    };\n    /*\\\n     * Raphael.pathToRelative\n     [ method ]\n     **\n     * Utility method\n     **\n     * Converts path to relative form\n     > Parameters\n     - pathString (string|array) path string or array of segments\n     = (array) array of segments.\n    \\*/\n    R.pathToRelative = pathToRelative;\n    R._engine = {};\n    /*\\\n     * Raphael.path2curve\n     [ method ]\n     **\n     * Utility method\n     **\n     * Converts path to a new path where all segments are cubic bezier curves.\n     > Parameters\n     - pathString (string|array) path string or array of segments\n     = (array) array of segments.\n    \\*/\n    R.path2curve = path2curve;\n    /*\\\n     * Raphael.matrix\n     [ method ]\n     **\n     * Utility method\n     **\n     * Returns matrix based on given parameters.\n     > Parameters\n     - a (number)\n     - b (number)\n     - c (number)\n     - d (number)\n     - e (number)\n     - f (number)\n     = (object) @Matrix\n    \\*/\n    R.matrix = function (a, b, c, d, e, f) {\n        return new Matrix(a, b, c, d, e, f);\n    };\n    function Matrix(a, b, c, d, e, f) {\n        if (a != null) {\n            this.a = +a;\n            this.b = +b;\n            this.c = +c;\n            this.d = +d;\n            this.e = +e;\n            this.f = +f;\n        } else {\n            this.a = 1;\n            this.b = 0;\n            this.c = 0;\n            this.d = 1;\n            this.e = 0;\n            this.f = 0;\n        }\n    }\n    (function (matrixproto) {\n        /*\\\n         * Matrix.add\n         [ method ]\n         **\n         * Adds given matrix to existing one.\n         > Parameters\n         - a (number)\n         - b (number)\n         - c (number)\n         - d (number)\n         - e (number)\n         - f (number)\n         or\n         - matrix (object) @Matrix\n        \\*/\n        matrixproto.add = function (a, b, c, d, e, f) {\n            var out = [[], [], []],\n                m = [[this.a, this.c, this.e], [this.b, this.d, this.f], [0, 0, 1]],\n                matrix = [[a, c, e], [b, d, f], [0, 0, 1]],\n                x, y, z, res;\n\n            if (a && a instanceof Matrix) {\n                matrix = [[a.a, a.c, a.e], [a.b, a.d, a.f], [0, 0, 1]];\n            }\n\n            for (x = 0; x < 3; x++) {\n                for (y = 0; y < 3; y++) {\n                    res = 0;\n                    for (z = 0; z < 3; z++) {\n                        res += m[x][z] * matrix[z][y];\n                    }\n                    out[x][y] = res;\n                }\n            }\n            this.a = out[0][0];\n            this.b = out[1][0];\n            this.c = out[0][1];\n            this.d = out[1][1];\n            this.e = out[0][2];\n            this.f = out[1][2];\n        };\n        /*\\\n         * Matrix.invert\n         [ method ]\n         **\n         * Returns inverted version of the matrix\n         = (object) @Matrix\n        \\*/\n        matrixproto.invert = function () {\n            var me = this,\n                x = me.a * me.d - me.b * me.c;\n            return new Matrix(me.d / x, -me.b / x, -me.c / x, me.a / x, (me.c * me.f - me.d * me.e) / x, (me.b * me.e - me.a * me.f) / x);\n        };\n        /*\\\n         * Matrix.clone\n         [ method ]\n         **\n         * Returns copy of the matrix\n         = (object) @Matrix\n        \\*/\n        matrixproto.clone = function () {\n            return new Matrix(this.a, this.b, this.c, this.d, this.e, this.f);\n        };\n        /*\\\n         * Matrix.translate\n         [ method ]\n         **\n         * Translate the matrix\n         > Parameters\n         - x (number)\n         - y (number)\n        \\*/\n        matrixproto.translate = function (x, y) {\n            this.add(1, 0, 0, 1, x, y);\n        };\n        /*\\\n         * Matrix.scale\n         [ method ]\n         **\n         * Scales the matrix\n         > Parameters\n         - x (number)\n         - y (number) #optional\n         - cx (number) #optional\n         - cy (number) #optional\n        \\*/\n        matrixproto.scale = function (x, y, cx, cy) {\n            y == null && (y = x);\n            (cx || cy) && this.add(1, 0, 0, 1, cx, cy);\n            this.add(x, 0, 0, y, 0, 0);\n            (cx || cy) && this.add(1, 0, 0, 1, -cx, -cy);\n        };\n        /*\\\n         * Matrix.rotate\n         [ method ]\n         **\n         * Rotates the matrix\n         > Parameters\n         - a (number)\n         - x (number)\n         - y (number)\n        \\*/\n        matrixproto.rotate = function (a, x, y) {\n            a = R.rad(a);\n            x = x || 0;\n            y = y || 0;\n            var cos = +math.cos(a).toFixed(9),\n                sin = +math.sin(a).toFixed(9);\n            this.add(cos, sin, -sin, cos, x, y);\n            this.add(1, 0, 0, 1, -x, -y);\n        };\n        /*\\\n         * Matrix.x\n         [ method ]\n         **\n         * Return x coordinate for given point after transformation described by the matrix. See also @Matrix.y\n         > Parameters\n         - x (number)\n         - y (number)\n         = (number) x\n        \\*/\n        matrixproto.x = function (x, y) {\n            return x * this.a + y * this.c + this.e;\n        };\n        /*\\\n         * Matrix.y\n         [ method ]\n         **\n         * Return y coordinate for given point after transformation described by the matrix. See also @Matrix.x\n         > Parameters\n         - x (number)\n         - y (number)\n         = (number) y\n        \\*/\n        matrixproto.y = function (x, y) {\n            return x * this.b + y * this.d + this.f;\n        };\n        matrixproto.get = function (i) {\n            return +this[Str.fromCharCode(97 + i)].toFixed(4);\n        };\n        matrixproto.toString = function () {\n            return R.svg ?\n                \"matrix(\" + [this.get(0), this.get(1), this.get(2), this.get(3), this.get(4), this.get(5)].join() + \")\" :\n                [this.get(0), this.get(2), this.get(1), this.get(3), 0, 0].join();\n        };\n        matrixproto.toFilter = function () {\n            return \"progid:DXImageTransform.Microsoft.Matrix(M11=\" + this.get(0) +\n                \", M12=\" + this.get(2) + \", M21=\" + this.get(1) + \", M22=\" + this.get(3) +\n                \", Dx=\" + this.get(4) + \", Dy=\" + this.get(5) + \", sizingmethod='auto expand')\";\n        };\n        matrixproto.offset = function () {\n            return [this.e.toFixed(4), this.f.toFixed(4)];\n        };\n        function norm(a) {\n            return a[0] * a[0] + a[1] * a[1];\n        }\n        function normalize(a) {\n            var mag = math.sqrt(norm(a));\n            a[0] && (a[0] /= mag);\n            a[1] && (a[1] /= mag);\n        }\n        /*\\\n         * Matrix.split\n         [ method ]\n         **\n         * Splits matrix into primitive transformations\n         = (object) in format:\n         o dx (number) translation by x\n         o dy (number) translation by y\n         o scalex (number) scale by x\n         o scaley (number) scale by y\n         o shear (number) shear\n         o rotate (number) rotation in deg\n         o isSimple (boolean) could it be represented via simple transformations\n        \\*/\n        matrixproto.split = function () {\n            var out = {};\n            // translation\n            out.dx = this.e;\n            out.dy = this.f;\n\n            // scale and shear\n            var row = [[this.a, this.c], [this.b, this.d]];\n            out.scalex = math.sqrt(norm(row[0]));\n            normalize(row[0]);\n\n            out.shear = row[0][0] * row[1][0] + row[0][1] * row[1][1];\n            row[1] = [row[1][0] - row[0][0] * out.shear, row[1][1] - row[0][1] * out.shear];\n\n            out.scaley = math.sqrt(norm(row[1]));\n            normalize(row[1]);\n            out.shear /= out.scaley;\n\n            // rotation\n            var sin = -row[0][1],\n                cos = row[1][1];\n            if (cos < 0) {\n                out.rotate = R.deg(math.acos(cos));\n                if (sin < 0) {\n                    out.rotate = 360 - out.rotate;\n                }\n            } else {\n                out.rotate = R.deg(math.asin(sin));\n            }\n\n            out.isSimple = !+out.shear.toFixed(9) && (out.scalex.toFixed(9) == out.scaley.toFixed(9) || !out.rotate);\n            out.isSuperSimple = !+out.shear.toFixed(9) && out.scalex.toFixed(9) == out.scaley.toFixed(9) && !out.rotate;\n            out.noRotation = !+out.shear.toFixed(9) && !out.rotate;\n            return out;\n        };\n        /*\\\n         * Matrix.toTransformString\n         [ method ]\n         **\n         * Return transform string that represents given matrix\n         = (string) transform string\n        \\*/\n        matrixproto.toTransformString = function (shorter) {\n            var s = shorter || this[split]();\n            if (s.isSimple) {\n                s.scalex = +s.scalex.toFixed(4);\n                s.scaley = +s.scaley.toFixed(4);\n                s.rotate = +s.rotate.toFixed(4);\n                return  (s.dx || s.dy ? \"t\" + [s.dx, s.dy] : E) +\n                        (s.scalex != 1 || s.scaley != 1 ? \"s\" + [s.scalex, s.scaley, 0, 0] : E) +\n                        (s.rotate ? \"r\" + [s.rotate, 0, 0] : E);\n            } else {\n                return \"m\" + [this.get(0), this.get(1), this.get(2), this.get(3), this.get(4), this.get(5)];\n            }\n        };\n    })(Matrix.prototype);\n\n    var preventDefault = function () {\n        this.returnValue = false;\n    },\n    preventTouch = function () {\n        return this.originalEvent.preventDefault();\n    },\n    stopPropagation = function () {\n        this.cancelBubble = true;\n    },\n    stopTouch = function () {\n        return this.originalEvent.stopPropagation();\n    },\n    getEventPosition = function (e) {\n        var scrollY = g.doc.documentElement.scrollTop || g.doc.body.scrollTop,\n            scrollX = g.doc.documentElement.scrollLeft || g.doc.body.scrollLeft;\n\n        return {\n            x: e.clientX + scrollX,\n            y: e.clientY + scrollY\n        };\n    },\n    addEvent = (function () {\n        if (g.doc.addEventListener) {\n            return function (obj, type, fn, element) {\n                var f = function (e) {\n                    var pos = getEventPosition(e);\n                    return fn.call(element, e, pos.x, pos.y);\n                };\n                obj.addEventListener(type, f, false);\n\n                if (supportsTouch && touchMap[type]) {\n                    var _f = function (e) {\n                        var pos = getEventPosition(e),\n                            olde = e;\n\n                        for (var i = 0, ii = e.targetTouches && e.targetTouches.length; i < ii; i++) {\n                            if (e.targetTouches[i].target == obj) {\n                                e = e.targetTouches[i];\n                                e.originalEvent = olde;\n                                e.preventDefault = preventTouch;\n                                e.stopPropagation = stopTouch;\n                                break;\n                            }\n                        }\n\n                        return fn.call(element, e, pos.x, pos.y);\n                    };\n                    obj.addEventListener(touchMap[type], _f, false);\n                }\n\n                return function () {\n                    obj.removeEventListener(type, f, false);\n\n                    if (supportsTouch && touchMap[type])\n                        obj.removeEventListener(touchMap[type], _f, false);\n\n                    return true;\n                };\n            };\n        } else if (g.doc.attachEvent) {\n            return function (obj, type, fn, element) {\n                var f = function (e) {\n                    e = e || g.win.event;\n                    var scrollY = g.doc.documentElement.scrollTop || g.doc.body.scrollTop,\n                        scrollX = g.doc.documentElement.scrollLeft || g.doc.body.scrollLeft,\n                        x = e.clientX + scrollX,\n                        y = e.clientY + scrollY;\n                    e.preventDefault = e.preventDefault || preventDefault;\n                    e.stopPropagation = e.stopPropagation || stopPropagation;\n                    return fn.call(element, e, x, y);\n                };\n                obj.attachEvent(\"on\" + type, f);\n                var detacher = function () {\n                    obj.detachEvent(\"on\" + type, f);\n                    return true;\n                };\n                return detacher;\n            };\n        }\n    })(),\n    drag = [],\n    dragMove = function (e) {\n        var x = e.clientX,\n            y = e.clientY,\n            scrollY = g.doc.documentElement.scrollTop || g.doc.body.scrollTop,\n            scrollX = g.doc.documentElement.scrollLeft || g.doc.body.scrollLeft,\n            dragi,\n            j = drag.length;\n        while (j--) {\n            dragi = drag[j];\n            if (supportsTouch && e.touches) {\n                var i = e.touches.length,\n                    touch;\n                while (i--) {\n                    touch = e.touches[i];\n                    if (touch.identifier == dragi.el._drag.id) {\n                        x = touch.clientX;\n                        y = touch.clientY;\n                        (e.originalEvent ? e.originalEvent : e).preventDefault();\n                        break;\n                    }\n                }\n            } else {\n                e.preventDefault();\n            }\n            var node = dragi.el.node,\n                o,\n                next = node.nextSibling,\n                parent = node.parentNode,\n                display = node.style.display;\n            g.win.opera && parent.removeChild(node);\n            node.style.display = \"none\";\n            o = dragi.el.paper.getElementByPoint(x, y);\n            node.style.display = display;\n            g.win.opera && (next ? parent.insertBefore(node, next) : parent.appendChild(node));\n            o && eve(\"raphael.drag.over.\" + dragi.el.id, dragi.el, o);\n            x += scrollX;\n            y += scrollY;\n            eve(\"raphael.drag.move.\" + dragi.el.id, dragi.move_scope || dragi.el, x - dragi.el._drag.x, y - dragi.el._drag.y, x, y, e);\n        }\n    },\n    dragUp = function (e) {\n        R.unmousemove(dragMove).unmouseup(dragUp);\n        var i = drag.length,\n            dragi;\n        while (i--) {\n            dragi = drag[i];\n            dragi.el._drag = {};\n            eve(\"raphael.drag.end.\" + dragi.el.id, dragi.end_scope || dragi.start_scope || dragi.move_scope || dragi.el, e);\n        }\n        drag = [];\n    },\n    /*\\\n     * Raphael.el\n     [ property (object) ]\n     **\n     * You can add your own method to elements. This is useful when you want to hack default functionality or\n     * want to wrap some common transformation or attributes in one method. In difference to canvas methods,\n     * you can redefine element method at any time. Expending element methods wouldn\u2019t affect set.\n     > Usage\n     | Raphael.el.red = function () {\n     |     this.attr({fill: \"#f00\"});\n     | };\n     | // then use it\n     | paper.circle(100, 100, 20).red();\n    \\*/\n    elproto = R.el = {};\n    /*\\\n     * Element.click\n     [ method ]\n     **\n     * Adds event handler for click for the element.\n     > Parameters\n     - handler (function) handler for the event\n     = (object) @Element\n    \\*/\n    /*\\\n     * Element.unclick\n     [ method ]\n     **\n     * Removes event handler for click for the element.\n     > Parameters\n     - handler (function) #optional handler for the event\n     = (object) @Element\n    \\*/\n\n    /*\\\n     * Element.dblclick\n     [ method ]\n     **\n     * Adds event handler for double click for the element.\n     > Parameters\n     - handler (function) handler for the event\n     = (object) @Element\n    \\*/\n    /*\\\n     * Element.undblclick\n     [ method ]\n     **\n     * Removes event handler for double click for the element.\n     > Parameters\n     - handler (function) #optional handler for the event\n     = (object) @Element\n    \\*/\n\n    /*\\\n     * Element.mousedown\n     [ method ]\n     **\n     * Adds event handler for mousedown for the element.\n     > Parameters\n     - handler (function) handler for the event\n     = (object) @Element\n    \\*/\n    /*\\\n     * Element.unmousedown\n     [ method ]\n     **\n     * Removes event handler for mousedown for the element.\n     > Parameters\n     - handler (function) #optional handler for the event\n     = (object) @Element\n    \\*/\n\n    /*\\\n     * Element.mousemove\n     [ method ]\n     **\n     * Adds event handler for mousemove for the element.\n     > Parameters\n     - handler (function) handler for the event\n     = (object) @Element\n    \\*/\n    /*\\\n     * Element.unmousemove\n     [ method ]\n     **\n     * Removes event handler for mousemove for the element.\n     > Parameters\n     - handler (function) #optional handler for the event\n     = (object) @Element\n    \\*/\n\n    /*\\\n     * Element.mouseout\n     [ method ]\n     **\n     * Adds event handler for mouseout for the element.\n     > Parameters\n     - handler (function) handler for the event\n     = (object) @Element\n    \\*/\n    /*\\\n     * Element.unmouseout\n     [ method ]\n     **\n     * Removes event handler for mouseout for the element.\n     > Parameters\n     - handler (function) #optional handler for the event\n     = (object) @Element\n    \\*/\n\n    /*\\\n     * Element.mouseover\n     [ method ]\n     **\n     * Adds event handler for mouseover for the element.\n     > Parameters\n     - handler (function) handler for the event\n     = (object) @Element\n    \\*/\n    /*\\\n     * Element.unmouseover\n     [ method ]\n     **\n     * Removes event handler for mouseover for the element.\n     > Parameters\n     - handler (function) #optional handler for the event\n     = (object) @Element\n    \\*/\n\n    /*\\\n     * Element.mouseup\n     [ method ]\n     **\n     * Adds event handler for mouseup for the element.\n     > Parameters\n     - handler (function) handler for the event\n     = (object) @Element\n    \\*/\n    /*\\\n     * Element.unmouseup\n     [ method ]\n     **\n     * Removes event handler for mouseup for the element.\n     > Parameters\n     - handler (function) #optional handler for the event\n     = (object) @Element\n    \\*/\n\n    /*\\\n     * Element.touchstart\n     [ method ]\n     **\n     * Adds event handler for touchstart for the element.\n     > Parameters\n     - handler (function) handler for the event\n     = (object) @Element\n    \\*/\n    /*\\\n     * Element.untouchstart\n     [ method ]\n     **\n     * Removes event handler for touchstart for the element.\n     > Parameters\n     - handler (function) #optional handler for the event\n     = (object) @Element\n    \\*/\n\n    /*\\\n     * Element.touchmove\n     [ method ]\n     **\n     * Adds event handler for touchmove for the element.\n     > Parameters\n     - handler (function) handler for the event\n     = (object) @Element\n    \\*/\n    /*\\\n     * Element.untouchmove\n     [ method ]\n     **\n     * Removes event handler for touchmove for the element.\n     > Parameters\n     - handler (function) #optional handler for the event\n     = (object) @Element\n    \\*/\n\n    /*\\\n     * Element.touchend\n     [ method ]\n     **\n     * Adds event handler for touchend for the element.\n     > Parameters\n     - handler (function) handler for the event\n     = (object) @Element\n    \\*/\n    /*\\\n     * Element.untouchend\n     [ method ]\n     **\n     * Removes event handler for touchend for the element.\n     > Parameters\n     - handler (function) #optional handler for the event\n     = (object) @Element\n    \\*/\n\n    /*\\\n     * Element.touchcancel\n     [ method ]\n     **\n     * Adds event handler for touchcancel for the element.\n     > Parameters\n     - handler (function) handler for the event\n     = (object) @Element\n    \\*/\n    /*\\\n     * Element.untouchcancel\n     [ method ]\n     **\n     * Removes event handler for touchcancel for the element.\n     > Parameters\n     - handler (function) #optional handler for the event\n     = (object) @Element\n    \\*/\n    for (var i = events.length; i--;) {\n        (function (eventName) {\n            R[eventName] = elproto[eventName] = function (fn, scope) {\n                if (R.is(fn, \"function\")) {\n                    this.events = this.events || [];\n                    this.events.push({name: eventName, f: fn, unbind: addEvent(this.shape || this.node || g.doc, eventName, fn, scope || this)});\n                }\n                return this;\n            };\n            R[\"un\" + eventName] = elproto[\"un\" + eventName] = function (fn) {\n                var events = this.events || [],\n                    l = events.length;\n                while (l--){\n                    if (events[l].name == eventName && (R.is(fn, \"undefined\") || events[l].f == fn)) {\n                        events[l].unbind();\n                        events.splice(l, 1);\n                        !events.length && delete this.events;\n                    }\n                }\n                return this;\n            };\n        })(events[i]);\n    }\n\n    /*\\\n     * Element.data\n     [ method ]\n     **\n     * Adds or retrieves given value associated with given key.\n     **\n     * See also @Element.removeData\n     > Parameters\n     - key (string) key to store data\n     - value (any) #optional value to store\n     = (object) @Element\n     * or, if value is not specified:\n     = (any) value\n     * or, if key and value are not specified:\n     = (object) Key/value pairs for all the data associated with the element.\n     > Usage\n     | for (var i = 0, i < 5, i++) {\n     |     paper.circle(10 + 15 * i, 10, 10)\n     |          .attr({fill: \"#000\"})\n     |          .data(\"i\", i)\n     |          .click(function () {\n     |             alert(this.data(\"i\"));\n     |          });\n     | }\n    \\*/\n    elproto.data = function (key, value) {\n        var data = eldata[this.id] = eldata[this.id] || {};\n        if (arguments.length == 0) {\n            return data;\n        }\n        if (arguments.length == 1) {\n            if (R.is(key, \"object\")) {\n                for (var i in key) if (key[has](i)) {\n                    this.data(i, key[i]);\n                }\n                return this;\n            }\n            eve(\"raphael.data.get.\" + this.id, this, data[key], key);\n            return data[key];\n        }\n        data[key] = value;\n        eve(\"raphael.data.set.\" + this.id, this, value, key);\n        return this;\n    };\n    /*\\\n     * Element.removeData\n     [ method ]\n     **\n     * Removes value associated with an element by given key.\n     * If key is not provided, removes all the data of the element.\n     > Parameters\n     - key (string) #optional key\n     = (object) @Element\n    \\*/\n    elproto.removeData = function (key) {\n        if (key == null) {\n            delete eldata[this.id];\n        } else {\n            eldata[this.id] && delete eldata[this.id][key];\n        }\n        return this;\n    };\n     /*\\\n     * Element.getData\n     [ method ]\n     **\n     * Retrieves the element data\n     = (object) data\n    \\*/\n    elproto.getData = function () {\n        return clone(eldata[this.id] || {});\n    };\n    /*\\\n     * Element.hover\n     [ method ]\n     **\n     * Adds event handlers for hover for the element.\n     > Parameters\n     - f_in (function) handler for hover in\n     - f_out (function) handler for hover out\n     - icontext (object) #optional context for hover in handler\n     - ocontext (object) #optional context for hover out handler\n     = (object) @Element\n    \\*/\n    elproto.hover = function (f_in, f_out, scope_in, scope_out) {\n        return this.mouseover(f_in, scope_in).mouseout(f_out, scope_out || scope_in);\n    };\n    /*\\\n     * Element.unhover\n     [ method ]\n     **\n     * Removes event handlers for hover for the element.\n     > Parameters\n     - f_in (function) handler for hover in\n     - f_out (function) handler for hover out\n     = (object) @Element\n    \\*/\n    elproto.unhover = function (f_in, f_out) {\n        return this.unmouseover(f_in).unmouseout(f_out);\n    };\n    var draggable = [];\n    /*\\\n     * Element.drag\n     [ method ]\n     **\n     * Adds event handlers for drag of the element.\n     > Parameters\n     - onmove (function) handler for moving\n     - onstart (function) handler for drag start\n     - onend (function) handler for drag end\n     - mcontext (object) #optional context for moving handler\n     - scontext (object) #optional context for drag start handler\n     - econtext (object) #optional context for drag end handler\n     * Additionally following `drag` events will be triggered: `drag.start.<id>` on start,\n     * `drag.end.<id>` on end and `drag.move.<id>` on every move. When element will be dragged over another element\n     * `drag.over.<id>` will be fired as well.\n     *\n     * Start event and start handler will be called in specified context or in context of the element with following parameters:\n     o x (number) x position of the mouse\n     o y (number) y position of the mouse\n     o event (object) DOM event object\n     * Move event and move handler will be called in specified context or in context of the element with following parameters:\n     o dx (number) shift by x from the start point\n     o dy (number) shift by y from the start point\n     o x (number) x position of the mouse\n     o y (number) y position of the mouse\n     o event (object) DOM event object\n     * End event and end handler will be called in specified context or in context of the element with following parameters:\n     o event (object) DOM event object\n     = (object) @Element\n    \\*/\n    elproto.drag = function (onmove, onstart, onend, move_scope, start_scope, end_scope) {\n        function start(e) {\n            (e.originalEvent || e).preventDefault();\n            var x = e.clientX,\n                y = e.clientY,\n                scrollY = g.doc.documentElement.scrollTop || g.doc.body.scrollTop,\n                scrollX = g.doc.documentElement.scrollLeft || g.doc.body.scrollLeft;\n            this._drag.id = e.identifier;\n            if (supportsTouch && e.touches) {\n                var i = e.touches.length, touch;\n                while (i--) {\n                    touch = e.touches[i];\n                    this._drag.id = touch.identifier;\n                    if (touch.identifier == this._drag.id) {\n                        x = touch.clientX;\n                        y = touch.clientY;\n                        break;\n                    }\n                }\n            }\n            this._drag.x = x + scrollX;\n            this._drag.y = y + scrollY;\n            !drag.length && R.mousemove(dragMove).mouseup(dragUp);\n            drag.push({el: this, move_scope: move_scope, start_scope: start_scope, end_scope: end_scope});\n            onstart && eve.on(\"raphael.drag.start.\" + this.id, onstart);\n            onmove && eve.on(\"raphael.drag.move.\" + this.id, onmove);\n            onend && eve.on(\"raphael.drag.end.\" + this.id, onend);\n            eve(\"raphael.drag.start.\" + this.id, start_scope || move_scope || this, this._drag.x, this._drag.y, e);\n        }\n        this._drag = {};\n        draggable.push({el: this, start: start});\n        this.mousedown(start);\n        return this;\n    };\n    /*\\\n     * Element.onDragOver\n     [ method ]\n     **\n     * Shortcut for assigning event handler for `drag.over.<id>` event, where id is id of the element (see @Element.id).\n     > Parameters\n     - f (function) handler for event, first argument would be the element you are dragging over\n    \\*/\n    elproto.onDragOver = function (f) {\n        f ? eve.on(\"raphael.drag.over.\" + this.id, f) : eve.unbind(\"raphael.drag.over.\" + this.id);\n    };\n    /*\\\n     * Element.undrag\n     [ method ]\n     **\n     * Removes all drag event handlers from given element.\n    \\*/\n    elproto.undrag = function () {\n        var i = draggable.length;\n        while (i--) if (draggable[i].el == this) {\n            this.unmousedown(draggable[i].start);\n            draggable.splice(i, 1);\n            eve.unbind(\"raphael.drag.*.\" + this.id);\n        }\n        !draggable.length && R.unmousemove(dragMove).unmouseup(dragUp);\n        drag = [];\n    };\n    /*\\\n     * Paper.circle\n     [ method ]\n     **\n     * Draws a circle.\n     **\n     > Parameters\n     **\n     - x (number) x coordinate of the centre\n     - y (number) y coordinate of the centre\n     - r (number) radius\n     = (object) Rapha\u00EBl element object with type \u201Ccircle\u201D\n     **\n     > Usage\n     | var c = paper.circle(50, 50, 40);\n    \\*/\n    paperproto.circle = function (x, y, r) {\n        var out = R._engine.circle(this, x || 0, y || 0, r || 0);\n        this.__set__ && this.__set__.push(out);\n        return out;\n    };\n    /*\\\n     * Paper.rect\n     [ method ]\n     *\n     * Draws a rectangle.\n     **\n     > Parameters\n     **\n     - x (number) x coordinate of the top left corner\n     - y (number) y coordinate of the top left corner\n     - width (number) width\n     - height (number) height\n     - r (number) #optional radius for rounded corners, default is 0\n     = (object) Rapha\u00EBl element object with type \u201Crect\u201D\n     **\n     > Usage\n     | // regular rectangle\n     | var c = paper.rect(10, 10, 50, 50);\n     | // rectangle with rounded corners\n     | var c = paper.rect(40, 40, 50, 50, 10);\n    \\*/\n    paperproto.rect = function (x, y, w, h, r) {\n        var out = R._engine.rect(this, x || 0, y || 0, w || 0, h || 0, r || 0);\n        this.__set__ && this.__set__.push(out);\n        return out;\n    };\n    /*\\\n     * Paper.ellipse\n     [ method ]\n     **\n     * Draws an ellipse.\n     **\n     > Parameters\n     **\n     - x (number) x coordinate of the centre\n     - y (number) y coordinate of the centre\n     - rx (number) horizontal radius\n     - ry (number) vertical radius\n     = (object) Rapha\u00EBl element object with type \u201Cellipse\u201D\n     **\n     > Usage\n     | var c = paper.ellipse(50, 50, 40, 20);\n    \\*/\n    paperproto.ellipse = function (x, y, rx, ry) {\n        var out = R._engine.ellipse(this, x || 0, y || 0, rx || 0, ry || 0);\n        this.__set__ && this.__set__.push(out);\n        return out;\n    };\n    /*\\\n     * Paper.path\n     [ method ]\n     **\n     * Creates a path element by given path data string.\n     > Parameters\n     - pathString (string) #optional path string in SVG format.\n     * Path string consists of one-letter commands, followed by comma seprarated arguments in numercal form. Example:\n     | \"M10,20L30,40\"\n     * Here we can see two commands: \u201CM\u201D, with arguments `(10, 20)` and \u201CL\u201D with arguments `(30, 40)`. Upper case letter mean command is absolute, lower case\u2014relative.\n     *\n     # <p>Here is short list of commands available, for more details see <a href=\"http://www.w3.org/TR/SVG/paths.html#PathData\" title=\"Details of a path's data attribute's format are described in the SVG specification.\">SVG path string format</a>.</p>\n     # <table><thead><tr><th>Command</th><th>Name</th><th>Parameters</th></tr></thead><tbody>\n     # <tr><td>M</td><td>moveto</td><td>(x y)+</td></tr>\n     # <tr><td>Z</td><td>closepath</td><td>(none)</td></tr>\n     # <tr><td>L</td><td>lineto</td><td>(x y)+</td></tr>\n     # <tr><td>H</td><td>horizontal lineto</td><td>x+</td></tr>\n     # <tr><td>V</td><td>vertical lineto</td><td>y+</td></tr>\n     # <tr><td>C</td><td>curveto</td><td>(x1 y1 x2 y2 x y)+</td></tr>\n     # <tr><td>S</td><td>smooth curveto</td><td>(x2 y2 x y)+</td></tr>\n     # <tr><td>Q</td><td>quadratic B\u00E9zier curveto</td><td>(x1 y1 x y)+</td></tr>\n     # <tr><td>T</td><td>smooth quadratic B\u00E9zier curveto</td><td>(x y)+</td></tr>\n     # <tr><td>A</td><td>elliptical arc</td><td>(rx ry x-axis-rotation large-arc-flag sweep-flag x y)+</td></tr>\n     # <tr><td>R</td><td><a href=\"http://en.wikipedia.org/wiki/Catmull\u2013Rom_spline#Catmull.E2.80.93Rom_spline\">Catmull-Rom curveto</a>*</td><td>x1 y1 (x y)+</td></tr></tbody></table>\n     * * \u201CCatmull-Rom curveto\u201D is a not standard SVG command and added in 2.0 to make life easier.\n     * Note: there is a special case when path consist of just three commands: \u201CM10,10R\u2026z\u201D. In this case path will smoothly connects to its beginning.\n     > Usage\n     | var c = paper.path(\"M10 10L90 90\");\n     | // draw a diagonal line:\n     | // move to 10,10, line to 90,90\n     * For example of path strings, check out these icons: http://raphaeljs.com/icons/\n    \\*/\n    paperproto.path = function (pathString) {\n        pathString && !R.is(pathString, string) && !R.is(pathString[0], array) && (pathString += E);\n        var out = R._engine.path(R.format[apply](R, arguments), this);\n        this.__set__ && this.__set__.push(out);\n        return out;\n    };\n    /*\\\n     * Paper.image\n     [ method ]\n     **\n     * Embeds an image into the surface.\n     **\n     > Parameters\n     **\n     - src (string) URI of the source image\n     - x (number) x coordinate position\n     - y (number) y coordinate position\n     - width (number) width of the image\n     - height (number) height of the image\n     = (object) Rapha\u00EBl element object with type \u201Cimage\u201D\n     **\n     > Usage\n     | var c = paper.image(\"apple.png\", 10, 10, 80, 80);\n    \\*/\n    paperproto.image = function (src, x, y, w, h) {\n        var out = R._engine.image(this, src || \"about:blank\", x || 0, y || 0, w || 0, h || 0);\n        this.__set__ && this.__set__.push(out);\n        return out;\n    };\n    /*\\\n     * Paper.text\n     [ method ]\n     **\n     * Draws a text string. If you need line breaks, put \u201C\\n\u201D in the string.\n     **\n     > Parameters\n     **\n     - x (number) x coordinate position\n     - y (number) y coordinate position\n     - text (string) The text string to draw\n     = (object) Rapha\u00EBl element object with type \u201Ctext\u201D\n     **\n     > Usage\n     | var t = paper.text(50, 50, \"Rapha\u00EBl\\nkicks\\nbutt!\");\n    \\*/\n    paperproto.text = function (x, y, text) {\n        var out = R._engine.text(this, x || 0, y || 0, Str(text));\n        this.__set__ && this.__set__.push(out);\n        return out;\n    };\n    /*\\\n     * Paper.set\n     [ method ]\n     **\n     * Creates array-like object to keep and operate several elements at once.\n     * Warning: it doesn\u2019t create any elements for itself in the page, it just groups existing elements.\n     * Sets act as pseudo elements \u2014 all methods available to an element can be used on a set.\n     = (object) array-like object that represents set of elements\n     **\n     > Usage\n     | var st = paper.set();\n     | st.push(\n     |     paper.circle(10, 10, 5),\n     |     paper.circle(30, 10, 5)\n     | );\n     | st.attr({fill: \"red\"}); // changes the fill of both circles\n    \\*/\n    paperproto.set = function (itemsArray) {\n        !R.is(itemsArray, \"array\") && (itemsArray = Array.prototype.splice.call(arguments, 0, arguments.length));\n        var out = new Set(itemsArray);\n        this.__set__ && this.__set__.push(out);\n        out[\"paper\"] = this;\n        out[\"type\"] = \"set\";\n        return out;\n    };\n    /*\\\n     * Paper.setStart\n     [ method ]\n     **\n     * Creates @Paper.set. All elements that will be created after calling this method and before calling\n     * @Paper.setFinish will be added to the set.\n     **\n     > Usage\n     | paper.setStart();\n     | paper.circle(10, 10, 5),\n     | paper.circle(30, 10, 5)\n     | var st = paper.setFinish();\n     | st.attr({fill: \"red\"}); // changes the fill of both circles\n    \\*/\n    paperproto.setStart = function (set) {\n        this.__set__ = set || this.set();\n    };\n    /*\\\n     * Paper.setFinish\n     [ method ]\n     **\n     * See @Paper.setStart. This method finishes catching and returns resulting set.\n     **\n     = (object) set\n    \\*/\n    paperproto.setFinish = function (set) {\n        var out = this.__set__;\n        delete this.__set__;\n        return out;\n    };\n    /*\\\n     * Paper.getSize\n     [ method ]\n     **\n     * Obtains current paper actual size.\n     **\n     = (object)\n     \\*/\n    paperproto.getSize = function () {\n        var container = this.canvas.parentNode;\n        return {\n            width: container.offsetWidth,\n            height: container.offsetHeight\n                };\n        };\n    /*\\\n     * Paper.setSize\n     [ method ]\n     **\n     * If you need to change dimensions of the canvas call this method\n     **\n     > Parameters\n     **\n     - width (number) new width of the canvas\n     - height (number) new height of the canvas\n    \\*/\n    paperproto.setSize = function (width, height) {\n        return R._engine.setSize.call(this, width, height);\n    };\n    /*\\\n     * Paper.setViewBox\n     [ method ]\n     **\n     * Sets the view box of the paper. Practically it gives you ability to zoom and pan whole paper surface by\n     * specifying new boundaries.\n     **\n     > Parameters\n     **\n     - x (number) new x position, default is `0`\n     - y (number) new y position, default is `0`\n     - w (number) new width of the canvas\n     - h (number) new height of the canvas\n     - fit (boolean) `true` if you want graphics to fit into new boundary box\n    \\*/\n    paperproto.setViewBox = function (x, y, w, h, fit) {\n        return R._engine.setViewBox.call(this, x, y, w, h, fit);\n    };\n    /*\\\n     * Paper.top\n     [ property ]\n     **\n     * Points to the topmost element on the paper\n    \\*/\n    /*\\\n     * Paper.bottom\n     [ property ]\n     **\n     * Points to the bottom element on the paper\n    \\*/\n    paperproto.top = paperproto.bottom = null;\n    /*\\\n     * Paper.raphael\n     [ property ]\n     **\n     * Points to the @Raphael object/function\n    \\*/\n    paperproto.raphael = R;\n    var getOffset = function (elem) {\n        var box = elem.getBoundingClientRect(),\n            doc = elem.ownerDocument,\n            body = doc.body,\n            docElem = doc.documentElement,\n            clientTop = docElem.clientTop || body.clientTop || 0, clientLeft = docElem.clientLeft || body.clientLeft || 0,\n            top  = box.top  + (g.win.pageYOffset || docElem.scrollTop || body.scrollTop ) - clientTop,\n            left = box.left + (g.win.pageXOffset || docElem.scrollLeft || body.scrollLeft) - clientLeft;\n        return {\n            y: top,\n            x: left\n        };\n    };\n    /*\\\n     * Paper.getElementByPoint\n     [ method ]\n     **\n     * Returns you topmost element under given point.\n     **\n     = (object) Rapha\u00EBl element object\n     > Parameters\n     **\n     - x (number) x coordinate from the top left corner of the window\n     - y (number) y coordinate from the top left corner of the window\n     > Usage\n     | paper.getElementByPoint(mouseX, mouseY).attr({stroke: \"#f00\"});\n    \\*/\n    paperproto.getElementByPoint = function (x, y) {\n        var paper = this,\n            svg = paper.canvas,\n            target = g.doc.elementFromPoint(x, y);\n        if (g.win.opera && target.tagName == \"svg\") {\n            var so = getOffset(svg),\n                sr = svg.createSVGRect();\n            sr.x = x - so.x;\n            sr.y = y - so.y;\n            sr.width = sr.height = 1;\n            var hits = svg.getIntersectionList(sr, null);\n            if (hits.length) {\n                target = hits[hits.length - 1];\n            }\n        }\n        if (!target) {\n            return null;\n        }\n        while (target.parentNode && target != svg.parentNode && !target.raphael) {\n            target = target.parentNode;\n        }\n        target == paper.canvas.parentNode && (target = svg);\n        target = target && target.raphael ? paper.getById(target.raphaelid) : null;\n        return target;\n    };\n\n    /*\\\n     * Paper.getElementsByBBox\n     [ method ]\n     **\n     * Returns set of elements that have an intersecting bounding box\n     **\n     > Parameters\n     **\n     - bbox (object) bbox to check with\n     = (object) @Set\n     \\*/\n    paperproto.getElementsByBBox = function (bbox) {\n        var set = this.set();\n        this.forEach(function (el) {\n            if (R.isBBoxIntersect(el.getBBox(), bbox)) {\n                set.push(el);\n            }\n        });\n        return set;\n    };\n\n    /*\\\n     * Paper.getById\n     [ method ]\n     **\n     * Returns you element by its internal ID.\n     **\n     > Parameters\n     **\n     - id (number) id\n     = (object) Rapha\u00EBl element object\n    \\*/\n    paperproto.getById = function (id) {\n        var bot = this.bottom;\n        while (bot) {\n            if (bot.id == id) {\n                return bot;\n            }\n            bot = bot.next;\n        }\n        return null;\n    };\n    /*\\\n     * Paper.forEach\n     [ method ]\n     **\n     * Executes given function for each element on the paper\n     *\n     * If callback function returns `false` it will stop loop running.\n     **\n     > Parameters\n     **\n     - callback (function) function to run\n     - thisArg (object) context object for the callback\n     = (object) Paper object\n     > Usage\n     | paper.forEach(function (el) {\n     |     el.attr({ stroke: \"blue\" });\n     | });\n    \\*/\n    paperproto.forEach = function (callback, thisArg) {\n        var bot = this.bottom;\n        while (bot) {\n            if (callback.call(thisArg, bot) === false) {\n                return this;\n            }\n            bot = bot.next;\n        }\n        return this;\n    };\n    /*\\\n     * Paper.getElementsByPoint\n     [ method ]\n     **\n     * Returns set of elements that have common point inside\n     **\n     > Parameters\n     **\n     - x (number) x coordinate of the point\n     - y (number) y coordinate of the point\n     = (object) @Set\n    \\*/\n    paperproto.getElementsByPoint = function (x, y) {\n        var set = this.set();\n        this.forEach(function (el) {\n            if (el.isPointInside(x, y)) {\n                set.push(el);\n            }\n        });\n        return set;\n    };\n    function x_y() {\n        return this.x + S + this.y;\n    }\n    function x_y_w_h() {\n        return this.x + S + this.y + S + this.width + \" \\xd7 \" + this.height;\n    }\n    /*\\\n     * Element.isPointInside\n     [ method ]\n     **\n     * Determine if given point is inside this element\u2019s shape\n     **\n     > Parameters\n     **\n     - x (number) x coordinate of the point\n     - y (number) y coordinate of the point\n     = (boolean) `true` if point inside the shape\n    \\*/\n    elproto.isPointInside = function (x, y) {\n        var rp = this.realPath = getPath[this.type](this);\n        if (this.attr('transform') && this.attr('transform').length) {\n            rp = R.transformPath(rp, this.attr('transform'));\n        }\n        return R.isPointInsidePath(rp, x, y);\n    };\n    /*\\\n     * Element.getBBox\n     [ method ]\n     **\n     * Return bounding box for a given element\n     **\n     > Parameters\n     **\n     - isWithoutTransform (boolean) flag, `true` if you want to have bounding box before transformations. Default is `false`.\n     = (object) Bounding box object:\n     o {\n     o     x: (number) top left corner x\n     o     y: (number) top left corner y\n     o     x2: (number) bottom right corner x\n     o     y2: (number) bottom right corner y\n     o     width: (number) width\n     o     height: (number) height\n     o }\n    \\*/\n    elproto.getBBox = function (isWithoutTransform) {\n        if (this.removed) {\n            return {};\n        }\n        var _ = this._;\n        if (isWithoutTransform) {\n            if (_.dirty || !_.bboxwt) {\n                this.realPath = getPath[this.type](this);\n                _.bboxwt = pathDimensions(this.realPath);\n                _.bboxwt.toString = x_y_w_h;\n                _.dirty = 0;\n            }\n            return _.bboxwt;\n        }\n        if (_.dirty || _.dirtyT || !_.bbox) {\n            if (_.dirty || !this.realPath) {\n                _.bboxwt = 0;\n                this.realPath = getPath[this.type](this);\n            }\n            _.bbox = pathDimensions(mapPath(this.realPath, this.matrix));\n            _.bbox.toString = x_y_w_h;\n            _.dirty = _.dirtyT = 0;\n        }\n        return _.bbox;\n    };\n    /*\\\n     * Element.clone\n     [ method ]\n     **\n     = (object) clone of a given element\n     **\n    \\*/\n    elproto.clone = function () {\n        if (this.removed) {\n            return null;\n        }\n        var out = this.paper[this.type]().attr(this.attr());\n        this.__set__ && this.__set__.push(out);\n        return out;\n    };\n    /*\\\n     * Element.glow\n     [ method ]\n     **\n     * Return set of elements that create glow-like effect around given element. See @Paper.set.\n     *\n     * Note: Glow is not connected to the element. If you change element attributes it won\u2019t adjust itself.\n     **\n     > Parameters\n     **\n     - glow (object) #optional parameters object with all properties optional:\n     o {\n     o     width (number) size of the glow, default is `10`\n     o     fill (boolean) will it be filled, default is `false`\n     o     opacity (number) opacity, default is `0.5`\n     o     offsetx (number) horizontal offset, default is `0`\n     o     offsety (number) vertical offset, default is `0`\n     o     color (string) glow colour, default is `black`\n     o }\n     = (object) @Paper.set of elements that represents glow\n    \\*/\n    elproto.glow = function (glow) {\n        if (this.type == \"text\") {\n            return null;\n        }\n        glow = glow || {};\n        var s = {\n            width: (glow.width || 10) + (+this.attr(\"stroke-width\") || 1),\n            fill: glow.fill || false,\n            opacity: glow.opacity == null ? .5 : glow.opacity,\n            offsetx: glow.offsetx || 0,\n            offsety: glow.offsety || 0,\n            color: glow.color || \"#000\"\n        },\n            c = s.width / 2,\n            r = this.paper,\n            out = r.set(),\n            path = this.realPath || getPath[this.type](this);\n        path = this.matrix ? mapPath(path, this.matrix) : path;\n        for (var i = 1; i < c + 1; i++) {\n            out.push(r.path(path).attr({\n                stroke: s.color,\n                fill: s.fill ? s.color : \"none\",\n                \"stroke-linejoin\": \"round\",\n                \"stroke-linecap\": \"round\",\n                \"stroke-width\": +(s.width / c * i).toFixed(3),\n                opacity: +(s.opacity / c).toFixed(3)\n            }));\n        }\n        return out.insertBefore(this).translate(s.offsetx, s.offsety);\n    };\n    var curveslengths = {},\n    getPointAtSegmentLength = function (p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, length) {\n        if (length == null) {\n            return bezlen(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y);\n        } else {\n            return R.findDotsAtSegment(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, getTatLen(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, length));\n        }\n    },\n    getLengthFactory = function (istotal, subpath) {\n        return function (path, length, onlystart) {\n            path = path2curve(path);\n            var x, y, p, l, sp = \"\", subpaths = {}, point,\n                len = 0;\n            for (var i = 0, ii = path.length; i < ii; i++) {\n                p = path[i];\n                if (p[0] == \"M\") {\n                    x = +p[1];\n                    y = +p[2];\n                } else {\n                    l = getPointAtSegmentLength(x, y, p[1], p[2], p[3], p[4], p[5], p[6]);\n                    if (len + l > length) {\n                        if (subpath && !subpaths.start) {\n                            point = getPointAtSegmentLength(x, y, p[1], p[2], p[3], p[4], p[5], p[6], length - len);\n                            sp += [\"C\" + point.start.x, point.start.y, point.m.x, point.m.y, point.x, point.y];\n                            if (onlystart) {return sp;}\n                            subpaths.start = sp;\n                            sp = [\"M\" + point.x, point.y + \"C\" + point.n.x, point.n.y, point.end.x, point.end.y, p[5], p[6]].join();\n                            len += l;\n                            x = +p[5];\n                            y = +p[6];\n                            continue;\n                        }\n                        if (!istotal && !subpath) {\n                            point = getPointAtSegmentLength(x, y, p[1], p[2], p[3], p[4], p[5], p[6], length - len);\n                            return {x: point.x, y: point.y, alpha: point.alpha};\n                        }\n                    }\n                    len += l;\n                    x = +p[5];\n                    y = +p[6];\n                }\n                sp += p.shift() + p;\n            }\n            subpaths.end = sp;\n            point = istotal ? len : subpath ? subpaths : R.findDotsAtSegment(x, y, p[0], p[1], p[2], p[3], p[4], p[5], 1);\n            point.alpha && (point = {x: point.x, y: point.y, alpha: point.alpha});\n            return point;\n        };\n    };\n    var getTotalLength = getLengthFactory(1),\n        getPointAtLength = getLengthFactory(),\n        getSubpathsAtLength = getLengthFactory(0, 1);\n    /*\\\n     * Raphael.getTotalLength\n     [ method ]\n     **\n     * Returns length of the given path in pixels.\n     **\n     > Parameters\n     **\n     - path (string) SVG path string.\n     **\n     = (number) length.\n    \\*/\n    R.getTotalLength = getTotalLength;\n    /*\\\n     * Raphael.getPointAtLength\n     [ method ]\n     **\n     * Return coordinates of the point located at the given length on the given path.\n     **\n     > Parameters\n     **\n     - path (string) SVG path string\n     - length (number)\n     **\n     = (object) representation of the point:\n     o {\n     o     x: (number) x coordinate\n     o     y: (number) y coordinate\n     o     alpha: (number) angle of derivative\n     o }\n    \\*/\n    R.getPointAtLength = getPointAtLength;\n    /*\\\n     * Raphael.getSubpath\n     [ method ]\n     **\n     * Return subpath of a given path from given length to given length.\n     **\n     > Parameters\n     **\n     - path (string) SVG path string\n     - from (number) position of the start of the segment\n     - to (number) position of the end of the segment\n     **\n     = (string) pathstring for the segment\n    \\*/\n    R.getSubpath = function (path, from, to) {\n        if (this.getTotalLength(path) - to < 1e-6) {\n            return getSubpathsAtLength(path, from).end;\n        }\n        var a = getSubpathsAtLength(path, to, 1);\n        return from ? getSubpathsAtLength(a, from).end : a;\n    };\n    /*\\\n     * Element.getTotalLength\n     [ method ]\n     **\n     * Returns length of the path in pixels. Only works for element of \u201Cpath\u201D type.\n     = (number) length.\n    \\*/\n    elproto.getTotalLength = function () {\n        var path = this.getPath();\n        if (!path) {\n            return;\n        }\n\n        if (this.node.getTotalLength) {\n            return this.node.getTotalLength();\n        }\n\n        return getTotalLength(path);\n    };\n    /*\\\n     * Element.getPointAtLength\n     [ method ]\n     **\n     * Return coordinates of the point located at the given length on the given path. Only works for element of \u201Cpath\u201D type.\n     **\n     > Parameters\n     **\n     - length (number)\n     **\n     = (object) representation of the point:\n     o {\n     o     x: (number) x coordinate\n     o     y: (number) y coordinate\n     o     alpha: (number) angle of derivative\n     o }\n    \\*/\n    elproto.getPointAtLength = function (length) {\n        var path = this.getPath();\n        if (!path) {\n            return;\n        }\n\n        return getPointAtLength(path, length);\n    };\n    /*\\\n     * Element.getPath\n     [ method ]\n     **\n     * Returns path of the element. Only works for elements of \u201Cpath\u201D type and simple elements like circle.\n     = (object) path\n     **\n    \\*/\n    elproto.getPath = function () {\n        var path,\n            getPath = R._getPath[this.type];\n\n        if (this.type == \"text\" || this.type == \"set\") {\n            return;\n        }\n\n        if (getPath) {\n            path = getPath(this);\n        }\n\n        return path;\n    };\n    /*\\\n     * Element.getSubpath\n     [ method ]\n     **\n     * Return subpath of a given element from given length to given length. Only works for element of \u201Cpath\u201D type.\n     **\n     > Parameters\n     **\n     - from (number) position of the start of the segment\n     - to (number) position of the end of the segment\n     **\n     = (string) pathstring for the segment\n    \\*/\n    elproto.getSubpath = function (from, to) {\n        var path = this.getPath();\n        if (!path) {\n            return;\n        }\n\n        return R.getSubpath(path, from, to);\n    };\n    /*\\\n     * Raphael.easing_formulas\n     [ property ]\n     **\n     * Object that contains easing formulas for animation. You could extend it with your own. By default it has following list of easing:\n     # <ul>\n     #     <li>\u201Clinear\u201D</li>\n     #     <li>\u201C&lt;\u201D or \u201CeaseIn\u201D or \u201Cease-in\u201D</li>\n     #     <li>\u201C>\u201D or \u201CeaseOut\u201D or \u201Cease-out\u201D</li>\n     #     <li>\u201C&lt;>\u201D or \u201CeaseInOut\u201D or \u201Cease-in-out\u201D</li>\n     #     <li>\u201CbackIn\u201D or \u201Cback-in\u201D</li>\n     #     <li>\u201CbackOut\u201D or \u201Cback-out\u201D</li>\n     #     <li>\u201Celastic\u201D</li>\n     #     <li>\u201Cbounce\u201D</li>\n     # </ul>\n     # <p>See also <a href=\"http://raphaeljs.com/easing.html\">Easing demo</a>.</p>\n    \\*/\n    var ef = R.easing_formulas = {\n        linear: function (n) {\n            return n;\n        },\n        \"<\": function (n) {\n            return pow(n, 1.7);\n        },\n        \">\": function (n) {\n            return pow(n, .48);\n        },\n        \"<>\": function (n) {\n            var q = .48 - n / 1.04,\n                Q = math.sqrt(.1734 + q * q),\n                x = Q - q,\n                X = pow(abs(x), 1 / 3) * (x < 0 ? -1 : 1),\n                y = -Q - q,\n                Y = pow(abs(y), 1 / 3) * (y < 0 ? -1 : 1),\n                t = X + Y + .5;\n            return (1 - t) * 3 * t * t + t * t * t;\n        },\n        backIn: function (n) {\n            var s = 1.70158;\n            return n * n * ((s + 1) * n - s);\n        },\n        backOut: function (n) {\n            n = n - 1;\n            var s = 1.70158;\n            return n * n * ((s + 1) * n + s) + 1;\n        },\n        elastic: function (n) {\n            if (n == !!n) {\n                return n;\n            }\n            return pow(2, -10 * n) * math.sin((n - .075) * (2 * PI) / .3) + 1;\n        },\n        bounce: function (n) {\n            var s = 7.5625,\n                p = 2.75,\n                l;\n            if (n < (1 / p)) {\n                l = s * n * n;\n            } else {\n                if (n < (2 / p)) {\n                    n -= (1.5 / p);\n                    l = s * n * n + .75;\n                } else {\n                    if (n < (2.5 / p)) {\n                        n -= (2.25 / p);\n                        l = s * n * n + .9375;\n                    } else {\n                        n -= (2.625 / p);\n                        l = s * n * n + .984375;\n                    }\n                }\n            }\n            return l;\n        }\n    };\n    ef.easeIn = ef[\"ease-in\"] = ef[\"<\"];\n    ef.easeOut = ef[\"ease-out\"] = ef[\">\"];\n    ef.easeInOut = ef[\"ease-in-out\"] = ef[\"<>\"];\n    ef[\"back-in\"] = ef.backIn;\n    ef[\"back-out\"] = ef.backOut;\n\n    var animationElements = [],\n        requestAnimFrame = window.requestAnimationFrame       ||\n                           window.webkitRequestAnimationFrame ||\n                           window.mozRequestAnimationFrame    ||\n                           window.oRequestAnimationFrame      ||\n                           window.msRequestAnimationFrame     ||\n                           function (callback) {\n                               setTimeout(callback, 16);\n                           },\n        animation = function () {\n            var Now = +new Date,\n                l = 0;\n            for (; l < animationElements.length; l++) {\n                var e = animationElements[l];\n                if (e.el.removed || e.paused) {\n                    continue;\n                }\n                var time = Now - e.start,\n                    ms = e.ms,\n                    easing = e.easing,\n                    from = e.from,\n                    diff = e.diff,\n                    to = e.to,\n                    t = e.t,\n                    that = e.el,\n                    set = {},\n                    now,\n                    init = {},\n                    key;\n                if (e.initstatus) {\n                    time = (e.initstatus * e.anim.top - e.prev) / (e.percent - e.prev) * ms;\n                    e.status = e.initstatus;\n                    delete e.initstatus;\n                    e.stop && animationElements.splice(l--, 1);\n                } else {\n                    e.status = (e.prev + (e.percent - e.prev) * (time / ms)) / e.anim.top;\n                }\n                if (time < 0) {\n                    continue;\n                }\n                if (time < ms) {\n                    var pos = easing(time / ms);\n                    for (var attr in from) if (from[has](attr)) {\n                        switch (availableAnimAttrs[attr]) {\n                            case nu:\n                                now = +from[attr] + pos * ms * diff[attr];\n                                break;\n                            case \"colour\":\n                                now = \"rgb(\" + [\n                                    upto255(round(from[attr].r + pos * ms * diff[attr].r)),\n                                    upto255(round(from[attr].g + pos * ms * diff[attr].g)),\n                                    upto255(round(from[attr].b + pos * ms * diff[attr].b))\n                                ].join(\",\") + \")\";\n                                break;\n                            case \"path\":\n                                now = [];\n                                for (var i = 0, ii = from[attr].length; i < ii; i++) {\n                                    now[i] = [from[attr][i][0]];\n                                    for (var j = 1, jj = from[attr][i].length; j < jj; j++) {\n                                        now[i][j] = +from[attr][i][j] + pos * ms * diff[attr][i][j];\n                                    }\n                                    now[i] = now[i].join(S);\n                                }\n                                now = now.join(S);\n                                break;\n                            case \"transform\":\n                                if (diff[attr].real) {\n                                    now = [];\n                                    for (i = 0, ii = from[attr].length; i < ii; i++) {\n                                        now[i] = [from[attr][i][0]];\n                                        for (j = 1, jj = from[attr][i].length; j < jj; j++) {\n                                            now[i][j] = from[attr][i][j] + pos * ms * diff[attr][i][j];\n                                        }\n                                    }\n                                } else {\n                                    var get = function (i) {\n                                        return +from[attr][i] + pos * ms * diff[attr][i];\n                                    };\n                                    // now = [[\"r\", get(2), 0, 0], [\"t\", get(3), get(4)], [\"s\", get(0), get(1), 0, 0]];\n                                    now = [[\"m\", get(0), get(1), get(2), get(3), get(4), get(5)]];\n                                }\n                                break;\n                            case \"csv\":\n                                if (attr == \"clip-rect\") {\n                                    now = [];\n                                    i = 4;\n                                    while (i--) {\n                                        now[i] = +from[attr][i] + pos * ms * diff[attr][i];\n                                    }\n                                }\n                                break;\n                            default:\n                                var from2 = [][concat](from[attr]);\n                                now = [];\n                                i = that.paper.customAttributes[attr].length;\n                                while (i--) {\n                                    now[i] = +from2[i] + pos * ms * diff[attr][i];\n                                }\n                                break;\n                        }\n                        set[attr] = now;\n                    }\n                    that.attr(set);\n                    (function (id, that, anim) {\n                        setTimeout(function () {\n                            eve(\"raphael.anim.frame.\" + id, that, anim);\n                        });\n                    })(that.id, that, e.anim);\n                } else {\n                    (function(f, el, a) {\n                        setTimeout(function() {\n                            eve(\"raphael.anim.frame.\" + el.id, el, a);\n                            eve(\"raphael.anim.finish.\" + el.id, el, a);\n                            R.is(f, \"function\") && f.call(el);\n                        });\n                    })(e.callback, that, e.anim);\n                    that.attr(to);\n                    animationElements.splice(l--, 1);\n                    if (e.repeat > 1 && !e.next) {\n                        for (key in to) if (to[has](key)) {\n                            init[key] = e.totalOrigin[key];\n                        }\n                        e.el.attr(init);\n                        runAnimation(e.anim, e.el, e.anim.percents[0], null, e.totalOrigin, e.repeat - 1);\n                    }\n                    if (e.next && !e.stop) {\n                        runAnimation(e.anim, e.el, e.next, null, e.totalOrigin, e.repeat);\n                    }\n                }\n            }\n            animationElements.length && requestAnimFrame(animation);\n        },\n        upto255 = function (color) {\n            return color > 255 ? 255 : color < 0 ? 0 : color;\n        };\n    /*\\\n     * Element.animateWith\n     [ method ]\n     **\n     * Acts similar to @Element.animate, but ensure that given animation runs in sync with another given element.\n     **\n     > Parameters\n     **\n     - el (object) element to sync with\n     - anim (object) animation to sync with\n     - params (object) #optional final attributes for the element, see also @Element.attr\n     - ms (number) #optional number of milliseconds for animation to run\n     - easing (string) #optional easing type. Accept on of @Raphael.easing_formulas or CSS format: `cubic&#x2010;bezier(XX,&#160;XX,&#160;XX,&#160;XX)`\n     - callback (function) #optional callback function. Will be called at the end of animation.\n     * or\n     - element (object) element to sync with\n     - anim (object) animation to sync with\n     - animation (object) #optional animation object, see @Raphael.animation\n     **\n     = (object) original element\n    \\*/\n    elproto.animateWith = function (el, anim, params, ms, easing, callback) {\n        var element = this;\n        if (element.removed) {\n            callback && callback.call(element);\n            return element;\n        }\n        var a = params instanceof Animation ? params : R.animation(params, ms, easing, callback),\n            x, y;\n        runAnimation(a, element, a.percents[0], null, element.attr());\n        for (var i = 0, ii = animationElements.length; i < ii; i++) {\n            if (animationElements[i].anim == anim && animationElements[i].el == el) {\n                animationElements[ii - 1].start = animationElements[i].start;\n                break;\n            }\n        }\n        return element;\n        //\n        //\n        // var a = params ? R.animation(params, ms, easing, callback) : anim,\n        //     status = element.status(anim);\n        // return this.animate(a).status(a, status * anim.ms / a.ms);\n    };\n    function CubicBezierAtTime(t, p1x, p1y, p2x, p2y, duration) {\n        var cx = 3 * p1x,\n            bx = 3 * (p2x - p1x) - cx,\n            ax = 1 - cx - bx,\n            cy = 3 * p1y,\n            by = 3 * (p2y - p1y) - cy,\n            ay = 1 - cy - by;\n        function sampleCurveX(t) {\n            return ((ax * t + bx) * t + cx) * t;\n        }\n        function solve(x, epsilon) {\n            var t = solveCurveX(x, epsilon);\n            return ((ay * t + by) * t + cy) * t;\n        }\n        function solveCurveX(x, epsilon) {\n            var t0, t1, t2, x2, d2, i;\n            for(t2 = x, i = 0; i < 8; i++) {\n                x2 = sampleCurveX(t2) - x;\n                if (abs(x2) < epsilon) {\n                    return t2;\n                }\n                d2 = (3 * ax * t2 + 2 * bx) * t2 + cx;\n                if (abs(d2) < 1e-6) {\n                    break;\n                }\n                t2 = t2 - x2 / d2;\n            }\n            t0 = 0;\n            t1 = 1;\n            t2 = x;\n            if (t2 < t0) {\n                return t0;\n            }\n            if (t2 > t1) {\n                return t1;\n            }\n            while (t0 < t1) {\n                x2 = sampleCurveX(t2);\n                if (abs(x2 - x) < epsilon) {\n                    return t2;\n                }\n                if (x > x2) {\n                    t0 = t2;\n                } else {\n                    t1 = t2;\n                }\n                t2 = (t1 - t0) / 2 + t0;\n            }\n            return t2;\n        }\n        return solve(t, 1 / (200 * duration));\n    }\n    elproto.onAnimation = function (f) {\n        f ? eve.on(\"raphael.anim.frame.\" + this.id, f) : eve.unbind(\"raphael.anim.frame.\" + this.id);\n        return this;\n    };\n    function Animation(anim, ms) {\n        var percents = [],\n            newAnim = {};\n        this.ms = ms;\n        this.times = 1;\n        if (anim) {\n            for (var attr in anim) if (anim[has](attr)) {\n                newAnim[toFloat(attr)] = anim[attr];\n                percents.push(toFloat(attr));\n            }\n            percents.sort(sortByNumber);\n        }\n        this.anim = newAnim;\n        this.top = percents[percents.length - 1];\n        this.percents = percents;\n    }\n    /*\\\n     * Animation.delay\n     [ method ]\n     **\n     * Creates a copy of existing animation object with given delay.\n     **\n     > Parameters\n     **\n     - delay (number) number of ms to pass between animation start and actual animation\n     **\n     = (object) new altered Animation object\n     | var anim = Raphael.animation({cx: 10, cy: 20}, 2e3);\n     | circle1.animate(anim); // run the given animation immediately\n     | circle2.animate(anim.delay(500)); // run the given animation after 500 ms\n    \\*/\n    Animation.prototype.delay = function (delay) {\n        var a = new Animation(this.anim, this.ms);\n        a.times = this.times;\n        a.del = +delay || 0;\n        return a;\n    };\n    /*\\\n     * Animation.repeat\n     [ method ]\n     **\n     * Creates a copy of existing animation object with given repetition.\n     **\n     > Parameters\n     **\n     - repeat (number) number iterations of animation. For infinite animation pass `Infinity`\n     **\n     = (object) new altered Animation object\n    \\*/\n    Animation.prototype.repeat = function (times) {\n        var a = new Animation(this.anim, this.ms);\n        a.del = this.del;\n        a.times = math.floor(mmax(times, 0)) || 1;\n        return a;\n    };\n    function runAnimation(anim, element, percent, status, totalOrigin, times) {\n        percent = toFloat(percent);\n        var params,\n            isInAnim,\n            isInAnimSet,\n            percents = [],\n            next,\n            prev,\n            timestamp,\n            ms = anim.ms,\n            from = {},\n            to = {},\n            diff = {};\n        if (status) {\n            for (i = 0, ii = animationElements.length; i < ii; i++) {\n                var e = animationElements[i];\n                if (e.el.id == element.id && e.anim == anim) {\n                    if (e.percent != percent) {\n                        animationElements.splice(i, 1);\n                        isInAnimSet = 1;\n                    } else {\n                        isInAnim = e;\n                    }\n                    element.attr(e.totalOrigin);\n                    break;\n                }\n            }\n        } else {\n            status = +to; // NaN\n        }\n        for (var i = 0, ii = anim.percents.length; i < ii; i++) {\n            if (anim.percents[i] == percent || anim.percents[i] > status * anim.top) {\n                percent = anim.percents[i];\n                prev = anim.percents[i - 1] || 0;\n                ms = ms / anim.top * (percent - prev);\n                next = anim.percents[i + 1];\n                params = anim.anim[percent];\n                break;\n            } else if (status) {\n                element.attr(anim.anim[anim.percents[i]]);\n            }\n        }\n        if (!params) {\n            return;\n        }\n        if (!isInAnim) {\n            for (var attr in params) if (params[has](attr)) {\n                if (availableAnimAttrs[has](attr) || element.paper.customAttributes[has](attr)) {\n                    from[attr] = element.attr(attr);\n                    (from[attr] == null) && (from[attr] = availableAttrs[attr]);\n                    to[attr] = params[attr];\n                    switch (availableAnimAttrs[attr]) {\n                        case nu:\n                            diff[attr] = (to[attr] - from[attr]) / ms;\n                            break;\n                        case \"colour\":\n                            from[attr] = R.getRGB(from[attr]);\n                            var toColour = R.getRGB(to[attr]);\n                            diff[attr] = {\n                                r: (toColour.r - from[attr].r) / ms,\n                                g: (toColour.g - from[attr].g) / ms,\n                                b: (toColour.b - from[attr].b) / ms\n                            };\n                            break;\n                        case \"path\":\n                            var pathes = path2curve(from[attr], to[attr]),\n                                toPath = pathes[1];\n                            from[attr] = pathes[0];\n                            diff[attr] = [];\n                            for (i = 0, ii = from[attr].length; i < ii; i++) {\n                                diff[attr][i] = [0];\n                                for (var j = 1, jj = from[attr][i].length; j < jj; j++) {\n                                    diff[attr][i][j] = (toPath[i][j] - from[attr][i][j]) / ms;\n                                }\n                            }\n                            break;\n                        case \"transform\":\n                            var _ = element._,\n                                eq = equaliseTransform(_[attr], to[attr]);\n                            if (eq) {\n                                from[attr] = eq.from;\n                                to[attr] = eq.to;\n                                diff[attr] = [];\n                                diff[attr].real = true;\n                                for (i = 0, ii = from[attr].length; i < ii; i++) {\n                                    diff[attr][i] = [from[attr][i][0]];\n                                    for (j = 1, jj = from[attr][i].length; j < jj; j++) {\n                                        diff[attr][i][j] = (to[attr][i][j] - from[attr][i][j]) / ms;\n                                    }\n                                }\n                            } else {\n                                var m = (element.matrix || new Matrix),\n                                    to2 = {\n                                        _: {transform: _.transform},\n                                        getBBox: function () {\n                                            return element.getBBox(1);\n                                        }\n                                    };\n                                from[attr] = [\n                                    m.a,\n                                    m.b,\n                                    m.c,\n                                    m.d,\n                                    m.e,\n                                    m.f\n                                ];\n                                extractTransform(to2, to[attr]);\n                                to[attr] = to2._.transform;\n                                diff[attr] = [\n                                    (to2.matrix.a - m.a) / ms,\n                                    (to2.matrix.b - m.b) / ms,\n                                    (to2.matrix.c - m.c) / ms,\n                                    (to2.matrix.d - m.d) / ms,\n                                    (to2.matrix.e - m.e) / ms,\n                                    (to2.matrix.f - m.f) / ms\n                                ];\n                                // from[attr] = [_.sx, _.sy, _.deg, _.dx, _.dy];\n                                // var to2 = {_:{}, getBBox: function () { return element.getBBox(); }};\n                                // extractTransform(to2, to[attr]);\n                                // diff[attr] = [\n                                //     (to2._.sx - _.sx) / ms,\n                                //     (to2._.sy - _.sy) / ms,\n                                //     (to2._.deg - _.deg) / ms,\n                                //     (to2._.dx - _.dx) / ms,\n                                //     (to2._.dy - _.dy) / ms\n                                // ];\n                            }\n                            break;\n                        case \"csv\":\n                            var values = Str(params[attr])[split](separator),\n                                from2 = Str(from[attr])[split](separator);\n                            if (attr == \"clip-rect\") {\n                                from[attr] = from2;\n                                diff[attr] = [];\n                                i = from2.length;\n                                while (i--) {\n                                    diff[attr][i] = (values[i] - from[attr][i]) / ms;\n                                }\n                            }\n                            to[attr] = values;\n                            break;\n                        default:\n                            values = [][concat](params[attr]);\n                            from2 = [][concat](from[attr]);\n                            diff[attr] = [];\n                            i = element.paper.customAttributes[attr].length;\n                            while (i--) {\n                                diff[attr][i] = ((values[i] || 0) - (from2[i] || 0)) / ms;\n                            }\n                            break;\n                    }\n                }\n            }\n            var easing = params.easing,\n                easyeasy = R.easing_formulas[easing];\n            if (!easyeasy) {\n                easyeasy = Str(easing).match(bezierrg);\n                if (easyeasy && easyeasy.length == 5) {\n                    var curve = easyeasy;\n                    easyeasy = function (t) {\n                        return CubicBezierAtTime(t, +curve[1], +curve[2], +curve[3], +curve[4], ms);\n                    };\n                } else {\n                    easyeasy = pipe;\n                }\n            }\n            timestamp = params.start || anim.start || +new Date;\n            e = {\n                anim: anim,\n                percent: percent,\n                timestamp: timestamp,\n                start: timestamp + (anim.del || 0),\n                status: 0,\n                initstatus: status || 0,\n                stop: false,\n                ms: ms,\n                easing: easyeasy,\n                from: from,\n                diff: diff,\n                to: to,\n                el: element,\n                callback: params.callback,\n                prev: prev,\n                next: next,\n                repeat: times || anim.times,\n                origin: element.attr(),\n                totalOrigin: totalOrigin\n            };\n            animationElements.push(e);\n            if (status && !isInAnim && !isInAnimSet) {\n                e.stop = true;\n                e.start = new Date - ms * status;\n                if (animationElements.length == 1) {\n                    return animation();\n                }\n            }\n            if (isInAnimSet) {\n                e.start = new Date - e.ms * status;\n            }\n            animationElements.length == 1 && requestAnimFrame(animation);\n        } else {\n            isInAnim.initstatus = status;\n            isInAnim.start = new Date - isInAnim.ms * status;\n        }\n        eve(\"raphael.anim.start.\" + element.id, element, anim);\n    }\n    /*\\\n     * Raphael.animation\n     [ method ]\n     **\n     * Creates an animation object that can be passed to the @Element.animate or @Element.animateWith methods.\n     * See also @Animation.delay and @Animation.repeat methods.\n     **\n     > Parameters\n     **\n     - params (object) final attributes for the element, see also @Element.attr\n     - ms (number) number of milliseconds for animation to run\n     - easing (string) #optional easing type. Accept one of @Raphael.easing_formulas or CSS format: `cubic&#x2010;bezier(XX,&#160;XX,&#160;XX,&#160;XX)`\n     - callback (function) #optional callback function. Will be called at the end of animation.\n     **\n     = (object) @Animation\n    \\*/\n    R.animation = function (params, ms, easing, callback) {\n        if (params instanceof Animation) {\n            return params;\n        }\n        if (R.is(easing, \"function\") || !easing) {\n            callback = callback || easing || null;\n            easing = null;\n        }\n        params = Object(params);\n        ms = +ms || 0;\n        var p = {},\n            json,\n            attr;\n        for (attr in params) if (params[has](attr) && toFloat(attr) != attr && toFloat(attr) + \"%\" != attr) {\n            json = true;\n            p[attr] = params[attr];\n        }\n        if (!json) {\n            // if percent-like syntax is used and end-of-all animation callback used\n            if(callback){\n                // find the last one\n                var lastKey = 0;\n                for(var i in params){\n                    var percent = toInt(i);\n                    if(params[has](i) && percent > lastKey){\n                        lastKey = percent;\n                    }\n                }\n                lastKey += '%';\n                // if already defined callback in the last keyframe, skip\n                !params[lastKey].callback && (params[lastKey].callback = callback);\n            }\n          return new Animation(params, ms);\n        } else {\n            easing && (p.easing = easing);\n            callback && (p.callback = callback);\n            return new Animation({100: p}, ms);\n        }\n    };\n    /*\\\n     * Element.animate\n     [ method ]\n     **\n     * Creates and starts animation for given element.\n     **\n     > Parameters\n     **\n     - params (object) final attributes for the element, see also @Element.attr\n     - ms (number) number of milliseconds for animation to run\n     - easing (string) #optional easing type. Accept one of @Raphael.easing_formulas or CSS format: `cubic&#x2010;bezier(XX,&#160;XX,&#160;XX,&#160;XX)`\n     - callback (function) #optional callback function. Will be called at the end of animation.\n     * or\n     - animation (object) animation object, see @Raphael.animation\n     **\n     = (object) original element\n    \\*/\n    elproto.animate = function (params, ms, easing, callback) {\n        var element = this;\n        if (element.removed) {\n            callback && callback.call(element);\n            return element;\n        }\n        var anim = params instanceof Animation ? params : R.animation(params, ms, easing, callback);\n        runAnimation(anim, element, anim.percents[0], null, element.attr());\n        return element;\n    };\n    /*\\\n     * Element.setTime\n     [ method ]\n     **\n     * Sets the status of animation of the element in milliseconds. Similar to @Element.status method.\n     **\n     > Parameters\n     **\n     - anim (object) animation object\n     - value (number) number of milliseconds from the beginning of the animation\n     **\n     = (object) original element if `value` is specified\n     * Note, that during animation following events are triggered:\n     *\n     * On each animation frame event `anim.frame.<id>`, on start `anim.start.<id>` and on end `anim.finish.<id>`.\n    \\*/\n    elproto.setTime = function (anim, value) {\n        if (anim && value != null) {\n            this.status(anim, mmin(value, anim.ms) / anim.ms);\n        }\n        return this;\n    };\n    /*\\\n     * Element.status\n     [ method ]\n     **\n     * Gets or sets the status of animation of the element.\n     **\n     > Parameters\n     **\n     - anim (object) #optional animation object\n     - value (number) #optional 0 \u2013 1. If specified, method works like a setter and sets the status of a given animation to the value. This will cause animation to jump to the given position.\n     **\n     = (number) status\n     * or\n     = (array) status if `anim` is not specified. Array of objects in format:\n     o {\n     o     anim: (object) animation object\n     o     status: (number) status\n     o }\n     * or\n     = (object) original element if `value` is specified\n    \\*/\n    elproto.status = function (anim, value) {\n        var out = [],\n            i = 0,\n            len,\n            e;\n        if (value != null) {\n            runAnimation(anim, this, -1, mmin(value, 1));\n            return this;\n        } else {\n            len = animationElements.length;\n            for (; i < len; i++) {\n                e = animationElements[i];\n                if (e.el.id == this.id && (!anim || e.anim == anim)) {\n                    if (anim) {\n                        return e.status;\n                    }\n                    out.push({\n                        anim: e.anim,\n                        status: e.status\n                    });\n                }\n            }\n            if (anim) {\n                return 0;\n            }\n            return out;\n        }\n    };\n    /*\\\n     * Element.pause\n     [ method ]\n     **\n     * Stops animation of the element with ability to resume it later on.\n     **\n     > Parameters\n     **\n     - anim (object) #optional animation object\n     **\n     = (object) original element\n    \\*/\n    elproto.pause = function (anim) {\n        for (var i = 0; i < animationElements.length; i++) if (animationElements[i].el.id == this.id && (!anim || animationElements[i].anim == anim)) {\n            if (eve(\"raphael.anim.pause.\" + this.id, this, animationElements[i].anim) !== false) {\n                animationElements[i].paused = true;\n            }\n        }\n        return this;\n    };\n    /*\\\n     * Element.resume\n     [ method ]\n     **\n     * Resumes animation if it was paused with @Element.pause method.\n     **\n     > Parameters\n     **\n     - anim (object) #optional animation object\n     **\n     = (object) original element\n    \\*/\n    elproto.resume = function (anim) {\n        for (var i = 0; i < animationElements.length; i++) if (animationElements[i].el.id == this.id && (!anim || animationElements[i].anim == anim)) {\n            var e = animationElements[i];\n            if (eve(\"raphael.anim.resume.\" + this.id, this, e.anim) !== false) {\n                delete e.paused;\n                this.status(e.anim, e.status);\n            }\n        }\n        return this;\n    };\n    /*\\\n     * Element.stop\n     [ method ]\n     **\n     * Stops animation of the element.\n     **\n     > Parameters\n     **\n     - anim (object) #optional animation object\n     **\n     = (object) original element\n    \\*/\n    elproto.stop = function (anim) {\n        for (var i = 0; i < animationElements.length; i++) if (animationElements[i].el.id == this.id && (!anim || animationElements[i].anim == anim)) {\n            if (eve(\"raphael.anim.stop.\" + this.id, this, animationElements[i].anim) !== false) {\n                animationElements.splice(i--, 1);\n            }\n        }\n        return this;\n    };\n    function stopAnimation(paper) {\n        for (var i = 0; i < animationElements.length; i++) if (animationElements[i].el.paper == paper) {\n            animationElements.splice(i--, 1);\n        }\n    }\n    eve.on(\"raphael.remove\", stopAnimation);\n    eve.on(\"raphael.clear\", stopAnimation);\n    elproto.toString = function () {\n        return \"Rapha\\xebl\\u2019s object\";\n    };\n\n    // Set\n    var Set = function (items) {\n        this.items = [];\n        this.length = 0;\n        this.type = \"set\";\n        if (items) {\n            for (var i = 0, ii = items.length; i < ii; i++) {\n                if (items[i] && (items[i].constructor == elproto.constructor || items[i].constructor == Set)) {\n                    this[this.items.length] = this.items[this.items.length] = items[i];\n                    this.length++;\n                }\n            }\n        }\n    },\n    setproto = Set.prototype;\n    /*\\\n     * Set.push\n     [ method ]\n     **\n     * Adds each argument to the current set.\n     = (object) original element\n    \\*/\n    setproto.push = function () {\n        var item,\n            len;\n        for (var i = 0, ii = arguments.length; i < ii; i++) {\n            item = arguments[i];\n            if (item && (item.constructor == elproto.constructor || item.constructor == Set)) {\n                len = this.items.length;\n                this[len] = this.items[len] = item;\n                this.length++;\n            }\n        }\n        return this;\n    };\n    /*\\\n     * Set.pop\n     [ method ]\n     **\n     * Removes last element and returns it.\n     = (object) element\n    \\*/\n    setproto.pop = function () {\n        this.length && delete this[this.length--];\n        return this.items.pop();\n    };\n    /*\\\n     * Set.forEach\n     [ method ]\n     **\n     * Executes given function for each element in the set.\n     *\n     * If function returns `false` it will stop loop running.\n     **\n     > Parameters\n     **\n     - callback (function) function to run\n     - thisArg (object) context object for the callback\n     = (object) Set object\n    \\*/\n    setproto.forEach = function (callback, thisArg) {\n        for (var i = 0, ii = this.items.length; i < ii; i++) {\n            if (callback.call(thisArg, this.items[i], i) === false) {\n                return this;\n            }\n        }\n        return this;\n    };\n    for (var method in elproto) if (elproto[has](method)) {\n        setproto[method] = (function (methodname) {\n            return function () {\n                var arg = arguments;\n                return this.forEach(function (el) {\n                    el[methodname][apply](el, arg);\n                });\n            };\n        })(method);\n    }\n    setproto.attr = function (name, value) {\n        if (name && R.is(name, array) && R.is(name[0], \"object\")) {\n            for (var j = 0, jj = name.length; j < jj; j++) {\n                this.items[j].attr(name[j]);\n            }\n        } else {\n            for (var i = 0, ii = this.items.length; i < ii; i++) {\n                this.items[i].attr(name, value);\n            }\n        }\n        return this;\n    };\n    /*\\\n     * Set.clear\n     [ method ]\n     **\n     * Removes all elements from the set\n    \\*/\n    setproto.clear = function () {\n        while (this.length) {\n            this.pop();\n        }\n    };\n    /*\\\n     * Set.splice\n     [ method ]\n     **\n     * Removes given element from the set\n     **\n     > Parameters\n     **\n     - index (number) position of the deletion\n     - count (number) number of element to remove\n     - insertion\u2026 (object) #optional elements to insert\n     = (object) set elements that were deleted\n    \\*/\n    setproto.splice = function (index, count, insertion) {\n        index = index < 0 ? mmax(this.length + index, 0) : index;\n        count = mmax(0, mmin(this.length - index, count));\n        var tail = [],\n            todel = [],\n            args = [],\n            i;\n        for (i = 2; i < arguments.length; i++) {\n            args.push(arguments[i]);\n        }\n        for (i = 0; i < count; i++) {\n            todel.push(this[index + i]);\n        }\n        for (; i < this.length - index; i++) {\n            tail.push(this[index + i]);\n        }\n        var arglen = args.length;\n        for (i = 0; i < arglen + tail.length; i++) {\n            this.items[index + i] = this[index + i] = i < arglen ? args[i] : tail[i - arglen];\n        }\n        i = this.items.length = this.length -= count - arglen;\n        while (this[i]) {\n            delete this[i++];\n        }\n        return new Set(todel);\n    };\n    /*\\\n     * Set.exclude\n     [ method ]\n     **\n     * Removes given element from the set\n     **\n     > Parameters\n     **\n     - element (object) element to remove\n     = (boolean) `true` if object was found & removed from the set\n    \\*/\n    setproto.exclude = function (el) {\n        for (var i = 0, ii = this.length; i < ii; i++) if (this[i] == el) {\n            this.splice(i, 1);\n            return true;\n        }\n    };\n    setproto.animate = function (params, ms, easing, callback) {\n        (R.is(easing, \"function\") || !easing) && (callback = easing || null);\n        var len = this.items.length,\n            i = len,\n            item,\n            set = this,\n            collector;\n        if (!len) {\n            return this;\n        }\n        callback && (collector = function () {\n            !--len && callback.call(set);\n        });\n        easing = R.is(easing, string) ? easing : collector;\n        var anim = R.animation(params, ms, easing, collector);\n        item = this.items[--i].animate(anim);\n        while (i--) {\n            this.items[i] && !this.items[i].removed && this.items[i].animateWith(item, anim, anim);\n            (this.items[i] && !this.items[i].removed) || len--;\n        }\n        return this;\n    };\n    setproto.insertAfter = function (el) {\n        var i = this.items.length;\n        while (i--) {\n            this.items[i].insertAfter(el);\n        }\n        return this;\n    };\n    setproto.getBBox = function () {\n        var x = [],\n            y = [],\n            x2 = [],\n            y2 = [];\n        for (var i = this.items.length; i--;) if (!this.items[i].removed) {\n            var box = this.items[i].getBBox();\n            x.push(box.x);\n            y.push(box.y);\n            x2.push(box.x + box.width);\n            y2.push(box.y + box.height);\n        }\n        x = mmin[apply](0, x);\n        y = mmin[apply](0, y);\n        x2 = mmax[apply](0, x2);\n        y2 = mmax[apply](0, y2);\n        return {\n            x: x,\n            y: y,\n            x2: x2,\n            y2: y2,\n            width: x2 - x,\n            height: y2 - y\n        };\n    };\n    setproto.clone = function (s) {\n        s = this.paper.set();\n        for (var i = 0, ii = this.items.length; i < ii; i++) {\n            s.push(this.items[i].clone());\n        }\n        return s;\n    };\n    setproto.toString = function () {\n        return \"Rapha\\xebl\\u2018s set\";\n    };\n\n    setproto.glow = function(glowConfig) {\n        var ret = this.paper.set();\n        this.forEach(function(shape, index){\n            var g = shape.glow(glowConfig);\n            if(g != null){\n                g.forEach(function(shape2, index2){\n                    ret.push(shape2);\n                });\n            }\n        });\n        return ret;\n    };\n\n\n    /*\\\n     * Set.isPointInside\n     [ method ]\n     **\n     * Determine if given point is inside this set\u2019s elements\n     **\n     > Parameters\n     **\n     - x (number) x coordinate of the point\n     - y (number) y coordinate of the point\n     = (boolean) `true` if point is inside any of the set's elements\n     \\*/\n    setproto.isPointInside = function (x, y) {\n        var isPointInside = false;\n        this.forEach(function (el) {\n            if (el.isPointInside(x, y)) {\n                isPointInside = true;\n                return false; // stop loop\n            }\n        });\n        return isPointInside;\n    };\n\n    /*\\\n     * Raphael.registerFont\n     [ method ]\n     **\n     * Adds given font to the registered set of fonts for Rapha\u00EBl. Should be used as an internal call from within Cuf\u00F3n\u2019s font file.\n     * Returns original parameter, so it could be used with chaining.\n     # <a href=\"http://wiki.github.com/sorccu/cufon/about\">More about Cuf\u00F3n and how to convert your font form TTF, OTF, etc to JavaScript file.</a>\n     **\n     > Parameters\n     **\n     - font (object) the font to register\n     = (object) the font you passed in\n     > Usage\n     | Cufon.registerFont(Raphael.registerFont({\u2026}));\n    \\*/\n    R.registerFont = function (font) {\n        if (!font.face) {\n            return font;\n        }\n        this.fonts = this.fonts || {};\n        var fontcopy = {\n                w: font.w,\n                face: {},\n                glyphs: {}\n            },\n            family = font.face[\"font-family\"];\n        for (var prop in font.face) if (font.face[has](prop)) {\n            fontcopy.face[prop] = font.face[prop];\n        }\n        if (this.fonts[family]) {\n            this.fonts[family].push(fontcopy);\n        } else {\n            this.fonts[family] = [fontcopy];\n        }\n        if (!font.svg) {\n            fontcopy.face[\"units-per-em\"] = toInt(font.face[\"units-per-em\"], 10);\n            for (var glyph in font.glyphs) if (font.glyphs[has](glyph)) {\n                var path = font.glyphs[glyph];\n                fontcopy.glyphs[glyph] = {\n                    w: path.w,\n                    k: {},\n                    d: path.d && \"M\" + path.d.replace(/[mlcxtrv]/g, function (command) {\n                            return {l: \"L\", c: \"C\", x: \"z\", t: \"m\", r: \"l\", v: \"c\"}[command] || \"M\";\n                        }) + \"z\"\n                };\n                if (path.k) {\n                    for (var k in path.k) if (path[has](k)) {\n                        fontcopy.glyphs[glyph].k[k] = path.k[k];\n                    }\n                }\n            }\n        }\n        return font;\n    };\n    /*\\\n     * Paper.getFont\n     [ method ]\n     **\n     * Finds font object in the registered fonts by given parameters. You could specify only one word from the font name, like \u201CMyriad\u201D for \u201CMyriad Pro\u201D.\n     **\n     > Parameters\n     **\n     - family (string) font family name or any word from it\n     - weight (string) #optional font weight\n     - style (string) #optional font style\n     - stretch (string) #optional font stretch\n     = (object) the font object\n     > Usage\n     | paper.print(100, 100, \"Test string\", paper.getFont(\"Times\", 800), 30);\n    \\*/\n    paperproto.getFont = function (family, weight, style, stretch) {\n        stretch = stretch || \"normal\";\n        style = style || \"normal\";\n        weight = +weight || {normal: 400, bold: 700, lighter: 300, bolder: 800}[weight] || 400;\n        if (!R.fonts) {\n            return;\n        }\n        var font = R.fonts[family];\n        if (!font) {\n            var name = new RegExp(\"(^|\\\\s)\" + family.replace(/[^\\w\\d\\s+!~.:_-]/g, E) + \"(\\\\s|$)\", \"i\");\n            for (var fontName in R.fonts) if (R.fonts[has](fontName)) {\n                if (name.test(fontName)) {\n                    font = R.fonts[fontName];\n                    break;\n                }\n            }\n        }\n        var thefont;\n        if (font) {\n            for (var i = 0, ii = font.length; i < ii; i++) {\n                thefont = font[i];\n                if (thefont.face[\"font-weight\"] == weight && (thefont.face[\"font-style\"] == style || !thefont.face[\"font-style\"]) && thefont.face[\"font-stretch\"] == stretch) {\n                    break;\n                }\n            }\n        }\n        return thefont;\n    };\n    /*\\\n     * Paper.print\n     [ method ]\n     **\n     * Creates path that represent given text written using given font at given position with given size.\n     * Result of the method is path element that contains whole text as a separate path.\n     **\n     > Parameters\n     **\n     - x (number) x position of the text\n     - y (number) y position of the text\n     - string (string) text to print\n     - font (object) font object, see @Paper.getFont\n     - size (number) #optional size of the font, default is `16`\n     - origin (string) #optional could be `\"baseline\"` or `\"middle\"`, default is `\"middle\"`\n     - letter_spacing (number) #optional number in range `-1..1`, default is `0`\n     - line_spacing (number) #optional number in range `1..3`, default is `1`\n     = (object) resulting path element, which consist of all letters\n     > Usage\n     | var txt = r.print(10, 50, \"print\", r.getFont(\"Museo\"), 30).attr({fill: \"#fff\"});\n    \\*/\n    paperproto.print = function (x, y, string, font, size, origin, letter_spacing, line_spacing) {\n        origin = origin || \"middle\"; // baseline|middle\n        letter_spacing = mmax(mmin(letter_spacing || 0, 1), -1);\n        line_spacing = mmax(mmin(line_spacing || 1, 3), 1);\n        var letters = Str(string)[split](E),\n            shift = 0,\n            notfirst = 0,\n            path = E,\n            scale;\n        R.is(font, \"string\") && (font = this.getFont(font));\n        if (font) {\n            scale = (size || 16) / font.face[\"units-per-em\"];\n            var bb = font.face.bbox[split](separator),\n                top = +bb[0],\n                lineHeight = bb[3] - bb[1],\n                shifty = 0,\n                height = +bb[1] + (origin == \"baseline\" ? lineHeight + (+font.face.descent) : lineHeight / 2);\n            for (var i = 0, ii = letters.length; i < ii; i++) {\n                if (letters[i] == \"\\n\") {\n                    shift = 0;\n                    curr = 0;\n                    notfirst = 0;\n                    shifty += lineHeight * line_spacing;\n                } else {\n                    var prev = notfirst && font.glyphs[letters[i - 1]] || {},\n                        curr = font.glyphs[letters[i]];\n                    shift += notfirst ? (prev.w || font.w) + (prev.k && prev.k[letters[i]] || 0) + (font.w * letter_spacing) : 0;\n                    notfirst = 1;\n                }\n                if (curr && curr.d) {\n                    path += R.transformPath(curr.d, [\"t\", shift * scale, shifty * scale, \"s\", scale, scale, top, height, \"t\", (x - top) / scale, (y - height) / scale]);\n                }\n            }\n        }\n        return this.path(path).attr({\n            fill: \"#000\",\n            stroke: \"none\"\n        });\n    };\n\n    /*\\\n     * Paper.add\n     [ method ]\n     **\n     * Imports elements in JSON array in format `{type: type, <attributes>}`\n     **\n     > Parameters\n     **\n     - json (array)\n     = (object) resulting set of imported elements\n     > Usage\n     | paper.add([\n     |     {\n     |         type: \"circle\",\n     |         cx: 10,\n     |         cy: 10,\n     |         r: 5\n     |     },\n     |     {\n     |         type: \"rect\",\n     |         x: 10,\n     |         y: 10,\n     |         width: 10,\n     |         height: 10,\n     |         fill: \"#fc0\"\n     |     }\n     | ]);\n    \\*/\n    paperproto.add = function (json) {\n        if (R.is(json, \"array\")) {\n            var res = this.set(),\n                i = 0,\n                ii = json.length,\n                j;\n            for (; i < ii; i++) {\n                j = json[i] || {};\n                elements[has](j.type) && res.push(this[j.type]().attr(j));\n            }\n        }\n        return res;\n    };\n\n    /*\\\n     * Raphael.format\n     [ method ]\n     **\n     * Simple format function. Replaces construction of type \u201C`{<number>}`\u201D to the corresponding argument.\n     **\n     > Parameters\n     **\n     - token (string) string to format\n     - \u2026 (string) rest of arguments will be treated as parameters for replacement\n     = (string) formated string\n     > Usage\n     | var x = 10,\n     |     y = 20,\n     |     width = 40,\n     |     height = 50;\n     | // this will draw a rectangular shape equivalent to \"M10,20h40v50h-40z\"\n     | paper.path(Raphael.format(\"M{0},{1}h{2}v{3}h{4}z\", x, y, width, height, -width));\n    \\*/\n    R.format = function (token, params) {\n        var args = R.is(params, array) ? [0][concat](params) : arguments;\n        token && R.is(token, string) && args.length - 1 && (token = token.replace(formatrg, function (str, i) {\n            return args[++i] == null ? E : args[i];\n        }));\n        return token || E;\n    };\n    /*\\\n     * Raphael.fullfill\n     [ method ]\n     **\n     * A little bit more advanced format function than @Raphael.format. Replaces construction of type \u201C`{<name>}`\u201D to the corresponding argument.\n     **\n     > Parameters\n     **\n     - token (string) string to format\n     - json (object) object which properties will be used as a replacement\n     = (string) formated string\n     > Usage\n     | // this will draw a rectangular shape equivalent to \"M10,20h40v50h-40z\"\n     | paper.path(Raphael.fullfill(\"M{x},{y}h{dim.width}v{dim.height}h{dim['negative width']}z\", {\n     |     x: 10,\n     |     y: 20,\n     |     dim: {\n     |         width: 40,\n     |         height: 50,\n     |         \"negative width\": -40\n     |     }\n     | }));\n    \\*/\n    R.fullfill = (function () {\n        var tokenRegex = /\\{([^\\}]+)\\}/g,\n            objNotationRegex = /(?:(?:^|\\.)(.+?)(?=\\[|\\.|$|\\()|\\[('|\")(.+?)\\2\\])(\\(\\))?/g, // matches .xxxxx or [\"xxxxx\"] to run over object properties\n            replacer = function (all, key, obj) {\n                var res = obj;\n                key.replace(objNotationRegex, function (all, name, quote, quotedName, isFunc) {\n                    name = name || quotedName;\n                    if (res) {\n                        if (name in res) {\n                            res = res[name];\n                        }\n                        typeof res == \"function\" && isFunc && (res = res());\n                    }\n                });\n                res = (res == null || res == obj ? all : res) + \"\";\n                return res;\n            };\n        return function (str, obj) {\n            return String(str).replace(tokenRegex, function (all, key) {\n                return replacer(all, key, obj);\n            });\n        };\n    })();\n    /*\\\n     * Raphael.ninja\n     [ method ]\n     **\n     * If you want to leave no trace of Rapha\u00EBl (Well, Rapha\u00EBl creates only one global variable `Raphael`, but anyway.) You can use `ninja` method.\n     * Beware, that in this case plugins could stop working, because they are depending on global variable existence.\n     **\n     = (object) Raphael object\n     > Usage\n     | (function (local_raphael) {\n     |     var paper = local_raphael(10, 10, 320, 200);\n     |     \u2026\n     | })(Raphael.ninja());\n    \\*/\n    R.ninja = function () {\n        if (oldRaphael.was) {\n            g.win.Raphael = oldRaphael.is;\n        } else {\n            // IE8 raises an error when deleting window property\n            window.Raphael = undefined;\n            try {\n                delete window.Raphael;\n            } catch(e) {}\n        }\n        return R;\n    };\n    /*\\\n     * Raphael.st\n     [ property (object) ]\n     **\n     * You can add your own method to elements and sets. It is wise to add a set method for each element method\n     * you added, so you will be able to call the same method on sets too.\n     **\n     * See also @Raphael.el.\n     > Usage\n     | Raphael.el.red = function () {\n     |     this.attr({fill: \"#f00\"});\n     | };\n     | Raphael.st.red = function () {\n     |     this.forEach(function (el) {\n     |         el.red();\n     |     });\n     | };\n     | // then use it\n     | paper.set(paper.circle(100, 100, 20), paper.circle(110, 100, 20)).red();\n    \\*/\n    R.st = setproto;\n\n    eve.on(\"raphael.DOMload\", function () {\n        loaded = true;\n    });\n\n    // Firefox <3.6 fix: http://webreflection.blogspot.com/2009/11/195-chars-to-help-lazy-loading.html\n    (function (doc, loaded, f) {\n        if (doc.readyState == null && doc.addEventListener){\n            doc.addEventListener(loaded, f = function () {\n                doc.removeEventListener(loaded, f, false);\n                doc.readyState = \"complete\";\n            }, false);\n            doc.readyState = \"loading\";\n        }\n        function isLoaded() {\n            (/in/).test(doc.readyState) ? setTimeout(isLoaded, 9) : R.eve(\"raphael.DOMload\");\n        }\n        isLoaded();\n    })(document, \"DOMContentLoaded\");\n\n    return R;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\n\n/***/ }),\n\n/***/ \"./dev/raphael.svg.js\":\n/*!****************************!*\\\n  !*** ./dev/raphael.svg.js ***!\n  \\****************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! ./raphael.core */ \"./dev/raphael.core.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function(R) {\n    if (R && !R.svg) {\n        return;\n    }\n\n    var has = \"hasOwnProperty\",\n        Str = String,\n        toFloat = parseFloat,\n        toInt = parseInt,\n        math = Math,\n        mmax = math.max,\n        abs = math.abs,\n        pow = math.pow,\n        separator = /[, ]+/,\n        eve = R.eve,\n        E = \"\",\n        S = \" \";\n    var xlink = \"http://www.w3.org/1999/xlink\",\n        markers = {\n            block: \"M5,0 0,2.5 5,5z\",\n            classic: \"M5,0 0,2.5 5,5 3.5,3 3.5,2z\",\n            diamond: \"M2.5,0 5,2.5 2.5,5 0,2.5z\",\n            open: \"M6,1 1,3.5 6,6\",\n            oval: \"M2.5,0A2.5,2.5,0,0,1,2.5,5 2.5,2.5,0,0,1,2.5,0z\"\n        },\n        markerCounter = {};\n    R.toString = function () {\n        return  \"Your browser supports SVG.\\nYou are running Rapha\\xebl \" + this.version;\n    };\n    var $ = function (el, attr) {\n        if (attr) {\n            if (typeof el == \"string\") {\n                el = $(el);\n            }\n            for (var key in attr) if (attr[has](key)) {\n                if (key.substring(0, 6) == \"xlink:\") {\n                    el.setAttributeNS(xlink, key.substring(6), Str(attr[key]));\n                } else {\n                    el.setAttribute(key, Str(attr[key]));\n                }\n            }\n        } else {\n            el = R._g.doc.createElementNS(\"http://www.w3.org/2000/svg\", el);\n            el.style && (el.style.webkitTapHighlightColor = \"rgba(0,0,0,0)\");\n        }\n        return el;\n    },\n    addGradientFill = function (element, gradient) {\n        var type = \"linear\",\n            id = element.id + gradient,\n            fx = .5, fy = .5,\n            o = element.node,\n            SVG = element.paper,\n            s = o.style,\n            el = R._g.doc.getElementById(id);\n        if (!el) {\n            gradient = Str(gradient).replace(R._radial_gradient, function (all, _fx, _fy) {\n                type = \"radial\";\n                if (_fx && _fy) {\n                    fx = toFloat(_fx);\n                    fy = toFloat(_fy);\n                    var dir = ((fy > .5) * 2 - 1);\n                    pow(fx - .5, 2) + pow(fy - .5, 2) > .25 &&\n                        (fy = math.sqrt(.25 - pow(fx - .5, 2)) * dir + .5) &&\n                        fy != .5 &&\n                        (fy = fy.toFixed(5) - 1e-5 * dir);\n                }\n                return E;\n            });\n            gradient = gradient.split(/\\s*\\-\\s*/);\n            if (type == \"linear\") {\n                var angle = gradient.shift();\n                angle = -toFloat(angle);\n                if (isNaN(angle)) {\n                    return null;\n                }\n                var vector = [0, 0, math.cos(R.rad(angle)), math.sin(R.rad(angle))],\n                    max = 1 / (mmax(abs(vector[2]), abs(vector[3])) || 1);\n                vector[2] *= max;\n                vector[3] *= max;\n                if (vector[2] < 0) {\n                    vector[0] = -vector[2];\n                    vector[2] = 0;\n                }\n                if (vector[3] < 0) {\n                    vector[1] = -vector[3];\n                    vector[3] = 0;\n                }\n            }\n            var dots = R._parseDots(gradient);\n            if (!dots) {\n                return null;\n            }\n            id = id.replace(/[\\(\\)\\s,\\xb0#]/g, \"_\");\n\n            if (element.gradient && id != element.gradient.id) {\n                SVG.defs.removeChild(element.gradient);\n                delete element.gradient;\n            }\n\n            if (!element.gradient) {\n                el = $(type + \"Gradient\", {id: id});\n                element.gradient = el;\n                $(el, type == \"radial\" ? {\n                    fx: fx,\n                    fy: fy\n                } : {\n                    x1: vector[0],\n                    y1: vector[1],\n                    x2: vector[2],\n                    y2: vector[3],\n                    gradientTransform: element.matrix.invert()\n                });\n                SVG.defs.appendChild(el);\n                for (var i = 0, ii = dots.length; i < ii; i++) {\n                    el.appendChild($(\"stop\", {\n                        offset: dots[i].offset ? dots[i].offset : i ? \"100%\" : \"0%\",\n                        \"stop-color\": dots[i].color || \"#fff\",\n                        \"stop-opacity\": isFinite(dots[i].opacity) ? dots[i].opacity : 1\n                    }));\n                }\n            }\n        }\n        $(o, {\n            fill: fillurl(id),\n            opacity: 1,\n            \"fill-opacity\": 1\n        });\n        s.fill = E;\n        s.opacity = 1;\n        s.fillOpacity = 1;\n        return 1;\n    },\n    isIE9or10 = function () {\n      var mode = document.documentMode;\n      return mode && (mode === 9 || mode === 10);\n    },\n    fillurl = function (id) {\n      if (isIE9or10()) {\n          return \"url('#\" + id + \"')\";\n      }\n      var location = document.location;\n      var locationString = (\n          location.protocol + '//' +\n          location.host +\n          location.pathname +\n          location.search\n      );\n      return \"url('\" + locationString + \"#\" + id + \"')\";\n    },\n    updatePosition = function (o) {\n        var bbox = o.getBBox(1);\n        $(o.pattern, {patternTransform: o.matrix.invert() + \" translate(\" + bbox.x + \",\" + bbox.y + \")\"});\n    },\n    addArrow = function (o, value, isEnd) {\n        if (o.type == \"path\") {\n            var values = Str(value).toLowerCase().split(\"-\"),\n                p = o.paper,\n                se = isEnd ? \"end\" : \"start\",\n                node = o.node,\n                attrs = o.attrs,\n                stroke = attrs[\"stroke-width\"],\n                i = values.length,\n                type = \"classic\",\n                from,\n                to,\n                dx,\n                refX,\n                attr,\n                w = 3,\n                h = 3,\n                t = 5;\n            while (i--) {\n                switch (values[i]) {\n                    case \"block\":\n                    case \"classic\":\n                    case \"oval\":\n                    case \"diamond\":\n                    case \"open\":\n                    case \"none\":\n                        type = values[i];\n                        break;\n                    case \"wide\": h = 5; break;\n                    case \"narrow\": h = 2; break;\n                    case \"long\": w = 5; break;\n                    case \"short\": w = 2; break;\n                }\n            }\n            if (type == \"open\") {\n                w += 2;\n                h += 2;\n                t += 2;\n                dx = 1;\n                refX = isEnd ? 4 : 1;\n                attr = {\n                    fill: \"none\",\n                    stroke: attrs.stroke\n                };\n            } else {\n                refX = dx = w / 2;\n                attr = {\n                    fill: attrs.stroke,\n                    stroke: \"none\"\n                };\n            }\n            if (o._.arrows) {\n                if (isEnd) {\n                    o._.arrows.endPath && markerCounter[o._.arrows.endPath]--;\n                    o._.arrows.endMarker && markerCounter[o._.arrows.endMarker]--;\n                } else {\n                    o._.arrows.startPath && markerCounter[o._.arrows.startPath]--;\n                    o._.arrows.startMarker && markerCounter[o._.arrows.startMarker]--;\n                }\n            } else {\n                o._.arrows = {};\n            }\n            if (type != \"none\") {\n                var pathId = \"raphael-marker-\" + type,\n                    markerId = \"raphael-marker-\" + se + type + w + h + \"-obj\" + o.id;\n                if (!R._g.doc.getElementById(pathId)) {\n                    p.defs.appendChild($($(\"path\"), {\n                        \"stroke-linecap\": \"round\",\n                        d: markers[type],\n                        id: pathId\n                    }));\n                    markerCounter[pathId] = 1;\n                } else {\n                    markerCounter[pathId]++;\n                }\n                var marker = R._g.doc.getElementById(markerId),\n                    use;\n                if (!marker) {\n                    marker = $($(\"marker\"), {\n                        id: markerId,\n                        markerHeight: h,\n                        markerWidth: w,\n                        orient: \"auto\",\n                        refX: refX,\n                        refY: h / 2\n                    });\n                    use = $($(\"use\"), {\n                        \"xlink:href\": \"#\" + pathId,\n                        transform: (isEnd ? \"rotate(180 \" + w / 2 + \" \" + h / 2 + \") \" : E) + \"scale(\" + w / t + \",\" + h / t + \")\",\n                        \"stroke-width\": (1 / ((w / t + h / t) / 2)).toFixed(4)\n                    });\n                    marker.appendChild(use);\n                    p.defs.appendChild(marker);\n                    markerCounter[markerId] = 1;\n                } else {\n                    markerCounter[markerId]++;\n                    use = marker.getElementsByTagName(\"use\")[0];\n                }\n                $(use, attr);\n                var delta = dx * (type != \"diamond\" && type != \"oval\");\n                if (isEnd) {\n                    from = o._.arrows.startdx * stroke || 0;\n                    to = R.getTotalLength(attrs.path) - delta * stroke;\n                } else {\n                    from = delta * stroke;\n                    to = R.getTotalLength(attrs.path) - (o._.arrows.enddx * stroke || 0);\n                }\n                attr = {};\n                attr[\"marker-\" + se] = \"url(#\" + markerId + \")\";\n                if (to || from) {\n                    attr.d = R.getSubpath(attrs.path, from, to);\n                }\n                $(node, attr);\n                o._.arrows[se + \"Path\"] = pathId;\n                o._.arrows[se + \"Marker\"] = markerId;\n                o._.arrows[se + \"dx\"] = delta;\n                o._.arrows[se + \"Type\"] = type;\n                o._.arrows[se + \"String\"] = value;\n            } else {\n                if (isEnd) {\n                    from = o._.arrows.startdx * stroke || 0;\n                    to = R.getTotalLength(attrs.path) - from;\n                } else {\n                    from = 0;\n                    to = R.getTotalLength(attrs.path) - (o._.arrows.enddx * stroke || 0);\n                }\n                o._.arrows[se + \"Path\"] && $(node, {d: R.getSubpath(attrs.path, from, to)});\n                delete o._.arrows[se + \"Path\"];\n                delete o._.arrows[se + \"Marker\"];\n                delete o._.arrows[se + \"dx\"];\n                delete o._.arrows[se + \"Type\"];\n                delete o._.arrows[se + \"String\"];\n            }\n            for (attr in markerCounter) if (markerCounter[has](attr) && !markerCounter[attr]) {\n                var item = R._g.doc.getElementById(attr);\n                item && item.parentNode.removeChild(item);\n            }\n        }\n    },\n    dasharray = {\n        \"-\": [3, 1],\n        \".\": [1, 1],\n        \"-.\": [3, 1, 1, 1],\n        \"-..\": [3, 1, 1, 1, 1, 1],\n        \". \": [1, 3],\n        \"- \": [4, 3],\n        \"--\": [8, 3],\n        \"- .\": [4, 3, 1, 3],\n        \"--.\": [8, 3, 1, 3],\n        \"--..\": [8, 3, 1, 3, 1, 3]\n    },\n    addDashes = function (o, value, params) {\n        value = dasharray[Str(value).toLowerCase()];\n        if (value) {\n            var width = o.attrs[\"stroke-width\"] || \"1\",\n                butt = {round: width, square: width, butt: 0}[o.attrs[\"stroke-linecap\"] || params[\"stroke-linecap\"]] || 0,\n                dashes = [],\n                i = value.length;\n            while (i--) {\n                dashes[i] = value[i] * width + ((i % 2) ? 1 : -1) * butt;\n            }\n            $(o.node, {\"stroke-dasharray\": dashes.join(\",\")});\n        }\n        else {\n          $(o.node, {\"stroke-dasharray\": \"none\"});\n        }\n    },\n    setFillAndStroke = function (o, params) {\n        var node = o.node,\n            attrs = o.attrs,\n            vis = node.style.visibility;\n        node.style.visibility = \"hidden\";\n        for (var att in params) {\n            if (params[has](att)) {\n                if (!R._availableAttrs[has](att)) {\n                    continue;\n                }\n                var value = params[att];\n                attrs[att] = value;\n                switch (att) {\n                    case \"blur\":\n                        o.blur(value);\n                        break;\n                    case \"title\":\n                        var title = node.getElementsByTagName(\"title\");\n\n                        // Use the existing <title>.\n                        if (title.length && (title = title[0])) {\n                          title.firstChild.nodeValue = value;\n                        } else {\n                          title = $(\"title\");\n                          var val = R._g.doc.createTextNode(value);\n                          title.appendChild(val);\n                          node.appendChild(title);\n                        }\n                        break;\n                    case \"href\":\n                    case \"target\":\n                        var pn = node.parentNode;\n                        if (pn.tagName.toLowerCase() != \"a\") {\n                            var hl = $(\"a\");\n                            pn.insertBefore(hl, node);\n                            hl.appendChild(node);\n                            pn = hl;\n                        }\n                        if (att == \"target\") {\n                            pn.setAttributeNS(xlink, \"show\", value == \"blank\" ? \"new\" : value);\n                        } else {\n                            pn.setAttributeNS(xlink, att, value);\n                        }\n                        break;\n                    case \"cursor\":\n                        node.style.cursor = value;\n                        break;\n                    case \"transform\":\n                        o.transform(value);\n                        break;\n                    case \"arrow-start\":\n                        addArrow(o, value);\n                        break;\n                    case \"arrow-end\":\n                        addArrow(o, value, 1);\n                        break;\n                    case \"clip-rect\":\n                        var rect = Str(value).split(separator);\n                        if (rect.length == 4) {\n                            o.clip && o.clip.parentNode.parentNode.removeChild(o.clip.parentNode);\n                            var el = $(\"clipPath\"),\n                                rc = $(\"rect\");\n                            el.id = R.createUUID();\n                            $(rc, {\n                                x: rect[0],\n                                y: rect[1],\n                                width: rect[2],\n                                height: rect[3]\n                            });\n                            el.appendChild(rc);\n                            o.paper.defs.appendChild(el);\n                            $(node, {\"clip-path\": \"url(#\" + el.id + \")\"});\n                            o.clip = rc;\n                        }\n                        if (!value) {\n                            var path = node.getAttribute(\"clip-path\");\n                            if (path) {\n                                var clip = R._g.doc.getElementById(path.replace(/(^url\\(#|\\)$)/g, E));\n                                clip && clip.parentNode.removeChild(clip);\n                                $(node, {\"clip-path\": E});\n                                delete o.clip;\n                            }\n                        }\n                    break;\n                    case \"path\":\n                        if (o.type == \"path\") {\n                            $(node, {d: value ? attrs.path = R._pathToAbsolute(value) : \"M0,0\"});\n                            o._.dirty = 1;\n                            if (o._.arrows) {\n                                \"startString\" in o._.arrows && addArrow(o, o._.arrows.startString);\n                                \"endString\" in o._.arrows && addArrow(o, o._.arrows.endString, 1);\n                            }\n                        }\n                        break;\n                    case \"width\":\n                        node.setAttribute(att, value);\n                        o._.dirty = 1;\n                        if (attrs.fx) {\n                            att = \"x\";\n                            value = attrs.x;\n                        } else {\n                            break;\n                        }\n                    case \"x\":\n                        if (attrs.fx) {\n                            value = -attrs.x - (attrs.width || 0);\n                        }\n                    case \"rx\":\n                        if (att == \"rx\" && o.type == \"rect\") {\n                            break;\n                        }\n                    case \"cx\":\n                        node.setAttribute(att, value);\n                        o.pattern && updatePosition(o);\n                        o._.dirty = 1;\n                        break;\n                    case \"height\":\n                        node.setAttribute(att, value);\n                        o._.dirty = 1;\n                        if (attrs.fy) {\n                            att = \"y\";\n                            value = attrs.y;\n                        } else {\n                            break;\n                        }\n                    case \"y\":\n                        if (attrs.fy) {\n                            value = -attrs.y - (attrs.height || 0);\n                        }\n                    case \"ry\":\n                        if (att == \"ry\" && o.type == \"rect\") {\n                            break;\n                        }\n                    case \"cy\":\n                        node.setAttribute(att, value);\n                        o.pattern && updatePosition(o);\n                        o._.dirty = 1;\n                        break;\n                    case \"r\":\n                        if (o.type == \"rect\") {\n                            $(node, {rx: value, ry: value});\n                        } else {\n                            node.setAttribute(att, value);\n                        }\n                        o._.dirty = 1;\n                        break;\n                    case \"src\":\n                        if (o.type == \"image\") {\n                            node.setAttributeNS(xlink, \"href\", value);\n                        }\n                        break;\n                    case \"stroke-width\":\n                        if (o._.sx != 1 || o._.sy != 1) {\n                            value /= mmax(abs(o._.sx), abs(o._.sy)) || 1;\n                        }\n                        node.setAttribute(att, value);\n                        if (attrs[\"stroke-dasharray\"]) {\n                            addDashes(o, attrs[\"stroke-dasharray\"], params);\n                        }\n                        if (o._.arrows) {\n                            \"startString\" in o._.arrows && addArrow(o, o._.arrows.startString);\n                            \"endString\" in o._.arrows && addArrow(o, o._.arrows.endString, 1);\n                        }\n                        break;\n                    case \"stroke-dasharray\":\n                        addDashes(o, value, params);\n                        break;\n                    case \"fill\":\n                        var isURL = Str(value).match(R._ISURL);\n                        if (isURL) {\n                            el = $(\"pattern\");\n                            var ig = $(\"image\");\n                            el.id = R.createUUID();\n                            $(el, {x: 0, y: 0, patternUnits: \"userSpaceOnUse\", height: 1, width: 1});\n                            $(ig, {x: 0, y: 0, \"xlink:href\": isURL[1]});\n                            el.appendChild(ig);\n\n                            (function (el) {\n                                R._preload(isURL[1], function () {\n                                    var w = this.offsetWidth,\n                                        h = this.offsetHeight;\n                                    $(el, {width: w, height: h});\n                                    $(ig, {width: w, height: h});\n                                });\n                            })(el);\n                            o.paper.defs.appendChild(el);\n                            $(node, {fill: \"url(#\" + el.id + \")\"});\n                            o.pattern = el;\n                            o.pattern && updatePosition(o);\n                            break;\n                        }\n                        var clr = R.getRGB(value);\n                        if (!clr.error) {\n                            delete params.gradient;\n                            delete attrs.gradient;\n                            !R.is(attrs.opacity, \"undefined\") &&\n                                R.is(params.opacity, \"undefined\") &&\n                                $(node, {opacity: attrs.opacity});\n                            !R.is(attrs[\"fill-opacity\"], \"undefined\") &&\n                                R.is(params[\"fill-opacity\"], \"undefined\") &&\n                                $(node, {\"fill-opacity\": attrs[\"fill-opacity\"]});\n                        } else if ((o.type == \"circle\" || o.type == \"ellipse\" || Str(value).charAt() != \"r\") && addGradientFill(o, value)) {\n                            if (\"opacity\" in attrs || \"fill-opacity\" in attrs) {\n                                var gradient = R._g.doc.getElementById(node.getAttribute(\"fill\").replace(/^url\\(#|\\)$/g, E));\n                                if (gradient) {\n                                    var stops = gradient.getElementsByTagName(\"stop\");\n                                    $(stops[stops.length - 1], {\"stop-opacity\": (\"opacity\" in attrs ? attrs.opacity : 1) * (\"fill-opacity\" in attrs ? attrs[\"fill-opacity\"] : 1)});\n                                }\n                            }\n                            attrs.gradient = value;\n                            attrs.fill = \"none\";\n                            break;\n                        }\n                        clr[has](\"opacity\") && $(node, {\"fill-opacity\": clr.opacity > 1 ? clr.opacity / 100 : clr.opacity});\n                    case \"stroke\":\n                        clr = R.getRGB(value);\n                        node.setAttribute(att, clr.hex);\n                        att == \"stroke\" && clr[has](\"opacity\") && $(node, {\"stroke-opacity\": clr.opacity > 1 ? clr.opacity / 100 : clr.opacity});\n                        if (att == \"stroke\" && o._.arrows) {\n                            \"startString\" in o._.arrows && addArrow(o, o._.arrows.startString);\n                            \"endString\" in o._.arrows && addArrow(o, o._.arrows.endString, 1);\n                        }\n                        break;\n                    case \"gradient\":\n                        (o.type == \"circle\" || o.type == \"ellipse\" || Str(value).charAt() != \"r\") && addGradientFill(o, value);\n                        break;\n                    case \"opacity\":\n                        if (attrs.gradient && !attrs[has](\"stroke-opacity\")) {\n                            $(node, {\"stroke-opacity\": value > 1 ? value / 100 : value});\n                        }\n                        // fall\n                    case \"fill-opacity\":\n                        if (attrs.gradient) {\n                            gradient = R._g.doc.getElementById(node.getAttribute(\"fill\").replace(/^url\\(#|\\)$/g, E));\n                            if (gradient) {\n                                stops = gradient.getElementsByTagName(\"stop\");\n                                $(stops[stops.length - 1], {\"stop-opacity\": value});\n                            }\n                            break;\n                        }\n                    default:\n                        att == \"font-size\" && (value = toInt(value, 10) + \"px\");\n                        var cssrule = att.replace(/(\\-.)/g, function (w) {\n                            return w.substring(1).toUpperCase();\n                        });\n                        node.style[cssrule] = value;\n                        o._.dirty = 1;\n                        node.setAttribute(att, value);\n                        break;\n                }\n            }\n        }\n\n        tuneText(o, params);\n        node.style.visibility = vis;\n    },\n    leading = 1.2,\n    tuneText = function (el, params) {\n        if (el.type != \"text\" || !(params[has](\"text\") || params[has](\"font\") || params[has](\"font-size\") || params[has](\"x\") || params[has](\"y\"))) {\n            return;\n        }\n        var a = el.attrs,\n            node = el.node,\n            fontSize = node.firstChild ? toInt(R._g.doc.defaultView.getComputedStyle(node.firstChild, E).getPropertyValue(\"font-size\"), 10) : 10;\n\n        if (params[has](\"text\")) {\n            a.text = params.text;\n            while (node.firstChild) {\n                node.removeChild(node.firstChild);\n            }\n            var texts = Str(params.text).split(\"\\n\"),\n                tspans = [],\n                tspan;\n            for (var i = 0, ii = texts.length; i < ii; i++) {\n                tspan = $(\"tspan\");\n                i && $(tspan, {dy: fontSize * leading, x: a.x});\n                tspan.appendChild(R._g.doc.createTextNode(texts[i]));\n                node.appendChild(tspan);\n                tspans[i] = tspan;\n            }\n        } else {\n            tspans = node.getElementsByTagName(\"tspan\");\n            for (i = 0, ii = tspans.length; i < ii; i++) if (i) {\n                $(tspans[i], {dy: fontSize * leading, x: a.x});\n            } else {\n                $(tspans[0], {dy: 0});\n            }\n        }\n        $(node, {x: a.x, y: a.y});\n        el._.dirty = 1;\n        var bb = el._getBBox(),\n            dif = a.y - (bb.y + bb.height / 2);\n        dif && R.is(dif, \"finite\") && $(tspans[0], {dy: dif});\n    },\n    getRealNode = function (node) {\n        if (node.parentNode && node.parentNode.tagName.toLowerCase() === \"a\") {\n            return node.parentNode;\n        } else {\n            return node;\n        }\n    },\n    Element = function (node, svg) {\n        var X = 0,\n            Y = 0;\n        /*\\\n         * Element.node\n         [ property (object) ]\n         **\n         * Gives you a reference to the DOM object, so you can assign event handlers or just mess around.\n         **\n         * Note: Don\u2019t mess with it.\n         > Usage\n         | // draw a circle at coordinate 10,10 with radius of 10\n         | var c = paper.circle(10, 10, 10);\n         | c.node.onclick = function () {\n         |     c.attr(\"fill\", \"red\");\n         | };\n        \\*/\n        this[0] = this.node = node;\n        /*\\\n         * Element.raphael\n         [ property (object) ]\n         **\n         * Internal reference to @Raphael object. In case it is not available.\n         > Usage\n         | Raphael.el.red = function () {\n         |     var hsb = this.paper.raphael.rgb2hsb(this.attr(\"fill\"));\n         |     hsb.h = 1;\n         |     this.attr({fill: this.paper.raphael.hsb2rgb(hsb).hex});\n         | }\n        \\*/\n        node.raphael = true;\n        /*\\\n         * Element.id\n         [ property (number) ]\n         **\n         * Unique id of the element. Especially useful when you want to listen to events of the element,\n         * because all events are fired in format `<module>.<action>.<id>`. Also useful for @Paper.getById method.\n        \\*/\n        this.id = guid();\n        node.raphaelid = this.id;\n\n        /**\n        * Method that returns a 5 letter/digit id, enough for 36^5 = 60466176 elements\n        * @returns {string} id\n        */\n        function guid() {\n            return (\"0000\" + (Math.random()*Math.pow(36,5) << 0).toString(36)).slice(-5);\n        }\n\n        this.matrix = R.matrix();\n        this.realPath = null;\n        /*\\\n         * Element.paper\n         [ property (object) ]\n         **\n         * Internal reference to \u201Cpaper\u201D where object drawn. Mainly for use in plugins and element extensions.\n         > Usage\n         | Raphael.el.cross = function () {\n         |     this.attr({fill: \"red\"});\n         |     this.paper.path(\"M10,10L50,50M50,10L10,50\")\n         |         .attr({stroke: \"red\"});\n         | }\n        \\*/\n        this.paper = svg;\n        this.attrs = this.attrs || {};\n        this._ = {\n            transform: [],\n            sx: 1,\n            sy: 1,\n            deg: 0,\n            dx: 0,\n            dy: 0,\n            dirty: 1\n        };\n        !svg.bottom && (svg.bottom = this);\n        /*\\\n         * Element.prev\n         [ property (object) ]\n         **\n         * Reference to the previous element in the hierarchy.\n        \\*/\n        this.prev = svg.top;\n        svg.top && (svg.top.next = this);\n        svg.top = this;\n        /*\\\n         * Element.next\n         [ property (object) ]\n         **\n         * Reference to the next element in the hierarchy.\n        \\*/\n        this.next = null;\n    },\n    elproto = R.el;\n\n    Element.prototype = elproto;\n    elproto.constructor = Element;\n\n    R._engine.path = function (pathString, SVG) {\n        var el = $(\"path\");\n        SVG.canvas && SVG.canvas.appendChild(el);\n        var p = new Element(el, SVG);\n        p.type = \"path\";\n        setFillAndStroke(p, {\n            fill: \"none\",\n            stroke: \"#000\",\n            path: pathString\n        });\n        return p;\n    };\n    /*\\\n     * Element.rotate\n     [ method ]\n     **\n     * Deprecated! Use @Element.transform instead.\n     * Adds rotation by given angle around given point to the list of\n     * transformations of the element.\n     > Parameters\n     - deg (number) angle in degrees\n     - cx (number) #optional x coordinate of the centre of rotation\n     - cy (number) #optional y coordinate of the centre of rotation\n     * If cx & cy aren\u2019t specified centre of the shape is used as a point of rotation.\n     = (object) @Element\n    \\*/\n    elproto.rotate = function (deg, cx, cy) {\n        if (this.removed) {\n            return this;\n        }\n        deg = Str(deg).split(separator);\n        if (deg.length - 1) {\n            cx = toFloat(deg[1]);\n            cy = toFloat(deg[2]);\n        }\n        deg = toFloat(deg[0]);\n        (cy == null) && (cx = cy);\n        if (cx == null || cy == null) {\n            var bbox = this.getBBox(1);\n            cx = bbox.x + bbox.width / 2;\n            cy = bbox.y + bbox.height / 2;\n        }\n        this.transform(this._.transform.concat([[\"r\", deg, cx, cy]]));\n        return this;\n    };\n    /*\\\n     * Element.scale\n     [ method ]\n     **\n     * Deprecated! Use @Element.transform instead.\n     * Adds scale by given amount relative to given point to the list of\n     * transformations of the element.\n     > Parameters\n     - sx (number) horisontal scale amount\n     - sy (number) vertical scale amount\n     - cx (number) #optional x coordinate of the centre of scale\n     - cy (number) #optional y coordinate of the centre of scale\n     * If cx & cy aren\u2019t specified centre of the shape is used instead.\n     = (object) @Element\n    \\*/\n    elproto.scale = function (sx, sy, cx, cy) {\n        if (this.removed) {\n            return this;\n        }\n        sx = Str(sx).split(separator);\n        if (sx.length - 1) {\n            sy = toFloat(sx[1]);\n            cx = toFloat(sx[2]);\n            cy = toFloat(sx[3]);\n        }\n        sx = toFloat(sx[0]);\n        (sy == null) && (sy = sx);\n        (cy == null) && (cx = cy);\n        if (cx == null || cy == null) {\n            var bbox = this.getBBox(1);\n        }\n        cx = cx == null ? bbox.x + bbox.width / 2 : cx;\n        cy = cy == null ? bbox.y + bbox.height / 2 : cy;\n        this.transform(this._.transform.concat([[\"s\", sx, sy, cx, cy]]));\n        return this;\n    };\n    /*\\\n     * Element.translate\n     [ method ]\n     **\n     * Deprecated! Use @Element.transform instead.\n     * Adds translation by given amount to the list of transformations of the element.\n     > Parameters\n     - dx (number) horisontal shift\n     - dy (number) vertical shift\n     = (object) @Element\n    \\*/\n    elproto.translate = function (dx, dy) {\n        if (this.removed) {\n            return this;\n        }\n        dx = Str(dx).split(separator);\n        if (dx.length - 1) {\n            dy = toFloat(dx[1]);\n        }\n        dx = toFloat(dx[0]) || 0;\n        dy = +dy || 0;\n        this.transform(this._.transform.concat([[\"t\", dx, dy]]));\n        return this;\n    };\n    /*\\\n     * Element.transform\n     [ method ]\n     **\n     * Adds transformation to the element which is separate to other attributes,\n     * i.e. translation doesn\u2019t change `x` or `y` of the rectange. The format\n     * of transformation string is similar to the path string syntax:\n     | \"t100,100r30,100,100s2,2,100,100r45s1.5\"\n     * Each letter is a command. There are four commands: `t` is for translate, `r` is for rotate, `s` is for\n     * scale and `m` is for matrix.\n     *\n     * There are also alternative \u201Cabsolute\u201D translation, rotation and scale: `T`, `R` and `S`. They will not take previous transformation into account. For example, `...T100,0` will always move element 100 px horisontally, while `...t100,0` could move it vertically if there is `r90` before. Just compare results of `r90t100,0` and `r90T100,0`.\n     *\n     * So, the example line above could be read like \u201Ctranslate by 100, 100; rotate 30\u00B0 around 100, 100; scale twice around 100, 100;\n     * rotate 45\u00B0 around centre; scale 1.5 times relative to centre\u201D. As you can see rotate and scale commands have origin\n     * coordinates as optional parameters, the default is the centre point of the element.\n     * Matrix accepts six parameters.\n     > Usage\n     | var el = paper.rect(10, 20, 300, 200);\n     | // translate 100, 100, rotate 45\u00B0, translate -100, 0\n     | el.transform(\"t100,100r45t-100,0\");\n     | // if you want you can append or prepend transformations\n     | el.transform(\"...t50,50\");\n     | el.transform(\"s2...\");\n     | // or even wrap\n     | el.transform(\"t50,50...t-50-50\");\n     | // to reset transformation call method with empty string\n     | el.transform(\"\");\n     | // to get current value call it without parameters\n     | console.log(el.transform());\n     > Parameters\n     - tstr (string) #optional transformation string\n     * If tstr isn\u2019t specified\n     = (string) current transformation string\n     * else\n     = (object) @Element\n    \\*/\n    elproto.transform = function (tstr) {\n        var _ = this._;\n        if (tstr == null) {\n            return _.transform;\n        }\n        R._extractTransform(this, tstr);\n\n        this.clip && $(this.clip, {transform: this.matrix.invert()});\n        this.pattern && updatePosition(this);\n        this.node && $(this.node, {transform: this.matrix});\n\n        if (_.sx != 1 || _.sy != 1) {\n            var sw = this.attrs[has](\"stroke-width\") ? this.attrs[\"stroke-width\"] : 1;\n            this.attr({\"stroke-width\": sw});\n        }\n\n        return this;\n    };\n    /*\\\n     * Element.hide\n     [ method ]\n     **\n     * Makes element invisible. See @Element.show.\n     = (object) @Element\n    \\*/\n    elproto.hide = function () {\n        if(!this.removed) this.node.style.display = \"none\";\n        return this;\n    };\n    /*\\\n     * Element.show\n     [ method ]\n     **\n     * Makes element visible. See @Element.hide.\n     = (object) @Element\n    \\*/\n    elproto.show = function () {\n        if(!this.removed) this.node.style.display = \"\";\n        return this;\n    };\n    /*\\\n     * Element.remove\n     [ method ]\n     **\n     * Removes element from the paper.\n    \\*/\n    elproto.remove = function () {\n        var node = getRealNode(this.node);\n        if (this.removed || !node.parentNode) {\n            return;\n        }\n        var paper = this.paper;\n        paper.__set__ && paper.__set__.exclude(this);\n        eve.unbind(\"raphael.*.*.\" + this.id);\n        if (this.gradient) {\n            paper.defs.removeChild(this.gradient);\n        }\n        R._tear(this, paper);\n\n        node.parentNode.removeChild(node);\n\n        // Remove custom data for element\n        this.removeData();\n\n        for (var i in this) {\n            this[i] = typeof this[i] == \"function\" ? R._removedFactory(i) : null;\n        }\n        this.removed = true;\n    };\n    elproto._getBBox = function () {\n        if (this.node.style.display == \"none\") {\n            this.show();\n            var hide = true;\n        }\n        var canvasHidden = false,\n            containerStyle;\n        if (this.paper.canvas.parentElement) {\n          containerStyle = this.paper.canvas.parentElement.style;\n        } //IE10+ can't find parentElement\n        else if (this.paper.canvas.parentNode) {\n          containerStyle = this.paper.canvas.parentNode.style;\n        }\n\n        if(containerStyle && containerStyle.display == \"none\") {\n          canvasHidden = true;\n          containerStyle.display = \"\";\n        }\n        var bbox = {};\n        try {\n            bbox = this.node.getBBox();\n        } catch(e) {\n            // Firefox 3.0.x, 25.0.1 (probably more versions affected) play badly here - possible fix\n            bbox = {\n                x: this.node.clientLeft,\n                y: this.node.clientTop,\n                width: this.node.clientWidth,\n                height: this.node.clientHeight\n            }\n        } finally {\n            bbox = bbox || {};\n            if(canvasHidden){\n              containerStyle.display = \"none\";\n            }\n        }\n        hide && this.hide();\n        return bbox;\n    };\n    /*\\\n     * Element.attr\n     [ method ]\n     **\n     * Sets the attributes of the element.\n     > Parameters\n     - attrName (string) attribute\u2019s name\n     - value (string) value\n     * or\n     - params (object) object of name/value pairs\n     * or\n     - attrName (string) attribute\u2019s name\n     * or\n     - attrNames (array) in this case method returns array of current values for given attribute names\n     = (object) @Element if attrsName & value or params are passed in.\n     = (...) value of the attribute if only attrsName is passed in.\n     = (array) array of values of the attribute if attrsNames is passed in.\n     = (object) object of attributes if nothing is passed in.\n     > Possible parameters\n     # <p>Please refer to the <a href=\"http://www.w3.org/TR/SVG/\" title=\"The W3C Recommendation for the SVG language describes these properties in detail.\">SVG specification</a> for an explanation of these parameters.</p>\n     o arrow-end (string) arrowhead on the end of the path. The format for string is `<type>[-<width>[-<length>]]`. Possible types: `classic`, `block`, `open`, `oval`, `diamond`, `none`, width: `wide`, `narrow`, `medium`, length: `long`, `short`, `midium`.\n     o clip-rect (string) comma or space separated values: x, y, width and height\n     o cursor (string) CSS type of the cursor\n     o cx (number) the x-axis coordinate of the center of the circle, or ellipse\n     o cy (number) the y-axis coordinate of the center of the circle, or ellipse\n     o fill (string) colour, gradient or image\n     o fill-opacity (number)\n     o font (string)\n     o font-family (string)\n     o font-size (number) font size in pixels\n     o font-weight (string)\n     o height (number)\n     o href (string) URL, if specified element behaves as hyperlink\n     o opacity (number)\n     o path (string) SVG path string format\n     o r (number) radius of the circle, ellipse or rounded corner on the rect\n     o rx (number) horisontal radius of the ellipse\n     o ry (number) vertical radius of the ellipse\n     o src (string) image URL, only works for @Element.image element\n     o stroke (string) stroke colour\n     o stroke-dasharray (string) [\u201C\u201D, \u201Cnone\u201D, \u201C`-`\u201D, \u201C`.`\u201D, \u201C`-.`\u201D, \u201C`-..`\u201D, \u201C`. `\u201D, \u201C`- `\u201D, \u201C`--`\u201D, \u201C`- .`\u201D, \u201C`--.`\u201D, \u201C`--..`\u201D]\n     o stroke-linecap (string) [\u201C`butt`\u201D, \u201C`square`\u201D, \u201C`round`\u201D]\n     o stroke-linejoin (string) [\u201C`bevel`\u201D, \u201C`round`\u201D, \u201C`miter`\u201D]\n     o stroke-miterlimit (number)\n     o stroke-opacity (number)\n     o stroke-width (number) stroke width in pixels, default is '1'\n     o target (string) used with href\n     o text (string) contents of the text element. Use `\\n` for multiline text\n     o text-anchor (string) [\u201C`start`\u201D, \u201C`middle`\u201D, \u201C`end`\u201D], default is \u201C`middle`\u201D\n     o title (string) will create tooltip with a given text\n     o transform (string) see @Element.transform\n     o width (number)\n     o x (number)\n     o y (number)\n     > Gradients\n     * Linear gradient format: \u201C`\u2039angle\u203A-\u2039colour\u203A[-\u2039colour\u203A[:\u2039offset\u203A]]*-\u2039colour\u203A`\u201D, example: \u201C`90-#fff-#000`\u201D \u2013 90\u00B0\n     * gradient from white to black or \u201C`0-#fff-#f00:20-#000`\u201D \u2013 0\u00B0 gradient from white via red (at 20%) to black.\n     *\n     * radial gradient: \u201C`r[(\u2039fx\u203A, \u2039fy\u203A)]\u2039colour\u203A[-\u2039colour\u203A[:\u2039offset\u203A]]*-\u2039colour\u203A`\u201D, example: \u201C`r#fff-#000`\u201D \u2013\n     * gradient from white to black or \u201C`r(0.25, 0.75)#fff-#000`\u201D \u2013 gradient from white to black with focus point\n     * at 0.25, 0.75. Focus point coordinates are in 0..1 range. Radial gradients can only be applied to circles and ellipses.\n     > Path String\n     # <p>Please refer to <a href=\"http://www.w3.org/TR/SVG/paths.html#PathData\" title=\"Details of a path\u2019s data attribute\u2019s format are described in the SVG specification.\">SVG documentation regarding path string</a>. Rapha\u00EBl fully supports it.</p>\n     > Colour Parsing\n     # <ul>\n     #     <li>Colour name (\u201C<code>red</code>\u201D, \u201C<code>green</code>\u201D, \u201C<code>cornflowerblue</code>\u201D, etc)</li>\n     #     <li>#\u2022\u2022\u2022 \u2014 shortened HTML colour: (\u201C<code>#000</code>\u201D, \u201C<code>#fc0</code>\u201D, etc)</li>\n     #     <li>#\u2022\u2022\u2022\u2022\u2022\u2022 \u2014 full length HTML colour: (\u201C<code>#000000</code>\u201D, \u201C<code>#bd2300</code>\u201D)</li>\n     #     <li>rgb(\u2022\u2022\u2022, \u2022\u2022\u2022, \u2022\u2022\u2022) \u2014 red, green and blue channels\u2019 values: (\u201C<code>rgb(200,&nbsp;100,&nbsp;0)</code>\u201D)</li>\n     #     <li>rgb(\u2022\u2022\u2022%, \u2022\u2022\u2022%, \u2022\u2022\u2022%) \u2014 same as above, but in %: (\u201C<code>rgb(100%,&nbsp;175%,&nbsp;0%)</code>\u201D)</li>\n     #     <li>rgba(\u2022\u2022\u2022, \u2022\u2022\u2022, \u2022\u2022\u2022, \u2022\u2022\u2022) \u2014 red, green and blue channels\u2019 values: (\u201C<code>rgba(200,&nbsp;100,&nbsp;0, .5)</code>\u201D)</li>\n     #     <li>rgba(\u2022\u2022\u2022%, \u2022\u2022\u2022%, \u2022\u2022\u2022%, \u2022\u2022\u2022%) \u2014 same as above, but in %: (\u201C<code>rgba(100%,&nbsp;175%,&nbsp;0%, 50%)</code>\u201D)</li>\n     #     <li>hsb(\u2022\u2022\u2022, \u2022\u2022\u2022, \u2022\u2022\u2022) \u2014 hue, saturation and brightness values: (\u201C<code>hsb(0.5,&nbsp;0.25,&nbsp;1)</code>\u201D)</li>\n     #     <li>hsb(\u2022\u2022\u2022%, \u2022\u2022\u2022%, \u2022\u2022\u2022%) \u2014 same as above, but in %</li>\n     #     <li>hsba(\u2022\u2022\u2022, \u2022\u2022\u2022, \u2022\u2022\u2022, \u2022\u2022\u2022) \u2014 same as above, but with opacity</li>\n     #     <li>hsl(\u2022\u2022\u2022, \u2022\u2022\u2022, \u2022\u2022\u2022) \u2014 almost the same as hsb, see <a href=\"http://en.wikipedia.org/wiki/HSL_and_HSV\" title=\"HSL and HSV - Wikipedia, the free encyclopedia\">Wikipedia page</a></li>\n     #     <li>hsl(\u2022\u2022\u2022%, \u2022\u2022\u2022%, \u2022\u2022\u2022%) \u2014 same as above, but in %</li>\n     #     <li>hsla(\u2022\u2022\u2022, \u2022\u2022\u2022, \u2022\u2022\u2022, \u2022\u2022\u2022) \u2014 same as above, but with opacity</li>\n     #     <li>Optionally for hsb and hsl you could specify hue as a degree: \u201C<code>hsl(240deg,&nbsp;1,&nbsp;.5)</code>\u201D or, if you want to go fancy, \u201C<code>hsl(240\u00B0,&nbsp;1,&nbsp;.5)</code>\u201D</li>\n     # </ul>\n    \\*/\n    elproto.attr = function (name, value) {\n        if (this.removed) {\n            return this;\n        }\n        if (name == null) {\n            var res = {};\n            for (var a in this.attrs) if (this.attrs[has](a)) {\n                res[a] = this.attrs[a];\n            }\n            res.gradient && res.fill == \"none\" && (res.fill = res.gradient) && delete res.gradient;\n            res.transform = this._.transform;\n            return res;\n        }\n        if (value == null && R.is(name, \"string\")) {\n            if (name == \"fill\" && this.attrs.fill == \"none\" && this.attrs.gradient) {\n                return this.attrs.gradient;\n            }\n            if (name == \"transform\") {\n                return this._.transform;\n            }\n            var names = name.split(separator),\n                out = {};\n            for (var i = 0, ii = names.length; i < ii; i++) {\n                name = names[i];\n                if (name in this.attrs) {\n                    out[name] = this.attrs[name];\n                } else if (R.is(this.paper.customAttributes[name], \"function\")) {\n                    out[name] = this.paper.customAttributes[name].def;\n                } else {\n                    out[name] = R._availableAttrs[name];\n                }\n            }\n            return ii - 1 ? out : out[names[0]];\n        }\n        if (value == null && R.is(name, \"array\")) {\n            out = {};\n            for (i = 0, ii = name.length; i < ii; i++) {\n                out[name[i]] = this.attr(name[i]);\n            }\n            return out;\n        }\n        if (value != null) {\n            var params = {};\n            params[name] = value;\n        } else if (name != null && R.is(name, \"object\")) {\n            params = name;\n        }\n        for (var key in params) {\n            eve(\"raphael.attr.\" + key + \".\" + this.id, this, params[key]);\n        }\n        for (key in this.paper.customAttributes) if (this.paper.customAttributes[has](key) && params[has](key) && R.is(this.paper.customAttributes[key], \"function\")) {\n            var par = this.paper.customAttributes[key].apply(this, [].concat(params[key]));\n            this.attrs[key] = params[key];\n            for (var subkey in par) if (par[has](subkey)) {\n                params[subkey] = par[subkey];\n            }\n        }\n        setFillAndStroke(this, params);\n        return this;\n    };\n    /*\\\n     * Element.toFront\n     [ method ]\n     **\n     * Moves the element so it is the closest to the viewer\u2019s eyes, on top of other elements.\n     = (object) @Element\n    \\*/\n    elproto.toFront = function () {\n        if (this.removed) {\n            return this;\n        }\n        var node = getRealNode(this.node);\n        node.parentNode.appendChild(node);\n        var svg = this.paper;\n        svg.top != this && R._tofront(this, svg);\n        return this;\n    };\n    /*\\\n     * Element.toBack\n     [ method ]\n     **\n     * Moves the element so it is the furthest from the viewer\u2019s eyes, behind other elements.\n     = (object) @Element\n    \\*/\n    elproto.toBack = function () {\n        if (this.removed) {\n            return this;\n        }\n        var node = getRealNode(this.node);\n        var parentNode = node.parentNode;\n        parentNode.insertBefore(node, parentNode.firstChild);\n        R._toback(this, this.paper);\n        var svg = this.paper;\n        return this;\n    };\n    /*\\\n     * Element.insertAfter\n     [ method ]\n     **\n     * Inserts current object after the given one.\n     = (object) @Element\n    \\*/\n    elproto.insertAfter = function (element) {\n        if (this.removed || !element) {\n            return this;\n        }\n\n        var node = getRealNode(this.node);\n        var afterNode = getRealNode(element.node || element[element.length - 1].node);\n        if (afterNode.nextSibling) {\n            afterNode.parentNode.insertBefore(node, afterNode.nextSibling);\n        } else {\n            afterNode.parentNode.appendChild(node);\n        }\n        R._insertafter(this, element, this.paper);\n        return this;\n    };\n    /*\\\n     * Element.insertBefore\n     [ method ]\n     **\n     * Inserts current object before the given one.\n     = (object) @Element\n    \\*/\n    elproto.insertBefore = function (element) {\n        if (this.removed || !element) {\n            return this;\n        }\n\n        var node = getRealNode(this.node);\n        var beforeNode = getRealNode(element.node || element[0].node);\n        beforeNode.parentNode.insertBefore(node, beforeNode);\n        R._insertbefore(this, element, this.paper);\n        return this;\n    };\n    elproto.blur = function (size) {\n        // Experimental. No Safari support. Use it on your own risk.\n        var t = this;\n        if (+size !== 0) {\n            var fltr = $(\"filter\"),\n                blur = $(\"feGaussianBlur\");\n            t.attrs.blur = size;\n            fltr.id = R.createUUID();\n            $(blur, {stdDeviation: +size || 1.5});\n            fltr.appendChild(blur);\n            t.paper.defs.appendChild(fltr);\n            t._blur = fltr;\n            $(t.node, {filter: \"url(#\" + fltr.id + \")\"});\n        } else {\n            if (t._blur) {\n                t._blur.parentNode.removeChild(t._blur);\n                delete t._blur;\n                delete t.attrs.blur;\n            }\n            t.node.removeAttribute(\"filter\");\n        }\n        return t;\n    };\n    R._engine.circle = function (svg, x, y, r) {\n        var el = $(\"circle\");\n        svg.canvas && svg.canvas.appendChild(el);\n        var res = new Element(el, svg);\n        res.attrs = {cx: x, cy: y, r: r, fill: \"none\", stroke: \"#000\"};\n        res.type = \"circle\";\n        $(el, res.attrs);\n        return res;\n    };\n    R._engine.rect = function (svg, x, y, w, h, r) {\n        var el = $(\"rect\");\n        svg.canvas && svg.canvas.appendChild(el);\n        var res = new Element(el, svg);\n        res.attrs = {x: x, y: y, width: w, height: h, rx: r || 0, ry: r || 0, fill: \"none\", stroke: \"#000\"};\n        res.type = \"rect\";\n        $(el, res.attrs);\n        return res;\n    };\n    R._engine.ellipse = function (svg, x, y, rx, ry) {\n        var el = $(\"ellipse\");\n        svg.canvas && svg.canvas.appendChild(el);\n        var res = new Element(el, svg);\n        res.attrs = {cx: x, cy: y, rx: rx, ry: ry, fill: \"none\", stroke: \"#000\"};\n        res.type = \"ellipse\";\n        $(el, res.attrs);\n        return res;\n    };\n    R._engine.image = function (svg, src, x, y, w, h) {\n        var el = $(\"image\");\n        $(el, {x: x, y: y, width: w, height: h, preserveAspectRatio: \"none\"});\n        el.setAttributeNS(xlink, \"href\", src);\n        svg.canvas && svg.canvas.appendChild(el);\n        var res = new Element(el, svg);\n        res.attrs = {x: x, y: y, width: w, height: h, src: src};\n        res.type = \"image\";\n        return res;\n    };\n    R._engine.text = function (svg, x, y, text) {\n        var el = $(\"text\");\n        svg.canvas && svg.canvas.appendChild(el);\n        var res = new Element(el, svg);\n        res.attrs = {\n            x: x,\n            y: y,\n            \"text-anchor\": \"middle\",\n            text: text,\n            \"font-family\": R._availableAttrs[\"font-family\"],\n            \"font-size\": R._availableAttrs[\"font-size\"],\n            stroke: \"none\",\n            fill: \"#000\"\n        };\n        res.type = \"text\";\n        setFillAndStroke(res, res.attrs);\n        return res;\n    };\n    R._engine.setSize = function (width, height) {\n        this.width = width || this.width;\n        this.height = height || this.height;\n        this.canvas.setAttribute(\"width\", this.width);\n        this.canvas.setAttribute(\"height\", this.height);\n        if (this._viewBox) {\n            this.setViewBox.apply(this, this._viewBox);\n        }\n        return this;\n    };\n    R._engine.create = function () {\n        var con = R._getContainer.apply(0, arguments),\n            container = con && con.container;\n        if (!container) {\n            throw new Error(\"SVG container not found.\");\n        }\n        var x = con.x,\n            y = con.y,\n            width = con.width,\n            height = con.height,\n            cnvs = $(\"svg\"),\n            css = \"overflow:hidden;\",\n            isFloating;\n        x = x || 0;\n        y = y || 0;\n        width = width || 512;\n        height = height || 342;\n        $(cnvs, {\n            height: height,\n            version: 1.1,\n            width: width,\n            xmlns: \"http://www.w3.org/2000/svg\",\n            \"xmlns:xlink\": \"http://www.w3.org/1999/xlink\"\n        });\n        if (container == 1) {\n            cnvs.style.cssText = css + \"position:absolute;left:\" + x + \"px;top:\" + y + \"px\";\n            R._g.doc.body.appendChild(cnvs);\n            isFloating = 1;\n        } else {\n            cnvs.style.cssText = css + \"position:relative\";\n            if (container.firstChild) {\n                container.insertBefore(cnvs, container.firstChild);\n            } else {\n                container.appendChild(cnvs);\n            }\n        }\n        container = new R._Paper;\n        container.width = width;\n        container.height = height;\n        container.canvas = cnvs;\n        container.clear();\n        container._left = container._top = 0;\n        isFloating && (container.renderfix = function () {});\n        container.renderfix();\n        return container;\n    };\n    R._engine.setViewBox = function (x, y, w, h, fit) {\n        eve(\"raphael.setViewBox\", this, this._viewBox, [x, y, w, h, fit]);\n        var paperSize = this.getSize(),\n            size = mmax(w / paperSize.width, h / paperSize.height),\n            top = this.top,\n            aspectRatio = fit ? \"xMidYMid meet\" : \"xMinYMin\",\n            vb,\n            sw;\n        if (x == null) {\n            if (this._vbSize) {\n                size = 1;\n            }\n            delete this._vbSize;\n            vb = \"0 0 \" + this.width + S + this.height;\n        } else {\n            this._vbSize = size;\n            vb = x + S + y + S + w + S + h;\n        }\n        $(this.canvas, {\n            viewBox: vb,\n            preserveAspectRatio: aspectRatio\n        });\n        while (size && top) {\n            sw = \"stroke-width\" in top.attrs ? top.attrs[\"stroke-width\"] : 1;\n            top.attr({\"stroke-width\": sw});\n            top._.dirty = 1;\n            top._.dirtyT = 1;\n            top = top.prev;\n        }\n        this._viewBox = [x, y, w, h, !!fit];\n        return this;\n    };\n    /*\\\n     * Paper.renderfix\n     [ method ]\n     **\n     * Fixes the issue of Firefox and IE9 regarding subpixel rendering. If paper is dependent\n     * on other elements after reflow it could shift half pixel which cause for lines to lost their crispness.\n     * This method fixes the issue.\n     **\n       Special thanks to Mariusz Nowak (http://www.medikoo.com/) for this method.\n    \\*/\n    R.prototype.renderfix = function () {\n        var cnvs = this.canvas,\n            s = cnvs.style,\n            pos;\n        try {\n            pos = cnvs.getScreenCTM() || cnvs.createSVGMatrix();\n        } catch (e) {\n            pos = cnvs.createSVGMatrix();\n        }\n        var left = -pos.e % 1,\n            top = -pos.f % 1;\n        if (left || top) {\n            if (left) {\n                this._left = (this._left + left) % 1;\n                s.left = this._left + \"px\";\n            }\n            if (top) {\n                this._top = (this._top + top) % 1;\n                s.top = this._top + \"px\";\n            }\n        }\n    };\n    /*\\\n     * Paper.clear\n     [ method ]\n     **\n     * Clears the paper, i.e. removes all the elements.\n    \\*/\n    R.prototype.clear = function () {\n        R.eve(\"raphael.clear\", this);\n        var c = this.canvas;\n        while (c.firstChild) {\n            c.removeChild(c.firstChild);\n        }\n        this.bottom = this.top = null;\n        (this.desc = $(\"desc\")).appendChild(R._g.doc.createTextNode(\"Created with Rapha\\xebl \" + R.version));\n        c.appendChild(this.desc);\n        c.appendChild(this.defs = $(\"defs\"));\n    };\n    /*\\\n     * Paper.remove\n     [ method ]\n     **\n     * Removes the paper from the DOM.\n    \\*/\n    R.prototype.remove = function () {\n        eve(\"raphael.remove\", this);\n        this.canvas.parentNode && this.canvas.parentNode.removeChild(this.canvas);\n        for (var i in this) {\n            this[i] = typeof this[i] == \"function\" ? R._removedFactory(i) : null;\n        }\n    };\n    var setproto = R.st;\n    for (var method in elproto) if (elproto[has](method) && !setproto[has](method)) {\n        setproto[method] = (function (methodname) {\n            return function () {\n                var arg = arguments;\n                return this.forEach(function (el) {\n                    el[methodname].apply(el, arg);\n                });\n            };\n        })(method);\n    }\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\n\n/***/ }),\n\n/***/ \"./dev/raphael.vml.js\":\n/*!****************************!*\\\n  !*** ./dev/raphael.vml.js ***!\n  \\****************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! ./raphael.core */ \"./dev/raphael.core.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function(R) {\n    if (R && !R.vml) {\n        return;\n    }\n\n    var has = \"hasOwnProperty\",\n        Str = String,\n        toFloat = parseFloat,\n        math = Math,\n        round = math.round,\n        mmax = math.max,\n        mmin = math.min,\n        abs = math.abs,\n        fillString = \"fill\",\n        separator = /[, ]+/,\n        eve = R.eve,\n        ms = \" progid:DXImageTransform.Microsoft\",\n        S = \" \",\n        E = \"\",\n        map = {M: \"m\", L: \"l\", C: \"c\", Z: \"x\", m: \"t\", l: \"r\", c: \"v\", z: \"x\"},\n        bites = /([clmz]),?([^clmz]*)/gi,\n        blurregexp = / progid:\\S+Blur\\([^\\)]+\\)/g,\n        val = /-?[^,\\s-]+/g,\n        cssDot = \"position:absolute;left:0;top:0;width:1px;height:1px;behavior:url(#default#VML)\",\n        zoom = 21600,\n        pathTypes = {path: 1, rect: 1, image: 1},\n        ovalTypes = {circle: 1, ellipse: 1},\n        path2vml = function (path) {\n            var total =  /[ahqstv]/ig,\n                command = R._pathToAbsolute;\n            Str(path).match(total) && (command = R._path2curve);\n            total = /[clmz]/g;\n            if (command == R._pathToAbsolute && !Str(path).match(total)) {\n                var res = Str(path).replace(bites, function (all, command, args) {\n                    var vals = [],\n                        isMove = command.toLowerCase() == \"m\",\n                        res = map[command];\n                    args.replace(val, function (value) {\n                        if (isMove && vals.length == 2) {\n                            res += vals + map[command == \"m\" ? \"l\" : \"L\"];\n                            vals = [];\n                        }\n                        vals.push(round(value * zoom));\n                    });\n                    return res + vals;\n                });\n                return res;\n            }\n            var pa = command(path), p, r;\n            res = [];\n            for (var i = 0, ii = pa.length; i < ii; i++) {\n                p = pa[i];\n                r = pa[i][0].toLowerCase();\n                r == \"z\" && (r = \"x\");\n                for (var j = 1, jj = p.length; j < jj; j++) {\n                    r += round(p[j] * zoom) + (j != jj - 1 ? \",\" : E);\n                }\n                res.push(r);\n            }\n            return res.join(S);\n        },\n        compensation = function (deg, dx, dy) {\n            var m = R.matrix();\n            m.rotate(-deg, .5, .5);\n            return {\n                dx: m.x(dx, dy),\n                dy: m.y(dx, dy)\n            };\n        },\n        setCoords = function (p, sx, sy, dx, dy, deg) {\n            var _ = p._,\n                m = p.matrix,\n                fillpos = _.fillpos,\n                o = p.node,\n                s = o.style,\n                y = 1,\n                flip = \"\",\n                dxdy,\n                kx = zoom / sx,\n                ky = zoom / sy;\n            s.visibility = \"hidden\";\n            if (!sx || !sy) {\n                return;\n            }\n            o.coordsize = abs(kx) + S + abs(ky);\n            s.rotation = deg * (sx * sy < 0 ? -1 : 1);\n            if (deg) {\n                var c = compensation(deg, dx, dy);\n                dx = c.dx;\n                dy = c.dy;\n            }\n            sx < 0 && (flip += \"x\");\n            sy < 0 && (flip += \" y\") && (y = -1);\n            s.flip = flip;\n            o.coordorigin = (dx * -kx) + S + (dy * -ky);\n            if (fillpos || _.fillsize) {\n                var fill = o.getElementsByTagName(fillString);\n                fill = fill && fill[0];\n                o.removeChild(fill);\n                if (fillpos) {\n                    c = compensation(deg, m.x(fillpos[0], fillpos[1]), m.y(fillpos[0], fillpos[1]));\n                    fill.position = c.dx * y + S + c.dy * y;\n                }\n                if (_.fillsize) {\n                    fill.size = _.fillsize[0] * abs(sx) + S + _.fillsize[1] * abs(sy);\n                }\n                o.appendChild(fill);\n            }\n            s.visibility = \"visible\";\n        };\n    R.toString = function () {\n        return  \"Your browser doesn\\u2019t support SVG. Falling down to VML.\\nYou are running Rapha\\xebl \" + this.version;\n    };\n    var addArrow = function (o, value, isEnd) {\n        var values = Str(value).toLowerCase().split(\"-\"),\n            se = isEnd ? \"end\" : \"start\",\n            i = values.length,\n            type = \"classic\",\n            w = \"medium\",\n            h = \"medium\";\n        while (i--) {\n            switch (values[i]) {\n                case \"block\":\n                case \"classic\":\n                case \"oval\":\n                case \"diamond\":\n                case \"open\":\n                case \"none\":\n                    type = values[i];\n                    break;\n                case \"wide\":\n                case \"narrow\": h = values[i]; break;\n                case \"long\":\n                case \"short\": w = values[i]; break;\n            }\n        }\n        var stroke = o.node.getElementsByTagName(\"stroke\")[0];\n        stroke[se + \"arrow\"] = type;\n        stroke[se + \"arrowlength\"] = w;\n        stroke[se + \"arrowwidth\"] = h;\n    },\n    setFillAndStroke = function (o, params) {\n        // o.paper.canvas.style.display = \"none\";\n        o.attrs = o.attrs || {};\n        var node = o.node,\n            a = o.attrs,\n            s = node.style,\n            xy,\n            newpath = pathTypes[o.type] && (params.x != a.x || params.y != a.y || params.width != a.width || params.height != a.height || params.cx != a.cx || params.cy != a.cy || params.rx != a.rx || params.ry != a.ry || params.r != a.r),\n            isOval = ovalTypes[o.type] && (a.cx != params.cx || a.cy != params.cy || a.r != params.r || a.rx != params.rx || a.ry != params.ry),\n            res = o;\n\n\n        for (var par in params) if (params[has](par)) {\n            a[par] = params[par];\n        }\n        if (newpath) {\n            a.path = R._getPath[o.type](o);\n            o._.dirty = 1;\n        }\n        params.href && (node.href = params.href);\n        params.title && (node.title = params.title);\n        params.target && (node.target = params.target);\n        params.cursor && (s.cursor = params.cursor);\n        \"blur\" in params && o.blur(params.blur);\n        if (params.path && o.type == \"path\" || newpath) {\n            node.path = path2vml(~Str(a.path).toLowerCase().indexOf(\"r\") ? R._pathToAbsolute(a.path) : a.path);\n            o._.dirty = 1;\n            if (o.type == \"image\") {\n                o._.fillpos = [a.x, a.y];\n                o._.fillsize = [a.width, a.height];\n                setCoords(o, 1, 1, 0, 0, 0);\n            }\n        }\n        \"transform\" in params && o.transform(params.transform);\n        if (isOval) {\n            var cx = +a.cx,\n                cy = +a.cy,\n                rx = +a.rx || +a.r || 0,\n                ry = +a.ry || +a.r || 0;\n            node.path = R.format(\"ar{0},{1},{2},{3},{4},{1},{4},{1}x\", round((cx - rx) * zoom), round((cy - ry) * zoom), round((cx + rx) * zoom), round((cy + ry) * zoom), round(cx * zoom));\n            o._.dirty = 1;\n        }\n        if (\"clip-rect\" in params) {\n            var rect = Str(params[\"clip-rect\"]).split(separator);\n            if (rect.length == 4) {\n                rect[2] = +rect[2] + (+rect[0]);\n                rect[3] = +rect[3] + (+rect[1]);\n                var div = node.clipRect || R._g.doc.createElement(\"div\"),\n                    dstyle = div.style;\n                dstyle.clip = R.format(\"rect({1}px {2}px {3}px {0}px)\", rect);\n                if (!node.clipRect) {\n                    dstyle.position = \"absolute\";\n                    dstyle.top = 0;\n                    dstyle.left = 0;\n                    dstyle.width = o.paper.width + \"px\";\n                    dstyle.height = o.paper.height + \"px\";\n                    node.parentNode.insertBefore(div, node);\n                    div.appendChild(node);\n                    node.clipRect = div;\n                }\n            }\n            if (!params[\"clip-rect\"]) {\n                node.clipRect && (node.clipRect.style.clip = \"auto\");\n            }\n        }\n        if (o.textpath) {\n            var textpathStyle = o.textpath.style;\n            params.font && (textpathStyle.font = params.font);\n            params[\"font-family\"] && (textpathStyle.fontFamily = '\"' + params[\"font-family\"].split(\",\")[0].replace(/^['\"]+|['\"]+$/g, E) + '\"');\n            params[\"font-size\"] && (textpathStyle.fontSize = params[\"font-size\"]);\n            params[\"font-weight\"] && (textpathStyle.fontWeight = params[\"font-weight\"]);\n            params[\"font-style\"] && (textpathStyle.fontStyle = params[\"font-style\"]);\n        }\n        if (\"arrow-start\" in params) {\n            addArrow(res, params[\"arrow-start\"]);\n        }\n        if (\"arrow-end\" in params) {\n            addArrow(res, params[\"arrow-end\"], 1);\n        }\n        if (params.opacity != null ||\n            params.fill != null ||\n            params.src != null ||\n            params.stroke != null ||\n            params[\"stroke-width\"] != null ||\n            params[\"stroke-opacity\"] != null ||\n            params[\"fill-opacity\"] != null ||\n            params[\"stroke-dasharray\"] != null ||\n            params[\"stroke-miterlimit\"] != null ||\n            params[\"stroke-linejoin\"] != null ||\n            params[\"stroke-linecap\"] != null) {\n            var fill = node.getElementsByTagName(fillString),\n                newfill = false;\n            fill = fill && fill[0];\n            !fill && (newfill = fill = createNode(fillString));\n            if (o.type == \"image\" && params.src) {\n                fill.src = params.src;\n            }\n            params.fill && (fill.on = true);\n            if (fill.on == null || params.fill == \"none\" || params.fill === null) {\n                fill.on = false;\n            }\n            if (fill.on && params.fill) {\n                var isURL = Str(params.fill).match(R._ISURL);\n                if (isURL) {\n                    fill.parentNode == node && node.removeChild(fill);\n                    fill.rotate = true;\n                    fill.src = isURL[1];\n                    fill.type = \"tile\";\n                    var bbox = o.getBBox(1);\n                    fill.position = bbox.x + S + bbox.y;\n                    o._.fillpos = [bbox.x, bbox.y];\n\n                    R._preload(isURL[1], function () {\n                        o._.fillsize = [this.offsetWidth, this.offsetHeight];\n                    });\n                } else {\n                    fill.color = R.getRGB(params.fill).hex;\n                    fill.src = E;\n                    fill.type = \"solid\";\n                    if (R.getRGB(params.fill).error && (res.type in {circle: 1, ellipse: 1} || Str(params.fill).charAt() != \"r\") && addGradientFill(res, params.fill, fill)) {\n                        a.fill = \"none\";\n                        a.gradient = params.fill;\n                        fill.rotate = false;\n                    }\n                }\n            }\n            if (\"fill-opacity\" in params || \"opacity\" in params) {\n                var opacity = ((+a[\"fill-opacity\"] + 1 || 2) - 1) * ((+a.opacity + 1 || 2) - 1) * ((+R.getRGB(params.fill).o + 1 || 2) - 1);\n                opacity = mmin(mmax(opacity, 0), 1);\n                fill.opacity = opacity;\n                if (fill.src) {\n                    fill.color = \"none\";\n                }\n            }\n            node.appendChild(fill);\n            var stroke = (node.getElementsByTagName(\"stroke\") && node.getElementsByTagName(\"stroke\")[0]),\n            newstroke = false;\n            !stroke && (newstroke = stroke = createNode(\"stroke\"));\n            if ((params.stroke && params.stroke != \"none\") ||\n                params[\"stroke-width\"] ||\n                params[\"stroke-opacity\"] != null ||\n                params[\"stroke-dasharray\"] ||\n                params[\"stroke-miterlimit\"] ||\n                params[\"stroke-linejoin\"] ||\n                params[\"stroke-linecap\"]) {\n                stroke.on = true;\n            }\n            (params.stroke == \"none\" || params.stroke === null || stroke.on == null || params.stroke == 0 || params[\"stroke-width\"] == 0) && (stroke.on = false);\n            var strokeColor = R.getRGB(params.stroke);\n            stroke.on && params.stroke && (stroke.color = strokeColor.hex);\n            opacity = ((+a[\"stroke-opacity\"] + 1 || 2) - 1) * ((+a.opacity + 1 || 2) - 1) * ((+strokeColor.o + 1 || 2) - 1);\n            var width = (toFloat(params[\"stroke-width\"]) || 1) * .75;\n            opacity = mmin(mmax(opacity, 0), 1);\n            params[\"stroke-width\"] == null && (width = a[\"stroke-width\"]);\n            params[\"stroke-width\"] && (stroke.weight = width);\n            width && width < 1 && (opacity *= width) && (stroke.weight = 1);\n            stroke.opacity = opacity;\n\n            params[\"stroke-linejoin\"] && (stroke.joinstyle = params[\"stroke-linejoin\"] || \"miter\");\n            stroke.miterlimit = params[\"stroke-miterlimit\"] || 8;\n            params[\"stroke-linecap\"] && (stroke.endcap = params[\"stroke-linecap\"] == \"butt\" ? \"flat\" : params[\"stroke-linecap\"] == \"square\" ? \"square\" : \"round\");\n            if (\"stroke-dasharray\" in params) {\n                var dasharray = {\n                    \"-\": \"shortdash\",\n                    \".\": \"shortdot\",\n                    \"-.\": \"shortdashdot\",\n                    \"-..\": \"shortdashdotdot\",\n                    \". \": \"dot\",\n                    \"- \": \"dash\",\n                    \"--\": \"longdash\",\n                    \"- .\": \"dashdot\",\n                    \"--.\": \"longdashdot\",\n                    \"--..\": \"longdashdotdot\"\n                };\n                stroke.dashstyle = dasharray[has](params[\"stroke-dasharray\"]) ? dasharray[params[\"stroke-dasharray\"]] : E;\n            }\n            newstroke && node.appendChild(stroke);\n        }\n        if (res.type == \"text\") {\n            res.paper.canvas.style.display = E;\n            var span = res.paper.span,\n                m = 100,\n                fontSize = a.font && a.font.match(/\\d+(?:\\.\\d*)?(?=px)/);\n            s = span.style;\n            a.font && (s.font = a.font);\n            a[\"font-family\"] && (s.fontFamily = a[\"font-family\"]);\n            a[\"font-weight\"] && (s.fontWeight = a[\"font-weight\"]);\n            a[\"font-style\"] && (s.fontStyle = a[\"font-style\"]);\n            fontSize = toFloat(a[\"font-size\"] || fontSize && fontSize[0]) || 10;\n            s.fontSize = fontSize * m + \"px\";\n            res.textpath.string && (span.innerHTML = Str(res.textpath.string).replace(/</g, \"&#60;\").replace(/&/g, \"&#38;\").replace(/\\n/g, \"<br>\"));\n            var brect = span.getBoundingClientRect();\n            res.W = a.w = (brect.right - brect.left) / m;\n            res.H = a.h = (brect.bottom - brect.top) / m;\n            // res.paper.canvas.style.display = \"none\";\n            res.X = a.x;\n            res.Y = a.y + res.H / 2;\n\n            (\"x\" in params || \"y\" in params) && (res.path.v = R.format(\"m{0},{1}l{2},{1}\", round(a.x * zoom), round(a.y * zoom), round(a.x * zoom) + 1));\n            var dirtyattrs = [\"x\", \"y\", \"text\", \"font\", \"font-family\", \"font-weight\", \"font-style\", \"font-size\"];\n            for (var d = 0, dd = dirtyattrs.length; d < dd; d++) if (dirtyattrs[d] in params) {\n                res._.dirty = 1;\n                break;\n            }\n\n            // text-anchor emulation\n            switch (a[\"text-anchor\"]) {\n                case \"start\":\n                    res.textpath.style[\"v-text-align\"] = \"left\";\n                    res.bbx = res.W / 2;\n                break;\n                case \"end\":\n                    res.textpath.style[\"v-text-align\"] = \"right\";\n                    res.bbx = -res.W / 2;\n                break;\n                default:\n                    res.textpath.style[\"v-text-align\"] = \"center\";\n                    res.bbx = 0;\n                break;\n            }\n            res.textpath.style[\"v-text-kern\"] = true;\n        }\n        // res.paper.canvas.style.display = E;\n    },\n    addGradientFill = function (o, gradient, fill) {\n        o.attrs = o.attrs || {};\n        var attrs = o.attrs,\n            pow = Math.pow,\n            opacity,\n            oindex,\n            type = \"linear\",\n            fxfy = \".5 .5\";\n        o.attrs.gradient = gradient;\n        gradient = Str(gradient).replace(R._radial_gradient, function (all, fx, fy) {\n            type = \"radial\";\n            if (fx && fy) {\n                fx = toFloat(fx);\n                fy = toFloat(fy);\n                pow(fx - .5, 2) + pow(fy - .5, 2) > .25 && (fy = math.sqrt(.25 - pow(fx - .5, 2)) * ((fy > .5) * 2 - 1) + .5);\n                fxfy = fx + S + fy;\n            }\n            return E;\n        });\n        gradient = gradient.split(/\\s*\\-\\s*/);\n        if (type == \"linear\") {\n            var angle = gradient.shift();\n            angle = -toFloat(angle);\n            if (isNaN(angle)) {\n                return null;\n            }\n        }\n        var dots = R._parseDots(gradient);\n        if (!dots) {\n            return null;\n        }\n        o = o.shape || o.node;\n        if (dots.length) {\n            o.removeChild(fill);\n            fill.on = true;\n            fill.method = \"none\";\n            fill.color = dots[0].color;\n            fill.color2 = dots[dots.length - 1].color;\n            var clrs = [];\n            for (var i = 0, ii = dots.length; i < ii; i++) {\n                dots[i].offset && clrs.push(dots[i].offset + S + dots[i].color);\n            }\n            fill.colors = clrs.length ? clrs.join() : \"0% \" + fill.color;\n            if (type == \"radial\") {\n                fill.type = \"gradientTitle\";\n                fill.focus = \"100%\";\n                fill.focussize = \"0 0\";\n                fill.focusposition = fxfy;\n                fill.angle = 0;\n            } else {\n                // fill.rotate= true;\n                fill.type = \"gradient\";\n                fill.angle = (270 - angle) % 360;\n            }\n            o.appendChild(fill);\n        }\n        return 1;\n    },\n    Element = function (node, vml) {\n        this[0] = this.node = node;\n        node.raphael = true;\n        this.id = R._oid++;\n        node.raphaelid = this.id;\n        this.X = 0;\n        this.Y = 0;\n        this.attrs = {};\n        this.paper = vml;\n        this.matrix = R.matrix();\n        this._ = {\n            transform: [],\n            sx: 1,\n            sy: 1,\n            dx: 0,\n            dy: 0,\n            deg: 0,\n            dirty: 1,\n            dirtyT: 1\n        };\n        !vml.bottom && (vml.bottom = this);\n        this.prev = vml.top;\n        vml.top && (vml.top.next = this);\n        vml.top = this;\n        this.next = null;\n    };\n    var elproto = R.el;\n\n    Element.prototype = elproto;\n    elproto.constructor = Element;\n    elproto.transform = function (tstr) {\n        if (tstr == null) {\n            return this._.transform;\n        }\n        var vbs = this.paper._viewBoxShift,\n            vbt = vbs ? \"s\" + [vbs.scale, vbs.scale] + \"-1-1t\" + [vbs.dx, vbs.dy] : E,\n            oldt;\n        if (vbs) {\n            oldt = tstr = Str(tstr).replace(/\\.{3}|\\u2026/g, this._.transform || E);\n        }\n        R._extractTransform(this, vbt + tstr);\n        var matrix = this.matrix.clone(),\n            skew = this.skew,\n            o = this.node,\n            split,\n            isGrad = ~Str(this.attrs.fill).indexOf(\"-\"),\n            isPatt = !Str(this.attrs.fill).indexOf(\"url(\");\n        matrix.translate(1, 1);\n        if (isPatt || isGrad || this.type == \"image\") {\n            skew.matrix = \"1 0 0 1\";\n            skew.offset = \"0 0\";\n            split = matrix.split();\n            if ((isGrad && split.noRotation) || !split.isSimple) {\n                o.style.filter = matrix.toFilter();\n                var bb = this.getBBox(),\n                    bbt = this.getBBox(1),\n                    dx = bb.x - bbt.x,\n                    dy = bb.y - bbt.y;\n                o.coordorigin = (dx * -zoom) + S + (dy * -zoom);\n                setCoords(this, 1, 1, dx, dy, 0);\n            } else {\n                o.style.filter = E;\n                setCoords(this, split.scalex, split.scaley, split.dx, split.dy, split.rotate);\n            }\n        } else {\n            o.style.filter = E;\n            skew.matrix = Str(matrix);\n            skew.offset = matrix.offset();\n        }\n        if (oldt !== null) { // empty string value is true as well\n            this._.transform = oldt;\n            R._extractTransform(this, oldt);\n        }\n        return this;\n    };\n    elproto.rotate = function (deg, cx, cy) {\n        if (this.removed) {\n            return this;\n        }\n        if (deg == null) {\n            return;\n        }\n        deg = Str(deg).split(separator);\n        if (deg.length - 1) {\n            cx = toFloat(deg[1]);\n            cy = toFloat(deg[2]);\n        }\n        deg = toFloat(deg[0]);\n        (cy == null) && (cx = cy);\n        if (cx == null || cy == null) {\n            var bbox = this.getBBox(1);\n            cx = bbox.x + bbox.width / 2;\n            cy = bbox.y + bbox.height / 2;\n        }\n        this._.dirtyT = 1;\n        this.transform(this._.transform.concat([[\"r\", deg, cx, cy]]));\n        return this;\n    };\n    elproto.translate = function (dx, dy) {\n        if (this.removed) {\n            return this;\n        }\n        dx = Str(dx).split(separator);\n        if (dx.length - 1) {\n            dy = toFloat(dx[1]);\n        }\n        dx = toFloat(dx[0]) || 0;\n        dy = +dy || 0;\n        if (this._.bbox) {\n            this._.bbox.x += dx;\n            this._.bbox.y += dy;\n        }\n        this.transform(this._.transform.concat([[\"t\", dx, dy]]));\n        return this;\n    };\n    elproto.scale = function (sx, sy, cx, cy) {\n        if (this.removed) {\n            return this;\n        }\n        sx = Str(sx).split(separator);\n        if (sx.length - 1) {\n            sy = toFloat(sx[1]);\n            cx = toFloat(sx[2]);\n            cy = toFloat(sx[3]);\n            isNaN(cx) && (cx = null);\n            isNaN(cy) && (cy = null);\n        }\n        sx = toFloat(sx[0]);\n        (sy == null) && (sy = sx);\n        (cy == null) && (cx = cy);\n        if (cx == null || cy == null) {\n            var bbox = this.getBBox(1);\n        }\n        cx = cx == null ? bbox.x + bbox.width / 2 : cx;\n        cy = cy == null ? bbox.y + bbox.height / 2 : cy;\n\n        this.transform(this._.transform.concat([[\"s\", sx, sy, cx, cy]]));\n        this._.dirtyT = 1;\n        return this;\n    };\n    elproto.hide = function () {\n        !this.removed && (this.node.style.display = \"none\");\n        return this;\n    };\n    elproto.show = function () {\n        !this.removed && (this.node.style.display = E);\n        return this;\n    };\n    // Needed to fix the vml setViewBox issues\n    elproto.auxGetBBox = R.el.getBBox;\n    elproto.getBBox = function(){\n      var b = this.auxGetBBox();\n      if (this.paper && this.paper._viewBoxShift)\n      {\n        var c = {};\n        var z = 1/this.paper._viewBoxShift.scale;\n        c.x = b.x - this.paper._viewBoxShift.dx;\n        c.x *= z;\n        c.y = b.y - this.paper._viewBoxShift.dy;\n        c.y *= z;\n        c.width  = b.width  * z;\n        c.height = b.height * z;\n        c.x2 = c.x + c.width;\n        c.y2 = c.y + c.height;\n        return c;\n      }\n      return b;\n    };\n    elproto._getBBox = function () {\n        if (this.removed) {\n            return {};\n        }\n        return {\n            x: this.X + (this.bbx || 0) - this.W / 2,\n            y: this.Y - this.H,\n            width: this.W,\n            height: this.H\n        };\n    };\n    elproto.remove = function () {\n        if (this.removed || !this.node.parentNode) {\n            return;\n        }\n        this.paper.__set__ && this.paper.__set__.exclude(this);\n        R.eve.unbind(\"raphael.*.*.\" + this.id);\n        R._tear(this, this.paper);\n        this.node.parentNode.removeChild(this.node);\n        this.shape && this.shape.parentNode.removeChild(this.shape);\n        for (var i in this) {\n            this[i] = typeof this[i] == \"function\" ? R._removedFactory(i) : null;\n        }\n        this.removed = true;\n    };\n    elproto.attr = function (name, value) {\n        if (this.removed) {\n            return this;\n        }\n        if (name == null) {\n            var res = {};\n            for (var a in this.attrs) if (this.attrs[has](a)) {\n                res[a] = this.attrs[a];\n            }\n            res.gradient && res.fill == \"none\" && (res.fill = res.gradient) && delete res.gradient;\n            res.transform = this._.transform;\n            return res;\n        }\n        if (value == null && R.is(name, \"string\")) {\n            if (name == fillString && this.attrs.fill == \"none\" && this.attrs.gradient) {\n                return this.attrs.gradient;\n            }\n            var names = name.split(separator),\n                out = {};\n            for (var i = 0, ii = names.length; i < ii; i++) {\n                name = names[i];\n                if (name in this.attrs) {\n                    out[name] = this.attrs[name];\n                } else if (R.is(this.paper.customAttributes[name], \"function\")) {\n                    out[name] = this.paper.customAttributes[name].def;\n                } else {\n                    out[name] = R._availableAttrs[name];\n                }\n            }\n            return ii - 1 ? out : out[names[0]];\n        }\n        if (this.attrs && value == null && R.is(name, \"array\")) {\n            out = {};\n            for (i = 0, ii = name.length; i < ii; i++) {\n                out[name[i]] = this.attr(name[i]);\n            }\n            return out;\n        }\n        var params;\n        if (value != null) {\n            params = {};\n            params[name] = value;\n        }\n        value == null && R.is(name, \"object\") && (params = name);\n        for (var key in params) {\n            eve(\"raphael.attr.\" + key + \".\" + this.id, this, params[key]);\n        }\n        if (params) {\n            for (key in this.paper.customAttributes) if (this.paper.customAttributes[has](key) && params[has](key) && R.is(this.paper.customAttributes[key], \"function\")) {\n                var par = this.paper.customAttributes[key].apply(this, [].concat(params[key]));\n                this.attrs[key] = params[key];\n                for (var subkey in par) if (par[has](subkey)) {\n                    params[subkey] = par[subkey];\n                }\n            }\n            // this.paper.canvas.style.display = \"none\";\n            if (params.text && this.type == \"text\") {\n                this.textpath.string = params.text;\n            }\n            setFillAndStroke(this, params);\n            // this.paper.canvas.style.display = E;\n        }\n        return this;\n    };\n    elproto.toFront = function () {\n        !this.removed && this.node.parentNode.appendChild(this.node);\n        this.paper && this.paper.top != this && R._tofront(this, this.paper);\n        return this;\n    };\n    elproto.toBack = function () {\n        if (this.removed) {\n            return this;\n        }\n        if (this.node.parentNode.firstChild != this.node) {\n            this.node.parentNode.insertBefore(this.node, this.node.parentNode.firstChild);\n            R._toback(this, this.paper);\n        }\n        return this;\n    };\n    elproto.insertAfter = function (element) {\n        if (this.removed) {\n            return this;\n        }\n        if (element.constructor == R.st.constructor) {\n            element = element[element.length - 1];\n        }\n        if (element.node.nextSibling) {\n            element.node.parentNode.insertBefore(this.node, element.node.nextSibling);\n        } else {\n            element.node.parentNode.appendChild(this.node);\n        }\n        R._insertafter(this, element, this.paper);\n        return this;\n    };\n    elproto.insertBefore = function (element) {\n        if (this.removed) {\n            return this;\n        }\n        if (element.constructor == R.st.constructor) {\n            element = element[0];\n        }\n        element.node.parentNode.insertBefore(this.node, element.node);\n        R._insertbefore(this, element, this.paper);\n        return this;\n    };\n    elproto.blur = function (size) {\n        var s = this.node.runtimeStyle,\n            f = s.filter;\n        f = f.replace(blurregexp, E);\n        if (+size !== 0) {\n            this.attrs.blur = size;\n            s.filter = f + S + ms + \".Blur(pixelradius=\" + (+size || 1.5) + \")\";\n            s.margin = R.format(\"-{0}px 0 0 -{0}px\", round(+size || 1.5));\n        } else {\n            s.filter = f;\n            s.margin = 0;\n            delete this.attrs.blur;\n        }\n        return this;\n    };\n\n    R._engine.path = function (pathString, vml) {\n        var el = createNode(\"shape\");\n        el.style.cssText = cssDot;\n        el.coordsize = zoom + S + zoom;\n        el.coordorigin = vml.coordorigin;\n        var p = new Element(el, vml),\n            attr = {fill: \"none\", stroke: \"#000\"};\n        pathString && (attr.path = pathString);\n        p.type = \"path\";\n        p.path = [];\n        p.Path = E;\n        setFillAndStroke(p, attr);\n        vml.canvas && vml.canvas.appendChild(el);\n        var skew = createNode(\"skew\");\n        skew.on = true;\n        el.appendChild(skew);\n        p.skew = skew;\n        p.transform(E);\n        return p;\n    };\n    R._engine.rect = function (vml, x, y, w, h, r) {\n        var path = R._rectPath(x, y, w, h, r),\n            res = vml.path(path),\n            a = res.attrs;\n        res.X = a.x = x;\n        res.Y = a.y = y;\n        res.W = a.width = w;\n        res.H = a.height = h;\n        a.r = r;\n        a.path = path;\n        res.type = \"rect\";\n        return res;\n    };\n    R._engine.ellipse = function (vml, x, y, rx, ry) {\n        var res = vml.path(),\n            a = res.attrs;\n        res.X = x - rx;\n        res.Y = y - ry;\n        res.W = rx * 2;\n        res.H = ry * 2;\n        res.type = \"ellipse\";\n        setFillAndStroke(res, {\n            cx: x,\n            cy: y,\n            rx: rx,\n            ry: ry\n        });\n        return res;\n    };\n    R._engine.circle = function (vml, x, y, r) {\n        var res = vml.path(),\n            a = res.attrs;\n        res.X = x - r;\n        res.Y = y - r;\n        res.W = res.H = r * 2;\n        res.type = \"circle\";\n        setFillAndStroke(res, {\n            cx: x,\n            cy: y,\n            r: r\n        });\n        return res;\n    };\n    R._engine.image = function (vml, src, x, y, w, h) {\n        var path = R._rectPath(x, y, w, h),\n            res = vml.path(path).attr({stroke: \"none\"}),\n            a = res.attrs,\n            node = res.node,\n            fill = node.getElementsByTagName(fillString)[0];\n        a.src = src;\n        res.X = a.x = x;\n        res.Y = a.y = y;\n        res.W = a.width = w;\n        res.H = a.height = h;\n        a.path = path;\n        res.type = \"image\";\n        fill.parentNode == node && node.removeChild(fill);\n        fill.rotate = true;\n        fill.src = src;\n        fill.type = \"tile\";\n        res._.fillpos = [x, y];\n        res._.fillsize = [w, h];\n        node.appendChild(fill);\n        setCoords(res, 1, 1, 0, 0, 0);\n        return res;\n    };\n    R._engine.text = function (vml, x, y, text) {\n        var el = createNode(\"shape\"),\n            path = createNode(\"path\"),\n            o = createNode(\"textpath\");\n        x = x || 0;\n        y = y || 0;\n        text = text || \"\";\n        path.v = R.format(\"m{0},{1}l{2},{1}\", round(x * zoom), round(y * zoom), round(x * zoom) + 1);\n        path.textpathok = true;\n        o.string = Str(text);\n        o.on = true;\n        el.style.cssText = cssDot;\n        el.coordsize = zoom + S + zoom;\n        el.coordorigin = \"0 0\";\n        var p = new Element(el, vml),\n            attr = {\n                fill: \"#000\",\n                stroke: \"none\",\n                font: R._availableAttrs.font,\n                text: text\n            };\n        p.shape = el;\n        p.path = path;\n        p.textpath = o;\n        p.type = \"text\";\n        p.attrs.text = Str(text);\n        p.attrs.x = x;\n        p.attrs.y = y;\n        p.attrs.w = 1;\n        p.attrs.h = 1;\n        setFillAndStroke(p, attr);\n        el.appendChild(o);\n        el.appendChild(path);\n        vml.canvas.appendChild(el);\n        var skew = createNode(\"skew\");\n        skew.on = true;\n        el.appendChild(skew);\n        p.skew = skew;\n        p.transform(E);\n        return p;\n    };\n    R._engine.setSize = function (width, height) {\n        var cs = this.canvas.style;\n        this.width = width;\n        this.height = height;\n        width == +width && (width += \"px\");\n        height == +height && (height += \"px\");\n        cs.width = width;\n        cs.height = height;\n        cs.clip = \"rect(0 \" + width + \" \" + height + \" 0)\";\n        if (this._viewBox) {\n            R._engine.setViewBox.apply(this, this._viewBox);\n        }\n        return this;\n    };\n    R._engine.setViewBox = function (x, y, w, h, fit) {\n        R.eve(\"raphael.setViewBox\", this, this._viewBox, [x, y, w, h, fit]);\n        var paperSize = this.getSize(),\n            width = paperSize.width,\n            height = paperSize.height,\n            H, W;\n        if (fit) {\n            H = height / h;\n            W = width / w;\n            if (w * H < width) {\n                x -= (width - w * H) / 2 / H;\n            }\n            if (h * W < height) {\n                y -= (height - h * W) / 2 / W;\n            }\n        }\n        this._viewBox = [x, y, w, h, !!fit];\n        this._viewBoxShift = {\n            dx: -x,\n            dy: -y,\n            scale: paperSize\n        };\n        this.forEach(function (el) {\n            el.transform(\"...\");\n        });\n        return this;\n    };\n    var createNode;\n    R._engine.initWin = function (win) {\n            var doc = win.document;\n            if (doc.styleSheets.length < 31) {\n                doc.createStyleSheet().addRule(\".rvml\", \"behavior:url(#default#VML)\");\n            } else {\n                // no more room, add to the existing one\n                // http://msdn.microsoft.com/en-us/library/ms531194%28VS.85%29.aspx\n                doc.styleSheets[0].addRule(\".rvml\", \"behavior:url(#default#VML)\");\n            }\n            try {\n                !doc.namespaces.rvml && doc.namespaces.add(\"rvml\", \"urn:schemas-microsoft-com:vml\");\n                createNode = function (tagName) {\n                    return doc.createElement('<rvml:' + tagName + ' class=\"rvml\">');\n                };\n            } catch (e) {\n                createNode = function (tagName) {\n                    return doc.createElement('<' + tagName + ' xmlns=\"urn:schemas-microsoft.com:vml\" class=\"rvml\">');\n                };\n            }\n        };\n    R._engine.initWin(R._g.win);\n    R._engine.create = function () {\n        var con = R._getContainer.apply(0, arguments),\n            container = con.container,\n            height = con.height,\n            s,\n            width = con.width,\n            x = con.x,\n            y = con.y;\n        if (!container) {\n            throw new Error(\"VML container not found.\");\n        }\n        var res = new R._Paper,\n            c = res.canvas = R._g.doc.createElement(\"div\"),\n            cs = c.style;\n        x = x || 0;\n        y = y || 0;\n        width = width || 512;\n        height = height || 342;\n        res.width = width;\n        res.height = height;\n        width == +width && (width += \"px\");\n        height == +height && (height += \"px\");\n        res.coordsize = zoom * 1e3 + S + zoom * 1e3;\n        res.coordorigin = \"0 0\";\n        res.span = R._g.doc.createElement(\"span\");\n        res.span.style.cssText = \"position:absolute;left:-9999em;top:-9999em;padding:0;margin:0;line-height:1;\";\n        c.appendChild(res.span);\n        cs.cssText = R.format(\"top:0;left:0;width:{0};height:{1};display:inline-block;position:relative;clip:rect(0 {0} {1} 0);overflow:hidden\", width, height);\n        if (container == 1) {\n            R._g.doc.body.appendChild(c);\n            cs.left = x + \"px\";\n            cs.top = y + \"px\";\n            cs.position = \"absolute\";\n        } else {\n            if (container.firstChild) {\n                container.insertBefore(c, container.firstChild);\n            } else {\n                container.appendChild(c);\n            }\n        }\n        res.renderfix = function () {};\n        return res;\n    };\n    R.prototype.clear = function () {\n        R.eve(\"raphael.clear\", this);\n        this.canvas.innerHTML = E;\n        this.span = R._g.doc.createElement(\"span\");\n        this.span.style.cssText = \"position:absolute;left:-9999em;top:-9999em;padding:0;margin:0;line-height:1;display:inline;\";\n        this.canvas.appendChild(this.span);\n        this.bottom = this.top = null;\n    };\n    R.prototype.remove = function () {\n        R.eve(\"raphael.remove\", this);\n        this.canvas.parentNode.removeChild(this.canvas);\n        for (var i in this) {\n            this[i] = typeof this[i] == \"function\" ? R._removedFactory(i) : null;\n        }\n        return true;\n    };\n\n    var setproto = R.st;\n    for (var method in elproto) if (elproto[has](method) && !setproto[has](method)) {\n        setproto[method] = (function (methodname) {\n            return function () {\n                var arg = arguments;\n                return this.forEach(function (el) {\n                    el[methodname].apply(el, arg);\n                });\n            };\n        })(method);\n    }\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\n\n/***/ }),\n\n/***/ \"./node_modules/eve-raphael/eve.js\":\n/*!*****************************************!*\\\n  !*** ./node_modules/eve-raphael/eve.js ***!\n  \\*****************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;// Copyright (c) 2013 Adobe Systems Incorporated. All rights reserved.\n// \n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n// \n// http://www.apache.org/licenses/LICENSE-2.0\n// \n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// \u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \\\\\n// \u2502 Eve 0.5.0 - JavaScript Events Library                      \u2502 \\\\\n// \u251C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524 \\\\\n// \u2502 Author Dmitry Baranovskiy (http://dmitry.baranovskiy.com/) \u2502 \\\\\n// \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \\\\\n\n(function (glob) {\n    var version = \"0.5.0\",\n        has = \"hasOwnProperty\",\n        separator = /[\\.\\/]/,\n        comaseparator = /\\s*,\\s*/,\n        wildcard = \"*\",\n        fun = function () {},\n        numsort = function (a, b) {\n            return a - b;\n        },\n        current_event,\n        stop,\n        events = {n: {}},\n        firstDefined = function () {\n            for (var i = 0, ii = this.length; i < ii; i++) {\n                if (typeof this[i] != \"undefined\") {\n                    return this[i];\n                }\n            }\n        },\n        lastDefined = function () {\n            var i = this.length;\n            while (--i) {\n                if (typeof this[i] != \"undefined\") {\n                    return this[i];\n                }\n            }\n        },\n        objtos = Object.prototype.toString,\n        Str = String,\n        isArray = Array.isArray || function (ar) {\n            return ar instanceof Array || objtos.call(ar) == \"[object Array]\";\n        };\n    /*\\\n     * eve\n     [ method ]\n\n     * Fires event with given `name`, given scope and other parameters.\n\n     > Arguments\n\n     - name (string) name of the *event*, dot (`.`) or slash (`/`) separated\n     - scope (object) context for the event handlers\n     - varargs (...) the rest of arguments will be sent to event handlers\n\n     = (object) array of returned values from the listeners. Array has two methods `.firstDefined()` and `.lastDefined()` to get first or last not `undefined` value.\n    \\*/\n        var eve = function (name, scope) {\n            var e = events,\n                oldstop = stop,\n                args = Array.prototype.slice.call(arguments, 2),\n                listeners = eve.listeners(name),\n                z = 0,\n                f = false,\n                l,\n                indexed = [],\n                queue = {},\n                out = [],\n                ce = current_event,\n                errors = [];\n            out.firstDefined = firstDefined;\n            out.lastDefined = lastDefined;\n            current_event = name;\n            stop = 0;\n            for (var i = 0, ii = listeners.length; i < ii; i++) if (\"zIndex\" in listeners[i]) {\n                indexed.push(listeners[i].zIndex);\n                if (listeners[i].zIndex < 0) {\n                    queue[listeners[i].zIndex] = listeners[i];\n                }\n            }\n            indexed.sort(numsort);\n            while (indexed[z] < 0) {\n                l = queue[indexed[z++]];\n                out.push(l.apply(scope, args));\n                if (stop) {\n                    stop = oldstop;\n                    return out;\n                }\n            }\n            for (i = 0; i < ii; i++) {\n                l = listeners[i];\n                if (\"zIndex\" in l) {\n                    if (l.zIndex == indexed[z]) {\n                        out.push(l.apply(scope, args));\n                        if (stop) {\n                            break;\n                        }\n                        do {\n                            z++;\n                            l = queue[indexed[z]];\n                            l && out.push(l.apply(scope, args));\n                            if (stop) {\n                                break;\n                            }\n                        } while (l)\n                    } else {\n                        queue[l.zIndex] = l;\n                    }\n                } else {\n                    out.push(l.apply(scope, args));\n                    if (stop) {\n                        break;\n                    }\n                }\n            }\n            stop = oldstop;\n            current_event = ce;\n            return out;\n        };\n        // Undocumented. Debug only.\n        eve._events = events;\n    /*\\\n     * eve.listeners\n     [ method ]\n\n     * Internal method which gives you array of all event handlers that will be triggered by the given `name`.\n\n     > Arguments\n\n     - name (string) name of the event, dot (`.`) or slash (`/`) separated\n\n     = (array) array of event handlers\n    \\*/\n    eve.listeners = function (name) {\n        var names = isArray(name) ? name : name.split(separator),\n            e = events,\n            item,\n            items,\n            k,\n            i,\n            ii,\n            j,\n            jj,\n            nes,\n            es = [e],\n            out = [];\n        for (i = 0, ii = names.length; i < ii; i++) {\n            nes = [];\n            for (j = 0, jj = es.length; j < jj; j++) {\n                e = es[j].n;\n                items = [e[names[i]], e[wildcard]];\n                k = 2;\n                while (k--) {\n                    item = items[k];\n                    if (item) {\n                        nes.push(item);\n                        out = out.concat(item.f || []);\n                    }\n                }\n            }\n            es = nes;\n        }\n        return out;\n    };\n    /*\\\n     * eve.separator\n     [ method ]\n\n     * If for some reasons you don\u2019t like default separators (`.` or `/`) you can specify yours\n     * here. Be aware that if you pass a string longer than one character it will be treated as\n     * a list of characters.\n\n     - separator (string) new separator. Empty string resets to default: `.` or `/`.\n    \\*/\n    eve.separator = function (sep) {\n        if (sep) {\n            sep = Str(sep).replace(/(?=[\\.\\^\\]\\[\\-])/g, \"\\\\\");\n            sep = \"[\" + sep + \"]\";\n            separator = new RegExp(sep);\n        } else {\n            separator = /[\\.\\/]/;\n        }\n    };\n    /*\\\n     * eve.on\n     [ method ]\n     **\n     * Binds given event handler with a given name. You can use wildcards \u201C`*`\u201D for the names:\n     | eve.on(\"*.under.*\", f);\n     | eve(\"mouse.under.floor\"); // triggers f\n     * Use @eve to trigger the listener.\n     **\n     - name (string) name of the event, dot (`.`) or slash (`/`) separated, with optional wildcards\n     - f (function) event handler function\n     **\n     - name (array) if you don\u2019t want to use separators, you can use array of strings\n     - f (function) event handler function\n     **\n     = (function) returned function accepts a single numeric parameter that represents z-index of the handler. It is an optional feature and only used when you need to ensure that some subset of handlers will be invoked in a given order, despite of the order of assignment. \n     > Example:\n     | eve.on(\"mouse\", eatIt)(2);\n     | eve.on(\"mouse\", scream);\n     | eve.on(\"mouse\", catchIt)(1);\n     * This will ensure that `catchIt` function will be called before `eatIt`.\n     *\n     * If you want to put your handler before non-indexed handlers, specify a negative value.\n     * Note: I assume most of the time you don\u2019t need to worry about z-index, but it\u2019s nice to have this feature \u201Cjust in case\u201D.\n    \\*/\n    eve.on = function (name, f) {\n        if (typeof f != \"function\") {\n            return function () {};\n        }\n        var names = isArray(name) ? (isArray(name[0]) ? name : [name]) : Str(name).split(comaseparator);\n        for (var i = 0, ii = names.length; i < ii; i++) {\n            (function (name) {\n                var names = isArray(name) ? name : Str(name).split(separator),\n                    e = events,\n                    exist;\n                for (var i = 0, ii = names.length; i < ii; i++) {\n                    e = e.n;\n                    e = e.hasOwnProperty(names[i]) && e[names[i]] || (e[names[i]] = {n: {}});\n                }\n                e.f = e.f || [];\n                for (i = 0, ii = e.f.length; i < ii; i++) if (e.f[i] == f) {\n                    exist = true;\n                    break;\n                }\n                !exist && e.f.push(f);\n            }(names[i]));\n        }\n        return function (zIndex) {\n            if (+zIndex == +zIndex) {\n                f.zIndex = +zIndex;\n            }\n        };\n    };\n    /*\\\n     * eve.f\n     [ method ]\n     **\n     * Returns function that will fire given event with optional arguments.\n     * Arguments that will be passed to the result function will be also\n     * concated to the list of final arguments.\n     | el.onclick = eve.f(\"click\", 1, 2);\n     | eve.on(\"click\", function (a, b, c) {\n     |     console.log(a, b, c); // 1, 2, [event object]\n     | });\n     > Arguments\n     - event (string) event name\n     - varargs (\u2026) and any other arguments\n     = (function) possible event handler function\n    \\*/\n    eve.f = function (event) {\n        var attrs = [].slice.call(arguments, 1);\n        return function () {\n            eve.apply(null, [event, null].concat(attrs).concat([].slice.call(arguments, 0)));\n        };\n    };\n    /*\\\n     * eve.stop\n     [ method ]\n     **\n     * Is used inside an event handler to stop the event, preventing any subsequent listeners from firing.\n    \\*/\n    eve.stop = function () {\n        stop = 1;\n    };\n    /*\\\n     * eve.nt\n     [ method ]\n     **\n     * Could be used inside event handler to figure out actual name of the event.\n     **\n     > Arguments\n     **\n     - subname (string) #optional subname of the event\n     **\n     = (string) name of the event, if `subname` is not specified\n     * or\n     = (boolean) `true`, if current event\u2019s name contains `subname`\n    \\*/\n    eve.nt = function (subname) {\n        var cur = isArray(current_event) ? current_event.join(\".\") : current_event;\n        if (subname) {\n            return new RegExp(\"(?:\\\\.|\\\\/|^)\" + subname + \"(?:\\\\.|\\\\/|$)\").test(cur);\n        }\n        return cur;\n    };\n    /*\\\n     * eve.nts\n     [ method ]\n     **\n     * Could be used inside event handler to figure out actual name of the event.\n     **\n     **\n     = (array) names of the event\n    \\*/\n    eve.nts = function () {\n        return isArray(current_event) ? current_event : current_event.split(separator);\n    };\n    /*\\\n     * eve.off\n     [ method ]\n     **\n     * Removes given function from the list of event listeners assigned to given name.\n     * If no arguments specified all the events will be cleared.\n     **\n     > Arguments\n     **\n     - name (string) name of the event, dot (`.`) or slash (`/`) separated, with optional wildcards\n     - f (function) event handler function\n    \\*/\n    /*\\\n     * eve.unbind\n     [ method ]\n     **\n     * See @eve.off\n    \\*/\n    eve.off = eve.unbind = function (name, f) {\n        if (!name) {\n            eve._events = events = {n: {}};\n            return;\n        }\n        var names = isArray(name) ? (isArray(name[0]) ? name : [name]) : Str(name).split(comaseparator);\n        if (names.length > 1) {\n            for (var i = 0, ii = names.length; i < ii; i++) {\n                eve.off(names[i], f);\n            }\n            return;\n        }\n        names = isArray(name) ? name : Str(name).split(separator);\n        var e,\n            key,\n            splice,\n            i, ii, j, jj,\n            cur = [events];\n        for (i = 0, ii = names.length; i < ii; i++) {\n            for (j = 0; j < cur.length; j += splice.length - 2) {\n                splice = [j, 1];\n                e = cur[j].n;\n                if (names[i] != wildcard) {\n                    if (e[names[i]]) {\n                        splice.push(e[names[i]]);\n                    }\n                } else {\n                    for (key in e) if (e[has](key)) {\n                        splice.push(e[key]);\n                    }\n                }\n                cur.splice.apply(cur, splice);\n            }\n        }\n        for (i = 0, ii = cur.length; i < ii; i++) {\n            e = cur[i];\n            while (e.n) {\n                if (f) {\n                    if (e.f) {\n                        for (j = 0, jj = e.f.length; j < jj; j++) if (e.f[j] == f) {\n                            e.f.splice(j, 1);\n                            break;\n                        }\n                        !e.f.length && delete e.f;\n                    }\n                    for (key in e.n) if (e.n[has](key) && e.n[key].f) {\n                        var funcs = e.n[key].f;\n                        for (j = 0, jj = funcs.length; j < jj; j++) if (funcs[j] == f) {\n                            funcs.splice(j, 1);\n                            break;\n                        }\n                        !funcs.length && delete e.n[key].f;\n                    }\n                } else {\n                    delete e.f;\n                    for (key in e.n) if (e.n[has](key) && e.n[key].f) {\n                        delete e.n[key].f;\n                    }\n                }\n                e = e.n;\n            }\n        }\n    };\n    /*\\\n     * eve.once\n     [ method ]\n     **\n     * Binds given event handler with a given name to only run once then unbind itself.\n     | eve.once(\"login\", f);\n     | eve(\"login\"); // triggers f\n     | eve(\"login\"); // no listeners\n     * Use @eve to trigger the listener.\n     **\n     > Arguments\n     **\n     - name (string) name of the event, dot (`.`) or slash (`/`) separated, with optional wildcards\n     - f (function) event handler function\n     **\n     = (function) same return function as @eve.on\n    \\*/\n    eve.once = function (name, f) {\n        var f2 = function () {\n            eve.off(name, f2);\n            return f.apply(this, arguments);\n        };\n        return eve.on(name, f2);\n    };\n    /*\\\n     * eve.version\n     [ property (string) ]\n     **\n     * Current version of the library.\n    \\*/\n    eve.version = version;\n    eve.toString = function () {\n        return \"You are running Eve \" + version;\n    };\n    ( true && module.exports) ? (module.exports = eve) : ( true ? (!(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_RESULT__ = (function() { return eve; }).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__))) : (undefined));\n})(this);\n\n\n/***/ })\n\n/******/ });\n});", "/* eslint-disable no-unused-vars */\n\nimport Raphael from 'raphael/raphael';\n\nRaphael.fn.slice = function (startX, startY, endX, endY, radius1, radius2, centerX, centerY, _endX, _endY, largeArc) {\n  const startShape = `M${startX} ${startY}L${centerX} `;\n  const arcShape = [radius1, radius2, 0, largeArc ? 1 : 0, 1, endX, endY].join(' ');\n  const closeShape = `L${_endX} ${_endY}L${centerX} ${centerY}`;\n  return this.path(`${startShape}${centerY}M${startX} ${startY} a ${arcShape}${closeShape}`);\n};\n\nRaphael.fn.circularArc = function (centerX, centerY, radius, startAngle, endAngle) {\n  const startX = centerX + radius * Math.cos(startAngle * Math.PI / 180);\n  const startY = centerY + radius * Math.sin(startAngle * Math.PI / 180);\n  const endX = centerX + radius * Math.cos(endAngle * Math.PI / 180);\n  const endY = centerY + radius * Math.sin(endAngle * Math.PI / 180);\n  return this.slice(startX, startY, endX - startX, endY - startY, radius, radius, centerX, centerY, endX, endY, (endAngle - startAngle) > 180);\n};\n\nwindow.GolfCharts = (function () {\n  const paperW = 280;\n  const paperH = 326;\n  const graphBaseLineY = paperH - 96;\n  const module = {};\n\n  module.initDrivingAccuracy = function (divId, percLeft, percTarget, percRight) {\n    // check if a div with divId exists\n    if ($(`#${divId}`).length === 0) return;\n\n    $(`#${divId}`).empty();\n\n    const paper = Raphael(divId, paperW, paperH);\n    const maxRadius = 120;\n\n    function normalizePercentages(percentage) {\n      return Math.max(percentage, 5) * maxRadius / 100;\n    }\n\n    const guide = paper.circularArc((paperW / 2), graphBaseLineY - 8, maxRadius, 180, 0);\n    guide.attr({\n      stroke: '#F3F3F4',\n      'stroke-width': '1',\n    });\n\n    const target = paper.circularArc((paperW / 2), graphBaseLineY - 8, normalizePercentages(percTarget), 225, 315);\n    target.attr({\n      fill: '#3651F1',\n      'stroke-width': '0',\n    });\n\n    const mLeft = paper.circularArc((paperW / 2), graphBaseLineY - 8, normalizePercentages(percLeft), 180, 225);\n    mLeft.attr({\n      fill: '#D0D2D6',\n      'stroke-width': '0',\n    });\n\n    const mRight = paper.circularArc((paperW / 2), graphBaseLineY - 8, normalizePercentages(percRight), 315, 0);\n    mRight.attr({\n      fill: '#D0D2D6',\n      'stroke-width': '0',\n    });\n  };\n\n  module.initGreenInRegulation = function (divId, percHit, percMiss) {\n    // check if a div with divId exists\n    if ($(`#${divId}`).length === 0) return;\n\n    $(`#${divId}`).empty();\n\n    const paper = Raphael(divId, paperW, paperH);\n    let target;\n\n    const missed = paper.circle((paperW / 2), graphBaseLineY - 50, 50);\n    missed.attr({\n      fill: '#D0D2D6',\n      'stroke-width': '0',\n    });\n    const drawTo = percHit * 3.6 - 90;\n\n    if (drawTo > 269) {\n      target = paper.circle((paperW / 2), graphBaseLineY - 50, 60);\n    } else {\n      target = paper.circularArc((paperW / 2), graphBaseLineY - 50, 60, -90, drawTo);\n    }\n    target.attr({\n      fill: '#3651F1',\n      'stroke-width': '0',\n    });\n  };\n\n  module.initPuttingAverages = function (divId, puttsHole, puttsGir) {\n    // check if a div with divId exists\n    if ($(`#${divId}`).length === 0) return;\n\n    $(`#${divId}`).empty();\n\n    const paper = Raphael(divId, paperW, paperH);\n\n    const percHole = puttsHole * 140 / 4;\n    const percGir = puttsGir * 140 / 4;\n\n    const path1 = paper.path(`M0 ${graphBaseLineY} L${paperW} ${graphBaseLineY}`).attr({\n      stroke: '#F3F3F4',\n      'stroke-width': 1,\n    });\n    const path2 = paper.path(`M0 ${(graphBaseLineY - 140 / 2)} L${paperW} ${(graphBaseLineY - 140 / 2)}`).attr({\n      stroke: '#F3F3F4',\n      'stroke-width': 1,\n    });\n    const path3 = paper.path(`M0 ${(graphBaseLineY - 140)} L${paperW} ${(graphBaseLineY - 140)}`).attr({\n      stroke: '#F3F3F4',\n      'stroke-width': 1,\n    });\n\n    const text1 = paper.text(3, graphBaseLineY - 6, 1).attr({\n      fill: '#ACB0B7',\n      'font-size': 12,\n    });\n\n    const text2 = paper.text(3, (graphBaseLineY - 136 / 2) - 10, 2).attr({\n      fill: '#ACB0B7',\n      'font-size': 12,\n    });\n    const text3 = paper.text(3, (graphBaseLineY - 136) - 10, 3).attr({\n      fill: '#ACB0B7',\n      'font-size': 12,\n    });\n\n    $('tspan').attr('dy', 0);\n\n    const pathsHole = paper.rect(44, graphBaseLineY - percHole, 90, percHole);\n    pathsHole.attr({\n      fill: '#3651F1',\n      'stroke-width': '0',\n    });\n\n    const pathsGir = paper.rect(146, graphBaseLineY - percGir, 90, percGir);\n    pathsGir.attr({\n      fill: '#3651F1',\n      'stroke-width': '0',\n    });\n  };\n\n  module.initScoresByPar = function (divId, scorePar3, scorePar4, scorePar5) {\n    // check if a div with divId exists\n    if ($(`#${divId}`).length === 0) return;\n\n    $(`#${divId}`).empty();\n\n    // calculate percentages based on chart maximum and minimum values\n    // cap results to between -2 and +2.5\n    const percPar3 = ((Math.max(Math.min(scorePar3 - 3, 2.5), -2) + 2)) / 4 * 140;\n    const percPar4 = ((Math.max(Math.min(scorePar4 - 4, 2.5), -2) + 2)) / 4 * 140;\n    const percPar5 = ((Math.max(Math.min(scorePar5 - 5, 2.5), -2) + 2)) / 4 * 140;\n\n    const paper = Raphael(divId, paperW, paperH);\n\n    const path1 = paper.path(`M0 ${graphBaseLineY} L${paperW} ${graphBaseLineY}`).attr({\n      stroke: '#F3F3F4',\n      'stroke-width': 1,\n    });\n    const path2 = paper.path(`M0 ${(graphBaseLineY - 140 / 2)} L${paperW} ${(graphBaseLineY - 140 / 2)}`).attr({\n      stroke: '#F3F3F4',\n      'stroke-width': 1,\n    });\n    const path3 = paper.path(`M0 ${(graphBaseLineY - 140)} L${paperW} ${(graphBaseLineY - 140)}`).attr({\n      stroke: '#F3F3F4',\n      'stroke-width': 1,\n    });\n\n    const text1 = paper.text(10, graphBaseLineY - 6, '-2').attr({\n      fill: '#ACB0B7',\n      'font-size': 12,\n    });\n\n    const text2 = paper.text(10, (graphBaseLineY - 136 / 2) - 10, 'E').attr({\n      fill: '#ACB0B7',\n      'font-size': 12,\n    });\n    const text3 = paper.text(10, (graphBaseLineY - 136) - 10, '+2').attr({\n      fill: '#ACB0B7',\n      'font-size': 12,\n    });\n\n    $('tspan').attr('dy', 0);\n\n    const pathsPar3 = paper.rect(34, graphBaseLineY - percPar3, 64, percPar3);\n\n    pathsPar3.attr({\n      fill: '#3651F1',\n      'stroke-width': '0',\n    });\n\n    const pathsPar4 = paper.rect(34 + 64 + 10, graphBaseLineY - percPar4, 64, percPar4);\n    pathsPar4.attr({\n      fill: '#3651F1',\n      'stroke-width': '0',\n    });\n\n    const pathsPar5 = paper.rect(34 + 128 + 20, graphBaseLineY - percPar5, 64, percPar5);\n    pathsPar5.attr({\n      fill: '#3651F1',\n      'stroke-width': '0',\n    });\n  };\n\n  module.initRecoveryPerformance = function (divId, percUpAndDowns, percScrambling, percSandSaves) {\n    const origin = 28;\n    const size = 68;\n    const middle = 10;\n\n    // check if a div with divId exists\n    if ($(`#${divId}`).length === 0) return;\n\n    $(`#${divId}`).empty();\n\n    const paper = Raphael(divId, paperW, paperH);\n\n    const perUpDwn = percUpAndDowns * 140 / 100;\n    const perScram = percScrambling * 140 / 100;\n    const perSaves = percSandSaves * 140 / 100;\n\n    const path1 = paper.path(`M0 ${graphBaseLineY} L${paperW} ${graphBaseLineY}`).attr({\n      stroke: '#F3F3F4',\n      'stroke-width': 1,\n    });\n    const path3 = paper.path(`M0 ${(graphBaseLineY - 140)} L${paperW} ${(graphBaseLineY - 140)}`).attr({\n      stroke: '#F3F3F4',\n      'stroke-width': 1,\n    });\n\n    const text1 = paper.text(3, graphBaseLineY - 6, 0).attr({\n      fill: '#ACB0B7',\n      'font-size': 12,\n    });\n    const text3 = paper.text(10, (graphBaseLineY - 136) - 10, 100).attr({\n      fill: '#ACB0B7',\n      'font-size': 12,\n    });\n\n    $('tspan').attr('dy', 0);\n\n    const pathUpAndDown = paper.rect(origin, graphBaseLineY - perUpDwn, size, perUpDwn);\n    pathUpAndDown.attr({\n      fill: '#3651F1',\n      'stroke-width': '0',\n    });\n\n    const pathScram = paper.rect(origin + size + middle, graphBaseLineY - perScram, size, perScram);\n    pathScram.attr({\n      fill: '#3651F1',\n      'stroke-width': '0',\n    });\n\n    const pathSaves = paper.rect(origin + size * 2 + middle * 2, graphBaseLineY - perSaves, size, perSaves);\n    pathSaves.attr({\n      fill: '#3651F1',\n      'stroke-width': '0',\n    });\n  };\n\n  module.initScores = function (divId, percEagle, percBirdie, percPar, percBogey, perc2Bogey) {\n    // check if a div with divId exists\n    if ($(`#${divId}`).length === 0) return;\n\n    $(`#${divId}`).empty();\n\n    const paper = Raphael(divId, paperW, paperH);\n    const originX = 18;\n    const bardist = 6;\n    const barW = 44;\n\n    const per2Bogey = perc2Bogey * 140 / 100;\n    const perBogey = percBogey * 140 / 100;\n    const perPar = percPar * 140 / 100;\n    const perBirdie = percBirdie * 140 / 100;\n    const perEagle = percEagle * 140 / 100;\n\n    const path1 = paper.path(`M0 ${graphBaseLineY} L${paperW} ${graphBaseLineY}`).attr({\n      stroke: '#F3F3F4',\n      'stroke-width': 1,\n    });\n    const path3 = paper.path(`M0 ${(graphBaseLineY - 140)} L${paperW} ${(graphBaseLineY - 140)}`).attr({\n      stroke: '#F3F3F4',\n      'stroke-width': 1,\n    });\n\n    const text1 = paper.text(3, graphBaseLineY - 6, 0).attr({\n      fill: '#ACB0B7',\n      'font-size': 12,\n    });\n    const text3 = paper.text(10, (graphBaseLineY - 136) - 10, 100).attr({\n      fill: '#ACB0B7',\n      'font-size': 12,\n    });\n\n    $('tspan').attr('dy', 0);\n\n    const pathEagle = paper.rect(originX, graphBaseLineY - perEagle, barW, perEagle).attr({\n      fill: '#B4E14E',\n      'stroke-width': '0',\n    });\n    const pathBirdie = paper.rect(originX + barW + bardist, graphBaseLineY - perBirdie, barW, perBirdie).attr({\n      fill: '#F8542C',\n      'stroke-width': '0',\n    });\n    const pathPar = paper.rect(originX + barW * 2 + bardist * 2, graphBaseLineY - perPar, barW, perPar).attr({\n      fill: '#C8CED8',\n      'stroke-width': '0',\n    });\n    const pathBogey = paper.rect(originX + barW * 3 + bardist * 3, graphBaseLineY - perBogey, barW, perBogey).attr({\n      fill: '#113FE5',\n      'stroke-width': '0',\n    });\n    const path2Bogey = paper.rect(originX + barW * 4 + bardist * 4, graphBaseLineY - per2Bogey, barW, per2Bogey).attr({\n      fill: '#707581',\n      'stroke-width': '0',\n    });\n  };\n  return module;\n}());\n"],
  "mappings": "qjBAAA,IAAAA,GAAAC,GAAA,CAAAC,GAAAC,KAAA,EASC,SAA0CC,GAAMC,EAAS,CACtD,OAAOH,IAAY,UAAY,OAAOC,IAAW,SACnDA,GAAO,QAAUE,EAAQ,EAClB,OAAO,QAAW,YAAc,OAAO,IAC9C,OAAO,CAAC,EAAGA,CAAO,EACX,OAAOH,IAAY,SAC1BA,GAAQ,QAAaG,EAAQ,EAE7BD,GAAK,QAAaC,EAAQ,CAC5B,GAAG,OAAQ,UAAW,CACtB,OAAiB,SAASC,GAAS,CAEzB,IAAIC,GAAmB,CAAC,EAGxB,SAASC,EAAoBC,EAAU,CAGtC,GAAGF,GAAiBE,CAAQ,EAC3B,OAAOF,GAAiBE,CAAQ,EAAE,QAGnC,IAAIN,EAASI,GAAiBE,CAAQ,EAAI,CACzC,EAAGA,EACH,EAAG,GACH,QAAS,CAAC,CACX,EAGA,OAAAH,GAAQG,CAAQ,EAAE,KAAKN,EAAO,QAASA,EAAQA,EAAO,QAASK,CAAmB,EAGlFL,EAAO,EAAI,GAGJA,EAAO,OACf,CAIA,OAAAK,EAAoB,EAAIF,GAGxBE,EAAoB,EAAID,GAGxBC,EAAoB,EAAI,SAASN,EAASQ,EAAMC,EAAQ,CACnDH,EAAoB,EAAEN,EAASQ,CAAI,GACtC,OAAO,eAAeR,EAASQ,EAAM,CAAE,WAAY,GAAM,IAAKC,CAAO,CAAC,CAExE,EAGAH,EAAoB,EAAI,SAASN,EAAS,CACtC,OAAO,OAAW,KAAe,OAAO,aAC1C,OAAO,eAAeA,EAAS,OAAO,YAAa,CAAE,MAAO,QAAS,CAAC,EAEvE,OAAO,eAAeA,EAAS,aAAc,CAAE,MAAO,EAAK,CAAC,CAC7D,EAOAM,EAAoB,EAAI,SAASI,EAAOC,EAAM,CAG7C,GAFGA,EAAO,IAAGD,EAAQJ,EAAoBI,CAAK,GAC3CC,EAAO,GACNA,EAAO,GAAM,OAAOD,GAAU,UAAYA,GAASA,EAAM,WAAY,OAAOA,EAChF,IAAIE,EAAK,OAAO,OAAO,IAAI,EAG3B,GAFAN,EAAoB,EAAEM,CAAE,EACxB,OAAO,eAAeA,EAAI,UAAW,CAAE,WAAY,GAAM,MAAOF,CAAM,CAAC,EACpEC,EAAO,GAAK,OAAOD,GAAS,SAAU,QAAQG,KAAOH,EAAOJ,EAAoB,EAAEM,EAAIC,EAAK,SAASA,EAAK,CAAE,OAAOH,EAAMG,CAAG,CAAG,EAAE,KAAK,KAAMA,CAAG,CAAC,EAClJ,OAAOD,CACR,EAGAN,EAAoB,EAAI,SAASL,EAAQ,CACxC,IAAIQ,EAASR,GAAUA,EAAO,WAC7B,UAAsB,CAAE,OAAOA,EAAO,OAAY,EAClD,UAA4B,CAAE,OAAOA,CAAQ,EAC9C,OAAAK,EAAoB,EAAEG,EAAQ,IAAKA,CAAM,EAClCA,CACR,EAGAH,EAAoB,EAAI,SAASQ,EAAQC,EAAU,CAAE,OAAO,OAAO,UAAU,eAAe,KAAKD,EAAQC,CAAQ,CAAG,EAGpHT,EAAoB,EAAI,GAIjBA,EAAoBA,EAAoB,EAAI,sBAAsB,CAC1E,EAEC,CAEJ,uBAKC,SAASL,GAAQD,GAASM,EAAqB,CAEtD,IAAIU,EAA8BC,EAAgCD,EAA+B,CAACV,EAA0C,uBAAuB,EAAGA,EAAyC,sBAAsB,EAAGA,EAAyC,sBAAsB,CAAC,EAAGW,EAAiC,SAASC,EAAG,CAEpV,OAAOA,CAEX,EAAG,MAAMlB,GAASgB,CAA4B,EAC1CC,IAAkC,SAAchB,GAAO,QAAUgB,EAE/D,EAEA,wBAKC,SAAShB,GAAQD,GAASM,EAAqB,CAEtD,IAAIU,EAA8BC,EAAgCD,EAA+B,CAACV,EAA+B,mCAAmC,CAAC,EAAGW,EAAiC,SAASE,EAAK,CAoDnN,SAASD,EAAEE,EAAO,CACd,GAAIF,EAAE,GAAGE,EAAO,UAAU,EACtB,OAAOC,EAASD,EAAM,EAAID,EAAI,GAAG,kBAAmBC,CAAK,EACtD,GAAIF,EAAE,GAAGE,EAAOE,EAAK,EACxB,OAAOJ,EAAE,QAAQ,OAAOK,EAAK,EAAEL,EAAGE,EAAM,OAAO,EAAG,EAAIF,EAAE,GAAGE,EAAM,CAAC,EAAGI,EAAE,CAAC,CAAC,EAAE,IAAIJ,CAAK,EAEpF,IAAIK,EAAO,MAAM,UAAU,MAAM,KAAK,UAAW,CAAC,EAClD,GAAIP,EAAE,GAAGO,EAAKA,EAAK,OAAS,CAAC,EAAG,UAAU,EAAG,CACzC,IAAIC,EAAID,EAAK,IAAI,EACjB,OAAOJ,EAASK,EAAE,KAAKR,EAAE,QAAQ,OAAOK,EAAK,EAAEL,EAAGO,CAAI,CAAC,EAAIN,EAAI,GAAG,kBAAmB,UAAY,CAC7FO,EAAE,KAAKR,EAAE,QAAQ,OAAOK,EAAK,EAAEL,EAAGO,CAAI,CAAC,CAC3C,CAAC,CACL,KACI,QAAOP,EAAE,QAAQ,OAAOK,EAAK,EAAEL,EAAG,SAAS,CAGvD,CACAA,EAAE,QAAU,QACZA,EAAE,IAAMC,EACR,IAAIE,EACAM,EAAY,QACZC,GAAW,CAAC,OAAQ,EAAG,KAAM,EAAG,KAAM,EAAG,QAAS,EAAG,KAAM,EAAG,MAAO,CAAC,EACtEC,EAAW,aACXC,GAAQ,YACRC,GAAM,iBACNC,EAAI,CACA,IAAK,SACL,IAAK,MACT,EACAC,GAAa,CACT,IAAK,OAAO,UAAUF,EAAG,EAAE,KAAKC,EAAE,IAAK,SAAS,EAChD,GAAIA,EAAE,IAAI,OACd,EACAE,GAAQ,UAAY,CAiChB,KAAK,GAAK,KAAK,iBAAmB,CAAC,CACvC,EACAC,GACAC,GAAc,cACdb,GAAQ,QACRc,EAAS,SAETC,GAAiB,iBAAkB,QAAW,OAAO,YAAc,OAAO,eAAiB,oBAAoB,cAC/G,EAAI,GACJC,EAAI,IACJC,EAAM,OACNC,GAAQ,QACRC,EAAS,0GAA0GD,EAAK,EAAEF,CAAC,EAC3HI,GAAW,CACP,UAAW,aACX,UAAW,YACX,QAAS,UACb,EACAC,GAAYJ,EAAI,UAAU,YAC1BK,EAAO,KACPC,EAAOD,EAAK,IACZE,EAAOF,EAAK,IACZG,EAAMH,EAAK,IACXI,GAAMJ,EAAK,IACXK,GAAKL,EAAK,GACVrB,GAAK,SACL2B,GAAS,SACT7B,GAAQ,QACR8B,EAAW,WACXC,EAAa,OACbC,EAAiB,OAAO,UAAU,SAClCC,EAAQ,CAAC,EACTC,EAAO,OACPC,EAAQvC,EAAE,OAAS,4BACnBwC,EAAe,mTACfC,EAAQ,CAAC,IAAO,EAAG,SAAY,EAAG,YAAa,CAAC,EAChDC,EAAW,yDACXC,EAAQhB,EAAK,MACbiB,EAAe,eACfC,EAAU,WACVC,EAAQ,SACRC,GAAYzB,EAAI,UAAU,YAC1B0B,GAAiBhD,EAAE,gBAAkB,CACjC,YAAa,OACb,cAAe,OACf,KAAM,EACN,YAAa,cACb,OAAQ,UACR,GAAI,EACJ,GAAI,EACJ,KAAM,OACN,eAAgB,EAChB,KAAM,eACN,cAAe,UACf,YAAa,KACb,aAAc,SACd,cAAe,IACf,SAAU,EACV,OAAQ,EACR,KAAM,wBACN,iBAAkB,EAClB,QAAS,EACT,KAAM,OACN,EAAG,EACH,GAAI,EACJ,GAAI,EACJ,IAAK,GACL,OAAQ,OACR,mBAAoB,GACpB,iBAAkB,OAClB,kBAAmB,OACnB,oBAAqB,EACrB,iBAAkB,EAClB,eAAgB,EAChB,OAAQ,SACR,cAAe,SACf,MAAO,UACP,UAAW,GACX,MAAO,EACP,EAAG,EACH,EAAG,EACH,MAAS,EACb,EACAiD,GAAqBjD,EAAE,oBAAsB,CACzC,KAAMM,GACN,YAAa,MACb,GAAIA,GACJ,GAAIA,GACJ,KAAM,SACN,eAAgBA,GAChB,YAAaA,GACb,OAAQA,GACR,QAASA,GACT,KAAM,OACN,EAAGA,GACH,GAAIA,GACJ,GAAIA,GACJ,OAAQ,SACR,iBAAkBA,GAClB,eAAgBA,GAChB,UAAW,YACX,MAAOA,GACP,EAAGA,GACH,EAAGA,EACP,EACA4C,GAAa,8IACbC,GAAc,0RACdC,GAAO,CAAC,GAAI,EAAG,GAAI,CAAC,EACpBC,GAAM,yBACNC,GAAc,udACdC,GAAW,gdACXC,GAAa,yTACbC,GAAkBzD,EAAE,iBAAmB,sTACvC0D,GAAS,CAAC,EACVC,GAAY,SAAUC,EAAGC,EAAG,CACxB,OAAOD,EAAE,IAAMC,EAAE,GACrB,EACAC,GAAe,SAAUF,EAAGC,EAAG,CAC3B,OAAOhB,EAAQe,CAAC,EAAIf,EAAQgB,CAAC,CACjC,EACAE,GAAM,UAAY,CAAC,EACnBC,GAAO,SAAUC,EAAG,CAChB,OAAOA,CACX,EACAC,GAAWlE,EAAE,UAAY,SAAUiE,EAAGE,EAAGC,EAAGC,EAAGC,EAAG,CAC9C,OAAIA,EACO,CAAC,CAAC,IAAKL,EAAIK,EAAGH,CAAC,EAAG,CAAC,IAAKC,EAAIE,EAAI,EAAG,CAAC,EAAG,CAAC,IAAKA,EAAGA,EAAG,EAAG,EAAG,EAAGA,EAAGA,CAAC,EAAG,CAAC,IAAK,EAAGD,EAAIC,EAAI,CAAC,EAAG,CAAC,IAAKA,EAAGA,EAAG,EAAG,EAAG,EAAG,CAACA,EAAGA,CAAC,EAAG,CAAC,IAAKA,EAAI,EAAIF,EAAG,CAAC,EAAG,CAAC,IAAKE,EAAGA,EAAG,EAAG,EAAG,EAAG,CAACA,EAAG,CAACA,CAAC,EAAG,CAAC,IAAK,EAAGA,EAAI,EAAID,CAAC,EAAG,CAAC,IAAKC,EAAGA,EAAG,EAAG,EAAG,EAAGA,EAAG,CAACA,CAAC,EAAG,CAAC,GAAG,CAAC,EAEnO,CAAC,CAAC,IAAKL,EAAGE,CAAC,EAAG,CAAC,IAAKC,EAAG,CAAC,EAAG,CAAC,IAAK,EAAGC,CAAC,EAAG,CAAC,IAAK,CAACD,EAAG,CAAC,EAAG,CAAC,GAAG,CAAC,CACtE,EACAG,GAAc,SAAUN,EAAGE,EAAGK,EAAIC,EAAI,CAClC,OAAIA,GAAM,OACNA,EAAKD,GAEF,CAAC,CAAC,IAAKP,EAAGE,CAAC,EAAG,CAAC,IAAK,EAAG,CAACM,CAAE,EAAG,CAAC,IAAKD,EAAIC,EAAI,EAAG,EAAG,EAAG,EAAG,EAAIA,CAAE,EAAG,CAAC,IAAKD,EAAIC,EAAI,EAAG,EAAG,EAAG,EAAG,GAAKA,CAAE,EAAG,CAAC,GAAG,CAAC,CACpH,EACAC,GAAU1E,EAAE,SAAW,CACnB,KAAM,SAAU2E,EAAI,CAChB,OAAOA,EAAG,KAAK,MAAM,CACzB,EACA,OAAQ,SAAUA,EAAI,CAClB,IAAIf,EAAIe,EAAG,MACX,OAAOJ,GAAYX,EAAE,GAAIA,EAAE,GAAIA,EAAE,CAAC,CACtC,EACA,QAAS,SAAUe,EAAI,CACnB,IAAIf,EAAIe,EAAG,MACX,OAAOJ,GAAYX,EAAE,GAAIA,EAAE,GAAIA,EAAE,GAAIA,EAAE,EAAE,CAC7C,EACA,KAAM,SAAUe,EAAI,CAChB,IAAIf,EAAIe,EAAG,MACX,OAAOT,GAASN,EAAE,EAAGA,EAAE,EAAGA,EAAE,MAAOA,EAAE,OAAQA,EAAE,CAAC,CACpD,EACA,MAAO,SAAUe,EAAI,CACjB,IAAIf,EAAIe,EAAG,MACX,OAAOT,GAASN,EAAE,EAAGA,EAAE,EAAGA,EAAE,MAAOA,EAAE,MAAM,CAC/C,EACA,KAAM,SAAUe,EAAI,CAChB,IAAIC,EAAOD,EAAG,SAAS,EACvB,OAAOT,GAASU,EAAK,EAAGA,EAAK,EAAGA,EAAK,MAAOA,EAAK,MAAM,CAC3D,EACA,IAAM,SAASD,EAAI,CACf,IAAIC,EAAOD,EAAG,SAAS,EACvB,OAAOT,GAASU,EAAK,EAAGA,EAAK,EAAGA,EAAK,MAAOA,EAAK,MAAM,CAC3D,CACJ,EAWAC,GAAU7E,EAAE,QAAU,SAAU8E,EAAMC,EAAQ,CAC1C,GAAI,CAACA,EACD,OAAOD,EAEX,IAAIb,EAAGE,EAAGa,EAAGC,EAAGC,EAAIC,EAAIC,EAExB,IADAN,EAAOO,GAAWP,CAAI,EACjBE,EAAI,EAAGE,EAAKJ,EAAK,OAAQE,EAAIE,EAAIF,IAElC,IADAI,EAAQN,EAAKE,CAAC,EACTC,EAAI,EAAGE,EAAKC,EAAM,OAAQH,EAAIE,EAAIF,GAAK,EACxChB,EAAIc,EAAO,EAAEK,EAAMH,CAAC,EAAGG,EAAMH,EAAI,CAAC,CAAC,EACnCd,EAAIY,EAAO,EAAEK,EAAMH,CAAC,EAAGG,EAAMH,EAAI,CAAC,CAAC,EACnCG,EAAMH,CAAC,EAAIhB,EACXmB,EAAMH,EAAI,CAAC,EAAId,EAGvB,OAAOW,CACX,EAUJ,GARA9E,EAAE,GAAKc,EAOPd,EAAE,KAAQc,EAAE,IAAI,UAAYA,EAAE,IAAI,eAAe,WAAW,oDAAqD,KAAK,EAAI,MAAQ,MAC9Hd,EAAE,MAAQ,MAAO,CACjB,IAAIsF,GAAIxE,EAAE,IAAI,cAAc,KAAK,EAC7B+C,GAIJ,GAHAyB,GAAE,UAAY,qBACdzB,GAAIyB,GAAE,WACNzB,GAAE,MAAM,SAAW,oBACf,EAAEA,IAAK,OAAOA,GAAE,KAAO,UACvB,OAAQ7D,EAAE,KAAO,EAErBsF,GAAI,IACR,CAaAtF,EAAE,IAAM,EAAEA,EAAE,IAAMA,EAAE,MAAQ,OAC5BA,EAAE,OAASgB,GA2BXhB,EAAE,GAAKiB,GAAaD,GAAM,UAAYhB,EAAE,UACxCA,EAAE,IAAM,EAWRA,EAAE,GAAK,SAAUuF,EAAGC,EAAM,CAEtB,OADAA,EAAO9D,GAAU,KAAK8D,CAAI,EACtBA,GAAQ,SACD,CAAC/C,EAAM5B,EAAG,EAAE,CAAC0E,CAAC,EAErBC,GAAQ,QACDD,aAAa,MAEfC,GAAQ,QAAUD,IAAM,MACxBC,GAAQ,OAAOD,GAAKA,IAAM,MAC1BC,GAAQ,UAAYD,IAAM,OAAOA,CAAC,GAClCC,GAAQ,SAAW,MAAM,SAAW,MAAM,QAAQD,CAAC,GACpDnD,EAAe,KAAKmD,CAAC,EAAE,MAAM,EAAG,EAAE,EAAE,YAAY,GAAKC,CACjE,EAEA,SAASC,GAAMC,EAAK,CAChB,GAAI,OAAOA,GAAO,YAAc,OAAOA,CAAG,IAAMA,EAC5C,OAAOA,EAEX,IAAIC,EAAM,IAAID,EAAI,YAClB,QAAS/F,KAAO+F,EAASA,EAAI7E,EAAG,EAAElB,CAAG,IACjCgG,EAAIhG,CAAG,EAAI8F,GAAMC,EAAI/F,CAAG,CAAC,GAE7B,OAAOgG,CACX,CAgBA3F,EAAE,MAAQ,SAAU4F,EAAIC,EAAIC,EAAIC,EAAIC,EAAIC,EAAI,CACxC,GAAID,GAAM,KAAM,CACZ,IAAI/B,EAAI2B,EAAKE,EACT3B,EAAI0B,EAAKE,EACb,MAAI,CAAC9B,GAAK,CAACE,EACA,GAEH,IAAMxC,EAAK,MAAM,CAACwC,EAAG,CAACF,CAAC,EAAI,IAAMjC,GAAK,KAAO,GACzD,KACI,QAAOhC,EAAE,MAAM4F,EAAIC,EAAIG,EAAIC,CAAE,EAAIjG,EAAE,MAAM8F,EAAIC,EAAIC,EAAIC,CAAE,CAE/D,EAUAjG,EAAE,IAAM,SAAUkG,EAAK,CACnB,OAAOA,EAAM,IAAMlE,GAAK,GAC5B,EAUAhC,EAAE,IAAM,SAAUmG,EAAK,CACnB,OAAO,KAAK,MAAQA,EAAM,IAAMnE,GAAI,IAAM,GAAI,EAAI,GACtD,EAYAhC,EAAE,OAAS,SAAUoG,EAAQ5G,EAAO6G,EAAW,CAE3C,GADAA,EAAYrG,EAAE,GAAGqG,EAAW,QAAQ,EAAIA,EAAY,GAChDrG,EAAE,GAAGoG,EAAQhG,EAAK,GAElB,QADI,EAAIgG,EAAO,OACR,KAAK,GAAItE,EAAIsE,EAAO,CAAC,EAAI5G,CAAK,GAAK6G,EACtC,OAAOD,EAAO,CAAC,MAEhB,CACHA,EAAS,CAACA,EACV,IAAIE,EAAM9G,EAAQ4G,EAClB,GAAIE,EAAMD,EACN,OAAO7G,EAAQ8G,EAEnB,GAAIA,EAAMF,EAASC,EACf,OAAO7G,EAAQ8G,EAAMF,CAE7B,CACA,OAAO5G,CACX,EAQA,IAAI+G,GAAavG,EAAE,WAAc,SAAUwG,EAAWC,EAAc,CAChE,OAAO,UAAY,CACf,MAAO,uCAAuC,QAAQD,EAAWC,CAAY,EAAE,YAAY,CAC/F,CACJ,EAAG,QAAS,SAAUC,EAAG,CACrB,IAAIpC,EAAI3C,EAAK,OAAO,EAAI,GAAK,EACzBgF,EAAID,GAAK,IAAMpC,EAAKA,EAAI,EAAI,EAChC,OAAOqC,EAAE,SAAS,EAAE,CACxB,CAAC,EAUD3G,EAAE,UAAY,SAAU4G,EAAQ,CAC5B3G,EAAI,oBAAqBD,EAAGc,EAAE,IAAK8F,CAAM,EACzC9F,EAAE,IAAM8F,EACR9F,EAAE,IAAMA,EAAE,IAAI,SACVd,EAAE,QAAQ,SACVA,EAAE,QAAQ,QAAQc,EAAE,GAAG,CAE/B,EACA,IAAI+F,GAAQ,SAAUC,EAAO,CACzB,GAAI9G,EAAE,IAAK,CAEP,IAAI+G,EAAO,aACPC,EACJ,GAAI,CACA,IAAIC,EAAQ,IAAI,cAAc,UAAU,EACxCA,EAAM,MAAM,QAAQ,EACpBA,EAAM,MAAM,EACZD,EAAMC,EAAM,IAChB,MAAW,CACPD,EAAM,YAAY,EAAE,SAAS,IACjC,CACA,IAAIE,EAAQF,EAAI,gBAAgB,EAChCH,GAAQM,GAAO,SAAUL,EAAO,CAC5B,GAAI,CACAE,EAAI,MAAM,MAAQ1F,EAAIwF,CAAK,EAAE,QAAQC,EAAM,CAAC,EAC5C,IAAIvH,EAAQ0H,EAAM,kBAAkB,WAAW,EAC/C,OAAA1H,GAAUA,EAAQ,MAAQ,GAAOA,EAAQ,OAAWA,EAAQ,YAAc,GACnE,KAAO,SAAWA,EAAM,SAAS,EAAE,GAAG,MAAM,EAAE,CACzD,MAAW,CACP,MAAO,MACX,CACJ,CAAC,CACL,KAAO,CACH,IAAIwF,EAAIlE,EAAE,IAAI,cAAc,GAAG,EAC/BkE,EAAE,MAAQ,2BACVA,EAAE,MAAM,QAAU,OAClBlE,EAAE,IAAI,KAAK,YAAYkE,CAAC,EACxB6B,GAAQM,GAAO,SAAUL,EAAO,CAC5B,OAAA9B,EAAE,MAAM,MAAQ8B,EACThG,EAAE,IAAI,YAAY,iBAAiBkE,EAAG,CAAC,EAAE,iBAAiB,OAAO,CAC5E,CAAC,CACL,CACA,OAAO6B,GAAMC,CAAK,CACtB,EACAM,GAAc,UAAY,CACtB,MAAO,OAAS,CAAC,KAAK,EAAG,KAAK,EAAG,KAAK,CAAC,EAAI,GAC/C,EACAC,GAAc,UAAY,CACtB,MAAO,OAAS,CAAC,KAAK,EAAG,KAAK,EAAG,KAAK,CAAC,EAAI,GAC/C,EACAC,GAAc,UAAY,CACtB,OAAO,KAAK,GAChB,EACAC,GAAa,SAAUjD,EAAGxD,EAAG+C,EAAG,CAM5B,GALI/C,GAAK,MAAQd,EAAE,GAAGsE,EAAG,QAAQ,GAAK,MAAOA,GAAK,MAAOA,GAAK,MAAOA,IACjET,EAAIS,EAAE,EACNxD,EAAIwD,EAAE,EACNA,EAAIA,EAAE,GAENxD,GAAK,MAAQd,EAAE,GAAGsE,EAAGrC,EAAM,EAAG,CAC9B,IAAIuF,EAAMxH,EAAE,OAAOsE,CAAC,EACpBA,EAAIkD,EAAI,EACR1G,EAAI0G,EAAI,EACR3D,EAAI2D,EAAI,CACZ,CACA,OAAIlD,EAAI,GAAKxD,EAAI,GAAK+C,EAAI,KACtBS,GAAK,IACLxD,GAAK,IACL+C,GAAK,KAGF,CAACS,EAAGxD,EAAG+C,CAAC,CACnB,EACA4D,GAAa,SAAUnD,EAAGxD,EAAG+C,EAAG0B,EAAG,CAC/BjB,GAAK,IACLxD,GAAK,IACL+C,GAAK,IACL,IAAI6D,EAAM,CACN,EAAGpD,EACH,EAAGxD,EACH,EAAG+C,EACH,IAAK7D,EAAE,IAAIsE,EAAGxD,EAAG+C,CAAC,EAClB,SAAUyD,EACd,EACA,OAAAtH,EAAE,GAAGuF,EAAG,QAAQ,IAAMmC,EAAI,QAAUnC,GAC7BmC,CACX,EAsBA1H,EAAE,MAAQ,SAAUwH,EAAK,CACrB,IAAIE,EACJ,OAAI1H,EAAE,GAAGwH,EAAK,QAAQ,GAAK,MAAOA,GAAO,MAAOA,GAAO,MAAOA,GAC1DE,EAAM1H,EAAE,QAAQwH,CAAG,EACnBA,EAAI,EAAIE,EAAI,EACZF,EAAI,EAAIE,EAAI,EACZF,EAAI,EAAIE,EAAI,EACZF,EAAI,IAAME,EAAI,KACP1H,EAAE,GAAGwH,EAAK,QAAQ,GAAK,MAAOA,GAAO,MAAOA,GAAO,MAAOA,GACjEE,EAAM1H,EAAE,QAAQwH,CAAG,EACnBA,EAAI,EAAIE,EAAI,EACZF,EAAI,EAAIE,EAAI,EACZF,EAAI,EAAIE,EAAI,EACZF,EAAI,IAAME,EAAI,MAEV1H,EAAE,GAAGwH,EAAK,QAAQ,IAClBA,EAAMxH,EAAE,OAAOwH,CAAG,GAElBxH,EAAE,GAAGwH,EAAK,QAAQ,GAAK,MAAOA,GAAO,MAAOA,GAAO,MAAOA,GAC1DE,EAAM1H,EAAE,QAAQwH,CAAG,EACnBA,EAAI,EAAIE,EAAI,EACZF,EAAI,EAAIE,EAAI,EACZF,EAAI,EAAIE,EAAI,EACZA,EAAM1H,EAAE,QAAQwH,CAAG,EACnBA,EAAI,EAAIE,EAAI,IAEZF,EAAM,CAAC,IAAK,MAAM,EAClBA,EAAI,EAAIA,EAAI,EAAIA,EAAI,EAAIA,EAAI,EAAIA,EAAI,EAAIA,EAAI,EAAIA,EAAI,EAAI,KAGhEA,EAAI,SAAWF,GACRE,CACX,EAkBAxH,EAAE,QAAU,SAAUqE,EAAGsD,EAAGhB,EAAGpB,EAAG,CAC1B,KAAK,GAAGlB,EAAG,QAAQ,GAAK,MAAOA,GAAK,MAAOA,GAAK,MAAOA,IACvDsC,EAAItC,EAAE,EACNsD,EAAItD,EAAE,EACNkB,EAAIlB,EAAE,EACNA,EAAIA,EAAE,GAEVA,GAAK,IACL,IAAIrE,EAAG4H,EAAGC,EAAGC,EAAGC,EAChB,OAAA1D,EAAKA,EAAI,IAAO,GAChB0D,EAAIpB,EAAIgB,EACRG,EAAIC,GAAK,EAAIjG,EAAIuC,EAAI,EAAI,CAAC,GAC1BrE,EAAI4H,EAAIC,EAAIlB,EAAIoB,EAEhB1D,EAAI,CAAC,CAACA,EACNrE,GAAK,CAAC+H,EAAGD,EAAG,EAAG,EAAGA,EAAGC,CAAC,EAAE1D,CAAC,EACzBuD,GAAK,CAACE,EAAGC,EAAGA,EAAGD,EAAG,EAAG,CAAC,EAAEzD,CAAC,EACzBwD,GAAK,CAAC,EAAG,EAAGC,EAAGC,EAAGA,EAAGD,CAAC,EAAEzD,CAAC,EAClBoD,GAAWzH,EAAG4H,EAAGC,EAAGtC,CAAC,CAChC,EAkBAvF,EAAE,QAAU,SAAUqE,EAAGsD,EAAGK,EAAGzC,EAAG,CAC1B,KAAK,GAAGlB,EAAG,QAAQ,GAAK,MAAOA,GAAK,MAAOA,GAAK,MAAOA,IACvD2D,EAAI3D,EAAE,EACNsD,EAAItD,EAAE,EACNA,EAAIA,EAAE,IAENA,EAAI,GAAKsD,EAAI,GAAKK,EAAI,KACtB3D,GAAK,IACLsD,GAAK,IACLK,GAAK,KAET3D,GAAK,IACL,IAAIrE,EAAG4H,EAAGC,EAAGC,EAAGC,EAChB,OAAA1D,EAAKA,EAAI,IAAO,GAChB0D,EAAI,EAAIJ,GAAKK,EAAI,GAAKA,EAAI,EAAIA,GAC9BF,EAAIC,GAAK,EAAIjG,EAAIuC,EAAI,EAAI,CAAC,GAC1BrE,EAAI4H,EAAIC,EAAIG,EAAID,EAAI,EAEpB1D,EAAI,CAAC,CAACA,EACNrE,GAAK,CAAC+H,EAAGD,EAAG,EAAG,EAAGA,EAAGC,CAAC,EAAE1D,CAAC,EACzBuD,GAAK,CAACE,EAAGC,EAAGA,EAAGD,EAAG,EAAG,CAAC,EAAEzD,CAAC,EACzBwD,GAAK,CAAC,EAAG,EAAGC,EAAGC,EAAGA,EAAGD,CAAC,EAAEzD,CAAC,EAClBoD,GAAWzH,EAAG4H,EAAGC,EAAGtC,CAAC,CAChC,EAiBAvF,EAAE,QAAU,SAAUsE,EAAGxD,EAAG+C,EAAG,CAC3BA,EAAI0D,GAAWjD,EAAGxD,EAAG+C,CAAC,EACtBS,EAAIT,EAAE,CAAC,EACP/C,EAAI+C,EAAE,CAAC,EACPA,EAAIA,EAAE,CAAC,EAEP,IAAIoE,EAAG5G,EAAG6G,EAAGH,EACb,OAAAG,EAAItG,EAAK0C,EAAGxD,EAAG+C,CAAC,EAChBkE,EAAIG,EAAIrG,EAAKyC,EAAGxD,EAAG+C,CAAC,EACpBoE,EAAKF,GAAK,EAAI,KACTG,GAAK5D,GAAKxD,EAAI+C,GAAKkE,EACnBG,GAAKpH,GAAK+C,EAAIS,GAAKyD,EAAI,GACbzD,EAAIxD,GAAKiH,EAAI,EAE5BE,GAAMA,EAAI,KAAO,EAAK,GAAK,IAC3B5G,EAAI0G,GAAK,EAAI,EAAIA,EAAIG,EACd,CAAC,EAAGD,EAAG,EAAG5G,EAAG,EAAG6G,EAAG,SAAUd,EAAW,CACnD,EAiBApH,EAAE,QAAU,SAAUsE,EAAGxD,EAAG+C,EAAG,CAC3BA,EAAI0D,GAAWjD,EAAGxD,EAAG+C,CAAC,EACtBS,EAAIT,EAAE,CAAC,EACP/C,EAAI+C,EAAE,CAAC,EACPA,EAAIA,EAAE,CAAC,EAEP,IAAIoE,EAAG5G,EAAG8G,EAAGC,EAAGC,EAAGN,EACnB,OAAAK,EAAIxG,EAAK0C,EAAGxD,EAAG+C,CAAC,EAChBwE,EAAIxG,EAAKyC,EAAGxD,EAAG+C,CAAC,EAChBkE,EAAIK,EAAIC,EACRJ,EAAKF,GAAK,EAAI,KACTK,GAAK9D,GAAKxD,EAAI+C,GAAKkE,EACnBK,GAAKtH,GAAK+C,EAAIS,GAAKyD,EAAI,GACbzD,EAAIxD,GAAKiH,EAAI,EAC5BE,GAAMA,EAAI,KAAO,EAAK,GAAK,IAC3BE,GAAKC,EAAIC,GAAK,EACdhH,EAAK0G,GAAK,EAAI,EACTI,EAAI,GAAKJ,GAAK,EAAII,GACTJ,GAAK,EAAI,EAAII,GACpB,CAAC,EAAGF,EAAG,EAAG5G,EAAG,EAAG8G,EAAG,SAAUd,EAAW,CACnD,EACArH,EAAE,aAAe,UAAY,CACzB,OAAO,KAAK,KAAK,GAAG,EAAE,QAAQqD,GAAK,IAAI,CAC3C,EACA,SAASiF,GAAOlI,EAAOmI,EAAM,CACzB,QAASvD,EAAI,EAAGE,EAAK9E,EAAM,OAAQ4E,EAAIE,EAAIF,IAAK,GAAI5E,EAAM4E,CAAC,IAAMuD,EAC7D,OAAOnI,EAAM,KAAKA,EAAM,OAAO4E,EAAG,CAAC,EAAE,CAAC,CAAC,CAE/C,CACA,SAASmC,GAAO3G,EAAGgI,EAAOC,EAAe,CACrC,SAASC,GAAO,CACZ,IAAIC,EAAM,MAAM,UAAU,MAAM,KAAK,UAAW,CAAC,EAC7CpI,EAAOoI,EAAI,KAAK,QAAQ,EACxBC,EAAQF,EAAK,MAAQA,EAAK,OAAS,CAAC,EACpCG,EAAQH,EAAK,MAAQA,EAAK,OAAS,CAAC,EACxC,OAAIE,EAAM/H,EAAG,EAAEN,CAAI,GACf+H,GAAOO,EAAOtI,CAAI,EACXkI,EAAgBA,EAAcG,EAAMrI,CAAI,CAAC,EAAIqI,EAAMrI,CAAI,IAElEsI,EAAM,QAAU,KAAO,OAAOD,EAAMC,EAAM,MAAM,CAAC,EACjDA,EAAM,KAAKtI,CAAI,EACfqI,EAAMrI,CAAI,EAAIC,EAAEH,EAAK,EAAEmI,EAAOG,CAAG,EAC1BF,EAAgBA,EAAcG,EAAMrI,CAAI,CAAC,EAAIqI,EAAMrI,CAAI,EAClE,CACA,OAAOmI,CACX,CAEA,IAAII,GAAU9I,EAAE,SAAW,SAAU+I,EAAKvI,EAAG,CACzC,IAAIwI,EAAMlI,EAAE,IAAI,cAAc,KAAK,EACnCkI,EAAI,MAAM,QAAU,6CACpBA,EAAI,OAAS,UAAY,CACrBxI,EAAE,KAAK,IAAI,EACX,KAAK,OAAS,KACdM,EAAE,IAAI,KAAK,YAAY,IAAI,CAC/B,EACAkI,EAAI,QAAU,UAAY,CACtBlI,EAAE,IAAI,KAAK,YAAY,IAAI,CAC/B,EACAA,EAAE,IAAI,KAAK,YAAYkI,CAAG,EAC1BA,EAAI,IAAMD,CACd,EAEA,SAASE,IAAc,CACnB,OAAO,KAAK,GAChB,CA6BAjJ,EAAE,OAASmH,GAAO,SAAU+B,EAAQ,CAChC,GAAI,CAACA,IAAcA,EAAS5H,EAAI4H,CAAM,GAAG,QAAQ,GAAG,EAAI,EACpD,MAAO,CAAC,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,IAAK,OAAQ,MAAO,EAAG,SAAUD,EAAW,EAE7E,GAAIC,GAAU,OACV,MAAO,CAAC,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,IAAK,OAAQ,SAAUD,EAAW,EAEnE,EAAE7F,GAAKvC,EAAG,EAAEqI,EAAO,YAAY,EAAE,UAAU,EAAG,CAAC,CAAC,GAAKA,EAAO,OAAO,GAAK,OAASA,EAASrC,GAAMqC,CAAM,GACtG,IAAIvD,EACAwD,EACAC,EACAC,EACAC,EACAC,EACAnD,EACAsB,EAAMwB,EAAO,MAAM1G,CAAY,EACnC,OAAIkF,GACIA,EAAI,CAAC,IACL2B,EAAOvG,EAAM4E,EAAI,CAAC,EAAE,UAAU,CAAC,EAAG,EAAE,EACpC0B,EAAQtG,EAAM4E,EAAI,CAAC,EAAE,UAAU,EAAG,CAAC,EAAG,EAAE,EACxCyB,EAAMrG,EAAM4E,EAAI,CAAC,EAAE,UAAU,EAAG,CAAC,EAAG,EAAE,GAEtCA,EAAI,CAAC,IACL2B,EAAOvG,GAAOyG,EAAI7B,EAAI,CAAC,EAAE,OAAO,CAAC,GAAK6B,EAAG,EAAE,EAC3CH,EAAQtG,GAAOyG,EAAI7B,EAAI,CAAC,EAAE,OAAO,CAAC,GAAK6B,EAAG,EAAE,EAC5CJ,EAAMrG,GAAOyG,EAAI7B,EAAI,CAAC,EAAE,OAAO,CAAC,GAAK6B,EAAG,EAAE,GAE1C7B,EAAI,CAAC,IACLtB,EAASsB,EAAI,CAAC,EAAEnG,EAAK,EAAE4B,EAAW,EAClCgG,EAAMtG,EAAQuD,EAAO,CAAC,CAAC,EACvBA,EAAO,CAAC,EAAE,MAAM,EAAE,GAAK,MAAQ+C,GAAO,MACtCC,EAAQvG,EAAQuD,EAAO,CAAC,CAAC,EACzBA,EAAO,CAAC,EAAE,MAAM,EAAE,GAAK,MAAQgD,GAAS,MACxCC,EAAOxG,EAAQuD,EAAO,CAAC,CAAC,EACxBA,EAAO,CAAC,EAAE,MAAM,EAAE,GAAK,MAAQiD,GAAQ,MACvC3B,EAAI,CAAC,EAAE,YAAY,EAAE,MAAM,EAAG,CAAC,GAAK,SAAW4B,EAAUzG,EAAQuD,EAAO,CAAC,CAAC,GAC1EA,EAAO,CAAC,GAAKA,EAAO,CAAC,EAAE,MAAM,EAAE,GAAK,MAAQkD,GAAW,MAEvD5B,EAAI,CAAC,GACLtB,EAASsB,EAAI,CAAC,EAAEnG,EAAK,EAAE4B,EAAW,EAClCgG,EAAMtG,EAAQuD,EAAO,CAAC,CAAC,EACvBA,EAAO,CAAC,EAAE,MAAM,EAAE,GAAK,MAAQ+C,GAAO,MACtCC,EAAQvG,EAAQuD,EAAO,CAAC,CAAC,EACzBA,EAAO,CAAC,EAAE,MAAM,EAAE,GAAK,MAAQgD,GAAS,MACxCC,EAAOxG,EAAQuD,EAAO,CAAC,CAAC,EACxBA,EAAO,CAAC,EAAE,MAAM,EAAE,GAAK,MAAQiD,GAAQ,OACtCjD,EAAO,CAAC,EAAE,MAAM,EAAE,GAAK,OAASA,EAAO,CAAC,EAAE,MAAM,EAAE,GAAK,UAAY+C,GAAO,KAC3EzB,EAAI,CAAC,EAAE,YAAY,EAAE,MAAM,EAAG,CAAC,GAAK,SAAW4B,EAAUzG,EAAQuD,EAAO,CAAC,CAAC,GAC1EA,EAAO,CAAC,GAAKA,EAAO,CAAC,EAAE,MAAM,EAAE,GAAK,MAAQkD,GAAW,KAChDtJ,EAAE,QAAQmJ,EAAKC,EAAOC,EAAMC,CAAO,GAE1C5B,EAAI,CAAC,GACLtB,EAASsB,EAAI,CAAC,EAAEnG,EAAK,EAAE4B,EAAW,EAClCgG,EAAMtG,EAAQuD,EAAO,CAAC,CAAC,EACvBA,EAAO,CAAC,EAAE,MAAM,EAAE,GAAK,MAAQ+C,GAAO,MACtCC,EAAQvG,EAAQuD,EAAO,CAAC,CAAC,EACzBA,EAAO,CAAC,EAAE,MAAM,EAAE,GAAK,MAAQgD,GAAS,MACxCC,EAAOxG,EAAQuD,EAAO,CAAC,CAAC,EACxBA,EAAO,CAAC,EAAE,MAAM,EAAE,GAAK,MAAQiD,GAAQ,OACtCjD,EAAO,CAAC,EAAE,MAAM,EAAE,GAAK,OAASA,EAAO,CAAC,EAAE,MAAM,EAAE,GAAK,UAAY+C,GAAO,KAC3EzB,EAAI,CAAC,EAAE,YAAY,EAAE,MAAM,EAAG,CAAC,GAAK,SAAW4B,EAAUzG,EAAQuD,EAAO,CAAC,CAAC,GAC1EA,EAAO,CAAC,GAAKA,EAAO,CAAC,EAAE,MAAM,EAAE,GAAK,MAAQkD,GAAW,KAChDtJ,EAAE,QAAQmJ,EAAKC,EAAOC,EAAMC,CAAO,IAE9C5B,EAAM,CAACyB,EAAQ,EAAGC,EAAO,EAAGC,EAAM,SAAUJ,EAAW,EACvDvB,EAAI,IAAM,KAAO,SAAW2B,EAAQD,GAAS,EAAMD,GAAO,IAAK,SAAS,EAAE,EAAE,MAAM,CAAC,EACnFnJ,EAAE,GAAGsJ,EAAS,QAAQ,IAAM5B,EAAI,QAAU4B,GACnC5B,IAEJ,CAAC,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,IAAK,OAAQ,MAAO,EAAG,SAAUuB,EAAW,CAC7E,EAAGjJ,CAAC,EAYJA,EAAE,IAAMmH,GAAO,SAAU9C,EAAGsD,EAAG9D,EAAG,CAC9B,OAAO7D,EAAE,QAAQqE,EAAGsD,EAAG9D,CAAC,EAAE,GAC9B,CAAC,EAYD7D,EAAE,IAAMmH,GAAO,SAAU9C,EAAGsD,EAAGK,EAAG,CAC9B,OAAOhI,EAAE,QAAQqE,EAAGsD,EAAGK,CAAC,EAAE,GAC9B,CAAC,EAYDhI,EAAE,IAAMmH,GAAO,SAAU7C,EAAGxD,EAAG+C,EAAG,CAC9B,SAASlB,EAAMsB,EAAG,CAAE,OAAQA,EAAI,GAAO,CAAG,CAC1C,MAAO,KAAO,SAAWtB,EAAMkB,CAAC,EAAKlB,EAAM7B,CAAC,GAAK,EAAM6B,EAAM2B,CAAC,GAAK,IAAK,SAAS,EAAE,EAAE,MAAM,CAAC,CAChG,CAAC,EAUDtE,EAAE,SAAW,SAAUR,EAAO,CAC1B,IAAIgK,EAAQ,KAAK,SAAS,MAAQ,KAAK,SAAS,OAAS,CAAC,EAAG,EAAG,EAAG,EAAG,EAAGhK,GAAS,GAAG,EACjFkI,EAAM,KAAK,QAAQ8B,EAAM,EAAGA,EAAM,EAAGA,EAAM,CAAC,EAChD,OAAAA,EAAM,GAAK,KACPA,EAAM,EAAI,IACVA,EAAM,EAAI,EACVA,EAAM,GAAK,GACXA,EAAM,GAAK,IAAM,KAAK,SAAS,MAAQ,CAAC,EAAG,EAAG,EAAG,EAAG,EAAGA,EAAM,CAAC,IAE3D9B,EAAI,GACf,EAOA1H,EAAE,SAAS,MAAQ,UAAY,CAC3B,OAAO,KAAK,KAChB,EAGA,SAASyJ,GAAkBC,EAAKC,EAAG,CAE/B,QADIrE,EAAI,CAAC,EACA,EAAI,EAAGsE,EAAOF,EAAI,OAAQE,EAAO,EAAI,CAACD,EAAI,EAAG,GAAK,EAAG,CAC1D,IAAIE,EAAI,CACI,CAAC,EAAG,CAACH,EAAI,EAAI,CAAC,EAAG,EAAG,CAACA,EAAI,EAAI,CAAC,CAAC,EAC/B,CAAC,EAAG,CAACA,EAAI,CAAC,EAAO,EAAG,CAACA,EAAI,EAAI,CAAC,CAAC,EAC/B,CAAC,EAAG,CAACA,EAAI,EAAI,CAAC,EAAG,EAAG,CAACA,EAAI,EAAI,CAAC,CAAC,EAC/B,CAAC,EAAG,CAACA,EAAI,EAAI,CAAC,EAAG,EAAG,CAACA,EAAI,EAAI,CAAC,CAAC,CACnC,EACJC,EACK,EAEMC,EAAO,GAAK,EACnBC,EAAE,CAAC,EAAI,CAAC,EAAG,CAACH,EAAI,CAAC,EAAG,EAAG,CAACA,EAAI,CAAC,CAAC,EACvBE,EAAO,GAAK,IACnBC,EAAE,CAAC,EAAI,CAAC,EAAG,CAACH,EAAI,CAAC,EAAG,EAAG,CAACA,EAAI,CAAC,CAAC,EAC9BG,EAAE,CAAC,EAAI,CAAC,EAAG,CAACH,EAAI,CAAC,EAAG,EAAG,CAACA,EAAI,CAAC,CAAC,GAL9BG,EAAE,CAAC,EAAI,CAAC,EAAG,CAACH,EAAIE,EAAO,CAAC,EAAG,EAAG,CAACF,EAAIE,EAAO,CAAC,CAAC,EAQ5CA,EAAO,GAAK,EACZC,EAAE,CAAC,EAAIA,EAAE,CAAC,EACF,IACRA,EAAE,CAAC,EAAI,CAAC,EAAG,CAACH,EAAI,CAAC,EAAG,EAAG,CAACA,EAAI,EAAI,CAAC,CAAC,GAG1CpE,EAAE,KAAK,CAAC,KACD,CAACuE,EAAE,CAAC,EAAE,EAAI,EAAIA,EAAE,CAAC,EAAE,EAAIA,EAAE,CAAC,EAAE,GAAK,GACjC,CAACA,EAAE,CAAC,EAAE,EAAI,EAAIA,EAAE,CAAC,EAAE,EAAIA,EAAE,CAAC,EAAE,GAAK,GACjCA,EAAE,CAAC,EAAE,EAAI,EAAIA,EAAE,CAAC,EAAE,EAAIA,EAAE,CAAC,EAAE,GAAK,GAChCA,EAAE,CAAC,EAAE,EAAI,EAAEA,EAAE,CAAC,EAAE,EAAIA,EAAE,CAAC,EAAE,GAAK,EAC/BA,EAAE,CAAC,EAAE,EACLA,EAAE,CAAC,EAAE,CACX,CAAC,CACL,CAEA,OAAOvE,CACX,CAYAtF,EAAE,gBAAkB,SAAU8J,EAAY,CACtC,GAAI,CAACA,EACD,OAAO,KAEX,IAAIC,EAAMC,GAAMF,CAAU,EAC1B,GAAIC,EAAI,IACJ,OAAOE,GAAUF,EAAI,GAAG,EAG5B,IAAIG,EAAc,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAC,EAC/EC,EAAO,CAAC,EACZ,OAAInK,EAAE,GAAG8J,EAAY1J,EAAK,GAAKJ,EAAE,GAAG8J,EAAW,CAAC,EAAG1J,EAAK,IACpD+J,EAAOF,GAAUH,CAAU,GAE1BK,EAAK,QACN7I,EAAIwI,CAAU,EAAE,QAAQxG,GAAa,SAAUM,EAAGC,EAAG6C,EAAG,CACpD,IAAI0D,EAAS,CAAC,EACV9K,EAAOuE,EAAE,YAAY,EASzB,GARA6C,EAAE,QAAQlD,GAAY,SAAUI,EAAG,EAAG,CAClC,GAAKwG,EAAO,KAAK,CAAC,CAAC,CACvB,CAAC,EACG9K,GAAQ,KAAO8K,EAAO,OAAS,IAC/BD,EAAK,KAAK,CAACtG,CAAC,EAAE1C,CAAM,EAAEiJ,EAAO,OAAO,EAAG,CAAC,CAAC,CAAC,EAC1C9K,EAAO,IACPuE,EAAIA,GAAK,IAAM,IAAM,KAErBvE,GAAQ,IACR6K,EAAK,KAAK,CAACtG,CAAC,EAAE1C,CAAM,EAAEiJ,CAAM,CAAC,MAC1B,MAAOA,EAAO,QAAUF,EAAY5K,CAAI,IAC3C6K,EAAK,KAAK,CAACtG,CAAC,EAAE1C,CAAM,EAAEiJ,EAAO,OAAO,EAAGF,EAAY5K,CAAI,CAAC,CAAC,CAAC,EACtD,EAAC4K,EAAY5K,CAAI,IAArB,CAIR,CAAC,EAEL6K,EAAK,SAAWnK,EAAE,aAClB+J,EAAI,IAAME,GAAUE,CAAI,EACjBA,CACX,EAYAnK,EAAE,qBAAuBmH,GAAO,SAAUkD,EAAS,CAC/C,GAAI,CAACA,EACD,OAAO,KAEX,IAAIH,EAAc,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAC,EACrCC,EAAO,CAAC,EACZ,OAAInK,EAAE,GAAGqK,EAASjK,EAAK,GAAKJ,EAAE,GAAGqK,EAAQ,CAAC,EAAGjK,EAAK,IAC9C+J,EAAOF,GAAUI,CAAO,GAEvBF,EAAK,QACN7I,EAAI+I,CAAO,EAAE,QAAQ9G,GAAU,SAAUK,EAAGC,EAAG6C,EAAG,CAC9C,IAAI0D,EAAS,CAAC,EACV9K,EAAOoC,GAAU,KAAKmC,CAAC,EAC3B6C,EAAE,QAAQlD,GAAY,SAAUI,EAAGC,EAAG,CAClCA,GAAKuG,EAAO,KAAK,CAACvG,CAAC,CACvB,CAAC,EACDsG,EAAK,KAAK,CAACtG,CAAC,EAAE1C,CAAM,EAAEiJ,CAAM,CAAC,CACjC,CAAC,EAELD,EAAK,SAAWnK,EAAE,aACXmK,CACX,EAAG,KAAM,SAASG,EAAM,CACpB,GAAI,CAACA,EAAM,OAAOA,EAElB,QADIC,EAAU,CAAC,EACNvF,EAAI,EAAGA,EAAIsF,EAAK,OAAQtF,IAAK,CAElC,QADIwF,EAAW,CAAC,EACPvF,EAAI,EAAGA,EAAIqF,EAAKtF,CAAC,EAAE,OAAQC,IAChCuF,EAAS,KAAKF,EAAKtF,CAAC,EAAEC,CAAC,CAAC,EAE5BsF,EAAQ,KAAKC,CAAQ,CACzB,CACF,OAAOD,CAAS,CAAE,EAEpB,IAAIP,GAAQ,SAAUS,EAAI,CACtB,IAAIZ,EAAIG,GAAM,GAAKA,GAAM,IAAM,CAAC,EAChC,OAAIH,EAAEY,CAAE,EACJZ,EAAEY,CAAE,EAAE,MAAQ,IAEdZ,EAAEY,CAAE,EAAI,CACJ,MAAO,GACX,EAEJ,WAAW,UAAY,CACnB,QAAS9K,KAAOkK,EAAOA,EAAEhJ,EAAG,EAAElB,CAAG,GAAKA,GAAO8K,IACzCZ,EAAElK,CAAG,EAAE,QACP,CAACkK,EAAElK,CAAG,EAAE,OAAS,OAAOkK,EAAElK,CAAG,EAErC,CAAC,EACMkK,EAAEY,CAAE,CACf,EAyCAzK,EAAE,kBAAoB,SAAU0K,EAAKC,EAAKC,EAAKC,EAAKC,EAAKC,EAAKC,EAAKC,EAAK1B,EAAG,CACvE,IAAI2B,EAAK,EAAI3B,EACT4B,EAAMpJ,GAAImJ,EAAI,CAAC,EACfE,EAAMrJ,GAAImJ,EAAI,CAAC,EACfG,EAAK9B,EAAIA,EACT+B,EAAKD,EAAK9B,EACVtF,EAAIkH,EAAMT,EAAMU,EAAM,EAAI7B,EAAIqB,EAAMM,EAAK,EAAI3B,EAAIA,EAAIuB,EAAMQ,EAAKN,EAChE7G,EAAIgH,EAAMR,EAAMS,EAAM,EAAI7B,EAAIsB,EAAMK,EAAK,EAAI3B,EAAIA,EAAIwB,EAAMO,EAAKL,EAChEM,EAAKb,EAAM,EAAInB,GAAKqB,EAAMF,GAAOW,GAAMP,EAAM,EAAIF,EAAMF,GACvDc,EAAKb,EAAM,EAAIpB,GAAKsB,EAAMF,GAAOU,GAAMN,EAAM,EAAIF,EAAMF,GACvDc,EAAKb,EAAM,EAAIrB,GAAKuB,EAAMF,GAAOS,GAAML,EAAM,EAAIF,EAAMF,GACvDc,EAAKb,EAAM,EAAItB,GAAKwB,EAAMF,GAAOQ,GAAMJ,EAAM,EAAIF,EAAMF,GACvDc,EAAKT,EAAKR,EAAMnB,EAAIqB,EACpBgB,EAAKV,EAAKP,EAAMpB,EAAIsB,EACpBgB,GAAKX,EAAKJ,EAAMvB,EAAIyB,EACpBc,GAAKZ,EAAKH,EAAMxB,EAAI0B,EACpBc,GAAS,GAAKpK,EAAK,MAAM4J,EAAKE,EAAID,EAAKE,CAAE,EAAI,IAAM1J,GACvD,OAACuJ,EAAKE,GAAMD,EAAKE,KAAQK,IAAS,KAC3B,CACH,EAAG9H,EACH,EAAGE,EACH,EAAG,CAAC,EAAGoH,EAAI,EAAGC,CAAE,EAChB,EAAG,CAAC,EAAGC,EAAI,EAAGC,CAAE,EAChB,MAAO,CAAC,EAAGC,EAAI,EAAGC,CAAE,EACpB,IAAK,CAAC,EAAGC,GAAI,EAAGC,EAAE,EAClB,MAAOC,EACX,CACJ,EA+BA/L,EAAE,WAAa,SAAU0K,EAAKC,EAAKC,EAAKC,EAAKC,EAAKC,EAAKC,EAAKC,EAAK,CACxDjL,EAAE,GAAG0K,EAAK,OAAO,IAClBA,EAAM,CAACA,EAAKC,EAAKC,EAAKC,EAAKC,EAAKC,EAAKC,EAAKC,CAAG,GAEjD,IAAIrG,EAAOoH,GAAS,MAAM,KAAMtB,CAAG,EACnC,MAAO,CACH,EAAG9F,EAAK,IAAI,EACZ,EAAGA,EAAK,IAAI,EACZ,GAAIA,EAAK,IAAI,EACb,GAAIA,EAAK,IAAI,EACb,MAAOA,EAAK,IAAI,EAAIA,EAAK,IAAI,EAC7B,OAAQA,EAAK,IAAI,EAAIA,EAAK,IAAI,CAClC,CACJ,EAcA5E,EAAE,kBAAoB,SAAU4E,EAAMX,EAAGE,EAAG,CACxC,OAAOF,GAAKW,EAAK,GAAKX,GAAKW,EAAK,IAAMT,GAAKS,EAAK,GAAKT,GAAKS,EAAK,EACnE,EAaA5E,EAAE,gBAAkB,SAAUiM,EAAOC,EAAO,CACxC,IAAIlH,EAAIhF,EAAE,kBACV,OAAOgF,EAAEkH,EAAOD,EAAM,EAAGA,EAAM,CAAC,GACzBjH,EAAEkH,EAAOD,EAAM,GAAIA,EAAM,CAAC,GAC1BjH,EAAEkH,EAAOD,EAAM,EAAGA,EAAM,EAAE,GAC1BjH,EAAEkH,EAAOD,EAAM,GAAIA,EAAM,EAAE,GAC3BjH,EAAEiH,EAAOC,EAAM,EAAGA,EAAM,CAAC,GACzBlH,EAAEiH,EAAOC,EAAM,GAAIA,EAAM,CAAC,GAC1BlH,EAAEiH,EAAOC,EAAM,EAAGA,EAAM,EAAE,GAC1BlH,EAAEiH,EAAOC,EAAM,GAAIA,EAAM,EAAE,IAC1BD,EAAM,EAAIC,EAAM,IAAMD,EAAM,EAAIC,EAAM,GAAKA,EAAM,EAAID,EAAM,IAAMC,EAAM,EAAID,EAAM,KACjFA,EAAM,EAAIC,EAAM,IAAMD,EAAM,EAAIC,EAAM,GAAKA,EAAM,EAAID,EAAM,IAAMC,EAAM,EAAID,EAAM,EAC7F,EACA,SAASE,GAAM,EAAGC,EAAIC,EAAIC,EAAIC,EAAI,CAC9B,IAAIrB,EAAK,GAAKkB,EAAK,EAAIC,EAAK,EAAIC,EAAK,EAAIC,EACrClB,EAAK,EAAIH,EAAK,EAAIkB,EAAK,GAAKC,EAAK,EAAIC,EACzC,OAAO,EAAIjB,EAAK,EAAIe,EAAK,EAAIC,CACjC,CACA,SAASG,GAAO5G,EAAIC,EAAIC,EAAIC,EAAIC,EAAIC,EAAIwG,EAAIC,EAAI/C,EAAG,CAC3CA,GAAK,OACLA,EAAI,GAERA,EAAIA,EAAI,EAAI,EAAIA,EAAI,EAAI,EAAIA,EAM5B,QALIgD,EAAKhD,EAAI,EACTiD,EAAI,GACJC,EAAU,CAAC,OAAQ,MAAO,OAAQ,MAAO,OAAQ,MAAO,OAAQ,MAAO,OAAQ,MAAO,OAAQ,KAAM,EACpGC,EAAU,CAAC,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,KAAM,EAC9FC,EAAM,EACD/H,EAAI,EAAGA,EAAI4H,EAAG5H,IAAK,CACxB,IAAIgI,EAAKL,EAAKE,EAAQ7H,CAAC,EAAI2H,EACvBM,EAAQd,GAAMa,EAAIpH,EAAIE,EAAIE,EAAIyG,CAAE,EAChCS,EAAQf,GAAMa,EAAInH,EAAIE,EAAIE,EAAIyG,CAAE,EAChCS,EAAOF,EAAQA,EAAQC,EAAQA,EACnCH,GAAOD,EAAQ9H,CAAC,EAAIrD,EAAK,KAAKwL,CAAI,CACtC,CACA,OAAOR,EAAKI,CAChB,CACA,SAASK,GAAUxH,EAAIC,EAAIC,EAAIC,EAAIC,EAAIC,EAAIwG,EAAIC,EAAIW,EAAI,CACnD,GAAI,EAAAA,EAAK,GAAKb,GAAO5G,EAAIC,EAAIC,EAAIC,EAAIC,EAAIC,EAAIwG,EAAIC,CAAE,EAAIW,GAGvD,KAAI9D,EAAI,EACJ+D,EAAO/D,EAAI,EACX8B,EAAK9B,EAAI+D,EACTtF,EACAuF,EAAI,IAER,IADAvF,EAAIwE,GAAO5G,EAAIC,EAAIC,EAAIC,EAAIC,EAAIC,EAAIwG,EAAIC,EAAIrB,CAAE,EACtCvJ,EAAIkG,EAAIqF,CAAE,EAAIE,GACjBD,GAAQ,EACRjC,IAAOrD,EAAIqF,EAAK,EAAI,IAAMC,EAC1BtF,EAAIwE,GAAO5G,EAAIC,EAAIC,EAAIC,EAAIC,EAAIC,EAAIwG,EAAIC,EAAIrB,CAAE,EAEjD,OAAOA,EACX,CACA,SAASmC,GAAU5H,EAAIC,EAAIC,EAAIC,EAAIC,EAAIC,EAAIwG,EAAIC,EAAI,CAC/C,GACI,EAAA9K,EAAKgE,EAAIE,CAAE,EAAIjE,EAAKmE,EAAIyG,CAAE,GAC1B5K,EAAK+D,EAAIE,CAAE,EAAIlE,EAAKoE,EAAIyG,CAAE,GAC1B7K,EAAKiE,EAAIE,CAAE,EAAIlE,EAAKoE,EAAIyG,CAAE,GAC1B7K,EAAKgE,EAAIE,CAAE,EAAInE,EAAKqE,EAAIyG,CAAE,GAI9B,KAAIjB,GAAM7F,EAAKG,EAAKF,EAAKC,IAAOE,EAAKyG,IAAO7G,EAAKE,IAAOE,EAAK0G,EAAKzG,EAAKwG,GACnEf,GAAM9F,EAAKG,EAAKF,EAAKC,IAAOG,EAAKyG,IAAO7G,EAAKE,IAAOC,EAAK0G,EAAKzG,EAAKwG,GACnEgB,GAAe7H,EAAKE,IAAOG,EAAKyG,IAAO7G,EAAKE,IAAOC,EAAKyG,GAE5D,GAAKgB,EAGL,KAAIC,EAAKjC,EAAKgC,EACVE,EAAKjC,EAAK+B,EACVG,EAAM,CAACF,EAAG,QAAQ,CAAC,EACnBG,EAAM,CAACF,EAAG,QAAQ,CAAC,EACvB,GACI,EAAAC,EAAM,CAAC/L,EAAK+D,EAAIE,CAAE,EAAE,QAAQ,CAAC,GAC7B8H,EAAM,CAAChM,EAAKgE,EAAIE,CAAE,EAAE,QAAQ,CAAC,GAC7B8H,EAAM,CAAC/L,EAAKmE,EAAIyG,CAAE,EAAE,QAAQ,CAAC,GAC7BmB,EAAM,CAAChM,EAAKoE,EAAIyG,CAAE,EAAE,QAAQ,CAAC,GAC7BoB,EAAM,CAAChM,EAAKgE,EAAIE,CAAE,EAAE,QAAQ,CAAC,GAC7B8H,EAAM,CAACjM,EAAKiE,EAAIE,CAAE,EAAE,QAAQ,CAAC,GAC7B8H,EAAM,CAAChM,EAAKoE,EAAIyG,CAAE,EAAE,QAAQ,CAAC,GAC7BmB,EAAM,CAACjM,EAAKqE,EAAIyG,CAAE,EAAE,QAAQ,CAAC,GAIjC,MAAO,CAAC,EAAGgB,EAAI,EAAGC,CAAE,GACxB,CACA,SAASG,GAAMC,EAAMC,EAAM,CACvB,OAAOC,GAAYF,EAAMC,CAAI,CACjC,CACA,SAASE,GAAWH,EAAMC,EAAM,CAC5B,OAAOC,GAAYF,EAAMC,EAAM,CAAC,CACpC,CACA,SAASC,GAAYF,EAAMC,EAAMG,EAAW,CACxC,IAAIlC,EAAQjM,EAAE,WAAW+N,CAAI,EACzB7B,EAAQlM,EAAE,WAAWgO,CAAI,EAC7B,GAAI,CAAChO,EAAE,gBAAgBiM,EAAOC,CAAK,EAC/B,OAAOiC,EAAY,EAAI,CAAC,EAU5B,QARIC,EAAK5B,GAAO,MAAM,EAAGuB,CAAI,EACzBM,EAAK7B,GAAO,MAAM,EAAGwB,CAAI,EACzBM,EAAK1M,EAAK,CAAC,EAAEwM,EAAK,GAAI,CAAC,EACvBG,EAAK3M,EAAK,CAAC,EAAEyM,EAAK,GAAI,CAAC,EACvBG,EAAQ,CAAC,EACTC,EAAQ,CAAC,EACTC,EAAK,CAAC,EACN/I,EAAMwI,EAAY,EAAI,CAAC,EAClBnJ,EAAI,EAAGA,EAAIsJ,EAAK,EAAGtJ,IAAK,CAC7B,IAAI6E,EAAI7J,EAAE,kBAAkB,MAAMA,EAAG+N,EAAK,OAAO/I,EAAIsJ,CAAE,CAAC,EACxDE,EAAM,KAAK,CAAC,EAAG3E,EAAE,EAAG,EAAGA,EAAE,EAAG,EAAG7E,EAAIsJ,CAAE,CAAC,CAC1C,CACA,IAAKtJ,EAAI,EAAGA,EAAIuJ,EAAK,EAAGvJ,IACpB6E,EAAI7J,EAAE,kBAAkB,MAAMA,EAAGgO,EAAK,OAAOhJ,EAAIuJ,CAAE,CAAC,EACpDE,EAAM,KAAK,CAAC,EAAG5E,EAAE,EAAG,EAAGA,EAAE,EAAG,EAAG7E,EAAIuJ,CAAE,CAAC,EAE1C,IAAKvJ,EAAI,EAAGA,EAAIsJ,EAAItJ,IAChB,QAASC,EAAI,EAAGA,EAAIsJ,EAAItJ,IAAK,CACzB,IAAI0J,EAAKH,EAAMxJ,CAAC,EACZ4J,EAAMJ,EAAMxJ,EAAI,CAAC,EACjB6J,EAAKJ,EAAMxJ,CAAC,EACZ6J,EAAML,EAAMxJ,EAAI,CAAC,EACjB8J,EAAKjN,EAAI8M,EAAI,EAAID,EAAG,CAAC,EAAI,KAAO,IAAM,IACtCK,EAAKlN,EAAIgN,EAAI,EAAID,EAAG,CAAC,EAAI,KAAO,IAAM,IACtCI,GAAKzB,GAAUmB,EAAG,EAAGA,EAAG,EAAGC,EAAI,EAAGA,EAAI,EAAGC,EAAG,EAAGA,EAAG,EAAGC,EAAI,EAAGA,EAAI,CAAC,EACrE,GAAIG,GAAI,CACJ,GAAIP,EAAGO,GAAG,EAAE,QAAQ,CAAC,CAAC,GAAKA,GAAG,EAAE,QAAQ,CAAC,EACrC,SAEJP,EAAGO,GAAG,EAAE,QAAQ,CAAC,CAAC,EAAIA,GAAG,EAAE,QAAQ,CAAC,EACpC,IAAI/D,GAAKyD,EAAG,EAAI7M,GAAKmN,GAAGF,CAAE,EAAIJ,EAAGI,CAAE,IAAMH,EAAIG,CAAE,EAAIJ,EAAGI,CAAE,EAAE,GAAKH,EAAI,EAAID,EAAG,GACtEtD,GAAKwD,EAAG,EAAI/M,GAAKmN,GAAGD,CAAE,EAAIH,EAAGG,CAAE,IAAMF,EAAIE,CAAE,EAAIH,EAAGG,CAAE,EAAE,GAAKF,EAAI,EAAID,EAAG,GACtE3D,IAAM,GAAKA,IAAM,OAASG,IAAM,GAAKA,IAAM,QACvC8C,EACAxI,IAEAA,EAAI,KAAK,CACL,EAAGsJ,GAAG,EACN,EAAGA,GAAG,EACN,GAAIpN,EAAKqJ,GAAI,CAAC,EACd,GAAIrJ,EAAKwJ,GAAI,CAAC,CAClB,CAAC,EAGb,CACJ,CAEJ,OAAO1F,CACX,CAyBA3F,EAAE,iBAAmB,SAAUkP,EAAOC,EAAO,CACzC,OAAOC,GAAgBF,EAAOC,CAAK,CACvC,EACAnP,EAAE,uBAAyB,SAAUkP,EAAOC,EAAO,CAC/C,OAAOC,GAAgBF,EAAOC,EAAO,CAAC,CAC1C,EACA,SAASC,GAAgBF,EAAOC,EAAOhB,EAAW,CAC9Ce,EAAQlP,EAAE,YAAYkP,CAAK,EAC3BC,EAAQnP,EAAE,YAAYmP,CAAK,EAG3B,QAFIvJ,EAAIC,EAAIC,EAAIC,EAAIsJ,EAAKC,EAAKC,EAAKC,EAAKzB,EAAMC,EAC1CrI,EAAMwI,EAAY,EAAI,CAAC,EAClBnJ,EAAI,EAAGE,EAAKgK,EAAM,OAAQlK,EAAIE,EAAIF,IAAK,CAC5C,IAAIyK,EAAKP,EAAMlK,CAAC,EAChB,GAAIyK,EAAG,CAAC,GAAK,IACT7J,EAAKyJ,EAAMI,EAAG,CAAC,EACf5J,EAAKyJ,EAAMG,EAAG,CAAC,MACZ,CACCA,EAAG,CAAC,GAAK,KACT1B,EAAO,CAACnI,EAAIC,CAAE,EAAE,OAAO4J,EAAG,MAAM,CAAC,CAAC,EAClC7J,EAAKmI,EAAK,CAAC,EACXlI,EAAKkI,EAAK,CAAC,IAEXA,EAAO,CAACnI,EAAIC,EAAID,EAAIC,EAAIwJ,EAAKC,EAAKD,EAAKC,CAAG,EAC1C1J,EAAKyJ,EACLxJ,EAAKyJ,GAET,QAASrK,EAAI,EAAGE,EAAKgK,EAAM,OAAQlK,EAAIE,EAAIF,IAAK,CAC5C,IAAIyK,EAAKP,EAAMlK,CAAC,EAChB,GAAIyK,EAAG,CAAC,GAAK,IACT5J,EAAKyJ,EAAMG,EAAG,CAAC,EACf3J,EAAKyJ,EAAME,EAAG,CAAC,MACZ,CACCA,EAAG,CAAC,GAAK,KACT1B,EAAO,CAAClI,EAAIC,CAAE,EAAE,OAAO2J,EAAG,MAAM,CAAC,CAAC,EAClC5J,EAAKkI,EAAK,CAAC,EACXjI,EAAKiI,EAAK,CAAC,IAEXA,EAAO,CAAClI,EAAIC,EAAID,EAAIC,EAAIwJ,EAAKC,EAAKD,EAAKC,CAAG,EAC1C1J,EAAKyJ,EACLxJ,EAAKyJ,GAET,IAAIG,EAAO1B,GAAYF,EAAMC,EAAMG,CAAS,EAC5C,GAAIA,EACAxI,GAAOgK,MACJ,CACH,QAASC,EAAI,EAAGC,GAAKF,EAAK,OAAQC,EAAIC,GAAID,IACtCD,EAAKC,CAAC,EAAE,SAAW5K,EACnB2K,EAAKC,CAAC,EAAE,SAAW3K,EACnB0K,EAAKC,CAAC,EAAE,KAAO7B,EACf4B,EAAKC,CAAC,EAAE,KAAO5B,EAEnBrI,EAAMA,EAAI,OAAOgK,CAAI,CACzB,CACJ,CACJ,CACJ,CACJ,CACA,OAAOhK,CACX,CAcA3F,EAAE,kBAAoB,SAAU8E,EAAMb,EAAGE,EAAG,CACxC,IAAIS,EAAO5E,EAAE,SAAS8E,CAAI,EAC1B,OAAO9E,EAAE,kBAAkB4E,EAAMX,EAAGE,CAAC,GAC9BiL,GAAgBtK,EAAM,CAAC,CAAC,IAAKb,EAAGE,CAAC,EAAG,CAAC,IAAKS,EAAK,GAAK,EAAE,CAAC,EAAG,CAAC,EAAI,GAAK,CAC/E,EACA5E,EAAE,gBAAkB,SAAU8P,EAAY,CACtC,OAAO,UAAY,CACf7P,EAAI,cAAe,KAAM,+CAAiD6P,EAAa,2BAA4BA,CAAU,CACjI,CACJ,EAsBA,IAAIC,GAAiB/P,EAAE,SAAW,SAAU8E,EAAM,CAC9C,IAAIiF,EAAMC,GAAMlF,CAAI,EACpB,GAAIiF,EAAI,KACJ,OAAOtE,GAAMsE,EAAI,IAAI,EAEzB,GAAI,CAACjF,EACD,MAAO,CAAC,EAAG,EAAG,EAAG,EAAG,MAAO,EAAG,OAAQ,EAAG,GAAI,EAAG,GAAI,CAAC,EAEzDA,EAAOO,GAAWP,CAAI,EAMtB,QALIb,EAAI,EACJE,EAAI,EACJ2D,EAAI,CAAC,EACLkI,EAAI,CAAC,EACLnG,EACK7E,EAAI,EAAGE,EAAKJ,EAAK,OAAQE,EAAIE,EAAIF,IAEtC,GADA6E,EAAI/E,EAAKE,CAAC,EACN6E,EAAE,CAAC,GAAK,IACR5F,EAAI4F,EAAE,CAAC,EACP1F,EAAI0F,EAAE,CAAC,EACP/B,EAAE,KAAK7D,CAAC,EACR+L,EAAE,KAAK7L,CAAC,MACL,CACH,IAAI8L,EAAMjE,GAAS/H,EAAGE,EAAG0F,EAAE,CAAC,EAAGA,EAAE,CAAC,EAAGA,EAAE,CAAC,EAAGA,EAAE,CAAC,EAAGA,EAAE,CAAC,EAAGA,EAAE,CAAC,CAAC,EAC3D/B,EAAIA,EAAE3G,CAAM,EAAE8O,EAAI,IAAI,EAAGA,EAAI,IAAI,CAAC,EAClCD,EAAIA,EAAE7O,CAAM,EAAE8O,EAAI,IAAI,EAAGA,EAAI,IAAI,CAAC,EAClChM,EAAI4F,EAAE,CAAC,EACP1F,EAAI0F,EAAE,CAAC,CACX,CAEJ,IAAIqG,EAAOrO,EAAKxB,EAAK,EAAE,EAAGyH,CAAC,EACvBqI,EAAOtO,EAAKxB,EAAK,EAAE,EAAG2P,CAAC,EACvBI,EAAOxO,EAAKvB,EAAK,EAAE,EAAGyH,CAAC,EACvBuI,EAAOzO,EAAKvB,EAAK,EAAE,EAAG2P,CAAC,EACvBM,EAAQF,EAAOF,EACfK,EAASF,EAAOF,EACZK,EAAK,CACL,EAAGN,EACH,EAAGC,EACH,GAAIC,EACJ,GAAIC,EACJ,MAAOC,EACP,OAAQC,EACR,GAAIL,EAAOI,EAAQ,EACnB,GAAIH,EAAOI,EAAS,CACxB,EACJ,OAAAxG,EAAI,KAAOtE,GAAM+K,CAAE,EACZA,CACX,EACIvG,GAAY,SAAUwG,EAAW,CAC7B,IAAI9K,EAAMF,GAAMgL,CAAS,EACzB,OAAA9K,EAAI,SAAW3F,EAAE,aACV2F,CACX,EACA+K,GAAiB1Q,EAAE,gBAAkB,SAAUyQ,EAAW,CACtD,IAAI1G,EAAMC,GAAMyG,CAAS,EACzB,GAAI1G,EAAI,IACJ,OAAOE,GAAUF,EAAI,GAAG,GAExB,CAAC/J,EAAE,GAAGyQ,EAAWrQ,EAAK,GAAK,CAACJ,EAAE,GAAGyQ,GAAaA,EAAU,CAAC,EAAGrQ,EAAK,KACjEqQ,EAAYzQ,EAAE,gBAAgByQ,CAAS,GAE3C,IAAI9K,EAAM,CAAC,EACP1B,EAAI,EACJE,EAAI,EACJoH,EAAK,EACLC,EAAK,EACLhC,EAAQ,EACRiH,EAAU,CAAC,EAAE,CAAC,GAAK,MACnBxM,EAAIwM,EAAU,CAAC,EAAE,CAAC,EAClBtM,EAAIsM,EAAU,CAAC,EAAE,CAAC,EAClBlF,EAAKtH,EACLuH,EAAKrH,EACLqF,IACA7D,EAAI,KAAK,CAAC,IAAK1B,EAAGE,CAAC,CAAC,GAExB,QAASa,EAAIwE,EAAOtE,EAAKuL,EAAU,OAAQzL,EAAIE,EAAIF,IAAK,CACpD,IAAIV,EAAIqB,EAAIX,CAAC,EAAI,CAAC,EACd2L,EAAKF,EAAUzL,CAAC,EACpB,GAAI2L,EAAG,CAAC,GAAKjP,GAAU,KAAKiP,EAAG,CAAC,CAAC,EAE7B,OADArM,EAAE,CAAC,EAAI5C,GAAU,KAAKiP,EAAG,CAAC,CAAC,EACnBrM,EAAE,CAAC,EAAG,CACV,IAAK,IACDA,EAAE,CAAC,EAAIqM,EAAG,CAAC,EACXrM,EAAE,CAAC,EAAIqM,EAAG,CAAC,EACXrM,EAAE,CAAC,EAAIqM,EAAG,CAAC,EACXrM,EAAE,CAAC,EAAIqM,EAAG,CAAC,EACXrM,EAAE,CAAC,EAAIqM,EAAG,CAAC,EACXrM,EAAE,CAAC,EAAI,EAAEqM,EAAG,CAAC,EAAI1M,GAAG,QAAQ,CAAC,EAC7BK,EAAE,CAAC,EAAI,EAAEqM,EAAG,CAAC,EAAIxM,GAAG,QAAQ,CAAC,EAC7B,MACJ,IAAK,IACDG,EAAE,CAAC,EAAI,EAAEqM,EAAG,CAAC,EAAIxM,GAAG,QAAQ,CAAC,EAC7B,MACJ,IAAK,IACDoH,EAAKoF,EAAG,CAAC,EACTnF,EAAKmF,EAAG,CAAC,EACb,QACI,QAAS1L,EAAI,EAAGE,EAAKwL,EAAG,OAAQ1L,EAAIE,EAAIF,IACpCX,EAAEW,CAAC,EAAI,EAAE0L,EAAG1L,CAAC,GAAMA,EAAI,EAAKhB,EAAIE,IAAI,QAAQ,CAAC,CAEzD,KACG,CACHG,EAAIqB,EAAIX,CAAC,EAAI,CAAC,EACV2L,EAAG,CAAC,GAAK,MACTpF,EAAKoF,EAAG,CAAC,EAAI1M,EACbuH,EAAKmF,EAAG,CAAC,EAAIxM,GAEjB,QAASyL,EAAI,EAAGC,EAAKc,EAAG,OAAQf,EAAIC,EAAID,IACpCjK,EAAIX,CAAC,EAAE4K,CAAC,EAAIe,EAAGf,CAAC,CAExB,CACA,IAAIgB,EAAMjL,EAAIX,CAAC,EAAE,OACjB,OAAQW,EAAIX,CAAC,EAAE,CAAC,EAAG,CACf,IAAK,IACDf,EAAIsH,EACJpH,EAAIqH,EACJ,MACJ,IAAK,IACDvH,GAAK,CAAC0B,EAAIX,CAAC,EAAE4L,EAAM,CAAC,EACpB,MACJ,IAAK,IACDzM,GAAK,CAACwB,EAAIX,CAAC,EAAE4L,EAAM,CAAC,EACpB,MACJ,QACI3M,GAAK,CAAC0B,EAAIX,CAAC,EAAE4L,EAAM,CAAC,EACpBzM,GAAK,CAACwB,EAAIX,CAAC,EAAE4L,EAAM,CAAC,CAC5B,CACJ,CACA,OAAAjL,EAAI,SAAW3F,EAAE,aACjB+J,EAAI,IAAME,GAAUtE,CAAG,EAChBA,CACX,EACAkL,GAAiB7Q,EAAE,gBAAkB,SAAUyQ,EAAW,CACtD,IAAI1G,EAAMC,GAAMyG,CAAS,EACzB,GAAI1G,EAAI,IACJ,OAAOE,GAAUF,EAAI,GAAG,EAK5B,IAHI,CAAC/J,EAAE,GAAGyQ,EAAWrQ,EAAK,GAAK,CAACJ,EAAE,GAAGyQ,GAAaA,EAAU,CAAC,EAAGrQ,EAAK,KACjEqQ,EAAYzQ,EAAE,gBAAgByQ,CAAS,GAEvC,CAACA,GAAa,CAACA,EAAU,OACzB,MAAO,CAAC,CAAC,IAAK,EAAG,CAAC,CAAC,EAEvB,IAAI9K,EAAM,CAAC,EACP1B,EAAI,EACJE,EAAI,EACJoH,EAAK,EACLC,EAAK,EACLhC,EAAQ,EACRiH,EAAU,CAAC,EAAE,CAAC,GAAK,MACnBxM,EAAI,CAACwM,EAAU,CAAC,EAAE,CAAC,EACnBtM,EAAI,CAACsM,EAAU,CAAC,EAAE,CAAC,EACnBlF,EAAKtH,EACLuH,EAAKrH,EACLqF,IACA7D,EAAI,CAAC,EAAI,CAAC,IAAK1B,EAAGE,CAAC,GAGvB,QADI2M,EAAML,EAAU,QAAU,GAAKA,EAAU,CAAC,EAAE,CAAC,GAAK,KAAOA,EAAU,CAAC,EAAE,CAAC,EAAE,YAAY,GAAK,KAAOA,EAAU,CAAC,EAAE,CAAC,EAAE,YAAY,GAAK,IAC7HnM,EAAGqM,EAAI3L,EAAIwE,EAAOtE,EAAKuL,EAAU,OAAQzL,EAAIE,EAAIF,IAAK,CAG3D,GAFAW,EAAI,KAAKrB,EAAI,CAAC,CAAC,EACfqM,EAAKF,EAAUzL,CAAC,EACZ2L,EAAG,CAAC,GAAK5N,GAAU,KAAK4N,EAAG,CAAC,CAAC,EAE7B,OADArM,EAAE,CAAC,EAAIvB,GAAU,KAAK4N,EAAG,CAAC,CAAC,EACnBrM,EAAE,CAAC,EAAG,CACV,IAAK,IACDA,EAAE,CAAC,EAAIqM,EAAG,CAAC,EACXrM,EAAE,CAAC,EAAIqM,EAAG,CAAC,EACXrM,EAAE,CAAC,EAAIqM,EAAG,CAAC,EACXrM,EAAE,CAAC,EAAIqM,EAAG,CAAC,EACXrM,EAAE,CAAC,EAAIqM,EAAG,CAAC,EACXrM,EAAE,CAAC,EAAI,EAAEqM,EAAG,CAAC,EAAI1M,GACjBK,EAAE,CAAC,EAAI,EAAEqM,EAAG,CAAC,EAAIxM,GACjB,MACJ,IAAK,IACDG,EAAE,CAAC,EAAI,CAACqM,EAAG,CAAC,EAAIxM,EAChB,MACJ,IAAK,IACDG,EAAE,CAAC,EAAI,CAACqM,EAAG,CAAC,EAAI1M,EAChB,MACJ,IAAK,IAED,QADI8M,EAAO,CAAC9M,EAAGE,CAAC,EAAEhD,CAAM,EAAEwP,EAAG,MAAM,CAAC,CAAC,EAC5B1L,EAAI,EAAGE,EAAK4L,EAAK,OAAQ9L,EAAIE,EAAIF,IACtC8L,EAAK9L,CAAC,EAAI,CAAC8L,EAAK9L,CAAC,EAAIhB,EACrB8M,EAAK,EAAE9L,CAAC,EAAI,CAAC8L,EAAK9L,CAAC,EAAId,EAE3BwB,EAAI,IAAI,EACRA,EAAMA,EAAIxE,CAAM,EAAEsI,GAAkBsH,EAAMD,CAAG,CAAC,EAC9C,MACJ,IAAK,IACDvF,EAAK,CAACoF,EAAG,CAAC,EAAI1M,EACduH,EAAK,CAACmF,EAAG,CAAC,EAAIxM,EAClB,QACI,IAAKc,EAAI,EAAGE,EAAKwL,EAAG,OAAQ1L,EAAIE,EAAIF,IAChCX,EAAEW,CAAC,EAAI,CAAC0L,EAAG1L,CAAC,GAAMA,EAAI,EAAKhB,EAAIE,EAE3C,SACOwM,EAAG,CAAC,GAAK,IAChBI,EAAO,CAAC9M,EAAGE,CAAC,EAAEhD,CAAM,EAAEwP,EAAG,MAAM,CAAC,CAAC,EACjChL,EAAI,IAAI,EACRA,EAAMA,EAAIxE,CAAM,EAAEsI,GAAkBsH,EAAMD,CAAG,CAAC,EAC9CxM,EAAI,CAAC,GAAG,EAAEnD,CAAM,EAAEwP,EAAG,MAAM,EAAE,CAAC,MAE9B,SAASf,EAAI,EAAGC,EAAKc,EAAG,OAAQf,EAAIC,EAAID,IACpCtL,EAAEsL,CAAC,EAAIe,EAAGf,CAAC,EAGnB,OAAQtL,EAAE,CAAC,EAAG,CACV,IAAK,IACDL,EAAIsH,EACJpH,EAAIqH,EACJ,MACJ,IAAK,IACDvH,EAAIK,EAAE,CAAC,EACP,MACJ,IAAK,IACDH,EAAIG,EAAE,CAAC,EACP,MACJ,IAAK,IACDiH,EAAKjH,EAAEA,EAAE,OAAS,CAAC,EACnBkH,EAAKlH,EAAEA,EAAE,OAAS,CAAC,EACvB,QACIL,EAAIK,EAAEA,EAAE,OAAS,CAAC,EAClBH,EAAIG,EAAEA,EAAE,OAAS,CAAC,CAC1B,CACJ,CACA,OAAAqB,EAAI,SAAW3F,EAAE,aACjB+J,EAAI,IAAME,GAAUtE,CAAG,EAChBA,CACX,EACAqL,GAAM,SAAUpL,EAAIC,EAAIC,EAAIC,EAAI,CAC5B,MAAO,CAACH,EAAIC,EAAIC,EAAIC,EAAID,EAAIC,CAAE,CAClC,EACAkL,GAAM,SAAUrL,EAAIC,EAAI8F,EAAIC,EAAI9F,EAAIC,EAAI,CACpC,IAAImL,EAAM,kBACNC,EAAM,EAAI,EACd,MAAO,CACCD,EAAMtL,EAAKuL,EAAMxF,EACjBuF,EAAMrL,EAAKsL,EAAMvF,EACjBsF,EAAMpL,EAAKqL,EAAMxF,EACjBuF,EAAMnL,EAAKoL,EAAMvF,EACjB9F,EACAC,CACJ,CACR,EACAqL,GAAM,SAAUxL,EAAIC,EAAIrB,EAAIC,EAAI4M,EAAOC,EAAgBC,EAAYzL,EAAIC,EAAIyL,EAAW,CAGlF,IAAIC,EAAOzP,GAAK,IAAM,IAClBmE,EAAMnE,GAAK,KAAO,CAACqP,GAAS,GAC5B1L,EAAM,CAAC,EACP+I,EACAgD,EAASvK,GAAO,SAAUlD,GAAGE,GAAGgC,GAAK,CACjC,IAAI2B,GAAI7D,GAAItC,EAAK,IAAIwE,EAAG,EAAIhC,GAAIxC,EAAK,IAAIwE,EAAG,EACxC6J,GAAI/L,GAAItC,EAAK,IAAIwE,EAAG,EAAIhC,GAAIxC,EAAK,IAAIwE,EAAG,EAC5C,MAAO,CAAC,EAAG2B,GAAG,EAAGkI,EAAC,CACtB,CAAC,EACL,GAAKwB,EAqCDG,GAAKH,EAAU,CAAC,EAChBI,GAAKJ,EAAU,CAAC,EAChB3F,GAAK2F,EAAU,CAAC,EAChB1F,GAAK0F,EAAU,CAAC,MAxCJ,CACZ9C,EAAKgD,EAAO9L,EAAIC,EAAI,CAACM,CAAG,EACxBP,EAAK8I,EAAG,EACR7I,EAAK6I,EAAG,EACRA,EAAKgD,EAAO5L,EAAIC,EAAI,CAACI,CAAG,EACxBL,EAAK4I,EAAG,EACR3I,EAAK2I,EAAG,EACR,IAAImD,EAAMlQ,EAAK,IAAIK,GAAK,IAAMqP,CAAK,EAC/BS,EAAMnQ,EAAK,IAAIK,GAAK,IAAMqP,CAAK,EAC/BpN,GAAK2B,EAAKE,GAAM,EAChB3B,GAAK0B,EAAKE,GAAM,EAChB1B,EAAKJ,EAAIA,GAAMO,EAAKA,GAAOL,EAAIA,GAAMM,EAAKA,GAC1CJ,EAAI,IACJA,EAAI1C,EAAK,KAAK0C,CAAC,EACfG,EAAKH,EAAIG,EACTC,EAAKJ,EAAII,GAEb,IAAIsN,EAAMvN,EAAKA,EACXwN,EAAMvN,EAAKA,EACXmL,IAAK0B,GAAkBC,EAAa,GAAK,GACrC5P,EAAK,KAAKG,GAAKiQ,EAAMC,EAAMD,EAAM5N,EAAIA,EAAI6N,EAAM/N,EAAIA,IAAM8N,EAAM5N,EAAIA,EAAI6N,EAAM/N,EAAIA,EAAE,CAAC,EACxF4H,GAAK+D,GAAIpL,EAAKL,EAAIM,GAAMmB,EAAKE,GAAM,EACnCgG,GAAK8D,GAAI,CAACnL,EAAKR,EAAIO,GAAMqB,EAAKE,GAAM,EACpC4L,GAAKhQ,EAAK,OAAOkE,EAAKiG,IAAMrH,GAAI,QAAQ,CAAC,CAAC,EAC1CmN,GAAKjQ,EAAK,OAAOoE,EAAK+F,IAAMrH,GAAI,QAAQ,CAAC,CAAC,EAE9CkN,GAAK/L,EAAKiG,GAAK7J,GAAK2P,GAAKA,GACzBC,GAAK9L,EAAK+F,GAAK7J,GAAK4P,GAAKA,GACzBD,GAAK,IAAMA,GAAK3P,GAAK,EAAI2P,IACzBC,GAAK,IAAMA,GAAK5P,GAAK,EAAI4P,IACrBL,GAAcI,GAAKC,KACnBD,GAAKA,GAAK3P,GAAK,GAEf,CAACuP,GAAcK,GAAKD,KACpBC,GAAKA,GAAK5P,GAAK,EAEvB,CAMA,IAAIiQ,GAAKL,GAAKD,GACd,GAAI7P,EAAImQ,EAAE,EAAIR,EAAM,CAChB,IAAIS,GAAQN,GACRO,GAAQrM,EACRsM,GAAQrM,EACZ6L,GAAKD,GAAKF,GAAQF,GAAcK,GAAKD,GAAK,EAAI,IAC9C7L,EAAK+F,GAAKrH,EAAK7C,EAAK,IAAIiQ,EAAE,EAC1B7L,EAAK+F,GAAKrH,EAAK9C,EAAK,IAAIiQ,EAAE,EAC1BjM,EAAMyL,GAAItL,EAAIC,EAAIvB,EAAIC,EAAI4M,EAAO,EAAGE,EAAYY,GAAOC,GAAO,CAACR,GAAIM,GAAOrG,GAAIC,EAAE,CAAC,CACrF,CACAmG,GAAKL,GAAKD,GACV,IAAIU,GAAK1Q,EAAK,IAAIgQ,EAAE,EAChBW,GAAK3Q,EAAK,IAAIgQ,EAAE,EAChBY,GAAK5Q,EAAK,IAAIiQ,EAAE,EAChBY,GAAK7Q,EAAK,IAAIiQ,EAAE,EAChBrI,GAAI5H,EAAK,IAAIsQ,GAAK,CAAC,EACnBQ,GAAK,EAAI,EAAIjO,EAAK+E,GAClBmJ,GAAK,EAAI,EAAIjO,EAAK8E,GAClBoJ,GAAK,CAAC/M,EAAIC,CAAE,EACZ+M,GAAK,CAAChN,EAAK6M,GAAKH,GAAIzM,EAAK6M,GAAKL,EAAE,EAChCQ,GAAK,CAAC/M,EAAK2M,GAAKD,GAAIzM,EAAK2M,GAAKH,EAAE,EAChCO,GAAK,CAAChN,EAAIC,CAAE,EAGhB,GAFA6M,GAAG,CAAC,EAAI,EAAID,GAAG,CAAC,EAAIC,GAAG,CAAC,EACxBA,GAAG,CAAC,EAAI,EAAID,GAAG,CAAC,EAAIC,GAAG,CAAC,EACpBpB,EACA,MAAO,CAACoB,GAAIC,GAAIC,EAAE,EAAE3R,CAAM,EAAEwE,CAAG,EAE/BA,EAAM,CAACiN,GAAIC,GAAIC,EAAE,EAAE3R,CAAM,EAAEwE,CAAG,EAAE,KAAK,EAAEpE,EAAK,EAAE,GAAG,EAEjD,QADIwR,GAAS,CAAC,EACL/N,GAAI,EAAGE,GAAKS,EAAI,OAAQX,GAAIE,GAAIF,KACrC+N,GAAO/N,EAAC,EAAIA,GAAI,EAAI0M,EAAO/L,EAAIX,GAAI,CAAC,EAAGW,EAAIX,EAAC,EAAGmB,CAAG,EAAE,EAAIuL,EAAO/L,EAAIX,EAAC,EAAGW,EAAIX,GAAI,CAAC,EAAGmB,CAAG,EAAE,EAE5F,OAAO4M,EAEf,EACAC,GAAmB,SAAUtI,EAAKC,EAAKC,EAAKC,EAAKC,EAAKC,EAAKC,EAAKC,EAAK1B,EAAG,CACpE,IAAI2B,EAAK,EAAI3B,EACb,MAAO,CACH,EAAGxH,GAAImJ,EAAI,CAAC,EAAIR,EAAM3I,GAAImJ,EAAI,CAAC,EAAI,EAAI3B,EAAIqB,EAAMM,EAAK,EAAI3B,EAAIA,EAAIuB,EAAM/I,GAAIwH,EAAG,CAAC,EAAIyB,EACpF,EAAGjJ,GAAImJ,EAAI,CAAC,EAAIP,EAAM5I,GAAImJ,EAAI,CAAC,EAAI,EAAI3B,EAAIsB,EAAMK,EAAK,EAAI3B,EAAIA,EAAIwB,EAAMhJ,GAAIwH,EAAG,CAAC,EAAI0B,CACxF,CACJ,EACAe,GAAW7E,GAAO,SAAUuD,EAAKC,EAAKC,EAAKC,EAAKC,EAAKC,EAAKC,EAAKC,EAAK,CAChE,IAAIrH,EAAKkH,EAAM,EAAIF,EAAMF,GAAQM,EAAM,EAAIF,EAAMF,GAC7C/G,EAAI,GAAK+G,EAAMF,GAAO,GAAKI,EAAMF,GACjClE,EAAIgE,EAAME,EACVM,GAAM,CAACrH,EAAIlC,EAAK,KAAKkC,EAAIA,EAAI,EAAID,EAAI8C,CAAC,GAAK,EAAI9C,EAC/CyH,GAAM,CAACxH,EAAIlC,EAAK,KAAKkC,EAAIA,EAAI,EAAID,EAAI8C,CAAC,GAAK,EAAI9C,EAC/CO,EAAI,CAACwG,EAAKM,CAAG,EACbhH,EAAI,CAACyG,EAAKM,CAAG,EACbiI,EACJ,OAAAnR,EAAIoJ,CAAE,EAAI,SAAWA,EAAK,IAC1BpJ,EAAIuJ,CAAE,EAAI,SAAWA,EAAK,IACtBH,EAAK,GAAKA,EAAK,IACf+H,EAAMD,GAAiBtI,EAAKC,EAAKC,EAAKC,EAAKC,EAAKC,EAAKC,EAAKC,EAAKC,CAAE,EACjEjH,EAAE,KAAKgP,EAAI,CAAC,EACZ9O,EAAE,KAAK8O,EAAI,CAAC,GAEZ5H,EAAK,GAAKA,EAAK,IACf4H,EAAMD,GAAiBtI,EAAKC,EAAKC,EAAKC,EAAKC,EAAKC,EAAKC,EAAKC,EAAKI,CAAE,EACjEpH,EAAE,KAAKgP,EAAI,CAAC,EACZ9O,EAAE,KAAK8O,EAAI,CAAC,GAEhBrP,EAAKmH,EAAM,EAAIF,EAAMF,GAAQM,EAAM,EAAIF,EAAMF,GAC7ChH,EAAI,GAAKgH,EAAMF,GAAO,GAAKI,EAAMF,GACjCnE,EAAIiE,EAAME,EACVK,GAAM,CAACrH,EAAIlC,EAAK,KAAKkC,EAAIA,EAAI,EAAID,EAAI8C,CAAC,GAAK,EAAI9C,EAC/CyH,GAAM,CAACxH,EAAIlC,EAAK,KAAKkC,EAAIA,EAAI,EAAID,EAAI8C,CAAC,GAAK,EAAI9C,EAC/C9B,EAAIoJ,CAAE,EAAI,SAAWA,EAAK,IAC1BpJ,EAAIuJ,CAAE,EAAI,SAAWA,EAAK,IACtBH,EAAK,GAAKA,EAAK,IACf+H,EAAMD,GAAiBtI,EAAKC,EAAKC,EAAKC,EAAKC,EAAKC,EAAKC,EAAKC,EAAKC,CAAE,EACjEjH,EAAE,KAAKgP,EAAI,CAAC,EACZ9O,EAAE,KAAK8O,EAAI,CAAC,GAEZ5H,EAAK,GAAKA,EAAK,IACf4H,EAAMD,GAAiBtI,EAAKC,EAAKC,EAAKC,EAAKC,EAAKC,EAAKC,EAAKC,EAAKI,CAAE,EACjEpH,EAAE,KAAKgP,EAAI,CAAC,EACZ9O,EAAE,KAAK8O,EAAI,CAAC,GAET,CACH,IAAK,CAAC,EAAGpR,EAAKxB,EAAK,EAAE,EAAG4D,CAAC,EAAG,EAAGpC,EAAKxB,EAAK,EAAE,EAAG8D,CAAC,CAAC,EAChD,IAAK,CAAC,EAAGvC,EAAKvB,EAAK,EAAE,EAAG4D,CAAC,EAAG,EAAGrC,EAAKvB,EAAK,EAAE,EAAG8D,CAAC,CAAC,CACpD,CACJ,CAAC,EACDkB,GAAarF,EAAE,YAAcmH,GAAO,SAAUrC,EAAMqK,EAAO,CACvD,IAAIpF,EAAM,CAACoF,GAASnF,GAAMlF,CAAI,EAC9B,GAAI,CAACqK,GAASpF,EAAI,MACd,OAAOE,GAAUF,EAAI,KAAK,EAyF9B,QAvFIF,EAAIgH,GAAe/L,CAAI,EACvBuH,EAAK8C,GAAS0B,GAAe1B,CAAK,EAClC+D,EAAQ,CAAC,EAAG,EAAG,EAAG,EAAG,GAAI,EAAG,GAAI,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,KAAM,GAAI,IAAI,EACjEC,EAAS,CAAC,EAAG,EAAG,EAAG,EAAG,GAAI,EAAG,GAAI,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,KAAM,GAAI,IAAI,EAClEC,EAAc,SAAUtO,EAAMQ,EAAG+N,GAAM,CACnC,IAAI5H,GAAIC,GAAI4H,GAAK,CAAC,EAAE,EAAG,EAAE,CAAC,EAC1B,GAAI,CAACxO,EACD,MAAO,CAAC,IAAKQ,EAAE,EAAGA,EAAE,EAAGA,EAAE,EAAGA,EAAE,EAAGA,EAAE,EAAGA,EAAE,CAAC,EAG7C,OADA,EAAER,EAAK,CAAC,IAAKwO,MAAQhO,EAAE,GAAKA,EAAE,GAAK,MAC3BR,EAAK,CAAC,EAAG,CACb,IAAK,IACDQ,EAAE,EAAIR,EAAK,CAAC,EACZQ,EAAE,EAAIR,EAAK,CAAC,EACZ,MACJ,IAAK,IACDA,EAAO,CAAC,GAAG,EAAE3D,CAAM,EAAEiQ,GAAI/Q,EAAK,EAAE,EAAG,CAACiF,EAAE,EAAGA,EAAE,CAAC,EAAEnE,CAAM,EAAE2D,EAAK,MAAM,CAAC,CAAC,CAAC,CAAC,EACrE,MACJ,IAAK,IACGuO,IAAQ,KAAOA,IAAQ,KACvB5H,GAAKnG,EAAE,EAAI,EAAIA,EAAE,GACjBoG,GAAKpG,EAAE,EAAI,EAAIA,EAAE,KAGjBmG,GAAKnG,EAAE,EACPoG,GAAKpG,EAAE,GAEXR,EAAO,CAAC,IAAK2G,GAAIC,EAAE,EAAEvK,CAAM,EAAE2D,EAAK,MAAM,CAAC,CAAC,EAC1C,MACJ,IAAK,IACGuO,IAAQ,KAAOA,IAAQ,KACvB/N,EAAE,GAAKA,EAAE,EAAI,EAAIA,EAAE,GACnBA,EAAE,GAAKA,EAAE,EAAI,EAAIA,EAAE,KAGnBA,EAAE,GAAKA,EAAE,EACTA,EAAE,GAAKA,EAAE,GAEbR,EAAO,CAAC,GAAG,EAAE3D,CAAM,EAAE8P,GAAI3L,EAAE,EAAGA,EAAE,EAAGA,EAAE,GAAIA,EAAE,GAAIR,EAAK,CAAC,EAAGA,EAAK,CAAC,CAAC,CAAC,EAChE,MACJ,IAAK,IACDQ,EAAE,GAAKR,EAAK,CAAC,EACbQ,EAAE,GAAKR,EAAK,CAAC,EACbA,EAAO,CAAC,GAAG,EAAE3D,CAAM,EAAE8P,GAAI3L,EAAE,EAAGA,EAAE,EAAGR,EAAK,CAAC,EAAGA,EAAK,CAAC,EAAGA,EAAK,CAAC,EAAGA,EAAK,CAAC,CAAC,CAAC,EACtE,MACJ,IAAK,IACDA,EAAO,CAAC,GAAG,EAAE3D,CAAM,EAAE6P,GAAI1L,EAAE,EAAGA,EAAE,EAAGR,EAAK,CAAC,EAAGA,EAAK,CAAC,CAAC,CAAC,EACpD,MACJ,IAAK,IACDA,EAAO,CAAC,GAAG,EAAE3D,CAAM,EAAE6P,GAAI1L,EAAE,EAAGA,EAAE,EAAGR,EAAK,CAAC,EAAGQ,EAAE,CAAC,CAAC,EAChD,MACJ,IAAK,IACDR,EAAO,CAAC,GAAG,EAAE3D,CAAM,EAAE6P,GAAI1L,EAAE,EAAGA,EAAE,EAAGA,EAAE,EAAGR,EAAK,CAAC,CAAC,CAAC,EAChD,MACJ,IAAK,IACDA,EAAO,CAAC,GAAG,EAAE3D,CAAM,EAAE6P,GAAI1L,EAAE,EAAGA,EAAE,EAAGA,EAAE,EAAGA,EAAE,CAAC,CAAC,EAC5C,KACR,CACA,OAAOR,CACX,EACAyO,EAAS,SAAUC,EAAIxO,EAAG,CACtB,GAAIwO,EAAGxO,CAAC,EAAE,OAAS,EAAG,CAClBwO,EAAGxO,CAAC,EAAE,MAAM,EAEZ,QADIyK,GAAK+D,EAAGxO,CAAC,EACNyK,GAAG,QACNgE,EAAOzO,CAAC,EAAE,IACVqH,IAAOqH,EAAO1O,CAAC,EAAE,KACjBwO,EAAG,OAAOxO,IAAK,EAAG,CAAC,GAAG,EAAE7D,CAAM,EAAEsO,GAAG,OAAO,EAAG,CAAC,CAAC,CAAC,EAEpD+D,EAAG,OAAOxO,EAAG,CAAC,EACdE,EAAKtD,EAAKiI,EAAE,OAAQwC,GAAMA,EAAG,QAAU,CAAC,CAC5C,CACJ,EACAsH,EAAO,SAAUzE,EAAOC,EAAOyE,GAAIC,GAAI7O,GAAG,CAClCkK,GAASC,GAASD,EAAMlK,EAAC,EAAE,CAAC,GAAK,KAAOmK,EAAMnK,EAAC,EAAE,CAAC,GAAK,MACvDmK,EAAM,OAAOnK,GAAG,EAAG,CAAC,IAAK6O,GAAG,EAAGA,GAAG,CAAC,CAAC,EACpCD,GAAG,GAAK,EACRA,GAAG,GAAK,EACRA,GAAG,EAAI1E,EAAMlK,EAAC,EAAE,CAAC,EACjB4O,GAAG,EAAI1E,EAAMlK,EAAC,EAAE,CAAC,EACjBE,EAAKtD,EAAKiI,EAAE,OAAQwC,GAAMA,EAAG,QAAU,CAAC,EAEhD,EACAoH,EAAS,CAAC,EACVC,EAAS,CAAC,EACVI,EAAS,GACTT,EAAO,GACFrO,EAAI,EAAGE,EAAKtD,EAAKiI,EAAE,OAAQwC,GAAMA,EAAG,QAAU,CAAC,EAAGrH,EAAIE,EAAIF,IAAK,CACpE6E,EAAE7E,CAAC,IAAM8O,EAASjK,EAAE7E,CAAC,EAAE,CAAC,GAEpB8O,GAAU,MAEVL,EAAOzO,CAAC,EAAI8O,EACZ9O,IAAOqO,EAAOI,EAAOzO,EAAE,CAAC,IAE5B6E,EAAE7E,CAAC,EAAIoO,EAAYvJ,EAAE7E,CAAC,EAAGkO,EAAOG,CAAI,EAEhCI,EAAOzO,CAAC,GAAK,KAAO8O,GAAU,MAAKL,EAAOzO,CAAC,EAAI,KAInDuO,EAAO1J,EAAG7E,CAAC,EAEPqH,IACAA,EAAGrH,CAAC,IAAM8O,EAASzH,EAAGrH,CAAC,EAAE,CAAC,GACtB8O,GAAU,MAEVJ,EAAO1O,CAAC,EAAI8O,EACZ9O,IAAMqO,EAAOK,EAAO1O,EAAE,CAAC,IAE3BqH,EAAGrH,CAAC,EAAIoO,EAAY/G,EAAGrH,CAAC,EAAGmO,EAAQE,CAAI,EAEnCK,EAAO1O,CAAC,GAAG,KAAO8O,GAAQ,MAAKJ,EAAO1O,CAAC,EAAE,KAE7CuO,EAAOlH,EAAIrH,CAAC,GAEhB2O,EAAK9J,EAAGwC,EAAI6G,EAAOC,EAAQnO,CAAC,EAC5B2O,EAAKtH,EAAIxC,EAAGsJ,EAAQD,EAAOlO,CAAC,EAC5B,IAAI+O,EAAMlK,EAAE7E,CAAC,EACTgP,EAAO3H,GAAMA,EAAGrH,CAAC,EACjBiP,EAASF,EAAI,OACbG,EAAU7H,GAAM2H,EAAK,OACzBd,EAAM,EAAIa,EAAIE,EAAS,CAAC,EACxBf,EAAM,EAAIa,EAAIE,EAAS,CAAC,EACxBf,EAAM,GAAKrQ,EAAQkR,EAAIE,EAAS,CAAC,CAAC,GAAKf,EAAM,EAC7CA,EAAM,GAAKrQ,EAAQkR,EAAIE,EAAS,CAAC,CAAC,GAAKf,EAAM,EAC7CC,EAAO,GAAK9G,IAAOxJ,EAAQmR,EAAKE,EAAU,CAAC,CAAC,GAAKf,EAAO,GACxDA,EAAO,GAAK9G,IAAOxJ,EAAQmR,EAAKE,EAAU,CAAC,CAAC,GAAKf,EAAO,GACxDA,EAAO,EAAI9G,GAAM2H,EAAKE,EAAU,CAAC,EACjCf,EAAO,EAAI9G,GAAM2H,EAAKE,EAAU,CAAC,CACrC,CACA,OAAK7H,IACDtC,EAAI,MAAQE,GAAUJ,CAAC,GAEpBwC,EAAK,CAACxC,EAAGwC,CAAE,EAAIxC,CAC1B,EAAG,KAAMI,EAAS,EAClBkK,GAAYnU,EAAE,WAAamH,GAAO,SAAUiN,EAAU,CAElD,QADIrD,EAAO,CAAC,EACH/L,EAAI,EAAGE,EAAKkP,EAAS,OAAQpP,EAAIE,EAAIF,IAAK,CAC/C,IAAIiO,EAAM,CAAC,EACPoB,EAAMD,EAASpP,CAAC,EAAE,MAAM,qBAAqB,EAEjD,GADAiO,EAAI,MAAQjT,EAAE,OAAOqU,EAAI,CAAC,CAAC,EACvBpB,EAAI,MAAM,MACV,OAAO,KAEXA,EAAI,QAAUA,EAAI,MAAM,QACxBA,EAAI,MAAQA,EAAI,MAAM,IACtBoB,EAAI,CAAC,IAAMpB,EAAI,OAASoB,EAAI,CAAC,EAAI,KACjCtD,EAAK,KAAKkC,CAAG,CACjB,CACA,IAAKjO,EAAI,EAAGE,EAAK6L,EAAK,OAAS,EAAG/L,EAAIE,EAAIF,IACtC,GAAI,CAAC+L,EAAK/L,CAAC,EAAE,OAAQ,CAGjB,QAFIwE,EAAQ3G,EAAQkO,EAAK/L,EAAI,CAAC,EAAE,QAAU,CAAC,EACvCsP,EAAM,EACDrP,EAAID,EAAI,EAAGC,EAAIC,EAAID,IACxB,GAAI8L,EAAK9L,CAAC,EAAE,OAAQ,CAChBqP,EAAMvD,EAAK9L,CAAC,EAAE,OACd,KACJ,CAECqP,IACDA,EAAM,IACNrP,EAAIC,GAERoP,EAAMzR,EAAQyR,CAAG,EAEjB,QADIhP,GAAKgP,EAAM9K,IAAUvE,EAAID,EAAI,GAC1BA,EAAIC,EAAGD,IACVwE,GAASlE,EACTyL,EAAK/L,CAAC,EAAE,OAASwE,EAAQ,GAEjC,CAEJ,OAAOuH,CACX,CAAC,EACDwD,GAAOvU,EAAE,MAAQ,SAAU2E,EAAItC,EAAO,CAClCsC,GAAMtC,EAAM,MAAQA,EAAM,IAAMsC,EAAG,MACnCA,GAAMtC,EAAM,SAAWA,EAAM,OAASsC,EAAG,MACzCA,EAAG,OAASA,EAAG,KAAK,KAAOA,EAAG,MAC9BA,EAAG,OAASA,EAAG,KAAK,KAAOA,EAAG,KAClC,EACA6P,GAAUxU,EAAE,SAAW,SAAU2E,EAAItC,EAAO,CACpCA,EAAM,MAAQsC,IAGlB4P,GAAK5P,EAAItC,CAAK,EACdsC,EAAG,KAAO,KACVA,EAAG,KAAOtC,EAAM,IAChBA,EAAM,IAAI,KAAOsC,EACjBtC,EAAM,IAAMsC,EAChB,EACA8P,GAASzU,EAAE,QAAU,SAAU2E,EAAItC,EAAO,CAClCA,EAAM,SAAWsC,IAGrB4P,GAAK5P,EAAItC,CAAK,EACdsC,EAAG,KAAOtC,EAAM,OAChBsC,EAAG,KAAO,KACVtC,EAAM,OAAO,KAAOsC,EACpBtC,EAAM,OAASsC,EACnB,EACA+P,GAAc1U,EAAE,aAAe,SAAU2E,EAAIgQ,EAAKtS,EAAO,CACrDkS,GAAK5P,EAAItC,CAAK,EACdsS,GAAOtS,EAAM,MAAQA,EAAM,IAAMsC,GACjCgQ,EAAI,OAASA,EAAI,KAAK,KAAOhQ,GAC7BA,EAAG,KAAOgQ,EAAI,KACdhQ,EAAG,KAAOgQ,EACVA,EAAI,KAAOhQ,CACf,EACAiQ,GAAe5U,EAAE,cAAgB,SAAU2E,EAAIgQ,EAAKtS,EAAO,CACvDkS,GAAK5P,EAAItC,CAAK,EACdsS,GAAOtS,EAAM,SAAWA,EAAM,OAASsC,GACvCgQ,EAAI,OAASA,EAAI,KAAK,KAAOhQ,GAC7BA,EAAG,KAAOgQ,EAAI,KACdA,EAAI,KAAOhQ,EACXA,EAAG,KAAOgQ,CACd,EAaAE,GAAW7U,EAAE,SAAW,SAAU8E,EAAMgQ,EAAW,CAC/C,IAAItE,EAAKT,GAAejL,CAAI,EACxBH,EAAK,CACD,EAAG,CACC,UAAW,CACf,EACA,QAAS,UAAY,CACjB,OAAO6L,CACX,CACJ,EACJ,OAAAuE,GAAiBpQ,EAAImQ,CAAS,EACvBnQ,EAAG,MACd,EAaAqQ,GAAgBhV,EAAE,cAAgB,SAAU8E,EAAMgQ,EAAW,CACzD,OAAOjQ,GAAQC,EAAM+P,GAAS/P,EAAMgQ,CAAS,CAAC,CAClD,EACAC,GAAmB/U,EAAE,kBAAoB,SAAU2E,EAAIsQ,EAAM,CACzD,GAAIA,GAAQ,KACR,OAAOtQ,EAAG,EAAE,UAEhBsQ,EAAO3T,EAAI2T,CAAI,EAAE,QAAQ,gBAAiBtQ,EAAG,EAAE,WAAa,CAAC,EAC7D,IAAIuQ,EAAQlV,EAAE,qBAAqBiV,CAAI,EACnC/O,EAAM,EACNiP,EAAK,EACLC,EAAK,EACLC,EAAK,EACLC,EAAK,EACLC,EAAI5Q,EAAG,EACP0D,EAAI,IAAImN,GAEZ,GADAD,EAAE,UAAYL,GAAS,CAAC,EACpBA,EACA,QAASlQ,EAAI,EAAGE,EAAKgQ,EAAM,OAAQlQ,EAAIE,EAAIF,IAAK,CAC5C,IAAIuE,EAAI2L,EAAMlQ,CAAC,EACXyQ,EAAOlM,EAAE,OACTmM,EAAUpU,EAAIiI,EAAE,CAAC,CAAC,EAAE,YAAY,EAChCoM,EAAWpM,EAAE,CAAC,GAAKmM,EACnBE,EAAQD,EAAWtN,EAAE,OAAO,EAAI,EAChCzC,EACAC,EACAC,EACAC,EACAyK,EACAkF,GAAW,KAAOD,GAAQ,EACtBE,GACA/P,EAAKgQ,EAAM,EAAE,EAAG,CAAC,EACjB/P,EAAK+P,EAAM,EAAE,EAAG,CAAC,EACjB9P,EAAK8P,EAAM,EAAErM,EAAE,CAAC,EAAGA,EAAE,CAAC,CAAC,EACvBxD,EAAK6P,EAAM,EAAErM,EAAE,CAAC,EAAGA,EAAE,CAAC,CAAC,EACvBlB,EAAE,UAAUvC,EAAKF,EAAIG,EAAKF,CAAE,GAE5BwC,EAAE,UAAUkB,EAAE,CAAC,EAAGA,EAAE,CAAC,CAAC,EAEnBmM,GAAW,IACdD,GAAQ,GACRjF,EAAKA,GAAM7L,EAAG,QAAQ,CAAC,EACvB0D,EAAE,OAAOkB,EAAE,CAAC,EAAGiH,EAAG,EAAIA,EAAG,MAAQ,EAAGA,EAAG,EAAIA,EAAG,OAAS,CAAC,EACxDtK,GAAOqD,EAAE,CAAC,GACHkM,GAAQ,IACXE,GACA7P,EAAK8P,EAAM,EAAErM,EAAE,CAAC,EAAGA,EAAE,CAAC,CAAC,EACvBxD,EAAK6P,EAAM,EAAErM,EAAE,CAAC,EAAGA,EAAE,CAAC,CAAC,EACvBlB,EAAE,OAAOkB,EAAE,CAAC,EAAGzD,EAAIC,CAAE,GAErBsC,EAAE,OAAOkB,EAAE,CAAC,EAAGA,EAAE,CAAC,EAAGA,EAAE,CAAC,CAAC,EAE7BrD,GAAOqD,EAAE,CAAC,GAEPmM,GAAW,IACdD,GAAQ,GAAKA,GAAQ,GACrBjF,EAAKA,GAAM7L,EAAG,QAAQ,CAAC,EACvB0D,EAAE,MAAMkB,EAAE,CAAC,EAAGA,EAAEkM,EAAO,CAAC,EAAGjF,EAAG,EAAIA,EAAG,MAAQ,EAAGA,EAAG,EAAIA,EAAG,OAAS,CAAC,EACpE6E,GAAM9L,EAAE,CAAC,EACT+L,GAAM/L,EAAEkM,EAAO,CAAC,GACTA,GAAQ,IACXE,GACA7P,EAAK8P,EAAM,EAAErM,EAAE,CAAC,EAAGA,EAAE,CAAC,CAAC,EACvBxD,EAAK6P,EAAM,EAAErM,EAAE,CAAC,EAAGA,EAAE,CAAC,CAAC,EACvBlB,EAAE,MAAMkB,EAAE,CAAC,EAAGA,EAAE,CAAC,EAAGzD,EAAIC,CAAE,GAE1BsC,EAAE,MAAMkB,EAAE,CAAC,EAAGA,EAAE,CAAC,EAAGA,EAAE,CAAC,EAAGA,EAAE,CAAC,CAAC,EAElC8L,GAAM9L,EAAE,CAAC,EACT+L,GAAM/L,EAAE,CAAC,GAENmM,GAAW,KAAOD,GAAQ,GACjCpN,EAAE,IAAIkB,EAAE,CAAC,EAAGA,EAAE,CAAC,EAAGA,EAAE,CAAC,EAAGA,EAAE,CAAC,EAAGA,EAAE,CAAC,EAAGA,EAAE,CAAC,CAAC,EAE5CgM,EAAE,OAAS,EACX5Q,EAAG,OAAS0D,CAChB,CASJ1D,EAAG,OAAS0D,EAEZkN,EAAE,GAAKF,EACPE,EAAE,GAAKD,EACPC,EAAE,IAAMrP,EACRqP,EAAE,GAAKJ,EAAK9M,EAAE,EACdkN,EAAE,GAAKH,EAAK/M,EAAE,EAEVgN,GAAM,GAAKC,GAAM,GAAK,CAACpP,GAAOqP,EAAE,MAChCA,EAAE,KAAK,GAAK,CAACJ,EACbI,EAAE,KAAK,GAAK,CAACH,GAEbG,EAAE,OAAS,CAEnB,EACAM,GAAW,SAAUtN,EAAM,CACvB,IAAIP,EAAIO,EAAK,CAAC,EACd,OAAQP,EAAE,YAAY,EAAG,CACrB,IAAK,IAAK,MAAO,CAACA,EAAG,EAAG,CAAC,EACzB,IAAK,IAAK,MAAO,CAACA,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAC,EACrC,IAAK,IAAK,OAAIO,EAAK,QAAU,EAClB,CAACP,EAAG,EAAGO,EAAK,CAAC,EAAGA,EAAK,CAAC,CAAC,EAEvB,CAACP,EAAG,CAAC,EAEhB,IAAK,IAAK,OAAIO,EAAK,QAAU,EAClB,CAACP,EAAG,EAAG,EAAGO,EAAK,CAAC,EAAGA,EAAK,CAAC,CAAC,EAC1BA,EAAK,QAAU,EACf,CAACP,EAAG,EAAG,CAAC,EAER,CAACA,EAAG,CAAC,CAEpB,CACJ,EACA8N,GAAoB9V,EAAE,mBAAqB,SAAUkL,EAAIG,EAAI,CACzDA,EAAK/J,EAAI+J,CAAE,EAAE,QAAQ,gBAAiBH,CAAE,EACxCA,EAAKlL,EAAE,qBAAqBkL,CAAE,GAAK,CAAC,EACpCG,EAAKrL,EAAE,qBAAqBqL,CAAE,GAAK,CAAC,EAMpC,QALI0K,EAAYnU,EAAKsJ,EAAG,OAAQG,EAAG,MAAM,EACrC2K,EAAO,CAAC,EACRC,EAAK,CAAC,EACNjR,EAAI,EAAGC,EAAGE,EACV+Q,EAAKC,EACFnR,EAAI+Q,EAAW/Q,IAAK,CAGvB,GAFAkR,EAAMhL,EAAGlG,CAAC,GAAK6Q,GAASxK,EAAGrG,CAAC,CAAC,EAC7BmR,EAAM9K,EAAGrG,CAAC,GAAK6Q,GAASK,CAAG,EACtBA,EAAI,CAAC,GAAKC,EAAI,CAAC,GACfD,EAAI,CAAC,EAAE,YAAY,GAAK,MAAQA,EAAI,CAAC,GAAKC,EAAI,CAAC,GAAKD,EAAI,CAAC,GAAKC,EAAI,CAAC,IACnED,EAAI,CAAC,EAAE,YAAY,GAAK,MAAQA,EAAI,CAAC,GAAKC,EAAI,CAAC,GAAKD,EAAI,CAAC,GAAKC,EAAI,CAAC,GAEpE,OAIJ,IAFAH,EAAKhR,CAAC,EAAI,CAAC,EACXiR,EAAGjR,CAAC,EAAI,CAAC,EACJC,EAAI,EAAGE,EAAKvD,EAAKsU,EAAI,OAAQC,EAAI,MAAM,EAAGlR,EAAIE,EAAIF,IACnDA,KAAKiR,IAAQF,EAAKhR,CAAC,EAAEC,CAAC,EAAIiR,EAAIjR,CAAC,GAC/BA,KAAKkR,IAAQF,EAAGjR,CAAC,EAAEC,CAAC,EAAIkR,EAAIlR,CAAC,EAErC,CACA,MAAO,CACH,KAAM+Q,EACN,GAAIC,CACR,CACJ,EACJjW,EAAE,cAAgB,SAAUiE,EAAGE,EAAGC,EAAGC,EAAG,CACpC,IAAI+R,EAEJ,GADAA,EAAY/R,GAAK,MAAQ,CAACrE,EAAE,GAAGiE,EAAG,QAAQ,EAAInD,EAAE,IAAI,eAAemD,CAAC,EAAIA,EACpEmS,GAAa,KAGjB,OAAIA,EAAU,QACNjS,GAAK,KACE,CACH,UAAWiS,EACX,MAAOA,EAAU,MAAM,YAAcA,EAAU,YAC/C,OAAQA,EAAU,MAAM,aAAeA,EAAU,YACrD,EAEO,CACH,UAAWA,EACX,MAAOjS,EACP,OAAQC,CACZ,EAGD,CACH,UAAW,EACX,EAAGH,EACH,EAAGE,EACH,MAAOC,EACP,OAAQC,CACZ,CACJ,EAYArE,EAAE,eAAiB0Q,GACnB1Q,EAAE,QAAU,CAAC,EAYbA,EAAE,WAAaqF,GAiBfrF,EAAE,OAAS,SAAU4D,EAAGC,EAAG6C,EAAGpB,EAAGiI,EAAG/M,EAAG,CACnC,OAAO,IAAIgV,GAAO5R,EAAGC,EAAG6C,EAAGpB,EAAGiI,EAAG/M,CAAC,CACtC,EACA,SAASgV,GAAO5R,EAAGC,EAAG6C,EAAGpB,EAAGiI,EAAG/M,EAAG,CAC1BoD,GAAK,MACL,KAAK,EAAI,CAACA,EACV,KAAK,EAAI,CAACC,EACV,KAAK,EAAI,CAAC6C,EACV,KAAK,EAAI,CAACpB,EACV,KAAK,EAAI,CAACiI,EACV,KAAK,EAAI,CAAC/M,IAEV,KAAK,EAAI,EACT,KAAK,EAAI,EACT,KAAK,EAAI,EACT,KAAK,EAAI,EACT,KAAK,EAAI,EACT,KAAK,EAAI,EAEjB,EACC,SAAU6V,EAAa,CAgBpBA,EAAY,IAAM,SAAUzS,EAAGC,EAAG6C,EAAGpB,EAAGiI,EAAG,EAAG,CAC1C,IAAI+I,EAAM,CAAC,CAAC,EAAG,CAAC,EAAG,CAAC,CAAC,EACjBjO,EAAI,CAAC,CAAC,KAAK,EAAG,KAAK,EAAG,KAAK,CAAC,EAAG,CAAC,KAAK,EAAG,KAAK,EAAG,KAAK,CAAC,EAAG,CAAC,EAAG,EAAG,CAAC,CAAC,EAClEtD,EAAS,CAAC,CAACnB,EAAG8C,EAAG6G,CAAC,EAAG,CAAC1J,EAAGyB,EAAG,CAAC,EAAG,CAAC,EAAG,EAAG,CAAC,CAAC,EACzCrB,EAAGE,EAAGwF,EAAGhE,EAMb,IAJI/B,GAAKA,aAAa4R,KAClBzQ,EAAS,CAAC,CAACnB,EAAE,EAAGA,EAAE,EAAGA,EAAE,CAAC,EAAG,CAACA,EAAE,EAAGA,EAAE,EAAGA,EAAE,CAAC,EAAG,CAAC,EAAG,EAAG,CAAC,CAAC,GAGpDK,EAAI,EAAGA,EAAI,EAAGA,IACf,IAAKE,EAAI,EAAGA,EAAI,EAAGA,IAAK,CAEpB,IADAwB,EAAM,EACDgE,EAAI,EAAGA,EAAI,EAAGA,IACfhE,GAAO0C,EAAEpE,CAAC,EAAE0F,CAAC,EAAI5E,EAAO4E,CAAC,EAAExF,CAAC,EAEhCmS,EAAIrS,CAAC,EAAEE,CAAC,EAAIwB,CAChB,CAEJ,KAAK,EAAI2Q,EAAI,CAAC,EAAE,CAAC,EACjB,KAAK,EAAIA,EAAI,CAAC,EAAE,CAAC,EACjB,KAAK,EAAIA,EAAI,CAAC,EAAE,CAAC,EACjB,KAAK,EAAIA,EAAI,CAAC,EAAE,CAAC,EACjB,KAAK,EAAIA,EAAI,CAAC,EAAE,CAAC,EACjB,KAAK,EAAIA,EAAI,CAAC,EAAE,CAAC,CACrB,EAQAD,EAAY,OAAS,UAAY,CAC7B,IAAIE,EAAK,KACLtS,EAAIsS,EAAG,EAAIA,EAAG,EAAIA,EAAG,EAAIA,EAAG,EAChC,OAAO,IAAIf,GAAOe,EAAG,EAAItS,EAAG,CAACsS,EAAG,EAAItS,EAAG,CAACsS,EAAG,EAAItS,EAAGsS,EAAG,EAAItS,GAAIsS,EAAG,EAAIA,EAAG,EAAIA,EAAG,EAAIA,EAAG,GAAKtS,GAAIsS,EAAG,EAAIA,EAAG,EAAIA,EAAG,EAAIA,EAAG,GAAKtS,CAAC,CAChI,EAQAoS,EAAY,MAAQ,UAAY,CAC5B,OAAO,IAAIb,GAAO,KAAK,EAAG,KAAK,EAAG,KAAK,EAAG,KAAK,EAAG,KAAK,EAAG,KAAK,CAAC,CACpE,EAUAa,EAAY,UAAY,SAAUpS,EAAGE,EAAG,CACpC,KAAK,IAAI,EAAG,EAAG,EAAG,EAAGF,EAAGE,CAAC,CAC7B,EAYAkS,EAAY,MAAQ,SAAUpS,EAAGE,EAAG0H,EAAIC,EAAI,CACxC3H,GAAK,OAASA,EAAIF,IACjB4H,GAAMC,IAAO,KAAK,IAAI,EAAG,EAAG,EAAG,EAAGD,EAAIC,CAAE,EACzC,KAAK,IAAI7H,EAAG,EAAG,EAAGE,EAAG,EAAG,CAAC,GACxB0H,GAAMC,IAAO,KAAK,IAAI,EAAG,EAAG,EAAG,EAAG,CAACD,EAAI,CAACC,CAAE,CAC/C,EAWAuK,EAAY,OAAS,SAAUzS,EAAGK,EAAGE,EAAG,CACpCP,EAAI5D,EAAE,IAAI4D,CAAC,EACXK,EAAIA,GAAK,EACTE,EAAIA,GAAK,EACT,IAAI0N,EAAM,CAAClQ,EAAK,IAAIiC,CAAC,EAAE,QAAQ,CAAC,EAC5BkO,EAAM,CAACnQ,EAAK,IAAIiC,CAAC,EAAE,QAAQ,CAAC,EAChC,KAAK,IAAIiO,EAAKC,EAAK,CAACA,EAAKD,EAAK5N,EAAGE,CAAC,EAClC,KAAK,IAAI,EAAG,EAAG,EAAG,EAAG,CAACF,EAAG,CAACE,CAAC,CAC/B,EAWAkS,EAAY,EAAI,SAAUpS,EAAGE,EAAG,CAC5B,OAAOF,EAAI,KAAK,EAAIE,EAAI,KAAK,EAAI,KAAK,CAC1C,EAWAkS,EAAY,EAAI,SAAUpS,EAAGE,EAAG,CAC5B,OAAOF,EAAI,KAAK,EAAIE,EAAI,KAAK,EAAI,KAAK,CAC1C,EACAkS,EAAY,IAAM,SAAU,EAAG,CAC3B,MAAO,CAAC,KAAK/U,EAAI,aAAa,GAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CACpD,EACA+U,EAAY,SAAW,UAAY,CAC/B,OAAOrW,EAAE,IACL,UAAY,CAAC,KAAK,IAAI,CAAC,EAAG,KAAK,IAAI,CAAC,EAAG,KAAK,IAAI,CAAC,EAAG,KAAK,IAAI,CAAC,EAAG,KAAK,IAAI,CAAC,EAAG,KAAK,IAAI,CAAC,CAAC,EAAE,KAAK,EAAI,IACpG,CAAC,KAAK,IAAI,CAAC,EAAG,KAAK,IAAI,CAAC,EAAG,KAAK,IAAI,CAAC,EAAG,KAAK,IAAI,CAAC,EAAG,EAAG,CAAC,EAAE,KAAK,CACxE,EACAqW,EAAY,SAAW,UAAY,CAC/B,MAAO,gDAAkD,KAAK,IAAI,CAAC,EAC/D,SAAW,KAAK,IAAI,CAAC,EAAI,SAAW,KAAK,IAAI,CAAC,EAAI,SAAW,KAAK,IAAI,CAAC,EACvE,QAAU,KAAK,IAAI,CAAC,EAAI,QAAU,KAAK,IAAI,CAAC,EAAI,+BACxD,EACAA,EAAY,OAAS,UAAY,CAC7B,MAAO,CAAC,KAAK,EAAE,QAAQ,CAAC,EAAG,KAAK,EAAE,QAAQ,CAAC,CAAC,CAChD,EACA,SAASG,EAAK5S,EAAG,CACb,OAAOA,EAAE,CAAC,EAAIA,EAAE,CAAC,EAAIA,EAAE,CAAC,EAAIA,EAAE,CAAC,CACnC,CACA,SAAS6S,EAAU7S,EAAG,CAClB,IAAI8S,EAAM/U,EAAK,KAAK6U,EAAK5S,CAAC,CAAC,EAC3BA,EAAE,CAAC,IAAMA,EAAE,CAAC,GAAK8S,GACjB9S,EAAE,CAAC,IAAMA,EAAE,CAAC,GAAK8S,EACrB,CAeAL,EAAY,MAAQ,UAAY,CAC5B,IAAIC,EAAM,CAAC,EAEXA,EAAI,GAAK,KAAK,EACdA,EAAI,GAAK,KAAK,EAGd,IAAIK,EAAM,CAAC,CAAC,KAAK,EAAG,KAAK,CAAC,EAAG,CAAC,KAAK,EAAG,KAAK,CAAC,CAAC,EAC7CL,EAAI,OAAS3U,EAAK,KAAK6U,EAAKG,EAAI,CAAC,CAAC,CAAC,EACnCF,EAAUE,EAAI,CAAC,CAAC,EAEhBL,EAAI,MAAQK,EAAI,CAAC,EAAE,CAAC,EAAIA,EAAI,CAAC,EAAE,CAAC,EAAIA,EAAI,CAAC,EAAE,CAAC,EAAIA,EAAI,CAAC,EAAE,CAAC,EACxDA,EAAI,CAAC,EAAI,CAACA,EAAI,CAAC,EAAE,CAAC,EAAIA,EAAI,CAAC,EAAE,CAAC,EAAIL,EAAI,MAAOK,EAAI,CAAC,EAAE,CAAC,EAAIA,EAAI,CAAC,EAAE,CAAC,EAAIL,EAAI,KAAK,EAE9EA,EAAI,OAAS3U,EAAK,KAAK6U,EAAKG,EAAI,CAAC,CAAC,CAAC,EACnCF,EAAUE,EAAI,CAAC,CAAC,EAChBL,EAAI,OAASA,EAAI,OAGjB,IAAIxE,EAAM,CAAC6E,EAAI,CAAC,EAAE,CAAC,EACf9E,EAAM8E,EAAI,CAAC,EAAE,CAAC,EAClB,OAAI9E,EAAM,GACNyE,EAAI,OAAStW,EAAE,IAAI2B,EAAK,KAAKkQ,CAAG,CAAC,EAC7BC,EAAM,IACNwE,EAAI,OAAS,IAAMA,EAAI,SAG3BA,EAAI,OAAStW,EAAE,IAAI2B,EAAK,KAAKmQ,CAAG,CAAC,EAGrCwE,EAAI,SAAW,CAAC,CAACA,EAAI,MAAM,QAAQ,CAAC,IAAMA,EAAI,OAAO,QAAQ,CAAC,GAAKA,EAAI,OAAO,QAAQ,CAAC,GAAK,CAACA,EAAI,QACjGA,EAAI,cAAgB,CAAC,CAACA,EAAI,MAAM,QAAQ,CAAC,GAAKA,EAAI,OAAO,QAAQ,CAAC,GAAKA,EAAI,OAAO,QAAQ,CAAC,GAAK,CAACA,EAAI,OACrGA,EAAI,WAAa,CAAC,CAACA,EAAI,MAAM,QAAQ,CAAC,GAAK,CAACA,EAAI,OACzCA,CACX,EAQAD,EAAY,kBAAoB,SAAUO,EAAS,CAC/C,IAAIjP,EAAIiP,GAAW,KAAKrV,EAAK,EAAE,EAC/B,OAAIoG,EAAE,UACFA,EAAE,OAAS,CAACA,EAAE,OAAO,QAAQ,CAAC,EAC9BA,EAAE,OAAS,CAACA,EAAE,OAAO,QAAQ,CAAC,EAC9BA,EAAE,OAAS,CAACA,EAAE,OAAO,QAAQ,CAAC,GACrBA,EAAE,IAAMA,EAAE,GAAK,IAAM,CAACA,EAAE,GAAIA,EAAE,EAAE,EAAI,IACpCA,EAAE,QAAU,GAAKA,EAAE,QAAU,EAAI,IAAM,CAACA,EAAE,OAAQA,EAAE,OAAQ,EAAG,CAAC,EAAI,IACpEA,EAAE,OAAS,IAAM,CAACA,EAAE,OAAQ,EAAG,CAAC,EAAI,IAEtC,IAAM,CAAC,KAAK,IAAI,CAAC,EAAG,KAAK,IAAI,CAAC,EAAG,KAAK,IAAI,CAAC,EAAG,KAAK,IAAI,CAAC,EAAG,KAAK,IAAI,CAAC,EAAG,KAAK,IAAI,CAAC,CAAC,CAElG,CACJ,GAAG6N,GAAO,SAAS,EAqWnB,QAnWIqB,GAAiB,UAAY,CAC7B,KAAK,YAAc,EACvB,EACAC,GAAe,UAAY,CACvB,OAAO,KAAK,cAAc,eAAe,CAC7C,EACAC,GAAkB,UAAY,CAC1B,KAAK,aAAe,EACxB,EACAC,GAAY,UAAY,CACpB,OAAO,KAAK,cAAc,gBAAgB,CAC9C,EACAC,GAAmB,SAAU1J,EAAG,CAC5B,IAAI2J,EAAUpW,EAAE,IAAI,gBAAgB,WAAaA,EAAE,IAAI,KAAK,UACxDqW,EAAUrW,EAAE,IAAI,gBAAgB,YAAcA,EAAE,IAAI,KAAK,WAE7D,MAAO,CACH,EAAGyM,EAAE,QAAU4J,EACf,EAAG5J,EAAE,QAAU2J,CACnB,CACJ,EACAE,GAAY,UAAY,CACpB,GAAItW,EAAE,IAAI,iBACN,OAAO,SAAU4E,EAAKF,EAAM6R,EAAIC,EAAS,CACrC,IAAI9W,EAAI,SAAU+M,EAAG,CACjB,IAAIgK,EAAMN,GAAiB1J,CAAC,EAC5B,OAAO8J,EAAG,KAAKC,EAAS/J,EAAGgK,EAAI,EAAGA,EAAI,CAAC,CAC3C,EAGA,GAFA7R,EAAI,iBAAiBF,EAAMhF,EAAG,EAAK,EAE/BY,IAAiBK,GAAS+D,CAAI,EAAG,CACjC,IAAIgS,EAAK,SAAUjK,EAAG,CAIlB,QAHIgK,EAAMN,GAAiB1J,CAAC,EACxBkK,EAAOlK,EAEFvI,EAAI,EAAGE,EAAKqI,EAAE,eAAiBA,EAAE,cAAc,OAAQvI,EAAIE,EAAIF,IACpE,GAAIuI,EAAE,cAAcvI,CAAC,EAAE,QAAUU,EAAK,CAClC6H,EAAIA,EAAE,cAAcvI,CAAC,EACrBuI,EAAE,cAAgBkK,EAClBlK,EAAE,eAAiBuJ,GACnBvJ,EAAE,gBAAkByJ,GACpB,KACJ,CAGJ,OAAOK,EAAG,KAAKC,EAAS/J,EAAGgK,EAAI,EAAGA,EAAI,CAAC,CAC3C,EACA7R,EAAI,iBAAiBjE,GAAS+D,CAAI,EAAGgS,EAAI,EAAK,CAClD,CAEA,OAAO,UAAY,CACf,OAAA9R,EAAI,oBAAoBF,EAAMhF,EAAG,EAAK,EAElCY,IAAiBK,GAAS+D,CAAI,GAC9BE,EAAI,oBAAoBjE,GAAS+D,CAAI,EAAGgS,EAAI,EAAK,EAE9C,EACX,CACJ,EACG,GAAI1W,EAAE,IAAI,YACb,OAAO,SAAU4E,EAAKF,EAAM6R,EAAIC,EAAS,CACrC,IAAI9W,EAAI,SAAU+M,EAAG,CACjBA,EAAIA,GAAKzM,EAAE,IAAI,MACf,IAAIoW,EAAUpW,EAAE,IAAI,gBAAgB,WAAaA,EAAE,IAAI,KAAK,UACxDqW,EAAUrW,EAAE,IAAI,gBAAgB,YAAcA,EAAE,IAAI,KAAK,WACzD,EAAIyM,EAAE,QAAU4J,EAChBhT,EAAIoJ,EAAE,QAAU2J,EACpB,OAAA3J,EAAE,eAAiBA,EAAE,gBAAkBsJ,GACvCtJ,EAAE,gBAAkBA,EAAE,iBAAmBwJ,GAClCM,EAAG,KAAKC,EAAS/J,EAAG,EAAGpJ,CAAC,CACnC,EACAuB,EAAI,YAAY,KAAOF,EAAMhF,CAAC,EAC9B,IAAIkX,EAAW,UAAY,CACvB,OAAAhS,EAAI,YAAY,KAAOF,EAAMhF,CAAC,EACvB,EACX,EACA,OAAOkX,CACX,CAER,EAAG,EACHC,GAAO,CAAC,EACRC,GAAW,SAAUrK,EAAG,CAOpB,QANItJ,EAAIsJ,EAAE,QACNpJ,EAAIoJ,EAAE,QACN2J,EAAUpW,EAAE,IAAI,gBAAgB,WAAaA,EAAE,IAAI,KAAK,UACxDqW,EAAUrW,EAAE,IAAI,gBAAgB,YAAcA,EAAE,IAAI,KAAK,WACzD+W,EACA5S,EAAI0S,GAAK,OACN1S,KAAK,CAER,GADA4S,EAAQF,GAAK1S,CAAC,EACV7D,IAAiBmM,EAAE,SAGnB,QAFIvI,EAAIuI,EAAE,QAAQ,OACduK,EACG9S,KAEH,GADA8S,EAAQvK,EAAE,QAAQvI,CAAC,EACf8S,EAAM,YAAcD,EAAM,GAAG,MAAM,GAAI,CACvC5T,EAAI6T,EAAM,QACV3T,EAAI2T,EAAM,SACTvK,EAAE,cAAgBA,EAAE,cAAgBA,GAAG,eAAe,EACvD,KACJ,OAGJA,EAAE,eAAe,EAErB,IAAIwK,EAAOF,EAAM,GAAG,KAChBtS,EACAyS,EAAOD,EAAK,YACZE,EAASF,EAAK,WACdG,EAAUH,EAAK,MAAM,QACzBjX,EAAE,IAAI,OAASmX,EAAO,YAAYF,CAAI,EACtCA,EAAK,MAAM,QAAU,OACrBxS,EAAIsS,EAAM,GAAG,MAAM,kBAAkB5T,EAAGE,CAAC,EACzC4T,EAAK,MAAM,QAAUG,EACrBpX,EAAE,IAAI,QAAUkX,EAAOC,EAAO,aAAaF,EAAMC,CAAI,EAAIC,EAAO,YAAYF,CAAI,GAChFxS,GAAKtF,EAAI,qBAAuB4X,EAAM,GAAG,GAAIA,EAAM,GAAItS,CAAC,EACxDtB,GAAKkT,EACLhT,GAAK+S,EACLjX,EAAI,qBAAuB4X,EAAM,GAAG,GAAIA,EAAM,YAAcA,EAAM,GAAI5T,EAAI4T,EAAM,GAAG,MAAM,EAAG1T,EAAI0T,EAAM,GAAG,MAAM,EAAG5T,EAAGE,EAAGoJ,CAAC,CAC7H,CACJ,EACA4K,GAAS,SAAU5K,EAAG,CAClBvN,EAAE,YAAY4X,EAAQ,EAAE,UAAUO,EAAM,EAGxC,QAFInT,EAAI2S,GAAK,OACTE,EACG7S,KACH6S,EAAQF,GAAK3S,CAAC,EACd6S,EAAM,GAAG,MAAQ,CAAC,EAClB5X,EAAI,oBAAsB4X,EAAM,GAAG,GAAIA,EAAM,WAAaA,EAAM,aAAeA,EAAM,YAAcA,EAAM,GAAItK,CAAC,EAElHoK,GAAO,CAAC,CACZ,EAeAS,GAAUpY,EAAE,GAAK,CAAC,EAiNTgF,GAAIxD,EAAO,OAAQwD,OACvB,SAAUqT,EAAW,CAClBrY,EAAEqY,CAAS,EAAID,GAAQC,CAAS,EAAI,SAAUhB,EAAI7O,EAAO,CACrD,OAAIxI,EAAE,GAAGqX,EAAI,UAAU,IACnB,KAAK,OAAS,KAAK,QAAU,CAAC,EAC9B,KAAK,OAAO,KAAK,CAAC,KAAMgB,EAAW,EAAGhB,EAAI,OAAQD,GAAS,KAAK,OAAS,KAAK,MAAQtW,EAAE,IAAKuX,EAAWhB,EAAI7O,GAAS,IAAI,CAAC,CAAC,GAExH,IACX,EACAxI,EAAE,KAAOqY,CAAS,EAAID,GAAQ,KAAOC,CAAS,EAAI,SAAUhB,EAAI,CAG5D,QAFI7V,EAAS,KAAK,QAAU,CAAC,EACzBwG,EAAIxG,EAAO,OACRwG,KACCxG,EAAOwG,CAAC,EAAE,MAAQqQ,IAAcrY,EAAE,GAAGqX,EAAI,WAAW,GAAK7V,EAAOwG,CAAC,EAAE,GAAKqP,KACxE7V,EAAOwG,CAAC,EAAE,OAAO,EACjBxG,EAAO,OAAOwG,EAAG,CAAC,EAClB,CAACxG,EAAO,QAAU,OAAO,KAAK,QAGtC,OAAO,IACX,CACJ,GAAGA,EAAOwD,EAAC,CAAC,EA4BhBoT,GAAQ,KAAO,SAAUzY,EAAKH,EAAO,CACjC,IAAI2K,EAAOzG,GAAO,KAAK,EAAE,EAAIA,GAAO,KAAK,EAAE,GAAK,CAAC,EACjD,GAAI,UAAU,QAAU,EACpB,OAAOyG,EAEX,GAAI,UAAU,QAAU,EAAG,CACvB,GAAInK,EAAE,GAAGL,EAAK,QAAQ,EAAG,CACrB,QAAS,KAAKA,EAASA,EAAIkB,EAAG,EAAE,CAAC,GAC7B,KAAK,KAAK,EAAGlB,EAAI,CAAC,CAAC,EAEvB,OAAO,IACX,CACA,OAAAM,EAAI,oBAAsB,KAAK,GAAI,KAAMkK,EAAKxK,CAAG,EAAGA,CAAG,EAChDwK,EAAKxK,CAAG,CACnB,CACA,OAAAwK,EAAKxK,CAAG,EAAIH,EACZS,EAAI,oBAAsB,KAAK,GAAI,KAAMT,EAAOG,CAAG,EAC5C,IACX,EAWAyY,GAAQ,WAAa,SAAUzY,EAAK,CAChC,OAAIA,GAAO,KACP,OAAO+D,GAAO,KAAK,EAAE,EAErBA,GAAO,KAAK,EAAE,GAAK,OAAOA,GAAO,KAAK,EAAE,EAAE/D,CAAG,EAE1C,IACX,EAQAyY,GAAQ,QAAU,UAAY,CAC1B,OAAO3S,GAAM/B,GAAO,KAAK,EAAE,GAAK,CAAC,CAAC,CACtC,EAaA0U,GAAQ,MAAQ,SAAUE,EAAMC,EAAOC,EAAUC,EAAW,CACxD,OAAO,KAAK,UAAUH,EAAME,CAAQ,EAAE,SAASD,EAAOE,GAAaD,CAAQ,CAC/E,EAWAJ,GAAQ,QAAU,SAAUE,EAAMC,EAAO,CACrC,OAAO,KAAK,YAAYD,CAAI,EAAE,WAAWC,CAAK,CAClD,EACA,IAAIG,GAAY,CAAC,EA+BjBN,GAAQ,KAAO,SAAUO,EAAQC,EAASC,EAAOC,EAAYC,EAAaC,EAAW,CACjF,SAASxP,EAAM+D,EAAG,EACbA,EAAE,eAAiBA,GAAG,eAAe,EACtC,IAAItJ,EAAIsJ,EAAE,QACNpJ,EAAIoJ,EAAE,QACN2J,EAAUpW,EAAE,IAAI,gBAAgB,WAAaA,EAAE,IAAI,KAAK,UACxDqW,EAAUrW,EAAE,IAAI,gBAAgB,YAAcA,EAAE,IAAI,KAAK,WAE7D,GADA,KAAK,MAAM,GAAKyM,EAAE,WACdnM,IAAiBmM,EAAE,SAEnB,QADIvI,EAAIuI,EAAE,QAAQ,OAAQuK,EACnB9S,KAGH,GAFA8S,EAAQvK,EAAE,QAAQvI,CAAC,EACnB,KAAK,MAAM,GAAK8S,EAAM,WAClBA,EAAM,YAAc,KAAK,MAAM,GAAI,CACnC7T,EAAI6T,EAAM,QACV3T,EAAI2T,EAAM,QACV,KACJ,EAGR,KAAK,MAAM,EAAI7T,EAAIkT,EACnB,KAAK,MAAM,EAAIhT,EAAI+S,EACnB,CAACS,GAAK,QAAU3X,EAAE,UAAU4X,EAAQ,EAAE,QAAQO,EAAM,EACpDR,GAAK,KAAK,CAAC,GAAI,KAAM,WAAYmB,EAAY,YAAaC,EAAa,UAAWC,CAAS,CAAC,EAC5FJ,GAAW3Y,EAAI,GAAG,sBAAwB,KAAK,GAAI2Y,CAAO,EAC1DD,GAAU1Y,EAAI,GAAG,qBAAuB,KAAK,GAAI0Y,CAAM,EACvDE,GAAS5Y,EAAI,GAAG,oBAAsB,KAAK,GAAI4Y,CAAK,EACpD5Y,EAAI,sBAAwB,KAAK,GAAI8Y,GAAeD,GAAc,KAAM,KAAK,MAAM,EAAG,KAAK,MAAM,EAAGvL,CAAC,CACzG,CACA,YAAK,MAAQ,CAAC,EACdmL,GAAU,KAAK,CAAC,GAAI,KAAM,MAAOlP,CAAK,CAAC,EACvC,KAAK,UAAUA,CAAK,EACb,IACX,EASA4O,GAAQ,WAAa,SAAU5X,EAAG,CAC9BA,EAAIP,EAAI,GAAG,qBAAuB,KAAK,GAAIO,CAAC,EAAIP,EAAI,OAAO,qBAAuB,KAAK,EAAE,CAC7F,EAOAmY,GAAQ,OAAS,UAAY,CAEzB,QADIpT,EAAI0T,GAAU,OACX1T,KAAS0T,GAAU1T,CAAC,EAAE,IAAM,OAC/B,KAAK,YAAY0T,GAAU1T,CAAC,EAAE,KAAK,EACnC0T,GAAU,OAAO1T,EAAG,CAAC,EACrB/E,EAAI,OAAO,kBAAoB,KAAK,EAAE,GAE1C,CAACyY,GAAU,QAAU1Y,EAAE,YAAY4X,EAAQ,EAAE,UAAUO,EAAM,EAC7DR,GAAO,CAAC,CACZ,EAiBA1W,GAAW,OAAS,SAAUgD,EAAGE,EAAG,EAAG,CACnC,IAAImS,EAAMtW,EAAE,QAAQ,OAAO,KAAMiE,GAAK,EAAGE,GAAK,EAAG,GAAK,CAAC,EACvD,YAAK,SAAW,KAAK,QAAQ,KAAKmS,CAAG,EAC9BA,CACX,EAsBArV,GAAW,KAAO,SAAUgD,EAAGE,EAAGC,EAAGC,EAAGC,EAAG,CACvC,IAAIgS,EAAMtW,EAAE,QAAQ,KAAK,KAAMiE,GAAK,EAAGE,GAAK,EAAGC,GAAK,EAAGC,GAAK,EAAGC,GAAK,CAAC,EACrE,YAAK,SAAW,KAAK,QAAQ,KAAKgS,CAAG,EAC9BA,CACX,EAkBArV,GAAW,QAAU,SAAUgD,EAAGE,EAAGK,EAAIC,EAAI,CACzC,IAAI6R,EAAMtW,EAAE,QAAQ,QAAQ,KAAMiE,GAAK,EAAGE,GAAK,EAAGK,GAAM,EAAGC,GAAM,CAAC,EAClE,YAAK,SAAW,KAAK,QAAQ,KAAK6R,CAAG,EAC9BA,CACX,EAiCArV,GAAW,KAAO,SAAU6I,EAAY,CACpCA,GAAc,CAAC9J,EAAE,GAAG8J,EAAY7H,EAAM,GAAK,CAACjC,EAAE,GAAG8J,EAAW,CAAC,EAAG1J,EAAK,IAAM0J,GAAc,GACzF,IAAIwM,EAAMtW,EAAE,QAAQ,KAAKA,EAAE,OAAOK,EAAK,EAAEL,EAAG,SAAS,EAAG,IAAI,EAC5D,YAAK,SAAW,KAAK,QAAQ,KAAKsW,CAAG,EAC9BA,CACX,EAmBArV,GAAW,MAAQ,SAAU8H,EAAK9E,EAAGE,EAAGC,EAAGC,EAAG,CAC1C,IAAIiS,EAAMtW,EAAE,QAAQ,MAAM,KAAM+I,GAAO,cAAe9E,GAAK,EAAGE,GAAK,EAAGC,GAAK,EAAGC,GAAK,CAAC,EACpF,YAAK,SAAW,KAAK,QAAQ,KAAKiS,CAAG,EAC9BA,CACX,EAiBArV,GAAW,KAAO,SAAUgD,EAAGE,EAAG8U,EAAM,CACpC,IAAI3C,EAAMtW,EAAE,QAAQ,KAAK,KAAMiE,GAAK,EAAGE,GAAK,EAAG7C,EAAI2X,CAAI,CAAC,EACxD,YAAK,SAAW,KAAK,QAAQ,KAAK3C,CAAG,EAC9BA,CACX,EAkBArV,GAAW,IAAM,SAAUiY,EAAY,CACnC,CAAClZ,EAAE,GAAGkZ,EAAY,OAAO,IAAMA,EAAa,MAAM,UAAU,OAAO,KAAK,UAAW,EAAG,UAAU,MAAM,GACtG,IAAI5C,EAAM,IAAI6C,GAAID,CAAU,EAC5B,YAAK,SAAW,KAAK,QAAQ,KAAK5C,CAAG,EACrCA,EAAI,MAAW,KACfA,EAAI,KAAU,MACPA,CACX,EAeArV,GAAW,SAAW,SAAUmY,EAAK,CACjC,KAAK,QAAUA,GAAO,KAAK,IAAI,CACnC,EASAnY,GAAW,UAAY,SAAUmY,EAAK,CAClC,IAAI9C,EAAM,KAAK,QACf,cAAO,KAAK,QACLA,CACX,EASArV,GAAW,QAAU,UAAY,CAC7B,IAAImV,EAAY,KAAK,OAAO,WAC5B,MAAO,CACH,MAAOA,EAAU,YACjB,OAAQA,EAAU,YACd,CACR,EAYJnV,GAAW,QAAU,SAAUqP,EAAOC,EAAQ,CAC1C,OAAOvQ,EAAE,QAAQ,QAAQ,KAAK,KAAMsQ,EAAOC,CAAM,CACrD,EAgBAtP,GAAW,WAAa,SAAUgD,EAAGE,EAAGC,EAAGC,EAAGgV,EAAK,CAC/C,OAAOrZ,EAAE,QAAQ,WAAW,KAAK,KAAMiE,EAAGE,EAAGC,EAAGC,EAAGgV,CAAG,CAC1D,EAaApY,GAAW,IAAMA,GAAW,OAAS,KAOrCA,GAAW,QAAUjB,EACrB,IAAIsZ,GAAY,SAAUhP,EAAM,CAC5B,IAAIiP,EAAMjP,EAAK,sBAAsB,EACjCkP,EAAMlP,EAAK,cACXmP,EAAOD,EAAI,KACXE,EAAUF,EAAI,gBACdG,EAAYD,EAAQ,WAAaD,EAAK,WAAa,EAAGG,EAAaF,EAAQ,YAAcD,EAAK,YAAc,EAC5GI,EAAON,EAAI,KAAQzY,EAAE,IAAI,aAAe4Y,EAAQ,WAAaD,EAAK,WAAcE,EAChFG,EAAOP,EAAI,MAAQzY,EAAE,IAAI,aAAe4Y,EAAQ,YAAcD,EAAK,YAAcG,EACrF,MAAO,CACH,EAAGC,EACH,EAAGC,CACP,CACJ,EAeA7Y,GAAW,kBAAoB,SAAUgD,EAAGE,EAAG,CAC3C,IAAI9B,EAAQ,KACR0X,EAAM1X,EAAM,OACZ2X,EAASlZ,EAAE,IAAI,iBAAiBmD,EAAGE,CAAC,EACxC,GAAIrD,EAAE,IAAI,OAASkZ,EAAO,SAAW,MAAO,CACxC,IAAIC,EAAKX,GAAUS,CAAG,EAClBG,EAAKH,EAAI,cAAc,EAC3BG,EAAG,EAAIjW,EAAIgW,EAAG,EACdC,EAAG,EAAI/V,EAAI8V,EAAG,EACdC,EAAG,MAAQA,EAAG,OAAS,EACvB,IAAIC,EAAOJ,EAAI,oBAAoBG,EAAI,IAAI,EACvCC,EAAK,SACLH,EAASG,EAAKA,EAAK,OAAS,CAAC,EAErC,CACA,GAAI,CAACH,EACD,OAAO,KAEX,KAAOA,EAAO,YAAcA,GAAUD,EAAI,YAAc,CAACC,EAAO,SAC5DA,EAASA,EAAO,WAEpB,OAAAA,GAAU3X,EAAM,OAAO,aAAe2X,EAASD,GAC/CC,EAASA,GAAUA,EAAO,QAAU3X,EAAM,QAAQ2X,EAAO,SAAS,EAAI,KAC/DA,CACX,EAaA/Y,GAAW,kBAAoB,SAAU2D,EAAM,CAC3C,IAAIwU,EAAM,KAAK,IAAI,EACnB,YAAK,QAAQ,SAAUzU,EAAI,CACnB3E,EAAE,gBAAgB2E,EAAG,QAAQ,EAAGC,CAAI,GACpCwU,EAAI,KAAKzU,CAAE,CAEnB,CAAC,EACMyU,CACX,EAaAnY,GAAW,QAAU,SAAUmZ,EAAI,CAE/B,QADIC,EAAM,KAAK,OACRA,GAAK,CACR,GAAIA,EAAI,IAAMD,EACV,OAAOC,EAEXA,EAAMA,EAAI,IACd,CACA,OAAO,IACX,EAmBApZ,GAAW,QAAU,SAAUqZ,EAAUC,EAAS,CAE9C,QADIF,EAAM,KAAK,OACRA,GAAK,CACR,GAAIC,EAAS,KAAKC,EAASF,CAAG,IAAM,GAChC,OAAO,KAEXA,EAAMA,EAAI,IACd,CACA,OAAO,IACX,EAaApZ,GAAW,mBAAqB,SAAUgD,EAAGE,EAAG,CAC5C,IAAIiV,EAAM,KAAK,IAAI,EACnB,YAAK,QAAQ,SAAUzU,EAAI,CACnBA,EAAG,cAAcV,EAAGE,CAAC,GACrBiV,EAAI,KAAKzU,CAAE,CAEnB,CAAC,EACMyU,CACX,EACA,SAASoB,IAAM,CACX,OAAO,KAAK,EAAInZ,EAAI,KAAK,CAC7B,CACA,SAASoZ,IAAU,CACf,OAAO,KAAK,EAAIpZ,EAAI,KAAK,EAAIA,EAAI,KAAK,MAAQ,SAAW,KAAK,MAClE,CAaA+W,GAAQ,cAAgB,SAAUnU,EAAGE,EAAG,CACpC,IAAIuW,EAAK,KAAK,SAAWhW,GAAQ,KAAK,IAAI,EAAE,IAAI,EAChD,OAAI,KAAK,KAAK,WAAW,GAAK,KAAK,KAAK,WAAW,EAAE,SACjDgW,EAAK1a,EAAE,cAAc0a,EAAI,KAAK,KAAK,WAAW,CAAC,GAE5C1a,EAAE,kBAAkB0a,EAAIzW,EAAGE,CAAC,CACvC,EAoBAiU,GAAQ,QAAU,SAAUuC,EAAoB,CAC5C,GAAI,KAAK,QACL,MAAO,CAAC,EAEZ,IAAIpF,EAAI,KAAK,EACb,OAAIoF,IACIpF,EAAE,OAAS,CAACA,EAAE,UACd,KAAK,SAAW7Q,GAAQ,KAAK,IAAI,EAAE,IAAI,EACvC6Q,EAAE,OAASxF,GAAe,KAAK,QAAQ,EACvCwF,EAAE,OAAO,SAAWkF,GACpBlF,EAAE,MAAQ,GAEPA,EAAE,UAETA,EAAE,OAASA,EAAE,QAAU,CAACA,EAAE,SACtBA,EAAE,OAAS,CAAC,KAAK,YACjBA,EAAE,OAAS,EACX,KAAK,SAAW7Q,GAAQ,KAAK,IAAI,EAAE,IAAI,GAE3C6Q,EAAE,KAAOxF,GAAelL,GAAQ,KAAK,SAAU,KAAK,MAAM,CAAC,EAC3D0Q,EAAE,KAAK,SAAWkF,GAClBlF,EAAE,MAAQA,EAAE,OAAS,GAElBA,EAAE,KACb,EAQA6C,GAAQ,MAAQ,UAAY,CACxB,GAAI,KAAK,QACL,OAAO,KAEX,IAAI9B,EAAM,KAAK,MAAM,KAAK,IAAI,EAAE,EAAE,KAAK,KAAK,KAAK,CAAC,EAClD,YAAK,SAAW,KAAK,QAAQ,KAAKA,CAAG,EAC9BA,CACX,EAsBA8B,GAAQ,KAAO,SAAUwC,EAAM,CAC3B,GAAI,KAAK,MAAQ,OACb,OAAO,KAEXA,EAAOA,GAAQ,CAAC,EAChB,IAAIjT,EAAI,CACJ,OAAQiT,EAAK,OAAS,KAAO,CAAC,KAAK,KAAK,cAAc,GAAK,GAC3D,KAAMA,EAAK,MAAQ,GACnB,QAASA,EAAK,SAAW,KAAO,GAAKA,EAAK,QAC1C,QAASA,EAAK,SAAW,EACzB,QAASA,EAAK,SAAW,EACzB,MAAOA,EAAK,OAAS,MACzB,EACIlU,EAAIiB,EAAE,MAAQ,EACdrD,EAAI,KAAK,MACTgS,EAAMhS,EAAE,IAAI,EACZQ,EAAO,KAAK,UAAYJ,GAAQ,KAAK,IAAI,EAAE,IAAI,EACnDI,EAAO,KAAK,OAASD,GAAQC,EAAM,KAAK,MAAM,EAAIA,EAClD,QAASE,EAAI,EAAGA,EAAI0B,EAAI,EAAG1B,IACvBsR,EAAI,KAAKhS,EAAE,KAAKQ,CAAI,EAAE,KAAK,CACvB,OAAQ6C,EAAE,MACV,KAAMA,EAAE,KAAOA,EAAE,MAAQ,OACzB,kBAAmB,QACnB,iBAAkB,QAClB,eAAgB,EAAEA,EAAE,MAAQjB,EAAI1B,GAAG,QAAQ,CAAC,EAC5C,QAAS,EAAE2C,EAAE,QAAUjB,GAAG,QAAQ,CAAC,CACvC,CAAC,CAAC,EAEN,OAAO4P,EAAI,aAAa,IAAI,EAAE,UAAU3O,EAAE,QAASA,EAAE,OAAO,CAChE,EACA,IAAIkT,GAAgB,CAAC,EACrBC,GAA0B,SAAUpQ,EAAKC,EAAKC,EAAKC,EAAKC,EAAKC,EAAKC,EAAKC,EAAK8P,EAAQ,CAChF,OAAIA,GAAU,KACHvO,GAAO9B,EAAKC,EAAKC,EAAKC,EAAKC,EAAKC,EAAKC,EAAKC,CAAG,EAE7CjL,EAAE,kBAAkB0K,EAAKC,EAAKC,EAAKC,EAAKC,EAAKC,EAAKC,EAAKC,EAAKmC,GAAU1C,EAAKC,EAAKC,EAAKC,EAAKC,EAAKC,EAAKC,EAAKC,EAAK8P,CAAM,CAAC,CAEpI,EACAC,GAAmB,SAAUC,EAASC,EAAS,CAC3C,OAAO,SAAUpW,EAAMiW,EAAQI,EAAW,CACtCrW,EAAOO,GAAWP,CAAI,EAGtB,QAFIb,EAAGE,EAAG0F,EAAG7B,EAAGoT,EAAK,GAAIC,EAAW,CAAC,EAAGC,EACpC1K,EAAM,EACD5L,EAAI,EAAGE,EAAKJ,EAAK,OAAQE,EAAIE,EAAIF,IAAK,CAE3C,GADA6E,EAAI/E,EAAKE,CAAC,EACN6E,EAAE,CAAC,GAAK,IACR5F,EAAI,CAAC4F,EAAE,CAAC,EACR1F,EAAI,CAAC0F,EAAE,CAAC,MACL,CAEH,GADA7B,EAAI8S,GAAwB7W,EAAGE,EAAG0F,EAAE,CAAC,EAAGA,EAAE,CAAC,EAAGA,EAAE,CAAC,EAAGA,EAAE,CAAC,EAAGA,EAAE,CAAC,EAAGA,EAAE,CAAC,CAAC,EAChE+G,EAAM5I,EAAI+S,EAAQ,CAClB,GAAIG,GAAW,CAACG,EAAS,MAAO,CAG5B,GAFAC,EAAQR,GAAwB7W,EAAGE,EAAG0F,EAAE,CAAC,EAAGA,EAAE,CAAC,EAAGA,EAAE,CAAC,EAAGA,EAAE,CAAC,EAAGA,EAAE,CAAC,EAAGA,EAAE,CAAC,EAAGkR,EAASnK,CAAG,EACtFwK,GAAM,CAAC,IAAME,EAAM,MAAM,EAAGA,EAAM,MAAM,EAAGA,EAAM,EAAE,EAAGA,EAAM,EAAE,EAAGA,EAAM,EAAGA,EAAM,CAAC,EAC7EH,EAAY,OAAOC,EACvBC,EAAS,MAAQD,EACjBA,EAAK,CAAC,IAAME,EAAM,EAAGA,EAAM,EAAI,IAAMA,EAAM,EAAE,EAAGA,EAAM,EAAE,EAAGA,EAAM,IAAI,EAAGA,EAAM,IAAI,EAAGzR,EAAE,CAAC,EAAGA,EAAE,CAAC,CAAC,EAAE,KAAK,EACtG+G,GAAO5I,EACP/D,EAAI,CAAC4F,EAAE,CAAC,EACR1F,EAAI,CAAC0F,EAAE,CAAC,EACR,QACJ,CACA,GAAI,CAACoR,GAAW,CAACC,EACb,OAAAI,EAAQR,GAAwB7W,EAAGE,EAAG0F,EAAE,CAAC,EAAGA,EAAE,CAAC,EAAGA,EAAE,CAAC,EAAGA,EAAE,CAAC,EAAGA,EAAE,CAAC,EAAGA,EAAE,CAAC,EAAGkR,EAASnK,CAAG,EAC/E,CAAC,EAAG0K,EAAM,EAAG,EAAGA,EAAM,EAAG,MAAOA,EAAM,KAAK,CAE1D,CACA1K,GAAO5I,EACP/D,EAAI,CAAC4F,EAAE,CAAC,EACR1F,EAAI,CAAC0F,EAAE,CAAC,CACZ,CACAuR,GAAMvR,EAAE,MAAM,EAAIA,CACtB,CACA,OAAAwR,EAAS,IAAMD,EACfE,EAAQL,EAAUrK,EAAMsK,EAAUG,EAAWrb,EAAE,kBAAkBiE,EAAGE,EAAG0F,EAAE,CAAC,EAAGA,EAAE,CAAC,EAAGA,EAAE,CAAC,EAAGA,EAAE,CAAC,EAAGA,EAAE,CAAC,EAAGA,EAAE,CAAC,EAAG,CAAC,EAC5GyR,EAAM,QAAUA,EAAQ,CAAC,EAAGA,EAAM,EAAG,EAAGA,EAAM,EAAG,MAAOA,EAAM,KAAK,GAC5DA,CACX,CACJ,EACIC,GAAiBP,GAAiB,CAAC,EACnCQ,GAAmBR,GAAiB,EACpCS,GAAsBT,GAAiB,EAAG,CAAC,EAa/Chb,EAAE,eAAiBub,GAmBnBvb,EAAE,iBAAmBwb,GAerBxb,EAAE,WAAa,SAAU8E,EAAMkR,EAAMC,EAAI,CACrC,GAAI,KAAK,eAAenR,CAAI,EAAImR,EAAK,KACjC,OAAOwF,GAAoB3W,EAAMkR,CAAI,EAAE,IAE3C,IAAIpS,EAAI6X,GAAoB3W,EAAMmR,EAAI,CAAC,EACvC,OAAOD,EAAOyF,GAAoB7X,EAAGoS,CAAI,EAAE,IAAMpS,CACrD,EAQAwU,GAAQ,eAAiB,UAAY,CACjC,IAAItT,EAAO,KAAK,QAAQ,EACxB,GAAKA,EAIL,OAAI,KAAK,KAAK,eACH,KAAK,KAAK,eAAe,EAG7ByW,GAAezW,CAAI,CAC9B,EAkBAsT,GAAQ,iBAAmB,SAAU2C,EAAQ,CACzC,IAAIjW,EAAO,KAAK,QAAQ,EACxB,GAAKA,EAIL,OAAO0W,GAAiB1W,EAAMiW,CAAM,CACxC,EASA3C,GAAQ,QAAU,UAAY,CAC1B,IAAItT,EACAJ,EAAU1E,EAAE,SAAS,KAAK,IAAI,EAElC,GAAI,OAAK,MAAQ,QAAU,KAAK,MAAQ,OAIxC,OAAI0E,IACAI,EAAOJ,EAAQ,IAAI,GAGhBI,CACX,EAcAsT,GAAQ,WAAa,SAAUpC,EAAMC,EAAI,CACrC,IAAInR,EAAO,KAAK,QAAQ,EACxB,GAAKA,EAIL,OAAO9E,EAAE,WAAW8E,EAAMkR,EAAMC,CAAE,CACtC,EAkBA,IAAIyF,GAAK1b,EAAE,gBAAkB,CACzB,OAAQ,SAAU4M,EAAG,CACjB,OAAOA,CACX,EACA,IAAK,SAAUA,EAAG,CACd,OAAO7K,GAAI6K,EAAG,GAAG,CACrB,EACA,IAAK,SAAUA,EAAG,CACd,OAAO7K,GAAI6K,EAAG,GAAG,CACrB,EACA,KAAM,SAAUA,EAAG,CACf,IAAI+O,EAAI,IAAM/O,EAAI,KACdgP,EAAIja,EAAK,KAAK,MAAQga,EAAIA,CAAC,EAC3B1X,EAAI2X,EAAID,EACR7T,EAAI/F,GAAID,EAAImC,CAAC,EAAG,EAAI,CAAC,GAAKA,EAAI,EAAI,GAAK,GACvCE,EAAI,CAACyX,EAAID,EACT3L,EAAIjO,GAAID,EAAIqC,CAAC,EAAG,EAAI,CAAC,GAAKA,EAAI,EAAI,GAAK,GACvCoF,EAAIzB,EAAIkI,EAAI,GAChB,OAAQ,EAAIzG,GAAK,EAAIA,EAAIA,EAAIA,EAAIA,EAAIA,CACzC,EACA,OAAQ,SAAUqD,EAAG,CACjB,IAAIjF,EAAI,QACR,OAAOiF,EAAIA,IAAMjF,EAAI,GAAKiF,EAAIjF,EAClC,EACA,QAAS,SAAUiF,EAAG,CAClBA,EAAIA,EAAI,EACR,IAAIjF,EAAI,QACR,OAAOiF,EAAIA,IAAMjF,EAAI,GAAKiF,EAAIjF,GAAK,CACvC,EACA,QAAS,SAAUiF,EAAG,CAClB,OAAIA,GAAK,CAAC,CAACA,EACAA,EAEJ7K,GAAI,EAAG,IAAM6K,CAAC,EAAIjL,EAAK,KAAKiL,EAAI,OAAS,EAAI5K,IAAM,EAAE,EAAI,CACpE,EACA,OAAQ,SAAU4K,EAAG,CACjB,IAAIjF,EAAI,OACJkC,EAAI,KACJ7B,EACJ,OAAI4E,EAAK,EAAI/C,EACT7B,EAAIL,EAAIiF,EAAIA,EAERA,EAAK,EAAI/C,GACT+C,GAAM,IAAM/C,EACZ7B,EAAIL,EAAIiF,EAAIA,EAAI,KAEZA,EAAK,IAAM/C,GACX+C,GAAM,KAAO/C,EACb7B,EAAIL,EAAIiF,EAAIA,EAAI,QAEhBA,GAAM,MAAQ/C,EACd7B,EAAIL,EAAIiF,EAAIA,EAAI,SAIrB5E,CACX,CACJ,EACA0T,GAAG,OAASA,GAAG,SAAS,EAAIA,GAAG,GAAG,EAClCA,GAAG,QAAUA,GAAG,UAAU,EAAIA,GAAG,GAAG,EACpCA,GAAG,UAAYA,GAAG,aAAa,EAAIA,GAAG,IAAI,EAC1CA,GAAG,SAAS,EAAIA,GAAG,OACnBA,GAAG,UAAU,EAAIA,GAAG,QAEpB,IAAIG,GAAoB,CAAC,EACrBC,GAAmB,OAAO,uBACP,OAAO,6BACP,OAAO,0BACP,OAAO,wBACP,OAAO,yBACP,SAAUxB,EAAU,CAChB,WAAWA,EAAU,EAAE,CAC3B,EACnByB,GAAY,UAAY,CAGpB,QAFIC,EAAM,CAAC,IAAI,KACXhU,EAAI,EACDA,EAAI6T,GAAkB,OAAQ7T,IAAK,CACtC,IAAIuF,EAAIsO,GAAkB7T,CAAC,EAC3B,GAAI,EAAAuF,EAAE,GAAG,SAAWA,EAAE,QAGtB,KAAI0O,EAAOD,EAAMzO,EAAE,MACf2O,EAAK3O,EAAE,GACP4O,EAAS5O,EAAE,OACXyI,EAAOzI,EAAE,KACT6O,EAAO7O,EAAE,KACT0I,EAAK1I,EAAE,GACPhE,EAAIgE,EAAE,EACN8O,EAAO9O,EAAE,GACT6L,EAAM,CAAC,EACPkD,EACAC,EAAO,CAAC,EACR5c,EASJ,GARI4N,EAAE,YACF0O,GAAQ1O,EAAE,WAAaA,EAAE,KAAK,IAAMA,EAAE,OAASA,EAAE,QAAUA,EAAE,MAAQ2O,EACrE3O,EAAE,OAASA,EAAE,WACb,OAAOA,EAAE,WACTA,EAAE,MAAQsO,GAAkB,OAAO7T,IAAK,CAAC,GAEzCuF,EAAE,QAAUA,EAAE,MAAQA,EAAE,QAAUA,EAAE,OAAS0O,EAAOC,IAAO3O,EAAE,KAAK,IAElE,EAAA0O,EAAO,GAGX,GAAIA,EAAOC,EAAI,CACX,IAAI3E,EAAM4E,EAAOF,EAAOC,CAAE,EAC1B,QAASM,KAAQxG,EAAM,GAAIA,EAAKnV,EAAG,EAAE2b,CAAI,EAAG,CACxC,OAAQvZ,GAAmBuZ,CAAI,EAAG,CAC9B,KAAKlc,GACDgc,EAAM,CAACtG,EAAKwG,CAAI,EAAIjF,EAAM2E,EAAKE,EAAKI,CAAI,EACxC,MACJ,IAAK,SACDF,EAAM,OAAS,CACXG,GAAQ9Z,EAAMqT,EAAKwG,CAAI,EAAE,EAAIjF,EAAM2E,EAAKE,EAAKI,CAAI,EAAE,CAAC,CAAC,EACrDC,GAAQ9Z,EAAMqT,EAAKwG,CAAI,EAAE,EAAIjF,EAAM2E,EAAKE,EAAKI,CAAI,EAAE,CAAC,CAAC,EACrDC,GAAQ9Z,EAAMqT,EAAKwG,CAAI,EAAE,EAAIjF,EAAM2E,EAAKE,EAAKI,CAAI,EAAE,CAAC,CAAC,CACzD,EAAE,KAAK,GAAG,EAAI,IACd,MACJ,IAAK,OACDF,EAAM,CAAC,EACP,QAAStX,EAAI,EAAGE,EAAK8Q,EAAKwG,CAAI,EAAE,OAAQxX,EAAIE,EAAIF,IAAK,CACjDsX,EAAItX,CAAC,EAAI,CAACgR,EAAKwG,CAAI,EAAExX,CAAC,EAAE,CAAC,CAAC,EAC1B,QAASC,EAAI,EAAGE,EAAK6Q,EAAKwG,CAAI,EAAExX,CAAC,EAAE,OAAQC,EAAIE,EAAIF,IAC/CqX,EAAItX,CAAC,EAAEC,CAAC,EAAI,CAAC+Q,EAAKwG,CAAI,EAAExX,CAAC,EAAEC,CAAC,EAAIsS,EAAM2E,EAAKE,EAAKI,CAAI,EAAExX,CAAC,EAAEC,CAAC,EAE9DqX,EAAItX,CAAC,EAAIsX,EAAItX,CAAC,EAAE,KAAK3D,CAAC,CAC1B,CACAib,EAAMA,EAAI,KAAKjb,CAAC,EAChB,MACJ,IAAK,YACD,GAAI+a,EAAKI,CAAI,EAAE,KAEX,IADAF,EAAM,CAAC,EACFtX,EAAI,EAAGE,EAAK8Q,EAAKwG,CAAI,EAAE,OAAQxX,EAAIE,EAAIF,IAExC,IADAsX,EAAItX,CAAC,EAAI,CAACgR,EAAKwG,CAAI,EAAExX,CAAC,EAAE,CAAC,CAAC,EACrBC,EAAI,EAAGE,EAAK6Q,EAAKwG,CAAI,EAAExX,CAAC,EAAE,OAAQC,EAAIE,EAAIF,IAC3CqX,EAAItX,CAAC,EAAEC,CAAC,EAAI+Q,EAAKwG,CAAI,EAAExX,CAAC,EAAEC,CAAC,EAAIsS,EAAM2E,EAAKE,EAAKI,CAAI,EAAExX,CAAC,EAAEC,CAAC,MAG9D,CACH,IAAIyX,EAAM,SAAU1X,GAAG,CACnB,MAAO,CAACgR,EAAKwG,CAAI,EAAExX,EAAC,EAAIuS,EAAM2E,EAAKE,EAAKI,CAAI,EAAExX,EAAC,CACnD,EAEAsX,EAAM,CAAC,CAAC,IAAKI,EAAI,CAAC,EAAGA,EAAI,CAAC,EAAGA,EAAI,CAAC,EAAGA,EAAI,CAAC,EAAGA,EAAI,CAAC,EAAGA,EAAI,CAAC,CAAC,CAAC,CAChE,CACA,MACJ,IAAK,MACD,GAAIF,GAAQ,YAGR,IAFAF,EAAM,CAAC,EACPtX,EAAI,EACGA,KACHsX,EAAItX,CAAC,EAAI,CAACgR,EAAKwG,CAAI,EAAExX,CAAC,EAAIuS,EAAM2E,EAAKE,EAAKI,CAAI,EAAExX,CAAC,EAGzD,MACJ,QACI,IAAI2X,GAAQ,CAAC,EAAExb,CAAM,EAAE6U,EAAKwG,CAAI,CAAC,EAGjC,IAFAF,EAAM,CAAC,EACPtX,EAAIqX,EAAK,MAAM,iBAAiBG,CAAI,EAAE,OAC/BxX,KACHsX,EAAItX,CAAC,EAAI,CAAC2X,GAAM3X,CAAC,EAAIuS,EAAM2E,EAAKE,EAAKI,CAAI,EAAExX,CAAC,EAEhD,KACR,CACAoU,EAAIoD,CAAI,EAAIF,CAChB,CACAD,EAAK,KAAKjD,CAAG,EACZ,SAAUgB,GAAIiC,GAAMO,GAAM,CACvB,WAAW,UAAY,CACnB3c,EAAI,sBAAwBma,GAAIiC,GAAMO,EAAI,CAC9C,CAAC,CACL,EAAGP,EAAK,GAAIA,EAAM9O,EAAE,IAAI,CAC5B,KAAO,CAUH,GATC,SAAS/M,GAAGmE,GAAIf,GAAG,CAChB,WAAW,UAAW,CAClB3D,EAAI,sBAAwB0E,GAAG,GAAIA,GAAIf,EAAC,EACxC3D,EAAI,uBAAyB0E,GAAG,GAAIA,GAAIf,EAAC,EACzC5D,EAAE,GAAGQ,GAAG,UAAU,GAAKA,GAAE,KAAKmE,EAAE,CACpC,CAAC,CACL,EAAG4I,EAAE,SAAU8O,EAAM9O,EAAE,IAAI,EAC3B8O,EAAK,KAAKpG,CAAE,EACZ4F,GAAkB,OAAO7T,IAAK,CAAC,EAC3BuF,EAAE,OAAS,GAAK,CAACA,EAAE,KAAM,CACzB,IAAK5N,KAAOsW,EAAQA,EAAGpV,EAAG,EAAElB,CAAG,IAC3B4c,EAAK5c,CAAG,EAAI4N,EAAE,YAAY5N,CAAG,GAEjC4N,EAAE,GAAG,KAAKgP,CAAI,EACdM,GAAatP,EAAE,KAAMA,EAAE,GAAIA,EAAE,KAAK,SAAS,CAAC,EAAG,KAAMA,EAAE,YAAaA,EAAE,OAAS,CAAC,CACpF,CACIA,EAAE,MAAQ,CAACA,EAAE,MACbsP,GAAatP,EAAE,KAAMA,EAAE,GAAIA,EAAE,KAAM,KAAMA,EAAE,YAAaA,EAAE,MAAM,CAExE,EACJ,CACAsO,GAAkB,QAAUC,GAAiBC,EAAS,CAC1D,EACAU,GAAU,SAAU3V,EAAO,CACvB,OAAOA,EAAQ,IAAM,IAAMA,EAAQ,EAAI,EAAIA,CAC/C,EAsBJsR,GAAQ,YAAc,SAAUzT,EAAIiY,EAAMxS,EAAQ8R,EAAIC,EAAQ7B,EAAU,CACpE,IAAIhD,EAAU,KACd,GAAIA,EAAQ,QACR,OAAAgD,GAAYA,EAAS,KAAKhD,CAAO,EAC1BA,EAEX,IAAI1T,EAAIwG,aAAkB0S,GAAY1S,EAASpK,EAAE,UAAUoK,EAAQ8R,EAAIC,EAAQ7B,CAAQ,EACnFrW,EAAGE,EACP0Y,GAAajZ,EAAG0T,EAAS1T,EAAE,SAAS,CAAC,EAAG,KAAM0T,EAAQ,KAAK,CAAC,EAC5D,QAAStS,EAAI,EAAGE,EAAK2W,GAAkB,OAAQ7W,EAAIE,EAAIF,IACnD,GAAI6W,GAAkB7W,CAAC,EAAE,MAAQ4X,GAAQf,GAAkB7W,CAAC,EAAE,IAAML,EAAI,CACpEkX,GAAkB3W,EAAK,CAAC,EAAE,MAAQ2W,GAAkB7W,CAAC,EAAE,MACvD,KACJ,CAEJ,OAAOsS,CAMX,EACA,SAASyF,GAAkB,EAAGrS,EAAKC,EAAKK,EAAKC,EAAK+R,EAAU,CACxD,IAAInR,EAAK,EAAInB,EACTuS,EAAK,GAAKjS,EAAMN,GAAOmB,EACvBF,EAAK,EAAIE,EAAKoR,EACdnR,EAAK,EAAInB,EACTuS,EAAK,GAAKjS,EAAMN,GAAOmB,EACvBF,EAAK,EAAIE,EAAKoR,EAClB,SAASC,EAAa5T,EAAG,CACrB,QAASoC,EAAKpC,EAAI0T,GAAM1T,EAAIsC,GAAMtC,CACtC,CACA,SAAS6T,EAAMnZ,EAAGoZ,EAAS,CACvB,IAAI9T,EAAI+T,EAAYrZ,EAAGoZ,CAAO,EAC9B,QAASzR,EAAKrC,EAAI2T,GAAM3T,EAAIuC,GAAMvC,CACtC,CACA,SAAS+T,EAAYrZ,EAAGoZ,EAAS,CAC7B,IAAIE,EAAIrS,EAAIG,EAAIvF,EAAI0X,EAAIxY,GACxB,IAAIqG,EAAKpH,EAAGe,GAAI,EAAGA,GAAI,EAAGA,KAAK,CAE3B,GADAc,EAAKqX,EAAa9R,CAAE,EAAIpH,EACpBnC,EAAIgE,CAAE,EAAIuX,EACV,OAAOhS,EAGX,GADAmS,GAAM,EAAI7R,EAAKN,EAAK,EAAI4R,GAAM5R,EAAKQ,EAC/B/J,EAAI0b,CAAE,EAAI,KACV,MAEJnS,EAAKA,EAAKvF,EAAK0X,CACnB,CAIA,GAHAD,EAAK,EACLrS,EAAK,EACLG,EAAKpH,EACDoH,EAAKkS,EACL,OAAOA,EAEX,GAAIlS,EAAKH,EACL,OAAOA,EAEX,KAAOqS,EAAKrS,GAAI,CAEZ,GADApF,EAAKqX,EAAa9R,CAAE,EAChBvJ,EAAIgE,EAAK7B,CAAC,EAAIoZ,EACd,OAAOhS,EAEPpH,EAAI6B,EACJyX,EAAKlS,EAELH,EAAKG,EAETA,GAAMH,EAAKqS,GAAM,EAAIA,CACzB,CACA,OAAOlS,CACX,CACA,OAAO+R,EAAM,EAAG,GAAK,IAAMJ,EAAS,CACxC,CACA5E,GAAQ,YAAc,SAAU5X,EAAG,CAC/B,OAAAA,EAAIP,EAAI,GAAG,sBAAwB,KAAK,GAAIO,CAAC,EAAIP,EAAI,OAAO,sBAAwB,KAAK,EAAE,EACpF,IACX,EACA,SAAS6c,GAAUF,EAAMV,EAAI,CACzB,IAAIuB,EAAW,CAAC,EACZC,EAAU,CAAC,EAGf,GAFA,KAAK,GAAKxB,EACV,KAAK,MAAQ,EACTU,EAAM,CACN,QAASJ,KAAQI,EAAUA,EAAK/b,EAAG,EAAE2b,CAAI,IACrCkB,EAAQ7a,EAAQ2Z,CAAI,CAAC,EAAII,EAAKJ,CAAI,EAClCiB,EAAS,KAAK5a,EAAQ2Z,CAAI,CAAC,GAE/BiB,EAAS,KAAK3Z,EAAY,CAC9B,CACA,KAAK,KAAO4Z,EACZ,KAAK,IAAMD,EAASA,EAAS,OAAS,CAAC,EACvC,KAAK,SAAWA,CACpB,CAgBAX,GAAU,UAAU,MAAQ,SAAUa,EAAO,CACzC,IAAI/Z,EAAI,IAAIkZ,GAAU,KAAK,KAAM,KAAK,EAAE,EACxC,OAAAlZ,EAAE,MAAQ,KAAK,MACfA,EAAE,IAAM,CAAC+Z,GAAS,EACX/Z,CACX,EAaAkZ,GAAU,UAAU,OAAS,SAAUc,EAAO,CAC1C,IAAIha,EAAI,IAAIkZ,GAAU,KAAK,KAAM,KAAK,EAAE,EACxC,OAAAlZ,EAAE,IAAM,KAAK,IACbA,EAAE,MAAQjC,EAAK,MAAMC,EAAKgc,EAAO,CAAC,CAAC,GAAK,EACjCha,CACX,EACA,SAASiZ,GAAaD,EAAMtF,EAASuG,EAASC,EAAQC,EAAaH,EAAO,CACtEC,EAAUhb,EAAQgb,CAAO,EACzB,IAAIzT,EACA4T,EACAC,EACAR,EAAW,CAAC,EACZzF,EACAkG,EACAC,EACAjC,EAAKU,EAAK,GACV5G,EAAO,CAAC,EACRC,EAAK,CAAC,EACNmG,EAAO,CAAC,EACZ,GAAI0B,EACA,IAAK9Y,EAAI,EAAGE,EAAK2W,GAAkB,OAAQ7W,EAAIE,EAAIF,IAAK,CACpD,IAAIuI,EAAIsO,GAAkB7W,CAAC,EAC3B,GAAIuI,EAAE,GAAG,IAAM+J,EAAQ,IAAM/J,EAAE,MAAQqP,EAAM,CACrCrP,EAAE,SAAWsQ,GACbhC,GAAkB,OAAO7W,EAAG,CAAC,EAC7BiZ,EAAc,GAEdD,EAAWzQ,EAEf+J,EAAQ,KAAK/J,EAAE,WAAW,EAC1B,KACJ,CACJ,MAEAuQ,EAAS,CAAC7H,EAEd,QAASjR,EAAI,EAAGE,EAAK0X,EAAK,SAAS,OAAQ5X,EAAIE,EAAIF,IAC/C,GAAI4X,EAAK,SAAS5X,CAAC,GAAK6Y,GAAWjB,EAAK,SAAS5X,CAAC,EAAI8Y,EAASlB,EAAK,IAAK,CACrEiB,EAAUjB,EAAK,SAAS5X,CAAC,EACzBkZ,EAAOtB,EAAK,SAAS5X,EAAI,CAAC,GAAK,EAC/BkX,EAAKA,EAAKU,EAAK,KAAOiB,EAAUK,GAChClG,EAAO4E,EAAK,SAAS5X,EAAI,CAAC,EAC1BoF,EAASwS,EAAK,KAAKiB,CAAO,EAC1B,KACJ,MAAWC,GACPxG,EAAQ,KAAKsF,EAAK,KAAKA,EAAK,SAAS5X,CAAC,CAAC,CAAC,EAGhD,GAAKoF,EAGL,IAAK4T,EA4JDA,EAAS,WAAaF,EACtBE,EAAS,MAAQ,IAAI,KAAOA,EAAS,GAAKF,MA7J/B,CACX,QAAStB,KAAQpS,EAAQ,GAAIA,EAAOvJ,EAAG,EAAE2b,CAAI,IACrCvZ,GAAmBpC,EAAG,EAAE2b,CAAI,GAAKlF,EAAQ,MAAM,iBAAiBzW,EAAG,EAAE2b,CAAI,GAIzE,OAHAxG,EAAKwG,CAAI,EAAIlF,EAAQ,KAAKkF,CAAI,EAC7BxG,EAAKwG,CAAI,GAAK,OAAUxG,EAAKwG,CAAI,EAAIxZ,GAAewZ,CAAI,GACzDvG,EAAGuG,CAAI,EAAIpS,EAAOoS,CAAI,EACdvZ,GAAmBuZ,CAAI,EAAG,CAC9B,KAAKlc,GACD8b,EAAKI,CAAI,GAAKvG,EAAGuG,CAAI,EAAIxG,EAAKwG,CAAI,GAAKN,EACvC,MACJ,IAAK,SACDlG,EAAKwG,CAAI,EAAIxc,EAAE,OAAOgW,EAAKwG,CAAI,CAAC,EAChC,IAAI4B,EAAWpe,EAAE,OAAOiW,EAAGuG,CAAI,CAAC,EAChCJ,EAAKI,CAAI,EAAI,CACT,GAAI4B,EAAS,EAAIpI,EAAKwG,CAAI,EAAE,GAAKN,EACjC,GAAIkC,EAAS,EAAIpI,EAAKwG,CAAI,EAAE,GAAKN,EACjC,GAAIkC,EAAS,EAAIpI,EAAKwG,CAAI,EAAE,GAAKN,CACrC,EACA,MACJ,IAAK,OACD,IAAImC,GAAShZ,GAAW2Q,EAAKwG,CAAI,EAAGvG,EAAGuG,CAAI,CAAC,EACxC8B,GAASD,GAAO,CAAC,EAGrB,IAFArI,EAAKwG,CAAI,EAAI6B,GAAO,CAAC,EACrBjC,EAAKI,CAAI,EAAI,CAAC,EACTxX,EAAI,EAAGE,EAAK8Q,EAAKwG,CAAI,EAAE,OAAQxX,EAAIE,EAAIF,IAAK,CAC7CoX,EAAKI,CAAI,EAAExX,CAAC,EAAI,CAAC,CAAC,EAClB,QAASC,GAAI,EAAGE,GAAK6Q,EAAKwG,CAAI,EAAExX,CAAC,EAAE,OAAQC,GAAIE,GAAIF,KAC/CmX,EAAKI,CAAI,EAAExX,CAAC,EAAEC,EAAC,GAAKqZ,GAAOtZ,CAAC,EAAEC,EAAC,EAAI+Q,EAAKwG,CAAI,EAAExX,CAAC,EAAEC,EAAC,GAAKiX,CAE/D,CACA,MACJ,IAAK,YACD,IAAI3G,GAAI+B,EAAQ,EACZiH,GAAKzI,GAAkBP,GAAEiH,CAAI,EAAGvG,EAAGuG,CAAI,CAAC,EAC5C,GAAI+B,GAKA,IAJAvI,EAAKwG,CAAI,EAAI+B,GAAG,KAChBtI,EAAGuG,CAAI,EAAI+B,GAAG,GACdnC,EAAKI,CAAI,EAAI,CAAC,EACdJ,EAAKI,CAAI,EAAE,KAAO,GACbxX,EAAI,EAAGE,EAAK8Q,EAAKwG,CAAI,EAAE,OAAQxX,EAAIE,EAAIF,IAExC,IADAoX,EAAKI,CAAI,EAAExX,CAAC,EAAI,CAACgR,EAAKwG,CAAI,EAAExX,CAAC,EAAE,CAAC,CAAC,EAC5BC,GAAI,EAAGE,GAAK6Q,EAAKwG,CAAI,EAAExX,CAAC,EAAE,OAAQC,GAAIE,GAAIF,KAC3CmX,EAAKI,CAAI,EAAExX,CAAC,EAAEC,EAAC,GAAKgR,EAAGuG,CAAI,EAAExX,CAAC,EAAEC,EAAC,EAAI+Q,EAAKwG,CAAI,EAAExX,CAAC,EAAEC,EAAC,GAAKiX,MAG9D,CACH,IAAI7T,GAAKiP,EAAQ,QAAU,IAAI9B,GAC3BgJ,GAAM,CACF,EAAG,CAAC,UAAWjJ,GAAE,SAAS,EAC1B,QAAS,UAAY,CACjB,OAAO+B,EAAQ,QAAQ,CAAC,CAC5B,CACJ,EACJtB,EAAKwG,CAAI,EAAI,CACTnU,GAAE,EACFA,GAAE,EACFA,GAAE,EACFA,GAAE,EACFA,GAAE,EACFA,GAAE,CACN,EACA0M,GAAiByJ,GAAKvI,EAAGuG,CAAI,CAAC,EAC9BvG,EAAGuG,CAAI,EAAIgC,GAAI,EAAE,UACjBpC,EAAKI,CAAI,EAAI,EACRgC,GAAI,OAAO,EAAInW,GAAE,GAAK6T,GACtBsC,GAAI,OAAO,EAAInW,GAAE,GAAK6T,GACtBsC,GAAI,OAAO,EAAInW,GAAE,GAAK6T,GACtBsC,GAAI,OAAO,EAAInW,GAAE,GAAK6T,GACtBsC,GAAI,OAAO,EAAInW,GAAE,GAAK6T,GACtBsC,GAAI,OAAO,EAAInW,GAAE,GAAK6T,CAC3B,CAWJ,CACA,MACJ,IAAK,MACD,IAAI9V,GAAS9E,EAAI8I,EAAOoS,CAAI,CAAC,EAAEjb,EAAK,EAAEd,CAAS,EAC3Ckc,GAAQrb,EAAI0U,EAAKwG,CAAI,CAAC,EAAEjb,EAAK,EAAEd,CAAS,EAC5C,GAAI+b,GAAQ,YAIR,IAHAxG,EAAKwG,CAAI,EAAIG,GACbP,EAAKI,CAAI,EAAI,CAAC,EACdxX,EAAI2X,GAAM,OACH3X,KACHoX,EAAKI,CAAI,EAAExX,CAAC,GAAKoB,GAAOpB,CAAC,EAAIgR,EAAKwG,CAAI,EAAExX,CAAC,GAAKkX,EAGtDjG,EAAGuG,CAAI,EAAIpW,GACX,MACJ,QAKI,IAJAA,GAAS,CAAC,EAAEjF,CAAM,EAAEiJ,EAAOoS,CAAI,CAAC,EAChCG,GAAQ,CAAC,EAAExb,CAAM,EAAE6U,EAAKwG,CAAI,CAAC,EAC7BJ,EAAKI,CAAI,EAAI,CAAC,EACdxX,EAAIsS,EAAQ,MAAM,iBAAiBkF,CAAI,EAAE,OAClCxX,KACHoX,EAAKI,CAAI,EAAExX,CAAC,IAAMoB,GAAOpB,CAAC,GAAK,IAAM2X,GAAM3X,CAAC,GAAK,IAAMkX,EAE3D,KACR,CAGR,IAAIC,GAAS/R,EAAO,OAChBqU,GAAWze,EAAE,gBAAgBmc,EAAM,EACvC,GAAI,CAACsC,GAED,GADAA,GAAWnd,EAAI6a,EAAM,EAAE,MAAMzZ,CAAQ,EACjC+b,IAAYA,GAAS,QAAU,EAAG,CAClC,IAAIC,GAAQD,GACZA,GAAW,SAAUlV,GAAG,CACpB,OAAOwT,GAAkBxT,GAAG,CAACmV,GAAM,CAAC,EAAG,CAACA,GAAM,CAAC,EAAG,CAACA,GAAM,CAAC,EAAG,CAACA,GAAM,CAAC,EAAGxC,CAAE,CAC9E,CACJ,MACIuC,GAAWza,GA0BnB,GAvBAma,EAAY/T,EAAO,OAASwS,EAAK,OAAS,CAAC,IAAI,KAC/CrP,EAAI,CACA,KAAMqP,EACN,QAASiB,EACT,UAAWM,EACX,MAAOA,GAAavB,EAAK,KAAO,GAChC,OAAQ,EACR,WAAYkB,GAAU,EACtB,KAAM,GACN,GAAI5B,EACJ,OAAQuC,GACR,KAAMzI,EACN,KAAMoG,EACN,GAAInG,EACJ,GAAIqB,EACJ,SAAUlN,EAAO,SACjB,KAAM8T,EACN,KAAMlG,EACN,OAAQ4F,GAAShB,EAAK,MACtB,OAAQtF,EAAQ,KAAK,EACrB,YAAayG,CACjB,EACAlC,GAAkB,KAAKtO,CAAC,EACpBuQ,GAAU,CAACE,GAAY,CAACC,IACxB1Q,EAAE,KAAO,GACTA,EAAE,MAAQ,IAAI,KAAO2O,EAAK4B,EACtBjC,GAAkB,QAAU,GAC5B,OAAOE,GAAU,EAGrBkC,IACA1Q,EAAE,MAAQ,IAAI,KAAOA,EAAE,GAAKuQ,GAEhCjC,GAAkB,QAAU,GAAKC,GAAiBC,EAAS,CAC/D,CAIA9b,EAAI,sBAAwBqX,EAAQ,GAAIA,EAASsF,CAAI,EACzD,CAiBA5c,EAAE,UAAY,SAAUoK,EAAQ8R,EAAIC,EAAQ7B,EAAU,CAClD,GAAIlQ,aAAkB0S,GAClB,OAAO1S,GAEPpK,EAAE,GAAGmc,EAAQ,UAAU,GAAK,CAACA,KAC7B7B,EAAWA,GAAY6B,GAAU,KACjCA,EAAS,MAEb/R,EAAS,OAAOA,CAAM,EACtB8R,EAAK,CAACA,GAAM,EACZ,IAAIrS,EAAI,CAAC,EACL8U,EACAnC,EACJ,IAAKA,KAAQpS,EAAYA,EAAOvJ,EAAG,EAAE2b,CAAI,GAAK3Z,EAAQ2Z,CAAI,GAAKA,GAAQ3Z,EAAQ2Z,CAAI,EAAI,KAAOA,IAC1FmC,EAAO,GACP9U,EAAE2S,CAAI,EAAIpS,EAAOoS,CAAI,GAEzB,GAAKmC,EAiBD,OAAAxC,IAAWtS,EAAE,OAASsS,GACtB7B,IAAazQ,EAAE,SAAWyQ,GACnB,IAAIwC,GAAU,CAAC,IAAKjT,CAAC,EAAGqS,CAAE,EAjBjC,GAAG5B,EAAS,CAER,IAAIsE,EAAU,EACd,QAAQ5Z,KAAKoF,EAAO,CAChB,IAAIyT,EAAU/a,EAAMkC,CAAC,EAClBoF,EAAOvJ,EAAG,EAAEmE,CAAC,GAAK6Y,EAAUe,IAC3BA,EAAUf,EAElB,CACAe,GAAW,IAEX,CAACxU,EAAOwU,CAAO,EAAE,WAAaxU,EAAOwU,CAAO,EAAE,SAAWtE,EAC7D,CACF,OAAO,IAAIwC,GAAU1S,EAAQ8R,CAAE,CAMrC,EAkBA9D,GAAQ,QAAU,SAAUhO,EAAQ8R,EAAIC,EAAQ7B,EAAU,CACtD,IAAIhD,EAAU,KACd,GAAIA,EAAQ,QACR,OAAAgD,GAAYA,EAAS,KAAKhD,CAAO,EAC1BA,EAEX,IAAIsF,EAAOxS,aAAkB0S,GAAY1S,EAASpK,EAAE,UAAUoK,EAAQ8R,EAAIC,EAAQ7B,CAAQ,EAC1F,OAAAuC,GAAaD,EAAMtF,EAASsF,EAAK,SAAS,CAAC,EAAG,KAAMtF,EAAQ,KAAK,CAAC,EAC3DA,CACX,EAiBAc,GAAQ,QAAU,SAAUwE,EAAMpd,EAAO,CACrC,OAAIod,GAAQpd,GAAS,MACjB,KAAK,OAAOod,EAAM/a,EAAKrC,EAAOod,EAAK,EAAE,EAAIA,EAAK,EAAE,EAE7C,IACX,EAsBAxE,GAAQ,OAAS,SAAUwE,EAAMpd,EAAO,CACpC,IAAI8W,EAAM,CAAC,EACP,EAAI,EACJ1F,EACArD,EACJ,GAAI/N,GAAS,KACT,OAAAqd,GAAaD,EAAM,KAAM,GAAI/a,EAAKrC,EAAO,CAAC,CAAC,EACpC,KAGP,IADAoR,EAAMiL,GAAkB,OACjB,EAAIjL,EAAK,IAEZ,GADArD,EAAIsO,GAAkB,CAAC,EACnBtO,EAAE,GAAG,IAAM,KAAK,KAAO,CAACqP,GAAQrP,EAAE,MAAQqP,GAAO,CACjD,GAAIA,EACA,OAAOrP,EAAE,OAEb+I,EAAI,KAAK,CACL,KAAM/I,EAAE,KACR,OAAQA,EAAE,MACd,CAAC,CACL,CAEJ,OAAIqP,EACO,EAEJtG,CAEf,EAaA8B,GAAQ,MAAQ,SAAUwE,EAAM,CAC5B,QAAS5X,EAAI,EAAGA,EAAI6W,GAAkB,OAAQ7W,IAAS6W,GAAkB7W,CAAC,EAAE,GAAG,IAAM,KAAK,KAAO,CAAC4X,GAAQf,GAAkB7W,CAAC,EAAE,MAAQ4X,IAC/H3c,EAAI,sBAAwB,KAAK,GAAI,KAAM4b,GAAkB7W,CAAC,EAAE,IAAI,IAAM,KAC1E6W,GAAkB7W,CAAC,EAAE,OAAS,IAGtC,OAAO,IACX,EAaAoT,GAAQ,OAAS,SAAUwE,EAAM,CAC7B,QAAS5X,EAAI,EAAGA,EAAI6W,GAAkB,OAAQ7W,IAAK,GAAI6W,GAAkB7W,CAAC,EAAE,GAAG,IAAM,KAAK,KAAO,CAAC4X,GAAQf,GAAkB7W,CAAC,EAAE,MAAQ4X,GAAO,CAC1I,IAAIrP,EAAIsO,GAAkB7W,CAAC,EACvB/E,EAAI,uBAAyB,KAAK,GAAI,KAAMsN,EAAE,IAAI,IAAM,KACxD,OAAOA,EAAE,OACT,KAAK,OAAOA,EAAE,KAAMA,EAAE,MAAM,EAEpC,CACA,OAAO,IACX,EAaA6K,GAAQ,KAAO,SAAUwE,EAAM,CAC3B,QAAS5X,EAAI,EAAGA,EAAI6W,GAAkB,OAAQ7W,IAAS6W,GAAkB7W,CAAC,EAAE,GAAG,IAAM,KAAK,KAAO,CAAC4X,GAAQf,GAAkB7W,CAAC,EAAE,MAAQ4X,IAC/H3c,EAAI,qBAAuB,KAAK,GAAI,KAAM4b,GAAkB7W,CAAC,EAAE,IAAI,IAAM,IACzE6W,GAAkB,OAAO7W,IAAK,CAAC,EAGvC,OAAO,IACX,EACA,SAAS6Z,GAAcxc,EAAO,CAC1B,QAAS2C,EAAI,EAAGA,EAAI6W,GAAkB,OAAQ7W,IAAS6W,GAAkB7W,CAAC,EAAE,GAAG,OAAS3C,GACpFwZ,GAAkB,OAAO7W,IAAK,CAAC,CAEvC,CACA/E,EAAI,GAAG,iBAAkB4e,EAAa,EACtC5e,EAAI,GAAG,gBAAiB4e,EAAa,EACrCzG,GAAQ,SAAW,UAAY,CAC3B,MAAO,0BACX,EAGA,IAAIe,GAAM,SAAU2F,EAAO,CAIvB,GAHA,KAAK,MAAQ,CAAC,EACd,KAAK,OAAS,EACd,KAAK,KAAO,MACRA,EACA,QAAS9Z,EAAI,EAAGE,EAAK4Z,EAAM,OAAQ9Z,EAAIE,EAAIF,IACnC8Z,EAAM9Z,CAAC,IAAM8Z,EAAM9Z,CAAC,EAAE,aAAeoT,GAAQ,aAAe0G,EAAM9Z,CAAC,EAAE,aAAemU,MACpF,KAAK,KAAK,MAAM,MAAM,EAAI,KAAK,MAAM,KAAK,MAAM,MAAM,EAAI2F,EAAM9Z,CAAC,EACjE,KAAK,SAIrB,EACA+Z,GAAW5F,GAAI,UAQf4F,GAAS,KAAO,UAAY,CAGxB,QAFIxW,EACAqI,EACK5L,EAAI,EAAGE,EAAK,UAAU,OAAQF,EAAIE,EAAIF,IAC3CuD,EAAO,UAAUvD,CAAC,EACduD,IAASA,EAAK,aAAe6P,GAAQ,aAAe7P,EAAK,aAAe4Q,MACxEvI,EAAM,KAAK,MAAM,OACjB,KAAKA,CAAG,EAAI,KAAK,MAAMA,CAAG,EAAIrI,EAC9B,KAAK,UAGb,OAAO,IACX,EAQAwW,GAAS,IAAM,UAAY,CACvB,YAAK,QAAU,OAAO,KAAK,KAAK,QAAQ,EACjC,KAAK,MAAM,IAAI,CAC1B,EAeAA,GAAS,QAAU,SAAUzE,EAAUC,EAAS,CAC5C,QAASvV,EAAI,EAAGE,EAAK,KAAK,MAAM,OAAQF,EAAIE,EAAIF,IAC5C,GAAIsV,EAAS,KAAKC,EAAS,KAAK,MAAMvV,CAAC,EAAGA,CAAC,IAAM,GAC7C,OAAO,KAGf,OAAO,IACX,EACA,QAASga,MAAU5G,GAAaA,GAAQvX,EAAG,EAAEme,EAAM,IAC/CD,GAASC,EAAM,EAAK,SAAUlP,EAAY,CACtC,OAAO,UAAY,CACf,IAAInH,EAAM,UACV,OAAO,KAAK,QAAQ,SAAUhE,EAAI,CAC9BA,EAAGmL,CAAU,EAAEzP,EAAK,EAAEsE,EAAIgE,CAAG,CACjC,CAAC,CACL,CACJ,EAAGqW,EAAM,GAEb,OAAAD,GAAS,KAAO,SAAUzf,EAAME,EAAO,CACnC,GAAIF,GAAQU,EAAE,GAAGV,EAAMc,EAAK,GAAKJ,EAAE,GAAGV,EAAK,CAAC,EAAG,QAAQ,EACnD,QAAS2F,EAAI,EAAGE,EAAK7F,EAAK,OAAQ2F,EAAIE,EAAIF,IACtC,KAAK,MAAMA,CAAC,EAAE,KAAK3F,EAAK2F,CAAC,CAAC,MAG9B,SAASD,EAAI,EAAGE,EAAK,KAAK,MAAM,OAAQF,EAAIE,EAAIF,IAC5C,KAAK,MAAMA,CAAC,EAAE,KAAK1F,EAAME,CAAK,EAGtC,OAAO,IACX,EAOAuf,GAAS,MAAQ,UAAY,CACzB,KAAO,KAAK,QACR,KAAK,IAAI,CAEjB,EAcAA,GAAS,OAAS,SAAUE,EAAOpW,EAAOqW,EAAW,CACjDD,EAAQA,EAAQ,EAAIrd,EAAK,KAAK,OAASqd,EAAO,CAAC,EAAIA,EACnDpW,EAAQjH,EAAK,EAAGC,EAAK,KAAK,OAASod,EAAOpW,CAAK,CAAC,EAChD,IAAIsW,EAAO,CAAC,EACRC,EAAQ,CAAC,EACT7e,EAAO,CAAC,EACRyE,EACJ,IAAKA,EAAI,EAAGA,EAAI,UAAU,OAAQA,IAC9BzE,EAAK,KAAK,UAAUyE,CAAC,CAAC,EAE1B,IAAKA,EAAI,EAAGA,EAAI6D,EAAO7D,IACnBoa,EAAM,KAAK,KAAKH,EAAQja,CAAC,CAAC,EAE9B,KAAOA,EAAI,KAAK,OAASia,EAAOja,IAC5Bma,EAAK,KAAK,KAAKF,EAAQja,CAAC,CAAC,EAE7B,IAAIqa,EAAS9e,EAAK,OAClB,IAAKyE,EAAI,EAAGA,EAAIqa,EAASF,EAAK,OAAQna,IAClC,KAAK,MAAMia,EAAQja,CAAC,EAAI,KAAKia,EAAQja,CAAC,EAAIA,EAAIqa,EAAS9e,EAAKyE,CAAC,EAAIma,EAAKna,EAAIqa,CAAM,EAGpF,IADAra,EAAI,KAAK,MAAM,OAAS,KAAK,QAAU6D,EAAQwW,EACxC,KAAKra,CAAC,GACT,OAAO,KAAKA,GAAG,EAEnB,OAAO,IAAImU,GAAIiG,CAAK,CACxB,EAYAL,GAAS,QAAU,SAAUpa,EAAI,CAC7B,QAASK,EAAI,EAAGE,EAAK,KAAK,OAAQF,EAAIE,EAAIF,IAAK,GAAI,KAAKA,CAAC,GAAKL,EAC1D,YAAK,OAAOK,EAAG,CAAC,EACT,EAEf,EACA+Z,GAAS,QAAU,SAAU3U,EAAQ8R,EAAIC,EAAQ7B,EAAU,EACtDta,EAAE,GAAGmc,EAAQ,UAAU,GAAK,CAACA,KAAY7B,EAAW6B,GAAU,MAC/D,IAAIvL,EAAM,KAAK,MAAM,OACjB5L,EAAI4L,EACJrI,EACA6Q,EAAM,KACNkG,EACJ,GAAI,CAAC1O,EACD,OAAO,KAEX0J,IAAagF,EAAY,UAAY,CACjC,CAAC,EAAE1O,GAAO0J,EAAS,KAAKlB,CAAG,CAC/B,GACA+C,EAASnc,EAAE,GAAGmc,EAAQla,EAAM,EAAIka,EAASmD,EACzC,IAAI1C,EAAO5c,EAAE,UAAUoK,EAAQ8R,EAAIC,EAAQmD,CAAS,EAEpD,IADA/W,EAAO,KAAK,MAAM,EAAEvD,CAAC,EAAE,QAAQ4X,CAAI,EAC5B5X,KACH,KAAK,MAAMA,CAAC,GAAK,CAAC,KAAK,MAAMA,CAAC,EAAE,SAAW,KAAK,MAAMA,CAAC,EAAE,YAAYuD,EAAMqU,EAAMA,CAAI,EACpF,KAAK,MAAM5X,CAAC,GAAK,CAAC,KAAK,MAAMA,CAAC,EAAE,SAAY4L,IAEjD,OAAO,IACX,EACAmO,GAAS,YAAc,SAAUpa,EAAI,CAEjC,QADIK,EAAI,KAAK,MAAM,OACZA,KACH,KAAK,MAAMA,CAAC,EAAE,YAAYL,CAAE,EAEhC,OAAO,IACX,EACAoa,GAAS,QAAU,UAAY,CAK3B,QAJI9a,EAAI,CAAC,EACLE,EAAI,CAAC,EACL2B,EAAK,CAAC,EACNC,EAAK,CAAC,EACDf,EAAI,KAAK,MAAM,OAAQA,KAAM,GAAI,CAAC,KAAK,MAAMA,CAAC,EAAE,QAAS,CAC9D,IAAIuU,EAAM,KAAK,MAAMvU,CAAC,EAAE,QAAQ,EAChCf,EAAE,KAAKsV,EAAI,CAAC,EACZpV,EAAE,KAAKoV,EAAI,CAAC,EACZzT,EAAG,KAAKyT,EAAI,EAAIA,EAAI,KAAK,EACzBxT,EAAG,KAAKwT,EAAI,EAAIA,EAAI,MAAM,CAC9B,CACA,OAAAtV,EAAIpC,EAAKxB,EAAK,EAAE,EAAG4D,CAAC,EACpBE,EAAItC,EAAKxB,EAAK,EAAE,EAAG8D,CAAC,EACpB2B,EAAKlE,EAAKvB,EAAK,EAAE,EAAGyF,CAAE,EACtBC,EAAKnE,EAAKvB,EAAK,EAAE,EAAG0F,CAAE,EACf,CACH,EAAG9B,EACH,EAAGE,EACH,GAAI2B,EACJ,GAAIC,EACJ,MAAOD,EAAK7B,EACZ,OAAQ8B,EAAK5B,CACjB,CACJ,EACA4a,GAAS,MAAQ,SAAUpX,EAAG,CAC1BA,EAAI,KAAK,MAAM,IAAI,EACnB,QAAS3C,EAAI,EAAGE,EAAK,KAAK,MAAM,OAAQF,EAAIE,EAAIF,IAC5C2C,EAAE,KAAK,KAAK,MAAM3C,CAAC,EAAE,MAAM,CAAC,EAEhC,OAAO2C,CACX,EACAoX,GAAS,SAAW,UAAY,CAC5B,MAAO,uBACX,EAEAA,GAAS,KAAO,SAASQ,EAAY,CACjC,IAAIC,EAAM,KAAK,MAAM,IAAI,EACzB,YAAK,QAAQ,SAASC,EAAOR,EAAM,CAC/B,IAAIne,EAAI2e,EAAM,KAAKF,CAAU,EAEzBze,GAAE,QAAQ,SAAS4e,EAAQC,EAAO,CAC9BH,EAAI,KAAKE,CAAM,CACnB,CAAC,CAET,CAAC,EACMF,CACX,EAeAT,GAAS,cAAgB,SAAU9a,EAAGE,EAAG,CACrC,IAAIyb,EAAgB,GACpB,YAAK,QAAQ,SAAUjb,EAAI,CACvB,GAAIA,EAAG,cAAcV,EAAGE,CAAC,EACrB,OAAAyb,EAAgB,GACT,EAEf,CAAC,EACMA,CACX,EAiBA5f,EAAE,aAAe,SAAU6f,EAAM,CAC7B,GAAI,CAACA,EAAK,KACN,OAAOA,EAEX,KAAK,MAAQ,KAAK,OAAS,CAAC,EAC5B,IAAIC,EAAW,CACP,EAAGD,EAAK,EACR,KAAM,CAAC,EACP,OAAQ,CAAC,CACb,EACAE,EAASF,EAAK,KAAK,aAAa,EACpC,QAASG,KAAQH,EAAK,KAAUA,EAAK,KAAKhf,EAAG,EAAEmf,CAAI,IAC/CF,EAAS,KAAKE,CAAI,EAAIH,EAAK,KAAKG,CAAI,GAOxC,GALI,KAAK,MAAMD,CAAM,EACjB,KAAK,MAAMA,CAAM,EAAE,KAAKD,CAAQ,EAEhC,KAAK,MAAMC,CAAM,EAAI,CAACD,CAAQ,EAE9B,CAACD,EAAK,IAAK,CACXC,EAAS,KAAK,cAAc,EAAIhd,EAAM+c,EAAK,KAAK,cAAc,EAAG,EAAE,EACnE,QAASI,KAASJ,EAAK,OAAQ,GAAIA,EAAK,OAAOhf,EAAG,EAAEof,CAAK,EAAG,CACxD,IAAInb,EAAO+a,EAAK,OAAOI,CAAK,EAQ5B,GAPAH,EAAS,OAAOG,CAAK,EAAI,CACrB,EAAGnb,EAAK,EACR,EAAG,CAAC,EACJ,EAAGA,EAAK,GAAK,IAAMA,EAAK,EAAE,QAAQ,aAAc,SAAU4Q,EAAS,CAC3D,MAAO,CAAC,EAAG,IAAK,EAAG,IAAK,EAAG,IAAK,EAAG,IAAK,EAAG,IAAK,EAAG,GAAG,EAAEA,CAAO,GAAK,GACxE,CAAC,EAAI,GACb,EACI5Q,EAAK,EACL,QAAS8K,KAAK9K,EAAK,EAAOA,EAAKjE,EAAG,EAAE+O,CAAC,IACjCkQ,EAAS,OAAOG,CAAK,EAAE,EAAErQ,CAAC,EAAI9K,EAAK,EAAE8K,CAAC,EAGlD,CACJ,CACA,OAAOiQ,CACX,EAiBA5e,GAAW,QAAU,SAAU8e,EAAQG,EAAQC,EAAOC,EAAS,CAI3D,GAHAA,EAAUA,GAAW,SACrBD,EAAQA,GAAS,SACjBD,EAAS,CAACA,GAAU,CAAC,OAAQ,IAAK,KAAM,IAAK,QAAS,IAAK,OAAQ,GAAG,EAAEA,CAAM,GAAK,IAC/E,EAAClgB,EAAE,MAGP,KAAI6f,EAAO7f,EAAE,MAAM+f,CAAM,EACzB,GAAI,CAACF,EAAM,CACP,IAAIvgB,EAAO,IAAI,OAAO,UAAYygB,EAAO,QAAQ,oBAAqB,CAAC,EAAI,UAAW,GAAG,EACzF,QAASM,KAAYrgB,EAAE,MAAO,GAAIA,EAAE,MAAMa,EAAG,EAAEwf,CAAQ,GAC/C/gB,EAAK,KAAK+gB,CAAQ,EAAG,CACrBR,EAAO7f,EAAE,MAAMqgB,CAAQ,EACvB,KACJ,CAER,CACA,IAAIC,EACJ,GAAIT,EACA,QAAS7a,EAAI,EAAGE,EAAK2a,EAAK,OAAQ7a,EAAIE,IAClCob,EAAUT,EAAK7a,CAAC,EACZ,EAAAsb,EAAQ,KAAK,aAAa,GAAKJ,IAAWI,EAAQ,KAAK,YAAY,GAAKH,GAAS,CAACG,EAAQ,KAAK,YAAY,IAAMA,EAAQ,KAAK,cAAc,GAAKF,IAF/Gpb,IAEtC,CAKR,OAAOsb,EACX,EAsBArf,GAAW,MAAQ,SAAUgD,EAAGE,EAAGlC,EAAQ4d,EAAMU,EAAMC,EAAQC,EAAgBC,EAAc,CACzFF,EAASA,GAAU,SACnBC,EAAiB7e,EAAKC,EAAK4e,GAAkB,EAAG,CAAC,EAAG,EAAE,EACtDC,EAAe9e,EAAKC,EAAK6e,GAAgB,EAAG,CAAC,EAAG,CAAC,EACjD,IAAIC,EAAUrf,EAAIW,CAAM,EAAEV,EAAK,EAAE,CAAC,EAC9Bqf,EAAQ,EACRC,EAAW,EACX/b,EAAO,EACPgc,EAEJ,GADA9gB,EAAE,GAAG6f,EAAM,QAAQ,IAAMA,EAAO,KAAK,QAAQA,CAAI,GAC7CA,EAAM,CACNiB,GAASP,GAAQ,IAAMV,EAAK,KAAK,cAAc,EAM/C,QALIrP,EAAKqP,EAAK,KAAK,KAAKte,EAAK,EAAEd,CAAS,EACpCoZ,EAAM,CAACrJ,EAAG,CAAC,EACXuQ,EAAavQ,EAAG,CAAC,EAAIA,EAAG,CAAC,EACzBwQ,EAAS,EACTzQ,EAAS,CAACC,EAAG,CAAC,GAAKgQ,GAAU,WAAaO,GAAc,CAAClB,EAAK,KAAK,QAAWkB,EAAa,GACtF/b,EAAI,EAAGE,EAAKyb,EAAQ,OAAQ3b,EAAIE,EAAIF,IAAK,CAC9C,GAAI2b,EAAQ3b,CAAC,GAAK;AAAA,EACd4b,EAAQ,EACRK,EAAO,EACPJ,EAAW,EACXG,GAAUD,EAAaL,MACpB,CACH,IAAIxC,EAAO2C,GAAYhB,EAAK,OAAOc,EAAQ3b,EAAI,CAAC,CAAC,GAAK,CAAC,EACnDic,EAAOpB,EAAK,OAAOc,EAAQ3b,CAAC,CAAC,EACjC4b,GAASC,GAAY3C,EAAK,GAAK2B,EAAK,IAAM3B,EAAK,GAAKA,EAAK,EAAEyC,EAAQ3b,CAAC,CAAC,GAAK,GAAM6a,EAAK,EAAIY,EAAkB,EAC3GI,EAAW,CACf,CACII,GAAQA,EAAK,IACbnc,GAAQ9E,EAAE,cAAcihB,EAAK,EAAG,CAAC,IAAKL,EAAQE,EAAOE,EAASF,EAAO,IAAKA,EAAOA,EAAOjH,EAAKtJ,EAAQ,KAAMtM,EAAI4V,GAAOiH,GAAQ3c,EAAIoM,GAAUuQ,CAAK,CAAC,EAE1J,CACJ,CACA,OAAO,KAAK,KAAKhc,CAAI,EAAE,KAAK,CACxB,KAAM,OACN,OAAQ,MACZ,CAAC,CACL,EA8BA7D,GAAW,IAAM,SAAU0d,EAAM,CAC7B,GAAI3e,EAAE,GAAG2e,EAAM,OAAO,EAKlB,QAJIhZ,EAAM,KAAK,IAAI,EACfX,EAAI,EACJE,EAAKyZ,EAAK,OACV1Z,EACGD,EAAIE,EAAIF,IACXC,EAAI0Z,EAAK3Z,CAAC,GAAK,CAAC,EAChBtE,GAASG,EAAG,EAAEoE,EAAE,IAAI,GAAKU,EAAI,KAAK,KAAKV,EAAE,IAAI,EAAE,EAAE,KAAKA,CAAC,CAAC,EAGhE,OAAOU,CACX,EAqBA3F,EAAE,OAAS,SAAUkhB,EAAO9W,EAAQ,CAChC,IAAI7J,EAAOP,EAAE,GAAGoK,EAAQhK,EAAK,EAAI,CAAC,CAAC,EAAEe,CAAM,EAAEiJ,CAAM,EAAI,UACvD,OAAA8W,GAASlhB,EAAE,GAAGkhB,EAAOjf,EAAM,GAAK1B,EAAK,OAAS,IAAM2gB,EAAQA,EAAM,QAAQvgB,EAAU,SAAUwgB,EAAKnc,EAAG,CAClG,OAAOzE,EAAK,EAAEyE,CAAC,GAAK,KAAO,EAAIzE,EAAKyE,CAAC,CACzC,CAAC,GACMkc,GAAS,CACpB,EAwBAlhB,EAAE,SAAY,UAAY,CACtB,IAAIohB,EAAa,gBACbC,EAAmB,2DACnBC,EAAW,SAAUC,EAAK5hB,EAAK+F,EAAK,CAChC,IAAIC,EAAMD,EACV,OAAA/F,EAAI,QAAQ0hB,EAAkB,SAAUE,EAAKjiB,EAAMkiB,EAAOC,EAAYC,EAAQ,CAC1EpiB,EAAOA,GAAQmiB,EACX9b,IACIrG,KAAQqG,IACRA,EAAMA,EAAIrG,CAAI,GAElB,OAAOqG,GAAO,YAAc+b,IAAW/b,EAAMA,EAAI,GAEzD,CAAC,EACDA,GAAOA,GAAO,MAAQA,GAAOD,EAAM6b,EAAM5b,GAAO,GACzCA,CACX,EACJ,OAAO,SAAUwb,EAAKzb,EAAK,CACvB,OAAO,OAAOyb,CAAG,EAAE,QAAQC,EAAY,SAAUG,EAAK5hB,EAAK,CACvD,OAAO2hB,EAASC,EAAK5hB,EAAK+F,CAAG,CACjC,CAAC,CACL,CACJ,EAAG,EAeH1F,EAAE,MAAQ,UAAY,CAClB,GAAIe,GAAW,IACXD,EAAE,IAAI,QAAUC,GAAW,OACxB,CAEH,OAAO,QAAU,OACjB,GAAI,CACA,OAAO,OAAO,OAClB,MAAW,CAAC,CAChB,CACA,OAAOf,CACX,EAqBAA,EAAE,GAAK+e,GAEP9e,EAAI,GAAG,kBAAmB,UAAY,CAClCE,EAAS,EACb,CAAC,EAGA,SAAUqZ,EAAKrZ,EAAQK,EAAG,CACnBgZ,EAAI,YAAc,MAAQA,EAAI,mBAC9BA,EAAI,iBAAiBrZ,EAAQK,EAAI,UAAY,CACzCgZ,EAAI,oBAAoBrZ,EAAQK,EAAG,EAAK,EACxCgZ,EAAI,WAAa,UACrB,EAAG,EAAK,EACRA,EAAI,WAAa,WAErB,SAASmI,GAAW,CACf,KAAM,KAAKnI,EAAI,UAAU,EAAI,WAAWmI,EAAU,CAAC,EAAI3hB,EAAE,IAAI,iBAAiB,CACnF,CACA2hB,EAAS,CACb,EAAG,SAAU,kBAAkB,EAExB3hB,CACX,EAAG,MAAMlB,GAASgB,CAA4B,EAC1CC,IAAkC,SAAchB,GAAO,QAAUgB,EAG/D,EAEA,uBAKC,SAAShB,GAAQD,GAASM,EAAqB,CAEtD,IAAIU,EAA8BC,EAAgCD,EAA+B,CAACV,EAA0C,uBAAuB,CAAC,EAAGW,EAAiC,SAASC,EAAG,CAChN,GAAI,EAAAA,GAAK,CAACA,EAAE,KAIZ,KAAIa,EAAM,iBACNS,EAAM,OACNuB,EAAU,WACVC,GAAQ,SACRnB,EAAO,KACPC,GAAOD,EAAK,IACZG,GAAMH,EAAK,IACXI,EAAMJ,EAAK,IACXlB,GAAY,QACZR,GAAMD,EAAE,IACR4hB,GAAI,GACJvgB,GAAI,IACJwgB,GAAQ,+BACRC,EAAU,CACN,MAAO,kBACP,QAAS,8BACT,QAAS,4BACT,KAAM,iBACN,KAAM,iDACV,EACAC,GAAgB,CAAC,EACrB/hB,EAAE,SAAW,UAAY,CACrB,MAAQ;AAAA,6BAA4D,KAAK,OAC7E,EACA,IAAIgiB,EAAI,SAAUrd,EAAI6X,EAAM,CACxB,GAAIA,EAAM,CACF,OAAO7X,GAAM,WACbA,EAAKqd,EAAErd,CAAE,GAEb,QAAShF,KAAO6c,EAAUA,EAAK3b,CAAG,EAAElB,CAAG,IAC/BA,EAAI,UAAU,EAAG,CAAC,GAAK,SACvBgF,EAAG,eAAekd,GAAOliB,EAAI,UAAU,CAAC,EAAG2B,EAAIkb,EAAK7c,CAAG,CAAC,CAAC,EAEzDgF,EAAG,aAAahF,EAAK2B,EAAIkb,EAAK7c,CAAG,CAAC,CAAC,EAG/C,MACIgF,EAAK3E,EAAE,GAAG,IAAI,gBAAgB,6BAA8B2E,CAAE,EAC9DA,EAAG,QAAUA,EAAG,MAAM,wBAA0B,iBAEpD,OAAOA,CACX,EACAsd,EAAkB,SAAU3K,EAASlD,EAAU,CAC3C,IAAI5O,EAAO,SACP4U,EAAK9C,EAAQ,GAAKlD,EAClB8N,EAAK,GAAIC,EAAK,GACd5c,EAAI+R,EAAQ,KACZ8K,EAAM9K,EAAQ,MACd3P,EAAIpC,EAAE,MACNZ,EAAK3E,EAAE,GAAG,IAAI,eAAeoa,CAAE,EACnC,GAAI,CAACzV,EAAI,CAeL,GAdAyP,EAAW9S,EAAI8S,CAAQ,EAAE,QAAQpU,EAAE,iBAAkB,SAAUuhB,GAAKc,GAAKC,GAAK,CAE1E,GADA9c,EAAO,SACH6c,IAAOC,GAAK,CACZJ,EAAKrf,EAAQwf,EAAG,EAChBF,EAAKtf,EAAQyf,EAAG,EAChB,IAAIC,IAAQJ,EAAK,IAAM,EAAI,EAC3BpgB,EAAImgB,EAAK,GAAI,CAAC,EAAIngB,EAAIogB,EAAK,GAAI,CAAC,EAAI,MAC/BA,EAAKxgB,EAAK,KAAK,IAAMI,EAAImgB,EAAK,GAAI,CAAC,CAAC,EAAIK,GAAM,KAC/CJ,GAAM,KACLA,EAAKA,EAAG,QAAQ,CAAC,EAAI,KAAOI,GACrC,CACA,OAAOX,EACX,CAAC,EACDxN,EAAWA,EAAS,MAAM,UAAU,EAChC5O,GAAQ,SAAU,CAClB,IAAI6L,EAAQ+C,EAAS,MAAM,EAE3B,GADA/C,EAAQ,CAACxO,EAAQwO,CAAK,EAClB,MAAMA,CAAK,EACX,OAAO,KAEX,IAAImR,EAAS,CAAC,EAAG,EAAG7gB,EAAK,IAAI3B,EAAE,IAAIqR,CAAK,CAAC,EAAG1P,EAAK,IAAI3B,EAAE,IAAIqR,CAAK,CAAC,CAAC,EAC9DoR,EAAM,GAAK7gB,GAAKE,GAAI0gB,EAAO,CAAC,CAAC,EAAG1gB,GAAI0gB,EAAO,CAAC,CAAC,CAAC,GAAK,GACvDA,EAAO,CAAC,GAAKC,EACbD,EAAO,CAAC,GAAKC,EACTD,EAAO,CAAC,EAAI,IACZA,EAAO,CAAC,EAAI,CAACA,EAAO,CAAC,EACrBA,EAAO,CAAC,EAAI,GAEZA,EAAO,CAAC,EAAI,IACZA,EAAO,CAAC,EAAI,CAACA,EAAO,CAAC,EACrBA,EAAO,CAAC,EAAI,EAEpB,CACA,IAAIzR,GAAO/Q,EAAE,WAAWoU,CAAQ,EAChC,GAAI,CAACrD,GACD,OAAO,KASX,GAPAqJ,EAAKA,EAAG,QAAQ,kBAAmB,GAAG,EAElC9C,EAAQ,UAAY8C,GAAM9C,EAAQ,SAAS,KAC3C8K,EAAI,KAAK,YAAY9K,EAAQ,QAAQ,EACrC,OAAOA,EAAQ,UAGf,CAACA,EAAQ,SAAU,CACnB3S,EAAKqd,EAAExc,EAAO,WAAY,CAAC,GAAI4U,CAAE,CAAC,EAClC9C,EAAQ,SAAW3S,EACnBqd,EAAErd,EAAIa,GAAQ,SAAW,CACrB,GAAI0c,EACJ,GAAIC,CACR,EAAI,CACA,GAAIK,EAAO,CAAC,EACZ,GAAIA,EAAO,CAAC,EACZ,GAAIA,EAAO,CAAC,EACZ,GAAIA,EAAO,CAAC,EACZ,kBAAmBlL,EAAQ,OAAO,OAAO,CAC7C,CAAC,EACD8K,EAAI,KAAK,YAAYzd,CAAE,EACvB,QAASK,GAAI,EAAGE,GAAK6L,GAAK,OAAQ/L,GAAIE,GAAIF,KACtCL,EAAG,YAAYqd,EAAE,OAAQ,CACrB,OAAQjR,GAAK/L,EAAC,EAAE,OAAS+L,GAAK/L,EAAC,EAAE,OAASA,GAAI,OAAS,KACvD,aAAc+L,GAAK/L,EAAC,EAAE,OAAS,OAC/B,eAAgB,SAAS+L,GAAK/L,EAAC,EAAE,OAAO,EAAI+L,GAAK/L,EAAC,EAAE,QAAU,CAClE,CAAC,CAAC,CAEV,CACJ,CACA,OAAAgd,EAAEzc,EAAG,CACD,KAAMmd,GAAQtI,CAAE,EAChB,QAAS,EACT,eAAgB,CACpB,CAAC,EACDzS,EAAE,KAAOia,GACTja,EAAE,QAAU,EACZA,EAAE,YAAc,EACT,CACX,EACAgb,EAAY,UAAY,CACtB,IAAIljB,EAAO,SAAS,aACpB,OAAOA,IAASA,IAAS,GAAKA,IAAS,GACzC,EACAijB,GAAU,SAAUtI,EAAI,CACtB,GAAIuI,EAAU,EACV,MAAO,SAAWvI,EAAK,KAE3B,IAAIwI,EAAW,SAAS,SACpBC,EACAD,EAAS,SAAW,KACpBA,EAAS,KACTA,EAAS,SACTA,EAAS,OAEb,MAAO,QAAUC,EAAiB,IAAMzI,EAAK,IAC/C,EACA0I,EAAiB,SAAUvd,EAAG,CAC1B,IAAIX,EAAOW,EAAE,QAAQ,CAAC,EACtByc,EAAEzc,EAAE,QAAS,CAAC,iBAAkBA,EAAE,OAAO,OAAO,EAAI,cAAgBX,EAAK,EAAI,IAAMA,EAAK,EAAI,GAAG,CAAC,CACpG,EACAme,GAAW,SAAUxd,EAAG/F,EAAOwjB,EAAO,CAClC,GAAIzd,EAAE,MAAQ,OAAQ,CAiBlB,QAhBIa,EAAS9E,EAAI9B,CAAK,EAAE,YAAY,EAAE,MAAM,GAAG,EAC3CqK,EAAItE,EAAE,MACN0d,EAAKD,EAAQ,MAAQ,QACrBjL,EAAOxS,EAAE,KACT2N,EAAQ3N,EAAE,MACV2d,EAAShQ,EAAM,cAAc,EAC7BlO,EAAIoB,EAAO,OACXZ,EAAO,UACPwQ,EACAC,EACAd,GACAgO,GACA3G,GACApY,GAAI,EACJC,GAAI,EACJkF,GAAI,EACDvE,KACH,OAAQoB,EAAOpB,CAAC,EAAG,CACf,IAAK,QACL,IAAK,UACL,IAAK,OACL,IAAK,UACL,IAAK,OACL,IAAK,OACDQ,EAAOY,EAAOpB,CAAC,EACf,MACJ,IAAK,OAAQX,GAAI,EAAG,MACpB,IAAK,SAAUA,GAAI,EAAG,MACtB,IAAK,OAAQD,GAAI,EAAG,MACpB,IAAK,QAASA,GAAI,EAAG,KACzB,CA8BJ,GA5BIoB,GAAQ,QACRpB,IAAK,EACLC,IAAK,EACLkF,IAAK,EACL4L,GAAK,EACLgO,GAAOH,EAAQ,EAAI,EACnBxG,GAAO,CACH,KAAM,OACN,OAAQtJ,EAAM,MAClB,IAEAiQ,GAAOhO,GAAK/Q,GAAI,EAChBoY,GAAO,CACH,KAAMtJ,EAAM,OACZ,OAAQ,MACZ,GAEA3N,EAAE,EAAE,OACAyd,GACAzd,EAAE,EAAE,OAAO,SAAWwc,GAAcxc,EAAE,EAAE,OAAO,OAAO,IACtDA,EAAE,EAAE,OAAO,WAAawc,GAAcxc,EAAE,EAAE,OAAO,SAAS,MAE1DA,EAAE,EAAE,OAAO,WAAawc,GAAcxc,EAAE,EAAE,OAAO,SAAS,IAC1DA,EAAE,EAAE,OAAO,aAAewc,GAAcxc,EAAE,EAAE,OAAO,WAAW,KAGlEA,EAAE,EAAE,OAAS,CAAC,EAEdC,GAAQ,OAAQ,CAChB,IAAI4d,GAAS,kBAAoB5d,EAC7B6d,GAAW,kBAAoBJ,EAAKzd,EAAOpB,GAAIC,GAAI,OAASkB,EAAE,GAC7DvF,EAAE,GAAG,IAAI,eAAeojB,EAAM,EAQ/BrB,GAAcqB,EAAM,KAPpBvZ,EAAE,KAAK,YAAYmY,EAAEA,EAAE,MAAM,EAAG,CAC5B,iBAAkB,QAClB,EAAGF,EAAQtc,CAAI,EACf,GAAI4d,EACR,CAAC,CAAC,EACFrB,GAAcqB,EAAM,EAAI,GAI5B,IAAIE,GAAStjB,EAAE,GAAG,IAAI,eAAeqjB,EAAQ,EACzCE,GACCD,IAkBDvB,GAAcsB,EAAQ,IACtBE,GAAMD,GAAO,qBAAqB,KAAK,EAAE,CAAC,IAlB1CA,GAAStB,EAAEA,EAAE,QAAQ,EAAG,CACpB,GAAIqB,GACJ,aAAchf,GACd,YAAaD,GACb,OAAQ,OACR,KAAM+e,GACN,KAAM9e,GAAI,CACd,CAAC,EACDkf,GAAMvB,EAAEA,EAAE,KAAK,EAAG,CACd,aAAc,IAAMoB,GACpB,WAAYJ,EAAQ,cAAgB5e,GAAI,EAAI,IAAMC,GAAI,EAAI,KAAOud,IAAK,SAAWxd,GAAImF,GAAI,IAAMlF,GAAIkF,GAAI,IACvG,gBAAiB,IAAMnF,GAAImF,GAAIlF,GAAIkF,IAAK,IAAI,QAAQ,CAAC,CACzD,CAAC,EACD+Z,GAAO,YAAYC,EAAG,EACtB1Z,EAAE,KAAK,YAAYyZ,EAAM,EACzBvB,GAAcsB,EAAQ,EAAI,GAK9BrB,EAAEuB,GAAK/G,EAAI,EACX,IAAIgH,GAAQrO,IAAM3P,GAAQ,WAAaA,GAAQ,QAC3Cwd,GACAhN,EAAOzQ,EAAE,EAAE,OAAO,QAAU2d,GAAU,EACtCjN,EAAKjW,EAAE,eAAekT,EAAM,IAAI,EAAIsQ,GAAQN,IAE5ClN,EAAOwN,GAAQN,EACfjN,EAAKjW,EAAE,eAAekT,EAAM,IAAI,GAAK3N,EAAE,EAAE,OAAO,MAAQ2d,GAAU,IAEtE1G,GAAO,CAAC,EACRA,GAAK,UAAYyG,CAAE,EAAI,QAAUI,GAAW,KACxCpN,GAAMD,KACNwG,GAAK,EAAIxc,EAAE,WAAWkT,EAAM,KAAM8C,EAAMC,CAAE,GAE9C+L,EAAEjK,EAAMyE,EAAI,EACZjX,EAAE,EAAE,OAAO0d,EAAK,MAAM,EAAIG,GAC1B7d,EAAE,EAAE,OAAO0d,EAAK,QAAQ,EAAII,GAC5B9d,EAAE,EAAE,OAAO0d,EAAK,IAAI,EAAIO,GACxBje,EAAE,EAAE,OAAO0d,EAAK,MAAM,EAAIzd,EAC1BD,EAAE,EAAE,OAAO0d,EAAK,QAAQ,EAAIzjB,CAChC,MACQwjB,GACAhN,EAAOzQ,EAAE,EAAE,OAAO,QAAU2d,GAAU,EACtCjN,EAAKjW,EAAE,eAAekT,EAAM,IAAI,EAAI8C,IAEpCA,EAAO,EACPC,EAAKjW,EAAE,eAAekT,EAAM,IAAI,GAAK3N,EAAE,EAAE,OAAO,MAAQ2d,GAAU,IAEtE3d,EAAE,EAAE,OAAO0d,EAAK,MAAM,GAAKjB,EAAEjK,EAAM,CAAC,EAAG/X,EAAE,WAAWkT,EAAM,KAAM8C,EAAMC,CAAE,CAAC,CAAC,EAC1E,OAAO1Q,EAAE,EAAE,OAAO0d,EAAK,MAAM,EAC7B,OAAO1d,EAAE,EAAE,OAAO0d,EAAK,QAAQ,EAC/B,OAAO1d,EAAE,EAAE,OAAO0d,EAAK,IAAI,EAC3B,OAAO1d,EAAE,EAAE,OAAO0d,EAAK,MAAM,EAC7B,OAAO1d,EAAE,EAAE,OAAO0d,EAAK,QAAQ,EAEnC,IAAKzG,MAAQuF,GAAe,GAAIA,GAAclhB,CAAG,EAAE2b,EAAI,GAAK,CAACuF,GAAcvF,EAAI,EAAG,CAC9E,IAAIjU,GAAOvI,EAAE,GAAG,IAAI,eAAewc,EAAI,EACvCjU,IAAQA,GAAK,WAAW,YAAYA,EAAI,CAC5C,CACJ,CACJ,EACAkb,GAAY,CACR,IAAK,CAAC,EAAG,CAAC,EACV,IAAK,CAAC,EAAG,CAAC,EACV,KAAM,CAAC,EAAG,EAAG,EAAG,CAAC,EACjB,MAAO,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,CAAC,EACxB,KAAM,CAAC,EAAG,CAAC,EACX,KAAM,CAAC,EAAG,CAAC,EACX,KAAM,CAAC,EAAG,CAAC,EACX,MAAO,CAAC,EAAG,EAAG,EAAG,CAAC,EAClB,MAAO,CAAC,EAAG,EAAG,EAAG,CAAC,EAClB,OAAQ,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,CAAC,CAC7B,EACAC,EAAY,SAAUne,EAAG/F,EAAO4K,EAAQ,CAEpC,GADA5K,EAAQikB,GAAUniB,EAAI9B,CAAK,EAAE,YAAY,CAAC,EACtCA,EAAO,CAKP,QAJI8Q,EAAQ/K,EAAE,MAAM,cAAc,GAAK,IACnCoe,EAAO,CAAC,MAAOrT,EAAO,OAAQA,EAAO,KAAM,CAAC,EAAE/K,EAAE,MAAM,gBAAgB,GAAK6E,EAAO,gBAAgB,CAAC,GAAK,EACxGwZ,EAAS,CAAC,EACV5e,EAAIxF,EAAM,OACPwF,KACH4e,EAAO5e,CAAC,EAAIxF,EAAMwF,CAAC,EAAIsL,GAAUtL,EAAI,EAAK,EAAI,IAAM2e,EAExD3B,EAAEzc,EAAE,KAAM,CAAC,mBAAoBqe,EAAO,KAAK,GAAG,CAAC,CAAC,CACpD,MAEE5B,EAAEzc,EAAE,KAAM,CAAC,mBAAoB,MAAM,CAAC,CAE5C,EACAse,EAAmB,SAAUte,EAAG6E,EAAQ,CACpC,IAAI2N,EAAOxS,EAAE,KACT2N,EAAQ3N,EAAE,MACVue,EAAM/L,EAAK,MAAM,WACrBA,EAAK,MAAM,WAAa,SACxB,QAASgM,KAAO3Z,EACZ,GAAIA,EAAOvJ,CAAG,EAAEkjB,CAAG,EAAG,CAClB,GAAI,CAAC/jB,EAAE,gBAAgBa,CAAG,EAAEkjB,CAAG,EAC3B,SAEJ,IAAIvkB,EAAQ4K,EAAO2Z,CAAG,EAEtB,OADA7Q,EAAM6Q,CAAG,EAAIvkB,EACLukB,EAAK,CACT,IAAK,OACDxe,EAAE,KAAK/F,CAAK,EACZ,MACJ,IAAK,QACD,IAAIwkB,EAAQjM,EAAK,qBAAqB,OAAO,EAG7C,GAAIiM,EAAM,SAAWA,EAAQA,EAAM,CAAC,GAClCA,EAAM,WAAW,UAAYxkB,MACxB,CACLwkB,EAAQhC,EAAE,OAAO,EACjB,IAAIiC,EAAMjkB,EAAE,GAAG,IAAI,eAAeR,CAAK,EACvCwkB,EAAM,YAAYC,CAAG,EACrBlM,EAAK,YAAYiM,CAAK,CACxB,CACA,MACJ,IAAK,OACL,IAAK,SACD,IAAIE,EAAKnM,EAAK,WACd,GAAImM,EAAG,QAAQ,YAAY,GAAK,IAAK,CACjC,IAAIC,EAAKnC,EAAE,GAAG,EACdkC,EAAG,aAAaC,EAAIpM,CAAI,EACxBoM,EAAG,YAAYpM,CAAI,EACnBmM,EAAKC,CACT,CACIJ,GAAO,SACPG,EAAG,eAAerC,GAAO,OAAQriB,GAAS,QAAU,MAAQA,CAAK,EAEjE0kB,EAAG,eAAerC,GAAOkC,EAAKvkB,CAAK,EAEvC,MACJ,IAAK,SACDuY,EAAK,MAAM,OAASvY,EACpB,MACJ,IAAK,YACD+F,EAAE,UAAU/F,CAAK,EACjB,MACJ,IAAK,cACDujB,GAASxd,EAAG/F,CAAK,EACjB,MACJ,IAAK,YACDujB,GAASxd,EAAG/F,EAAO,CAAC,EACpB,MACJ,IAAK,YACD,IAAI4kB,EAAO9iB,EAAI9B,CAAK,EAAE,MAAMiB,EAAS,EACrC,GAAI2jB,EAAK,QAAU,EAAG,CAClB7e,EAAE,MAAQA,EAAE,KAAK,WAAW,WAAW,YAAYA,EAAE,KAAK,UAAU,EACpE,IAAIZ,EAAKqd,EAAE,UAAU,EACjBqC,GAAKrC,EAAE,MAAM,EACjBrd,EAAG,GAAK3E,EAAE,WAAW,EACrBgiB,EAAEqC,GAAI,CACF,EAAGD,EAAK,CAAC,EACT,EAAGA,EAAK,CAAC,EACT,MAAOA,EAAK,CAAC,EACb,OAAQA,EAAK,CAAC,CAClB,CAAC,EACDzf,EAAG,YAAY0f,EAAE,EACjB9e,EAAE,MAAM,KAAK,YAAYZ,CAAE,EAC3Bqd,EAAEjK,EAAM,CAAC,YAAa,QAAUpT,EAAG,GAAK,GAAG,CAAC,EAC5CY,EAAE,KAAO8e,EACb,CACA,GAAI,CAAC7kB,EAAO,CACR,IAAIsF,GAAOiT,EAAK,aAAa,WAAW,EACxC,GAAIjT,GAAM,CACN,IAAIwf,GAAOtkB,EAAE,GAAG,IAAI,eAAe8E,GAAK,QAAQ,iBAAkB8c,EAAC,CAAC,EACpE0C,IAAQA,GAAK,WAAW,YAAYA,EAAI,EACxCtC,EAAEjK,EAAM,CAAC,YAAa6J,EAAC,CAAC,EACxB,OAAOrc,EAAE,IACb,CACJ,CACJ,MACA,IAAK,OACGA,EAAE,MAAQ,SACVyc,EAAEjK,EAAM,CAAC,EAAGvY,EAAQ0T,EAAM,KAAOlT,EAAE,gBAAgBR,CAAK,EAAI,MAAM,CAAC,EACnE+F,EAAE,EAAE,MAAQ,EACRA,EAAE,EAAE,SACJ,gBAAiBA,EAAE,EAAE,QAAUwd,GAASxd,EAAGA,EAAE,EAAE,OAAO,WAAW,EACjE,cAAeA,EAAE,EAAE,QAAUwd,GAASxd,EAAGA,EAAE,EAAE,OAAO,UAAW,CAAC,IAGxE,MACJ,IAAK,QAGD,GAFAwS,EAAK,aAAagM,EAAKvkB,CAAK,EAC5B+F,EAAE,EAAE,MAAQ,EACR2N,EAAM,GACN6Q,EAAM,IACNvkB,EAAQ0T,EAAM,MAEd,OAER,IAAK,IACGA,EAAM,KACN1T,EAAQ,CAAC0T,EAAM,GAAKA,EAAM,OAAS,IAE3C,IAAK,KACD,GAAI6Q,GAAO,MAAQxe,EAAE,MAAQ,OACzB,MAER,IAAK,KACDwS,EAAK,aAAagM,EAAKvkB,CAAK,EAC5B+F,EAAE,SAAWud,EAAevd,CAAC,EAC7BA,EAAE,EAAE,MAAQ,EACZ,MACJ,IAAK,SAGD,GAFAwS,EAAK,aAAagM,EAAKvkB,CAAK,EAC5B+F,EAAE,EAAE,MAAQ,EACR2N,EAAM,GACN6Q,EAAM,IACNvkB,EAAQ0T,EAAM,MAEd,OAER,IAAK,IACGA,EAAM,KACN1T,EAAQ,CAAC0T,EAAM,GAAKA,EAAM,QAAU,IAE5C,IAAK,KACD,GAAI6Q,GAAO,MAAQxe,EAAE,MAAQ,OACzB,MAER,IAAK,KACDwS,EAAK,aAAagM,EAAKvkB,CAAK,EAC5B+F,EAAE,SAAWud,EAAevd,CAAC,EAC7BA,EAAE,EAAE,MAAQ,EACZ,MACJ,IAAK,IACGA,EAAE,MAAQ,OACVyc,EAAEjK,EAAM,CAAC,GAAIvY,EAAO,GAAIA,CAAK,CAAC,EAE9BuY,EAAK,aAAagM,EAAKvkB,CAAK,EAEhC+F,EAAE,EAAE,MAAQ,EACZ,MACJ,IAAK,MACGA,EAAE,MAAQ,SACVwS,EAAK,eAAe8J,GAAO,OAAQriB,CAAK,EAE5C,MACJ,IAAK,gBACG+F,EAAE,EAAE,IAAM,GAAKA,EAAE,EAAE,IAAM,KACzB/F,GAASoC,GAAKE,GAAIyD,EAAE,EAAE,EAAE,EAAGzD,GAAIyD,EAAE,EAAE,EAAE,CAAC,GAAK,GAE/CwS,EAAK,aAAagM,EAAKvkB,CAAK,EACxB0T,EAAM,kBAAkB,GACxBwQ,EAAUne,EAAG2N,EAAM,kBAAkB,EAAG9I,CAAM,EAE9C7E,EAAE,EAAE,SACJ,gBAAiBA,EAAE,EAAE,QAAUwd,GAASxd,EAAGA,EAAE,EAAE,OAAO,WAAW,EACjE,cAAeA,EAAE,EAAE,QAAUwd,GAASxd,EAAGA,EAAE,EAAE,OAAO,UAAW,CAAC,GAEpE,MACJ,IAAK,mBACDme,EAAUne,EAAG/F,EAAO4K,CAAM,EAC1B,MACJ,IAAK,OACD,IAAIma,GAAQjjB,EAAI9B,CAAK,EAAE,MAAMQ,EAAE,MAAM,EACrC,GAAIukB,GAAO,CACP5f,EAAKqd,EAAE,SAAS,EAChB,IAAIwC,GAAKxC,EAAE,OAAO,EAClBrd,EAAG,GAAK3E,EAAE,WAAW,EACrBgiB,EAAErd,EAAI,CAAC,EAAG,EAAG,EAAG,EAAG,aAAc,iBAAkB,OAAQ,EAAG,MAAO,CAAC,CAAC,EACvEqd,EAAEwC,GAAI,CAAC,EAAG,EAAG,EAAG,EAAG,aAAcD,GAAM,CAAC,CAAC,CAAC,EAC1C5f,EAAG,YAAY6f,EAAE,EAEhB,SAAU7f,GAAI,CACX3E,EAAE,SAASukB,GAAM,CAAC,EAAG,UAAY,CAC7B,IAAIngB,GAAI,KAAK,YACTC,GAAI,KAAK,aACb2d,EAAErd,GAAI,CAAC,MAAOP,GAAG,OAAQC,EAAC,CAAC,EAC3B2d,EAAEwC,GAAI,CAAC,MAAOpgB,GAAG,OAAQC,EAAC,CAAC,CAC/B,CAAC,CACL,EAAGM,CAAE,EACLY,EAAE,MAAM,KAAK,YAAYZ,CAAE,EAC3Bqd,EAAEjK,EAAM,CAAC,KAAM,QAAUpT,EAAG,GAAK,GAAG,CAAC,EACrCY,EAAE,QAAUZ,EACZY,EAAE,SAAWud,EAAevd,CAAC,EAC7B,KACJ,CACA,IAAIiC,GAAMxH,EAAE,OAAOR,CAAK,EACxB,GAAI,CAACgI,GAAI,MACL,OAAO4C,EAAO,SACd,OAAO8I,EAAM,SACb,CAAClT,EAAE,GAAGkT,EAAM,QAAS,WAAW,GAC5BlT,EAAE,GAAGoK,EAAO,QAAS,WAAW,GAChC4X,EAAEjK,EAAM,CAAC,QAAS7E,EAAM,OAAO,CAAC,EACpC,CAAClT,EAAE,GAAGkT,EAAM,cAAc,EAAG,WAAW,GACpClT,EAAE,GAAGoK,EAAO,cAAc,EAAG,WAAW,GACxC4X,EAAEjK,EAAM,CAAC,eAAgB7E,EAAM,cAAc,CAAC,CAAC,WAC3C3N,EAAE,MAAQ,UAAYA,EAAE,MAAQ,WAAajE,EAAI9B,CAAK,EAAE,OAAO,GAAK,MAAQyiB,EAAgB1c,EAAG/F,CAAK,EAAG,CAC/G,GAAI,YAAa0T,GAAS,iBAAkBA,EAAO,CAC/C,IAAIkB,GAAWpU,EAAE,GAAG,IAAI,eAAe+X,EAAK,aAAa,MAAM,EAAE,QAAQ,eAAgB6J,EAAC,CAAC,EAC3F,GAAIxN,GAAU,CACV,IAAIqQ,GAAQrQ,GAAS,qBAAqB,MAAM,EAChD4N,EAAEyC,GAAMA,GAAM,OAAS,CAAC,EAAG,CAAC,gBAAiB,YAAavR,EAAQA,EAAM,QAAU,IAAM,iBAAkBA,EAAQA,EAAM,cAAc,EAAI,EAAE,CAAC,CACjJ,CACJ,CACAA,EAAM,SAAW1T,EACjB0T,EAAM,KAAO,OACb,KACJ,CACA1L,GAAI3G,CAAG,EAAE,SAAS,GAAKmhB,EAAEjK,EAAM,CAAC,eAAgBvQ,GAAI,QAAU,EAAIA,GAAI,QAAU,IAAMA,GAAI,OAAO,CAAC,EACtG,IAAK,SACDA,GAAMxH,EAAE,OAAOR,CAAK,EACpBuY,EAAK,aAAagM,EAAKvc,GAAI,GAAG,EAC9Buc,GAAO,UAAYvc,GAAI3G,CAAG,EAAE,SAAS,GAAKmhB,EAAEjK,EAAM,CAAC,iBAAkBvQ,GAAI,QAAU,EAAIA,GAAI,QAAU,IAAMA,GAAI,OAAO,CAAC,EACnHuc,GAAO,UAAYxe,EAAE,EAAE,SACvB,gBAAiBA,EAAE,EAAE,QAAUwd,GAASxd,EAAGA,EAAE,EAAE,OAAO,WAAW,EACjE,cAAeA,EAAE,EAAE,QAAUwd,GAASxd,EAAGA,EAAE,EAAE,OAAO,UAAW,CAAC,GAEpE,MACJ,IAAK,YACAA,EAAE,MAAQ,UAAYA,EAAE,MAAQ,WAAajE,EAAI9B,CAAK,EAAE,OAAO,GAAK,MAAQyiB,EAAgB1c,EAAG/F,CAAK,EACrG,MACJ,IAAK,UACG0T,EAAM,UAAY,CAACA,EAAMrS,CAAG,EAAE,gBAAgB,GAC9CmhB,EAAEjK,EAAM,CAAC,iBAAkBvY,EAAQ,EAAIA,EAAQ,IAAMA,CAAK,CAAC,EAGnE,IAAK,eACD,GAAI0T,EAAM,SAAU,CAChBkB,GAAWpU,EAAE,GAAG,IAAI,eAAe+X,EAAK,aAAa,MAAM,EAAE,QAAQ,eAAgB6J,EAAC,CAAC,EACnFxN,KACAqQ,GAAQrQ,GAAS,qBAAqB,MAAM,EAC5C4N,EAAEyC,GAAMA,GAAM,OAAS,CAAC,EAAG,CAAC,eAAgBjlB,CAAK,CAAC,GAEtD,KACJ,CACJ,QACIukB,GAAO,cAAgBvkB,EAAQsD,GAAMtD,EAAO,EAAE,EAAI,MAClD,IAAIklB,GAAUX,EAAI,QAAQ,SAAU,SAAU3f,GAAG,CAC7C,OAAOA,GAAE,UAAU,CAAC,EAAE,YAAY,CACtC,CAAC,EACD2T,EAAK,MAAM2M,EAAO,EAAIllB,EACtB+F,EAAE,EAAE,MAAQ,EACZwS,EAAK,aAAagM,EAAKvkB,CAAK,EAC5B,KACR,CACJ,CAGJmlB,EAASpf,EAAG6E,CAAM,EAClB2N,EAAK,MAAM,WAAa+L,CAC5B,EACAc,EAAU,IACVD,EAAW,SAAUhgB,EAAIyF,EAAQ,CAC7B,GAAI,EAAAzF,EAAG,MAAQ,QAAU,EAAEyF,EAAOvJ,CAAG,EAAE,MAAM,GAAKuJ,EAAOvJ,CAAG,EAAE,MAAM,GAAKuJ,EAAOvJ,CAAG,EAAE,WAAW,GAAKuJ,EAAOvJ,CAAG,EAAE,GAAG,GAAKuJ,EAAOvJ,CAAG,EAAE,GAAG,IAGxI,KAAI+C,EAAIe,EAAG,MACPoT,EAAOpT,EAAG,KACVkgB,EAAW9M,EAAK,WAAajV,GAAM9C,EAAE,GAAG,IAAI,YAAY,iBAAiB+X,EAAK,WAAY6J,EAAC,EAAE,iBAAiB,WAAW,EAAG,EAAE,EAAI,GAEtI,GAAIxX,EAAOvJ,CAAG,EAAE,MAAM,EAAG,CAErB,IADA+C,EAAE,KAAOwG,EAAO,KACT2N,EAAK,YACRA,EAAK,YAAYA,EAAK,UAAU,EAKpC,QAHI+M,EAAQxjB,EAAI8I,EAAO,IAAI,EAAE,MAAM;AAAA,CAAI,EACnC2a,EAAS,CAAC,EACVC,EACKhgB,EAAI,EAAGE,EAAK4f,EAAM,OAAQ9f,EAAIE,EAAIF,IACvCggB,EAAQhD,EAAE,OAAO,EACjBhd,GAAKgd,EAAEgD,EAAO,CAAC,GAAIH,EAAWD,EAAS,EAAGhhB,EAAE,CAAC,CAAC,EAC9CohB,EAAM,YAAYhlB,EAAE,GAAG,IAAI,eAAe8kB,EAAM9f,CAAC,CAAC,CAAC,EACnD+S,EAAK,YAAYiN,CAAK,EACtBD,EAAO/f,CAAC,EAAIggB,CAEpB,KAEI,KADAD,EAAShN,EAAK,qBAAqB,OAAO,EACrC/S,EAAI,EAAGE,EAAK6f,EAAO,OAAQ/f,EAAIE,EAAIF,IAASA,EAC7Cgd,EAAE+C,EAAO/f,CAAC,EAAG,CAAC,GAAI6f,EAAWD,EAAS,EAAGhhB,EAAE,CAAC,CAAC,EAE7Coe,EAAE+C,EAAO,CAAC,EAAG,CAAC,GAAI,CAAC,CAAC,EAG5B/C,EAAEjK,EAAM,CAAC,EAAGnU,EAAE,EAAG,EAAGA,EAAE,CAAC,CAAC,EACxBe,EAAG,EAAE,MAAQ,EACb,IAAI6L,EAAK7L,EAAG,SAAS,EACjBsgB,EAAMrhB,EAAE,GAAK4M,EAAG,EAAIA,EAAG,OAAS,GACpCyU,GAAOjlB,EAAE,GAAGilB,EAAK,QAAQ,GAAKjD,EAAE+C,EAAO,CAAC,EAAG,CAAC,GAAIE,CAAG,CAAC,EACxD,EACAC,GAAc,SAAUnN,EAAM,CAC1B,OAAIA,EAAK,YAAcA,EAAK,WAAW,QAAQ,YAAY,IAAM,IACtDA,EAAK,WAELA,CAEf,EACAoN,GAAU,SAAUpN,EAAMgC,EAAK,CAC3B,IAAIjS,EAAI,EACJkI,EAAI,EAeR,KAAK,CAAC,EAAI,KAAK,KAAO+H,EAatBA,EAAK,QAAU,GAQf,KAAK,GAAKqN,EAAK,EACfrN,EAAK,UAAY,KAAK,GAMtB,SAASqN,GAAO,CACZ,OAAQ,QAAU,KAAK,OAAO,EAAE,KAAK,IAAI,GAAG,CAAC,GAAK,GAAG,SAAS,EAAE,GAAG,MAAM,EAAE,CAC/E,CAEA,KAAK,OAASplB,EAAE,OAAO,EACvB,KAAK,SAAW,KAahB,KAAK,MAAQ+Z,EACb,KAAK,MAAQ,KAAK,OAAS,CAAC,EAC5B,KAAK,EAAI,CACL,UAAW,CAAC,EACZ,GAAI,EACJ,GAAI,EACJ,IAAK,EACL,GAAI,EACJ,GAAI,EACJ,MAAO,CACX,EACA,CAACA,EAAI,SAAWA,EAAI,OAAS,MAO7B,KAAK,KAAOA,EAAI,IAChBA,EAAI,MAAQA,EAAI,IAAI,KAAO,MAC3BA,EAAI,IAAM,KAOV,KAAK,KAAO,IAChB,EACA3B,GAAUpY,EAAE,GAEZmlB,GAAQ,UAAY/M,GACpBA,GAAQ,YAAc+M,GAEtBnlB,EAAE,QAAQ,KAAO,SAAU8J,EAAYsY,EAAK,CACxC,IAAIzd,EAAKqd,EAAE,MAAM,EACjBI,EAAI,QAAUA,EAAI,OAAO,YAAYzd,CAAE,EACvC,IAAIkF,EAAI,IAAIsb,GAAQxgB,EAAIyd,CAAG,EAC3B,OAAAvY,EAAE,KAAO,OACTga,EAAiBha,EAAG,CAChB,KAAM,OACN,OAAQ,OACR,KAAMC,CACV,CAAC,EACMD,CACX,EAeAuO,GAAQ,OAAS,SAAUlS,EAAK2F,EAAIC,EAAI,CACpC,GAAI,KAAK,QACL,OAAO,KASX,GAPA5F,EAAM5E,EAAI4E,CAAG,EAAE,MAAMzF,EAAS,EAC1ByF,EAAI,OAAS,IACb2F,EAAKhJ,EAAQqD,EAAI,CAAC,CAAC,EACnB4F,EAAKjJ,EAAQqD,EAAI,CAAC,CAAC,GAEvBA,EAAMrD,EAAQqD,EAAI,CAAC,CAAC,EACnB4F,GAAM,OAAUD,EAAKC,GAClBD,GAAM,MAAQC,GAAM,KAAM,CAC1B,IAAIlH,EAAO,KAAK,QAAQ,CAAC,EACzBiH,EAAKjH,EAAK,EAAIA,EAAK,MAAQ,EAC3BkH,EAAKlH,EAAK,EAAIA,EAAK,OAAS,CAChC,CACA,YAAK,UAAU,KAAK,EAAE,UAAU,OAAO,CAAC,CAAC,IAAKsB,EAAK2F,EAAIC,CAAE,CAAC,CAAC,CAAC,EACrD,IACX,EAgBAsM,GAAQ,MAAQ,SAAU/C,EAAIC,EAAIzJ,EAAIC,EAAI,CACtC,GAAI,KAAK,QACL,OAAO,KAWX,GATAuJ,EAAK/T,EAAI+T,CAAE,EAAE,MAAM5U,EAAS,EACxB4U,EAAG,OAAS,IACZC,EAAKzS,EAAQwS,EAAG,CAAC,CAAC,EAClBxJ,EAAKhJ,EAAQwS,EAAG,CAAC,CAAC,EAClBvJ,EAAKjJ,EAAQwS,EAAG,CAAC,CAAC,GAEtBA,EAAKxS,EAAQwS,EAAG,CAAC,CAAC,EACjBC,GAAM,OAAUA,EAAKD,GACrBvJ,GAAM,OAAUD,EAAKC,GAClBD,GAAM,MAAQC,GAAM,KACpB,IAAIlH,EAAO,KAAK,QAAQ,CAAC,EAE7B,OAAAiH,EAAKA,GAAajH,EAAK,EAAIA,EAAK,MAAQ,EACxCkH,EAAKA,GAAalH,EAAK,EAAIA,EAAK,OAAS,EACzC,KAAK,UAAU,KAAK,EAAE,UAAU,OAAO,CAAC,CAAC,IAAKyQ,EAAIC,EAAIzJ,EAAIC,CAAE,CAAC,CAAC,CAAC,EACxD,IACX,EAYAsM,GAAQ,UAAY,SAAUjD,EAAIC,EAAI,CAClC,OAAI,KAAK,QACE,MAEXD,EAAK7T,EAAI6T,CAAE,EAAE,MAAM1U,EAAS,EACxB0U,EAAG,OAAS,IACZC,EAAKvS,EAAQsS,EAAG,CAAC,CAAC,GAEtBA,EAAKtS,EAAQsS,EAAG,CAAC,CAAC,GAAK,EACvBC,EAAK,CAACA,GAAM,EACZ,KAAK,UAAU,KAAK,EAAE,UAAU,OAAO,CAAC,CAAC,IAAKD,EAAIC,CAAE,CAAC,CAAC,CAAC,EAChD,KACX,EAsCAgD,GAAQ,UAAY,SAAUnD,EAAM,CAChC,IAAIM,EAAI,KAAK,EACb,GAAIN,GAAQ,KACR,OAAOM,EAAE,UAQb,GANAvV,EAAE,kBAAkB,KAAMiV,CAAI,EAE9B,KAAK,MAAQ+M,EAAE,KAAK,KAAM,CAAC,UAAW,KAAK,OAAO,OAAO,CAAC,CAAC,EAC3D,KAAK,SAAWc,EAAe,IAAI,EACnC,KAAK,MAAQd,EAAE,KAAK,KAAM,CAAC,UAAW,KAAK,MAAM,CAAC,EAE9CzM,EAAE,IAAM,GAAKA,EAAE,IAAM,EAAG,CACxB,IAAI8P,EAAK,KAAK,MAAMxkB,CAAG,EAAE,cAAc,EAAI,KAAK,MAAM,cAAc,EAAI,EACxE,KAAK,KAAK,CAAC,eAAgBwkB,CAAE,CAAC,CAClC,CAEA,OAAO,IACX,EAQAjN,GAAQ,KAAO,UAAY,CACvB,OAAI,KAAK,UAAS,KAAK,KAAK,MAAM,QAAU,QACrC,IACX,EAQAA,GAAQ,KAAO,UAAY,CACvB,OAAI,KAAK,UAAS,KAAK,KAAK,MAAM,QAAU,IACrC,IACX,EAOAA,GAAQ,OAAS,UAAY,CACzB,IAAIL,EAAOmN,GAAY,KAAK,IAAI,EAChC,GAAI,OAAK,SAAW,CAACnN,EAAK,YAG1B,KAAI1V,EAAQ,KAAK,MACjBA,EAAM,SAAWA,EAAM,QAAQ,QAAQ,IAAI,EAC3CpC,GAAI,OAAO,eAAiB,KAAK,EAAE,EAC/B,KAAK,UACLoC,EAAM,KAAK,YAAY,KAAK,QAAQ,EAExCrC,EAAE,MAAM,KAAMqC,CAAK,EAEnB0V,EAAK,WAAW,YAAYA,CAAI,EAGhC,KAAK,WAAW,EAEhB,QAAS/S,KAAK,KACV,KAAKA,CAAC,EAAI,OAAO,KAAKA,CAAC,GAAK,WAAahF,EAAE,gBAAgBgF,CAAC,EAAI,KAEpE,KAAK,QAAU,GACnB,EACAoT,GAAQ,SAAW,UAAY,CAC3B,GAAI,KAAK,KAAK,MAAM,SAAW,OAAQ,CACnC,KAAK,KAAK,EACV,IAAIkN,EAAO,EACf,CACA,IAAIC,EAAe,GACfC,EACA,KAAK,MAAM,OAAO,cACpBA,EAAiB,KAAK,MAAM,OAAO,cAAc,MAE1C,KAAK,MAAM,OAAO,aACzBA,EAAiB,KAAK,MAAM,OAAO,WAAW,OAG7CA,GAAkBA,EAAe,SAAW,SAC7CD,EAAe,GACfC,EAAe,QAAU,IAE3B,IAAI5gB,EAAO,CAAC,EACZ,GAAI,CACAA,EAAO,KAAK,KAAK,QAAQ,CAC7B,MAAW,CAEPA,EAAO,CACH,EAAG,KAAK,KAAK,WACb,EAAG,KAAK,KAAK,UACb,MAAO,KAAK,KAAK,YACjB,OAAQ,KAAK,KAAK,YACtB,CACJ,QAAE,CACEA,EAAOA,GAAQ,CAAC,EACb2gB,IACDC,EAAe,QAAU,OAE/B,CACA,OAAAF,GAAQ,KAAK,KAAK,EACX1gB,CACX,EAkFAwT,GAAQ,KAAO,SAAU9Y,EAAME,EAAO,CAClC,GAAI,KAAK,QACL,OAAO,KAEX,GAAIF,GAAQ,KAAM,CACd,IAAIqG,EAAM,CAAC,EACX,QAAS/B,KAAK,KAAK,MAAW,KAAK,MAAM/C,CAAG,EAAE+C,CAAC,IAC3C+B,EAAI/B,CAAC,EAAI,KAAK,MAAMA,CAAC,GAEzB,OAAA+B,EAAI,UAAYA,EAAI,MAAQ,SAAWA,EAAI,KAAOA,EAAI,WAAa,OAAOA,EAAI,SAC9EA,EAAI,UAAY,KAAK,EAAE,UAChBA,CACX,CACA,GAAInG,GAAS,MAAQQ,EAAE,GAAGV,EAAM,QAAQ,EAAG,CACvC,GAAIA,GAAQ,QAAU,KAAK,MAAM,MAAQ,QAAU,KAAK,MAAM,SAC1D,OAAO,KAAK,MAAM,SAEtB,GAAIA,GAAQ,YACR,OAAO,KAAK,EAAE,UAIlB,QAFImmB,EAAQnmB,EAAK,MAAMmB,EAAS,EAC5B6V,EAAM,CAAC,EACFtR,EAAI,EAAGE,EAAKugB,EAAM,OAAQzgB,EAAIE,EAAIF,IACvC1F,EAAOmmB,EAAMzgB,CAAC,EACV1F,KAAQ,KAAK,MACbgX,EAAIhX,CAAI,EAAI,KAAK,MAAMA,CAAI,EACpBU,EAAE,GAAG,KAAK,MAAM,iBAAiBV,CAAI,EAAG,UAAU,EACzDgX,EAAIhX,CAAI,EAAI,KAAK,MAAM,iBAAiBA,CAAI,EAAE,IAE9CgX,EAAIhX,CAAI,EAAIU,EAAE,gBAAgBV,CAAI,EAG1C,OAAO4F,EAAK,EAAIoR,EAAMA,EAAImP,EAAM,CAAC,CAAC,CACtC,CACA,GAAIjmB,GAAS,MAAQQ,EAAE,GAAGV,EAAM,OAAO,EAAG,CAEtC,IADAgX,EAAM,CAAC,EACFtR,EAAI,EAAGE,EAAK5F,EAAK,OAAQ0F,EAAIE,EAAIF,IAClCsR,EAAIhX,EAAK0F,CAAC,CAAC,EAAI,KAAK,KAAK1F,EAAK0F,CAAC,CAAC,EAEpC,OAAOsR,CACX,CACA,GAAI9W,GAAS,KAAM,CACf,IAAI4K,EAAS,CAAC,EACdA,EAAO9K,CAAI,EAAIE,CACnB,MAAWF,GAAQ,MAAQU,EAAE,GAAGV,EAAM,QAAQ,IAC1C8K,EAAS9K,GAEb,QAASK,KAAOyK,EACZnK,GAAI,gBAAkBN,EAAM,IAAM,KAAK,GAAI,KAAMyK,EAAOzK,CAAG,CAAC,EAEhE,IAAKA,KAAO,KAAK,MAAM,iBAAkB,GAAI,KAAK,MAAM,iBAAiBkB,CAAG,EAAElB,CAAG,GAAKyK,EAAOvJ,CAAG,EAAElB,CAAG,GAAKK,EAAE,GAAG,KAAK,MAAM,iBAAiBL,CAAG,EAAG,UAAU,EAAG,CAC1J,IAAI0U,EAAM,KAAK,MAAM,iBAAiB1U,CAAG,EAAE,MAAM,KAAM,CAAC,EAAE,OAAOyK,EAAOzK,CAAG,CAAC,CAAC,EAC7E,KAAK,MAAMA,CAAG,EAAIyK,EAAOzK,CAAG,EAC5B,QAAS+lB,KAAUrR,EAASA,EAAIxT,CAAG,EAAE6kB,CAAM,IACvCtb,EAAOsb,CAAM,EAAIrR,EAAIqR,CAAM,EAEnC,CACA,OAAA7B,EAAiB,KAAMzZ,CAAM,EACtB,IACX,EAQAgO,GAAQ,QAAU,UAAY,CAC1B,GAAI,KAAK,QACL,OAAO,KAEX,IAAIL,EAAOmN,GAAY,KAAK,IAAI,EAChCnN,EAAK,WAAW,YAAYA,CAAI,EAChC,IAAIgC,EAAM,KAAK,MACf,OAAAA,EAAI,KAAO,MAAQ/Z,EAAE,SAAS,KAAM+Z,CAAG,EAChC,IACX,EAQA3B,GAAQ,OAAS,UAAY,CACzB,GAAI,KAAK,QACL,OAAO,KAEX,IAAIL,EAAOmN,GAAY,KAAK,IAAI,EAC5BS,EAAa5N,EAAK,WACtB4N,EAAW,aAAa5N,EAAM4N,EAAW,UAAU,EACnD3lB,EAAE,QAAQ,KAAM,KAAK,KAAK,EAC1B,IAAI+Z,EAAM,KAAK,MACf,OAAO,IACX,EAQA3B,GAAQ,YAAc,SAAUd,EAAS,CACrC,GAAI,KAAK,SAAW,CAACA,EACjB,OAAO,KAGX,IAAIS,EAAOmN,GAAY,KAAK,IAAI,EAC5BU,EAAYV,GAAY5N,EAAQ,MAAQA,EAAQA,EAAQ,OAAS,CAAC,EAAE,IAAI,EAC5E,OAAIsO,EAAU,YACVA,EAAU,WAAW,aAAa7N,EAAM6N,EAAU,WAAW,EAE7DA,EAAU,WAAW,YAAY7N,CAAI,EAEzC/X,EAAE,aAAa,KAAMsX,EAAS,KAAK,KAAK,EACjC,IACX,EAQAc,GAAQ,aAAe,SAAUd,EAAS,CACtC,GAAI,KAAK,SAAW,CAACA,EACjB,OAAO,KAGX,IAAIS,EAAOmN,GAAY,KAAK,IAAI,EAC5BW,EAAaX,GAAY5N,EAAQ,MAAQA,EAAQ,CAAC,EAAE,IAAI,EAC5D,OAAAuO,EAAW,WAAW,aAAa9N,EAAM8N,CAAU,EACnD7lB,EAAE,cAAc,KAAMsX,EAAS,KAAK,KAAK,EAClC,IACX,EACAc,GAAQ,KAAO,SAAUmI,EAAM,CAE3B,IAAIhX,EAAI,KACR,GAAI,CAACgX,GAAS,EAAG,CACb,IAAIuF,EAAO9D,EAAE,QAAQ,EACjB+D,EAAO/D,EAAE,gBAAgB,EAC7BzY,EAAE,MAAM,KAAOgX,EACfuF,EAAK,GAAK9lB,EAAE,WAAW,EACvBgiB,EAAE+D,EAAM,CAAC,aAAc,CAACxF,GAAQ,GAAG,CAAC,EACpCuF,EAAK,YAAYC,CAAI,EACrBxc,EAAE,MAAM,KAAK,YAAYuc,CAAI,EAC7Bvc,EAAE,MAAQuc,EACV9D,EAAEzY,EAAE,KAAM,CAAC,OAAQ,QAAUuc,EAAK,GAAK,GAAG,CAAC,CAC/C,MACQvc,EAAE,QACFA,EAAE,MAAM,WAAW,YAAYA,EAAE,KAAK,EACtC,OAAOA,EAAE,MACT,OAAOA,EAAE,MAAM,MAEnBA,EAAE,KAAK,gBAAgB,QAAQ,EAEnC,OAAOA,CACX,EACAvJ,EAAE,QAAQ,OAAS,SAAU+Z,EAAK9V,EAAGE,EAAGG,EAAG,CACvC,IAAIK,EAAKqd,EAAE,QAAQ,EACnBjI,EAAI,QAAUA,EAAI,OAAO,YAAYpV,CAAE,EACvC,IAAIgB,EAAM,IAAIwf,GAAQxgB,EAAIoV,CAAG,EAC7B,OAAApU,EAAI,MAAQ,CAAC,GAAI1B,EAAG,GAAIE,EAAG,EAAGG,EAAG,KAAM,OAAQ,OAAQ,MAAM,EAC7DqB,EAAI,KAAO,SACXqc,EAAErd,EAAIgB,EAAI,KAAK,EACRA,CACX,EACA3F,EAAE,QAAQ,KAAO,SAAU+Z,EAAK9V,EAAGE,EAAGC,EAAGC,EAAGC,EAAG,CAC3C,IAAIK,EAAKqd,EAAE,MAAM,EACjBjI,EAAI,QAAUA,EAAI,OAAO,YAAYpV,CAAE,EACvC,IAAIgB,EAAM,IAAIwf,GAAQxgB,EAAIoV,CAAG,EAC7B,OAAApU,EAAI,MAAQ,CAAC,EAAG1B,EAAG,EAAGE,EAAG,MAAOC,EAAG,OAAQC,EAAG,GAAIC,GAAK,EAAG,GAAIA,GAAK,EAAG,KAAM,OAAQ,OAAQ,MAAM,EAClGqB,EAAI,KAAO,OACXqc,EAAErd,EAAIgB,EAAI,KAAK,EACRA,CACX,EACA3F,EAAE,QAAQ,QAAU,SAAU+Z,EAAK9V,EAAGE,EAAGK,EAAIC,EAAI,CAC7C,IAAIE,EAAKqd,EAAE,SAAS,EACpBjI,EAAI,QAAUA,EAAI,OAAO,YAAYpV,CAAE,EACvC,IAAIgB,EAAM,IAAIwf,GAAQxgB,EAAIoV,CAAG,EAC7B,OAAApU,EAAI,MAAQ,CAAC,GAAI1B,EAAG,GAAIE,EAAG,GAAIK,EAAI,GAAIC,EAAI,KAAM,OAAQ,OAAQ,MAAM,EACvEkB,EAAI,KAAO,UACXqc,EAAErd,EAAIgB,EAAI,KAAK,EACRA,CACX,EACA3F,EAAE,QAAQ,MAAQ,SAAU+Z,EAAKhR,EAAK9E,EAAGE,EAAGC,EAAGC,EAAG,CAC9C,IAAIM,EAAKqd,EAAE,OAAO,EAClBA,EAAErd,EAAI,CAAC,EAAGV,EAAG,EAAGE,EAAG,MAAOC,EAAG,OAAQC,EAAG,oBAAqB,MAAM,CAAC,EACpEM,EAAG,eAAekd,GAAO,OAAQ9Y,CAAG,EACpCgR,EAAI,QAAUA,EAAI,OAAO,YAAYpV,CAAE,EACvC,IAAIgB,EAAM,IAAIwf,GAAQxgB,EAAIoV,CAAG,EAC7B,OAAApU,EAAI,MAAQ,CAAC,EAAG1B,EAAG,EAAGE,EAAG,MAAOC,EAAG,OAAQC,EAAG,IAAK0E,CAAG,EACtDpD,EAAI,KAAO,QACJA,CACX,EACA3F,EAAE,QAAQ,KAAO,SAAU+Z,EAAK9V,EAAGE,EAAG8U,EAAM,CACxC,IAAItU,EAAKqd,EAAE,MAAM,EACjBjI,EAAI,QAAUA,EAAI,OAAO,YAAYpV,CAAE,EACvC,IAAIgB,EAAM,IAAIwf,GAAQxgB,EAAIoV,CAAG,EAC7B,OAAApU,EAAI,MAAQ,CACR,EAAG1B,EACH,EAAGE,EACH,cAAe,SACf,KAAM8U,EACN,cAAejZ,EAAE,gBAAgB,aAAa,EAC9C,YAAaA,EAAE,gBAAgB,WAAW,EAC1C,OAAQ,OACR,KAAM,MACV,EACA2F,EAAI,KAAO,OACXke,EAAiBle,EAAKA,EAAI,KAAK,EACxBA,CACX,EACA3F,EAAE,QAAQ,QAAU,SAAUsQ,EAAOC,EAAQ,CACzC,YAAK,MAAQD,GAAS,KAAK,MAC3B,KAAK,OAASC,GAAU,KAAK,OAC7B,KAAK,OAAO,aAAa,QAAS,KAAK,KAAK,EAC5C,KAAK,OAAO,aAAa,SAAU,KAAK,MAAM,EAC1C,KAAK,UACL,KAAK,WAAW,MAAM,KAAM,KAAK,QAAQ,EAEtC,IACX,EACAvQ,EAAE,QAAQ,OAAS,UAAY,CAC3B,IAAIgmB,EAAMhmB,EAAE,cAAc,MAAM,EAAG,SAAS,EACxCoW,EAAY4P,GAAOA,EAAI,UAC3B,GAAI,CAAC5P,EACD,MAAM,IAAI,MAAM,0BAA0B,EAE9C,IAAInS,EAAI+hB,EAAI,EACR7hB,EAAI6hB,EAAI,EACR1V,EAAQ0V,EAAI,MACZzV,EAASyV,EAAI,OACbC,EAAOjE,EAAE,KAAK,EACdkE,EAAM,mBACNC,EACJ,OAAAliB,EAAIA,GAAK,EACTE,EAAIA,GAAK,EACTmM,EAAQA,GAAS,IACjBC,EAASA,GAAU,IACnByR,EAAEiE,EAAM,CACJ,OAAQ1V,EACR,QAAS,IACT,MAAOD,EACP,MAAO,6BACP,cAAe,8BACnB,CAAC,EACG8F,GAAa,GACb6P,EAAK,MAAM,QAAUC,EAAM,0BAA4BjiB,EAAI,UAAYE,EAAI,KAC3EnE,EAAE,GAAG,IAAI,KAAK,YAAYimB,CAAI,EAC9BE,EAAa,IAEbF,EAAK,MAAM,QAAUC,EAAM,oBACvB9P,EAAU,WACVA,EAAU,aAAa6P,EAAM7P,EAAU,UAAU,EAEjDA,EAAU,YAAY6P,CAAI,GAGlC7P,EAAY,IAAIpW,EAAE,OAClBoW,EAAU,MAAQ9F,EAClB8F,EAAU,OAAS7F,EACnB6F,EAAU,OAAS6P,EACnB7P,EAAU,MAAM,EAChBA,EAAU,MAAQA,EAAU,KAAO,EACnC+P,IAAe/P,EAAU,UAAY,UAAY,CAAC,GAClDA,EAAU,UAAU,EACbA,CACX,EACApW,EAAE,QAAQ,WAAa,SAAUiE,EAAG,EAAGG,EAAGC,EAAGgV,EAAK,CAC9CpZ,GAAI,qBAAsB,KAAM,KAAK,SAAU,CAACgE,EAAG,EAAGG,EAAGC,EAAGgV,CAAG,CAAC,EAChE,IAAI+M,EAAY,KAAK,QAAQ,EACzB7F,EAAO3e,GAAKwC,EAAIgiB,EAAU,MAAO/hB,EAAI+hB,EAAU,MAAM,EACrDvM,EAAM,KAAK,IACXwM,EAAchN,EAAM,gBAAkB,WACtCiN,EACAjB,EAeJ,IAdIphB,GAAK,MACD,KAAK,UACLsc,EAAO,GAEX,OAAO,KAAK,QACZ+F,EAAK,OAAS,KAAK,MAAQjlB,GAAI,KAAK,SAEpC,KAAK,QAAUkf,EACf+F,EAAKriB,EAAI5C,GAAI,EAAIA,GAAI+C,EAAI/C,GAAIgD,GAEjC2d,EAAE,KAAK,OAAQ,CACX,QAASsE,EACT,oBAAqBD,CACzB,CAAC,EACM9F,GAAQ1G,GACXwL,EAAK,iBAAkBxL,EAAI,MAAQA,EAAI,MAAM,cAAc,EAAI,EAC/DA,EAAI,KAAK,CAAC,eAAgBwL,CAAE,CAAC,EAC7BxL,EAAI,EAAE,MAAQ,EACdA,EAAI,EAAE,OAAS,EACfA,EAAMA,EAAI,KAEd,YAAK,SAAW,CAAC5V,EAAG,EAAGG,EAAGC,EAAG,CAAC,CAACgV,CAAG,EAC3B,IACX,EAWArZ,EAAE,UAAU,UAAY,UAAY,CAChC,IAAIimB,EAAO,KAAK,OACZte,EAAIse,EAAK,MACT1O,EACJ,GAAI,CACAA,EAAM0O,EAAK,aAAa,GAAKA,EAAK,gBAAgB,CACtD,MAAY,CACR1O,EAAM0O,EAAK,gBAAgB,CAC/B,CACA,IAAInM,EAAO,CAACvC,EAAI,EAAI,EAChBsC,EAAM,CAACtC,EAAI,EAAI,GACfuC,GAAQD,KACJC,IACA,KAAK,OAAS,KAAK,MAAQA,GAAQ,EACnCnS,EAAE,KAAO,KAAK,MAAQ,MAEtBkS,IACA,KAAK,MAAQ,KAAK,KAAOA,GAAO,EAChClS,EAAE,IAAM,KAAK,KAAO,MAGhC,EAOA3H,EAAE,UAAU,MAAQ,UAAY,CAC5BA,EAAE,IAAI,gBAAiB,IAAI,EAE3B,QADI0G,EAAI,KAAK,OACNA,EAAE,YACLA,EAAE,YAAYA,EAAE,UAAU,EAE9B,KAAK,OAAS,KAAK,IAAM,MACxB,KAAK,KAAOsb,EAAE,MAAM,GAAG,YAAYhiB,EAAE,GAAG,IAAI,eAAe,2BAA6BA,EAAE,OAAO,CAAC,EACnG0G,EAAE,YAAY,KAAK,IAAI,EACvBA,EAAE,YAAY,KAAK,KAAOsb,EAAE,MAAM,CAAC,CACvC,EAOAhiB,EAAE,UAAU,OAAS,UAAY,CAC7BC,GAAI,iBAAkB,IAAI,EAC1B,KAAK,OAAO,YAAc,KAAK,OAAO,WAAW,YAAY,KAAK,MAAM,EACxE,QAAS+E,KAAK,KACV,KAAKA,CAAC,EAAI,OAAO,KAAKA,CAAC,GAAK,WAAahF,EAAE,gBAAgBgF,CAAC,EAAI,IAExE,EACA,IAAI+Z,GAAW/e,EAAE,GACjB,QAASgf,MAAU5G,GAAaA,GAAQvX,CAAG,EAAEme,EAAM,GAAK,CAACD,GAASle,CAAG,EAAEme,EAAM,IACzED,GAASC,EAAM,EAAK,SAAUlP,EAAY,CACtC,OAAO,UAAY,CACf,IAAInH,EAAM,UACV,OAAO,KAAK,QAAQ,SAAUhE,EAAI,CAC9BA,EAAGmL,CAAU,EAAE,MAAMnL,EAAIgE,CAAG,CAChC,CAAC,CACL,CACJ,EAAGqW,EAAM,GAEjB,EAAG,MAAMlgB,GAASgB,CAA4B,EAC1CC,IAAkC,SAAchB,GAAO,QAAUgB,EAG/D,EAEA,uBAKC,SAAShB,GAAQD,GAASM,EAAqB,CAEtD,IAAIU,EAA8BC,EAAgCD,EAA+B,CAACV,EAA0C,uBAAuB,CAAC,EAAGW,EAAiC,SAASC,EAAG,CAChN,GAAI,EAAAA,GAAK,CAACA,EAAE,KAIZ,KAAIa,EAAM,iBACNS,EAAM,OACNuB,EAAU,WACVlB,GAAO,KACPgB,EAAQhB,GAAK,MACbC,GAAOD,GAAK,IACZE,GAAOF,GAAK,IACZG,EAAMH,GAAK,IACXQ,GAAa,OACb1B,GAAY,QACZR,GAAMD,EAAE,IACRkc,GAAK,qCACL7a,GAAI,IACJugB,EAAI,GACJ2E,GAAM,CAAC,EAAG,IAAK,EAAG,IAAK,EAAG,IAAK,EAAG,IAAK,EAAG,IAAK,EAAG,IAAK,EAAG,IAAK,EAAG,GAAG,EACrEC,EAAQ,yBACRC,EAAa,6BACbxC,EAAM,cACNyC,GAAS,iFACTC,EAAO,MACPC,GAAY,CAAC,KAAM,EAAG,KAAM,EAAG,MAAO,CAAC,EACvCC,GAAY,CAAC,OAAQ,EAAG,QAAS,CAAC,EAClCC,EAAW,SAAUhiB,EAAM,CACvB,IAAIiiB,EAAS,aACTrR,EAAU1V,EAAE,gBAGhB,GAFAsB,EAAIwD,CAAI,EAAE,MAAMiiB,CAAK,IAAMrR,EAAU1V,EAAE,aACvC+mB,EAAQ,UACJrR,GAAW1V,EAAE,iBAAmB,CAACsB,EAAIwD,CAAI,EAAE,MAAMiiB,CAAK,EAAG,CACzD,IAAIphB,EAAMrE,EAAIwD,CAAI,EAAE,QAAQ0hB,EAAO,SAAUjF,GAAK7L,GAASnV,GAAM,CAC7D,IAAIymB,GAAO,CAAC,EACRC,GAASvR,GAAQ,YAAY,GAAK,IAClC/P,GAAM4gB,GAAI7Q,EAAO,EACrB,OAAAnV,GAAK,QAAQ0jB,EAAK,SAAUzkB,GAAO,CAC3BynB,IAAUD,GAAK,QAAU,IACzBrhB,IAAOqhB,GAAOT,GAAI7Q,IAAW,IAAM,IAAM,GAAG,EAC5CsR,GAAO,CAAC,GAEZA,GAAK,KAAKrkB,EAAMnD,GAAQmnB,CAAI,CAAC,CACjC,CAAC,EACMhhB,GAAMqhB,EACjB,CAAC,EACD,OAAOrhB,CACX,CACA,IAAIgL,EAAK+E,EAAQ5Q,CAAI,EAAG+E,EAAGvF,EAC3BqB,EAAM,CAAC,EACP,QAASX,EAAI,EAAGE,EAAKyL,EAAG,OAAQ3L,EAAIE,EAAIF,IAAK,CACzC6E,EAAI8G,EAAG3L,CAAC,EACRV,EAAIqM,EAAG3L,CAAC,EAAE,CAAC,EAAE,YAAY,EACzBV,GAAK,MAAQA,EAAI,KACjB,QAASW,EAAI,EAAGE,EAAK0E,EAAE,OAAQ5E,EAAIE,EAAIF,IACnCX,GAAK3B,EAAMkH,EAAE5E,CAAC,EAAI0hB,CAAI,GAAK1hB,GAAKE,EAAK,EAAI,IAAMyc,GAEnDjc,EAAI,KAAKrB,CAAC,CACd,CACA,OAAOqB,EAAI,KAAKtE,EAAC,CACrB,EACA6lB,EAAe,SAAUhhB,EAAKiP,EAAIC,EAAI,CAClC,IAAI/M,EAAIrI,EAAE,OAAO,EACjB,OAAAqI,EAAE,OAAO,CAACnC,EAAK,GAAI,EAAE,EACd,CACH,GAAImC,EAAE,EAAE8M,EAAIC,CAAE,EACd,GAAI/M,EAAE,EAAE8M,EAAIC,CAAE,CAClB,CACJ,EACA+R,EAAY,SAAUtd,EAAGwL,EAAIC,EAAIH,EAAIC,EAAIlP,EAAK,CAC1C,IAAIqP,EAAI1L,EAAE,EACNxB,EAAIwB,EAAE,OACNud,EAAU7R,EAAE,QACZhQ,EAAIsE,EAAE,KACNlC,EAAIpC,EAAE,MACNpB,GAAI,EACJkjB,GAAO,GACPC,GACAC,GAAKZ,EAAOtR,EACZmS,GAAKb,EAAOrR,EAEhB,GADA3N,EAAE,WAAa,SACX,GAAC0N,GAAM,CAACC,GAKZ,IAFA/P,EAAE,UAAYzD,EAAIylB,EAAE,EAAIlmB,GAAIS,EAAI0lB,EAAE,EAClC7f,EAAE,SAAWzB,GAAOmP,EAAKC,EAAK,EAAI,GAAK,GACnCpP,EAAK,CACL,IAAIQ,GAAIwgB,EAAahhB,EAAKiP,EAAIC,CAAE,EAChCD,EAAKzO,GAAE,GACP0O,EAAK1O,GAAE,EACX,CAKA,GAJA2O,EAAK,IAAMgS,IAAQ,KACnB/R,EAAK,IAAM+R,IAAQ,QAAUljB,GAAI,IACjCwD,EAAE,KAAO0f,GACT9hB,EAAE,YAAe4P,EAAK,CAACoS,GAAMlmB,GAAK+T,EAAK,CAACoS,GACpCJ,GAAW7R,EAAE,SAAU,CACvB,IAAIkS,GAAOliB,EAAE,qBAAqBpD,EAAU,EAC5CslB,GAAOA,IAAQA,GAAK,CAAC,EACrBliB,EAAE,YAAYkiB,EAAI,EACdL,IACA1gB,GAAIwgB,EAAahhB,EAAKmC,EAAE,EAAE+e,EAAQ,CAAC,EAAGA,EAAQ,CAAC,CAAC,EAAG/e,EAAE,EAAE+e,EAAQ,CAAC,EAAGA,EAAQ,CAAC,CAAC,CAAC,EAC9EK,GAAK,SAAW/gB,GAAE,GAAKvC,GAAI9C,GAAIqF,GAAE,GAAKvC,IAEtCoR,EAAE,WACFkS,GAAK,KAAOlS,EAAE,SAAS,CAAC,EAAIzT,EAAIuT,CAAE,EAAIhU,GAAIkU,EAAE,SAAS,CAAC,EAAIzT,EAAIwT,CAAE,GAEpE/P,EAAE,YAAYkiB,EAAI,CACtB,CACA9f,EAAE,WAAa,UACnB,EACJ3H,EAAE,SAAW,UAAY,CACrB,MAAQ;AAAA,6BAA6F,KAAK,OAC9G,EACA,IAAI+iB,EAAW,SAAU,EAAGvjB,EAAOwjB,EAAO,CAOtC,QANI5c,EAAS9E,EAAI9B,CAAK,EAAE,YAAY,EAAE,MAAM,GAAG,EAC3CyjB,EAAKD,EAAQ,MAAQ,QACrBhe,EAAIoB,EAAO,OACXZ,EAAO,UACPpB,EAAI,SACJC,EAAI,SACDW,KACH,OAAQoB,EAAOpB,CAAC,EAAG,CACf,IAAK,QACL,IAAK,UACL,IAAK,OACL,IAAK,UACL,IAAK,OACL,IAAK,OACDQ,EAAOY,EAAOpB,CAAC,EACf,MACJ,IAAK,OACL,IAAK,SAAUX,EAAI+B,EAAOpB,CAAC,EAAG,MAC9B,IAAK,OACL,IAAK,QAASZ,EAAIgC,EAAOpB,CAAC,EAAG,KACjC,CAEJ,IAAIke,EAAS,EAAE,KAAK,qBAAqB,QAAQ,EAAE,CAAC,EACpDA,EAAOD,EAAK,OAAO,EAAIzd,EACvB0d,EAAOD,EAAK,aAAa,EAAI7e,EAC7B8e,EAAOD,EAAK,YAAY,EAAI5e,CAChC,EACAwf,GAAmB,SAAU,EAAGzZ,EAAQ,CAEpC,EAAE,MAAQ,EAAE,OAAS,CAAC,EACtB,IAAI2N,EAAO,EAAE,KACTnU,EAAI,EAAE,MACN+D,EAAIoQ,EAAK,MACTrJ,EACAgZ,EAAUd,GAAU,EAAE,IAAI,IAAMxc,EAAO,GAAKxG,EAAE,GAAKwG,EAAO,GAAKxG,EAAE,GAAKwG,EAAO,OAASxG,EAAE,OAASwG,EAAO,QAAUxG,EAAE,QAAUwG,EAAO,IAAMxG,EAAE,IAAMwG,EAAO,IAAMxG,EAAE,IAAMwG,EAAO,IAAMxG,EAAE,IAAMwG,EAAO,IAAMxG,EAAE,IAAMwG,EAAO,GAAKxG,EAAE,GAChO+jB,EAASd,GAAU,EAAE,IAAI,IAAMjjB,EAAE,IAAMwG,EAAO,IAAMxG,EAAE,IAAMwG,EAAO,IAAMxG,EAAE,GAAKwG,EAAO,GAAKxG,EAAE,IAAMwG,EAAO,IAAMxG,EAAE,IAAMwG,EAAO,IAChIzE,EAAM,EAGV,QAAS0O,KAAOjK,EAAYA,EAAOvJ,CAAG,EAAEwT,CAAG,IACvCzQ,EAAEyQ,CAAG,EAAIjK,EAAOiK,CAAG,GAqBvB,GAnBIqT,IACA9jB,EAAE,KAAO5D,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,EAC7B,EAAE,EAAE,MAAQ,GAEhBoK,EAAO,OAAS2N,EAAK,KAAO3N,EAAO,MACnCA,EAAO,QAAU2N,EAAK,MAAQ3N,EAAO,OACrCA,EAAO,SAAW2N,EAAK,OAAS3N,EAAO,QACvCA,EAAO,SAAWzC,EAAE,OAASyC,EAAO,QACpC,SAAUA,GAAU,EAAE,KAAKA,EAAO,IAAI,GAClCA,EAAO,MAAQ,EAAE,MAAQ,QAAUsd,KACnC3P,EAAK,KAAO+O,EAAS,CAACxlB,EAAIsC,EAAE,IAAI,EAAE,YAAY,EAAE,QAAQ,GAAG,EAAI5D,EAAE,gBAAgB4D,EAAE,IAAI,EAAIA,EAAE,IAAI,EACjG,EAAE,EAAE,MAAQ,EACR,EAAE,MAAQ,UACV,EAAE,EAAE,QAAU,CAACA,EAAE,EAAGA,EAAE,CAAC,EACvB,EAAE,EAAE,SAAW,CAACA,EAAE,MAAOA,EAAE,MAAM,EACjCujB,EAAU,EAAG,EAAG,EAAG,EAAG,EAAG,CAAC,IAGlC,cAAe/c,GAAU,EAAE,UAAUA,EAAO,SAAS,EACjDud,EAAQ,CACR,IAAI9b,EAAK,CAACjI,EAAE,GACRkI,GAAK,CAAClI,EAAE,GACRY,GAAK,CAACZ,EAAE,IAAM,CAACA,EAAE,GAAK,EACtBa,GAAK,CAACb,EAAE,IAAM,CAACA,EAAE,GAAK,EAC1BmU,EAAK,KAAO/X,EAAE,OAAO,qCAAsC2C,GAAOkJ,EAAKrH,IAAMmiB,CAAI,EAAGhkB,GAAOmJ,GAAKrH,IAAMkiB,CAAI,EAAGhkB,GAAOkJ,EAAKrH,IAAMmiB,CAAI,EAAGhkB,GAAOmJ,GAAKrH,IAAMkiB,CAAI,EAAGhkB,EAAMkJ,EAAK8a,CAAI,CAAC,EAC/K,EAAE,EAAE,MAAQ,CAChB,CACA,GAAI,cAAevc,EAAQ,CACvB,IAAIga,GAAO9iB,EAAI8I,EAAO,WAAW,CAAC,EAAE,MAAM3J,EAAS,EACnD,GAAI2jB,GAAK,QAAU,EAAG,CAClBA,GAAK,CAAC,EAAI,CAACA,GAAK,CAAC,GAAK,CAACA,GAAK,CAAC,EAC7BA,GAAK,CAAC,EAAI,CAACA,GAAK,CAAC,GAAK,CAACA,GAAK,CAAC,EAC7B,IAAIwD,GAAM7P,EAAK,UAAY/X,EAAE,GAAG,IAAI,cAAc,KAAK,EACnD6nB,GAASD,GAAI,MACjBC,GAAO,KAAO7nB,EAAE,OAAO,gCAAiCokB,EAAI,EACvDrM,EAAK,WACN8P,GAAO,SAAW,WAClBA,GAAO,IAAM,EACbA,GAAO,KAAO,EACdA,GAAO,MAAQ,EAAE,MAAM,MAAQ,KAC/BA,GAAO,OAAS,EAAE,MAAM,OAAS,KACjC9P,EAAK,WAAW,aAAa6P,GAAK7P,CAAI,EACtC6P,GAAI,YAAY7P,CAAI,EACpBA,EAAK,SAAW6P,GAExB,CACKxd,EAAO,WAAW,GACnB2N,EAAK,WAAaA,EAAK,SAAS,MAAM,KAAO,OAErD,CACA,GAAI,EAAE,SAAU,CACZ,IAAI+P,GAAgB,EAAE,SAAS,MAC/B1d,EAAO,OAAS0d,GAAc,KAAO1d,EAAO,MAC5CA,EAAO,aAAa,IAAM0d,GAAc,WAAa,IAAM1d,EAAO,aAAa,EAAE,MAAM,GAAG,EAAE,CAAC,EAAE,QAAQ,iBAAkBwX,CAAC,EAAI,KAC9HxX,EAAO,WAAW,IAAM0d,GAAc,SAAW1d,EAAO,WAAW,GACnEA,EAAO,aAAa,IAAM0d,GAAc,WAAa1d,EAAO,aAAa,GACzEA,EAAO,YAAY,IAAM0d,GAAc,UAAY1d,EAAO,YAAY,EAC1E,CAOA,GANI,gBAAiBA,GACjB2Y,EAASpd,EAAKyE,EAAO,aAAa,CAAC,EAEnC,cAAeA,GACf2Y,EAASpd,EAAKyE,EAAO,WAAW,EAAG,CAAC,EAEpCA,EAAO,SAAW,MAClBA,EAAO,MAAQ,MACfA,EAAO,KAAO,MACdA,EAAO,QAAU,MACjBA,EAAO,cAAc,GAAK,MAC1BA,EAAO,gBAAgB,GAAK,MAC5BA,EAAO,cAAc,GAAK,MAC1BA,EAAO,kBAAkB,GAAK,MAC9BA,EAAO,mBAAmB,GAAK,MAC/BA,EAAO,iBAAiB,GAAK,MAC7BA,EAAO,gBAAgB,GAAK,KAAM,CAClC,IAAIqd,GAAO1P,EAAK,qBAAqB5V,EAAU,EAC3C4lB,GAAU,GAUd,GATAN,GAAOA,IAAQA,GAAK,CAAC,EACrB,CAACA,KAASM,GAAUN,GAAOO,GAAW7lB,EAAU,GAC5C,EAAE,MAAQ,SAAWiI,EAAO,MAC5Bqd,GAAK,IAAMrd,EAAO,KAEtBA,EAAO,OAASqd,GAAK,GAAK,KACtBA,GAAK,IAAM,MAAQrd,EAAO,MAAQ,QAAUA,EAAO,OAAS,QAC5Dqd,GAAK,GAAK,IAEVA,GAAK,IAAMrd,EAAO,KAAM,CACxB,IAAIma,GAAQjjB,EAAI8I,EAAO,IAAI,EAAE,MAAMpK,EAAE,MAAM,EAC3C,GAAIukB,GAAO,CACPkD,GAAK,YAAc1P,GAAQA,EAAK,YAAY0P,EAAI,EAChDA,GAAK,OAAS,GACdA,GAAK,IAAMlD,GAAM,CAAC,EAClBkD,GAAK,KAAO,OACZ,IAAI7iB,GAAO,EAAE,QAAQ,CAAC,EACtB6iB,GAAK,SAAW7iB,GAAK,EAAIvD,GAAIuD,GAAK,EAClC,EAAE,EAAE,QAAU,CAACA,GAAK,EAAGA,GAAK,CAAC,EAE7B5E,EAAE,SAASukB,GAAM,CAAC,EAAG,UAAY,CAC7B,EAAE,EAAE,SAAW,CAAC,KAAK,YAAa,KAAK,YAAY,CACvD,CAAC,CACL,MACIkD,GAAK,MAAQznB,EAAE,OAAOoK,EAAO,IAAI,EAAE,IACnCqd,GAAK,IAAM7F,EACX6F,GAAK,KAAO,QACRznB,EAAE,OAAOoK,EAAO,IAAI,EAAE,QAAUzE,EAAI,OAAQ,CAAC,OAAQ,EAAG,QAAS,CAAC,GAAKrE,EAAI8I,EAAO,IAAI,EAAE,OAAO,GAAK,MAAQ6X,GAAgBtc,EAAKyE,EAAO,KAAMqd,EAAI,IAClJ7jB,EAAE,KAAO,OACTA,EAAE,SAAWwG,EAAO,KACpBqd,GAAK,OAAS,GAG1B,CACA,GAAI,iBAAkBrd,GAAU,YAAaA,EAAQ,CACjD,IAAId,KAAY,CAAC1F,EAAE,cAAc,EAAI,GAAK,GAAK,KAAO,CAACA,EAAE,QAAU,GAAK,GAAK,KAAO,CAAC5D,EAAE,OAAOoK,EAAO,IAAI,EAAE,EAAI,GAAK,GAAK,GACzHd,GAAUzH,GAAKD,GAAK0H,GAAS,CAAC,EAAG,CAAC,EAClCme,GAAK,QAAUne,GACXme,GAAK,MACLA,GAAK,MAAQ,OAErB,CACA1P,EAAK,YAAY0P,EAAI,EACrB,IAAIvE,GAAUnL,EAAK,qBAAqB,QAAQ,GAAKA,EAAK,qBAAqB,QAAQ,EAAE,CAAC,EAC1FkQ,GAAY,GACZ,CAAC/E,KAAW+E,GAAY/E,GAAS8E,GAAW,QAAQ,IAC/C5d,EAAO,QAAUA,EAAO,QAAU,QACnCA,EAAO,cAAc,GACrBA,EAAO,gBAAgB,GAAK,MAC5BA,EAAO,kBAAkB,GACzBA,EAAO,mBAAmB,GAC1BA,EAAO,iBAAiB,GACxBA,EAAO,gBAAgB,KACvB8Y,GAAO,GAAK,KAEf9Y,EAAO,QAAU,QAAUA,EAAO,SAAW,MAAQ8Y,GAAO,IAAM,MAAQ9Y,EAAO,QAAU,GAAKA,EAAO,cAAc,GAAK,KAAO8Y,GAAO,GAAK,IAC9I,IAAIgF,GAAcloB,EAAE,OAAOoK,EAAO,MAAM,EACxC8Y,GAAO,IAAM9Y,EAAO,SAAW8Y,GAAO,MAAQgF,GAAY,KAC1D5e,KAAY,CAAC1F,EAAE,gBAAgB,EAAI,GAAK,GAAK,KAAO,CAACA,EAAE,QAAU,GAAK,GAAK,KAAO,CAACskB,GAAY,EAAI,GAAK,GAAK,GAC7G,IAAI5X,IAASzN,EAAQuH,EAAO,cAAc,CAAC,GAAK,GAAK,IAUrD,GATAd,GAAUzH,GAAKD,GAAK0H,GAAS,CAAC,EAAG,CAAC,EAClCc,EAAO,cAAc,GAAK,OAASkG,GAAQ1M,EAAE,cAAc,GAC3DwG,EAAO,cAAc,IAAM8Y,GAAO,OAAS5S,IAC3CA,IAASA,GAAQ,IAAMhH,IAAWgH,MAAW4S,GAAO,OAAS,GAC7DA,GAAO,QAAU5Z,GAEjBc,EAAO,iBAAiB,IAAM8Y,GAAO,UAAY9Y,EAAO,iBAAiB,GAAK,SAC9E8Y,GAAO,WAAa9Y,EAAO,mBAAmB,GAAK,EACnDA,EAAO,gBAAgB,IAAM8Y,GAAO,OAAS9Y,EAAO,gBAAgB,GAAK,OAAS,OAASA,EAAO,gBAAgB,GAAK,SAAW,SAAW,SACzI,qBAAsBA,EAAQ,CAC9B,IAAIqZ,GAAY,CACZ,IAAK,YACL,IAAK,WACL,KAAM,eACN,MAAO,kBACP,KAAM,MACN,KAAM,OACN,KAAM,WACN,MAAO,UACP,MAAO,cACP,OAAQ,gBACZ,EACAP,GAAO,UAAYO,GAAU5iB,CAAG,EAAEuJ,EAAO,kBAAkB,CAAC,EAAIqZ,GAAUrZ,EAAO,kBAAkB,CAAC,EAAIwX,CAC5G,CACAqG,IAAalQ,EAAK,YAAYmL,EAAM,CACxC,CACA,GAAIvd,EAAI,MAAQ,OAAQ,CACpBA,EAAI,MAAM,OAAO,MAAM,QAAUic,EACjC,IAAIuG,GAAOxiB,EAAI,MAAM,KACjB0C,GAAI,IACJwc,GAAWjhB,EAAE,MAAQA,EAAE,KAAK,MAAM,qBAAqB,EAC3D+D,EAAIwgB,GAAK,MACTvkB,EAAE,OAAS+D,EAAE,KAAO/D,EAAE,MACtBA,EAAE,aAAa,IAAM+D,EAAE,WAAa/D,EAAE,aAAa,GACnDA,EAAE,aAAa,IAAM+D,EAAE,WAAa/D,EAAE,aAAa,GACnDA,EAAE,YAAY,IAAM+D,EAAE,UAAY/D,EAAE,YAAY,GAChDihB,GAAWhiB,EAAQe,EAAE,WAAW,GAAKihB,IAAYA,GAAS,CAAC,CAAC,GAAK,GACjEld,EAAE,SAAWkd,GAAWxc,GAAI,KAC5B1C,EAAI,SAAS,SAAWwiB,GAAK,UAAY7mB,EAAIqE,EAAI,SAAS,MAAM,EAAE,QAAQ,KAAM,OAAO,EAAE,QAAQ,KAAM,OAAO,EAAE,QAAQ,MAAO,MAAM,GACrI,IAAIyiB,GAAQD,GAAK,sBAAsB,EACvCxiB,EAAI,EAAI/B,EAAE,GAAKwkB,GAAM,MAAQA,GAAM,MAAQ/f,GAC3C1C,EAAI,EAAI/B,EAAE,GAAKwkB,GAAM,OAASA,GAAM,KAAO/f,GAE3C1C,EAAI,EAAI/B,EAAE,EACV+B,EAAI,EAAI/B,EAAE,EAAI+B,EAAI,EAAI,GAErB,MAAOyE,GAAU,MAAOA,KAAYzE,EAAI,KAAK,EAAI3F,EAAE,OAAO,mBAAoB2C,EAAMiB,EAAE,EAAI+iB,CAAI,EAAGhkB,EAAMiB,EAAE,EAAI+iB,CAAI,EAAGhkB,EAAMiB,EAAE,EAAI+iB,CAAI,EAAI,CAAC,GAE1I,QADI0B,GAAa,CAAC,IAAK,IAAK,OAAQ,OAAQ,cAAe,cAAe,aAAc,WAAW,EAC1F/iB,GAAI,EAAGgjB,GAAKD,GAAW,OAAQ/iB,GAAIgjB,GAAIhjB,KAAK,GAAI+iB,GAAW/iB,EAAC,IAAK8E,EAAQ,CAC9EzE,EAAI,EAAE,MAAQ,EACd,KACJ,CAGA,OAAQ/B,EAAE,aAAa,EAAG,CACtB,IAAK,QACD+B,EAAI,SAAS,MAAM,cAAc,EAAI,OACrCA,EAAI,IAAMA,EAAI,EAAI,EACtB,MACA,IAAK,MACDA,EAAI,SAAS,MAAM,cAAc,EAAI,QACrCA,EAAI,IAAM,CAACA,EAAI,EAAI,EACvB,MACA,QACIA,EAAI,SAAS,MAAM,cAAc,EAAI,SACrCA,EAAI,IAAM,EACd,KACJ,CACAA,EAAI,SAAS,MAAM,aAAa,EAAI,EACxC,CAEJ,EACAsc,GAAkB,SAAU,EAAG7N,EAAUqT,EAAM,CAC3C,EAAE,MAAQ,EAAE,OAAS,CAAC,EACtB,IAAIvU,EAAQ,EAAE,MACVnR,EAAM,KAAK,IACXuH,EACAif,EACA/iB,EAAO,SACPgjB,EAAO,QAaX,GAZA,EAAE,MAAM,SAAWpU,EACnBA,EAAW9S,EAAI8S,CAAQ,EAAE,QAAQpU,EAAE,iBAAkB,SAAUuhB,GAAKW,GAAIC,GAAI,CACxE,OAAA3c,EAAO,SACH0c,IAAMC,KACND,GAAKrf,EAAQqf,EAAE,EACfC,GAAKtf,EAAQsf,EAAE,EACfpgB,EAAImgB,GAAK,GAAI,CAAC,EAAIngB,EAAIogB,GAAK,GAAI,CAAC,EAAI,MAAQA,GAAKxgB,GAAK,KAAK,IAAMI,EAAImgB,GAAK,GAAI,CAAC,CAAC,IAAMC,GAAK,IAAM,EAAI,GAAK,IAC1GqG,EAAOtG,GAAK7gB,GAAI8gB,IAEbP,CACX,CAAC,EACDxN,EAAWA,EAAS,MAAM,UAAU,EAChC5O,GAAQ,SAAU,CAClB,IAAI6L,EAAQ+C,EAAS,MAAM,EAE3B,GADA/C,EAAQ,CAACxO,EAAQwO,CAAK,EAClB,MAAMA,CAAK,EACX,OAAO,IAEf,CACA,IAAIN,EAAO/Q,EAAE,WAAWoU,CAAQ,EAChC,GAAI,CAACrD,EACD,OAAO,KAGX,GADA,EAAI,EAAE,OAAS,EAAE,KACbA,EAAK,OAAQ,CACb,EAAE,YAAY0W,CAAI,EAClBA,EAAK,GAAK,GACVA,EAAK,OAAS,OACdA,EAAK,MAAQ1W,EAAK,CAAC,EAAE,MACrB0W,EAAK,OAAS1W,EAAKA,EAAK,OAAS,CAAC,EAAE,MAEpC,QADI0X,GAAO,CAAC,EACHzjB,GAAI,EAAGE,GAAK6L,EAAK,OAAQ/L,GAAIE,GAAIF,KACtC+L,EAAK/L,EAAC,EAAE,QAAUyjB,GAAK,KAAK1X,EAAK/L,EAAC,EAAE,OAAS3D,GAAI0P,EAAK/L,EAAC,EAAE,KAAK,EAElEyiB,EAAK,OAASgB,GAAK,OAASA,GAAK,KAAK,EAAI,MAAQhB,EAAK,MACnDjiB,GAAQ,UACRiiB,EAAK,KAAO,gBACZA,EAAK,MAAQ,OACbA,EAAK,UAAY,MACjBA,EAAK,cAAgBe,EACrBf,EAAK,MAAQ,IAGbA,EAAK,KAAO,WACZA,EAAK,OAAS,IAAMpW,GAAS,KAEjC,EAAE,YAAYoW,CAAI,CACtB,CACA,MAAO,EACX,EACAtC,GAAU,SAAUpN,EAAM2Q,EAAK,CAC3B,KAAK,CAAC,EAAI,KAAK,KAAO3Q,EACtBA,EAAK,QAAU,GACf,KAAK,GAAK/X,EAAE,OACZ+X,EAAK,UAAY,KAAK,GACtB,KAAK,EAAI,EACT,KAAK,EAAI,EACT,KAAK,MAAQ,CAAC,EACd,KAAK,MAAQ2Q,EACb,KAAK,OAAS1oB,EAAE,OAAO,EACvB,KAAK,EAAI,CACL,UAAW,CAAC,EACZ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,IAAK,EACL,MAAO,EACP,OAAQ,CACZ,EACA,CAAC0oB,EAAI,SAAWA,EAAI,OAAS,MAC7B,KAAK,KAAOA,EAAI,IAChBA,EAAI,MAAQA,EAAI,IAAI,KAAO,MAC3BA,EAAI,IAAM,KACV,KAAK,KAAO,IAChB,EACItQ,GAAUpY,EAAE,GAEhBmlB,GAAQ,UAAY/M,GACpBA,GAAQ,YAAc+M,GACtB/M,GAAQ,UAAY,SAAUnD,EAAM,CAChC,GAAIA,GAAQ,KACR,OAAO,KAAK,EAAE,UAElB,IAAI0T,EAAM,KAAK,MAAM,cACjBC,EAAMD,EAAM,IAAM,CAACA,EAAI,MAAOA,EAAI,KAAK,EAAI,QAAU,CAACA,EAAI,GAAIA,EAAI,EAAE,EAAI/G,EACxEiH,EACAF,IACAE,EAAO5T,EAAO3T,EAAI2T,CAAI,EAAE,QAAQ,gBAAiB,KAAK,EAAE,WAAa2M,CAAC,GAE1E5hB,EAAE,kBAAkB,KAAM4oB,EAAM3T,CAAI,EACpC,IAAIlQ,EAAS,KAAK,OAAO,MAAM,EAC3B+jB,EAAO,KAAK,KACZvjB,EAAI,KAAK,KACThE,EACAwnB,EAAS,CAACznB,EAAI,KAAK,MAAM,IAAI,EAAE,QAAQ,GAAG,EAC1C0nB,EAAS,CAAC1nB,EAAI,KAAK,MAAM,IAAI,EAAE,QAAQ,MAAM,EAEjD,GADAyD,EAAO,UAAU,EAAG,CAAC,EACjBikB,GAAUD,GAAU,KAAK,MAAQ,QAIjC,GAHAD,EAAK,OAAS,UACdA,EAAK,OAAS,MACdvnB,EAAQwD,EAAO,MAAM,EAChBgkB,GAAUxnB,EAAM,YAAe,CAACA,EAAM,SAAU,CACjDgE,EAAE,MAAM,OAASR,EAAO,SAAS,EACjC,IAAIyL,EAAK,KAAK,QAAQ,EAClByY,GAAM,KAAK,QAAQ,CAAC,EACpB9T,GAAK3E,EAAG,EAAIyY,GAAI,EAChB7T,GAAK5E,EAAG,EAAIyY,GAAI,EACpB1jB,EAAE,YAAe4P,GAAK,CAACwR,EAAQtlB,GAAK+T,GAAK,CAACuR,EAC1CQ,EAAU,KAAM,EAAG,EAAGhS,GAAIC,GAAI,CAAC,CACnC,MACI7P,EAAE,MAAM,OAASqc,EACjBuF,EAAU,KAAM5lB,EAAM,OAAQA,EAAM,OAAQA,EAAM,GAAIA,EAAM,GAAIA,EAAM,MAAM,OAGhFgE,EAAE,MAAM,OAASqc,EACjBkH,EAAK,OAASxnB,EAAIyD,CAAM,EACxB+jB,EAAK,OAAS/jB,EAAO,OAAO,EAEhC,OAAI8jB,IAAS,OACT,KAAK,EAAE,UAAYA,EACnB7oB,EAAE,kBAAkB,KAAM6oB,CAAI,GAE3B,IACX,EACAzQ,GAAQ,OAAS,SAAUlS,EAAK2F,EAAIC,EAAI,CACpC,GAAI,KAAK,QACL,OAAO,KAEX,GAAI5F,GAAO,KAUX,IAPAA,EAAM5E,EAAI4E,CAAG,EAAE,MAAMzF,EAAS,EAC1ByF,EAAI,OAAS,IACb2F,EAAKhJ,EAAQqD,EAAI,CAAC,CAAC,EACnB4F,EAAKjJ,EAAQqD,EAAI,CAAC,CAAC,GAEvBA,EAAMrD,EAAQqD,EAAI,CAAC,CAAC,EACnB4F,GAAM,OAAUD,EAAKC,GAClBD,GAAM,MAAQC,GAAM,KAAM,CAC1B,IAAIlH,EAAO,KAAK,QAAQ,CAAC,EACzBiH,EAAKjH,EAAK,EAAIA,EAAK,MAAQ,EAC3BkH,EAAKlH,EAAK,EAAIA,EAAK,OAAS,CAChC,CACA,YAAK,EAAE,OAAS,EAChB,KAAK,UAAU,KAAK,EAAE,UAAU,OAAO,CAAC,CAAC,IAAKsB,EAAK2F,EAAIC,CAAE,CAAC,CAAC,CAAC,EACrD,KACX,EACAsM,GAAQ,UAAY,SAAUjD,EAAIC,EAAI,CAClC,OAAI,KAAK,QACE,MAEXD,EAAK7T,EAAI6T,CAAE,EAAE,MAAM1U,EAAS,EACxB0U,EAAG,OAAS,IACZC,EAAKvS,EAAQsS,EAAG,CAAC,CAAC,GAEtBA,EAAKtS,EAAQsS,EAAG,CAAC,CAAC,GAAK,EACvBC,EAAK,CAACA,GAAM,EACR,KAAK,EAAE,OACP,KAAK,EAAE,KAAK,GAAKD,EACjB,KAAK,EAAE,KAAK,GAAKC,GAErB,KAAK,UAAU,KAAK,EAAE,UAAU,OAAO,CAAC,CAAC,IAAKD,EAAIC,CAAE,CAAC,CAAC,CAAC,EAChD,KACX,EACAgD,GAAQ,MAAQ,SAAU/C,EAAIC,EAAIzJ,EAAIC,EAAI,CACtC,GAAI,KAAK,QACL,OAAO,KAaX,GAXAuJ,EAAK/T,EAAI+T,CAAE,EAAE,MAAM5U,EAAS,EACxB4U,EAAG,OAAS,IACZC,EAAKzS,EAAQwS,EAAG,CAAC,CAAC,EAClBxJ,EAAKhJ,EAAQwS,EAAG,CAAC,CAAC,EAClBvJ,EAAKjJ,EAAQwS,EAAG,CAAC,CAAC,EAClB,MAAMxJ,CAAE,IAAMA,EAAK,MACnB,MAAMC,CAAE,IAAMA,EAAK,OAEvBuJ,EAAKxS,EAAQwS,EAAG,CAAC,CAAC,EACjBC,GAAM,OAAUA,EAAKD,GACrBvJ,GAAM,OAAUD,EAAKC,GAClBD,GAAM,MAAQC,GAAM,KACpB,IAAIlH,EAAO,KAAK,QAAQ,CAAC,EAE7B,OAAAiH,EAAKA,GAAajH,EAAK,EAAIA,EAAK,MAAQ,EACxCkH,EAAKA,GAAalH,EAAK,EAAIA,EAAK,OAAS,EAEzC,KAAK,UAAU,KAAK,EAAE,UAAU,OAAO,CAAC,CAAC,IAAKyQ,EAAIC,EAAIzJ,EAAIC,CAAE,CAAC,CAAC,CAAC,EAC/D,KAAK,EAAE,OAAS,EACT,IACX,EACAsM,GAAQ,KAAO,UAAY,CACvB,OAAC,KAAK,UAAY,KAAK,KAAK,MAAM,QAAU,QACrC,IACX,EACAA,GAAQ,KAAO,UAAY,CACvB,OAAC,KAAK,UAAY,KAAK,KAAK,MAAM,QAAUwJ,GACrC,IACX,EAEAxJ,GAAQ,WAAapY,EAAE,GAAG,QAC1BoY,GAAQ,QAAU,UAAU,CAC1B,IAAIvU,EAAI,KAAK,WAAW,EACxB,GAAI,KAAK,OAAS,KAAK,MAAM,cAC7B,CACE,IAAI6C,EAAI,CAAC,EACLiD,EAAI,EAAE,KAAK,MAAM,cAAc,MACnC,OAAAjD,EAAE,EAAI7C,EAAE,EAAI,KAAK,MAAM,cAAc,GACrC6C,EAAE,GAAKiD,EACPjD,EAAE,EAAI7C,EAAE,EAAI,KAAK,MAAM,cAAc,GACrC6C,EAAE,GAAKiD,EACPjD,EAAE,MAAS7C,EAAE,MAAS8F,EACtBjD,EAAE,OAAS7C,EAAE,OAAS8F,EACtBjD,EAAE,GAAKA,EAAE,EAAIA,EAAE,MACfA,EAAE,GAAKA,EAAE,EAAIA,EAAE,OACRA,CACT,CACA,OAAO7C,CACT,EACAuU,GAAQ,SAAW,UAAY,CAC3B,OAAI,KAAK,QACE,CAAC,EAEL,CACH,EAAG,KAAK,GAAK,KAAK,KAAO,GAAK,KAAK,EAAI,EACvC,EAAG,KAAK,EAAI,KAAK,EACjB,MAAO,KAAK,EACZ,OAAQ,KAAK,CACjB,CACJ,EACAA,GAAQ,OAAS,UAAY,CACzB,GAAI,OAAK,SAAW,CAAC,KAAK,KAAK,YAG/B,MAAK,MAAM,SAAW,KAAK,MAAM,QAAQ,QAAQ,IAAI,EACrDpY,EAAE,IAAI,OAAO,eAAiB,KAAK,EAAE,EACrCA,EAAE,MAAM,KAAM,KAAK,KAAK,EACxB,KAAK,KAAK,WAAW,YAAY,KAAK,IAAI,EAC1C,KAAK,OAAS,KAAK,MAAM,WAAW,YAAY,KAAK,KAAK,EAC1D,QAASgF,KAAK,KACV,KAAKA,CAAC,EAAI,OAAO,KAAKA,CAAC,GAAK,WAAahF,EAAE,gBAAgBgF,CAAC,EAAI,KAEpE,KAAK,QAAU,GACnB,EACAoT,GAAQ,KAAO,SAAU9Y,EAAME,EAAO,CAClC,GAAI,KAAK,QACL,OAAO,KAEX,GAAIF,GAAQ,KAAM,CACd,IAAIqG,EAAM,CAAC,EACX,QAAS/B,KAAK,KAAK,MAAW,KAAK,MAAM/C,CAAG,EAAE+C,CAAC,IAC3C+B,EAAI/B,CAAC,EAAI,KAAK,MAAMA,CAAC,GAEzB,OAAA+B,EAAI,UAAYA,EAAI,MAAQ,SAAWA,EAAI,KAAOA,EAAI,WAAa,OAAOA,EAAI,SAC9EA,EAAI,UAAY,KAAK,EAAE,UAChBA,CACX,CACA,GAAInG,GAAS,MAAQQ,EAAE,GAAGV,EAAM,QAAQ,EAAG,CACvC,GAAIA,GAAQ6C,IAAc,KAAK,MAAM,MAAQ,QAAU,KAAK,MAAM,SAC9D,OAAO,KAAK,MAAM,SAItB,QAFIsjB,EAAQnmB,EAAK,MAAMmB,EAAS,EAC5B6V,EAAM,CAAC,EACFtR,EAAI,EAAGE,EAAKugB,EAAM,OAAQzgB,EAAIE,EAAIF,IACvC1F,EAAOmmB,EAAMzgB,CAAC,EACV1F,KAAQ,KAAK,MACbgX,EAAIhX,CAAI,EAAI,KAAK,MAAMA,CAAI,EACpBU,EAAE,GAAG,KAAK,MAAM,iBAAiBV,CAAI,EAAG,UAAU,EACzDgX,EAAIhX,CAAI,EAAI,KAAK,MAAM,iBAAiBA,CAAI,EAAE,IAE9CgX,EAAIhX,CAAI,EAAIU,EAAE,gBAAgBV,CAAI,EAG1C,OAAO4F,EAAK,EAAIoR,EAAMA,EAAImP,EAAM,CAAC,CAAC,CACtC,CACA,GAAI,KAAK,OAASjmB,GAAS,MAAQQ,EAAE,GAAGV,EAAM,OAAO,EAAG,CAEpD,IADAgX,EAAM,CAAC,EACFtR,EAAI,EAAGE,EAAK5F,EAAK,OAAQ0F,EAAIE,EAAIF,IAClCsR,EAAIhX,EAAK0F,CAAC,CAAC,EAAI,KAAK,KAAK1F,EAAK0F,CAAC,CAAC,EAEpC,OAAOsR,CACX,CACA,IAAIlM,EACA5K,GAAS,OACT4K,EAAS,CAAC,EACVA,EAAO9K,CAAI,EAAIE,GAEnBA,GAAS,MAAQQ,EAAE,GAAGV,EAAM,QAAQ,IAAM8K,EAAS9K,GACnD,QAASK,KAAOyK,EACZnK,GAAI,gBAAkBN,EAAM,IAAM,KAAK,GAAI,KAAMyK,EAAOzK,CAAG,CAAC,EAEhE,GAAIyK,EAAQ,CACR,IAAKzK,KAAO,KAAK,MAAM,iBAAkB,GAAI,KAAK,MAAM,iBAAiBkB,CAAG,EAAElB,CAAG,GAAKyK,EAAOvJ,CAAG,EAAElB,CAAG,GAAKK,EAAE,GAAG,KAAK,MAAM,iBAAiBL,CAAG,EAAG,UAAU,EAAG,CAC1J,IAAI0U,EAAM,KAAK,MAAM,iBAAiB1U,CAAG,EAAE,MAAM,KAAM,CAAC,EAAE,OAAOyK,EAAOzK,CAAG,CAAC,CAAC,EAC7E,KAAK,MAAMA,CAAG,EAAIyK,EAAOzK,CAAG,EAC5B,QAAS+lB,MAAUrR,EAASA,EAAIxT,CAAG,EAAE6kB,EAAM,IACvCtb,EAAOsb,EAAM,EAAIrR,EAAIqR,EAAM,EAEnC,CAEItb,EAAO,MAAQ,KAAK,MAAQ,SAC5B,KAAK,SAAS,OAASA,EAAO,MAElCyZ,GAAiB,KAAMzZ,CAAM,CAEjC,CACA,OAAO,IACX,EACAgO,GAAQ,QAAU,UAAY,CAC1B,OAAC,KAAK,SAAW,KAAK,KAAK,WAAW,YAAY,KAAK,IAAI,EAC3D,KAAK,OAAS,KAAK,MAAM,KAAO,MAAQpY,EAAE,SAAS,KAAM,KAAK,KAAK,EAC5D,IACX,EACAoY,GAAQ,OAAS,UAAY,CACzB,OAAI,KAAK,QACE,MAEP,KAAK,KAAK,WAAW,YAAc,KAAK,OACxC,KAAK,KAAK,WAAW,aAAa,KAAK,KAAM,KAAK,KAAK,WAAW,UAAU,EAC5EpY,EAAE,QAAQ,KAAM,KAAK,KAAK,GAEvB,KACX,EACAoY,GAAQ,YAAc,SAAUd,EAAS,CACrC,OAAI,KAAK,QACE,MAEPA,EAAQ,aAAetX,EAAE,GAAG,cAC5BsX,EAAUA,EAAQA,EAAQ,OAAS,CAAC,GAEpCA,EAAQ,KAAK,YACbA,EAAQ,KAAK,WAAW,aAAa,KAAK,KAAMA,EAAQ,KAAK,WAAW,EAExEA,EAAQ,KAAK,WAAW,YAAY,KAAK,IAAI,EAEjDtX,EAAE,aAAa,KAAMsX,EAAS,KAAK,KAAK,EACjC,KACX,EACAc,GAAQ,aAAe,SAAUd,EAAS,CACtC,OAAI,KAAK,QACE,MAEPA,EAAQ,aAAetX,EAAE,GAAG,cAC5BsX,EAAUA,EAAQ,CAAC,GAEvBA,EAAQ,KAAK,WAAW,aAAa,KAAK,KAAMA,EAAQ,IAAI,EAC5DtX,EAAE,cAAc,KAAMsX,EAAS,KAAK,KAAK,EAClC,KACX,EACAc,GAAQ,KAAO,SAAUmI,EAAM,CAC3B,IAAI,EAAI,KAAK,KAAK,aACd/f,EAAI,EAAE,OACV,OAAAA,EAAIA,EAAE,QAAQimB,EAAY7E,CAAC,EACvB,CAACrB,GAAS,GACV,KAAK,MAAM,KAAOA,EAClB,EAAE,OAAS/f,EAAIa,GAAI6a,GAAK,sBAAwB,CAACqE,GAAQ,KAAO,IAChE,EAAE,OAASvgB,EAAE,OAAO,oBAAqB2C,EAAM,CAAC4d,GAAQ,GAAG,CAAC,IAE5D,EAAE,OAAS/f,EACX,EAAE,OAAS,EACX,OAAO,KAAK,MAAM,MAEf,IACX,EAEAR,EAAE,QAAQ,KAAO,SAAU8J,EAAY4e,EAAK,CACxC,IAAI/jB,EAAKqjB,GAAW,OAAO,EAC3BrjB,EAAG,MAAM,QAAU+hB,GACnB/hB,EAAG,UAAYgiB,EAAOtlB,GAAIslB,EAC1BhiB,EAAG,YAAc+jB,EAAI,YACrB,IAAI7e,EAAI,IAAIsb,GAAQxgB,EAAI+jB,CAAG,EACvBlM,EAAO,CAAC,KAAM,OAAQ,OAAQ,MAAM,EACxC1S,IAAe0S,EAAK,KAAO1S,GAC3BD,EAAE,KAAO,OACTA,EAAE,KAAO,CAAC,EACVA,EAAE,KAAO+X,EACTiC,GAAiBha,EAAG2S,CAAI,EACxBkM,EAAI,QAAUA,EAAI,OAAO,YAAY/jB,CAAE,EACvC,IAAImkB,EAAOd,GAAW,MAAM,EAC5B,OAAAc,EAAK,GAAK,GACVnkB,EAAG,YAAYmkB,CAAI,EACnBjf,EAAE,KAAOif,EACTjf,EAAE,UAAU+X,CAAC,EACN/X,CACX,EACA7J,EAAE,QAAQ,KAAO,SAAU0oB,EAAKzkB,EAAGE,EAAGC,EAAGC,EAAGC,EAAG,CAC3C,IAAIQ,EAAO9E,EAAE,UAAUiE,EAAGE,EAAGC,EAAGC,EAAGC,CAAC,EAChCqB,EAAM+iB,EAAI,KAAK5jB,CAAI,EACnBlB,EAAI+B,EAAI,MACZ,OAAAA,EAAI,EAAI/B,EAAE,EAAIK,EACd0B,EAAI,EAAI/B,EAAE,EAAIO,EACdwB,EAAI,EAAI/B,EAAE,MAAQQ,EAClBuB,EAAI,EAAI/B,EAAE,OAASS,EACnBT,EAAE,EAAIU,EACNV,EAAE,KAAOkB,EACTa,EAAI,KAAO,OACJA,CACX,EACA3F,EAAE,QAAQ,QAAU,SAAU0oB,EAAKzkB,EAAGE,EAAGK,EAAIC,EAAI,CAC7C,IAAIkB,EAAM+iB,EAAI,KAAK,EACf9kB,EAAI+B,EAAI,MACZ,OAAAA,EAAI,EAAI1B,EAAIO,EACZmB,EAAI,EAAIxB,EAAIM,EACZkB,EAAI,EAAInB,EAAK,EACbmB,EAAI,EAAIlB,EAAK,EACbkB,EAAI,KAAO,UACXke,GAAiBle,EAAK,CAClB,GAAI1B,EACJ,GAAIE,EACJ,GAAIK,EACJ,GAAIC,CACR,CAAC,EACMkB,CACX,EACA3F,EAAE,QAAQ,OAAS,SAAU0oB,EAAKzkB,EAAGE,EAAGG,EAAG,CACvC,IAAIqB,EAAM+iB,EAAI,KAAK,EACf9kB,EAAI+B,EAAI,MACZ,OAAAA,EAAI,EAAI1B,EAAIK,EACZqB,EAAI,EAAIxB,EAAIG,EACZqB,EAAI,EAAIA,EAAI,EAAIrB,EAAI,EACpBqB,EAAI,KAAO,SACXke,GAAiBle,EAAK,CAClB,GAAI1B,EACJ,GAAIE,EACJ,EAAGG,CACP,CAAC,EACMqB,CACX,EACA3F,EAAE,QAAQ,MAAQ,SAAU0oB,EAAK3f,EAAK9E,EAAGE,EAAGC,EAAGC,EAAG,CAC9C,IAAIS,EAAO9E,EAAE,UAAUiE,EAAGE,EAAGC,EAAGC,CAAC,EAC7BsB,EAAM+iB,EAAI,KAAK5jB,CAAI,EAAE,KAAK,CAAC,OAAQ,MAAM,CAAC,EAC1ClB,EAAI+B,EAAI,MACRoS,EAAOpS,EAAI,KACX8hB,EAAO1P,EAAK,qBAAqB5V,EAAU,EAAE,CAAC,EAClD,OAAAyB,EAAE,IAAMmF,EACRpD,EAAI,EAAI/B,EAAE,EAAIK,EACd0B,EAAI,EAAI/B,EAAE,EAAIO,EACdwB,EAAI,EAAI/B,EAAE,MAAQQ,EAClBuB,EAAI,EAAI/B,EAAE,OAASS,EACnBT,EAAE,KAAOkB,EACTa,EAAI,KAAO,QACX8hB,EAAK,YAAc1P,GAAQA,EAAK,YAAY0P,CAAI,EAChDA,EAAK,OAAS,GACdA,EAAK,IAAM1e,EACX0e,EAAK,KAAO,OACZ9hB,EAAI,EAAE,QAAU,CAAC1B,EAAGE,CAAC,EACrBwB,EAAI,EAAE,SAAW,CAACvB,EAAGC,CAAC,EACtB0T,EAAK,YAAY0P,CAAI,EACrBN,EAAUxhB,EAAK,EAAG,EAAG,EAAG,EAAG,CAAC,EACrBA,CACX,EACA3F,EAAE,QAAQ,KAAO,SAAU0oB,EAAKzkB,EAAGE,EAAG8U,EAAM,CACxC,IAAItU,EAAKqjB,GAAW,OAAO,EACvBljB,EAAOkjB,GAAW,MAAM,EACxBziB,EAAIyiB,GAAW,UAAU,EAC7B/jB,EAAIA,GAAK,EACTE,EAAIA,GAAK,EACT8U,EAAOA,GAAQ,GACfnU,EAAK,EAAI9E,EAAE,OAAO,mBAAoB2C,EAAMsB,EAAI0iB,CAAI,EAAGhkB,EAAMwB,EAAIwiB,CAAI,EAAGhkB,EAAMsB,EAAI0iB,CAAI,EAAI,CAAC,EAC3F7hB,EAAK,WAAa,GAClBS,EAAE,OAASjE,EAAI2X,CAAI,EACnB1T,EAAE,GAAK,GACPZ,EAAG,MAAM,QAAU+hB,GACnB/hB,EAAG,UAAYgiB,EAAOtlB,GAAIslB,EAC1BhiB,EAAG,YAAc,MACjB,IAAIkF,EAAI,IAAIsb,GAAQxgB,EAAI+jB,CAAG,EACvBlM,EAAO,CACH,KAAM,OACN,OAAQ,OACR,KAAMxc,EAAE,gBAAgB,KACxB,KAAMiZ,CACV,EACJpP,EAAE,MAAQlF,EACVkF,EAAE,KAAO/E,EACT+E,EAAE,SAAWtE,EACbsE,EAAE,KAAO,OACTA,EAAE,MAAM,KAAOvI,EAAI2X,CAAI,EACvBpP,EAAE,MAAM,EAAI5F,EACZ4F,EAAE,MAAM,EAAI1F,EACZ0F,EAAE,MAAM,EAAI,EACZA,EAAE,MAAM,EAAI,EACZga,GAAiBha,EAAG2S,CAAI,EACxB7X,EAAG,YAAYY,CAAC,EAChBZ,EAAG,YAAYG,CAAI,EACnB4jB,EAAI,OAAO,YAAY/jB,CAAE,EACzB,IAAImkB,EAAOd,GAAW,MAAM,EAC5B,OAAAc,EAAK,GAAK,GACVnkB,EAAG,YAAYmkB,CAAI,EACnBjf,EAAE,KAAOif,EACTjf,EAAE,UAAU+X,CAAC,EACN/X,CACX,EACA7J,EAAE,QAAQ,QAAU,SAAUsQ,EAAOC,EAAQ,CACzC,IAAI2Y,EAAK,KAAK,OAAO,MACrB,YAAK,MAAQ5Y,EACb,KAAK,OAASC,EACdD,GAAS,CAACA,IAAUA,GAAS,MAC7BC,GAAU,CAACA,IAAWA,GAAU,MAChC2Y,EAAG,MAAQ5Y,EACX4Y,EAAG,OAAS3Y,EACZ2Y,EAAG,KAAO,UAAY5Y,EAAQ,IAAMC,EAAS,MACzC,KAAK,UACLvQ,EAAE,QAAQ,WAAW,MAAM,KAAM,KAAK,QAAQ,EAE3C,IACX,EACAA,EAAE,QAAQ,WAAa,SAAUiE,EAAGE,EAAGC,EAAGC,EAAGgV,EAAK,CAC9CrZ,EAAE,IAAI,qBAAsB,KAAM,KAAK,SAAU,CAACiE,EAAGE,EAAGC,EAAGC,EAAGgV,CAAG,CAAC,EAClE,IAAI+M,EAAY,KAAK,QAAQ,EACzB9V,EAAQ8V,EAAU,MAClB7V,EAAS6V,EAAU,OACnBne,EAAGkhB,EACP,OAAI9P,IACApR,EAAIsI,EAASlM,EACb8kB,EAAI7Y,EAAQlM,EACRA,EAAI6D,EAAIqI,IACRrM,IAAMqM,EAAQlM,EAAI6D,GAAK,EAAIA,GAE3B5D,EAAI8kB,EAAI5Y,IACRpM,IAAMoM,EAASlM,EAAI8kB,GAAK,EAAIA,IAGpC,KAAK,SAAW,CAACllB,EAAGE,EAAGC,EAAGC,EAAG,CAAC,CAACgV,CAAG,EAClC,KAAK,cAAgB,CACjB,GAAI,CAACpV,EACL,GAAI,CAACE,EACL,MAAOiiB,CACX,EACA,KAAK,QAAQ,SAAUzhB,EAAI,CACvBA,EAAG,UAAU,KAAK,CACtB,CAAC,EACM,IACX,EACA,IAAIqjB,GACJhoB,EAAE,QAAQ,QAAU,SAAUopB,EAAK,CAC3B,IAAI5P,EAAM4P,EAAI,SACV5P,EAAI,YAAY,OAAS,GACzBA,EAAI,iBAAiB,EAAE,QAAQ,QAAS,4BAA4B,EAIpEA,EAAI,YAAY,CAAC,EAAE,QAAQ,QAAS,4BAA4B,EAEpE,GAAI,CACA,CAACA,EAAI,WAAW,MAAQA,EAAI,WAAW,IAAI,OAAQ,+BAA+B,EAClFwO,GAAa,SAAUqB,EAAS,CAC5B,OAAO7P,EAAI,cAAc,SAAW6P,EAAU,gBAAgB,CAClE,CACJ,MAAY,CACRrB,GAAa,SAAUqB,EAAS,CAC5B,OAAO7P,EAAI,cAAc,IAAM6P,EAAU,sDAAsD,CACnG,CACJ,CACJ,EACJrpB,EAAE,QAAQ,QAAQA,EAAE,GAAG,GAAG,EAC1BA,EAAE,QAAQ,OAAS,UAAY,CAC3B,IAAIgmB,EAAMhmB,EAAE,cAAc,MAAM,EAAG,SAAS,EACxCoW,EAAY4P,EAAI,UAChBzV,EAASyV,EAAI,OACbre,EACA2I,EAAQ0V,EAAI,MACZ/hB,EAAI+hB,EAAI,EACR7hB,EAAI6hB,EAAI,EACZ,GAAI,CAAC5P,EACD,MAAM,IAAI,MAAM,0BAA0B,EAE9C,IAAIzQ,EAAM,IAAI3F,EAAE,OACZ0G,EAAIf,EAAI,OAAS3F,EAAE,GAAG,IAAI,cAAc,KAAK,EAC7CkpB,EAAKxiB,EAAE,MACX,OAAAzC,EAAIA,GAAK,EACTE,EAAIA,GAAK,EACTmM,EAAQA,GAAS,IACjBC,EAASA,GAAU,IACnB5K,EAAI,MAAQ2K,EACZ3K,EAAI,OAAS4K,EACbD,GAAS,CAACA,IAAUA,GAAS,MAC7BC,GAAU,CAACA,IAAWA,GAAU,MAChC5K,EAAI,UAAYghB,EAAO,IAAMtlB,GAAIslB,EAAO,IACxChhB,EAAI,YAAc,MAClBA,EAAI,KAAO3F,EAAE,GAAG,IAAI,cAAc,MAAM,EACxC2F,EAAI,KAAK,MAAM,QAAU,+EACzBe,EAAE,YAAYf,EAAI,IAAI,EACtBujB,EAAG,QAAUlpB,EAAE,OAAO,kHAAmHsQ,EAAOC,CAAM,EAClJ6F,GAAa,GACbpW,EAAE,GAAG,IAAI,KAAK,YAAY0G,CAAC,EAC3BwiB,EAAG,KAAOjlB,EAAI,KACdilB,EAAG,IAAM/kB,EAAI,KACb+kB,EAAG,SAAW,YAEV9S,EAAU,WACVA,EAAU,aAAa1P,EAAG0P,EAAU,UAAU,EAE9CA,EAAU,YAAY1P,CAAC,EAG/Bf,EAAI,UAAY,UAAY,CAAC,EACtBA,CACX,EACA3F,EAAE,UAAU,MAAQ,UAAY,CAC5BA,EAAE,IAAI,gBAAiB,IAAI,EAC3B,KAAK,OAAO,UAAY4hB,EACxB,KAAK,KAAO5hB,EAAE,GAAG,IAAI,cAAc,MAAM,EACzC,KAAK,KAAK,MAAM,QAAU,8FAC1B,KAAK,OAAO,YAAY,KAAK,IAAI,EACjC,KAAK,OAAS,KAAK,IAAM,IAC7B,EACAA,EAAE,UAAU,OAAS,UAAY,CAC7BA,EAAE,IAAI,iBAAkB,IAAI,EAC5B,KAAK,OAAO,WAAW,YAAY,KAAK,MAAM,EAC9C,QAASgF,KAAK,KACV,KAAKA,CAAC,EAAI,OAAO,KAAKA,CAAC,GAAK,WAAahF,EAAE,gBAAgBgF,CAAC,EAAI,KAEpE,MAAO,EACX,EAEA,IAAI+Z,EAAW/e,EAAE,GACjB,QAASgf,KAAU5G,GAAaA,GAAQvX,CAAG,EAAEme,CAAM,GAAK,CAACD,EAASle,CAAG,EAAEme,CAAM,IACzED,EAASC,CAAM,EAAK,SAAUlP,EAAY,CACtC,OAAO,UAAY,CACf,IAAInH,EAAM,UACV,OAAO,KAAK,QAAQ,SAAUhE,EAAI,CAC9BA,EAAGmL,CAAU,EAAE,MAAMnL,EAAIgE,CAAG,CAChC,CAAC,CACL,CACJ,EAAGqW,CAAM,GAEjB,EAAG,MAAMlgB,GAASgB,CAA4B,EAC1CC,IAAkC,SAAchB,GAAO,QAAUgB,EAG/D,EAEA,oCAKC,SAAShB,GAAQD,GAASM,EAAqB,CAEtD,IAAIU,EAA8BC,GAmBjC,SAAUupB,EAAM,CACb,IAAIC,EAAU,QACV1oB,EAAM,iBACNJ,EAAY,SACZ+oB,GAAgB,UAChBC,EAAW,IACX1lB,GAAM,UAAY,CAAC,EACnB2lB,GAAU,SAAU9lB,EAAGC,EAAG,CACtB,OAAOD,EAAIC,CACf,EACA8lB,EACAC,GACApoB,GAAS,CAAC,EAAG,CAAC,CAAC,EACfqoB,GAAe,UAAY,CACvB,QAAS7kB,EAAI,EAAGE,EAAK,KAAK,OAAQF,EAAIE,EAAIF,IACtC,GAAI,OAAO,KAAKA,CAAC,EAAK,IAClB,OAAO,KAAKA,CAAC,CAGzB,EACA8kB,GAAc,UAAY,CAEtB,QADI9kB,EAAI,KAAK,OACN,EAAEA,GACL,GAAI,OAAO,KAAKA,CAAC,EAAK,IAClB,OAAO,KAAKA,CAAC,CAGzB,EACA+kB,GAAS,OAAO,UAAU,SAC1BzoB,EAAM,OACN0oB,GAAU,MAAM,SAAW,SAAUC,EAAI,CACrC,OAAOA,aAAc,OAASF,GAAO,KAAKE,CAAE,GAAK,gBACrD,EAeIhqB,EAAM,SAAUX,EAAMkJ,EAAO,CAC7B,IAAI+E,GAAI/L,GACJ0oB,EAAUN,GACVrpB,GAAO,MAAM,UAAU,MAAM,KAAK,UAAW,CAAC,EAC9C4pB,GAAYlqB,EAAI,UAAUX,CAAI,EAC9B,EAAI,EACJkB,EAAI,GACJwH,EACAoiB,EAAU,CAAC,EACXC,GAAQ,CAAC,EACT/T,GAAM,CAAC,EACPgU,GAAKX,EACLY,GAAS,CAAC,EACdjU,GAAI,aAAeuT,GACnBvT,GAAI,YAAcwT,GAClBH,EAAgBrqB,EAChBsqB,GAAO,EACP,QAAS5kB,GAAI,EAAGE,EAAKilB,GAAU,OAAQnlB,GAAIE,EAAIF,KAAS,WAAYmlB,GAAUnlB,EAAC,IAC3EolB,EAAQ,KAAKD,GAAUnlB,EAAC,EAAE,MAAM,EAC5BmlB,GAAUnlB,EAAC,EAAE,OAAS,IACtBqlB,GAAMF,GAAUnlB,EAAC,EAAE,MAAM,EAAImlB,GAAUnlB,EAAC,IAIhD,IADAolB,EAAQ,KAAKV,EAAO,EACbU,EAAQ,CAAC,EAAI,GAGhB,GAFApiB,EAAIqiB,GAAMD,EAAQ,GAAG,CAAC,EACtB9T,GAAI,KAAKtO,EAAE,MAAMQ,EAAOjI,EAAI,CAAC,EACzBqpB,GACA,OAAAA,GAAOM,EACA5T,GAGf,IAAKtR,GAAI,EAAGA,GAAIE,EAAIF,KAEhB,GADAgD,EAAImiB,GAAUnlB,EAAC,EACX,WAAYgD,EACZ,GAAIA,EAAE,QAAUoiB,EAAQ,CAAC,EAAG,CAExB,GADA9T,GAAI,KAAKtO,EAAE,MAAMQ,EAAOjI,EAAI,CAAC,EACzBqpB,GACA,MAEJ,EAII,IAHA,IACA5hB,EAAIqiB,GAAMD,EAAQ,CAAC,CAAC,EACpBpiB,GAAKsO,GAAI,KAAKtO,EAAE,MAAMQ,EAAOjI,EAAI,CAAC,EAC9BqpB,GACA,YAEC5hB,EACb,MACIqiB,GAAMriB,EAAE,MAAM,EAAIA,UAGtBsO,GAAI,KAAKtO,EAAE,MAAMQ,EAAOjI,EAAI,CAAC,EACzBqpB,GACA,MAIZ,OAAAA,GAAOM,EACPP,EAAgBW,GACThU,EACX,EAEArW,EAAI,QAAUuB,GAalBvB,EAAI,UAAY,SAAUX,EAAM,CAC5B,IAAImmB,EAAQuE,GAAQ1qB,CAAI,EAAIA,EAAOA,EAAK,MAAMmB,CAAS,EACnD8M,GAAI/L,GACJ+G,EACAuW,GACAlP,GACA5K,EACAE,EACAD,EACAE,EACAqlB,GACAC,GAAK,CAACld,EAAC,EACP+I,GAAM,CAAC,EACX,IAAKtR,EAAI,EAAGE,EAAKugB,EAAM,OAAQzgB,EAAIE,EAAIF,IAAK,CAExC,IADAwlB,GAAM,CAAC,EACFvlB,EAAI,EAAGE,EAAKslB,GAAG,OAAQxlB,EAAIE,EAAIF,IAIhC,IAHAsI,GAAIkd,GAAGxlB,CAAC,EAAE,EACV6Z,GAAQ,CAACvR,GAAEkY,EAAMzgB,CAAC,CAAC,EAAGuI,GAAEkc,CAAQ,CAAC,EACjC7Z,GAAI,EACGA,MACHrH,EAAOuW,GAAMlP,EAAC,EACVrH,IACAiiB,GAAI,KAAKjiB,CAAI,EACb+N,GAAMA,GAAI,OAAO/N,EAAK,GAAK,CAAC,CAAC,GAIzCkiB,GAAKD,EACT,CACA,OAAOlU,EACX,EAWArW,EAAI,UAAY,SAAUyqB,EAAK,CACvBA,GACAA,EAAMppB,EAAIopB,CAAG,EAAE,QAAQ,oBAAqB,IAAI,EAChDA,EAAM,IAAMA,EAAM,IAClBjqB,EAAY,IAAI,OAAOiqB,CAAG,GAE1BjqB,EAAY,QAEpB,EA0BAR,EAAI,GAAK,SAAUX,EAAMkB,EAAG,CACxB,GAAI,OAAOA,GAAK,WACZ,OAAO,UAAY,CAAC,EAGxB,QADIilB,GAAQuE,GAAQ1qB,CAAI,EAAK0qB,GAAQ1qB,EAAK,CAAC,CAAC,EAAIA,EAAO,CAACA,CAAI,EAAKgC,EAAIhC,CAAI,EAAE,MAAMkqB,EAAa,EACrFxkB,EAAI,EAAGE,GAAKugB,GAAM,OAAQzgB,EAAIE,GAAIF,KACtC,SAAU1F,GAAM,CAIb,QAHImmB,EAAQuE,GAAQ1qB,EAAI,EAAIA,GAAOgC,EAAIhC,EAAI,EAAE,MAAMmB,CAAS,EACxD8M,EAAI/L,GACJmpB,EACK3lB,EAAI,EAAGE,GAAKugB,EAAM,OAAQzgB,EAAIE,GAAIF,IACvCuI,EAAIA,EAAE,EACNA,EAAIA,EAAE,eAAekY,EAAMzgB,CAAC,CAAC,GAAKuI,EAAEkY,EAAMzgB,CAAC,CAAC,IAAMuI,EAAEkY,EAAMzgB,CAAC,CAAC,EAAI,CAAC,EAAG,CAAC,CAAC,GAG1E,IADAuI,EAAE,EAAIA,EAAE,GAAK,CAAC,EACTvI,EAAI,EAAGE,GAAKqI,EAAE,EAAE,OAAQvI,EAAIE,GAAIF,IAAK,GAAIuI,EAAE,EAAEvI,CAAC,GAAKxE,EAAG,CACvDmqB,EAAQ,GACR,KACJ,CACA,CAACA,GAASpd,EAAE,EAAE,KAAK/M,CAAC,CACxB,GAAEilB,GAAMzgB,CAAC,CAAC,EAEd,OAAO,SAAU4lB,GAAQ,CACjB,CAACA,IAAU,CAACA,KACZpqB,EAAE,OAAS,CAACoqB,GAEpB,CACJ,EAiBA3qB,EAAI,EAAI,SAAU4qB,EAAO,CACrB,IAAI3X,EAAQ,CAAC,EAAE,MAAM,KAAK,UAAW,CAAC,EACtC,OAAO,UAAY,CACfjT,EAAI,MAAM,KAAM,CAAC4qB,EAAO,IAAI,EAAE,OAAO3X,CAAK,EAAE,OAAO,CAAC,EAAE,MAAM,KAAK,UAAW,CAAC,CAAC,CAAC,CACnF,CACJ,EAOAjT,EAAI,KAAO,UAAY,CACnB2pB,GAAO,CACX,EAeA3pB,EAAI,GAAK,SAAU6qB,EAAS,CACxB,IAAIC,EAAMf,GAAQL,CAAa,EAAIA,EAAc,KAAK,GAAG,EAAIA,EAC7D,OAAImB,EACO,IAAI,OAAO,gBAAkBA,EAAU,eAAe,EAAE,KAAKC,CAAG,EAEpEA,CACX,EAUA9qB,EAAI,IAAM,UAAY,CAClB,OAAO+pB,GAAQL,CAAa,EAAIA,EAAgBA,EAAc,MAAMlpB,CAAS,CACjF,EAmBAR,EAAI,IAAMA,EAAI,OAAS,SAAUX,EAAMkB,EAAG,CACtC,GAAI,CAAClB,EAAM,CACPW,EAAI,QAAUuB,GAAS,CAAC,EAAG,CAAC,CAAC,EAC7B,MACJ,CACA,IAAIikB,GAAQuE,GAAQ1qB,CAAI,EAAK0qB,GAAQ1qB,EAAK,CAAC,CAAC,EAAIA,EAAO,CAACA,CAAI,EAAKgC,EAAIhC,CAAI,EAAE,MAAMkqB,EAAa,EAC9F,GAAI/D,GAAM,OAAS,EAAG,CAClB,QAASzgB,EAAI,EAAGE,EAAKugB,GAAM,OAAQzgB,EAAIE,EAAIF,IACvC/E,EAAI,IAAIwlB,GAAMzgB,CAAC,EAAGxE,CAAC,EAEvB,MACJ,CACAilB,GAAQuE,GAAQ1qB,CAAI,EAAIA,EAAOgC,EAAIhC,CAAI,EAAE,MAAMmB,CAAS,EACxD,IAAI8M,EACA5N,GACAqrB,GACAhmB,EAAGE,EAAID,EAAGE,EACV4lB,GAAM,CAACvpB,EAAM,EACjB,IAAKwD,EAAI,EAAGE,EAAKugB,GAAM,OAAQzgB,EAAIE,EAAIF,IACnC,IAAKC,EAAI,EAAGA,EAAI8lB,GAAI,OAAQ9lB,GAAK+lB,GAAO,OAAS,EAAG,CAGhD,GAFAA,GAAS,CAAC/lB,EAAG,CAAC,EACdsI,EAAIwd,GAAI9lB,CAAC,EAAE,EACPwgB,GAAMzgB,CAAC,GAAKykB,EACRlc,EAAEkY,GAAMzgB,CAAC,CAAC,GACVgmB,GAAO,KAAKzd,EAAEkY,GAAMzgB,CAAC,CAAC,CAAC,MAG3B,KAAKrF,MAAO4N,EAAOA,EAAE1M,CAAG,EAAElB,EAAG,GACzBqrB,GAAO,KAAKzd,EAAE5N,EAAG,CAAC,EAG1BorB,GAAI,OAAO,MAAMA,GAAKC,EAAM,CAChC,CAEJ,IAAKhmB,EAAI,EAAGE,EAAK6lB,GAAI,OAAQ/lB,EAAIE,EAAIF,IAEjC,IADAuI,EAAIwd,GAAI/lB,CAAC,EACFuI,EAAE,GAAG,CACR,GAAI/M,EAAG,CACH,GAAI+M,EAAE,EAAG,CACL,IAAKtI,EAAI,EAAGE,EAAKoI,EAAE,EAAE,OAAQtI,EAAIE,EAAIF,IAAK,GAAIsI,EAAE,EAAEtI,CAAC,GAAKzE,EAAG,CACvD+M,EAAE,EAAE,OAAOtI,EAAG,CAAC,EACf,KACJ,CACA,CAACsI,EAAE,EAAE,QAAU,OAAOA,EAAE,CAC5B,CACA,IAAK5N,MAAO4N,EAAE,EAAG,GAAIA,EAAE,EAAE1M,CAAG,EAAElB,EAAG,GAAK4N,EAAE,EAAE5N,EAAG,EAAE,EAAG,CAC9C,IAAIsrB,GAAQ1d,EAAE,EAAE5N,EAAG,EAAE,EACrB,IAAKsF,EAAI,EAAGE,EAAK8lB,GAAM,OAAQhmB,EAAIE,EAAIF,IAAK,GAAIgmB,GAAMhmB,CAAC,GAAKzE,EAAG,CAC3DyqB,GAAM,OAAOhmB,EAAG,CAAC,EACjB,KACJ,CACA,CAACgmB,GAAM,QAAU,OAAO1d,EAAE,EAAE5N,EAAG,EAAE,CACrC,CACJ,KAAO,CACH,OAAO4N,EAAE,EACT,IAAK5N,MAAO4N,EAAE,EAAOA,EAAE,EAAE1M,CAAG,EAAElB,EAAG,GAAK4N,EAAE,EAAE5N,EAAG,EAAE,GAC3C,OAAO4N,EAAE,EAAE5N,EAAG,EAAE,CAExB,CACA4N,EAAIA,EAAE,CACV,CAER,EAkBAtN,EAAI,KAAO,SAAUX,EAAMkB,EAAG,CAC1B,IAAIoR,GAAK,UAAY,CACjB,OAAA3R,EAAI,IAAIX,EAAMsS,EAAE,EACTpR,EAAE,MAAM,KAAM,SAAS,CAClC,EACA,OAAOP,EAAI,GAAGX,EAAMsS,EAAE,CAC1B,EAOA3R,EAAI,QAAUspB,EACdtpB,EAAI,SAAW,UAAY,CACvB,MAAO,uBAAyBspB,CACpC,EACUxqB,GAAO,QAAYA,GAAO,QAAUkB,GAAmBH,EAA+B,CAAC,EAAGC,EAAiC,UAAW,CAAE,OAAOE,CAAK,EAAG,MAAMnB,GAASgB,CAA4B,EAC5MC,IAAkC,SAAchB,GAAO,QAAUgB,GACrE,GAAG,IAAI,CAGD,CAEG,CAAC,CACV,CAAC,ICnvQD,IAAAmrB,GAAoB,SAEpB,GAAAC,QAAQ,GAAG,MAAQ,SAAUC,GAAQC,GAAQC,EAAMC,EAAMC,EAASC,EAASC,EAASC,EAASC,EAAOC,GAAOC,EAAU,CACnH,IAAMC,GAAa,IAAIX,EAAM,IAAIC,EAAM,IAAIK,CAAO,IAC5CM,GAAW,CAACR,EAASC,EAAS,EAAGK,EAAW,EAAI,EAAG,EAAGR,EAAMC,CAAI,EAAE,KAAK,GAAG,EAC1EU,EAAa,IAAIL,CAAK,IAAIC,EAAK,IAAIH,CAAO,IAAIC,CAAO,GAC3D,OAAO,KAAK,KAAK,GAAGI,EAAU,GAAGJ,CAAO,IAAIP,EAAM,IAAIC,EAAM,MAAMW,EAAQ,GAAGC,CAAU,EAAE,CAC3F,EAEA,GAAAd,QAAQ,GAAG,YAAc,SAAUO,GAASC,GAASO,EAAQC,EAAYC,EAAU,CACjF,IAAMhB,EAASM,GAAUQ,EAAS,KAAK,IAAIC,EAAa,KAAK,GAAK,GAAG,EAC/Dd,EAASM,GAAUO,EAAS,KAAK,IAAIC,EAAa,KAAK,GAAK,GAAG,EAC/Db,EAAOI,GAAUQ,EAAS,KAAK,IAAIE,EAAW,KAAK,GAAK,GAAG,EAC3Db,EAAOI,GAAUO,EAAS,KAAK,IAAIE,EAAW,KAAK,GAAK,GAAG,EACjE,OAAO,KAAK,MAAMhB,EAAQC,EAAQC,EAAOF,EAAQG,EAAOF,EAAQa,EAAQA,EAAQR,GAASC,GAASL,EAAMC,EAAOa,EAAWD,EAAc,GAAG,CAC7I,EAEA,OAAO,WAAc,UAAY,CAI/B,IAAME,EAAS,CAAC,EAEhB,OAAAA,EAAO,oBAAsB,SAAUC,EAAOC,EAAUC,EAAYC,EAAW,CAE7E,GAAI,EAAE,IAAIH,CAAK,EAAE,EAAE,SAAW,EAAG,OAEjC,EAAE,IAAIA,CAAK,EAAE,EAAE,MAAM,EAErB,IAAMI,KAAQ,GAAAvB,SAAQmB,EAAO,IAAQ,GAAM,EACrCK,GAAY,IAElB,SAASC,EAAqBC,GAAY,CACxC,OAAO,KAAK,IAAIA,GAAY,CAAC,EAAIF,GAAY,GAC/C,CAEcD,EAAM,YAAa,IAAS,EAAI,IAAoBC,GAAW,IAAK,CAAC,EAC7E,KAAK,CACT,OAAQ,UACR,eAAgB,GAClB,CAAC,EAEcD,EAAM,YAAa,IAAS,EAAI,IAAoBE,EAAqBJ,CAAU,EAAG,IAAK,GAAG,EACtG,KAAK,CACV,KAAM,UACN,eAAgB,GAClB,CAAC,EAEaE,EAAM,YAAa,IAAS,EAAI,IAAoBE,EAAqBL,CAAQ,EAAG,IAAK,GAAG,EACpG,KAAK,CACT,KAAM,UACN,eAAgB,GAClB,CAAC,EAEcG,EAAM,YAAa,IAAS,EAAI,IAAoBE,EAAqBH,CAAS,EAAG,IAAK,CAAC,EACnG,KAAK,CACV,KAAM,UACN,eAAgB,GAClB,CAAC,CACH,EAEAJ,EAAO,sBAAwB,SAAUC,EAAOQ,EAASC,EAAU,CAEjE,GAAI,EAAE,IAAIT,CAAK,EAAE,EAAE,SAAW,EAAG,OAEjC,EAAE,IAAIA,CAAK,EAAE,EAAE,MAAM,EAErB,IAAMI,KAAQ,GAAAvB,SAAQmB,EAAO,IAAQ,GAAM,EACvCU,EAEWN,EAAM,OAAQ,IAAS,EAAI,IAAqB,EAAE,EAC1D,KAAK,CACV,KAAM,UACN,eAAgB,GAClB,CAAC,EACD,IAAMO,EAASH,EAAU,IAAM,GAE3BG,EAAS,IACXD,EAASN,EAAM,OAAQ,IAAS,EAAI,IAAqB,EAAE,EAE3DM,EAASN,EAAM,YAAa,IAAS,EAAI,IAAqB,GAAI,IAAKO,CAAM,EAE/ED,EAAO,KAAK,CACV,KAAM,UACN,eAAgB,GAClB,CAAC,CACH,EAEAX,EAAO,oBAAsB,SAAUC,EAAOY,EAAWC,EAAU,CAEjE,GAAI,EAAE,IAAIb,CAAK,EAAE,EAAE,SAAW,EAAG,OAEjC,EAAE,IAAIA,CAAK,EAAE,EAAE,MAAM,EAErB,IAAMI,KAAQ,GAAAvB,SAAQmB,EAAO,IAAQ,GAAM,EAErCc,EAAWF,EAAY,IAAM,EAC7BG,GAAUF,EAAW,IAAM,EAE3BG,EAAQZ,EAAM,KAAK,iBAAmD,EAAE,KAAK,CACjF,OAAQ,UACR,eAAgB,CAClB,CAAC,EACKa,GAAQb,EAAM,KAAK,MAAO,IAAiB,IAAM,CAAE,SAAgB,IAAiB,IAAM,CAAE,EAAE,EAAE,KAAK,CACzG,OAAQ,UACR,eAAgB,CAClB,CAAC,EACKc,GAAQd,EAAM,KAAK,eAAmE,EAAE,KAAK,CACjG,OAAQ,UACR,eAAgB,CAClB,CAAC,EAEKe,EAAQf,EAAM,KAAK,EAAG,IAAoB,CAAC,EAAE,KAAK,CACtD,KAAM,UACN,YAAa,EACf,CAAC,EAEKgB,GAAQhB,EAAM,KAAK,EAAI,IAAiB,IAAM,EAAK,GAAI,CAAC,EAAE,KAAK,CACnE,KAAM,UACN,YAAa,EACf,CAAC,EACKiB,GAAQjB,EAAM,KAAK,EAAI,GAA4B,CAAC,EAAE,KAAK,CAC/D,KAAM,UACN,YAAa,EACf,CAAC,EAED,EAAE,OAAO,EAAE,KAAK,KAAM,CAAC,EAELA,EAAM,KAAK,GAAI,IAAiBU,EAAU,GAAIA,CAAQ,EAC9D,KAAK,CACb,KAAM,UACN,eAAgB,GAClB,CAAC,EAEgBV,EAAM,KAAK,IAAK,IAAiBW,GAAS,GAAIA,EAAO,EAC7D,KAAK,CACZ,KAAM,UACN,eAAgB,GAClB,CAAC,CACH,EAEAhB,EAAO,gBAAkB,SAAUC,EAAOsB,EAAWC,EAAWC,EAAW,CAEzE,GAAI,EAAE,IAAIxB,CAAK,EAAE,EAAE,SAAW,EAAG,OAEjC,EAAE,IAAIA,CAAK,EAAE,EAAE,MAAM,EAIrB,IAAMyB,GAAa,KAAK,IAAI,KAAK,IAAIH,EAAY,EAAG,GAAG,EAAG,EAAE,EAAI,GAAM,EAAI,IACpEI,IAAa,KAAK,IAAI,KAAK,IAAIH,EAAY,EAAG,GAAG,EAAG,EAAE,EAAI,GAAM,EAAI,IACpEI,GAAa,KAAK,IAAI,KAAK,IAAIH,EAAY,EAAG,GAAG,EAAG,EAAE,EAAI,GAAM,EAAI,IAEpEpB,MAAQ,GAAAvB,SAAQmB,EAAO,IAAQ,GAAM,EAErCgB,GAAQZ,GAAM,KAAK,iBAAmD,EAAE,KAAK,CACjF,OAAQ,UACR,eAAgB,CAClB,CAAC,EACKa,EAAQb,GAAM,KAAK,MAAO,IAAiB,IAAM,CAAE,SAAgB,IAAiB,IAAM,CAAE,EAAE,EAAE,KAAK,CACzG,OAAQ,UACR,eAAgB,CAClB,CAAC,EACKc,GAAQd,GAAM,KAAK,eAAmE,EAAE,KAAK,CACjG,OAAQ,UACR,eAAgB,CAClB,CAAC,EAEKe,GAAQf,GAAM,KAAK,GAAI,IAAoB,IAAI,EAAE,KAAK,CAC1D,KAAM,UACN,YAAa,EACf,CAAC,EAEKgB,GAAQhB,GAAM,KAAK,GAAK,IAAiB,IAAM,EAAK,GAAI,GAAG,EAAE,KAAK,CACtE,KAAM,UACN,YAAa,EACf,CAAC,EACKiB,GAAQjB,GAAM,KAAK,GAAK,GAA4B,IAAI,EAAE,KAAK,CACnE,KAAM,UACN,YAAa,EACf,CAAC,EAED,EAAE,OAAO,EAAE,KAAK,KAAM,CAAC,EAELA,GAAM,KAAK,GAAI,IAAiBqB,EAAU,GAAIA,CAAQ,EAE9D,KAAK,CACb,KAAM,UACN,eAAgB,GAClB,CAAC,EAEiBrB,GAAM,KAAK,IAAc,IAAiBsB,GAAU,GAAIA,EAAQ,EACxE,KAAK,CACb,KAAM,UACN,eAAgB,GAClB,CAAC,EAEiBtB,GAAM,KAAK,IAAe,IAAiBuB,EAAU,GAAIA,CAAQ,EACzE,KAAK,CACb,KAAM,UACN,eAAgB,GAClB,CAAC,CACH,EAEA5B,EAAO,wBAA0B,SAAUC,EAAO4B,EAAgBC,EAAgBC,EAAe,CAM/F,GAAI,EAAE,IAAI9B,CAAK,EAAE,EAAE,SAAW,EAAG,OAEjC,EAAE,IAAIA,CAAK,EAAE,EAAE,MAAM,EAErB,IAAMI,MAAQ,GAAAvB,SAAQmB,EAAO,IAAQ,GAAM,EAErC+B,GAAWH,EAAiB,IAAM,IAClCI,EAAWH,EAAiB,IAAM,IAClCI,GAAWH,EAAgB,IAAM,IAEjCd,GAAQZ,GAAM,KAAK,iBAAmD,EAAE,KAAK,CACjF,OAAQ,UACR,eAAgB,CAClB,CAAC,EACKc,GAAQd,GAAM,KAAK,eAAmE,EAAE,KAAK,CACjG,OAAQ,UACR,eAAgB,CAClB,CAAC,EAEKe,GAAQf,GAAM,KAAK,EAAG,IAAoB,CAAC,EAAE,KAAK,CACtD,KAAM,UACN,YAAa,EACf,CAAC,EACKiB,GAAQjB,GAAM,KAAK,GAAK,GAA4B,GAAG,EAAE,KAAK,CAClE,KAAM,UACN,YAAa,EACf,CAAC,EAED,EAAE,OAAO,EAAE,KAAK,KAAM,CAAC,EAEDA,GAAM,KAAK,GAAQ,IAAiB2B,GAAU,GAAMA,EAAQ,EACpE,KAAK,CACjB,KAAM,UACN,eAAgB,GAClB,CAAC,EAEiB3B,GAAM,KAAK,IAAwB,IAAiB4B,EAAU,GAAMA,CAAQ,EACpF,KAAK,CACb,KAAM,UACN,eAAgB,GAClB,CAAC,EAEiB5B,GAAM,KAAK,GAAS,GAAO,EAAI,GAAS,EAAG,IAAiB6B,GAAU,GAAMA,EAAQ,EAC5F,KAAK,CACb,KAAM,UACN,eAAgB,GAClB,CAAC,CACH,EAEAlC,EAAO,WAAa,SAAUC,EAAOkC,EAAWC,EAAYC,EAASC,EAAWC,GAAY,CAE1F,GAAI,EAAE,IAAItC,CAAK,EAAE,EAAE,SAAW,EAAG,OAEjC,EAAE,IAAIA,CAAK,EAAE,EAAE,MAAM,EAErB,IAAMI,KAAQ,GAAAvB,SAAQmB,EAAO,IAAQ,GAAM,EACrCuC,GAAU,GACVC,GAAU,EACVC,EAAO,GAEPC,GAAYJ,GAAa,IAAM,IAC/BK,GAAWN,EAAY,IAAM,IAC7BO,GAASR,EAAU,IAAM,IACzBS,GAAYV,EAAa,IAAM,IAC/BW,GAAWZ,EAAY,IAAM,IAE7BlB,EAAQZ,EAAM,KAAK,iBAAmD,EAAE,KAAK,CACjF,OAAQ,UACR,eAAgB,CAClB,CAAC,EACKc,GAAQd,EAAM,KAAK,eAAmE,EAAE,KAAK,CACjG,OAAQ,UACR,eAAgB,CAClB,CAAC,EAEKe,EAAQf,EAAM,KAAK,EAAG,IAAoB,CAAC,EAAE,KAAK,CACtD,KAAM,UACN,YAAa,EACf,CAAC,EACKiB,EAAQjB,EAAM,KAAK,GAAK,GAA4B,GAAG,EAAE,KAAK,CAClE,KAAM,UACN,YAAa,EACf,CAAC,EAED,EAAE,OAAO,EAAE,KAAK,KAAM,CAAC,EAEvB,IAAM2C,EAAY3C,EAAM,KAAKmC,GAAS,IAAiBO,GAAUL,EAAMK,EAAQ,EAAE,KAAK,CACpF,KAAM,UACN,eAAgB,GAClB,CAAC,EACKE,GAAa5C,EAAM,KAAKmC,GAAUE,EAAOD,GAAS,IAAiBK,GAAWJ,EAAMI,EAAS,EAAE,KAAK,CACxG,KAAM,UACN,eAAgB,GAClB,CAAC,EACKI,EAAU7C,EAAM,KAAKmC,GAAUE,EAAO,EAAID,GAAU,EAAG,IAAiBI,GAAQH,EAAMG,EAAM,EAAE,KAAK,CACvG,KAAM,UACN,eAAgB,GAClB,CAAC,EACKM,GAAY9C,EAAM,KAAKmC,GAAUE,EAAO,EAAID,GAAU,EAAG,IAAiBG,GAAUF,EAAME,EAAQ,EAAE,KAAK,CAC7G,KAAM,UACN,eAAgB,GAClB,CAAC,EACKQ,GAAa/C,EAAM,KAAKmC,GAAUE,EAAO,EAAID,GAAU,EAAG,IAAiBE,GAAWD,EAAMC,EAAS,EAAE,KAAK,CAChH,KAAM,UACN,eAAgB,GAClB,CAAC,CACH,EACO3C,CACT,EAAE",
  "names": ["require_raphael", "__commonJSMin", "exports", "module", "root", "factory", "modules", "installedModules", "__webpack_require__", "moduleId", "name", "getter", "value", "mode", "ns", "key", "object", "property", "__WEBPACK_AMD_DEFINE_ARRAY__", "__WEBPACK_AMD_DEFINE_RESULT__", "R", "eve", "first", "loaded", "array", "apply", "nu", "args", "f", "separator", "elements", "formatrg", "proto", "has", "g", "oldRaphael", "Paper", "paperproto", "appendChild", "concat", "supportsTouch", "S", "Str", "split", "events", "touchMap", "lowerCase", "math", "mmax", "mmin", "abs", "pow", "PI", "string", "toString", "fillString", "objectToString", "paper", "push", "ISURL", "colourRegExp", "isnan", "bezierrg", "round", "setAttribute", "toFloat", "toInt", "upperCase", "availableAttrs", "availableAnimAttrs", "whitespace", "commaSpaces", "hsrg", "p2s", "pathCommand", "tCommand", "pathValues", "radial_gradient", "eldata", "sortByKey", "a", "b", "sortByNumber", "fun", "pipe", "x", "rectPath", "y", "w", "h", "r", "ellipsePath", "rx", "ry", "getPath", "el", "bbox", "mapPath", "path", "matrix", "i", "j", "ii", "jj", "pathi", "path2curve", "d", "o", "type", "clone", "obj", "res", "x1", "y1", "x2", "y2", "x3", "y3", "deg", "rad", "values", "tolerance", "rem", "createUUID", "uuidRegEx", "uuidReplacer", "c", "v", "newwin", "toHex", "color", "trim", "bod", "docum", "range", "cacher", "hsbtoString", "hsltoString", "rgbtoString", "prepareRGB", "clr", "packageRGB", "rgb", "s", "G", "B", "X", "C", "l", "H", "V", "L", "M", "m", "repush", "item", "scope", "postprocessor", "newf", "arg", "cache", "count", "preload", "src", "img", "clrToString", "colour", "red", "green", "blue", "opacity", "t", "start", "catmullRom2bezier", "crp", "z", "iLen", "p", "pathString", "pth", "paths", "pathClone", "paramCounts", "data", "params", "TString", "elem", "newData", "newLevel", "ps", "p1x", "p1y", "c1x", "c1y", "c2x", "c2y", "p2x", "p2y", "t1", "t13", "t12", "t2", "t3", "mx", "my", "nx", "ny", "ax", "ay", "cx", "cy", "alpha", "curveDim", "bbox1", "bbox2", "base3", "p1", "p2", "p3", "p4", "bezlen", "x4", "y4", "z2", "n", "Tvalues", "Cvalues", "sum", "ct", "xbase", "ybase", "comb", "getTatLen", "ll", "step", "e", "intersect", "denominator", "px", "py", "px2", "py2", "inter", "bez1", "bez2", "interHelper", "interCount", "justCount", "l1", "l2", "n1", "n2", "dots1", "dots2", "xy", "di", "di1", "dj", "dj1", "ci", "cj", "is", "path1", "path2", "interPathHelper", "x1m", "y1m", "x2m", "y2m", "pi", "pj", "intr", "k", "kk", "methodname", "pathDimensions", "Y", "dim", "xmin", "ymin", "xmax", "ymax", "width", "height", "bb", "pathArray", "pathToRelative", "pa", "len", "pathToAbsolute", "crz", "dots", "l2c", "q2c", "_13", "_23", "a2c", "angle", "large_arc_flag", "sweep_flag", "recursive", "_120", "rotate", "f1", "f2", "cos", "sin", "rx2", "ry2", "df", "f2old", "x2old", "y2old", "c1", "s1", "c2", "s2", "hx", "hy", "m1", "m2", "m3", "m4", "newres", "findDotAtSegment", "dot", "attrs", "attrs2", "processPath", "pcom", "tq", "fixArc", "pp", "pcoms1", "pcoms2", "fixM", "a1", "a2", "pfirst", "seg", "seg2", "seglen", "seg2len", "parseDots", "gradient", "par", "end", "tear", "tofront", "toback", "insertafter", "el2", "insertbefore", "toMatrix", "transform", "extractTransform", "transformPath", "tstr", "tdata", "dx", "dy", "sx", "sy", "_", "Matrix", "tlen", "command", "absolute", "inver", "getEmpty", "equaliseTransform", "maxlength", "from", "to", "tt1", "tt2", "container", "matrixproto", "out", "me", "norm", "normalize", "mag", "row", "shorter", "preventDefault", "preventTouch", "stopPropagation", "stopTouch", "getEventPosition", "scrollY", "scrollX", "addEvent", "fn", "element", "pos", "_f", "olde", "detacher", "drag", "dragMove", "dragi", "touch", "node", "next", "parent", "display", "dragUp", "elproto", "eventName", "f_in", "f_out", "scope_in", "scope_out", "draggable", "onmove", "onstart", "onend", "move_scope", "start_scope", "end_scope", "text", "itemsArray", "Set", "set", "fit", "getOffset", "box", "doc", "body", "docElem", "clientTop", "clientLeft", "top", "left", "svg", "target", "so", "sr", "hits", "id", "bot", "callback", "thisArg", "x_y", "x_y_w_h", "rp", "isWithoutTransform", "glow", "curveslengths", "getPointAtSegmentLength", "length", "getLengthFactory", "istotal", "subpath", "onlystart", "sp", "subpaths", "point", "getTotalLength", "getPointAtLength", "getSubpathsAtLength", "ef", "q", "Q", "animationElements", "requestAnimFrame", "animation", "Now", "time", "ms", "easing", "diff", "that", "now", "init", "attr", "upto255", "get", "from2", "anim", "runAnimation", "Animation", "CubicBezierAtTime", "duration", "bx", "by", "sampleCurveX", "solve", "epsilon", "solveCurveX", "t0", "d2", "percents", "newAnim", "delay", "times", "percent", "status", "totalOrigin", "isInAnim", "isInAnimSet", "prev", "timestamp", "toColour", "pathes", "toPath", "eq", "to2", "easyeasy", "curve", "json", "lastKey", "stopAnimation", "items", "setproto", "method", "index", "insertion", "tail", "todel", "arglen", "collector", "glowConfig", "ret", "shape", "shape2", "index2", "isPointInside", "font", "fontcopy", "family", "prop", "glyph", "weight", "style", "stretch", "fontName", "thefont", "size", "origin", "letter_spacing", "line_spacing", "letters", "shift", "notfirst", "scale", "lineHeight", "shifty", "curr", "token", "str", "tokenRegex", "objNotationRegex", "replacer", "all", "quote", "quotedName", "isFunc", "isLoaded", "E", "xlink", "markers", "markerCounter", "$", "addGradientFill", "fx", "fy", "SVG", "_fx", "_fy", "dir", "vector", "max", "fillurl", "isIE9or10", "location", "locationString", "updatePosition", "addArrow", "isEnd", "se", "stroke", "refX", "pathId", "markerId", "marker", "use", "delta", "dasharray", "addDashes", "butt", "dashes", "setFillAndStroke", "vis", "att", "title", "val", "pn", "hl", "rect", "rc", "clip", "isURL", "ig", "stops", "cssrule", "tuneText", "leading", "fontSize", "texts", "tspans", "tspan", "dif", "getRealNode", "Element", "guid", "sw", "hide", "canvasHidden", "containerStyle", "names", "subkey", "parentNode", "afterNode", "beforeNode", "fltr", "blur", "con", "cnvs", "css", "isFloating", "paperSize", "aspectRatio", "vb", "map", "bites", "blurregexp", "cssDot", "zoom", "pathTypes", "ovalTypes", "path2vml", "total", "vals", "isMove", "compensation", "setCoords", "fillpos", "flip", "dxdy", "kx", "ky", "fill", "newpath", "isOval", "div", "dstyle", "textpathStyle", "newfill", "createNode", "newstroke", "strokeColor", "span", "brect", "dirtyattrs", "dd", "oindex", "fxfy", "clrs", "vml", "vbs", "vbt", "oldt", "skew", "isGrad", "isPatt", "bbt", "cs", "W", "win", "tagName", "glob", "version", "comaseparator", "wildcard", "numsort", "current_event", "stop", "firstDefined", "lastDefined", "objtos", "isArray", "ar", "oldstop", "listeners", "indexed", "queue", "ce", "errors", "nes", "es", "sep", "exist", "zIndex", "event", "subname", "cur", "splice", "funcs", "import_raphael", "Raphael", "startX", "startY", "endX", "endY", "radius1", "radius2", "centerX", "centerY", "_endX", "_endY", "largeArc", "startShape", "arcShape", "closeShape", "radius", "startAngle", "endAngle", "module", "divId", "percLeft", "percTarget", "percRight", "paper", "maxRadius", "normalizePercentages", "percentage", "percHit", "percMiss", "target", "drawTo", "puttsHole", "puttsGir", "percHole", "percGir", "path1", "path2", "path3", "text1", "text2", "text3", "scorePar3", "scorePar4", "scorePar5", "percPar3", "percPar4", "percPar5", "percUpAndDowns", "percScrambling", "percSandSaves", "perUpDwn", "perScram", "perSaves", "percEagle", "percBirdie", "percPar", "percBogey", "perc2Bogey", "originX", "bardist", "barW", "per2Bogey", "perBogey", "perPar", "perBirdie", "perEagle", "pathEagle", "pathBirdie", "pathPar", "pathBogey", "path2Bogey"]
}