[
  {
    "path": ".github/ISSUE_TEMPLATE/bug_report.md",
    "content": "---\nname: Bug report\nabout: Create a report to help us improve\ntitle: ''\nlabels: bug\nassignees: ''\n\n---\n\n**Describe the bug**\nA clear and concise description of what the bug is.\n\n**To reproduce**\nSteps to reproduce the behavior:\n\n**Expected behavior**\nA clear and concise description of what you expected to happen.\n\n**Screenshots/debug logs**\nIf applicable, add screenshots or debug logs to help explain your problem.\n\n**Software/hardware configuration (please complete the following information):**\n - Stenogotchi version: \n - Plugin version:\n - OS: \n - Hardware:\n\n**Additional context**\nAdd any other context about the problem here.\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/feature_request.md",
    "content": "---\nname: Feature request\nabout: Suggest an idea for this project\ntitle: ''\nlabels: ''\nassignees: ''\n\n---\n\n**Is your feature request related to a problem? Please describe.**\nA clear and concise description of what the problem is. Ex. I'm always frustrated when [...]\n\n**Describe the solution you'd like**\nA clear and concise description of what you want to happen.\n\n**Describe alternatives you've considered**\nA clear and concise description of any alternative solutions or features you've considered.\n\n**Additional context**\nAdd any other context or screenshots about the feature request here.\n"
  },
  {
    "path": ".gitignore",
    "content": "# Byte-compiled / optimized / DLL files\n__pycache__/\n*.py[cod]\n*$py.class\n\n# C extensions\n*.so\n\n# Distribution / packaging\n.Python\nbuild/\ndevelop-eggs/\ndist/\ndownloads/\neggs/\n.eggs/\nlib/\nlib64/\nparts/\nsdist/\nvar/\nwheels/\npip-wheel-metadata/\nshare/python-wheels/\n*.egg-info/\n.installed.cfg\n*.egg\nMANIFEST\n\n# PyInstaller\n#  Usually these files are written by a python script from a template\n#  before PyInstaller builds the exe, so as to inject date/other infos into it.\n*.manifest\n*.spec\n\n# Installer logs\npip-log.txt\npip-delete-this-directory.txt\n\n# Unit test / coverage reports\nhtmlcov/\n.tox/\n.nox/\n.coverage\n.coverage.*\n.cache\nnosetests.xml\ncoverage.xml\n*.cover\n*.py,cover\n.hypothesis/\n.pytest_cache/\n\n# Translations\n*.mo\n*.pot\n\n# Django stuff:\n*.log\nlocal_settings.py\ndb.sqlite3\ndb.sqlite3-journal\n\n# Flask stuff:\ninstance/\n.webassets-cache\n\n# Scrapy stuff:\n.scrapy\n\n# Sphinx documentation\ndocs/_build/\n\n# PyBuilder\ntarget/\n\n# Jupyter Notebook\n.ipynb_checkpoints\n\n# IPython\nprofile_default/\nipython_config.py\n\n# pyenv\n.python-version\n\n# pipenv\n#   According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.\n#   However, in case of collaboration, if having platform-specific dependencies or dependencies\n#   having no cross-platform support, pipenv may install dependencies that don't work, or not\n#   install all needed dependencies.\n#Pipfile.lock\n\n# PEP 582; used by e.g. github.com/David-OConnor/pyflow\n__pypackages__/\n\n# Celery stuff\ncelerybeat-schedule\ncelerybeat.pid\n\n# SageMath parsed files\n*.sage.py\n\n# Environments\n.env\n.venv\nenv/\nvenv/\nENV/\nenv.bak/\nvenv.bak/\n\n# Spyder project settings\n.spyderproject\n.spyproject\n\n# Rope project settings\n.ropeproject\n\n# mkdocs documentation\n/site\n\n# mypy\n.mypy_cache/\n.dmypy.json\ndmypy.json\n\n# Pyre type checker\n.pyre/\n"
  },
  {
    "path": "BUILDNOTES.md",
    "content": "# Build Notes\nConnect all the parts before soldering anything in place. They will not function without properly secured connections, but checking how they fit together can save you from time-consuming mistakes. You'll need a soldering iron, solder and preferably also cutting pliers, a metal file and some flux to complete the build. Below you find some tips on how to fit the parts together as neatly as possible.\n\n## Build Process\nThe depicted device did not have pre-soldered header pins, allowing me to shorten the pins on the underside rather than the top. Leaving the ends connecting to the display unaltered. Depending on your model you may therefore need to make some changes to the below steps.\n- Push the header pins through from the underside, leaving 4.5 mm of the pins exposed on the top (pre-soldered headers extend 9 mm above the board for comparison).\n- Layer the buttonSHIM on the top directly against the RPI0w.\n- Solder the headers on the top to the buttonSHIM using plenty of flux. Leaving as much of the pins clean as possible so they still fit into the display's socket.\n- Cut and remove the black plastic separator from the headers on the underside, leaving only bare pins on this side of the board as well.\n- Solder the pins to the underside of the board, ensuring a good electrical connection to the RPI0w.\n- Cut and file down the pins on the underside to make room for the UPS-Lite. Shortening them enough so they don't poke or scratch the battery.\n- Secure the UPS-Lite using the included hexagonal nuts. The screws are just barely long enough to accommodate the thickness of both the RPI0w and buttonSHIM.\n- Carefully press down the eINK module on the male pin headers without applying excessive force to the display itself.\n\n## GPIO Header\nWhether your RPI0w comes with pre-soldered male header or not, I recommend removing the black spacer. This way you can position the buttonSHIM directly against the board on the top with only the female header of the eINK display module and the buttonSHIM itself adding to the overall height of the device. \n\n## Waveshare Display:\n- In order to fit the screen onto the device as snugly as possible, make sure to desolder or by other means detach the large white connector. The yellow kapton tape didn't end up being needed since the covered components don't make contact with the RPI0w.\n\n![waveshare_stock](https://user-images.githubusercontent.com/17461433/144749374-befd978c-a6eb-4e9a-a1fc-603ed09b6914.jpg)\n![waveshare_modified](https://user-images.githubusercontent.com/17461433/112752795-6a5dab00-8fdd-11eb-8e15-bd59c9444a42.jpeg)\n\n## ButtonSHIM:\n- Take care to orient the module correctly.\n- Soldering it into place you want to aim for small but secure solder joints. Any extra solder on the pins will limit how close to the board you can fit the screen. An X-Acto knife or small file can help with potentially needed clean-up.\n\n![buttonshim_attached](https://user-images.githubusercontent.com/17461433/112752878-cc1e1500-8fdd-11eb-98e5-62af52a660a2.jpeg)\n\n## UPS-Lite:\n- Make sure the pins on the bottom don't extend too far before screwing the module onto the board. They should not be allowed to touch the battery pack. I ended up filing the pins down quite a bit to ensure sufficient clearance. Shape and length of the pins is important for the pogo pins to make good contact.\n- In the picture you can also spot a couple of the pins on the top and just how low the solder joints need to be for connecting the display.\n\n![upslite_attached](https://user-images.githubusercontent.com/17461433/112752928-1acbaf00-8fde-11eb-8281-5b35784cc348.JPG)\n\n## Real Time Clock\n- If you want to add a RTC module to keep the device synced while powered off, I recommend the [DS3231](https://www.pishop.us/product/ds3231-real-time-clock-module-for-raspberry-pi/). A good [setup guide](https://learn.adafruit.com/adding-a-real-time-clock-to-raspberry-pi/set-rtc-time) has been published by Adafruit.\n- Removing the female headers, the module fits neatly inside the UPS-Lite. You can see the correct wiring and positioning in the below picture. Don't forget to isolate it with some tape and form neat solder joints for the pins shared by the UPS-Lite.\n\n![ds3231_attached](https://user-images.githubusercontent.com/17461433/111912767-cff8e700-8a73-11eb-9bd0-a406bd7241ef.jpg)"
  },
  {
    "path": "CHANGELOG.md",
    "content": "# Changelog\nAll notable changes to this project will be documented in this file.\n\nThe format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),\nand this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).\n\n## [0.1.0] - 2022-01-02\n### Added\n- Modifier, function and navigation-key support, both individually and in combination (unsupported inputs logged in plover.log).\n- Reactions to new records in WPM-tracking mode.\n- Plover dictionary lookup with eINK display and STENO input support. The plugin (dict_lookup) utilizes native Plover lookup functionality for full compatibility with supported dictionary formats.\n- Buttonshim actions, both built-in and custom, accessible through web UI.\n- Hardware build guide.\n\n### Changed\n- Plover v4.0.0.dev10 or higher required.\n- Stenogotchi_link v0.3.0 required. Plugin now logs to plover.log.\n- Character and personality adjustments.\n- Simplified installation process.\n- Added documentation for aligning text output with target device expected input language and layout.\n- Web UI default port changed from 8080 to 80.\n- Bluetooth connection established only once Plover has started.\n\n### Fixed\n- Significantly reduced input latency in STENO mode.\n- Improved Bluetooth pairing and connection management.\n- Web UI now starts only once a wifi connection has been established.\n\n## [Unreleased]\n### Added\n### Changed\n### Fixed\n### Removed\n\n## [0.0.5] - 2021-03-24\n### Added\n- DS3231 real time clock module wiring and positioning reference picture to README.\n- Four new faces, producing processing animation when combined.\n- WPM stats now track and display top result for session.\n\n### Changed\n- Led plugin and default patterns to better indicate noteworthy events.\n\n### Fixed\n- QWERTY-mode breaking bug introduced in v0.0.4.\n- Letter capitalization, symbol characters and return key in STENO-mode.\n\n## [0.0.4] - 2021-03-21\n### Added\n- This CHANGELOG file.\n- User configurable bluetooth device name using main.plugins.plover_link.bt_device_name.\n- User configurable list of bluetooth mac addresses, in order of priority, to auto-connect to using main.plugins.plover_link.bt_autoconnect_mac.\n- User configurable option to clear eINK display at shutdown using ui.display.clear_at_shutdown.\n- User configurable wpm calculation method using main.plugins.plover_link.wpm_method.\n- User configurable wpm update frequency and calculation window in seconds using main.plugins.plover_link.wpm_timeout.\n- More variety in mood indicators on common events.\n- Requirements file.\n\n### Changed\n- Improved installation guide and documentation in README.\n- All functionality in buttonshim plugin reworked into class for better integration with the project.\n- More consistent logging messages.\n- Stenogotchi_link version upgrade to v0.0.4.\n\n### Fixed\n- Reboot after initial setup or hostname change not working.\n- Wifi status not showing as [OFF] if wifi is disabled at boot.\n- Mode not changing to STENO when Plover becomes operational.\n- All button press events not producing logging messages.\n- Dependencies for stenogotchi_link Plover plugin corrected in setup.cfg.\n\n## [0.0.3] - 2021-03-18\n### Added\n- First public pre-release version on GitHub.\n- Stenogotchi, portable stenography using Plover and bluetooth keyboard emulation on a Raspberry Pi Zero W. With support for Waveshare 2.13 v2, ButtonSHIM and UPS-Lite v1.2 modules.\n- Plover plugin stenogotchi_link for communicating between Plover and Stenogotchi.\n- README now includes tested installation guide no longer requiring building PyQt5 from source.\n- README now includes basic configuration and usage documentation.\n- LICENSE file.\n\n[Unreleased]: https://github.com/Anodynous/stenogotchi/compare/v0.1.0...dev\n[0.1.0]: https://github.com/Anodynous/stenogotchi/compare/v0.0.5...v0.1.0\n[0.0.5]: https://github.com/Anodynous/stenogotchi/compare/v0.0.4...v0.0.5\n[0.0.4]: https://github.com/Anodynous/stenogotchi/compare/v0.0.3...v0.0.4\n[0.0.3]: https://github.com/Anodynous/stenogotchi/releases/tag/v0.0.3"
  },
  {
    "path": "LICENSE",
    "content": "                    GNU AFFERO GENERAL PUBLIC LICENSE\n                       Version 3, 19 November 2007\n\n Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>\n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.\n\n                            Preamble\n\n  The GNU Affero General Public License is a free, copyleft license for\nsoftware and other kinds of works, specifically designed to ensure\ncooperation with the community in the case of network server software.\n\n  The licenses for most software and other practical works are designed\nto take away your freedom to share and change the works.  By contrast,\nour General Public Licenses are intended to guarantee your freedom to\nshare and change all versions of a program--to make sure it remains free\nsoftware for all its users.\n\n  When we speak of free software, we are referring to freedom, not\nprice.  Our General Public Licenses are designed to make sure that you\nhave the freedom to distribute copies of free software (and charge for\nthem if you wish), that you receive source code or can get it if you\nwant it, that you can change the software or use pieces of it in new\nfree programs, and that you know you can do these things.\n\n  Developers that use our General Public Licenses protect your rights\nwith two steps: (1) assert copyright on the software, and (2) offer\nyou this License which gives you legal permission to copy, distribute\nand/or modify the software.\n\n  A secondary benefit of defending all users' freedom is that\nimprovements made in alternate versions of the program, if they\nreceive widespread use, become available for other developers to\nincorporate.  Many developers of free software are heartened and\nencouraged by the resulting cooperation.  However, in the case of\nsoftware used on network servers, this result may fail to come about.\nThe GNU General Public License permits making a modified version and\nletting the public access it on a server without ever releasing its\nsource code to the public.\n\n  The GNU Affero General Public License is designed specifically to\nensure that, in such cases, the modified source code becomes available\nto the community.  It requires the operator of a network server to\nprovide the source code of the modified version running there to the\nusers of that server.  Therefore, public use of a modified version, on\na publicly accessible server, gives the public access to the source\ncode of the modified version.\n\n  An older license, called the Affero General Public License and\npublished by Affero, was designed to accomplish similar goals.  This is\na different license, not a version of the Affero GPL, but Affero has\nreleased a new version of the Affero GPL which permits relicensing under\nthis license.\n\n  The precise terms and conditions for copying, distribution and\nmodification follow.\n\n                       TERMS AND CONDITIONS\n\n  0. Definitions.\n\n  \"This License\" refers to version 3 of the GNU Affero General Public License.\n\n  \"Copyright\" also means copyright-like laws that apply to other kinds of\nworks, such as semiconductor masks.\n\n  \"The Program\" refers to any copyrightable work licensed under this\nLicense.  Each licensee is addressed as \"you\".  \"Licensees\" and\n\"recipients\" may be individuals or organizations.\n\n  To \"modify\" a work means to copy from or adapt all or part of the work\nin a fashion requiring copyright permission, other than the making of an\nexact copy.  The resulting work is called a \"modified version\" of the\nearlier work or a work \"based on\" the earlier work.\n\n  A \"covered work\" means either the unmodified Program or a work based\non the Program.\n\n  To \"propagate\" a work means to do anything with it that, without\npermission, would make you directly or secondarily liable for\ninfringement under applicable copyright law, except executing it on a\ncomputer or modifying a private copy.  Propagation includes copying,\ndistribution (with or without modification), making available to the\npublic, and in some countries other activities as well.\n\n  To \"convey\" a work means any kind of propagation that enables other\nparties to make or receive copies.  Mere interaction with a user through\na computer network, with no transfer of a copy, is not conveying.\n\n  An interactive user interface displays \"Appropriate Legal Notices\"\nto the extent that it includes a convenient and prominently visible\nfeature that (1) displays an appropriate copyright notice, and (2)\ntells the user that there is no warranty for the work (except to the\nextent that warranties are provided), that licensees may convey the\nwork under this License, and how to view a copy of this License.  If\nthe interface presents a list of user commands or options, such as a\nmenu, a prominent item in the list meets this criterion.\n\n  1. Source Code.\n\n  The \"source code\" for a work means the preferred form of the work\nfor making modifications to it.  \"Object code\" means any non-source\nform of a work.\n\n  A \"Standard Interface\" means an interface that either is an official\nstandard defined by a recognized standards body, or, in the case of\ninterfaces specified for a particular programming language, one that\nis widely used among developers working in that language.\n\n  The \"System Libraries\" of an executable work include anything, other\nthan the work as a whole, that (a) is included in the normal form of\npackaging a Major Component, but which is not part of that Major\nComponent, and (b) serves only to enable use of the work with that\nMajor Component, or to implement a Standard Interface for which an\nimplementation is available to the public in source code form.  A\n\"Major Component\", in this context, means a major essential component\n(kernel, window system, and so on) of the specific operating system\n(if any) on which the executable work runs, or a compiler used to\nproduce the work, or an object code interpreter used to run it.\n\n  The \"Corresponding Source\" for a work in object code form means all\nthe source code needed to generate, install, and (for an executable\nwork) run the object code and to modify the work, including scripts to\ncontrol those activities.  However, it does not include the work's\nSystem Libraries, or general-purpose tools or generally available free\nprograms which are used unmodified in performing those activities but\nwhich are not part of the work.  For example, Corresponding Source\nincludes interface definition files associated with source files for\nthe work, and the source code for shared libraries and dynamically\nlinked subprograms that the work is specifically designed to require,\nsuch as by intimate data communication or control flow between those\nsubprograms and other parts of the work.\n\n  The Corresponding Source need not include anything that users\ncan regenerate automatically from other parts of the Corresponding\nSource.\n\n  The Corresponding Source for a work in source code form is that\nsame work.\n\n  2. Basic Permissions.\n\n  All rights granted under this License are granted for the term of\ncopyright on the Program, and are irrevocable provided the stated\nconditions are met.  This License explicitly affirms your unlimited\npermission to run the unmodified Program.  The output from running a\ncovered work is covered by this License only if the output, given its\ncontent, constitutes a covered work.  This License acknowledges your\nrights of fair use or other equivalent, as provided by copyright law.\n\n  You may make, run and propagate covered works that you do not\nconvey, without conditions so long as your license otherwise remains\nin force.  You may convey covered works to others for the sole purpose\nof having them make modifications exclusively for you, or provide you\nwith facilities for running those works, provided that you comply with\nthe terms of this License in conveying all material for which you do\nnot control copyright.  Those thus making or running the covered works\nfor you must do so exclusively on your behalf, under your direction\nand control, on terms that prohibit them from making any copies of\nyour copyrighted material outside their relationship with you.\n\n  Conveying under any other circumstances is permitted solely under\nthe conditions stated below.  Sublicensing is not allowed; section 10\nmakes it unnecessary.\n\n  3. Protecting Users' Legal Rights From Anti-Circumvention Law.\n\n  No covered work shall be deemed part of an effective technological\nmeasure under any applicable law fulfilling obligations under article\n11 of the WIPO copyright treaty adopted on 20 December 1996, or\nsimilar laws prohibiting or restricting circumvention of such\nmeasures.\n\n  When you convey a covered work, you waive any legal power to forbid\ncircumvention of technological measures to the extent such circumvention\nis effected by exercising rights under this License with respect to\nthe covered work, and you disclaim any intention to limit operation or\nmodification of the work as a means of enforcing, against the work's\nusers, your or third parties' legal rights to forbid circumvention of\ntechnological measures.\n\n  4. Conveying Verbatim Copies.\n\n  You may convey verbatim copies of the Program's source code as you\nreceive it, in any medium, provided that you conspicuously and\nappropriately publish on each copy an appropriate copyright notice;\nkeep intact all notices stating that this License and any\nnon-permissive terms added in accord with section 7 apply to the code;\nkeep intact all notices of the absence of any warranty; and give all\nrecipients a copy of this License along with the Program.\n\n  You may charge any price or no price for each copy that you convey,\nand you may offer support or warranty protection for a fee.\n\n  5. Conveying Modified Source Versions.\n\n  You may convey a work based on the Program, or the modifications to\nproduce it from the Program, in the form of source code under the\nterms of section 4, provided that you also meet all of these conditions:\n\n    a) The work must carry prominent notices stating that you modified\n    it, and giving a relevant date.\n\n    b) The work must carry prominent notices stating that it is\n    released under this License and any conditions added under section\n    7.  This requirement modifies the requirement in section 4 to\n    \"keep intact all notices\".\n\n    c) You must license the entire work, as a whole, under this\n    License to anyone who comes into possession of a copy.  This\n    License will therefore apply, along with any applicable section 7\n    additional terms, to the whole of the work, and all its parts,\n    regardless of how they are packaged.  This License gives no\n    permission to license the work in any other way, but it does not\n    invalidate such permission if you have separately received it.\n\n    d) If the work has interactive user interfaces, each must display\n    Appropriate Legal Notices; however, if the Program has interactive\n    interfaces that do not display Appropriate Legal Notices, your\n    work need not make them do so.\n\n  A compilation of a covered work with other separate and independent\nworks, which are not by their nature extensions of the covered work,\nand which are not combined with it such as to form a larger program,\nin or on a volume of a storage or distribution medium, is called an\n\"aggregate\" if the compilation and its resulting copyright are not\nused to limit the access or legal rights of the compilation's users\nbeyond what the individual works permit.  Inclusion of a covered work\nin an aggregate does not cause this License to apply to the other\nparts of the aggregate.\n\n  6. Conveying Non-Source Forms.\n\n  You may convey a covered work in object code form under the terms\nof sections 4 and 5, provided that you also convey the\nmachine-readable Corresponding Source under the terms of this License,\nin one of these ways:\n\n    a) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by the\n    Corresponding Source fixed on a durable physical medium\n    customarily used for software interchange.\n\n    b) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by a\n    written offer, valid for at least three years and valid for as\n    long as you offer spare parts or customer support for that product\n    model, to give anyone who possesses the object code either (1) a\n    copy of the Corresponding Source for all the software in the\n    product that is covered by this License, on a durable physical\n    medium customarily used for software interchange, for a price no\n    more than your reasonable cost of physically performing this\n    conveying of source, or (2) access to copy the\n    Corresponding Source from a network server at no charge.\n\n    c) Convey individual copies of the object code with a copy of the\n    written offer to provide the Corresponding Source.  This\n    alternative is allowed only occasionally and noncommercially, and\n    only if you received the object code with such an offer, in accord\n    with subsection 6b.\n\n    d) Convey the object code by offering access from a designated\n    place (gratis or for a charge), and offer equivalent access to the\n    Corresponding Source in the same way through the same place at no\n    further charge.  You need not require recipients to copy the\n    Corresponding Source along with the object code.  If the place to\n    copy the object code is a network server, the Corresponding Source\n    may be on a different server (operated by you or a third party)\n    that supports equivalent copying facilities, provided you maintain\n    clear directions next to the object code saying where to find the\n    Corresponding Source.  Regardless of what server hosts the\n    Corresponding Source, you remain obligated to ensure that it is\n    available for as long as needed to satisfy these requirements.\n\n    e) Convey the object code using peer-to-peer transmission, provided\n    you inform other peers where the object code and Corresponding\n    Source of the work are being offered to the general public at no\n    charge under subsection 6d.\n\n  A separable portion of the object code, whose source code is excluded\nfrom the Corresponding Source as a System Library, need not be\nincluded in conveying the object code work.\n\n  A \"User Product\" is either (1) a \"consumer product\", which means any\ntangible personal property which is normally used for personal, family,\nor household purposes, or (2) anything designed or sold for incorporation\ninto a dwelling.  In determining whether a product is a consumer product,\ndoubtful cases shall be resolved in favor of coverage.  For a particular\nproduct received by a particular user, \"normally used\" refers to a\ntypical or common use of that class of product, regardless of the status\nof the particular user or of the way in which the particular user\nactually uses, or expects or is expected to use, the product.  A product\nis a consumer product regardless of whether the product has substantial\ncommercial, industrial or non-consumer uses, unless such uses represent\nthe only significant mode of use of the product.\n\n  \"Installation Information\" for a User Product means any methods,\nprocedures, authorization keys, or other information required to install\nand execute modified versions of a covered work in that User Product from\na modified version of its Corresponding Source.  The information must\nsuffice to ensure that the continued functioning of the modified object\ncode is in no case prevented or interfered with solely because\nmodification has been made.\n\n  If you convey an object code work under this section in, or with, or\nspecifically for use in, a User Product, and the conveying occurs as\npart of a transaction in which the right of possession and use of the\nUser Product is transferred to the recipient in perpetuity or for a\nfixed term (regardless of how the transaction is characterized), the\nCorresponding Source conveyed under this section must be accompanied\nby the Installation Information.  But this requirement does not apply\nif neither you nor any third party retains the ability to install\nmodified object code on the User Product (for example, the work has\nbeen installed in ROM).\n\n  The requirement to provide Installation Information does not include a\nrequirement to continue to provide support service, warranty, or updates\nfor a work that has been modified or installed by the recipient, or for\nthe User Product in which it has been modified or installed.  Access to a\nnetwork may be denied when the modification itself materially and\nadversely affects the operation of the network or violates the rules and\nprotocols for communication across the network.\n\n  Corresponding Source conveyed, and Installation Information provided,\nin accord with this section must be in a format that is publicly\ndocumented (and with an implementation available to the public in\nsource code form), and must require no special password or key for\nunpacking, reading or copying.\n\n  7. Additional Terms.\n\n  \"Additional permissions\" are terms that supplement the terms of this\nLicense by making exceptions from one or more of its conditions.\nAdditional permissions that are applicable to the entire Program shall\nbe treated as though they were included in this License, to the extent\nthat they are valid under applicable law.  If additional permissions\napply only to part of the Program, that part may be used separately\nunder those permissions, but the entire Program remains governed by\nthis License without regard to the additional permissions.\n\n  When you convey a copy of a covered work, you may at your option\nremove any additional permissions from that copy, or from any part of\nit.  (Additional permissions may be written to require their own\nremoval in certain cases when you modify the work.)  You may place\nadditional permissions on material, added by you to a covered work,\nfor which you have or can give appropriate copyright permission.\n\n  Notwithstanding any other provision of this License, for material you\nadd to a covered work, you may (if authorized by the copyright holders of\nthat material) supplement the terms of this License with terms:\n\n    a) Disclaiming warranty or limiting liability differently from the\n    terms of sections 15 and 16 of this License; or\n\n    b) Requiring preservation of specified reasonable legal notices or\n    author attributions in that material or in the Appropriate Legal\n    Notices displayed by works containing it; or\n\n    c) Prohibiting misrepresentation of the origin of that material, or\n    requiring that modified versions of such material be marked in\n    reasonable ways as different from the original version; or\n\n    d) Limiting the use for publicity purposes of names of licensors or\n    authors of the material; or\n\n    e) Declining to grant rights under trademark law for use of some\n    trade names, trademarks, or service marks; or\n\n    f) Requiring indemnification of licensors and authors of that\n    material by anyone who conveys the material (or modified versions of\n    it) with contractual assumptions of liability to the recipient, for\n    any liability that these contractual assumptions directly impose on\n    those licensors and authors.\n\n  All other non-permissive additional terms are considered \"further\nrestrictions\" within the meaning of section 10.  If the Program as you\nreceived it, or any part of it, contains a notice stating that it is\ngoverned by this License along with a term that is a further\nrestriction, you may remove that term.  If a license document contains\na further restriction but permits relicensing or conveying under this\nLicense, you may add to a covered work material governed by the terms\nof that license document, provided that the further restriction does\nnot survive such relicensing or conveying.\n\n  If you add terms to a covered work in accord with this section, you\nmust place, in the relevant source files, a statement of the\nadditional terms that apply to those files, or a notice indicating\nwhere to find the applicable terms.\n\n  Additional terms, permissive or non-permissive, may be stated in the\nform of a separately written license, or stated as exceptions;\nthe above requirements apply either way.\n\n  8. Termination.\n\n  You may not propagate or modify a covered work except as expressly\nprovided under this License.  Any attempt otherwise to propagate or\nmodify it is void, and will automatically terminate your rights under\nthis License (including any patent licenses granted under the third\nparagraph of section 11).\n\n  However, if you cease all violation of this License, then your\nlicense from a particular copyright holder is reinstated (a)\nprovisionally, unless and until the copyright holder explicitly and\nfinally terminates your license, and (b) permanently, if the copyright\nholder fails to notify you of the violation by some reasonable means\nprior to 60 days after the cessation.\n\n  Moreover, your license from a particular copyright holder is\nreinstated permanently if the copyright holder notifies you of the\nviolation by some reasonable means, this is the first time you have\nreceived notice of violation of this License (for any work) from that\ncopyright holder, and you cure the violation prior to 30 days after\nyour receipt of the notice.\n\n  Termination of your rights under this section does not terminate the\nlicenses of parties who have received copies or rights from you under\nthis License.  If your rights have been terminated and not permanently\nreinstated, you do not qualify to receive new licenses for the same\nmaterial under section 10.\n\n  9. Acceptance Not Required for Having Copies.\n\n  You are not required to accept this License in order to receive or\nrun a copy of the Program.  Ancillary propagation of a covered work\noccurring solely as a consequence of using peer-to-peer transmission\nto receive a copy likewise does not require acceptance.  However,\nnothing other than this License grants you permission to propagate or\nmodify any covered work.  These actions infringe copyright if you do\nnot accept this License.  Therefore, by modifying or propagating a\ncovered work, you indicate your acceptance of this License to do so.\n\n  10. Automatic Licensing of Downstream Recipients.\n\n  Each time you convey a covered work, the recipient automatically\nreceives a license from the original licensors, to run, modify and\npropagate that work, subject to this License.  You are not responsible\nfor enforcing compliance by third parties with this License.\n\n  An \"entity transaction\" is a transaction transferring control of an\norganization, or substantially all assets of one, or subdividing an\norganization, or merging organizations.  If propagation of a covered\nwork results from an entity transaction, each party to that\ntransaction who receives a copy of the work also receives whatever\nlicenses to the work the party's predecessor in interest had or could\ngive under the previous paragraph, plus a right to possession of the\nCorresponding Source of the work from the predecessor in interest, if\nthe predecessor has it or can get it with reasonable efforts.\n\n  You may not impose any further restrictions on the exercise of the\nrights granted or affirmed under this License.  For example, you may\nnot impose a license fee, royalty, or other charge for exercise of\nrights granted under this License, and you may not initiate litigation\n(including a cross-claim or counterclaim in a lawsuit) alleging that\nany patent claim is infringed by making, using, selling, offering for\nsale, or importing the Program or any portion of it.\n\n  11. Patents.\n\n  A \"contributor\" is a copyright holder who authorizes use under this\nLicense of the Program or a work on which the Program is based.  The\nwork thus licensed is called the contributor's \"contributor version\".\n\n  A contributor's \"essential patent claims\" are all patent claims\nowned or controlled by the contributor, whether already acquired or\nhereafter acquired, that would be infringed by some manner, permitted\nby this License, of making, using, or selling its contributor version,\nbut do not include claims that would be infringed only as a\nconsequence of further modification of the contributor version.  For\npurposes of this definition, \"control\" includes the right to grant\npatent sublicenses in a manner consistent with the requirements of\nthis License.\n\n  Each contributor grants you a non-exclusive, worldwide, royalty-free\npatent license under the contributor's essential patent claims, to\nmake, use, sell, offer for sale, import and otherwise run, modify and\npropagate the contents of its contributor version.\n\n  In the following three paragraphs, a \"patent license\" is any express\nagreement or commitment, however denominated, not to enforce a patent\n(such as an express permission to practice a patent or covenant not to\nsue for patent infringement).  To \"grant\" such a patent license to a\nparty means to make such an agreement or commitment not to enforce a\npatent against the party.\n\n  If you convey a covered work, knowingly relying on a patent license,\nand the Corresponding Source of the work is not available for anyone\nto copy, free of charge and under the terms of this License, through a\npublicly available network server or other readily accessible means,\nthen you must either (1) cause the Corresponding Source to be so\navailable, or (2) arrange to deprive yourself of the benefit of the\npatent license for this particular work, or (3) arrange, in a manner\nconsistent with the requirements of this License, to extend the patent\nlicense to downstream recipients.  \"Knowingly relying\" means you have\nactual knowledge that, but for the patent license, your conveying the\ncovered work in a country, or your recipient's use of the covered work\nin a country, would infringe one or more identifiable patents in that\ncountry that you have reason to believe are valid.\n\n  If, pursuant to or in connection with a single transaction or\narrangement, you convey, or propagate by procuring conveyance of, a\ncovered work, and grant a patent license to some of the parties\nreceiving the covered work authorizing them to use, propagate, modify\nor convey a specific copy of the covered work, then the patent license\nyou grant is automatically extended to all recipients of the covered\nwork and works based on it.\n\n  A patent license is \"discriminatory\" if it does not include within\nthe scope of its coverage, prohibits the exercise of, or is\nconditioned on the non-exercise of one or more of the rights that are\nspecifically granted under this License.  You may not convey a covered\nwork if you are a party to an arrangement with a third party that is\nin the business of distributing software, under which you make payment\nto the third party based on the extent of your activity of conveying\nthe work, and under which the third party grants, to any of the\nparties who would receive the covered work from you, a discriminatory\npatent license (a) in connection with copies of the covered work\nconveyed by you (or copies made from those copies), or (b) primarily\nfor and in connection with specific products or compilations that\ncontain the covered work, unless you entered into that arrangement,\nor that patent license was granted, prior to 28 March 2007.\n\n  Nothing in this License shall be construed as excluding or limiting\nany implied license or other defenses to infringement that may\notherwise be available to you under applicable patent law.\n\n  12. No Surrender of Others' Freedom.\n\n  If conditions are imposed on you (whether by court order, agreement or\notherwise) that contradict the conditions of this License, they do not\nexcuse you from the conditions of this License.  If you cannot convey a\ncovered work so as to satisfy simultaneously your obligations under this\nLicense and any other pertinent obligations, then as a consequence you may\nnot convey it at all.  For example, if you agree to terms that obligate you\nto collect a royalty for further conveying from those to whom you convey\nthe Program, the only way you could satisfy both those terms and this\nLicense would be to refrain entirely from conveying the Program.\n\n  13. Remote Network Interaction; Use with the GNU General Public License.\n\n  Notwithstanding any other provision of this License, if you modify the\nProgram, your modified version must prominently offer all users\ninteracting with it remotely through a computer network (if your version\nsupports such interaction) an opportunity to receive the Corresponding\nSource of your version by providing access to the Corresponding Source\nfrom a network server at no charge, through some standard or customary\nmeans of facilitating copying of software.  This Corresponding Source\nshall include the Corresponding Source for any work covered by version 3\nof the GNU General Public License that is incorporated pursuant to the\nfollowing paragraph.\n\n  Notwithstanding any other provision of this License, you have\npermission to link or combine any covered work with a work licensed\nunder version 3 of the GNU General Public License into a single\ncombined work, and to convey the resulting work.  The terms of this\nLicense will continue to apply to the part which is the covered work,\nbut the work with which it is combined will remain governed by version\n3 of the GNU General Public License.\n\n  14. Revised Versions of this License.\n\n  The Free Software Foundation may publish revised and/or new versions of\nthe GNU Affero General Public License from time to time.  Such new versions\nwill be similar in spirit to the present version, but may differ in detail to\naddress new problems or concerns.\n\n  Each version is given a distinguishing version number.  If the\nProgram specifies that a certain numbered version of the GNU Affero General\nPublic License \"or any later version\" applies to it, you have the\noption of following the terms and conditions either of that numbered\nversion or of any later version published by the Free Software\nFoundation.  If the Program does not specify a version number of the\nGNU Affero General Public License, you may choose any version ever published\nby the Free Software Foundation.\n\n  If the Program specifies that a proxy can decide which future\nversions of the GNU Affero General Public License can be used, that proxy's\npublic statement of acceptance of a version permanently authorizes you\nto choose that version for the Program.\n\n  Later license versions may give you additional or different\npermissions.  However, no additional obligations are imposed on any\nauthor or copyright holder as a result of your choosing to follow a\nlater version.\n\n  15. Disclaimer of Warranty.\n\n  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY\nAPPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT\nHOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY\nOF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,\nTHE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\nPURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM\nIS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF\nALL NECESSARY SERVICING, REPAIR OR CORRECTION.\n\n  16. Limitation of Liability.\n\n  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\nWILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS\nTHE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY\nGENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE\nUSE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF\nDATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD\nPARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),\nEVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF\nSUCH DAMAGES.\n\n  17. Interpretation of Sections 15 and 16.\n\n  If the disclaimer of warranty and limitation of liability provided\nabove cannot be given local legal effect according to their terms,\nreviewing courts shall apply local law that most closely approximates\nan absolute waiver of all civil liability in connection with the\nProgram, unless a warranty or assumption of liability accompanies a\ncopy of the Program in return for a fee.\n\n                     END OF TERMS AND CONDITIONS\n\n            How to Apply These Terms to Your New Programs\n\n  If you develop a new program, and you want it to be of the greatest\npossible use to the public, the best way to achieve this is to make it\nfree software which everyone can redistribute and change under these terms.\n\n  To do so, attach the following notices to the program.  It is safest\nto attach them to the start of each source file to most effectively\nstate the exclusion of warranty; and each file should have at least\nthe \"copyright\" line and a pointer to where the full notice is found.\n\n    <one line to give the program's name and a brief idea of what it does.>\n    Copyright (C) <year>  <name of author>\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Affero General Public License as published\n    by the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU Affero General Public License for more details.\n\n    You should have received a copy of the GNU Affero General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n\nAlso add information on how to contact you by electronic and paper mail.\n\n  If your software can interact with users remotely through a computer\nnetwork, you should also make sure that it provides a way for users to\nget its source.  For example, if your program is a web application, its\ninterface could display a \"Source\" link that leads users to an archive\nof the code.  There are many ways you could offer source, and different\nsolutions will be better for different programs; see section 13 for the\nspecific requirements.\n\n  You should also get your employer (if you work as a programmer) or school,\nif any, to sign a \"copyright disclaimer\" for the program, if necessary.\nFor more information on this, and how to apply and follow the GNU AGPL, see\n<https://www.gnu.org/licenses/>.\n"
  },
  {
    "path": "README.md",
    "content": "# Stenogotchi\n![stenogotchi_1](https://user-images.githubusercontent.com/17461433/107876588-8e52aa80-6ecf-11eb-81ba-14731c885ff1.jpeg)\n\nAim of the project is to deliver a cheap and portable device for running [Plover](https://www.openstenoproject.org/ \"Plover: Open Steno Project\") where local installation on the host is impossible or simply not preferred. A stand-alone link enabling stenography using any input device supported by Plover on any device accepting bluetooth keyboards. \n\nLikely use-cases include: \n- Mobile devices\n- Corporate and public computers restricting software installations \n- Hassle-free switching between devices without the need to install and configure Plover\n- On-the-go stenographic recording\n\nStenogotchi is built on top of [Pwnagotchi](https://github.com/evilsocket/pwnagotchi), but instead of hungering for WPA handshakes it feeds on your steno chords. It emulates a BT HID device for connecting to a host and output can be toggled between STENO and QWERTY mode on the fly. The friendly UI optimized for low-power eINK displays is also accessible as a web UI version, making both the eINK display and buttonSHIM modules optional. If the RPI0w always will be powered over microUSB a separate battery pack is not needed. The suggested UPS-Lite 1000 mAH battery provides 3+ hours of runtime and supports pass-through charging. \n\n## Hardware\n| Module                                                                                                                                                                    | Status       |\n|:--------------------------------------------------------------------------------------------------------------------------------------------------------------------------|:-------------|\n| [Raspberry Pi Zero W](https://www.raspberrypi.org/products/raspberry-pi-zero-w/) or [Raspberry Pi Zero 2 W](https://www.raspberrypi.com/products/raspberry-pi-zero-2-w/)  | Required     |\n| MicroSD card (min 4 GiB)                                                                                                                                                  | Required     |\n| [Waveshare 2.13 v.2](https://www.waveshare.com/wiki/2.13inch_e-Paper_HAT)                                                                                                 | Recommended  |\n| [ButtonSHIM](https://shop.pimoroni.com/products/button-shim)                                                                                                              | Recommended  |\n| [UPS-Lite v1.2](https://hackaday.io/project/173847-ups-lite)                                                                                                              | Recommended  |\n| [DS3231 RTC Module](https://www.pishop.us/product/ds3231-real-time-clock-module-for-raspberry-pi/)                                                                        | Optional     |\n\nSee the [build notes](BUILDNOTES.md) for guidance on fitting the parts together.\n## Installation\nAll commands should be executed as root. The installation process can be completed headless.\n\n1. Flash and configure DietPi image, see https://dietpi.com/docs/install/\n    * For headless installation, set AUTO_SETUP_NET_WIFI_ENABLED=1 in dietpi.txt and enter wifi credentials in dietpi-wifi.txt before first boot.\n    * When prompted allow dietpi to update, change passwords and disable serial console. Under dietpi-config > advanced options enable:\n        * Bluetooth\n        * SPI state (needed by eINK screen)\n        * I2C state (needed by Buttonshim module and for UPS-Lite power readings)\n    * Using command 'dietpi-autostart' enable automatic login of user 'root' to local terminal (option #7)\n\n2. Install dependencies\n\n       apt-get install git xorg xserver-xorg-video-fbdev python3-pip python3-rpi.gpio python3-gi libtiff5 libopenjp2-7 bluez screen rfkill -y\n       pip3 install file_read_backwards flask flask-wtf flask-cors evdev python-xlib pillow spidev jsonpickle dbus-python toml\n\n3. Download and install Plover (v4.0.0.dev10)\n\n       wget https://github.com/openstenoproject/plover/releases/download/v4.0.0.dev10/plover-4.0.0.dev10-py3-none-any.whl\n       pip3 install plover-4.0.0.dev10-py3-none-any.whl\n\n   * If you'd rather try the [continuous build of Plover](https://github.com/openstenoproject/plover/releases/tag/continuous) for the latest improvements, you will need to install both build-essential and python3-dev through apt-get first. Switch back to dev10 if you experience issues.\n4. Clone the Stenogotchi repository and install the plover plugin \"stenogotchi_link\"\n\n       git clone https://github.com/Anodynous/stenogotchi.git\n       pip3 install ./stenogotchi/plover_plugin/\n\n5. Configure Plover. Setup will ultimately depend on your own preferences and keyboard, but below is what I use. Make sure to include at least 'auto_start = True' and the '[Plugins]' section in your own config.\n\n       mkdir -p /root/.config/plover/\n       nano /root/.config/plover/plover.cfg\n       \n       #----------\n       [Output Configuration]\n       space_placement = After Output\n       start_attached = True\n       start_capitalize = False\n       undo_levels = 30\n\n       [Logging Configuration]\n       enable_stroke_logging = False\n       enable_translation_logging = False\n\n       [Machine Configuration]\n       auto_start = True\n       machine_type = Gemini PR\n\n       [Gemini PR]\n       baudrate = 9600\n       bytesize = 8\n       parity = N\n       port = /dev/ttyACM0\n       stopbits = 1\n       timeout = 2.0\n\n       [Plugins]\n       enabled_extensions = [\"stenogotchi_link\"]\n\n6. Run installation script to finalize setup of Stenogotchi. Optional boot time improvements offered by script described in \"Significantly reduce boot time\" section below.\n       \n       chmod +x ./stenogotchi/initial_setup.sh\n       ./stenogotchi/initial_setup.sh\n\n7. Configure Stenogotchi settings after reboot completes\n\n       nano /etc/stenogotchi/config.toml\n        \n       #----------modify the config as you see fit----------#\n       main.plugins.buttonshim.enabled = true\n       main.plugins.upslite.enabled = true\n       main.plugins.evdevkb.enabled = true\n       main.plugins.plover_link.bt_autoconnect_mac = '00:DE:AD:BE:EF:00,11:DE:AD:BE:EF:11'\n       #----------\n\n## Updating\n       cd ~/stenogotchi\n       git pull\n       pip3 install ~/stenogotchi/plover_plugin/\n\n## Configuration / Troubleshooting\n* Configuration files are placed in /etc/stenogotchi/. Create a separate file named config.toml containing overrides to the defaults. Don't edit default.toml directly as it will be overwritten on Stenogotchi version updates.\n* The logfile is created in /var/log, which dietpi by default mounts to RAM to preserve the SD card lifespan. To make the file persistent across reboots it needs to be written to the disk. To aid with troubleshooting, either set the location to another existing folder using 'main.log.path' in config.toml or change the global dietpi setting using dietpi-software > Log System.\n* If your target device expects a different input language or keyboard layout than US qwerty, use setxkbmap to align it. This should be added to the beginning of your .xinitrc file to run automatically at startup. For German language and dvorak layout for example the below would be used.\n\n      setxkbmap -layout de -variant dvorak\n\n### Bluetooth connections\n* Define your bluetooth devices in main.plugins.plover_link.bt_autoconnect_mac to auto-connect on boot. Multiple comma-separated devices in order of priority can be given. If no connection attempts are successful at boot, the device will fall back to listening for incoming connection and pairing attempts.\n* Only one active connection at a time is supported. To switch remote devices, disable bluetooth on the remote device and wait around 10 seconds before initiating a new connection. The Stenogotchi will attempt to reconnect to the lost device for a few seconds before falling back to listening for new incoming connections.\n* Issues with pairing or connecting after changes in bluetooth configurations can normally be fixed through unpairing and re-pairing. On the Stenogotchi side this is best handled through bluetoothctl using the below process. Re-initiate pairing process from remote device after the pairing information has been cleared on both host and client side.\n    \n        bluetoothctl\n        [bluetooth]# paired-devices\n        Device 00:DE:AD:BE:EF:00 Anodynous' Ipad\n        [bluetooth]# remove 00:DE:AD:BE:EF:00\n        [bluetooth]# exit\n\n### Significantly reduce boot time\n* Set ARM initial turbo to the max (60s) under dietpi-config > performance options to reduce boot time. You can also play around with overclocking, throttling and cpu governor to find a suitable balance between performance and power draw.     \n* Disable dietpi and apt update check at boot:\n          \n       nano /boot/dietpi.txt\n\n       #----------\t\n       CONFIG_CHECK_DIETPI_UPDATES=0\n       CONFIG_CHECK_APT_UPDATES=0\n          \n* Disable waiting for network and time sync at boot. Doing this you should be aware that the RPI0w does not have a hardware clock. It will lose track of real world time as soon it is powered off, making log timestamps or any time based action you may set up unreliable. None of this is important for the core functionality of the Stenogotchi and disabling time-sync at boot can shave up to a minute off the boot process. By adding a cheap I2C hardware clock you can completely remove the need for network sync. Many modules are small enough to fit in the empty space of the UPS-Lite or under the eINK screen. See the [build notes](BUILDNOTES.md) for more directions.\n                        \n       nano /boot/dietpi.txt\n          \n       #----------\n       CONFIG_BOOT_WAIT_FOR_NETWORK=0\n       CONFIG_NTP_MODE=0 \n\n## Usage\n![stenogotchi_2](https://user-images.githubusercontent.com/17461433/107883149-d5539680-6ef5-11eb-86fe-41f0b6293eed.jpg)\n\n### Buttonshim\nBelow long-press (1s) actions are pre-defined. Short-press triggers user configurable terminal commands, e.g. rclone sync of Plover dictionaries with cloud storage.\n \n* Button A - toggle QWERTY / STENO mode\n* Button B - toggle wpm & strokes readings\n* Button C - toggle dictionary lookup mode\n* Button D - toggle wifi (reboot persistent)\n* Button E - shutdown\n\n## Project roadmap\n- [x] Proof of concept. Headless RPI0W running Plover, emulating bluetooth HID device and seamlessly piping steno output over BT to host\n- [x] Create proper plugin for integration with Plover\n- [x] Integrate bluetooth HID server as Stenogotchi plugin\n- [x] Support for eINK display and web UI\n- [x] Support for buttons for built-in and user customizable actions\n- [x] Support for external battery charge readings on UI\n- [x] Create Stenogotchi plugin to capture QWERTY input while blocking Plover\n- [x] ButtonSHIM toggle to enable/disable WIFI, persisting reboot\n- [x] ButtonSHIM toggle between STENO and QWERTY output mode\n- [x] WPM readings for STENO mode\n- [x] Full installation guide for Plover and Stenogotchi using DietPi as base image\n- [x] Dictionary lookup using eINK screen\n- [x] Decrease steno latency\n- [x] Improved web UI, including buttonSHIM functionality\n- [ ] Plover chords for triggering Stenogotchi actions\n- [ ] Dictionary additions using eINK screen\n- [ ] Document configuration options and buttonSHIM functionality\n- [ ] Clean up and optimize code, fix bugs and add test suite\n- [ ] Expand Stenogotchi statuses, reactions and mood indicators\n- [ ] On-the-fly updating and reloading of Plover dictionaries\n- [ ] Simple AI for shaping personality of the Stenogotchi\n- [ ] Proper usage and configuration documentation\n- [ ] Support for other eINK display modules\n\n## Pictures\n![stenogotchi_3](https://user-images.githubusercontent.com/17461433/107877063-cb6c6c00-6ed2-11eb-9f92-9059acd9f66d.jpeg)\n![stenogotchi_4](https://user-images.githubusercontent.com/17461433/107876793-e3db8700-6ed0-11eb-83bb-648b08d1a315.jpeg)\n![stenogotchi_5](https://user-images.githubusercontent.com/17461433/107876790-e0480000-6ed0-11eb-820d-65188cd0a031.jpeg)\n\n## License\nReleased under the GPL3 license.\n"
  },
  {
    "path": "initial_setup.sh",
    "content": "#!/bin/bash\n# Finalize setup of Stenogotchi. Only needs to be run once.\n# Use the below steps if you prefer not executing the automated script or run into issues.\n# ------------------------------------------------------------------------------------------\n#  1) Add configuration file for D-Bus service used by Stenogotchi and the Plover plugin to communicate  \n#cp ./stenogotchi/plover_plugin/stenogotchi_link/com.github.stenogotchi.conf /etc/dbus-1/system.d/\n#  2) Modify service file to remove input bluetooth plugin so it does not grab the sockets Stenogotchi requires access to. \n#    Append '-P input' to existing line in '/lib/systemd/system/bluetooth.service' file to end up with:\n#ExecStart=/usr/libexec/bluetooth/bluetoothd -P input\n#  3) Ensure 'root' user autologin to local terminal is enabled using dietpi-autostart\n#  4) Create file '~/.bash_profile' with the below content (excluding #-characters)\n#if [[ -z $DISPLAY ]] && [[ $(tty) = /dev/tty1 ]]; then\n#  screen -S stenogotchi -dm python3 /root/stenogotchi/stenogotchi.py --debug\n#  xinit\n#fi\n#  5) Create file '~/.xinitrc' with the below content\n#screen -S plover plover -g none -l debug\n#  6) Launch Stenogotchi manually once which will complete setup and reboot device. \n#     Configure settings per preference in '/etc/stenogotchi/config.toml' after reboot.\n#  7) Optional but highly recommended. Reduce boot time by disabling Dietpi and APT update check and setting initial turbo boost to 60s.\n#     In /boot/dietpi.txt set below values:\n#CONFIG_CHECK_DIETPI_UPDATES=0\n#CONFIG_CHECK_APT_UPDATES=0\n#     In /boot/config.txt set:\n#initial_turbo=60\n#  8) Optional but recommended. Reduce boot time further by disabling waiting for network and NTP time sync.\n#     Doing this you should be aware that the RPI0w does not have a hardware clock. It will lose track of real world time as soon it is powered off, making log timestamps or any time based action you may set up unreliable. None of this is important for the core functionality of the Stenogotchi and disabling time-sync at boot can shave up to a minute off the boot process. By adding a cheap I2C hardware clock you can completely remove the need for network sync.\n#     In /boot/dietpi.txt set below values:\n#CONFIG_BOOT_WAIT_FOR_NETWORK=0\n#CONFIG_NTP_MODE=0\n#  9) Launch stenogotchi manually and configure using /etc/stenogotchi/config.toml after reboot has completed\n#python3 ./stenogotchi/stenogotchi.py\n\nFLAG=\"/var/log/_stenogotchi_setup_completed.log\"\nBASEDIR=$(cd `dirname $0` && pwd)\n\n# Check and run script only if it hasn't been done already\nif [ ! -f $FLAG ]; then\n    # Set flag indicating script has been run\n    touch $FLAG\n\n    # Configure bluetooth service\n    printf \"Adding configuration file for D-Bus service used by Stenogotchi and the Plover plugin to communicate.\\n\"\n    sleep 1\n    cp $BASEDIR/plover_plugin/stenogotchi_link/com.github.stenogotchi.conf /etc/dbus-1/system.d/ && printf \"Success!\\n\" || printf \"Failed! \\nPlease manually copy 'com.github.stenogotchi.conf' from stenogotchi_link folder to '/etc/dbus-1/system.d/'\"\n\n    printf \"\\nModifying service file to remove input bluetooth plugin so it does not grab the sockets Stenogotchi requires access to.\\n\"\n    sleep 1\n    # Only add in case not appended yet\n    if ! grep -q \"\\-P input\" /lib/systemd/system/bluetooth.service; then\n        sed '/^ExecStart=/s/$/ -P input/' /lib/systemd/system/bluetooth.service -i.bkp && printf \"Success!\\n\" || printf \"Failed! \\nPlease manually modify existing line in '/lib/systemd/system/bluetooth.service' to 'ExecStart=/usr/lib/bluetooth/bluetoothd -P input' \"\n    else\n        printf \"Skipped! Bluetooth input plugin already disabled\\n\"\n    fi\n\n   # Configure autostart of plover\n    printf \"\\nConfigure Stenogotchi to auto-start at boot. Will run under screen session named 'stenogotchi'\\n\"\n    sleep 1\n    echo \"screen -S plover plover -g none -l debug\" > ~/.xinitrc && printf \"Success!\\n\" || printf \"Failed! \\nPlease manually create file '~/.xinitrc' with contents 'screen -S plover plover -g none -l debug'\"\n\n    # Configure autostart of stenogotchi\n    read -r -d '' AUTOSTART << \"EOM\"\nif [[ -z $DISPLAY ]] && [[ $(tty) = /dev/tty1 ]]; then\n  screen -S stenogotchi -dm python3 /root/stenogotchi/stenogotchi.py --debug\n  xinit\nfi \nEOM\n\n    printf \"\\nConfigure Plover to auto-start at boot. Will run under screen session named 'plover'\\n\"\n    sleep 1\n    echo \"$AUTOSTART\" > ~/.bash_profile && printf \"Success!\\n\" || printf \"Failed! \\nPlease manually create '~/.bash_profile' file with contents \\n\"$AUTOSTART\" \"\n\n    # Optionally: Optimize boot time\n    printf \"\\nReduce boot time by disabling automatic Dietpi and APT update checks. Set initial turbo boost to 60s.\"\n    printf \"\\nSettings can be changed later in '/boot/dietpi.txt' and '/boot/config.txt'\\n\"\n    while true; do\n        read -p \"Do you wish to enable these highly recommended optimizations? (y/n)\" yn\n        case $yn in\n            [Yy]* )\n                sed -i 's/CONFIG_CHECK_DIETPI_UPDATES=.*/CONFIG_CHECK_DIETPI_UPDATES=0/' /boot/dietpi.txt && printf \"set CONFIG_CHECK_DIETPI_UPDATES=0 in /boot/dietpi.txt\\n\";\n                sed -i 's/CONFIG_CHECK_APT_UPDATES=.*/CONFIG_CHECK_APT_UPDATES=0/' /boot/dietpi.txt && printf \"set CONFIG_CHECK_APT_UPDATES=0 in /boot/dietpi.txt\\n\";\n                sed -i 's/initial_turbo=.*/initial_turbo=60/' /boot/config.txt && printf \"set initial_turbo=60 in /boot/config.txt\\n\";\n                break;;\n            [Nn]* ) \n                printf \"Boot optimization skipped. Enable later by setting CONFIG_CHECK_DIETPI_UPDATES=0 and CONFIG_CHECK_APT_UPDATES=0 in /boot/dietpi.txt and initial_turbo=60 in /boot/config.txt\\n\";\n                break;;\n            * ) echo \"Please answer yes or no.\";;\n        esac\n    done\n\n    # Optionally: Disable waiting for network and NTP-sync   \n    printf \"\\nDisable waiting for network and NTP-sync at boot to significantly reduce boot time when networks are unavailable.\"\n    printf \"\\nSettings can be changed later in '/boot/dietpi.txt'\\n\"\n    while true; do\n        read -p \"Do you wish to enable these optimizations? (y/n)\" yn\n        case $yn in\n            [Yy]* )\n                sed -i 's/CONFIG_BOOT_WAIT_FOR_NETWORK=.*/CONFIG_BOOT_WAIT_FOR_NETWORK=0/' /boot/dietpi.txt && printf \"set CONFIG_BOOT_WAIT_FOR_NETWORK=0 in /boot/dietpi.txt\\n\";\n                sed -i 's/CONFIG_NTP_MODE=.*/CONFIG_NTP_MODE=0/' /boot/dietpi.txt && printf \"set CONFIG_NTP_MODE=0 in /boot/dietpi.txt\\n\";\n                break;;\n            [Nn]* ) \n                printf \"Boot optimization skipped. Enable later by setting CONFIG_BOOT_WAIT_FOR_NETWORK=0 and CONFIG_NTP_MODE=0 in /boot/dietpi.txt\\n\";\n                break;;\n            * ) echo \"Please answer yes or no.\";;\n        esac\n    done\n    \n    # Initial launch of Stenogotchi which triggers reboot\n    printf \"\\nFirst time launch of Stenogotchi. Configure settings in /etc/stenogotchi/config.toml after reboot\\n\"\n    sleep 5\n    python3 $BASEDIR/stenogotchi.py\nelse\n    printf \"Setup script has already been executed and should not need to be run again. (Delete '/var/log/_stenogotchi_setup_completed.log' to bypass check)\\n\"\nfi"
  },
  {
    "path": "plover_plugin/setup.cfg",
    "content": "[metadata]\nname = stenogotchi_link\nversion = 0.3.0\ndescription = A plugin for exposing Plover events and communicating with Stenogotchi over D-Bus\nlong_description = \nauthor = Anodynous\nauthor_email = \nlicense = GNU General Public License v3 or later (GPLv3+)\nurl = https://github.com/Anodynous/Stenogotchi\nclassifiers =\n    Development Status :: 4 - Beta\n    Environment :: Plugins\n    Intended Audience :: End Users/Desktop\n    License :: OSI Approved :: GNU General Public License v3 or later (GPLv3+)\n    Operating System :: Linux\n    Programming Language :: Python :: 3\n    Programming Language :: Python :: 3.7\nkeywords = plover plover_plugin stenogotchi\n\n[options]\nzip_safe = True\ninstall_requires =\n    plover>=4.0.0.dev10\n    jsonpickle\n    dbus-python\n    textstat\n    PyGObject\npackages =\n    stenogotchi_link\n\n[options.entry_points]\nplover.extension =\n    stenogotchi_link = stenogotchi_link.stenogotchi_link:EngineServer"
  },
  {
    "path": "plover_plugin/setup.py",
    "content": "from setuptools import setup\n\n\nsetup()"
  },
  {
    "path": "plover_plugin/stenogotchi_link/__init__.py",
    "content": ""
  },
  {
    "path": "plover_plugin/stenogotchi_link/clients.py",
    "content": "#!/usr/bin/env python3\n\nimport plover.log\nimport dbus, dbus.exceptions\nfrom dbus.mainloop.glib import DBusGMainLoop\n\nfrom time import sleep\nfrom threading import Thread\nfrom gi.repository import GLib\n\nfrom Xlib import X, XK\nfrom plover.oslayer.xkeyboardcontrol import KeyboardEmulation, uchr_to_keysym\nfrom plover import key_combo as plover_key_combo\nfrom stenogotchi_link.keymap import plover_convert, plover_modkey\n\nSERVER_DBUS = 'com.github.stenogotchi'\nSERVER_SRVC = '/com/github/stenogotchi'\nERROR_NO_SERVER: str = 'A server is not currently running'\nERROR_SERVER_RUNNING: str = 'A server is already running'\nTIME_SLEEP = 0\n\n\nclass StenogotchiClient:\n    \"\"\" \n    Transmits Plover event updates to, and listens for signals from, Stenogotchi over D-Bus.\n    \"\"\"\n    def __init__(self, engineserver):\n        self._engineserver = engineserver\n        self._setup_dbus_loop()\n        self._setup_object()\n    \n    def _setup_dbus_loop(self):\n        DBusGMainLoop(set_as_default=True)\n        self._mainloop = GLib.MainLoop()\n        self._thread = Thread(target=self._mainloop.run)\n        self._thread.start()\n\n    def _setup_object(self):\n        try:\n            self.bus = dbus.SystemBus()\n            self.stenogotchiobject = self.bus.get_object(SERVER_DBUS, SERVER_SRVC)\n            self.stenogotchi_service = dbus.Interface(self.stenogotchiobject, SERVER_DBUS)\n        \n            # Add signal receiver for incoming messages\n            self.stenogotchi_signal = self.bus.add_signal_receiver(path=SERVER_SRVC,\n                                                                handler_function=self.stenogotchi_signal_handler,\n                                                                dbus_interface=SERVER_DBUS,\n                                                                signal_name='signal_to_plover')\n        except dbus.exceptions.DBusException as e:\n            plover.log.error(f'[stenogotchi_link] Failed to initialize D-Bus object: {str(e)}')\n    \n    def _exit(self):\n        self._mainloop.quit()\n\n    def plover_is_running(self, b):\n        self.stenogotchi_service.plover_is_running(b)\n        # If plover is shutting down, quit mainloop\n        if not b:\n            self._exit()\n\n    def plover_is_ready(self, b):\n        self.stenogotchi_service.plover_is_ready(b)\n\n    def plover_machine_state(self, s):\n        self.stenogotchi_service.plover_machine_state(s)\n\n    def plover_output_enabled(self, b):\n        self.stenogotchi_service.plover_output_enabled(b)\n\n    def plover_wpm_stats(self, s):\n        self.stenogotchi_service.plover_wpm_stats(s)\n\n    def plover_strokes_stats(self, s):\n        self.stenogotchi_service.plover_strokes_stats(s)\n\n    def send_backspaces(self, y):\n        self.stenogotchi_service.send_backspaces_stenogotchi(y)\n\n    def send_string(self, s):\n        self.stenogotchi_service.send_string_stenogotchi(s)\n\n    def send_key_combination(self, s):\n        self.stenogotchi_service.send_key_combination_stenogotchi(s)\n\n    def send_lookup_results(self, l):\n        self.stenogotchi_service.plover_translation_handler(l)\n\n    def stenogotchi_signal_handler(self, dict):\n        # Enable and disable wpm/strokes meters\n        if 'lookup_word' in dict:\n            self._engineserver.lookup_word(dict['lookup_word'])\n        if 'lookup_stroke' in dict:\n            self._engineserver.lookup_stroke(dict['lookup_stroke'])\n        if 'output_to_stenogotchi' in dict:\n            self._engineserver._output_to_stenogotchi = dict['output_to_stenogotchi']\n        if 'start_wpm_meter' in dict:\n            wpm_method = dict['wpm_method']\n            wpm_timeout = int(dict['wpm_timeout'])\n            plover.log.info('[stenogotchi_link] Starting WPM meter')\n            if dict['start_wpm_meter'] == 'wpm and strokes':\n                self._engineserver.start_wpm_meter(enable_wpm=True, enable_strokes=True, wpm_method=wpm_method, wpm_timeout=wpm_timeout)\n            elif dict['start_wpm_meter'] == 'wpm':\n                self._engineserver.start_wpm_meter(enable_wpm=True, enable_strokes=False, wpm_method=wpm_method, wpm_timeout=wpm_timeout)\n            elif dict['start_wpm_meter'] == 'strokes':\n                self._engineserver.start_wpm_meter(enable_wpm=False, enable_strokes=True, wpm_method=wpm_method, wpm_timeout=wpm_timeout)\n        if 'stop_wpm_meter' in dict:\n            plover.log.info('[stenogotchi_link] Stopping WPM meter')\n            if dict['stop_wpm_meter'] == 'wpm and strokes':\n                self._engineserver.stop_wpm_meter(disable_wpm=True, disable_strokes=True)\n            elif dict['stop_wpm_meter'] == 'wpm':\n                self._engineserver.stop_wpm_meter(disable_wpm=True, disable_strokes=False)\n            elif dict['stop_wpm_meter'] == 'strokes':\n                self._engineserver.stop_wpm_meter(disable_wpm=False, disable_strokes=True)\n\nclass CustomKeyboardEmulation(KeyboardEmulation):\n    \"\"\" \n    We use the Plover implementation, but change _update_keymap()\n    to prefer lower keycode rather than low modkeys combos in mapping.\n    This way we avoid some issues when mapping to BT HID keycodes.\n    \"\"\"\n    def _update_keymap(self):\n        '''Analyse keymap, build a mapping of keysym to (keycode + modifiers),\n        and find unused keycodes that can be used for unmapped keysyms.\n        '''\n        self._keymap = {}\n        self._custom_mappings_queue = []\n        # Analyse X11 keymap.\n        keycode = self._display.display.info.min_keycode\n        keycode_count = self._display.display.info.max_keycode - keycode + 1\n        for mapping in self._display.get_keyboard_mapping(keycode, keycode_count):\n            mapping = tuple(mapping)\n            while mapping and X.NoSymbol == mapping[-1]:\n                mapping = mapping[:-1]\n            if not mapping:\n                # Free never used before keycode.\n                custom_mapping = [self.UNUSED_KEYSYM] * self.CUSTOM_MAPPING_LENGTH\n                custom_mapping[-1] = self.PLOVER_MAPPING_KEYSYM\n                mapping = custom_mapping\n            elif self.CUSTOM_MAPPING_LENGTH == len(mapping) and \\\n                    self.PLOVER_MAPPING_KEYSYM == mapping[-1]:\n                # Keycode was previously used by Plover.\n                custom_mapping = list(mapping)\n            else:\n                # Used keycode.\n                custom_mapping = None\n            for keysym_index, keysym in enumerate(mapping):\n                if keysym == self.PLOVER_MAPPING_KEYSYM:\n                    continue\n                if keysym_index not in (0, 1, 4, 5):\n                    continue\n                modifiers = 0\n                if 1 == (keysym_index % 2):\n                    # The keycode needs the Shift modifier.\n                    modifiers |= X.ShiftMask\n                if 4 <= keysym_index <= 5:\n                    # 3rd (AltGr) level.\n                    modifiers |= X.Mod5Mask\n                mapping = self.Mapping(keycode, modifiers, keysym, custom_mapping)\n                if keysym != X.NoSymbol and keysym != self.UNUSED_KEYSYM:\n                    # Some keysym are mapped multiple times, prefer lower keycode (Plover prefers lower modifiers combos).\n                    previous_mapping = self._keymap.get(keysym)\n                    if previous_mapping is None or mapping.keycode < previous_mapping.keycode:\n                        self._keymap[keysym] = mapping\n                if custom_mapping is not None:\n                    self._custom_mappings_queue.append(mapping)\n            keycode += 1\n        # Determine the backspace mapping.\n        backspace_keysym = XK.string_to_keysym('BackSpace')\n        self._backspace_mapping = self._get_mapping(backspace_keysym)\n        assert self._backspace_mapping is not None\n        assert self._backspace_mapping.custom_mapping is None\n        # Get modifier mapping.\n        self.modifier_mapping = self._display.get_modifier_mapping()\n\nclass BTClient:\n    \"\"\"\n    Transmits keystroke output from Plover to Stenogotchi as HID messages over D-Bus.\n    \"\"\"\n    def __init__(self):\n        self.target_length = 6\n        self.mod_keys = 0b00000000\n        self.pressed_keys = []\n        self.bus = dbus.SystemBus()\n        self.btkobject = self.bus.get_object(SERVER_DBUS, SERVER_SRVC)\n        self.btk_service = dbus.Interface(self.btkobject, SERVER_DBUS)\n        self.ke = CustomKeyboardEmulation()\n        self._backspace_mapping_hid = plover_convert(self.ke._backspace_mapping.keycode)\n\n\n    def update_mod_keys(self, mod_key, value):\n        \"\"\"\n        Which modifier keys are active is stored in an 8 bit number. \n        Each bit represents a different key. This method takes which bit\n        and its new value as input\n        :param mod_key: The value of the bit to be updated with new value\n        :param value: Binary 1 or 0 depending if pressed or released\n        \"\"\"\n        bit_mask = 1 << (7-mod_key)\n        if value: # set bit\n            self.mod_keys |= bit_mask\n        else: # clear bit\n            self.mod_keys &= ~bit_mask\n\n    def update_keys(self, norm_key, value):\n        \"\"\"\n        Sets the active normal keys\n        \"\"\"\n        if norm_key < 0:    # Log for debug purposes in case keycode isn't valid\n            plover.log.error(f\"[stenogotchi_link] KeyError in update_keys, unable to send keycode: {norm_key}\")\n            return\n        if value < 1:\n            self.pressed_keys.remove(norm_key)\n        elif norm_key not in self.pressed_keys:\n            self.pressed_keys.insert(0, norm_key)\n        len_delta = self.target_length - len(self.pressed_keys)\n        if len_delta < 0:\n            self.pressed_keys = self.pressed_keys[:len_delta]\n        elif len_delta > 0:\n            self.pressed_keys.extend([0] * len_delta)\n    \n    @property\n    def state(self):\n        \"\"\"\n        property with the HID message to be sent\n        :return: bytes of HID message\n        \"\"\"\n        return [0xA1, 0x01, self.mod_keys, 0, *self.pressed_keys]\n\n    def clear_mod_keys(self):\n        self.mod_keys = 0b00000000\n\n    def clear_keys(self):\n        self.pressed_keys = []\n\n    def send_keys(self, state_list=None):\n        if not state_list:\n            self.btk_service.send_keys([state_list])\n        else:\n            flat_list = state_list\n            self.btk_service.send_keys(flat_list)\n\n    def send_backspaces(self, number_of_backspaces):\n        self.clear_keys()\n        self.clear_mod_keys()\n        state_list = []\n        for x in range(number_of_backspaces):\n            self.update_keys(self._backspace_mapping_hid, 1)\n            state_list.append(self.state)\n            self.update_keys(self._backspace_mapping_hid, 0)\n            state_list.append(self.state)\n        self.send_keys(state_list)\n        \n\n    def map_hid_events(self, keycode, modifiers=None):\n        \"\"\" Returns a list of HID bytearrays to produce the key combination.\n        \n        Arguments:\n        keycode -- An integer in the inclusive range [8-255].\n        modifiers -- An 8-bit bit mask indicating if the key\n        pressed is modified by other keys, such as Shift, Capslock,\n        Control, and Alt.\n        TODO: International, accented characters and a range of symbols are not working with the US keyboard layout. \n            Could be solved using Alt codes on Windows, but Mac/iOS uses different Option codes. Complicated to solve \n            in a clean way as we only emulate a BT keyboard and all characters must be produced on the remote host.\n            -> Look into separate WIN/MAC translation tables. Profiles which can be linked to BT MAC adresses.\n        \"\"\"\n        self.clear_keys()\n        self.clear_mod_keys()\n        state_sublist = []\n        #modifiers_list = [\n        #    self.ke.modifier_mapping[n][0]\n        #    for n in range(8)\n        #    if (modifiers & (1 << n))\n        #]\n        #for mod_keycode in modifiers_list:\n        #    self.update_mod_keys(plover_modkey(mod_keycode), 1)\n             \n        normkey_hid = plover_convert(keycode)\n        # Log issues with mapping any keycodes\n        if normkey_hid < 0:\n            plover.log.error(f\"[stenogotchi_link] Unable to map keycode: {keycode} using plover_convert in keymap.py.\")\n            return\n        if modifiers:\n            modkey_hid = plover_modkey(modifiers)\n            if modkey_hid < 0:\n                plover.log.error(f\"[stenogotchi_link] Unable to map keycode: {keycode} using plover_modkey in keymap.py.\")\n\n        # Apply modifiers\n        if modifiers:\n            # TODO: Handle combination of modifiers. 129 for example is shift (1) + AltGr (128)\n            self.update_mod_keys(modkey_hid, 1)\n        # Press and release the base key.\n        self.update_keys(normkey_hid, 1)\n        state_sublist.append(self.state)\n        sleep(TIME_SLEEP)\n        self.update_keys(normkey_hid, 0)\n        state_sublist.append(self.state)\n        # Release modifiers\n        if modifiers > 0:\n            self.update_mod_keys(modkey_hid, 0)\n            state_sublist.append(self.state)\n        \n        return state_sublist\n        #for mod_keycode in reversed(modifiers_list):\n        #    self.update_mod_keys(plover_modkey(mod_keycode), 0)\n        \n    \n    def send_string(self, s):\n        state_list = []\n        for char in s:\n            keysym = uchr_to_keysym(char)\n            mapping = self.ke._get_mapping(keysym)\n            #plover.log.debug(f\"[stenogotchi_link] mapping : '{mapping}' mapping.keycode : '{mapping.keycode}' and mapping.modifier : '{mapping.modifiers}' (for keysym : '{keysym}' given char : '{char}')\")\n            if mapping is None:\n                continue\n            sublist = self.map_hid_events(mapping.keycode, mapping.modifiers)\n            if sublist:\n                state_list.extend(sublist)\n        if len(state_list) > 0:\n            self.send_keys(state_list)\n        \n    def send_key_combination(self, combo_string: str):\n        \"\"\"\n        Custom implementation of Plover send_key_combination function\n        since we do not work with emulated key events or need to fight\n        with a KeyboardCapture instance. \n        \n        Arguments:\n\n        combo_string -- A string representing a sequence of key\n        combinations. Keys are represented by their names in the\n        Xlib.XK module, without the 'XK_' prefix. For example, the\n        left Alt key is represented by 'Alt_L'. Keys are either\n        separated by a space or a left or right parenthesis.\n        Parentheses must be properly formed in pairs and may be\n        nested. A key immediately followed by a parenthetical\n        indicates that the key is pressed down while all keys enclosed\n        in the parenthetical are pressed and released in turn. For\n        example, Alt_L(Tab) means to hold the left Alt key down, press\n        and release the Tab key, and then release the left Alt key.\n        \"\"\"\n        self.clear_keys()\n        self.clear_mod_keys()\n        state_list = []\n\n        # Parse and validate combo.\n        key_events = [\n            (keycode, 1 if pressed else 0) for keycode, pressed\n            in plover_key_combo.parse_key_combo(combo_string, self.ke._get_keycode_from_keystring)\n        ]\n       \n        # Send key events to emulate combination.\n        for keycode, event_type in key_events:\n            # Convert to HID\n            normkey_hid = plover_convert(keycode)\n            if normkey_hid == -1:\n                modkey_hid = plover_modkey(keycode)\n            else:\n                modkey_hid = -1\n\n            # Update and send keycode if mapped, otherwise log\n            if modkey_hid > -1:\n                self.update_mod_keys(modkey_hid, event_type)\n                state_list.append(self.state)\n            elif normkey_hid > -1:\n                self.update_keys(normkey_hid, event_type)\n                state_list.append(self.state)\n            else:\n                plover.log.debug(f\"[stenogotchi_link]Received key_combination from Plover: {combo_string}, resulting in key_events: {key_events}\")\n                plover.log.error(f\"Unable to map keycode: {keycode}, in keymap.py (event_type: {event_type})\")\n        self.send_keys(state_list)\n"
  },
  {
    "path": "plover_plugin/stenogotchi_link/com.github.stenogotchi.conf",
    "content": "<!DOCTYPE busconfig PUBLIC\n \"-//freedesktop//DTD D-BUS Bus Configuration 1.0//EN\"\n \"http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd\">\n<busconfig>\n        <policy context=\"default\">\n                <allow own=\"com.github.stenogotchi\"/>\n                <allow send_destination=\"com.github.stenogotchi\"/>\n        </policy>\n</busconfig>\n"
  },
  {
    "path": "plover_plugin/stenogotchi_link/keymap.py",
    "content": "# Find HID keycode mapping here: https://www.usb.org/sites/default/files/documents/hut1_12v2.pdf\n# Linux keycodes can be found in /usr/share/X11/xkb/keycodes/evdev\n\n# Linux keycode used by Plover : HID keycode used for BT\nplover_keytable = {\n    # Function row.\n    67: 58,     #\"F1\",\n    68: 59,     #\"F2\",\n    69: 60,     #\"F3\",\n    70: 61,     #\"F4\",\n    71: 62,     #\"F5\",\n    72: 63,     #\"F6\",\n    73: 64,     #\"F7\",\n    74: 65,     #\"F8\",\n    75: 66,     #\"F9\",\n    76: 67,     #\"F10\",\n    95: 68,     #\"F11\",\n    96: 69,     #\"F12\",\n    # Number row.\n    49: 53,     #\"`\",\n    10: 30,     #\"1\",\n    11: 31,     #\"2\",\n    12: 32,     #\"3\",\n    13: 33,     #\"4\",\n    14: 34,     #\"5\",\n    15: 35,     #\"6\",\n    16: 36,     #\"7\",\n    17: 37,     #\"8\",\n    18: 38,     #\"9\",\n    19: 39,     #\"0\",\n    20: 45,     #\"-\",\n    21: 46,     #\"=\",\n    51: 50,     #\"\\\\\",\n    # Upper row.\n    24: 20,     #\"q\",\n    25: 26,     #\"w\",\n    26: 8,      #\"e\",\n    27: 21,     #\"r\",\n    28: 23,     #\"t\",\n    29: 28,     #\"y\",\n    30: 24,     #\"u\",\n    31: 12,     #\"i\",\n    32: 18,     #\"o\",\n    33: 19,     #\"p\",\n    34: 47,     #\"[\",\n    35: 48,     #\"]\",\n    # Home row.\n    38: 4,      #\"a\",\n    39: 22,     #\"s\",\n    40: 7,      #\"d\",\n    41: 9,      #\"f\",\n    42: 10,     #\"g\",\n    43: 11,     #\"h\",\n    44: 13,     #\"j\",\n    45: 14,     #\"k\",\n    46: 15,     #\"l\",\n    47: 51,     #\";\",\n    48: 52,     #\"'\",\n    # Bottom row.\n    52: 29,     #\"z\",\n    53: 27,     #\"x\",\n    54: 6,      #\"c\",\n    55: 25,     #\"v\",\n    56: 5,      #\"b\",\n    57: 17,     #\"n\",\n    58: 16,     #\"m\",\n    59: 54,     #\",\",\n    60: 55,     #\".\",\n    61: 56,     #\"/\",\n    # Other keys.\n    22 : 42,    #\"BackSpace\",\n    119: 76,    #\"Delete\",\n    116: 81,    #\"Down\",\n    115: 77,    #\"End\",\n    9  : 41,    #\"Escape\",\n    110: 74,    #\"Home\",\n    118: 73,    #\"Insert\",\n    113: 80,    #\"Left\",\n    117: 78,    #\"Page_Down\",\n    112: 75,    #\"Page_Up\",\n    36 : 40,    #\"Return\",\n    114: 79,    #\"Right\",\n    23 : 43,    #\"Tab\",\n    111: 82,    #\"Up\",\n    65 : 44,    #\"Space\",\n    66 : 57,     #Caps_Lock,\n    #\"KEY_BACK\": 241,\n    #\"KEY_FORWARD\": 242,\n    #\"KEY_REFRESH\": 250,\n    #\"KEY_SYSRQ\": 70,\n    # Keypad keys\n    #\"KEY_NUMLOCK\": 83,\n    #\"KEY_SCROLLLOCK\": 71,\n    79: 95,     #kp_7 - \"KEY_KP7\"\n    80: 96,     #kp_8 - \"KEY_KP8\"\n    81: 97,     #kp_9 - \"KEY_KP9\"\n    #\"KEY_KPMINUS\": 86,\n    83: 92,     #kp_4 - \"KEY_KP4\"\n    84: 93,     #kp_5 - \"KEY_KP5\"\n    85: 94,     #kp_6 - \"KEY_KP6\"\n    #\"KEY_KPPLUS\": 87,\n    87: 89,     #kp_1 - \"KEY_KP1\"\n    88: 90,     #kp_2 - \"KEY_KP2\"\n    89: 91,     #kp_3 - \"KEY_KP3\"\n    90: 98,     #kp_0 - \"KEY_KP0\"\n    126: 215,   # \"Keypad ±\"\n    #\"KEY_KPDOT\": 99,\n    \n    # TODO: Media keys not working correctly\n    # Media keys\n    172: 232,   # AudioPlay - \"KEY_PLAYPAUSE\"\n    209: 232,   # AudioPause - \"KEY_PLAYPAUSE\"\n    121: 239,   # AudioMute - \"KEY_MUTE\"\n    122: 238,   #AudioLowerVolume - \"KEY_VOLUMEDOWN\"\n    123: 237,   #AudioRaiseVolume - \"KEY_VOLUMEUP\"\n    173: 234,   #AudioPrev - \"KEY_PREVIOUSSONG\"\n    171: 235,   #AudioNext - \"KEY_NEXTSONG\"\n    174: 233,   #AudioStop - \"KEY_STOPCD\"\n    169: 236,   #Eject - \"KEY_EJECTCD\"\n}\n\n# Map modifier keys to array element in the bit array\nplover_modkeys = {\n    # TODO: AltGr will not on MacOS/iOs/iPadOS produce expected character.\n    134: 0,     #Super_R - \"KEY_RIGHTMETA\", WIN-key\n    128: 1,     #\"KEY_RIGHTALT\", AltGr used to produce some symbols\n    62: 2,      #\"KEY_RIGHTSHIFT\"\n    105: 3,     #\"KEY_RIGHTCTRL\"\n    133: 4,     #Super_L - \"KEY_LEFTMETA\", WIN-key\n    64: 5,      #\"KEY_LEFTALT\"\n    50 : 6,     #\"KEY_LEFTSHIFT\"\n    1 : 6,      #\"KEY_LEFTSHIFT\", mapped to both 50 and 1 as '1' is used by Plover as shift modifier to capitalize letters and '50' when sent in key-combo\n    37: 7       #\"KEY_LEFTCTRL\"\n}\n\ndef plover_convert(plover_keycode):\n    if plover_keycode in plover_keytable:\n        return plover_keytable[plover_keycode]\n    else:\n        return -1  # Return an invalid keycode\n\ndef plover_modkey(plover_keycode):\n    if plover_keycode in plover_modkeys:\n        return plover_modkeys[plover_keycode]\n    else:\n        return -1  # Return an invalid array element  "
  },
  {
    "path": "plover_plugin/stenogotchi_link/stenogotchi_link.py",
    "content": "#!/usr/bin/env python3\n# This is a Plover plugin acting as link between Plover and Stenogotchi\n# Based on: https://github.com/nsmarkop/plover_websocket_server\n\nimport plover.log\nimport json\nimport jsonpickle\nfrom typing import Optional, List\nfrom time import sleep\n\nfrom plover.engine import StenoEngine\nfrom plover.steno import Stroke\nfrom plover.config import Config\nfrom plover.formatting import _Action\nfrom plover.steno_dictionary import StenoDictionaryCollection\n\nfrom stenogotchi_link.clients import BTClient, StenogotchiClient\nfrom stenogotchi_link.wpm import PloverWpmMeter, PloverStrokesMeter\n\n\nERROR_MISSING_ENGINE = 'Plover engine not provided'\n\n\nclass EngineServer():\n    \"\"\"\n    Hooks into Plover events and makes them available to Stenogotchi.\n    \"\"\"\n\n    # Called once to initialize an instance which lives until Plover exits\n    def __init__(self, engine: StenoEngine) -> None:\n        self._engine: StenoEngine = engine\n        self._stenogotchiclient = StenogotchiClient(self)\n        self._btclient = BTClient()\n        self._wpm_meter = None\n        self._strokes_meter = None\n        self._output_to_stenogotchi = False\n\n    # Started when user enables extension\n    def start(self):\n        \"\"\" Starts the server. \"\"\"\n        self._connect_hooks()\n        plover.log.info(\"[stenogotchi_link] Plover_link started\")\n        self._stenogotchiclient.plover_is_running(True)\n\n    # Called when Plover exits or user disables the extension\n    def stop(self):\n        \"\"\" Stops the server. \"\"\"\n        self._disconnect_hooks()\n        self._stenogotchiclient.plover_is_running(False)\n\n    def start_wpm_meter(self, enable_wpm=False, enable_strokes=False, wpm_method='ncra', wpm_timeout=60):\n        \"\"\" Starts WPM and/or Strokes meters\n        \"\"\"\n        if enable_wpm:\n            self._wpm_meter = PloverWpmMeter(stenogotchi_link=self, wpm_method=wpm_method, timeout=wpm_timeout)\n        if enable_strokes:\n            self._strokes_meter = PloverStrokesMeter(stenogotchi_link=self, strokes_method=wpm_method, timeout=wpm_timeout)\n\n    def stop_wpm_meter(self, disable_wpm=True, disable_strokes=True):\n        if disable_wpm:\n            self._wpm_meter.quit()\n            self._wpm_meter = None\n        if disable_strokes:\n            self._strokes_meter.quit()\n            self._strokes_meter = None\n\n    def _on_wpm_meter_update_strokes(self, stats):\n        \"\"\" Sends strokes stats to stenogotchi as a string \"\"\"\n        self._stenogotchiclient.plover_strokes_stats(stats['strokes_user'])\n\n    def _on_wpm_meter_update_wpm(self, stats):\n        \"\"\" Sends wpm stats to stenogotchi as a string \"\"\"\n        self._stenogotchiclient.plover_wpm_stats(stats['wpm_user'])\n\n    def _on_plover_translation(self, results, type):\n        \"\"\" Sends translation results from Plover to stenogotchi as list of strings\"\"\"\n        if type == 'word':  # Result from Plover will be in format List[Tuple[str]], examine: {('EBGS', 'APL', '*EUPB'), ('KP*PL',), ('KPAPL', 'PHEUPB'), ('KPAPL', '-PB'), ('KP-PB',), ('EBGS', 'APL', '-PB'), ('KP',), ('EBGS', 'APL', 'PHEUPB'), ('EBGS', 'APL', 'EUPB')}\n            results_list = []\n            chords = None\n            for touple in results:\n                if chords:\n                    results_list.append(chords)\n                    chords = None\n                for result in touple:\n                    if chords:\n                        chords = chords + '/' + result\n                    else:\n                        chords = result\n            if chords:\n                results_list.append(chords)\n                chords = None\n        elif type == 'stroke':  # Result from Plover will be in format str\n            # TODO: implement functionality for stroke-lookup\n            plover.log.debug(f\"Lookup_stroke results: {results}\")\n            results_list = [results]\n        self._stenogotchiclient.send_lookup_results(results_list)\n    \n    def lookup_word(self, word):\n        matches = self._engine.reverse_lookup(word)\n        self._on_plover_translation(matches, 'word')\n\n    def lookup_stroke(self, stroke):\n        matches = self._engine.lookup(stroke)\n        self._on_plover_translation(matches, 'stroke')\n\n    def get_server_status(self):\n        \"\"\"Gets the status of the server.\n        Returns: \n            The status of the server.\n        \"\"\"\n        pass\n\n    def _connect_hooks(self):\n        \"\"\"Creates hooks into all of Plover's events.\"\"\"\n\n        if not self._engine:\n            plover.log.error(f'[stenogotchi_link] {ERROR_MISSING_ENGINE}')\n            raise AssertionError(ERROR_MISSING_ENGINE)\n            \n        for hook in self._engine.HOOKS:\n            callback = getattr(self, f'_on_{hook}')\n            self._engine.hook_connect(hook, callback)\n\n    def _disconnect_hooks(self):\n        \"\"\"Removes hooks from all of Plover's events.\"\"\"\n        \n        if not self._engine:\n            raise AssertionError(ERROR_MISSING_ENGINE)\n\n        for hook in self._engine.HOOKS:\n            callback = getattr(self, f'_on_{hook}')\n            self._engine.hook_disconnect(hook, callback)\n    \n    def _on_stroked(self, stroke: Stroke):\n        \"\"\" Broadcasts when a new stroke is performed. \"\"\"\n        \n        pass\n\n    def _on_translated(self, old: List[_Action], new: List[_Action]):\n        \"\"\"Broadcasts when a new translation occurs.\n        Args:\n            old: A list of the previous actions for the current translation.\n            new: A list of the new actions for the current translation.\n        \"\"\"\n        \n        # Send to WPM meter if we have one\n        if self._wpm_meter:\n            self._wpm_meter.on_translation(old, new)\n        # Send to Strokes meter if we have one\n        if self._strokes_meter:\n            self._strokes_meter.on_translation(old, new)\n\n        # print(self._wpm_meter.get_stats())\n        # print(self._strokes_meter.get_stats())\n\n    def _on_machine_state_changed(self, machine_type: str, machine_state: str):\n        \"\"\"Broadcasts when the active machine state changes.\n        Args:\n            machine_type: The name of the active machine.\n            machine_state: The new machine state. This should be one of the\n                state constants listed in plover.machine.base.\n        \"\"\"\n        \n        self._stenogotchiclient.plover_machine_state(\"machine_type: \" + machine_type + \" machine_state: \" + machine_state)\n\n    def _on_output_changed(self, enabled: bool):\n        \"\"\"Broadcasts when the state of output changes.\n        Args:\n            enabled: If the output is now enabled or not.\n        \"\"\"\n\n        data = {'output_changed': enabled}\n        plover.log.debug(f'[stenogotchi_link] _on_output_changed data: {data}')\n        self._stenogotchiclient.plover_output_enabled(enabled)\n        \n\n    def _on_config_changed(self, config_update: Config):\n        \"\"\"Broadcasts when the configuration changes.\n        Args:\n            config_update: An object containing the full configuration or a\n                part of the configuration that was updated.\n        \"\"\"\n\n        config_json = jsonpickle.encode(config_update, unpicklable=False)\n\n        data = {'config_changed': json.loads(config_json)}\n        plover.log.debug(f'[stenogotchi_link] _on_config_changed data: {data}')\n\n    def _on_dictionaries_loaded(self, dictionaries: StenoDictionaryCollection):\n        \"\"\"Broadcasts when all of the dictionaries get loaded.\n        Args:\n            dictionaries: A collection of the dictionaries that loaded.\n        \"\"\"\n\n        self._stenogotchiclient.plover_is_ready(True)\n\n    def _on_send_string(self, text: str):\n        \"\"\"Broadcasts when a new string is output.\n        Args:\n            text: The string that was output.\n        \"\"\"\n        if self._output_to_stenogotchi:\n            self._stenogotchiclient.send_string(text)\n        else:\n            self._btclient.send_string(text)\n\n    def _on_send_backspaces(self, count: int):\n        \"\"\"Broadcasts when backspaces are output.\n        Args:\n            count: The number of backspaces that were output.\n        \"\"\"\n        if self._output_to_stenogotchi:\n            self._stenogotchiclient.send_backspaces(count)\n        else:\n            self._btclient.send_backspaces(count)\n\n    def _on_send_key_combination(self, combination: str):\n        \"\"\"Broadcasts when a key combination is output.\n        Args:\n            combination: A string representing a sequence of key combinations.\n                Keys are represented by their names based on the OS-specific\n                keyboard implementations in plover.oslayer.\n        \"\"\"\n        if self._output_to_stenogotchi:\n            self._stenogotchiclient.send_key_combination(combination)\n        else:\n            self._btclient.send_key_combination(combination)\n\n    def _on_add_translation(self):\n        \"\"\"Broadcasts when the add translation tool is opened via a command.\"\"\"\n\n        data = {'add_translation': True}\n        plover.log.debug(f'[stenogotchi_link] _on_add_translation data: {data}')\n        \n    def _on_focus(self):\n        \"\"\"Broadcasts when the main window is focused via a command.\"\"\"\n\n        data = {'focus': True}\n        plover.log.debug(f'[stenogotchi_link] _on_focus data: {data}')\n\n    def _on_configure(self):\n        \"\"\"Broadcasts when the configuration tool is opened via a command.\"\"\"\n\n        data = {'configure': True}\n        plover.log.debug(f'[stenogotchi_link] _on_configure data: {data}')\n\n    def _on_lookup(self):\n        \"\"\"Broadcasts when the lookup tool is opened via a command.\"\"\"\n\n        data = {'lookup': True}\n        plover.log.debug(f'[stenogotchi_link] _on_lookup data: {data}')\n\n    def _on_suggestions(self):\n        \"\"\"Broadcasts when the lookup tool is opened via a command.\"\"\"\n\n        data = {'suggestions': True}\n        plover.log.debug(f'[stenogotchi_link] _on_lookup data: {data}')\n\n    def _on_quit(self):\n        \"\"\"Broadcasts when the application is terminated.\n        Can be either a full quit or a restart.\n        \"\"\"\n\n        data = {'quit': True}\n        plover.log.debug(f'[stenogotchi_link] _on_quit data: {data}')\n        self._stenogotchiclient.plover_is_running(False)\n\n\nif __name__ == '__main__':\n    print(\"Please enable and run as Plover plugin\")\n"
  },
  {
    "path": "plover_plugin/stenogotchi_link/wpm.py",
    "content": "#!/usr/bin/env python3\n#\n# Based on: https://github.com/arxanas/plover_wpm_meter.git, modified to remove QT dependency.\n# \n# This is a plugin for Plover to display your typing speed as you type, in either or both of words per minute or strokes per minute:\n##  Words per minute: Shows the rate at which you stroked words in the last 10 and 60 seconds.\n##  Strokes per minute: Shows how efficiently you stroked words in the last 10 and 60 seconds. Lower values are more efficient, e.g. a value of 1 means that on average it took you one stroke to write out a word.\n#\n# A word is defined in one of three ways:\n##    NCRA: The National Court Reporters Association defines a “word” as 1.4 syllables. This is the measure used for official NCRA testing material.\n##    Traditional: The traditional metric for “word” in the context of keyboarding is defined to be 5 characters per word, including spaces. This is compatible with the notion of “word” in many typing speed utilities.\n##    Spaces: A word is a whitespace-separated sequence of characters. This metric of course doesn’t take into account the fact that some words are longer than others, both in length and syllables.\n\nimport time\nfrom threading import Timer\nfrom textstat.textstat import textstat\n\nfrom plover.formatting import OutputHelper\n\nclass RepeatTimer(Timer):\n    \"\"\" \n    Perpetually repeating timer implementation of threading.Timer\n    \"\"\"  \n\n    def run(self):\n        while not self.finished.wait(self.interval):\n            self.function(*self.args, **self.kwargs)\n\nclass CaptureOutput(object):\n   \n    def __init__(self, chars):\n        self.chars = chars\n\n    def send_backspaces(self, n):\n        del self.chars[-n:]\n\n    def send_string(self, s):\n        self.chars += _timestamp_items(s)\n\n    def send_key_combination(self, c):\n        pass\n\n    def send_engine_command(self, c):\n        pass\n\n\nclass BaseMeter():\n  \n    def __init__(self, timeout=60):\n        # Set timer to calculate wpm/strokes stats each second\n        self._timer = RepeatTimer(1, self.on_timer)\n        self._timer.start()\n        # Set timer to publish wpm/strokes stats each minute\n        self._event_timer = RepeatTimer(timeout, self.trigger_event_update)\n        self._event_timer.start()\n        self.chars = []\n\n    def on_translation(self, old, new):\n        output = CaptureOutput(self.chars)\n        output_helper = OutputHelper(output, False, False)\n        output_helper.render(None, old, new)\n\n    def on_timer(self):\n        raise NotImplementedError()\n\n    def trigger_event_update(self):\n        raise NotImplementedError()\n\n    def quit(self):\n        self._timer.cancel()\n        self._event_timer.cancel()\n\nclass PloverWpmMeter(BaseMeter):\n\n    def __init__(self, stenogotchi_link, wpm_method='ncra', timeout=60):\n        super().__init__(timeout)\n        self._stenogotchi_link = stenogotchi_link\n        self.strokes = []\n        self.wpm_methods = {\n            'ncra': False,          # NCRA (by syllables)\n            'traditional': False,   # Traditional (by characters)\n            'spaces': False,        # Spaces (by whitespace)\n        }\n        self._timeouts = {\n            \"wpm10\": 10,\n            \"wpm_user\": timeout,\n        }\n        self.set_wpm_method(wpm_method)\n        self.wpm_stats = {}\n\n    def set_wpm_method(self, method):\n        self.wpm_methods = dict.fromkeys(self.wpm_methods, False)\n        self.wpm_methods[method] = True\n\n    def get_wpm_method(self):\n        for method, enabled in self.wpm_methods.items():\n            if enabled:\n                return method\n\n    def get_stats(self):\n        return self.wpm_stats\n\n    def on_timer(self):\n        max_timeout = max(self._timeouts.values())\n        self.chars = _filter_old_items(self.chars, max_timeout)\n        for name, timeout in self._timeouts.items():\n            chars = _filter_old_items(self.chars, timeout)\n            wpm = _wpm_of_chars(chars, method=self.get_wpm_method())\n            self.wpm_stats[name] = str(wpm)\n\n    def trigger_event_update(self):\n        self._stenogotchi_link._on_wpm_meter_update_wpm(stats=self.wpm_stats)\n        \n\nclass PloverStrokesMeter(BaseMeter):\n\n    def __init__(self, stenogotchi_link, strokes_method='ncra', timeout=60):\n        super().__init__(timeout)\n        self._stenogotchi_link = stenogotchi_link\n        self.actions = []\n        self.strokes_methods = {\n            'ncra': False,          # NCRA (by syllables)\n            'traditional': False,   # Traditional (by characters)\n            'spaces': False,        # Spaces (by whitespace)\n        }\n        self._timeouts = {\n            \"strokes10\": 10,\n            \"strokes_user\": timeout,\n        }\n        self.set_strokes_method(strokes_method)\n        self.strokes_stats = {}\n       \n        # By default, the QLCDNumbers will just display \"0\", without a decimal\n        # point, on initial render. Render them ourselves so that we don't\n        # switch from \"0\" to \"0.00\" after a second.\n        self.on_timer()\n\n    def set_strokes_method(self, method):\n        self.strokes_methods = dict.fromkeys(self.strokes_methods, False)\n        self.strokes_methods[method] = True\n\n    def get_strokes_method(self):\n        for method, enabled in self.strokes_methods.items():\n            if enabled:\n                return method\n\n    def get_stats(self):\n        return self.strokes_stats\n\n    def on_translation(self, old, new):\n        super().on_translation(old, new)\n        if len(old) > 0:\n            self.actions = self.actions[:-len(old)]\n        self.actions += _timestamp_items(new)\n\n    def on_timer(self):\n        max_timeout = max(self._timeouts.values())\n        self.chars = _filter_old_items(self.chars, max_timeout)\n        self.actions = _filter_old_items(self.actions, max_timeout)\n        for name, timeout in self._timeouts.items():\n            chars = _filter_old_items(self.chars, timeout)\n            num_strokes = len(_filter_old_items(self.actions, timeout))\n            strokes_per_word = _spw_of_chars(\n                num_strokes,\n                chars,\n                method=self.get_strokes_method()\n            )\n            self.strokes_stats[name] = str(\"{:0.2f}\".format(strokes_per_word))\n\n    def trigger_event_update(self):\n        self._stenogotchi_link._on_wpm_meter_update_strokes(stats=self.strokes_stats)\n\ndef _timestamp_items(items):\n    current_time = time.time()\n    return [(i, current_time) for i in items]\n\n\ndef _filter_old_items(items, timeout):\n    current_time = time.time()\n    return [(i, t) for i, t in items\n            if (current_time - t) <= timeout]\n\n\ndef _words_in_chars(chars, method):\n    text = \"\".join(c for c, _ in chars)\n    if method == \"ncra\":\n        # The NCRA defines a \"word\" to be 1.4 syllables, which is the average\n        # number of syllables per English word.\n        syllables_per_word = 1.4\n        # For some reason, textstat returns syllable counts such as a\n        # one-syllable word like \"the\" being 0.9 syllables.\n        syllables_in_text = textstat.syllable_count(text) / 0.9\n        return syllables_in_text * (1 / syllables_per_word)\n    elif method == \"traditional\":\n        # Formal definition; see https://en.wikipedia.org/wiki/Words_per_minute\n        return len(text) / 5\n    elif method == \"spaces\":\n        return len([i for i in text.split() if i])\n    else:\n        assert False, \"bad wpm method: \" + method\n\n\ndef _time_interval_of_chars(chars):\n    start_time = min(t for _, t in chars)\n    current_time = time.time()\n    time_interval = current_time - start_time\n    time_interval = max(1, time_interval)\n    return time_interval\n\n\ndef _wpm_of_chars(chars, method):\n    num_words = _words_in_chars(chars, method)\n    if not num_words:\n        return 0\n\n    time_interval = _time_interval_of_chars(chars)\n    num_minutes = time_interval / 60\n    num_words_per_minute = num_words / num_minutes\n    return int(round(num_words_per_minute))\n\n\ndef _spw_of_chars(num_strokes, chars, method):\n    num_words = _words_in_chars(chars, method)\n    if not num_words:\n        return 0\n\n    return num_strokes / num_words\n"
  },
  {
    "path": "requirements.txt",
    "content": "PyGObject == 3.30.4\ndbus_python == 1.2.16\nevdev == 1.4.0\nRPi.GPIO == 0.7.0\nfile_read_backwards == 2.0.0\ntoml == 0.10.2\nspidev == 3.5\nFlask == 1.1.2\nFlask_Cors == 3.0.10\nFlask_WTF == 0.14.3\nrequests == 2.25.1\nPillow >= 8.3.2\nplover >= 4.0.0.dev10"
  },
  {
    "path": "stenogotchi/__init__.py",
    "content": "import os\nimport logging\nimport time\nimport re\nimport subprocess\n\nfrom stenogotchi._version import __version__\n\n_name = None\nconfig = None\n\n\ndef set_name(new_name):\n    if new_name is None:\n        return\n\n    new_name = new_name.strip()\n    if new_name == '':\n        return\n\n    if not re.match(r'^[a-zA-Z0-9\\-]{2,25}$', new_name):\n        logging.warning(\"name '%s' is invalid: min length is 2, max length 25, only a-zA-Z0-9- allowed\", new_name)\n        return\n\n    current = name()\n    if new_name != current:\n        global _name\n\n        logging.info(\"setting unit hostname '%s' -> '%s'\", current, new_name)\n        with open('/etc/hostname', 'wt') as fp:\n            fp.write(new_name)\n\n        with open('/etc/hosts', 'rt') as fp:\n            prev = fp.read()\n            logging.debug(\"old hosts:\\n%s\\n\", prev)\n\n        with open('/etc/hosts', 'wt') as fp:\n            patched = prev.replace(current, new_name, -1)\n            logging.debug(\"new hosts:\\n%s\\n\", patched)\n            fp.write(patched)\n\n        os.system(\"hostname '%s'\" % new_name)\n        reboot()\n\n\ndef name():\n    global _name\n    if _name is None:\n        with open('/etc/hostname', 'rt') as fp:\n            _name = fp.read().strip()\n    return _name\n\n\ndef uptime():\n    with open('/proc/uptime') as fp:\n        return int(fp.read().split('.')[0])\n\n\ndef mem_usage():\n    with open('/proc/meminfo') as fp:\n        for line in fp:\n            line = line.strip()\n            if line.startswith(\"MemTotal:\"):\n                kb_mem_total = int(line.split()[1])\n            if line.startswith(\"MemFree:\"):\n                kb_mem_free = int(line.split()[1])\n            if line.startswith(\"Buffers:\"):\n                kb_main_buffers = int(line.split()[1])\n            if line.startswith(\"Cached:\"):\n                kb_main_cached = int(line.split()[1])\n        kb_mem_used = kb_mem_total - kb_mem_free - kb_main_cached - kb_main_buffers\n        return round(kb_mem_used / kb_mem_total, 1)\n\n    return 0\n\n\ndef _cpu_stat():\n    \"\"\"\n    Returns the splitted first line of the /proc/stat file\n    \"\"\"\n    with open('/proc/stat', 'rt') as fp:\n        return list(map(int,fp.readline().split()[1:]))\n\ndef cpu_load(s=0.1):\n    \"\"\"\n    Returns the average cpuload over a 's'-seconds period\n    \"\"\"\n    parts0 = _cpu_stat()\n    time.sleep(s)\n    parts1 = _cpu_stat()\n    parts_diff = [p1 - p0 for (p0, p1) in zip(parts0, parts1)]\n    user, nice, sys, idle, iowait, irq, softirq, steal, _guest, _guest_nice = parts_diff\n    idle_sum = idle + iowait\n    non_idle_sum = user + nice + sys + irq + softirq + steal\n    total = idle_sum + non_idle_sum\n    return non_idle_sum / total\n\n\ndef temperature(celsius=True):\n    with open('/sys/class/thermal/thermal_zone0/temp', 'rt') as fp:\n        temp = int(fp.read().strip())\n    c = int(temp / 1000)\n    return c if celsius else ((c * (9 / 5)) + 32)\n\ndef get_wifi_status():\n    try:\n        parts = os.popen(\"sudo ip -br addr show wlan0\").read().split()\n        state = parts[1]\n        ip = parts[2].split('/')[0]\n        return state, ip\n    except:\n        return None, None\n    \n\ndef get_wifi_ssid():\n    try:\n        ssid = os.popen(\"sudo iwgetid -r\").read().split('\\n')[0]\n        return ssid\n    except:\n        return \"\"\n\ndef set_wifi_onoff():\n    wifi_updown = get_wifi_status()[0]\n    if wifi_updown == 'UP':\n        # switch wifi off\n        subprocess.call(['sudo', 'ip', 'link', 'set', 'dev', 'wlan0', 'down'])\n        subprocess.call(['sudo', 'dhclient', '-r', 'wlan0'])\n        subprocess.call(['sudo', 'rfkill', 'block', '0'])\n        return False\n    else:\n        # switch wifi on\n        subprocess.call(['sudo', 'rfkill', 'unblock', '0'])\n        subprocess.call(['sudo', 'dhclient', 'wlan0'])\n        subprocess.call(['sudo', 'ip', 'link', 'set', 'dev', 'wlan0', 'up'])\n        return True\n\ndef shutdown():\n    logging.warning(\"shutting down ...\")\n\n    from stenogotchi.ui import view\n    \n    if view.ROOT:\n        view.ROOT.on_shutdown()\n        # give it some time to refresh the ui\n        time.sleep(5)\n    \n    if view.ROOT._config['ui']['display']['enabled']:\n        if view.ROOT._config['ui']['display']['clear_at_shutdown']:\n            view.ROOT._agent._view.init_display()\n            view.ROOT._agent._view.clear()\n            # give it some time to clear the ui\n            time.sleep(5)\n\n    logging.warning(\"syncing...\")\n\n    from stenogotchi import fs\n    for m in fs.mounts:\n        m.sync()\n    \n    os.system(\"sync\")\n    os.system(\"halt\")\n\n\ndef restart(mode):\n    logging.warning(\"restarting in %s mode ...\", mode)\n\n    if mode == 'AUTO':\n        os.system(\"touch /root/.stenogotchi-auto\")\n    else:\n        os.system(\"touch /root/.stenogotchi-manual\")\n\n    #os.system(\"service stenogotchi restart\")\n\n\ndef reboot(mode=None):\n    if mode is not None:\n        mode = mode.upper()\n        logging.warning(\"rebooting in %s mode ...\", mode)\n    else:\n        logging.warning(\"rebooting ...\")\n\n    from stenogotchi.ui import view\n    if view.ROOT:\n        view.ROOT.on_rebooting()\n        # give it some time to refresh the ui\n        time.sleep(10)\n\n    if mode == 'AUTO':\n        os.system(\"touch /root/.stenogotchi-auto\")\n    elif mode == 'MANU':\n        os.system(\"touch /root/.stenogotchi-manual\")\n\n    logging.warning(\"syncing...\")\n\n    from stenogotchi import fs\n    for m in fs.mounts:\n        m.sync()\n\n    os.system(\"sync\")\n    os.system(\"shutdown -r now\")\n"
  },
  {
    "path": "stenogotchi/_version.py",
    "content": "__version__ = '0.1.0'"
  },
  {
    "path": "stenogotchi/agent.py",
    "content": "import time\nimport json\nimport os\nimport re\nimport logging\nimport asyncio\nimport _thread\n\nimport stenogotchi\nimport stenogotchi.utils as utils\nimport stenogotchi.plugins as plugins\nfrom stenogotchi.ui.web.server import Server\nfrom stenogotchi.automata import Automata\n#from stenogotchi.log import LastSession\n\nRECOVERY_DATA_FILE = '/root/.stenogotchi-recovery'\n\n\nclass Agent(Automata):\n    def __init__(self, view, config):\n        Automata.__init__(self, config, view)\n        self._started_at = time.time()\n        self._view = view\n        self._view.set_agent(self)\n        self._web_ui = None\n        self._wifi_connected = None\n\n        self._history = {}\n        #self.last_session = LastSession(self._config)\n        self.mode = 'auto'\n\n        logging.info(\"%s (v%s)\", stenogotchi.name(), stenogotchi.__version__)\n        for _, plugin in plugins.loaded.items():\n            logging.debug(\"plugin '%s' v%s\", plugin.__class__.__name__, plugin.__version__)\n\n    def config(self):\n        return self._config\n\n    def view(self):\n        return self._view\n\n    def start(self):\n        self.set_starting()\n        # self.start_event_polling()\n        # print initial stats\n        self.start_session_fetcher()\n        self.set_ready()\n\n    def _update_uptime(self):\n        secs = stenogotchi.uptime()\n        self._view.set('uptime', utils.secs_to_hhmmss(secs))\n\n    def _update_wifi(self):\n        status, ip = stenogotchi.get_wifi_status()\n  \n        if status == 'UP':\n            if self._wifi_connected:\n                return\n            ssid = stenogotchi.get_wifi_ssid()\n            if ssid and ip:\n                self._wifi_connected = True\n                # Create web-ui only once a wifi connection is established\n                if not self._web_ui:\n                    self._web_ui = Server(self, self._config['ui'])\n            else:\n                if not ssid:\n                    ssid = \"[Searching]\"\n                    ip = \"the ghost\"\n                if not ip:\n                    ip = \"the ghost\"\n                self._wifi_connected = False\n            self.set_wifi_connected(ssid, ip)\n        elif status == 'DOWN' or not status:\n            if self._wifi_connected == False:\n                return\n            self._wifi_connected = False\n            self.set_wifi_disconnected('[OFF]')\n\n    def _reboot(self):\n        self.set_rebooting()\n        self._save_recovery_data()\n        stenogotchi.reboot()\n\n    def _save_recovery_data(self):\n        logging.warning(\"writing recovery data to %s ...\", RECOVERY_DATA_FILE)\n        with open(RECOVERY_DATA_FILE, 'w') as fp:\n            data = {\n                'started_at': self._started_at,\n                'history': self._history,\n            }\n            json.dump(data, fp)\n\n    def _load_recovery_data(self, delete=True, no_exceptions=True):\n        try:\n            with open(RECOVERY_DATA_FILE, 'rt') as fp:\n                data = json.load(fp)\n                logging.info(\"found recovery data: %s\", data)\n                self._started_at = data['started_at']\n                self._history = data['history']\n\n                if delete:\n                    logging.info(\"deleting %s\", RECOVERY_DATA_FILE)\n                    os.unlink(RECOVERY_DATA_FILE)\n        except:\n            if not no_exceptions:\n                raise\n\n\n    def start_session_fetcher(self):\n        _thread.start_new_thread(self._fetch_stats, ())\n\n    async def plover_status_update(self, msg):\n        pass\n\n    def _fetch_stats(self):\n        while True:\n            #s = self.session()    # this is just the request object for connection to bettercap -> to be used for fetching plover stats instead\n            self._update_uptime()\n            self._update_wifi()\n            time.sleep(30)\n\n    async def _on_event(self, msg):    # no bettercap to produce events for us, to be used for plover events\n        pass\n\n    def _event_poller(self, loop):\n        self._load_recovery_data()\n        #while True:\n\n\n    def start_event_polling(self):\n        # start a thread and pass in the mainloop\n        _thread.start_new_thread(self._event_poller, (asyncio.get_event_loop(),))\n"
  },
  {
    "path": "stenogotchi/automata.py",
    "content": "import logging\n\nimport stenogotchi.plugins as plugins\n\n\n# basic mood system\nclass Automata(object):\n    def __init__(self, config, view):\n        self._config = config\n        self._view = view\n\n    def set_starting(self):\n        self._view.on_starting()\n\n    def set_ready(self):\n        plugins.on('ready', self)\n\n    def in_good_mood(self):\n        pass\n\n    # triggered when it's a sad/bad day but you have good friends around ^_^\n    def set_grateful(self):\n        self._view.on_grateful()\n        plugins.on('grateful', self)\n\n    def set_lonely(self):\n        self._view.on_lonely()\n        plugins.on('lonely', self)\n\n    def set_bored(self):\n        self._view.on_bored()\n        plugins.on('bored', self)\n\n    def set_sad(self):\n        self._view.on_sad()\n        plugins.on('sad', self)\n\n    def set_angry(self):\n        self._view.on_angry()\n        plugins.on('angry', self)\n\n    def set_excited(self):\n        self._view.on_excited()\n        plugins.on('excited', self)\n\n    def set_processing(self):\n        self._view.on_processing()\n        plugins.on('processing', self)\n\n    def set_rebooting(self):\n        self._view.on_rebooting()\n        plugins.on('rebooting', self)\n\n    def wait_for(self, t, sleeping=True):\n        self._view.wait(t, sleeping)\n\n    def set_plover_boot(self):\n        self._view.on_plover_boot()\n        plugins.on('plover_boot', self)\n\n    def set_plover_ready(self):\n        self._view.on_plover_ready()\n        plugins.on('plover_ready', self)\n\n    def set_plover_quit(self):\n        self._view.on_plover_quit()\n        plugins.on('plover_quit', self)\n        \n    def set_bt_connected(self, bthost_name):\n        self._view.set('bthost', bthost_name)\n        self._view.on_bt_connected(bthost_name)\n        plugins.on('bt_connected', self, bthost_name)\n\n    def set_bt_disconnected(self):\n        self._view.set('bthost', \"\")\n        self._view.on_bt_disconnected()\n        plugins.on('bt_disconnected', self)\n        \n    def set_wifi_connected(self, ssid, ip):\n        self._view.set('wifi', ssid)\n        self._view.on_wifi_connected(ssid, ip)\n        plugins.on('wifi_connected', self, ssid, ip)\n\n    def set_wifi_disconnected(self, ssid=''):\n        self._view.set('wifi', ssid)\n        self._view.on_wifi_disconnected()\n        plugins.on('wifi_disconnected', self)\n\n    def set_wpm(self, wpm, wpm_top):\n        stats = '{:3s} {:5s}'.format(str(wpm), f'({wpm_top})')\n        self._view.on_wpm(stats)\n        plugins.on('wpm_set', self)\n\n    def set_strokes(self, stats):\n        self._view.on_strokes(stats)\n        plugins.on('strokes_set', self)\n\n    def set_wpm_record(self, wpm_top):\n        self._view.on_wpm_record(wpm_top)\n        plugins.on('wpm_record', self)\n        self.set_wpm(wpm_top, wpm_top)  # Since we set a new record wpm and wpm_top will be equal\n\n    def set_on_dict_lookup_done(self):\n        self._view.on_dict_lookup_done()\n        plugins.on('dict_lookup_done', self)\n"
  },
  {
    "path": "stenogotchi/defaults.toml",
    "content": "# This is a TOML document\n# This is the default config template. To change the default values, please save your modifications to /etc/stenogotchi/config.toml\n\n# Main\nmain.name = \"Stenogotchi\"\nmain.lang = \"en\"\nmain.confd = \"/etc/stenogotchi/conf.d/\"\nmain.custom_plugins = \"\"\n\n# Filesystem\nfs.memory.enabled = false\nfs.memory.mounts.log.enabled = false\nfs.memory.mounts.log.mount = \"/var/log\"\nfs.memory.mounts.log.size = \"50M\"\nfs.memory.mounts.log.sync = 60\nfs.memory.mounts.log.zram = true\nfs.memory.mounts.log.rsync = true\n\nfs.memory.mounts.data.enabled = false\nfs.memory.mounts.data.mount = \"/var/tmp/stenogotchi\"\nfs.memory.mounts.data.size = \"10M\"\nfs.memory.mounts.data.sync = 3600\nfs.memory.mounts.data.zram = false\nfs.memory.mounts.data.rsync = true\n\n# UI\n# The lifespan of an eINK display depends on the cumulative number of refreshes. To preserve your display\n# over time it is recommended to keep ui.fps value 0.0 so that refreshes only take place upon major updates.\n# Uptime, battery status, the blinking cursor and similar will not trigger a refresh\n\nui.fps = 0.0\nui.font.name = \"DejaVuSansMono\"\nui.font.size_offset = 0             # added to the font size\n\nui.faces.look_r = \"( ⚆_⚆)\"\nui.faces.look_l = \"(☉_☉ )\"\nui.faces.look_r_happy = \"( ◕‿◕)\"\nui.faces.look_l_happy = \"(◕‿◕ )\"\nui.faces.sleep = \"(⇀‿‿↼)\"\nui.faces.sleep2 = \"(≖‿‿≖)\"\nui.faces.awake = \"(◕‿‿◕)\"\nui.faces.bored = \"(-__-)\"\nui.faces.intense = \"(°▃▃°)\"\nui.faces.cool = \"(⌐■_■)\"\nui.faces.happy = \"(•‿‿•)\"\nui.faces.excited = \"(ᵔ◡◡ᵔ)\"\nui.faces.grateful = \"(^‿‿^)\"\nui.faces.motivated = \"(☼‿‿☼)\"\nui.faces.demotivated = \"(≖__≖)\"\nui.faces.smart = \"(✜‿‿✜)\"\nui.faces.lonely = \"(ب__ب)\"\nui.faces.sad = \"(╥☁╥ )\"\nui.faces.angry = \"(-_-')\"\nui.faces.friend = \"(♥‿‿♥)\"\nui.faces.broken = \"(☓‿‿☓)\"\nui.faces.debug = \"(#__#)\"\nui.faces.process_1 = \"(1__0)\"\nui.faces.process_2 = \"(1__1)\"\nui.faces.process_3 = \"(0__1)\"\nui.faces.process_4 = \"(0__0)\"\n\nui.display.enabled = true\nui.display.rotation = 0\nui.display.type = \"waveshare_2\"\nui.display.color = \"black\"\nui.display.clear_at_shutdown = true\n\n# The web UI provides an alternative way of interacting with the device to an eINK display and ButtonSHIM module. Enabling the web UI will also load the buttonshim plugin.\nui.web.enabled = false\nui.web.address = \"192.168.1.100\"\nui.web.username = \"changeme\"\nui.web.password = \"changeme\"\nui.web.origin = \"\"\nui.web.port = 80\nui.web.on_frame = \"\"\n\n# Plugins\n\n# Populate bt_autoconnect_mac with the MAC addresses of devices to attempt auto connecting to at boot. Multiple comma-separated devices in order of priority can be given.\n# After exhausting the options, the device will fall back to listening for incoming connection and pairing attempts.\n## Example:\n##  main.plugins.plover_link.bt_autoconnect_mac = \"00:DE:AD:BE:EF:00, 11:DE:AD:BE:EF:11\"\nmain.plugins.plover_link.enabled = true\nmain.plugins.plover_link.bt_autoconnect_mac = \"\"\nmain.plugins.plover_link.bt_device_name = \"Stenogotchi\"\n\n# For WPM readings a word is defined in one of three ways:\n##    NCRA: The National Court Reporters Association defines a “word” as 1.4 syllables. This is the measure used for official NCRA testing material.\n##    Traditional: The traditional metric for “word” in the context of keyboarding is defined to be 5 characters per word, including spaces. This is compatible with the notion of “word” in many typing speed utilities.\n##    Spaces: A word is a whitespace-separated sequence of characters. This metric of course doesn’t take into account the fact that some words are longer than others, both in length and syllables.\n# Specify either \"ncra\", \"traditional\" or \"spaces\" as preferred method using main.plugins.plover_link.wpm_method\n# Specify in seconds moving time window for which wpm is calculated and updated using main.plugins.plover_link.wpm_timeout\nmain.plugins.plover_link.wpm_method = \"traditional\"\nmain.plugins.plover_link.wpm_timeout = \"60\"\n\n# Plugin evdevkb is responsible for direct keyboard capturing, bypassing Plover. Input mode toggleable when enabled.\nmain.plugins.evdevkb.enabled = true\n\n# Plugin dict_lookup handles dictionary lookup from all enabled Plover dictionaries.\nmain.plugins.dict_lookup.enabled = true\n\n# Plugin upslite provides battery level, charging indicator (+) and auto-shutdown at specified battery level when a UPS-Lite v1.2 module is connected. \nmain.plugins.upslite.enabled = false\nmain.plugins.upslite.shutdown_level = 5\n\n# Plugin buttonshim enables a way to interact with the device using the five physical buttons on the ButtonSHIM hardware module or through the web UI. Enabling the web UI will automatically load the buttonshim plugin.\n# Each button has a predefined long-press (1s) action. The short-press action can be freely configured to any terminal command.\nmain.plugins.buttonshim.enabled = false\nmain.plugins.buttonshim.buttons.A.command = \"\"\nmain.plugins.buttonshim.buttons.A.blink.enabled = false\nmain.plugins.buttonshim.buttons.A.blink.red = 0\nmain.plugins.buttonshim.buttons.A.blink.green = 0\nmain.plugins.buttonshim.buttons.A.blink.blue = 0\nmain.plugins.buttonshim.buttons.A.blink.on_time = 0\nmain.plugins.buttonshim.buttons.A.blink.off_time = 0\nmain.plugins.buttonshim.buttons.A.blink.blink_times = 0\nmain.plugins.buttonshim.buttons.B.command = \"\"\nmain.plugins.buttonshim.buttons.B.blink.enabled = false\nmain.plugins.buttonshim.buttons.B.blink.red = 0\nmain.plugins.buttonshim.buttons.B.blink.green = 0\nmain.plugins.buttonshim.buttons.B.blink.blue = 0\nmain.plugins.buttonshim.buttons.B.blink.on_time = 0\nmain.plugins.buttonshim.buttons.B.blink.off_time = 0\nmain.plugins.buttonshim.buttons.B.blink.blink_times = 0\nmain.plugins.buttonshim.buttons.C.command = \"\"\nmain.plugins.buttonshim.buttons.C.blink.enabled = false\nmain.plugins.buttonshim.buttons.C.blink.red = 0\nmain.plugins.buttonshim.buttons.C.blink.green = 0\nmain.plugins.buttonshim.buttons.C.blink.blue = 0\nmain.plugins.buttonshim.buttons.C.blink.on_time = 0\nmain.plugins.buttonshim.buttons.C.blink.off_time = 0\nmain.plugins.buttonshim.buttons.C.blink.blink_times = 0\nmain.plugins.buttonshim.buttons.D.command = \"\"\nmain.plugins.buttonshim.buttons.D.blink.enabled = false\nmain.plugins.buttonshim.buttons.D.blink.red = 0\nmain.plugins.buttonshim.buttons.D.blink.green = 0\nmain.plugins.buttonshim.buttons.D.blink.blue = 0\nmain.plugins.buttonshim.buttons.D.blink.on_time = 0\nmain.plugins.buttonshim.buttons.D.blink.off_time = 0\nmain.plugins.buttonshim.buttons.D.blink.blink_times = 0\nmain.plugins.buttonshim.buttons.E.command = \"\"\nmain.plugins.buttonshim.buttons.E.blink.enabled = false\nmain.plugins.buttonshim.buttons.E.blink.red = 0\nmain.plugins.buttonshim.buttons.E.blink.green = 0\nmain.plugins.buttonshim.buttons.E.blink.blue = 0\nmain.plugins.buttonshim.buttons.E.blink.on_time = 0\nmain.plugins.buttonshim.buttons.E.blink.off_time = 0\nmain.plugins.buttonshim.buttons.E.blink.blink_times = 0\n\n# Plugin led provides an alternative way to be alerted to events through the built-in LED on the rpi0w without the need of a display.\nmain.plugins.led.enabled = false\nmain.plugins.led.led = 0\nmain.plugins.led.delay = 200\nmain.plugins.led.patterns.loaded = \"\"\nmain.plugins.led.patterns.updating = \"\"\nmain.plugins.led.patterns.ready = \"\"\nmain.plugins.led.patterns.grateful = \"\"\nmain.plugins.led.patterns.lonely = \"\"\nmain.plugins.led.patterns.bored = \"\"\nmain.plugins.led.patterns.sad = \"\"\nmain.plugins.led.patterns.angry = \"\"\nmain.plugins.led.patterns.excited = \"\"\nmain.plugins.led.patterns.rebooting = \"oo  oo  oo  oo  oo\"\nmain.plugins.led.patterns.wait = \"\"\nmain.plugins.led.patterns.sleep = \"\"\nmain.plugins.led.patterns.epoch = \"\"\nmain.plugins.led.patterns.bt_connected = \"oo  oo  oo  oo  oo\"\nmain.plugins.led.patterns.bt_disconnected = \"oo  oo  oo  oo  oo\"\nmain.plugins.led.patterns.plover_boot = \"\"\nmain.plugins.led.patterns.plover_ready = \"oo  oo  oo  oo  oo\"\nmain.plugins.led.patterns.plover_quit = \"oo  oo  oo  oo  oo\"\nmain.plugins.led.patterns.wifi_connected = \"oo  oo  oo  oo  oo\"\nmain.plugins.led.patterns.wifi_disconnected = \"oo  oo  oo  oo  oo\"\nmain.plugins.led.patterns.wpm_set = \"\"\nmain.plugins.led.patterns.strokes_set = \"\"\n\n# Plugin memtemp displays CPU temperature and RAM/CPU usage.\nmain.plugins.memtemp.enabled = false\nmain.plugins.memtemp.scale = \"celsius\"\nmain.plugins.memtemp.orientation = \"horizontal\"\n\n# Plugin logtail gives access to the Stenogotchi log through the web UI.\nmain.plugins.logtail.enabled = false\nmain.plugins.logtail.max-lines = 10000\n\nmain.plugins.session-stats.enabled = false\nmain.plugins.session-stats.save_directory = \"/var/tmp/stenogotchi/sessions/\"\n\n# Log\nmain.log.path = \"/var/log/stenogotchi.log\"\nmain.log.rotation.enabled = true\nmain.log.rotation.size = \"10M\""
  },
  {
    "path": "stenogotchi/fs/__init__.py",
    "content": "import os\nimport re\nimport tempfile\nimport contextlib\nimport shutil\nimport _thread\nimport logging\n\nfrom time import sleep\nfrom distutils.dir_util import copy_tree\n\nmounts = list()\n\n\n@contextlib.contextmanager\ndef ensure_write(filename, mode='w'):\n    path = os.path.dirname(filename)\n    fd, tmp = tempfile.mkstemp(dir=path)\n\n    with os.fdopen(fd, mode) as f:\n        yield f\n        f.flush()\n        os.fsync(f.fileno())\n\n    os.replace(tmp, filename)\n\n\ndef size_of(path):\n    \"\"\"\n    Calculate the sum of all the files in path\n    \"\"\"\n    total = 0\n    for root, _, files in os.walk(path):\n        for f in files:\n            total += os.path.getsize(os.path.join(root, f))\n    return total\n\n\ndef is_mountpoint(path):\n    \"\"\"\n    Checks if path is mountpoint\n    \"\"\"\n    return os.system(f\"mountpoint -q {path}\") == 0\n\n\ndef setup_mounts(config):\n    \"\"\"\n    Sets up all the configured mountpoints\n    \"\"\"\n    global mounts\n    fs_cfg = config['fs']['memory']\n    if not fs_cfg['enabled']:\n        return\n\n    for name, options in fs_cfg['mounts'].items():\n        if not options['enabled']:\n            continue\n        logging.debug(\"[FS] Trying to setup mount %s (%s)\", name, options['mount'])\n        size,unit = re.match(r\"(\\d+)([a-zA-Z]+)\", options['size']).groups()\n        target = os.path.join('/run/stenogotchi/disk/', os.path.basename(options['mount']))\n\n        is_mounted = is_mountpoint(target)\n        logging.debug(\"[FS] %s is %s mounted\", options['mount'],\n                      \"already\" if is_mounted else \"not yet\")\n\n        m = MemoryFS(\n            options['mount'],\n            target,\n            size=options['size'],\n            zram=options['zram'],\n            zram_disk_size=f\"{int(size)*2}{unit}\",\n            rsync=options['rsync'])\n\n        if not is_mounted:\n            if not m.mount():\n                logging.error(f\"Error while mounting {m.mountpoint}\")\n                continue\n\n            if not m.sync(to_ram=True):\n                logging.error(f\"Error while syncing to {m.mountpoint}\")\n                m.umount()\n                continue\n\n        interval = int(options['sync'])\n        if interval:\n            logging.debug(\"[FS] Starting thread to sync %s (interval: %d)\",\n                        options['mount'], interval)\n            _thread.start_new_thread(m.daemonize, (interval,))\n        else:\n            logging.debug(\"[FS] Not syncing %s, because interval is 0\",\n            options['mount'])\n\n        mounts.append(m)\n\n\nclass MemoryFS:\n    @staticmethod\n    def zram_install():\n        if not os.path.exists(\"/sys/class/zram-control\"):\n            logging.debug(\"[FS] Installing zram\")\n            return os.system(\"modprobe zram\") == 0\n        return True\n\n\n    @staticmethod\n    def zram_dev():\n        logging.debug(\"[FS] Adding zram device\")\n        return open(\"/sys/class/zram-control/hot_add\", \"rt\").read().strip(\"\\n\")\n\n\n    def __init__(self, mount, disk, size=\"40M\",\n                 zram=True, zram_alg=\"lz4\", zram_disk_size=\"100M\",\n                 zram_fs_type=\"ext4\", rsync=True):\n        self.mountpoint = mount\n        self.disk = disk\n        self.size = size\n        self.zram = zram\n        self.zram_alg = zram_alg\n        self.zram_disk_size = zram_disk_size\n        self.zram_fs_type = zram_fs_type\n        self.zdev = None\n        self.rsync = True\n        self._setup()\n\n\n    def _setup(self):\n        if self.zram and MemoryFS.zram_install():\n            # setup zram\n            self.zdev = MemoryFS.zram_dev()\n            open(f\"/sys/block/zram{self.zdev}/comp_algorithm\", \"wt\").write(self.zram_alg)\n            open(f\"/sys/block/zram{self.zdev}/disksize\", \"wt\").write(self.zram_disk_size)\n            open(f\"/sys/block/zram{self.zdev}/mem_limit\", \"wt\").write(self.size)\n            logging.debug(\"[FS] Creating fs (type: %s)\", self.zram_fs_type)\n            os.system(f\"mke2fs -t {self.zram_fs_type} /dev/zram{self.zdev} >/dev/null 2>&1\")\n\n        # ensure mountpoints exist\n        if not os.path.exists(self.disk):\n            logging.debug(\"[FS] Creating %s\", self.disk)\n            os.makedirs(self.disk)\n\n        if not os.path.exists(self.mountpoint):\n            logging.debug(\"[FS] Creating %s\", self.mountpoint)\n            os.makedirs(self.mountpoint)\n\n\n    def daemonize(self, interval=60):\n        logging.debug(\"[FS] Daemonized...\")\n        while True:\n            self.sync()\n            sleep(interval)\n\n\n    def sync(self, to_ram=False):\n        source, dest = (self.disk, self.mountpoint) if to_ram else (self.mountpoint, self.disk)\n        needed, actually_free = size_of(source), shutil.disk_usage(dest)[2]\n        if actually_free >= needed:\n            logging.debug(\"[FS] Syncing %s -> %s\", source,dest)\n            if self.rsync:\n                os.system(f\"rsync -aXv --inplace --no-whole-file --delete-after {source}/ {dest}/ >/dev/null 2>&1\")\n            else:\n                copy_tree(source, dest, preserve_symlinks=True)\n            os.system(\"sync\")\n            return True\n        return False\n\n\n    def mount(self):\n        if os.system(f\"mount --bind {self.mountpoint} {self.disk}\"):\n            return False\n\n        if os.system(f\"mount --make-private {self.disk}\"):\n            return False\n\n        if self.zram and self.zdev is not None:\n            if os.system(f\"mount -t {self.zram_fs_type} -o nosuid,noexec,nodev,user=stenogotchi /dev/zram{self.zdev} {self.mountpoint}/\"):\n                return False\n        else:\n            if os.system(f\"mount -t tmpfs -o nosuid,noexec,nodev,mode=0755,size={self.size} stenogotchi {self.mountpoint}/\"):\n                return False\n\n        return True\n\n\n    def umount(self):\n        if os.system(f\"umount -l {self.mountpoint}\"):\n            return False\n\n        if os.system(f\"umount -l {self.disk}\"):\n            return False\n        return True"
  },
  {
    "path": "stenogotchi/log.py",
    "content": "import hashlib\nimport time\nimport re\nimport os\nimport logging\nimport shutil\nimport gzip\nimport warnings\nfrom datetime import datetime\n\nfrom stenogotchi.voice import Voice\nfrom file_read_backwards import FileReadBackwards\n\nLAST_SESSION_FILE = '/root/.stenogotchi-last-session'\n\n\nclass LastSession(object):\n    START_TOKEN = 'connecting to http'\n\n\n    def __init__(self, config):\n        self.config = config\n        self.voice = Voice(lang=config['main']['lang'])\n        self.path = config['main']['log']['path']\n        self.last_session = []\n        self.last_session_id = ''\n        self.last_saved_session_id = ''\n        self.duration = ''\n        self.duration_human = ''\n\n    def _get_last_saved_session_id(self):\n        saved = ''\n        try:\n            with open(LAST_SESSION_FILE, 'rt') as fp:\n                saved = fp.read().strip()\n        except:\n            saved = ''\n        return saved\n\n    def save_session_id(self):\n        with open(LAST_SESSION_FILE, 'w+t') as fp:\n            fp.write(self.last_session_id)\n            self.last_saved_session_id = self.last_session_id\n\n    def _parse_datetime(self, dt):\n        dt = dt.split('.')[0]\n        dt = dt.split(',')[0]\n        dt = datetime.strptime(dt.split('.')[0], '%Y-%m-%d %H:%M:%S')\n        return time.mktime(dt.timetuple())\n\n    def _parse_stats(self):\n        self.duration = ''\n        self.duration_human = ''\n\n        started_at = None\n        stopped_at = None\n        cache = {}\n\n        for line in self.last_session:\n            parts = line.split(']')\n            if len(parts) < 2:\n                continue\n\n            try:\n                line_timestamp = parts[0].strip('[')\n                line = ']'.join(parts[1:])\n                stopped_at = self._parse_datetime(line_timestamp)\n                if started_at is None:\n                    started_at = stopped_at\n            except Exception as e:\n                logging.error(\"error parsing line '%s': %s\" % (line, e))\n\n        if started_at is not None:\n            self.duration = stopped_at - started_at\n            mins, secs = divmod(self.duration, 60)\n            hours, mins = divmod(mins, 60)\n        else:\n            hours = mins = secs = 0\n\n        self.duration = '%02d:%02d:%02d' % (hours, mins, secs)\n        self.duration_human = []\n        if hours > 0:\n            self.duration_human.append('%d %s' % (hours, self.voice.hhmmss(hours, 'h')))\n        if mins > 0:\n            self.duration_human.append('%d %s' % (mins, self.voice.hhmmss(mins, 'm')))\n        if secs > 0:\n            self.duration_human.append('%d %s' % (secs, self.voice.hhmmss(secs, 's')))\n\n        self.duration_human = ', '.join(self.duration_human)\n\n    def parse(self, ui, skip=False):\n        if skip:\n            logging.debug(\"skipping parsing of the last session logs ...\")\n        else:\n            logging.debug(\"reading last session logs ...\")\n\n            ui.on_reading_logs()\n\n            lines = []\n\n            if os.path.exists(self.path):\n                with FileReadBackwards(self.path, encoding=\"utf-8\") as fp:\n                    for line in fp:\n                        line = line.strip()\n                        if line != \"\" and line[0] != '[':\n                            continue\n                        lines.append(line)\n                        if LastSession.START_TOKEN in line:\n                            break\n\n                        lines_so_far = len(lines)\n                        if lines_so_far % 100 == 0:\n                            ui.on_reading_logs(lines_so_far)\n\n                lines.reverse()\n\n            if len(lines) == 0:\n                lines.append(\"Initial Session\");\n\n            ui.on_reading_logs()\n\n            self.last_session = lines\n            self.last_session_id = hashlib.md5(lines[0].encode()).hexdigest()\n            self.last_saved_session_id = self._get_last_saved_session_id()\n\n            logging.debug(\"parsing last session logs (%d lines) ...\" % len(lines))\n\n            self._parse_stats()\n        self.parsed = True\n\n    def is_new(self):\n        return self.last_session_id != self.last_saved_session_id\n\n\ndef setup_logging(args, config):\n    cfg = config['main']['log']\n    filename = cfg['path']\n\n    formatter = logging.Formatter(\"[%(asctime)s] [%(levelname)s] %(message)s\")\n    root = logging.getLogger()\n\n    root.setLevel(logging.DEBUG if args.debug else logging.INFO)\n\n    if filename:\n        # since python default log rotation might break session data in different files,\n        # we need to do log rotation ourselves\n        log_rotation(filename, cfg)\n\n        file_handler = logging.FileHandler(filename)\n        file_handler.setFormatter(formatter)\n        root.addHandler(file_handler)\n\n    console_handler = logging.StreamHandler()\n    console_handler.setFormatter(formatter)\n    root.addHandler(console_handler)\n\n\ndef log_rotation(filename, cfg):\n    rotation = cfg['rotation']\n    if not rotation['enabled']:\n        return\n    elif not os.path.isfile(filename):\n        return\n\n    stats = os.stat(filename)\n    # specify a maximum size to rotate ( format is 10/10B, 10K, 10M 10G )\n    if rotation['size']:\n        max_size = parse_max_size(rotation['size'])\n        if stats.st_size >= max_size:\n            do_rotate(filename, stats, cfg)\n    else:\n        raise Exception(\"log rotation is enabled but log.rotation.size was not specified\")\n\n\ndef parse_max_size(s):\n    parts = re.findall(r'(^\\d+)([bBkKmMgG]?)', s)\n    if len(parts) != 1 or len(parts[0]) != 2:\n        raise Exception(\"can't parse %s as a max size\" % s)\n\n    num, unit = parts[0]\n    num = int(num)\n    unit = unit.lower()\n\n    if unit == 'k':\n        return num * 1024\n    elif unit == 'm':\n        return num * 1024 * 1024\n    elif unit == 'g':\n        return num * 1024 * 1024 * 1024\n    else:\n        return num\n\n\ndef do_rotate(filename, stats, cfg):\n    base_path = os.path.dirname(filename)\n    name = os.path.splitext(os.path.basename(filename))[0]\n    archive_filename = os.path.join(base_path, \"%s.gz\" % name)\n    counter = 2\n\n    while os.path.exists(archive_filename):\n        archive_filename = os.path.join(base_path, \"%s-%d.gz\" % (name, counter))\n        counter += 1\n\n    log_filename = archive_filename.replace('gz', 'log')\n\n    print(\"%s is %d bytes big, rotating to %s ...\" % (filename, stats.st_size, log_filename))\n\n    shutil.move(filename, log_filename)\n\n    print(\"compressing to %s ...\" % archive_filename)\n\n    with open(log_filename, 'rb') as src:\n        with gzip.open(archive_filename, 'wb') as dst:\n            dst.writelines(src)\n"
  },
  {
    "path": "stenogotchi/plugins/__init__.py",
    "content": "import os\nimport glob\nimport _thread\nimport threading\nimport importlib, importlib.util\nimport logging\n\n\n\ndefault_path = os.path.join(os.path.dirname(os.path.realpath(__file__)), \"default\")\nloaded = {}\ndatabase = {}\nlocks = {}\n\n\nclass Plugin:\n    @classmethod\n    def __init_subclass__(cls, **kwargs):\n        super().__init_subclass__(**kwargs)\n        global loaded, locks\n\n        plugin_name = cls.__module__.split('.')[0]\n        plugin_instance = cls()\n        logging.debug(\"loaded plugin %s as %s\" % (plugin_name, plugin_instance))\n        loaded[plugin_name] = plugin_instance\n\n        for attr_name in plugin_instance.__dir__():\n            if attr_name.startswith('on_'):\n                cb = getattr(plugin_instance, attr_name, None)\n                if cb is not None and callable(cb):\n                    locks[\"%s::%s\" % (plugin_name, attr_name)] = threading.Lock()\n\n\ndef toggle_plugin(name, enable=True):\n    \"\"\"\n    Load or unload a plugin\n    returns True if changed, otherwise False\n    \"\"\"\n    import stenogotchi\n    from stenogotchi.ui import view\n    from stenogotchi.utils import save_config\n  \n    global loaded, database\n\n    # log event\n    if enable:\n        logging.debug(f\"enabled plugin '{name}' in config\")\n    else:\n        logging.debug(f\"disabled plugin '{name}' in config\")\n\n    if stenogotchi.config:\n        if not name in stenogotchi.config['main']['plugins']:\n            stenogotchi.config['main']['plugins'][name] = dict()\n        stenogotchi.config['main']['plugins'][name]['enabled'] = enable\n        save_config(stenogotchi.config, '/etc/stenogotchi/config.toml')\n\n    if not enable and name in loaded:\n        if getattr(loaded[name], 'on_unload', None):\n            loaded[name].on_unload(view.ROOT)\n        del loaded[name]\n\n        return True\n\n    if enable and name in database and name not in loaded:\n        load_from_file(database[name])\n        if name in loaded and stenogotchi.config and name in stenogotchi.config['main']['plugins']:\n            loaded[name].options = stenogotchi.config['main']['plugins'][name]\n        one(name, 'loaded')\n        if stenogotchi.config:\n            one(name, 'config_changed', stenogotchi.config)\n        one(name, 'ui_setup', view.ROOT)\n        one(name, 'ready', view.ROOT._agent)\n        return True\n\n    return False\n\n\ndef on(event_name, *args, **kwargs):\n    for plugin_name in loaded.keys():\n        one(plugin_name, event_name, *args, **kwargs)\n\n\ndef locked_cb(lock_name, cb, *args, **kwargs):\n    global locks\n\n    if lock_name not in locks:\n        locks[lock_name] = threading.Lock()\n\n    with locks[lock_name]:\n        cb(*args, *kwargs)\n\n\ndef one(plugin_name, event_name, *args, **kwargs):\n    global loaded\n\n    if plugin_name in loaded:\n        plugin = loaded[plugin_name]\n        cb_name = 'on_%s' % event_name\n        callback = getattr(plugin, cb_name, None)\n        if callback is not None and callable(callback):\n            try:\n                lock_name = \"%s::%s\" % (plugin_name, cb_name)\n                locked_cb_args = (lock_name, callback, *args, *kwargs)\n                _thread.start_new_thread(locked_cb, locked_cb_args)\n            except Exception as e:\n                logging.error(\"error while running %s.%s : %s\" % (plugin_name, cb_name, e))\n                logging.error(e, exc_info=True)\n\n\ndef load_from_file(filename):\n    logging.debug(\"loading %s\" % filename)\n    plugin_name = os.path.basename(filename.replace(\".py\", \"\"))\n    spec = importlib.util.spec_from_file_location(plugin_name, filename)\n    instance = importlib.util.module_from_spec(spec)\n    spec.loader.exec_module(instance)\n    return plugin_name, instance\n\n\ndef load_from_path(path, enabled=()):\n    global loaded, database\n    logging.debug(\"loading plugins from %s - enabled: %s\" % (path, enabled))\n    for filename in glob.glob(os.path.join(path, \"*.py\")):\n        plugin_name = os.path.basename(filename.replace(\".py\", \"\"))\n        database[plugin_name] = filename\n        if plugin_name in enabled:\n            try:\n                load_from_file(filename)\n            except Exception as e:\n                logging.warning(\"error while loading %s: %s\" % (filename, e))\n                logging.debug(e, exc_info=True)\n\n    return loaded\n\n\ndef load(config):\n    enabled = [name for name, options in config['main']['plugins'].items() if\n               'enabled' in options and options['enabled']]\n    \n    # force enable buttonshim plugin when web ui is enabled\n    logging.debug(f\"REMOVEME pre status : '{enabled}'\")\n    if config['ui']['web']['enabled'] and 'buttonshim' not in enabled:\n        enabled.append('buttonshim')\n    logging.debug(f\"REMOVEME post status : '{enabled}'\")\n\n    # load default plugins\n    load_from_path(default_path, enabled=enabled)\n\n    # load custom ones\n    custom_path = config['main']['custom_plugins'] if 'custom_plugins' in config['main'] else None\n    if custom_path is not None:\n        load_from_path(custom_path, enabled=enabled)\n\n    # propagate options\n    for name, plugin in loaded.items():\n        plugin.options = config['main']['plugins'][name]\n        print(\"loaded plugin:\", name, plugin)\n\n    on('loaded')\n    on('config_changed', config)"
  },
  {
    "path": "stenogotchi/plugins/cmd.py",
    "content": "# Handles the commandline stuff\n\nimport os\nimport logging\nimport glob\nimport re\nimport shutil\nfrom fnmatch import fnmatch\nfrom stenogotchi.plugins import default_path\n\n\nSAVE_DIR = '/usr/local/share/stenogotchi/availaible-plugins/'\nDEFAULT_INSTALL_PATH = '/usr/local/share/stenogotchi/installed-plugins/'\n\n\ndef add_parsers(parser):\n    \"\"\"\n    Adds the plugins subcommand to a given argparse.ArgumentParser\n    \"\"\"\n    subparsers = parser.add_subparsers()\n    ## pwnagotchi plugins\n    parser_plugins = subparsers.add_parser('plugins')\n    plugin_subparsers = parser_plugins.add_subparsers(dest='plugincmd')\n\n    ## pwnagotchi plugins search\n    parser_plugins_search = plugin_subparsers.add_parser('search', help='Search for stenogotchi plugins')\n    parser_plugins_search.add_argument('pattern', type=str, help=\"Search expression (wildcards allowed)\")\n\n    ## pwnagotchi plugins list\n    parser_plugins_list = plugin_subparsers.add_parser('list', help='List available stenogotchi plugins')\n    parser_plugins_list.add_argument('-i', '--installed', action='store_true', required=False, help='List also installed plugins')\n\n    ## pwnagotchi plugins update\n    parser_plugins_update = plugin_subparsers.add_parser('update', help='Updates the database')\n\n    ## pwnagotchi plugins upgrade\n    parser_plugins_upgrade = plugin_subparsers.add_parser('upgrade', help='Upgrades plugins')\n    parser_plugins_upgrade.add_argument('pattern', type=str, nargs='?', default='*', help=\"Filter expression (wildcards allowed)\")\n\n    ## pwnagotchi plugins enable\n    parser_plugins_enable = plugin_subparsers.add_parser('enable', help='Enables a plugin')\n    parser_plugins_enable.add_argument('name', type=str, help='Name of the plugin')\n\n    ## pwnagotchi plugins disable\n    parser_plugins_disable = plugin_subparsers.add_parser('disable', help='Disables a plugin')\n    parser_plugins_disable.add_argument('name', type=str, help='Name of the plugin')\n\n    ## pwnagotchi plugins install\n    parser_plugins_install = plugin_subparsers.add_parser('install', help='Installs a plugin')\n    parser_plugins_install.add_argument('name', type=str, help='Name of the plugin')\n\n    ## pwnagotchi plugins uninstall\n    parser_plugins_uninstall = plugin_subparsers.add_parser('uninstall', help='Uninstalls a plugin')\n    parser_plugins_uninstall.add_argument('name', type=str, help='Name of the plugin')\n\n    ## pwnagotchi plugins edit\n    parser_plugins_edit = plugin_subparsers.add_parser('edit', help='Edit the options')\n    parser_plugins_edit.add_argument('name', type=str, help='Name of the plugin')\n\n    return parser\n\n\ndef used_plugin_cmd(args):\n    \"\"\"\n    Checks if the plugins subcommand was used\n    \"\"\"\n    return hasattr(args, 'plugincmd')\n\n\ndef handle_cmd(args, config):\n    \"\"\"\n    Parses the arguments and does the thing the user wants\n    \"\"\"\n    if args.plugincmd == 'update':\n        return update(config)\n    elif args.plugincmd == 'search':\n        args.installed = True # also search in installed plugins\n        return list_plugins(args, config, args.pattern)\n    elif args.plugincmd == 'install':\n        return install(args, config)\n    elif args.plugincmd == 'uninstall':\n        return uninstall(args, config)\n    elif args.plugincmd == 'list':\n        return list_plugins(args, config)\n    elif args.plugincmd == 'enable':\n        return enable(args, config)\n    elif args.plugincmd == 'disable':\n        return disable(args, config)\n    elif args.plugincmd == 'upgrade':\n        return upgrade(args, config, args.pattern)\n    elif args.plugincmd == 'edit':\n        return edit(args, config)\n\n    raise NotImplementedError()\n\n\ndef edit(args, config):\n    pass\n\n\ndef enable(args, config):\n    pass\n\n\ndef disable(args, config):\n    pass\n\n\ndef upgrade(args, config, pattern='*'):\n    pass\n\ndef list_plugins(args, config, pattern='*'):\n    \"\"\"\n    Lists the available and installed plugins\n    \"\"\"\n    installed = _get_installed(config)\n    print(installed)\n    return 0\n\n\ndef _extract_version(filename):\n    \"\"\"\n    Extracts the version from a python file\n    \"\"\"\n    return None\n\n\ndef _get_available():\n    \"\"\"\n    Get all availaible plugins\n    \"\"\"\n    return None\n\n\ndef _get_installed(config):\n    \"\"\"\n    Get all installed plugins\n    \"\"\"\n    installed = dict()\n    search_dirs = [ default_path, config['main']['custom_plugins'] ]\n    for search_dir in search_dirs:\n        if search_dir:\n            for filename in glob.glob(os.path.join(search_dir, \"*.py\")):\n                plugin_name = os.path.basename(filename.replace(\".py\", \"\"))\n                installed[plugin_name] = filename\n    return installed\n\n\ndef uninstall(args, config):\n    \"\"\"\n    Uninstalls a plugin\n    \"\"\"\n    return 0\n\n\ndef install(args, config):\n    \"\"\"\n    Installs the given plugin\n    \"\"\"\n    return 0\n\n\ndef _analyse_dir(path):\n    return None\n\n\ndef update(config):\n    \"\"\"\n    Updates the database\n    \"\"\"\n    return 0"
  },
  {
    "path": "stenogotchi/plugins/default/buttonshim.py",
    "content": "# ###############################################################\n# Updated 20-03-2021 by Anodynous\n# - Moved all functionality into class to remove dependency on global variables and improve integration with other plugins and core Stenogotchi functionality.\n#\n# Updated 13-01-2021 by Anodynous\n# - Added support for hold action in addition to press.\n#   Based on: https://github.com/evilsocket/pwnagotchi-plugins-contrib/blob/master/buttonshim.py\n#       which in turn is based on https://github.com/pimoroni/button-shim/commit/143f35b4b56626bd7062bdff3245658af19822b4\n#\n################################################################\n\n\nimport logging\nimport RPi.GPIO as GPIO\nimport subprocess\nimport signal\nimport smbus\nimport time\nfrom threading import Thread\nimport atexit\nfrom colorsys import hsv_to_rgb\n\nimport stenogotchi\nimport stenogotchi.plugins as plugins\n\ntry:\n    import queue\nexcept ImportError:\n    import Queue as queue\n\nADDR = 0x3f\nLED_DATA = 7\nLED_CLOCK = 6\nREG_INPUT = 0x00\nREG_OUTPUT = 0x01\nREG_POLARITY = 0x02\nREG_CONFIG = 0x03\n\nNUM_BUTTONS = 5\nBUTTON_A = 0\n\"\"\"Button A\"\"\"\nBUTTON_B = 1\n\"\"\"Button B\"\"\"\nBUTTON_C = 2\n\"\"\"Button C\"\"\"\nBUTTON_D = 3\n\"\"\"Button D\"\"\"\nBUTTON_E = 4\n\"\"\"Button E\"\"\"\nNAMES = ['A', 'B', 'C', 'D', 'E']\n\"\"\"Sometimes you want to print the plain text name of the button that's triggered.\nYou can use::\n    buttonshim.NAMES[button_index]\nTo accomplish this.\n\"\"\"\n\nERROR_LIMIT = 10\nFPS = 60\nLED_GAMMA = [\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2,\n    2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5,\n    6, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 10, 10, 11, 11,\n    11, 12, 12, 13, 13, 13, 14, 14, 15, 15, 16, 16, 17, 17, 18, 18,\n    19, 19, 20, 21, 21, 22, 22, 23, 23, 24, 25, 25, 26, 27, 27, 28,\n    29, 29, 30, 31, 31, 32, 33, 34, 34, 35, 36, 37, 37, 38, 39, 40,\n    40, 41, 42, 43, 44, 45, 46, 46, 47, 48, 49, 50, 51, 52, 53, 54,\n    55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70,\n    71, 72, 73, 74, 76, 77, 78, 79, 80, 81, 83, 84, 85, 86, 88, 89,\n    90, 91, 93, 94, 95, 96, 98, 99, 100, 102, 103, 104, 106, 107, 109, 110,\n    111, 113, 114, 116, 117, 119, 120, 121, 123, 124, 126, 128, 129, 131, 132, 134,\n    135, 137, 138, 140, 142, 143, 145, 146, 148, 150, 151, 153, 155, 157, 158, 160,\n    162, 163, 165, 167, 169, 170, 172, 174, 176, 178, 179, 181, 183, 185, 187, 189,\n    191, 193, 194, 196, 198, 200, 202, 204, 206, 208, 210, 212, 214, 216, 218, 220,\n    222, 224, 227, 229, 231, 233, 235, 237, 239, 241, 244, 246, 248, 250, 252, 255]\n\n# The LED is an APA102 driven via the i2c IO expander.\n# We must set and clear the Clock and Data pins\n# Each byte in self._reg_queue represents a snapshot of the pin state\n\n\nclass Handler():\n    plugin = None\n    def __init__(self, plugin):\n        self.press = None\n        self.release = None\n\n        self.hold = None\n        self.hold_time = 0\n\n        self.repeat = False\n        self.repeat_time = 0\n\n        self.t_pressed = 0\n        self.t_repeat = 0\n        self.hold_fired = False\n        self.plugin = plugin\n\n\nclass Buttonshim(plugins.Plugin):\n    __author__ = 'gon@o2online.de, Anodynous'\n    __version__ = '0.0.2'\n    __license__ = 'GPL3'\n    __description__ = 'Pimoroni Button Shim GPIO Button and RGB LED support plugin based on the pimoroni-buttonshim-lib and the pwnagotchi-gpio-buttons-plugin'\n\n    def __init__(self):\n        self._agent = None\n        self.running = False\n        self.options = dict()\n        self._running = False\n        self._plover_wpm_meters_enabled = False\n        \n        self._states = None\n        self._bus = None\n        self._reg_queue = []\n        self._update_queue = []\n        self._brightness = 0.5\n        self._led_queue = queue.Queue()\n        self._t_poll = None\n        self._running = False\n        self._states = 0b00011111\n        self._handlers = [None,None,None,None,None]\n        self._button_was_held = False\n\n    def on_loaded(self):\n        logging.info(\"[buttonshim] GPIO Button plugin loaded.\")\n        self.running = True\n        self._handlers = [Handler(self) for x in range(NUM_BUTTONS)]\n        self.on_press([BUTTON_A, BUTTON_B, BUTTON_C, BUTTON_D, BUTTON_E], self.press_handler)\n        self.on_hold([BUTTON_A, BUTTON_B, BUTTON_C, BUTTON_D, BUTTON_E], self.hold_handler)\n        self.on_release([BUTTON_A, BUTTON_B, BUTTON_C, BUTTON_D, BUTTON_E], self.release_handler)\n\n    def on_config_changed(self, config):\n        self.config = config\n\n    def on_ready(self, agent):\n        self._agent = agent\n\n    def set_ui_update(self, key, value):\n        self._agent.view().set(key, value)\n\n    def trigger_ui_update(self):\n        self._agent.view().update()\n\n    def _run(self):\n        self._running = True\n        _last_states = 0b00011111\n        _errors = 0\n\n        while self._running:\n            led_data = None\n\n            try:\n                led_data = self._led_queue.get(False)\n                self._led_queue.task_done()\n\n            except queue.Empty:\n                pass\n\n            try:\n                if led_data:\n                    for chunk in self._chunk(led_data, 32):\n                        self._bus.write_i2c_block_data(ADDR, REG_OUTPUT, chunk)\n\n                self._states = self._bus.read_byte_data(ADDR, REG_INPUT)\n\n            except IOError:\n                _errors += 1\n                if _errors > ERROR_LIMIT:\n                    self._running = False\n                    raise IOError(\"More than {} IO errors have occurred!\".format(ERROR_LIMIT))\n\n            for x in range(NUM_BUTTONS):\n                last = (_last_states >> x) & 1\n                curr = (self._states >> x) & 1\n                handler = self._handlers[x]\n\n                # If last > curr then it's a transition from 1 to 0\n                # since the buttons are active low, that's a press event\n                if last > curr:\n                    handler.t_pressed = time.time()\n                    handler.hold_fired = False\n\n                    if callable(handler.press):\n                        handler.t_repeat = time.time()\n                        Thread(target=handler.press, args=(x, True, handler.plugin)).start()\n\n                    continue\n\n                if last < curr and callable(handler.release):\n                    Thread(target=handler.release, args=(x, False, handler.plugin)).start()\n                    continue\n\n                if curr == 0:\n                    if callable(handler.hold) and not handler.hold_fired and (time.time() - handler.t_pressed) > handler.hold_time:\n                        Thread(target=handler.hold, args=(x,)).start()\n                        handler.hold_fired = True\n\n                    if handler.repeat and callable(handler.press) and (time.time() - handler.t_repeat) > handler.repeat_time:\n                        self._handlers[x].t_repeat = time.time()\n                        Thread(target=self._handlers[x].press, args=(x, True, handler.plugin)).start()\n\n            _last_states = self._states\n\n            time.sleep(1.0 / FPS)\n\n\n    def _quit(self):\n\n        if self._running:\n            self._led_queue.join()\n            self.set_pixel(0, 0, 0)\n            self._led_queue.join()\n\n        self._running = False\n        self._t_poll.join()\n\n\n    def setup(self):\n        if self._bus is not None:\n            return\n\n        try:\n            self._bus = smbus.SMBus(1)\n\n            self._bus.write_byte_data(ADDR, REG_CONFIG, 0b00011111)\n            self._bus.write_byte_data(ADDR, REG_POLARITY, 0b00000000)\n            self._bus.write_byte_data(ADDR, REG_OUTPUT, 0b00000000)\n\n            self._t_poll = Thread(target=self._run)\n            self._t_poll.daemon = True\n            self._t_poll.start()\n\n            self.set_pixel(0, 0, 0)\n\n            atexit.register(self._quit)\n        except OSError as ex:\n            logging.error(f\"[buttonshim] Ignore if no ButtonSHIM hw module present and web UI enabled: OSError encountered during setup: {ex}\")\n\n\n    def _set_bit(self, pin, value):\n        if value:\n            self._reg_queue[-1] |= (1 << pin)\n        else:\n            self._reg_queue[-1] &= ~(1 << pin)\n\n\n    def _next(self):\n        if len(self._reg_queue) == 0:\n            self._reg_queue = [0b00000000]\n        else:\n            self._reg_queue.append(self._reg_queue[-1])\n\n\n    def _enqueue(self):\n        self._led_queue.put(self._reg_queue)\n\n        self._reg_queue = []\n\n\n    def _chunk(self, l, n):\n        for i in range(0, len(l)+1, n):\n            yield l[i:i + n]\n\n\n    def _write_byte(self, byte):\n        for i in range(8):\n            self._next()\n            self._set_bit(LED_CLOCK, 0)\n            self._set_bit(LED_DATA, byte & 0b10000000)\n            self._next()\n            self._set_bit(LED_CLOCK, 1)\n            byte <<= 1\n\n\n    def on_hold(self, buttons, handler=None, hold_time=1):\n        \"\"\"Attach a hold handler to one or more buttons.\n\n        This handler is fired when you hold a button for hold_time seconds.\n\n        When fired it will run in its own Thread.\n\n        It will be passed one argument, the button index::\n\n            @buttonshim.on_hold(buttonshim.BUTTON_A)\n            def handler(button):\n                # Your code here\n\n        :param buttons: A single button, or a list of buttons\n        :param handler: Optional: a function to bind as the handler\n        :param hold_time: Optional: the hold time in seconds (default 2)\n\n        \"\"\"\n        self.setup()\n\n        if buttons is None:\n            buttons = [BUTTON_A, BUTTON_B, BUTTON_C, BUTTON_D, BUTTON_E]\n\n        if isinstance(buttons, int):\n            buttons = [buttons]\n\n        def attach_handler(handler):\n            for button in buttons:\n                self._handlers[button].hold = handler\n                self._handlers[button].hold_time = hold_time\n\n        if handler is not None:\n            attach_handler(handler)\n        else:\n            return attach_handler\n\n\n    def on_press(self, buttons, handler=None, repeat=False, repeat_time=0.5):\n        \"\"\"Attach a press handler to one or more buttons.\n\n        This handler is fired when you press a button.\n\n        When fired it will be run in its own Thread.\n\n        It will be passed two arguments, the button index and a\n        boolean indicating whether the button has been pressed/released::\n\n            @buttonshim.on_press(buttonshim.BUTTON_A)\n            def handler(button, pressed):\n                # Your code here\n\n        :param buttons: A single button, or a list of buttons\n        :param handler: Optional: a function to bind as the handler\n        :param repeat: Optional: Repeat the handler if the button is held\n        :param repeat_time: Optional: Time, in seconds, after which to repeat\n\n        \"\"\"\n        self.setup()\n\n        if buttons is None:\n            buttons = [BUTTON_A, BUTTON_B, BUTTON_C, BUTTON_D, BUTTON_E]\n\n        if isinstance(buttons, int):\n            buttons = [buttons]\n\n        def attach_handler(handler):\n            for button in buttons:\n                self._handlers[button].press = handler\n                self._handlers[button].repeat = repeat\n                self._handlers[button].repeat_time = repeat_time\n\n        if handler is not None:\n            attach_handler(handler)\n        else:\n            return attach_handler\n\n\n    def on_release(self, buttons=None, handler=None):\n        \"\"\"Attach a release handler to one or more buttons.\n\n        This handler is fired when you let go of a button.\n\n        When fired it will be run in its own Thread.\n\n        It will be passed two arguments, the button index and a\n        boolean indicating whether the button has been pressed/released::\n\n            @buttonshim.on_release(buttonshim.BUTTON_A)\n            def handler(button, pressed):\n                # Your code here\n\n        :param buttons: A single button, or a list of buttons\n        :param handler: Optional: a function to bind as the handler\n\n        \"\"\"\n        self.setup()\n\n        if buttons is None:\n            buttons = [BUTTON_A, BUTTON_B, BUTTON_C, BUTTON_D, BUTTON_E]\n\n        if isinstance(buttons, int):\n            buttons = [buttons]\n\n        def attach_handler(handler):\n            for button in buttons:\n                self._handlers[button].release = handler\n\n        if handler is not None:\n            attach_handler(handler)\n        else:\n            return attach_handler\n\n\n    def set_brightness(self, brightness):\n        self.setup()\n\n        if not isinstance(brightness, int) and not isinstance(brightness, float):\n            raise ValueError(\"Brightness should be an int or float\")\n\n        if brightness < 0.0 or brightness > 1.0:\n            raise ValueError(\"Brightness should be between 0.0 and 1.0\")\n\n        self._brightness = brightness\n\n\n    def set_pixel(self, r, g, b):\n        \"\"\"Set the Button SHIM RGB pixel\n\n        Display an RGB colour on the Button SHIM pixel.\n\n        :param r: Amount of red, from 0 to 255\n        :param g: Amount of green, from 0 to 255\n        :param b: Amount of blue, from 0 to 255\n\n        You can use HTML colours directly with hexadecimal notation in Python. EG::\n\n            buttonshim.self.set_pixel(0xFF, 0x00, 0xFF)\n\n        \"\"\"\n        self.setup()\n\n        if not isinstance(r, int) or r < 0 or r > 255:\n            raise ValueError(\"Argument r should be an int from 0 to 255\")\n\n        if not isinstance(g, int) or g < 0 or g > 255:\n            raise ValueError(\"Argument g should be an int from 0 to 255\")\n\n        if not isinstance(b, int) or b < 0 or b > 255:\n            raise ValueError(\"Argument b should be an int from 0 to 255\")\n\n        r, g, b = [int(x * self._brightness) for x in (r, g, b)]\n\n        self._write_byte(0)\n        self._write_byte(0)\n        self._write_byte(0b11101111)\n        self._write_byte(LED_GAMMA[b & 0xff])\n        self._write_byte(LED_GAMMA[g & 0xff])\n        self._write_byte(LED_GAMMA[r & 0xff])\n        self._write_byte(0)\n        self._write_byte(0)\n        self._enqueue()\n\n    def blink(self, r, g, b, ontime, offtime, blinktimes):\n        logging.debug(\"[buttonshim] Blink\")\n        for i in range(0, blinktimes):\n            self.set_pixel(r, g, b)\n            time.sleep(ontime)\n            self.set_pixel(0, 0, 0)\n            time.sleep(offtime)\n\n    def press_handler(self, button, pressed, plugin):\n        \"\"\" On press reset button held status \"\"\"\n        self._button_was_held = False\n\n    def toggle_qwerty_steno(self):\n        try:\n            cap_state = plugins.loaded['evdevkb'].get_capture_state()\n            if not cap_state:\n                plugins.loaded['evdevkb'].start_capture()\n                logging.info(f\"[buttonshim] Switched to QWERTY mode\")\n            else:\n                plugins.loaded['evdevkb'].stop_capture()\n                logging.info(f\"[buttonshim] Switched to STENO mode\")\n        except Exception as ex:\n            logging.exception(f\"[buttonshim] Check if evdevkb is loaded, exception: {str(ex)}\")\n    \n    def toggle_wpm_meters(self):\n        command = {}\n        try:\n            wpm_method = plugins.loaded['plover_link'].options['wpm_method']\n            wpm_timeout = plugins.loaded['plover_link'].options['wpm_timeout']\n        except Exception as ex:\n            logging.exception(f\"[buttonshim] Check that wpm_method and wpm_timeout is configured. Falling back to defaults. Exception: {str(ex)}\")\n            wpm_method = 'ncra'\n            wpm_timeout = '60'\n\n        if self._plover_wpm_meters_enabled:\n            command = {'stop_wpm_meter': 'wpm and strokes'}\n            self.set_ui_update('wpm', '')\n            self.set_ui_update('strokes', '')\n            self.trigger_ui_update()\n            logging.info(f\"[buttonshim] Disabled WPM readings\")\n\n        elif not self._plover_wpm_meters_enabled:\n            command = {'start_wpm_meter': 'wpm and strokes',\n                        'wpm_method' : wpm_method,\n                        'wpm_timeout' : wpm_timeout}\n\n            self.set_ui_update('wpm', wpm_method)\n            self.set_ui_update('strokes', f\"{wpm_timeout}s\")\n            self.trigger_ui_update()\n\n            logging.info(f\"[buttonshim] Enabled WPM readings using method {wpm_method} and timeout {wpm_timeout}\")\n\n        self._plover_wpm_meters_enabled = not self._plover_wpm_meters_enabled\n        plugins.loaded['plover_link'].send_signal_to_plover(command)\n    \n    def toggle_dictionary_lookup(self):\n        if plugins.loaded['dict_lookup'].get_running():\n            if not plugins.loaded['dict_lookup'].get_input_mode():  # If not currently enabled, enable input mode\n                plugins.loaded['dict_lookup'].enable_input_mode()\n            else:                                                   # If currently enabled, revert to normal view\n                plugins.loaded['dict_lookup'].disable_input_mode()\n        else: \n            logging.debug(f\"[buttonshim] dict_lookup is not ready yet. Check that Plover is running.\")\n\n    def hold_handler(self, button):\n        \"\"\" On long press run built in internal Stenogotchi commands \"\"\"\n        # Set button held status to prevent release_handler from triggering on release\n        self._button_was_held = True\n\n        # Blink in response to long hold event\n        red = 0\n        green = 70\n        blue = 70\n        on_time = 1\n        off_time = 0\n        blink_times = 1\n        thread = Thread(target=self.blink, args=(red, green, blue, on_time, off_time, blink_times))\n        thread.start()\n           \n        if NAMES[button] == 'A':\n            # Toggle QWERTY/STENO mode\n            self.toggle_qwerty_steno()     \n        \n        elif NAMES[button] == 'B':\n            # Toggle WPM & strokes meters for Plover\n            self.toggle_wpm_meters()\n\n        elif NAMES[button] == 'C':\n            # Toggle dictionary lookup mode\n            self.toggle_dictionary_lookup()\n\n        elif NAMES[button] == 'D':\n            # Toggle wifi on/off\n            stenogotchi.set_wifi_onoff()\n            # Check for changes in wifi status over a short while\n            for i in range(5):\n                self._agent._update_wifi()\n                time.sleep(2)\n            logging.info(f\"[buttonshim] Toggled wifi state\")\n            \n        elif NAMES[button] == 'E':\n            # Initiate clean shutdown process\n            logging.info(f\"[buttonshim] Initiated clean shutdown\")\n            stenogotchi.shutdown()\n    \n    def release_handler(self, button, pressed, plugin):\n        \"\"\" On short press run command from config \"\"\"\n        if not self._button_was_held:\n            logging.info(f\"[buttonshim] Button Pressed! Loading command from slot '{button}' for button '{NAMES[button]}'\")\n            bCfg = plugin.options['buttons'][NAMES[button]]\n            blinkCfg = bCfg['blink']\n            logging.debug(f'[buttonshim] {self.blink}')\n            if blinkCfg['enabled'] == True:\n                logging.debug(f\"[buttonshim] Blinking led\")\n                red = int(blinkCfg['red'])\n                green = int(blinkCfg['green'])\n                blue = int(blinkCfg['blue'])\n                on_time = float(blinkCfg['on_time'])\n                off_time = float(blinkCfg['off_time'])\n                blink_times =  int(blinkCfg['blink_times'])\n                logging.debug(f\"[buttonshim] red {red} green {green} blue {blue} on_time {on_time} off_time {off_time} blink_times {blink_times}\")\n                thread = Thread(target=self.blink, args=(red, green, blue, on_time, off_time, blink_times))\n                thread.start()\n                logging.debug(f\"[buttonshim] Blink thread started\")\n            command = bCfg['command']\n            if command == '':\n                logging.debug(f\"[buttonshim] Command empty\")\n            else:\n                logging.debug(f\"[buttonshim] Process create: {command}\")\n                process = subprocess.Popen(command, shell=True, stdin=None, stdout=open(\"/dev/null\", \"w\"), stderr=None, executable=\"/bin/bash\")\n                process.wait()\n                process = None\n                logging.debug(f\"[buttonshim] Process end\")\n"
  },
  {
    "path": "stenogotchi/plugins/default/dict_lookup.py",
    "content": "#!/usr/bin/env python3\n\nimport logging\nimport time\nimport random\n\nimport stenogotchi.plugins as plugins\nfrom stenogotchi.ui.components import LabeledValue, Text, Line\nfrom stenogotchi.ui.view import BLACK\nfrom stenogotchi.ui import view, state, faces\nimport stenogotchi.ui.fonts as fonts\n\nclass UiHandler():\n    def __init__(self, agent):\n        self.clear_elements = ('name', 'ups', 'wpm', 'status', 'strokes', 'uptime', 'line1')\n        self.input_mode = False\n        self._agent = agent\n        self._view = view.ROOT\n        self._stored_state = state.State()\n        self.minion_font = fonts.ImageFont.truetype(\"%s-Bold\" % fonts.FONT_NAME, 18)\n        self.minion_offset = 65\n     \n    def store_state(self):\n        for key, element in self._view._state.items():\n            if key in self.clear_elements or key == 'face':\n                self._stored_state.add_element(key, element)\n    \n    def restore_state(self):\n        # Add all removed items back\n        for key, element in self._stored_state.items():\n            if key in self.clear_elements:\n                self.add_element(key, element)\n\n    def surprise_exit(self):\n        if not self._view.get('face') == faces.LOOK_L:\n            self._view.set('face', faces.LOOK_L)\n            self.update_view()\n            time.sleep(1)\n        self._view.set('face', faces.LOOK_R)\n        self.update_view()\n        time.sleep(1)\n    \n    def relocate_face(self, minion):\n        self.remove_element('face')\n        if minion:\n            # Shrink and relocate\n            face = random.choices((faces.LOOK_L_HAPPY, faces.LOOK_L), weights=(0.9, 0.10), k=1)\n            self.add_element('face', Text(value=face[0], position=((self._view._width - self.minion_offset + 2), 0), color=BLACK, font=self.minion_font))\n        else:\n            # Grow and relocate, state doesn't matter as we will update it before view refresh\n            self.add_element('face', self._stored_state._state['face'])\n\n    def check_element(self, key):\n        return self._view.has_element(key)\n\n    def remove_element(self, key):\n        try:\n            self._view.remove_element(key)\n        except KeyError:\n            # TODO: fix self._view.has_element to replace this. Always seems to return None right now.\n            logging.error(f\"[dict_lookup] No element '{key}' available for removal\")\n\n    def add_element(self, key, element):\n        self._view.add_element(key, element)\n\n    def update_view(self):\n        self._view.update()\n\n    def enable_input_mode(self):\n        # Storing current state\n        self.store_state()\n        # Removing elements we will be overlapping and block them from triggering ui updates   \n        for element in self.clear_elements:\n            self.remove_element(element)\n        # Block update of ui elements we removed\n        self._view._ignore_changes = self.clear_elements\n        # Shrink stenogotchi face\n        self.relocate_face(minion=True)\n        # Add new ui elements for input and output        \n        line1_offset = self._view._layout['line1'].copy()\n        line1_offset[2] = self._view._width - self.minion_offset\n        self.add_element('input', LabeledValue(color=BLACK, label='', value='', position=(0, 0) , label_font=fonts.Bold, text_font=fonts.Medium, max_length=29))\n        self.add_element('line1_offset', Line(line1_offset, color=BLACK))\n        self.add_element('out1', Text(value='', position=self._agent._view._layout['name'], color=BLACK, font=fonts.Bold, wrap=True, max_length=self._agent._view._layout['status']['max']-1))\n        self.add_element('out2', Text(value='', position=self._agent._view._layout['status']['pos'], color=BLACK, font=self._agent._view._layout['status']['font'], wrap=True, max_length=self._agent._view._layout['status']['max']))\n        self.input_mode = True\n        # Used instead of self.update_view() to indicate input position from the start\n        self.display_input(\"\")\n        logging.info(\"[dict_lookup] Enabled dictionary lookup mode\")\n\n    def disable_input_mode(self):\n        # Add some variety to the exit\n        if random.randint(0, 9) > 7:\n            self.surprise_exit()\n        self._view.remove_element('line1_offset')\n        self._view.remove_element('input')\n        self._view.remove_element('out1')\n        self._view.remove_element('out2')\n        # Restore removed elements\n        self.restore_state()\n        # Grow stenogotchi face\n        self.relocate_face(minion=False)\n        # revert default update-ignore state\n        if self._view._config['ui']['fps'] > 0.0:\n            self._view._ignore_changes = ()\n        else:\n            self._view._ignore_changes = ('uptime', 'name')\n        # Prepare new empty state object\n        self._stored_state = state.State()\n        # Refresh uptime, set return message which will trigger ui update\n        self._agent._update_uptime()\n        self._agent.set_on_dict_lookup_done()\n        \n        self.input_mode = False\n        logging.info(\"[dict_lookup] Disabled dictionary lookup mode\")\n\n    def get_input_mode(self):\n        return self.input_mode\n\n    def display_output(self, list):\n        if self.get_input_mode():\n            out1_str = \"\"\n            out2_str = \"\"\n            \n            #TODO: handle list items longer than max supported length for column\n            cnt = 0\n            for item in list:\n                if cnt < 6:  # lines 0-5 fit in first column\n                    out1_str += f\"{item}\\n\"\n                elif cnt < 13:  # lines 6-11 fit in second column\n                    out2_str += f\"{item}\\n\"\n                else:\n                    break  # no more room\n                cnt += 1\n\n            self._view.set('out1', out1_str)\n            self._view.set('out2', out2_str)\n            self.update_view()\n\n    def display_input(self, string, position_indicator=\"_\"):\n        if self.get_input_mode():\n            string += position_indicator   # Character added to highlight input position\n            self._agent._view.set('input', string)\n            self.update_view()\n\n\nclass InputHandler():\n    # TODO: Add support for evdevkb as input device\n    def __init__(self, agent):\n        self._agent = agent\n        self.input_mode = False\n        self._input = \"\"\n    \n    def _on_send_string(self, text: str):\n        # If enter key received\n        if text in ('\\n', '\\r', '\\r\\n'):\n            if plugins.loaded['dict_lookup'].get_input_mode():\n                self._input += \" \"\n                self.push_input(position_indicator=\"\")\n                plugins.loaded['dict_lookup'].lookup_word(self._input)\n        else:\n            self._input += text\n            self.push_input()\n\n    def _on_send_backspaces(self, count: int):\n        if count >= len(self._input):\n            self.clear_input()\n        else:\n            self._input = self._input[:-count]\n            self.push_input()\n\n    def _on_send_key_combination(self, combination: str):\n        if combination == 'Control_L(BackSpace)':\n            self.clear_input()\n        else:\n            logging.warning(f\"[dict_lookup] Key-combinations not supported. Input '{combination}' ignored\")\n    \n    def _on_lookup_results(self, results_list):\n        # logging.debug(f\"[dict_lookup] Lookup result from Plover '{results_list}'\")\n        plugins.loaded['dict_lookup'].display_lookup_result(results_list)\n\n    def enable_input_mode(self):\n        # TODO: trigger routing from evdevkb to here\n        command = {'output_to_stenogotchi': True}\n        plugins.loaded['plover_link'].send_signal_to_plover(command)\n        self.input_mode = True\n\n    def disable_input_mode(self):\n        # TODO: revert routing from evdevkb to btclient\n        command = {'output_to_stenogotchi': False}\n        plugins.loaded['plover_link'].send_signal_to_plover(command)\n        self.input_mode = False\n\n    def push_input(self, position_indicator=\"_\"):\n        plugins.loaded['dict_lookup'].push_input(self._input, position_indicator)\n\n    def clear_input(self):\n        self._input = \"\"\n        self.push_input()\n\n\nclass DictLookup(plugins.Plugin):\n    __autohor__ = 'Anodynous'\n    __version__ = '0.3'\n    __license__ = 'GPL3'\n    __description__ = 'This plugin enables looking up words and strokes in enabled plover dictionaries'\n\n    def __init__(self):\n        self._agent = None\n        self.config = None\n        self.running = False\n        self.input_mode = False\n        self.input_handler = None \n        self.ui_handler = None\n\n    def on_plover_ready(self, agent):\n        self._agent = agent\n        self.ui_handler = UiHandler(agent)\n        self.input_handler = InputHandler(agent)\n        self.running = True\n\n    def on_config_changed(self, config):\n        self.config = config\n                    \n    def on_unload(self, ui):\n        self.lookup = None\n        self.ui_handler = None\n\n    def get_running(self):\n        return self.running\n\n    def get_input_mode(self):\n        return self.input_mode\n\n    def enable_input_mode(self):\n        self.ui_handler.enable_input_mode()\n        self.input_handler.enable_input_mode()\n        self.input_mode = True\n\n    def disable_input_mode(self):\n        self.ui_handler.disable_input_mode()\n        self.input_handler.disable_input_mode()\n        self.input_handler.clear_input()\n        self.input_mode = False\n\n    def lookup_word(self, word):\n        # Remove leading/trailing whitespaces and send word to plover for dictionary lookup\n        word = word.strip()\n        command = {'lookup_word': word}\n        plugins.loaded['plover_link'].send_signal_to_plover(command)\n\n    def lookup_stroke(self, stroke):\n        # Remove leading/trailing whitespaces and send stroke to plover for dictionary lookup\n        # TODO: implement functionality to use stroke-lookup\n        stroke = stroke.strip()\n        logging.debug(f\"[dict_lookup] Looking up stroke '{stroke}'\")\n        command = {'lookup_word': stroke}\n        plugins.loaded['plover_link'].send_signal_to_plover(command)\n   \n    def display_lookup_result(self, results_list):\n        self.push_output(results_list)\n\n    def sort_list(self, rlist):\n        # Sorts the results in ascending order.\n        # Primary sorting key: number of chords\n        # Secondary sorting key: length of chord(combination)\n        sort_key = lambda k : (k.count('/'), len(k))\n        rlist_sorted = []\n        if len(rlist) < 2:\n            return rlist\n        else:\n            rlist_sorted = sorted(rlist, key=sort_key)\n            return rlist_sorted\n\n    def push_input(self, string=\"\", position_indicator=\"_\"):\n        if self.input_mode:\n            self.ui_handler.display_input(string, position_indicator)\n    \n    def push_output(self, rlist):\n        if self.input_mode:\n            if rlist:\n                rlist_sorted = self.sort_list(rlist)\n            else:\n                rlist_sorted = []\n            self.ui_handler.display_output(rlist_sorted)        \n        \nif __name__ == '__main__':\n    print(\"Please enable and run as Stenogotchi plugin\")"
  },
  {
    "path": "stenogotchi/plugins/default/evdevkb.py",
    "content": "\"\"\"\nEvdev based keyboard client for capturing input and relays the keypress to a Bluetooth HID keyboard emulator D-BUS Service\n\nBased on: https://gist.github.com/ukBaz/a47e71e7b87fbc851b27cde7d1c0fcf0#file-readme-md\nWhich in turn takes the original idea from: http://yetanotherpointlesstechblog.blogspot.com/2016/04/emulating-bluetooth-keyboard-with.html\n\nTested on:\n    Python 3.7 (needs 3.4+)\n    Evdev 1.3.0\n\"\"\"\n\nimport logging\nimport evdev\nfrom select import select\nfrom time import sleep\n\nif not __name__ == '__main__':\n    import stenogotchi.plugins as plugins\n    ObjectClass = plugins.Plugin\nelse:\n    import dbus\n    ObjectClass = object\n\nHID_DBUS = 'com.github.stenogotchi'\nHID_SRVC = '/com/github/stenogotchi'\n\nKEYTABLE = {\n    \"KEY_RESERVED\": 0,\n    \"KEY_ESC\": 41,\n    \"KEY_1\": 30,\n    \"KEY_2\": 31,\n    \"KEY_3\": 32,\n    \"KEY_4\": 33,\n    \"KEY_5\": 34,\n    \"KEY_6\": 35,\n    \"KEY_7\": 36,\n    \"KEY_8\": 37,\n    \"KEY_9\": 38,\n    \"KEY_0\": 39,\n    \"KEY_MINUS\": 45,\n    \"KEY_EQUAL\": 46,\n    \"KEY_BACKSPACE\": 42,\n    \"KEY_TAB\": 43,\n    \"KEY_Q\": 20,\n    \"KEY_W\": 26,\n    \"KEY_E\": 8,\n    \"KEY_R\": 21,\n    \"KEY_T\": 23,\n    \"KEY_Y\": 28,\n    \"KEY_U\": 24,\n    \"KEY_I\": 12,\n    \"KEY_O\": 18,\n    \"KEY_P\": 19,\n    \"KEY_LEFTBRACE\": 47,\n    \"KEY_RIGHTBRACE\": 48,\n    \"KEY_ENTER\": 40,\n    \"KEY_LEFTCTRL\": 224,\n    \"KEY_A\": 4,\n    \"KEY_S\": 22,\n    \"KEY_D\": 7,\n    \"KEY_F\": 9,\n    \"KEY_G\": 10,\n    \"KEY_H\": 11,\n    \"KEY_J\": 13,\n    \"KEY_K\": 14,\n    \"KEY_L\": 15,\n    \"KEY_SEMICOLON\": 51,\n    \"KEY_APOSTROPHE\": 52,\n    \"KEY_GRAVE\": 53,\n    \"KEY_LEFTSHIFT\": 225,\n    \"KEY_BACKSLASH\": 50,\n    \"KEY_Z\": 29,\n    \"KEY_X\": 27,\n    \"KEY_C\": 6,\n    \"KEY_V\": 25,\n    \"KEY_B\": 5,\n    \"KEY_N\": 17,\n    \"KEY_M\": 16,\n    \"KEY_COMMA\": 54,\n    \"KEY_DOT\": 55,\n    \"KEY_SLASH\": 56,\n    \"KEY_RIGHTSHIFT\": 229,\n    \"KEY_KPASTERISK\": 85,\n    \"KEY_LEFTALT\": 226,\n    \"KEY_SPACE\": 44,\n    \"KEY_CAPSLOCK\": 57,\n    \"KEY_F1\": 58,\n    \"KEY_F2\": 59,\n    \"KEY_F3\": 60,\n    \"KEY_F4\": 61,\n    \"KEY_F5\": 62,\n    \"KEY_F6\": 63,\n    \"KEY_F7\": 64,\n    \"KEY_F8\": 65,\n    \"KEY_F9\": 66,\n    \"KEY_F10\": 67,\n    \"KEY_NUMLOCK\": 83,\n    \"KEY_SCROLLLOCK\": 71,\n    \"KEY_KP7\": 95,\n    \"KEY_KP8\": 96,\n    \"KEY_KP9\": 97,\n    \"KEY_KPMINUS\": 86,\n    \"KEY_KP4\": 92,\n    \"KEY_KP5\": 93,\n    \"KEY_KP6\": 94,\n    \"KEY_KPPLUS\": 87,\n    \"KEY_KP1\": 89,\n    \"KEY_KP2\": 90,\n    \"KEY_KP3\": 91,\n    \"KEY_KP0\": 98,\n    \"KEY_KPDOT\": 99,\n    \"KEY_ZENKAKUHANKAKU\": 148,\n    \"KEY_102ND\": 100,\n    \"KEY_F11\": 68,\n    \"KEY_F12\": 69,\n    \"KEY_RO\": 135,\n    \"KEY_KATAKANA\": 146,\n    \"KEY_HIRAGANA\": 147,\n    \"KEY_HENKAN\": 138,\n    \"KEY_KATAKANAHIRAGANA\": 136,\n    \"KEY_MUHENKAN\": 139,\n    \"KEY_KPJPCOMMA\": 140,\n    \"KEY_KPENTER\": 88,\n    \"KEY_RIGHTCTRL\": 228,\n    \"KEY_KPSLASH\": 84,\n    \"KEY_SYSRQ\": 70,\n    \"KEY_RIGHTALT\": 230,\n    \"KEY_HOME\": 74,\n    \"KEY_UP\": 82,\n    \"KEY_PAGEUP\": 75,\n    \"KEY_LEFT\": 80,\n    \"KEY_RIGHT\": 79,\n    \"KEY_END\": 77,\n    \"KEY_DOWN\": 81,\n    \"KEY_PAGEDOWN\": 78,\n    \"KEY_INSERT\": 73,\n    \"KEY_DELETE\": 76,\n    \"KEY_MUTE\": 239,\n    \"KEY_VOLUMEDOWN\": 238,\n    \"KEY_VOLUMEUP\": 237,\n    \"KEY_POWER\": 102,\n    \"KEY_KPEQUAL\": 103,\n    \"KEY_PAUSE\": 72,\n    \"KEY_KPCOMMA\": 133,\n    \"KEY_HANGEUL\": 144,\n    \"KEY_HANJA\": 145,\n    \"KEY_YEN\": 137,\n    \"KEY_LEFTMETA\": 227,\n    \"KEY_RIGHTMETA\": 231,\n    \"KEY_COMPOSE\": 101,\n    \"KEY_STOP\": 243,\n    \"KEY_AGAIN\": 121,\n    \"KEY_PROPS\": 118,\n    \"KEY_UNDO\": 122,\n    \"KEY_FRONT\": 119,\n    \"KEY_COPY\": 124,\n    \"KEY_OPEN\": 116,\n    \"KEY_PASTE\": 125,\n    \"KEY_FIND\": 244,\n    \"KEY_CUT\": 123,\n    \"KEY_HELP\": 117,\n    \"KEY_CALC\": 251,\n    \"KEY_SLEEP\": 248,\n    \"KEY_WWW\": 240,\n    \"KEY_COFFEE\": 249,\n    \"KEY_BACK\": 241,\n    \"KEY_FORWARD\": 242,\n    \"KEY_EJECTCD\": 236,\n    \"KEY_NEXTSONG\": 235,\n    \"KEY_PLAYPAUSE\": 232,\n    \"KEY_PREVIOUSSONG\": 234,\n    \"KEY_STOPCD\": 233,\n    \"KEY_REFRESH\": 250,\n    \"KEY_EDIT\": 247,\n    \"KEY_SCROLLUP\": 245,\n    \"KEY_SCROLLDOWN\": 246,\n    \"KEY_F13\": 104,\n    \"KEY_F14\": 105,\n    \"KEY_F15\": 106,\n    \"KEY_F16\": 107,\n    \"KEY_F17\": 108,\n    \"KEY_F18\": 109,\n    \"KEY_F19\": 110,\n    \"KEY_F20\": 111,\n    \"KEY_F21\": 112,\n    \"KEY_F22\": 113,\n    \"KEY_F23\": 114,\n    \"KEY_F24\": 115\n}\n\n# Map modifier keys to array element in the bit array\nMODKEYS = {\n    \"KEY_RIGHTMETA\": 0,\n    \"KEY_RIGHTALT\": 1,\n    \"KEY_RIGHTSHIFT\": 2,\n    \"KEY_RIGHTCTRL\": 3,\n    \"KEY_LEFTMETA\": 4,\n    \"KEY_LEFTALT\": 5,\n    \"KEY_LEFTSHIFT\": 6,\n    \"KEY_LEFTCTRL\": 7\n}\n\nclass EvdevKbrd:\n    \"\"\"\n    Take the events from a physically attached keyboard and send the\n    HID messages to the keyboard D-Bus server.\n    \"\"\"\n    def __init__(self, skip_dbus = False):\n        self._skip_dbus = skip_dbus\n        self.do_capture = False\n        self.keytable = KEYTABLE\n        self.modkeys = MODKEYS\n        self.target_length = 6\n        self.mod_keys = 0b00000000\n        self.pressed_keys = []\n        self.have_kb = False\n        self.devs = None\n        if self._skip_dbus:\n            self.bus = None\n            self.btkobject = None\n            self.btk_service = None\n        else:\n            self.bus = dbus.SystemBus()\n            self.btkobject = self.bus.get_object(HID_DBUS, HID_SRVC)\n            self.btk_service = dbus.Interface(self.btkobject, HID_DBUS)\n        \n    def convert(self, evdev_keycode):\n        return self.keytable[evdev_keycode]\n\n    def modkey(self, evdev_keycode):\n        if evdev_keycode in self.modkeys:\n            return self.modkeys[evdev_keycode]\n        else:\n            return -1  # Return an invalid array element\n    \n    def set_do_capture(self, toggle):\n        self.do_capture = toggle\n\n    def grab(self):\n        # Make input device unavailable for other applications\n        for dev in self.devs:\n            dev.grab()\n\n    def ungrab(self):\n        # Release input device for other applications\n        for dev in self.devs:\n            dev.ungrab()\n    \n    def get_input_devices(self):\n        # Returns all input devices connected to device\n        input_devices = [evdev.InputDevice(path) for path in evdev.list_devices()]\n        return input_devices\n\n    def get_keyboards(self):\n        # Returns all input devices that look like keyboards that are connected to device\n        input_devices = self.get_input_devices()\n        keyboards = []\n        for device in input_devices:\n            # Check if the input device has a KEY_A\n            has_key_a = evdev.ecodes.KEY_A in device.capabilities().get(evdev.ecodes.EV_KEY, [])\n            if has_key_a:\n                keyboards.append(device)\n                logging.debug(f\"[evdevkb] Found keyboard '{device.name}' at path '{device.path}'\")\n        return keyboards\n    \n    def set_keyboards(self):\n        # Sets all keyboards as device to listen for key-inputs from\n        while not self.have_kb:\n            if not self.do_capture:\n                break\n            keyboards = self.get_keyboards()\n            if keyboards:\n                self.devs = keyboards\n                self.have_kb = True\n            else:\n                logging.debug('[evdevkb] Keyboard not found, waiting 3 seconds and retrying')\n                sleep(3)\n\n    def update_mod_keys(self, mod_key, value):\n        \"\"\"\n        Which modifier keys are active is stored in an 8 bit number.\n        Each bit represents a different key. This method takes which bit\n        and its new value as input\n        :param mod_key: The value of the bit to be updated with new value\n        :param value: Binary 1 or 0 depending if pressed or released\n        \"\"\"\n        bit_mask = 1 << (7-mod_key)\n        if value: # set bit\n            self.mod_keys |= bit_mask\n        else: # clear bit\n            self.mod_keys &= ~bit_mask\n\n    def update_keys(self, norm_key, value):\n        if value < 1:\n            self.pressed_keys.remove(norm_key)\n        elif norm_key not in self.pressed_keys:\n            self.pressed_keys.insert(0, norm_key)\n        len_delta = self.target_length - len(self.pressed_keys)\n        if len_delta < 0:\n            self.pressed_keys = self.pressed_keys[:len_delta]\n        elif len_delta > 0:\n            self.pressed_keys.extend([0] * len_delta)\n\n    @property\n    def state(self):\n        \"\"\"\n        property with the HID message to send for the current keys pressed\n        on the keyboards\n        :return: bytes of HID message\n        \"\"\"\n        return [0xA1, 0x01, self.mod_keys, 0, *self.pressed_keys]\n\n    def send_keys(self):\n        # If ran as part of Stenogotchi, communicate directly with plugin\n        if self._skip_dbus:\n            plugins.loaded['plover_link']._stenogotchiservice.send_keys([self.state])\n        # If ran as stand-alone, assume dbus is needed to access send_keys() function\n        else:\n            self.btk_service.send_keys(self.state)\n\n    def event_loop(self):\n        \"\"\"\n        Reads keypresses from all identified keyboards and sends them to emulated \n        bluetooth HID as long as do_capture is True.\n        \"\"\"\n        self.do_capture = True\n        self.grab()\n        \n        while self.do_capture:\n            r, w, x = select(self.devs, [], [], 0.01)  # 0.1 is default\n            for fd in r:\n                for event in fd.read():\n                    # We only want up/down key-events\n                    if event.type == evdev.ecodes.EV_KEY and event.value < 2:\n                        key_str = evdev.ecodes.KEY[event.code]\n                        mod_key = self.modkey(key_str)\n                        if mod_key > -1:\n                            self.update_mod_keys(mod_key, event.value)\n                        else:\n                            self.update_keys(self.convert(key_str), event.value)\n                        self.send_keys()\n        self.ungrab()\n        for dev in self.devs:\n            dev.close()\n\n\nclass EvdevKeyboard(ObjectClass):\n    __autohor__ = 'Anodynous'\n    __version__ = '0.2'\n    __license__ = 'MIT'\n    __description__ = 'This plugin captures and blocks keypress events using evdev and sends to module emulating bluetooth HID device.'\n\n    def __init__(self):\n        self._agent = None\n        self.evdevkb = None\n        self.do_capture = False\n     \n    def on_ready(self, agent):\n        self._agent = agent\n\n    def on_config_changed(self, config):\n        self.config = config\n\n    def trigger_ui_update(self, input_mode):\n        self._agent.view().set('mode', input_mode)\n        self._agent.view().update()\n\n    def start_capture(self):\n        logging.info('[evdevkb] Capturing evdev keypress events...')\n        self.trigger_ui_update('QWERTY')\n        self.evdevkb = EvdevKbrd(skip_dbus=True)\n        self.evdevkb.set_do_capture(True)\n        self.do_capture = True\n        self.evdevkb.set_keyboards()\n        self.evdevkb.event_loop()\n\n    def stop_capture(self):\n        logging.info('[evdevkb] Ignoring evdev keypress events...')\n        self.evdevkb.set_do_capture(False)\n        self.do_capture = False\n        self.evdevkb = None\n        self.trigger_ui_update('STENO')\n    \n    def get_capture_state(self):\n        return self.do_capture\n\nif __name__ == '__main__':\n    try:\n        print('Setting up keyboard')\n        kb = EvdevKbrd()\n\n        print('starting event loop')\n        kb.set_keyboards()\n        kb.event_loop()\n    except RuntimeError: pass       # Handling for bug in evdev 1.3.0, see https://github.com/gvalkov/python-evdev/issues/120\n\n"
  },
  {
    "path": "stenogotchi/plugins/default/example.py",
    "content": "# ###############################################################\n# Based on: https://github.com/evilsocket/pwnagotchi/blob/master/pwnagotchi/plugins/default/example.py\n#\n# Changed 22-03-2021 by Anodynous\n# - Changed to fit Stenogotchi events\n#\n################################################################\n\nimport logging\n\nimport stenogotchi.plugins as plugins\nfrom stenogotchi.ui.components import LabeledValue\nfrom stenogotchi.ui.view import BLACK\nimport stenogotchi.ui.fonts as fonts\n\n\nclass Example(plugins.Plugin):\n    __author__ = 'evilsocket@gmail.com, Anodynous'\n    __version__ = '1.0.0'\n    __license__ = 'GPL3'\n    __description__ = 'An example plugin for pwnagotchi that implements all the available callbacks.'\n\n    def __init__(self):\n        logging.debug(\"[example] example plugin created\")\n\n    # called when http://<host>:<port>/plugins/<plugin>/ is called\n    # must return a html page\n    # IMPORTANT: If you use \"POST\"s, add a csrf-token (via csrf_token() and render_template_string)\n    def on_webhook(self, path, request):\n        logging.info(\"[example] webhook established\")\n\n    # called when the plugin is loaded\n    def on_loaded(self):\n        logging.warning(\"[example] WARNING: this plugin should be disabled! options = \" % self.options)\n\n    # called before the plugin is unloaded\n    def on_unload(self, ui):\n        logging.info(\"[example] is unloaded\")\n\n    # called hen there's internet connectivity\n    def on_internet_available(self, agent):\n        logging.info(\"[example] unit has internet connection\")\n\n    # called to setup the ui elements\n    def on_ui_setup(self, ui):\n        # add custom UI elements\n        ui.add_element('ups', LabeledValue(color=BLACK, label='UPS', value='0%/0V', position=(ui.width() / 2 - 25, 0),\n                                           label_font=fonts.Bold, text_font=fonts.Medium))\n\n    # called when the ui is updated\n    def on_ui_update(self, ui):\n        # update those elements\n        some_voltage = 0.1\n        some_capacity = 100.0\n        ui.set('ups', \"%4.2fV/%2i%%\" % (some_voltage, some_capacity))\n\n    # called when the hardware display setup is done, display is an hardware specific object\n    def on_display_setup(self, display):\n        logging.info(\"[example] unit has set up display\")\n\n    # called when everything is ready and the main loop is about to start\n    def on_ready(self, agent):\n        logging.info(\"[example] unit is ready\")\n        # you can run custom bettercap commands if you want\n        #   agent.run('ble.recon on')\n        # or set a custom state\n        #   agent.set_bored()\n\n    # called when the status is set to grateful\n    def on_grateful(self, agent):\n        logging.info(\"[example] unit is grateful\")\n\n    # called when the status is set to lonely\n    def on_lonely(self, agent):\n        logging.info(\"[example] unit is lonely\")\n\n    # called when the status is set to bored\n    def on_bored(self, agent):\n        logging.info(\"[example] unit is bored\")\n\n    # called when the status is set to sad\n    def on_sad(self, agent):\n        logging.info(\"[example] unit is sad\")\n\n    # called when the status is set to angry\n    def on_angry(self, agent):\n        logging.info(\"[example] unit is angry\")\n\n    # called when the status is set to excited\n    def on_excited(self, agent):\n        logging.info(\"[example] unit is excited\")\n\n    # called when the agent is rebooting the board\n    def on_rebooting(self, agent):\n        logging.info(\"[example] unit is rebooting\")\n\n    # called when the agent is waiting for t seconds\n    def on_wait(self, agent, t):\n        logging.info(f\"[example] unit is waiting {t} seconds\")\n\n    # called when the agent is sleeping for t seconds\n    def on_sleep(self, agent, t):\n        logging.info(f\"[example] unit is sleeping {t} seconds\")\n\n    # called when an epoch is over (where an epoch is a single loop of the main algorithm)\n    def on_epoch(self, agent, epoch, epoch_data):\n        logging.info(f\"[example] epoch is over\")\n\n    # called when successfully connected to a bluetooth host\n    def on_bt_connected(self, agent, bthost_name):\n        logging.info(f\"[example] unit connected to bluetooth host '{bthost_name}'\")\n\n    # called when disconnected from bluetooth host\n    def on_bt_disconnected(self, agent):\n        logging.info(\"[example] unit disconnected from bluetooth host\")\n\n    # called when plover boots\n    def on_plover_boot(self, agent):\n        logging.info(\"[example] Plover is starting up\")\n\n    # called when plover is ready\n    def on_plover_ready(self, agent):\n        logging.info(\"[example] Plover is ready\")\n\n    # called when plover quits\n    def on_plover_quit(self, agent):\n        logging.info(\"[example] Plover has quit\")\n\n    # called when wifi is connected\n    def on_wifi_connected(self, agent, ssid, ip):\n        logging.info(f\"[example] unit is connected to wifi '{ssid}' using ip '{ip}'\")\n\n    # called when wifi is disconnected\n    def on_wifi_disconnected(self, agent):\n        logging.info(\"[example] unit is disconnected from wifi\")\n\n    # called when wpm stats are updated\n    def on_wpm_stats(self, agent):\n        logging.info(\"[example] unit received new WPM stats\")\n\n    # called when wpm-strokes stats are updated\n    def on_strokes_stats(self, agent):\n        logging.info(\"[example] unit received new WPM-strokes stats\")"
  },
  {
    "path": "stenogotchi/plugins/default/led.py",
    "content": "# ###############################################################\n# Based on: https://github.com/evilsocket/pwnagotchi/blob/master/pwnagotchi/plugins/default/led.py\n#\n# Changed 22-03-2021 by Anodynous\n# - Changed to fit Stenogotchi events\n#\n################################################################\n\nfrom threading import Event\nimport _thread\nimport logging\nimport time\n\nimport stenogotchi.plugins as plugins\n\n\nclass Led(plugins.Plugin):\n    __author__ = 'evilsocket@gmail.com, Anodynous'\n    __version__ = '1.0.0'\n    __license__ = 'GPL3'\n    __description__ = 'This plugin blinks the PWR led with different patterns depending on the event.'\n\n    def __init__(self):\n        self._is_busy = False\n        self._event = Event()\n        self._event_name = None\n        self._led_file = \"/sys/class/leds/led0/brightness\"\n        self._delay = 200\n\n    # called when the plugin is loaded\n    def on_loaded(self):\n        self._led_file = \"/sys/class/leds/led%d/brightness\" % self.options['led']\n        self._delay = int(self.options['delay'])\n\n        logging.info(\"[led] plugin loaded for %s\" % self._led_file)\n        self._on_event('loaded')\n        _thread.start_new_thread(self._worker, ())\n\n    def on_config_changed(self, config):\n        self.config = config\n\n    def _on_event(self, event):\n        if not self._is_busy:\n            self._event_name = event\n            self._event.set()\n            logging.debug(\"[led] event '%s' set\", event)\n        else:\n            logging.debug(\"[led] skipping event '%s' because the worker is busy\", event)\n\n    def _led(self, on):\n        with open(self._led_file, 'wt') as fp:\n            fp.write(str(on))\n\n    def _blink(self, pattern):\n        logging.debug(\"[led] using pattern '%s' ...\" % pattern)\n        for c in pattern:\n            if c == ' ':\n                self._led(1)\n            else:\n                self._led(0)\n            time.sleep(self._delay / 1000.0)\n        # reset\n        self._led(0)\n\n    def _worker(self):\n        while True:\n            self._event.wait()\n            self._event.clear()\n            self._is_busy = True\n\n            try:\n                if self._event_name in self.options['patterns']:\n                    pattern = self.options['patterns'][self._event_name]\n                    self._blink(pattern)\n                else:\n                    logging.debug(\"[led] no pattern defined for %s\" % self._event_name)\n            except Exception as e:\n                logging.exception(\"[led] error while blinking\")\n\n            finally:\n                self._is_busy = False\n\n    # called when the unit is updating its software\n    def on_updating(self):\n        self._on_event('updating')\n\n    # called when there's internet connectivity\n    def on_internet_available(self, agent):\n        self._on_event('internet_available')\n\n    # called when everything is ready and the main loop is about to start\n    def on_ready(self, agent):\n        self._on_event('ready')\n\n    # called when the status is set to grateful\n    def on_grateful(self, agent):\n        self._on_event('grateful')\n\n    # called when the status is set to lonely\n    def on_lonely(self, agent):\n        self._on_event('lonely')\n\n    # called when the status is set to bored\n    def on_bored(self, agent):\n        self._on_event('bored')\n\n    # called when the status is set to sad\n    def on_sad(self, agent):\n        self._on_event('sad')\n\n    # called when the status is set to angry\n    def on_angry(self, agent):\n        self._on_event('angry')\n\n    # called when the status is set to excited\n    def on_excited(self, agent):\n        self._on_event('excited')\n\n    # called when the agent is rebooting the board\n    def on_rebooting(self, agent):\n        self._on_event('rebooting')\n\n    # called when the agent is waiting for t seconds\n    def on_wait(self, agent, t):\n        self._on_event('wait')\n\n    # called when the agent is sleeping for t seconds\n    def on_sleep(self, agent, t):\n        self._on_event('sleep')\n\n    # called when an epoch is over (where an epoch is a single loop of the main algorithm)\n    def on_epoch(self, agent, epoch, epoch_data):\n        self._on_event('epoch')\n\n    # called when successfully connected to a bluetooth host\n    def on_bt_connected(self, agent, bthost_name):\n        self._on_event('bt_connected')\n\n    # called when disconnected from bluetooth host\n    def on_bt_disconnected(self, agent):\n        self._on_event('bt_disconnected')\n\n    # called when plover boots\n    def on_plover_boot(self, agent):\n        self._on_event('plover_boot')\n\n    # called when plover is ready\n    def on_plover_ready(self, agent):\n        self._on_event('plover_ready')\n\n    # called when plover quits\n    def on_plover_quit(self, agent):\n        self._on_event('plover_quit')\n\n    # called when wifi is connected\n    def on_wifi_connected(self, agent, ssid, ip):\n        self._on_event('wifi_connected')\n\n    # called when wifi is disconnected\n    def on_wifi_disconnected(self, agent):\n        self._on_event('wifi_disconnected')\n\n    # called when wpm stats are updated\n    def on_wpm_stats(self, agent):\n        self._on_event('wpm_set')\n\n    # called when wpm-strokes stats are updated\n    def on_strokes_stats(self, agent):\n        self._on_event('strokes_set')"
  },
  {
    "path": "stenogotchi/plugins/default/logtail.py",
    "content": "import os\nimport logging\nimport threading\nfrom itertools import islice\nfrom time import sleep\nfrom datetime import datetime,timedelta\nfrom stenogotchi import plugins\nfrom stenogotchi.utils import StatusFile\nfrom flask import render_template_string\nfrom flask import jsonify\nfrom flask import abort\nfrom flask import Response\n\n\nTEMPLATE = \"\"\"\n{% extends \"base.html\" %}\n{% set active_page = \"plugins\" %}\n{% block title %}\n    Logtail\n{% endblock %}\n\n{% block styles %}\n    {{ super() }}\n    <style>\n        * {\n            box-sizing: border-box;\n        }\n        #filter {\n            width: 100%;\n            font-size: 16px;\n            padding: 12px 20px 12px 40px;\n            border: 1px solid #ddd;\n            margin-bottom: 12px;\n        }\n        table {\n            border-collapse: collapse;\n            width: 100%;\n            border: 1px solid #ddd;\n        }\n        th, td {\n            text-align: left;\n            padding: 12px;\n            width: 1px;\n            white-space: nowrap;\n        }\n        td:nth-child(2) {\n            text-align: center;\n        }\n        thead, tr:hover {\n            background-color: #f1f1f1;\n        }\n        tr {\n            border-bottom: 1px solid #ddd;\n        }\n        div.sticky {\n            position: -webkit-sticky;\n            position: sticky;\n            top: 0;\n            display: table;\n            width: 100%;\n        }\n        div.sticky > * {\n            display: table-cell;\n        }\n        div.sticky > span {\n            width: 1%;\n        }\n        div.sticky > input {\n            width: 100%;\n        }\n        tr.default {\n            color: black;\n        }\n        tr.info {\n            color: black;\n        }\n        tr.warning {\n            color: darkorange;\n        }\n        tr.error {\n            color: crimson;\n        }\n        tr.debug {\n            color: blueviolet;\n        }\n        .ui-mobile .ui-page-active {\n            overflow: visible;\n            overflow-x: visible;\n        }\n    </style>\n{% endblock %}\n\n{% block script %}\n    var table = document.getElementById('table');\n    var filter = document.getElementById('filter');\n    var filterVal = filter.value.toUpperCase();\n\n    var xhr = new XMLHttpRequest();\n    xhr.open('GET', '{{ url_for('plugins') }}/logtail/stream');\n    xhr.send();\n    var position = 0;\n    var data;\n    var time;\n    var level;\n    var msg;\n    var colorClass;\n\n    function handleNewData() {\n        var messages = xhr.responseText.split('\\\\n');\n        filterVal = filter.value.toUpperCase();\n        messages.slice(position, -1).forEach(function(value) {\n\n            if (value.charAt(0) != '[') {\n                msg = value;\n                time = '';\n                level = '';\n            } else {\n                data = value.split(']');\n                time = data.shift() + ']';\n                level = data.shift() + ']';\n                msg = data.join(']');\n\n                switch(level) {\n                    case ' [INFO]':\n                        colorClass = 'info';\n                        break;\n                    case ' [WARNING]':\n                        colorClass = 'warning';\n                        break;\n                    case ' [ERROR]':\n                        colorClass = 'error';\n                        break;\n                    case ' [DEBUG]':\n                        colorClass = 'debug';\n                        break;\n                    default:\n                        colorClass = 'default';\n                        break;\n                }\n            }\n\n            var tr = document.createElement('tr');\n            var td1 = document.createElement('td');\n            var td2 = document.createElement('td');\n            var td3 = document.createElement('td');\n\n            td1.textContent = time;\n            td2.textContent = level;\n            td3.textContent = msg;\n\n            tr.appendChild(td1);\n            tr.appendChild(td2);\n            tr.appendChild(td3);\n\n            tr.className = colorClass;\n\n            if (filterVal.length > 0 && value.toUpperCase().indexOf(filterVal) == -1) {\n                tr.style.display = \"none\";\n            }\n\n            table.appendChild(tr);\n        });\n        position = messages.length - 1;\n    }\n\n    var scrollingElement = (document.scrollingElement || document.body)\n    function scrollToBottom () {\n       scrollingElement.scrollTop = scrollingElement.scrollHeight;\n    }\n\n    var timer;\n    var scrollElm = document.getElementById('autoscroll');\n    timer = setInterval(function() {\n        handleNewData();\n        if (scrollElm.checked) {\n            scrollToBottom();\n        }\n        if (xhr.readyState == XMLHttpRequest.DONE) {\n            clearInterval(timer);\n        }\n    }, 1000);\n\n    var typingTimer;\n    var doneTypingInterval = 1000;\n\n    filter.onkeyup = function() {\n        clearTimeout(typingTimer);\n        typingTimer = setTimeout(doneTyping, doneTypingInterval);\n    }\n\n    filter.onkeydown = function() {\n        clearTimeout(typingTimer);\n    }\n\n    function doneTyping() {\n        document.body.style.cursor = 'progress';\n        var tr, tds, td, i, txtValue;\n        filterVal = filter.value.toUpperCase();\n        tr = table.getElementsByTagName(\"tr\");\n        for (i = 1; i < tr.length; i++) {\n            txtValue = tr[i].textContent || tr[i].innerText;\n            if (txtValue.toUpperCase().indexOf(filterVal) > -1) {\n                tr[i].style.display = \"table-row\";\n            } else {\n                tr[i].style.display = \"none\";\n            }\n        }\n        document.body.style.cursor = 'default';\n    }\n{% endblock %}\n\n{% block content %}\n    <div class=\"sticky\">\n        <input type=\"text\" id=\"filter\" placeholder=\"Search for ...\" title=\"Type in a filter\">\n        <span><input checked type=\"checkbox\" id=\"autoscroll\"></span>\n        <span><label for=\"autoscroll\"> Autoscroll to bottom</label><br></span>\n    </div>\n    <table id=\"table\">\n        <thead>\n            <th>\n                Time\n            </th>\n            <th>\n                Level\n            </th>\n            <th>\n                Message\n            </th>\n        </thead>\n    </table>\n{% endblock %}\n\"\"\"\n\n\nclass Logtail(plugins.Plugin):\n    __author__ = '33197631+dadav@users.noreply.github.com'\n    __version__ = '0.1.0'\n    __license__ = 'GPL3'\n    __description__ = 'This plugin tails the logfile.'\n\n    def __init__(self):\n        self.lock = threading.Lock()\n        self.options = dict()\n        self.ready = False\n\n    def on_config_changed(self, config):\n        self.config = config\n        self.ready = True\n\n    def on_loaded(self):\n        \"\"\"\n        Gets called when the plugin gets loaded\n        \"\"\"\n        logging.info(\"[logtail] Logtail plugin loaded.\")\n\n\n    def on_webhook(self, path, request):\n        if not self.ready:\n            return \"Plugin not ready\"\n\n        if not path or path == \"/\":\n            return render_template_string(TEMPLATE)\n\n        if path == 'stream':\n            def generate():\n                with open(self.config['main']['log']['path']) as f:\n                    yield ''.join(f.readlines()[-self.options.get('max-lines', 4096):])\n                    while True:\n                        yield f.readline()\n\n            return Response(generate(), mimetype='text/plain')\n\n        abort(404)\n"
  },
  {
    "path": "stenogotchi/plugins/default/memtemp.py",
    "content": "# memtemp shows memory infos and cpu temperature\n#\n# mem usage, cpu load, cpu temp\n#\n###############################################################\n#\n# Updated 13-01-2021 by Anodynous\n# - Changed CPU reading from using default method to having a \n#   continuously updating 60s average to draw upon. Default \n#   method returns 90-100% on RPI0 when triggered alongside \n#   an on_ui_update event \n#\n# Updated 18-10-2019 by spees <speeskonijn@gmail.com>\n# - Changed the place where the data was displayed on screen\n# - Made the data a bit more compact and easier to read\n# - removed the label so we wont waste screen space\n# - Updated version to 1.0.1\n#\n# 20-10-2019 by spees <speeskonijn@gmail.com>\n# - Refactored to use the already existing functions\n# - Now only shows memory usage in percentage\n# - Added CPU load\n# - Added horizontal and vertical orientation\n#\n###############################################################\nfrom stenogotchi.ui.components import LabeledValue\nfrom stenogotchi.ui.view import BLACK\nimport stenogotchi.ui.fonts as fonts\nimport stenogotchi.plugins as plugins\nimport stenogotchi\nimport logging\nimport _thread\n\n\nclass MemTemp(plugins.Plugin):\n    __author__ = 'https://github.com/xenDE'\n    __version__ = '1.0.1'\n    __license__ = 'GPL3'\n    __description__ = 'A plugin that will display memory/cpu usage and temperature'\n\n    def __init__(self):\n        self.cpu_load_avg = 0\n\n    def on_loaded(self):\n        logging.info(\"[memtemp] memtemp plugin loaded.\")\n        _thread.start_new_thread(self._cpu_poller(), ())\n\n    def on_config_changed(self, config):\n        self.config = config\n\n    def mem_usage(self):\n        return int(stenogotchi.mem_usage() * 100)\n\n    def cpu_load(self):\n        #return int(stenogotchi.cpu_load() * 100)\n        return int(self.cpu_load_avg * 100)\n\n\n    def _cpu_poller(self, s=60):\n        \"\"\"\n        Runs in own thread and continually recalculates the CPU load over a (s)-second long window\n        \"\"\"\n        while True:\n            self.cpu_load_avg = stenogotchi.cpu_load(s)\n\n    def on_ui_setup(self, ui):\n        if ui.is_waveshare_v2():\n            h_pos = (180, 80)\n            v_pos = (180, 61)\n        elif ui.is_waveshare_v1():\n            h_pos = (170, 80)\n            v_pos = (170, 61)\n        elif ui.is_waveshare144lcd():\n            h_pos = (53, 77)\n            v_pos = (78, 67)\n        elif ui.is_inky():\n            h_pos = (140, 68)\n            v_pos = (165, 54)\n        elif ui.is_waveshare27inch():\n            h_pos = (192, 138)\n            v_pos = (216, 122)\n        else:\n            h_pos = (155, 76)\n            v_pos = (180, 61)\n\n        if self.options['orientation'] == \"vertical\":\n            ui.add_element('memtemp', LabeledValue(color=BLACK, label='', value=' mem:-\\n cpu:-\\ntemp:-',\n                                                   position=v_pos,\n                                                   label_font=fonts.Small, text_font=fonts.Small))\n        else:\n            # default to horizontal\n            ui.add_element('memtemp', LabeledValue(color=BLACK, label='', value='mem cpu temp\\n - -  -',\n                                                   position=h_pos,\n                                                   label_font=fonts.Small, text_font=fonts.Small))\n\n    def on_unload(self, ui):\n        with ui._lock:\n            ui.remove_element('memtemp')\n\n    def on_ui_update(self, ui):\n        if self.options['scale'] == \"fahrenheit\":\n            temp = (stenogotchi.temperature() * 9 / 5) + 32\n            symbol = \"f\"\n        elif self.options['scale'] == \"kelvin\":\n            temp = stenogotchi.temperature() + 273.15\n            symbol = \"k\"\n        else:\n            # default to celsius\n            temp = stenogotchi.temperature()\n            symbol = \"c\"\n\n        if self.options['orientation'] == \"vertical\":\n            ui.set('memtemp',\n                   \" mem:%s%%\\n cpu:%s%%\\ntemp:%s%s\" % (self.mem_usage(), self.cpu_load(), temp, symbol))\n        else:\n            # default to horizontal\n            ui.set('memtemp',\n                   \" mem cpu temp\\n %s%% %s%%  %s%s\" % (self.mem_usage(), self.cpu_load(), temp, symbol))\n"
  },
  {
    "path": "stenogotchi/plugins/default/plover_link.py",
    "content": "\n\"\"\"\nStenogotchi and Bluetooth HID keyboard emulator D-BUS Service\n\nBased on: https://gist.github.com/ukBaz/a47e71e7b87fbc851b27cde7d1c0fcf0#file-readme-md\nWhich in turn takes the original idea from: http://yetanotherpointlesstechblog.blogspot.com/2016/04/emulating-bluetooth-keyboard-with.html\n\nTested on:\n    Python 3.7-3.9\n    BlueZ 5.5\n\"\"\"\nimport os\nimport sys\nimport logging\nfrom types import MethodDescriptorType\nimport dbus\nimport dbus.service\nimport socket\n\nfrom time import sleep\nfrom gi.repository import GLib\nfrom dbus.mainloop.glib import DBusGMainLoop\n\nif not __name__ == '__main__':\n    import stenogotchi.plugins as plugins\n    ObjectClass = plugins.Plugin\nelse:\n    ObjectClass = object\n\nclass BluezErrorRejected(dbus.DBusException):\n    _dbus_error_name = \"org.bluez.Error.Rejected\"\n\n\nclass BluezErrorCanceled(dbus.DBusException):\n    _dbus_error_name = \"org.bluez.Error.Canceled\"\n\n\nclass Agent(dbus.service.Object):\n    \"\"\" \n    BT Pairing agent\n    API: https://git.kernel.org/pub/scm/bluetooth/bluez.git/plain/doc/agent-api.txt \n    examples: https://github.com/elsampsa/btdemo/blob/master/bt_studio.py \n    \"\"\"\n\n    @dbus.service.method('org.bluez.Agent1',\n                    in_signature='os', out_signature='')\n    def AuthorizeService(self, device, uuid):\n        logging.info(f\"[plover_link] Successfully paired device: {device} using Secure Simple Pairing (SSP)\")\n        return\n\n    @dbus.service.method('org.bluez.Agent1',\n                         in_signature='o', out_signature='')\n    def RequestAuthorization(self, device):\n        logging.info(f\"[plover_link] Accepted RequestAuthorization from {device}\")\n        return\n\n    @dbus.service.method('org.bluez.Agent1',\n                         in_signature='', out_signature='')\n    def Cancel(self):\n        logging.info(\"[plover_link] Cancel request received from BT client\")\n        raise(BluezErrorCanceled)\n    \n    @dbus.service.method('org.bluez.Agent1',\n                in_signature='', out_signature='')\n    def Release(self):\n        self.logging(\"[plover_link] Connection released due to BT client request\")\n        mainloop.quit()\n\n\nclass HumanInterfaceDeviceProfile(dbus.service.Object):\n    \"\"\"\n    BlueZ D-Bus Profile for HID\n    \"\"\"\n    fd = -1\n\n    @dbus.service.method('org.bluez.Profile1',\n                         in_signature='', out_signature='')\n    def Release(self):\n            logging.info('[plover_link] PloverLink: Release')\n            mainloop.quit()\n\n    @dbus.service.method('org.bluez.Profile1',\n                         in_signature='oha{sv}', out_signature='')\n    def NewConnection(self, path, fd, properties):\n            self.fd = fd.take()\n            logging.info('[plover_link] NewConnection({}, {})'.format(path, self.fd))\n            for key in properties.keys():\n                    if key == 'Version' or key == 'Features':\n                            logging.info('[plover_link] {} = 0x{:04x}'.format(key,\n                                                           properties[key]))\n                    else:\n                            logging.info('[plover_link] {} = {}'.format(key, properties[key]))\n\n    @dbus.service.method('org.bluez.Profile1',\n                         in_signature='o', out_signature='')\n    def RequestDisconnection(self, path):\n            logging.info('[plover_link] RequestDisconnection {}'.format(path))\n\n            if self.fd > 0:\n                    os.close(self.fd)\n                    self.fd = -1\n       \n\nclass BTKbDevice:\n    \"\"\"\n    Create a bluetooth device to emulate a HID keyboard\n    \"\"\"\n    # Service control port - must match port configured in SDP record\n    P_CTRL = 17\n    # Service interrupt port - must match port configured in SDP record\n    P_INTR = 19\n    # BlueZ dbus\n    PROFILE_DBUS_PATH = '/bluez/yaptb/btkb_profile'\n    AGENT_DBUS_PATH = '/org/bluez'\n    ADAPTER_IFACE = 'org.bluez.Adapter1'\n    DEVICE_INTERFACE = 'org.bluez.Device1'\n    DBUS_PROP_IFACE = 'org.freedesktop.DBus.Properties'\n    DBUS_OM_IFACE = 'org.freedesktop.DBus.ObjectManager'\n\n    # file path of the sdp record to laod\n    install_dir  = os.path.dirname(os.path.realpath(__file__))\n    SDP_RECORD_PATH = os.path.join(install_dir,\n                                   'plover_link_btserver_sdp_record.xml')\n    # UUID for HID service (1124)\n    # https://www.bluetooth.com/specifications/assigned-numbers/service-discovery\n    UUID = '00001124-0000-1000-8000-00805f9b34fb'\n\n    def __init__(self, hci=0):\n        self._agent = plugins.loaded['plover_link']._agent\n        self.bt_autoconnect_list = None\n        self.bt_last_conn = None\n        self.autoconnect_in_progress = False\n        self.bt_agent_running = False\n        self.scontrol = None\n        self.ccontrol = None  # Socket object for control\n        self.sinterrupt = None\n        self.cinterrupt = None  # Socket object for interrupt\n        self.dev_path = '/org/bluez/hci{}'.format(hci)\n        logging.info('[plover_link] Setting up BT device')\n        self.bus = dbus.SystemBus()\n        \n        self.adapter_methods = dbus.Interface(self.bus.get_object('org.bluez', \n                                            self.dev_path), self.ADAPTER_IFACE)\n        self.adapter_property = dbus.Interface(self.bus.get_object('org.bluez',\n                                            self.dev_path), self.DBUS_PROP_IFACE)\n\n        self.bus.add_signal_receiver(self.interfaces_added,\n                                     dbus_interface=self.DBUS_OM_IFACE,\n                                     signal_name='InterfacesAdded')\n\n        self.bus.add_signal_receiver(self._properties_changed,\n                                     dbus_interface=self.DBUS_PROP_IFACE,\n                                     signal_name='PropertiesChanged',\n                                     arg0=self.DEVICE_INTERFACE,\n                                     path_keyword='path')\n\n        self.register_hid_profile()\n\n        # Set the Bluetooth device configuration\n        try: \n            self.alias = plugins.loaded['plover_link'].options['bt_device_name']\n        except:\n            self.alias = 'Stenogotchi'\n        self.discoverabletimeout = 0\n        self.discoverable = True\n        self.bthost_mac = None\n        self.bthost_name = \"\"\n\n        # Get list of Bluetooth devices to auto connect to\n        bt_autoconnect_str = plugins.loaded['plover_link'].options['bt_autoconnect_mac']\n        if bt_autoconnect_str:\n            self.bt_autoconnect_list = list(map(str.strip, bt_autoconnect_str.split(',')))\n        else:\n            self.bt_autoconnect_list = None\n\n        logging.info('[plover_link] Configured BT device with name {}'.format(self.alias))\n    \n    def interfaces_added(self, path, device_info):\n        pass\n\n    def _properties_changed(self, interface, changed, invalidated, path):\n        if self.on_disconnect is not None:\n            if 'Connected' in changed:\n                if not changed['Connected']:\n                    self.on_disconnect()\n\n    def on_disconnect(self):\n        if self.autoconnect_in_progress:\n            return\n\n        logging.info('[plover_link] The client has been disconnected')\n        self.bthost_mac = None\n        self.bthost_name = \"\"\n        self._agent.set_bt_disconnected()\n        # Attempt to auto_connect once, then go back to listening mode\n        connected = self.auto_connect()\n        if not connected:\n            if not self.bt_agent_running:\n                self.register_bt_pairing_agent()\n            if not self.scontrol:\n                self.listen()\n\n\n    @property\n    def address(self):\n        \"\"\" Return the adapter MAC address. \"\"\"\n        return self.adapter_property.Get(self.ADAPTER_IFACE,\n                                         'Address')\n\n    @property\n    def powered(self):\n        \"\"\" Power state of the Adapter. \"\"\"\n        return self.adapter_property.Get(self.ADAPTER_IFACE, 'Powered')\n\n    @powered.setter\n    def powered(self, new_state):\n        self.adapter_property.Set(self.ADAPTER_IFACE, 'Powered', new_state)\n\n    @property\n    def alias(self):\n        return self.adapter_property.Get(self.ADAPTER_IFACE,\n                                         'Alias')\n\n    @alias.setter\n    def alias(self, new_alias):\n        self.adapter_property.Set(self.ADAPTER_IFACE,\n                                  'Alias',\n                                  new_alias)\n\n    @property\n    def discoverabletimeout(self):\n        \"\"\" Discoverable timeout of the Adapter. \"\"\"\n        return self.adapter_props.Get(self.ADAPTER_IFACE,\n                                      'DiscoverableTimeout')\n\n    @discoverabletimeout.setter\n    def discoverabletimeout(self, new_timeout):\n        self.adapter_property.Set(self.ADAPTER_IFACE,\n                                  'DiscoverableTimeout',\n                                  dbus.UInt32(new_timeout))\n\n    @property\n    def discoverable(self):\n        \"\"\" Discoverable state of the Adapter. \"\"\"\n        return self.adapter_props.Get(\n            self.ADAPTER_INTERFACE, 'Discoverable')\n\n    @discoverable.setter\n    def discoverable(self, new_state):\n        self.adapter_property.Set(self.ADAPTER_IFACE,\n                                  'Discoverable',\n                                  new_state)\n\n    def register_hid_profile(self):\n        \"\"\"\n        Setup and register HID Profile\n        \"\"\"\n\n        logging.debug('[plover_link] Configuring Bluez Profile')\n        service_record = self.read_sdp_service_record()\n\n        opts = {\n            'Role': 'server',\n            'RequireAuthentication': True,\n            'RequireAuthorization': True,\n            'AutoConnect': True,\n            'ServiceRecord': service_record,\n        }\n\n        manager = dbus.Interface(self.bus.get_object('org.bluez',\n                                                     '/org/bluez'),\n                                 'org.bluez.ProfileManager1')\n\n        HumanInterfaceDeviceProfile(self.bus,\n                                    BTKbDevice.PROFILE_DBUS_PATH)\n\n        manager.RegisterProfile(BTKbDevice.PROFILE_DBUS_PATH,\n                                BTKbDevice.UUID,\n                                opts)\n\n        logging.debug('[plover_link] Profile registered ')\n\n    def register_bt_pairing_agent(self):\n        \"\"\"\n        Setup and register BT paring agent\n        \"\"\"\n        capability = 'NoInputNoOutput'\n        manager = dbus.Interface(self.bus.get_object('org.bluez',\n                                                     '/org/bluez'),\n                                 'org.bluez.AgentManager1')\n        Agent(self.bus, BTKbDevice.AGENT_DBUS_PATH)\n\n        manager.RegisterAgent(BTKbDevice.AGENT_DBUS_PATH, capability)\n        #manager.UnregisterAgent(BTKbDevice.AGENT_DBUS_PATH, capability)\n        manager.RequestDefaultAgent(BTKbDevice.AGENT_DBUS_PATH)\n        self.bt_agent_running = True\n        logging.debug(f'[plover_link] Registered secure Bluez pairing agent with capability: {capability}')\n\n    @staticmethod\n    def read_sdp_service_record():\n        \"\"\"\n        Read and return SDP record from a file\n        :return: (string) SDP record\n        \"\"\"\n        logging.debug('[plover_link] Reading service record')\n        try:\n            fh = open(BTKbDevice.SDP_RECORD_PATH, 'r')\n        except OSError:\n            sys.exit('Could not open the sdp record. Exiting...')\n\n        return fh.read()   \n\n    def create_ssockets(self):\n        \"\"\" Create passive listening sockets and close possibly exising ones \"\"\"\n        logging.debug(\"[plover_link] Creating BT listening ssockets\")\n\n        if self.scontrol:\n            self.scontrol.close()\n        if self.sinterrupt:\n            self.sinterrupt.close()\n\n        self.scontrol = socket.socket(socket.AF_BLUETOOTH,\n                                socket.SOCK_SEQPACKET,\n                                socket.BTPROTO_L2CAP)\n        self.scontrol.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)\n        self.sinterrupt = socket.socket(socket.AF_BLUETOOTH,\n                                        socket.SOCK_SEQPACKET,\n                                        socket.BTPROTO_L2CAP)\n        self.sinterrupt.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)\n\n    def listen(self):\n        \"\"\"\n        Listen for connections coming from HID client\n        \"\"\"\n        if not self.scontrol or not self.sinterrupt:\n             self.create_ssockets()\n\n        try:\n            # Bind address/port to existing sockets\n            self.scontrol.bind((self.address, self.P_CTRL))\n            self.sinterrupt.bind((self.address, self.P_INTR))\n\n            # Start listening on the server sockets with limit of 1 connection per socket\n            self.scontrol.listen(1)\n            self.sinterrupt.listen(1)\n\n            logging.info('[plover_link] Waiting for connections')\n\n            self.ccontrol, cinfo = self.scontrol.accept()\n            logging.debug('[plover_link] {} connected on the ccontrol socket'.format(cinfo[0]))\n\n            self.cinterrupt, cinfo = self.sinterrupt.accept()\n            logging.debug('[plover_link] {} connected on the cinterrupt channel'.format(cinfo[0]))\n            \n            self.bthost_mac = cinfo[0]\n            self.bthost_name = self.get_connected_device_name()\n\n            self._agent.set_bt_connected(self.bthost_name)\n            self.bt_last_conn = self.bthost_mac\n\n        except OSError as ex:\n            logging.error(f\"[plover_link] Failed to enter listening mode: {ex}\")\n            logging.info(f\"[plover_link] If issue persists, check that your '/lib/systemd/system/bluetooth.service' file still contains 'ExecStart=/usr/lib/bluetooth/bluetoothd -P input'\")\n\n\n    # def reconnect(self):\n    #     print(\"Trying reconnect...\")                                                                                                                                                                                  \n    #     if not self.bt_last_conn:\n    #                 return\n    #     logging.info('[plover_link] Waiting 5 seconds before attempting to reconnect to lost BT device...')\n    #     sleep(5)\n    #     for i in range(3):\n    #         try:\n    #             hidHost = self.bt_last_conn\n    #             self.ccontrol = socket.socket(socket.AF_BLUETOOTH,\n    #                             socket.SOCK_SEQPACKET,\n    #                             socket.BTPROTO_L2CAP)\n    #             self.cinterrupt = socket.socket(socket.AF_BLUETOOTH,\n    #                                             socket.SOCK_SEQPACKET,\n    #                                             socket.BTPROTO_L2CAP)\n    #             self.ccontrol.connect((hidHost, self.P_CTRL))\n    #             self.cinterrupt.connect((hidHost, self.P_INTR))\n    #             print(\"Connected!\")\n    #             break\n    #         except Exception as ex:\n    #             logging.info(f\"[plover_link] Failed to reconnect, will retry in 5s... Reason: '{ex}'\")\n    #             sleep(5)\n\n    def auto_connect(self):\n        \"\"\" Automatically connects to preferred BT devices in listed order. Also handles reconnect attempts at lost connection. \"\"\"\n        \n        # Check if we should make a reconnect attempt to previous BT device\n        if self.bt_last_conn:\n            reconnect = True\n        else:\n            reconnect = False\n\n        if not self.bt_autoconnect_list and not reconnect:\n            logging.info('[plover_link] No bt_autoconnect_mac set in config. Listening for incoming connections instead...')  \n            return False\n        else:\n            self.autoconnect_in_progress = True\n           \n            if reconnect:\n                if not self.bt_last_conn:\n                    return False\n                logging.info('[plover_link] Waiting 5 seconds before attempting to reconnect to lost BT device...') \n                sleep(5) # Sleep 5 seconds before attempting a reconnect to lost BT device\n                autoconnect_list = [self.bt_last_conn]\n            else:\n                logging.info('[plover_link] Trying to auto connect to preferred BT host(s)...')\n                autoconnect_list = self.bt_autoconnect_list.copy()\n\n            for i in autoconnect_list:\n                logging.info(f'[plover_link] Trying to auto connect to {i}')\n                try:\n                    self.ccontrol = socket.socket(socket.AF_BLUETOOTH,\n                                    socket.SOCK_SEQPACKET,\n                                    socket.BTPROTO_L2CAP)\n            \n                    self.cinterrupt = socket.socket(socket.AF_BLUETOOTH,\n                                    socket.SOCK_SEQPACKET,\n                                    socket.BTPROTO_L2CAP)\n\n                    self.ccontrol.connect((i, self.P_CTRL))\n                    self.cinterrupt.connect((i, self.P_INTR))\n\n                    # On successful connection\n                    self.autoconnect_in_progress = False\n                    self.bthost_mac = i\n                    self.bt_last_conn = i\n                    self.bthost_name = self.get_connected_device_name()\n                    self._agent.set_bt_connected(self.bthost_name)\n                    return True # stop trying to auto connect upon success\n\n                \n                except Exception as e:\n                    if e.__class__.__name__ == \"OSError\" and str(e) == \"[Errno 52] Invalid exchange\":\n                            self.unpair_device(i)\n                            logging.info(f'[plover_link] Invalid handshake exchange with {i}. Unpaired device. Please re-initiate pairing from remote device.')\n                            self._agent._view.on_custom(f\"Had to purge {i} due to invalid handshake. Please re-pair us.\")\n                    elif (e.__class__.__name__ == \"PermissionError\" and str(e) == \"[Errno 13] Permission denied\"):\n                        logging.info(f'[plover_link] Permission to connect to {i} denied. Ensure device has been paired.')\n                        self._agent._view.on_custom(f\"Hey... {i} refused my connection! Please re-pair us.\")\n                    elif (e.__class__.__name__ == \"ConnectionRefusedError\" and str(e) == \"[Errno 111] Connection refused\"):\n                        logging.info(f'[plover_link] Connection to {i} refused. Ensure device has been paired and is available.')\n                        self._agent._view.on_custom(f\"Hmpf... {i} refused my connection. Ensure device has been paired and is available.\")\n                    elif e.__class__.__name__ == \"OSError\" and str(e) == \"[Errno 112] Host is down\":\n                        logging.info(f'[plover_link] Host {i} is down.')\n                    else:\n                        logging.info(f'[plover_link] Failed to connect to {i} due to \"{e.__class__.__name__}\" : \"{e}\"')\n                    if self.bt_autoconnect_list and not reconnect:\n                        if i in self.bt_autoconnect_list:\n                            self.bt_autoconnect_list.remove(i)\n\n                    # If all addresses attempted without success\n                    if not self.bt_autoconnect_list or reconnect:\n                        logging.info('[plover_link] Unsuccessful auto connect attempt. Listening for incoming connections instead...')\n                        # self.ccontrol.close()\n                        # self.cinterrupt.close()\n                        self.autoconnect_in_progress = False\n                        self.bt_last_conn = None\n                        return False\n                    \n                    sleep(2)\n\n    def unpair_device(self, address):\n        \"\"\" Removes remote device including pairing information \"\"\"\n        \n        proxy_object = self.bus.get_object(\"org.bluez\",\"/\")\n        manager = dbus.Interface(proxy_object, \"org.freedesktop.DBus.ObjectManager\")\n        managed_objects = manager.GetManagedObjects()\n        for path in managed_objects:\n            adr = managed_objects[path].get('org.bluez.Device1', {}).get('Address', False)\n            if adr == address:\n                self.adapter_methods.RemoveDevice(path)\n\n\n    \n    def get_connected_device_name(self):\n        \"\"\" Returns name (Alias) of connected BT device \"\"\"\n        \n        proxy_object = self.bus.get_object(\"org.bluez\",\"/\")\n        manager = dbus.Interface(proxy_object, \"org.freedesktop.DBus.ObjectManager\")\n        managed_objects = manager.GetManagedObjects()\n        for path in managed_objects:\n            con_state = managed_objects[path].get('org.bluez.Device1', {}).get('Connected', False)\n            if con_state:\n                addr = managed_objects[path].get('org.bluez.Device1', {}).get('Address')\n                alias = managed_objects[path].get('org.bluez.Device1', {}).get('Alias')\n                logging.info(f'[plover_link] Device {alias} [{addr}] is connected')\n        \n        return alias\n\n    def send(self, msg):\n        \"\"\"\n        Send HID message\n        :param msg: (bytes) HID packet to send\n        \"\"\"\n        self.cinterrupt.send(bytes(bytearray(msg)))\n\n\nclass StenogotchiService(dbus.service.Object):\n    \"\"\"\n    Setup of a D-Bus service to receive:\n        Status updates and HID messages from Plover plugin.\n        HID messages from Stenogotchi evdevkb plugin\n    \"\"\"\n    def __init__(self):\n        logging.info('[plover_link] Setting up Stenogotchi D-Bus service')\n        bus_name = dbus.service.BusName('com.github.stenogotchi', bus=dbus.SystemBus())\n        dbus.service.Object.__init__(self, bus_name, '/com/github/stenogotchi')\n        \n        self._agent = plugins.loaded['plover_link']._agent\n        self.device = BTKbDevice()  # create and setup our BTKbDevice\n        self.wpm_top = None\n        \n    def auto_connect(self):\n        \"\"\" Connect to preferred bt_mac(s). If unspecified or unavailable fall back to await new and trusted incoming connections \"\"\"\n        connected = self.device.auto_connect() \n        if not connected:\n            self.device.register_bt_pairing_agent() # Handler for new pairing attempts\n            self.device.listen() # Handler for incoming trusted connections\n\n\n    @dbus.service.method('com.github.stenogotchi', in_signature='aay')   # array of bytearrays\n    def send_keys(self, key_list):\n        for key in key_list:\n            self.device.send(key)\n\n    @dbus.service.method('com.github.stenogotchi', in_signature='b')    # boolean\n    def plover_is_running(self, b):\n        logging.debug('[plover_link] plover_is_running = ' + str(b))\n        if b:\n            self._agent.set_plover_boot()\n        else:\n            self._agent.set_plover_quit()\n\n    @dbus.service.method('com.github.stenogotchi', in_signature='b')    # boolean\n    def plover_is_ready(self, b):\n        logging.debug('[plover_link] plover_is_ready = ' + str(b))\n        self._agent.set_plover_ready()\n\n    @dbus.service.method('com.github.stenogotchi', in_signature='s')    # string\n    def plover_machine_state(self, s):\n        logging.debug('[plover_link] plover_machine_state = ' + s)\n\n    @dbus.service.method('com.github.stenogotchi', in_signature='b')    # boolean\n    def plover_output_enabled(self, b):\n        logging.debug('[plover_link] plover_output_enabled = ' + str(b))\n\n    @dbus.service.method('com.github.stenogotchi', in_signature='s')    # string\n    def plover_wpm_stats(self, s):\n        logging.debug('[plover_link] plover_wpm_stats = ' + s)\n        wpm = int(s)\n        if not self.wpm_top: \n            self.wpm_top = wpm\n            self._agent.set_wpm(wpm, self.wpm_top)\n        else:\n            if wpm > self.wpm_top:\n                self.wpm_top = wpm\n                logging.debug(f'[plover_link] new wpm record: {self.wpm_top}')\n                self._agent.set_wpm_record(self.wpm_top)\n            else:\n                self._agent.set_wpm(wpm, self.wpm_top)\n\n    @dbus.service.method('com.github.stenogotchi', in_signature='s')    # string\n    def plover_strokes_stats(self, s):\n        # logging.debug(f\"[plover_link] plover_strokes_stats = '{s}'\")\n        self._agent.set_strokes(s)\n\n    @dbus.service.method('com.github.stenogotchi', in_signature='s')    # string\n    def send_string_stenogotchi(self, s):\n        plugins.loaded['dict_lookup'].input_handler._on_send_string(s)\n        # logging.debug(f\"[plover_link] send_string_stenogotchi = '{s}'\")\n\n    @dbus.service.method('com.github.stenogotchi', in_signature='n')    # 16-bit signed int\n    def send_backspaces_stenogotchi(self, n):\n        plugins.loaded['dict_lookup'].input_handler._on_send_backspaces(n)\n        # logging.debug(f\"[plover_link] send_backspaces_stenogotchi = '{n}'\")\n\n    @dbus.service.method('com.github.stenogotchi', in_signature='s')    # string\n    def send_key_combination_stenogotchi(self, s):\n        plugins.loaded['dict_lookup'].input_handler._on_send_key_combination(s)\n        # logging.debug(f\"[plover_link] send_key_combination_stenogotchi = '{s}'\")\n    \n    @dbus.service.method('com.github.stenogotchi', in_signature='as')    # list of strings\n    def plover_translation_handler(self, l):\n        plugins.loaded['dict_lookup'].input_handler._on_lookup_results(l)\n        # logging.debug(f\"[plover_link] plover_translation_handler = '{l}'\")\n        \n    @dbus.service.signal('com.github.stenogotchi', signature='a{sv}')    # dictionary of strings to variants\n    def signal_to_plover(self, message):\n        # The signal is emitted when this method exits\n        pass\n\nclass PloverLink(ObjectClass):\n    __autohor__ = 'Anodynous'\n    __version__ = '0.3'\n    __license__ = 'MIT'\n    __description__ = 'This plugin enables connectivity to Plover through D-Bus. Note that it needs root permissions due to using sockets'\n\n    def __init__(self):\n        self._agent = None\n        self.running = False\n        self._stenogotchiservice = None\n        self.mainloop = None\n\n    # called when everything is ready and the main loop is about to start\n    def on_ready(self, agent):\n        self._agent = agent     # used for agent/automata functionsadded to be able to do callbacks to agent events\n\n        DBusGMainLoop(set_as_default=True)\n        self._stenogotchiservice = StenogotchiService()\n        self.mainloop = GLib.MainLoop()\n        \n        try:\n            self.mainloop.run()\n            self.running = True\n            logging.info(\"[plover_link] PloverLink is up\")\n        except:\n            logging.error(\"[plover_link] Could not start PloverLink\")\n\n    def on_plover_ready(self, agent):\n        self._stenogotchiservice.auto_connect()\n    \n    def on_config_changed(self, config):\n        self.config = config\n                    \n    def on_unload(self, ui):\n        self.mainloop.quit()\n\n    def send_signal_to_plover(self, message):\n        self._stenogotchiservice.signal_to_plover(message)\n\nif __name__ == '__main__':\n    # The sockets require root permission\n    if not os.geteuid() == 0:\n        sys.exit('Only root can run this script')\n\n    DBusGMainLoop(set_as_default=True)\n    stenogotchiservice = StenogotchiService()\n    mainloop = GLib.MainLoop()\n    mainloop.run()\n"
  },
  {
    "path": "stenogotchi/plugins/default/plover_link_btserver_sdp_record.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n\n<record>\n\t<attribute id=\"0x0001\">\n\t\t<sequence>\n\t\t\t<uuid value=\"0x1124\" />\n\t\t</sequence>\n\t</attribute>\n\t<attribute id=\"0x0004\">\n\t\t<sequence>\n\t\t\t<sequence>\n\t\t\t\t<uuid value=\"0x0100\" />\n\t\t\t\t<uint16 value=\"0x0011\" />\n\t\t\t</sequence>\n\t\t\t<sequence>\n\t\t\t\t<uuid value=\"0x0011\" />\n\t\t\t</sequence>\n\t\t</sequence>\n\t</attribute>\n\t<attribute id=\"0x0005\">\n\t\t<sequence>\n\t\t\t<uuid value=\"0x1002\" />\n\t\t</sequence>\n\t</attribute>\n\t<attribute id=\"0x0006\">\n\t\t<sequence>\n\t\t\t<uint16 value=\"0x656e\" />\n\t\t\t<uint16 value=\"0x006a\" />\n\t\t\t<uint16 value=\"0x0100\" />\n\t\t</sequence>\n\t</attribute>\n\t<attribute id=\"0x0009\">\n\t\t<sequence>\n\t\t\t<sequence>\n\t\t\t\t<uuid value=\"0x1124\" />\n\t\t\t\t<uint16 value=\"0x0100\" />\n\t\t\t</sequence>\n\t\t</sequence>\n\t</attribute>\n\t<attribute id=\"0x000d\">\n\t\t<sequence>\n\t\t\t<sequence>\n\t\t\t\t<sequence>\n\t\t\t\t\t<uuid value=\"0x0100\" />\n\t\t\t\t\t<uint16 value=\"0x0013\" />\n\t\t\t\t</sequence>\n\t\t\t\t<sequence>\n\t\t\t\t\t<uuid value=\"0x0011\" />\n\t\t\t\t</sequence>\n\t\t\t</sequence>\n\t\t</sequence>\n\t</attribute>\n\t<attribute id=\"0x0100\">\n\t\t<text value=\"Raspberry Pi Virtual Keyboard\" />\n\t</attribute>\n\t<attribute id=\"0x0101\">\n\t\t<text value=\"USB > BT Keyboard\" />\n\t</attribute>\n\t<attribute id=\"0x0102\">\n\t\t<text value=\"Raspberry Pi\" />\n\t</attribute>\n\t<attribute id=\"0x0200\">\n\t\t<uint16 value=\"0x0100\" />\n\t</attribute>\n\t<attribute id=\"0x0201\">\n\t\t<uint16 value=\"0x0111\" />\n\t</attribute>\n\t<attribute id=\"0x0202\">\n\t\t<uint8 value=\"0x40\" />\n\t</attribute>\n\t<attribute id=\"0x0203\">\n\t\t<uint8 value=\"0x00\" />\n\t</attribute>\n\t<attribute id=\"0x0204\">\n\t\t<boolean value=\"false\" />\n\t</attribute>\n\t<attribute id=\"0x0205\">\n\t\t<boolean value=\"true\" />\n\t</attribute>\n\t<attribute id=\"0x0206\">\n\t\t<sequence>\n\t\t\t<sequence>\n\t\t\t\t<uint8 value=\"0x22\" />\n\t\t\t\t<text encoding=\"hex\" value=\"05010906a101850175019508050719e029e715002501810295017508810395057501050819012905910295017503910395067508150026ff000507190029ff8100c0050c0901a1018503150025017501950b0a23020a21020ab10109b809b609cd09b509e209ea09e9093081029501750d8103c0\" />\n\t\t\t</sequence>\n\t\t</sequence>\n\t</attribute>\n\t<attribute id=\"0x0207\">\n\t\t<sequence>\n\t\t\t<sequence>\n\t\t\t\t<uint16 value=\"0x0409\" />\n\t\t\t\t<uint16 value=\"0x0100\" />\n\t\t\t</sequence>\n\t\t</sequence>\n\t</attribute>\n\t<attribute id=\"0x020b\">\n\t\t<uint16 value=\"0x0100\" />\n\t</attribute>\n\t<attribute id=\"0x020c\">\n\t\t<uint16 value=\"0x0c80\" />\n\t</attribute>\n\t<attribute id=\"0x020d\">\n\t\t<boolean value=\"true\" />\n\t</attribute>\n\t<attribute id=\"0x020e\">\n\t\t<boolean value=\"false\" />\n\t</attribute>\n\t<attribute id=\"0x020f\">\n\t\t<uint16 value=\"0x0640\" />\n\t</attribute>\n\t<attribute id=\"0x0210\">\n\t\t<uint16 value=\"0x0320\" />\n\t</attribute>\n</record>\n"
  },
  {
    "path": "stenogotchi/plugins/default/upslite.py",
    "content": "#!/usr/bin/env python3\n\"\"\"\nBased on: https://github.com/linshuqin329/UPS-Lite\nRequires i2c to be enabled in dietpi-config (or raspi-config)\n\nSupports readings from the https://hackaday.io/project/173847-ups-lite platform for Raspberry Pi Zero W\n\"\"\"\n\nimport logging\nimport struct\nimport smbus\nimport sys\nimport time\nimport RPi.GPIO as GPIO\nimport stenogotchi\n\nif not __name__ == '__main__':\n    import stenogotchi.plugins as plugins\n    ObjectClass = plugins.Plugin\nelse:\n    ObjectClass = object\n\nI2CBUS = 1              # Run \"sudo i2cdetect -l\" to see which bus is being used (bcm2835 is what you are looking for). 0 = /dev/i2c-0 (port I2C0), 1 = /dev/i2c-1 (port I2C1)\nI2CADDRESS = 0x36       # Run \"sudo i2cdetect -y 1\" to see address 36 mounted on the i2c bus. This is MAXI17040G which we want to interact with\n\n\nclass Upslite(ObjectClass):\n    __autohor__ = 'Anodynous'\n    __version__ = '0.1'\n    __license__ = 'GPL3'\n    __description__ = 'This plugin enables battery readings for the UPS-Lite V1.2 RPI0 module using integrated MAX17040'\n\n    def __init__(self):\n        self.GPIO = GPIO\n        self.bus = None\n        self.address = I2CADDRESS\n        self.is_plugged = False\n        self.voltage = 0\n        self.charge = 0\n\n    # Called when plugin is loaded\n    def on_loaded(self):\n        try:\n            self.GPIO.setmode(self.GPIO.BCM)\n            self.GPIO.setwarnings(False)\n            self.GPIO.setup(4,self.GPIO.IN)\n\n            self.bus = smbus.SMBus(I2CBUS)\n\n            self._power_on_reset()\n            self._quickstart()\n        except:\n            logging.error(\"[upslite] Could not start UPS-Lite plugin\")\n    \n    def on_config_changed(self, config):\n        self.config = config\n\n    # Called when the ui is updated\n    def on_ui_update(self, ui):\n        # update those elements\n        self._read_charge()\n        self._check_plugged()\n\n        # Set battery reading\n        ui_string = str(self.charge)\n        if self.is_plugged:\n            ui_string += \"+\"\n        ui.set('ups', ui_string)\n\n        # Check for critical level. Initiate shutdown if too low\n        if not self.is_plugged:\n            if self.charge <= self.options['shutdown_level']:\n                logging.info(f'[upslite] Battery charge critical: {self.charge}')\n                ui.update(force=True, new_data={'status': 'Battery level critical. Shutting down in 1m unless connected to charger...'})\n                time.sleep(60)\n                self._check_plugged()\n                if not self.is_plugged:\n                    logging.info('[upslite] Shutting down')\n                    stenogotchi.shutdown()\n                else:\n                    logging.info('[upslite] Battery charging. Aborting shutdown process')\n                    ui.update(force=True, new_data={'status': 'Pheew... That was a close one! Feeling better already.'})\n\n    def _read_voltage(self):\n        \"\"\" Reads and sets as a float the voltage from the Raspi UPS Hat via the provided SMBus object\"\"\"\n        read = self.bus.read_word_data(self.address, 0X02)\n        swapped = struct.unpack(\"<H\", struct.pack(\">H\", read))[0]\n        voltage = swapped * 1.25 /1000/16\n        if voltage > 0:     # if we get a non-zero value\n            self.voltage = round(5.2 % voltage, 2)\n\n    def _read_charge(self):\n        \"\"\" Reads and sets as an int the remaining charge of the battery connected to the Raspi UPS Hat via the provided SMBus object. \"\"\"\n        self.is_full = False\n        self.is_low = False\n        self.is_critical = False\n\n        read = self.bus.read_word_data(self.address, 0X04)\n        swapped = struct.unpack(\"<H\", struct.pack(\">H\", read))[0]\n        charge = swapped/256\n        if charge > 100:\n            charge = 100\n        self.charge = round(charge)\n\n    def _check_plugged(self):\n        if (self.GPIO.input(4) == self.GPIO.HIGH):\n            self.is_plugged = True\n        elif (self.GPIO.input(4) == self.GPIO.LOW):\n            self.is_plugged = False\n\n    def _quickstart(self):\n        self.bus.write_word_data(self.address, 0x06,0x4000)\n\n    def _power_on_reset(self):\n        self.bus.write_word_data(self.address, 0xfe,0x0054)\n\n    def get_charge(self):\n        self._read_charge()\n        return self.charge\n\n    def get_voltage(self):\n        self._read_voltage()\n        return self.voltage\n\n    def get_is_plugged(self):\n        self._check_plugged()\n        return self.is_plugged\n\n\nif __name__ == '__main__':\n    ups = Upslite()\n    ups.on_loaded()\n    time.sleep(1)       # needs a second to ensure non-zero values are returned on initial read\n    print(\"++++++++++++++++++++\")\n        \n    while True:\n        voltage = ups.get_voltage()\n        charge = ups.get_charge()\n        is_plugged = ups.get_is_plugged()\n        \n        print(\"Voltage:%5.2fV\" % voltage)\n        print(\"Battery:%5i%%\" % charge)\n\n        if charge > 99:\n            print(\"Battery FULL\")\n        else:\n            if charge < 2:\n                print(\"Battery CRITICAL\")\n            elif charge < 6:\n                print(\"Battery LOW\")\n        if is_plugged:\n            print(\"Power Adapter Plugged In \")\n        else:\n            print(\"Power Adapter Unplugged\")\n        print(\"++++++++++++++++++++\")\n\n        time.sleep(5)\n"
  },
  {
    "path": "stenogotchi/ui/__init__.py",
    "content": ""
  },
  {
    "path": "stenogotchi/ui/components.py",
    "content": "from PIL import Image\nfrom textwrap import TextWrapper\n\n\nclass Widget(object):\n    def __init__(self, xy, color=0):\n        self.xy = xy\n        self.color = color\n\n    def draw(self, canvas, drawer):\n        raise Exception(\"not implemented\")\n\n\nclass Bitmap(Widget):\n    def __init__(self, path, xy, color=0):\n        super().__init__(xy, color)\n        self.image = Image.open(path)\n\n    def draw(self, canvas, drawer):\n        canvas.paste(self.image, self.xy)\n\n\nclass Line(Widget):\n    def __init__(self, xy, color=0, width=1):\n        super().__init__(xy, color)\n        self.width = width\n\n    def draw(self, canvas, drawer):\n        drawer.line(self.xy, fill=self.color, width=self.width)\n\n\nclass Rect(Widget):\n    def draw(self, canvas, drawer):\n        drawer.rectangle(self.xy, outline=self.color)\n\n\nclass FilledRect(Widget):\n    def draw(self, canvas, drawer):\n        drawer.rectangle(self.xy, fill=self.color)\n\n\nclass Text(Widget):\n    def __init__(self, value=\"\", position=(0, 0), font=None, color=0, wrap=False, max_length=0):\n        super().__init__(position, color)\n        self.value = value\n        self.font = font\n        self.wrap = wrap\n        self.max_length = max_length\n        self.wrapper = TextWrapper(width=self.max_length, replace_whitespace=False) if wrap else None\n\n    def draw(self, canvas, drawer):\n        if self.value is not None:\n            if self.wrap:\n                text = '\\n'.join(self.wrapper.wrap(self.value))\n            else:\n                text = self.value\n            drawer.text(self.xy, text, font=self.font, fill=self.color)\n\n\nclass LabeledValue(Widget):\n    def __init__(self, label, value=\"\", position=(0, 0), label_font=None, text_font=None, color=0, label_spacing=5, max_length=0):\n        super().__init__(position, color)\n        self.label = label\n        self.label_font = label_font\n        self.max_length = max_length\n        self.value = value\n        self.text_font = text_font\n        self.label_spacing = label_spacing\n\n    def draw(self, canvas, drawer):\n        if self.max_length > 0:\n            value = self.value[:self.max_length]\n        else:\n            value = self.value\n\n        if self.label is None:\n            drawer.text(self.xy, value, font=self.label_font, fill=self.color)\n        else:\n            pos = self.xy\n            drawer.text(pos, self.label, font=self.label_font, fill=self.color)\n            drawer.text((pos[0] + self.label_spacing + 5 * len(self.label), pos[1]), value, font=self.text_font, fill=self.color)\n"
  },
  {
    "path": "stenogotchi/ui/display.py",
    "content": "import os\nimport logging\nimport threading\n\nimport stenogotchi.plugins as plugins\nimport stenogotchi.ui.hw as hw\nfrom stenogotchi.ui.view import View\n\n\nclass Display(View):\n    def __init__(self, config, state={}):\n        super(Display, self).__init__(config, hw.display_for(config), state)\n        config = config['ui']['display']\n\n        self._enabled = config['enabled']\n        self._rotation = config['rotation']\n\n        self.init_display()\n\n        self._canvas_next_event = threading.Event()\n        self._canvas_next = None\n        self._render_thread_instance = threading.Thread(\n            target=self._render_thread,\n            daemon=True\n        )\n        self._render_thread_instance.start()\n\n    def is_waveshare_v2(self):\n        return self._implementation.name == 'waveshare_2'\n\n    def init_display(self):\n        if self._enabled:\n            self._implementation.initialize()\n            plugins.on('display_setup', self._implementation)\n        else:\n            logging.warning(\"display module is disabled\")\n        self.on_render(self._on_view_rendered)\n\n    def clear(self):\n        self._implementation.clear()\n\n    def image(self):\n        img = None\n        if self._canvas is not None:\n            img = self._canvas if self._rotation == 0 else self._canvas.rotate(-self._rotation)\n        return img\n\n    def _render_thread(self):\n        \"\"\"Used for non-blocking screen updating.\"\"\"\n\n        while True:\n            self._canvas_next_event.wait()\n            self._canvas_next_event.clear()\n            self._implementation.render(self._canvas_next)\n\n    def _on_view_rendered(self, img):\n        try:\n            if self._config['ui']['web']['on_frame'] != '':\n                os.system(self._config['ui']['web']['on_frame'])\n        except Exception as e:\n            logging.error(\"%s\" % e)\n\n        if self._enabled:\n            self._canvas = (img if self._rotation == 0 else img.rotate(self._rotation))\n            if self._implementation is not None:\n                self._canvas_next = self._canvas\n                self._canvas_next_event.set()"
  },
  {
    "path": "stenogotchi/ui/faces.py",
    "content": "LOOK_R = '( ⚆_⚆)'\nLOOK_L = '(☉_☉ )'\nLOOK_R_HAPPY = '( ◕‿◕)'\nLOOK_L_HAPPY = '(◕‿◕ )'\nSLEEP = '(⇀‿‿↼)'\nSLEEP2 = '(≖‿‿≖)'\nAWAKE = '(◕‿‿◕)'\nBORED = '(-__-)'\nINTENSE = '(°▃▃°)'\nCOOL = '(⌐■_■)'\nHAPPY = '(•‿‿•)'\nGRATEFUL = '(^‿‿^)'\nEXCITED = '(ᵔ◡◡ᵔ)'\nMOTIVATED = '(☼‿‿☼)'\nDEMOTIVATED = '(≖__≖)'\nSMART = '(✜‿‿✜)'\nLONELY = '(ب__ب)'\nSAD = '(╥☁╥ )'\nANGRY = \"(-_-')\"\nFRIEND = '(♥‿‿♥)'\nBROKEN = '(☓‿‿☓)'\nDEBUG = '(#__#)'\nPROCESS_1 = '(1__0)'\nPROCESS_2 = '(1__1)'\nPROCESS_3 = '(0__1)'\nPROCESS_4 = '(0__0)'\n\n\ndef load_from_config(config):\n    for face_name, face_value in config.items():\n        globals()[face_name.upper()] = face_value"
  },
  {
    "path": "stenogotchi/ui/fonts.py",
    "content": "from PIL import ImageFont\n\n# should not be changed\nFONT_NAME = 'DejaVuSansMono'\n\n# can be changed\nSTATUS_FONT_NAME = None\nSIZE_OFFSET = 0\n\nBold = None\nBoldSmall = None\nBoldBig = None\nMedium = None\nSmall = None\nHuge = None\n\n\ndef init(config):\n    global STATUS_FONT_NAME, SIZE_OFFSET\n    STATUS_FONT_NAME = config['ui']['font']['name']\n    SIZE_OFFSET = config['ui']['font']['size_offset']\n    setup(10, 9, 10, 35, 25, 9)\n\n\ndef status_font(old_font):\n    global STATUS_FONT_NAME, SIZE_OFFSET\n    return ImageFont.truetype(STATUS_FONT_NAME, size=old_font.size + SIZE_OFFSET)\n\n\ndef setup(bold, bold_small, medium, huge, bold_big, small):\n    global Bold, BoldSmall, Medium, Huge, BoldBig, Small, FONT_NAME\n\n    Small = ImageFont.truetype(FONT_NAME, small)\n    Medium = ImageFont.truetype(FONT_NAME, medium)\n    BoldSmall = ImageFont.truetype(\"%s-Bold\" % FONT_NAME, bold_small)\n    Bold = ImageFont.truetype(\"%s-Bold\" % FONT_NAME, bold)\n    BoldBig = ImageFont.truetype(\"%s-Bold\" % FONT_NAME, bold_big)\n    Huge = ImageFont.truetype(\"%s-Bold\" % FONT_NAME, huge)"
  },
  {
    "path": "stenogotchi/ui/hw/__init__.py",
    "content": "from stenogotchi.ui.hw.waveshare2 import WaveshareV2\n\ndef display_for(config):\n    # config has been normalized already in utils.load_config\n    if config['ui']['display']['type'] == 'waveshare_2':\n        return WaveshareV2(config)\n    else:\n        print(\"no display specified\")"
  },
  {
    "path": "stenogotchi/ui/hw/base.py",
    "content": "import stenogotchi.ui.fonts as fonts\n\n\nclass DisplayImpl(object):\n    def __init__(self, config, name):\n        self.name = name\n        self.config = config['ui']['display']\n        self._layout = {\n            'width': 0,\n            'height': 0,\n            'face': (0, 0),\n            'name': (0, 0),\n            'ups': (0, 0),\n            'wpm': (0, 0),\n            'strokes': (0, 0),\n            'uptime': (0, 0),\n            'line1': (0, 0),\n            'line2': (0, 0),\n            'friend_face': (0, 0),\n            'friend_name': (0, 0),\n            'bthost': {\n                'pos': (0, 0),\n                'max': 20\n            },\n            'wifi': {\n                'pos': (0, 0),\n                'max': 20\n            },\n            'mode': (0, 0),\n            # status is special :D\n            'status': {\n                'pos': (0, 0),\n                'font': fonts.status_font(fonts.Medium),\n                'max': 20\n            }\n        }\n\n    def layout(self):\n        raise NotImplementedError\n\n    def initialize(self):\n        raise NotImplementedError\n\n    def render(self, canvas):\n        raise NotImplementedError\n\n    def clear(self):\n        raise NotImplementedError"
  },
  {
    "path": "stenogotchi/ui/hw/libs/__init__.py",
    "content": ""
  },
  {
    "path": "stenogotchi/ui/hw/libs/waveshare/__init__.py",
    "content": ""
  },
  {
    "path": "stenogotchi/ui/hw/libs/waveshare/v2/__init__.py",
    "content": ""
  },
  {
    "path": "stenogotchi/ui/hw/libs/waveshare/v2/epd2in13_V2.py",
    "content": "# //*****************************************************************************\n# * | File        :\t  epd2in13.py\n# * | Author      :   Waveshare team\n# * | Function    :   Electronic paper driver\n# * | Info        :\n# *----------------\n# * |\tThis version:   V3.0\n# * | Date        :   2018-11-01\n# * | Info        :   python2 demo\n# * 1.Remove:\n#   digital_write(self, pin, value)\n#   digital_read(self, pin)\n#   delay_ms(self, delaytime)\n#   set_lut(self, lut)\n#   self.lut = self.lut_full_update\n# * 2.Change:\n#   display_frame -> TurnOnDisplay\n#   set_memory_area -> SetWindow\n#   set_memory_pointer -> SetCursor\n# * 3.How to use\n#   epd = epd2in13.EPD()\n#   epd.init(epd.lut_full_update)\n#   image = Image.new('1', (epd2in13.EPD_WIDTH, epd2in13.EPD_HEIGHT), 255)\n#   ...\n#   drawing ......\n#   ...\n#   epd.display(getbuffer(image))\n# ******************************************************************************//\n# Permission is hereby granted, free of charge, to any person obtaining a copy\n# of this software and associated documentation files (the \"Software\"), to deal\n# in the Software without restriction, including without limitation the rights\n# to use, copy, modify, merge, publish, distribute, sublicense, and//or sell\n# copies of the Software, and to permit persons to  whom the Software is\n# furnished to do so, subject to the following conditions:\n#\n# The above copyright notice and this permission notice shall be included in\n# all copies or substantial portions of the Software.\n#\n# THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n# FITNESS OR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n# LIABILITY WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n# THE SOFTWARE.\n#\n\nimport time\nimport spidev\nimport RPi.GPIO as GPIO\nfrom PIL import Image\n\n# Pin definition\nRST_PIN = 17\nDC_PIN = 25\nCS_PIN = 8\nBUSY_PIN = 24\n\n# SPI device, bus = 0, device = 0\nSPI = spidev.SpiDev(0, 0)\n\n\ndef digital_write(pin, value):\n    GPIO.output(pin, value)\n\n\ndef digital_read(pin):\n    return GPIO.input(BUSY_PIN)\n\n\ndef delay_ms(delaytime):\n    time.sleep(delaytime / 1000.0)\n\n\ndef spi_writebyte(data):\n    SPI.writebytes(data)\n\n\ndef module_init():\n    GPIO.setmode(GPIO.BCM)\n    GPIO.setwarnings(False)\n    GPIO.setup(RST_PIN, GPIO.OUT)\n    GPIO.setup(DC_PIN, GPIO.OUT)\n    GPIO.setup(CS_PIN, GPIO.OUT)\n    GPIO.setup(BUSY_PIN, GPIO.IN)\n    SPI.max_speed_hz = 2000000\n    SPI.mode = 0b00\n    return 0;\n\n\n# Display resolution\nEPD_WIDTH = 122\nEPD_HEIGHT = 250\n\n\nclass EPD:\n    def __init__(self):\n        self.reset_pin = RST_PIN\n        self.dc_pin = DC_PIN\n        self.busy_pin = BUSY_PIN\n        self.width = EPD_WIDTH\n        self.height = EPD_HEIGHT\n\n    FULL_UPDATE = 0\n    PART_UPDATE = 1\n    lut_full_update = [\n        0x80, 0x60, 0x40, 0x00, 0x00, 0x00, 0x00,  # LUT0: BB:     VS 0 ~7\n        0x10, 0x60, 0x20, 0x00, 0x00, 0x00, 0x00,  # LUT1: BW:     VS 0 ~7\n        0x80, 0x60, 0x40, 0x00, 0x00, 0x00, 0x00,  # LUT2: WB:     VS 0 ~7\n        0x10, 0x60, 0x20, 0x00, 0x00, 0x00, 0x00,  # LUT3: WW:     VS 0 ~7\n        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  # LUT4: VCOM:   VS 0 ~7\n\n        0x03, 0x03, 0x00, 0x00, 0x02,  # TP0 A~D RP0\n        0x09, 0x09, 0x00, 0x00, 0x02,  # TP1 A~D RP1\n        0x03, 0x03, 0x00, 0x00, 0x02,  # TP2 A~D RP2\n        0x00, 0x00, 0x00, 0x00, 0x00,  # TP3 A~D RP3\n        0x00, 0x00, 0x00, 0x00, 0x00,  # TP4 A~D RP4\n        0x00, 0x00, 0x00, 0x00, 0x00,  # TP5 A~D RP5\n        0x00, 0x00, 0x00, 0x00, 0x00,  # TP6 A~D RP6\n\n        0x15, 0x41, 0xA8, 0x32, 0x30, 0x0A,\n    ]\n\n    lut_partial_update = [  # 20 bytes\n        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  # LUT0: BB:     VS 0 ~7\n        0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  # LUT1: BW:     VS 0 ~7\n        0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  # LUT2: WB:     VS 0 ~7\n        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  # LUT3: WW:     VS 0 ~7\n        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  # LUT4: VCOM:   VS 0 ~7\n\n        0x0A, 0x00, 0x00, 0x00, 0x00,  # TP0 A~D RP0\n        0x00, 0x00, 0x00, 0x00, 0x00,  # TP1 A~D RP1\n        0x00, 0x00, 0x00, 0x00, 0x00,  # TP2 A~D RP2\n        0x00, 0x00, 0x00, 0x00, 0x00,  # TP3 A~D RP3\n        0x00, 0x00, 0x00, 0x00, 0x00,  # TP4 A~D RP4\n        0x00, 0x00, 0x00, 0x00, 0x00,  # TP5 A~D RP5\n        0x00, 0x00, 0x00, 0x00, 0x00,  # TP6 A~D RP6\n\n        0x15, 0x41, 0xA8, 0x32, 0x30, 0x0A,\n    ]\n\n    # Hardware reset\n    def reset(self):\n        digital_write(self.reset_pin, GPIO.HIGH)\n        delay_ms(200)\n        digital_write(self.reset_pin, GPIO.LOW)  # module reset\n        delay_ms(200)\n        digital_write(self.reset_pin, GPIO.HIGH)\n        delay_ms(200)\n\n    def send_command(self, command):\n        digital_write(self.dc_pin, GPIO.LOW)\n        spi_writebyte([command])\n\n    def send_data(self, data):\n        digital_write(self.dc_pin, GPIO.HIGH)\n        spi_writebyte([data])\n\n    def wait_until_idle(self):\n        while (digital_read(self.busy_pin) == 1):  # 0: idle, 1: busy\n            delay_ms(100)\n\n    def TurnOnDisplay(self):\n        self.send_command(0x22)\n        self.send_data(0xC7)\n        self.send_command(0x20)\n        self.wait_until_idle()\n\n    def init(self, update):\n        if (module_init() != 0):\n            return -1\n        # EPD hardware init start\n        self.reset()\n        if (update == self.FULL_UPDATE):\n            self.wait_until_idle()\n            self.send_command(0x12)  # soft reset\n            self.wait_until_idle()\n\n            self.send_command(0x74)  # set analog block control\n            self.send_data(0x54)\n            self.send_command(0x7E)  # set digital block control\n            self.send_data(0x3B)\n\n            self.send_command(0x01)  # Driver output control\n            self.send_data(0xF9)\n            self.send_data(0x00)\n            self.send_data(0x00)\n\n            self.send_command(0x11)  # data entry mode\n            self.send_data(0x01)\n\n            self.send_command(0x44)  # set Ram-X address start//end position\n            self.send_data(0x00)\n            self.send_data(0x0F)  # 0x0C-->(15+1)*8=128\n\n            self.send_command(0x45)  # set Ram-Y address start//end position\n            self.send_data(0xF9)  # 0xF9-->(249+1)=250\n            self.send_data(0x00)\n            self.send_data(0x00)\n            self.send_data(0x00)\n\n            self.send_command(0x3C)  # BorderWavefrom\n            self.send_data(0x03)\n\n            self.send_command(0x2C)  # VCOM Voltage\n            self.send_data(0x55)  #\n\n            self.send_command(0x03)\n            self.send_data(self.lut_full_update[70])\n\n            self.send_command(0x04)  #\n            self.send_data(self.lut_full_update[71])\n            self.send_data(self.lut_full_update[72])\n            self.send_data(self.lut_full_update[73])\n\n            self.send_command(0x3A)  # Dummy Line\n            self.send_data(self.lut_full_update[74])\n            self.send_command(0x3B)  # Gate time\n            self.send_data(self.lut_full_update[75])\n\n            self.send_command(0x32)\n            for count in range(70):\n                self.send_data(self.lut_full_update[count])\n\n            self.send_command(0x4E)  # set RAM x address count to 0\n            self.send_data(0x00)\n            self.send_command(0x4F)  # set RAM y address count to 0X127\n            self.send_data(0xF9)\n            self.send_data(0x00)\n            self.wait_until_idle()\n        else:\n            self.send_command(0x2C)  # VCOM Voltage\n            self.send_data(0x26)\n\n            self.wait_until_idle()\n\n            self.send_command(0x32)\n            for count in range(70):\n                self.send_data(self.lut_partial_update[count])\n\n            self.send_command(0x37)\n            self.send_data(0x00)\n            self.send_data(0x00)\n            self.send_data(0x00)\n            self.send_data(0x00)\n            self.send_data(0x40)\n            self.send_data(0x00)\n            self.send_data(0x00)\n\n            self.send_command(0x22)\n            self.send_data(0xC0)\n            self.send_command(0x20)\n            self.wait_until_idle()\n\n            self.send_command(0x3C)  # BorderWavefrom\n            self.send_data(0x01)\n        return 0\n\n    def getbuffer(self, image):\n        if self.width % 8 == 0:\n            linewidth = self.width // 8\n        else:\n            linewidth = self.width // 8 + 1\n\n        buf = [0xFF] * (linewidth * self.height)\n        image_monocolor = image.convert('1')\n        imwidth, imheight = image_monocolor.size\n        pixels = image_monocolor.load()\n\n        if (imwidth == self.width and imheight == self.height):\n            # print(\"Vertical\")\n            for y in range(imheight):\n                for x in range(imwidth):\n                    if pixels[x, y] == 0:\n                        x = imwidth - x\n                        buf[x // 8 + y * linewidth] &= ~(0x80 >> (x % 8))\n        elif (imwidth == self.height and imheight == self.width):\n            # print(\"Horizontal\")\n            for y in range(imheight):\n                for x in range(imwidth):\n                    newx = y\n                    newy = self.height - x - 1\n                    if pixels[x, y] == 0:\n                        newy = imwidth - newy - 1\n                        buf[newx // 8 + newy * linewidth] &= ~(0x80 >> (y % 8))\n        return buf\n\n    def display(self, image):\n        if self.width % 8 == 0:\n            linewidth = self.width // 8\n        else:\n            linewidth = self.width // 8 + 1\n\n        self.send_command(0x24)\n        for j in range(0, self.height):\n            for i in range(0, linewidth):\n                self.send_data(image[i + j * linewidth])\n        self.TurnOnDisplay()\n\n    def displayPartial(self, image):\n        if self.width % 8 == 0:\n            linewidth = self.width // 8\n        else:\n            linewidth = self.width // 8 + 1\n\n        self.send_command(0x24)\n        for j in range(0, self.height):\n            for i in range(0, linewidth):\n                self.send_data(image[i + j * linewidth])\n        self.send_command(0x26)\n        for j in range(0, self.height):\n            for i in range(0, linewidth):\n                self.send_data(~image[i + j * linewidth])\n        self.TurnOnDisplay()\n\n    def Clear(self, color):\n        if self.width % 8 == 0:\n            linewidth = self.width // 8\n        else:\n            linewidth = self.width // 8 + 1\n        # print(linewidth)\n\n        self.send_command(0x24)\n        for j in range(0, self.height):\n            for i in range(0, linewidth):\n                self.send_data(color)\n        self.TurnOnDisplay()\n\n    def sleep(self):\n        self.send_command(0x22)  # POWER OFF\n        self.send_data(0xC3)\n        self.send_command(0x20)\n\n        self.send_command(0x10)  # enter deep sleep\n        self.send_data(0x01)\n        delay_ms(100)\n\n    ### END OF FILE ###"
  },
  {
    "path": "stenogotchi/ui/hw/waveshare2.py",
    "content": "import logging\n\nimport stenogotchi.ui.fonts as fonts\nfrom stenogotchi.ui.hw.base import DisplayImpl\n\n\nclass WaveshareV2(DisplayImpl):\n    def __init__(self, config):\n        super(WaveshareV2, self).__init__(config, 'waveshare_2')\n        self._display = None\n\n    def layout(self):\n        if self.config['color'] == 'black':\n            fonts.setup(10, 9, 10, 35, 25, 9)\n            self._layout['width'] = 250\n            self._layout['height'] = 122\n            self._layout['face'] = (0, 40)\n            self._layout['name'] = (5, 20)\n            self._layout['ups'] = (0, 0)\n            self._layout['wpm'] = {\n                'pos': (50, 0),\n                'max': 9\n            }\n            self._layout['strokes'] = {\n                'pos': (128, 0),\n                'max': 5\n            }\n            self._layout['uptime'] = (185, 0)\n            self._layout['line1'] = [0, 14, 250, 14]\n            self._layout['line2'] = [0, 108, 250, 108]\n            self._layout['friend_face'] = (0, 92)\n            self._layout['friend_name'] = (40, 94)\n            self._layout['bthost'] = {\n                'pos': (0, 109),\n                'max': 15\n            }\n            self._layout['wifi'] = {\n                'pos': (113, 109),\n                'max': 12\n            }\n            self._layout['mode'] = (210, 109)\n            self._layout['status'] = {\n                'pos': (125, 20),\n                'font': fonts.status_font(fonts.Medium),\n                'max': 20\n            }\n        else:    # these are not correctly configured based on different width and height of color display\n            fonts.setup(10, 9, 10, 35, 25, 9)\n            self._layout['width'] = 212\n            self._layout['height'] = 104\n            self._layout['face'] = (0, 26)\n            self._layout['name'] = (5, 15)\n            self._layout['ups'] = (0, 0)\n            self._layout['wpm'] = {\n                'pos': (50, 0),\n                'max': 9\n            }\n            self._layout['strokes'] = {\n                'pos': (128, 0),\n                'max': 5\n            }\n            self._layout['status'] = (91, 15)\n            self._layout['uptime'] = (147, 0)\n            self._layout['line1'] = [0, 12, 212, 12]\n            self._layout['line2'] = [0, 92, 212, 92]\n            self._layout['friend_face'] = (0, 76)\n            self._layout['friend_name'] = (40, 78)\n            self._layout['bthost'] = {\n                'pos': (0, 93),\n                'max': 15\n            }\n            self._layout['wifi'] = {\n                'pos': (113, 109),\n                'max': 12\n            }\n            self._layout['mode'] = (187, 93)\n            self._layout['status'] = {\n                'pos': (125, 20),\n                'font': fonts.status_font(fonts.Medium),\n                'max': 14\n            }\n        return self._layout\n\n    def initialize(self):\n        logging.info(\"initializing waveshare v2 display\")\n        from stenogotchi.ui.hw.libs.waveshare.v2.epd2in13_V2 import EPD\n        self._display = EPD()\n        self._display.init(self._display.FULL_UPDATE)\n        self._display.Clear(0xff)\n        self._display.init(self._display.PART_UPDATE)\n\n    def render(self, canvas):\n        buf = self._display.getbuffer(canvas)\n        self._display.displayPartial(buf)\n\n    def clear(self):\n        self._display.Clear(0xff)\n"
  },
  {
    "path": "stenogotchi/ui/state.py",
    "content": "from threading import Lock\n\n\nclass State(object):\n    def __init__(self, state={}):\n        self._state = state\n        self._lock = Lock()\n        self._listeners = {}\n        self._changes = {}\n\n    def add_element(self, key, elem):\n        self._state[key] = elem\n        self._changes[key] = True\n\n    def has_element(self, key):\n        return key in self._state\n\n    def remove_element(self, key):\n        del self._state[key]\n        self._changes[key] = True\n\n    def add_listener(self, key, cb):\n        with self._lock:\n            self._listeners[key] = cb\n\n    def items(self):\n        with self._lock:\n            return self._state.items()\n\n    def get(self, key):\n        with self._lock:\n            return self._state[key].value if key in self._state else None\n\n    def reset(self):\n        with self._lock:\n            self._changes = {}\n\n    def changes(self, ignore=()):\n        with self._lock:\n            changes = []\n            for change in self._changes.keys():\n                if change not in ignore:\n                    changes.append(change)\n            return changes\n\n    def has_changes(self):\n        with self._lock:\n            return len(self._changes) > 0\n\n    def set(self, key, value):\n        with self._lock:\n            if key in self._state:\n                prev = self._state[key].value\n                self._state[key].value = value\n\n                if prev != value:\n                    self._changes[key] = True\n                    if key in self._listeners and self._listeners[key] is not None:\n                        self._listeners[key](prev, value)\n"
  },
  {
    "path": "stenogotchi/ui/view.py",
    "content": "import _thread\nfrom threading import Lock\nimport time\nimport logging\nimport random\nfrom PIL import ImageDraw\n\nimport stenogotchi\nimport stenogotchi.utils as utils\nimport stenogotchi.plugins as plugins\nfrom stenogotchi.voice import Voice\n\nimport stenogotchi.ui.web as web\nimport stenogotchi.ui.fonts as fonts\nimport stenogotchi.ui.faces as faces\nfrom stenogotchi.ui.components import *\nfrom stenogotchi.ui.state import State\n\nWHITE = 0xff\nBLACK = 0x00\nROOT = None\n\n\nclass View(object):\n    def __init__(self, config, impl, state=None):\n        global ROOT\n\n        # setup faces from the configuration in case the user customized them\n        faces.load_from_config(config['ui']['faces'])\n\n        self._agent = None\n        self._render_cbs = []\n        self._config = config\n        self._canvas = None\n        self._frozen = False\n        self._lock = Lock()\n        self._voice = Voice(lang=config['main']['lang'])\n        self._implementation = impl\n        self._layout = impl.layout()\n        self._width = self._layout['width']\n        self._height = self._layout['height']\n        self._state = State(state={\n            'ups': LabeledValue(color=BLACK, label='BAT', value='', position=self._layout['ups'],\n                                    label_font=fonts.Bold,text_font=fonts.Medium),\n\n            'wpm': LabeledValue(color=BLACK, label='WPM', value='', position=self._layout['wpm']['pos'],\n                                label_font=fonts.Bold, text_font=fonts.Medium, max_length=self._layout['wpm']['max']),\n\n            'strokes': LabeledValue(color=BLACK, label='STR', value='', position=self._layout['strokes']['pos'],\n                                label_font=fonts.Bold, text_font=fonts.Medium, max_length=self._layout['strokes']['max']),\n\n            'uptime': LabeledValue(color=BLACK, label='UP', value='', position=self._layout['uptime'],\n                                   label_font=fonts.Bold, text_font=fonts.Medium),\n\n            'line1': Line(self._layout['line1'], color=BLACK),\n \n            'line2': Line(self._layout['line2'], color=BLACK),\n \n            'face': Text(value=faces.SLEEP, position=self._layout['face'], color=BLACK, font=fonts.Huge),\n \n            'friend_face': Text(value=None, position=self._layout['friend_face'], font=fonts.Bold, color=BLACK),\n \n            'friend_name': Text(value=None, position=self._layout['friend_name'], font=fonts.BoldSmall, color=BLACK),\n \n            'name': Text(value='%s>' % 'stenogotchi', position=self._layout['name'], color=BLACK, font=fonts.Bold),\n \n            'status': Text(value=self._voice.default(),\n                           position=self._layout['status']['pos'],\n                           color=BLACK,\n                           font=self._layout['status']['font'],\n                           wrap=True,\n                           # the current maximum number of characters per line, assuming each character is 6 pixels wide\n                           max_length=self._layout['status']['max']),\n\n            'bthost': LabeledValue(label='BT', value='', color=BLACK,\n                                   position=self._layout['bthost']['pos'], label_font=fonts.Bold,\n                                   text_font=fonts.Medium, max_length=self._layout['bthost']['max']),\n \n            'wifi': LabeledValue(label='WIFI', value='', color=BLACK,\n                                   position=self._layout['wifi']['pos'], label_font=fonts.Bold,\n                                   text_font=fonts.Medium, max_length=self._layout['wifi']['max']),\n \n            'mode': Text(value='NONE', position=self._layout['mode'],\n                         font=fonts.Bold, color=BLACK),\n        })\n\n        if state:\n            for key, value in state.items():\n                self._state.set(key, value)\n\n        plugins.on('ui_setup', self)\n\n        if config['ui']['fps'] > 0.0:\n            _thread.start_new_thread(self._refresh_handler, ())\n            self._ignore_changes = ()\n        else:\n            logging.warning(\"ui.fps is 0, the display will only update for major changes\")\n            self._ignore_changes = ('uptime', 'name')\n\n        ROOT = self\n\n    def set_agent(self, agent):\n        self._agent = agent\n\n    def has_element(self, key):\n        self._state.has_element(key)\n\n    def add_element(self, key, elem):\n        self._state.add_element(key, elem)\n\n    def remove_element(self, key):\n        self._state.remove_element(key)\n\n    def width(self):\n        return self._width\n\n    def height(self):\n        return self._height\n\n    def on_state_change(self, key, cb):\n        self._state.add_listener(key, cb)\n\n    def on_render(self, cb):\n        if cb not in self._render_cbs:\n            self._render_cbs.append(cb)\n\n    def _refresh_handler(self):\n        delay = 1.0 / self._config['ui']['fps']\n        while True:\n            try:\n                name = self._state.get('name')\n                self.set('name', name.rstrip('█').strip() if '█' in name else (name + ' █'))\n                self.update()\n            except Exception as e:\n                logging.warning(\"non fatal error while updating view: %s\" % e)\n\n            time.sleep(delay)\n\n    def set(self, key, value):\n        self._state.set(key, value)\n\n    def get(self, key):\n        return self._state.get(key)\n\n    def on_starting(self):\n        self.set('status', self._voice.on_starting() + (\"\\n(v%s)\" % stenogotchi.__version__))\n        self.set('face', faces.AWAKE)\n        self.update()\n\n    def on_manual_mode(self, last_session):\n        self.set('mode', 'MANU')\n        self.set('face', faces.HAPPY)\n        self.set('status', self._voice.on_last_session_data(last_session))\n        self.set('uptime', last_session.duration)\n        self.update()\n\n    def is_normal(self):\n        return self._state.get('face') not in (\n            faces.INTENSE,\n            faces.COOL,\n            faces.BORED,\n            faces.HAPPY,\n            faces.EXCITED,\n            faces.MOTIVATED,\n            faces.DEMOTIVATED,\n            faces.SMART,\n            faces.SAD,\n            faces.LONELY)\n\n    def on_keys_generation(self):\n        self.set('face', faces.AWAKE)\n        self.set('status', self._voice.on_keys_generation())\n        self.update()\n\n    def on_normal(self):\n        self.set('face', faces.AWAKE)\n        self.set('status', self._voice.on_normal())\n        self.update()\n\n    def on_reading_logs(self, lines_so_far=0):\n        self.set('face', faces.SMART)\n        self.set('status', self._voice.on_reading_logs(lines_so_far))\n        self.update()\n\n    def wait(self, secs, sleeping=True):\n        was_normal = self.is_normal()\n        part = secs / 10.0\n        \n        for step in range(0, 10):\n            # if we weren't in a normal state before going\n            # to sleep, keep that face and status on for\n            # a while, otherwise the sleep animation will\n            # always override any minor state change before it\n            if was_normal or step > 5:\n                if sleeping:\n                    if secs > 1:\n                        self.set('face', faces.SLEEP)\n                        self.set('status', self._voice.on_napping(int(secs)))\n                    else:\n                        self.set('face', faces.SLEEP2)\n                        self.set('status', self._voice.on_awakening())\n                else:\n                    self.set('status', self._voice.on_waiting(int(secs)))\n                    good_mood = self._agent.in_good_mood()\n                    if step % 2 == 0:\n                        self.set('face', faces.LOOK_R_HAPPY if good_mood else faces.LOOK_R)\n                    else:\n                        self.set('face', faces.LOOK_L_HAPPY if good_mood else faces.LOOK_L)\n\n            time.sleep(part)\n            secs -= part\n\n        self.on_normal()\n\n    def on_shutdown(self):\n        face = random.choices((faces.SLEEP, faces.SLEEP2), weights=[0.7, 0.3], k=1)\n        self.set('face', face[0])\n        self.set('status', self._voice.on_shutdown())\n        self.update(force=True)\n        self._frozen = True\n\n    def on_bored(self):\n        self.set('face', faces.BORED)\n        self.set('status', self._voice.on_bored())\n        self.update()\n\n    def on_sad(self):\n        self.set('face', faces.SAD)\n        self.set('status', self._voice.on_sad())\n        self.update()\n\n    def on_angry(self):\n        self.set('face', faces.ANGRY)\n        self.set('status', self._voice.on_angry())\n        self.update()\n\n    def on_motivated(self, reward):\n        self.set('face', faces.MOTIVATED)\n        self.set('status', self._voice.on_motivated(reward))\n        self.update()\n\n    def on_demotivated(self, reward):\n        self.set('face', faces.DEMOTIVATED)\n        self.set('status', self._voice.on_demotivated(reward))\n        self.update()\n\n    def on_excited(self):\n        self.set('face', faces.EXCITED)\n        self.set('status', self._voice.on_excited())\n        self.update()\n\n    def on_miss(self, who):\n        self.set('face', faces.SAD)\n        self.set('status', self._voice.on_miss(who))\n        self.update()\n\n    def on_grateful(self):\n        self.set('face', faces.GRATEFUL)\n        self.set('status', self._voice.on_grateful())\n        self.update()\n\n    def on_lonely(self):\n        self.set('face', faces.LONELY)\n        self.set('status', self._voice.on_lonely())\n        self.update()\n\n    def on_processing(self):\n        start_face = self._state.get('face')\n        processing_faces = [faces.PROCESS_1, faces.PROCESS_2, faces.PROCESS_3, faces.PROCESS_4]\n        for face in processing_faces:\n            self.set('face', face)\n            self.update()\n            time.sleep(2)\n        self.set('face', start_face)\n        self.update()\n\n    def on_rebooting(self):\n        self.set('face', faces.BROKEN)\n        self.set('status', self._voice.on_rebooting())\n        self.update()\n\n    def on_custom(self, text):\n        self.set('face', faces.DEBUG)\n        self.set('status', self._voice.custom(text))\n        self.update()\n    \n    def on_plover_boot(self):\n        face = random.choices([faces.SLEEP, faces.SLEEP2, faces.BORED], weights=[0.6, 0.3, 0.1], k=1)\n        self.set('face', face[0])\n        self.set('status', self._voice.on_plover_boot())\n        self.update()\n\n    def on_plover_ready(self):\n        face = random.choices([faces.AWAKE, faces.LOOK_R_HAPPY, faces.LOOK_L_HAPPY, faces.EXCITED, faces.GRATEFUL], weights=[0.5, 0.2, 0.2, 0.05, 0.05], k=1)\n        self.set('face', face[0])\n        self.set('status', self._voice.on_plover_ready())\n        if self._state.get('mode') == 'NONE':\n            self.set('mode', 'STENO')\n        self.update()\n\n    def on_plover_quit(self):\n        face = random.choice((faces.BROKEN, faces.DEBUG))\n        self.set('face', face)\n        self.set('status', 'Uh-oh... I think Plover just quit on us')\n        if self._state.get('mode') == 'STENO':\n            self.set('mode', 'NONE')\n        self.update()\n\n    def on_wpm(self, wpm):\n        self.set('wpm', wpm)\n        self.update()\n\n    def on_strokes(self, strokes):\n        self.set('strokes', strokes)\n        self.update()\n\n    def on_wpm_record(self, wpm_top):\n        if wpm_top < 100:\n            self.set('face', faces.LOOK_R_HAPPY)\n        elif wpm_top < 200:\n            self.set('face', faces.EXCITED)\n        else:\n            self.set('face', faces.INTENSE)\n        self.set('status', self._voice.on_wpm_record(wpm_top))\n        # Don't trigger self.update as we always will call set_wpm() afterwards.\n\n    def on_bt_connected(self, bthost_name):\n        self.set('face', faces.LOOK_L_HAPPY)\n        self.set('status', self._voice.on_bt_connected(bthost_name))\n        self.update()\n\n    def on_bt_disconnected(self):\n        self.set('face', faces.INTENSE)\n        self.set('status', self._voice.on_bt_disconnected())\n        self.update()\n\n    def on_wifi_connected(self, ssid, ip):\n        self.set('face', faces.COOL)\n        self.set('status', self._voice.on_wifi_connected(ssid, ip))\n        self.update()\n\n    def on_wifi_disconnected(self):\n        self.set('face', faces.LONELY)\n        self.set('status', self._voice.on_wifi_disconnected())\n        self.update()\n    \n    def on_dict_lookup_done(self):\n        face = random.choices([faces.AWAKE, faces.LOOK_R_HAPPY, faces.LOOK_L_HAPPY, faces.EXCITED, faces.GRATEFUL], weights=[0.5, 0.2, 0.2, 0.05, 0.05], k=1)\n        self.set('face', face[0])\n        self.set('status', self._voice.on_dict_lookup_done())\n        self.update()\n\n    def update(self, force=False, new_data={}):\n        for key, val in new_data.items():\n            self.set(key, val)\n\n        with self._lock:\n            if self._frozen:\n                return\n\n            state = self._state\n            changes = state.changes(ignore=self._ignore_changes)\n            if force or len(changes):\n                self._canvas = Image.new('1', (self._width, self._height), WHITE)\n                drawer = ImageDraw.Draw(self._canvas)\n\n                plugins.on('ui_update', self)\n\n                for key, lv in state.items():\n                    lv.draw(self._canvas, drawer)\n\n                web.update_frame(self._canvas)\n\n                for cb in self._render_cbs:\n                    cb(self._canvas)\n\n                self._state.reset()\n"
  },
  {
    "path": "stenogotchi/ui/web/__init__.py",
    "content": "import os\nfrom threading import Lock\n\nframe_path = '/var/tmp/stenogotchi/stenogotchi.png'\nframe_format = 'PNG'\nframe_ctype = 'image/png'\nframe_lock = Lock()\n\n\ndef update_frame(img):\n    global frame_lock, frame_path, frame_format\n    if not os.path.exists(os.path.dirname(frame_path)):\n        os.makedirs(os.path.dirname(frame_path))\n    with frame_lock:\n        img.save(frame_path, format=frame_format)\n"
  },
  {
    "path": "stenogotchi/ui/web/handler.py",
    "content": "import logging\nimport os\nimport _thread\nimport secrets\nimport subprocess\nfrom functools import wraps\n\n# https://stackoverflow.com/questions/14888799/disable-console-messages-in-flask-server\nlogging.getLogger('werkzeug').setLevel(logging.ERROR)\nos.environ['WERKZEUG_RUN_MAIN'] = 'true'\n\nimport stenogotchi\nimport stenogotchi.ui.web as web\nfrom stenogotchi import plugins\n\nfrom flask import send_file\nfrom flask import Response\nfrom flask import request\nfrom flask import abort\nfrom flask import redirect\nfrom flask import render_template, render_template_string\n\n\nclass Handler:\n    def __init__(self, config, agent, app):\n        self._config = config\n        self._agent = agent\n        self._app = app\n\n        self._app.add_url_rule('/', 'index', self.with_auth(self.index))\n        self._app.add_url_rule('/ui', 'ui', self.with_auth(self.ui))\n\n        self._app.add_url_rule('/shutdown', 'shutdown', self.with_auth(self.shutdown), methods=['POST'])\n        \n        self._app.add_url_rule('/toggle_input', 'toggle_input', self.with_auth(self.toggle_input), methods=['POST'])\n        self._app.add_url_rule('/toggle_wpm', 'toggle_wpm', self.with_auth(self.toggle_wpm), methods=['POST'])\n        self._app.add_url_rule('/toggle_lookup', 'toggle_lookup', self.with_auth(self.toggle_lookup), methods=['POST'])\n        self._app.add_url_rule('/buttonshim/<button>', 'buttonshim', self.with_auth(self.buttonshim), methods=['GET'])\n\n        self._app.add_url_rule('/reboot', 'reboot', self.with_auth(self.reboot), methods=['POST'])\n        self._app.add_url_rule('/restart', 'restart', self.with_auth(self.restart), methods=['POST'])\n\n        # plugins\n        plugins_with_auth = self.with_auth(self.plugins)\n        self._app.add_url_rule('/plugins', 'plugins', plugins_with_auth, strict_slashes=False,\n                               defaults={'name': None, 'subpath': None})\n        self._app.add_url_rule('/plugins/<name>', 'plugins', plugins_with_auth, strict_slashes=False,\n                               methods=['GET', 'POST'], defaults={'subpath': None})\n        self._app.add_url_rule('/plugins/<name>/<path:subpath>', 'plugins', plugins_with_auth, methods=['GET', 'POST'])\n\n    def _check_creds(self, u, p):\n        # trying to be timing attack safe\n        return secrets.compare_digest(u, self._config['username']) and \\\n               secrets.compare_digest(p, self._config['password'])\n\n    def with_auth(self, f):\n        @wraps(f)\n        def wrapper(*args, **kwargs):\n            auth = request.authorization\n            if not auth or not auth.username or not auth.password or not self._check_creds(auth.username,\n                                                                                           auth.password):\n                return Response('Unauthorized', 401, {'WWW-Authenticate': 'Basic realm=\"Unauthorized\"'})\n            return f(*args, **kwargs)\n\n        return wrapper\n\n    def index(self):\n        return render_template('index.html',\n                               title=stenogotchi.name(),\n                               other_mode='AUTO' if self._agent.mode == 'manual' else 'MANU')\n\n    def plugins(self, name, subpath):\n        if name is None:\n            return render_template('plugins.html', loaded=plugins.loaded, database=plugins.database)\n\n        if name == 'toggle' and request.method == 'POST':\n            checked = True if 'enabled' in request.form else False\n            return 'success' if plugins.toggle_plugin(request.form['plugin'], checked) else 'failed'\n\n        if name in plugins.loaded and plugins.loaded[name] is not None and hasattr(plugins.loaded[name], 'on_webhook'):\n            try:\n                return plugins.loaded[name].on_webhook(subpath, request)\n            except Exception:\n                abort(500)\n        else:\n            abort(404)\n\n    # serve a message and shuts down the unit\n    def shutdown(self):\n        try:\n            return render_template('status.html', title=stenogotchi.name(), go_back_after=60,\n                                   message='Shutting down ...')\n        finally:\n            _thread.start_new_thread(stenogotchi.shutdown, ())\n\n    # switch between STENO and QWERTY input mode\n    def toggle_input(self):\n        if 'buttonshim' in plugins.loaded:\n            _thread.start_new_thread(plugins.loaded['buttonshim'].toggle_qwerty_steno, ())\n            return redirect(\"/\")\n        else:\n            return render_template('status.html', title=stenogotchi.name(), go_back_after=10,\n                                   message='Please enable the buttonshim plugin first.')\n\n    # toggle WPM readings\n    def toggle_wpm(self):\n        if 'buttonshim' in plugins.loaded:\n            _thread.start_new_thread(plugins.loaded['buttonshim'].toggle_wpm_meters, ())\n            return redirect(\"/\")\n        else: \n            return render_template('status.html', title=stenogotchi.name(), go_back_after=10,\n                                message='Please enable the buttonshim plugin first.')\n    \n    # toggle dictionary lookup mode\n    def toggle_lookup(self):\n        if 'buttonshim' and 'dict_lookup' in plugins.loaded:\n            if plugins.loaded['dict_lookup'].get_running():\n                _thread.start_new_thread(plugins.loaded['buttonshim'].toggle_dictionary_lookup, ())\n                return redirect(\"/\")\n            else:\n                return render_template('status.html', title=stenogotchi.name(), go_back_after=5,\n                                    message='Dict_lookup is not ready yet. Check that Plover is running.')    \n        else:\n            return render_template('status.html', title=stenogotchi.name(), go_back_after=5,\n                                    message='Please enable both the buttonshim and dict_lookup plugins first.')\n    \n    # buttonshim custom action (emulating buttonshim short press)\n    def buttonshim(self, button):\n        logging.info(f\"[WEBUI-buttonshim] Button Pressed! Loading command from slot '{button}' for button '{button}'\")\n        bCfg = plugins.loaded['buttonshim'].options['buttons'][button]\n        command = bCfg['command']\n        if command == '':\n            logging.debug(f\"[WEBUI-buttonshim] No command set for button {button} in config\")\n            return render_template('status.html', title=stenogotchi.name(), go_back_after=5, \n                                    message=f\"No command set in config for button {button}\")\n        else:\n            logging.debug(f\"[WEBUI-buttonshim] Process create: {command}\")\n            process = subprocess.Popen(command, shell=True, stdin=None, \n                                        stdout=open(\"/dev/null\", \"w\"), stderr=None, executable=\"/bin/bash\")\n            process.wait()\n            process = None\n            logging.debug(f\"[WEBUI-buttonshim] Process end\")\n            return render_template('status.html', title=stenogotchi.name(), go_back_after=10, \n                                    message=f\"Executed command: '{command}'\")\n        \n    # serve a message and reboot the unit\n    def reboot(self):\n          try:\n              return render_template('status.html', title=stenogotchi.name(), go_back_after=70,\n                                     message='Rebooting ...')\n          finally:\n              _thread.start_new_thread(stenogotchi.reboot, ())\n\n    # serve a message and restart the unit in the other mode\n    def restart(self):\n        mode = request.form['mode']\n        if mode not in ('AUTO', 'MANU'):\n            mode = 'MANU'\n\n        try:\n            return render_template('status.html', title=stenogotchi.name(), go_back_after=30,\n                                   message='Restarting in %s mode ...' % mode)\n        finally:\n            _thread.start_new_thread(stenogotchi.restart, (mode,))\n\n    # serve the PNG file with the display image\n    def ui(self):\n        with web.frame_lock:\n            return send_file(web.frame_path, mimetype='image/png')\n"
  },
  {
    "path": "stenogotchi/ui/web/server.py",
    "content": "import _thread\nimport secrets\nimport logging\nimport os\n\n# https://stackoverflow.com/questions/14888799/disable-console-messages-in-flask-server\nlogging.getLogger('werkzeug').setLevel(logging.ERROR)\nos.environ['WERKZEUG_RUN_MAIN'] = 'true'\n\nfrom flask import Flask\nfrom flask_cors import CORS\nfrom flask_wtf.csrf import CSRFProtect\n\nfrom stenogotchi.ui.web.handler import Handler\n\nclass Server:\n    def __init__(self, agent, config):\n        self._config = config['web']\n        self._enabled = self._config['enabled']\n        self._port = self._config['port']\n        self._address = self._config['address']\n        self._origin = None\n        self._agent = agent\n        if 'origin' in self._config:\n            self._origin = self._config['origin']\n\n        if self._enabled:\n            _thread.start_new_thread(self._http_serve, ())\n\n    def _http_serve(self):\n        if self._address is not None:\n            web_path = os.path.dirname(os.path.realpath(__file__))\n\n            app = Flask(__name__,\n                        static_url_path='',\n                        static_folder=os.path.join(web_path, 'static'),\n                        template_folder=os.path.join(web_path, 'templates'))\n\n            app.secret_key = secrets.token_urlsafe(256)\n\n            if self._origin:\n                CORS(app, resources={r\"*\": {\"origins\": self._origin}})\n\n            CSRFProtect(app)\n            Handler(self._config, self._agent, app)\n\n            logging.info(\"web ui available at http://%s:%d/\" % (self._address, self._port))\n\n            app.run(host=self._address, port=self._port, debug=False)\n        else:\n            logging.info(\"could not get ip of usb0, video server not starting\")\n"
  },
  {
    "path": "stenogotchi/ui/web/static/css/jquery.jqplot.css",
    "content": "/*rules for the plot target div.  These will be cascaded down to all plot elements according to css rules*/\n.jqplot-target {\n    position: relative;\n    color: #666666;\n    font-family: \"Trebuchet MS\", Arial, Helvetica, sans-serif;\n    font-size: 1em;\n/*    height: 300px;\n    width: 400px;*/\n}\n\n/*rules applied to all axes*/\n.jqplot-axis {\n    font-size: 0.75em;\n}\n\n.jqplot-xaxis {\n    margin-top: 10px;\n}\n\n.jqplot-x2axis {\n    margin-bottom: 10px;\n}\n\n.jqplot-yaxis {\n    margin-right: 10px;\n}\n\n.jqplot-y2axis, .jqplot-y3axis, .jqplot-y4axis, .jqplot-y5axis, .jqplot-y6axis, .jqplot-y7axis, .jqplot-y8axis, .jqplot-y9axis, .jqplot-yMidAxis {\n    margin-left: 10px;\n    margin-right: 10px;\n}\n\n/*rules applied to all axis tick divs*/\n.jqplot-axis-tick, .jqplot-xaxis-tick, .jqplot-yaxis-tick, .jqplot-x2axis-tick, .jqplot-y2axis-tick, .jqplot-y3axis-tick, .jqplot-y4axis-tick, .jqplot-y5axis-tick, .jqplot-y6axis-tick, .jqplot-y7axis-tick, .jqplot-y8axis-tick, .jqplot-y9axis-tick, .jqplot-yMidAxis-tick {\n    position: absolute;\n    white-space: pre;\n}\n\n\n.jqplot-xaxis-tick {\n    top: 0px;\n    /* initial position untill tick is drawn in proper place */\n    left: 15px;\n/*    padding-top: 10px;*/\n    vertical-align: top;\n}\n\n.jqplot-x2axis-tick {\n    bottom: 0px;\n    /* initial position untill tick is drawn in proper place */\n    left: 15px;\n/*    padding-bottom: 10px;*/\n    vertical-align: bottom;\n}\n\n.jqplot-yaxis-tick {\n    right: 0px;\n    /* initial position untill tick is drawn in proper place */\n    top: 15px;\n/*    padding-right: 10px;*/\n    text-align: right;\n}\n\n.jqplot-yaxis-tick.jqplot-breakTick {\n    right: -20px;\n    margin-right: 0px;\n    padding:1px 5px 1px 5px;\n    /*background-color: white;*/\n    z-index: 2;\n    font-size: 1.5em;\n}\n\n.jqplot-y2axis-tick, .jqplot-y3axis-tick, .jqplot-y4axis-tick, .jqplot-y5axis-tick, .jqplot-y6axis-tick, .jqplot-y7axis-tick, .jqplot-y8axis-tick, .jqplot-y9axis-tick {\n    left: 0px;\n    /* initial position untill tick is drawn in proper place */\n    top: 15px;\n/*    padding-left: 10px;*/\n/*    padding-right: 15px;*/\n    text-align: left;\n}\n\n.jqplot-yMidAxis-tick {\n    text-align: center;\n    white-space: nowrap;\n}\n\n.jqplot-xaxis-label {\n    margin-top: 10px;\n    font-size: 11pt;\n    position: absolute;\n}\n\n.jqplot-x2axis-label {\n    margin-bottom: 10px;\n    font-size: 11pt;\n    position: absolute;\n}\n\n.jqplot-yaxis-label {\n    margin-right: 10px;\n/*    text-align: center;*/\n    font-size: 11pt;\n    position: absolute;\n}\n\n.jqplot-yMidAxis-label {\n    font-size: 11pt;\n    position: absolute;\n}\n\n.jqplot-y2axis-label, .jqplot-y3axis-label, .jqplot-y4axis-label, .jqplot-y5axis-label, .jqplot-y6axis-label, .jqplot-y7axis-label, .jqplot-y8axis-label, .jqplot-y9axis-label {\n/*    text-align: center;*/\n    font-size: 11pt;\n    margin-left: 10px;\n    position: absolute;\n}\n\n.jqplot-meterGauge-tick {\n    font-size: 0.75em;\n    color: #999999;\n}\n\n.jqplot-meterGauge-label {\n    font-size: 1em;\n    color: #999999;\n}\n\ntable.jqplot-table-legend {\n    margin-top: 12px;\n    margin-bottom: 12px;\n    margin-left: 12px;\n    margin-right: 12px;\n}\n\ntable.jqplot-table-legend, table.jqplot-cursor-legend {\n    background-color: rgba(255,255,255,0.6);\n    border: 1px solid #cccccc;\n    position: absolute;\n    font-size: 0.75em;\n}\n\ntd.jqplot-table-legend {\n    vertical-align:middle;\n}\n\n/*\nThese rules could be used instead of assigning\nelement styles and relying on js object properties.\n*/\n\n/*\ntd.jqplot-table-legend-swatch {\n    padding-top: 0.5em;\n    text-align: center;\n}\n\ntr.jqplot-table-legend:first td.jqplot-table-legend-swatch {\n    padding-top: 0px;\n}\n*/\n\ntd.jqplot-seriesToggle:hover, td.jqplot-seriesToggle:active {\n    cursor: pointer;\n}\n\n.jqplot-table-legend .jqplot-series-hidden {\n    text-decoration: line-through;\n}\n\ndiv.jqplot-table-legend-swatch-outline {\n    border: 1px solid #cccccc;\n    padding:1px;\n}\n\ndiv.jqplot-table-legend-swatch {\n    width:0px;\n    height:0px;\n    border-top-width: 5px;\n    border-bottom-width: 5px;\n    border-left-width: 6px;\n    border-right-width: 6px;\n    border-top-style: solid;\n    border-bottom-style: solid;\n    border-left-style: solid;\n    border-right-style: solid;\n}\n\n.jqplot-title {\n    top: 0px;\n    left: 0px;\n    padding-bottom: 0.5em;\n    font-size: 1.2em;\n}\n\ntable.jqplot-cursor-tooltip {\n    border: 1px solid #cccccc;\n    font-size: 0.75em;\n}\n\n\n.jqplot-cursor-tooltip {\n    border: 1px solid #cccccc;\n    font-size: 0.75em;\n    white-space: nowrap;\n    background: rgba(208,208,208,0.5);\n    padding: 1px;\n}\n\n.jqplot-highlighter-tooltip, .jqplot-canvasOverlay-tooltip {\n    border: 1px solid #cccccc;\n    font-size: 0.75em;\n    white-space: nowrap;\n    background: rgba(208,208,208,0.5);\n    padding: 1px;\n}\n\n.jqplot-point-label {\n    font-size: 0.75em;\n    z-index: 2;\n}\n      \ntd.jqplot-cursor-legend-swatch {\n    vertical-align: middle;\n    text-align: center;\n}\n\ndiv.jqplot-cursor-legend-swatch {\n    width: 1.2em;\n    height: 0.7em;\n}\n\n.jqplot-error {\n/*   Styles added to the plot target container when there is an error go here.*/\n    text-align: center;\n}\n\n.jqplot-error-message {\n/*    Styling of the custom error message div goes here.*/\n    position: relative;\n    top: 46%;\n    display: inline-block;\n}\n\ndiv.jqplot-bubble-label {\n    font-size: 0.8em;\n/*    background: rgba(90%, 90%, 90%, 0.15);*/\n    padding-left: 2px;\n    padding-right: 2px;\n    color: rgb(20%, 20%, 20%);\n}\n\ndiv.jqplot-bubble-label.jqplot-bubble-label-highlight {\n    background: rgba(90%, 90%, 90%, 0.7);\n}\n\ndiv.jqplot-noData-container {\n    text-align: center;\n    background-color: rgba(96%, 96%, 96%, 0.3);\n}\n"
  },
  {
    "path": "stenogotchi/ui/web/static/css/style.css",
    "content": ".ui-image {\n    width: 100%;\n}\n\n.pixelated {\n    image-rendering: optimizeSpeed; /* Legal fallback */\n    image-rendering: -moz-crisp-edges; /* Firefox        */\n    image-rendering: -o-crisp-edges; /* Opera          */\n    image-rendering: -webkit-optimize-contrast; /* Safari         */\n    image-rendering: optimize-contrast; /* CSS3 Proposed  */\n    image-rendering: crisp-edges; /* CSS4 Proposed  */\n    image-rendering: pixelated; /* CSS4 Proposed  */\n    -ms-interpolation-mode: nearest-neighbor; /* IE8+           */\n}\n\n.image-wrapper {\n    flex: 1;\n    position: relative;\n}\n\ndiv.status {\n    position: absolute;\n    top: 0;\n    left: 0;\n    width: 100%;\n}\n\na.read {\n    color: #777 !important;\n}\n\np.messagebody {\n    padding: 1em;\n}\n\nli.navitem {\n    width: 14.285% !important;\n    clear: none !important;\n}\n\n/* Custom indentations are needed because the length of custom labels differs from\n   the length of the standard labels */\n.custom-size-flipswitch.ui-flipswitch .ui-btn.ui-flipswitch-on {\n    text-indent: -5.9em;\n}\n\n.custom-size-flipswitch.ui-flipswitch .ui-flipswitch-off {\n    text-indent: 0.5em;\n}\n\n/* Custom widths are needed because the length of custom labels differs from\n   the length of the standard labels */\n.custom-size-flipswitch.ui-flipswitch {\n    width: 8.875em;\n}\n\n.custom-size-flipswitch.ui-flipswitch.ui-flipswitch-active {\n    padding-left: 7em;\n    width: 1.875em;\n}\n\n@media (min-width: 28em) {\n    /*Repeated from rule .ui-flipswitch above*/\n    .ui-field-contain > label + .custom-size-flipswitch.ui-flipswitch {\n        width: 1.875em;\n    }\n}\n\n#container {\n    display: flex;\n    flex-wrap: wrap;\n    justify-content: space-around;\n}\n\n.plugins-box {\n    margin: 0.5rem;\n    padding: 0.2rem;\n    border-style: groove;\n    border-radius: 0.5rem;\n    background-color: lightgrey;\n    text-align: center;\n}\n"
  },
  {
    "path": "stenogotchi/ui/web/static/js/jquery.jqplot.js",
    "content": "/**\n * Title: jqPlot Charts\n * \n * Pure JavaScript plotting plugin for jQuery.\n * \n * About: Version\n * \n * version: 1.0.9 \n * revision: d96a669\n * \n * About: Copyright & License\n * \n * Copyright (c) 2009-2016 Chris Leonello\n * jqPlot is currently available for use in all personal or commercial projects \n * under both the MIT and GPL version 2.0 licenses. This means that you can \n * choose the license that best suits your project and use it accordingly.\n * \n * See <GPL Version 2> and <MIT License> contained within this distribution for further information. \n *\n * The author would appreciate an email letting him know of any substantial\n * use of jqPlot.  You can reach the author at: chris at jqplot dot com \n * or see http://www.jqplot.com/info.php.  This is, of course, not required.\n *\n * If you are feeling kind and generous, consider supporting the project by\n * making a donation at: http://www.jqplot.com/donate.php.\n *\n * sprintf functions contained in jqplot.sprintf.js by Ash Searle:\n * \n *     version 2007.04.27\n *     author Ash Searle\n *     http://hexmen.com/blog/2007/03/printf-sprintf/\n *     http://hexmen.com/js/sprintf.js\n *     The author (Ash Searle) has placed this code in the public domain:\n *     \"This code is unrestricted: you are free to use it however you like.\"\n * \n * \n * About: Introduction\n * \n * jqPlot requires jQuery (1.4+ required for certain features). jQuery 1.4.2 is included in the distribution.  \n * To use jqPlot include jQuery, the jqPlot jQuery plugin, the jqPlot css file and optionally \n * the excanvas script for IE support in your web page:\n * \n * > <!--[if lt IE 9]><script language=\"javascript\" type=\"text/javascript\" src=\"excanvas.js\"></script><![endif]-->\n * > <script language=\"javascript\" type=\"text/javascript\" src=\"jquery-1.4.4.min.js\"></script>\n * > <script language=\"javascript\" type=\"text/javascript\" src=\"jquery.jqplot.min.js\"></script>\n * > <link rel=\"stylesheet\" type=\"text/css\" href=\"jquery.jqplot.css\" />\n * \n * jqPlot can be customized by overriding the defaults of any of the objects which make\n * up the plot. The general usage of jqplot is:\n * \n * > chart = $.jqplot('targetElemId', [dataArray,...], {optionsObject});\n * \n * The options available to jqplot are detailed in <jqPlot Options> in the jqPlotOptions.txt file.\n * \n * An actual call to $.jqplot() may look like the \n * examples below:\n * \n * > chart = $.jqplot('chartdiv',  [[[1, 2],[3,5.12],[5,13.1],[7,33.6],[9,85.9],[11,219.9]]]);\n * \n * or\n * \n * > dataArray = [34,12,43,55,77];\n * > chart = $.jqplot('targetElemId', [dataArray, ...], {title:'My Plot', axes:{yaxis:{min:20, max:100}}});\n * \n * For more inforrmation, see <jqPlot Usage>.\n * \n * About: Usage\n * \n * See <jqPlot Usage>\n * \n * About: Available Options \n * \n * See <jqPlot Options> for a list of options available thorugh the options object (not complete yet!)\n * \n * About: Options Usage\n * \n * See <Options Tutorial>\n * \n * About: Changes\n * \n * See <Change Log>\n * \n */\n\n(function($) {\n    // make sure undefined is undefined\n    var undefined;\n    \n    $.fn.emptyForce = function() {\n      for ( var i = 0, elem; (elem = $(this)[i]) != null; i++ ) {\n        // Remove element nodes and prevent memory leaks\n        if ( elem.nodeType === 1 ) {\n          $.cleanData( elem.getElementsByTagName(\"*\") );\n        }\n  \n        // Remove any remaining nodes\n        if ($.jqplot.use_excanvas) {\n          elem.outerHTML = \"\";\n        }\n        else {\n          while ( elem.firstChild ) {\n            elem.removeChild( elem.firstChild );\n          }\n        }\n\n        elem = null;\n      }\n  \n      return $(this);\n    };\n  \n    $.fn.removeChildForce = function(parent) {\n      while ( parent.firstChild ) {\n        this.removeChildForce( parent.firstChild );\n        parent.removeChild( parent.firstChild );\n      }\n    };\n\n    $.fn.jqplot = function() {\n        var datas = [];\n        var options = [];\n        // see how many data arrays we have\n        for (var i=0, l=arguments.length; i<l; i++) {\n            if ($.isArray(arguments[i])) {\n                datas.push(arguments[i]);\n            }\n            else if ($.isPlainObject(arguments[i])) {\n                options.push(arguments[i]);\n            }\n        }\n\n        return this.each(function(index) {\n            var tid, \n                plot, \n                $this = $(this),\n                dl = datas.length,\n                ol = options.length,\n                data, \n                opts;\n\n            if (index < dl) {\n                data = datas[index];\n            }\n            else {\n                data = dl ? datas[dl-1] : null;\n            }\n\n            if (index < ol) {\n                opts = options[index];\n            }\n            else {\n                opts = ol ? options[ol-1] : null;\n            }\n\n            // does el have an id?\n            // if not assign it one.\n            tid = $this.attr('id');\n            if (tid === undefined) {\n                tid = 'jqplot_target_' + $.jqplot.targetCounter++;\n                $this.attr('id', tid);\n            }\n\n            plot = $.jqplot(tid, data, opts);\n\n            $this.data('jqplot', plot);\n        });\n    };\n\n\n    /**\n     * Namespace: $.jqplot\n     * jQuery function called by the user to create a plot.\n     *  \n     * Parameters:\n     * target - ID of target element to render the plot into.\n     * data - an array of data series.\n     * options - user defined options object.  See the individual classes for available options.\n     * \n     * Properties:\n     * config - object to hold configuration information for jqPlot plot object.\n     * \n     * attributes:\n     * enablePlugins - False to disable plugins by default.  Plugins must then be explicitly \n     *   enabled in the individual plot options.  Default: false.\n     *   This property sets the \"show\" property of certain plugins to true or false.\n     *   Only plugins that can be immediately active upon loading are affected.  This includes\n     *   non-renderer plugins like cursor, dragable, highlighter, and trendline.\n     * defaultHeight - Default height for plots where no css height specification exists.  This\n     *   is a jqplot wide default.\n     * defaultWidth - Default height for plots where no css height specification exists.  This\n     *   is a jqplot wide default.\n     */\n\n    $.jqplot = function(target, data, options) {\n        var _data = null, _options = null;\n\n        if (arguments.length === 3) {\n            _data = data;\n            _options = options;\n        }\n\n        else if (arguments.length === 2) {\n            if ($.isArray(data)) {\n                _data = data;\n            }\n\n            else if ($.isPlainObject(data)) {\n                _options = data;\n            }\n        }\n\n        if (_data === null && _options !== null && _options.data) {\n            _data = _options.data;\n        }\n\n        var plot = new jqPlot();\n        // remove any error class that may be stuck on target.\n        $('#'+target).removeClass('jqplot-error');\n        \n        if ($.jqplot.config.catchErrors) {\n            try {\n                plot.init(target, _data, _options);\n                plot.draw();\n                plot.themeEngine.init.call(plot);\n                return plot;\n            }\n            catch(e) {\n                var msg = $.jqplot.config.errorMessage || e.message;\n                $('#'+target).append('<div class=\"jqplot-error-message\">'+msg+'</div>');\n                $('#'+target).addClass('jqplot-error');\n                document.getElementById(target).style.background = $.jqplot.config.errorBackground;\n                document.getElementById(target).style.border = $.jqplot.config.errorBorder;\n                document.getElementById(target).style.fontFamily = $.jqplot.config.errorFontFamily;\n                document.getElementById(target).style.fontSize = $.jqplot.config.errorFontSize;\n                document.getElementById(target).style.fontStyle = $.jqplot.config.errorFontStyle;\n                document.getElementById(target).style.fontWeight = $.jqplot.config.errorFontWeight;\n            }\n        }\n        else {        \n            plot.init(target, _data, _options);\n            plot.draw();\n            plot.themeEngine.init.call(plot);\n            return plot;\n        }\n    };\n\n    $.jqplot.version = \"1.0.9\";\n    $.jqplot.revision = \"d96a669\";\n\n    $.jqplot.targetCounter = 1;\n\n    // canvas manager to reuse canvases on the plot.\n    // Should help solve problem of canvases not being freed and\n    // problem of waiting forever for firefox to decide to free memory.\n    $.jqplot.CanvasManager = function() {\n        // canvases are managed globally so that they can be reused\n        // across plots after they have been freed\n        if (typeof $.jqplot.CanvasManager.canvases == 'undefined') {\n            $.jqplot.CanvasManager.canvases = [];\n            $.jqplot.CanvasManager.free = [];\n        }\n        \n        var myCanvases = [];\n        \n        this.getCanvas = function() {\n            var canvas;\n            var makeNew = true;\n            \n            if (!$.jqplot.use_excanvas) {\n                for (var i = 0, l = $.jqplot.CanvasManager.canvases.length; i < l; i++) {\n                    if ($.jqplot.CanvasManager.free[i] === true) {\n                        makeNew = false;\n                        canvas = $.jqplot.CanvasManager.canvases[i];\n                        // $(canvas).removeClass('jqplot-canvasManager-free').addClass('jqplot-canvasManager-inuse');\n                        $.jqplot.CanvasManager.free[i] = false;\n                        myCanvases.push(i);\n                        break;\n                    }\n                }\n            }\n\n            if (makeNew) {\n                canvas = document.createElement('canvas');\n                myCanvases.push($.jqplot.CanvasManager.canvases.length);\n                $.jqplot.CanvasManager.canvases.push(canvas);\n                $.jqplot.CanvasManager.free.push(false);\n            }   \n            \n            return canvas;\n        };\n        \n        // this method has to be used after settings the dimesions\n        // on the element returned by getCanvas()\n        this.initCanvas = function(canvas) {\n            if ($.jqplot.use_excanvas) {\n                return window.G_vmlCanvasManager.initElement(canvas);\n            }\n\n            var cctx = canvas.getContext('2d');\n\n            var canvasBackingScale = 1;\n            if (window.devicePixelRatio > 1 && (cctx.webkitBackingStorePixelRatio === undefined || \n                                                cctx.webkitBackingStorePixelRatio < 2)) {\n                canvasBackingScale = window.devicePixelRatio;\n            }\n            var oldWidth = canvas.width;\n            var oldHeight = canvas.height;\n\n            canvas.width = canvasBackingScale * canvas.width;\n            canvas.height = canvasBackingScale * canvas.height;\n            canvas.style.width = oldWidth + 'px';\n            canvas.style.height = oldHeight + 'px';\n            cctx.save();\n\n            cctx.scale(canvasBackingScale, canvasBackingScale);\n\n            return canvas;\n        };\n\n        this.freeAllCanvases = function() {\n            for (var i = 0, l=myCanvases.length; i < l; i++) {\n                this.freeCanvas(myCanvases[i]);\n            }\n            myCanvases = [];\n        };\n\n        this.freeCanvas = function(idx) {\n            if ($.jqplot.use_excanvas && window.G_vmlCanvasManager.uninitElement !== undefined) {\n                // excanvas can't be reused, but properly unset\n                window.G_vmlCanvasManager.uninitElement($.jqplot.CanvasManager.canvases[idx]);\n                $.jqplot.CanvasManager.canvases[idx] = null;\n            } \n            else {\n                var canvas = $.jqplot.CanvasManager.canvases[idx];\n                canvas.getContext('2d').clearRect(0, 0, canvas.width, canvas.height);\n                $(canvas).unbind().removeAttr('class').removeAttr('style');\n                // Style attributes seemed to be still hanging around.  wierd.  Some ticks\n                // still retained a left: 0px attribute after reusing a canvas.\n                $(canvas).css({left: '', top: '', position: ''});\n                // setting size to 0 may save memory of unused canvases?\n                canvas.width = 0;\n                canvas.height = 0;\n                $.jqplot.CanvasManager.free[idx] = true;\n            }\n        };\n        \n    };\n\n            \n    // Convienence function that won't hang IE or FF without FireBug.\n    $.jqplot.log = function() {\n        if (window.console) {\n            window.console.log.apply(window.console, arguments);\n        }\n    };\n        \n    $.jqplot.config = {\n        addDomReference: false,\n        enablePlugins:false,\n        defaultHeight:300,\n        defaultWidth:400,\n        UTCAdjust:false,\n        timezoneOffset: new Date(new Date().getTimezoneOffset() * 60000),\n        errorMessage: '',\n        errorBackground: '',\n        errorBorder: '',\n        errorFontFamily: '',\n        errorFontSize: '',\n        errorFontStyle: '',\n        errorFontWeight: '',\n        catchErrors: false,\n        defaultTickFormatString: \"%.1f\",\n        defaultColors: [ \"#4bb2c5\", \"#EAA228\", \"#c5b47f\", \"#579575\", \"#839557\", \"#958c12\", \"#953579\", \"#4b5de4\", \"#d8b83f\", \"#ff5800\", \"#0085cc\", \"#c747a3\", \"#cddf54\", \"#FBD178\", \"#26B4E3\", \"#bd70c7\"],\n        defaultNegativeColors: [ \"#498991\", \"#C08840\", \"#9F9274\", \"#546D61\", \"#646C4A\", \"#6F6621\", \"#6E3F5F\", \"#4F64B0\", \"#A89050\", \"#C45923\", \"#187399\", \"#945381\", \"#959E5C\", \"#C7AF7B\", \"#478396\", \"#907294\"],\n        dashLength: 4,\n        gapLength: 4,\n        dotGapLength: 2.5,\n        srcLocation: 'jqplot/src/',\n        pluginLocation: 'jqplot/src/plugins/'\n    };\n    \n    \n    $.jqplot.arrayMax = function( array ){\n        return Math.max.apply( Math, array );\n    };\n    \n    $.jqplot.arrayMin = function( array ){\n        return Math.min.apply( Math, array );\n    };\n    \n    $.jqplot.enablePlugins = $.jqplot.config.enablePlugins;\n    \n    // canvas related tests taken from modernizer:\n    // Copyright (c) 2009 - 2010 Faruk Ates.\n    // http://www.modernizr.com\n    \n    $.jqplot.support_canvas = function() {\n        if (typeof $.jqplot.support_canvas.result == 'undefined') {\n            $.jqplot.support_canvas.result = !!document.createElement('canvas').getContext; \n        }\n        return $.jqplot.support_canvas.result;\n    };\n            \n    $.jqplot.support_canvas_text = function() {\n        if (typeof $.jqplot.support_canvas_text.result == 'undefined') {\n            if (window.G_vmlCanvasManager !== undefined && window.G_vmlCanvasManager._version > 887) {\n                $.jqplot.support_canvas_text.result = true;\n            }\n            else {\n                $.jqplot.support_canvas_text.result = !!(document.createElement('canvas').getContext && typeof document.createElement('canvas').getContext('2d').fillText == 'function');\n            }\n             \n        }\n        return $.jqplot.support_canvas_text.result;\n    };\n    \n    $.jqplot.use_excanvas = ((!$.support.boxModel || !$.support.objectAll || !$support.leadingWhitespace) && !$.jqplot.support_canvas()) ? true : false;\n    \n    /**\n     * \n     * Hooks: jqPlot Pugin Hooks\n     * \n     * $.jqplot.preInitHooks - called before initialization.\n     * $.jqplot.postInitHooks - called after initialization.\n     * $.jqplot.preParseOptionsHooks - called before user options are parsed.\n     * $.jqplot.postParseOptionsHooks - called after user options are parsed.\n     * $.jqplot.preDrawHooks - called before plot draw.\n     * $.jqplot.postDrawHooks - called after plot draw.\n     * $.jqplot.preDrawSeriesHooks - called before each series is drawn.\n     * $.jqplot.postDrawSeriesHooks - called after each series is drawn.\n     * $.jqplot.preDrawLegendHooks - called before the legend is drawn.\n     * $.jqplot.addLegendRowHooks - called at the end of legend draw, so plugins\n     *     can add rows to the legend table.\n     * $.jqplot.preSeriesInitHooks - called before series is initialized.\n     * $.jqplot.postSeriesInitHooks - called after series is initialized.\n     * $.jqplot.preParseSeriesOptionsHooks - called before series related options\n     *     are parsed.\n     * $.jqplot.postParseSeriesOptionsHooks - called after series related options\n     *     are parsed.\n     * $.jqplot.eventListenerHooks - called at the end of plot drawing, binds\n     *     listeners to the event canvas which lays on top of the grid area.\n     * $.jqplot.preDrawSeriesShadowHooks - called before series shadows are drawn.\n     * $.jqplot.postDrawSeriesShadowHooks - called after series shadows are drawn.\n     * \n     */\n    \n    $.jqplot.preInitHooks = [];\n    $.jqplot.postInitHooks = [];\n    $.jqplot.preParseOptionsHooks = [];\n    $.jqplot.postParseOptionsHooks = [];\n    $.jqplot.preDrawHooks = [];\n    $.jqplot.postDrawHooks = [];\n    $.jqplot.preDrawSeriesHooks = [];\n    $.jqplot.postDrawSeriesHooks = [];\n    $.jqplot.preDrawLegendHooks = [];\n    $.jqplot.addLegendRowHooks = [];\n    $.jqplot.preSeriesInitHooks = [];\n    $.jqplot.postSeriesInitHooks = [];\n    $.jqplot.preParseSeriesOptionsHooks = [];\n    $.jqplot.postParseSeriesOptionsHooks = [];\n    $.jqplot.eventListenerHooks = [];\n    $.jqplot.preDrawSeriesShadowHooks = [];\n    $.jqplot.postDrawSeriesShadowHooks = [];\n\n    // A superclass holding some common properties and methods.\n    $.jqplot.ElemContainer = function() {\n        this._elem;\n        this._plotWidth;\n        this._plotHeight;\n        this._plotDimensions = {height:null, width:null};\n    };\n    \n    $.jqplot.ElemContainer.prototype.createElement = function(el, offsets, clss, cssopts, attrib) {\n        this._offsets = offsets;\n        var klass = clss || 'jqplot';\n        var elem = document.createElement(el);\n        this._elem = $(elem);\n        this._elem.addClass(klass);\n        this._elem.css(cssopts);\n        this._elem.attr(attrib);\n        // avoid memory leak;\n        elem = null;\n        return this._elem;\n    };\n    \n    $.jqplot.ElemContainer.prototype.getWidth = function() {\n        if (this._elem) {\n            return this._elem.outerWidth(true);\n        }\n        else {\n            return null;\n        }\n    };\n    \n    $.jqplot.ElemContainer.prototype.getHeight = function() {\n        if (this._elem) {\n            return this._elem.outerHeight(true);\n        }\n        else {\n            return null;\n        }\n    };\n    \n    $.jqplot.ElemContainer.prototype.getPosition = function() {\n        if (this._elem) {\n            return this._elem.position();\n        }\n        else {\n            return {top:null, left:null, bottom:null, right:null};\n        }\n    };\n    \n    $.jqplot.ElemContainer.prototype.getTop = function() {\n        return this.getPosition().top;\n    };\n    \n    $.jqplot.ElemContainer.prototype.getLeft = function() {\n        return this.getPosition().left;\n    };\n    \n    $.jqplot.ElemContainer.prototype.getBottom = function() {\n        return this._elem.css('bottom');\n    };\n    \n    $.jqplot.ElemContainer.prototype.getRight = function() {\n        return this._elem.css('right');\n    };\n    \n\n    /**\n     * Class: Axis\n     * An individual axis object.  Cannot be instantiated directly, but created\n     * by the Plot object.  Axis properties can be set or overridden by the \n     * options passed in from the user.\n     * \n     */\n    function Axis(name) {\n        $.jqplot.ElemContainer.call(this);\n        // Group: Properties\n        //\n        // Axes options are specified within an axes object at the top level of the \n        // plot options like so:\n        // > {\n        // >    axes: {\n        // >        xaxis: {min: 5},\n        // >        yaxis: {min: 2, max: 8, numberTicks:4},\n        // >        x2axis: {pad: 1.5},\n        // >        y2axis: {ticks:[22, 44, 66, 88]}\n        // >        }\n        // > }\n        // There are 2 x axes, 'xaxis' and 'x2axis', and \n        // 9 yaxes, 'yaxis', 'y2axis'. 'y3axis', ...  Any or all of which may be specified.\n        this.name = name;\n        this._series = [];\n        // prop: show\n        // Wether to display the axis on the graph.\n        this.show = false;\n        // prop: tickRenderer\n        // A class of a rendering engine for creating the ticks labels displayed on the plot, \n        // See <$.jqplot.AxisTickRenderer>.\n        this.tickRenderer = $.jqplot.AxisTickRenderer;\n        // prop: tickOptions\n        // Options that will be passed to the tickRenderer, see <$.jqplot.AxisTickRenderer> options.\n        this.tickOptions = {};\n        // prop: labelRenderer\n        // A class of a rendering engine for creating an axis label.\n        this.labelRenderer = $.jqplot.AxisLabelRenderer;\n        // prop: labelOptions\n        // Options passed to the label renderer.\n        this.labelOptions = {};\n        // prop: label\n        // Label for the axis\n        this.label = null;\n        // prop: showLabel\n        // true to show the axis label.\n        this.showLabel = true;\n        // prop: min\n        // minimum value of the axis (in data units, not pixels).\n        this.min = null;\n        // prop: max\n        // maximum value of the axis (in data units, not pixels).\n        this.max = null;\n        // prop: autoscale\n        // DEPRECATED\n        // the default scaling algorithm produces superior results.\n        this.autoscale = false;\n        // prop: pad\n        // Padding to extend the range above and below the data bounds.\n        // The data range is multiplied by this factor to determine minimum and maximum axis bounds.\n        // A value of 0 will be interpreted to mean no padding, and pad will be set to 1.0.\n        this.pad = 1.2;\n        // prop: padMax\n        // Padding to extend the range above data bounds.\n        // The top of the data range is multiplied by this factor to determine maximum axis bounds.\n        // A value of 0 will be interpreted to mean no padding, and padMax will be set to 1.0.\n        this.padMax = null;\n        // prop: padMin\n        // Padding to extend the range below data bounds.\n        // The bottom of the data range is multiplied by this factor to determine minimum axis bounds.\n        // A value of 0 will be interpreted to mean no padding, and padMin will be set to 1.0.\n        this.padMin = null;\n        // prop: ticks\n        // 1D [val, val, ...] or 2D [[val, label], [val, label], ...] array of ticks for the axis.\n        // If no label is specified, the value is formatted into an appropriate label.\n        this.ticks = [];\n        // prop: numberTicks\n        // Desired number of ticks.  Default is to compute automatically.\n        this.numberTicks;\n        // prop: tickInterval\n        // number of units between ticks.  Mutually exclusive with numberTicks.\n        this.tickInterval;\n        // prop: renderer\n        // A class of a rendering engine that handles tick generation, \n        // scaling input data to pixel grid units and drawing the axis element.\n        this.renderer = $.jqplot.LinearAxisRenderer;\n        // prop: rendererOptions\n        // renderer specific options.  See <$.jqplot.LinearAxisRenderer> for options.\n        this.rendererOptions = {};\n        // prop: showTicks\n        // Wether to show the ticks (both marks and labels) or not.\n        // Will not override showMark and showLabel options if specified on the ticks themselves.\n        this.showTicks = true;\n        // prop: showTickMarks\n        // Wether to show the tick marks (line crossing grid) or not.\n        // Overridden by showTicks and showMark option of tick itself.\n        this.showTickMarks = true;\n        // prop: showMinorTicks\n        // Wether or not to show minor ticks.  This is renderer dependent.\n        this.showMinorTicks = true;\n        // prop: drawMajorGridlines\n        // True to draw gridlines for major axis ticks.\n        this.drawMajorGridlines = true;\n        // prop: drawMinorGridlines\n        // True to draw gridlines for minor ticks.\n        this.drawMinorGridlines = false;\n        // prop: drawMajorTickMarks\n        // True to draw tick marks for major axis ticks.\n        this.drawMajorTickMarks = true;\n        // prop: drawMinorTickMarks\n        // True to draw tick marks for minor ticks.  This is renderer dependent.\n        this.drawMinorTickMarks = true;\n        // prop: useSeriesColor\n        // Use the color of the first series associated with this axis for the\n        // tick marks and line bordering this axis.\n        this.useSeriesColor = false;\n        // prop: borderWidth\n        // width of line stroked at the border of the axis.  Defaults\n        // to the width of the grid boarder.\n        this.borderWidth = null;\n        // prop: borderColor\n        // color of the border adjacent to the axis.  Defaults to grid border color.\n        this.borderColor = null;\n        // prop: scaleToHiddenSeries\n        // True to include hidden series when computing axes bounds and scaling.\n        this.scaleToHiddenSeries = false;\n        // minimum and maximum values on the axis.\n        this._dataBounds = {min:null, max:null};\n        // statistics (min, max, mean) as well as actual data intervals for each series attached to axis.\n        // holds collection of {intervals:[], min:, max:, mean: } objects for each series on axis.\n        this._intervalStats = [];\n        // pixel position from the top left of the min value and max value on the axis.\n        this._offsets = {min:null, max:null};\n        this._ticks=[];\n        this._label = null;\n        // prop: syncTicks\n        // true to try and synchronize tick spacing across multiple axes so that ticks and\n        // grid lines line up.  This has an impact on autoscaling algorithm, however.\n        // In general, autoscaling an individual axis will work better if it does not\n        // have to sync ticks.\n        this.syncTicks = null;\n        // prop: tickSpacing\n        // Approximate pixel spacing between ticks on graph.  Used during autoscaling.\n        // This number will be an upper bound, actual spacing will be less.\n        this.tickSpacing = 75;\n        // Properties to hold the original values for min, max, ticks, tickInterval and numberTicks\n        // so they can be restored if altered by plugins.\n        this._min = null;\n        this._max = null;\n        this._tickInterval = null;\n        this._numberTicks = null;\n        this.__ticks = null;\n        // hold original user options.\n        this._options = {};\n    }\n    \n    Axis.prototype = new $.jqplot.ElemContainer();\n    Axis.prototype.constructor = Axis;\n    \n    Axis.prototype.init = function() {\n        if ($.isFunction(this.renderer)) {\n            this.renderer = new this.renderer();  \n        }\n        // set the axis name\n        this.tickOptions.axis = this.name;\n        // if showMark or showLabel tick options not specified, use value of axis option.\n        // showTicks overrides showTickMarks.\n        if (this.tickOptions.showMark == null) {\n            this.tickOptions.showMark = this.showTicks;\n        }\n        if (this.tickOptions.showMark == null) {\n            this.tickOptions.showMark = this.showTickMarks;\n        }\n        if (this.tickOptions.showLabel == null) {\n            this.tickOptions.showLabel = this.showTicks;\n        }\n        \n        if (this.label == null || this.label == '') {\n            this.showLabel = false;\n        }\n        else {\n            this.labelOptions.label = this.label;\n        }\n        if (this.showLabel == false) {\n            this.labelOptions.show = false;\n        }\n        // set the default padMax, padMin if not specified\n        // special check, if no padding desired, padding\n        // should be set to 1.0\n        if (this.pad == 0) {\n            this.pad = 1.0;\n        }\n        if (this.padMax == 0) {\n            this.padMax = 1.0;\n        }\n        if (this.padMin == 0) {\n            this.padMin = 1.0;\n        }\n        if (this.padMax == null) {\n            this.padMax = (this.pad-1)/2 + 1;\n        }\n        if (this.padMin == null) {\n            this.padMin = (this.pad-1)/2 + 1;\n        }\n        // now that padMin and padMax are correctly set, reset pad in case user has supplied \n        // padMin and/or padMax\n        this.pad = this.padMax + this.padMin - 1;\n        if (this.min != null || this.max != null) {\n            this.autoscale = false;\n        }\n        // if not set, sync ticks for y axes but not x by default.\n        if (this.syncTicks == null && this.name.indexOf('y') > -1) {\n            this.syncTicks = true;\n        }\n        else if (this.syncTicks == null){\n            this.syncTicks = false;\n        }\n        this.renderer.init.call(this, this.rendererOptions);\n        \n    };\n    \n    Axis.prototype.draw = function(ctx, plot) {\n        // Memory Leaks patch\n        if (this.__ticks) {\n          this.__ticks = null;\n        }\n\n        return this.renderer.draw.call(this, ctx, plot);\n        \n    };\n    \n    Axis.prototype.set = function() {\n        this.renderer.set.call(this);\n    };\n    \n    Axis.prototype.pack = function(pos, offsets) {\n        if (this.show) {\n            this.renderer.pack.call(this, pos, offsets);\n        }\n        // these properties should all be available now.\n        if (this._min == null) {\n            this._min = this.min;\n            this._max = this.max;\n            this._tickInterval = this.tickInterval;\n            this._numberTicks = this.numberTicks;\n            this.__ticks = this._ticks;\n        }\n    };\n    \n    // reset the axis back to original values if it has been scaled, zoomed, etc.\n    Axis.prototype.reset = function() {\n        this.renderer.reset.call(this);\n    };\n    \n    Axis.prototype.resetScale = function(opts) {\n        $.extend(true, this, {min: null, max: null, numberTicks: null, tickInterval: null, _ticks: [], ticks: []}, opts);\n        this.resetDataBounds();\n    };\n    \n    Axis.prototype.resetDataBounds = function() {\n        // Go through all the series attached to this axis and find\n        // the min/max bounds for this axis.\n        var db = this._dataBounds;\n        db.min = null;\n        db.max = null;\n        var l, s, d;\n        // check for when to force min 0 on bar series plots.\n        var doforce = (this.show) ? true : false;\n        for (var i=0; i<this._series.length; i++) {\n            s = this._series[i];\n            if (s.show || this.scaleToHiddenSeries) {\n                d = s._plotData;\n                if (s._type === 'line' && s.renderer.bands.show && this.name.charAt(0) !== 'x') {\n                    d = [[0, s.renderer.bands._min], [1, s.renderer.bands._max]];\n                }\n\n                var minyidx = 1, maxyidx = 1;\n\n                if (s._type != null && s._type == 'ohlc') {\n                    minyidx = 3;\n                    maxyidx = 2;\n                }\n                \n                for (var j=0, l=d.length; j<l; j++) { \n                    if (this.name == 'xaxis' || this.name == 'x2axis') {\n                        if ((d[j][0] != null && d[j][0] < db.min) || db.min == null) {\n                            db.min = d[j][0];\n                        }\n                        if ((d[j][0] != null && d[j][0] > db.max) || db.max == null) {\n                            db.max = d[j][0];\n                        }\n                    }              \n                    else {\n                        if ((d[j][minyidx] != null && d[j][minyidx] < db.min) || db.min == null) {\n                            db.min = d[j][minyidx];\n                        }\n                        if ((d[j][maxyidx] != null && d[j][maxyidx] > db.max) || db.max == null) {\n                            db.max = d[j][maxyidx];\n                        }\n                    }              \n                }\n\n                // Hack to not pad out bottom of bar plots unless user has specified a padding.\n                // every series will have a chance to set doforce to false.  once it is set to \n                // false, it cannot be reset to true.\n                // If any series attached to axis is not a bar, wont force 0.\n                if (doforce && s.renderer.constructor !== $.jqplot.BarRenderer) {\n                    doforce = false;\n                }\n\n                else if (doforce && this._options.hasOwnProperty('forceTickAt0') && this._options.forceTickAt0 == false) {\n                    doforce = false;\n                }\n\n                else if (doforce && s.renderer.constructor === $.jqplot.BarRenderer) {\n                    if (s.barDirection == 'vertical' && this.name != 'xaxis' && this.name != 'x2axis') { \n                        if (this._options.pad != null || this._options.padMin != null) {\n                            doforce = false;\n                        }\n                    }\n\n                    else if (s.barDirection == 'horizontal' && (this.name == 'xaxis' || this.name == 'x2axis')) {\n                        if (this._options.pad != null || this._options.padMin != null) {\n                            doforce = false;\n                        }\n                    }\n\n                }\n            }\n        }\n\n        if (doforce && this.renderer.constructor === $.jqplot.LinearAxisRenderer && db.min >= 0) {\n            this.padMin = 1.0;\n            this.forceTickAt0 = true;\n        }\n    };\n\n    /**\n     * Class: Legend\n     * Legend object.  Cannot be instantiated directly, but created\n     * by the Plot object.  Legend properties can be set or overridden by the \n     * options passed in from the user.\n     */\n    function Legend(options) {\n        $.jqplot.ElemContainer.call(this);\n        // Group: Properties\n        \n        // prop: show\n        // Wether to display the legend on the graph.\n        this.show = false;\n        // prop: location\n        // Placement of the legend.  one of the compass directions: nw, n, ne, e, se, s, sw, w\n        this.location = 'ne';\n        // prop: labels\n        // Array of labels to use.  By default the renderer will look for labels on the series.\n        // Labels specified in this array will override labels specified on the series.\n        this.labels = [];\n        // prop: showLabels\n        // true to show the label text on the  legend.\n        this.showLabels = true;\n        // prop: showSwatch\n        // true to show the color swatches on the legend.\n        this.showSwatches = true;\n        // prop: placement\n        // \"insideGrid\" places legend inside the grid area of the plot.\n        // \"outsideGrid\" places the legend outside the grid but inside the plot container, \n        // shrinking the grid to accomodate the legend.\n        // \"inside\" synonym for \"insideGrid\", \n        // \"outside\" places the legend ouside the grid area, but does not shrink the grid which\n        // can cause the legend to overflow the plot container.\n        this.placement = \"insideGrid\";\n        // prop: xoffset\n        // DEPRECATED.  Set the margins on the legend using the marginTop, marginLeft, etc. \n        // properties or via CSS margin styling of the .jqplot-table-legend class.\n        this.xoffset = 0;\n        // prop: yoffset\n        // DEPRECATED.  Set the margins on the legend using the marginTop, marginLeft, etc. \n        // properties or via CSS margin styling of the .jqplot-table-legend class.\n        this.yoffset = 0;\n        // prop: border\n        // css spec for the border around the legend box.\n        this.border;\n        // prop: background\n        // css spec for the background of the legend box.\n        this.background;\n        // prop: textColor\n        // css color spec for the legend text.\n        this.textColor;\n        // prop: fontFamily\n        // css font-family spec for the legend text.\n        this.fontFamily; \n        // prop: fontSize\n        // css font-size spec for the legend text.\n        this.fontSize ;\n        // prop: rowSpacing\n        // css padding-top spec for the rows in the legend.\n        this.rowSpacing = '0.5em';\n        // renderer\n        // A class that will create a DOM object for the legend,\n        // see <$.jqplot.TableLegendRenderer>.\n        this.renderer = $.jqplot.TableLegendRenderer;\n        // prop: rendererOptions\n        // renderer specific options passed to the renderer.\n        this.rendererOptions = {};\n        // prop: predraw\n        // Wether to draw the legend before the series or not.\n        // Used with series specific legend renderers for pie, donut, mekko charts, etc.\n        this.preDraw = false;\n        // prop: marginTop\n        // CSS margin for the legend DOM element. This will set an element \n        // CSS style for the margin which will override any style sheet setting.\n        // The default will be taken from the stylesheet.\n        this.marginTop = null;\n        // prop: marginRight\n        // CSS margin for the legend DOM element. This will set an element \n        // CSS style for the margin which will override any style sheet setting.\n        // The default will be taken from the stylesheet.\n        this.marginRight = null;\n        // prop: marginBottom\n        // CSS margin for the legend DOM element. This will set an element \n        // CSS style for the margin which will override any style sheet setting.\n        // The default will be taken from the stylesheet.\n        this.marginBottom = null;\n        // prop: marginLeft\n        // CSS margin for the legend DOM element. This will set an element \n        // CSS style for the margin which will override any style sheet setting.\n        // The default will be taken from the stylesheet.\n        this.marginLeft = null;\n        // prop: escapeHtml\n        // True to escape special characters with their html entity equivalents\n        // in legend text.  \"<\" becomes &lt; and so on, so html tags are not rendered.\n        this.escapeHtml = false;\n        this._series = [];\n        \n        $.extend(true, this, options);\n    }\n    \n    Legend.prototype = new $.jqplot.ElemContainer();\n    Legend.prototype.constructor = Legend;\n    \n    Legend.prototype.setOptions = function(options) {\n        $.extend(true, this, options);\n        \n        // Try to emulate deprecated behaviour\n        // if user has specified xoffset or yoffset, copy these to\n        // the margin properties.\n        \n        if (this.placement ==  'inside') {\n            this.placement = 'insideGrid';\n        }\n        \n        if (this.xoffset >0) {\n            if (this.placement == 'insideGrid') {\n                switch (this.location) {\n                    case 'nw':\n                    case 'w':\n                    case 'sw':\n                        if (this.marginLeft == null) {\n                            this.marginLeft = this.xoffset + 'px';\n                        }\n                        this.marginRight = '0px';\n                        break;\n                    case 'ne':\n                    case 'e':\n                    case 'se':\n                    default:\n                        if (this.marginRight == null) {\n                            this.marginRight = this.xoffset + 'px';\n                        }\n                        this.marginLeft = '0px';\n                        break;\n                }\n            }\n            else if (this.placement == 'outside') {\n                switch (this.location) {\n                    case 'nw':\n                    case 'w':\n                    case 'sw':\n                        if (this.marginRight == null) {\n                            this.marginRight = this.xoffset + 'px';\n                        }\n                        this.marginLeft = '0px';\n                        break;\n                    case 'ne':\n                    case 'e':\n                    case 'se':\n                    default:\n                        if (this.marginLeft == null) {\n                            this.marginLeft = this.xoffset + 'px';\n                        }\n                        this.marginRight = '0px';\n                        break;\n                }\n            }\n            this.xoffset = 0;\n        }\n        \n        if (this.yoffset >0) {\n            if (this.placement == 'outside') {\n                switch (this.location) {\n                    case 'sw':\n                    case 's':\n                    case 'se':\n                        if (this.marginTop == null) {\n                            this.marginTop = this.yoffset + 'px';\n                        }\n                        this.marginBottom = '0px';\n                        break;\n                    case 'ne':\n                    case 'n':\n                    case 'nw':\n                    default:\n                        if (this.marginBottom == null) {\n                            this.marginBottom = this.yoffset + 'px';\n                        }\n                        this.marginTop = '0px';\n                        break;\n                }\n            }\n            else if (this.placement == 'insideGrid') {\n                switch (this.location) {\n                    case 'sw':\n                    case 's':\n                    case 'se':\n                        if (this.marginBottom == null) {\n                            this.marginBottom = this.yoffset + 'px';\n                        }\n                        this.marginTop = '0px';\n                        break;\n                    case 'ne':\n                    case 'n':\n                    case 'nw':\n                    default:\n                        if (this.marginTop == null) {\n                            this.marginTop = this.yoffset + 'px';\n                        }\n                        this.marginBottom = '0px';\n                        break;\n                }\n            }\n            this.yoffset = 0;\n        }\n        \n        // TO-DO:\n        // Handle case where offsets are < 0.\n        //\n    };\n    \n    Legend.prototype.init = function() {\n        if ($.isFunction(this.renderer)) {\n            this.renderer = new this.renderer();  \n        }\n        this.renderer.init.call(this, this.rendererOptions);\n    };\n    \n    Legend.prototype.draw = function(offsets, plot) {\n        for (var i=0; i<$.jqplot.preDrawLegendHooks.length; i++){\n            $.jqplot.preDrawLegendHooks[i].call(this, offsets);\n        }\n        return this.renderer.draw.call(this, offsets, plot);\n    };\n    \n    Legend.prototype.pack = function(offsets) {\n        this.renderer.pack.call(this, offsets);\n    };\n\n    /**\n     * Class: Title\n     * Plot Title object.  Cannot be instantiated directly, but created\n     * by the Plot object.  Title properties can be set or overridden by the \n     * options passed in from the user.\n     * \n     * Parameters:\n     * text - text of the title.\n     */\n    function Title(text) {\n        $.jqplot.ElemContainer.call(this);\n        // Group: Properties\n        \n        // prop: text\n        // text of the title;\n        this.text = text;\n        // prop: show\n        // whether or not to show the title\n        this.show = true;\n        // prop: fontFamily\n        // css font-family spec for the text.\n        this.fontFamily;\n        // prop: fontSize\n        // css font-size spec for the text.\n        this.fontSize ;\n        // prop: textAlign\n        // css text-align spec for the text.\n        this.textAlign;\n        // prop: textColor\n        // css color spec for the text.\n        this.textColor;\n        // prop: renderer\n        // A class for creating a DOM element for the title,\n        // see <$.jqplot.DivTitleRenderer>.\n        this.renderer = $.jqplot.DivTitleRenderer;\n        // prop: rendererOptions\n        // renderer specific options passed to the renderer.\n        this.rendererOptions = {};   \n        // prop: escapeHtml\n        // True to escape special characters with their html entity equivalents\n        // in title text.  \"<\" becomes &lt; and so on, so html tags are not rendered.\n        this.escapeHtml = false;\n    }\n    \n    Title.prototype = new $.jqplot.ElemContainer();\n    Title.prototype.constructor = Title;\n    \n    Title.prototype.init = function() {\n        if ($.isFunction(this.renderer)) {\n            this.renderer = new this.renderer();  \n        }\n        this.renderer.init.call(this, this.rendererOptions);\n    };\n    \n    Title.prototype.draw = function(width) {\n        return this.renderer.draw.call(this, width);\n    };\n    \n    Title.prototype.pack = function() {\n        this.renderer.pack.call(this);\n    };\n\n\n    /**\n     * Class: Series\n     * An individual data series object.  Cannot be instantiated directly, but created\n     * by the Plot object.  Series properties can be set or overridden by the \n     * options passed in from the user.\n     */\n    function Series(options) {\n        options = options || {};\n        $.jqplot.ElemContainer.call(this);\n        // Group: Properties\n        // Properties will be assigned from a series array at the top level of the\n        // options.  If you had two series and wanted to change the color and line\n        // width of the first and set the second to use the secondary y axis with\n        // no shadow and supply custom labels for each:\n        // > {\n        // >    series:[\n        // >        {color: '#ff4466', lineWidth: 5, label:'good line'},\n        // >        {yaxis: 'y2axis', shadow: false, label:'bad line'}\n        // >    ]\n        // > }\n\n        // prop: show\n        // whether or not to draw the series.\n        this.show = true;\n        // prop: xaxis\n        // which x axis to use with this series, either 'xaxis' or 'x2axis'.\n        this.xaxis = 'xaxis';\n        this._xaxis;\n        // prop: yaxis\n        // which y axis to use with this series, either 'yaxis' or 'y2axis'.\n        this.yaxis = 'yaxis';\n        this._yaxis;\n        this.gridBorderWidth = 2.0;\n        // prop: renderer\n        // A class of a renderer which will draw the series, \n        // see <$.jqplot.LineRenderer>.\n        this.renderer = $.jqplot.LineRenderer;\n        // prop: rendererOptions\n        // Options to pass on to the renderer.\n        this.rendererOptions = {};\n        this.data = [];\n        this.gridData = [];\n        // prop: label\n        // Line label to use in the legend.\n        this.label = '';\n        // prop: showLabel\n        // true to show label for this series in the legend.\n        this.showLabel = true;\n        // prop: color\n        // css color spec for the series\n        this.color;\n        // prop: negativeColor\n        // css color spec used for filled (area) plots that are filled to zero and\n        // the \"useNegativeColors\" option is true.\n        this.negativeColor;\n        // prop: lineWidth\n        // width of the line in pixels.  May have different meanings depending on renderer.\n        this.lineWidth = 2.5;\n        // prop: lineJoin\n        // Canvas lineJoin style between segments of series.\n        this.lineJoin = 'round';\n        // prop: lineCap\n        // Canvas lineCap style at ends of line.\n        this.lineCap = 'round';\n        // prop: linePattern\n        // line pattern 'dashed', 'dotted', 'solid', some combination\n        // of '-' and '.' characters such as '.-.' or a numerical array like \n        // [draw, skip, draw, skip, ...] such as [1, 10] to draw a dotted line, \n        // [1, 10, 20, 10] to draw a dot-dash line, and so on.\n        this.linePattern = 'solid';\n        this.shadow = true;\n        // prop: shadowAngle\n        // Shadow angle in degrees\n        this.shadowAngle = 45;\n        // prop: shadowOffset\n        // Shadow offset from line in pixels\n        this.shadowOffset = 1.25;\n        // prop: shadowDepth\n        // Number of times shadow is stroked, each stroke offset shadowOffset from the last.\n        this.shadowDepth = 3;\n        // prop: shadowAlpha\n        // Alpha channel transparency of shadow.  0 = transparent.\n        this.shadowAlpha = '0.1';\n        // prop: breakOnNull\n        // Wether line segments should be be broken at null value.\n        // False will join point on either side of line.\n        this.breakOnNull = false;\n        // prop: markerRenderer\n        // A class of a renderer which will draw marker (e.g. circle, square, ...) at the data points,\n        // see <$.jqplot.MarkerRenderer>.\n        this.markerRenderer = $.jqplot.MarkerRenderer;\n        // prop: markerOptions\n        // renderer specific options to pass to the markerRenderer,\n        // see <$.jqplot.MarkerRenderer>.\n        this.markerOptions = {};\n        // prop: showLine\n        // whether to actually draw the line or not.  Series will still be renderered, even if no line is drawn.\n        this.showLine = true;\n        // prop: showMarker\n        // whether or not to show the markers at the data points.\n        this.showMarker = true;\n        // prop: index\n        // 0 based index of this series in the plot series array.\n        this.index;\n        // prop: fill\n        // true or false, whether to fill under lines or in bars.\n        // May not be implemented in all renderers.\n        this.fill = false;\n        // prop: fillColor\n        // CSS color spec to use for fill under line.  Defaults to line color.\n        this.fillColor;\n        // prop: fillAlpha\n        // Alpha transparency to apply to the fill under the line.\n        // Use this to adjust alpha separate from fill color.\n        this.fillAlpha;\n        // prop: fillAndStroke\n        // If true will stroke the line (with color this.color) as well as fill under it.\n        // Applies only when fill is true.\n        this.fillAndStroke = false;\n        // prop: disableStack\n        // true to not stack this series with other series in the plot.\n        // To render properly, non-stacked series must come after any stacked series\n        // in the plot's data series array.  So, the plot's data series array would look like:\n        // > [stackedSeries1, stackedSeries2, ..., nonStackedSeries1, nonStackedSeries2, ...]\n        // disableStack will put a gap in the stacking order of series, and subsequent\n        // stacked series will not fill down through the non-stacked series and will\n        // most likely not stack properly on top of the non-stacked series.\n        this.disableStack = false;\n        // _stack is set by the Plot if the plot is a stacked chart.\n        // will stack lines or bars on top of one another to build a \"mountain\" style chart.\n        // May not be implemented in all renderers.\n        this._stack = false;\n        // prop: neighborThreshold\n        // how close or far (in pixels) the cursor must be from a point marker to detect the point.\n        this.neighborThreshold = 4;\n        // prop: fillToZero\n        // true will force bar and filled series to fill toward zero on the fill Axis.\n        this.fillToZero = false;\n        // prop: fillToValue\n        // fill a filled series to this value on the fill axis.\n        // Works in conjunction with fillToZero, so that must be true.\n        this.fillToValue = 0;\n        // prop: fillAxis\n        // Either 'x' or 'y'.  Which axis to fill the line toward if fillToZero is true.\n        // 'y' means fill up/down to 0 on the y axis for this series.\n        this.fillAxis = 'y';\n        // prop: useNegativeColors\n        // true to color negative values differently in filled and bar charts.\n        this.useNegativeColors = true;\n        this._stackData = [];\n        // _plotData accounts for stacking.  If plots not stacked, _plotData and data are same.  If\n        // stacked, _plotData is accumulation of stacking data.\n        this._plotData = [];\n        // _plotValues hold the individual x and y values that will be plotted for this series.\n        this._plotValues = {x:[], y:[]};\n        // statistics about the intervals between data points.  Used for auto scaling.\n        this._intervals = {x:{}, y:{}};\n        // data from the previous series, for stacked charts.\n        this._prevPlotData = [];\n        this._prevGridData = [];\n        this._stackAxis = 'y';\n        this._primaryAxis = '_xaxis';\n        // give each series a canvas to draw on.  This should allow for redrawing speedups.\n        this.canvas = new $.jqplot.GenericCanvas();\n        this.shadowCanvas = new $.jqplot.GenericCanvas();\n        this.plugins = {};\n        // sum of y values in this series.\n        this._sumy = 0;\n        this._sumx = 0;\n        this._type = '';\n        this.step = false;\n    }\n    \n    Series.prototype = new $.jqplot.ElemContainer();\n    Series.prototype.constructor = Series;\n    \n    Series.prototype.init = function(index, gridbw, plot) {\n        // weed out any null values in the data.\n        this.index = index;\n        this.gridBorderWidth = gridbw;\n        var d = this.data;\n        var temp = [], i, l;\n        for (i=0, l=d.length; i<l; i++) {\n            if (! this.breakOnNull) {\n                if (d[i] == null || d[i][0] == null || d[i][1] == null) {\n                    continue;\n                }\n                else {\n                    temp.push(d[i]);\n                }\n            }\n            else {\n                // TODO: figure out what to do with null values\n                // probably involve keeping nulls in data array\n                // and then updating renderers to break line\n                // when it hits null value.\n                // For now, just keep value.\n                temp.push(d[i]);\n            }\n        }\n        this.data = temp;\n\n        // parse the renderer options and apply default colors if not provided\n        // Set color even if not shown, so series don't change colors when other\n        // series on plot shown/hidden.\n        if (!this.color) {\n            this.color = plot.colorGenerator.get(this.index);\n        }\n        if (!this.negativeColor) {\n            this.negativeColor = plot.negativeColorGenerator.get(this.index);\n        }\n\n\n        if (!this.fillColor) {\n            this.fillColor = this.color;\n        }\n        if (this.fillAlpha) {\n            var comp = $.jqplot.normalize2rgb(this.fillColor);\n            var comp = $.jqplot.getColorComponents(comp);\n            this.fillColor = 'rgba('+comp[0]+','+comp[1]+','+comp[2]+','+this.fillAlpha+')';\n        }\n        if ($.isFunction(this.renderer)) {\n            this.renderer = new this.renderer();  \n        }\n        this.renderer.init.call(this, this.rendererOptions, plot);\n        this.markerRenderer = new this.markerRenderer();\n        if (!this.markerOptions.color) {\n            this.markerOptions.color = this.color;\n        }\n        if (this.markerOptions.show == null) {\n            this.markerOptions.show = this.showMarker;\n        }\n        this.showMarker = this.markerOptions.show;\n        // the markerRenderer is called within its own scope, don't want to overwrite series options!!\n        this.markerRenderer.init(this.markerOptions);\n    };\n    \n    // data - optional data point array to draw using this series renderer\n    // gridData - optional grid data point array to draw using this series renderer\n    // stackData - array of cumulative data for stacked plots.\n    Series.prototype.draw = function(sctx, opts, plot) {\n        var options = (opts == undefined) ? {} : opts;\n        sctx = (sctx == undefined) ? this.canvas._ctx : sctx;\n        \n        var j, data, gridData;\n        \n        // hooks get called even if series not shown\n        // we don't clear canvas here, it would wipe out all other series as well.\n        for (j=0; j<$.jqplot.preDrawSeriesHooks.length; j++) {\n            $.jqplot.preDrawSeriesHooks[j].call(this, sctx, options);\n        }\n        if (this.show) {\n            this.renderer.setGridData.call(this, plot);\n            if (!options.preventJqPlotSeriesDrawTrigger) {\n                $(sctx.canvas).trigger('jqplotSeriesDraw', [this.data, this.gridData]);\n            }\n            data = [];\n            if (options.data) {\n                data = options.data;\n            }\n            else if (!this._stack) {\n                data = this.data;\n            }\n            else {\n                data = this._plotData;\n            }\n            gridData = options.gridData || this.renderer.makeGridData.call(this, data, plot);\n\n            if (this._type === 'line' && this.renderer.smooth && this.renderer._smoothedData.length) {\n                gridData = this.renderer._smoothedData;\n            }\n\n            this.renderer.draw.call(this, sctx, gridData, options, plot);\n        }\n        \n        for (j=0; j<$.jqplot.postDrawSeriesHooks.length; j++) {\n            $.jqplot.postDrawSeriesHooks[j].call(this, sctx, options, plot);\n        }\n        \n        sctx = opts = plot = j = data = gridData = null;\n    };\n    \n    Series.prototype.drawShadow = function(sctx, opts, plot) {\n        var options = (opts == undefined) ? {} : opts;\n        sctx = (sctx == undefined) ? this.shadowCanvas._ctx : sctx;\n        \n        var j, data, gridData;\n        \n        // hooks get called even if series not shown\n        // we don't clear canvas here, it would wipe out all other series as well.\n        for (j=0; j<$.jqplot.preDrawSeriesShadowHooks.length; j++) {\n            $.jqplot.preDrawSeriesShadowHooks[j].call(this, sctx, options);\n        }\n        if (this.shadow) {\n            this.renderer.setGridData.call(this, plot);\n\n            data = [];\n            if (options.data) {\n                data = options.data;\n            }\n            else if (!this._stack) {\n                data = this.data;\n            }\n            else {\n                data = this._plotData;\n            }\n            gridData = options.gridData || this.renderer.makeGridData.call(this, data, plot);\n        \n            this.renderer.drawShadow.call(this, sctx, gridData, options, plot);\n        }\n        \n        for (j=0; j<$.jqplot.postDrawSeriesShadowHooks.length; j++) {\n            $.jqplot.postDrawSeriesShadowHooks[j].call(this, sctx, options);\n        }\n        \n        sctx = opts = plot = j = data = gridData = null;\n        \n    };\n    \n    // toggles series display on plot, e.g. show/hide series\n    Series.prototype.toggleDisplay = function(ev, callback) {\n        var s, speed;\n        if (ev.data.series) {\n            s = ev.data.series;\n        }\n        else {\n            s = this;\n        }\n\n        if (ev.data.speed) {\n            speed = ev.data.speed;\n        }\n        if (speed) {\n            // this can be tricky because series may not have a canvas element if replotting.\n            if (s.canvas._elem.is(':hidden') || !s.show) {\n                s.show = true;\n\n                s.canvas._elem.removeClass('jqplot-series-hidden');\n                if (s.shadowCanvas._elem) {\n                    s.shadowCanvas._elem.fadeIn(speed);\n                }\n                s.canvas._elem.fadeIn(speed, callback);\n                s.canvas._elem.nextAll('.jqplot-point-label.jqplot-series-'+s.index).fadeIn(speed);\n            }\n            else {\n                s.show = false;\n\n                s.canvas._elem.addClass('jqplot-series-hidden');\n                if (s.shadowCanvas._elem) {\n                    s.shadowCanvas._elem.fadeOut(speed);\n                }\n                s.canvas._elem.fadeOut(speed, callback);\n                s.canvas._elem.nextAll('.jqplot-point-label.jqplot-series-'+s.index).fadeOut(speed);\n            }\n        }\n        else {\n            // this can be tricky because series may not have a canvas element if replotting.\n            if (s.canvas._elem.is(':hidden') || !s.show) {\n                s.show = true;\n\n                s.canvas._elem.removeClass('jqplot-series-hidden');\n                if (s.shadowCanvas._elem) {\n                    s.shadowCanvas._elem.show();\n                }\n                s.canvas._elem.show(0, callback);\n                s.canvas._elem.nextAll('.jqplot-point-label.jqplot-series-'+s.index).show();\n            }\n            else {\n                s.show = false;\n\n                s.canvas._elem.addClass('jqplot-series-hidden');\n                if (s.shadowCanvas._elem) {\n                    s.shadowCanvas._elem.hide();\n                }\n                s.canvas._elem.hide(0, callback);\n                s.canvas._elem.nextAll('.jqplot-point-label.jqplot-series-'+s.index).hide();\n            }\n        }\n    };\n    \n\n\n    /**\n     * Class: Grid\n     * \n     * Object representing the grid on which the plot is drawn.  The grid in this\n     * context is the area bounded by the axes, the area which will contain the series.\n     * Note, the series are drawn on their own canvas.\n     * The Grid object cannot be instantiated directly, but is created by the Plot object.  \n     * Grid properties can be set or overridden by the options passed in from the user.\n     */\n    function Grid() {\n        $.jqplot.ElemContainer.call(this);\n        // Group: Properties\n        \n        // prop: drawGridlines\n        // whether to draw the gridlines on the plot.\n        this.drawGridlines = true;\n        // prop: gridLineColor\n        // color of the grid lines.\n        this.gridLineColor = '#cccccc';\n        // prop: gridLineWidth\n        // width of the grid lines.\n        this.gridLineWidth = 1.0;\n        // prop: background\n        // css spec for the background color.\n        this.background = '#fffdf6';\n        // prop: borderColor\n        // css spec for the color of the grid border.\n        this.borderColor = '#999999';\n        // prop: borderWidth\n        // width of the border in pixels.\n        this.borderWidth = 2.0;\n        // prop: drawBorder\n        // True to draw border around grid.\n        this.drawBorder = true;\n        // prop: shadow\n        // whether to show a shadow behind the grid.\n        this.shadow = true;\n        // prop: shadowAngle\n        // shadow angle in degrees\n        this.shadowAngle = 45;\n        // prop: shadowOffset\n        // Offset of each shadow stroke from the border in pixels\n        this.shadowOffset = 1.5;\n        // prop: shadowWidth\n        // width of the stoke for the shadow\n        this.shadowWidth = 3;\n        // prop: shadowDepth\n        // Number of times shadow is stroked, each stroke offset shadowOffset from the last.\n        this.shadowDepth = 3;\n        // prop: shadowColor\n        // an optional css color spec for the shadow in 'rgba(n, n, n, n)' form\n        this.shadowColor = null;\n        // prop: shadowAlpha\n        // Alpha channel transparency of shadow.  0 = transparent.\n        this.shadowAlpha = '0.07';\n        this._left;\n        this._top;\n        this._right;\n        this._bottom;\n        this._width;\n        this._height;\n        this._axes = [];\n        // prop: renderer\n        // Instance of a renderer which will actually render the grid,\n        // see <$.jqplot.CanvasGridRenderer>.\n        this.renderer = $.jqplot.CanvasGridRenderer;\n        // prop: rendererOptions\n        // Options to pass on to the renderer,\n        // see <$.jqplot.CanvasGridRenderer>.\n        this.rendererOptions = {};\n        this._offsets = {top:null, bottom:null, left:null, right:null};\n    }\n    \n    Grid.prototype = new $.jqplot.ElemContainer();\n    Grid.prototype.constructor = Grid;\n    \n    Grid.prototype.init = function() {\n        if ($.isFunction(this.renderer)) {\n            this.renderer = new this.renderer();  \n        }\n        this.renderer.init.call(this, this.rendererOptions);\n    };\n    \n    Grid.prototype.createElement = function(offsets,plot) {\n        this._offsets = offsets;\n        return this.renderer.createElement.call(this, plot);\n    };\n    \n    Grid.prototype.draw = function() {\n        this.renderer.draw.call(this);\n    };\n    \n    $.jqplot.GenericCanvas = function() {\n        $.jqplot.ElemContainer.call(this);\n        this._ctx;  \n    };\n    \n    $.jqplot.GenericCanvas.prototype = new $.jqplot.ElemContainer();\n    $.jqplot.GenericCanvas.prototype.constructor = $.jqplot.GenericCanvas;\n    \n    $.jqplot.GenericCanvas.prototype.createElement = function(offsets, clss, plotDimensions, plot) {\n        this._offsets = offsets;\n        var klass = 'jqplot';\n        if (clss != undefined) {\n            klass = clss;\n        }\n        var elem;\n\n        elem = plot.canvasManager.getCanvas();\n        \n        // if new plotDimensions supplied, use them.\n        if (plotDimensions != null) {\n            this._plotDimensions = plotDimensions;\n        }\n        \n        elem.width = this._plotDimensions.width - this._offsets.left - this._offsets.right;\n        elem.height = this._plotDimensions.height - this._offsets.top - this._offsets.bottom;\n        this._elem = $(elem);\n        this._elem.css({ position: 'absolute', left: this._offsets.left, top: this._offsets.top });\n        \n        this._elem.addClass(klass);\n        \n        elem = plot.canvasManager.initCanvas(elem);\n        \n        elem = null;\n        return this._elem;\n    };\n    \n    $.jqplot.GenericCanvas.prototype.setContext = function() {\n        this._ctx = this._elem.get(0).getContext(\"2d\");\n        return this._ctx;\n    };\n    \n    // Memory Leaks patch\n    $.jqplot.GenericCanvas.prototype.resetCanvas = function() {\n      if (this._elem) {\n        if ($.jqplot.use_excanvas && window.G_vmlCanvasManager.uninitElement !== undefined) {\n           window.G_vmlCanvasManager.uninitElement(this._elem.get(0));\n        }\n        \n        //this._elem.remove();\n        this._elem.emptyForce();\n      }\n      \n      this._ctx = null;\n    };\n    \n    $.jqplot.HooksManager = function () {\n        this.hooks =[];\n        this.args = [];\n    };\n    \n    $.jqplot.HooksManager.prototype.addOnce = function(fn, args) {\n        args = args || [];\n        var havehook = false;\n        for (var i=0, l=this.hooks.length; i<l; i++) {\n            if (this.hooks[i] == fn) {\n                havehook = true;\n            }\n        }\n        if (!havehook) {\n            this.hooks.push(fn);\n            this.args.push(args);\n        }\n    };\n    \n    $.jqplot.HooksManager.prototype.add = function(fn, args) {\n        args = args || [];\n        this.hooks.push(fn);\n        this.args.push(args);\n    };\n    \n    $.jqplot.EventListenerManager = function () {\n        this.hooks =[];\n    };\n    \n    $.jqplot.EventListenerManager.prototype.addOnce = function(ev, fn) {\n        var havehook = false, h, i;\n        for (var i=0, l=this.hooks.length; i<l; i++) {\n            h = this.hooks[i];\n            if (h[0] == ev && h[1] == fn) {\n                havehook = true;\n            }\n        }\n        if (!havehook) {\n            this.hooks.push([ev, fn]);\n        }\n    };\n    \n    $.jqplot.EventListenerManager.prototype.add = function(ev, fn) {\n        this.hooks.push([ev, fn]);\n    };\n\n\n    var _axisNames = ['yMidAxis', 'xaxis', 'yaxis', 'x2axis', 'y2axis', 'y3axis', 'y4axis', 'y5axis', 'y6axis', 'y7axis', 'y8axis', 'y9axis'];\n\n    /**\n     * Class: jqPlot\n     * Plot object returned by call to $.jqplot.  Handles parsing user options,\n     * creating sub objects (Axes, legend, title, series) and rendering the plot.\n     */\n    function jqPlot() {\n        // Group: Properties\n        // These properties are specified at the top of the options object\n        // like so:\n        // > {\n        // >     axesDefaults:{min:0},\n        // >     series:[{color:'#6633dd'}],\n        // >     title: 'A Plot'\n        // > }\n        //\n\n        // prop: animate\n        // True to animate the series on initial plot draw (renderer dependent).\n        // Actual animation functionality must be supported in the renderer.\n        this.animate = false;\n        // prop: animateReplot\n        // True to animate series after a call to the replot() method.\n        // Use with caution!  Replots can happen very frequently under\n        // certain circumstances (e.g. resizing, dragging points) and\n        // animation in these situations can cause problems.\n        this.animateReplot = false;\n        // prop: axes\n        // up to 4 axes are supported, each with its own options, \n        // See <Axis> for axis specific options.\n        this.axes = {xaxis: new Axis('xaxis'), yaxis: new Axis('yaxis'), x2axis: new Axis('x2axis'), y2axis: new Axis('y2axis'), y3axis: new Axis('y3axis'), y4axis: new Axis('y4axis'), y5axis: new Axis('y5axis'), y6axis: new Axis('y6axis'), y7axis: new Axis('y7axis'), y8axis: new Axis('y8axis'), y9axis: new Axis('y9axis'), yMidAxis: new Axis('yMidAxis')};\n        this.baseCanvas = new $.jqplot.GenericCanvas();\n        // true to intercept right click events and fire a 'jqplotRightClick' event.\n        // this will also block the context menu.\n        this.captureRightClick = false;\n        // prop: data\n        // user's data.  Data should *NOT* be specified in the options object,\n        // but be passed in as the second argument to the $.jqplot() function.\n        // The data property is described here soley for reference. \n        // The data should be in the form of an array of 2D or 1D arrays like\n        // > [ [[x1, y1], [x2, y2],...], [y1, y2, ...] ].\n        this.data = [];\n        // prop: dataRenderer\n        // A callable which can be used to preprocess data passed into the plot.\n        // Will be called with 3 arguments: the plot data, a reference to the plot,\n        // and the value of dataRendererOptions.\n        this.dataRenderer;\n        // prop: dataRendererOptions\n        // Options that will be passed to the dataRenderer.\n        // Can be of any type.\n        this.dataRendererOptions;\n        this.defaults = {\n            // prop: axesDefaults\n            // default options that will be applied to all axes.\n            // see <Axis> for axes options.\n            axesDefaults: {},\n            axes: {xaxis:{}, yaxis:{}, x2axis:{}, y2axis:{}, y3axis:{}, y4axis:{}, y5axis:{}, y6axis:{}, y7axis:{}, y8axis:{}, y9axis:{}, yMidAxis:{}},\n            // prop: seriesDefaults\n            // default options that will be applied to all series.\n            // see <Series> for series options.\n            seriesDefaults: {},\n            series:[]\n        };\n        // prop: defaultAxisStart\n        // 1-D data series are internally converted into 2-D [x,y] data point arrays\n        // by jqPlot.  This is the default starting value for the missing x or y value.\n        // The added data will be a monotonically increasing series (e.g. [1, 2, 3, ...])\n        // starting at this value.\n        this.defaultAxisStart = 1;\n        // this.doCustomEventBinding = true;\n        // prop: drawIfHidden\n        // True to execute the draw method even if the plot target is hidden.\n        // Generally, this should be false.  Most plot elements will not be sized/\n        // positioned correclty if renderered into a hidden container.  To render into\n        // a hidden container, call the replot method when the container is shown.\n        this.drawIfHidden = false;\n        this.eventCanvas = new $.jqplot.GenericCanvas();\n        // prop: fillBetween\n        // Fill between 2 line series in a plot.\n        // Options object:\n        // {\n        //    series1: first index (0 based) of series in fill\n        //    series2: second index (0 based) of series in fill\n        //    color: color of fill [default fillColor of series1]\n        //    baseSeries:  fill will be drawn below this series (0 based index)\n        //    fill: false to turn off fill [default true].\n        //  }\n        this.fillBetween = {\n            series1: null,\n            series2: null,\n            color: null,\n            baseSeries: 0,\n            fill: true\n        };\n        // prop; fontFamily\n        // css spec for the font-family attribute.  Default for the entire plot.\n        this.fontFamily;\n        // prop: fontSize\n        // css spec for the font-size attribute.  Default for the entire plot.\n        this.fontSize;\n        // prop: grid\n        // See <Grid> for grid specific options.\n        this.grid = new Grid();\n        // prop: legend\n        // see <$.jqplot.TableLegendRenderer>\n        this.legend = new Legend();\n        // prop: noDataIndicator\n        // Options to set up a mock plot with a data loading indicator if no data is specified.\n        this.noDataIndicator = {    \n            show: false,\n            indicator: 'Loading Data...',\n            axes: {\n                xaxis: {\n                    min: 0,\n                    max: 10,\n                    tickInterval: 2,\n                    show: true\n                },\n                yaxis: {\n                    min: 0,\n                    max: 12,\n                    tickInterval: 3,\n                    show: true\n                }\n            }\n        };\n        // prop: negativeSeriesColors \n        // colors to use for portions of the line below zero.\n        this.negativeSeriesColors = $.jqplot.config.defaultNegativeColors;\n        // container to hold all of the merged options.  Convienence for plugins.\n        this.options = {};\n        this.previousSeriesStack = [];\n        // Namespace to hold plugins.  Generally non-renderer plugins add themselves to here.\n        this.plugins = {};\n        // prop: series\n        // Array of series object options.\n        // see <Series> for series specific options.\n        this.series = [];\n        // array of series indices. Keep track of order\n        // which series canvases are displayed, lowest\n        // to highest, back to front.\n        this.seriesStack = [];\n        // prop: seriesColors\n        // Ann array of CSS color specifications that will be applied, in order,\n        // to the series in the plot.  Colors will wrap around so, if their\n        // are more series than colors, colors will be reused starting at the\n        // beginning.  For pie charts, this specifies the colors of the slices.\n        this.seriesColors = $.jqplot.config.defaultColors;\n        // prop: sortData\n        // false to not sort the data passed in by the user.\n        // Many bar, stacked and other graphs as well as many plugins depend on\n        // having sorted data.\n        this.sortData = true;\n        // prop: stackSeries\n        // true or false, creates a stack or \"mountain\" plot.\n        // Not all series renderers may implement this option.\n        this.stackSeries = false;\n        // a shortcut for axis syncTicks options.  Not implemented yet.\n        this.syncXTicks = true;\n        // a shortcut for axis syncTicks options.  Not implemented yet.\n        this.syncYTicks = true;\n        // the jquery object for the dom target.\n        this.target = null; \n        // The id of the dom element to render the plot into\n        this.targetId = null;\n        // prop textColor\n        // css spec for the css color attribute.  Default for the entire plot.\n        this.textColor;\n        // prop: title\n        // Title object.  See <Title> for specific options.  As a shortcut, you\n        // can specify the title option as just a string like: title: 'My Plot'\n        // and this will create a new title object with the specified text.\n        this.title = new Title();\n        // Count how many times the draw method has been called while the plot is visible.\n        // Mostly used to test if plot has never been dran (=0), has been successfully drawn\n        // into a visible container once (=1) or draw more than once into a visible container.\n        // Can use this in tests to see if plot has been visibly drawn at least one time.\n        // After plot has been visibly drawn once, it generally doesn't need redrawing if its\n        // container is hidden and shown.\n        this._drawCount = 0;\n        // sum of y values for all series in plot.\n        // used in mekko chart.\n        this._sumy = 0;\n        this._sumx = 0;\n        // array to hold the cumulative stacked series data.\n        // used to ajust the individual series data, which won't have access to other\n        // series data.\n        this._stackData = [];\n        // array that holds the data to be plotted. This will be the series data\n        // merged with the the appropriate data from _stackData according to the stackAxis.\n        this._plotData = [];\n        this._width = null;\n        this._height = null; \n        this._plotDimensions = {height:null, width:null};\n        this._gridPadding = {top:null, right:null, bottom:null, left:null};\n        this._defaultGridPadding = {top:10, right:10, bottom:23, left:10};\n\n        this._addDomReference = $.jqplot.config.addDomReference;\n\n        this.preInitHooks = new $.jqplot.HooksManager();\n        this.postInitHooks = new $.jqplot.HooksManager();\n        this.preParseOptionsHooks = new $.jqplot.HooksManager();\n        this.postParseOptionsHooks = new $.jqplot.HooksManager();\n        this.preDrawHooks = new $.jqplot.HooksManager();\n        this.postDrawHooks = new $.jqplot.HooksManager();\n        this.preDrawSeriesHooks = new $.jqplot.HooksManager();\n        this.postDrawSeriesHooks = new $.jqplot.HooksManager();\n        this.preDrawLegendHooks = new $.jqplot.HooksManager();\n        this.addLegendRowHooks = new $.jqplot.HooksManager();\n        this.preSeriesInitHooks = new $.jqplot.HooksManager();\n        this.postSeriesInitHooks = new $.jqplot.HooksManager();\n        this.preParseSeriesOptionsHooks = new $.jqplot.HooksManager();\n        this.postParseSeriesOptionsHooks = new $.jqplot.HooksManager();\n        this.eventListenerHooks = new $.jqplot.EventListenerManager();\n        this.preDrawSeriesShadowHooks = new $.jqplot.HooksManager();\n        this.postDrawSeriesShadowHooks = new $.jqplot.HooksManager();\n        \n        this.colorGenerator = new $.jqplot.ColorGenerator();\n        this.negativeColorGenerator = new $.jqplot.ColorGenerator();\n\n        this.canvasManager = new $.jqplot.CanvasManager();\n\n        this.themeEngine = new $.jqplot.ThemeEngine();\n        \n        var seriesColorsIndex = 0;\n\n        // Group: methods\n        //\n        // method: init\n        // sets the plot target, checks data and applies user\n        // options to plot.\n        this.init = function(target, data, options) {\n            options = options || {};\n            for (var i=0; i<$.jqplot.preInitHooks.length; i++) {\n                $.jqplot.preInitHooks[i].call(this, target, data, options);\n            }\n\n            for (var i=0; i<this.preInitHooks.hooks.length; i++) {\n                this.preInitHooks.hooks[i].call(this, target, data, options);\n            }\n            \n            this.targetId = '#'+target;\n            this.target = $('#'+target);\n\n            //////\n            // Add a reference to plot\n            //////\n            if (this._addDomReference) {\n                this.target.data('jqplot', this);\n            }\n            // remove any error class that may be stuck on target.\n            this.target.removeClass('jqplot-error');\n            if (!this.target.get(0)) {\n                throw new Error(\"No plot target specified\");\n            }\n            \n            // make sure the target is positioned by some means and set css\n            if (this.target.css('position') == 'static') {\n                this.target.css('position', 'relative');\n            }\n            if (!this.target.hasClass('jqplot-target')) {\n                this.target.addClass('jqplot-target');\n            }\n            \n            // if no height or width specified, use a default.\n            if (!this.target.height()) {\n                var h;\n                if (options && options.height) {\n                    h = parseInt(options.height, 10);\n                }\n                else if (this.target.attr('data-height')) {\n                    h = parseInt(this.target.attr('data-height'), 10);\n                }\n                else {\n                    h = parseInt($.jqplot.config.defaultHeight, 10);\n                }\n                this._height = h;\n                this.target.css('height', h+'px');\n            }\n            else {\n                this._height = h = this.target.height();\n            }\n            if (!this.target.width()) {\n                var w;\n                if (options && options.width) {\n                    w = parseInt(options.width, 10);\n                }\n                else if (this.target.attr('data-width')) {\n                    w = parseInt(this.target.attr('data-width'), 10);\n                }\n                else {\n                    w = parseInt($.jqplot.config.defaultWidth, 10);\n                }\n                this._width = w;\n                this.target.css('width', w+'px');\n            }\n            else {\n                this._width = w = this.target.width();\n            }\n\n            for (var i=0, l=_axisNames.length; i<l; i++) {\n                this.axes[_axisNames[i]] = new Axis(_axisNames[i]);\n            }\n            \n            this._plotDimensions.height = this._height;\n            this._plotDimensions.width = this._width;\n            this.grid._plotDimensions = this._plotDimensions;\n            this.title._plotDimensions = this._plotDimensions;\n            this.baseCanvas._plotDimensions = this._plotDimensions;\n            this.eventCanvas._plotDimensions = this._plotDimensions;\n            this.legend._plotDimensions = this._plotDimensions;\n            if (this._height <=0 || this._width <=0 || !this._height || !this._width) {\n                throw new Error(\"Canvas dimension not set\");\n            }\n            \n            if (options.dataRenderer && $.isFunction(options.dataRenderer)) {\n                if (options.dataRendererOptions) {\n                    this.dataRendererOptions = options.dataRendererOptions;\n                }\n                this.dataRenderer = options.dataRenderer;\n                data = this.dataRenderer(data, this, this.dataRendererOptions);\n            }\n            \n            if (options.noDataIndicator && $.isPlainObject(options.noDataIndicator)) {\n                $.extend(true, this.noDataIndicator, options.noDataIndicator);\n            }\n            \n            if (data == null || $.isArray(data) == false || data.length == 0 || $.isArray(data[0]) == false || data[0].length == 0) {\n                \n                if (this.noDataIndicator.show == false) {\n                    throw new Error(\"No data specified\");\n                }\n                \n                else {\n                    // have to be descructive here in order for plot to not try and render series.\n                    // This means that $.jqplot() will have to be called again when there is data.\n                    //delete options.series;\n                    \n                    for (var ax in this.noDataIndicator.axes) {\n                        for (var prop in this.noDataIndicator.axes[ax]) {\n                            this.axes[ax][prop] = this.noDataIndicator.axes[ax][prop];\n                        }\n                    }\n                    \n                    this.postDrawHooks.add(function() {\n                        var eh = this.eventCanvas.getHeight();\n                        var ew = this.eventCanvas.getWidth();\n                        var temp = $('<div class=\"jqplot-noData-container\" style=\"position:absolute;\"></div>');\n                        this.target.append(temp);\n                        temp.height(eh);\n                        temp.width(ew);\n                        temp.css('top', this.eventCanvas._offsets.top);\n                        temp.css('left', this.eventCanvas._offsets.left);\n                        \n                        var temp2 = $('<div class=\"jqplot-noData-contents\" style=\"text-align:center; position:relative; margin-left:auto; margin-right:auto;\"></div>');\n                        temp.append(temp2);\n                        temp2.html(this.noDataIndicator.indicator);\n                        var th = temp2.height();\n                        var tw = temp2.width();\n                        temp2.height(th);\n                        temp2.width(tw);\n                        temp2.css('top', (eh - th)/2 + 'px');\n                    });\n\n                }\n            }\n            \n            // make a copy of the data\n            this.data = $.extend(true, [], data);\n            \n            this.parseOptions(options);\n            \n            if (this.textColor) {\n                this.target.css('color', this.textColor);\n            }\n            if (this.fontFamily) {\n                this.target.css('font-family', this.fontFamily);\n            }\n            if (this.fontSize) {\n                this.target.css('font-size', this.fontSize);\n            }\n            \n            this.title.init();\n            this.legend.init();\n            this._sumy = 0;\n            this._sumx = 0;\n            this.computePlotData();\n            for (var i=0; i<this.series.length; i++) {\n                // set default stacking order for series canvases\n                this.seriesStack.push(i);\n                this.previousSeriesStack.push(i);\n                this.series[i].shadowCanvas._plotDimensions = this._plotDimensions;\n                this.series[i].canvas._plotDimensions = this._plotDimensions;\n                for (var j=0; j<$.jqplot.preSeriesInitHooks.length; j++) {\n                    $.jqplot.preSeriesInitHooks[j].call(this.series[i], target, this.data, this.options.seriesDefaults, this.options.series[i], this);\n                }\n                for (var j=0; j<this.preSeriesInitHooks.hooks.length; j++) {\n                    this.preSeriesInitHooks.hooks[j].call(this.series[i], target, this.data, this.options.seriesDefaults, this.options.series[i], this);\n                }\n                // this.populatePlotData(this.series[i], i);\n                this.series[i]._plotDimensions = this._plotDimensions;\n                this.series[i].init(i, this.grid.borderWidth, this);\n                for (var j=0; j<$.jqplot.postSeriesInitHooks.length; j++) {\n                    $.jqplot.postSeriesInitHooks[j].call(this.series[i], target, this.data, this.options.seriesDefaults, this.options.series[i], this);\n                }\n                for (var j=0; j<this.postSeriesInitHooks.hooks.length; j++) {\n                    this.postSeriesInitHooks.hooks[j].call(this.series[i], target, this.data, this.options.seriesDefaults, this.options.series[i], this);\n                }\n                this._sumy += this.series[i]._sumy;\n                this._sumx += this.series[i]._sumx;\n            }\n\n            var name,\n                axis;\n            for (var i=0, l=_axisNames.length; i<l; i++) {\n                name = _axisNames[i];\n                axis = this.axes[name];\n                axis._plotDimensions = this._plotDimensions;\n                axis.init();\n                if (this.axes[name].borderColor == null) {\n                    if (name.charAt(0) !== 'x' && axis.useSeriesColor === true && axis.show) {\n                        axis.borderColor = axis._series[0].color;\n                    }\n                    else {\n                        axis.borderColor = this.grid.borderColor;\n                    }\n                }\n            }\n            \n            if (this.sortData) {\n                sortData(this.series);\n            }\n            this.grid.init();\n            this.grid._axes = this.axes;\n            \n            this.legend._series = this.series;\n\n            for (var i=0; i<$.jqplot.postInitHooks.length; i++) {\n                $.jqplot.postInitHooks[i].call(this, target, this.data, options);\n            }\n\n            for (var i=0; i<this.postInitHooks.hooks.length; i++) {\n                this.postInitHooks.hooks[i].call(this, target, this.data, options);\n            }\n        };  \n        \n        // method: resetAxesScale\n        // Reset the specified axes min, max, numberTicks and tickInterval properties to null\n        // or reset these properties on all axes if no list of axes is provided.\n        //\n        // Parameters:\n        // axes - Boolean to reset or not reset all axes or an array or object of axis names to reset.\n        this.resetAxesScale = function(axes, options) {\n            var opts = options || {};\n            var ax = axes || this.axes;\n            if (ax === true) {\n                ax = this.axes;\n            }\n            if ($.isArray(ax)) {\n                for (var i = 0; i < ax.length; i++) {\n                    this.axes[ax[i]].resetScale(opts[ax[i]]);\n                }\n            }\n            else if (typeof(ax) === 'object') {\n                for (var name in ax) {\n                    this.axes[name].resetScale(opts[name]);\n                }\n            }\n        };\n        // method: reInitialize\n        // reinitialize plot for replotting.\n        // not called directly.\n        this.reInitialize = function (data, opts) {\n            // Plot should be visible and have a height and width.\n            // If plot doesn't have height and width for some\n            // reason, set it by other means.  Plot must not have\n            // a display:none attribute, however.\n\n            var options = $.extend(true, {}, this.options, opts);\n\n            var target = this.targetId.substr(1);\n            var tdata = (data == null) ? this.data : data;\n\n            for (var i=0; i<$.jqplot.preInitHooks.length; i++) {\n                $.jqplot.preInitHooks[i].call(this, target, tdata, options);\n            }\n\n            for (var i=0; i<this.preInitHooks.hooks.length; i++) {\n                this.preInitHooks.hooks[i].call(this, target, tdata, options);\n            }\n            \n            this._height = this.target.height();\n            this._width = this.target.width();\n            \n            if (this._height <=0 || this._width <=0 || !this._height || !this._width) {\n                throw new Error(\"Target dimension not set\");\n            }\n            \n            this._plotDimensions.height = this._height;\n            this._plotDimensions.width = this._width;\n            this.grid._plotDimensions = this._plotDimensions;\n            this.title._plotDimensions = this._plotDimensions;\n            this.baseCanvas._plotDimensions = this._plotDimensions;\n            this.eventCanvas._plotDimensions = this._plotDimensions;\n            this.legend._plotDimensions = this._plotDimensions;\n\n            var name,\n                t, \n                j, \n                axis;\n\n            for (var i=0, l=_axisNames.length; i<l; i++) {\n                name = _axisNames[i];\n                axis = this.axes[name];\n\n                // Memory Leaks patch : clear ticks elements\n                t = axis._ticks;\n                for (var j = 0, tlen = t.length; j < tlen; j++) {\n                  var el = t[j]._elem;\n                  if (el) {\n                    // if canvas renderer\n                    if ($.jqplot.use_excanvas && window.G_vmlCanvasManager.uninitElement !== undefined) {\n                      window.G_vmlCanvasManager.uninitElement(el.get(0));\n                    }\n                    el.emptyForce();\n                    el = null;\n                    t._elem = null;\n                  }\n                }\n                t = null;\n\n                delete axis.ticks;\n                delete axis._ticks;\n                this.axes[name] = new Axis(name);\n                this.axes[name]._plotWidth = this._width;\n                this.axes[name]._plotHeight = this._height;\n            }\n            \n            if (data) {\n                if (options.dataRenderer && $.isFunction(options.dataRenderer)) {\n                    if (options.dataRendererOptions) {\n                        this.dataRendererOptions = options.dataRendererOptions;\n                    }\n                    this.dataRenderer = options.dataRenderer;\n                    data = this.dataRenderer(data, this, this.dataRendererOptions);\n                }\n                \n                // make a copy of the data\n                this.data = $.extend(true, [], data);\n            }\n\n            if (opts) {\n                this.parseOptions(options);\n            }\n            \n            this.title._plotWidth = this._width;\n            \n            if (this.textColor) {\n                this.target.css('color', this.textColor);\n            }\n            if (this.fontFamily) {\n                this.target.css('font-family', this.fontFamily);\n            }\n            if (this.fontSize) {\n                this.target.css('font-size', this.fontSize);\n            }\n\n            this.title.init();\n            this.legend.init();\n            this._sumy = 0;\n            this._sumx = 0;\n\n            this.seriesStack = [];\n            this.previousSeriesStack = [];\n\n            this.computePlotData();\n            for (var i=0, l=this.series.length; i<l; i++) {\n                // set default stacking order for series canvases\n                this.seriesStack.push(i);\n                this.previousSeriesStack.push(i);\n                this.series[i].shadowCanvas._plotDimensions = this._plotDimensions;\n                this.series[i].canvas._plotDimensions = this._plotDimensions;\n                for (var j=0; j<$.jqplot.preSeriesInitHooks.length; j++) {\n                    $.jqplot.preSeriesInitHooks[j].call(this.series[i], target, this.data, this.options.seriesDefaults, this.options.series[i], this);\n                }\n                for (var j=0; j<this.preSeriesInitHooks.hooks.length; j++) {\n                    this.preSeriesInitHooks.hooks[j].call(this.series[i], target, this.data, this.options.seriesDefaults, this.options.series[i], this);\n                }\n                // this.populatePlotData(this.series[i], i);\n                this.series[i]._plotDimensions = this._plotDimensions;\n                this.series[i].init(i, this.grid.borderWidth, this);\n                for (var j=0; j<$.jqplot.postSeriesInitHooks.length; j++) {\n                    $.jqplot.postSeriesInitHooks[j].call(this.series[i], target, this.data, this.options.seriesDefaults, this.options.series[i], this);\n                }\n                for (var j=0; j<this.postSeriesInitHooks.hooks.length; j++) {\n                    this.postSeriesInitHooks.hooks[j].call(this.series[i], target, this.data, this.options.seriesDefaults, this.options.series[i], this);\n                }\n                this._sumy += this.series[i]._sumy;\n                this._sumx += this.series[i]._sumx;\n            }\n\n            for (var i=0, l=_axisNames.length; i<l; i++) {\n                name = _axisNames[i];\n                axis = this.axes[name];\n\n                axis._plotDimensions = this._plotDimensions;\n                axis.init();\n                if (axis.borderColor == null) {\n                    if (name.charAt(0) !== 'x' && axis.useSeriesColor === true && axis.show) {\n                        axis.borderColor = axis._series[0].color;\n                    }\n                    else {\n                        axis.borderColor = this.grid.borderColor;\n                    }\n                }\n            }\n            \n            if (this.sortData) {\n                sortData(this.series);\n            }\n            this.grid.init();\n            this.grid._axes = this.axes;\n            \n            this.legend._series = this.series;\n\n            for (var i=0, l=$.jqplot.postInitHooks.length; i<l; i++) {\n                $.jqplot.postInitHooks[i].call(this, target, this.data, options);\n            }\n\n            for (var i=0, l=this.postInitHooks.hooks.length; i<l; i++) {\n                this.postInitHooks.hooks[i].call(this, target, this.data, options);\n            }\n        };\n\n\n\n        // method: quickInit\n        // \n        // Quick reinitialization plot for replotting.\n        // Does not parse options ore recreate axes and series.\n        // not called directly.\n        this.quickInit = function () {\n            // Plot should be visible and have a height and width.\n            // If plot doesn't have height and width for some\n            // reason, set it by other means.  Plot must not have\n            // a display:none attribute, however.\n            \n            this._height = this.target.height();\n            this._width = this.target.width();\n            \n            if (this._height <=0 || this._width <=0 || !this._height || !this._width) {\n                throw new Error(\"Target dimension not set\");\n            }\n            \n            this._plotDimensions.height = this._height;\n            this._plotDimensions.width = this._width;\n            this.grid._plotDimensions = this._plotDimensions;\n            this.title._plotDimensions = this._plotDimensions;\n            this.baseCanvas._plotDimensions = this._plotDimensions;\n            this.eventCanvas._plotDimensions = this._plotDimensions;\n            this.legend._plotDimensions = this._plotDimensions;\n            \n            for (var n in this.axes) {\n                this.axes[n]._plotWidth = this._width;\n                this.axes[n]._plotHeight = this._height;\n            }\n            \n            this.title._plotWidth = this._width;\n            \n            if (this.textColor) {\n                this.target.css('color', this.textColor);\n            }\n            if (this.fontFamily) {\n                this.target.css('font-family', this.fontFamily);\n            }\n            if (this.fontSize) {\n                this.target.css('font-size', this.fontSize);\n            }\n            \n            this._sumy = 0;\n            this._sumx = 0;\n            this.computePlotData();\n            for (var i=0; i<this.series.length; i++) {\n                // this.populatePlotData(this.series[i], i);\n                if (this.series[i]._type === 'line' && this.series[i].renderer.bands.show) {\n                    this.series[i].renderer.initBands.call(this.series[i], this.series[i].renderer.options, this);\n                }\n                this.series[i]._plotDimensions = this._plotDimensions;\n                this.series[i].canvas._plotDimensions = this._plotDimensions;\n                //this.series[i].init(i, this.grid.borderWidth);\n                this._sumy += this.series[i]._sumy;\n                this._sumx += this.series[i]._sumx;\n            }\n\n            var name;\n            \n            for (var j=0; j<12; j++) {\n                name = _axisNames[j];\n                // Memory Leaks patch : clear ticks elements\n                var t = this.axes[name]._ticks;\n                for (var i = 0; i < t.length; i++) {\n                  var el = t[i]._elem;\n                  if (el) {\n                    // if canvas renderer\n                    if ($.jqplot.use_excanvas && window.G_vmlCanvasManager.uninitElement !== undefined) {\n                      window.G_vmlCanvasManager.uninitElement(el.get(0));\n                    }\n                    el.emptyForce();\n                    el = null;\n                    t._elem = null;\n                  }\n                }\n                t = null;\n                \n                this.axes[name]._plotDimensions = this._plotDimensions;\n                this.axes[name]._ticks = [];\n                // this.axes[name].renderer.init.call(this.axes[name], {});\n            }\n            \n            if (this.sortData) {\n                sortData(this.series);\n            }\n            \n            this.grid._axes = this.axes;\n            \n            this.legend._series = this.series;\n        };\n        \n        // sort the series data in increasing order.\n        function sortData(series) {\n            var d, sd, pd, ppd, ret;\n            for (var i=0; i<series.length; i++) {\n                var check;\n                var bat = [series[i].data, series[i]._stackData, series[i]._plotData, series[i]._prevPlotData];\n                for (var n=0; n<4; n++) {\n                    check = true;\n                    d = bat[n];\n                    if (series[i]._stackAxis == 'x') {\n                        for (var j = 0; j < d.length; j++) {\n                            if (typeof(d[j][1]) != \"number\") {\n                                check = false;\n                                break;\n                            }\n                        }\n                        if (check) {\n                            d.sort(function(a,b) { return a[1] - b[1]; });\n                        }\n                    }\n                    else {\n                        for (var j = 0; j < d.length; j++) {\n                            if (typeof(d[j][0]) != \"number\") {\n                                check = false;\n                                break;\n                            }\n                        }\n                        if (check) {\n                            d.sort(function(a,b) { return a[0] - b[0]; });\n                        }\n                    }\n                }\n               \n            }\n        }\n\n        this.computePlotData = function() {\n            this._plotData = [];\n            this._stackData = [];\n            var series,\n                index,\n                l;\n\n\n            for (index=0, l=this.series.length; index<l; index++) {\n                series = this.series[index];\n                this._plotData.push([]);\n                this._stackData.push([]);\n                var cd = series.data;\n                this._plotData[index] = $.extend(true, [], cd);\n                this._stackData[index] = $.extend(true, [], cd);\n                series._plotData = this._plotData[index];\n                series._stackData = this._stackData[index];\n                var plotValues = {x:[], y:[]};\n\n                if (this.stackSeries && !series.disableStack) {\n                    series._stack = true;\n                    ///////////////////////////\n                    // have to check for nulls\n                    ///////////////////////////\n                    var sidx = (series._stackAxis === 'x') ? 0 : 1;\n\n                    for (var k=0, cdl=cd.length; k<cdl; k++) {\n                        var temp = cd[k][sidx];\n                        if (temp == null) {\n                            temp = 0;\n                        }\n                        this._plotData[index][k][sidx] = temp;\n                        this._stackData[index][k][sidx] = temp;\n\n                        if (index > 0) {\n                            for (var j=index; j--;) {\n                                var prevval = this._plotData[j][k][sidx];\n                                // only need to sum up the stack axis column of data\n                                // and only sum if it is of same sign.\n                                // if previous series isn't same sign, keep looking\n                                // at earlier series untill we find one of same sign.\n                                if (temp * prevval >= 0) {\n                                    this._plotData[index][k][sidx] += prevval;\n                                    this._stackData[index][k][sidx] += prevval;\n                                    break;\n                                } \n                            }\n                        }\n                    }\n\n                }\n                else {\n                    for (var i=0; i<series.data.length; i++) {\n                        plotValues.x.push(series.data[i][0]);\n                        plotValues.y.push(series.data[i][1]);\n                    }\n                    this._stackData.push(series.data);\n                    this.series[index]._stackData = series.data;\n                    this._plotData.push(series.data);\n                    series._plotData = series.data;\n                    series._plotValues = plotValues;\n                }\n                if (index>0) {\n                    series._prevPlotData = this.series[index-1]._plotData;\n                }\n                series._sumy = 0;\n                series._sumx = 0;\n                for (i=series.data.length-1; i>-1; i--) {\n                    series._sumy += series.data[i][1];\n                    series._sumx += series.data[i][0];\n                }\n            }\n\n        };\n        \n        // populate the _stackData and _plotData arrays for the plot and the series.\n        this.populatePlotData = function(series, index) {\n            // if a stacked chart, compute the stacked data\n            this._plotData = [];\n            this._stackData = [];\n            series._stackData = [];\n            series._plotData = [];\n            var plotValues = {x:[], y:[]};\n            if (this.stackSeries && !series.disableStack) {\n                series._stack = true;\n                var sidx = (series._stackAxis === 'x') ? 0 : 1;\n                // var idx = sidx ? 0 : 1;\n                // push the current data into stackData\n                //this._stackData.push(this.series[i].data);\n                var temp = $.extend(true, [], series.data);\n                // create the data that will be plotted for this series\n                var plotdata = $.extend(true, [], series.data);\n                var tempx, tempy, dval, stackval, comparator;\n                // for first series, nothing to add to stackData.\n                for (var j=0; j<index; j++) {\n                    var cd = this.series[j].data;\n                    for (var k=0; k<cd.length; k++) {\n                        dval = cd[k];\n                        tempx = (dval[0] != null) ? dval[0] : 0;\n                        tempy = (dval[1] != null) ? dval[1] : 0;\n                        temp[k][0] += tempx;\n                        temp[k][1] += tempy;\n                        stackval = (sidx) ? tempy : tempx;\n                        // only need to sum up the stack axis column of data\n                        // and only sum if it is of same sign.\n                        if (series.data[k][sidx] * stackval >= 0) {\n                            plotdata[k][sidx] += stackval;\n                        }\n                    }\n                }\n                for (var i=0; i<plotdata.length; i++) {\n                    plotValues.x.push(plotdata[i][0]);\n                    plotValues.y.push(plotdata[i][1]);\n                }\n                this._plotData.push(plotdata);\n                this._stackData.push(temp);\n                series._stackData = temp;\n                series._plotData = plotdata;\n                series._plotValues = plotValues;\n            }\n            else {\n                for (var i=0; i<series.data.length; i++) {\n                    plotValues.x.push(series.data[i][0]);\n                    plotValues.y.push(series.data[i][1]);\n                }\n                this._stackData.push(series.data);\n                this.series[index]._stackData = series.data;\n                this._plotData.push(series.data);\n                series._plotData = series.data;\n                series._plotValues = plotValues;\n            }\n            if (index>0) {\n                series._prevPlotData = this.series[index-1]._plotData;\n            }\n            series._sumy = 0;\n            series._sumx = 0;\n            for (i=series.data.length-1; i>-1; i--) {\n                series._sumy += series.data[i][1];\n                series._sumx += series.data[i][0];\n            }\n        };\n        \n        // function to safely return colors from the color array and wrap around at the end.\n        this.getNextSeriesColor = (function(t) {\n            var idx = 0;\n            var sc = t.seriesColors;\n            \n            return function () { \n                if (idx < sc.length) {\n                    return sc[idx++];\n                }\n                else {\n                    idx = 0;\n                    return sc[idx++];\n                }\n            };\n        })(this);\n    \n        this.parseOptions = function(options){\n            for (var i=0; i<this.preParseOptionsHooks.hooks.length; i++) {\n                this.preParseOptionsHooks.hooks[i].call(this, options);\n            }\n            for (var i=0; i<$.jqplot.preParseOptionsHooks.length; i++) {\n                $.jqplot.preParseOptionsHooks[i].call(this, options);\n            }\n            this.options = $.extend(true, {}, this.defaults, options);\n            var opts = this.options;\n            this.animate = opts.animate;\n            this.animateReplot = opts.animateReplot;\n            this.stackSeries = opts.stackSeries;\n            if ($.isPlainObject(opts.fillBetween)) {\n\n                var temp = ['series1', 'series2', 'color', 'baseSeries', 'fill'], \n                    tempi;\n\n                for (var i=0, l=temp.length; i<l; i++) {\n                    tempi = temp[i];\n                    if (opts.fillBetween[tempi] != null) {\n                        this.fillBetween[tempi] = opts.fillBetween[tempi];\n                    }\n                }\n            }\n\n            if (opts.seriesColors) {\n                this.seriesColors = opts.seriesColors;\n            }\n            if (opts.negativeSeriesColors) {\n                this.negativeSeriesColors = opts.negativeSeriesColors;\n            }\n            if (opts.captureRightClick) {\n                this.captureRightClick = opts.captureRightClick;\n            }\n            this.defaultAxisStart = (options && options.defaultAxisStart != null) ? options.defaultAxisStart : this.defaultAxisStart;\n            this.colorGenerator.setColors(this.seriesColors);\n            this.negativeColorGenerator.setColors(this.negativeSeriesColors);\n            // var cg = new this.colorGenerator(this.seriesColors);\n            // var ncg = new this.colorGenerator(this.negativeSeriesColors);\n            // this._gridPadding = this.options.gridPadding;\n            $.extend(true, this._gridPadding, opts.gridPadding);\n            this.sortData = (opts.sortData != null) ? opts.sortData : this.sortData;\n            for (var i=0; i<12; i++) {\n                var n = _axisNames[i];\n                var axis = this.axes[n];\n                axis._options = $.extend(true, {}, opts.axesDefaults, opts.axes[n]);\n                $.extend(true, axis, opts.axesDefaults, opts.axes[n]);\n                axis._plotWidth = this._width;\n                axis._plotHeight = this._height;\n            }\n            // if (this.data.length == 0) {\n            //     this.data = [];\n            //     for (var i=0; i<this.options.series.length; i++) {\n            //         this.data.push(this.options.series.data);\n            //     }    \n            // }\n                \n            var normalizeData = function(data, dir, start) {\n                // return data as an array of point arrays,\n                // in form [[x1,y1...], [x2,y2...], ...]\n                var temp = [];\n                var i, l;\n                dir = dir || 'vertical';\n                if (!$.isArray(data[0])) {\n                    // we have a series of scalars.  One line with just y values.\n                    // turn the scalar list of data into a data array of form:\n                    // [[1, data[0]], [2, data[1]], ...]\n                    for (i=0, l=data.length; i<l; i++) {\n                        if (dir == 'vertical') {\n                            temp.push([start + i, data[i]]);   \n                        }\n                        else {\n                            temp.push([data[i], start+i]);\n                        }\n                    }\n                }            \n                else {\n                    // we have a properly formatted data series, copy it.\n                    $.extend(true, temp, data);\n                }\n                return temp;\n            };\n\n            var colorIndex = 0;\n            this.series = [];\n            for (var i=0; i<this.data.length; i++) {\n                var sopts = $.extend(true, {index: i}, {seriesColors:this.seriesColors, negativeSeriesColors:this.negativeSeriesColors}, this.options.seriesDefaults, this.options.series[i], {rendererOptions:{animation:{show: this.animate}}});\n                // pass in options in case something needs set prior to initialization.\n                var temp = new Series(sopts);\n                for (var j=0; j<$.jqplot.preParseSeriesOptionsHooks.length; j++) {\n                    $.jqplot.preParseSeriesOptionsHooks[j].call(temp, this.options.seriesDefaults, this.options.series[i]);\n                }\n                for (var j=0; j<this.preParseSeriesOptionsHooks.hooks.length; j++) {\n                    this.preParseSeriesOptionsHooks.hooks[j].call(temp, this.options.seriesDefaults, this.options.series[i]);\n                }\n                // Now go back and apply the options to the series.  Really should just do this during initializaiton, but don't want to\n                // mess up preParseSeriesOptionsHooks at this point.\n                $.extend(true, temp, sopts);\n                var dir = 'vertical';\n                if (temp.renderer === $.jqplot.BarRenderer && temp.rendererOptions && temp.rendererOptions.barDirection == 'horizontal') {\n                    dir = 'horizontal';\n                    temp._stackAxis = 'x';\n                    temp._primaryAxis = '_yaxis';\n                }\n                temp.data = normalizeData(this.data[i], dir, this.defaultAxisStart);\n                switch (temp.xaxis) {\n                    case 'xaxis':\n                        temp._xaxis = this.axes.xaxis;\n                        break;\n                    case 'x2axis':\n                        temp._xaxis = this.axes.x2axis;\n                        break;\n                    default:\n                        break;\n                }\n                temp._yaxis = this.axes[temp.yaxis];\n                temp._xaxis._series.push(temp);\n                temp._yaxis._series.push(temp);\n                if (temp.show) {\n                    temp._xaxis.show = true;\n                    temp._yaxis.show = true;\n                }\n                else {\n                    if (temp._xaxis.scaleToHiddenSeries) {\n                        temp._xaxis.show = true;\n                    }\n                    if (temp._yaxis.scaleToHiddenSeries) {\n                        temp._yaxis.show = true;\n                    }\n                }\n\n                // // parse the renderer options and apply default colors if not provided\n                // if (!temp.color && temp.show != false) {\n                //     temp.color = cg.next();\n                //     colorIndex = cg.getIndex() - 1;;\n                // }\n                // if (!temp.negativeColor && temp.show != false) {\n                //     temp.negativeColor = ncg.get(colorIndex);\n                //     ncg.setIndex(colorIndex);\n                // }\n                if (!temp.label) {\n                    temp.label = 'Series '+ (i+1).toString();\n                }\n                // temp.rendererOptions.show = temp.show;\n                // $.extend(true, temp.renderer, {color:this.seriesColors[i]}, this.rendererOptions);\n                this.series.push(temp);  \n                for (var j=0; j<$.jqplot.postParseSeriesOptionsHooks.length; j++) {\n                    $.jqplot.postParseSeriesOptionsHooks[j].call(this.series[i], this.options.seriesDefaults, this.options.series[i]);\n                }\n                for (var j=0; j<this.postParseSeriesOptionsHooks.hooks.length; j++) {\n                    this.postParseSeriesOptionsHooks.hooks[j].call(this.series[i], this.options.seriesDefaults, this.options.series[i]);\n                }\n            }\n            \n            // copy the grid and title options into this object.\n            $.extend(true, this.grid, this.options.grid);\n            // if axis border properties aren't set, set default.\n            for (var i=0, l=_axisNames.length; i<l; i++) {\n                var n = _axisNames[i];\n                var axis = this.axes[n];\n                if (axis.borderWidth == null) {\n                    axis.borderWidth =this.grid.borderWidth;\n                }\n            }\n            \n            if (typeof this.options.title == 'string') {\n                this.title.text = this.options.title;\n            }\n            else if (typeof this.options.title == 'object') {\n                $.extend(true, this.title, this.options.title);\n            }\n            this.title._plotWidth = this._width;\n            this.legend.setOptions(this.options.legend);\n            \n            for (var i=0; i<$.jqplot.postParseOptionsHooks.length; i++) {\n                $.jqplot.postParseOptionsHooks[i].call(this, options);\n            }\n            for (var i=0; i<this.postParseOptionsHooks.hooks.length; i++) {\n                this.postParseOptionsHooks.hooks[i].call(this, options);\n            }\n        };\n        \n        // method: destroy\n        // Releases all resources occupied by the plot\n        this.destroy = function() {\n            this.canvasManager.freeAllCanvases();\n            if (this.eventCanvas && this.eventCanvas._elem) {\n                this.eventCanvas._elem.unbind();\n            }\n            // Couple of posts on Stack Overflow indicate that empty() doesn't\n            // always cear up the dom and release memory.  Sometimes setting\n            // innerHTML property to null is needed.  Particularly on IE, may \n            // have to directly set it to null, bypassing $.\n            this.target.empty();\n\n            this.target[0].innerHTML = '';\n        };\n        \n        // method: replot\n        // Does a reinitialization of the plot followed by\n        // a redraw.  Method could be used to interactively\n        // change plot characteristics and then replot.\n        //\n        // Parameters:\n        // options - Options used for replotting.\n        //\n        // Properties:\n        // clear - false to not clear (empty) the plot container before replotting (default: true).\n        // resetAxes - true to reset all axes min, max, numberTicks and tickInterval setting so axes will rescale themselves.\n        //             optionally pass in list of axes to reset (e.g. ['xaxis', 'y2axis']) (default: false).\n        this.replot = function(options) {\n            var opts =  options || {};\n            var data = opts.data || null;\n            var clear = (opts.clear === false) ? false : true;\n            var resetAxes = opts.resetAxes || false;\n            delete opts.data;\n            delete opts.clear;\n            delete opts.resetAxes;\n\n            this.target.trigger('jqplotPreReplot');\n            \n            if (clear) {\n                this.destroy();\n            }\n            // if have data or other options, full reinit.\n            // otherwise, quickinit.\n            if (data || !$.isEmptyObject(opts)) {\n                this.reInitialize(data, opts);\n            }\n            else {\n                this.quickInit();\n            }\n\n            if (resetAxes) {\n                this.resetAxesScale(resetAxes, opts.axes);\n            }\n            this.draw();\n            this.target.trigger('jqplotPostReplot');\n        };\n        \n        // method: redraw\n        // Empties the plot target div and redraws the plot.\n        // This enables plot data and properties to be changed\n        // and then to comletely clear the plot and redraw.\n        // redraw *will not* reinitialize any plot elements.\n        // That is, axes will not be autoscaled and defaults\n        // will not be reapplied to any plot elements.  redraw\n        // is used primarily with zooming. \n        //\n        // Parameters:\n        // clear - false to not clear (empty) the plot container before redrawing (default: true).\n        this.redraw = function(clear) {\n            clear = (clear != null) ? clear : true;\n            this.target.trigger('jqplotPreRedraw');\n            if (clear) {\n                this.canvasManager.freeAllCanvases();\n                this.eventCanvas._elem.unbind();\n                // Dont think I bind any events to the target, this shouldn't be necessary.\n                // It will remove user's events.\n                // this.target.unbind();\n                this.target.empty();\n            }\n             for (var ax in this.axes) {\n                this.axes[ax]._ticks = [];\n            }\n            this.computePlotData();\n            // for (var i=0; i<this.series.length; i++) {\n            //     this.populatePlotData(this.series[i], i);\n            // }\n            this._sumy = 0;\n            this._sumx = 0;\n            for (var i=0, tsl = this.series.length; i<tsl; i++) {\n                this._sumy += this.series[i]._sumy;\n                this._sumx += this.series[i]._sumx;\n            }\n            this.draw();\n            this.target.trigger('jqplotPostRedraw');\n        };\n        \n        // method: draw\n        // Draws all elements of the plot into the container.\n        // Does not clear the container before drawing.\n        this.draw = function(){\n            if (this.drawIfHidden || this.target.is(':visible')) {\n                this.target.trigger('jqplotPreDraw');\n                var i,\n                    j,\n                    l,\n                    tempseries;\n                for (i=0, l=$.jqplot.preDrawHooks.length; i<l; i++) {\n                    $.jqplot.preDrawHooks[i].call(this);\n                }\n                for (i=0, l=this.preDrawHooks.hooks.length; i<l; i++) {\n                    this.preDrawHooks.hooks[i].apply(this, this.preDrawSeriesHooks.args[i]);\n                }\n                // create an underlying canvas to be used for special features.\n                this.target.append(this.baseCanvas.createElement({left:0, right:0, top:0, bottom:0}, 'jqplot-base-canvas', null, this));\n                this.baseCanvas.setContext();\n                this.target.append(this.title.draw());\n                this.title.pack({top:0, left:0});\n                \n                // make room  for the legend between the grid and the edge.\n                // pass a dummy offsets object and a reference to the plot.\n                var legendElem = this.legend.draw({}, this);\n                \n                var gridPadding = {top:0, left:0, bottom:0, right:0};\n                \n                if (this.legend.placement == \"outsideGrid\") {\n                    // temporarily append the legend to get dimensions\n                    this.target.append(legendElem);\n                    switch (this.legend.location) {\n                        case 'n':\n                            gridPadding.top += this.legend.getHeight();\n                            break;\n                        case 's':\n                            gridPadding.bottom += this.legend.getHeight();\n                            break;\n                        case 'ne':\n                        case 'e':\n                        case 'se':\n                            gridPadding.right += this.legend.getWidth();\n                            break;\n                        case 'nw':\n                        case 'w':\n                        case 'sw':\n                            gridPadding.left += this.legend.getWidth();\n                            break;\n                        default:  // same as 'ne'\n                            gridPadding.right += this.legend.getWidth();\n                            break;\n                    }\n                    legendElem = legendElem.detach();\n                }\n                \n                var ax = this.axes;\n                var name;\n                // draw the yMidAxis first, so xaxis of pyramid chart can adjust itself if needed.\n                for (i=0; i<12; i++) {\n                    name = _axisNames[i];\n                    this.target.append(ax[name].draw(this.baseCanvas._ctx, this));\n                    ax[name].set();\n                }\n                if (ax.yaxis.show) {\n                    gridPadding.left += ax.yaxis.getWidth();\n                }\n                var ra = ['y2axis', 'y3axis', 'y4axis', 'y5axis', 'y6axis', 'y7axis', 'y8axis', 'y9axis'];\n                var rapad = [0, 0, 0, 0, 0, 0, 0, 0];\n                var gpr = 0;\n                var n;\n                for (n=0; n<8; n++) {\n                    if (ax[ra[n]].show) {\n                        gpr += ax[ra[n]].getWidth();\n                        rapad[n] = gpr;\n                    }\n                }\n                gridPadding.right += gpr;\n                if (ax.x2axis.show) {\n                    gridPadding.top += ax.x2axis.getHeight();\n                }\n                if (this.title.show) {\n                    gridPadding.top += this.title.getHeight();\n                }\n                if (ax.xaxis.show) {\n                    gridPadding.bottom += ax.xaxis.getHeight();\n                }\n                \n                // end of gridPadding adjustments.\n\n                // if user passed in gridDimensions option, check against calculated gridPadding\n                if (this.options.gridDimensions && $.isPlainObject(this.options.gridDimensions)) {\n                    var gdw = parseInt(this.options.gridDimensions.width, 10) || 0;\n                    var gdh = parseInt(this.options.gridDimensions.height, 10) || 0;\n                    var widthAdj = (this._width - gridPadding.left - gridPadding.right - gdw)/2;\n                    var heightAdj = (this._height - gridPadding.top - gridPadding.bottom - gdh)/2;\n\n                    if (heightAdj >= 0 && widthAdj >= 0) {\n                        gridPadding.top += heightAdj;\n                        gridPadding.bottom += heightAdj;\n                        gridPadding.left += widthAdj;\n                        gridPadding.right += widthAdj;\n                    }\n                }\n                var arr = ['top', 'bottom', 'left', 'right'];\n                for (var n in arr) {\n                    if (this._gridPadding[arr[n]] == null && gridPadding[arr[n]] > 0) {\n                        this._gridPadding[arr[n]] = gridPadding[arr[n]];\n                    }\n                    else if (this._gridPadding[arr[n]] == null) {\n                        this._gridPadding[arr[n]] = this._defaultGridPadding[arr[n]];\n                    }\n                }\n                \n                var legendPadding = this._gridPadding;\n                \n                if (this.legend.placement === 'outsideGrid') {\n                    legendPadding = {top:this.title.getHeight(), left: 0, right: 0, bottom: 0};\n                    if (this.legend.location === 's') {\n                        legendPadding.left = this._gridPadding.left;\n                        legendPadding.right = this._gridPadding.right;\n                    }\n                }\n                \n                ax.xaxis.pack({position:'absolute', bottom:this._gridPadding.bottom - ax.xaxis.getHeight(), left:0, width:this._width}, {min:this._gridPadding.left, max:this._width - this._gridPadding.right});\n                ax.yaxis.pack({position:'absolute', top:0, left:this._gridPadding.left - ax.yaxis.getWidth(), height:this._height}, {min:this._height - this._gridPadding.bottom, max: this._gridPadding.top});\n                ax.x2axis.pack({position:'absolute', top:this._gridPadding.top - ax.x2axis.getHeight(), left:0, width:this._width}, {min:this._gridPadding.left, max:this._width - this._gridPadding.right});\n                for (i=8; i>0; i--) {\n                    ax[ra[i-1]].pack({position:'absolute', top:0, right:this._gridPadding.right - rapad[i-1]}, {min:this._height - this._gridPadding.bottom, max: this._gridPadding.top});\n                }\n                var ltemp = (this._width - this._gridPadding.left - this._gridPadding.right)/2.0 + this._gridPadding.left - ax.yMidAxis.getWidth()/2.0;\n                ax.yMidAxis.pack({position:'absolute', top:0, left:ltemp, zIndex:9, textAlign: 'center'}, {min:this._height - this._gridPadding.bottom, max: this._gridPadding.top});\n            \n                this.target.append(this.grid.createElement(this._gridPadding, this));\n                this.grid.draw();\n                \n                var series = this.series;\n                var seriesLength = series.length;\n                // put the shadow canvases behind the series canvases so shadows don't overlap on stacked bars.\n                for (i=0, l=seriesLength; i<l; i++) {\n                    // draw series in order of stacking.  This affects only\n                    // order in which canvases are added to dom.\n                    j = this.seriesStack[i];\n                    this.target.append(series[j].shadowCanvas.createElement(this._gridPadding, 'jqplot-series-shadowCanvas', null, this));\n                    series[j].shadowCanvas.setContext();\n                    series[j].shadowCanvas._elem.data('seriesIndex', j);\n                }\n                \n                for (i=0, l=seriesLength; i<l; i++) {\n                    // draw series in order of stacking.  This affects only\n                    // order in which canvases are added to dom.\n                    j = this.seriesStack[i];\n                    this.target.append(series[j].canvas.createElement(this._gridPadding, 'jqplot-series-canvas', null, this));\n                    series[j].canvas.setContext();\n                    series[j].canvas._elem.data('seriesIndex', j);\n                }\n                // Need to use filled canvas to capture events in IE.\n                // Also, canvas seems to block selection of other elements in document on FF.\n                this.target.append(this.eventCanvas.createElement(this._gridPadding, 'jqplot-event-canvas', null, this));\n                this.eventCanvas.setContext();\n                this.eventCanvas._ctx.fillStyle = 'rgba(0,0,0,0)';\n                this.eventCanvas._ctx.fillRect(0,0,this.eventCanvas._ctx.canvas.width, this.eventCanvas._ctx.canvas.height);\n            \n                // bind custom event handlers to regular events.\n                this.bindCustomEvents();\n            \n                // draw legend before series if the series needs to know the legend dimensions.\n                if (this.legend.preDraw) {  \n                    this.eventCanvas._elem.before(legendElem);\n                    this.legend.pack(legendPadding);\n                    if (this.legend._elem) {\n                        this.drawSeries({legendInfo:{location:this.legend.location, placement:this.legend.placement, width:this.legend.getWidth(), height:this.legend.getHeight(), xoffset:this.legend.xoffset, yoffset:this.legend.yoffset}});\n                    }\n                    else {\n                        this.drawSeries();\n                    }\n                }\n                else {  // draw series before legend\n                    this.drawSeries();\n                    if (seriesLength) {\n                        $(series[seriesLength-1].canvas._elem).after(legendElem);\n                    }\n                    this.legend.pack(legendPadding);                \n                }\n            \n                // register event listeners on the overlay canvas\n                for (var i=0, l=$.jqplot.eventListenerHooks.length; i<l; i++) {\n                    // in the handler, this will refer to the eventCanvas dom element.\n                    // make sure there are references back into plot objects.\n                    this.eventCanvas._elem.bind($.jqplot.eventListenerHooks[i][0], {plot:this}, $.jqplot.eventListenerHooks[i][1]);\n                }\n            \n                // register event listeners on the overlay canvas\n                for (var i=0, l=this.eventListenerHooks.hooks.length; i<l; i++) {\n                    // in the handler, this will refer to the eventCanvas dom element.\n                    // make sure there are references back into plot objects.\n                    this.eventCanvas._elem.bind(this.eventListenerHooks.hooks[i][0], {plot:this}, this.eventListenerHooks.hooks[i][1]);\n                }\n\n                var fb = this.fillBetween;\n                if(typeof fb.series1 == 'number'){\n                    if(fb.fill&&fb.series1!==fb.series2&&fb.series1<seriesLength&&fb.series2<seriesLength&&series[fb.series1]._type===\"line\"&&series[fb.series2]._type===\"line\")\n                    this.doFillBetweenLines();\n                }\n                else{\n                    if(fb.series1 != null && fb.series2 != null){\n                        var doFb = false;\n                        if(fb.series1.length === fb.series2.length){\n                            var tempSeries1 = 0;\n                            var tempSeries2 = 0;\n                            \n                            for(var cnt = 0; cnt < fb.series1.length; cnt++){\n                                tempSeries1 = fb.series1[cnt];\n                                tempSeries2 = fb.series2[cnt];\n                                if(tempSeries1!==tempSeries2&&tempSeries1<seriesLength&&tempSeries2<seriesLength&&series[tempSeries1]._type===\"line\"&&series[tempSeries2]._type===\"line\"){\n                                    doFb = true;\n                                }\n                                else{\n                                    doFb = false;\n                                    break;\n                                }\n                            }\n                        }\n                        if(fb.fill && doFb){\n                            this.doFillBetweenLines();\n                        }\n                    }\n                }\n\n                for (var i=0, l=$.jqplot.postDrawHooks.length; i<l; i++) {\n                    $.jqplot.postDrawHooks[i].call(this);\n                }\n\n                for (var i=0, l=this.postDrawHooks.hooks.length; i<l; i++) {\n                    this.postDrawHooks.hooks[i].apply(this, this.postDrawHooks.args[i]);\n                }\n            \n                if (this.target.is(':visible')) {\n                    this._drawCount += 1;\n                }\n\n                var temps, \n                    tempr,\n                    sel,\n                    _els;\n                // ughh.  ideally would hide all series then show them.\n                for (i=0, l=seriesLength; i<l; i++) {\n                    temps = series[i];\n                    tempr = temps.renderer;\n                    sel = '.jqplot-point-label.jqplot-series-'+i;\n                    if (tempr.animation && tempr.animation._supported && tempr.animation.show && (this._drawCount < 2 || this.animateReplot)) {\n                        _els = this.target.find(sel);\n                        _els.stop(true, true).hide();\n                        temps.canvas._elem.stop(true, true).hide();\n                        temps.shadowCanvas._elem.stop(true, true).hide();\n                        temps.canvas._elem.jqplotEffect('blind', {mode: 'show', direction: tempr.animation.direction}, tempr.animation.speed);\n                        temps.shadowCanvas._elem.jqplotEffect('blind', {mode: 'show', direction: tempr.animation.direction}, tempr.animation.speed);\n                        _els.fadeIn(tempr.animation.speed*0.8);\n                    }\n                }\n                _els = null;\n            \n                this.target.trigger('jqplotPostDraw', [this]);\n            }\n        };\n\n        jqPlot.prototype.doFillBetweenLines = function () {\n            var fb = this.fillBetween;\n            var series = this.series;\n            var sid1 = fb.series1;\n            var sid2 = fb.series2;\n            var id1 = 0, id2 = 0;\n\n            function fill(id1, id2){\n                var series1 = series[id1];\n                var series2 = series[id2];\n                if (series2.renderer.smooth)\n                    var tempgd = series2.renderer._smoothedData.slice(0).reverse();\n                else\n                    var tempgd = series2.gridData.slice(0).reverse();\n                if (series1.renderer.smooth)\n                    var gd = series1.renderer._smoothedData.concat(tempgd);\n                else\n                    var gd = series1.gridData.concat(tempgd);\n                var color = fb.color !== null ? fb.color : series[sid1].fillColor;\n                var baseSeries = fb.baseSeries !== null ? fb.baseSeries : id1;\n                var sr =\n                    series[baseSeries].renderer.shapeRenderer;\n                var opts =\n                {\n                    fillStyle : color,\n                    fill : true,\n                    closePath : true\n                };\n                sr.draw(series1.shadowCanvas._ctx, gd, opts)\n            }\n\n            if(typeof sid1 == 'number' && typeof sid2 == 'number'){\n                id1 = sid1 < sid2 ? sid1 : sid2;\n                id2 = sid2 > sid1 ? sid2 : sid1;\n                fill(id1, id2);\n            }\n            else{\n                for(var cnt = 0; cnt < sid1.length ; cnt++){\n                    id1 = sid1[cnt] < sid2[cnt] ? sid1[cnt] : sid2[cnt];\n                    id2 = sid2[cnt] > sid1[cnt] ? sid2[cnt] : sid1[cnt];\n                    fill(id1, id2);\n                }\n            }\n        };\n        \n        this.bindCustomEvents = function() {\n            this.eventCanvas._elem.bind('click', {plot:this}, this.onClick);\n            this.eventCanvas._elem.bind('dblclick', {plot:this}, this.onDblClick);\n            this.eventCanvas._elem.bind('mousedown', {plot:this}, this.onMouseDown);\n            this.eventCanvas._elem.bind('mousemove', {plot:this}, this.onMouseMove);\n            this.eventCanvas._elem.bind('mouseenter', {plot:this}, this.onMouseEnter);\n            this.eventCanvas._elem.bind('mouseleave', {plot:this}, this.onMouseLeave);\n            if (this.captureRightClick) {\n                this.eventCanvas._elem.bind('mouseup', {plot:this}, this.onRightClick);\n                this.eventCanvas._elem.get(0).oncontextmenu = function() {\n                    return false;\n                };\n            }\n            else {\n                this.eventCanvas._elem.bind('mouseup', {plot:this}, this.onMouseUp);\n            }\n        };\n        \n        function getEventPosition(ev) {\n            var plot = ev.data.plot;\n            var go = plot.eventCanvas._elem.offset();\n            var gridPos = {x:ev.pageX - go.left, y:ev.pageY - go.top};\n            var dataPos = {xaxis:null, yaxis:null, x2axis:null, y2axis:null, y3axis:null, y4axis:null, y5axis:null, y6axis:null, y7axis:null, y8axis:null, y9axis:null, yMidAxis:null};\n            var an = ['xaxis', 'yaxis', 'x2axis', 'y2axis', 'y3axis', 'y4axis', 'y5axis', 'y6axis', 'y7axis', 'y8axis', 'y9axis', 'yMidAxis'];\n            var ax = plot.axes;\n            var n, axis;\n            for (n=11; n>0; n--) {\n                axis = an[n-1];\n                if (ax[axis].show) {\n                    dataPos[axis] = ax[axis].series_p2u(gridPos[axis.charAt(0)]);\n                }\n            }\n\n            return {offsets:go, gridPos:gridPos, dataPos:dataPos};\n        }\n        \n        \n        // function to check if event location is over a area area\n        function checkIntersection(gridpos, plot) {\n            var series = plot.series;\n            var i, j, k, s, r, x, y, theta, sm, sa, minang, maxang;\n            var d0, d, p, pp, points, bw, hp;\n            var threshold, t;\n            for (k=plot.seriesStack.length-1; k>=0; k--) {\n                i = plot.seriesStack[k];\n                s = series[i];\n                hp = s._highlightThreshold;\n                switch (s.renderer.constructor) {\n                    case $.jqplot.BarRenderer:\n                        x = gridpos.x;\n                        y = gridpos.y;\n                        for (j=0; j<s._barPoints.length; j++) {\n                            points = s._barPoints[j];\n                            p = s.gridData[j];\n                            if (x>points[0][0] && x<points[2][0] && (y>points[2][1] && y<points[0][1] || y<points[2][1] && y>points[0][1])) {\n                                return {seriesIndex:s.index, pointIndex:j, gridData:p, data:s.data[j], points:s._barPoints[j]};\n                            }\n                        }\n                        break;\n                    case $.jqplot.PyramidRenderer:\n                        x = gridpos.x;\n                        y = gridpos.y;\n                        for (j=0; j<s._barPoints.length; j++) {\n                            points = s._barPoints[j];\n                            p = s.gridData[j];\n                            if (x > points[0][0] + hp[0][0] && x < points[2][0] + hp[2][0] && y > points[2][1] && y < points[0][1]) {\n                                return {seriesIndex:s.index, pointIndex:j, gridData:p, data:s.data[j], points:s._barPoints[j]};\n                            }\n                        }\n                        break;\n                    \n                    case $.jqplot.DonutRenderer:\n                        sa = s.startAngle/180*Math.PI;\n                        x = gridpos.x - s._center[0];\n                        y = gridpos.y - s._center[1];\n                        r = Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2));\n                        if (x > 0 && -y >= 0) {\n                            theta = 2*Math.PI - Math.atan(-y/x);\n                        }\n                        else if (x > 0 && -y < 0) {\n                            theta = -Math.atan(-y/x);\n                        }\n                        else if (x < 0) {\n                            theta = Math.PI - Math.atan(-y/x);\n                        }\n                        else if (x == 0 && -y > 0) {\n                            theta = 3*Math.PI/2;\n                        }\n                        else if (x == 0 && -y < 0) {\n                            theta = Math.PI/2;\n                        }\n                        else if (x == 0 && y == 0) {\n                            theta = 0;\n                        }\n                        if (sa) {\n                            theta -= sa;\n                            if (theta < 0) {\n                                theta += 2*Math.PI;\n                            }\n                            else if (theta > 2*Math.PI) {\n                                theta -= 2*Math.PI;\n                            }\n                        }\n            \n                        sm = s.sliceMargin/180*Math.PI;\n                        if (r < s._radius && r > s._innerRadius) {\n                            for (j=0; j<s.gridData.length; j++) {\n                                minang = (j>0) ? s.gridData[j-1][1]+sm : sm;\n                                maxang = s.gridData[j][1];\n                                if (theta > minang && theta < maxang) {\n                                    return {seriesIndex:s.index, pointIndex:j, gridData:[gridpos.x,gridpos.y], data:s.data[j]};\n                                }\n                            }\n                        }\n                        break;\n                        \n                    case $.jqplot.PieRenderer:\n                        sa = s.startAngle/180*Math.PI;\n                        x = gridpos.x - s._center[0];\n                        y = gridpos.y - s._center[1];\n                        r = Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2));\n                        if (x > 0 && -y >= 0) {\n                            theta = 2*Math.PI - Math.atan(-y/x);\n                        }\n                        else if (x > 0 && -y < 0) {\n                            theta = -Math.atan(-y/x);\n                        }\n                        else if (x < 0) {\n                            theta = Math.PI - Math.atan(-y/x);\n                        }\n                        else if (x == 0 && -y > 0) {\n                            theta = 3*Math.PI/2;\n                        }\n                        else if (x == 0 && -y < 0) {\n                            theta = Math.PI/2;\n                        }\n                        else if (x == 0 && y == 0) {\n                            theta = 0;\n                        }\n                        if (sa) {\n                            theta -= sa;\n                            if (theta < 0) {\n                                theta += 2*Math.PI;\n                            }\n                            else if (theta > 2*Math.PI) {\n                                theta -= 2*Math.PI;\n                            }\n                        }\n            \n                        sm = s.sliceMargin/180*Math.PI;\n                        if (r < s._radius) {\n                            for (j=0; j<s.gridData.length; j++) {\n                                minang = (j>0) ? s.gridData[j-1][1]+sm : sm;\n                                maxang = s.gridData[j][1];\n                                if (theta > minang && theta < maxang) {\n                                    return {seriesIndex:s.index, pointIndex:j, gridData:[gridpos.x,gridpos.y], data:s.data[j]};\n                                }\n                            }\n                        }\n                        break;\n                        \n                    case $.jqplot.BubbleRenderer:\n                        x = gridpos.x;\n                        y = gridpos.y;\n                        var ret = null;\n                        \n                        if (s.show) {\n                            for (var j=0; j<s.gridData.length; j++) {\n                                p = s.gridData[j];\n                                d = Math.sqrt( (x-p[0]) * (x-p[0]) + (y-p[1]) * (y-p[1]) );\n                                if (d <= p[2] && (d <= d0 || d0 == null)) {\n                                   d0 = d;\n                                   ret = {seriesIndex: i, pointIndex:j, gridData:p, data:s.data[j]};\n                                }\n                            }\n                            if (ret != null) {\n                                return ret;\n                            }\n                        }\n                        break;\n                        \n                    case $.jqplot.FunnelRenderer:\n                        x = gridpos.x;\n                        y = gridpos.y;\n                        var v = s._vertices,\n                            vfirst = v[0],\n                            vlast = v[v.length-1],\n                            lex,\n                            rex,\n                            cv;\n    \n                        // equations of right and left sides, returns x, y values given height of section (y value and 2 points)\n    \n                        function findedge (l, p1 , p2) {\n                            var m = (p1[1] - p2[1])/(p1[0] - p2[0]);\n                            var b = p1[1] - m*p1[0];\n                            var y = l + p1[1];\n        \n                            return [(y - b)/m, y];\n                        }\n    \n                        // check each section\n                        lex = findedge(y, vfirst[0], vlast[3]);\n                        rex = findedge(y, vfirst[1], vlast[2]);\n                        for (j=0; j<v.length; j++) {\n                            cv = v[j];\n                            if (y >= cv[0][1] && y <= cv[3][1] && x >= lex[0] && x <= rex[0]) {\n                                return {seriesIndex:s.index, pointIndex:j, gridData:null, data:s.data[j]};\n                            }\n                        }         \n                        break;           \n                    \n                    case $.jqplot.LineRenderer:\n                        x = gridpos.x;\n                        y = gridpos.y;\n                        r = s.renderer;\n                        if (s.show) {\n                            if ((s.fill || (s.renderer.bands.show && s.renderer.bands.fill)) && (!plot.plugins.highlighter || !plot.plugins.highlighter.show)) {\n                                // first check if it is in bounding box\n                                var inside = false;\n                                if (x>s._boundingBox[0][0] && x<s._boundingBox[1][0] && y>s._boundingBox[1][1] && y<s._boundingBox[0][1]) { \n                                    // now check the crossing number   \n                                    \n                                    var numPoints = s._areaPoints.length;\n                                    var ii;\n                                    var j = numPoints-1;\n\n                                    for(var ii=0; ii < numPoints; ii++) { \n                                        var vertex1 = [s._areaPoints[ii][0], s._areaPoints[ii][1]];\n                                        var vertex2 = [s._areaPoints[j][0], s._areaPoints[j][1]];\n\n                                        if (vertex1[1] < y && vertex2[1] >= y || vertex2[1] < y && vertex1[1] >= y)     {\n                                            if (vertex1[0] + (y - vertex1[1]) / (vertex2[1] - vertex1[1]) * (vertex2[0] - vertex1[0]) < x) {\n                                                inside = !inside;\n                                            }\n                                        }\n\n                                        j = ii;\n                                    }        \n                                }\n                                if (inside) {\n                                    return {seriesIndex:i, pointIndex:null, gridData:s.gridData, data:s.data, points:s._areaPoints};\n                                }\n                                break;\n                                \n                            }\n\n                            else {\n                                t = s.markerRenderer.size/2+s.neighborThreshold;\n                                threshold = (t > 0) ? t : 0;\n                                for (var j=0; j<s.gridData.length; j++) {\n                                    p = s.gridData[j];\n                                    // neighbor looks different to OHLC chart.\n                                    if (r.constructor == $.jqplot.OHLCRenderer) {\n                                        if (r.candleStick) {\n                                            var yp = s._yaxis.series_u2p;\n                                            if (x >= p[0]-r._bodyWidth/2 && x <= p[0]+r._bodyWidth/2 && y >= yp(s.data[j][2]) && y <= yp(s.data[j][3])) {\n                                                return {seriesIndex: i, pointIndex:j, gridData:p, data:s.data[j]};\n                                            }\n                                        }\n                                        // if an open hi low close chart\n                                        else if (!r.hlc){\n                                            var yp = s._yaxis.series_u2p;\n                                            if (x >= p[0]-r._tickLength && x <= p[0]+r._tickLength && y >= yp(s.data[j][2]) && y <= yp(s.data[j][3])) {\n                                                return {seriesIndex: i, pointIndex:j, gridData:p, data:s.data[j]};\n                                            }\n                                        }\n                                        // a hi low close chart\n                                        else {\n                                            var yp = s._yaxis.series_u2p;\n                                            if (x >= p[0]-r._tickLength && x <= p[0]+r._tickLength && y >= yp(s.data[j][1]) && y <= yp(s.data[j][2])) {\n                                                return {seriesIndex: i, pointIndex:j, gridData:p, data:s.data[j]};\n                                            }\n                                        }\n                            \n                                    }\n                                    else if (p[0] != null && p[1] != null){\n                                        d = Math.sqrt( (x-p[0]) * (x-p[0]) + (y-p[1]) * (y-p[1]) );\n                                        if (d <= threshold && (d <= d0 || d0 == null)) {\n                                           d0 = d;\n                                           return {seriesIndex: i, pointIndex:j, gridData:p, data:s.data[j]};\n                                        }\n                                    }\n                                } \n                            }\n                        }\n                        break;\n                        \n                    default:\n                        x = gridpos.x;\n                        y = gridpos.y;\n                        r = s.renderer;\n                        if (s.show) {\n                            t = s.markerRenderer.size/2+s.neighborThreshold;\n                            threshold = (t > 0) ? t : 0;\n                            for (var j=0; j<s.gridData.length; j++) {\n                                p = s.gridData[j];\n                                // neighbor looks different to OHLC chart.\n                                if (r.constructor == $.jqplot.OHLCRenderer) {\n                                    if (r.candleStick) {\n                                        var yp = s._yaxis.series_u2p;\n                                        if (x >= p[0]-r._bodyWidth/2 && x <= p[0]+r._bodyWidth/2 && y >= yp(s.data[j][2]) && y <= yp(s.data[j][3])) {\n                                            return {seriesIndex: i, pointIndex:j, gridData:p, data:s.data[j]};\n                                        }\n                                    }\n                                    // if an open hi low close chart\n                                    else if (!r.hlc){\n                                        var yp = s._yaxis.series_u2p;\n                                        if (x >= p[0]-r._tickLength && x <= p[0]+r._tickLength && y >= yp(s.data[j][2]) && y <= yp(s.data[j][3])) {\n                                            return {seriesIndex: i, pointIndex:j, gridData:p, data:s.data[j]};\n                                        }\n                                    }\n                                    // a hi low close chart\n                                    else {\n                                        var yp = s._yaxis.series_u2p;\n                                        if (x >= p[0]-r._tickLength && x <= p[0]+r._tickLength && y >= yp(s.data[j][1]) && y <= yp(s.data[j][2])) {\n                                            return {seriesIndex: i, pointIndex:j, gridData:p, data:s.data[j]};\n                                        }\n                                    }\n                            \n                                }\n                                else {\n                                    d = Math.sqrt( (x-p[0]) * (x-p[0]) + (y-p[1]) * (y-p[1]) );\n                                    if (d <= threshold && (d <= d0 || d0 == null)) {\n                                       d0 = d;\n                                       return {seriesIndex: i, pointIndex:j, gridData:p, data:s.data[j]};\n                                    }\n                                }\n                            } \n                        }\n                        break;\n                }\n            }\n            \n            return null;\n        }\n        \n        \n        \n        this.onClick = function(ev) {\n            // Event passed in is normalized and will have data attribute.\n            // Event passed out is unnormalized.\n            var positions = getEventPosition(ev);\n            var p = ev.data.plot;\n            var neighbor = checkIntersection(positions.gridPos, p);\n            var evt = $.Event('jqplotClick');\n            evt.pageX = ev.pageX;\n            evt.pageY = ev.pageY;\n            $(this).trigger(evt, [positions.gridPos, positions.dataPos, neighbor, p]);\n        };\n        \n        this.onDblClick = function(ev) {\n            // Event passed in is normalized and will have data attribute.\n            // Event passed out is unnormalized.\n            var positions = getEventPosition(ev);\n            var p = ev.data.plot;\n            var neighbor = checkIntersection(positions.gridPos, p);\n            var evt = $.Event('jqplotDblClick');\n            evt.pageX = ev.pageX;\n            evt.pageY = ev.pageY;\n            $(this).trigger(evt, [positions.gridPos, positions.dataPos, neighbor, p]);\n        };\n        \n        this.onMouseDown = function(ev) {\n            var positions = getEventPosition(ev);\n            var p = ev.data.plot;\n            var neighbor = checkIntersection(positions.gridPos, p);\n            var evt = $.Event('jqplotMouseDown');\n            evt.pageX = ev.pageX;\n            evt.pageY = ev.pageY;\n            $(this).trigger(evt, [positions.gridPos, positions.dataPos, neighbor, p]);\n        };\n        \n        this.onMouseUp = function(ev) {\n            var positions = getEventPosition(ev);\n            var evt = $.Event('jqplotMouseUp');\n            evt.pageX = ev.pageX;\n            evt.pageY = ev.pageY;\n            $(this).trigger(evt, [positions.gridPos, positions.dataPos, null, ev.data.plot]);\n        };\n        \n        this.onRightClick = function(ev) {\n            var positions = getEventPosition(ev);\n            var p = ev.data.plot;\n            var neighbor = checkIntersection(positions.gridPos, p);\n            if (p.captureRightClick) {\n                if (ev.which == 3) {\n                var evt = $.Event('jqplotRightClick');\n                evt.pageX = ev.pageX;\n                evt.pageY = ev.pageY;\n                    $(this).trigger(evt, [positions.gridPos, positions.dataPos, neighbor, p]);\n                }\n                else {\n                var evt = $.Event('jqplotMouseUp');\n                evt.pageX = ev.pageX;\n                evt.pageY = ev.pageY;\n                    $(this).trigger(evt, [positions.gridPos, positions.dataPos, neighbor, p]);\n                }\n            }\n        };\n        \n        this.onMouseMove = function(ev) {\n            var positions = getEventPosition(ev);\n            var p = ev.data.plot;\n            var neighbor = checkIntersection(positions.gridPos, p);\n            var evt = $.Event('jqplotMouseMove');\n            evt.pageX = ev.pageX;\n            evt.pageY = ev.pageY;\n            $(this).trigger(evt, [positions.gridPos, positions.dataPos, neighbor, p]);\n        };\n        \n        this.onMouseEnter = function(ev) {\n            var positions = getEventPosition(ev);\n            var p = ev.data.plot;\n            var evt = $.Event('jqplotMouseEnter');\n            evt.pageX = ev.pageX;\n            evt.pageY = ev.pageY;\n            evt.relatedTarget = ev.relatedTarget;\n            $(this).trigger(evt, [positions.gridPos, positions.dataPos, null, p]);\n        };\n        \n        this.onMouseLeave = function(ev) {\n            var positions = getEventPosition(ev);\n            var p = ev.data.plot;\n            var evt = $.Event('jqplotMouseLeave');\n            evt.pageX = ev.pageX;\n            evt.pageY = ev.pageY;\n            evt.relatedTarget = ev.relatedTarget;\n            $(this).trigger(evt, [positions.gridPos, positions.dataPos, null, p]);\n        };\n        \n        // method: drawSeries\n        // Redraws all or just one series on the plot.  No axis scaling\n        // is performed and no other elements on the plot are redrawn.\n        // options is an options object to pass on to the series renderers.\n        // It can be an empty object {}.  idx is the series index\n        // to redraw if only one series is to be redrawn.\n        this.drawSeries = function(options, idx){\n            var i, series, ctx;\n            // if only one argument passed in and it is a number, use it ad idx.\n            idx = (typeof(options) === \"number\" && idx == null) ? options : idx;\n            options = (typeof(options) === \"object\") ? options : {};\n            // draw specified series\n            if (idx != undefined) {\n                series = this.series[idx];\n                ctx = series.shadowCanvas._ctx;\n                ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height);\n                series.drawShadow(ctx, options, this);\n                ctx = series.canvas._ctx;\n                ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height);\n                series.draw(ctx, options, this);\n                if (series.renderer.constructor == $.jqplot.BezierCurveRenderer) {\n                    if (idx < this.series.length - 1) {\n                        this.drawSeries(idx+1); \n                    }\n                }\n            }\n            \n            else {\n                // if call series drawShadow method first, in case all series shadows\n                // should be drawn before any series.  This will ensure, like for \n                // stacked bar plots, that shadows don't overlap series.\n                for (i=0; i<this.series.length; i++) {\n                    // first clear the canvas\n                    series = this.series[i];\n                    ctx = series.shadowCanvas._ctx;\n                    ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height);\n                    series.drawShadow(ctx, options, this);\n                    ctx = series.canvas._ctx;\n                    ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height);\n                    series.draw(ctx, options, this);\n                }\n            }\n            options = idx = i = series = ctx = null;\n        };\n        \n        // method: moveSeriesToFront\n        // This method requires jQuery 1.4+\n        // Moves the specified series canvas in front of all other series canvases.\n        // This effectively \"draws\" the specified series on top of all other series,\n        // although it is performed through DOM manipulation, no redrawing is performed.\n        //\n        // Parameters:\n        // idx - 0 based index of the series to move.  This will be the index of the series\n        // as it was first passed into the jqplot function.\n        this.moveSeriesToFront = function (idx) { \n            idx = parseInt(idx, 10);\n            var stackIndex = $.inArray(idx, this.seriesStack);\n            // if already in front, return\n            if (stackIndex == -1) {\n                return;\n            }\n            if (stackIndex == this.seriesStack.length -1) {\n                this.previousSeriesStack = this.seriesStack.slice(0);\n                return;\n            }\n            var opidx = this.seriesStack[this.seriesStack.length -1];\n            var serelem = this.series[idx].canvas._elem.detach();\n            var shadelem = this.series[idx].shadowCanvas._elem.detach();\n            this.series[opidx].shadowCanvas._elem.after(shadelem);\n            this.series[opidx].canvas._elem.after(serelem);\n            this.previousSeriesStack = this.seriesStack.slice(0);\n            this.seriesStack.splice(stackIndex, 1);\n            this.seriesStack.push(idx);\n        };\n        \n        // method: moveSeriesToBack\n        // This method requires jQuery 1.4+\n        // Moves the specified series canvas behind all other series canvases.\n        //\n        // Parameters:\n        // idx - 0 based index of the series to move.  This will be the index of the series\n        // as it was first passed into the jqplot function.\n        this.moveSeriesToBack = function (idx) {\n            idx = parseInt(idx, 10);\n            var stackIndex = $.inArray(idx, this.seriesStack);\n            // if already in back, return\n            if (stackIndex == 0 || stackIndex == -1) {\n                return;\n            }\n            var opidx = this.seriesStack[0];\n            var serelem = this.series[idx].canvas._elem.detach();\n            var shadelem = this.series[idx].shadowCanvas._elem.detach();\n            this.series[opidx].shadowCanvas._elem.before(shadelem);\n            this.series[opidx].canvas._elem.before(serelem);\n            this.previousSeriesStack = this.seriesStack.slice(0);\n            this.seriesStack.splice(stackIndex, 1);\n            this.seriesStack.unshift(idx);\n        };\n        \n        // method: restorePreviousSeriesOrder\n        // This method requires jQuery 1.4+\n        // Restore the series canvas order to its previous state.\n        // Useful to put a series back where it belongs after moving\n        // it to the front.\n        this.restorePreviousSeriesOrder = function () {\n            var i, j, serelem, shadelem, temp, move, keep;\n            // if no change, return.\n            if (this.seriesStack == this.previousSeriesStack) {\n                return;\n            }\n            for (i=1; i<this.previousSeriesStack.length; i++) {\n                move = this.previousSeriesStack[i];\n                keep = this.previousSeriesStack[i-1];\n                serelem = this.series[move].canvas._elem.detach();\n                shadelem = this.series[move].shadowCanvas._elem.detach();\n                this.series[keep].shadowCanvas._elem.after(shadelem);\n                this.series[keep].canvas._elem.after(serelem);\n            }\n            temp = this.seriesStack.slice(0);\n            this.seriesStack = this.previousSeriesStack.slice(0);\n            this.previousSeriesStack = temp;\n        };\n        \n        // method: restoreOriginalSeriesOrder\n        // This method requires jQuery 1.4+\n        // Restore the series canvas order to its original order\n        // when the plot was created.\n        this.restoreOriginalSeriesOrder = function () {\n            var i, j, arr=[], serelem, shadelem;\n            for (i=0; i<this.series.length; i++) {\n                arr.push(i);\n            }\n            if (this.seriesStack == arr) {\n                return;\n            }\n            this.previousSeriesStack = this.seriesStack.slice(0);\n            this.seriesStack = arr;\n            for (i=1; i<this.seriesStack.length; i++) {\n                serelem = this.series[i].canvas._elem.detach();\n                shadelem = this.series[i].shadowCanvas._elem.detach();\n                this.series[i-1].shadowCanvas._elem.after(shadelem);\n                this.series[i-1].canvas._elem.after(serelem);\n            }\n        };\n        \n        this.activateTheme = function (name) {\n            this.themeEngine.activate(this, name);\n        };\n    }\n    \n    \n    // conpute a highlight color or array of highlight colors from given colors.\n    $.jqplot.computeHighlightColors  = function(colors) {\n        var ret;\n        if ($.isArray(colors)) {\n            ret = [];\n            for (var i=0; i<colors.length; i++){\n                var rgba = $.jqplot.getColorComponents(colors[i]);\n                var newrgb = [rgba[0], rgba[1], rgba[2]];\n                var sum = newrgb[0] + newrgb[1] + newrgb[2];\n                for (var j=0; j<3; j++) {\n                    // when darkening, lowest color component can be is 60.\n                    newrgb[j] = (sum > 660) ?  newrgb[j] * 0.85 : 0.73 * newrgb[j] + 90;\n                    newrgb[j] = parseInt(newrgb[j], 10);\n                    (newrgb[j] > 255) ? 255 : newrgb[j];\n                }\n                // newrgb[3] = (rgba[3] > 0.4) ? rgba[3] * 0.4 : rgba[3] * 1.5;\n                // newrgb[3] = (rgba[3] > 0.5) ? 0.8 * rgba[3] - .1 : rgba[3] + 0.2;\n                newrgb[3] = 0.3 + 0.35 * rgba[3];\n                ret.push('rgba('+newrgb[0]+','+newrgb[1]+','+newrgb[2]+','+newrgb[3]+')');\n            }\n        }\n        else {\n            var rgba = $.jqplot.getColorComponents(colors);\n            var newrgb = [rgba[0], rgba[1], rgba[2]];\n            var sum = newrgb[0] + newrgb[1] + newrgb[2];\n            for (var j=0; j<3; j++) {\n                // when darkening, lowest color component can be is 60.\n                // newrgb[j] = (sum > 570) ?  newrgb[j] * 0.8 : newrgb[j] + 0.3 * (255 - newrgb[j]);\n                // newrgb[j] = parseInt(newrgb[j], 10);\n                newrgb[j] = (sum > 660) ?  newrgb[j] * 0.85 : 0.73 * newrgb[j] + 90;\n                newrgb[j] = parseInt(newrgb[j], 10);\n                (newrgb[j] > 255) ? 255 : newrgb[j];\n            }\n            // newrgb[3] = (rgba[3] > 0.4) ? rgba[3] * 0.4 : rgba[3] * 1.5;\n            // newrgb[3] = (rgba[3] > 0.5) ? 0.8 * rgba[3] - .1 : rgba[3] + 0.2;\n            newrgb[3] = 0.3 + 0.35 * rgba[3];\n            ret = 'rgba('+newrgb[0]+','+newrgb[1]+','+newrgb[2]+','+newrgb[3]+')';\n        }\n        return ret;\n    };\n        \n   $.jqplot.ColorGenerator = function(colors) {\n        colors = colors || $.jqplot.config.defaultColors;\n        var idx = 0;\n        \n        this.next = function () { \n            if (idx < colors.length) {\n                return colors[idx++];\n            }\n            else {\n                idx = 0;\n                return colors[idx++];\n            }\n        };\n        \n        this.previous = function () { \n            if (idx > 0) {\n                return colors[idx--];\n            }\n            else {\n                idx = colors.length-1;\n                return colors[idx];\n            }\n        };\n        \n        // get a color by index without advancing pointer.\n        this.get = function(i) {\n            var idx = i - colors.length * Math.floor(i/colors.length);\n            return colors[idx];\n        };\n        \n        this.setColors = function(c) {\n            colors = c;\n        };\n        \n        this.reset = function() {\n            idx = 0;\n        };\n\n        this.getIndex = function() {\n            return idx;\n        };\n\n        this.setIndex = function(index) {\n            idx = index;\n        };\n    };\n\n    // convert a hex color string to rgb string.\n    // h - 3 or 6 character hex string, with or without leading #\n    // a - optional alpha\n    $.jqplot.hex2rgb = function(h, a) {\n        h = h.replace('#', '');\n        if (h.length == 3) {\n            h = h.charAt(0)+h.charAt(0)+h.charAt(1)+h.charAt(1)+h.charAt(2)+h.charAt(2);\n        }\n        var rgb;\n        rgb = 'rgba('+parseInt(h.slice(0,2), 16)+', '+parseInt(h.slice(2,4), 16)+', '+parseInt(h.slice(4,6), 16);\n        if (a) {\n            rgb += ', '+a;\n        }\n        rgb += ')';\n        return rgb;\n    };\n    \n    // convert an rgb color spec to a hex spec.  ignore any alpha specification.\n    $.jqplot.rgb2hex = function(s) {\n        var pat = /rgba?\\( *([0-9]{1,3}\\.?[0-9]*%?) *, *([0-9]{1,3}\\.?[0-9]*%?) *, *([0-9]{1,3}\\.?[0-9]*%?) *(?:, *[0-9.]*)?\\)/;\n        var m = s.match(pat);\n        var h = '#';\n        for (var i=1; i<4; i++) {\n            var temp;\n            if (m[i].search(/%/) != -1) {\n                temp = parseInt(255*m[i]/100, 10).toString(16);\n                if (temp.length == 1) {\n                    temp = '0'+temp;\n                }\n            }\n            else {\n                temp = parseInt(m[i], 10).toString(16);\n                if (temp.length == 1) {\n                    temp = '0'+temp;\n                }\n            }\n            h += temp;\n        }\n        return h;\n    };\n    \n    // given a css color spec, return an rgb css color spec\n    $.jqplot.normalize2rgb = function(s, a) {\n        if (s.search(/^ *rgba?\\(/) != -1) {\n            return s; \n        }\n        else if (s.search(/^ *#?[0-9a-fA-F]?[0-9a-fA-F]/) != -1) {\n            return $.jqplot.hex2rgb(s, a);\n        }\n        else {\n            throw new Error('Invalid color spec');\n        }\n    };\n    \n    // extract the r, g, b, a color components out of a css color spec.\n    $.jqplot.getColorComponents = function(s) {\n        // check to see if a color keyword.\n        s = $.jqplot.colorKeywordMap[s] || s;\n        var rgb = $.jqplot.normalize2rgb(s);\n        var pat = /rgba?\\( *([0-9]{1,3}\\.?[0-9]*%?) *, *([0-9]{1,3}\\.?[0-9]*%?) *, *([0-9]{1,3}\\.?[0-9]*%?) *,? *([0-9.]* *)?\\)/;\n        var m = rgb.match(pat);\n        var ret = [];\n        for (var i=1; i<4; i++) {\n            if (m[i].search(/%/) != -1) {\n                ret[i-1] = parseInt(255*m[i]/100, 10);\n            }\n            else {\n                ret[i-1] = parseInt(m[i], 10);\n            }\n        }\n        ret[3] = parseFloat(m[4]) ? parseFloat(m[4]) : 1.0;\n        return ret;\n    };\n    \n    $.jqplot.colorKeywordMap = {\n        aliceblue: 'rgb(240, 248, 255)',\n        antiquewhite: 'rgb(250, 235, 215)',\n        aqua: 'rgb( 0, 255, 255)',\n        aquamarine: 'rgb(127, 255, 212)',\n        azure: 'rgb(240, 255, 255)',\n        beige: 'rgb(245, 245, 220)',\n        bisque: 'rgb(255, 228, 196)',\n        black: 'rgb( 0, 0, 0)',\n        blanchedalmond: 'rgb(255, 235, 205)',\n        blue: 'rgb( 0, 0, 255)',\n        blueviolet: 'rgb(138, 43, 226)',\n        brown: 'rgb(165, 42, 42)',\n        burlywood: 'rgb(222, 184, 135)',\n        cadetblue: 'rgb( 95, 158, 160)',\n        chartreuse: 'rgb(127, 255, 0)',\n        chocolate: 'rgb(210, 105, 30)',\n        coral: 'rgb(255, 127, 80)',\n        cornflowerblue: 'rgb(100, 149, 237)',\n        cornsilk: 'rgb(255, 248, 220)',\n        crimson: 'rgb(220, 20, 60)',\n        cyan: 'rgb( 0, 255, 255)',\n        darkblue: 'rgb( 0, 0, 139)',\n        darkcyan: 'rgb( 0, 139, 139)',\n        darkgoldenrod: 'rgb(184, 134, 11)',\n        darkgray: 'rgb(169, 169, 169)',\n        darkgreen: 'rgb( 0, 100, 0)',\n        darkgrey: 'rgb(169, 169, 169)',\n        darkkhaki: 'rgb(189, 183, 107)',\n        darkmagenta: 'rgb(139, 0, 139)',\n        darkolivegreen: 'rgb( 85, 107, 47)',\n        darkorange: 'rgb(255, 140, 0)',\n        darkorchid: 'rgb(153, 50, 204)',\n        darkred: 'rgb(139, 0, 0)',\n        darksalmon: 'rgb(233, 150, 122)',\n        darkseagreen: 'rgb(143, 188, 143)',\n        darkslateblue: 'rgb( 72, 61, 139)',\n        darkslategray: 'rgb( 47, 79, 79)',\n        darkslategrey: 'rgb( 47, 79, 79)',\n        darkturquoise: 'rgb( 0, 206, 209)',\n        darkviolet: 'rgb(148, 0, 211)',\n        deeppink: 'rgb(255, 20, 147)',\n        deepskyblue: 'rgb( 0, 191, 255)',\n        dimgray: 'rgb(105, 105, 105)',\n        dimgrey: 'rgb(105, 105, 105)',\n        dodgerblue: 'rgb( 30, 144, 255)',\n        firebrick: 'rgb(178, 34, 34)',\n        floralwhite: 'rgb(255, 250, 240)',\n        forestgreen: 'rgb( 34, 139, 34)',\n        fuchsia: 'rgb(255, 0, 255)',\n        gainsboro: 'rgb(220, 220, 220)',\n        ghostwhite: 'rgb(248, 248, 255)',\n        gold: 'rgb(255, 215, 0)',\n        goldenrod: 'rgb(218, 165, 32)',\n        gray: 'rgb(128, 128, 128)',\n        grey: 'rgb(128, 128, 128)',\n        green: 'rgb( 0, 128, 0)',\n        greenyellow: 'rgb(173, 255, 47)',\n        honeydew: 'rgb(240, 255, 240)',\n        hotpink: 'rgb(255, 105, 180)',\n        indianred: 'rgb(205, 92, 92)',\n        indigo: 'rgb( 75, 0, 130)',\n        ivory: 'rgb(255, 255, 240)',\n        khaki: 'rgb(240, 230, 140)',\n        lavender: 'rgb(230, 230, 250)',\n        lavenderblush: 'rgb(255, 240, 245)',\n        lawngreen: 'rgb(124, 252, 0)',\n        lemonchiffon: 'rgb(255, 250, 205)',\n        lightblue: 'rgb(173, 216, 230)',\n        lightcoral: 'rgb(240, 128, 128)',\n        lightcyan: 'rgb(224, 255, 255)',\n        lightgoldenrodyellow: 'rgb(250, 250, 210)',\n        lightgray: 'rgb(211, 211, 211)',\n        lightgreen: 'rgb(144, 238, 144)',\n        lightgrey: 'rgb(211, 211, 211)',\n        lightpink: 'rgb(255, 182, 193)',\n        lightsalmon: 'rgb(255, 160, 122)',\n        lightseagreen: 'rgb( 32, 178, 170)',\n        lightskyblue: 'rgb(135, 206, 250)',\n        lightslategray: 'rgb(119, 136, 153)',\n        lightslategrey: 'rgb(119, 136, 153)',\n        lightsteelblue: 'rgb(176, 196, 222)',\n        lightyellow: 'rgb(255, 255, 224)',\n        lime: 'rgb( 0, 255, 0)',\n        limegreen: 'rgb( 50, 205, 50)',\n        linen: 'rgb(250, 240, 230)',\n        magenta: 'rgb(255, 0, 255)',\n        maroon: 'rgb(128, 0, 0)',\n        mediumaquamarine: 'rgb(102, 205, 170)',\n        mediumblue: 'rgb( 0, 0, 205)',\n        mediumorchid: 'rgb(186, 85, 211)',\n        mediumpurple: 'rgb(147, 112, 219)',\n        mediumseagreen: 'rgb( 60, 179, 113)',\n        mediumslateblue: 'rgb(123, 104, 238)',\n        mediumspringgreen: 'rgb( 0, 250, 154)',\n        mediumturquoise: 'rgb( 72, 209, 204)',\n        mediumvioletred: 'rgb(199, 21, 133)',\n        midnightblue: 'rgb( 25, 25, 112)',\n        mintcream: 'rgb(245, 255, 250)',\n        mistyrose: 'rgb(255, 228, 225)',\n        moccasin: 'rgb(255, 228, 181)',\n        navajowhite: 'rgb(255, 222, 173)',\n        navy: 'rgb( 0, 0, 128)',\n        oldlace: 'rgb(253, 245, 230)',\n        olive: 'rgb(128, 128, 0)',\n        olivedrab: 'rgb(107, 142, 35)',\n        orange: 'rgb(255, 165, 0)',\n        orangered: 'rgb(255, 69, 0)',\n        orchid: 'rgb(218, 112, 214)',\n        palegoldenrod: 'rgb(238, 232, 170)',\n        palegreen: 'rgb(152, 251, 152)',\n        paleturquoise: 'rgb(175, 238, 238)',\n        palevioletred: 'rgb(219, 112, 147)',\n        papayawhip: 'rgb(255, 239, 213)',\n        peachpuff: 'rgb(255, 218, 185)',\n        peru: 'rgb(205, 133, 63)',\n        pink: 'rgb(255, 192, 203)',\n        plum: 'rgb(221, 160, 221)',\n        powderblue: 'rgb(176, 224, 230)',\n        purple: 'rgb(128, 0, 128)',\n        red: 'rgb(255, 0, 0)',\n        rosybrown: 'rgb(188, 143, 143)',\n        royalblue: 'rgb( 65, 105, 225)',\n        saddlebrown: 'rgb(139, 69, 19)',\n        salmon: 'rgb(250, 128, 114)',\n        sandybrown: 'rgb(244, 164, 96)',\n        seagreen: 'rgb( 46, 139, 87)',\n        seashell: 'rgb(255, 245, 238)',\n        sienna: 'rgb(160, 82, 45)',\n        silver: 'rgb(192, 192, 192)',\n        skyblue: 'rgb(135, 206, 235)',\n        slateblue: 'rgb(106, 90, 205)',\n        slategray: 'rgb(112, 128, 144)',\n        slategrey: 'rgb(112, 128, 144)',\n        snow: 'rgb(255, 250, 250)',\n        springgreen: 'rgb( 0, 255, 127)',\n        steelblue: 'rgb( 70, 130, 180)',\n        tan: 'rgb(210, 180, 140)',\n        teal: 'rgb( 0, 128, 128)',\n        thistle: 'rgb(216, 191, 216)',\n        tomato: 'rgb(255, 99, 71)',\n        turquoise: 'rgb( 64, 224, 208)',\n        violet: 'rgb(238, 130, 238)',\n        wheat: 'rgb(245, 222, 179)',\n        white: 'rgb(255, 255, 255)',\n        whitesmoke: 'rgb(245, 245, 245)',\n        yellow: 'rgb(255, 255, 0)',\n        yellowgreen: 'rgb(154, 205, 50)'\n    };\n\n    \n\n\n    // class: $.jqplot.AxisLabelRenderer\n    // Renderer to place labels on the axes.\n    $.jqplot.AxisLabelRenderer = function(options) {\n        // Group: Properties\n        $.jqplot.ElemContainer.call(this);\n        // name of the axis associated with this tick\n        this.axis;\n        // prop: show\n        // whether or not to show the tick (mark and label).\n        this.show = true;\n        // prop: label\n        // The text or html for the label.\n        this.label = '';\n        this.fontFamily = null;\n        this.fontSize = null;\n        this.textColor = null;\n        this._elem;\n        // prop: escapeHTML\n        // true to escape HTML entities in the label.\n        this.escapeHTML = false;\n        \n        $.extend(true, this, options);\n    };\n    \n    $.jqplot.AxisLabelRenderer.prototype = new $.jqplot.ElemContainer();\n    $.jqplot.AxisLabelRenderer.prototype.constructor = $.jqplot.AxisLabelRenderer;\n    \n    $.jqplot.AxisLabelRenderer.prototype.init = function(options) {\n        $.extend(true, this, options);\n    };\n    \n    $.jqplot.AxisLabelRenderer.prototype.draw = function(ctx, plot) {\n        // Memory Leaks patch\n        if (this._elem) {\n            this._elem.emptyForce();\n            this._elem = null;\n        }\n\n        this._elem = $('<div style=\"position:absolute;\" class=\"jqplot-'+this.axis+'-label\"></div>');\n        \n        if (Number(this.label)) {\n            this._elem.css('white-space', 'nowrap');\n        }\n        \n        if (!this.escapeHTML) {\n            this._elem.html(this.label);\n        }\n        else {\n            this._elem.text(this.label);\n        }\n        if (this.fontFamily) {\n            this._elem.css('font-family', this.fontFamily);\n        }\n        if (this.fontSize) {\n            this._elem.css('font-size', this.fontSize);\n        }\n        if (this.textColor) {\n            this._elem.css('color', this.textColor);\n        }\n        \n        return this._elem;\n    };\n    \n    $.jqplot.AxisLabelRenderer.prototype.pack = function() {\n    };\n\n    // class: $.jqplot.AxisTickRenderer\n    // A \"tick\" object showing the value of a tick/gridline on the plot.\n    $.jqplot.AxisTickRenderer = function(options) {\n        // Group: Properties\n        $.jqplot.ElemContainer.call(this);\n        // prop: mark\n        // tick mark on the axis.  One of 'inside', 'outside', 'cross', '' or null.\n        this.mark = 'outside';\n        // name of the axis associated with this tick\n        this.axis;\n        // prop: showMark\n        // whether or not to show the mark on the axis.\n        this.showMark = true;\n        // prop: showGridline\n        // whether or not to draw the gridline on the grid at this tick.\n        this.showGridline = true;\n        // prop: isMinorTick\n        // if this is a minor tick.\n        this.isMinorTick = false;\n        // prop: size\n        // Length of the tick beyond the grid in pixels.\n        // DEPRECATED: This has been superceeded by markSize\n        this.size = 4;\n        // prop:  markSize\n        // Length of the tick marks in pixels.  For 'cross' style, length\n        // will be stoked above and below axis, so total length will be twice this.\n        this.markSize = 6;\n        // prop: show\n        // whether or not to show the tick (mark and label).\n        // Setting this to false requires more testing.  It is recommended\n        // to set showLabel and showMark to false instead.\n        this.show = true;\n        // prop: showLabel\n        // whether or not to show the label.\n        this.showLabel = true;\n        this.label = null;\n        this.value = null;\n        this._styles = {};\n        // prop: formatter\n        // A class of a formatter for the tick text.  sprintf by default.\n        this.formatter = $.jqplot.DefaultTickFormatter;\n        // prop: prefix\n        // String to prepend to the tick label.\n        // Prefix is prepended to the formatted tick label.\n        this.prefix = '';\n        // prop: suffix\n        // String to append to the tick label.\n        // Suffix is appended to the formatted tick label.\n        this.suffix = '';\n        // prop: formatString\n        // string passed to the formatter.\n        this.formatString = '';\n        // prop: fontFamily\n        // css spec for the font-family css attribute.\n        this.fontFamily;\n        // prop: fontSize\n        // css spec for the font-size css attribute.\n        this.fontSize;\n        // prop: textColor\n        // css spec for the color attribute.\n        this.textColor;\n        // prop: escapeHTML\n        // true to escape HTML entities in the label.\n        this.escapeHTML = false;\n        this._elem;\n        this._breakTick = false;\n        \n        $.extend(true, this, options);\n    };\n    \n    $.jqplot.AxisTickRenderer.prototype.init = function(options) {\n        $.extend(true, this, options);\n    };\n    \n    $.jqplot.AxisTickRenderer.prototype = new $.jqplot.ElemContainer();\n    $.jqplot.AxisTickRenderer.prototype.constructor = $.jqplot.AxisTickRenderer;\n    \n    $.jqplot.AxisTickRenderer.prototype.setTick = function(value, axisName, isMinor) {\n        this.value = value;\n        this.axis = axisName;\n        if (isMinor) {\n            this.isMinorTick = true;\n        }\n        return this;\n    };\n    \n    $.jqplot.AxisTickRenderer.prototype.draw = function() {\n        if (this.label === null) {\n            this.label = this.prefix + this.formatter(this.formatString, this.value) + this.suffix;\n        }\n        var style = {position: 'absolute'};\n        if (Number(this.label)) {\n            style['whitSpace'] = 'nowrap';\n        }\n        \n        // Memory Leaks patch\n        if (this._elem) {\n            this._elem.emptyForce();\n            this._elem = null;\n        }\n\n        this._elem = $(document.createElement('div'));\n        this._elem.addClass(\"jqplot-\"+this.axis+\"-tick\");\n        \n        if (!this.escapeHTML) {\n            this._elem.html(this.label);\n        }\n        else {\n            this._elem.text(this.label);\n        }\n        \n        this._elem.css(style);\n\n        for (var s in this._styles) {\n            this._elem.css(s, this._styles[s]);\n        }\n        if (this.fontFamily) {\n            this._elem.css('font-family', this.fontFamily);\n        }\n        if (this.fontSize) {\n            this._elem.css('font-size', this.fontSize);\n        }\n        if (this.textColor) {\n            this._elem.css('color', this.textColor);\n        }\n        if (this._breakTick) {\n          this._elem.addClass('jqplot-breakTick');\n        }\n        \n        return this._elem;\n    };\n        \n    $.jqplot.DefaultTickFormatter = function (format, val) {\n        if (typeof val == 'number') {\n            if (!format) {\n                format = $.jqplot.config.defaultTickFormatString;\n            }\n            return $.jqplot.sprintf(format, val);\n        }\n        else {\n            return String(val);\n        }\n    };\n        \n    $.jqplot.PercentTickFormatter = function (format, val) {\n        if (typeof val == 'number') {\n            val = 100 * val;\n            if (!format) {\n                format = $.jqplot.config.defaultTickFormatString;\n            }\n            return $.jqplot.sprintf(format, val);\n        }\n        else {\n            return String(val);\n        }\n    };\n    \n    $.jqplot.AxisTickRenderer.prototype.pack = function() {\n    };\n     \n    // Class: $.jqplot.CanvasGridRenderer\n    // The default jqPlot grid renderer, creating a grid on a canvas element.\n    // The renderer has no additional options beyond the <Grid> class.\n    $.jqplot.CanvasGridRenderer = function(){\n        this.shadowRenderer = new $.jqplot.ShadowRenderer();\n    };\n    \n    // called with context of Grid object\n    $.jqplot.CanvasGridRenderer.prototype.init = function(options) {\n        this._ctx;\n        $.extend(true, this, options);\n        // set the shadow renderer options\n        var sopts = {lineJoin:'miter', lineCap:'round', fill:false, isarc:false, angle:this.shadowAngle, offset:this.shadowOffset, alpha:this.shadowAlpha, depth:this.shadowDepth, lineWidth:this.shadowWidth, closePath:false, strokeStyle:this.shadowColor};\n        this.renderer.shadowRenderer.init(sopts);\n    };\n    \n    // called with context of Grid.\n    $.jqplot.CanvasGridRenderer.prototype.createElement = function(plot) {\n        var elem;\n        // Memory Leaks patch\n        if (this._elem) {\n          if ($.jqplot.use_excanvas && window.G_vmlCanvasManager.uninitElement !== undefined) {\n            elem = this._elem.get(0);\n            window.G_vmlCanvasManager.uninitElement(elem);\n            elem = null;\n          }\n          \n          this._elem.emptyForce();\n          this._elem = null;\n        }\n      \n        elem = plot.canvasManager.getCanvas();\n\n        var w = this._plotDimensions.width;\n        var h = this._plotDimensions.height;\n        elem.width = w;\n        elem.height = h;\n        this._elem = $(elem);\n        this._elem.addClass('jqplot-grid-canvas');\n        this._elem.css({ position: 'absolute', left: 0, top: 0 });\n        \n        elem = plot.canvasManager.initCanvas(elem);\n\n        this._top = this._offsets.top;\n        this._bottom = h - this._offsets.bottom;\n        this._left = this._offsets.left;\n        this._right = w - this._offsets.right;\n        this._width = this._right - this._left;\n        this._height = this._bottom - this._top;\n        // avoid memory leak\n        elem = null;\n        return this._elem;\n    };\n    \n    $.jqplot.CanvasGridRenderer.prototype.draw = function() {\n        this._ctx = this._elem.get(0).getContext(\"2d\");\n        var ctx = this._ctx;\n        var axes = this._axes;\n        // Add the grid onto the grid canvas.  This is the bottom most layer.\n        ctx.save();\n        ctx.clearRect(0, 0, this._plotDimensions.width, this._plotDimensions.height);\n        ctx.fillStyle = this.backgroundColor || this.background;\n        ctx.fillRect(this._left, this._top, this._width, this._height);\n        \n        ctx.save();\n        ctx.lineJoin = 'miter';\n        ctx.lineCap = 'butt';\n        ctx.lineWidth = this.gridLineWidth;\n        ctx.strokeStyle = this.gridLineColor;\n        var b, e, s, m;\n        var ax = ['xaxis', 'yaxis', 'x2axis', 'y2axis'];\n        for (var i=4; i>0; i--) {\n            var name = ax[i-1];\n            var axis = axes[name];\n            var ticks = axis._ticks;\n            var numticks = ticks.length;\n            if (axis.show) {\n                if (axis.drawBaseline) {\n                    var bopts = {};\n                    if (axis.baselineWidth !== null) {\n                        bopts.lineWidth = axis.baselineWidth;\n                    }\n                    if (axis.baselineColor !== null) {\n                        bopts.strokeStyle = axis.baselineColor;\n                    }\n                    switch (name) {\n                        case 'xaxis':\n                            drawLine (this._left, this._bottom, this._right, this._bottom, bopts);\n                            break;\n                        case 'yaxis':\n                            drawLine (this._left, this._bottom, this._left, this._top, bopts);\n                            break;\n                        case 'x2axis':\n                            drawLine (this._left, this._bottom, this._right, this._bottom, bopts);\n                            break;\n                        case 'y2axis':\n                            drawLine (this._right, this._bottom, this._right, this._top, bopts);\n                            break;\n                    }\n                }\n                for (var j=numticks; j>0; j--) {\n                    var t = ticks[j-1];\n                    if (t.show) {\n                        var pos = Math.round(axis.u2p(t.value)) + 0.5;\n                        switch (name) {\n                            case 'xaxis':\n                                // draw the grid line if we should\n                                if (t.showGridline && this.drawGridlines && ((!t.isMinorTick && axis.drawMajorGridlines) || (t.isMinorTick && axis.drawMinorGridlines)) ) {\n                                    drawLine(pos, this._top, pos, this._bottom);\n                                }\n                                // draw the mark\n                                if (t.showMark && t.mark && ((!t.isMinorTick && axis.drawMajorTickMarks) || (t.isMinorTick && axis.drawMinorTickMarks)) ) {\n                                    s = t.markSize;\n                                    m = t.mark;\n                                    var pos = Math.round(axis.u2p(t.value)) + 0.5;\n                                    switch (m) {\n                                        case 'outside':\n                                            b = this._bottom;\n                                            e = this._bottom+s;\n                                            break;\n                                        case 'inside':\n                                            b = this._bottom-s;\n                                            e = this._bottom;\n                                            break;\n                                        case 'cross':\n                                            b = this._bottom-s;\n                                            e = this._bottom+s;\n                                            break;\n                                        default:\n                                            b = this._bottom;\n                                            e = this._bottom+s;\n                                            break;\n                                    }\n                                    // draw the shadow\n                                    if (this.shadow) {\n                                        this.renderer.shadowRenderer.draw(ctx, [[pos,b],[pos,e]], {lineCap:'butt', lineWidth:this.gridLineWidth, offset:this.gridLineWidth*0.75, depth:2, fill:false, closePath:false});\n                                    }\n                                    // draw the line\n                                    drawLine(pos, b, pos, e);\n                                }\n                                break;\n                            case 'yaxis':\n                                // draw the grid line\n                                if (t.showGridline && this.drawGridlines && ((!t.isMinorTick && axis.drawMajorGridlines) || (t.isMinorTick && axis.drawMinorGridlines)) ) {\n                                    drawLine(this._right, pos, this._left, pos);\n                                }\n                                // draw the mark\n                                if (t.showMark && t.mark && ((!t.isMinorTick && axis.drawMajorTickMarks) || (t.isMinorTick && axis.drawMinorTickMarks)) ) {\n                                    s = t.markSize;\n                                    m = t.mark;\n                                    var pos = Math.round(axis.u2p(t.value)) + 0.5;\n                                    switch (m) {\n                                        case 'outside':\n                                            b = this._left-s;\n                                            e = this._left;\n                                            break;\n                                        case 'inside':\n                                            b = this._left;\n                                            e = this._left+s;\n                                            break;\n                                        case 'cross':\n                                            b = this._left-s;\n                                            e = this._left+s;\n                                            break;\n                                        default:\n                                            b = this._left-s;\n                                            e = this._left;\n                                            break;\n                                            }\n                                    // draw the shadow\n                                    if (this.shadow) {\n                                        this.renderer.shadowRenderer.draw(ctx, [[b, pos], [e, pos]], {lineCap:'butt', lineWidth:this.gridLineWidth*1.5, offset:this.gridLineWidth*0.75, fill:false, closePath:false});\n                                    }\n                                    drawLine(b, pos, e, pos, {strokeStyle:axis.borderColor});\n                                }\n                                break;\n                            case 'x2axis':\n                                // draw the grid line\n                                if (t.showGridline && this.drawGridlines && ((!t.isMinorTick && axis.drawMajorGridlines) || (t.isMinorTick && axis.drawMinorGridlines)) ) {\n                                    drawLine(pos, this._bottom, pos, this._top);\n                                }\n                                // draw the mark\n                                if (t.showMark && t.mark && ((!t.isMinorTick && axis.drawMajorTickMarks) || (t.isMinorTick && axis.drawMinorTickMarks)) ) {\n                                    s = t.markSize;\n                                    m = t.mark;\n                                    var pos = Math.round(axis.u2p(t.value)) + 0.5;\n                                    switch (m) {\n                                        case 'outside':\n                                            b = this._top-s;\n                                            e = this._top;\n                                            break;\n                                        case 'inside':\n                                            b = this._top;\n                                            e = this._top+s;\n                                            break;\n                                        case 'cross':\n                                            b = this._top-s;\n                                            e = this._top+s;\n                                            break;\n                                        default:\n                                            b = this._top-s;\n                                            e = this._top;\n                                            break;\n                                            }\n                                    // draw the shadow\n                                    if (this.shadow) {\n                                        this.renderer.shadowRenderer.draw(ctx, [[pos,b],[pos,e]], {lineCap:'butt', lineWidth:this.gridLineWidth, offset:this.gridLineWidth*0.75, depth:2, fill:false, closePath:false});\n                                    }\n                                    drawLine(pos, b, pos, e);\n                                }\n                                break;\n                            case 'y2axis':\n                                // draw the grid line\n                                if (t.showGridline && this.drawGridlines && ((!t.isMinorTick && axis.drawMajorGridlines) || (t.isMinorTick && axis.drawMinorGridlines)) ) {\n                                    drawLine(this._left, pos, this._right, pos);\n                                }\n                                // draw the mark\n                                if (t.showMark && t.mark && ((!t.isMinorTick && axis.drawMajorTickMarks) || (t.isMinorTick && axis.drawMinorTickMarks)) ) {\n                                    s = t.markSize;\n                                    m = t.mark;\n                                    var pos = Math.round(axis.u2p(t.value)) + 0.5;\n                                    switch (m) {\n                                        case 'outside':\n                                            b = this._right;\n                                            e = this._right+s;\n                                            break;\n                                        case 'inside':\n                                            b = this._right-s;\n                                            e = this._right;\n                                            break;\n                                        case 'cross':\n                                            b = this._right-s;\n                                            e = this._right+s;\n                                            break;\n                                        default:\n                                            b = this._right;\n                                            e = this._right+s;\n                                            break;\n                                            }\n                                    // draw the shadow\n                                    if (this.shadow) {\n                                        this.renderer.shadowRenderer.draw(ctx, [[b, pos], [e, pos]], {lineCap:'butt', lineWidth:this.gridLineWidth*1.5, offset:this.gridLineWidth*0.75, fill:false, closePath:false});\n                                    }\n                                    drawLine(b, pos, e, pos, {strokeStyle:axis.borderColor});\n                                }\n                                break;\n                            default:\n                                break;\n                        }\n                    }\n                }\n                t = null;\n            }\n            axis = null;\n            ticks = null;\n        }\n        // Now draw grid lines for additional y axes\n        //////\n        // TO DO: handle yMidAxis\n        //////\n        ax = ['y3axis', 'y4axis', 'y5axis', 'y6axis', 'y7axis', 'y8axis', 'y9axis', 'yMidAxis'];\n        for (var i=7; i>0; i--) {\n            var axis = axes[ax[i-1]];\n            var ticks = axis._ticks;\n            if (axis.show) {\n                var tn = ticks[axis.numberTicks-1];\n                var t0 = ticks[0];\n                var left = axis.getLeft();\n                var points = [[left, tn.getTop() + tn.getHeight()/2], [left, t0.getTop() + t0.getHeight()/2 + 1.0]];\n                // draw the shadow\n                if (this.shadow) {\n                    this.renderer.shadowRenderer.draw(ctx, points, {lineCap:'butt', fill:false, closePath:false});\n                }\n                // draw the line\n                drawLine(points[0][0], points[0][1], points[1][0], points[1][1], {lineCap:'butt', strokeStyle:axis.borderColor, lineWidth:axis.borderWidth});\n                // draw the tick marks\n                for (var j=ticks.length; j>0; j--) {\n                    var t = ticks[j-1];\n                    s = t.markSize;\n                    m = t.mark;\n                    var pos = Math.round(axis.u2p(t.value)) + 0.5;\n                    if (t.showMark && t.mark) {\n                        switch (m) {\n                            case 'outside':\n                                b = left;\n                                e = left+s;\n                                break;\n                            case 'inside':\n                                b = left-s;\n                                e = left;\n                                break;\n                            case 'cross':\n                                b = left-s;\n                                e = left+s;\n                                break;\n                            default:\n                                b = left;\n                                e = left+s;\n                                break;\n                        }\n                        points = [[b,pos], [e,pos]];\n                        // draw the shadow\n                        if (this.shadow) {\n                            this.renderer.shadowRenderer.draw(ctx, points, {lineCap:'butt', lineWidth:this.gridLineWidth*1.5, offset:this.gridLineWidth*0.75, fill:false, closePath:false});\n                        }\n                        // draw the line\n                        drawLine(b, pos, e, pos, {strokeStyle:axis.borderColor});\n                    }\n                    t = null;\n                }\n                t0 = null;\n            }\n            axis = null;\n            ticks =  null;\n        }\n        \n        ctx.restore();\n        \n        function drawLine(bx, by, ex, ey, opts) {\n            ctx.save();\n            opts = opts || {};\n            if (opts.lineWidth == null || opts.lineWidth != 0){\n                $.extend(true, ctx, opts);\n                ctx.beginPath();\n                ctx.moveTo(bx, by);\n                ctx.lineTo(ex, ey);\n                ctx.stroke();\n                ctx.restore();\n            }\n        }\n        \n        if (this.shadow) {\n            var points = [[this._left, this._bottom], [this._right, this._bottom], [this._right, this._top]];\n            this.renderer.shadowRenderer.draw(ctx, points);\n        }\n        // Now draw border around grid.  Use axis border definitions. start at\n        // upper left and go clockwise.\n        if (this.borderWidth != 0 && this.drawBorder) {\n            drawLine (this._left, this._top, this._right, this._top, {lineCap:'round', strokeStyle:axes.x2axis.borderColor, lineWidth:axes.x2axis.borderWidth});\n            drawLine (this._right, this._top, this._right, this._bottom, {lineCap:'round', strokeStyle:axes.y2axis.borderColor, lineWidth:axes.y2axis.borderWidth});\n            drawLine (this._right, this._bottom, this._left, this._bottom, {lineCap:'round', strokeStyle:axes.xaxis.borderColor, lineWidth:axes.xaxis.borderWidth});\n            drawLine (this._left, this._bottom, this._left, this._top, {lineCap:'round', strokeStyle:axes.yaxis.borderColor, lineWidth:axes.yaxis.borderWidth});\n        }\n        // ctx.lineWidth = this.borderWidth;\n        // ctx.strokeStyle = this.borderColor;\n        // ctx.strokeRect(this._left, this._top, this._width, this._height);\n        \n        ctx.restore();\n        ctx =  null;\n        axes = null;\n    };\n \n    // Class: $.jqplot.DivTitleRenderer\n    // The default title renderer for jqPlot.  This class has no options beyond the <Title> class. \n    $.jqplot.DivTitleRenderer = function() {\n    };\n    \n    $.jqplot.DivTitleRenderer.prototype.init = function(options) {\n        $.extend(true, this, options);\n    };\n    \n    $.jqplot.DivTitleRenderer.prototype.draw = function() {\n        // Memory Leaks patch\n        if (this._elem) {\n            this._elem.emptyForce();\n            this._elem = null;\n        }\n\n        var r = this.renderer;\n        var elem = document.createElement('div');\n        this._elem = $(elem);\n        this._elem.addClass('jqplot-title');\n\n        if (!this.text) {\n            this.show = false;\n            this._elem.height(0);\n            this._elem.width(0);\n        }\n        else if (this.text) {\n            var color;\n            if (this.color) {\n                color = this.color;\n            }\n            else if (this.textColor) {\n                color = this.textColor;\n            }\n\n            // don't trust that a stylesheet is present, set the position.\n            var styles = {position:'absolute', top:'0px', left:'0px'};\n\n            if (this._plotWidth) {\n                styles['width'] = this._plotWidth+'px';\n            }\n            if (this.fontSize) {\n                styles['fontSize'] = this.fontSize;\n            }\n            if (typeof this.textAlign === 'string') {\n                styles['textAlign'] = this.textAlign;\n            }\n            else {\n                styles['textAlign'] = 'center';\n            }\n            if (color) {\n                styles['color'] = color;\n            }\n            if (this.paddingBottom) {\n                styles['paddingBottom'] = this.paddingBottom;\n            }\n            if (this.fontFamily) {\n                styles['fontFamily'] = this.fontFamily;\n            }\n\n            this._elem.css(styles);\n            if (this.escapeHtml) {\n                this._elem.text(this.text);\n            }\n            else {\n                this._elem.html(this.text);\n            }\n\n\n            // styletext += (this._plotWidth) ? 'width:'+this._plotWidth+'px;' : '';\n            // styletext += (this.fontSize) ? 'font-size:'+this.fontSize+';' : '';\n            // styletext += (this.textAlign) ? 'text-align:'+this.textAlign+';' : 'text-align:center;';\n            // styletext += (color) ? 'color:'+color+';' : '';\n            // styletext += (this.paddingBottom) ? 'padding-bottom:'+this.paddingBottom+';' : '';\n            // this._elem = $('<div class=\"jqplot-title\" style=\"'+styletext+'\">'+this.text+'</div>');\n            // if (this.fontFamily) {\n            //     this._elem.css('font-family', this.fontFamily);\n            // }\n        }\n\n        elem = null;\n        \n        return this._elem;\n    };\n    \n    $.jqplot.DivTitleRenderer.prototype.pack = function() {\n        // nothing to do here\n    };\n  \n\n    var dotlen = 0.1;\n\n    $.jqplot.LinePattern = function (ctx, pattern) {\n\n        var defaultLinePatterns = {\n            dotted: [ dotlen, $.jqplot.config.dotGapLength ],\n            dashed: [ $.jqplot.config.dashLength, $.jqplot.config.gapLength ],\n            solid: null\n        };\n\n        if (typeof pattern === 'string') {\n            if (pattern[0] === '.' || pattern[0] === '-') {\n                var s = pattern;\n                pattern = [];\n                for (var i=0, imax=s.length; i<imax; i++) {\n                    if (s[i] === '.') {\n                        pattern.push( dotlen );\n                    }\n                    else if (s[i] === '-') {\n                        pattern.push( $.jqplot.config.dashLength );\n                    }\n                    else {\n                        continue;\n                    }\n                    pattern.push( $.jqplot.config.gapLength );\n                }\n            }\n            else {\n                pattern = defaultLinePatterns[pattern];\n            }\n        }\n\n        if (!(pattern && pattern.length)) {\n            return ctx;\n        }\n\n        var patternIndex = 0;\n        var patternDistance = pattern[0];\n        var px = 0;\n        var py = 0;\n        var pathx0 = 0;\n        var pathy0 = 0;\n\n        var moveTo = function (x, y) {\n            ctx.moveTo( x, y );\n            px = x;\n            py = y;\n            pathx0 = x;\n            pathy0 = y;\n        };\n\n        var lineTo = function (x, y) {\n            var scale = ctx.lineWidth;\n            var dx = x - px;\n            var dy = y - py;\n            var dist = Math.sqrt(dx*dx+dy*dy);\n            if ((dist > 0) && (scale > 0)) {\n                dx /= dist;\n                dy /= dist;\n                while (true) {\n                    var dp = scale * patternDistance;\n                    if (dp < dist) {\n                        px += dp * dx;\n                        py += dp * dy;\n                        if ((patternIndex & 1) == 0) {\n                            ctx.lineTo( px, py );\n                        }\n                        else {\n                            ctx.moveTo( px, py );\n                        }\n                        dist -= dp;\n                        patternIndex++;\n                        if (patternIndex >= pattern.length) {\n                            patternIndex = 0;\n                        }\n                        patternDistance = pattern[patternIndex];\n                    }\n                    else {\n                        px = x;\n                        py = y;\n                        if ((patternIndex & 1) == 0) {\n                            ctx.lineTo( px, py );\n                        }\n                        else {\n                            ctx.moveTo( px, py );\n                        }\n                        patternDistance -= dist / scale;\n                        break;\n                    }\n                }\n            }\n        };\n\n        var beginPath = function () {\n            ctx.beginPath();\n        };\n\n        var closePath = function () {\n            lineTo( pathx0, pathy0 );\n        };\n\n        return {\n            moveTo: moveTo,\n            lineTo: lineTo,\n            beginPath: beginPath,\n            closePath: closePath\n        };\n    };\n\n    // Class: $.jqplot.LineRenderer\n    // The default line renderer for jqPlot, this class has no options beyond the <Series> class.\n    // Draws series as a line.\n    $.jqplot.LineRenderer = function(){\n        this.shapeRenderer = new $.jqplot.ShapeRenderer();\n        this.shadowRenderer = new $.jqplot.ShadowRenderer();\n    };\n    \n    // called with scope of series.\n    $.jqplot.LineRenderer.prototype.init = function(options, plot) {\n        // Group: Properties\n        //\n        options = options || {};\n        this._type='line';\n        this.renderer.animation = {\n            show: false,\n            direction: 'left',\n            speed: 2500,\n            _supported: true\n        };\n        // prop: smooth\n        // True to draw a smoothed (interpolated) line through the data points\n        // with automatically computed number of smoothing points.\n        // Set to an integer number > 2 to specify number of smoothing points\n        // to use between each data point.\n        this.renderer.smooth = false;  // true or a number > 2 for smoothing.\n        this.renderer.tension = null; // null to auto compute or a number typically > 6.  Fewer points requires higher tension.\n        // prop: constrainSmoothing\n        // True to use a more accurate smoothing algorithm that will\n        // not overshoot any data points.  False to allow overshoot but\n        // produce a smoother looking line.\n        this.renderer.constrainSmoothing = true;\n        // this is smoothed data in grid coordinates, like gridData\n        this.renderer._smoothedData = [];\n        // this is smoothed data in plot units (plot coordinates), like plotData.\n        this.renderer._smoothedPlotData = [];\n        this.renderer._hiBandGridData = [];\n        this.renderer._lowBandGridData = [];\n        this.renderer._hiBandSmoothedData = [];\n        this.renderer._lowBandSmoothedData = [];\n\n        // prop: bandData\n        // Data used to draw error bands or confidence intervals above/below a line.\n        //\n        // bandData can be input in 3 forms.  jqPlot will figure out which is the\n        // low band line and which is the high band line for all forms:\n        // \n        // A 2 dimensional array like [[yl1, yl2, ...], [yu1, yu2, ...]] where\n        // [yl1, yl2, ...] are y values of the lower line and\n        // [yu1, yu2, ...] are y values of the upper line.\n        // In this case there must be the same number of y data points as data points\n        // in the series and the bands will inherit the x values of the series.\n        //\n        // A 2 dimensional array like [[[xl1, yl1], [xl2, yl2], ...], [[xh1, yh1], [xh2, yh2], ...]]\n        // where [xl1, yl1] are x,y data points for the lower line and\n        // [xh1, yh1] are x,y data points for the high line.\n        // x values do not have to correspond to the x values of the series and can\n        // be of any arbitrary length.\n        //\n        // Can be of form [[yl1, yu1], [yl2, yu2], [yl3, yu3], ...] where\n        // there must be 3 or more arrays and there must be the same number of arrays\n        // as there are data points in the series.  In this case, \n        // [yl1, yu1] specifies the lower and upper y values for the 1st\n        // data point and so on.  The bands will inherit the x\n        // values from the series.\n        this.renderer.bandData = [];\n\n        // Group: bands\n        // Banding around line, e.g error bands or confidence intervals.\n        this.renderer.bands = {\n            // prop: show\n            // true to show the bands.  If bandData or interval is\n            // supplied, show will be set to true by default.\n            show: false,\n            hiData: [],\n            lowData: [],\n            // prop: color\n            // color of lines at top and bottom of bands [default: series color].\n            color: this.color,\n            // prop: showLines\n            // True to show lines at top and bottom of bands [default: false].\n            showLines: false,\n            // prop: fill\n            // True to fill area between bands [default: true].\n            fill: true,\n            // prop: fillColor\n            // css color spec for filled area.  [default: series color].\n            fillColor: null,\n            _min: null,\n            _max: null,\n            // prop: interval\n            // User specified interval above and below line for bands [default: '3%''].\n            // Can be a value like 3 or a string like '3%' \n            // or an upper/lower array like [1, -2] or ['2%', '-1.5%']\n            interval: '3%'\n        };\n\n\n        var lopts = {highlightMouseOver: options.highlightMouseOver, highlightMouseDown: options.highlightMouseDown, highlightColor: options.highlightColor};\n        \n        delete (options.highlightMouseOver);\n        delete (options.highlightMouseDown);\n        delete (options.highlightColor);\n        \n        $.extend(true, this.renderer, options);\n\n        this.renderer.options = options;\n\n        // if we are given some band data, and bands aren't explicity set to false in options, turn them on.\n        if (this.renderer.bandData.length > 1 && (!options.bands || options.bands.show == null)) {\n            this.renderer.bands.show = true;\n        }\n\n        // if we are given an interval, and bands aren't explicity set to false in options, turn them on.\n        else if (options.bands && options.bands.show == null && options.bands.interval != null) {\n            this.renderer.bands.show = true;\n        }\n\n        // if plot is filled, turn off bands.\n        if (this.fill) {\n            this.renderer.bands.show = false;\n        }\n\n        if (this.renderer.bands.show) {\n            this.renderer.initBands.call(this, this.renderer.options, plot);\n        }\n\n\n        // smoothing is not compatible with stacked lines, disable\n        if (this._stack) {\n            this.renderer.smooth = false;\n        }\n\n        // set the shape renderer options\n        var opts = {lineJoin:this.lineJoin, lineCap:this.lineCap, fill:this.fill, isarc:false, strokeStyle:this.color, fillStyle:this.fillColor, lineWidth:this.lineWidth, linePattern:this.linePattern, closePath:this.fill};\n        this.renderer.shapeRenderer.init(opts);\n\n        var shadow_offset = options.shadowOffset;\n        // set the shadow renderer options\n        if (shadow_offset == null) {\n            // scale the shadowOffset to the width of the line.\n            if (this.lineWidth > 2.5) {\n                shadow_offset = 1.25 * (1 + (Math.atan((this.lineWidth/2.5))/0.785398163 - 1)*0.6);\n                // var shadow_offset = this.shadowOffset;\n            }\n            // for skinny lines, don't make such a big shadow.\n            else {\n                shadow_offset = 1.25 * Math.atan((this.lineWidth/2.5))/0.785398163;\n            }\n        }\n        \n        var sopts = {lineJoin:this.lineJoin, lineCap:this.lineCap, fill:this.fill, isarc:false, angle:this.shadowAngle, offset:shadow_offset, alpha:this.shadowAlpha, depth:this.shadowDepth, lineWidth:this.lineWidth, linePattern:this.linePattern, closePath:this.fill};\n        this.renderer.shadowRenderer.init(sopts);\n        this._areaPoints = [];\n        this._boundingBox = [[],[]];\n        \n        if (!this.isTrendline && this.fill || this.renderer.bands.show) {\n            // Group: Properties\n            //        \n            // prop: highlightMouseOver\n            // True to highlight area on a filled plot when moused over.\n            // This must be false to enable highlightMouseDown to highlight when clicking on an area on a filled plot.\n            this.highlightMouseOver = true;\n            // prop: highlightMouseDown\n            // True to highlight when a mouse button is pressed over an area on a filled plot.\n            // This will be disabled if highlightMouseOver is true.\n            this.highlightMouseDown = false;\n            // prop: highlightColor\n            // color to use when highlighting an area on a filled plot.\n            this.highlightColor = null;\n            // if user has passed in highlightMouseDown option and not set highlightMouseOver, disable highlightMouseOver\n            if (lopts.highlightMouseDown && lopts.highlightMouseOver == null) {\n                lopts.highlightMouseOver = false;\n            }\n        \n            $.extend(true, this, {highlightMouseOver: lopts.highlightMouseOver, highlightMouseDown: lopts.highlightMouseDown, highlightColor: lopts.highlightColor});\n            \n            if (!this.highlightColor) {\n                var fc = (this.renderer.bands.show) ? this.renderer.bands.fillColor : this.fillColor;\n                this.highlightColor = $.jqplot.computeHighlightColors(fc);\n            }\n            // turn off (disable) the highlighter plugin\n            if (this.highlighter) {\n                this.highlighter.show = false;\n            }\n        }\n        \n        if (!this.isTrendline && plot) {\n            plot.plugins.lineRenderer = {};\n            plot.postInitHooks.addOnce(postInit);\n            plot.postDrawHooks.addOnce(postPlotDraw);\n            plot.eventListenerHooks.addOnce('jqplotMouseMove', handleMove);\n            plot.eventListenerHooks.addOnce('jqplotMouseDown', handleMouseDown);\n            plot.eventListenerHooks.addOnce('jqplotMouseUp', handleMouseUp);\n            plot.eventListenerHooks.addOnce('jqplotClick', handleClick);\n            plot.eventListenerHooks.addOnce('jqplotRightClick', handleRightClick);\n        }\n\n    };\n\n    $.jqplot.LineRenderer.prototype.initBands = function(options, plot) {\n        // use bandData if no data specified in bands option\n        //var bd = this.renderer.bandData;\n        var bd = options.bandData || [];\n        var bands = this.renderer.bands;\n        bands.hiData = [];\n        bands.lowData = [];\n        var data = this.data;\n        bands._max = null;\n        bands._min = null;\n        // If 2 arrays, and each array greater than 2 elements, assume it is hi and low data bands of y values.\n        if (bd.length == 2) {\n            // Do we have an array of x,y values?\n            // like [[[1,1], [2,4], [3,3]], [[1,3], [2,6], [3,5]]]\n            if ($.isArray(bd[0][0])) {\n                // since an arbitrary array of points, spin through all of them to determine max and min lines.\n\n                var p;\n                var bdminidx = 0, bdmaxidx = 0;\n                for (var i = 0, l = bd[0].length; i<l; i++) {\n                    p = bd[0][i];\n                    if ((p[1] != null && p[1] > bands._max) || bands._max == null) {\n                        bands._max = p[1];\n                    }\n                    if ((p[1] != null && p[1] < bands._min) || bands._min == null) {\n                        bands._min = p[1];\n                    }\n                }\n                for (var i = 0, l = bd[1].length; i<l; i++) {\n                    p = bd[1][i];\n                    if ((p[1] != null && p[1] > bands._max) || bands._max == null) {\n                        bands._max = p[1];\n                        bdmaxidx = 1;\n                    }\n                    if ((p[1] != null && p[1] < bands._min) || bands._min == null) {\n                        bands._min = p[1];\n                        bdminidx = 1;\n                    }\n                }\n\n                if (bdmaxidx === bdminidx) {\n                    bands.show = false;\n                }\n\n                bands.hiData = bd[bdmaxidx];\n                bands.lowData = bd[bdminidx];\n            }\n            // else data is arrays of y values\n            // like [[1,4,3], [3,6,5]]\n            // must have same number of band data points as points in series\n            else if (bd[0].length === data.length && bd[1].length === data.length) {\n                var hi = (bd[0][0] > bd[1][0]) ? 0 : 1;\n                var low = (hi) ? 0 : 1;\n                for (var i=0, l=data.length; i < l; i++) {\n                    bands.hiData.push([data[i][0], bd[hi][i]]);\n                    bands.lowData.push([data[i][0], bd[low][i]]);\n                }\n            }\n\n            // we don't have proper data array, don't show bands.\n            else {\n                bands.show = false;\n            }\n        }\n\n        // if more than 2 arrays, have arrays of [ylow, yhi] values.\n        // note, can't distinguish case of [[ylow, yhi], [ylow, yhi]] from [[ylow, ylow], [yhi, yhi]]\n        // this is assumed to be of the latter form.\n        else if (bd.length > 2 && !$.isArray(bd[0][0])) {\n            var hi = (bd[0][0] > bd[0][1]) ? 0 : 1;\n            var low = (hi) ? 0 : 1;\n            for (var i=0, l=bd.length; i<l; i++) {\n                bands.hiData.push([data[i][0], bd[i][hi]]);\n                bands.lowData.push([data[i][0], bd[i][low]]);\n            }\n        }\n\n        // don't have proper data, auto calculate\n        else {\n            var intrv = bands.interval;\n            var a = null;\n            var b = null;\n            var afunc = null;\n            var bfunc = null;\n\n            if ($.isArray(intrv)) {\n                a = intrv[0];\n                b = intrv[1];\n            }\n            else {\n                a = intrv;\n            }\n\n            if (isNaN(a)) {\n                // we have a string\n                if (a.charAt(a.length - 1) === '%') {\n                    afunc = 'multiply';\n                    a = parseFloat(a)/100 + 1;\n                }\n            }\n\n            else {\n                a = parseFloat(a);\n                afunc = 'add';\n            }\n\n            if (b !== null && isNaN(b)) {\n                // we have a string\n                if (b.charAt(b.length - 1) === '%') {\n                    bfunc = 'multiply';\n                    b = parseFloat(b)/100 + 1;\n                }\n            }\n\n            else if (b !== null) {\n                b = parseFloat(b);\n                bfunc = 'add';\n            }\n\n            if (a !== null) {\n                if (b === null) {\n                    b = -a;\n                    bfunc = afunc;\n                    if (bfunc === 'multiply') {\n                        b += 2;\n                    }\n                }\n\n                // make sure a always applies to hi band.\n                if (a < b) {\n                    var temp = a;\n                    a = b;\n                    b = temp;\n                    temp = afunc;\n                    afunc = bfunc;\n                    bfunc = temp;\n                }\n\n                for (var i=0, l = data.length; i < l; i++) {\n                    switch (afunc) {\n                        case 'add':\n                            bands.hiData.push([data[i][0], data[i][1] + a]);\n                            break;\n                        case 'multiply':\n                            bands.hiData.push([data[i][0], data[i][1] * a]);\n                            break;\n                    }\n                    switch (bfunc) {\n                        case 'add':\n                            bands.lowData.push([data[i][0], data[i][1] + b]);\n                            break;\n                        case 'multiply':\n                            bands.lowData.push([data[i][0], data[i][1] * b]);\n                            break;\n                    }\n                }\n            }\n\n            else {\n                bands.show = false;\n            }\n        }\n\n        var hd = bands.hiData;\n        var ld = bands.lowData;\n        for (var i = 0, l = hd.length; i<l; i++) {\n            if ((hd[i][1] != null && hd[i][1] > bands._max) || bands._max == null) {\n                bands._max = hd[i][1];\n            }\n        }\n        for (var i = 0, l = ld.length; i<l; i++) {\n            if ((ld[i][1] != null && ld[i][1] < bands._min) || bands._min == null) {\n                bands._min = ld[i][1];\n            }\n        }\n\n        // one last check for proper data\n        // these don't apply any more since allowing arbitrary x,y values\n        // if (bands.hiData.length != bands.lowData.length) {\n        //     bands.show = false;\n        // }\n\n        // if (bands.hiData.length != this.data.length) {\n        //     bands.show = false;\n        // }\n\n        if (bands.fillColor === null) {\n            var c = $.jqplot.getColorComponents(bands.color);\n            // now adjust alpha to differentiate fill\n            c[3] = c[3] * 0.5;\n            bands.fillColor = 'rgba(' + c[0] +', '+ c[1] +', '+ c[2] +', '+ c[3] + ')';\n        }\n    };\n\n    function getSteps (d, f) {\n        return (3.4182054+f) * Math.pow(d, -0.3534992);\n    }\n\n    function computeSteps (d1, d2) {\n        var s = Math.sqrt(Math.pow((d2[0]- d1[0]), 2) + Math.pow ((d2[1] - d1[1]), 2));\n        return 5.7648 * Math.log(s) + 7.4456;\n    }\n\n    function tanh (x) {\n        var a = (Math.exp(2*x) - 1) / (Math.exp(2*x) + 1);\n        return a;\n    }\n\n    //////////\n    // computeConstrainedSmoothedData\n    // An implementation of the constrained cubic spline interpolation\n    // method as presented in:\n    //\n    // Kruger, CJC, Constrained Cubic Spine Interpolation for Chemical Engineering Applications\n    // http://www.korf.co.uk/spline.pdf\n    //\n    // The implementation below borrows heavily from the sample Visual Basic\n    // implementation by CJC Kruger found in http://www.korf.co.uk/spline.xls\n    //\n    /////////\n\n    // called with scope of series\n    function computeConstrainedSmoothedData (gd) {\n        var smooth = this.renderer.smooth;\n        var dim = this.canvas.getWidth();\n        var xp = this._xaxis.series_p2u;\n        var yp = this._yaxis.series_p2u; \n        var steps =null;\n        var _steps = null;\n        var dist = gd.length/dim;\n        var _smoothedData = [];\n        var _smoothedPlotData = [];\n\n        if (!isNaN(parseFloat(smooth))) {\n            steps = parseFloat(smooth);\n        }\n        else {\n            steps = getSteps(dist, 0.5);\n        }\n\n        var yy = [];\n        var xx = [];\n\n        for (var i=0, l = gd.length; i<l; i++) {\n            yy.push(gd[i][1]);\n            xx.push(gd[i][0]);\n        }\n\n        function dxx(x1, x0) {\n            if (x1 - x0 == 0) {\n                return Math.pow(10,10);\n            }\n            else {\n                return x1 - x0;\n            }\n        }\n\n        var A, B, C, D;\n        // loop through each line segment.  Have # points - 1 line segments.  Nmber segments starting at 1.\n        var nmax = gd.length - 1;\n        for (var num = 1, gdl = gd.length; num<gdl; num++) {\n            var gxx = [];\n            var ggxx = [];\n            // point at each end of segment.\n            for (var j = 0; j < 2; j++) {\n                var i = num - 1 + j; // point number, 0 to # points.\n\n                if (i == 0 || i == nmax) {\n                    gxx[j] = Math.pow(10, 10);\n                }\n                else if (yy[i+1] - yy[i] == 0 || yy[i] - yy[i-1] == 0) {\n                    gxx[j] = 0;\n                }\n                else if (((xx[i+1] - xx[i]) / (yy[i+1] - yy[i]) + (xx[i] - xx[i-1]) / (yy[i] - yy[i-1])) == 0 ) {\n                    gxx[j] = 0;\n                }\n                else if ( (yy[i+1] - yy[i]) * (yy[i] - yy[i-1]) < 0 ) {\n                    gxx[j] = 0;\n                }\n\n                else {\n                    gxx[j] = 2 / (dxx(xx[i + 1], xx[i]) / (yy[i + 1] - yy[i]) + dxx(xx[i], xx[i - 1]) / (yy[i] - yy[i - 1]));\n                }\n            }\n\n            // Reset first derivative (slope) at first and last point\n            if (num == 1) {\n                // First point has 0 2nd derivative\n                gxx[0] = 3 / 2 * (yy[1] - yy[0]) / dxx(xx[1], xx[0]) - gxx[1] / 2;\n            }\n            else if (num == nmax) {\n                // Last point has 0 2nd derivative\n                gxx[1] = 3 / 2 * (yy[nmax] - yy[nmax - 1]) / dxx(xx[nmax], xx[nmax - 1]) - gxx[0] / 2;\n            }   \n\n            // Calc second derivative at points\n            ggxx[0] = -2 * (gxx[1] + 2 * gxx[0]) / dxx(xx[num], xx[num - 1]) + 6 * (yy[num] - yy[num - 1]) / Math.pow(dxx(xx[num], xx[num - 1]), 2);\n            ggxx[1] = 2 * (2 * gxx[1] + gxx[0]) / dxx(xx[num], xx[num - 1]) - 6 * (yy[num] - yy[num - 1]) / Math.pow(dxx(xx[num], xx[num - 1]), 2);\n\n            // Calc constants for cubic interpolation\n            D = 1 / 6 * (ggxx[1] - ggxx[0]) / dxx(xx[num], xx[num - 1]);\n            C = 1 / 2 * (xx[num] * ggxx[0] - xx[num - 1] * ggxx[1]) / dxx(xx[num], xx[num - 1]);\n            B = (yy[num] - yy[num - 1] - C * (Math.pow(xx[num], 2) - Math.pow(xx[num - 1], 2)) - D * (Math.pow(xx[num], 3) - Math.pow(xx[num - 1], 3))) / dxx(xx[num], xx[num - 1]);\n            A = yy[num - 1] - B * xx[num - 1] - C * Math.pow(xx[num - 1], 2) - D * Math.pow(xx[num - 1], 3);\n\n            var increment = (xx[num] - xx[num - 1]) / steps;\n            var temp, tempx;\n\n            for (var j = 0, l = steps; j < l; j++) {\n                temp = [];\n                tempx = xx[num - 1] + j * increment;\n                temp.push(tempx);\n                temp.push(A + B * tempx + C * Math.pow(tempx, 2) + D * Math.pow(tempx, 3));\n                _smoothedData.push(temp);\n                _smoothedPlotData.push([xp(temp[0]), yp(temp[1])]);\n            }\n        }\n\n        _smoothedData.push(gd[i]);\n        _smoothedPlotData.push([xp(gd[i][0]), yp(gd[i][1])]);\n\n        return [_smoothedData, _smoothedPlotData];\n    }\n\n    ///////\n    // computeHermiteSmoothedData\n    // A hermite spline smoothing of the plot data.\n    // This implementation is derived from the one posted\n    // by krypin on the jqplot-users mailing list:\n    //\n    // http://groups.google.com/group/jqplot-users/browse_thread/thread/748be6a445723cea?pli=1\n    //\n    // with a blog post:\n    //\n    // http://blog.statscollector.com/a-plugin-renderer-for-jqplot-to-draw-a-hermite-spline/\n    //\n    // and download of the original plugin:\n    //\n    // http://blog.statscollector.com/wp-content/uploads/2010/02/jqplot.hermiteSplineRenderer.js\n    //////////\n\n    // called with scope of series\n    function computeHermiteSmoothedData (gd) {\n        var smooth = this.renderer.smooth;\n        var tension = this.renderer.tension;\n        var dim = this.canvas.getWidth();\n        var xp = this._xaxis.series_p2u;\n        var yp = this._yaxis.series_p2u; \n        var steps =null;\n        var _steps = null;\n        var a = null;\n        var a1 = null;\n        var a2 = null;\n        var slope = null;\n        var slope2 = null;\n        var temp = null;\n        var t, s, h1, h2, h3, h4;\n        var TiX, TiY, Ti1X, Ti1Y;\n        var pX, pY, p;\n        var sd = [];\n        var spd = [];\n        var dist = gd.length/dim;\n        var min, max, stretch, scale, shift;\n        var _smoothedData = [];\n        var _smoothedPlotData = [];\n        if (!isNaN(parseFloat(smooth))) {\n            steps = parseFloat(smooth);\n        }\n        else {\n            steps = getSteps(dist, 0.5);\n        }\n        if (!isNaN(parseFloat(tension))) {\n            tension = parseFloat(tension);\n        }\n\n        for (var i=0, l = gd.length-1; i < l; i++) {\n\n            if (tension === null) {\n                slope = Math.abs((gd[i+1][1] - gd[i][1]) / (gd[i+1][0] - gd[i][0]));\n\n                min = 0.3;\n                max = 0.6;\n                stretch = (max - min)/2.0;\n                scale = 2.5;\n                shift = -1.4;\n\n                temp = slope/scale + shift;\n\n                a1 = stretch * tanh(temp) - stretch * tanh(shift) + min;\n\n                // if have both left and right line segments, will use  minimum tension. \n                if (i > 0) {\n                    slope2 = Math.abs((gd[i][1] - gd[i-1][1]) / (gd[i][0] - gd[i-1][0]));\n                }\n                temp = slope2/scale + shift;\n\n                a2 = stretch * tanh(temp) - stretch * tanh(shift) + min;\n\n                a = (a1 + a2)/2.0;\n\n            }\n            else {\n                a = tension;\n            }\n            for (t=0; t < steps; t++) {\n                s = t / steps;\n                h1 = (1 + 2*s)*Math.pow((1-s),2);\n                h2 = s*Math.pow((1-s),2);\n                h3 = Math.pow(s,2)*(3-2*s);\n                h4 = Math.pow(s,2)*(s-1);     \n                \n                if (gd[i-1]) {  \n                    TiX = a * (gd[i+1][0] - gd[i-1][0]); \n                    TiY = a * (gd[i+1][1] - gd[i-1][1]);\n                } else {\n                    TiX = a * (gd[i+1][0] - gd[i][0]); \n                    TiY = a * (gd[i+1][1] - gd[i][1]);                                  \n                }\n                if (gd[i+2]) {  \n                    Ti1X = a * (gd[i+2][0] - gd[i][0]); \n                    Ti1Y = a * (gd[i+2][1] - gd[i][1]);\n                } else {\n                    Ti1X = a * (gd[i+1][0] - gd[i][0]); \n                    Ti1Y = a * (gd[i+1][1] - gd[i][1]);                                 \n                }\n                \n                pX = h1*gd[i][0] + h3*gd[i+1][0] + h2*TiX + h4*Ti1X;\n                pY = h1*gd[i][1] + h3*gd[i+1][1] + h2*TiY + h4*Ti1Y;\n                p = [pX, pY];\n\n                _smoothedData.push(p);\n                _smoothedPlotData.push([xp(pX), yp(pY)]);\n            }\n        }\n        _smoothedData.push(gd[l]);\n        _smoothedPlotData.push([xp(gd[l][0]), yp(gd[l][1])]);\n\n        return [_smoothedData, _smoothedPlotData];\n    }\n    \n    // setGridData\n    // converts the user data values to grid coordinates and stores them\n    // in the gridData array.\n    // Called with scope of a series.\n    $.jqplot.LineRenderer.prototype.setGridData = function(plot) {\n        // recalculate the grid data\n        var xp = this._xaxis.series_u2p;\n        var yp = this._yaxis.series_u2p;\n        var data = this._plotData;\n        var pdata = this._prevPlotData;\n        this.gridData = [];\n        this._prevGridData = [];\n        this.renderer._smoothedData = [];\n        this.renderer._smoothedPlotData = [];\n        this.renderer._hiBandGridData = [];\n        this.renderer._lowBandGridData = [];\n        this.renderer._hiBandSmoothedData = [];\n        this.renderer._lowBandSmoothedData = [];\n        var bands = this.renderer.bands;\n        var hasNull = false;\n        for (var i=0, l=data.length; i < l; i++) {\n            // if not a line series or if no nulls in data, push the converted point onto the array.\n            if (data[i][0] != null && data[i][1] != null) {\n                this.gridData.push([xp.call(this._xaxis, data[i][0]), yp.call(this._yaxis, data[i][1])]);\n            }\n            // else if there is a null, preserve it.\n            else if (data[i][0] == null) {\n                hasNull = true;\n                this.gridData.push([null, yp.call(this._yaxis, data[i][1])]);\n            }\n            else if (data[i][1] == null) {\n                hasNull = true;\n                this.gridData.push([xp.call(this._xaxis, data[i][0]), null]);\n            }\n            // if not a line series or if no nulls in data, push the converted point onto the array.\n            if (pdata[i] != null && pdata[i][0] != null && pdata[i][1] != null) {\n                this._prevGridData.push([xp.call(this._xaxis, pdata[i][0]), yp.call(this._yaxis, pdata[i][1])]);\n            }\n            // else if there is a null, preserve it.\n            else if (pdata[i] != null && pdata[i][0] == null) {\n                this._prevGridData.push([null, yp.call(this._yaxis, pdata[i][1])]);\n            }  \n            else if (pdata[i] != null && pdata[i][0] != null && pdata[i][1] == null) {\n                this._prevGridData.push([xp.call(this._xaxis, pdata[i][0]), null]);\n            }\n        }\n\n        // don't do smoothing or bands on broken lines.\n        if (hasNull) {\n            this.renderer.smooth = false;\n            if (this._type === 'line') {\n                bands.show = false;\n            }\n        }\n\n        if (this._type === 'line' && bands.show) {\n            for (var i=0, l=bands.hiData.length; i<l; i++) {\n                this.renderer._hiBandGridData.push([xp.call(this._xaxis, bands.hiData[i][0]), yp.call(this._yaxis, bands.hiData[i][1])]);\n            }\n            for (var i=0, l=bands.lowData.length; i<l; i++) {\n                this.renderer._lowBandGridData.push([xp.call(this._xaxis, bands.lowData[i][0]), yp.call(this._yaxis, bands.lowData[i][1])]);\n            }\n        }\n\n        // calculate smoothed data if enough points and no nulls\n        if (this._type === 'line' && this.renderer.smooth && this.gridData.length > 2) {\n            var ret;\n            if (this.renderer.constrainSmoothing) {\n                ret = computeConstrainedSmoothedData.call(this, this.gridData);\n                this.renderer._smoothedData = ret[0];\n                this.renderer._smoothedPlotData = ret[1];\n\n                if (bands.show) {\n                    ret = computeConstrainedSmoothedData.call(this, this.renderer._hiBandGridData);\n                    this.renderer._hiBandSmoothedData = ret[0];\n                    ret = computeConstrainedSmoothedData.call(this, this.renderer._lowBandGridData);\n                    this.renderer._lowBandSmoothedData = ret[0];\n                }\n\n                ret = null;\n            }\n            else {\n                ret = computeHermiteSmoothedData.call(this, this.gridData);\n                this.renderer._smoothedData = ret[0];\n                this.renderer._smoothedPlotData = ret[1];\n\n                if (bands.show) {\n                    ret = computeHermiteSmoothedData.call(this, this.renderer._hiBandGridData);\n                    this.renderer._hiBandSmoothedData = ret[0];\n                    ret = computeHermiteSmoothedData.call(this, this.renderer._lowBandGridData);\n                    this.renderer._lowBandSmoothedData = ret[0];\n                }\n\n                ret = null;\n            }\n        }\n    };\n    \n    // makeGridData\n    // converts any arbitrary data values to grid coordinates and\n    // returns them.  This method exists so that plugins can use a series'\n    // linerenderer to generate grid data points without overwriting the\n    // grid data associated with that series.\n    // Called with scope of a series.\n    $.jqplot.LineRenderer.prototype.makeGridData = function(data, plot) {\n        // recalculate the grid data\n        var xp = this._xaxis.series_u2p;\n        var yp = this._yaxis.series_u2p;\n        var gd = [];\n        var pgd = [];\n        this.renderer._smoothedData = [];\n        this.renderer._smoothedPlotData = [];\n        this.renderer._hiBandGridData = [];\n        this.renderer._lowBandGridData = [];\n        this.renderer._hiBandSmoothedData = [];\n        this.renderer._lowBandSmoothedData = [];\n        var bands = this.renderer.bands;\n        var hasNull = false;\n        for (var i=0; i<data.length; i++) {\n            // if not a line series or if no nulls in data, push the converted point onto the array.\n            if (data[i][0] != null && data[i][1] != null) {\n                if (this.step && i>0) {\n                    gd.push([xp.call(this._xaxis, data[i][0]), yp.call(this._yaxis, data[i-1][1])]);\n                }\n                gd.push([xp.call(this._xaxis, data[i][0]), yp.call(this._yaxis, data[i][1])]);\n            }\n            // else if there is a null, preserve it.\n            else if (data[i][0] == null) {\n                hasNull = true;\n                gd.push([null, yp.call(this._yaxis, data[i][1])]);\n            }\n            else if (data[i][1] == null) {\n                hasNull = true;\n                gd.push([xp.call(this._xaxis, data[i][0]), null]);\n            }\n        }\n\n        // don't do smoothing or bands on broken lines.\n        if (hasNull) {\n            this.renderer.smooth = false;\n            if (this._type === 'line') {\n                bands.show = false;\n            }\n        }\n\n        if (this._type === 'line' && bands.show) {\n            for (var i=0, l=bands.hiData.length; i<l; i++) {\n                this.renderer._hiBandGridData.push([xp.call(this._xaxis, bands.hiData[i][0]), yp.call(this._yaxis, bands.hiData[i][1])]);\n            }\n            for (var i=0, l=bands.lowData.length; i<l; i++) {\n                this.renderer._lowBandGridData.push([xp.call(this._xaxis, bands.lowData[i][0]), yp.call(this._yaxis, bands.lowData[i][1])]);\n            }\n        }\n\n        if (this._type === 'line' && this.renderer.smooth && gd.length > 2) {\n            var ret;\n            if (this.renderer.constrainSmoothing) {\n                ret = computeConstrainedSmoothedData.call(this, gd);\n                this.renderer._smoothedData = ret[0];\n                this.renderer._smoothedPlotData = ret[1];\n\n                if (bands.show) {\n                    ret = computeConstrainedSmoothedData.call(this, this.renderer._hiBandGridData);\n                    this.renderer._hiBandSmoothedData = ret[0];\n                    ret = computeConstrainedSmoothedData.call(this, this.renderer._lowBandGridData);\n                    this.renderer._lowBandSmoothedData = ret[0];\n                }\n\n                ret = null;\n            }\n            else {\n                ret = computeHermiteSmoothedData.call(this, gd);\n                this.renderer._smoothedData = ret[0];\n                this.renderer._smoothedPlotData = ret[1];\n\n                if (bands.show) {\n                    ret = computeHermiteSmoothedData.call(this, this.renderer._hiBandGridData);\n                    this.renderer._hiBandSmoothedData = ret[0];\n                    ret = computeHermiteSmoothedData.call(this, this.renderer._lowBandGridData);\n                    this.renderer._lowBandSmoothedData = ret[0];\n                }\n\n                ret = null;\n            }\n        }\n        return gd;\n    };\n    \n\n    // called within scope of series.\n    $.jqplot.LineRenderer.prototype.draw = function(ctx, gd, options, plot) {\n        var i;\n        // get a copy of the options, so we don't modify the original object.\n        var opts = $.extend(true, {}, options);\n        var shadow = (opts.shadow != undefined) ? opts.shadow : this.shadow;\n        var showLine = (opts.showLine != undefined) ? opts.showLine : this.showLine;\n        var fill = (opts.fill != undefined) ? opts.fill : this.fill;\n        var fillAndStroke = (opts.fillAndStroke != undefined) ? opts.fillAndStroke : this.fillAndStroke;\n        var xmin, ymin, xmax, ymax;\n        ctx.save();\n        if (gd.length) {\n            if (showLine) {\n                // if we fill, we'll have to add points to close the curve.\n                if (fill) {\n                    if (this.fillToZero) { \n                        // have to break line up into shapes at axis crossings\n                        var negativeColor = this.negativeColor;\n                        if (! this.useNegativeColors) {\n                            negativeColor = opts.fillStyle;\n                        }\n                        var isnegative = false;\n                        var posfs = opts.fillStyle;\n                    \n                        // if stoking line as well as filling, get a copy of line data.\n                        if (fillAndStroke) {\n                            var fasgd = gd.slice(0);\n                        }\n                        // if not stacked, fill down to axis\n                        if (this.index == 0 || !this._stack) {\n                        \n                            var tempgd = [];\n                            var pd = (this.renderer.smooth) ? this.renderer._smoothedPlotData : this._plotData;\n                            this._areaPoints = [];\n                            var pyzero = this._yaxis.series_u2p(this.fillToValue);\n                            var pxzero = this._xaxis.series_u2p(this.fillToValue);\n\n                            opts.closePath = true;\n                            \n                            if (this.fillAxis == 'y') {\n                                tempgd.push([gd[0][0], pyzero]);\n                                this._areaPoints.push([gd[0][0], pyzero]);\n                                \n                                for (var i=0; i<gd.length-1; i++) {\n                                    tempgd.push(gd[i]);\n                                    this._areaPoints.push(gd[i]);\n                                    // do we have an axis crossing?\n                                    if (pd[i][1] * pd[i+1][1] <= 0) {\n                                        if (pd[i][1] < 0) {\n                                            isnegative = true;\n                                            opts.fillStyle = negativeColor;\n                                        }\n                                        else {\n                                            isnegative = false;\n                                            opts.fillStyle = posfs;\n                                        }\n                                        \n                                        var xintercept = gd[i][0] + (gd[i+1][0] - gd[i][0]) * (pyzero-gd[i][1])/(gd[i+1][1] - gd[i][1]);\n                                        tempgd.push([xintercept, pyzero]);\n                                        this._areaPoints.push([xintercept, pyzero]);\n                                        // now draw this shape and shadow.\n                                        if (shadow) {\n                                            this.renderer.shadowRenderer.draw(ctx, tempgd, opts);\n                                        }\n                                        this.renderer.shapeRenderer.draw(ctx, tempgd, opts);\n                                        // now empty temp array and continue\n                                        tempgd = [[xintercept, pyzero]];\n                                        // this._areaPoints = [[xintercept, pyzero]];\n                                    }   \n                                }\n                                if (pd[gd.length-1][1] < 0) {\n                                    isnegative = true;\n                                    opts.fillStyle = negativeColor;\n                                }\n                                else {\n                                    isnegative = false;\n                                    opts.fillStyle = posfs;\n                                }\n                                tempgd.push(gd[gd.length-1]);\n                                this._areaPoints.push(gd[gd.length-1]);\n                                tempgd.push([gd[gd.length-1][0], pyzero]); \n                                this._areaPoints.push([gd[gd.length-1][0], pyzero]); \n                            }\n                            // now draw the last area.\n                            if (shadow) {\n                                this.renderer.shadowRenderer.draw(ctx, tempgd, opts);\n                            }\n                            this.renderer.shapeRenderer.draw(ctx, tempgd, opts);\n                            \n                            \n                            // var gridymin = this._yaxis.series_u2p(0);\n                            // // IE doesn't return new length on unshift\n                            // gd.unshift([gd[0][0], gridymin]);\n                            // len = gd.length;\n                            // gd.push([gd[len - 1][0], gridymin]);                   \n                        }\n                        // if stacked, fill to line below \n                        else {\n                            var prev = this._prevGridData;\n                            for (var i=prev.length; i>0; i--) {\n                                gd.push(prev[i-1]);\n                                // this._areaPoints.push(prev[i-1]);\n                            }\n                            if (shadow) {\n                                this.renderer.shadowRenderer.draw(ctx, gd, opts);\n                            }\n                            this._areaPoints = gd;\n                            this.renderer.shapeRenderer.draw(ctx, gd, opts);\n                        }\n                    }\n                    /////////////////////////\n                    // Not filled to zero\n                    ////////////////////////\n                    else {                    \n                        // if stoking line as well as filling, get a copy of line data.\n                        if (fillAndStroke) {\n                            var fasgd = gd.slice(0);\n                        }\n                        // if not stacked, fill down to axis\n                        if (this.index == 0 || !this._stack) {\n                            // var gridymin = this._yaxis.series_u2p(this._yaxis.min) - this.gridBorderWidth / 2;\n                            var gridymin = ctx.canvas.height;\n                            // IE doesn't return new length on unshift\n                            gd.unshift([gd[0][0], gridymin]);\n                            var len = gd.length;\n                            gd.push([gd[len - 1][0], gridymin]);                   \n                        }\n                        // if stacked, fill to line below \n                        else {\n                            var prev = this._prevGridData;\n                            for (var i=prev.length; i>0; i--) {\n                                gd.push(prev[i-1]);\n                            }\n                        }\n                        this._areaPoints = gd;\n                        \n                        if (shadow) {\n                            this.renderer.shadowRenderer.draw(ctx, gd, opts);\n                        }\n            \n                        this.renderer.shapeRenderer.draw(ctx, gd, opts);                        \n                    }\n                    if (fillAndStroke) {\n                        var fasopts = $.extend(true, {}, opts, {fill:false, closePath:false});\n                        this.renderer.shapeRenderer.draw(ctx, fasgd, fasopts);\n                        //////////\n                        // TODO: figure out some way to do shadows nicely\n                        // if (shadow) {\n                        //     this.renderer.shadowRenderer.draw(ctx, fasgd, fasopts);\n                        // }\n                        // now draw the markers\n                        if (this.markerRenderer.show) {\n                            if (this.renderer.smooth) {\n                                fasgd = this.gridData;\n                            }\n                            for (i=0; i<fasgd.length; i++) {\n                                this.markerRenderer.draw(fasgd[i][0], fasgd[i][1], ctx, opts.markerOptions);\n                            }\n                        }\n                    }\n                }\n                else {\n\n                    if (this.renderer.bands.show) {\n                        var bdat;\n                        var bopts = $.extend(true, {}, opts);\n                        if (this.renderer.bands.showLines) {\n                            bdat = (this.renderer.smooth) ? this.renderer._hiBandSmoothedData : this.renderer._hiBandGridData;\n                            this.renderer.shapeRenderer.draw(ctx, bdat, opts);\n                            bdat = (this.renderer.smooth) ? this.renderer._lowBandSmoothedData : this.renderer._lowBandGridData;\n                            this.renderer.shapeRenderer.draw(ctx, bdat, bopts);\n                        }\n\n                        if (this.renderer.bands.fill) {\n                            if (this.renderer.smooth) {\n                                bdat = this.renderer._hiBandSmoothedData.concat(this.renderer._lowBandSmoothedData.reverse());\n                            }\n                            else {\n                                bdat = this.renderer._hiBandGridData.concat(this.renderer._lowBandGridData.reverse());\n                            }\n                            this._areaPoints = bdat;\n                            bopts.closePath = true;\n                            bopts.fill = true;\n                            bopts.fillStyle = this.renderer.bands.fillColor;\n                            this.renderer.shapeRenderer.draw(ctx, bdat, bopts);\n                        }\n                    }\n\n                    if (shadow) {\n                        this.renderer.shadowRenderer.draw(ctx, gd, opts);\n                    }\n    \n                    this.renderer.shapeRenderer.draw(ctx, gd, opts);\n                }\n            }\n            // calculate the bounding box\n            var xmin = xmax = ymin = ymax = null;\n            for (i=0; i<this._areaPoints.length; i++) {\n                var p = this._areaPoints[i];\n                if (xmin > p[0] || xmin == null) {\n                    xmin = p[0];\n                }\n                if (ymax < p[1] || ymax == null) {\n                    ymax = p[1];\n                }\n                if (xmax < p[0] || xmax == null) {\n                    xmax = p[0];\n                }\n                if (ymin > p[1] || ymin == null) {\n                    ymin = p[1];\n                }\n            }\n\n            if (this.type === 'line' && this.renderer.bands.show) {\n                ymax = this._yaxis.series_u2p(this.renderer.bands._min);\n                ymin = this._yaxis.series_u2p(this.renderer.bands._max);\n            }\n\n            this._boundingBox = [[xmin, ymax], [xmax, ymin]];\n        \n            // now draw the markers\n            if (this.markerRenderer.show && !fill) {\n                if (this.renderer.smooth) {\n                    gd = this.gridData;\n                }\n                for (i=0; i<gd.length; i++) {\n                    if (gd[i][0] != null && gd[i][1] != null) {\n                        this.markerRenderer.draw(gd[i][0], gd[i][1], ctx, opts.markerOptions);\n                    }\n                }\n            }\n        }\n        \n        ctx.restore();\n    };  \n    \n    $.jqplot.LineRenderer.prototype.drawShadow = function(ctx, gd, options) {\n        // This is a no-op, shadows drawn with lines.\n    };\n    \n    // called with scope of plot.\n    // make sure to not leave anything highlighted.\n    function postInit(target, data, options) {\n        for (var i=0; i<this.series.length; i++) {\n            if (this.series[i].renderer.constructor == $.jqplot.LineRenderer) {\n                // don't allow mouseover and mousedown at same time.\n                if (this.series[i].highlightMouseOver) {\n                    this.series[i].highlightMouseDown = false;\n                }\n            }\n        }\n    }  \n    \n    // called within context of plot\n    // create a canvas which we can draw on.\n    // insert it before the eventCanvas, so eventCanvas will still capture events.\n    function postPlotDraw() {\n        // Memory Leaks patch    \n        if (this.plugins.lineRenderer && this.plugins.lineRenderer.highlightCanvas) {\n          this.plugins.lineRenderer.highlightCanvas.resetCanvas();\n          this.plugins.lineRenderer.highlightCanvas = null;\n        }\n        \n        this.plugins.lineRenderer.highlightedSeriesIndex = null;\n        this.plugins.lineRenderer.highlightCanvas = new $.jqplot.GenericCanvas();\n        \n        this.eventCanvas._elem.before(this.plugins.lineRenderer.highlightCanvas.createElement(this._gridPadding, 'jqplot-lineRenderer-highlight-canvas', this._plotDimensions, this));\n        this.plugins.lineRenderer.highlightCanvas.setContext();\n        this.eventCanvas._elem.bind('mouseleave', {plot:this}, function (ev) { unhighlight(ev.data.plot); });\n    } \n    \n    function highlight (plot, sidx, pidx, points) {\n        var s = plot.series[sidx];\n        var canvas = plot.plugins.lineRenderer.highlightCanvas;\n        canvas._ctx.clearRect(0,0,canvas._ctx.canvas.width, canvas._ctx.canvas.height);\n        s._highlightedPoint = pidx;\n        plot.plugins.lineRenderer.highlightedSeriesIndex = sidx;\n        var opts = {fillStyle: s.highlightColor};\n        if (s.type === 'line' && s.renderer.bands.show) {\n            opts.fill = true;\n            opts.closePath = true;\n        }\n        s.renderer.shapeRenderer.draw(canvas._ctx, points, opts);\n        canvas = null;\n    }\n    \n    function unhighlight (plot) {\n        var canvas = plot.plugins.lineRenderer.highlightCanvas;\n        canvas._ctx.clearRect(0,0, canvas._ctx.canvas.width, canvas._ctx.canvas.height);\n        for (var i=0; i<plot.series.length; i++) {\n            plot.series[i]._highlightedPoint = null;\n        }\n        plot.plugins.lineRenderer.highlightedSeriesIndex = null;\n        plot.target.trigger('jqplotDataUnhighlight');\n        canvas = null;\n    }\n    \n    \n    function handleMove(ev, gridpos, datapos, neighbor, plot) {\n        if (neighbor) {\n            var ins = [neighbor.seriesIndex, neighbor.pointIndex, neighbor.data];\n            var evt1 = jQuery.Event('jqplotDataMouseOver');\n            evt1.pageX = ev.pageX;\n            evt1.pageY = ev.pageY;\n            plot.target.trigger(evt1, ins);\n            if (plot.series[ins[0]].highlightMouseOver && !(ins[0] == plot.plugins.lineRenderer.highlightedSeriesIndex)) {\n                var evt = jQuery.Event('jqplotDataHighlight');\n                evt.which = ev.which;\n                evt.pageX = ev.pageX;\n                evt.pageY = ev.pageY;\n                plot.target.trigger(evt, ins);\n                highlight (plot, neighbor.seriesIndex, neighbor.pointIndex, neighbor.points);\n            }\n        }\n        else if (neighbor == null) {\n            unhighlight (plot);\n        }\n    }\n    \n    function handleMouseDown(ev, gridpos, datapos, neighbor, plot) {\n        if (neighbor) {\n            var ins = [neighbor.seriesIndex, neighbor.pointIndex, neighbor.data];\n            if (plot.series[ins[0]].highlightMouseDown && !(ins[0] == plot.plugins.lineRenderer.highlightedSeriesIndex)) {\n                var evt = jQuery.Event('jqplotDataHighlight');\n                evt.which = ev.which;\n                evt.pageX = ev.pageX;\n                evt.pageY = ev.pageY;\n                plot.target.trigger(evt, ins);\n                highlight (plot, neighbor.seriesIndex, neighbor.pointIndex, neighbor.points);\n            }\n        }\n        else if (neighbor == null) {\n            unhighlight (plot);\n        }\n    }\n    \n    function handleMouseUp(ev, gridpos, datapos, neighbor, plot) {\n        var idx = plot.plugins.lineRenderer.highlightedSeriesIndex;\n        if (idx != null && plot.series[idx].highlightMouseDown) {\n            unhighlight(plot);\n        }\n    }\n    \n    function handleClick(ev, gridpos, datapos, neighbor, plot) {\n        if (neighbor) {\n            var ins = [neighbor.seriesIndex, neighbor.pointIndex, neighbor.data];\n            var evt = jQuery.Event('jqplotDataClick');\n            evt.which = ev.which;\n            evt.pageX = ev.pageX;\n            evt.pageY = ev.pageY;\n            plot.target.trigger(evt, ins);\n        }\n    }\n    \n    function handleRightClick(ev, gridpos, datapos, neighbor, plot) {\n        if (neighbor) {\n            var ins = [neighbor.seriesIndex, neighbor.pointIndex, neighbor.data];\n            var idx = plot.plugins.lineRenderer.highlightedSeriesIndex;\n            if (idx != null && plot.series[idx].highlightMouseDown) {\n                unhighlight(plot);\n            }\n            var evt = jQuery.Event('jqplotDataRightClick');\n            evt.which = ev.which;\n            evt.pageX = ev.pageX;\n            evt.pageY = ev.pageY;\n            plot.target.trigger(evt, ins);\n        }\n    }\n    \n    \n    // class: $.jqplot.LinearAxisRenderer\n    // The default jqPlot axis renderer, creating a numeric axis.\n    $.jqplot.LinearAxisRenderer = function() {\n    };\n    \n    // called with scope of axis object.\n    $.jqplot.LinearAxisRenderer.prototype.init = function(options){\n        // prop: breakPoints\n        // EXPERIMENTAL!! Use at your own risk!\n        // Works only with linear axes and the default tick renderer.\n        // Array of [start, stop] points to create a broken axis.\n        // Broken axes have a \"jump\" in them, which is an immediate \n        // transition from a smaller value to a larger value.\n        // Currently, axis ticks MUST be manually assigned if using breakPoints\n        // by using the axis ticks array option.\n        this.breakPoints = null;\n        // prop: breakTickLabel\n        // Label to use at the axis break if breakPoints are specified.\n        this.breakTickLabel = \"&asymp;\";\n        // prop: drawBaseline\n        // True to draw the axis baseline.\n        this.drawBaseline = true;\n        // prop: baselineWidth\n        // width of the baseline in pixels.\n        this.baselineWidth = null;\n        // prop: baselineColor\n        // CSS color spec for the baseline.\n        this.baselineColor = null;\n        // prop: forceTickAt0\n        // This will ensure that there is always a tick mark at 0.\n        // If data range is strictly positive or negative,\n        // this will force 0 to be inside the axis bounds unless\n        // the appropriate axis pad (pad, padMin or padMax) is set\n        // to 0, then this will force an axis min or max value at 0.\n        // This has know effect when any of the following options\n        // are set:  autoscale, min, max, numberTicks or tickInterval.\n        this.forceTickAt0 = false;\n        // prop: forceTickAt100\n        // This will ensure that there is always a tick mark at 100.\n        // If data range is strictly above or below 100,\n        // this will force 100 to be inside the axis bounds unless\n        // the appropriate axis pad (pad, padMin or padMax) is set\n        // to 0, then this will force an axis min or max value at 100.\n        // This has know effect when any of the following options\n        // are set:  autoscale, min, max, numberTicks or tickInterval.\n        this.forceTickAt100 = false;\n        // prop: tickInset\n        // Controls the amount to inset the first and last ticks from \n        // the edges of the grid, in multiples of the tick interval.\n        // 0 is no inset, 0.5 is one half a tick interval, 1 is a full\n        // tick interval, etc.\n        this.tickInset = 0;\n        // prop: minorTicks\n        // Number of ticks to add between \"major\" ticks.\n        // Major ticks are ticks supplied by user or auto computed.\n        // Minor ticks cannot be created by user.\n        this.minorTicks = 0;\n        // prop: alignTicks\n        // true to align tick marks across opposed axes\n        // such as from the y2axis to yaxis.\n        this.alignTicks = false;\n        this._autoFormatString = '';\n        this._overrideFormatString = false;\n        this._scalefact = 1.0;\n        $.extend(true, this, options);\n        if (this.breakPoints) {\n            if (!$.isArray(this.breakPoints)) {\n                this.breakPoints = null;\n            }\n            else if (this.breakPoints.length < 2 || this.breakPoints[1] <= this.breakPoints[0]) {\n                this.breakPoints = null;\n            }\n        }\n        if (this.numberTicks != null && this.numberTicks < 2) {\n            this.numberTicks = 2;\n        }\n        this.resetDataBounds();\n    };\n    \n    // called with scope of axis\n    $.jqplot.LinearAxisRenderer.prototype.draw = function(ctx, plot) {\n        if (this.show) {\n            // populate the axis label and value properties.\n            // createTicks is a method on the renderer, but\n            // call it within the scope of the axis.\n            this.renderer.createTicks.call(this, plot);\n            // fill a div with axes labels in the right direction.\n            // Need to pregenerate each axis to get its bounds and\n            // position it and the labels correctly on the plot.\n            var dim=0;\n            var temp;\n            // Added for theming.\n            if (this._elem) {\n                // Memory Leaks patch\n                //this._elem.empty();\n                this._elem.emptyForce();\n                this._elem = null;\n            }\n            \n            this._elem = $(document.createElement('div'));\n            this._elem.addClass('jqplot-axis jqplot-'+this.name);\n            this._elem.css('position', 'absolute');\n\n            \n            if (this.name == 'xaxis' || this.name == 'x2axis') {\n                this._elem.width(this._plotDimensions.width);\n            }\n            else {\n                this._elem.height(this._plotDimensions.height);\n            }\n            \n            // create a _label object.\n            this.labelOptions.axis = this.name;\n            this._label = new this.labelRenderer(this.labelOptions);\n            if (this._label.show) {\n                var elem = this._label.draw(ctx, plot);\n                elem.appendTo(this._elem);\n                elem = null;\n            }\n    \n            var t = this._ticks;\n            var tick;\n            for (var i=0; i<t.length; i++) {\n                tick = t[i];\n                if (tick.show && tick.showLabel && (!tick.isMinorTick || this.showMinorTicks)) {\n                    this._elem.append(tick.draw(ctx, plot));\n                }\n            }\n            tick = null;\n            t = null;\n        }\n        return this._elem;\n    };\n    \n    // called with scope of an axis\n    $.jqplot.LinearAxisRenderer.prototype.reset = function() {\n        this.min = this._options.min;\n        this.max = this._options.max;\n        this.tickInterval = this._options.tickInterval;\n        this.numberTicks = this._options.numberTicks;\n        this._autoFormatString = '';\n        if (this._overrideFormatString && this.tickOptions && this.tickOptions.formatString) {\n            this.tickOptions.formatString = '';\n        }\n\n        // this._ticks = this.__ticks;\n    };\n    \n    // called with scope of axis\n    $.jqplot.LinearAxisRenderer.prototype.set = function() { \n        var dim = 0;\n        var temp;\n        var w = 0;\n        var h = 0;\n        var lshow = (this._label == null) ? false : this._label.show;\n        if (this.show) {\n            var t = this._ticks;\n            var tick;\n            for (var i=0; i<t.length; i++) {\n                tick = t[i];\n                if (!tick._breakTick && tick.show && tick.showLabel && (!tick.isMinorTick || this.showMinorTicks)) {\n                    if (this.name == 'xaxis' || this.name == 'x2axis') {\n                        temp = tick._elem.outerHeight(true);\n                    }\n                    else {\n                        temp = tick._elem.outerWidth(true);\n                    }\n                    if (temp > dim) {\n                        dim = temp;\n                    }\n                }\n            }\n            tick = null;\n            t = null;\n            \n            if (lshow) {\n                w = this._label._elem.outerWidth(true);\n                h = this._label._elem.outerHeight(true); \n            }\n            if (this.name == 'xaxis') {\n                dim = dim + h;\n                this._elem.css({'height':dim+'px', left:'0px', bottom:'0px'});\n            }\n            else if (this.name == 'x2axis') {\n                dim = dim + h;\n                this._elem.css({'height':dim+'px', left:'0px', top:'0px'});\n            }\n            else if (this.name == 'yaxis') {\n                dim = dim + w;\n                this._elem.css({'width':dim+'px', left:'0px', top:'0px'});\n                if (lshow && this._label.constructor == $.jqplot.AxisLabelRenderer) {\n                    this._label._elem.css('width', w+'px');\n                }\n            }\n            else {\n                dim = dim + w;\n                this._elem.css({'width':dim+'px', right:'0px', top:'0px'});\n                if (lshow && this._label.constructor == $.jqplot.AxisLabelRenderer) {\n                    this._label._elem.css('width', w+'px');\n                }\n            }\n        }  \n    };    \n    \n    // called with scope of axis\n    $.jqplot.LinearAxisRenderer.prototype.createTicks = function(plot) {\n        // we're are operating on an axis here\n        var ticks = this._ticks;\n        var userTicks = this.ticks;\n        var name = this.name;\n        // databounds were set on axis initialization.\n        var db = this._dataBounds;\n        var dim = (this.name.charAt(0) === 'x') ? this._plotDimensions.width : this._plotDimensions.height;\n        var interval;\n        var min, max;\n        var pos1, pos2;\n        var tt, i;\n        // get a copy of user's settings for min/max.\n        var userMin = this.min;\n        var userMax = this.max;\n        var userNT = this.numberTicks;\n        var userTI = this.tickInterval;\n\n        var threshold = 30;\n        this._scalefact =  (Math.max(dim, threshold+1) - threshold)/300.0;\n        \n        // if we already have ticks, use them.\n        // ticks must be in order of increasing value.\n        \n        if (userTicks.length) {\n            // ticks could be 1D or 2D array of [val, val, ,,,] or [[val, label], [val, label], ...] or mixed\n            for (i=0; i<userTicks.length; i++){\n                var ut = userTicks[i];\n                var t = new this.tickRenderer(this.tickOptions);\n                if ($.isArray(ut)) {\n                    t.value = ut[0];\n                    if (this.breakPoints) {\n                        if (ut[0] == this.breakPoints[0]) {\n                            t.label = this.breakTickLabel;\n                            t._breakTick = true;\n                            t.showGridline = false;\n                            t.showMark = false;\n                        }\n                        else if (ut[0] > this.breakPoints[0] && ut[0] <= this.breakPoints[1]) {\n                            t.show = false;\n                            t.showGridline = false;\n                            t.label = ut[1];\n                        }\n                        else {\n                            t.label = ut[1];\n                        }\n                    }\n                    else {\n                        t.label = ut[1];\n                    }\n                    t.setTick(ut[0], this.name);\n                    this._ticks.push(t);\n                }\n\n                else if ($.isPlainObject(ut)) {\n                    $.extend(true, t, ut);\n                    t.axis = this.name;\n                    this._ticks.push(t);\n                }\n                \n                else {\n                    t.value = ut;\n                    if (this.breakPoints) {\n                        if (ut == this.breakPoints[0]) {\n                            t.label = this.breakTickLabel;\n                            t._breakTick = true;\n                            t.showGridline = false;\n                            t.showMark = false;\n                        }\n                        else if (ut > this.breakPoints[0] && ut <= this.breakPoints[1]) {\n                            t.show = false;\n                            t.showGridline = false;\n                        }\n                    }\n                    t.setTick(ut, this.name);\n                    this._ticks.push(t);\n                }\n            }\n            this.numberTicks = userTicks.length;\n            this.min = this._ticks[0].value;\n            this.max = this._ticks[this.numberTicks-1].value;\n            this.tickInterval = (this.max - this.min) / (this.numberTicks - 1);\n        }\n        \n        // we don't have any ticks yet, let's make some!\n        else {\n            if (name == 'xaxis' || name == 'x2axis') {\n                dim = this._plotDimensions.width;\n            }\n            else {\n                dim = this._plotDimensions.height;\n            }\n\n            var _numberTicks = this.numberTicks;\n\n            // if aligning this axis, use number of ticks from previous axis.\n            // Do I need to reset somehow if alignTicks is changed and then graph is replotted??\n            if (this.alignTicks) {\n                if (this.name === 'x2axis' && plot.axes.xaxis.show) {\n                    _numberTicks = plot.axes.xaxis.numberTicks;\n                }\n                else if (this.name.charAt(0) === 'y' && this.name !== 'yaxis' && this.name !== 'yMidAxis' && plot.axes.yaxis.show) {\n                    _numberTicks = plot.axes.yaxis.numberTicks;\n                }\n            }\n        \n            min = ((this.min != null) ? this.min : db.min);\n            max = ((this.max != null) ? this.max : db.max);\n\n            var range = max - min;\n            var rmin, rmax;\n            var temp;\n\n            if (this.tickOptions == null || !this.tickOptions.formatString) {\n                this._overrideFormatString = true;\n            }\n\n            // Doing complete autoscaling\n            if (this.min == null || this.max == null && this.tickInterval == null && !this.autoscale) {\n                // Check if user must have tick at 0 or 100 and ensure they are in range.\n                // The autoscaling algorithm will always place ticks at 0 and 100 if they are in range.\n                if (this.forceTickAt0) {\n                    if (min > 0) {\n                        min = 0;\n                    }\n                    if (max < 0) {\n                        max = 0;\n                    }\n                }\n\n                if (this.forceTickAt100) {\n                    if (min > 100) {\n                        min = 100;\n                    }\n                    if (max < 100) {\n                        max = 100;\n                    }\n                }\n\n                var keepMin = false,\n                    keepMax = false;\n\n                if (this.min != null) {\n                    keepMin = true;\n                }\n\n                else if (this.max != null) {\n                    keepMax = true;\n                }\n\n                // var threshold = 30;\n                // var tdim = Math.max(dim, threshold+1);\n                // this._scalefact =  (tdim-threshold)/300.0;\n                var ret = $.jqplot.LinearTickGenerator(min, max, this._scalefact, _numberTicks, keepMin, keepMax); \n                // calculate a padded max and min, points should be less than these\n                // so that they aren't too close to the edges of the plot.\n                // User can adjust how much padding is allowed with pad, padMin and PadMax options. \n                // If min or max is set, don't pad that end of axis.\n                var tumin = (this.min != null) ? min : min + range*(this.padMin - 1);\n                var tumax = (this.max != null) ? max : max - range*(this.padMax - 1);\n\n                // if they're equal, we shouldn't have to do anything, right?\n                // if (min <=tumin || max >= tumax) {\n                if (min <tumin || max > tumax) {\n                    tumin = (this.min != null) ? min : min - range*(this.padMin - 1);\n                    tumax = (this.max != null) ? max : max + range*(this.padMax - 1);\n                    ret = $.jqplot.LinearTickGenerator(tumin, tumax, this._scalefact, _numberTicks, keepMin, keepMax);\n                }\n\n                this.min = ret[0];\n                this.max = ret[1];\n                // if numberTicks specified, it should return the same.\n                this.numberTicks = ret[2];\n                this._autoFormatString = ret[3];\n                this.tickInterval = ret[4];\n            }\n\n            // User has specified some axis scale related option, can use auto algorithm\n            else {\n                \n                // if min and max are same, space them out a bit\n                if (min == max) {\n                    var adj = 0.05;\n                    if (min > 0) {\n                        adj = Math.max(Math.log(min)/Math.LN10, 0.05);\n                    }\n                    min -= adj;\n                    max += adj;\n                }\n                \n                // autoscale.  Can't autoscale if min or max is supplied.\n                // Will use numberTicks and tickInterval if supplied.  Ticks\n                // across multiple axes may not line up depending on how\n                // bars are to be plotted.\n                if (this.autoscale && this.min == null && this.max == null) {\n                    var rrange, ti, margin;\n                    var forceMinZero = false;\n                    var forceZeroLine = false;\n                    var intervals = {min:null, max:null, average:null, stddev:null};\n                    // if any series are bars, or if any are fill to zero, and if this\n                    // is the axis to fill toward, check to see if we can start axis at zero.\n                    for (var i=0; i<this._series.length; i++) {\n                        var s = this._series[i];\n                        var faname = (s.fillAxis == 'x') ? s._xaxis.name : s._yaxis.name;\n                        // check to see if this is the fill axis\n                        if (this.name == faname) {\n                            var vals = s._plotValues[s.fillAxis];\n                            var vmin = vals[0];\n                            var vmax = vals[0];\n                            for (var j=1; j<vals.length; j++) {\n                                if (vals[j] < vmin) {\n                                    vmin = vals[j];\n                                }\n                                else if (vals[j] > vmax) {\n                                    vmax = vals[j];\n                                }\n                            }\n                            var dp = (vmax - vmin) / vmax;\n                            // is this sries a bar?\n                            if (s.renderer.constructor == $.jqplot.BarRenderer) {\n                                // if no negative values and could also check range.\n                                if (vmin >= 0 && (s.fillToZero || dp > 0.1)) {\n                                    forceMinZero = true;\n                                }\n                                else {\n                                    forceMinZero = false;\n                                    if (s.fill && s.fillToZero && vmin < 0 && vmax > 0) {\n                                        forceZeroLine = true;\n                                    }\n                                    else {\n                                        forceZeroLine = false;\n                                    }\n                                }\n                            }\n                            \n                            // if not a bar and filling, use appropriate method.\n                            else if (s.fill) {\n                                if (vmin >= 0 && (s.fillToZero || dp > 0.1)) {\n                                    forceMinZero = true;\n                                }\n                                else if (vmin < 0 && vmax > 0 && s.fillToZero) {\n                                    forceMinZero = false;\n                                    forceZeroLine = true;\n                                }\n                                else {\n                                    forceMinZero = false;\n                                    forceZeroLine = false;\n                                }\n                            }\n                            \n                            // if not a bar and not filling, only change existing state\n                            // if it doesn't make sense\n                            else if (vmin < 0) {\n                                forceMinZero = false;\n                            }\n                        }\n                    }\n                    \n                    // check if we need make axis min at 0.\n                    if (forceMinZero) {\n                        // compute number of ticks\n                        this.numberTicks = 2 + Math.ceil((dim-(this.tickSpacing-1))/this.tickSpacing);\n                        this.min = 0;\n                        userMin = 0;\n                        // what order is this range?\n                        // what tick interval does that give us?\n                        ti = max/(this.numberTicks-1);\n                        temp = Math.pow(10, Math.abs(Math.floor(Math.log(ti)/Math.LN10)));\n                        if (ti/temp == parseInt(ti/temp, 10)) {\n                            ti += temp;\n                        }\n                        this.tickInterval = Math.ceil(ti/temp) * temp;\n                        this.max = this.tickInterval * (this.numberTicks - 1);\n                    }\n                    \n                    // check if we need to make sure there is a tick at 0.\n                    else if (forceZeroLine) {\n                        // compute number of ticks\n                        this.numberTicks = 2 + Math.ceil((dim-(this.tickSpacing-1))/this.tickSpacing);\n                        var ntmin = Math.ceil(Math.abs(min)/range*(this.numberTicks-1));\n                        var ntmax = this.numberTicks - 1  - ntmin;\n                        ti = Math.max(Math.abs(min/ntmin), Math.abs(max/ntmax));\n                        temp = Math.pow(10, Math.abs(Math.floor(Math.log(ti)/Math.LN10)));\n                        this.tickInterval = Math.ceil(ti/temp) * temp;\n                        this.max = this.tickInterval * ntmax;\n                        this.min = -this.tickInterval * ntmin;\n                    }\n                    \n                    // if nothing else, do autoscaling which will try to line up ticks across axes.\n                    else {  \n                        if (this.numberTicks == null){\n                            if (this.tickInterval) {\n                                this.numberTicks = 3 + Math.ceil(range / this.tickInterval);\n                            }\n                            else {\n                                this.numberTicks = 2 + Math.ceil((dim-(this.tickSpacing-1))/this.tickSpacing);\n                            }\n                        }\n                \n                        if (this.tickInterval == null) {\n                            // get a tick interval\n                            ti = range/(this.numberTicks - 1);\n\n                            if (ti < 1) {\n                                temp = Math.pow(10, Math.abs(Math.floor(Math.log(ti)/Math.LN10)));\n                            }\n                            else {\n                                temp = 1;\n                            }\n                            this.tickInterval = Math.ceil(ti*temp*this.pad)/temp;\n                        }\n                        else {\n                            temp = 1 / this.tickInterval;\n                        }\n                        \n                        // try to compute a nicer, more even tick interval\n                        // temp = Math.pow(10, Math.floor(Math.log(ti)/Math.LN10));\n                        // this.tickInterval = Math.ceil(ti/temp) * temp;\n                        rrange = this.tickInterval * (this.numberTicks - 1);\n                        margin = (rrange - range)/2;\n           \n                        if (this.min == null) {\n                            this.min = Math.floor(temp*(min-margin))/temp;\n                        }\n                        if (this.max == null) {\n                            this.max = this.min + rrange;\n                        }\n                    }\n\n                    // Compute a somewhat decent format string if it is needed.\n                    // get precision of interval and determine a format string.\n                    var sf = $.jqplot.getSignificantFigures(this.tickInterval);\n\n                    var fstr;\n\n                    // if we have only a whole number, use integer formatting\n                    if (sf.digitsLeft >= sf.significantDigits) {\n                        fstr = '%d';\n                    }\n\n                    else {\n                        var temp = Math.max(0, 5 - sf.digitsLeft);\n                        temp = Math.min(temp, sf.digitsRight);\n                        fstr = '%.'+ temp + 'f';\n                    }\n\n                    this._autoFormatString = fstr;\n                }\n                \n                // Use the default algorithm which pads each axis to make the chart\n                // centered nicely on the grid.\n                else {\n\n                    rmin = (this.min != null) ? this.min : min - range*(this.padMin - 1);\n                    rmax = (this.max != null) ? this.max : max + range*(this.padMax - 1);\n                    range = rmax - rmin;\n        \n                    if (this.numberTicks == null){\n                        // if tickInterval is specified by user, we will ignore computed maximum.\n                        // max will be equal or greater to fit even # of ticks.\n                        if (this.tickInterval != null) {\n                            this.numberTicks = Math.ceil((rmax - rmin)/this.tickInterval)+1;\n                        }\n                        else if (dim > 100) {\n                            this.numberTicks = parseInt(3+(dim-100)/75, 10);\n                        }\n                        else {\n                            this.numberTicks = 2;\n                        }\n                    }\n                \n                    if (this.tickInterval == null) {\n                        this.tickInterval = range / (this.numberTicks-1);\n                    }\n                    \n                    if (this.max == null) {\n                        rmax = rmin + this.tickInterval*(this.numberTicks - 1);\n                    }        \n                    if (this.min == null) {\n                        rmin = rmax - this.tickInterval*(this.numberTicks - 1);\n                    }\n\n                    // get precision of interval and determine a format string.\n                    var sf = $.jqplot.getSignificantFigures(this.tickInterval);\n\n                    var fstr;\n\n                    // if we have only a whole number, use integer formatting\n                    if (sf.digitsLeft >= sf.significantDigits) {\n                        fstr = '%d';\n                    }\n\n                    else {\n                        var temp = Math.max(0, 5 - sf.digitsLeft);\n                        temp = Math.min(temp, sf.digitsRight);\n                        fstr = '%.'+ temp + 'f';\n                    }\n\n\n                    this._autoFormatString = fstr;\n\n                    this.min = rmin;\n                    this.max = rmax;\n                }\n                \n                if (this.renderer.constructor == $.jqplot.LinearAxisRenderer && this._autoFormatString == '') {\n                    // fix for misleading tick display with small range and low precision.\n                    range = this.max - this.min;\n                    // figure out precision\n                    var temptick = new this.tickRenderer(this.tickOptions);\n                    // use the tick formatString or, the default.\n                    var fs = temptick.formatString || $.jqplot.config.defaultTickFormatString; \n                    var fs = fs.match($.jqplot.sprintf.regex)[0];\n                    var precision = 0;\n                    if (fs) {\n                        if (fs.search(/[fFeEgGpP]/) > -1) {\n                            var m = fs.match(/\\%\\.(\\d{0,})?[eEfFgGpP]/);\n                            if (m) {\n                                precision = parseInt(m[1], 10);\n                            }\n                            else {\n                                precision = 6;\n                            }\n                        }\n                        else if (fs.search(/[di]/) > -1) {\n                            precision = 0;\n                        }\n                        // fact will be <= 1;\n                        var fact = Math.pow(10, -precision);\n                        if (this.tickInterval < fact) {\n                            // need to correct underrange\n                            if (userNT == null && userTI == null) {\n                                this.tickInterval = fact;\n                                if (userMax == null && userMin == null) {\n                                    // this.min = Math.floor((this._dataBounds.min - this.tickInterval)/fact) * fact;\n                                    this.min = Math.floor(this._dataBounds.min/fact) * fact;\n                                    if (this.min == this._dataBounds.min) {\n                                        this.min = this._dataBounds.min - this.tickInterval;\n                                    }\n                                    // this.max = Math.ceil((this._dataBounds.max + this.tickInterval)/fact) * fact;\n                                    this.max = Math.ceil(this._dataBounds.max/fact) * fact;\n                                    if (this.max == this._dataBounds.max) {\n                                        this.max = this._dataBounds.max + this.tickInterval;\n                                    }\n                                    var n = (this.max - this.min)/this.tickInterval;\n                                    n = n.toFixed(11);\n                                    n = Math.ceil(n);\n                                    this.numberTicks = n + 1;\n                                }\n                                else if (userMax == null) {\n                                    // add one tick for top of range.\n                                    var n = (this._dataBounds.max - this.min) / this.tickInterval;\n                                    n = n.toFixed(11);\n                                    this.numberTicks = Math.ceil(n) + 2;\n                                    this.max = this.min + this.tickInterval * (this.numberTicks-1);\n                                }\n                                else if (userMin == null) {\n                                    // add one tick for bottom of range.\n                                    var n = (this.max - this._dataBounds.min) / this.tickInterval;\n                                    n = n.toFixed(11);\n                                    this.numberTicks = Math.ceil(n) + 2;\n                                    this.min = this.max - this.tickInterval * (this.numberTicks-1);\n                                }\n                                else {\n                                    // calculate a number of ticks so max is within axis scale\n                                    this.numberTicks = Math.ceil((userMax - userMin)/this.tickInterval) + 1;\n                                    // if user's min and max don't fit evenly in ticks, adjust.\n                                    // This takes care of cases such as user min set to 0, max set to 3.5 but tick\n                                    // format string set to %d (integer ticks)\n                                    this.min =  Math.floor(userMin*Math.pow(10, precision))/Math.pow(10, precision);\n                                    this.max =  Math.ceil(userMax*Math.pow(10, precision))/Math.pow(10, precision);\n                                    // this.max = this.min + this.tickInterval*(this.numberTicks-1);\n                                    this.numberTicks = Math.ceil((this.max - this.min)/this.tickInterval) + 1;\n                                }\n                            }\n                        }\n                    }\n                }\n                \n            }\n            \n            if (this._overrideFormatString && this._autoFormatString != '') {\n                this.tickOptions = this.tickOptions || {};\n                this.tickOptions.formatString = this._autoFormatString;\n            }\n\n            var t, to;\n            for (var i=0; i<this.numberTicks; i++){\n                tt = this.min + i * this.tickInterval;\n                t = new this.tickRenderer(this.tickOptions);\n                // var t = new $.jqplot.AxisTickRenderer(this.tickOptions);\n\n                t.setTick(tt, this.name);\n                this._ticks.push(t);\n\n                if (i < this.numberTicks - 1) {\n                    for (var j=0; j<this.minorTicks; j++) {\n                        tt += this.tickInterval/(this.minorTicks+1);\n                        to = $.extend(true, {}, this.tickOptions, {name:this.name, value:tt, label:'', isMinorTick:true});\n                        t = new this.tickRenderer(to);\n                        this._ticks.push(t);\n                    }\n                }\n                t = null;\n            }\n        }\n\n        if (this.tickInset) {\n            this.min = this.min - this.tickInset * this.tickInterval;\n            this.max = this.max + this.tickInset * this.tickInterval;\n        }\n\n        ticks = null;\n    };\n    \n    // Used to reset just the values of the ticks and then repack, which will\n    // recalculate the positioning functions.  It is assuemd that the \n    // number of ticks is the same and the values of the new array are at the\n    // proper interval.\n    // This method needs to be called with the scope of an axis object, like:\n    //\n    // > plot.axes.yaxis.renderer.resetTickValues.call(plot.axes.yaxis, yarr);\n    //\n    $.jqplot.LinearAxisRenderer.prototype.resetTickValues = function(opts) {\n        if ($.isArray(opts) && opts.length == this._ticks.length) {\n            var t;\n            for (var i=0; i<opts.length; i++) {\n                t = this._ticks[i];\n                t.value = opts[i];\n                t.label = t.formatter(t.formatString, opts[i]);\n                t.label = t.prefix + t.label;\n                t._elem.html(t.label);\n            }\n            t = null;\n            this.min = $.jqplot.arrayMin(opts);\n            this.max = $.jqplot.arrayMax(opts);\n            this.pack();\n        }\n        // Not implemented yet.\n        // else if ($.isPlainObject(opts)) {\n        // \n        // }\n    };\n    \n    // called with scope of axis\n    $.jqplot.LinearAxisRenderer.prototype.pack = function(pos, offsets) {\n        // Add defaults for repacking from resetTickValues function.\n        pos = pos || {};\n        offsets = offsets || this._offsets;\n        \n        var ticks = this._ticks;\n        var max = this.max;\n        var min = this.min;\n        var offmax = offsets.max;\n        var offmin = offsets.min;\n        var lshow = (this._label == null) ? false : this._label.show;\n        \n        for (var p in pos) {\n            this._elem.css(p, pos[p]);\n        }\n        \n        this._offsets = offsets;\n        // pixellength will be + for x axes and - for y axes becasue pixels always measured from top left.\n        var pixellength = offmax - offmin;\n        var unitlength = max - min;\n        \n        // point to unit and unit to point conversions references to Plot DOM element top left corner.\n        if (this.breakPoints) {\n            unitlength = unitlength - this.breakPoints[1] + this.breakPoints[0];\n            \n            this.p2u = function(p){\n                return (p - offmin) * unitlength / pixellength + min;\n            };\n        \n            this.u2p = function(u){\n                if (u > this.breakPoints[0] && u < this.breakPoints[1]){\n                    u = this.breakPoints[0];\n                }\n                if (u <= this.breakPoints[0]) {\n                    return (u - min) * pixellength / unitlength + offmin;\n                }\n                else {\n                    return (u - this.breakPoints[1] + this.breakPoints[0] - min) * pixellength / unitlength + offmin;\n                }\n            };\n                \n            if (this.name.charAt(0) == 'x'){\n                this.series_u2p = function(u){\n                    if (u > this.breakPoints[0] && u < this.breakPoints[1]){\n                        u = this.breakPoints[0];\n                    }\n                    if (u <= this.breakPoints[0]) {\n                        return (u - min) * pixellength / unitlength;\n                    }\n                    else {\n                        return (u - this.breakPoints[1] + this.breakPoints[0] - min) * pixellength / unitlength;\n                    }\n                };\n                this.series_p2u = function(p){\n                    return p * unitlength / pixellength + min;\n                };\n            }\n        \n            else {\n                this.series_u2p = function(u){\n                    if (u > this.breakPoints[0] && u < this.breakPoints[1]){\n                        u = this.breakPoints[0];\n                    }\n                    if (u >= this.breakPoints[1]) {\n                        return (u - max) * pixellength / unitlength;\n                    }\n                    else {\n                        return (u + this.breakPoints[1] - this.breakPoints[0] - max) * pixellength / unitlength;\n                    }\n                };\n                this.series_p2u = function(p){\n                    return p * unitlength / pixellength + max;\n                };\n            }\n        }\n        else {\n            this.p2u = function(p){\n                return (p - offmin) * unitlength / pixellength + min;\n            };\n        \n            this.u2p = function(u){\n                return (u - min) * pixellength / unitlength + offmin;\n            };\n                \n            if (this.name == 'xaxis' || this.name == 'x2axis'){\n                this.series_u2p = function(u){\n                    return (u - min) * pixellength / unitlength;\n                };\n                this.series_p2u = function(p){\n                    return p * unitlength / pixellength + min;\n                };\n            }\n        \n            else {\n                this.series_u2p = function(u){\n                    return (u - max) * pixellength / unitlength;\n                };\n                this.series_p2u = function(p){\n                    return p * unitlength / pixellength + max;\n                };\n            }\n        }\n        \n        if (this.show) {\n            if (this.name == 'xaxis' || this.name == 'x2axis') {\n                for (var i=0; i<ticks.length; i++) {\n                    var t = ticks[i];\n                    if (t.show && t.showLabel) {\n                        var shim;\n                        \n                        if (t.constructor == $.jqplot.CanvasAxisTickRenderer && t.angle) {\n                            // will need to adjust auto positioning based on which axis this is.\n                            var temp = (this.name == 'xaxis') ? 1 : -1;\n                            switch (t.labelPosition) {\n                                case 'auto':\n                                    // position at end\n                                    if (temp * t.angle < 0) {\n                                        shim = -t.getWidth() + t._textRenderer.height * Math.sin(-t._textRenderer.angle) / 2;\n                                    }\n                                    // position at start\n                                    else {\n                                        shim = -t._textRenderer.height * Math.sin(t._textRenderer.angle) / 2;\n                                    }\n                                    break;\n                                case 'end':\n                                    shim = -t.getWidth() + t._textRenderer.height * Math.sin(-t._textRenderer.angle) / 2;\n                                    break;\n                                case 'start':\n                                    shim = -t._textRenderer.height * Math.sin(t._textRenderer.angle) / 2;\n                                    break;\n                                case 'middle':\n                                    shim = -t.getWidth()/2 + t._textRenderer.height * Math.sin(-t._textRenderer.angle) / 2;\n                                    break;\n                                default:\n                                    shim = -t.getWidth()/2 + t._textRenderer.height * Math.sin(-t._textRenderer.angle) / 2;\n                                    break;\n                            }\n                        }\n                        else {\n                            shim = -t.getWidth()/2;\n                        }\n                        var val = this.u2p(t.value) + shim + 'px';\n                        t._elem.css('left', val);\n                        t.pack();\n                    }\n                }\n                if (lshow) {\n                    var w = this._label._elem.outerWidth(true);\n                    this._label._elem.css('left', offmin + pixellength/2 - w/2 + 'px');\n                    if (this.name == 'xaxis') {\n                        this._label._elem.css('bottom', '0px');\n                    }\n                    else {\n                        this._label._elem.css('top', '0px');\n                    }\n                    this._label.pack();\n                }\n            }\n            else {\n                for (var i=0; i<ticks.length; i++) {\n                    var t = ticks[i];\n                    if (t.show && t.showLabel) {                        \n                        var shim;\n                        if (t.constructor == $.jqplot.CanvasAxisTickRenderer && t.angle) {\n                            // will need to adjust auto positioning based on which axis this is.\n                            var temp = (this.name == 'yaxis') ? 1 : -1;\n                            switch (t.labelPosition) {\n                                case 'auto':\n                                    // position at end\n                                case 'end':\n                                    if (temp * t.angle < 0) {\n                                        shim = -t._textRenderer.height * Math.cos(-t._textRenderer.angle) / 2;\n                                    }\n                                    else {\n                                        shim = -t.getHeight() + t._textRenderer.height * Math.cos(t._textRenderer.angle) / 2;\n                                    }\n                                    break;\n                                case 'start':\n                                    if (t.angle > 0) {\n                                        shim = -t._textRenderer.height * Math.cos(-t._textRenderer.angle) / 2;\n                                    }\n                                    else {\n                                        shim = -t.getHeight() + t._textRenderer.height * Math.cos(t._textRenderer.angle) / 2;\n                                    }\n                                    break;\n                                case 'middle':\n                                    // if (t.angle > 0) {\n                                    //     shim = -t.getHeight()/2 + t._textRenderer.height * Math.sin(-t._textRenderer.angle) / 2;\n                                    // }\n                                    // else {\n                                    //     shim = -t.getHeight()/2 - t._textRenderer.height * Math.sin(t._textRenderer.angle) / 2;\n                                    // }\n                                    shim = -t.getHeight()/2;\n                                    break;\n                                default:\n                                    shim = -t.getHeight()/2;\n                                    break;\n                            }\n                        }\n                        else {\n                            shim = -t.getHeight()/2;\n                        }\n                        \n                        var val = this.u2p(t.value) + shim + 'px';\n                        t._elem.css('top', val);\n                        t.pack();\n                    }\n                }\n                if (lshow) {\n                    var h = this._label._elem.outerHeight(true);\n                    this._label._elem.css('top', offmax - pixellength/2 - h/2 + 'px');\n                    if (this.name == 'yaxis') {\n                        this._label._elem.css('left', '0px');\n                    }\n                    else {\n                        this._label._elem.css('right', '0px');\n                    }   \n                    this._label.pack();\n                }\n            }\n        }\n\n        ticks = null;\n    };\n\n\n    /**\n    * The following code was generaously given to me a while back by Scott Prahl.\n    * He did a good job at computing axes min, max and number of ticks for the \n    * case where the user has not set any scale related parameters (tickInterval,\n    * numberTicks, min or max).  I had ignored this use case for a long time,\n    * focusing on the more difficult case where user has set some option controlling\n    * tick generation.  Anyway, about time I got this into jqPlot.\n    * Thanks Scott!!\n    */\n    \n    /**\n    * Copyright (c) 2010 Scott Prahl\n    * The next three routines are currently available for use in all personal \n    * or commercial projects under both the MIT and GPL version 2.0 licenses. \n    * This means that you can choose the license that best suits your project \n    * and use it accordingly. \n    */\n\n    // A good format string depends on the interval. If the interval is greater \n    // than 1 then there is no need to show any decimal digits. If it is < 1.0, then\n    // use the magnitude of the interval to determine the number of digits to show.\n    function bestFormatString (interval)\n    {\n        var fstr;\n        interval = Math.abs(interval);\n        if (interval >= 10) {\n            fstr = '%d';\n        }\n\n        else if (interval > 1) {\n            if (interval === parseInt(interval, 10)) {\n                fstr = '%d';\n            }\n            else {\n                fstr = '%.1f';\n            }\n        }\n\n        else {\n            var expv = -Math.floor(Math.log(interval)/Math.LN10);\n            fstr = '%.' + expv + 'f';\n        }\n        \n        return fstr; \n    }\n\n    var _factors = [0.1, 0.2, 0.3, 0.4, 0.5, 0.8, 1, 2, 3, 4, 5];\n\n    var _getLowerFactor = function(f) {\n        var i = _factors.indexOf(f);\n        if (i > 0) {\n            return _factors[i-1];\n        }\n        else {\n            return _factors[_factors.length - 1] / 100;\n        }\n    };\n\n    var _getHigherFactor = function(f) {\n        var i = _factors.indexOf(f);\n        if (i < _factors.length-1) {\n            return _factors[i+1];\n        }\n        else {\n            return _factors[0] * 100;\n        }\n    };\n\n    // Given a fixed minimum and maximum and a target number ot ticks\n    // figure out the best interval and \n    // return min, max, number ticks, format string and tick interval\n    function bestConstrainedInterval(min, max, nttarget) {\n        // run through possible number to ticks and see which interval is best\n        var low = Math.floor(nttarget/2);\n        var hi = Math.ceil(nttarget*1.5);\n        var badness = Number.MAX_VALUE;\n        var r = (max - min);\n        var temp;\n        var sd;\n        var bestNT;\n        var gsf = $.jqplot.getSignificantFigures;\n        var fsd;\n        var fs;\n        var currentNT;\n        var bestPrec;\n\n        for (var i=0, l=hi-low+1; i<l; i++) {\n            currentNT = low + i;\n            temp = r/(currentNT-1);\n            sd = gsf(temp);\n\n            temp = Math.abs(nttarget - currentNT) + sd.digitsRight;\n            if (temp < badness) {\n                badness = temp;\n                bestNT = currentNT;\n                bestPrec = sd.digitsRight;\n            }\n            else if (temp === badness) {\n                // let nicer ticks trump number ot ticks\n                if (sd.digitsRight < bestPrec) {\n                    bestNT = currentNT;\n                    bestPrec = sd.digitsRight;\n                }\n            }\n\n        }\n\n        fsd = Math.max(bestPrec, Math.max(gsf(min).digitsRight, gsf(max).digitsRight));\n        if (fsd === 0) {\n            fs = '%d';\n        }\n        else {\n            fs = '%.' + fsd + 'f';\n        }\n        temp = r / (bestNT - 1);\n        // min, max, number ticks, format string, tick interval\n        return [min, max, bestNT, fs, temp];\n    }\n\n    // This will return an interval of form 2 * 10^n, 5 * 10^n or 10 * 10^n\n    // it is based soley on the range and number of ticks.  So if user specifies\n    // number of ticks, use this.\n    function bestInterval(range, numberTicks) {\n        numberTicks = numberTicks || 7;\n        var minimum = range / (numberTicks - 1);\n        var magnitude = Math.pow(10, Math.floor(Math.log(minimum) / Math.LN10));\n        var residual = minimum / magnitude;\n        var interval;\n        // \"nicest\" ranges are 1, 2, 5 or powers of these.\n        // for magnitudes below 1, only allow these. \n        if (magnitude < 1) {\n            if (residual > 5) {\n                interval = 10 * magnitude;\n            }\n            else if (residual > 2) {\n                interval = 5 * magnitude;\n            }\n            else if (residual > 1) {\n                interval = 2 * magnitude;\n            }\n            else {\n                interval = magnitude;\n            }\n        }\n        // for large ranges (whole integers), allow intervals like 3, 4 or powers of these.\n        // this helps a lot with poor choices for number of ticks. \n        else {\n            if (residual > 5) {\n                interval = 10 * magnitude;\n            }\n            else if (residual > 4) {\n                interval = 5 * magnitude;\n            }\n            else if (residual > 3) {\n                interval = 4 * magnitude;\n            }\n            else if (residual > 2) {\n                interval = 3 * magnitude;\n            }\n            else if (residual > 1) {\n                interval = 2 * magnitude;\n            }\n            else {\n                interval = magnitude;\n            }\n        }\n\n        return interval;\n    }\n\n    // This will return an interval of form 2 * 10^n, 5 * 10^n or 10 * 10^n\n    // it is based soley on the range of data, number of ticks must be computed later.\n    function bestLinearInterval(range, scalefact) {\n        scalefact = scalefact || 1;\n        var expv = Math.floor(Math.log(range)/Math.LN10);\n        var magnitude = Math.pow(10, expv);\n        // 0 < f < 10\n        var f = range / magnitude;\n        var fact;\n        // for large plots, scalefact will decrease f and increase number of ticks.\n        // for small plots, scalefact will increase f and decrease number of ticks.\n        f = f/scalefact;\n\n        // for large plots, smaller interval, more ticks.\n        if (f<=0.38) {\n            fact = 0.1;\n        }\n        else if (f<=1.6) {\n            fact = 0.2;\n        }\n        else if (f<=4.0) {\n            fact = 0.5;\n        }\n        else if (f<=8.0) {\n            fact = 1.0;\n        }\n        // for very small plots, larger interval, less ticks in number ticks\n        else if (f<=16.0) {\n            fact = 2;\n        }\n        else {\n            fact = 5;\n        } \n\n        return fact*magnitude; \n    }\n\n    function bestLinearComponents(range, scalefact) {\n        var expv = Math.floor(Math.log(range)/Math.LN10);\n        var magnitude = Math.pow(10, expv);\n        // 0 < f < 10\n        var f = range / magnitude;\n        var interval;\n        var fact;\n        // for large plots, scalefact will decrease f and increase number of ticks.\n        // for small plots, scalefact will increase f and decrease number of ticks.\n        f = f/scalefact;\n\n        // for large plots, smaller interval, more ticks.\n        if (f<=0.38) {\n            fact = 0.1;\n        }\n        else if (f<=1.6) {\n            fact = 0.2;\n        }\n        else if (f<=4.0) {\n            fact = 0.5;\n        }\n        else if (f<=8.0) {\n            fact = 1.0;\n        }\n        // for very small plots, larger interval, less ticks in number ticks\n        else if (f<=16.0) {\n            fact = 2;\n        }\n        // else if (f<=20.0) {\n        //     fact = 3;\n        // }\n        // else if (f<=24.0) {\n        //     fact = 4;\n        // }\n        else {\n            fact = 5;\n        } \n\n        interval = fact * magnitude;\n\n        return [interval, fact, magnitude];\n    }\n\n    // Given the min and max for a dataset, return suitable endpoints\n    // for the graphing, a good number for the number of ticks, and a\n    // format string so that extraneous digits are not displayed.\n    // returned is an array containing [min, max, nTicks, format]\n    $.jqplot.LinearTickGenerator = function(axis_min, axis_max, scalefact, numberTicks, keepMin, keepMax) {\n        // Set to preserve EITHER min OR max.\n        // If min is preserved, max must be free.\n        keepMin = (keepMin === null) ? false : keepMin;\n        keepMax = (keepMax === null || keepMin) ? false : keepMax;\n        // if endpoints are equal try to include zero otherwise include one\n        if (axis_min === axis_max) {\n            axis_max = (axis_max) ? 0 : 1;\n        }\n\n        scalefact = scalefact || 1.0;\n\n        // make sure range is positive\n        if (axis_max < axis_min) {\n            var a = axis_max;\n            axis_max = axis_min;\n            axis_min = a;\n        }\n\n        var r = [];\n        var ss = bestLinearInterval(axis_max - axis_min, scalefact);\n\n        var gsf = $.jqplot.getSignificantFigures;\n        \n        if (numberTicks == null) {\n\n            // Figure out the axis min, max and number of ticks\n            // the min and max will be some multiple of the tick interval,\n            // 1*10^n, 2*10^n or 5*10^n.  This gaurantees that, if the\n            // axis min is negative, 0 will be a tick.\n            if (!keepMin && !keepMax) {\n                r[0] = Math.floor(axis_min / ss) * ss;  // min\n                r[1] = Math.ceil(axis_max / ss) * ss;   // max\n                r[2] = Math.round((r[1]-r[0])/ss+1.0);  // number of ticks\n                r[3] = bestFormatString(ss);            // format string\n                r[4] = ss;                              // tick Interval\n            }\n\n            else if (keepMin) {\n                r[0] = axis_min;                                        // min\n                r[2] = Math.ceil((axis_max - axis_min) / ss + 1.0);     // number of ticks\n                r[1] = axis_min + (r[2] - 1) * ss;                      // max\n                var digitsMin = gsf(axis_min).digitsRight;\n                var digitsSS = gsf(ss).digitsRight;\n                if (digitsMin < digitsSS) {\n                    r[3] = bestFormatString(ss);                        // format string\n                }\n                else {\n                    r[3] = '%.' + digitsMin + 'f';\n                }\n                r[4] = ss;                                              // tick Interval\n            }\n\n            else if (keepMax) {\n                r[1] = axis_max;                                        // max\n                r[2] = Math.ceil((axis_max - axis_min) / ss + 1.0);     // number of ticks\n                r[0] = axis_max - (r[2] - 1) * ss;                      // min\n                var digitsMax = gsf(axis_max).digitsRight;\n                var digitsSS = gsf(ss).digitsRight;\n                if (digitsMax < digitsSS) {\n                    r[3] = bestFormatString(ss);                        // format string\n                }\n                else {\n                    r[3] = '%.' + digitsMax + 'f';\n                }\n                r[4] = ss;                                              // tick Interval\n            }\n        }\n\n        else {\n            var tempr = [];\n\n            // Figure out the axis min, max and number of ticks\n            // the min and max will be some multiple of the tick interval,\n            // 1*10^n, 2*10^n or 5*10^n.  This gaurantees that, if the\n            // axis min is negative, 0 will be a tick.\n            tempr[0] = Math.floor(axis_min / ss) * ss;  // min\n            tempr[1] = Math.ceil(axis_max / ss) * ss;   // max\n            tempr[2] = Math.round((tempr[1]-tempr[0])/ss+1.0);    // number of ticks\n            tempr[3] = bestFormatString(ss);            // format string\n            tempr[4] = ss;                              // tick Interval\n\n            // first, see if we happen to get the right number of ticks\n            if (tempr[2] === numberTicks) {\n                r = tempr;\n            }\n\n            else {\n\n                var newti = bestInterval(tempr[1] - tempr[0], numberTicks);\n\n                r[0] = tempr[0];                        // min\n                r[2] = numberTicks;                     // number of ticks\n                r[4] = newti;                           // tick interval\n                r[3] = bestFormatString(newti);         // format string\n                r[1] = r[0] + (r[2] - 1) * r[4];        // max\n            }\n        }\n\n        return r;\n    };\n\n    $.jqplot.LinearTickGenerator.bestLinearInterval = bestLinearInterval;\n    $.jqplot.LinearTickGenerator.bestInterval = bestInterval;\n    $.jqplot.LinearTickGenerator.bestLinearComponents = bestLinearComponents;\n    $.jqplot.LinearTickGenerator.bestConstrainedInterval = bestConstrainedInterval;\n\n\n    // class: $.jqplot.MarkerRenderer\n    // The default jqPlot marker renderer, rendering the points on the line.\n    $.jqplot.MarkerRenderer = function(options){\n        // Group: Properties\n        \n        // prop: show\n        // whether or not to show the marker.\n        this.show = true;\n        // prop: style\n        // One of diamond, circle, square, x, plus, dash, filledDiamond, filledCircle, filledSquare\n        this.style = 'filledCircle';\n        // prop: lineWidth\n        // size of the line for non-filled markers.\n        this.lineWidth = 2;\n        // prop: size\n        // Size of the marker (diameter or circle, length of edge of square, etc.)\n        this.size = 9.0;\n        // prop: color\n        // color of marker.  Will be set to color of series by default on init.\n        this.color = '#666666';\n        // prop: shadow\n        // whether or not to draw a shadow on the line\n        this.shadow = true;\n        // prop: shadowAngle\n        // Shadow angle in degrees\n        this.shadowAngle = 45;\n        // prop: shadowOffset\n        // Shadow offset from line in pixels\n        this.shadowOffset = 1;\n        // prop: shadowDepth\n        // Number of times shadow is stroked, each stroke offset shadowOffset from the last.\n        this.shadowDepth = 3;\n        // prop: shadowAlpha\n        // Alpha channel transparency of shadow.  0 = transparent.\n        this.shadowAlpha = '0.07';\n        // prop: shadowRenderer\n        // Renderer that will draws the shadows on the marker.\n        this.shadowRenderer = new $.jqplot.ShadowRenderer();\n        // prop: shapeRenderer\n        // Renderer that will draw the marker.\n        this.shapeRenderer = new $.jqplot.ShapeRenderer();\n        \n        $.extend(true, this, options);\n    };\n    \n    $.jqplot.MarkerRenderer.prototype.init = function(options) {\n        $.extend(true, this, options);\n        var sdopt = {angle:this.shadowAngle, offset:this.shadowOffset, alpha:this.shadowAlpha, lineWidth:this.lineWidth, depth:this.shadowDepth, closePath:true};\n        if (this.style.indexOf('filled') != -1) {\n            sdopt.fill = true;\n        }\n        if (this.style.indexOf('ircle') != -1) {\n            sdopt.isarc = true;\n            sdopt.closePath = false;\n        }\n        this.shadowRenderer.init(sdopt);\n        \n        var shopt = {fill:false, isarc:false, strokeStyle:this.color, fillStyle:this.color, lineWidth:this.lineWidth, closePath:true};\n        if (this.style.indexOf('filled') != -1) {\n            shopt.fill = true;\n        }\n        if (this.style.indexOf('ircle') != -1) {\n            shopt.isarc = true;\n            shopt.closePath = false;\n        }\n        this.shapeRenderer.init(shopt);\n    };\n    \n    $.jqplot.MarkerRenderer.prototype.drawDiamond = function(x, y, ctx, fill, options) {\n        var stretch = 1.2;\n        var dx = this.size/2/stretch;\n        var dy = this.size/2*stretch;\n        var points = [[x-dx, y], [x, y+dy], [x+dx, y], [x, y-dy]];\n        if (this.shadow) {\n            this.shadowRenderer.draw(ctx, points);\n        }\n        this.shapeRenderer.draw(ctx, points, options);\n    };\n    \n    $.jqplot.MarkerRenderer.prototype.drawPlus = function(x, y, ctx, fill, options) {\n        var stretch = 1.0;\n        var dx = this.size/2*stretch;\n        var dy = this.size/2*stretch;\n        var points1 = [[x, y-dy], [x, y+dy]];\n        var points2 = [[x+dx, y], [x-dx, y]];\n        var opts = $.extend(true, {}, this.options, {closePath:false});\n        if (this.shadow) {\n            this.shadowRenderer.draw(ctx, points1, {closePath:false});\n            this.shadowRenderer.draw(ctx, points2, {closePath:false});\n        }\n        this.shapeRenderer.draw(ctx, points1, opts);\n        this.shapeRenderer.draw(ctx, points2, opts);\n    };\n    \n    $.jqplot.MarkerRenderer.prototype.drawX = function(x, y, ctx, fill, options) {\n        var stretch = 1.0;\n        var dx = this.size/2*stretch;\n        var dy = this.size/2*stretch;\n        var opts = $.extend(true, {}, this.options, {closePath:false});\n        var points1 = [[x-dx, y-dy], [x+dx, y+dy]];\n        var points2 = [[x-dx, y+dy], [x+dx, y-dy]];\n        if (this.shadow) {\n            this.shadowRenderer.draw(ctx, points1, {closePath:false});\n            this.shadowRenderer.draw(ctx, points2, {closePath:false});\n        }\n        this.shapeRenderer.draw(ctx, points1, opts);\n        this.shapeRenderer.draw(ctx, points2, opts);\n    };\n    \n    $.jqplot.MarkerRenderer.prototype.drawDash = function(x, y, ctx, fill, options) {\n        var stretch = 1.0;\n        var dx = this.size/2*stretch;\n        var dy = this.size/2*stretch;\n        var points = [[x-dx, y], [x+dx, y]];\n        if (this.shadow) {\n            this.shadowRenderer.draw(ctx, points);\n        }\n        this.shapeRenderer.draw(ctx, points, options);\n    };\n    \n    $.jqplot.MarkerRenderer.prototype.drawLine = function(p1, p2, ctx, fill, options) {\n        var points = [p1, p2];\n        if (this.shadow) {\n            this.shadowRenderer.draw(ctx, points);\n        }\n        this.shapeRenderer.draw(ctx, points, options);\n    };\n    \n    $.jqplot.MarkerRenderer.prototype.drawSquare = function(x, y, ctx, fill, options) {\n        var stretch = 1.0;\n        var dx = this.size/2/stretch;\n        var dy = this.size/2*stretch;\n        var points = [[x-dx, y-dy], [x-dx, y+dy], [x+dx, y+dy], [x+dx, y-dy]];\n        if (this.shadow) {\n            this.shadowRenderer.draw(ctx, points);\n        }\n        this.shapeRenderer.draw(ctx, points, options);\n    };\n    \n    $.jqplot.MarkerRenderer.prototype.drawCircle = function(x, y, ctx, fill, options) {\n        var radius = this.size/2;\n        var end = 2*Math.PI;\n        var points = [x, y, radius, 0, end, true];\n        if (this.shadow) {\n            this.shadowRenderer.draw(ctx, points);\n        }\n        this.shapeRenderer.draw(ctx, points, options);\n    };\n    \n    $.jqplot.MarkerRenderer.prototype.draw = function(x, y, ctx, options) {\n        options = options || {};\n        // hack here b/c shape renderer uses canvas based color style options\n        // and marker uses css style names.\n        if (options.show == null || options.show != false) {\n            if (options.color && !options.fillStyle) {\n                options.fillStyle = options.color;\n            }\n            if (options.color && !options.strokeStyle) {\n                options.strokeStyle = options.color;\n            }\n            switch (this.style) {\n                case 'diamond':\n                    this.drawDiamond(x,y,ctx, false, options);\n                    break;\n                case 'filledDiamond':\n                    this.drawDiamond(x,y,ctx, true, options);\n                    break;\n                case 'circle':\n                    this.drawCircle(x,y,ctx, false, options);\n                    break;\n                case 'filledCircle':\n                    this.drawCircle(x,y,ctx, true, options);\n                    break;\n                case 'square':\n                    this.drawSquare(x,y,ctx, false, options);\n                    break;\n                case 'filledSquare':\n                    this.drawSquare(x,y,ctx, true, options);\n                    break;\n                case 'x':\n                    this.drawX(x,y,ctx, true, options);\n                    break;\n                case 'plus':\n                    this.drawPlus(x,y,ctx, true, options);\n                    break;\n                case 'dash':\n                    this.drawDash(x,y,ctx, true, options);\n                    break;\n                case 'line':\n                    this.drawLine(x, y, ctx, false, options);\n                    break;\n                default:\n                    this.drawDiamond(x,y,ctx, false, options);\n                    break;\n            }\n        }\n    };\n    \n    // class: $.jqplot.shadowRenderer\n    // The default jqPlot shadow renderer, rendering shadows behind shapes.\n    $.jqplot.ShadowRenderer = function(options){ \n        // Group: Properties\n        \n        // prop: angle\n        // Angle of the shadow in degrees.  Measured counter-clockwise from the x axis.\n        this.angle = 45;\n        // prop: offset\n        // Pixel offset at the given shadow angle of each shadow stroke from the last stroke.\n        this.offset = 1;\n        // prop: alpha\n        // alpha transparency of shadow stroke.\n        this.alpha = 0.07;\n        // prop: lineWidth\n        // width of the shadow line stroke.\n        this.lineWidth = 1.5;\n        // prop: lineJoin\n        // How line segments of the shadow are joined.\n        this.lineJoin = 'miter';\n        // prop: lineCap\n        // how ends of the shadow line are rendered.\n        this.lineCap = 'round';\n        // prop; closePath\n        // whether line path segment is closed upon itself.\n        this.closePath = false;\n        // prop: fill\n        // whether to fill the shape.\n        this.fill = false;\n        // prop: depth\n        // how many times the shadow is stroked.  Each stroke will be offset by offset at angle degrees.\n        this.depth = 3;\n        this.strokeStyle = 'rgba(0,0,0,0.1)';\n        // prop: isarc\n        // whether the shadow is an arc or not.\n        this.isarc = false;\n        \n        $.extend(true, this, options);\n    };\n    \n    $.jqplot.ShadowRenderer.prototype.init = function(options) {\n        $.extend(true, this, options);\n    };\n    \n    // function: draw\n    // draws an transparent black (i.e. gray) shadow.\n    //\n    // ctx - canvas drawing context\n    // points - array of points or [x, y, radius, start angle (rad), end angle (rad)]\n    $.jqplot.ShadowRenderer.prototype.draw = function(ctx, points, options) {\n        ctx.save();\n        var opts = (options != null) ? options : {};\n        var fill = (opts.fill != null) ? opts.fill : this.fill;\n        var fillRect = (opts.fillRect != null) ? opts.fillRect : this.fillRect;\n        var closePath = (opts.closePath != null) ? opts.closePath : this.closePath;\n        var offset = (opts.offset != null) ? opts.offset : this.offset;\n        var alpha = (opts.alpha != null) ? opts.alpha : this.alpha;\n        var depth = (opts.depth != null) ? opts.depth : this.depth;\n        var isarc = (opts.isarc != null) ? opts.isarc : this.isarc;\n        var linePattern = (opts.linePattern != null) ? opts.linePattern : this.linePattern;\n        ctx.lineWidth = (opts.lineWidth != null) ? opts.lineWidth : this.lineWidth;\n        ctx.lineJoin = (opts.lineJoin != null) ? opts.lineJoin : this.lineJoin;\n        ctx.lineCap = (opts.lineCap != null) ? opts.lineCap : this.lineCap;\n        ctx.strokeStyle = opts.strokeStyle || this.strokeStyle || 'rgba(0,0,0,'+alpha+')';\n        ctx.fillStyle = opts.fillStyle || this.fillStyle || 'rgba(0,0,0,'+alpha+')';\n        for (var j=0; j<depth; j++) {\n            var ctxPattern = $.jqplot.LinePattern(ctx, linePattern);\n            ctx.translate(Math.cos(this.angle*Math.PI/180)*offset, Math.sin(this.angle*Math.PI/180)*offset);\n            ctxPattern.beginPath();\n            if (isarc) {\n                ctx.arc(points[0], points[1], points[2], points[3], points[4], true);                \n            }\n            else if (fillRect) {\n                if (fillRect) {\n                    ctx.fillRect(points[0], points[1], points[2], points[3]);\n                }\n            }\n            else if (points && points.length){\n                var move = true;\n                for (var i=0; i<points.length; i++) {\n                    // skip to the first non-null point and move to it.\n                    if (points[i][0] != null && points[i][1] != null) {\n                        if (move) {\n                            ctxPattern.moveTo(points[i][0], points[i][1]);\n                            move = false;\n                        }\n                        else {\n                            ctxPattern.lineTo(points[i][0], points[i][1]);\n                        }\n                    }\n                    else {\n                        move = true;\n                    }\n                }\n                \n            }\n            if (closePath) {\n                ctxPattern.closePath();\n            }\n            if (fill) {\n                ctx.fill();\n            }\n            else {\n                ctx.stroke();\n            }\n        }\n        ctx.restore();\n    };\n    \n    // class: $.jqplot.shapeRenderer\n    // The default jqPlot shape renderer.  Given a set of points will\n    // plot them and either stroke a line (fill = false) or fill them (fill = true).\n    // If a filled shape is desired, closePath = true must also be set to close\n    // the shape.\n    $.jqplot.ShapeRenderer = function(options){\n        \n        this.lineWidth = 1.5;\n        // prop: linePattern\n        // line pattern 'dashed', 'dotted', 'solid', some combination\n        // of '-' and '.' characters such as '.-.' or a numerical array like \n        // [draw, skip, draw, skip, ...] such as [1, 10] to draw a dotted line, \n        // [1, 10, 20, 10] to draw a dot-dash line, and so on.\n        this.linePattern = 'solid';\n        // prop: lineJoin\n        // How line segments of the shadow are joined.\n        this.lineJoin = 'miter';\n        // prop: lineCap\n        // how ends of the shadow line are rendered.\n        this.lineCap = 'round';\n        // prop; closePath\n        // whether line path segment is closed upon itself.\n        this.closePath = false;\n        // prop: fill\n        // whether to fill the shape.\n        this.fill = false;\n        // prop: isarc\n        // whether the shadow is an arc or not.\n        this.isarc = false;\n        // prop: fillRect\n        // true to draw shape as a filled rectangle.\n        this.fillRect = false;\n        // prop: strokeRect\n        // true to draw shape as a stroked rectangle.\n        this.strokeRect = false;\n        // prop: clearRect\n        // true to cear a rectangle.\n        this.clearRect = false;\n        // prop: strokeStyle\n        // css color spec for the stoke style\n        this.strokeStyle = '#999999';\n        // prop: fillStyle\n        // css color spec for the fill style.\n        this.fillStyle = '#999999'; \n        \n        $.extend(true, this, options);\n    };\n    \n    $.jqplot.ShapeRenderer.prototype.init = function(options) {\n        $.extend(true, this, options);\n    };\n    \n    // function: draw\n    // draws the shape.\n    //\n    // ctx - canvas drawing context\n    // points - array of points for shapes or \n    // [x, y, width, height] for rectangles or\n    // [x, y, radius, start angle (rad), end angle (rad)] for circles and arcs.\n    $.jqplot.ShapeRenderer.prototype.draw = function(ctx, points, options) {\n        ctx.save();\n        var opts = (options != null) ? options : {};\n        var fill = (opts.fill != null) ? opts.fill : this.fill;\n        var closePath = (opts.closePath != null) ? opts.closePath : this.closePath;\n        var fillRect = (opts.fillRect != null) ? opts.fillRect : this.fillRect;\n        var strokeRect = (opts.strokeRect != null) ? opts.strokeRect : this.strokeRect;\n        var clearRect = (opts.clearRect != null) ? opts.clearRect : this.clearRect;\n        var isarc = (opts.isarc != null) ? opts.isarc : this.isarc;\n        var linePattern = (opts.linePattern != null) ? opts.linePattern : this.linePattern;\n        var ctxPattern = $.jqplot.LinePattern(ctx, linePattern);\n        ctx.lineWidth = opts.lineWidth || this.lineWidth;\n        ctx.lineJoin = opts.lineJoin || this.lineJoin;\n        ctx.lineCap = opts.lineCap || this.lineCap;\n        ctx.strokeStyle = (opts.strokeStyle || opts.color) || this.strokeStyle;\n        ctx.fillStyle = opts.fillStyle || this.fillStyle;\n        ctx.beginPath();\n        if (isarc) {\n            ctx.arc(points[0], points[1], points[2], points[3], points[4], true);   \n            if (closePath) {\n                ctx.closePath();\n            }\n            if (fill) {\n                ctx.fill();\n            }\n            else {\n                ctx.stroke();\n            }\n            ctx.restore();\n            return;\n        }\n        else if (clearRect) {\n            ctx.clearRect(points[0], points[1], points[2], points[3]);\n            ctx.restore();\n            return;\n        }\n        else if (fillRect || strokeRect) {\n            if (fillRect) {\n                ctx.fillRect(points[0], points[1], points[2], points[3]);\n            }\n            if (strokeRect) {\n                ctx.strokeRect(points[0], points[1], points[2], points[3]);\n                ctx.restore();\n                return;\n            }\n        }\n        else if (points && points.length){\n            var move = true;\n            for (var i=0; i<points.length; i++) {\n                // skip to the first non-null point and move to it.\n                if (points[i][0] != null && points[i][1] != null) {\n                    if (move) {\n                        ctxPattern.moveTo(points[i][0], points[i][1]);\n                        move = false;\n                    }\n                    else {\n                        ctxPattern.lineTo(points[i][0], points[i][1]);\n                    }\n                }\n                else {\n                    move = true;\n                }\n            }\n            if (closePath) {\n                ctxPattern.closePath();\n            }\n            if (fill) {\n                ctx.fill();\n            }\n            else {\n                ctx.stroke();\n            }\n        }\n        ctx.restore();\n    };\n    \n    // class $.jqplot.TableLegendRenderer\n    // The default legend renderer for jqPlot.\n    $.jqplot.TableLegendRenderer = function(){\n        //\n    };\n    \n    $.jqplot.TableLegendRenderer.prototype.init = function(options) {\n        $.extend(true, this, options);\n    };\n        \n    $.jqplot.TableLegendRenderer.prototype.addrow = function (label, color, pad, reverse) {\n        var rs = (pad) ? this.rowSpacing+'px' : '0px';\n        var tr;\n        var td;\n        var elem;\n        var div0;\n        var div1;\n        elem = document.createElement('tr');\n        tr = $(elem);\n        tr.addClass('jqplot-table-legend');\n        elem = null;\n\n        if (reverse){\n            tr.prependTo(this._elem);\n        }\n\n        else{\n            tr.appendTo(this._elem);\n        }\n\n        if (this.showSwatches) {\n            td = $(document.createElement('td'));\n            td.addClass('jqplot-table-legend jqplot-table-legend-swatch');\n            td.css({textAlign: 'center', paddingTop: rs});\n\n            div0 = $(document.createElement('div'));\n            div0.addClass('jqplot-table-legend-swatch-outline');\n            div1 = $(document.createElement('div'));\n            div1.addClass('jqplot-table-legend-swatch');\n            div1.css({backgroundColor: color, borderColor: color});\n\n            tr.append(td.append(div0.append(div1)));\n\n            // $('<td class=\"jqplot-table-legend\" style=\"text-align:center;padding-top:'+rs+';\">'+\n            // '<div><div class=\"jqplot-table-legend-swatch\" style=\"background-color:'+color+';border-color:'+color+';\"></div>'+\n            // '</div></td>').appendTo(tr);\n        }\n        if (this.showLabels) {\n            td = $(document.createElement('td'));\n            td.addClass('jqplot-table-legend jqplot-table-legend-label');\n            td.css('paddingTop', rs);\n            tr.append(td);\n\n            // elem = $('<td class=\"jqplot-table-legend\" style=\"padding-top:'+rs+';\"></td>');\n            // elem.appendTo(tr);\n            if (this.escapeHtml) {\n                td.text(label);\n            }\n            else {\n                td.html(label);\n            }\n        }\n        td = null;\n        div0 = null;\n        div1 = null;\n        tr = null;\n        elem = null;\n    };\n    \n    // called with scope of legend\n    $.jqplot.TableLegendRenderer.prototype.draw = function() {\n        if (this._elem) {\n            this._elem.emptyForce();\n            this._elem = null;\n        }\n\n        if (this.show) {\n            var series = this._series;\n            // make a table.  one line label per row.\n            var elem = document.createElement('table');\n            this._elem = $(elem);\n            this._elem.addClass('jqplot-table-legend');\n\n            var ss = {position:'absolute'};\n            if (this.background) {\n                ss['background'] = this.background;\n            }\n            if (this.border) {\n                ss['border'] = this.border;\n            }\n            if (this.fontSize) {\n                ss['fontSize'] = this.fontSize;\n            }\n            if (this.fontFamily) {\n                ss['fontFamily'] = this.fontFamily;\n            }\n            if (this.textColor) {\n                ss['textColor'] = this.textColor;\n            }\n            if (this.marginTop != null) {\n                ss['marginTop'] = this.marginTop;\n            }\n            if (this.marginBottom != null) {\n                ss['marginBottom'] = this.marginBottom;\n            }\n            if (this.marginLeft != null) {\n                ss['marginLeft'] = this.marginLeft;\n            }\n            if (this.marginRight != null) {\n                ss['marginRight'] = this.marginRight;\n            }\n            \n        \n            var pad = false, \n                reverse = false,\n                s;\n            for (var i = 0; i< series.length; i++) {\n                s = series[i];\n                if (s._stack || s.renderer.constructor == $.jqplot.BezierCurveRenderer){\n                    reverse = true;\n                }\n                if (s.show && s.showLabel) {\n                    var lt = this.labels[i] || s.label.toString();\n                    if (lt) {\n                        var color = s.color;\n                        if (reverse && i < series.length - 1){\n                            pad = true;\n                        }\n                        else if (reverse && i == series.length - 1){\n                            pad = false;\n                        }\n                        this.renderer.addrow.call(this, lt, color, pad, reverse);\n                        pad = true;\n                    }\n                    // let plugins add more rows to legend.  Used by trend line plugin.\n                    for (var j=0; j<$.jqplot.addLegendRowHooks.length; j++) {\n                        var item = $.jqplot.addLegendRowHooks[j].call(this, s);\n                        if (item) {\n                            this.renderer.addrow.call(this, item.label, item.color, pad);\n                            pad = true;\n                        } \n                    }\n                    lt = null;\n                }\n            }\n        }\n        return this._elem;\n    };\n    \n    $.jqplot.TableLegendRenderer.prototype.pack = function(offsets) {\n        if (this.show) {       \n            if (this.placement == 'insideGrid') {\n                switch (this.location) {\n                    case 'nw':\n                        var a = offsets.left;\n                        var b = offsets.top;\n                        this._elem.css('left', a);\n                        this._elem.css('top', b);\n                        break;\n                    case 'n':\n                        var a = (offsets.left + (this._plotDimensions.width - offsets.right))/2 - this.getWidth()/2;\n                        var b = offsets.top;\n                        this._elem.css('left', a);\n                        this._elem.css('top', b);\n                        break;\n                    case 'ne':\n                        var a = offsets.right;\n                        var b = offsets.top;\n                        this._elem.css({right:a, top:b});\n                        break;\n                    case 'e':\n                        var a = offsets.right;\n                        var b = (offsets.top + (this._plotDimensions.height - offsets.bottom))/2 - this.getHeight()/2;\n                        this._elem.css({right:a, top:b});\n                        break;\n                    case 'se':\n                        var a = offsets.right;\n                        var b = offsets.bottom;\n                        this._elem.css({right:a, bottom:b});\n                        break;\n                    case 's':\n                        var a = (offsets.left + (this._plotDimensions.width - offsets.right))/2 - this.getWidth()/2;\n                        var b = offsets.bottom;\n                        this._elem.css({left:a, bottom:b});\n                        break;\n                    case 'sw':\n                        var a = offsets.left;\n                        var b = offsets.bottom;\n                        this._elem.css({left:a, bottom:b});\n                        break;\n                    case 'w':\n                        var a = offsets.left;\n                        var b = (offsets.top + (this._plotDimensions.height - offsets.bottom))/2 - this.getHeight()/2;\n                        this._elem.css({left:a, top:b});\n                        break;\n                    default:  // same as 'se'\n                        var a = offsets.right;\n                        var b = offsets.bottom;\n                        this._elem.css({right:a, bottom:b});\n                        break;\n                }\n                \n            }\n            else if (this.placement == 'outside'){\n                switch (this.location) {\n                    case 'nw':\n                        var a = this._plotDimensions.width - offsets.left;\n                        var b = offsets.top;\n                        this._elem.css('right', a);\n                        this._elem.css('top', b);\n                        break;\n                    case 'n':\n                        var a = (offsets.left + (this._plotDimensions.width - offsets.right))/2 - this.getWidth()/2;\n                        var b = this._plotDimensions.height - offsets.top;\n                        this._elem.css('left', a);\n                        this._elem.css('bottom', b);\n                        break;\n                    case 'ne':\n                        var a = this._plotDimensions.width - offsets.right;\n                        var b = offsets.top;\n                        this._elem.css({left:a, top:b});\n                        break;\n                    case 'e':\n                        var a = this._plotDimensions.width - offsets.right;\n                        var b = (offsets.top + (this._plotDimensions.height - offsets.bottom))/2 - this.getHeight()/2;\n                        this._elem.css({left:a, top:b});\n                        break;\n                    case 'se':\n                        var a = this._plotDimensions.width - offsets.right;\n                        var b = offsets.bottom;\n                        this._elem.css({left:a, bottom:b});\n                        break;\n                    case 's':\n                        var a = (offsets.left + (this._plotDimensions.width - offsets.right))/2 - this.getWidth()/2;\n                        var b = this._plotDimensions.height - offsets.bottom;\n                        this._elem.css({left:a, top:b});\n                        break;\n                    case 'sw':\n                        var a = this._plotDimensions.width - offsets.left;\n                        var b = offsets.bottom;\n                        this._elem.css({right:a, bottom:b});\n                        break;\n                    case 'w':\n                        var a = this._plotDimensions.width - offsets.left;\n                        var b = (offsets.top + (this._plotDimensions.height - offsets.bottom))/2 - this.getHeight()/2;\n                        this._elem.css({right:a, top:b});\n                        break;\n                    default:  // same as 'se'\n                        var a = offsets.right;\n                        var b = offsets.bottom;\n                        this._elem.css({right:a, bottom:b});\n                        break;\n                }\n            }\n            else {\n                switch (this.location) {\n                    case 'nw':\n                        this._elem.css({left:0, top:offsets.top});\n                        break;\n                    case 'n':\n                        var a = (offsets.left + (this._plotDimensions.width - offsets.right))/2 - this.getWidth()/2;\n                        this._elem.css({left: a, top:offsets.top});\n                        break;\n                    case 'ne':\n                        this._elem.css({right:0, top:offsets.top});\n                        break;\n                    case 'e':\n                        var b = (offsets.top + (this._plotDimensions.height - offsets.bottom))/2 - this.getHeight()/2;\n                        this._elem.css({right:offsets.right, top:b});\n                        break;\n                    case 'se':\n                        this._elem.css({right:offsets.right, bottom:offsets.bottom});\n                        break;\n                    case 's':\n                        var a = (offsets.left + (this._plotDimensions.width - offsets.right))/2 - this.getWidth()/2;\n                        this._elem.css({left: a, bottom:offsets.bottom});\n                        break;\n                    case 'sw':\n                        this._elem.css({left:offsets.left, bottom:offsets.bottom});\n                        break;\n                    case 'w':\n                        var b = (offsets.top + (this._plotDimensions.height - offsets.bottom))/2 - this.getHeight()/2;\n                        this._elem.css({left:offsets.left, top:b});\n                        break;\n                    default:  // same as 'se'\n                        this._elem.css({right:offsets.right, bottom:offsets.bottom});\n                        break;\n                }\n            }\n        } \n    };\n\n    /**\n     * Class: $.jqplot.ThemeEngine\n     * Theme Engine provides a programatic way to change some of the  more\n     * common jqplot styling options such as fonts, colors and grid options.\n     * A theme engine instance is created with each plot.  The theme engine\n     * manages a collection of themes which can be modified, added to, or \n     * applied to the plot.\n     * \n     * The themeEngine class is not instantiated directly.\n     * When a plot is initialized, the current plot options are scanned\n     * an a default theme named \"Default\" is created.  This theme is\n     * used as the basis for other themes added to the theme engine and\n     * is always available.\n     * \n     * A theme is a simple javascript object with styling parameters for\n     * various entities of the plot.  A theme has the form:\n     * \n     * \n     * > {\n     * >     _name:f \"Default\",\n     * >     target: {\n     * >         backgroundColor: \"transparent\"\n     * >     },\n     * >     legend: {\n     * >         textColor: null,\n     * >         fontFamily: null,\n     * >         fontSize: null,\n     * >         border: null,\n     * >         background: null\n     * >     },\n     * >     title: {\n     * >         textColor: \"rgb(102, 102, 102)\",\n     * >         fontFamily: \"'Trebuchet MS',Arial,Helvetica,sans-serif\",\n     * >         fontSize: \"19.2px\",\n     * >         textAlign: \"center\"\n     * >     },\n     * >     seriesStyles: {},\n     * >     series: [{\n     * >         color: \"#4bb2c5\",\n     * >         lineWidth: 2.5,\n     * >         linePattern: \"solid\",\n     * >         shadow: true,\n     * >         fillColor: \"#4bb2c5\",\n     * >         showMarker: true,\n     * >         markerOptions: {\n     * >             color: \"#4bb2c5\",\n     * >             show: true,\n     * >             style: 'filledCircle',\n     * >             lineWidth: 1.5,\n     * >             size: 4,\n     * >             shadow: true\n     * >         }\n     * >     }],\n     * >     grid: {\n     * >         drawGridlines: true,\n     * >         gridLineColor: \"#cccccc\",\n     * >         gridLineWidth: 1,\n     * >         backgroundColor: \"#fffdf6\",\n     * >         borderColor: \"#999999\",\n     * >         borderWidth: 2,\n     * >         shadow: true\n     * >     },\n     * >     axesStyles: {\n     * >         label: {},\n     * >         ticks: {}\n     * >     },\n     * >     axes: {\n     * >         xaxis: {\n     * >             borderColor: \"#999999\",\n     * >             borderWidth: 2,\n     * >             ticks: {\n     * >                 show: true,\n     * >                 showGridline: true,\n     * >                 showLabel: true,\n     * >                 showMark: true,\n     * >                 size: 4,\n     * >                 textColor: \"\",\n     * >                 whiteSpace: \"nowrap\",\n     * >                 fontSize: \"12px\",\n     * >                 fontFamily: \"'Trebuchet MS',Arial,Helvetica,sans-serif\"\n     * >             },\n     * >             label: {\n     * >                 textColor: \"rgb(102, 102, 102)\",\n     * >                 whiteSpace: \"normal\",\n     * >                 fontSize: \"14.6667px\",\n     * >                 fontFamily: \"'Trebuchet MS',Arial,Helvetica,sans-serif\",\n     * >                 fontWeight: \"400\"\n     * >             }\n     * >         },\n     * >         yaxis: {\n     * >             borderColor: \"#999999\",\n     * >             borderWidth: 2,\n     * >             ticks: {\n     * >                 show: true,\n     * >                 showGridline: true,\n     * >                 showLabel: true,\n     * >                 showMark: true,\n     * >                 size: 4,\n     * >                 textColor: \"\",\n     * >                 whiteSpace: \"nowrap\",\n     * >                 fontSize: \"12px\",\n     * >                 fontFamily: \"'Trebuchet MS',Arial,Helvetica,sans-serif\"\n     * >             },\n     * >             label: {\n     * >                 textColor: null,\n     * >                 whiteSpace: null,\n     * >                 fontSize: null,\n     * >                 fontFamily: null,\n     * >                 fontWeight: null\n     * >             }\n     * >         },\n     * >         x2axis: {...\n     * >         },\n     * >         ...\n     * >         y9axis: {...\n     * >         }\n     * >     }\n     * > }\n     * \n     * \"seriesStyles\" is a style object that will be applied to all series in the plot.\n     * It will forcibly override any styles applied on the individual series.  \"axesStyles\" is\n     * a style object that will be applied to all axes in the plot.  It will also forcibly\n     * override any styles on the individual axes.\n     * \n     * The example shown above has series options for a line series.  Options for other\n     * series types are shown below:\n     * \n     * Bar Series:\n     * \n     * > {\n     * >     color: \"#4bb2c5\",\n     * >     seriesColors: [\"#4bb2c5\", \"#EAA228\", \"#c5b47f\", \"#579575\", \"#839557\", \"#958c12\", \"#953579\", \"#4b5de4\", \"#d8b83f\", \"#ff5800\", \"#0085cc\", \"#c747a3\", \"#cddf54\", \"#FBD178\", \"#26B4E3\", \"#bd70c7\"],\n     * >     lineWidth: 2.5,\n     * >     shadow: true,\n     * >     barPadding: 2,\n     * >     barMargin: 10,\n     * >     barWidth: 15.09375,\n     * >     highlightColors: [\"rgb(129,201,214)\", \"rgb(129,201,214)\", \"rgb(129,201,214)\", \"rgb(129,201,214)\", \"rgb(129,201,214)\", \"rgb(129,201,214)\", \"rgb(129,201,214)\", \"rgb(129,201,214)\"]\n     * > }\n     * \n     * Pie Series:\n     * \n     * > {\n     * >     seriesColors: [\"#4bb2c5\", \"#EAA228\", \"#c5b47f\", \"#579575\", \"#839557\", \"#958c12\", \"#953579\", \"#4b5de4\", \"#d8b83f\", \"#ff5800\", \"#0085cc\", \"#c747a3\", \"#cddf54\", \"#FBD178\", \"#26B4E3\", \"#bd70c7\"],\n     * >     padding: 20,\n     * >     sliceMargin: 0,\n     * >     fill: true,\n     * >     shadow: true,\n     * >     startAngle: 0,\n     * >     lineWidth: 2.5,\n     * >     highlightColors: [\"rgb(129,201,214)\", \"rgb(240,189,104)\", \"rgb(214,202,165)\", \"rgb(137,180,158)\", \"rgb(168,180,137)\", \"rgb(180,174,89)\", \"rgb(180,113,161)\", \"rgb(129,141,236)\", \"rgb(227,205,120)\", \"rgb(255,138,76)\", \"rgb(76,169,219)\", \"rgb(215,126,190)\", \"rgb(220,232,135)\", \"rgb(200,167,96)\", \"rgb(103,202,235)\", \"rgb(208,154,215)\"]\n     * > }\n     * \n     * Funnel Series:\n     * \n     * > {\n     * >     color: \"#4bb2c5\",\n     * >     lineWidth: 2,\n     * >     shadow: true,\n     * >     padding: {\n     * >         top: 20,\n     * >         right: 20,\n     * >         bottom: 20,\n     * >         left: 20\n     * >     },\n     * >     sectionMargin: 6,\n     * >     seriesColors: [\"#4bb2c5\", \"#EAA228\", \"#c5b47f\", \"#579575\", \"#839557\", \"#958c12\", \"#953579\", \"#4b5de4\", \"#d8b83f\", \"#ff5800\", \"#0085cc\", \"#c747a3\", \"#cddf54\", \"#FBD178\", \"#26B4E3\", \"#bd70c7\"],\n     * >     highlightColors: [\"rgb(147,208,220)\", \"rgb(242,199,126)\", \"rgb(220,210,178)\", \"rgb(154,191,172)\", \"rgb(180,191,154)\", \"rgb(191,186,112)\", \"rgb(191,133,174)\", \"rgb(147,157,238)\", \"rgb(231,212,139)\", \"rgb(255,154,102)\", \"rgb(102,181,224)\", \"rgb(221,144,199)\", \"rgb(225,235,152)\", \"rgb(200,167,96)\", \"rgb(124,210,238)\", \"rgb(215,169,221)\"]\n     * > }\n     * \n     */\n    $.jqplot.ThemeEngine = function(){\n        // Group: Properties\n        //\n        // prop: themes\n        // hash of themes managed by the theme engine.  \n        // Indexed by theme name.\n        this.themes = {};\n        // prop: activeTheme\n        // Pointer to currently active theme\n        this.activeTheme=null;\n        \n    };\n    \n    // called with scope of plot\n    $.jqplot.ThemeEngine.prototype.init = function() {\n        // get the Default theme from the current plot settings.\n        var th = new $.jqplot.Theme({_name:'Default'});\n        var n, i, nn;\n        \n        for (n in th.target) {\n            if (n == \"textColor\") {\n                th.target[n] = this.target.css('color');\n            }\n            else {\n                th.target[n] = this.target.css(n);\n            }\n        }\n        \n        if (this.title.show && this.title._elem) {\n            for (n in th.title) {\n                if (n == \"textColor\") {\n                    th.title[n] = this.title._elem.css('color');\n                }\n                else {\n                    th.title[n] = this.title._elem.css(n);\n                }\n            }\n        }\n        \n        for (n in th.grid) {\n            th.grid[n] = this.grid[n];\n        }\n        if (th.grid.backgroundColor == null && this.grid.background != null) {\n            th.grid.backgroundColor = this.grid.background;\n        }\n        if (this.legend.show && this.legend._elem) {\n            for (n in th.legend) {\n                if (n == 'textColor') {\n                    th.legend[n] = this.legend._elem.css('color');\n                }\n                else {\n                    th.legend[n] = this.legend._elem.css(n);\n                }\n            }\n        }\n        var s;\n        \n        for (i=0; i<this.series.length; i++) {\n            s = this.series[i];\n            if (s.renderer.constructor == $.jqplot.LineRenderer) {\n                th.series.push(new LineSeriesProperties());\n            }\n            else if (s.renderer.constructor == $.jqplot.BarRenderer) {\n                th.series.push(new BarSeriesProperties());\n            }\n            else if (s.renderer.constructor == $.jqplot.PieRenderer) {\n                th.series.push(new PieSeriesProperties());\n            }\n            else if (s.renderer.constructor == $.jqplot.DonutRenderer) {\n                th.series.push(new DonutSeriesProperties());\n            }\n            else if (s.renderer.constructor == $.jqplot.FunnelRenderer) {\n                th.series.push(new FunnelSeriesProperties());\n            }\n            else if (s.renderer.constructor == $.jqplot.MeterGaugeRenderer) {\n                th.series.push(new MeterSeriesProperties());\n            }\n            else {\n                th.series.push({});\n            }\n            for (n in th.series[i]) {\n                th.series[i][n] = s[n];\n            }\n        }\n        var a, ax;\n        for (n in this.axes) {\n            ax = this.axes[n];\n            a = th.axes[n] = new AxisProperties();\n            a.borderColor = ax.borderColor;\n            a.borderWidth = ax.borderWidth;\n            if (ax._ticks && ax._ticks[0]) {\n                for (nn in a.ticks) {\n                    if (ax._ticks[0].hasOwnProperty(nn)) {\n                        a.ticks[nn] = ax._ticks[0][nn];\n                    }\n                    else if (ax._ticks[0]._elem){\n                        a.ticks[nn] = ax._ticks[0]._elem.css(nn);\n                    }\n                }\n            }\n            if (ax._label && ax._label.show) {\n                for (nn in a.label) {\n                    // a.label[nn] = ax._label._elem.css(nn);\n                    if (ax._label[nn]) {\n                        a.label[nn] = ax._label[nn];\n                    }\n                    else if (ax._label._elem){\n                        if (nn == 'textColor') {\n                            a.label[nn] = ax._label._elem.css('color');\n                        }\n                        else {\n                            a.label[nn] = ax._label._elem.css(nn);\n                        }\n                    }\n                }\n            }\n        }\n        this.themeEngine._add(th);\n        this.themeEngine.activeTheme  = this.themeEngine.themes[th._name];\n    };\n    /**\n     * Group: methods\n     * \n     * method: get\n     * \n     * Get and return the named theme or the active theme if no name given.\n     * \n     * parameter:\n     * \n     * name - name of theme to get.\n     * \n     * returns:\n     * \n     * Theme instance of given name.\n     */   \n    $.jqplot.ThemeEngine.prototype.get = function(name) {\n        if (!name) {\n            // return the active theme\n            return this.activeTheme;\n        }\n        else {\n            return this.themes[name];\n        }\n    };\n    \n    function numericalOrder(a,b) { return a-b; }\n    \n    /**\n     * method: getThemeNames\n     * \n     * Return the list of theme names in this manager in alpha-numerical order.\n     * \n     * parameter:\n     * \n     * None\n     * \n     * returns:\n     * \n     * A the list of theme names in this manager in alpha-numerical order.\n     */       \n    $.jqplot.ThemeEngine.prototype.getThemeNames = function() {\n        var tn = [];\n        for (var n in this.themes) {\n            tn.push(n);\n        }\n        return tn.sort(numericalOrder);\n    };\n\n    /**\n     * method: getThemes\n     * \n     * Return a list of themes in alpha-numerical order by name.\n     * \n     * parameter:\n     * \n     * None\n     * \n     * returns:\n     * \n     * A list of themes in alpha-numerical order by name.\n     */ \n    $.jqplot.ThemeEngine.prototype.getThemes = function() {\n        var tn = [];\n        var themes = [];\n        for (var n in this.themes) {\n            tn.push(n);\n        }\n        tn.sort(numericalOrder);\n        for (var i=0; i<tn.length; i++) {\n            themes.push(this.themes[tn[i]]);\n        }\n        return themes;\n    };\n    \n    $.jqplot.ThemeEngine.prototype.activate = function(plot, name) {\n        // sometimes need to redraw whole plot.\n        var redrawPlot = false;\n        if (!name && this.activeTheme && this.activeTheme._name) {\n            name = this.activeTheme._name;\n        }\n        if (!this.themes.hasOwnProperty(name)) {\n            throw new Error(\"No theme of that name\");\n        }\n        else {\n            var th = this.themes[name];\n            this.activeTheme = th;\n            var val, checkBorderColor = false, checkBorderWidth = false;\n            var arr = ['xaxis', 'x2axis', 'yaxis', 'y2axis'];\n            \n            for (i=0; i<arr.length; i++) {\n                var ax = arr[i];\n                if (th.axesStyles.borderColor != null) {\n                    plot.axes[ax].borderColor = th.axesStyles.borderColor;\n                }\n                if (th.axesStyles.borderWidth != null) {\n                    plot.axes[ax].borderWidth = th.axesStyles.borderWidth;\n                }\n            }\n            \n            for (var axname in plot.axes) {\n                var axis = plot.axes[axname];\n                if (axis.show) {\n                    var thaxis = th.axes[axname] || {};\n                    var thaxstyle = th.axesStyles;\n                    var thax = $.jqplot.extend(true, {}, thaxis, thaxstyle);\n                    val = (th.axesStyles.borderColor != null) ? th.axesStyles.borderColor : thax.borderColor;\n                    if (thax.borderColor != null) {\n                        axis.borderColor = thax.borderColor;\n                        redrawPlot = true;\n                    }\n                    val = (th.axesStyles.borderWidth != null) ? th.axesStyles.borderWidth : thax.borderWidth;\n                    if (thax.borderWidth != null) {\n                        axis.borderWidth = thax.borderWidth;\n                        redrawPlot = true;\n                    }\n                    if (axis._ticks && axis._ticks[0]) {\n                        for (var nn in thax.ticks) {\n                            // val = null;\n                            // if (th.axesStyles.ticks && th.axesStyles.ticks[nn] != null) {\n                            //     val = th.axesStyles.ticks[nn];\n                            // }\n                            // else if (thax.ticks[nn] != null){\n                            //     val = thax.ticks[nn]\n                            // }\n                            val = thax.ticks[nn];\n                            if (val != null) {\n                                axis.tickOptions[nn] = val;\n                                axis._ticks = [];\n                                redrawPlot = true;\n                            }\n                        }\n                    }\n                    if (axis._label && axis._label.show) {\n                        for (var nn in thax.label) {\n                            // val = null;\n                            // if (th.axesStyles.label && th.axesStyles.label[nn] != null) {\n                            //     val = th.axesStyles.label[nn];\n                            // }\n                            // else if (thax.label && thax.label[nn] != null){\n                            //     val = thax.label[nn]\n                            // }\n                            val = thax.label[nn];\n                            if (val != null) {\n                                axis.labelOptions[nn] = val;\n                                redrawPlot = true;\n                            }\n                        }\n                    }\n                    \n                }\n            }            \n            \n            for (var n in th.grid) {\n                if (th.grid[n] != null) {\n                    plot.grid[n] = th.grid[n];\n                }\n            }\n            if (!redrawPlot) {\n                plot.grid.draw();\n            }\n            \n            if (plot.legend.show) { \n                for (n in th.legend) {\n                    if (th.legend[n] != null) {\n                        plot.legend[n] = th.legend[n];\n                    }\n                }\n            }\n            if (plot.title.show) {\n                for (n in th.title) {\n                    if (th.title[n] != null) {\n                        plot.title[n] = th.title[n];\n                    }\n                }\n            }\n            \n            var i;\n            for (i=0; i<th.series.length; i++) {\n                var opts = {};\n                var redrawSeries = false;\n                for (n in th.series[i]) {\n                    val = (th.seriesStyles[n] != null) ? th.seriesStyles[n] : th.series[i][n];\n                    if (val != null) {\n                        opts[n] = val;\n                        if (n == 'color') {\n                            plot.series[i].renderer.shapeRenderer.fillStyle = val;\n                            plot.series[i].renderer.shapeRenderer.strokeStyle = val;\n                            plot.series[i][n] = val;\n                        }\n                        else if ((n == 'lineWidth') || (n == 'linePattern')) {\n                            plot.series[i].renderer.shapeRenderer[n] = val;\n                            plot.series[i][n] = val;\n                        }\n                        else if (n == 'markerOptions') {\n                            merge (plot.series[i].markerOptions, val);\n                            merge (plot.series[i].markerRenderer, val);\n                        }\n                        else {\n                            plot.series[i][n] = val;\n                        }\n                        redrawPlot = true;\n                    }\n                }\n            }\n            \n            if (redrawPlot) {\n                plot.target.empty();\n                plot.draw();\n            }\n            \n            for (n in th.target) {\n                if (th.target[n] != null) {\n                    plot.target.css(n, th.target[n]);\n                }\n            }\n        }\n        \n    };\n    \n    $.jqplot.ThemeEngine.prototype._add = function(theme, name) {\n        if (name) {\n            theme._name = name;\n        }\n        if (!theme._name) {\n            theme._name = Date.parse(new Date());\n        }\n        if (!this.themes.hasOwnProperty(theme._name)) {\n            this.themes[theme._name] = theme;\n        }\n        else {\n            throw new Error(\"jqplot.ThemeEngine Error: Theme already in use\");\n        }\n    };\n    \n    // method remove\n    // Delete the named theme, return true on success, false on failure.\n    \n\n    /**\n     * method: remove\n     * \n     * Remove the given theme from the themeEngine.\n     * \n     * parameters:\n     * \n     * name - name of the theme to remove.\n     * \n     * returns:\n     * \n     * true on success, false on failure.\n     */\n    $.jqplot.ThemeEngine.prototype.remove = function(name) {\n        if (name == 'Default') {\n            return false;\n        }\n        return delete this.themes[name];\n    };\n\n    /**\n     * method: newTheme\n     * \n     * Create a new theme based on the default theme, adding it the themeEngine.\n     * \n     * parameters:\n     * \n     * name - name of the new theme.\n     * obj - optional object of styles to be applied to this new theme.\n     * \n     * returns:\n     * \n     * new Theme object.\n     */\n    $.jqplot.ThemeEngine.prototype.newTheme = function(name, obj) {\n        if (typeof(name) == 'object') {\n            obj = obj || name;\n            name = null;\n        }\n        if (obj && obj._name) {\n            name = obj._name;\n        }\n        else {\n            name = name || Date.parse(new Date());\n        }\n        // var th = new $.jqplot.Theme(name);\n        var th = this.copy(this.themes['Default']._name, name);\n        $.jqplot.extend(th, obj);\n        return th;\n    };\n    \n    // function clone(obj) {\n    //     return eval(obj.toSource());\n    // }\n    \n    function clone(obj){\n        if(obj == null || typeof(obj) != 'object'){\n            return obj;\n        }\n    \n        var temp = new obj.constructor();\n        for(var key in obj){\n            temp[key] = clone(obj[key]);\n        }   \n        return temp;\n    }\n    \n    $.jqplot.clone = clone;\n    \n    function merge(obj1, obj2) {\n        if (obj2 ==  null || typeof(obj2) != 'object') {\n            return;\n        }\n        for (var key in obj2) {\n            if (key == 'highlightColors') {\n                obj1[key] = clone(obj2[key]);\n            }\n            if (obj2[key] != null && typeof(obj2[key]) == 'object') {\n                if (!obj1.hasOwnProperty(key)) {\n                    obj1[key] = {};\n                }\n                merge(obj1[key], obj2[key]);\n            }\n            else {\n                obj1[key] = obj2[key];\n            }\n        }\n    }\n    \n    $.jqplot.merge = merge;\n    \n        // Use the jQuery 1.3.2 extend function since behaviour in jQuery 1.4 seems problematic\n    $.jqplot.extend = function() {\n        // copy reference to target object\n        var target = arguments[0] || {}, i = 1, length = arguments.length, deep = false, options;\n\n        // Handle a deep copy situation\n        if ( typeof target === \"boolean\" ) {\n            deep = target;\n            target = arguments[1] || {};\n            // skip the boolean and the target\n            i = 2;\n        }\n\n        // Handle case when target is a string or something (possible in deep copy)\n        if ( typeof target !== \"object\" && !toString.call(target) === \"[object Function]\" ) {\n            target = {};\n        }\n\n        for ( ; i < length; i++ ){\n            // Only deal with non-null/undefined values\n            if ( (options = arguments[ i ]) != null ) {\n                // Extend the base object\n                for ( var name in options ) {\n                    var src = target[ name ], copy = options[ name ];\n\n                    // Prevent never-ending loop\n                    if ( target === copy ) {\n                        continue;\n                    }\n\n                    // Recurse if we're merging object values\n                    if ( deep && copy && typeof copy === \"object\" && !copy.nodeType ) {\n                        target[ name ] = $.jqplot.extend( deep, \n                            // Never move original objects, clone them\n                            src || ( copy.length != null ? [ ] : { } )\n                        , copy );\n                    }\n                    // Don't bring in undefined values\n                    else if ( copy !== undefined ) {\n                        target[ name ] = copy;\n                    }\n                }\n            }\n        }\n        // Return the modified object\n        return target;\n    };\n\n    /**\n     * method: rename\n     * \n     * Rename a theme.\n     * \n     * parameters:\n     * \n     * oldName - current name of the theme.\n     * newName - desired name of the theme.\n     * \n     * returns:\n     * \n     * new Theme object.\n     */\n    $.jqplot.ThemeEngine.prototype.rename = function (oldName, newName) {\n        if (oldName == 'Default' || newName == 'Default') {\n            throw new Error (\"jqplot.ThemeEngine Error: Cannot rename from/to Default\");\n        }\n        if (this.themes.hasOwnProperty(newName)) {\n            throw new Error (\"jqplot.ThemeEngine Error: New name already in use.\");\n        }\n        else if (this.themes.hasOwnProperty(oldName)) {\n            var th = this.copy (oldName, newName);\n            this.remove(oldName);\n            return th;\n        }\n        throw new Error(\"jqplot.ThemeEngine Error: Old name or new name invalid\");\n    };\n\n    /**\n     * method: copy\n     * \n     * Create a copy of an existing theme in the themeEngine, adding it the themeEngine.\n     * \n     * parameters:\n     * \n     * sourceName - name of the existing theme.\n     * targetName - name of the copy.\n     * obj - optional object of style parameter to apply to the new theme.\n     * \n     * returns:\n     * \n     * new Theme object.\n     */\n    $.jqplot.ThemeEngine.prototype.copy = function (sourceName, targetName, obj) {\n        if (targetName == 'Default') {\n            throw new Error (\"jqplot.ThemeEngine Error: Cannot copy over Default theme\");\n        }\n        if (!this.themes.hasOwnProperty(sourceName)) {\n            var s = \"jqplot.ThemeEngine Error: Source name invalid\";\n            throw new Error(s);\n        }\n        if (this.themes.hasOwnProperty(targetName)) {\n            var s = \"jqplot.ThemeEngine Error: Target name invalid\";\n            throw new Error(s);\n        }\n        else {\n            var th = clone(this.themes[sourceName]);\n            th._name = targetName;\n            $.jqplot.extend(true, th, obj);\n            this._add(th);\n            return th;\n        }\n    };\n    \n    \n    $.jqplot.Theme = function(name, obj) {\n        if (typeof(name) == 'object') {\n            obj = obj || name;\n            name = null;\n        }\n        name = name || Date.parse(new Date());\n        this._name = name;\n        this.target = {\n            backgroundColor: null\n        };\n        this.legend = {\n            textColor: null,\n            fontFamily: null,\n            fontSize: null,\n            border: null,\n            background: null\n        };\n        this.title = {\n            textColor: null,\n            fontFamily: null,\n            fontSize: null,\n            textAlign: null\n        };\n        this.seriesStyles = {};\n        this.series = [];\n        this.grid = {\n            drawGridlines: null,\n            gridLineColor: null,\n            gridLineWidth: null,\n            backgroundColor: null,\n            borderColor: null,\n            borderWidth: null,\n            shadow: null\n        };\n        this.axesStyles = {label:{}, ticks:{}};\n        this.axes = {};\n        if (typeof(obj) == 'string') {\n            this._name = obj;\n        }\n        else if(typeof(obj) == 'object') {\n            $.jqplot.extend(true, this, obj);\n        }\n    };\n    \n    var AxisProperties = function() {\n        this.borderColor = null;\n        this.borderWidth = null;\n        this.ticks = new AxisTicks();\n        this.label = new AxisLabel();\n    };\n    \n    var AxisTicks = function() {\n        this.show = null;\n        this.showGridline = null;\n        this.showLabel = null;\n        this.showMark = null;\n        this.size = null;\n        this.textColor = null;\n        this.whiteSpace = null;\n        this.fontSize = null;\n        this.fontFamily = null;\n    };\n    \n    var AxisLabel = function() {\n        this.textColor = null;\n        this.whiteSpace = null;\n        this.fontSize = null;\n        this.fontFamily = null;\n        this.fontWeight = null;\n    };\n    \n    var LineSeriesProperties = function() {\n        this.color=null;\n        this.lineWidth=null;\n        this.linePattern=null;\n        this.shadow=null;\n        this.fillColor=null;\n        this.showMarker=null;\n        this.markerOptions = new MarkerOptions();\n    };\n    \n    var MarkerOptions = function() {\n        this.show = null;\n        this.style = null;\n        this.lineWidth = null;\n        this.size = null;\n        this.color = null;\n        this.shadow = null;\n    };\n    \n    var BarSeriesProperties = function() {\n        this.color=null;\n        this.seriesColors=null;\n        this.lineWidth=null;\n        this.shadow=null;\n        this.barPadding=null;\n        this.barMargin=null;\n        this.barWidth=null;\n        this.highlightColors=null;\n    };\n    \n    var PieSeriesProperties = function() {\n        this.seriesColors=null;\n        this.padding=null;\n        this.sliceMargin=null;\n        this.fill=null;\n        this.shadow=null;\n        this.startAngle=null;\n        this.lineWidth=null;\n        this.highlightColors=null;\n    };\n    \n    var DonutSeriesProperties = function() {\n        this.seriesColors=null;\n        this.padding=null;\n        this.sliceMargin=null;\n        this.fill=null;\n        this.shadow=null;\n        this.startAngle=null;\n        this.lineWidth=null;\n        this.innerDiameter=null;\n        this.thickness=null;\n        this.ringMargin=null;\n        this.highlightColors=null;\n    };\n    \n    var FunnelSeriesProperties = function() {\n        this.color=null;\n        this.lineWidth=null;\n        this.shadow=null;\n        this.padding=null;\n        this.sectionMargin=null;\n        this.seriesColors=null;\n        this.highlightColors=null;\n    };\n    \n    var MeterSeriesProperties = function() {\n        this.padding=null;\n        this.backgroundColor=null;\n        this.ringColor=null;\n        this.tickColor=null;\n        this.ringWidth=null;\n        this.intervalColors=null;\n        this.intervalInnerRadius=null;\n        this.intervalOuterRadius=null;\n        this.hubRadius=null;\n        this.needleThickness=null;\n        this.needlePad=null;\n    };\n        \n\n\n\n    $.fn.jqplotChildText = function() {\n        return $(this).contents().filter(function() {\n            return this.nodeType == 3;  // Node.TEXT_NODE not defined in I7\n        }).text();\n    };\n\n    // Returns font style as abbreviation for \"font\" property.\n    $.fn.jqplotGetComputedFontStyle = function() {\n        var css = window.getComputedStyle ?  window.getComputedStyle(this[0], \"\") : this[0].currentStyle;\n        var attrs = css['font-style'] ? ['font-style', 'font-weight', 'font-size', 'font-family'] : ['fontStyle', 'fontWeight', 'fontSize', 'fontFamily'];\n        var style = [];\n\n        for (var i=0 ; i < attrs.length; ++i) {\n            var attr = String(css[attrs[i]]);\n\n            if (attr && attr != 'normal') {\n                style.push(attr);\n            }\n        }\n        return style.join(' ');\n    };\n\n    /**\n     * Namespace: $.fn\n     * jQuery namespace to attach functions to jQuery elements.\n     *  \n     */\n\n    $.fn.jqplotToImageCanvas = function(options) {\n\n        options = options || {};\n        var x_offset = (options.x_offset == null) ? 0 : options.x_offset;\n        var y_offset = (options.y_offset == null) ? 0 : options.y_offset;\n        var backgroundColor = (options.backgroundColor == null) ? 'rgb(255,255,255)' : options.backgroundColor;\n\n        if ($(this).width() == 0 || $(this).height() == 0) {\n            return null;\n        }\n\n        // excanvas and hence IE < 9 do not support toDataURL and cannot export images.\n        if ($.jqplot.use_excanvas) {\n            return null;\n        }\n        \n        var newCanvas = document.createElement(\"canvas\");\n        var h = $(this).outerHeight(true);\n        var w = $(this).outerWidth(true);\n        var offs = $(this).offset();\n        var plotleft = offs.left;\n        var plottop = offs.top;\n        var transx = 0, transy = 0;\n\n        // have to check if any elements are hanging outside of plot area before rendering,\n        // since changing width of canvas will erase canvas.\n\n        var clses = ['jqplot-table-legend', 'jqplot-xaxis-tick', 'jqplot-x2axis-tick', 'jqplot-yaxis-tick', 'jqplot-y2axis-tick', 'jqplot-y3axis-tick', \n        'jqplot-y4axis-tick', 'jqplot-y5axis-tick', 'jqplot-y6axis-tick', 'jqplot-y7axis-tick', 'jqplot-y8axis-tick', 'jqplot-y9axis-tick',\n        'jqplot-xaxis-label', 'jqplot-x2axis-label', 'jqplot-yaxis-label', 'jqplot-y2axis-label', 'jqplot-y3axis-label', 'jqplot-y4axis-label', \n        'jqplot-y5axis-label', 'jqplot-y6axis-label', 'jqplot-y7axis-label', 'jqplot-y8axis-label', 'jqplot-y9axis-label' ];\n\n        var temptop, templeft, tempbottom, tempright;\n\n        for (var i = 0; i < clses.length; i++) {\n            $(this).find('.'+clses[i]).each(function() {\n                temptop = $(this).offset().top - plottop;\n                templeft = $(this).offset().left - plotleft;\n                tempright = templeft + $(this).outerWidth(true) + transx;\n                tempbottom = temptop + $(this).outerHeight(true) + transy;\n                if (templeft < -transx) {\n                    w = w - transx - templeft;\n                    transx = -templeft;\n                }\n                if (temptop < -transy) {\n                    h = h - transy - temptop;\n                    transy = - temptop;\n                }\n                if (tempright > w) {\n                    w = tempright;\n                }\n                if (tempbottom > h) {\n                    h =  tempbottom;\n                }\n            });\n        }\n\n        newCanvas.width = w + Number(x_offset);\n        newCanvas.height = h + Number(y_offset);\n\n        var newContext = newCanvas.getContext(\"2d\"); \n\n        newContext.save();\n        newContext.fillStyle = backgroundColor;\n        newContext.fillRect(0,0, newCanvas.width, newCanvas.height);\n        newContext.restore();\n\n        newContext.translate(transx, transy);\n        newContext.textAlign = 'left';\n        newContext.textBaseline = 'top';\n\n        function getLineheight(el) {\n            var lineheight = parseInt($(el).css('line-height'), 10);\n\n            if (isNaN(lineheight)) {\n                lineheight = parseInt($(el).css('font-size'), 10) * 1.2;\n            }\n            return lineheight;\n        }\n\n        function writeWrappedText (el, context, text, left, top, canvasWidth) {\n            var lineheight = getLineheight(el);\n            var tagwidth = $(el).innerWidth();\n            var tagheight = $(el).innerHeight();\n            var words = text.split(/\\s+/);\n            var wl = words.length;\n            var w = '';\n            var breaks = [];\n            var temptop = top;\n            var templeft = left;\n\n            for (var i=0; i<wl; i++) {\n                w += words[i];\n                if (context.measureText(w).width > tagwidth && w.length > words[i].length) {\n                    breaks.push(i);\n                    w = '';\n                    i--;\n                }   \n            }\n            if (breaks.length === 0) {\n                // center text if necessary\n                if ($(el).css('textAlign') === 'center') {\n                    templeft = left + (canvasWidth - context.measureText(w).width)/2  - transx;\n                }\n                context.fillText(text, templeft, top);\n            }\n            else {\n                w = words.slice(0, breaks[0]).join(' ');\n                // center text if necessary\n                if ($(el).css('textAlign') === 'center') {\n                    templeft = left + (canvasWidth - context.measureText(w).width)/2  - transx;\n                }\n                context.fillText(w, templeft, temptop);\n                temptop += lineheight;\n                for (var i=1, l=breaks.length; i<l; i++) {\n                    w = words.slice(breaks[i-1], breaks[i]).join(' ');\n                    // center text if necessary\n                    if ($(el).css('textAlign') === 'center') {\n                        templeft = left + (canvasWidth - context.measureText(w).width)/2  - transx;\n                    }\n                    context.fillText(w, templeft, temptop);\n                    temptop += lineheight;\n                }\n                w = words.slice(breaks[i-1], words.length).join(' ');\n                // center text if necessary\n                if ($(el).css('textAlign') === 'center') {\n                    templeft = left + (canvasWidth - context.measureText(w).width)/2  - transx;\n                }\n                context.fillText(w, templeft, temptop);\n            }\n\n        }\n\n        function _jqpToImage(el, x_offset, y_offset) {\n            var tagname = el.tagName.toLowerCase();\n            var p = $(el).position();\n            var css = window.getComputedStyle ?  window.getComputedStyle(el, \"\") : el.currentStyle; // for IE < 9\n            var left = x_offset + p.left + parseInt(css.marginLeft, 10) + parseInt(css.borderLeftWidth, 10) + parseInt(css.paddingLeft, 10);\n            var top = y_offset + p.top + parseInt(css.marginTop, 10) + parseInt(css.borderTopWidth, 10)+ parseInt(css.paddingTop, 10);\n            var w = newCanvas.width;\n            // var left = x_offset + p.left + $(el).css('marginLeft') + $(el).css('borderLeftWidth') \n\n            // somehow in here, for divs within divs, the width of the inner div should be used instead of the canvas.\n\n            if ((tagname == 'div' || tagname == 'span') && !$(el).hasClass('jqplot-highlighter-tooltip')) {\n                $(el).children().each(function() {\n                    _jqpToImage(this, left, top);\n                });\n                var text = $(el).jqplotChildText();\n\n                if (text) {\n                    newContext.font = $(el).jqplotGetComputedFontStyle();\n                    newContext.fillStyle = $(el).css('color');\n\n                    writeWrappedText(el, newContext, text, left, top, w);\n                }\n            }\n\n            // handle the standard table legend\n\n            else if (tagname === 'table' && $(el).hasClass('jqplot-table-legend')) {\n                newContext.strokeStyle = $(el).css('border-top-color');\n                newContext.fillStyle = $(el).css('background-color');\n                newContext.fillRect(left, top, $(el).innerWidth(), $(el).innerHeight());\n                if (parseInt($(el).css('border-top-width'), 10) > 0) {\n                    newContext.strokeRect(left, top, $(el).innerWidth(), $(el).innerHeight());\n                }\n\n                // find all the swatches\n                $(el).find('div.jqplot-table-legend-swatch-outline').each(function() {\n                    // get the first div and stroke it\n                    var elem = $(this);\n                    newContext.strokeStyle = elem.css('border-top-color');\n                    var l = left + elem.position().left;\n                    var t = top + elem.position().top;\n                    newContext.strokeRect(l, t, elem.innerWidth(), elem.innerHeight());\n\n                    // now fill the swatch\n                    \n                    l += parseInt(elem.css('padding-left'), 10);\n                    t += parseInt(elem.css('padding-top'), 10);\n                    var h = elem.innerHeight() - 2 * parseInt(elem.css('padding-top'), 10);\n                    var w = elem.innerWidth() - 2 * parseInt(elem.css('padding-left'), 10);\n\n                    var swatch = elem.children('div.jqplot-table-legend-swatch');\n                    newContext.fillStyle = swatch.css('background-color');\n                    newContext.fillRect(l, t, w, h);\n                });\n\n                // now add text\n\n                $(el).find('td.jqplot-table-legend-label').each(function(){\n                    var elem = $(this);\n                    var l = left + elem.position().left;\n                    var t = top + elem.position().top + parseInt(elem.css('padding-top'), 10);\n                    newContext.font = elem.jqplotGetComputedFontStyle();\n                    newContext.fillStyle = elem.css('color');\n                    writeWrappedText(elem, newContext, elem.text(), l, t, w);\n                });\n\n                var elem = null;\n            }\n\n            else if (tagname == 'canvas') {\n                newContext.drawImage(el, left, top);\n            }\n        }\n        $(this).children().each(function() {\n            _jqpToImage(this, x_offset, y_offset);\n        });\n        return newCanvas;\n    };\n\n    // return the raw image data string.\n    // Should work on canvas supporting browsers.\n    $.fn.jqplotToImageStr = function(options) {\n        var imgCanvas = $(this).jqplotToImageCanvas(options);\n        if (imgCanvas) {\n            return imgCanvas.toDataURL(\"image/png\");\n        }\n        else {\n            return null;\n        }\n    };\n\n    // return a DOM <img> element and return it.\n    // Should work on canvas supporting browsers.\n    $.fn.jqplotToImageElem = function(options) {\n        var elem = document.createElement(\"img\");\n        var str = $(this).jqplotToImageStr(options);\n        elem.src = str;\n        return elem;\n    };\n\n    // return a string for an <img> element and return it.\n    // Should work on canvas supporting browsers.\n    $.fn.jqplotToImageElemStr = function(options) {\n        var str = '<img src='+$(this).jqplotToImageStr(options)+' />';\n        return str;\n    };\n\n    // Not guaranteed to work, even on canvas supporting browsers due to \n    // limitations with location.href and browser support.\n    $.fn.jqplotSaveImage = function() {\n        var imgData = $(this).jqplotToImageStr({});\n        if (imgData) {\n            window.location.href = imgData.replace(\"image/png\", \"image/octet-stream\");\n        }\n\n    };\n\n    // Not guaranteed to work, even on canvas supporting browsers due to\n    // limitations with window.open and arbitrary data.\n    $.fn.jqplotViewImage = function() {\n        var imgStr = $(this).jqplotToImageElemStr({});\n        var imgData = $(this).jqplotToImageStr({});\n        if (imgStr) {\n            var w = window.open('');\n            w.document.open(\"image/png\");\n            w.document.write(imgStr);\n            w.document.close();\n            w = null;\n        }\n    };\n    \n\n\n\n    /** \n     * @description\n     * <p>Object with extended date parsing and formatting capabilities.\n     * This library borrows many concepts and ideas from the Date Instance \n     * Methods by Ken Snyder along with some parts of Ken's actual code.</p>\n     *\n     * <p>jsDate takes a different approach by not extending the built-in \n     * Date Object, improving date parsing, allowing for multiple formatting \n     * syntaxes and multiple and more easily expandable localization.</p>\n     * \n     * @author Chris Leonello\n     * @date #date#\n     * @version #VERSION#\n     * @copyright (c) 2010-2015 Chris Leonello\n     * jsDate is currently available for use in all personal or commercial projects \n     * under both the MIT and GPL version 2.0 licenses. This means that you can \n     * choose the license that best suits your project and use it accordingly.\n     * \n     * <p>Ken's original Date Instance Methods and copyright notice:</p>\n     * <pre>\n     * Ken Snyder (ken d snyder at gmail dot com)\n     * 2008-09-10\n     * version 2.0.2 (http://kendsnyder.com/sandbox/date/)     \n     * Creative Commons Attribution License 3.0 (http://creativecommons.org/licenses/by/3.0/)\n     * </pre>\n     * \n     * @class\n     * @name jsDate\n     * @param  {String | Number | Array | Date&nbsp;Object | Options&nbsp;Object} arguments Optional arguments, either a parsable date/time string,\n     * a JavaScript timestamp, an array of numbers of form [year, month, day, hours, minutes, seconds, milliseconds],\n     * a Date object, or an options object of form {syntax: \"perl\", date:some Date} where all options are optional.\n     */\n     \n    var jsDate = function () {\n    \n        this.syntax = jsDate.config.syntax;\n        this._type = \"jsDate\";\n        this.proxy = new Date();\n        this.options = {};\n        this.locale = jsDate.regional.getLocale();\n        this.formatString = '';\n        this.defaultCentury = jsDate.config.defaultCentury;\n\n        switch ( arguments.length ) {\n            case 0:\n                break;\n            case 1:\n                // other objects either won't have a _type property or,\n                // if they do, it shouldn't be set to \"jsDate\", so\n                // assume it is an options argument.\n                if (get_type(arguments[0]) == \"[object Object]\" && arguments[0]._type != \"jsDate\") {\n                    var opts = this.options = arguments[0];\n                    this.syntax = opts.syntax || this.syntax;\n                    this.defaultCentury = opts.defaultCentury || this.defaultCentury;\n                    this.proxy = jsDate.createDate(opts.date);\n                }\n                else {\n                    this.proxy = jsDate.createDate(arguments[0]);\n                }\n                break;\n            default:\n                var a = [];\n                for ( var i=0; i<arguments.length; i++ ) {\n                    a.push(arguments[i]);\n                }\n                // this should be the current date/time?\n                this.proxy = new Date();\n                this.proxy.setFullYear.apply( this.proxy, a.slice(0,3) );\n                if ( a.slice(3).length ) {\n                    this.proxy.setHours.apply( this.proxy, a.slice(3) );\n                }\n                break;\n        }\n    };\n    \n    /**\n     * @namespace Configuration options that will be used as defaults for all instances on the page.\n     * @property {String} defaultLocale The default locale to use [en].\n     * @property {String} syntax The default syntax to use [perl].\n     * @property {Number} defaultCentury The default centry for 2 digit dates.\n     */\n    jsDate.config = {\n        defaultLocale: 'en',\n        syntax: 'perl',\n        defaultCentury: 1900\n    };\n        \n    /**\n     * Add an arbitrary amount to the currently stored date\n     * \n     * @param {Number} number      \n     * @param {String} unit\n     * @returns {jsDate}       \n     */\n     \n    jsDate.prototype.add = function(number, unit) {\n        var factor = multipliers[unit] || multipliers.day;\n        if (typeof factor == 'number') {\n            this.proxy.setTime(this.proxy.getTime() + (factor * number));\n        } else {\n            factor.add(this, number);\n        }\n        return this;\n    };\n        \n    /**\n     * Create a new jqplot.date object with the same date\n     * \n     * @returns {jsDate}\n     */  \n     \n    jsDate.prototype.clone = function() {\n            return new jsDate(this.proxy.getTime());\n    };\n\n    /**\n     * Get the UTC TimeZone Offset of this date in milliseconds.\n     *\n     * @returns {Number}\n     */\n\n    jsDate.prototype.getUtcOffset = function() {\n        return this.proxy.getTimezoneOffset() * 60000;\n    };\n\n    /**\n     * Find the difference between this jsDate and another date.\n     * \n     * @param {String| Number| Array| jsDate&nbsp;Object| Date&nbsp;Object} dateObj\n     * @param {String} unit\n     * @param {Boolean} allowDecimal\n     * @returns {Number} Number of units difference between dates.\n     */\n     \n    jsDate.prototype.diff = function(dateObj, unit, allowDecimal) {\n        // ensure we have a Date object\n        dateObj = new jsDate(dateObj);\n        if (dateObj === null) {\n            return null;\n        }\n        // get the multiplying factor integer or factor function\n        var factor = multipliers[unit] || multipliers.day;\n        if (typeof factor == 'number') {\n            // multiply\n            var unitDiff = (this.proxy.getTime() - dateObj.proxy.getTime()) / factor;\n        } else {\n            // run function\n            var unitDiff = factor.diff(this.proxy, dateObj.proxy);\n        }\n        // if decimals are not allowed, round toward zero\n        return (allowDecimal ? unitDiff : Math[unitDiff > 0 ? 'floor' : 'ceil'](unitDiff));          \n    };\n    \n    /**\n     * Get the abbreviated name of the current week day\n     * \n     * @returns {String}\n     */   \n     \n    jsDate.prototype.getAbbrDayName = function() {\n        return jsDate.regional[this.locale][\"dayNamesShort\"][this.proxy.getDay()];\n    };\n    \n    /**\n     * Get the abbreviated name of the current month\n     * \n     * @returns {String}\n     */\n     \n    jsDate.prototype.getAbbrMonthName = function() {\n        return jsDate.regional[this.locale][\"monthNamesShort\"][this.proxy.getMonth()];\n    };\n    \n    /**\n     * Get UPPER CASE AM or PM for the current time\n     * \n     * @returns {String}\n     */\n     \n    jsDate.prototype.getAMPM = function() {\n        return this.proxy.getHours() >= 12 ? 'PM' : 'AM';\n    };\n    \n    /**\n     * Get lower case am or pm for the current time\n     * \n     * @returns {String}\n     */\n     \n    jsDate.prototype.getAmPm = function() {\n        return this.proxy.getHours() >= 12 ? 'pm' : 'am';\n    };\n    \n    /**\n     * Get the century (19 for 20th Century)\n     *\n     * @returns {Integer} Century (19 for 20th century).\n     */\n    jsDate.prototype.getCentury = function() { \n        return parseInt(this.proxy.getFullYear()/100, 10);\n    };\n    \n    /**\n     * Implements Date functionality\n     */\n    jsDate.prototype.getDate = function() {\n        return this.proxy.getDate();\n    };\n    \n    /**\n     * Implements Date functionality\n     */\n    jsDate.prototype.getDay = function() {\n        return this.proxy.getDay();\n    };\n    \n    /**\n     * Get the Day of week 1 (Monday) thru 7 (Sunday)\n     * \n     * @returns {Integer} Day of week 1 (Monday) thru 7 (Sunday)\n     */\n    jsDate.prototype.getDayOfWeek = function() { \n        var dow = this.proxy.getDay(); \n        return dow===0?7:dow; \n    };\n    \n    /**\n     * Get the day of the year\n     * \n     * @returns {Integer} 1 - 366, day of the year\n     */\n    jsDate.prototype.getDayOfYear = function() {\n        var d = this.proxy;\n        var ms = d - new Date('' + d.getFullYear() + '/1/1 GMT');\n        ms += d.getTimezoneOffset()*60000;\n        d = null;\n        return parseInt(ms/60000/60/24, 10)+1;\n    };\n    \n    /**\n     * Get the name of the current week day\n     * \n     * @returns {String}\n     */  \n     \n    jsDate.prototype.getDayName = function() {\n        return jsDate.regional[this.locale][\"dayNames\"][this.proxy.getDay()];\n    };\n    \n    /**\n     * Get the week number of the given year, starting with the first Sunday as the first week\n     * @returns {Integer} Week number (13 for the 13th full week of the year).\n     */\n    jsDate.prototype.getFullWeekOfYear = function() {\n        var d = this.proxy;\n        var doy = this.getDayOfYear();\n        var rdow = 6-d.getDay();\n        var woy = parseInt((doy+rdow)/7, 10);\n        return woy;\n    };\n    \n    /**\n     * Implements Date functionality\n     */\n    jsDate.prototype.getFullYear = function() {\n        return this.proxy.getFullYear();\n    };\n    \n    /**\n     * Get the GMT offset in hours and minutes (e.g. +06:30)\n     * \n     * @returns {String}\n     */\n     \n    jsDate.prototype.getGmtOffset = function() {\n        // divide the minutes offset by 60\n        var hours = this.proxy.getTimezoneOffset() / 60;\n        // decide if we are ahead of or behind GMT\n        var prefix = hours < 0 ? '+' : '-';\n        // remove the negative sign if any\n        hours = Math.abs(hours);\n        // add the +/- to the padded number of hours to : to the padded minutes\n        return prefix + addZeros(Math.floor(hours), 2) + ':' + addZeros((hours % 1) * 60, 2);\n    };\n    \n    /**\n     * Implements Date functionality\n     */\n    jsDate.prototype.getHours = function() {\n        return this.proxy.getHours();\n    };\n    \n    /**\n     * Get the current hour on a 12-hour scheme\n     * \n     * @returns {Integer}\n     */\n     \n    jsDate.prototype.getHours12  = function() {\n        var hours = this.proxy.getHours();\n        return hours > 12 ? hours - 12 : (hours == 0 ? 12 : hours);\n    };\n    \n    \n    jsDate.prototype.getIsoWeek = function() {\n        var d = this.proxy;\n        var woy = this.getWeekOfYear();\n        var dow1_1 = (new Date('' + d.getFullYear() + '/1/1')).getDay();\n        // First week is 01 and not 00 as in the case of %U and %W,\n        // so we add 1 to the final result except if day 1 of the year\n        // is a Monday (then %W returns 01).\n        // We also need to subtract 1 if the day 1 of the year is \n        // Friday-Sunday, so the resulting equation becomes:\n        var idow = woy + (dow1_1 > 4 || dow1_1 <= 1 ? 0 : 1);\n        if(idow == 53 && (new Date('' + d.getFullYear() + '/12/31')).getDay() < 4)\n        {\n            idow = 1;\n        }\n        else if(idow === 0)\n        {\n            d = new jsDate(new Date('' + (d.getFullYear()-1) + '/12/31'));\n            idow = d.getIsoWeek();\n        }\n        d = null;\n        return idow;\n    };\n    \n    /**\n     * Implements Date functionality\n     */\n    jsDate.prototype.getMilliseconds = function() {\n        return this.proxy.getMilliseconds();\n    };\n    \n    /**\n     * Implements Date functionality\n     */\n    jsDate.prototype.getMinutes = function() {\n        return this.proxy.getMinutes();\n    };\n    \n    /**\n     * Implements Date functionality\n     */\n    jsDate.prototype.getMonth = function() {\n        return this.proxy.getMonth();\n    };\n    \n    /**\n     * Get the name of the current month\n     * \n     * @returns {String}\n     */\n     \n    jsDate.prototype.getMonthName = function() {\n        return jsDate.regional[this.locale][\"monthNames\"][this.proxy.getMonth()];\n    };\n    \n    /**\n     * Get the number of the current month, 1-12\n     * \n     * @returns {Integer}\n     */\n     \n    jsDate.prototype.getMonthNumber = function() {\n        return this.proxy.getMonth() + 1;\n    };\n    \n    /**\n     * Implements Date functionality\n     */\n    jsDate.prototype.getSeconds = function() {\n        return this.proxy.getSeconds();\n    };\n    \n    /**\n     * Return a proper two-digit year integer\n     * \n     * @returns {Integer}\n     */\n     \n    jsDate.prototype.getShortYear = function() {\n        return this.proxy.getYear() % 100;\n    };\n    \n    /**\n     * Implements Date functionality\n     */\n    jsDate.prototype.getTime = function() {\n        return this.proxy.getTime();\n    };\n    \n    /**\n     * Get the timezone abbreviation\n     *\n     * @returns {String} Abbreviation for the timezone\n     */\n    jsDate.prototype.getTimezoneAbbr = function() {\n        return this.proxy.toString().replace(/^.*\\(([^)]+)\\)$/, '$1'); \n    };\n    \n    /**\n     * Get the browser-reported name for the current timezone (e.g. MDT, Mountain Daylight Time)\n     * \n     * @returns {String}\n     */\n    jsDate.prototype.getTimezoneName = function() {\n        var match = /(?:\\((.+)\\)$| ([A-Z]{3}) )/.exec(this.toString());\n        return match[1] || match[2] || 'GMT' + this.getGmtOffset();\n    }; \n    \n    /**\n     * Implements Date functionality\n     */\n    jsDate.prototype.getTimezoneOffset = function() {\n        return this.proxy.getTimezoneOffset();\n    };\n    \n    \n    /**\n     * Get the week number of the given year, starting with the first Monday as the first week\n     * @returns {Integer} Week number (13 for the 13th week of the year).\n     */\n    jsDate.prototype.getWeekOfYear = function() {\n        var doy = this.getDayOfYear();\n        var rdow = 7 - this.getDayOfWeek();\n        var woy = parseInt((doy+rdow)/7, 10);\n        return woy;\n    };\n    \n    /**\n     * Get the current date as a Unix timestamp\n     * \n     * @returns {Integer}\n     */\n     \n    jsDate.prototype.getUnix = function() {\n        return Math.round(this.proxy.getTime() / 1000, 0);\n    }; \n    \n    /**\n     * Implements Date functionality\n     */\n    jsDate.prototype.getYear = function() {\n        return this.proxy.getYear();\n    };\n    \n    /**\n     * Return a date one day ahead (or any other unit)\n     * \n     * @param {String} unit Optional, year | month | day | week | hour | minute | second | millisecond\n     * @returns {jsDate}\n     */\n     \n    jsDate.prototype.next = function(unit) {\n        unit = unit || 'day';\n        return this.clone().add(1, unit);\n    };\n    \n    /**\n     * Set the jsDate instance to a new date.\n     *\n     * @param  {String | Number | Array | Date Object | jsDate Object | Options Object} arguments Optional arguments, \n     * either a parsable date/time string,\n     * a JavaScript timestamp, an array of numbers of form [year, month, day, hours, minutes, seconds, milliseconds],\n     * a Date object, jsDate Object or an options object of form {syntax: \"perl\", date:some Date} where all options are optional.\n     */\n    jsDate.prototype.set = function() {\n        switch ( arguments.length ) {\n            case 0:\n                this.proxy = new Date();\n                break;\n            case 1:\n                // other objects either won't have a _type property or,\n                // if they do, it shouldn't be set to \"jsDate\", so\n                // assume it is an options argument.\n                if (get_type(arguments[0]) == \"[object Object]\" && arguments[0]._type != \"jsDate\") {\n                    var opts = this.options = arguments[0];\n                    this.syntax = opts.syntax || this.syntax;\n                    this.defaultCentury = opts.defaultCentury || this.defaultCentury;\n                    this.proxy = jsDate.createDate(opts.date);\n                }\n                else {\n                    this.proxy = jsDate.createDate(arguments[0]);\n                }\n                break;\n            default:\n                var a = [];\n                for ( var i=0; i<arguments.length; i++ ) {\n                    a.push(arguments[i]);\n                }\n                // this should be the current date/time\n                this.proxy = new Date();\n                this.proxy.setFullYear.apply( this.proxy, a.slice(0,3) );\n                if ( a.slice(3).length ) {\n                    this.proxy.setHours.apply( this.proxy, a.slice(3) );\n                }\n                break;\n        }\n        return this;\n    };\n    \n    /**\n     * Sets the day of the month for a specified date according to local time.\n     * @param {Integer} dayValue An integer from 1 to 31, representing the day of the month. \n     */\n    jsDate.prototype.setDate = function(n) {\n        this.proxy.setDate(n);\n        return this;\n    };\n    \n    /**\n     * Sets the full year for a specified date according to local time.\n     * @param {Integer} yearValue The numeric value of the year, for example, 1995.  \n     * @param {Integer} monthValue Optional, between 0 and 11 representing the months January through December.  \n     * @param {Integer} dayValue Optional, between 1 and 31 representing the day of the month. If you specify the dayValue parameter, you must also specify the monthValue. \n     */\n    jsDate.prototype.setFullYear = function() {\n        this.proxy.setFullYear.apply(this.proxy, arguments);\n        return this;\n    };\n    \n    /**\n     * Sets the hours for a specified date according to local time.\n     * \n     * @param {Integer} hoursValue An integer between 0 and 23, representing the hour.  \n     * @param {Integer} minutesValue Optional, An integer between 0 and 59, representing the minutes.  \n     * @param {Integer} secondsValue Optional, An integer between 0 and 59, representing the seconds. \n     * If you specify the secondsValue parameter, you must also specify the minutesValue.  \n     * @param {Integer} msValue Optional, A number between 0 and 999, representing the milliseconds. \n     * If you specify the msValue parameter, you must also specify the minutesValue and secondsValue. \n     */\n    jsDate.prototype.setHours = function() {\n        this.proxy.setHours.apply(this.proxy, arguments);\n        return this;\n    };\n    \n    /**\n     * Implements Date functionality\n     */ \n    jsDate.prototype.setMilliseconds = function(n) {\n        this.proxy.setMilliseconds(n);\n        return this;\n    };\n    \n    /**\n     * Implements Date functionality\n     */ \n    jsDate.prototype.setMinutes = function() {\n        this.proxy.setMinutes.apply(this.proxy, arguments);\n        return this;\n    };\n    \n    /**\n     * Implements Date functionality\n     */ \n    jsDate.prototype.setMonth = function() {\n        this.proxy.setMonth.apply(this.proxy, arguments);\n        return this;\n    };\n    \n    /**\n     * Implements Date functionality\n     */ \n    jsDate.prototype.setSeconds = function() {\n        this.proxy.setSeconds.apply(this.proxy, arguments);\n        return this;\n    };\n    \n    /**\n     * Implements Date functionality\n     */ \n    jsDate.prototype.setTime = function(n) {\n        this.proxy.setTime(n);\n        return this;\n    };\n    \n    /**\n     * Implements Date functionality\n     */ \n    jsDate.prototype.setYear = function() {\n        this.proxy.setYear.apply(this.proxy, arguments);\n        return this;\n    };\n    \n    /**\n     * Provide a formatted string representation of this date.\n     * \n     * @param {String} formatString A format string.  \n     * See: {@link jsDate.formats}.\n     * @returns {String} Date String.\n     */\n            \n    jsDate.prototype.strftime = function(formatString) {\n        formatString = formatString || this.formatString || jsDate.regional[this.locale]['formatString'];\n        return jsDate.strftime(this, formatString, this.syntax);\n    };\n        \n    /**\n     * Return a String representation of this jsDate object.\n     * @returns {String} Date string.\n     */\n    \n    jsDate.prototype.toString = function() {\n        return this.proxy.toString();\n    };\n        \n    /**\n     * Convert the current date to an 8-digit integer (%Y%m%d)\n     * \n     * @returns {Integer}\n     */\n     \n    jsDate.prototype.toYmdInt = function() {\n        return (this.proxy.getFullYear() * 10000) + (this.getMonthNumber() * 100) + this.proxy.getDate();\n    };\n    \n    /**\n     * @namespace Holds localizations for month/day names.\n     * <p>jsDate attempts to detect locale when loaded and defaults to 'en'.\n     * If a localization is detected which is not available, jsDate defaults to 'en'.\n     * Additional localizations can be added after jsDate loads.  After adding a localization,\n     * call the jsDate.regional.getLocale() method.  Currently, en, fr and de are defined.</p>\n     * \n     * <p>Localizations must be an object and have the following properties defined:  monthNames, monthNamesShort, dayNames, dayNamesShort and Localizations are added like:</p>\n     * <pre class=\"code\">\n     * jsDate.regional['en'] = {\n     * monthNames      : 'January February March April May June July August September October November December'.split(' '),\n     * monthNamesShort : 'Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec'.split(' '),\n     * dayNames        : 'Sunday Monday Tuesday Wednesday Thursday Friday Saturday'.split(' '),\n     * dayNamesShort   : 'Sun Mon Tue Wed Thu Fri Sat'.split(' ')\n     * };\n     * </pre>\n     * <p>After adding localizations, call <code>jsDate.regional.getLocale();</code> to update the locale setting with the\n     * new localizations.</p>\n     */\n     \n    jsDate.regional = {\n        'en': {\n            monthNames: ['January','February','March','April','May','June','July','August','September','October','November','December'],\n            monthNamesShort: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun','Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n            dayNames: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n            dayNamesShort: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n            formatString: '%Y-%m-%d %H:%M:%S'\n        },\n        \n        'fr': {\n            monthNames: ['Janvier','Février','Mars','Avril','Mai','Juin','Juillet','Août','Septembre','Octobre','Novembre','Décembre'],\n            monthNamesShort: ['Jan','Fév','Mar','Avr','Mai','Jun','Jul','Aoû','Sep','Oct','Nov','Déc'],\n            dayNames: ['Dimanche','Lundi','Mardi','Mercredi','Jeudi','Vendredi','Samedi'],\n            dayNamesShort: ['Dim','Lun','Mar','Mer','Jeu','Ven','Sam'],\n            formatString: '%Y-%m-%d %H:%M:%S'\n        },\n        \n        'de': {\n            monthNames: ['Januar','Februar','März','April','Mai','Juni','Juli','August','September','Oktober','November','Dezember'],\n            monthNamesShort: ['Jan','Feb','Mär','Apr','Mai','Jun','Jul','Aug','Sep','Okt','Nov','Dez'],\n            dayNames: ['Sonntag','Montag','Dienstag','Mittwoch','Donnerstag','Freitag','Samstag'],\n            dayNamesShort: ['So','Mo','Di','Mi','Do','Fr','Sa'],\n            formatString: '%Y-%m-%d %H:%M:%S'\n        },\n        \n        'es': {\n            monthNames: ['Enero','Febrero','Marzo','Abril','Mayo','Junio', 'Julio','Agosto','Septiembre','Octubre','Noviembre','Diciembre'],\n            monthNamesShort: ['Ene','Feb','Mar','Abr','May','Jun', 'Jul','Ago','Sep','Oct','Nov','Dic'],\n            dayNames: ['Domingo','Lunes','Martes','Mi&eacute;rcoles','Jueves','Viernes','S&aacute;bado'],\n            dayNamesShort: ['Dom','Lun','Mar','Mi&eacute;','Juv','Vie','S&aacute;b'],\n            formatString: '%Y-%m-%d %H:%M:%S'\n        },\n        \n        'ru': {\n            monthNames: ['Январь','Февраль','Март','Апрель','Май','Июнь','Июль','Август','Сентябрь','Октябрь','Ноябрь','Декабрь'],\n            monthNamesShort: ['Янв','Фев','Мар','Апр','Май','Июн','Июл','Авг','Сен','Окт','Ноя','Дек'],\n            dayNames: ['воскресенье','понедельник','вторник','среда','четверг','пятница','суббота'],\n            dayNamesShort: ['вск','пнд','втр','срд','чтв','птн','сбт'],\n            formatString: '%Y-%m-%d %H:%M:%S'\n        },\n        \n        'ar': {\n            monthNames: ['كانون الثاني', 'شباط', 'آذار', 'نيسان', 'آذار', 'حزيران','تموز', 'آب', 'أيلول',   'تشرين الأول', 'تشرين الثاني', 'كانون الأول'],\n            monthNamesShort: ['1','2','3','4','5','6','7','8','9','10','11','12'],\n            dayNames: ['السبت', 'الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة'],\n            dayNamesShort: ['سبت', 'أحد', 'اثنين', 'ثلاثاء', 'أربعاء', 'خميس', 'جمعة'],\n            formatString: '%Y-%m-%d %H:%M:%S'\n        },\n        \n        'pt': {\n            monthNames: ['Janeiro','Fevereiro','Mar&ccedil;o','Abril','Maio','Junho','Julho','Agosto','Setembro','Outubro','Novembro','Dezembro'],\n            monthNamesShort: ['Jan','Fev','Mar','Abr','Mai','Jun','Jul','Ago','Set','Out','Nov','Dez'],\n            dayNames: ['Domingo','Segunda-feira','Ter&ccedil;a-feira','Quarta-feira','Quinta-feira','Sexta-feira','S&aacute;bado'],\n            dayNamesShort: ['Dom','Seg','Ter','Qua','Qui','Sex','S&aacute;b'],\n            formatString: '%Y-%m-%d %H:%M:%S'   \n        },\n        \n        'pt-BR': {\n            monthNames: ['Janeiro','Fevereiro','Mar&ccedil;o','Abril','Maio','Junho', 'Julho','Agosto','Setembro','Outubro','Novembro','Dezembro'],\n            monthNamesShort: ['Jan','Fev','Mar','Abr','Mai','Jun','Jul','Ago','Set','Out','Nov','Dez'],\n            dayNames: ['Domingo','Segunda-feira','Ter&ccedil;a-feira','Quarta-feira','Quinta-feira','Sexta-feira','S&aacute;bado'],\n            dayNamesShort: ['Dom','Seg','Ter','Qua','Qui','Sex','S&aacute;b'],\n            formatString: '%Y-%m-%d %H:%M:%S'\n        },\n        \n        'pl': {\n            monthNames: ['Styczeń','Luty','Marzec','Kwiecień','Maj','Czerwiec','Lipiec','Sierpień','Wrzesień','Październik','Listopad','Grudzień'],\n            monthNamesShort: ['Sty', 'Lut', 'Mar', 'Kwi', 'Maj', 'Cze','Lip', 'Sie', 'Wrz', 'Paź', 'Lis', 'Gru'],\n            dayNames: ['Niedziela', 'Poniedziałek', 'Wtorek', 'Środa', 'Czwartek', 'Piątek', 'Sobota'],\n            dayNamesShort: ['Ni', 'Pn', 'Wt', 'Śr', 'Cz', 'Pt', 'Sb'],\n            formatString: '%Y-%m-%d %H:%M:%S'\n        },\n\n        'nl': {\n            monthNames: ['Januari','Februari','Maart','April','Mei','Juni','July','Augustus','September','Oktober','November','December'],\n            monthNamesShort: ['Jan','Feb','Mar','Apr','Mei','Jun','Jul','Aug','Sep','Okt','Nov','Dec'],\n            dayNames:','['Zondag','Maandag','Dinsdag','Woensdag','Donderdag','Vrijdag','Zaterdag'],\n            dayNamesShort: ['Zo','Ma','Di','Wo','Do','Vr','Za'],\n            formatString: '%Y-%m-%d %H:%M:%S'\n        },\n\n        'sv': {\n            monthNames: ['januari','februari','mars','april','maj','juni','juli','augusti','september','oktober','november','december'],\n            monthNamesShort: ['jan','feb','mar','apr','maj','jun','jul','aug','sep','okt','nov','dec'],\n            dayNames: ['söndag','måndag','tisdag','onsdag','torsdag','fredag','lördag'],\n            dayNamesShort: ['sön','mån','tis','ons','tor','fre','lör'],\n            formatString: '%Y-%m-%d %H:%M:%S'\n        },\n\n        'it': {\n            monthNames: ['Gennaio','Febbraio','Marzo','Aprile','Maggio','Giugno','Luglio','Agosto','Settembre','Ottobre','Novembre','Dicembre'],\n            monthNamesShort: ['Gen','Feb','Mar','Apr','Mag','Giu','Lug','Ago','Set','Ott','Nov','Dic'],\n            dayNames: ['Domenica','Lunedi','Martedi','Mercoledi','Giovedi','Venerdi','Sabato'],\n            dayNamesShort: ['Dom','Lun','Mar','Mer','Gio','Ven','Sab'],\n            formatString: '%d-%m-%Y %H:%M:%S'\n        }\n    \n    };\n    \n    // Set english variants to 'en'\n    jsDate.regional['en-US'] = jsDate.regional['en-GB'] = jsDate.regional['en'];\n    \n    /**\n     * Try to determine the users locale based on the lang attribute of the html page.  Defaults to 'en'\n     * if it cannot figure out a locale of if the locale does not have a localization defined.\n     * @returns {String} locale\n     */\n     \n    jsDate.regional.getLocale = function () {\n        var l = jsDate.config.defaultLocale;\n        \n        if ( document && document.getElementsByTagName('html') && document.getElementsByTagName('html')[0].lang ) {\n            l = document.getElementsByTagName('html')[0].lang;\n            if (!jsDate.regional.hasOwnProperty(l)) {\n                l = jsDate.config.defaultLocale;\n            }\n        }\n        \n        return l;\n    };\n    \n    // ms in day\n    var day = 24 * 60 * 60 * 1000;\n    \n    // padd a number with zeros\n    var addZeros = function(num, digits) {\n        num = String(num);\n        var i = digits - num.length;\n        var s = String(Math.pow(10, i)).slice(1);\n        return s.concat(num);\n    };\n\n    // representations used for calculating differences between dates.\n    // This borrows heavily from Ken Snyder's work.\n    var multipliers = {\n        millisecond: 1,\n        second: 1000,\n        minute: 60 * 1000,\n        hour: 60 * 60 * 1000,\n        day: day,\n        week: 7 * day,\n        month: {\n            // add a number of months\n            add: function(d, number) {\n                // add any years needed (increments of 12)\n                multipliers.year.add(d, Math[number > 0 ? 'floor' : 'ceil'](number / 12));\n                // ensure that we properly wrap betwen December and January\n                // 11 % 12 = 11\n                // 12 % 12 = 0\n                var prevMonth = d.getMonth() + (number % 12);\n                if (prevMonth == 12) {\n                    prevMonth = 0;\n                    d.setYear(d.getFullYear() + 1);\n                } else if (prevMonth == -1) {\n                    prevMonth = 11;\n                    d.setYear(d.getFullYear() - 1);\n                }\n                d.setMonth(prevMonth);\n            },\n            // get the number of months between two Date objects (decimal to the nearest day)\n            diff: function(d1, d2) {\n                // get the number of years\n                var diffYears = d1.getFullYear() - d2.getFullYear();\n                // get the number of remaining months\n                var diffMonths = d1.getMonth() - d2.getMonth() + (diffYears * 12);\n                // get the number of remaining days\n                var diffDays = d1.getDate() - d2.getDate();\n                // return the month difference with the days difference as a decimal\n                return diffMonths + (diffDays / 30);\n            }\n        },\n        year: {\n            // add a number of years\n            add: function(d, number) {\n                d.setYear(d.getFullYear() + Math[number > 0 ? 'floor' : 'ceil'](number));\n            },\n            // get the number of years between two Date objects (decimal to the nearest day)\n            diff: function(d1, d2) {\n                return multipliers.month.diff(d1, d2) / 12;\n            }\n        }        \n    };\n    //\n    // Alias each multiplier with an 's' to allow 'year' and 'years' for example.\n    // This comes from Ken Snyders work.\n    //\n    for (var unit in multipliers) {\n        if (unit.substring(unit.length - 1) != 's') { // IE will iterate newly added properties :|\n            multipliers[unit + 's'] = multipliers[unit];\n        }\n    }\n    \n    //\n    // take a jsDate instance and a format code and return the formatted value.\n    // This is a somewhat modified version of Ken Snyder's method.\n    //\n    var format = function(d, code, syntax) {\n        // if shorcut codes are used, recursively expand those.\n        if (jsDate.formats[syntax][\"shortcuts\"][code]) {\n            return jsDate.strftime(d, jsDate.formats[syntax][\"shortcuts\"][code], syntax);\n        } else {\n            // get the format code function and addZeros() argument\n            var getter = (jsDate.formats[syntax][\"codes\"][code] || '').split('.');\n            var nbr = d['get' + getter[0]] ? d['get' + getter[0]]() : '';\n            if (getter[1]) {\n                nbr = addZeros(nbr, getter[1]);\n            }\n            return nbr;\n        }       \n    };\n    \n    /**\n     * @static\n     * Static function for convert a date to a string according to a given format.  Also acts as namespace for strftime format codes.\n     * <p>strftime formatting can be accomplished without creating a jsDate object by calling jsDate.strftime():</p>\n     * <pre class=\"code\">\n     * var formattedDate = jsDate.strftime('Feb 8, 2006 8:48:32', '%Y-%m-%d %H:%M:%S');\n     * </pre>\n     * @param {String | Number | Array | jsDate&nbsp;Object | Date&nbsp;Object} date A parsable date string, JavaScript time stamp, Array of form [year, month, day, hours, minutes, seconds, milliseconds], jsDate Object or Date object.\n     * @param {String} formatString String with embedded date formatting codes.  \n     * See: {@link jsDate.formats}. \n     * @param {String} syntax Optional syntax to use [default perl].\n     * @param {String} locale Optional locale to use.\n     * @returns {String} Formatted representation of the date.\n    */\n    //\n    // Logic as implemented here is very similar to Ken Snyder's Date Instance Methods.\n    //\n    jsDate.strftime = function(d, formatString, syntax, locale) {\n        var syn = 'perl';\n        var loc = jsDate.regional.getLocale();\n        \n        // check if syntax and locale are available or reversed\n        if (syntax && jsDate.formats.hasOwnProperty(syntax)) {\n            syn = syntax;\n        }\n        else if (syntax && jsDate.regional.hasOwnProperty(syntax)) {\n            loc = syntax;\n        }\n        \n        if (locale && jsDate.formats.hasOwnProperty(locale)) {\n            syn = locale;\n        }\n        else if (locale && jsDate.regional.hasOwnProperty(locale)) {\n            loc = locale;\n        }\n        \n        if (get_type(d) != \"[object Object]\" || d._type != \"jsDate\") {\n            d = new jsDate(d);\n            d.locale = loc;\n        }\n        if (!formatString) {\n            formatString = d.formatString || jsDate.regional[loc]['formatString'];\n        }\n        // default the format string to year-month-day\n        var source = formatString || '%Y-%m-%d', \n            result = '', \n            match;\n        // replace each format code\n        while (source.length > 0) {\n            if (match = source.match(jsDate.formats[syn].codes.matcher)) {\n                result += source.slice(0, match.index);\n                result += (match[1] || '') + format(d, match[2], syn);\n                source = source.slice(match.index + match[0].length);\n            } else {\n                result += source;\n                source = '';\n            }\n        }\n        return result;\n    };\n    \n    /**\n     * @namespace\n     * Namespace to hold format codes and format shortcuts.  \"perl\" and \"php\" format codes \n     * and shortcuts are defined by default.  Additional codes and shortcuts can be\n     * added like:\n     * \n     * <pre class=\"code\">\n     * jsDate.formats[\"perl\"] = {\n     *     \"codes\": {\n     *         matcher: /someregex/,\n     *         Y: \"fullYear\",  // name of \"get\" method without the \"get\",\n     *         ...,            // more codes\n     *     },\n     *     \"shortcuts\": {\n     *         F: '%Y-%m-%d',\n     *         ...,            // more shortcuts\n     *     }\n     * };\n     * </pre>\n     * \n     * <p>Additionally, ISO and SQL shortcuts are defined and can be accesses via:\n     * <code>jsDate.formats.ISO</code> and <code>jsDate.formats.SQL</code>\n     */\n    \n    jsDate.formats = {\n        ISO:'%Y-%m-%dT%H:%M:%S.%N%G',\n        SQL:'%Y-%m-%d %H:%M:%S'\n    };\n    \n    /**\n     * Perl format codes and shortcuts for strftime.\n     * \n     * A hash (object) of codes where each code must be an array where the first member is \n     * the name of a Date.prototype or jsDate.prototype function to call\n     * and optionally a second member indicating the number to pass to addZeros()\n     * \n     * <p>The following format codes are defined:</p>\n     * \n     * <pre class=\"code\">\n     * Code    Result                    Description\n     * == Years ==           \n     * %Y      2008                      Four-digit year\n     * %y      08                        Two-digit year\n     * \n     * == Months ==          \n     * %m      09                        Two-digit month\n     * %#m     9                         One or two-digit month\n     * %B      September                 Full month name\n     * %b      Sep                       Abbreviated month name\n     * \n     * == Days ==            \n     * %d      05                        Two-digit day of month\n     * %#d     5                         One or two-digit day of month\n     * %e      5                         One or two-digit day of month\n     * %A      Sunday                    Full name of the day of the week\n     * %a      Sun                       Abbreviated name of the day of the week\n     * %w      0                         Number of the day of the week (0 = Sunday, 6 = Saturday)\n     * \n     * == Hours ==           \n     * %H      23                        Hours in 24-hour format (two digits)\n     * %#H     3                         Hours in 24-hour integer format (one or two digits)\n     * %I      11                        Hours in 12-hour format (two digits)\n     * %#I     3                         Hours in 12-hour integer format (one or two digits)\n     * %p      PM                        AM or PM\n     * \n     * == Minutes ==         \n     * %M      09                        Minutes (two digits)\n     * %#M     9                         Minutes (one or two digits)\n     * \n     * == Seconds ==         \n     * %S      02                        Seconds (two digits)\n     * %#S     2                         Seconds (one or two digits)\n     * %s      1206567625723             Unix timestamp (Seconds past 1970-01-01 00:00:00)\n     * \n     * == Milliseconds ==    \n     * %N      008                       Milliseconds (three digits)\n     * %#N     8                         Milliseconds (one to three digits)\n     * \n     * == Timezone ==        \n     * %O      360                       difference in minutes between local time and GMT\n     * %Z      Mountain Standard Time    Name of timezone as reported by browser\n     * %G      06:00                     Hours and minutes between GMT\n     * \n     * == Shortcuts ==       \n     * %F      2008-03-26                %Y-%m-%d\n     * %T      05:06:30                  %H:%M:%S\n     * %X      05:06:30                  %H:%M:%S\n     * %x      03/26/08                  %m/%d/%y\n     * %D      03/26/08                  %m/%d/%y\n     * %#c     Wed Mar 26 15:31:00 2008  %a %b %e %H:%M:%S %Y\n     * %v      3-Sep-2008                %e-%b-%Y\n     * %R      15:31                     %H:%M\n     * %r      03:31:00 PM               %I:%M:%S %p\n     * \n     * == Characters ==      \n     * %n      \\n                        Newline\n     * %t      \\t                        Tab\n     * %%      %                         Percent Symbol\n     * </pre>\n     * \n     * <p>Formatting shortcuts that will be translated into their longer version.\n     * Be sure that format shortcuts do not refer to themselves: this will cause an infinite loop.</p>\n     * \n     * <p>Format codes and format shortcuts can be redefined after the jsDate\n     * module is imported.</p>\n     * \n     * <p>Note that if you redefine the whole hash (object), you must supply a \"matcher\"\n     * regex for the parser.  The default matcher is:</p>\n     * \n     * <code>/()%(#?(%|[a-z]))/i</code>\n     * \n     * <p>which corresponds to the Perl syntax used by default.</p>\n     * \n     * <p>By customizing the matcher and format codes, nearly any strftime functionality is possible.</p>\n     */\n     \n    jsDate.formats.perl = {\n        codes: {\n            //\n            // 2-part regex matcher for format codes\n            //\n            // first match must be the character before the code (to account for escaping)\n            // second match must be the format code character(s)\n            //\n            matcher: /()%(#?(%|[a-z]))/i,\n            // year\n            Y: 'FullYear',\n            y: 'ShortYear.2',\n            // month\n            m: 'MonthNumber.2',\n            '#m': 'MonthNumber',\n            B: 'MonthName',\n            b: 'AbbrMonthName',\n            // day\n            d: 'Date.2',\n            '#d': 'Date',\n            e: 'Date',\n            A: 'DayName',\n            a: 'AbbrDayName',\n            w: 'Day',\n            // hours\n            H: 'Hours.2',\n            '#H': 'Hours',\n            I: 'Hours12.2',\n            '#I': 'Hours12',\n            p: 'AMPM',\n            // minutes\n            M: 'Minutes.2',\n            '#M': 'Minutes',\n            // seconds\n            S: 'Seconds.2',\n            '#S': 'Seconds',\n            s: 'Unix',\n            // milliseconds\n            N: 'Milliseconds.3',\n            '#N': 'Milliseconds',\n            // timezone\n            O: 'TimezoneOffset',\n            Z: 'TimezoneName',\n            G: 'GmtOffset'  \n        },\n        \n        shortcuts: {\n            // date\n            F: '%Y-%m-%d',\n            // time\n            T: '%H:%M:%S',\n            X: '%H:%M:%S',\n            // local format date\n            x: '%m/%d/%y',\n            D: '%m/%d/%y',\n            // local format extended\n            '#c': '%a %b %e %H:%M:%S %Y',\n            // local format short\n            v: '%e-%b-%Y',\n            R: '%H:%M',\n            r: '%I:%M:%S %p',\n            // tab and newline\n            t: '\\t',\n            n: '\\n',\n            '%': '%'\n        }\n    };\n    \n    /**\n     * PHP format codes and shortcuts for strftime.\n     * \n     * A hash (object) of codes where each code must be an array where the first member is \n     * the name of a Date.prototype or jsDate.prototype function to call\n     * and optionally a second member indicating the number to pass to addZeros()\n     * \n     * <p>The following format codes are defined:</p>\n     * \n     * <pre class=\"code\">\n     * Code    Result                    Description\n     * === Days ===        \n     * %a      Sun through Sat           An abbreviated textual representation of the day\n     * %A      Sunday - Saturday         A full textual representation of the day\n     * %d      01 to 31                  Two-digit day of the month (with leading zeros)\n     * %e      1 to 31                   Day of the month, with a space preceding single digits.\n     * %j      001 to 366                Day of the year, 3 digits with leading zeros\n     * %u      1 - 7 (Mon - Sun)         ISO-8601 numeric representation of the day of the week\n     * %w      0 - 6 (Sun - Sat)         Numeric representation of the day of the week\n     *                                  \n     * === Week ===                     \n     * %U      13                        Full Week number, starting with the first Sunday as the first week\n     * %V      01 through 53             ISO-8601:1988 week number, starting with the first week of the year \n     *                                   with at least 4 weekdays, with Monday being the start of the week\n     * %W      46                        A numeric representation of the week of the year, \n     *                                   starting with the first Monday as the first week\n     * === Month ===                    \n     * %b      Jan through Dec           Abbreviated month name, based on the locale\n     * %B      January - December        Full month name, based on the locale\n     * %h      Jan through Dec           Abbreviated month name, based on the locale (an alias of %b)\n     * %m      01 - 12 (Jan - Dec)       Two digit representation of the month\n     * \n     * === Year ===                     \n     * %C      19                        Two digit century (year/100, truncated to an integer)\n     * %y      09 for 2009               Two digit year\n     * %Y      2038                      Four digit year\n     * \n     * === Time ===                     \n     * %H      00 through 23             Two digit representation of the hour in 24-hour format\n     * %I      01 through 12             Two digit representation of the hour in 12-hour format\n     * %l      1 through 12              Hour in 12-hour format, with a space preceeding single digits\n     * %M      00 through 59             Two digit representation of the minute\n     * %p      AM/PM                     UPPER-CASE 'AM' or 'PM' based on the given time\n     * %P      am/pm                     lower-case 'am' or 'pm' based on the given time\n     * %r      09:34:17 PM               Same as %I:%M:%S %p\n     * %R      00:35                     Same as %H:%M\n     * %S      00 through 59             Two digit representation of the second\n     * %T      21:34:17                  Same as %H:%M:%S\n     * %X      03:59:16                  Preferred time representation based on locale, without the date\n     * %z      -0500 or EST              Either the time zone offset from UTC or the abbreviation\n     * %Z      -0500 or EST              The time zone offset/abbreviation option NOT given by %z\n     * \n     * === Time and Date ===            \n     * %D      02/05/09                  Same as %m/%d/%y\n     * %F      2009-02-05                Same as %Y-%m-%d (commonly used in database datestamps)\n     * %s      305815200                 Unix Epoch Time timestamp (same as the time() function)\n     * %x      02/05/09                  Preferred date representation, without the time\n     * \n     * === Miscellaneous ===            \n     * %n        ---                     A newline character (\\n)\n     * %t        ---                     A Tab character (\\t)\n     * %%        ---                     A literal percentage character (%)\n     * </pre>\n     */\n \n    jsDate.formats.php = {\n        codes: {\n            //\n            // 2-part regex matcher for format codes\n            //\n            // first match must be the character before the code (to account for escaping)\n            // second match must be the format code character(s)\n            //\n            matcher: /()%((%|[a-z]))/i,\n            // day\n            a: 'AbbrDayName',\n            A: 'DayName',\n            d: 'Date.2',\n            e: 'Date',\n            j: 'DayOfYear.3',\n            u: 'DayOfWeek',\n            w: 'Day',\n            // week\n            U: 'FullWeekOfYear.2',\n            V: 'IsoWeek.2',\n            W: 'WeekOfYear.2',\n            // month\n            b: 'AbbrMonthName',\n            B: 'MonthName',\n            m: 'MonthNumber.2',\n            h: 'AbbrMonthName',\n            // year\n            C: 'Century.2',\n            y: 'ShortYear.2',\n            Y: 'FullYear',\n            // time\n            H: 'Hours.2',\n            I: 'Hours12.2',\n            l: 'Hours12',\n            p: 'AMPM',\n            P: 'AmPm',\n            M: 'Minutes.2',\n            S: 'Seconds.2',\n            s: 'Unix',\n            O: 'TimezoneOffset',\n            z: 'GmtOffset',\n            Z: 'TimezoneAbbr'\n        },\n        \n        shortcuts: {\n            D: '%m/%d/%y',\n            F: '%Y-%m-%d',\n            T: '%H:%M:%S',\n            X: '%H:%M:%S',\n            x: '%m/%d/%y',\n            R: '%H:%M',\n            r: '%I:%M:%S %p',\n            t: '\\t',\n            n: '\\n',\n            '%': '%'\n        }\n    };   \n    //\n    // Conceptually, the logic implemented here is similar to Ken Snyder's Date Instance Methods.\n    // I use his idea of a set of parsers which can be regular expressions or functions,\n    // iterating through those, and then seeing if Date.parse() will create a date.\n    // The parser expressions and functions are a little different and some bugs have been\n    // worked out.  Also, a lot of \"pre-parsing\" is done to fix implementation\n    // variations of Date.parse() between browsers.\n    //\n    jsDate.createDate = function(date) {\n        // if passing in multiple arguments, try Date constructor\n        if (date == null) {\n            return new Date();\n        }\n        // If the passed value is already a date object, return it\n        if (date instanceof Date) {\n            return date;\n        }\n        // if (typeof date == 'number') return new Date(date * 1000);\n        // If the passed value is an integer, interpret it as a javascript timestamp\n        if (typeof date == 'number') {\n            return new Date(date);\n        }\n        \n        // Before passing strings into Date.parse(), have to normalize them for certain conditions.\n        // If strings are not formatted staccording to the EcmaScript spec, results from Date parse will be implementation dependent.  \n        // \n        // For example: \n        //  * FF and Opera assume 2 digit dates are pre y2k, Chome assumes <50 is pre y2k, 50+ is 21st century.  \n        //  * Chrome will correctly parse '1984-1-25' into localtime, FF and Opera will not parse.\n        //  * Both FF, Chrome and Opera will parse '1984/1/25' into localtime.\n        \n        // remove leading and trailing spaces\n        var parsable = String(date).replace(/^\\s*(.+)\\s*$/g, '$1');\n        \n        // replace dahses (-) with slashes (/) in dates like n[nnn]/n[n]/n[nnn]\n        parsable = parsable.replace(/^([0-9]{1,4})-([0-9]{1,2})-([0-9]{1,4})/, \"$1/$2/$3\");\n        \n        /////////\n        // Need to check for '15-Dec-09' also.\n        // FF will not parse, but Chrome will.\n        // Chrome will set date to 2009 as well.\n        /////////\n        \n        // first check for 'dd-mmm-yyyy' or 'dd/mmm/yyyy' like '15-Dec-2010'\n        parsable = parsable.replace(/^(3[01]|[0-2]?\\d)[-\\/]([a-z]{3,})[-\\/](\\d{4})/i, \"$1 $2 $3\");\n        \n        // Now check for 'dd-mmm-yy' or 'dd/mmm/yy' and normalize years to default century.\n        var match = parsable.match(/^(3[01]|[0-2]?\\d)[-\\/]([a-z]{3,})[-\\/](\\d{2})\\D*/i);\n        if (match && match.length > 3) {\n            var m3 = parseFloat(match[3]);\n            var ny = jsDate.config.defaultCentury + m3;\n            ny = String(ny);\n            \n            // now replace 2 digit year with 4 digit year\n            parsable = parsable.replace(/^(3[01]|[0-2]?\\d)[-\\/]([a-z]{3,})[-\\/](\\d{2})\\D*/i, match[1] +' '+ match[2] +' '+ ny);\n            \n        }\n        \n        // Check for '1/19/70 8:14PM'\n        // where starts with mm/dd/yy or yy/mm/dd and have something after\n        // Check if 1st postiion is greater than 31, assume it is year.\n        // Assme all 2 digit years are 1900's.\n        // Finally, change them into US style mm/dd/yyyy representations.\n        match = parsable.match(/^([0-9]{1,2})[-\\/]([0-9]{1,2})[-\\/]([0-9]{1,2})[^0-9]/);\n        \n        function h1(parsable, match) {\n            var m1 = parseFloat(match[1]);\n            var m2 = parseFloat(match[2]);\n            var m3 = parseFloat(match[3]);\n            var cent = jsDate.config.defaultCentury;\n            var ny, nd, nm, str;\n            \n            if (m1 > 31) { // first number is a year\n                nd = m3;\n                nm = m2;\n                ny = cent + m1;\n            }\n            \n            else { // last number is the year\n                nd = m2;\n                nm = m1;\n                ny = cent + m3;\n            }\n            \n            str = nm+'/'+nd+'/'+ny;\n            \n            // now replace 2 digit year with 4 digit year\n            return  parsable.replace(/^([0-9]{1,2})[-\\/]([0-9]{1,2})[-\\/]([0-9]{1,2})/, str);\n        \n        }\n        \n        if (match && match.length > 3) {\n            parsable = h1(parsable, match);\n        }\n        \n        // Now check for '1/19/70' with nothing after and do as above\n        var match = parsable.match(/^([0-9]{1,2})[-\\/]([0-9]{1,2})[-\\/]([0-9]{1,2})$/);\n        \n        if (match && match.length > 3) {\n            parsable = h1(parsable, match);\n        }\n                \n        \n        var i = 0;\n        var length = jsDate.matchers.length;\n        var pattern,\n            ms,\n            current = parsable,\n            obj;\n        while (i < length) {\n            ms = Date.parse(current);\n            if (!isNaN(ms)) {\n                return new Date(ms);\n            }\n            pattern = jsDate.matchers[i];\n            if (typeof pattern == 'function') {\n                obj = pattern.call(jsDate, current);\n                if (obj instanceof Date) {\n                    return obj;\n                }\n            } else {\n                current = parsable.replace(pattern[0], pattern[1]);\n            }\n            i++;\n        }\n        return NaN;\n    };\n    \n\n    /**\n     * @static\n     * Handy static utility function to return the number of days in a given month.\n     * @param {Integer} year Year\n     * @param {Integer} month Month (1-12)\n     * @returns {Integer} Number of days in the month.\n    */\n    //\n    // handy utility method Borrowed right from Ken Snyder's Date Instance Mehtods.\n    // \n    jsDate.daysInMonth = function(year, month) {\n        if (month == 2) {\n            return new Date(year, 1, 29).getDate() == 29 ? 29 : 28;\n        }\n        return [undefined,31,undefined,31,30,31,30,31,31,30,31,30,31][month];\n    };\n\n\n    //\n    // An Array of regular expressions or functions that will attempt to match the date string.\n    // Functions are called with scope of a jsDate instance.\n    //\n    jsDate.matchers = [\n        // convert dd.mmm.yyyy to mm/dd/yyyy (world date to US date).\n        [/(3[01]|[0-2]\\d)\\s*\\.\\s*(1[0-2]|0\\d)\\s*\\.\\s*([1-9]\\d{3})/, '$2/$1/$3'],\n        // convert yyyy-mm-dd to mm/dd/yyyy (ISO date to US date).\n        [/([1-9]\\d{3})\\s*-\\s*(1[0-2]|0\\d)\\s*-\\s*(3[01]|[0-2]\\d)/, '$2/$3/$1'],\n        // Handle 12 hour or 24 hour time with milliseconds am/pm and optional date part.\n        function(str) { \n            var match = str.match(/^(?:(.+)\\s+)?([012]?\\d)(?:\\s*\\:\\s*(\\d\\d))?(?:\\s*\\:\\s*(\\d\\d(\\.\\d*)?))?\\s*(am|pm)?\\s*$/i);\n            //                   opt. date      hour       opt. minute     opt. second       opt. msec   opt. am or pm\n            if (match) {\n                if (match[1]) {\n                    var d = this.createDate(match[1]);\n                    if (isNaN(d)) {\n                        return;\n                    }\n                } else {\n                    var d = new Date();\n                    d.setMilliseconds(0);\n                }\n                var hour = parseFloat(match[2]);\n                if (match[6]) {\n                    hour = match[6].toLowerCase() == 'am' ? (hour == 12 ? 0 : hour) : (hour == 12 ? 12 : hour + 12);\n                }\n                d.setHours(hour, parseInt(match[3] || 0, 10), parseInt(match[4] || 0, 10), ((parseFloat(match[5] || 0)) || 0)*1000);\n                return d;\n            }\n            else {\n                return str;\n            }\n        },\n        // Handle ISO timestamp with time zone.\n        function(str) {\n            var match = str.match(/^(?:(.+))[T|\\s+]([012]\\d)(?:\\:(\\d\\d))(?:\\:(\\d\\d))(?:\\.\\d+)([\\+\\-]\\d\\d\\:\\d\\d)$/i);\n            if (match) {\n                if (match[1]) {\n                    var d = this.createDate(match[1]);\n                    if (isNaN(d)) {\n                        return;\n                    }\n                } else {\n                    var d = new Date();\n                    d.setMilliseconds(0);\n                }\n                var hour = parseFloat(match[2]);\n                d.setHours(hour, parseInt(match[3], 10), parseInt(match[4], 10), parseFloat(match[5])*1000);\n                return d;\n            }\n            else {\n                    return str;\n            }\n        },\n        // Try to match ambiguous strings like 12/8/22.\n        // Use FF date assumption that 2 digit years are 20th century (i.e. 1900's).\n        // This may be redundant with pre processing of date already performed.\n        function(str) {\n            var match = str.match(/^([0-3]?\\d)\\s*[-\\/.\\s]{1}\\s*([a-zA-Z]{3,9})\\s*[-\\/.\\s]{1}\\s*([0-3]?\\d)$/);\n            if (match) {\n                var d = new Date();\n                var cent = jsDate.config.defaultCentury;\n                var m1 = parseFloat(match[1]);\n                var m3 = parseFloat(match[3]);\n                var ny, nd, nm;\n                if (m1 > 31) { // first number is a year\n                    nd = m3;\n                    ny = cent + m1;\n                }\n                \n                else { // last number is the year\n                    nd = m1;\n                    ny = cent + m3;\n                }\n                \n                var nm = inArray(match[2], jsDate.regional[jsDate.regional.getLocale()][\"monthNamesShort\"]);\n                \n                if (nm == -1) {\n                    nm = inArray(match[2], jsDate.regional[jsDate.regional.getLocale()][\"monthNames\"]);\n                }\n            \n                d.setFullYear(ny, nm, nd);\n                d.setHours(0,0,0,0);\n                return d;\n            }\n            \n            else {\n                return str;\n            }\n        }      \n    ];\n\n    //\n    // I think John Reisig published this method on his blog, ejohn.\n    //\n    function inArray( elem, array ) {\n        if ( array.indexOf ) {\n            return array.indexOf( elem );\n        }\n\n        for ( var i = 0, length = array.length; i < length; i++ ) {\n            if ( array[ i ] === elem ) {\n                return i;\n            }\n        }\n\n        return -1;\n    }\n    \n    //\n    // Thanks to Kangax, Christian Sciberras and Stack Overflow for this method.\n    //\n    function get_type(thing){\n        if(thing===null) return \"[object Null]\"; // special case\n        return Object.prototype.toString.call(thing);\n    }\n    \n    $.jsDate = jsDate;\n\n      \n    /**\n     * JavaScript printf/sprintf functions.\n     * \n     * This code has been adapted from the publicly available sprintf methods\n     * by Ash Searle. His original header follows:\n     *\n     *     This code is unrestricted: you are free to use it however you like.\n     *     \n     *     The functions should work as expected, performing left or right alignment,\n     *     truncating strings, outputting numbers with a required precision etc.\n     *\n     *     For complex cases, these functions follow the Perl implementations of\n     *     (s)printf, allowing arguments to be passed out-of-order, and to set the\n     *     precision or length of the output based on arguments instead of fixed\n     *     numbers.\n     *\n     *     See http://perldoc.perl.org/functions/sprintf.html for more information.\n     *\n     *     Implemented:\n     *     - zero and space-padding\n     *     - right and left-alignment,\n     *     - base X prefix (binary, octal and hex)\n     *     - positive number prefix\n     *     - (minimum) width\n     *     - precision / truncation / maximum width\n     *     - out of order arguments\n     *\n     *     Not implemented (yet):\n     *     - vector flag\n     *     - size (bytes, words, long-words etc.)\n     *     \n     *     Will not implement:\n     *     - %n or %p (no pass-by-reference in JavaScript)\n     *\n     *     @version 2007.04.27\n     *     @author Ash Searle \n     * \n     * You can see the original work and comments on his blog:\n     * http://hexmen.com/blog/2007/03/printf-sprintf/\n     * http://hexmen.com/js/sprintf.js\n     */\n     \n     /**\n      * @Modifications 2009.05.26\n      * @author Chris Leonello\n      * \n      * Added %p %P specifier\n      * Acts like %g or %G but will not add more significant digits to the output than present in the input.\n      * Example:\n      * Format: '%.3p', Input: 0.012, Output: 0.012\n      * Format: '%.3g', Input: 0.012, Output: 0.0120\n      * Format: '%.4p', Input: 12.0, Output: 12.0\n      * Format: '%.4g', Input: 12.0, Output: 12.00\n      * Format: '%.4p', Input: 4.321e-5, Output: 4.321e-5\n      * Format: '%.4g', Input: 4.321e-5, Output: 4.3210e-5\n      * \n      * Example:\n      * >>> $.jqplot.sprintf('%.2f, %d', 23.3452, 43.23)\n      * \"23.35, 43\"\n      * >>> $.jqplot.sprintf(\"no value: %n, decimal with thousands separator: %'d\", 23.3452, 433524)\n      * \"no value: , decimal with thousands separator: 433,524\"\n      */\n    $.jqplot.sprintf = function() {\n        function pad(str, len, chr, leftJustify) {\n            var padding = (str.length >= len) ? '' : Array(1 + len - str.length >>> 0).join(chr);\n            return leftJustify ? str + padding : padding + str;\n\n        }\n\n        function thousand_separate(value) {\n            var value_str = new String(value);\n            for (var i=10; i>0; i--) {\n                if (value_str == (value_str = value_str.replace(/^(\\d+)(\\d{3})/, \"$1\"+$.jqplot.sprintf.thousandsSeparator+\"$2\"))) break;\n            }\n            return value_str; \n        }\n\n        function justify(value, prefix, leftJustify, minWidth, zeroPad, htmlSpace) {\n            var diff = minWidth - value.length;\n            if (diff > 0) {\n                var spchar = ' ';\n                if (htmlSpace) { spchar = '&nbsp;'; }\n                if (leftJustify || !zeroPad) {\n                    value = pad(value, minWidth, spchar, leftJustify);\n                } else {\n                    value = value.slice(0, prefix.length) + pad('', diff, '0', true) + value.slice(prefix.length);\n                }\n            }\n            return value;\n        }\n\n        function formatBaseX(value, base, prefix, leftJustify, minWidth, precision, zeroPad, htmlSpace) {\n            // Note: casts negative numbers to positive ones\n            var number = value >>> 0;\n            prefix = prefix && number && {'2': '0b', '8': '0', '16': '0x'}[base] || '';\n            value = prefix + pad(number.toString(base), precision || 0, '0', false);\n            return justify(value, prefix, leftJustify, minWidth, zeroPad, htmlSpace);\n        }\n\n        function formatString(value, leftJustify, minWidth, precision, zeroPad, htmlSpace) {\n            if (precision != null) {\n                value = value.slice(0, precision);\n            }\n            return justify(value, '', leftJustify, minWidth, zeroPad, htmlSpace);\n        }\n\n        var a = arguments, i = 0, format = a[i++];\n\n        return format.replace($.jqplot.sprintf.regex, function(substring, valueIndex, flags, minWidth, _, precision, type) {\n            if (substring == '%%') { return '%'; }\n\n            // parse flags\n            var leftJustify = false, positivePrefix = '', zeroPad = false, prefixBaseX = false, htmlSpace = false, thousandSeparation = false;\n            for (var j = 0; flags && j < flags.length; j++) switch (flags.charAt(j)) {\n                case ' ': positivePrefix = ' '; break;\n                case '+': positivePrefix = '+'; break;\n                case '-': leftJustify = true; break;\n                case '0': zeroPad = true; break;\n                case '#': prefixBaseX = true; break;\n                case '&': htmlSpace = true; break;\n                case '\\'': thousandSeparation = true; break;\n            }\n\n            // parameters may be null, undefined, empty-string or real valued\n            // we want to ignore null, undefined and empty-string values\n\n            if (!minWidth) {\n                minWidth = 0;\n            } \n            else if (minWidth == '*') {\n                minWidth = +a[i++];\n            } \n            else if (minWidth.charAt(0) == '*') {\n                minWidth = +a[minWidth.slice(1, -1)];\n            } \n            else {\n                minWidth = +minWidth;\n            }\n\n            // Note: undocumented perl feature:\n            if (minWidth < 0) {\n                minWidth = -minWidth;\n                leftJustify = true;\n            }\n\n            if (!isFinite(minWidth)) {\n                throw new Error('$.jqplot.sprintf: (minimum-)width must be finite');\n            }\n\n            if (!precision) {\n                precision = 'fFeE'.indexOf(type) > -1 ? 6 : (type == 'd') ? 0 : void(0);\n            } \n            else if (precision == '*') {\n                precision = +a[i++];\n            } \n            else if (precision.charAt(0) == '*') {\n                precision = +a[precision.slice(1, -1)];\n            } \n            else {\n                precision = +precision;\n            }\n\n            // grab value using valueIndex if required?\n            var value = valueIndex ? a[valueIndex.slice(0, -1)] : a[i++];\n\n            switch (type) {\n            case 's': {\n                if (value == null) {\n                    return '';\n                }\n                return formatString(String(value), leftJustify, minWidth, precision, zeroPad, htmlSpace);\n            }\n            case 'c': return formatString(String.fromCharCode(+value), leftJustify, minWidth, precision, zeroPad, htmlSpace);\n            case 'b': return formatBaseX(value, 2, prefixBaseX, leftJustify, minWidth, precision, zeroPad,htmlSpace);\n            case 'o': return formatBaseX(value, 8, prefixBaseX, leftJustify, minWidth, precision, zeroPad, htmlSpace);\n            case 'x': return formatBaseX(value, 16, prefixBaseX, leftJustify, minWidth, precision, zeroPad, htmlSpace);\n            case 'X': return formatBaseX(value, 16, prefixBaseX, leftJustify, minWidth, precision, zeroPad, htmlSpace).toUpperCase();\n            case 'u': return formatBaseX(value, 10, prefixBaseX, leftJustify, minWidth, precision, zeroPad, htmlSpace);\n            case 'i': {\n              var number = parseInt(+value, 10);\n              if (isNaN(number)) {\n                return '';\n              }\n              var prefix = number < 0 ? '-' : positivePrefix;\n              var number_str = thousandSeparation ? thousand_separate(String(Math.abs(number))): String(Math.abs(number));\n              value = prefix + pad(number_str, precision, '0', false);\n              //value = prefix + pad(String(Math.abs(number)), precision, '0', false);\n              return justify(value, prefix, leftJustify, minWidth, zeroPad, htmlSpace);\n                  }\n            case 'd': {\n              var number = Math.round(+value);\n              if (isNaN(number)) {\n                return '';\n              }\n              var prefix = number < 0 ? '-' : positivePrefix;\n              var number_str = thousandSeparation ? thousand_separate(String(Math.abs(number))): String(Math.abs(number));\n              value = prefix + pad(number_str, precision, '0', false);\n              return justify(value, prefix, leftJustify, minWidth, zeroPad, htmlSpace);\n                  }\n            case 'e':\n            case 'E':\n            case 'f':\n            case 'F':\n            case 'g':\n            case 'G':\n                      {\n                      var number = +value;\n                      if (isNaN(number)) {\n                          return '';\n                      }\n                      var prefix = number < 0 ? '-' : positivePrefix;\n                      var method = ['toExponential', 'toFixed', 'toPrecision']['efg'.indexOf(type.toLowerCase())];\n                      var textTransform = ['toString', 'toUpperCase']['eEfFgG'.indexOf(type) % 2];\n                      var number_str = Math.abs(number)[method](precision);\n                      \n                      // Apply the decimal mark properly by splitting the number by the\n                      //   decimalMark, applying thousands separator, and then placing it\n                      //   back in.\n                      var parts = number_str.toString().split('.');\n                      parts[0] = thousandSeparation ? thousand_separate(parts[0]) : parts[0];\n                      number_str = parts.join($.jqplot.sprintf.decimalMark);\n                      \n                      value = prefix + number_str;\n                      var justified = justify(value, prefix, leftJustify, minWidth, zeroPad, htmlSpace)[textTransform]();\n                      \n                      return justified;\n                  }\n            case 'p':\n            case 'P':\n            {\n                // make sure number is a number\n                var number = +value;\n                if (isNaN(number)) {\n                    return '';\n                }\n                var prefix = number < 0 ? '-' : positivePrefix;\n\n                var parts = String(Number(Math.abs(number)).toExponential()).split(/e|E/);\n                var sd = (parts[0].indexOf('.') != -1) ? parts[0].length - 1 : String(number).length;\n                var zeros = (parts[1] < 0) ? -parts[1] - 1 : 0;\n                \n                if (Math.abs(number) < 1) {\n                    if (sd + zeros  <= precision) {\n                        value = prefix + Math.abs(number).toPrecision(sd);\n                    }\n                    else {\n                        if (sd  <= precision - 1) {\n                            value = prefix + Math.abs(number).toExponential(sd-1);\n                        }\n                        else {\n                            value = prefix + Math.abs(number).toExponential(precision-1);\n                        }\n                    }\n                }\n                else {\n                    var prec = (sd <= precision) ? sd : precision;\n                    value = prefix + Math.abs(number).toPrecision(prec);\n                }\n                var textTransform = ['toString', 'toUpperCase']['pP'.indexOf(type) % 2];\n                return justify(value, prefix, leftJustify, minWidth, zeroPad, htmlSpace)[textTransform]();\n            }\n            case 'n': return '';\n            default: return substring;\n            }\n        });\n    };\n\n    $.jqplot.sprintf.thousandsSeparator = ',';\n    // Specifies the decimal mark for floating point values. By default a period '.'\n    // is used. If you change this value to for example a comma be sure to also\n    // change the thousands separator or else this won't work since a simple String\n    // replace is used (replacing all periods with the mark specified here).\n    $.jqplot.sprintf.decimalMark = '.';\n    \n    $.jqplot.sprintf.regex = /%%|%(\\d+\\$)?([-+#0&\\' ]*)(\\*\\d+\\$|\\*|\\d+)?(\\.(\\*\\d+\\$|\\*|\\d+))?([nAscboxXuidfegpEGP])/g;\n\n    $.jqplot.getSignificantFigures = function(number) {\n        var parts = String(Number(Math.abs(number)).toExponential()).split(/e|E/);\n        // total significant digits\n        var sd = (parts[0].indexOf('.') != -1) ? parts[0].length - 1 : parts[0].length;\n        var zeros = (parts[1] < 0) ? -parts[1] - 1 : 0;\n        // exponent\n        var expn = parseInt(parts[1], 10);\n        // digits to the left of the decimal place\n        var dleft = (expn + 1 > 0) ? expn + 1 : 0;\n        // digits to the right of the decimal place\n        var dright = (sd <= dleft) ? 0 : sd - expn - 1;\n        return {significantDigits: sd, digitsLeft: dleft, digitsRight: dright, zeros: zeros, exponent: expn} ;\n    };\n\n    $.jqplot.getPrecision = function(number) {\n        return $.jqplot.getSignificantFigures(number).digitsRight;\n    };\n\n  \n\n\n    var backCompat = $.uiBackCompat !== false;\n\n    $.jqplot.effects = {\n        effect: {}\n    };\n\n    // prefix used for storing data on .data()\n    var dataSpace = \"jqplot.storage.\";\n\n    /******************************************************************************/\n    /*********************************** EFFECTS **********************************/\n    /******************************************************************************/\n\n    $.extend( $.jqplot.effects, {\n        version: \"1.9pre\",\n\n        // Saves a set of properties in a data storage\n        save: function( element, set ) {\n            for( var i=0; i < set.length; i++ ) {\n                if ( set[ i ] !== null ) {\n                    element.data( dataSpace + set[ i ], element[ 0 ].style[ set[ i ] ] );\n                }\n            }\n        },\n\n        // Restores a set of previously saved properties from a data storage\n        restore: function( element, set ) {\n            for( var i=0; i < set.length; i++ ) {\n                if ( set[ i ] !== null ) {\n                    element.css( set[ i ], element.data( dataSpace + set[ i ] ) );\n                }\n            }\n        },\n\n        setMode: function( el, mode ) {\n            if (mode === \"toggle\") {\n                mode = el.is( \":hidden\" ) ? \"show\" : \"hide\";\n            }\n            return mode;\n        },\n\n        // Wraps the element around a wrapper that copies position properties\n        createWrapper: function( element ) {\n\n            // if the element is already wrapped, return it\n            if ( element.parent().is( \".ui-effects-wrapper\" )) {\n                return element.parent();\n            }\n\n            // wrap the element\n            var props = {\n                    width: element.outerWidth(true),\n                    height: element.outerHeight(true),\n                    \"float\": element.css( \"float\" )\n                },\n                wrapper = $( \"<div></div>\" )\n                    .addClass( \"ui-effects-wrapper\" )\n                    .css({\n                        fontSize: \"100%\",\n                        background: \"transparent\",\n                        border: \"none\",\n                        margin: 0,\n                        padding: 0\n                    }),\n                // Store the size in case width/height are defined in % - Fixes #5245\n                size = {\n                    width: element.width(),\n                    height: element.height()\n                },\n                active = document.activeElement;\n\n            element.wrap( wrapper );\n\n            // Fixes #7595 - Elements lose focus when wrapped.\n            if ( element[ 0 ] === active || $.contains( element[ 0 ], active ) ) {\n                $( active ).focus();\n            }\n\n            wrapper = element.parent(); //Hotfix for jQuery 1.4 since some change in wrap() seems to actually loose the reference to the wrapped element\n\n            // transfer positioning properties to the wrapper\n            if ( element.css( \"position\" ) === \"static\" ) {\n                wrapper.css({ position: \"relative\" });\n                element.css({ position: \"relative\" });\n            } else {\n                $.extend( props, {\n                    position: element.css( \"position\" ),\n                    zIndex: element.css( \"z-index\" )\n                });\n                $.each([ \"top\", \"left\", \"bottom\", \"right\" ], function(i, pos) {\n                    props[ pos ] = element.css( pos );\n                    if ( isNaN( parseInt( props[ pos ], 10 ) ) ) {\n                        props[ pos ] = \"auto\";\n                    }\n                });\n                element.css({\n                    position: \"relative\",\n                    top: 0,\n                    left: 0,\n                    right: \"auto\",\n                    bottom: \"auto\"\n                });\n            }\n            element.css(size);\n\n            return wrapper.css( props ).show();\n        },\n\n        removeWrapper: function( element ) {\n            var active = document.activeElement;\n\n            if ( element.parent().is( \".ui-effects-wrapper\" ) ) {\n                element.parent().replaceWith( element );\n\n                // Fixes #7595 - Elements lose focus when wrapped.\n                if ( element[ 0 ] === active || $.contains( element[ 0 ], active ) ) {\n                    $( active ).focus();\n                }\n            }\n\n\n            return element;\n        }\n    });\n\n    // return an effect options object for the given parameters:\n    function _normalizeArguments( effect, options, speed, callback ) {\n\n        // short path for passing an effect options object:\n        if ( $.isPlainObject( effect ) ) {\n            return effect;\n        }\n\n        // convert to an object\n        effect = { effect: effect };\n\n        // catch (effect)\n        if ( options === undefined ) {\n            options = {};\n        }\n\n        // catch (effect, callback)\n        if ( $.isFunction( options ) ) {\n            callback = options;\n            speed = null;\n            options = {};\n        }\n\n        // catch (effect, speed, ?)\n        if ( $.type( options ) === \"number\" || $.fx.speeds[ options ]) {\n            callback = speed;\n            speed = options;\n            options = {};\n        }\n\n        // catch (effect, options, callback)\n        if ( $.isFunction( speed ) ) {\n            callback = speed;\n            speed = null;\n        }\n\n        // add options to effect\n        if ( options ) {\n            $.extend( effect, options );\n        }\n\n        speed = speed || options.duration;\n        effect.duration = $.fx.off ? 0 : typeof speed === \"number\"\n            ? speed : speed in $.fx.speeds ? $.fx.speeds[ speed ] : $.fx.speeds._default;\n\n        effect.complete = callback || options.complete;\n\n        return effect;\n    }\n\n    function standardSpeed( speed ) {\n        // valid standard speeds\n        if ( !speed || typeof speed === \"number\" || $.fx.speeds[ speed ] ) {\n            return true;\n        }\n\n        // invalid strings - treat as \"normal\" speed\n        if ( typeof speed === \"string\" && !$.jqplot.effects.effect[ speed ] ) {\n            // TODO: remove in 2.0 (#7115)\n            if ( backCompat && $.jqplot.effects[ speed ] ) {\n                return false;\n            }\n            return true;\n        }\n\n        return false;\n    }\n\n    $.fn.extend({\n        jqplotEffect: function( effect, options, speed, callback ) {\n            var args = _normalizeArguments.apply( this, arguments ),\n                mode = args.mode,\n                queue = args.queue,\n                effectMethod = $.jqplot.effects.effect[ args.effect ],\n\n                // DEPRECATED: remove in 2.0 (#7115)\n                oldEffectMethod = !effectMethod && backCompat && $.jqplot.effects[ args.effect ];\n\n            if ( $.fx.off || !( effectMethod || oldEffectMethod ) ) {\n                // delegate to the original method (e.g., .show()) if possible\n                if ( mode ) {\n                    return this[ mode ]( args.duration, args.complete );\n                } else {\n                    return this.each( function() {\n                        if ( args.complete ) {\n                            args.complete.call( this );\n                        }\n                    });\n                }\n            }\n\n            function run( next ) {\n                var elem = $( this ),\n                    complete = args.complete,\n                    mode = args.mode;\n\n                function done() {\n                    if ( $.isFunction( complete ) ) {\n                        complete.call( elem[0] );\n                    }\n                    if ( $.isFunction( next ) ) {\n                        next();\n                    }\n                }\n\n                // if the element is hiddden and mode is hide,\n                // or element is visible and mode is show\n                if ( elem.is( \":hidden\" ) ? mode === \"hide\" : mode === \"show\" ) {\n                    done();\n                } else {\n                    effectMethod.call( elem[0], args, done );\n                }\n            }\n\n            // TODO: remove this check in 2.0, effectMethod will always be true\n            if ( effectMethod ) {\n                return queue === false ? this.each( run ) : this.queue( queue || \"fx\", run );\n            } else {\n                // DEPRECATED: remove in 2.0 (#7115)\n                return oldEffectMethod.call(this, {\n                    options: args,\n                    duration: args.duration,\n                    callback: args.complete,\n                    mode: args.mode\n                });\n            }\n        }\n    });\n\n\n\n\n    var rvertical = /up|down|vertical/,\n        rpositivemotion = /up|left|vertical|horizontal/;\n\n    $.jqplot.effects.effect.blind = function( o, done ) {\n        // Create element\n        var el = $( this ),\n            props = [ \"position\", \"top\", \"bottom\", \"left\", \"right\", \"height\", \"width\" ],\n            mode = $.jqplot.effects.setMode( el, o.mode || \"hide\" ),\n            direction = o.direction || \"up\",\n            vertical = rvertical.test( direction ),\n            ref = vertical ? \"height\" : \"width\",\n            ref2 = vertical ? \"top\" : \"left\",\n            motion = rpositivemotion.test( direction ),\n            animation = {},\n            show = mode === \"show\",\n            wrapper, distance, top;\n\n        // // if already wrapped, the wrapper's properties are my property. #6245\n        if ( el.parent().is( \".ui-effects-wrapper\" ) ) {\n            $.jqplot.effects.save( el.parent(), props );\n        } else {\n            $.jqplot.effects.save( el, props );\n        }\n        el.show();\n        top = parseInt(el.css('top'), 10);\n        wrapper = $.jqplot.effects.createWrapper( el ).css({\n            overflow: \"hidden\"\n        });\n\n        distance = vertical ? wrapper[ ref ]() + top : wrapper[ ref ]();\n\n        animation[ ref ] = show ? String(distance) : '0';\n        if ( !motion ) {\n            el\n                .css( vertical ? \"bottom\" : \"right\", 0 )\n                .css( vertical ? \"top\" : \"left\", \"\" )\n                .css({ position: \"absolute\" });\n            animation[ ref2 ] = show ? '0' : String(distance);\n        }\n\n        // // start at 0 if we are showing\n        if ( show ) {\n            wrapper.css( ref, 0 );\n            if ( ! motion ) {\n                wrapper.css( ref2, distance );\n            }\n        }\n\n        // // Animate\n        wrapper.animate( animation, {\n            duration: o.duration,\n            easing: o.easing,\n            queue: false,\n            complete: function() {\n                if ( mode === \"hide\" ) {\n                    el.hide();\n                }\n                $.jqplot.effects.restore( el, props );\n                $.jqplot.effects.removeWrapper( el );\n                done();\n            }\n        });\n\n    };\n\n})(jQuery);\n"
  },
  {
    "path": "stenogotchi/ui/web/static/js/jquery.mobile/jquery.mobile-1.4.5.css",
    "content": "/*!\n* jQuery Mobile 1.4.5\n* Git HEAD hash: 68e55e78b292634d3991c795f06f5e37a512decc <> Date: Fri Oct 31 2014 17:33:30 UTC\n* http://jquerymobile.com\n*\n* Copyright 2010, 2014 jQuery Foundation, Inc. and othercontributors\n* Released under the MIT license.\n* http://jquery.org/license\n*\n*/\n\n\n/* SVG icons */\n.ui-icon-action:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20style%3D%22fill%3A%23FFFFFF%3B%22%20d%3D%22M9%2C5v3l5-4L9%2C0v3c0%2C0-5%2C0-5%2C7C6%2C5%2C9%2C5%2C9%2C5z%20M11%2C12H2V5h1l2-2H0v11h13V7l-2%2C2V12z%22%2F%3E%3C%2Fsvg%3E\");\n}\n.ui-icon-alert:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20style%3D%22fill%3A%23FFFFFF%3B%22%20d%3D%22M7%2C0L0%2C12h14L7%2C0z%20M7%2C11c-0.553%2C0-1-0.447-1-1s0.447-1%2C1-1c0.553%2C0%2C1%2C0.447%2C1%2C1S7.553%2C11%2C7%2C11z%20M7%2C8%20C6.447%2C8%2C6%2C7.553%2C6%2C7V5c0-0.553%2C0.447-1%2C1-1c0.553%2C0%2C1%2C0.447%2C1%2C1v2C8%2C7.553%2C7.553%2C8%2C7%2C8z%22%2F%3E%3C%2Fsvg%3E\");\n}\n.ui-icon-arrow-d-l:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpolygon%20fill%3D%22%23FFF%22%20points%3D%2214%2C3%2011%2C0%203.5%2C7.5%200%2C4%200%2C14%2010%2C14%206.5%2C10.5%20%22%2F%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3C%2Fsvg%3E\");\n}\n.ui-icon-arrow-d-r:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpolygon%20fill%3D%22%23FFF%22%20points%3D%2210.5%2C7.5%203%2C0%200%2C3%207.5%2C10.5%204%2C14%2014%2C14%2014%2C4%20%22%2F%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3C%2Fsvg%3E\");\n}\n.ui-icon-arrow-d:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpolygon%20fill%3D%22%23FFF%22%20points%3D%229%2C7%209%2C0%205%2C0%205%2C7%200%2C7%207%2C14%2014%2C7%20%22%2F%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3C%2Fsvg%3E\");\n}\n.ui-icon-arrow-l:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpolygon%20fill%3D%22%23FFF%22%20points%3D%227%2C5%207%2C0%200%2C7%207%2C14%207%2C9%2014%2C9%2014%2C5%20%22%2F%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3C%2Fsvg%3E\");\n}\n.ui-icon-arrow-r:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpolygon%20fill%3D%22%23FFF%22%20points%3D%2214%2C7%207%2C0%207%2C5%200%2C5%200%2C9%207%2C9%207%2C14%20%22%2F%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3C%2Fsvg%3E\");\n}\n.ui-icon-arrow-u-l:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpolygon%20fill%3D%22%23FFF%22%20points%3D%2214%2C11%206.5%2C3.5%2010%2C0%200%2C0%200%2C10%203.5%2C6.5%2011%2C14%20%22%2F%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3C%2Fsvg%3E\");\n}\n.ui-icon-arrow-u-r:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpolygon%20fill%3D%22%23FFF%22%20points%3D%2214%2C0%204%2C0%207.5%2C3.5%200%2C11%203%2C14%2010.5%2C6.5%2014%2C10%20%22%2F%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3C%2Fsvg%3E\");\n}\n.ui-icon-arrow-u:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpolygon%20fill%3D%22%23FFF%22%20points%3D%227%2C0%200%2C7%205%2C7%205%2C14%209%2C14%209%2C7%2014%2C7%20%22%2F%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3C%2Fsvg%3E\");\n}\n.ui-icon-audio:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214.018px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014.018%2014%22%20style%3D%22enable-background%3Anew%200%200%2014.018%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20fill%3D%22%23FFF%22%20d%3D%22M1%2C4C0.447%2C4%2C0%2C4.447%2C0%2C5v4c0%2C0.553%2C0.447%2C1%2C1%2C1h1l4%2C4V0L2%2C4H1z%20M10.346%2C7c0-1.699-1.042-3.154-2.546-3.867L6.982%2C4.68%20C7.885%2C5.107%2C8.51%2C5.98%2C8.51%2C7S7.885%2C8.893%2C6.982%2C9.32L7.8%2C10.867C9.304%2C10.154%2C10.346%2C8.699%2C10.346%2C7z%20M9.447%2C0.017L8.618%2C1.586%20C10.723%2C2.584%2C12.182%2C4.621%2C12.182%2C7s-1.459%2C4.416-3.563%2C5.414l0.829%2C1.569c2.707-1.283%2C4.57-3.925%2C4.57-6.983%20S12.154%2C1.3%2C9.447%2C0.017z%22%2F%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3C%2Fsvg%3E\");\n}\n.ui-icon-back:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20style%3D%22fill%3A%23FFFFFF%3B%22%20d%3D%22M5%2C3V0L1%2C4l4%2C4V5c0%2C0%2C6%2C0%2C6%2C3s-5%2C4-5%2C4v2c0%2C0%2C7-1%2C7-6C13%2C4%2C8%2C3%2C5%2C3z%22%2F%3E%3C%2Fsvg%3E\");\n}\n.ui-icon-bars:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20style%3D%22fill%3A%23FFFFFF%3B%22%20d%3D%22M1%2C4h12c0.553%2C0%2C1-0.447%2C1-1s-0.447-1-1-1H1C0.447%2C2%2C0%2C2.447%2C0%2C3S0.447%2C4%2C1%2C4z%20M13%2C6H1%20C0.447%2C6%2C0%2C6.447%2C0%2C7c0%2C0.553%2C0.447%2C1%2C1%2C1h12c0.553%2C0%2C1-0.447%2C1-1C14%2C6.447%2C13.553%2C6%2C13%2C6z%20M13%2C10H1c-0.553%2C0-1%2C0.447-1%2C1%20s0.447%2C1%2C1%2C1h12c0.553%2C0%2C1-0.447%2C1-1S13.553%2C10%2C13%2C10z%22%2F%3E%3C%2Fsvg%3E\");\n}\n.ui-icon-bullets:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20style%3D%22fill%3A%23FFFFFF%3B%22%20d%3D%22M5%2C4h8c0.553%2C0%2C1-0.447%2C1-1s-0.447-1-1-1H5C4.447%2C2%2C4%2C2.447%2C4%2C3S4.447%2C4%2C5%2C4z%20M13%2C6H5%20C4.447%2C6%2C4%2C6.447%2C4%2C7c0%2C0.553%2C0.447%2C1%2C1%2C1h8c0.553%2C0%2C1-0.447%2C1-1C14%2C6.447%2C13.553%2C6%2C13%2C6z%20M13%2C10H5c-0.553%2C0-1%2C0.447-1%2C1%20s0.447%2C1%2C1%2C1h8c0.553%2C0%2C1-0.447%2C1-1S13.553%2C10%2C13%2C10z%20M1%2C2C0.447%2C2%2C0%2C2.447%2C0%2C3s0.447%2C1%2C1%2C1s1-0.447%2C1-1S1.553%2C2%2C1%2C2z%20M1%2C6%20C0.447%2C6%2C0%2C6.447%2C0%2C7c0%2C0.553%2C0.447%2C1%2C1%2C1s1-0.447%2C1-1C2%2C6.447%2C1.553%2C6%2C1%2C6z%20M1%2C10c-0.553%2C0-1%2C0.447-1%2C1s0.447%2C1%2C1%2C1s1-0.447%2C1-1%20S1.553%2C10%2C1%2C10z%22%2F%3E%3C%2Fsvg%3E\");\n}\n.ui-icon-calendar:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20fill%3D%22%23FFF%22%20d%3D%22M0%2C8h2V6H0V8z%20M3%2C8h2V6H3V8z%20M6%2C8h2V6H6V8z%20M9%2C8h2V6H9V8z%20M12%2C8h2V6h-2V8z%20M0%2C11h2V9H0V11z%20M3%2C11h2V9H3V11z%20M6%2C11h2V9H6V11z%20%20M9%2C11h2V9H9V11z%20M12%2C11h2V9h-2V11z%20M0%2C14h2v-2H0V14z%20M3%2C14h2v-2H3V14z%20M6%2C14h2v-2H6V14z%20M9%2C14h2v-2H9V14z%20M12%2C1%20c0-0.553-0.447-1-1-1s-1%2C0.447-1%2C1H4c0-0.553-0.447-1-1-1S2%2C0.447%2C2%2C1H0v4h14V1H12z%22%2F%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3C%2Fsvg%3E\");\n}\n.ui-icon-camera:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20style%3D%22fill%3A%23FFFFFF%3B%22%20d%3D%22M12%2C2.5H9.908c-0.206-0.581-0.756-1-1.408-1h-3c-0.652%2C0-1.202%2C0.419-1.408%2C1H2c-1.104%2C0-2%2C0.896-2%2C2%20v6c0%2C1.104%2C0.896%2C2%2C2%2C2h10c1.104%2C0%2C2-0.896%2C2-2v-6C14%2C3.396%2C13.104%2C2.5%2C12%2C2.5z%20M7%2C10.5c-1.657%2C0-3-1.344-3-3c0-1.657%2C1.343-3%2C3-3%20s3%2C1.343%2C3%2C3C10%2C9.156%2C8.657%2C10.5%2C7%2C10.5z%20M7%2C5.5c-1.104%2C0-2%2C0.896-2%2C2c0%2C1.104%2C0.896%2C2%2C2%2C2c1.104%2C0%2C2-0.896%2C2-2%20C9%2C6.396%2C8.104%2C5.5%2C7%2C5.5z%22%2F%3E%3C%2Fsvg%3E\");\n}\n.ui-icon-carat-d:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpolygon%20style%3D%22fill%3A%23FFFFFF%3B%22%20points%3D%2211.949%2C3.404%207%2C8.354%202.05%2C3.404%20-0.071%2C5.525%207%2C12.596%2014.07%2C5.525%20%22%2F%3E%3C%2Fsvg%3E\");\n}\n.ui-icon-carat-l:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpolygon%20style%3D%22fill%3A%23FFFFFF%3B%22%20points%3D%2210.596%2C11.949%205.646%2C7%2010.596%2C2.05%208.475%2C-0.071%201.404%2C7%208.475%2C14.07%20%22%2F%3E%3C%2Fsvg%3E\");\n}\n.ui-icon-carat-r:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpolygon%20style%3D%22fill%3A%23FFFFFF%3B%22%20points%3D%223.404%2C2.051%208.354%2C7%203.404%2C11.95%205.525%2C14.07%2012.596%2C7%205.525%2C-0.071%20%22%2F%3E%3C%2Fsvg%3E\");\n}\n.ui-icon-carat-u:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpolygon%20style%3D%22fill%3A%23FFFFFF%3B%22%20points%3D%222.051%2C10.596%207%2C5.646%2011.95%2C10.596%2014.07%2C8.475%207%2C1.404%20-0.071%2C8.475%20%22%2F%3E%3C%2Fsvg%3E\");\n}\n.ui-icon-check:after,\n/* Used ui-checkbox-on twice to increase specificity. If active state has background-image for gradient this rule overrides. */\nhtml .ui-btn.ui-checkbox-on.ui-checkbox-on:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpolygon%20style%3D%22fill%3A%23FFFFFF%3B%22%20points%3D%2214%2C4%2011%2C1%205.003%2C6.997%203%2C5%200%2C8%204.966%2C13%204.983%2C12.982%205%2C13%20%22%2F%3E%3C%2Fsvg%3E\");\n}\n.ui-icon-clock:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20fill%3D%22%23FFF%22%20d%3D%22M7%2C0C3.134%2C0%2C0%2C3.134%2C0%2C7s3.134%2C7%2C7%2C7s7-3.134%2C7-7S10.866%2C0%2C7%2C0z%20M7%2C12c-2.762%2C0-5-2.238-5-5s2.238-5%2C5-5s5%2C2.238%2C5%2C5%20S9.762%2C12%2C7%2C12z%20M9%2C6H8V4c0-0.553-0.447-1-1-1S6%2C3.447%2C6%2C4v3c0%2C0.553%2C0.447%2C1%2C1%2C1h2c0.553%2C0%2C1-0.447%2C1-1S9.553%2C6%2C9%2C6z%22%2F%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3C%2Fsvg%3E\");\n}\n.ui-icon-cloud:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20style%3D%22fill%3A%23FFFFFF%3B%22%20d%3D%22M14%2C9.5c0-0.793-0.465-1.473-1.134-1.795C12.949%2C7.484%2C13%2C7.249%2C13%2C7c0-1.104-0.896-2-2-2%20c-0.158%2C0-0.311%2C0.023-0.457%2C0.058C9.816%2C3.549%2C8.286%2C2.5%2C6.5%2C2.5c-2.33%2C0-4.224%2C1.777-4.454%2C4.046C0.883%2C6.76%2C0%2C7.773%2C0%2C9%20c0%2C1.381%2C1.119%2C2.5%2C2.5%2C2.5h10v-0.07C13.361%2C11.206%2C14%2C10.432%2C14%2C9.5z%22%2F%3E%3C%2Fsvg%3E\");\n}\n.ui-icon-comment:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20fill%3D%22%23FFF%22%20d%3D%22M12%2C0H2C0.896%2C0%2C0%2C0.896%2C0%2C2v7c0%2C1.104%2C0.896%2C2%2C2%2C2h1v3l3-3h6c1.104%2C0%2C2-0.896%2C2-2V2C14%2C0.896%2C13.104%2C0%2C12%2C0z%22%2F%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3C%2Fsvg%3E\");\n}\n.ui-icon-delete:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpolygon%20fill%3D%22%23FFF%22%20points%3D%2214%2C3%2011%2C0%207%2C4%203%2C0%200%2C3%204%2C7%200%2C11%203%2C14%207%2C10%2011%2C14%2014%2C11%2010%2C7%20%22%2F%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3C%2Fsvg%3E\");\n}\n.ui-icon-edit:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20fill%3D%22%23FFF%22%20d%3D%22M1%2C10l-1%2C4l4-1l7-7L8%2C3L1%2C10z%20M11%2C0L9%2C2l3%2C3l2-2L11%2C0z%22%2F%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3C%2Fsvg%3E\");\n}\n.ui-icon-eye:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20style%3D%22fill%3A%23FFFFFF%3B%22%20d%3D%22M7%2C2C3%2C2%2C0%2C7%2C0%2C7s3%2C5%2C7%2C5s7-5%2C7-5S11%2C2%2C7%2C2z%20M7%2C10c-1.657%2C0-3-1.344-3-3c0-1.657%2C1.343-3%2C3-3%20s3%2C1.343%2C3%2C3C10%2C8.656%2C8.657%2C10%2C7%2C10z%20M7%2C6C6.448%2C6%2C6%2C6.447%2C6%2C7c0%2C0.553%2C0.448%2C1%2C1%2C1s1-0.447%2C1-1C8%2C6.447%2C7.552%2C6%2C7%2C6z%22%2F%3E%3C%2Fsvg%3E\");\n}\n.ui-icon-forbidden:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20fill%3D%22%23FFF%22%20d%3D%22M12.601%2C11.187C13.476%2C10.018%2C14%2C8.572%2C14%2C7c0-3.866-3.134-7-7-7C5.428%2C0%2C3.982%2C0.524%2C2.813%2C1.399L2.757%2C1.343L2.053%2C2.048%20L2.048%2C2.053L1.343%2C2.758l0.056%2C0.056C0.524%2C3.982%2C0%2C5.428%2C0%2C7c0%2C3.866%2C3.134%2C7%2C7%2C7c1.572%2C0%2C3.018-0.524%2C4.187-1.399l0.056%2C0.057%20l0.705-0.705l0.005-0.005l0.705-0.705L12.601%2C11.187z%20M7%2C2c2.761%2C0%2C5%2C2.238%2C5%2C5c0%2C1.019-0.308%2C1.964-0.832%2C2.754L4.246%2C2.832%20C5.036%2C2.308%2C5.981%2C2%2C7%2C2z%20M7%2C12c-2.761%2C0-5-2.238-5-5c0-1.019%2C0.308-1.964%2C0.832-2.754l6.922%2C6.922C8.964%2C11.692%2C8.019%2C12%2C7%2C12z%22%2F%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3C%2Fsvg%3E\");\n}\n.ui-icon-forward:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20style%3D%22fill%3A%23FFFFFF%3B%22%20d%3D%22M13%2C4L9%2C0v3C6%2C3%2C1%2C4%2C1%2C8c0%2C5%2C7%2C6%2C7%2C6v-2c0%2C0-5-1-5-4s6-3%2C6-3v3L13%2C4z%22%2F%3E%3C%2Fsvg%3E\");\n}\n.ui-icon-gear:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20fill%3D%22%23FFF%22%20d%3D%22M13.621%2C5.904l-1.036-0.259c-0.168-0.042-0.303-0.168-0.355-0.332c-0.092-0.284-0.205-0.559-0.339-0.82%20c-0.079-0.153-0.073-0.337%2C0.017-0.486l0.549-0.915c0.118-0.196%2C0.088-0.448-0.075-0.61l-0.862-0.863%20c-0.162-0.163-0.414-0.193-0.611-0.075l-0.916%2C0.55C9.844%2C2.182%2C9.659%2C2.188%2C9.506%2C2.109C9.244%2C1.975%2C8.97%2C1.861%2C8.686%2C1.77%20c-0.165-0.052-0.29-0.187-0.332-0.354L8.095%2C0.379C8.039%2C0.156%2C7.839%2C0%2C7.609%2C0H6.391c-0.229%2C0-0.43%2C0.156-0.485%2C0.379L5.646%2C1.415%20C5.604%2C1.582%2C5.479%2C1.718%2C5.313%2C1.77c-0.284%2C0.092-0.559%2C0.206-0.82%2C0.34C4.339%2C2.188%2C4.155%2C2.182%2C4.007%2C2.093L3.092%2C1.544%20c-0.196-0.118-0.448-0.087-0.61%2C0.075L1.619%2C2.481C1.457%2C2.644%2C1.426%2C2.896%2C1.544%2C3.093l0.549%2C0.914%20c0.089%2C0.148%2C0.095%2C0.332%2C0.017%2C0.486C1.975%2C4.755%2C1.861%2C5.029%2C1.77%2C5.314c-0.053%2C0.164-0.188%2C0.29-0.354%2C0.332L0.379%2C5.905%20C0.156%2C5.961%2C0%2C6.161%2C0%2C6.391v1.219c0%2C0.229%2C0.156%2C0.43%2C0.379%2C0.485l1.036%2C0.26C1.582%2C8.396%2C1.717%2C8.521%2C1.77%2C8.687%20c0.092%2C0.284%2C0.205%2C0.559%2C0.34%2C0.82C2.188%2C9.66%2C2.182%2C9.844%2C2.093%2C9.993l-0.549%2C0.915c-0.118%2C0.195-0.087%2C0.448%2C0.075%2C0.61%20l0.862%2C0.862c0.162%2C0.163%2C0.414%2C0.193%2C0.61%2C0.075l0.915-0.549c0.148-0.089%2C0.332-0.095%2C0.486-0.017%20c0.262%2C0.135%2C0.536%2C0.248%2C0.82%2C0.34c0.165%2C0.053%2C0.291%2C0.187%2C0.332%2C0.354l0.259%2C1.036C5.96%2C13.844%2C6.16%2C14%2C6.39%2C14h1.22%20c0.229%2C0%2C0.43-0.156%2C0.485-0.379l0.259-1.036c0.042-0.167%2C0.168-0.302%2C0.333-0.354c0.284-0.092%2C0.559-0.205%2C0.82-0.34%20c0.154-0.078%2C0.338-0.072%2C0.486%2C0.017l0.914%2C0.549c0.197%2C0.118%2C0.449%2C0.088%2C0.611-0.074l0.862-0.863%20c0.163-0.162%2C0.193-0.415%2C0.075-0.611l-0.549-0.915c-0.089-0.148-0.096-0.332-0.017-0.485c0.134-0.263%2C0.248-0.536%2C0.339-0.82%20c0.053-0.165%2C0.188-0.291%2C0.355-0.333l1.036-0.259C13.844%2C8.039%2C14%2C7.839%2C14%2C7.609V6.39C14%2C6.16%2C13.844%2C5.96%2C13.621%2C5.904z%20M7%2C10%20c-1.657%2C0-3-1.343-3-3s1.343-3%2C3-3s3%2C1.343%2C3%2C3S8.657%2C10%2C7%2C10z%22%2F%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3C%2Fsvg%3E\");\n}\n.ui-icon-grid:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20fill%3D%22%23FFF%22%20d%3D%22M3%2C0H1C0.447%2C0%2C0%2C0.447%2C0%2C1v2c0%2C0.553%2C0.447%2C1%2C1%2C1h2c0.553%2C0%2C1-0.447%2C1-1V1C4%2C0.447%2C3.553%2C0%2C3%2C0z%20M8%2C0H6%20C5.447%2C0%2C5%2C0.447%2C5%2C1v2c0%2C0.553%2C0.447%2C1%2C1%2C1h2c0.553%2C0%2C1-0.447%2C1-1V1C9%2C0.447%2C8.553%2C0%2C8%2C0z%20M13%2C0h-2c-0.553%2C0-1%2C0.447-1%2C1v2%20c0%2C0.553%2C0.447%2C1%2C1%2C1h2c0.553%2C0%2C1-0.447%2C1-1V1C14%2C0.447%2C13.553%2C0%2C13%2C0z%20M3%2C5H1C0.447%2C5%2C0%2C5.447%2C0%2C6v2c0%2C0.553%2C0.447%2C1%2C1%2C1h2%20c0.553%2C0%2C1-0.447%2C1-1V6C4%2C5.447%2C3.553%2C5%2C3%2C5z%20M8%2C5H6C5.447%2C5%2C5%2C5.447%2C5%2C6v2c0%2C0.553%2C0.447%2C1%2C1%2C1h2c0.553%2C0%2C1-0.447%2C1-1V6%20C9%2C5.447%2C8.553%2C5%2C8%2C5z%20M13%2C5h-2c-0.553%2C0-1%2C0.447-1%2C1v2c0%2C0.553%2C0.447%2C1%2C1%2C1h2c0.553%2C0%2C1-0.447%2C1-1V6C14%2C5.447%2C13.553%2C5%2C13%2C5z%20M3%2C10%20H1c-0.553%2C0-1%2C0.447-1%2C1v2c0%2C0.553%2C0.447%2C1%2C1%2C1h2c0.553%2C0%2C1-0.447%2C1-1v-2C4%2C10.447%2C3.553%2C10%2C3%2C10z%20M8%2C10H6c-0.553%2C0-1%2C0.447-1%2C1v2%20c0%2C0.553%2C0.447%2C1%2C1%2C1h2c0.553%2C0%2C1-0.447%2C1-1v-2C9%2C10.447%2C8.553%2C10%2C8%2C10z%20M13%2C10h-2c-0.553%2C0-1%2C0.447-1%2C1v2c0%2C0.553%2C0.447%2C1%2C1%2C1h2%20c0.553%2C0%2C1-0.447%2C1-1v-2C14%2C10.447%2C13.553%2C10%2C13%2C10z%22%2F%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3C%2Fsvg%3E\");\n}\n.ui-icon-heart:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20style%3D%22fill%3A%23FFFFFF%3B%22%20d%3D%22M7%2C1.872c-2-3-7-2-7%2C2c0%2C3%2C4%2C7%2C4%2C7s2.417%2C2.479%2C3%2C3c0.583-0.521%2C3-3%2C3-3s4-4%2C4-7%20C14-0.128%2C9-1.128%2C7%2C1.872z%22%2F%3E%3C%2Fsvg%3E\");\n}\n.ui-icon-home:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpolygon%20fill%3D%22%23FFF%22%20points%3D%227%2C0%200%2C7%202%2C7%202%2C14%205%2C14%205%2C9%209%2C9%209%2C14%2012%2C14%2012%2C7%2014%2C7%20%22%2F%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3C%2Fsvg%3E\");\n}\n.ui-icon-info:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20fill%3D%22%23FFF%22%20d%3D%22M7%2C0C3.134%2C0%2C0%2C3.134%2C0%2C7s3.134%2C7%2C7%2C7s7-3.134%2C7-7S10.866%2C0%2C7%2C0z%20M7%2C2c0.552%2C0%2C1%2C0.447%2C1%2C1S7.552%2C4%2C7%2C4S6%2C3.553%2C6%2C3%20S6.448%2C2%2C7%2C2z%20M9%2C11H5v-1h1V6H5V5h3v5h1V11z%22%2F%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3C%2Fsvg%3E\");\n}\n.ui-icon-location:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20style%3D%22fill%3A%23FFFFFF%3B%22%20d%3D%22M7%2C0C4.791%2C0%2C3%2C1.791%2C3%2C4c0%2C2%2C4%2C10%2C4%2C10s4-8%2C4-10C11%2C1.791%2C9.209%2C0%2C7%2C0z%20M7%2C6C5.896%2C6%2C5%2C5.104%2C5%2C4%20s0.896-2%2C2-2c1.104%2C0%2C2%2C0.896%2C2%2C2S8.104%2C6%2C7%2C6z%22%2F%3E%3C%2Fsvg%3E\");\n}\n.ui-icon-lock:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20style%3D%22fill%3A%23FFFFFF%3B%22%20d%3D%22M12%2C6V5c0-2.762-2.238-5-5-5C4.239%2C0%2C2%2C2.238%2C2%2C5v1H1v8h12V6H12z%20M7.5%2C9.848V12h-1V9.848%20C6.207%2C9.673%2C6%2C9.366%2C6%2C9c0-0.553%2C0.448-1%2C1-1s1%2C0.447%2C1%2C1C8%2C9.366%2C7.793%2C9.673%2C7.5%2C9.848z%20M10%2C6H4V5c0-1.657%2C1.343-3%2C3-3%20s3%2C1.343%2C3%2C3V6z%22%2F%3E%3C%2Fsvg%3E\");\n}\n.ui-icon-mail:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20style%3D%22fill%3A%23FFFFFF%3B%22%20d%3D%22M0%2C3.75V12h14V3.75L7%2C9L0%2C3.75z%20M14%2C2H0l7%2C5L14%2C2z%22%2F%3E%3C%2Fsvg%3E\");\n}\n.ui-icon-minus:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Crect%20y%3D%225%22%20style%3D%22fill%3A%23FFFFFF%3B%22%20width%3D%2214%22%20height%3D%224%22%2F%3E%3C%2Fsvg%3E\");\n}\n.ui-icon-navigation:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpolygon%20style%3D%22fill%3A%23FFFFFF%3B%22%20points%3D%2213%2C1%200%2C6%207%2C7%208%2C14%20%22%2F%3E%3C%2Fsvg%3E\");\n}\n.ui-icon-phone:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%22-0.01%200.008%2014%2014%22%20style%3D%22enable-background%3Anew%20-0.01%200.008%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20style%3D%22fill%3A%23FFFFFF%3B%22%20d%3D%22M6.939%2C9.189C6.165%2C8.557%2C5.271%2C7.705%2C4.497%2C6.744C3.953%2C6.071%2C3.473%2C5.363%2C3.969%2C4.866l-3.482-3.48%20C-0.021%2C2.02-1.146%2C5.04%2C3.675%2C9.984c5.08%2C5.211%2C8.356%2C4.097%2C8.92%2C3.511l-3.396-3.4C8.725%2C10.568%2C8.113%2C10.146%2C6.939%2C9.189z%20%20M13.82%2C11.519v-0.004c0%2C0-2.648-2.646-2.649-2.647c-0.21-0.211-0.546-0.205-0.754%2C0.002L9.455%2C9.831l3.403%2C3.407%20c0%2C0%2C0.962-0.96%2C0.961-0.961l0.002-0.001C14.043%2C12.056%2C14.021%2C11.721%2C13.82%2C11.519z%20M5.192%2C3.644V3.642%20c0.222-0.222%2C0.2-0.557%2C0-0.758V2.881c0%2C0-2.726-2.725-2.727-2.726C2.255-0.055%2C1.92-0.05%2C1.712%2C0.156L0.751%2C1.121l3.479%2C3.482%20C4.231%2C4.604%2C5.192%2C3.645%2C5.192%2C3.644z%22%2F%3E%3C%2Fsvg%3E\");\n}\n.ui-icon-plus:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpolygon%20fill%3D%22%23FFF%22%20points%3D%2214%2C5%209%2C5%209%2C0%205%2C0%205%2C5%200%2C5%200%2C9%205%2C9%205%2C14%209%2C14%209%2C9%2014%2C9%20%22%2F%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3C%2Fsvg%3E\");\n}\n.ui-icon-power:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20style%3D%22fill%3A%23FFFFFF%3B%22%20d%3D%22M11.243%2C2.408c-0.392-0.401-1.024-0.401-1.415%2C0c-0.391%2C0.401-0.391%2C1.054%2C0%2C1.455%20C10.584%2C4.642%2C11%2C5.675%2C11%2C6.773s-0.416%2C2.133-1.172%2C2.91c-1.512%2C1.558-4.145%2C1.558-5.656%2C0C3.416%2C8.904%2C3%2C7.872%2C3%2C6.773%20C3%2C5.673%2C3.416%2C4.64%2C4.172%2C3.863c0.39-0.401%2C0.39-1.054%2C0-1.455c-0.391-0.401-1.024-0.401-1.415%2C0C1.624%2C3.574%2C1%2C5.125%2C1%2C6.773%20c0%2C1.647%2C0.624%2C3.199%2C1.757%2C4.365c1.134%2C1.166%2C2.64%2C1.809%2C4.243%2C1.809c1.604%2C0%2C3.109-0.645%2C4.243-1.811%20C12.376%2C9.975%2C13%2C8.423%2C13%2C6.773C13%2C5.125%2C12.376%2C3.574%2C11.243%2C2.408z%20M7%2C8.053c0.553%2C0%2C1-0.445%2C1-1v-6c0-0.553-0.447-1-1-1%20c-0.553%2C0-1%2C0.447-1%2C1v6C6%2C7.604%2C6.447%2C8.053%2C7%2C8.053z%22%2F%3E%3C%2Fsvg%3E\");\n}\n.ui-icon-recycle:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20style%3D%22fill%3A%23FFFFFF%3B%22%20d%3D%22M3%2C7h1L2%2C4L0%2C7h1c0%2C3.313%2C2.687%2C6%2C6%2C6c0.702%2C0%2C1.374-0.127%2C2-0.35v-2.205C8.41%2C10.789%2C7.732%2C11%2C7%2C11%20C4.791%2C11%2C3%2C9.209%2C3%2C7z%20M13%2C7c0-3.313-2.688-6-6-6C6.298%2C1%2C5.626%2C1.127%2C5%2C1.349v2.206C5.59%2C3.211%2C6.268%2C3%2C7%2C3c2.209%2C0%2C4%2C1.791%2C4%2C4%20h-1l2%2C3l2-3H13z%22%2F%3E%3C%2Fsvg%3E\");\n}\n.ui-icon-refresh:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214.001px%22%20height%3D%2214.002px%22%20viewBox%3D%220%200%2014.001%2014.002%22%20style%3D%22enable-background%3Anew%200%200%2014.001%2014.002%3B%22%20%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20fill%3D%22%23FFF%22%20d%3D%22M14.001%2C6.001v-6l-2.06%2C2.06c-0.423-0.424-0.897-0.809-1.44-1.122C7.153-0.994%2C2.872%2C0.153%2C0.939%2C3.501%20c-1.933%2C3.348-0.786%2C7.629%2C2.562%2C9.562c3.348%2C1.933%2C7.629%2C0.785%2C9.562-2.562l-1.732-1c-1.381%2C2.392-4.438%2C3.211-6.83%2C1.83%20s-3.211-4.438-1.83-6.83s4.438-3.211%2C6.83-1.83c0.389%2C0.225%2C0.718%2C0.506%2C1.02%2C0.81l-2.52%2C2.52H14.001z%22%2F%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3C%2Fsvg%3E\");\n}\n.ui-icon-search:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20style%3D%22fill%3A%23FFFFFF%3B%22%20d%3D%22M10.171%2C8.766c0.617-0.888%2C0.979-1.964%2C0.979-3.126c0-3.037-2.463-5.5-5.5-5.5s-5.5%2C2.463-5.5%2C5.5%20s2.463%2C5.5%2C5.5%2C5.5c1.152%2C0%2C2.223-0.355%2C3.104-0.962l3.684%2C3.683l1.414-1.414L10.171%2C8.766z%20M5.649%2C9.14c-1.933%2C0-3.5-1.567-3.5-3.5%20c0-1.933%2C1.567-3.5%2C3.5-3.5c1.933%2C0%2C3.5%2C1.567%2C3.5%2C3.5C9.149%2C7.572%2C7.582%2C9.14%2C5.649%2C9.14z%22%2F%3E%3C%2Fsvg%3E\");\n}\n.ui-icon-shop:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20style%3D%22fill%3A%23FFFFFF%3B%22%20d%3D%22M10%2C4V3c0-1.657-1.343-3-3-3S4%2C1.343%2C4%2C3v1H1v10h12V4H10z%20M4.5%2C6C4.224%2C6%2C4%2C5.776%2C4%2C5.5%20S4.224%2C5%2C4.5%2C5S5%2C5.224%2C5%2C5.5S4.776%2C6%2C4.5%2C6z%20M5%2C3c0-1.104%2C0.896-2%2C2-2c1.104%2C0%2C2%2C0.896%2C2%2C2v1H5V3z%20M9.5%2C6C9.225%2C6%2C9%2C5.776%2C9%2C5.5%20S9.225%2C5%2C9.5%2C5S10%2C5.224%2C10%2C5.5S9.775%2C6%2C9.5%2C6z%22%2F%3E%3C%2Fsvg%3E\");\n}\n.ui-icon-star:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpolygon%20style%3D%22fill%3A%23FFFFFF%3B%22%20points%3D%2214%2C5%209%2C5%207%2C0%205%2C5%200%2C5%204%2C8%202.625%2C13%207%2C10%2011.375%2C13%2010%2C8%20%22%2F%3E%3C%2Fsvg%3E\");\n}\n.ui-icon-tag:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20fill%3D%22%23FFF%22%20d%3D%22M5%2C0H0v5l9%2C9l5-5L5%2C0z%20M3%2C4C2.447%2C4%2C2%2C3.553%2C2%2C3s0.447-1%2C1-1s1%2C0.447%2C1%2C1S3.553%2C4%2C3%2C4z%22%2F%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3C%2Fsvg%3E\");\n}\n.ui-icon-user:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20fill%3D%22%23FFF%22%20d%3D%22M8.851%2C10.101c-0.18-0.399-0.2-0.763-0.153-1.104C9.383%2C8.49%2C9.738%2C7.621%2C9.891%2C6.465C10.493%2C6.355%2C10.5%2C5.967%2C10.5%2C5.5%20c0-0.437-0.008-0.804-0.502-0.94C9.999%2C4.539%2C10%2C4.521%2C10%2C4.5c0-2.103-1-4-2-4C8%2C0.5%2C7.5%2C0%2C6.5%2C0C5%2C0%2C4%2C1.877%2C4%2C4.5%20c0%2C0.021%2C0.001%2C0.039%2C0.002%2C0.06C3.508%2C4.696%2C3.5%2C5.063%2C3.5%2C5.5c0%2C0.467%2C0.007%2C0.855%2C0.609%2C0.965%20C4.262%2C7.621%2C4.617%2C8.49%2C5.303%2C8.997c0.047%2C0.341%2C0.026%2C0.704-0.153%2C1.104C1.503%2C10.503%2C0%2C12%2C0%2C12v2h14v-2%20C14%2C12%2C12.497%2C10.503%2C8.851%2C10.101z%22%2F%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3C%2Fsvg%3E\");\n}\n.ui-icon-video:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%20-2%2014%2014%22%20style%3D%22enable-background%3Anew%200%20-2%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20style%3D%22fill%3A%23FFFFFF%3B%22%20d%3D%22M8%2C0H2C0.896%2C0%2C0%2C0.896%2C0%2C2v6c0%2C1.104%2C0.896%2C2%2C2%2C2h6c1.104%2C0%2C2-0.896%2C2-2V5V2C10%2C0.896%2C9.104%2C0%2C8%2C0z%20%20M10%2C5l4%2C4V1L10%2C5z%22%2F%3E%3C%2Fsvg%3E\");\n}\n/* Alt icons */\n.ui-alt-icon.ui-icon-action:after,\n.ui-alt-icon .ui-icon-action:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20d%3D%22M9%2C5v3l5-4L9%2C0v3c0%2C0-5%2C0-5%2C7C6%2C5%2C9%2C5%2C9%2C5z%20M11%2C12H2V5h1l2-2H0v11h13V7l-2%2C2V12z%22%2F%3E%3C%2Fsvg%3E\");\n}\n.ui-alt-icon.ui-icon-alert:after,\n.ui-alt-icon .ui-icon-alert:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20d%3D%22M7%2C0L0%2C12h14L7%2C0z%20M7%2C11c-0.553%2C0-1-0.447-1-1s0.447-1%2C1-1c0.553%2C0%2C1%2C0.447%2C1%2C1S7.553%2C11%2C7%2C11z%20M7%2C8C6.447%2C8%2C6%2C7.553%2C6%2C7V5%20c0-0.553%2C0.447-1%2C1-1c0.553%2C0%2C1%2C0.447%2C1%2C1v2C8%2C7.553%2C7.553%2C8%2C7%2C8z%22%2F%3E%3C%2Fsvg%3E\");\n}\n.ui-alt-icon.ui-icon-arrow-d:after,\n.ui-alt-icon .ui-icon-arrow-d:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpolygon%20points%3D%229%2C7%209%2C0%205%2C0%205%2C7%200%2C7%207%2C14%2014%2C7%20%22%2F%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3C%2Fsvg%3E\");\n}\n.ui-alt-icon.ui-icon-arrow-d-l:after,\n.ui-alt-icon .ui-icon-arrow-d-l:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpolygon%20points%3D%2214%2C3%2011%2C0%203.5%2C7.5%200%2C4%200%2C14%2010%2C14%206.5%2C10.5%20%22%2F%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3C%2Fsvg%3E\");\n}\n.ui-alt-icon.ui-icon-arrow-d-r:after,\n.ui-alt-icon .ui-icon-arrow-d-r:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpolygon%20points%3D%2210.5%2C7.5%203%2C0%200%2C3%207.5%2C10.5%204%2C14%2014%2C14%2014%2C4%20%22%2F%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3C%2Fsvg%3E\");\n}\n.ui-alt-icon.ui-icon-arrow-l:after,\n.ui-alt-icon .ui-icon-arrow-l:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpolygon%20points%3D%227%2C5%207%2C0%200%2C7%207%2C14%207%2C9%2014%2C9%2014%2C5%20%22%2F%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3C%2Fsvg%3E\");\n}\n.ui-alt-icon.ui-icon-arrow-r:after,\n.ui-alt-icon .ui-icon-arrow-r:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpolygon%20points%3D%2214%2C7%207%2C0%207%2C5%200%2C5%200%2C9%207%2C9%207%2C14%20%22%2F%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3C%2Fsvg%3E\");\n}\n.ui-alt-icon.ui-icon-arrow-u:after,\n.ui-alt-icon .ui-icon-arrow-u:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpolygon%20points%3D%227%2C0%200%2C7%205%2C7%205%2C14%209%2C14%209%2C7%2014%2C7%20%22%2F%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3C%2Fsvg%3E\");\n}\n.ui-alt-icon.ui-icon-arrow-u-l:after,\n.ui-alt-icon .ui-icon-arrow-u-l:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpolygon%20points%3D%2214%2C11%206.5%2C3.5%2010%2C0%200%2C0%200%2C10%203.5%2C6.5%2011%2C14%20%22%2F%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3C%2Fsvg%3E\");\n}\n.ui-alt-icon.ui-icon-arrow-u-r:after,\n.ui-alt-icon .ui-icon-arrow-u-r:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpolygon%20points%3D%2214%2C0%204%2C0%207.5%2C3.5%200%2C11%203%2C14%2010.5%2C6.5%2014%2C10%20%22%2F%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3C%2Fsvg%3E\");\n}\n.ui-alt-icon.ui-icon-audio:after,\n.ui-alt-icon .ui-icon-audio:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214.018px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014.018%2014%22%20style%3D%22enable-background%3Anew%200%200%2014.018%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20d%3D%22M1%2C4C0.447%2C4%2C0%2C4.447%2C0%2C5v4c0%2C0.553%2C0.447%2C1%2C1%2C1h1l4%2C4V0L2%2C4H1z%20M10.346%2C7c0-1.699-1.042-3.154-2.546-3.867L6.982%2C4.68%20C7.885%2C5.107%2C8.51%2C5.98%2C8.51%2C7S7.885%2C8.893%2C6.982%2C9.32L7.8%2C10.867C9.304%2C10.154%2C10.346%2C8.699%2C10.346%2C7z%20M9.447%2C0.017L8.618%2C1.586%20C10.723%2C2.584%2C12.182%2C4.621%2C12.182%2C7s-1.459%2C4.416-3.563%2C5.414l0.829%2C1.569c2.707-1.283%2C4.57-3.925%2C4.57-6.983%20S12.154%2C1.3%2C9.447%2C0.017z%22%2F%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3C%2Fsvg%3E\");\n}\n.ui-alt-icon.ui-icon-back:after,\n.ui-alt-icon .ui-icon-back:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20d%3D%22M5%2C3V0L1%2C4l4%2C4V5c0%2C0%2C6%2C0%2C6%2C3s-5%2C4-5%2C4v2c0%2C0%2C7-1%2C7-6C13%2C4%2C8%2C3%2C5%2C3z%22%2F%3E%3C%2Fsvg%3E\");\n}\n.ui-alt-icon.ui-icon-bars:after,\n.ui-alt-icon .ui-icon-bars:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20d%3D%22M1%2C4h12c0.553%2C0%2C1-0.447%2C1-1s-0.447-1-1-1H1C0.447%2C2%2C0%2C2.447%2C0%2C3S0.447%2C4%2C1%2C4z%20M13%2C6H1C0.447%2C6%2C0%2C6.447%2C0%2C7%20c0%2C0.553%2C0.447%2C1%2C1%2C1h12c0.553%2C0%2C1-0.447%2C1-1C14%2C6.447%2C13.553%2C6%2C13%2C6z%20M13%2C10H1c-0.553%2C0-1%2C0.447-1%2C1s0.447%2C1%2C1%2C1h12%20c0.553%2C0%2C1-0.447%2C1-1S13.553%2C10%2C13%2C10z%22%2F%3E%3C%2Fsvg%3E\");\n}\n.ui-alt-icon.ui-icon-bullets:after,\n.ui-alt-icon .ui-icon-bullets:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20d%3D%22M5%2C4h8c0.553%2C0%2C1-0.447%2C1-1s-0.447-1-1-1H5C4.447%2C2%2C4%2C2.447%2C4%2C3S4.447%2C4%2C5%2C4z%20M13%2C6H5C4.447%2C6%2C4%2C6.447%2C4%2C7%20c0%2C0.553%2C0.447%2C1%2C1%2C1h8c0.553%2C0%2C1-0.447%2C1-1C14%2C6.447%2C13.553%2C6%2C13%2C6z%20M13%2C10H5c-0.553%2C0-1%2C0.447-1%2C1s0.447%2C1%2C1%2C1h8%20c0.553%2C0%2C1-0.447%2C1-1S13.553%2C10%2C13%2C10z%20M1%2C2C0.447%2C2%2C0%2C2.447%2C0%2C3s0.447%2C1%2C1%2C1s1-0.447%2C1-1S1.553%2C2%2C1%2C2z%20M1%2C6C0.447%2C6%2C0%2C6.447%2C0%2C7%20c0%2C0.553%2C0.447%2C1%2C1%2C1s1-0.447%2C1-1C2%2C6.447%2C1.553%2C6%2C1%2C6z%20M1%2C10c-0.553%2C0-1%2C0.447-1%2C1s0.447%2C1%2C1%2C1s1-0.447%2C1-1S1.553%2C10%2C1%2C10z%22%2F%3E%3C%2Fsvg%3E\");\n}\n.ui-alt-icon.ui-icon-calendar:after,\n.ui-alt-icon .ui-icon-calendar:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20d%3D%22M0%2C8h2V6H0V8z%20M3%2C8h2V6H3V8z%20M6%2C8h2V6H6V8z%20M9%2C8h2V6H9V8z%20M12%2C8h2V6h-2V8z%20M0%2C11h2V9H0V11z%20M3%2C11h2V9H3V11z%20M6%2C11h2V9H6V11z%20%20M9%2C11h2V9H9V11z%20M12%2C11h2V9h-2V11z%20M0%2C14h2v-2H0V14z%20M3%2C14h2v-2H3V14z%20M6%2C14h2v-2H6V14z%20M9%2C14h2v-2H9V14z%20M12%2C1%20c0-0.553-0.447-1-1-1s-1%2C0.447-1%2C1H4c0-0.553-0.447-1-1-1S2%2C0.447%2C2%2C1H0v4h14V1H12z%22%2F%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3C%2Fsvg%3E\");\n}\n.ui-alt-icon.ui-icon-camera:after,\n.ui-alt-icon .ui-icon-camera:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20d%3D%22M12%2C2.5H9.908c-0.206-0.581-0.756-1-1.408-1h-3c-0.652%2C0-1.202%2C0.419-1.408%2C1H2c-1.104%2C0-2%2C0.896-2%2C2v6c0%2C1.104%2C0.896%2C2%2C2%2C2%20h10c1.104%2C0%2C2-0.896%2C2-2v-6C14%2C3.396%2C13.104%2C2.5%2C12%2C2.5z%20M7%2C10.5c-1.657%2C0-3-1.344-3-3c0-1.657%2C1.343-3%2C3-3s3%2C1.343%2C3%2C3%20C10%2C9.156%2C8.657%2C10.5%2C7%2C10.5z%20M7%2C5.5c-1.104%2C0-2%2C0.896-2%2C2c0%2C1.104%2C0.896%2C2%2C2%2C2c1.104%2C0%2C2-0.896%2C2-2C9%2C6.396%2C8.104%2C5.5%2C7%2C5.5z%22%2F%3E%3C%2Fsvg%3E\");\n}\n.ui-alt-icon.ui-icon-carat-d:after,\n.ui-alt-icon .ui-icon-carat-d:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpolygon%20points%3D%2211.949%2C3.404%207%2C8.354%202.05%2C3.404%20-0.071%2C5.525%207%2C12.596%2014.07%2C5.525%20%22%2F%3E%3C%2Fsvg%3E\");\n}\n.ui-alt-icon.ui-icon-carat-l:after,\n.ui-alt-icon .ui-icon-carat-l:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpolygon%20points%3D%2210.596%2C11.949%205.646%2C7%2010.596%2C2.05%208.475%2C-0.071%201.404%2C7%208.475%2C14.07%20%22%2F%3E%3C%2Fsvg%3E\");\n}\n.ui-alt-icon.ui-icon-carat-r:after,\n.ui-alt-icon .ui-icon-carat-r:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpolygon%20points%3D%223.404%2C2.051%208.354%2C7%203.404%2C11.95%205.525%2C14.07%2012.596%2C7%205.525%2C-0.071%20%22%2F%3E%3C%2Fsvg%3E\");\n}\n.ui-alt-icon.ui-icon-carat-u:after,\n.ui-alt-icon .ui-icon-carat-u:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpolygon%20points%3D%222.051%2C10.596%207%2C5.646%2011.95%2C10.596%2014.07%2C8.475%207%2C1.404%20-0.071%2C8.475%20%22%2F%3E%3C%2Fsvg%3E\");\n}\n.ui-alt-icon.ui-icon-check:after,\n.ui-alt-icon .ui-icon-check:after,\nhtml .ui-alt-icon.ui-btn.ui-checkbox-on:after,\nhtml .ui-alt-icon .ui-btn.ui-checkbox-on:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpolygon%20points%3D%2214%2C4%2011%2C1%205.003%2C6.997%203%2C5%200%2C8%204.966%2C13%204.983%2C12.982%205%2C13%20%22%2F%3E%3C%2Fsvg%3E\");\n}\n.ui-alt-icon.ui-icon-clock:after,\n.ui-alt-icon .ui-icon-clock:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20d%3D%22M7%2C0C3.134%2C0%2C0%2C3.134%2C0%2C7s3.134%2C7%2C7%2C7s7-3.134%2C7-7S10.866%2C0%2C7%2C0z%20M7%2C12c-2.762%2C0-5-2.238-5-5s2.238-5%2C5-5s5%2C2.238%2C5%2C5%20S9.762%2C12%2C7%2C12z%20M9%2C6H8V4c0-0.553-0.447-1-1-1S6%2C3.447%2C6%2C4v3c0%2C0.553%2C0.447%2C1%2C1%2C1h2c0.553%2C0%2C1-0.447%2C1-1S9.553%2C6%2C9%2C6z%22%2F%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3C%2Fsvg%3E\");\n}\n.ui-alt-icon.ui-icon-cloud:after,\n.ui-alt-icon .ui-icon-cloud:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20d%3D%22M14%2C9.5c0-0.793-0.465-1.473-1.134-1.795C12.949%2C7.484%2C13%2C7.249%2C13%2C7c0-1.104-0.896-2-2-2c-0.158%2C0-0.311%2C0.023-0.457%2C0.058%20C9.816%2C3.549%2C8.286%2C2.5%2C6.5%2C2.5c-2.33%2C0-4.224%2C1.777-4.454%2C4.046C0.883%2C6.76%2C0%2C7.773%2C0%2C9c0%2C1.381%2C1.119%2C2.5%2C2.5%2C2.5h10v-0.07%20C13.361%2C11.206%2C14%2C10.432%2C14%2C9.5z%22%2F%3E%3C%2Fsvg%3E\");\n}\n.ui-alt-icon.ui-icon-comment:after,\n.ui-alt-icon .ui-icon-comment:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20d%3D%22M12%2C0H2C0.896%2C0%2C0%2C0.896%2C0%2C2v7c0%2C1.104%2C0.896%2C2%2C2%2C2h1v3l3-3h6c1.104%2C0%2C2-0.896%2C2-2V2C14%2C0.896%2C13.104%2C0%2C12%2C0z%22%2F%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3C%2Fsvg%3E\");\n}\n.ui-alt-icon.ui-icon-delete:after,\n.ui-alt-icon .ui-icon-delete:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpolygon%20points%3D%2214%2C3%2011%2C0%207%2C4%203%2C0%200%2C3%204%2C7%200%2C11%203%2C14%207%2C10%2011%2C14%2014%2C11%2010%2C7%20%22%2F%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3C%2Fsvg%3E\");\n}\n.ui-alt-icon.ui-icon-edit:after,\n.ui-alt-icon .ui-icon-edit:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20d%3D%22M1%2C10l-1%2C4l4-1l7-7L8%2C3L1%2C10z%20M11%2C0L9%2C2l3%2C3l2-2L11%2C0z%22%2F%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3C%2Fsvg%3E\");\n}\n.ui-alt-icon.ui-icon-eye:after,\n.ui-alt-icon .ui-icon-eye:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20d%3D%22M7%2C2C3%2C2%2C0%2C7%2C0%2C7s3%2C5%2C7%2C5s7-5%2C7-5S11%2C2%2C7%2C2z%20M7%2C10c-1.657%2C0-3-1.344-3-3c0-1.657%2C1.343-3%2C3-3s3%2C1.343%2C3%2C3%20C10%2C8.656%2C8.657%2C10%2C7%2C10z%20M7%2C6C6.448%2C6%2C6%2C6.447%2C6%2C7c0%2C0.553%2C0.448%2C1%2C1%2C1s1-0.447%2C1-1C8%2C6.447%2C7.552%2C6%2C7%2C6z%22%2F%3E%3C%2Fsvg%3E\");\n}\n.ui-alt-icon.ui-icon-forbidden:after,\n.ui-alt-icon .ui-icon-forbidden:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20d%3D%22M12.601%2C11.187C13.476%2C10.018%2C14%2C8.572%2C14%2C7c0-3.866-3.134-7-7-7C5.428%2C0%2C3.982%2C0.524%2C2.813%2C1.399L2.757%2C1.343L2.053%2C2.048%20L2.048%2C2.053L1.343%2C2.758l0.056%2C0.056C0.524%2C3.982%2C0%2C5.428%2C0%2C7c0%2C3.866%2C3.134%2C7%2C7%2C7c1.572%2C0%2C3.018-0.524%2C4.187-1.399l0.056%2C0.057%20l0.705-0.705l0.005-0.005l0.705-0.705L12.601%2C11.187z%20M7%2C2c2.761%2C0%2C5%2C2.238%2C5%2C5c0%2C1.019-0.308%2C1.964-0.832%2C2.754L4.246%2C2.832%20C5.036%2C2.308%2C5.981%2C2%2C7%2C2z%20M7%2C12c-2.761%2C0-5-2.238-5-5c0-1.019%2C0.308-1.964%2C0.832-2.754l6.922%2C6.922C8.964%2C11.692%2C8.019%2C12%2C7%2C12z%22%2F%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3C%2Fsvg%3E\");\n}\n.ui-alt-icon.ui-icon-forward:after,\n.ui-alt-icon .ui-icon-forward:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20d%3D%22M13%2C4L9%2C0v3C6%2C3%2C1%2C4%2C1%2C8c0%2C5%2C7%2C6%2C7%2C6v-2c0%2C0-5-1-5-4s6-3%2C6-3v3L13%2C4z%22%2F%3E%3C%2Fsvg%3E\");\n}\n.ui-alt-icon.ui-icon-gear:after,\n.ui-alt-icon .ui-icon-gear:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20d%3D%22M13.621%2C5.904l-1.036-0.259c-0.168-0.042-0.303-0.168-0.355-0.332c-0.092-0.284-0.205-0.559-0.339-0.82%20c-0.079-0.153-0.073-0.337%2C0.017-0.486l0.549-0.915c0.118-0.196%2C0.088-0.448-0.075-0.61l-0.862-0.863%20c-0.162-0.163-0.414-0.193-0.611-0.075l-0.916%2C0.55C9.844%2C2.182%2C9.659%2C2.188%2C9.506%2C2.109C9.244%2C1.975%2C8.97%2C1.861%2C8.686%2C1.77%20c-0.165-0.052-0.29-0.187-0.332-0.354L8.095%2C0.379C8.039%2C0.156%2C7.839%2C0%2C7.609%2C0H6.391c-0.229%2C0-0.43%2C0.156-0.485%2C0.379L5.646%2C1.415%20C5.604%2C1.582%2C5.479%2C1.718%2C5.313%2C1.77c-0.284%2C0.092-0.559%2C0.206-0.82%2C0.34C4.339%2C2.188%2C4.155%2C2.182%2C4.007%2C2.093L3.092%2C1.544%20c-0.196-0.118-0.448-0.087-0.61%2C0.075L1.619%2C2.481C1.457%2C2.644%2C1.426%2C2.896%2C1.544%2C3.093l0.549%2C0.914%20c0.089%2C0.148%2C0.095%2C0.332%2C0.017%2C0.486C1.975%2C4.755%2C1.861%2C5.029%2C1.77%2C5.314c-0.053%2C0.164-0.188%2C0.29-0.354%2C0.332L0.379%2C5.905%20C0.156%2C5.961%2C0%2C6.161%2C0%2C6.391v1.219c0%2C0.229%2C0.156%2C0.43%2C0.379%2C0.485l1.036%2C0.26C1.582%2C8.396%2C1.717%2C8.521%2C1.77%2C8.687%20c0.092%2C0.284%2C0.205%2C0.559%2C0.34%2C0.82C2.188%2C9.66%2C2.182%2C9.844%2C2.093%2C9.993l-0.549%2C0.915c-0.118%2C0.195-0.087%2C0.448%2C0.075%2C0.61%20l0.862%2C0.862c0.162%2C0.163%2C0.414%2C0.193%2C0.61%2C0.075l0.915-0.549c0.148-0.089%2C0.332-0.095%2C0.486-0.017%20c0.262%2C0.135%2C0.536%2C0.248%2C0.82%2C0.34c0.165%2C0.053%2C0.291%2C0.187%2C0.332%2C0.354l0.259%2C1.036C5.96%2C13.844%2C6.16%2C14%2C6.39%2C14h1.22%20c0.229%2C0%2C0.43-0.156%2C0.485-0.379l0.259-1.036c0.042-0.167%2C0.168-0.302%2C0.333-0.354c0.284-0.092%2C0.559-0.205%2C0.82-0.34%20c0.154-0.078%2C0.338-0.072%2C0.486%2C0.017l0.914%2C0.549c0.197%2C0.118%2C0.449%2C0.088%2C0.611-0.074l0.862-0.863%20c0.163-0.162%2C0.193-0.415%2C0.075-0.611l-0.549-0.915c-0.089-0.148-0.096-0.332-0.017-0.485c0.134-0.263%2C0.248-0.536%2C0.339-0.82%20c0.053-0.165%2C0.188-0.291%2C0.355-0.333l1.036-0.259C13.844%2C8.039%2C14%2C7.839%2C14%2C7.609V6.39C14%2C6.16%2C13.844%2C5.96%2C13.621%2C5.904z%20M7%2C10%20c-1.657%2C0-3-1.343-3-3s1.343-3%2C3-3s3%2C1.343%2C3%2C3S8.657%2C10%2C7%2C10z%22%2F%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3C%2Fsvg%3E\");\n}\n.ui-alt-icon.ui-icon-grid:after,\n.ui-alt-icon .ui-icon-grid:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20d%3D%22M3%2C0H1C0.447%2C0%2C0%2C0.447%2C0%2C1v2c0%2C0.553%2C0.447%2C1%2C1%2C1h2c0.553%2C0%2C1-0.447%2C1-1V1C4%2C0.447%2C3.553%2C0%2C3%2C0z%20M8%2C0H6%20C5.447%2C0%2C5%2C0.447%2C5%2C1v2c0%2C0.553%2C0.447%2C1%2C1%2C1h2c0.553%2C0%2C1-0.447%2C1-1V1C9%2C0.447%2C8.553%2C0%2C8%2C0z%20M13%2C0h-2c-0.553%2C0-1%2C0.447-1%2C1v2%20c0%2C0.553%2C0.447%2C1%2C1%2C1h2c0.553%2C0%2C1-0.447%2C1-1V1C14%2C0.447%2C13.553%2C0%2C13%2C0z%20M3%2C5H1C0.447%2C5%2C0%2C5.447%2C0%2C6v2c0%2C0.553%2C0.447%2C1%2C1%2C1h2%20c0.553%2C0%2C1-0.447%2C1-1V6C4%2C5.447%2C3.553%2C5%2C3%2C5z%20M8%2C5H6C5.447%2C5%2C5%2C5.447%2C5%2C6v2c0%2C0.553%2C0.447%2C1%2C1%2C1h2c0.553%2C0%2C1-0.447%2C1-1V6%20C9%2C5.447%2C8.553%2C5%2C8%2C5z%20M13%2C5h-2c-0.553%2C0-1%2C0.447-1%2C1v2c0%2C0.553%2C0.447%2C1%2C1%2C1h2c0.553%2C0%2C1-0.447%2C1-1V6C14%2C5.447%2C13.553%2C5%2C13%2C5z%20M3%2C10%20H1c-0.553%2C0-1%2C0.447-1%2C1v2c0%2C0.553%2C0.447%2C1%2C1%2C1h2c0.553%2C0%2C1-0.447%2C1-1v-2C4%2C10.447%2C3.553%2C10%2C3%2C10z%20M8%2C10H6c-0.553%2C0-1%2C0.447-1%2C1v2%20c0%2C0.553%2C0.447%2C1%2C1%2C1h2c0.553%2C0%2C1-0.447%2C1-1v-2C9%2C10.447%2C8.553%2C10%2C8%2C10z%20M13%2C10h-2c-0.553%2C0-1%2C0.447-1%2C1v2c0%2C0.553%2C0.447%2C1%2C1%2C1h2%20c0.553%2C0%2C1-0.447%2C1-1v-2C14%2C10.447%2C13.553%2C10%2C13%2C10z%22%2F%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3C%2Fsvg%3E\");\n}\n.ui-alt-icon.ui-icon-heart:after,\n.ui-alt-icon .ui-icon-heart:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20d%3D%22M7%2C1.958c-2-3-7-2.128-7%2C1.872c0%2C3%2C4%2C7%2C4%2C7s2.417%2C2.48%2C3%2C3c0.583-0.52%2C3-3%2C3-3s4-4%2C4-7C14-0.169%2C9-1.042%2C7%2C1.958z%22%2F%3E%3C%2Fsvg%3E\");\n}\n.ui-alt-icon.ui-icon-home:after,\n.ui-alt-icon .ui-icon-home:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpolygon%20points%3D%227%2C0%200%2C7%202%2C7%202%2C14%205%2C14%205%2C9%209%2C9%209%2C14%2012%2C14%2012%2C7%2014%2C7%20%22%2F%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3C%2Fsvg%3E\");\n}\n.ui-alt-icon.ui-icon-info:after,\n.ui-alt-icon .ui-icon-info:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20d%3D%22M7%2C0C3.134%2C0%2C0%2C3.134%2C0%2C7s3.134%2C7%2C7%2C7s7-3.134%2C7-7S10.866%2C0%2C7%2C0z%20M7%2C2c0.552%2C0%2C1%2C0.447%2C1%2C1S7.552%2C4%2C7%2C4S6%2C3.553%2C6%2C3%20S6.448%2C2%2C7%2C2z%20M9%2C11H5v-1h1V6H5V5h3v5h1V11z%22%2F%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3C%2Fsvg%3E\");\n}\n.ui-alt-icon.ui-icon-location:after,\n.ui-alt-icon .ui-icon-location:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20d%3D%22M7%2C0C4.791%2C0%2C3%2C1.791%2C3%2C4c0%2C2%2C4%2C10%2C4%2C10s4-8%2C4-10C11%2C1.791%2C9.209%2C0%2C7%2C0z%20M7%2C6C5.896%2C6%2C5%2C5.104%2C5%2C4s0.896-2%2C2-2%20c1.104%2C0%2C2%2C0.896%2C2%2C2S8.104%2C6%2C7%2C6z%22%2F%3E%3C%2Fsvg%3E\");\n}\n.ui-alt-icon.ui-icon-lock:after,\n.ui-alt-icon .ui-icon-lock:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20d%3D%22M12%2C6V5c0-2.762-2.238-5-5-5C4.239%2C0%2C2%2C2.238%2C2%2C5v1H1v8h12V6H12z%20M7.5%2C9.848V12h-1V9.848C6.207%2C9.673%2C6%2C9.366%2C6%2C9%20c0-0.553%2C0.448-1%2C1-1s1%2C0.447%2C1%2C1C8%2C9.366%2C7.793%2C9.673%2C7.5%2C9.848z%20M10%2C6H4V5c0-1.657%2C1.343-3%2C3-3s3%2C1.343%2C3%2C3V6z%22%2F%3E%3C%2Fsvg%3E\");\n}\n.ui-alt-icon.ui-icon-mail:after,\n.ui-alt-icon .ui-icon-mail:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20d%3D%22M0%2C3.75V12h14V3.75L7%2C9L0%2C3.75z%20M14%2C2H0l7%2C5L14%2C2z%22%2F%3E%3C%2Fsvg%3E\");\n}\n.ui-alt-icon.ui-icon-minus:after,\n.ui-alt-icon .ui-icon-minus:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Crect%20y%3D%225%22%20width%3D%2214%22%20height%3D%224%22%2F%3E%3C%2Fsvg%3E\");\n}\n.ui-alt-icon.ui-icon-navigation:after,\n.ui-alt-icon .ui-icon-navigation:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpolygon%20points%3D%2213%2C1%200%2C6%207%2C7%208%2C14%20%22%2F%3E%3C%2Fsvg%3E\");\n}\n.ui-alt-icon.ui-icon-phone:after,\n.ui-alt-icon .ui-icon-phone:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20d%3D%22M6.949%2C9.182C6.175%2C8.549%2C5.281%2C7.697%2C4.507%2C6.736C3.963%2C6.063%2C3.483%2C5.355%2C3.979%2C4.858l-3.482-3.48%20c-0.508%2C0.634-1.633%2C3.654%2C3.188%2C8.598c5.08%2C5.211%2C8.356%2C4.097%2C8.92%2C3.511l-3.396-3.399C8.734%2C10.561%2C8.123%2C10.139%2C6.949%2C9.182z%20%20M13.83%2C11.512v-0.004c0%2C0-2.648-2.646-2.649-2.647c-0.21-0.212-0.546-0.205-0.754%2C0.002L9.465%2C9.823l3.402%2C3.407%20c0%2C0%2C0.963-0.961%2C0.961-0.961l0.002-0.002C14.053%2C12.049%2C14.031%2C11.713%2C13.83%2C11.512z%20M5.202%2C3.636V3.634%20c0.222-0.222%2C0.2-0.557%2C0-0.758V2.873c0%2C0-2.726-2.725-2.727-2.726c-0.21-0.21-0.545-0.205-0.753%2C0.001L0.761%2C1.113L4.24%2C4.595%20C4.241%2C4.596%2C5.202%2C3.637%2C5.202%2C3.636z%22%2F%3E%3C%2Fsvg%3E\");\n}\n.ui-alt-icon.ui-icon-plus:after,\n.ui-alt-icon .ui-icon-plus:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpolygon%20points%3D%2214%2C5%209%2C5%209%2C0%205%2C0%205%2C5%200%2C5%200%2C9%205%2C9%205%2C14%209%2C14%209%2C9%2014%2C9%20%22%2F%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3C%2Fsvg%3E\");\n}\n.ui-alt-icon.ui-icon-power:after,\n.ui-alt-icon .ui-icon-power:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20d%3D%22M11.243%2C2.408c-0.392-0.401-1.024-0.401-1.415%2C0c-0.391%2C0.401-0.391%2C1.054%2C0%2C1.455C10.584%2C4.642%2C11%2C5.675%2C11%2C6.773%20s-0.416%2C2.133-1.172%2C2.91c-1.512%2C1.558-4.145%2C1.558-5.656%2C0C3.416%2C8.904%2C3%2C7.872%2C3%2C6.773C3%2C5.673%2C3.416%2C4.64%2C4.172%2C3.863%20c0.39-0.401%2C0.39-1.054%2C0-1.455c-0.391-0.401-1.024-0.401-1.415%2C0C1.624%2C3.574%2C1%2C5.125%2C1%2C6.773c0%2C1.647%2C0.624%2C3.199%2C1.757%2C4.365%20c1.134%2C1.166%2C2.64%2C1.809%2C4.243%2C1.809c1.604%2C0%2C3.109-0.645%2C4.243-1.811C12.376%2C9.975%2C13%2C8.423%2C13%2C6.773%20C13%2C5.125%2C12.376%2C3.574%2C11.243%2C2.408z%20M7%2C8.053c0.553%2C0%2C1-0.445%2C1-1v-6c0-0.553-0.447-1-1-1c-0.553%2C0-1%2C0.447-1%2C1v6%20C6%2C7.604%2C6.447%2C8.053%2C7%2C8.053z%22%2F%3E%3C%2Fsvg%3E\");\n}\n.ui-alt-icon.ui-icon-recycle:after,\n.ui-alt-icon .ui-icon-recycle:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20d%3D%22M3%2C7h1L2%2C4L0%2C7h1c0%2C3.313%2C2.687%2C6%2C6%2C6c0.702%2C0%2C1.374-0.127%2C2-0.35v-2.205C8.41%2C10.789%2C7.732%2C11%2C7%2C11C4.791%2C11%2C3%2C9.209%2C3%2C7z%20%20M13%2C7c0-3.313-2.688-6-6-6C6.298%2C1%2C5.626%2C1.127%2C5%2C1.349v2.206C5.59%2C3.211%2C6.268%2C3%2C7%2C3c2.209%2C0%2C4%2C1.791%2C4%2C4h-1l2%2C3l2-3H13z%22%2F%3E%3C%2Fsvg%3E\");\n}\n.ui-alt-icon.ui-icon-refresh:after,\n.ui-alt-icon .ui-icon-refresh:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214.001px%22%20height%3D%2214.002px%22%20viewBox%3D%220%200%2014.001%2014.002%22%20style%3D%22enable-background%3Anew%200%200%2014.001%2014.002%3B%22%20%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20d%3D%22M14.001%2C6.001v-6l-2.06%2C2.06c-0.423-0.424-0.897-0.809-1.44-1.122C7.153-0.994%2C2.872%2C0.153%2C0.939%2C3.501%20c-1.933%2C3.348-0.786%2C7.629%2C2.562%2C9.562c3.348%2C1.933%2C7.629%2C0.785%2C9.562-2.562l-1.732-1c-1.381%2C2.392-4.438%2C3.211-6.83%2C1.83%20s-3.211-4.438-1.83-6.83s4.438-3.211%2C6.83-1.83c0.389%2C0.225%2C0.718%2C0.506%2C1.02%2C0.81l-2.52%2C2.52H14.001z%22%2F%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3C%2Fsvg%3E\");\n}\n.ui-alt-icon.ui-icon-search:after,\n.ui-alt-icon .ui-icon-search:after,\n.ui-input-search:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20d%3D%22M10.171%2C8.766c0.617-0.888%2C0.979-1.964%2C0.979-3.126c0-3.037-2.463-5.5-5.5-5.5s-5.5%2C2.463-5.5%2C5.5s2.463%2C5.5%2C5.5%2C5.5%20c1.152%2C0%2C2.223-0.355%2C3.104-0.962l3.684%2C3.683l1.414-1.414L10.171%2C8.766z%20M5.649%2C9.14c-1.933%2C0-3.5-1.567-3.5-3.5%20c0-1.933%2C1.567-3.5%2C3.5-3.5c1.933%2C0%2C3.5%2C1.567%2C3.5%2C3.5C9.149%2C7.572%2C7.582%2C9.14%2C5.649%2C9.14z%22%2F%3E%3C%2Fsvg%3E\");\n}\n.ui-alt-icon.ui-icon-shop:after,\n.ui-alt-icon .ui-icon-shop:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20d%3D%22M10%2C4V3c0-1.657-1.343-3-3-3S4%2C1.343%2C4%2C3v1H1v10h12V4H10z%20M4.5%2C6C4.224%2C6%2C4%2C5.776%2C4%2C5.5S4.224%2C5%2C4.5%2C5S5%2C5.224%2C5%2C5.5%20S4.776%2C6%2C4.5%2C6z%20M5%2C3c0-1.104%2C0.896-2%2C2-2c1.104%2C0%2C2%2C0.896%2C2%2C2v1H5V3z%20M9.5%2C6C9.225%2C6%2C9%2C5.776%2C9%2C5.5S9.225%2C5%2C9.5%2C5S10%2C5.224%2C10%2C5.5%20S9.775%2C6%2C9.5%2C6z%22%2F%3E%3C%2Fsvg%3E\");\n}\n.ui-alt-icon.ui-icon-star:after,\n.ui-alt-icon .ui-icon-star:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpolygon%20points%3D%2214%2C5%209%2C5%207%2C0%205%2C5%200%2C5%204%2C8%202.625%2C13%207%2C10%2011.375%2C13%2010%2C8%20%22%2F%3E%3C%2Fsvg%3E\");\n}\n.ui-alt-icon.ui-icon-tag:after,\n.ui-alt-icon .ui-icon-tag:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20d%3D%22M5%2C0H0v5l9%2C9l5-5L5%2C0z%20M3%2C4C2.447%2C4%2C2%2C3.553%2C2%2C3s0.447-1%2C1-1s1%2C0.447%2C1%2C1S3.553%2C4%2C3%2C4z%22%2F%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3C%2Fsvg%3E\");\n}\n.ui-alt-icon.ui-icon-user:after,\n.ui-alt-icon .ui-icon-user:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20d%3D%22M8.851%2C10.101c-0.18-0.399-0.2-0.763-0.153-1.104C9.383%2C8.49%2C9.738%2C7.621%2C9.891%2C6.465C10.493%2C6.355%2C10.5%2C5.967%2C10.5%2C5.5%20c0-0.437-0.008-0.804-0.502-0.94C9.999%2C4.539%2C10%2C4.521%2C10%2C4.5c0-2.103-1-4-2-4C8%2C0.5%2C7.5%2C0%2C6.5%2C0C5%2C0%2C4%2C1.877%2C4%2C4.5%20c0%2C0.021%2C0.001%2C0.039%2C0.002%2C0.06C3.508%2C4.696%2C3.5%2C5.063%2C3.5%2C5.5c0%2C0.467%2C0.007%2C0.855%2C0.609%2C0.965%20C4.262%2C7.621%2C4.617%2C8.49%2C5.303%2C8.997c0.047%2C0.341%2C0.026%2C0.704-0.153%2C1.104C1.503%2C10.503%2C0%2C12%2C0%2C12v2h14v-2%20C14%2C12%2C12.497%2C10.503%2C8.851%2C10.101z%22%2F%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3C%2Fsvg%3E\");\n}\n.ui-alt-icon.ui-icon-video:after,\n.ui-alt-icon .ui-icon-video:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%20-2%2014%2014%22%20style%3D%22enable-background%3Anew%200%20-2%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20d%3D%22M8%2C0H2C0.896%2C0%2C0%2C0.896%2C0%2C2v6c0%2C1.104%2C0.896%2C2%2C2%2C2h6c1.104%2C0%2C2-0.896%2C2-2V5V2C10%2C0.896%2C9.104%2C0%2C8%2C0z%20M10%2C5l4%2C4V1L10%2C5z%22%2F%3E%3C%2Fsvg%3E\");\n}\n/* PNG icons */\n.ui-nosvg .ui-icon-action:after {\n\tbackground-image: url(images/icons-png/action-white.png);\n}\n.ui-nosvg .ui-icon-alert:after {\n\tbackground-image: url(images/icons-png/alert-white.png);\n}\n.ui-nosvg .ui-icon-arrow-d-l:after {\n\tbackground-image: url(images/icons-png/arrow-d-l-white.png);\n}\n.ui-nosvg .ui-icon-arrow-d-r:after {\n\tbackground-image: url(images/icons-png/arrow-d-r-white.png);\n}\n.ui-nosvg .ui-icon-arrow-d:after {\n\tbackground-image: url(images/icons-png/arrow-d-white.png);\n}\n.ui-nosvg .ui-icon-arrow-l:after {\n\tbackground-image: url(images/icons-png/arrow-l-white.png);\n}\n.ui-nosvg .ui-icon-arrow-r:after {\n\tbackground-image: url(images/icons-png/arrow-r-white.png);\n}\n.ui-nosvg .ui-icon-arrow-u-l:after {\n\tbackground-image: url(images/icons-png/arrow-u-l-white.png);\n}\n.ui-nosvg .ui-icon-arrow-u-r:after {\n\tbackground-image: url(images/icons-png/arrow-u-r-white.png);\n}\n.ui-nosvg .ui-icon-arrow-u:after {\n\tbackground-image: url(images/icons-png/arrow-u-white.png);\n}\n.ui-nosvg .ui-icon-audio:after {\n\tbackground-image: url(images/icons-png/audio-white.png);\n}\n.ui-nosvg .ui-icon-back:after {\n\tbackground-image: url(images/icons-png/back-white.png);\n}\n.ui-nosvg .ui-icon-bars:after {\n\tbackground-image: url(images/icons-png/bars-white.png);\n}\n.ui-nosvg .ui-icon-bullets:after {\n\tbackground-image: url(images/icons-png/bullets-white.png);\n}\n.ui-nosvg .ui-icon-calendar:after {\n\tbackground-image: url(images/icons-png/calendar-white.png);\n}\n.ui-nosvg .ui-icon-camera:after {\n\tbackground-image: url(images/icons-png/camera-white.png);\n}\n.ui-nosvg .ui-icon-carat-d:after {\n\tbackground-image: url(images/icons-png/carat-d-white.png);\n}\n.ui-nosvg .ui-icon-carat-l:after {\n\tbackground-image: url(images/icons-png/carat-l-white.png);\n}\n.ui-nosvg .ui-icon-carat-r:after {\n\tbackground-image: url(images/icons-png/carat-r-white.png);\n}\n.ui-nosvg .ui-icon-carat-u:after {\n\tbackground-image: url(images/icons-png/carat-u-white.png);\n}\n.ui-nosvg .ui-icon-check:after,\nhtml.ui-nosvg .ui-btn.ui-checkbox-on:after {\n\tbackground-image: url(images/icons-png/check-white.png);\n}\n.ui-nosvg .ui-icon-clock:after {\n\tbackground-image: url(images/icons-png/clock-white.png);\n}\n.ui-nosvg .ui-icon-cloud:after {\n\tbackground-image: url(images/icons-png/cloud-white.png);\n}\n.ui-nosvg .ui-icon-comment:after {\n\tbackground-image: url(images/icons-png/comment-white.png);\n}\n.ui-nosvg .ui-icon-delete:after {\n\tbackground-image: url(images/icons-png/delete-white.png);\n}\n.ui-nosvg .ui-icon-edit:after {\n\tbackground-image: url(images/icons-png/edit-white.png);\n}\n.ui-nosvg .ui-icon-eye:after {\n\tbackground-image: url(images/icons-png/eye-white.png);\n}\n.ui-nosvg .ui-icon-forbidden:after {\n\tbackground-image: url(images/icons-png/forbidden-white.png);\n}\n.ui-nosvg .ui-icon-forward:after {\n\tbackground-image: url(images/icons-png/forward-white.png);\n}\n.ui-nosvg .ui-icon-gear:after {\n\tbackground-image: url(images/icons-png/gear-white.png);\n}\n.ui-nosvg .ui-icon-grid:after {\n\tbackground-image: url(images/icons-png/grid-white.png);\n}\n.ui-nosvg .ui-icon-heart:after {\n\tbackground-image: url(images/icons-png/heart-white.png);\n}\n.ui-nosvg .ui-icon-home:after {\n\tbackground-image: url(images/icons-png/home-white.png);\n}\n.ui-nosvg .ui-icon-info:after {\n\tbackground-image: url(images/icons-png/info-white.png);\n}\n.ui-nosvg .ui-icon-location:after {\n\tbackground-image: url(images/icons-png/location-white.png);\n}\n.ui-nosvg .ui-icon-lock:after {\n\tbackground-image: url(images/icons-png/lock-white.png);\n}\n.ui-nosvg .ui-icon-mail:after {\n\tbackground-image: url(images/icons-png/mail-white.png);\n}\n.ui-nosvg .ui-icon-minus:after {\n\tbackground-image: url(images/icons-png/minus-white.png);\n}\n.ui-nosvg .ui-icon-navigation:after {\n\tbackground-image: url(images/icons-png/navigation-white.png);\n}\n.ui-nosvg .ui-icon-phone:after {\n\tbackground-image: url(images/icons-png/phone-white.png);\n}\n.ui-nosvg .ui-icon-plus:after {\n\tbackground-image: url(images/icons-png/plus-white.png);\n}\n.ui-nosvg .ui-icon-power:after {\n\tbackground-image: url(images/icons-png/power-white.png);\n}\n.ui-nosvg .ui-icon-recycle:after {\n\tbackground-image: url(images/icons-png/recycle-white.png);\n}\n.ui-nosvg .ui-icon-refresh:after {\n\tbackground-image: url(images/icons-png/refresh-white.png);\n}\n.ui-nosvg .ui-icon-search:after {\n\tbackground-image: url(images/icons-png/search-white.png);\n}\n.ui-nosvg .ui-icon-shop:after {\n\tbackground-image: url(images/icons-png/shop-white.png);\n}\n.ui-nosvg .ui-icon-star:after {\n\tbackground-image: url(images/icons-png/star-white.png);\n}\n.ui-nosvg .ui-icon-tag:after {\n\tbackground-image: url(images/icons-png/tag-white.png);\n}\n.ui-nosvg .ui-icon-user:after {\n\tbackground-image: url(images/icons-png/user-white.png);\n}\n.ui-nosvg .ui-icon-video:after {\n\tbackground-image: url(images/icons-png/video-white.png);\n}\n/* Alt icons */\n.ui-nosvg .ui-alt-icon.ui-icon-action:after,\n.ui-nosvg .ui-alt-icon .ui-icon-action:after {\n\tbackground-image: url(images/icons-png/action-black.png);\n}\n.ui-nosvg .ui-alt-icon.ui-icon-alert:after,\n.ui-nosvg .ui-alt-icon .ui-icon-alert:after {\n\tbackground-image: url(images/icons-png/alert-black.png);\n}\n.ui-nosvg .ui-alt-icon.ui-icon-arrow-d:after,\n.ui-nosvg .ui-alt-icon .ui-icon-arrow-d:after {\n\tbackground-image: url(images/icons-png/arrow-d-black.png);\n}\n.ui-nosvg .ui-alt-icon.ui-icon-arrow-d-l:after,\n.ui-nosvg .ui-alt-icon .ui-icon-arrow-d-l:after {\n\tbackground-image: url(images/icons-png/arrow-d-l-black.png);\n}\n.ui-nosvg .ui-alt-icon.ui-icon-arrow-d-r:after,\n.ui-nosvg .ui-alt-icon .ui-icon-arrow-d-r:after {\n\tbackground-image: url(images/icons-png/arrow-d-r-black.png);\n}\n.ui-nosvg .ui-alt-icon.ui-icon-arrow-l:after,\n.ui-nosvg .ui-alt-icon .ui-icon-arrow-l:after {\n\tbackground-image: url(images/icons-png/arrow-l-black.png);\n}\n.ui-nosvg .ui-alt-icon.ui-icon-arrow-r:after,\n.ui-nosvg .ui-alt-icon .ui-icon-arrow-r:after {\n\tbackground-image: url(images/icons-png/arrow-r-black.png);\n}\n.ui-nosvg .ui-alt-icon.ui-icon-arrow-u:after,\n.ui-nosvg .ui-alt-icon .ui-icon-arrow-u:after {\n\tbackground-image: url(images/icons-png/arrow-u-black.png);\n}\n.ui-nosvg .ui-alt-icon.ui-icon-arrow-u-l:after,\n.ui-nosvg .ui-alt-icon .ui-icon-arrow-u-l:after {\n\tbackground-image: url(images/icons-png/arrow-u-l-black.png);\n}\n.ui-nosvg .ui-alt-icon.ui-icon-arrow-u-r:after,\n.ui-nosvg .ui-alt-icon .ui-icon-arrow-u-r:after {\n\tbackground-image: url(images/icons-png/arrow-u-r-black.png);\n}\n.ui-nosvg .ui-alt-icon.ui-icon-audio:after,\n.ui-nosvg .ui-alt-icon .ui-icon-audio:after {\n\tbackground-image: url(images/icons-png/audio-black.png);\n}\n.ui-nosvg .ui-alt-icon.ui-icon-back:after,\n.ui-nosvg .ui-alt-icon .ui-icon-back:after {\n\tbackground-image: url(images/icons-png/back-black.png);\n}\n.ui-nosvg .ui-alt-icon.ui-icon-bars:after,\n.ui-nosvg .ui-alt-icon .ui-icon-bars:after {\n\tbackground-image: url(images/icons-png/bars-black.png);\n}\n.ui-nosvg .ui-alt-icon.ui-icon-bullets:after,\n.ui-nosvg .ui-alt-icon .ui-icon-bullets:after {\n\tbackground-image: url(images/icons-png/bullets-black.png);\n}\n.ui-nosvg .ui-alt-icon.ui-icon-calendar:after,\n.ui-nosvg .ui-alt-icon .ui-icon-calendar:after {\n\tbackground-image: url(images/icons-png/calendar-black.png);\n}\n.ui-nosvg .ui-alt-icon.ui-icon-camera:after,\n.ui-nosvg .ui-alt-icon .ui-icon-camera:after {\n\tbackground-image: url(images/icons-png/camera-black.png);\n}\n.ui-nosvg .ui-alt-icon.ui-icon-carat-d:after,\n.ui-nosvg .ui-alt-icon .ui-icon-carat-d:after {\n\tbackground-image: url(images/icons-png/carat-d-black.png);\n}\n.ui-nosvg .ui-alt-icon.ui-icon-carat-l:after,\n.ui-nosvg .ui-alt-icon .ui-icon-carat-l:after {\n\tbackground-image: url(images/icons-png/carat-l-black.png);\n}\n.ui-nosvg .ui-alt-icon.ui-icon-carat-r:after,\n.ui-nosvg .ui-alt-icon .ui-icon-carat-r:after {\n\tbackground-image: url(images/icons-png/carat-r-black.png);\n}\n.ui-nosvg .ui-alt-icon.ui-icon-carat-u:after,\n.ui-nosvg .ui-alt-icon .ui-icon-carat-u:after {\n\tbackground-image: url(images/icons-png/carat-u-black.png);\n}\n.ui-nosvg .ui-alt-icon.ui-icon-check:after,\n.ui-nosvg .ui-alt-icon .ui-icon-check:after,\n.ui-nosvg .ui-alt-icon.ui-btn.ui-checkbox-on:after,\n.ui-nosvg .ui-alt-icon .ui-btn.ui-checkbox-on:after {\n\tbackground-image: url(images/icons-png/check-black.png);\n}\n.ui-nosvg .ui-alt-icon.ui-icon-clock:after,\n.ui-nosvg .ui-alt-icon .ui-icon-clock:after {\n\tbackground-image: url(images/icons-png/clock-black.png);\n}\n.ui-nosvg .ui-alt-icon.ui-icon-cloud:after,\n.ui-nosvg .ui-alt-icon .ui-icon-cloud:after {\n\tbackground-image: url(images/icons-png/cloud-black.png);\n}\n.ui-nosvg .ui-alt-icon.ui-icon-comment:after,\n.ui-nosvg .ui-alt-icon .ui-icon-comment:after {\n\tbackground-image: url(images/icons-png/comment-black.png);\n}\n.ui-nosvg .ui-alt-icon.ui-icon-delete:after,\n.ui-nosvg .ui-alt-icon .ui-icon-delete:after {\n\tbackground-image: url(images/icons-png/delete-black.png);\n}\n.ui-nosvg .ui-alt-icon.ui-icon-edit:after,\n.ui-nosvg .ui-alt-icon .ui-icon-edit:after {\n\tbackground-image: url(images/icons-png/edit-black.png);\n}\n.ui-nosvg .ui-alt-icon.ui-icon-eye:after,\n.ui-nosvg .ui-alt-icon .ui-icon-eye:after {\n\tbackground-image: url(images/icons-png/eye-black.png);\n}\n.ui-nosvg .ui-alt-icon.ui-icon-forbidden:after,\n.ui-nosvg .ui-alt-icon .ui-icon-forbidden:after {\n\tbackground-image: url(images/icons-png/forbidden-black.png);\n}\n.ui-nosvg .ui-alt-icon.ui-icon-forward:after,\n.ui-nosvg .ui-alt-icon .ui-icon-forward:after {\n\tbackground-image: url(images/icons-png/forward-black.png);\n}\n.ui-nosvg .ui-alt-icon.ui-icon-gear:after,\n.ui-nosvg .ui-alt-icon .ui-icon-gear:after {\n\tbackground-image: url(images/icons-png/gear-black.png);\n}\n.ui-nosvg .ui-alt-icon.ui-icon-grid:after,\n.ui-nosvg .ui-alt-icon .ui-icon-grid:after {\n\tbackground-image: url(images/icons-png/grid-black.png);\n}\n.ui-nosvg .ui-alt-icon.ui-icon-heart:after,\n.ui-nosvg .ui-alt-icon .ui-icon-heart:after {\n\tbackground-image: url(images/icons-png/heart-black.png);\n}\n.ui-nosvg .ui-alt-icon.ui-icon-home:after,\n.ui-nosvg .ui-alt-icon .ui-icon-home:after {\n\tbackground-image: url(images/icons-png/home-black.png);\n}\n.ui-nosvg .ui-alt-icon.ui-icon-info:after,\n.ui-nosvg .ui-alt-icon .ui-icon-info:after {\n\tbackground-image: url(images/icons-png/info-black.png);\n}\n.ui-nosvg .ui-alt-icon.ui-icon-location:after,\n.ui-nosvg .ui-alt-icon .ui-icon-location:after {\n\tbackground-image: url(images/icons-png/location-black.png);\n}\n.ui-nosvg .ui-alt-icon.ui-icon-lock:after,\n.ui-nosvg .ui-alt-icon .ui-icon-lock:after {\n\tbackground-image: url(images/icons-png/lock-black.png);\n}\n.ui-nosvg .ui-alt-icon.ui-icon-mail:after,\n.ui-nosvg .ui-alt-icon .ui-icon-mail:after {\n\tbackground-image: url(images/icons-png/mail-black.png);\n}\n.ui-nosvg .ui-alt-icon.ui-icon-minus:after,\n.ui-nosvg .ui-alt-icon .ui-icon-minus:after {\n\tbackground-image: url(images/icons-png/minus-black.png);\n}\n.ui-nosvg .ui-alt-icon.ui-icon-navigation:after,\n.ui-nosvg .ui-alt-icon .ui-icon-navigation:after {\n\tbackground-image: url(images/icons-png/navigation-black.png);\n}\n.ui-nosvg .ui-alt-icon.ui-icon-phone:after,\n.ui-nosvg .ui-alt-icon .ui-icon-phone:after {\n\tbackground-image: url(images/icons-png/phone-black.png);\n}\n.ui-nosvg .ui-alt-icon.ui-icon-plus:after,\n.ui-nosvg .ui-alt-icon .ui-icon-plus:after {\n\tbackground-image: url(images/icons-png/plus-black.png);\n}\n.ui-nosvg .ui-alt-icon.ui-icon-power:after,\n.ui-nosvg .ui-alt-icon .ui-icon-power:after {\n\tbackground-image: url(images/icons-png/power-black.png);\n}\n.ui-nosvg .ui-alt-icon.ui-icon-recycle:after,\n.ui-nosvg .ui-alt-icon .ui-icon-recycle:after {\n\tbackground-image: url(images/icons-png/recycle-black.png);\n}\n.ui-nosvg .ui-alt-icon.ui-icon-refresh:after,\n.ui-nosvg .ui-alt-icon .ui-icon-refresh:after {\n\tbackground-image: url(images/icons-png/refresh-black.png);\n}\n.ui-nosvg .ui-alt-icon.ui-icon-search:after,\n.ui-nosvg .ui-alt-icon .ui-icon-search:after,\n.ui-nosvg .ui-input-search:after {\n\tbackground-image: url(images/icons-png/search-black.png);\n}\n.ui-nosvg .ui-alt-icon.ui-icon-shop:after,\n.ui-nosvg .ui-alt-icon .ui-icon-shop:after {\n\tbackground-image: url(images/icons-png/shop-black.png);\n}\n.ui-nosvg .ui-alt-icon.ui-icon-star:after,\n.ui-nosvg .ui-alt-icon .ui-icon-star:after {\n\tbackground-image: url(images/icons-png/star-black.png);\n}\n.ui-nosvg .ui-alt-icon.ui-icon-tag:after,\n.ui-nosvg .ui-alt-icon .ui-icon-tag:after {\n\tbackground-image: url(images/icons-png/tag-black.png);\n}\n.ui-nosvg .ui-alt-icon.ui-icon-user:after,\n.ui-nosvg .ui-alt-icon .ui-icon-user:after {\n\tbackground-image: url(images/icons-png/user-black.png);\n}\n.ui-nosvg .ui-alt-icon.ui-icon-video:after,\n.ui-nosvg .ui-alt-icon .ui-icon-video:after {\n\tbackground-image: url(images/icons-png/video-black.png);\n}\n/* Globals */\n/* Font\n-----------------------------------------------------------------------------------------------------------*/\nhtml {\n\tfont-size: 100%;\n}\nbody,\ninput,\nselect,\ntextarea,\nbutton,\n.ui-btn {\n\tfont-size: 1em;\n\tline-height: 1.3;\n\tfont-family: sans-serif /*{global-font-family}*/;\n}\nlegend,\n.ui-input-text input,\n.ui-input-search input {\n\tcolor: inherit;\n\ttext-shadow: inherit;\n}\n/* Form labels (overrides font-weight bold in bars, and mini font-size) */\n.ui-mobile label,\ndiv.ui-controlgroup-label {\n\tfont-weight: normal;\n\tfont-size: 16px;\n}\n/* Separators\n-----------------------------------------------------------------------------------------------------------*/\n/* Field contain separator (< 28em) */\n.ui-field-contain {\n\tborder-bottom-color: #828282;\n\tborder-bottom-color: rgba(0,0,0,.15);\n\tborder-bottom-width: 1px;\n\tborder-bottom-style: solid;\n}\n/* Table opt-in classes: strokes between each row, and alternating row stripes */\n/* Classes table-stroke and table-stripe are deprecated in 1.4. */\n.table-stroke thead th,\n.table-stripe thead th,\n.table-stripe tbody tr:last-child {\n\tborder-bottom: 1px solid #d6d6d6; /* non-RGBA fallback */\n\tborder-bottom: 1px solid rgba(0,0,0,.1);\n}\n.table-stroke tbody th,\n.table-stroke tbody td {\n\tborder-bottom: 1px solid #e6e6e6; /* non-RGBA fallback  */\n\tborder-bottom: 1px solid rgba(0,0,0,.05);\n}\n.table-stripe.table-stroke tbody tr:last-child th,\n.table-stripe.table-stroke tbody tr:last-child td {\n\tborder-bottom: 0;\n}\n.table-stripe tbody tr:nth-child(odd) td,\n.table-stripe tbody tr:nth-child(odd) th {\n\tbackground-color: #eeeeee; /* non-RGBA fallback  */\n\tbackground-color: rgba(0,0,0,.04);\n}\n/* Buttons\n-----------------------------------------------------------------------------------------------------------*/\n.ui-btn,\nlabel.ui-btn {\n\tfont-weight: bold;\n\tborder-width: 1px;\n\tborder-style: solid;\n}\n.ui-btn {\n\ttext-decoration: none !important;\n}\n.ui-btn-active {\n\tcursor: pointer;\n}\n/* Corner rounding\n-----------------------------------------------------------------------------------------------------------*/\n/* Class ui-btn-corner-all deprecated in 1.4 */\n.ui-corner-all {\n\t-webkit-border-radius: \t\t\t\t.3125em /*{global-radii-blocks}*/;\n\tborder-radius: \t\t\t\t\t\t.3125em /*{global-radii-blocks}*/;\n}\n/* Buttons */\n.ui-btn-corner-all,\n.ui-btn.ui-corner-all,\n/* Slider track */\n.ui-slider-track.ui-corner-all,\n/* Flipswitch */\n.ui-flipswitch.ui-corner-all,\n/* Count bubble */\n.ui-li-count {\n\t-webkit-border-radius: \t\t\t\t.3125em /*{global-radii-buttons}*/;\n\tborder-radius: \t\t\t\t\t\t.3125em /*{global-radii-buttons}*/;\n}\n/* Icon-only buttons */\n.ui-btn-icon-notext.ui-btn-corner-all,\n.ui-btn-icon-notext.ui-corner-all {\n\t-webkit-border-radius: 1em;\n\tborder-radius: 1em;\n}\n/* Radius clip workaround for cleaning up corner trapping */\n.ui-btn-corner-all,\n.ui-corner-all {\n\t-webkit-background-clip: padding;\n\tbackground-clip: padding-box;\n}\n/* Popup arrow */\n.ui-popup.ui-corner-all > .ui-popup-arrow-guide {\n\tleft: .6em /*{global-radii-blocks}*/;\n\tright: .6em /*{global-radii-blocks}*/;\n\ttop: .6em /*{global-radii-blocks}*/;\n\tbottom: .6em /*{global-radii-blocks}*/;\n}\n/* Shadow\n-----------------------------------------------------------------------------------------------------------*/\n.ui-shadow {\n\t-webkit-box-shadow: 0 1px 3px /*{global-box-shadow-size}*/ \t\trgba(0,0,0,.15) /*{global-box-shadow-color}*/;\n\t-moz-box-shadow: 0 1px 3px /*{global-box-shadow-size}*/ \t\trgba(0,0,0,.15) /*{global-box-shadow-color}*/;\n\tbox-shadow: 0 1px 3px /*{global-box-shadow-size}*/ \t\t\t\trgba(0,0,0,.15) /*{global-box-shadow-color}*/;\n}\n.ui-shadow-inset {\n\t-webkit-box-shadow: inset 0 1px 3px /*{global-box-shadow-size}*/ \trgba(0,0,0,.2) /*{global-box-shadow-color}*/;\n\t-moz-box-shadow: inset 0 1px 3px /*{global-box-shadow-size}*/ \t\trgba(0,0,0,.2) /*{global-box-shadow-color}*/;\n\tbox-shadow: inset 0 1px 3px /*{global-box-shadow-size}*/ \trgba(0,0,0,.2) /*{global-box-shadow-color}*/;\n}\n.ui-overlay-shadow {\n\t-webkit-box-shadow: 0 0 12px \t\trgba(0,0,0,.6);\n\t-moz-box-shadow: 0 0 12px \t\t\trgba(0,0,0,.6);\n\tbox-shadow: 0 0 12px \t\t\t\trgba(0,0,0,.6);\n}\n/* Icons\n-----------------------------------------------------------------------------------------------------------*/\n.ui-btn-icon-left:after,\n.ui-btn-icon-right:after,\n.ui-btn-icon-top:after,\n.ui-btn-icon-bottom:after,\n.ui-btn-icon-notext:after {\n\tbackground-color: \t\t\t\t\t#666 /*{global-icon-color}*/;\n\tbackground-color: \t\t\t\t\trgba(0,0,0,.3) /*{global-icon-disc}*/;\n\tbackground-position: center center;\n\tbackground-repeat: no-repeat;\n\t-webkit-border-radius: 1em;\n\tborder-radius: 1em;\n}\n/* Alt icons */\n.ui-alt-icon.ui-btn:after,\n.ui-alt-icon .ui-btn:after,\nhtml .ui-alt-icon.ui-checkbox-off:after,\nhtml .ui-alt-icon.ui-radio-off:after,\nhtml .ui-alt-icon .ui-checkbox-off:after,\nhtml .ui-alt-icon .ui-radio-off:after {\n\tbackground-color: \t\t\t\t\t#666 /*{global-icon-color}*/;\n\tbackground-color: \t\t\t\t\trgba(0,0,0,.15) /*{global-icon-disc}*/;\n}\n/* No disc */\n.ui-nodisc-icon.ui-btn:after,\n.ui-nodisc-icon .ui-btn:after {\n\tbackground-color: transparent;\n}\n/* Icon shadow */\n.ui-shadow-icon.ui-btn:after,\n.ui-shadow-icon .ui-btn:after {\n\t-webkit-box-shadow: 0 1px 0 \t\t\trgba(255,255,255,.3) /*{global-icon-shadow}*/;\n\t-moz-box-shadow: 0 1px 0 \t\t\t\trgba(255,255,255,.3) /*{global-icon-shadow}*/;\n\tbox-shadow: 0 1px 0 \t\t\t\t\trgba(255,255,255,.3) /*{global-icon-shadow}*/;\n}\n/* Checkbox and radio */\n.ui-btn.ui-checkbox-off:after,\n.ui-btn.ui-checkbox-on:after,\n.ui-btn.ui-radio-off:after,\n.ui-btn.ui-radio-on:after {\n\tdisplay: block;\n\twidth: 18px;\n\theight: 18px;\n\tmargin: -9px 2px 0 2px;\n}\n.ui-checkbox-off:after,\n.ui-btn.ui-radio-off:after {\n\tfilter: Alpha(Opacity=30);\n\topacity: .3;\n}\n.ui-btn.ui-checkbox-off:after,\n.ui-btn.ui-checkbox-on:after {\n\t-webkit-border-radius: .1875em;\n\tborder-radius: .1875em;\n}\n.ui-btn.ui-checkbox-off:after {\n\tbackground-color: #666;\n\tbackground-color: rgba(0,0,0,.3);\n}\n.ui-radio .ui-btn.ui-radio-on:after {\n\tbackground-image: none;\n\tbackground-color: #fff;\n\twidth: 8px;\n\theight: 8px;\n\tborder-width: 5px;\n\tborder-style: solid; \n}\n.ui-alt-icon.ui-btn.ui-radio-on:after,\n.ui-alt-icon .ui-btn.ui-radio-on:after {\n\tbackground-color: #000;\n}\n/* Loader */\n.ui-icon-loading {\n\tbackground: url(images/ajax-loader.gif);\n\tbackground-size: 2.875em 2.875em;\n}\n/* Swatches */\n/* A\n-----------------------------------------------------------------------------------------------------------*/\n/* Bar: Toolbars, dividers, slider track */\n.ui-bar-a,\n.ui-page-theme-a .ui-bar-inherit,\nhtml .ui-bar-a .ui-bar-inherit,\nhtml .ui-body-a .ui-bar-inherit,\nhtml body .ui-group-theme-a .ui-bar-inherit {\n\tbackground-color: \t\t\t#e9e9e9 /*{a-bar-background-color}*/;\n\tborder-color:\t \t\t#ddd /*{a-bar-border}*/;\n\tcolor: \t\t\t\t\t#333 /*{a-bar-color}*/;\n\ttext-shadow: 0 /*{a-bar-shadow-x}*/ 1px /*{a-bar-shadow-y}*/ 0 /*{a-bar-shadow-radius}*/ \t#eee /*{a-bar-shadow-color}*/;\n\tfont-weight: bold;\n}\n.ui-bar-a {\n\tborder-width: 1px;\n\tborder-style: solid;\n}\n/* Page and overlay */\n.ui-overlay-a,\n.ui-page-theme-a,\n.ui-page-theme-a .ui-panel-wrapper {\n\tbackground-color: \t\t\t#f9f9f9 /*{a-page-background-color}*/;\n\tborder-color:\t \t\t#bbb /*{a-page-border}*/;\n\tcolor: \t\t\t\t\t#333 /*{a-page-color}*/;\n\ttext-shadow: 0 /*{a-page-shadow-x}*/ 1px /*{a-page-shadow-y}*/ 0 /*{a-page-shadow-radius}*/ \t#f3f3f3 /*{a-page-shadow-color}*/;\n}\n/* Body: Read-only lists, text inputs, collapsible content */\n.ui-body-a,\n.ui-page-theme-a .ui-body-inherit,\nhtml .ui-bar-a .ui-body-inherit,\nhtml .ui-body-a .ui-body-inherit,\nhtml body .ui-group-theme-a .ui-body-inherit,\nhtml .ui-panel-page-container-a {\n\tbackground-color: \t\t\t#fff /*{a-body-background-color}*/;\n\tborder-color:\t \t\t#ddd /*{a-body-border}*/;\n\tcolor: \t\t\t\t\t#333 /*{a-body-color}*/;\n\ttext-shadow: 0 /*{a-body-shadow-x}*/ 1px /*{a-body-shadow-y}*/ 0 /*{a-body-shadow-radius}*/ \t#f3f3f3 /*{a-body-shadow-color}*/;\n}\n.ui-body-a {\n\tborder-width: 1px;\n\tborder-style: solid;\n}\n/* Links */\n.ui-page-theme-a a,\nhtml .ui-bar-a a,\nhtml .ui-body-a a,\nhtml body .ui-group-theme-a a {\n\tcolor: #3388cc /*{a-link-color}*/;\n\tfont-weight: bold;\n}\n.ui-page-theme-a a:visited,\nhtml .ui-bar-a a:visited,\nhtml .ui-body-a a:visited,\nhtml body .ui-group-theme-a a:visited {\n    color: #3388cc /*{a-link-visited}*/;\n}\n.ui-page-theme-a a:hover,\nhtml .ui-bar-a a:hover,\nhtml .ui-body-a a:hover,\nhtml body .ui-group-theme-a a:hover {\n\tcolor: #005599 /*{a-link-hover}*/;\n}\n.ui-page-theme-a a:active,\nhtml .ui-bar-a a:active,\nhtml .ui-body-a a:active,\nhtml body .ui-group-theme-a a:active {\n\tcolor: #005599 /*{a-link-active}*/;\n}\n/* Button up */\n.ui-page-theme-a .ui-btn,\nhtml .ui-bar-a .ui-btn,\nhtml .ui-body-a .ui-btn,\nhtml body .ui-group-theme-a .ui-btn,\nhtml head + body .ui-btn.ui-btn-a,\n/* Button visited */\n.ui-page-theme-a .ui-btn:visited,\nhtml .ui-bar-a .ui-btn:visited,\nhtml .ui-body-a .ui-btn:visited,\nhtml body .ui-group-theme-a .ui-btn:visited,\nhtml head + body .ui-btn.ui-btn-a:visited {\n\tbackground-color: \t\t\t#f6f6f6 /*{a-bup-background-color}*/;\n\tborder-color:\t \t\t#ddd /*{a-bup-border}*/;\n\tcolor: \t\t\t\t\t#333 /*{a-bup-color}*/;\n\ttext-shadow: 0 /*{a-bup-shadow-x}*/ 1px /*{a-bup-shadow-y}*/ 0 /*{a-bup-shadow-radius}*/ #f3f3f3 /*{a-bup-shadow-color}*/;\n}\n/* Button hover */\n.ui-page-theme-a .ui-btn:hover,\nhtml .ui-bar-a .ui-btn:hover,\nhtml .ui-body-a .ui-btn:hover,\nhtml body .ui-group-theme-a .ui-btn:hover,\nhtml head + body .ui-btn.ui-btn-a:hover {\n\tbackground-color: \t\t\t#ededed /*{a-bhover-background-color}*/;\n\tborder-color:\t \t\t#ddd /*{a-bhover-border}*/;\n\tcolor: \t\t\t\t\t#333 /*{a-bhover-color}*/;\n\ttext-shadow: 0 /*{a-bhover-shadow-x}*/ 1px /*{a-bhover-shadow-y}*/ 0 /*{a-bhover-shadow-radius}*/ #f3f3f3 /*{a-bhover-shadow-color}*/;\n}\n/* Button down */\n.ui-page-theme-a .ui-btn:active,\nhtml .ui-bar-a .ui-btn:active,\nhtml .ui-body-a .ui-btn:active,\nhtml body .ui-group-theme-a .ui-btn:active,\nhtml head + body .ui-btn.ui-btn-a:active {\n\tbackground-color: \t\t\t#e8e8e8 /*{a-bdown-background-color}*/;\n\tborder-color:\t \t\t#ddd /*{a-bdown-border}*/;\n\tcolor: \t\t\t\t\t#333 /*{a-bdown-color}*/;\n\ttext-shadow: 0 /*{a-bdown-shadow-x}*/ 1px /*{a-bdown-shadow-y}*/ 0 /*{a-bdown-shadow-radius}*/ #f3f3f3 /*{a-bdown-shadow-color}*/;\n}\n/* Active button */\n.ui-page-theme-a .ui-btn.ui-btn-active,\nhtml .ui-bar-a .ui-btn.ui-btn-active,\nhtml .ui-body-a .ui-btn.ui-btn-active,\nhtml body .ui-group-theme-a .ui-btn.ui-btn-active,\nhtml head + body .ui-btn.ui-btn-a.ui-btn-active,\n/* Active checkbox icon */\n.ui-page-theme-a .ui-checkbox-on:after,\nhtml .ui-bar-a .ui-checkbox-on:after,\nhtml .ui-body-a .ui-checkbox-on:after,\nhtml body .ui-group-theme-a .ui-checkbox-on:after,\n.ui-btn.ui-checkbox-on.ui-btn-a:after,\n/* Active flipswitch background */\n.ui-page-theme-a .ui-flipswitch-active,\nhtml .ui-bar-a .ui-flipswitch-active,\nhtml .ui-body-a .ui-flipswitch-active,\nhtml body .ui-group-theme-a .ui-flipswitch-active,\nhtml body .ui-flipswitch.ui-bar-a.ui-flipswitch-active,\n/* Active slider track */\n.ui-page-theme-a .ui-slider-track .ui-btn-active,\nhtml .ui-bar-a .ui-slider-track .ui-btn-active,\nhtml .ui-body-a .ui-slider-track .ui-btn-active,\nhtml body .ui-group-theme-a .ui-slider-track .ui-btn-active,\nhtml body div.ui-slider-track.ui-body-a .ui-btn-active {\n\tbackground-color: \t\t#3388cc /*{a-active-background-color}*/;\n\tborder-color:\t \t\t#3388cc /*{a-active-border}*/;\n\tcolor: \t\t\t\t\t#fff /*{a-active-color}*/;\n\ttext-shadow: 0 /*{a-active-shadow-x}*/ 1px /*{a-active-shadow-y}*/ 0 /*{a-active-shadow-radius}*/ #005599 /*{a-active-shadow-color}*/;\n}\n/* Active radio button icon */\n.ui-page-theme-a .ui-radio-on:after,\nhtml .ui-bar-a .ui-radio-on:after,\nhtml .ui-body-a .ui-radio-on:after,\nhtml body .ui-group-theme-a .ui-radio-on:after,\n.ui-btn.ui-radio-on.ui-btn-a:after {\n\tborder-color:\t\t\t#3388cc /*{a-active-background-color}*/;\n}\n/* Focus */\n.ui-page-theme-a .ui-btn:focus,\nhtml .ui-bar-a .ui-btn:focus,\nhtml .ui-body-a .ui-btn:focus,\nhtml body .ui-group-theme-a .ui-btn:focus,\nhtml head + body .ui-btn.ui-btn-a:focus,\n/* Focus buttons and text inputs with div wrap */\n.ui-page-theme-a .ui-focus,\nhtml .ui-bar-a .ui-focus,\nhtml .ui-body-a .ui-focus,\nhtml body .ui-group-theme-a .ui-focus,\nhtml head + body .ui-btn-a.ui-focus,\nhtml head + body .ui-body-a.ui-focus {\n\t-webkit-box-shadow: 0 0 12px \t#3388cc /*{a-active-background-color}*/;\n\t-moz-box-shadow: 0 0 12px \t\t#3388cc /*{a-active-background-color}*/;\n\tbox-shadow: 0 0 12px \t\t\t#3388cc /*{a-active-background-color}*/;\n}\n/* B\n-----------------------------------------------------------------------------------------------------------*/\n/* Bar: Toolbars, dividers, slider track */\n.ui-bar-b,\n.ui-page-theme-b .ui-bar-inherit,\nhtml .ui-bar-b .ui-bar-inherit,\nhtml .ui-body-b .ui-bar-inherit,\nhtml body .ui-group-theme-b .ui-bar-inherit {\n\tbackground-color: \t\t\t#1d1d1d /*{b-bar-background-color}*/;\n\tborder-color:\t \t\t#1b1b1b /*{b-bar-border}*/;\n\tcolor: \t\t\t\t\t#fff /*{b-bar-color}*/;\n\ttext-shadow: 0 /*{b-bar-shadow-x}*/ 1px /*{b-bar-shadow-y}*/ 0 /*{b-bar-shadow-radius}*/ \t#111 /*{b-bar-shadow-color}*/;\n\tfont-weight: bold;\n}\n.ui-bar-b {\n\tborder-width: 1px;\n\tborder-style: solid;\n}\n/* Page and overlay */\n.ui-overlay-b,\n.ui-page-theme-b,\n.ui-page-theme-b .ui-panel-wrapper {\n\tbackground-color: \t\t\t#252525 /*{b-page-background-color}*/;\n\tborder-color:\t \t\t#454545 /*{b-page-border}*/;\n\tcolor: \t\t\t\t\t#fff /*{b-page-color}*/;\n\ttext-shadow: 0 /*{b-page-shadow-x}*/ 1px /*{b-page-shadow-y}*/ 0 /*{b-page-shadow-radius}*/ \t#111 /*{b-page-shadow-color}*/;\n}\n/* Body: Read-only lists, text inputs, collapsible content */\n.ui-body-b,\n.ui-page-theme-b .ui-body-inherit,\nhtml .ui-bar-b .ui-body-inherit,\nhtml .ui-body-b .ui-body-inherit,\nhtml body .ui-group-theme-b .ui-body-inherit,\nhtml .ui-panel-page-container-b {\n\tbackground-color: \t\t\t#2a2a2a /*{b-body-background-color}*/;\n\tborder-color:\t \t\t#1d1d1d /*{b-body-border}*/;\n\tcolor: \t\t\t\t\t#fff /*{b-body-color}*/;\n\ttext-shadow: 0 /*{b-body-shadow-x}*/ 1px /*{b-body-shadow-y}*/ 0 /*{b-body-shadow-radius}*/ \t#111 /*{b-body-shadow-color}*/;\n}\n.ui-body-b {\n\tborder-width: 1px;\n\tborder-style: solid;\n}\n/* Links */\n.ui-page-theme-b a,\nhtml .ui-bar-b a,\nhtml .ui-body-b a,\nhtml body .ui-group-theme-b a {\n\tcolor: #22aadd /*{b-link-color}*/;\n\tfont-weight: bold;\n}\n.ui-page-theme-b a:visited,\nhtml .ui-bar-b a:visited,\nhtml .ui-body-b a:visited,\nhtml body .ui-group-theme-b a:visited {\n    color: #22aadd /*{b-link-visited}*/;\n}\n.ui-page-theme-b a:hover,\nhtml .ui-bar-b a:hover,\nhtml .ui-body-b a:hover,\nhtml body .ui-group-theme-b a:hover {\n\tcolor: #0088bb /*{b-link-hover}*/;\n}\n.ui-page-theme-b a:active,\nhtml .ui-bar-b a:active,\nhtml .ui-body-b a:active,\nhtml body .ui-group-theme-b a:active {\n\tcolor: #0088bb /*{b-link-active}*/;\n}\n/* Button up */\n.ui-page-theme-b .ui-btn,\nhtml .ui-bar-b .ui-btn,\nhtml .ui-body-b .ui-btn,\nhtml body .ui-group-theme-b .ui-btn,\nhtml head + body .ui-btn.ui-btn-b,\n/* Button visited */\n.ui-page-theme-b .ui-btn:visited,\nhtml .ui-bar-b .ui-btn:visited,\nhtml .ui-body-b .ui-btn:visited,\nhtml body .ui-group-theme-b .ui-btn:visited,\nhtml head + body .ui-btn.ui-btn-b:visited {\n\tbackground-color: \t\t\t#333 /*{b-bup-background-color}*/;\n\tborder-color:\t \t\t#1f1f1f /*{b-bup-border}*/;\n\tcolor: \t\t\t\t\t#fff /*{b-bup-color}*/;\n\ttext-shadow: 0 /*{b-bup-shadow-x}*/ 1px /*{b-bup-shadow-y}*/ 0 /*{b-bup-shadow-radius}*/ #111 /*{b-bup-shadow-color}*/;\n}\n/* Button hover */\n.ui-page-theme-b .ui-btn:hover,\nhtml .ui-bar-b .ui-btn:hover,\nhtml .ui-body-b .ui-btn:hover,\nhtml body .ui-group-theme-b .ui-btn:hover,\nhtml head + body .ui-btn.ui-btn-b:hover {\n\tbackground-color: \t\t\t#373737 /*{b-bhover-background-color}*/;\n\tborder-color:\t \t\t#1f1f1f /*{b-bhover-border}*/;\n\tcolor: \t\t\t\t\t#fff /*{b-bhover-color}*/;\n\ttext-shadow: 0 /*{b-bhover-shadow-x}*/ 1px /*{b-bhover-shadow-y}*/ 0 /*{b-bhover-shadow-radius}*/ #111 /*{b-bhover-shadow-color}*/;\n}\n/* Button down */\n.ui-page-theme-b .ui-btn:active,\nhtml .ui-bar-b .ui-btn:active,\nhtml .ui-body-b .ui-btn:active,\nhtml body .ui-group-theme-b .ui-btn:active,\nhtml head + body .ui-btn.ui-btn-b:active {\n\tbackground-color: \t\t\t#404040 /*{b-bdown-background-color}*/;\n\tborder-color:\t \t\t#1f1f1f /*{b-bdown-border}*/;\n\tcolor: \t\t\t\t\t#fff /*{b-bdown-color}*/;\n\ttext-shadow: 0 /*{b-bdown-shadow-x}*/ 1px /*{b-bdown-shadow-y}*/ 0 /*{b-bdown-shadow-radius}*/ #111 /*{b-bdown-shadow-color}*/;\n}\n/* Active button */\n.ui-page-theme-b .ui-btn.ui-btn-active,\nhtml .ui-bar-b .ui-btn.ui-btn-active,\nhtml .ui-body-b .ui-btn.ui-btn-active,\nhtml body .ui-group-theme-b .ui-btn.ui-btn-active,\nhtml head + body .ui-btn.ui-btn-b.ui-btn-active,\n/* Active checkbox icon */\n.ui-page-theme-b .ui-checkbox-on:after,\nhtml .ui-bar-b .ui-checkbox-on:after,\nhtml .ui-body-b .ui-checkbox-on:after,\nhtml body .ui-group-theme-b .ui-checkbox-on:after,\n.ui-btn.ui-checkbox-on.ui-btn-b:after,\n/* Active flipswitch background */\n.ui-page-theme-b .ui-flipswitch-active,\nhtml .ui-bar-b .ui-flipswitch-active,\nhtml .ui-body-b .ui-flipswitch-active,\nhtml body .ui-group-theme-b .ui-flipswitch-active,\nhtml body .ui-flipswitch.ui-bar-b.ui-flipswitch-active,\n/* Active slider track */\n.ui-page-theme-b .ui-slider-track .ui-btn-active,\nhtml .ui-bar-b .ui-slider-track .ui-btn-active,\nhtml .ui-body-b .ui-slider-track .ui-btn-active,\nhtml body .ui-group-theme-b .ui-slider-track .ui-btn-active,\nhtml body div.ui-slider-track.ui-body-b .ui-btn-active {\n\tbackground-color: \t\t#22aadd /*{b-active-background-color}*/;\n\tborder-color:\t \t\t#22aadd /*{b-active-border}*/;\n\tcolor: \t\t\t\t\t#fff /*{b-active-color}*/;\n\ttext-shadow: 0 /*{b-active-shadow-x}*/ 1px /*{b-active-shadow-y}*/ 0 /*{b-active-shadow-radius}*/ #0088bb /*{b-active-shadow-color}*/;\n}\n/* Active radio button icon */\n.ui-page-theme-b .ui-radio-on:after,\nhtml .ui-bar-b .ui-radio-on:after,\nhtml .ui-body-b .ui-radio-on:after,\nhtml body .ui-group-theme-b .ui-radio-on:after,\n.ui-btn.ui-radio-on.ui-btn-b:after {\n\tborder-color:\t\t\t#22aadd /*{b-active-background-color}*/;\n}\n/* Focus */\n.ui-page-theme-b .ui-btn:focus,\nhtml .ui-bar-b .ui-btn:focus,\nhtml .ui-body-b .ui-btn:focus,\nhtml body .ui-group-theme-b .ui-btn:focus,\nhtml head + body .ui-btn.ui-btn-b:focus,\n/* Focus buttons and text inputs with div wrap */\n.ui-page-theme-b .ui-focus,\nhtml .ui-bar-b .ui-focus,\nhtml .ui-body-b .ui-focus,\nhtml body .ui-group-theme-b .ui-focus,\nhtml head + body .ui-btn-b.ui-focus,\nhtml head + body .ui-body-b.ui-focus {\n\t-webkit-box-shadow: 0 0 12px \t#22aadd /*{b-active-background-color}*/;\n\t-moz-box-shadow: 0 0 12px \t\t#22aadd /*{b-active-background-color}*/;\n\tbox-shadow: 0 0 12px \t\t\t#22aadd /*{b-active-background-color}*/;\n}\n/* Structure */\n/* Disabled\n-----------------------------------------------------------------------------------------------------------*/\n/* Class ui-disabled deprecated in 1.4. :disabled not supported by IE8 so we use [disabled] */\n.ui-disabled,\n.ui-state-disabled,\nbutton[disabled],\n.ui-select .ui-btn.ui-state-disabled {\n\tfilter: Alpha(Opacity=30);\n\topacity: .3;\n\tcursor: default !important;\n\tpointer-events: none;\n}\n/* Focus state outline\n-----------------------------------------------------------------------------------------------------------*/\n.ui-btn:focus,\n.ui-btn.ui-focus {\n\toutline: 0;\n}\n/* Unset box-shadow in browsers that don't do it right */\n.ui-noboxshadow .ui-shadow,\n.ui-noboxshadow .ui-shadow-inset,\n.ui-noboxshadow .ui-overlay-shadow,\n.ui-noboxshadow .ui-shadow-icon.ui-btn:after,\n.ui-noboxshadow .ui-shadow-icon .ui-btn:after,\n.ui-noboxshadow .ui-focus,\n.ui-noboxshadow .ui-btn:focus,\n.ui-noboxshadow  input:focus,\n.ui-noboxshadow .ui-panel {\n\t-webkit-box-shadow: none !important;\n\t-moz-box-shadow: none !important;\n\tbox-shadow: none !important;\n}\n.ui-noboxshadow .ui-btn:focus,\n.ui-noboxshadow .ui-focus {\n\toutline-width: 1px;\n\toutline-style: auto;\n}\n/* Some unsets */\n.ui-mobile,\n.ui-mobile body {\n\theight: 99.9%;\n}\n.ui-mobile fieldset,\n.ui-page {\n\tpadding: 0;\n\tmargin: 0;\n}\n.ui-mobile a img,\n.ui-mobile fieldset {\n\tborder-width: 0;\n}\n/* Fixes for fieldset issues on IE10 and FF (see #6077) */\n.ui-mobile fieldset {\n\tmin-width: 0;\n}\n@-moz-document url-prefix() {\n\t.ui-mobile fieldset {\n\t\tdisplay: table-column;\n\t\tvertical-align: middle;\n\t}\n}\n/* Viewport */\n.ui-mobile-viewport {\n\tmargin: 0;\n\toverflow-x: visible;\n\t-webkit-text-size-adjust: 100%;\n\t-ms-text-size-adjust:none;\n\t-webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\n/* Issue #2066 */\nbody.ui-mobile-viewport,\ndiv.ui-mobile-viewport {\n\toverflow-x: hidden;\n}\n/* \"page\" containers - full-screen views, one should always be in view post-pageload */\n.ui-mobile [data-role=page],\n.ui-mobile [data-role=dialog],\n.ui-page {\n\ttop: 0;\n\tleft: 0;\n\twidth: 100%;\n\tmin-height: 100%;\n\tposition: absolute;\n\tdisplay: none;\n\tborder: 0;\n}\n/* On ios4, setting focus on the page element causes flashing during transitions when there is an outline, so we turn off outlines */\n.ui-page {\n\toutline: none;\n}\n.ui-mobile .ui-page-active {\n\tdisplay: block;\n\toverflow: visible;\n\toverflow-x: hidden;\n}\n@media screen and (orientation: portrait) {\n\t.ui-mobile .ui-page {\n\t\tmin-height: 420px;\n\t}\n}\n@media screen and (orientation: landscape) {\n\t.ui-mobile .ui-page {\n\t\tmin-height: 300px;\n\t}\n}\n/* Fouc */\n.ui-mobile-rendering > * {\n\tvisibility: hidden;\n}\n/* Non-js content hiding */\n.ui-nojs {\n\tposition: absolute !important;\n\theight: 1px;\n\twidth: 1px;\n\toverflow: hidden;\n\tclip: rect(1px,1px,1px,1px);\n}\n/* Loading screen */\n.ui-loading .ui-loader {\n\tdisplay: block;\n}\n.ui-loader {\n\tdisplay: none;\n\tz-index: 9999999;\n\tposition: fixed;\n\ttop: 50%;\n\tleft: 50%;\n\tborder:0;\n}\n.ui-loader-default {\n\tbackground: none;\n\tfilter: Alpha(Opacity=18);\n\topacity: .18;\n\twidth: 2.875em;\n\theight: 2.875em;\n\tmargin-left: -1.4375em;\n\tmargin-top: -1.4375em;\n}\n.ui-loader-verbose {\n\twidth: 12.5em;\n\tfilter: Alpha(Opacity=88);\n\topacity: .88;\n\tbox-shadow: 0 1px 1px -1px #fff;\n\theight: auto;\n\tmargin-left: -6.875em;\n\tmargin-top: -2.6875em;\n\tpadding: .625em;\n}\n.ui-loader-default h1 {\n\tfont-size: 0;\n\twidth: 0;\n\theight: 0;\n\toverflow: hidden;\n}\n.ui-loader-verbose h1 {\n\tfont-size: 1em;\n\tmargin: 0;\n\ttext-align: center;\n}\n.ui-loader .ui-icon-loading {\n\tbackground-color: #000;\n\tdisplay: block;\n\tmargin: 0;\n\twidth: 2.75em;\n\theight: 2.75em;\n\tpadding: .0625em;\n\t-webkit-border-radius: 2.25em;\n\tborder-radius: 2.25em;\n}\n.ui-loader-verbose .ui-icon-loading {\n\tmargin: 0 auto .625em;\n\tfilter: Alpha(Opacity=75);\n\topacity: .75;\n}\n.ui-loader-textonly {\n\tpadding: .9375em;\n\tmargin-left: -7.1875em;\n}\n.ui-loader-textonly .ui-icon-loading {\n\tdisplay: none;\n}\n.ui-loader-fakefix {\n\tposition: absolute;\n}\n/* Headers, content panels */\n.ui-bar,\n.ui-body {\n\tposition: relative;\n\tpadding: .4em 1em;\n\toverflow: hidden;\n\tdisplay: block;\n\tclear: both;\n}\n.ui-bar h1,\n.ui-bar h2,\n.ui-bar h3,\n.ui-bar h4,\n.ui-bar h5,\n.ui-bar h6 {\n\tmargin: 0;\n\tpadding: 0;\n\tfont-size: 1em;\n\tdisplay: inline-block;\n}\n.ui-header,\n.ui-footer {\n\tborder-width: 1px 0;\n\tborder-style: solid;\n\tposition: relative;\n}\n.ui-header:empty,\n.ui-footer:empty {\n\tmin-height: 2.6875em;\n}\n.ui-header .ui-title,\n.ui-footer .ui-title {\n\tfont-size: 1em;\n\tmin-height: 1.1em;\n\ttext-align: center;\n\tdisplay: block;\n\tmargin: 0 30%;\n\tpadding: .7em 0;\n\ttext-overflow: ellipsis;\n\toverflow: hidden;\n\twhite-space: nowrap;\n\toutline: 0 !important;\n}\n.ui-footer .ui-title {\n\tmargin: 0 1em;\n}\n.ui-content {\n\tborder-width: 0;\n\toverflow: visible;\n\toverflow-x: hidden;\n\tpadding: 1em;\n}\n/* Corner styling for dialogs and popups */\n.ui-corner-all > .ui-header:first-child,\n.ui-corner-all > .ui-content:first-child,\n.ui-corner-all > .ui-footer:first-child {\n\t-webkit-border-top-left-radius: inherit;\n\tborder-top-left-radius: inherit;\n\t-webkit-border-top-right-radius: inherit;\n\tborder-top-right-radius: inherit;\n}\n.ui-corner-all > .ui-header:last-child,\n.ui-corner-all > .ui-content:last-child,\n.ui-corner-all > .ui-footer:last-child {\n\t-webkit-border-bottom-left-radius: inherit;\n\tborder-bottom-left-radius: inherit;\n\t-webkit-border-bottom-right-radius: inherit;\n\tborder-bottom-right-radius: inherit;\n}\n/* Buttons and icons */\n.ui-btn {\n\tfont-size: 16px;\n\tmargin: .5em 0;\n\tpadding: .7em 1em;\n\tdisplay: block;\n\tposition: relative;\n\ttext-align: center;\n\ttext-overflow: ellipsis;\n\toverflow: hidden;\n\twhite-space: nowrap;\n\tcursor: pointer;\n\t-webkit-user-select: none;\n\t-moz-user-select: none;\n\t-ms-user-select: none;\n\tuser-select: none;\n}\n.ui-btn-icon-notext,\n.ui-header button.ui-btn.ui-btn-icon-notext,\n.ui-footer button.ui-btn.ui-btn-icon-notext {\n\tpadding: 0;\n\twidth: 1.75em;\n\theight: 1.75em;\n\ttext-indent: -9999px;\n\twhite-space: nowrap !important;\n}\n.ui-mini {\n\tfont-size: 12.5px;\n}\n.ui-mini .ui-btn {\n\tfont-size: inherit;\n}\n/* Make buttons in toolbars default to mini and inline. */\n.ui-header .ui-btn,\n.ui-footer .ui-btn {\n\tfont-size: 12.5px;\n\tdisplay: inline-block;\n\tvertical-align: middle;\n}\n.ui-header .ui-controlgroup .ui-btn-icon-notext,\n.ui-footer .ui-controlgroup .ui-btn-icon-notext {\n    font-size: 12.5px;\n}\n/* To ensure same top and left/right position when ui-btn-left/right are added to something other than buttons. */\n.ui-header .ui-btn-left,\n.ui-header .ui-btn-right {\n\tfont-size: 12.5px;\n}\n.ui-mini.ui-btn-icon-notext,\n.ui-mini .ui-btn-icon-notext,\n.ui-header .ui-btn-icon-notext,\n.ui-footer .ui-btn-icon-notext {\n\tfont-size: 16px;\t\n\tpadding: 0;\n}\n.ui-btn-inline {\n\tdisplay: inline-block;\n\tvertical-align: middle;\n\tmargin-right: .625em;\n}\n.ui-btn-icon-left {\n\tpadding-left: 2.5em;\n}\n.ui-btn-icon-right {\n\tpadding-right: 2.5em;\n}\n.ui-btn-icon-top {\n\tpadding-top: 2.5em;\n}\n.ui-btn-icon-bottom {\n\tpadding-bottom: 2.5em;\n}\n.ui-header .ui-btn-icon-top,\n.ui-footer .ui-btn-icon-top,\n.ui-header .ui-btn-icon-bottom,\n.ui-footer .ui-btn-icon-bottom {\n\tpadding-left: .3125em;\n\tpadding-right: .3125em;\n}\n.ui-btn-icon-left:after,\n.ui-btn-icon-right:after,\n.ui-btn-icon-top:after,\n.ui-btn-icon-bottom:after,\n.ui-btn-icon-notext:after {\n\tcontent: \"\";\n\tposition: absolute;\n\tdisplay: block;\n\twidth: 22px;\n\theight: 22px;\n}\n.ui-btn-icon-notext:after,\n.ui-btn-icon-left:after,\n.ui-btn-icon-right:after {\n\ttop: 50%;\n\tmargin-top: -11px;\n}\n.ui-btn-icon-left:after {\n\tleft: .5625em;\n}\n.ui-btn-icon-right:after {\n\tright: .5625em;\n}\n.ui-mini.ui-btn-icon-left:after,\n.ui-mini .ui-btn-icon-left:after,\n.ui-header .ui-btn-icon-left:after,\n.ui-footer .ui-btn-icon-left:after {\n\tleft: .37em;\n}\n.ui-mini.ui-btn-icon-right:after,\n.ui-mini .ui-btn-icon-right:after,\n.ui-header .ui-btn-icon-right:after,\n.ui-footer .ui-btn-icon-right:after {\n\tright: .37em;\n}\n.ui-btn-icon-notext:after,\n.ui-btn-icon-top:after,\n.ui-btn-icon-bottom:after {\n\tleft: 50%;\n\tmargin-left: -11px;\n}\n.ui-btn-icon-top:after {\n\ttop: .5625em;\n}\n.ui-btn-icon-bottom:after {\n\ttop: auto;\n\tbottom: .5625em;\n}\n/* Buttons in header position classes */\n.ui-header .ui-btn-left,\n.ui-header .ui-btn-right,\n.ui-btn-left > [class*=\"ui-\"],\n.ui-btn-right > [class*=\"ui-\"] {\n\tmargin: 0;\n}\n.ui-btn-left,\n.ui-btn-right {\n\tposition: absolute;\n\ttop: .24em;\n}\n.ui-btn-left {\n\tleft: .4em;\n}\n.ui-btn-right {\n\tright: .4em;\n}\n.ui-btn-icon-notext.ui-btn-left {\n\ttop: .3125em;\n\tleft: .3125em;\n}\n.ui-btn-icon-notext.ui-btn-right {\n\ttop: .3125em;\n\tright: .3125em;\n}\n/* Button elements */\nbutton.ui-btn,\n.ui-controlgroup-controls button.ui-btn-icon-notext {\n\t-webkit-box-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\tbox-sizing: border-box;\n\t-webkit-appearance: none;\n\t-moz-appearance: none;\n\twidth: 100%;\n}\nbutton.ui-btn-inline,\n.ui-header button.ui-btn,\n.ui-footer button.ui-btn {\n\twidth: auto;\n}\n/* Firefox adds a 1px border in a button element. We negate this to make sure they have the same height as other buttons in controlgroups. */\nbutton.ui-btn::-moz-focus-inner {\n\tborder: 0;\n}\nbutton.ui-btn-icon-notext,\n.ui-controlgroup-horizontal .ui-controlgroup-controls button.ui-btn {\n\t-webkit-box-sizing: content-box;\n\t-moz-box-sizing: content-box;\n\tbox-sizing: content-box;\n\twidth: 1.75em;\n}\n/* Form labels */\n.ui-mobile label,\n.ui-controlgroup-label {\n\tdisplay: block;\n\tmargin: 0 0 .4em;\n}\n/* Accessible content hiding */\n/* ui-hide-label deprecated in 1.4. TODO: Remove in 1.5 */\n.ui-hide-label > label,\n.ui-hide-label .ui-controlgroup-label,\n.ui-hide-label .ui-rangeslider label,\n.ui-hidden-accessible {\n\tposition: absolute !important;\n\theight: 1px;\n\twidth: 1px;\n\toverflow: hidden;\n\tclip: rect(1px,1px,1px,1px);\n}\n/* Used for hiding elements by the filterable widget. You can also use this class to hide list items or buttons in controlgroups; this ensures correct corner styling. */\n.ui-screen-hidden {\n\tdisplay: none !important;\n}\n/* Transitions originally inspired by those from jQtouch, nice work, folks */\n.ui-mobile-viewport-transitioning,\n.ui-mobile-viewport-transitioning .ui-page {\n\twidth: 100%;\n\theight: 100%;\n\toverflow: hidden;\n\t-webkit-box-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\tbox-sizing: border-box;\n}\n.ui-page-pre-in {\n\topacity: 0;\n}\n.in {\n\t-webkit-animation-timing-function: ease-out;\n\t-webkit-animation-duration: 350ms;\n\t-moz-animation-timing-function: ease-out;\n\t-moz-animation-duration: 350ms;\n\tanimation-timing-function: ease-out;\n\tanimation-duration: 350ms;\n}\n.out {\n\t-webkit-animation-timing-function: ease-in;\n\t-webkit-animation-duration: 225ms;\n\t-moz-animation-timing-function: ease-in;\n\t-moz-animation-duration: 225ms;\n\tanimation-timing-function: ease-in;\n\tanimation-duration: 225ms;\n}\n@-webkit-keyframes fadein {\n    from { opacity: 0; }\n    to { opacity: 1; }\n}\n@-moz-keyframes fadein {\n    from { opacity: 0; }\n    to { opacity: 1; }\n}\n@keyframes fadein {\n    from { opacity: 0; }\n    to { opacity: 1; }\n}\n@-webkit-keyframes fadeout {\n    from { opacity: 1; }\n    to { opacity: 0; }\n}\n@-moz-keyframes fadeout {\n    from { opacity: 1; }\n    to { opacity: 0; }\n}\n@keyframes fadeout {\n    from { opacity: 1; }\n    to { opacity: 0; }\n}\n.fade.out {\n\topacity: 0;\n\t-webkit-animation-duration: 125ms;\n\t-webkit-animation-name: fadeout;\n\t-moz-animation-duration: 125ms;\n\t-moz-animation-name: fadeout;\n\tanimation-duration: 125ms;\n\tanimation-name: fadeout;\n}\n.fade.in {\n\topacity: 1;\n\t-webkit-animation-duration: 225ms;\n\t-webkit-animation-name: fadein;\n\t-moz-animation-duration: 225ms;\n\t-moz-animation-name: fadein;\n\tanimation-duration: 225ms;\n\tanimation-name: fadein;\n}\n.pop {\n\t-webkit-transform-origin: 50% 50%;\n\t-moz-transform-origin: 50% 50%;\n\ttransform-origin: 50% 50%;\n}\n.pop.in {\n\t-webkit-transform: scale(1);\n\t-webkit-animation-name: popin;\n\t-webkit-animation-duration: 350ms;\n\t-moz-transform: scale(1);\n\t-moz-animation-name: popin;\n\t-moz-animation-duration: 350ms;\n\ttransform: scale(1);\n\tanimation-name: popin;\n\tanimation-duration: 350ms;\n    opacity: 1;\n}\n.pop.out {\n\t-webkit-animation-name: fadeout;\n\t-webkit-animation-duration: 100ms;\n\t-moz-animation-name: fadeout;\n\t-moz-animation-duration: 100ms;\n\tanimation-name: fadeout;\n\tanimation-duration: 100ms;\n\topacity: 0;\n}\n.pop.in.reverse {\n\t-webkit-animation-name: fadein;\n\t-moz-animation-name: fadein;\n\tanimation-name: fadein;\n}\n.pop.out.reverse {\n\t-webkit-transform: scale(.8);\n\t-webkit-animation-name: popout;\n\t-moz-transform: scale(.8);\n\t-moz-animation-name: popout;\n\ttransform: scale(.8);\n\tanimation-name: popout;\n}\n@-webkit-keyframes popin {\n    from {\n        -webkit-transform: scale(.8);\n        opacity: 0;\n    }\n    to {\n        -webkit-transform: scale(1);\n        opacity: 1;\n    }\n}\n@-moz-keyframes popin {\n    from {\n        -moz-transform: scale(.8);\n        opacity: 0;\n    }\n    to {\n        -moz-transform: scale(1);\n        opacity: 1;\n    }\n}\n@keyframes popin {\n    from {\n        transform: scale(.8);\n        opacity: 0;\n    }\n    to {\n        transform: scale(1);\n        opacity: 1;\n    }\n}\n@-webkit-keyframes popout {\n    from {\n        -webkit-transform: scale(1);\n        opacity: 1;\n    }\n    to {\n        -webkit-transform: scale(.8);\n        opacity: 0;\n    }\n}\n@-moz-keyframes popout {\n    from {\n        -moz-transform: scale(1);\n        opacity: 1;\n    }\n    to {\n        -moz-transform: scale(.8);\n        opacity: 0;\n    }\n}\n@keyframes popout {\n    from {\n        transform: scale(1);\n        opacity: 1;\n    }\n    to {\n        transform: scale(.8);\n        opacity: 0;\n    }\n}\n/* keyframes for slidein from sides */\n@-webkit-keyframes slideinfromright {\n    from { -webkit-transform: translate3d(100%,0,0); }\n    to { -webkit-transform: translate3d(0,0,0); }\n}\n@-moz-keyframes slideinfromright {\n    from { -moz-transform: translateX(100%); }\n    to { -moz-transform: translateX(0); }\n}\n@keyframes slideinfromright {\n    from { transform: translateX(100%); }\n    to { transform: translateX(0); }\n}\n@-webkit-keyframes slideinfromleft {\n    from { -webkit-transform: translate3d(-100%,0,0); }\n    to { -webkit-transform: translate3d(0,0,0); }\n}\n@-moz-keyframes slideinfromleft {\n    from { -moz-transform: translateX(-100%); }\n    to { -moz-transform: translateX(0); }\n}\n@keyframes slideinfromleft {\n    from { transform: translateX(-100%); }\n    to { transform: translateX(0); }\n}\n/* keyframes for slideout to sides */\n@-webkit-keyframes slideouttoleft {\n    from { -webkit-transform: translate3d(0,0,0); }\n    to { -webkit-transform: translate3d(-100%,0,0); }\n}\n@-moz-keyframes slideouttoleft {\n    from { -moz-transform: translateX(0); }\n    to { -moz-transform: translateX(-100%); }\n}\n@keyframes slideouttoleft {\n    from { transform: translateX(0); }\n    to { transform: translateX(-100%); }\n}\n@-webkit-keyframes slideouttoright {\n    from { -webkit-transform: translate3d(0,0,0); }\n    to { -webkit-transform: translate3d(100%,0,0); }\n}\n@-moz-keyframes slideouttoright {\n    from { -moz-transform: translateX(0); }\n    to { -moz-transform: translateX(100%); }\n}\n@keyframes slideouttoright {\n    from { transform: translateX(0); }\n    to { transform: translateX(100%); }\n}\n.slide.out, .slide.in {\n\t-webkit-animation-timing-function: ease-out;\n\t-webkit-animation-duration: 350ms;\n\t-moz-animation-timing-function: ease-out;\n\t-moz-animation-duration: 350ms;\n\tanimation-timing-function: ease-out;\n\tanimation-duration: 350ms;\n}\n.slide.out {\n\t-webkit-transform: translate3d(-100%,0,0);\n\t-webkit-animation-name: slideouttoleft;\n\t-moz-transform: translateX(-100%);\n\t-moz-animation-name: slideouttoleft;\n\ttransform: translateX(-100%);\n\tanimation-name: slideouttoleft;\n}\n.slide.in {\n\t-webkit-transform: translate3d(0,0,0);\n\t-webkit-animation-name: slideinfromright;\n\t-moz-transform: translateX(0);\n\t-moz-animation-name: slideinfromright;\n\ttransform: translateX(0);\n\tanimation-name: slideinfromright;\n}\n.slide.out.reverse {\n\t-webkit-transform: translate3d(100%,0,0);\n\t-webkit-animation-name: slideouttoright;\n\t-moz-transform: translateX(100%);\n\t-moz-animation-name: slideouttoright;\n\ttransform: translateX(100%);\n\tanimation-name: slideouttoright;\n}\n.slide.in.reverse {\n\t-webkit-transform: translate3d(0,0,0);\n\t-webkit-animation-name: slideinfromleft;\n\t-moz-transform: translateX(0);\n\t-moz-animation-name: slideinfromleft;\n\ttransform: translateX(0);\n\tanimation-name: slideinfromleft;\n}\n.slidefade.out {\n\t-webkit-transform: translateX(-100%);\n\t-webkit-animation-name: slideouttoleft;\n\t-webkit-animation-duration: 225ms;\n\t-moz-transform: translateX(-100%);\n\t-moz-animation-name: slideouttoleft;\n\t-moz-animation-duration: 225ms;\n\ttransform: translateX(-100%);\n\tanimation-name: slideouttoleft;\n\tanimation-duration: 225ms;\n}\n.slidefade.in {\n\t-webkit-transform: translateX(0);\n\t-webkit-animation-name: fadein;\n\t-webkit-animation-duration: 200ms;\n\t-moz-transform: translateX(0);\n\t-moz-animation-name: fadein;\n\t-moz-animation-duration: 200ms;\n\ttransform: translateX(0);\n\tanimation-name: fadein;\n\tanimation-duration: 200ms;\n}\n.slidefade.out.reverse {\n\t-webkit-transform: translateX(100%);\n\t-webkit-animation-name: slideouttoright;\n\t-webkit-animation-duration: 200ms;\n\t-moz-transform: translateX(100%);\n\t-moz-animation-name: slideouttoright;\n\t-moz-animation-duration: 200ms;\n\ttransform: translateX(100%);\n\tanimation-name: slideouttoright;\n\tanimation-duration: 200ms;\n}\n.slidefade.in.reverse {\n\t-webkit-transform: translateX(0);\n\t-webkit-animation-name: fadein;\n\t-webkit-animation-duration: 200ms;\n\t-moz-transform: translateX(0);\n\t-moz-animation-name: fadein;\n\t-moz-animation-duration: 200ms;\n\ttransform: translateX(0);\n\tanimation-name: fadein;\n\tanimation-duration: 200ms;\n}\n/* slide down */\n.slidedown.out {\n\t-webkit-animation-name: fadeout;\n\t-webkit-animation-duration: 100ms;\n\t-moz-animation-name: fadeout;\n\t-moz-animation-duration: 100ms;\n\tanimation-name: fadeout;\n\tanimation-duration: 100ms;\n}\n.slidedown.in {\n\t-webkit-transform: translateY(0);\n\t-webkit-animation-name: slideinfromtop;\n\t-webkit-animation-duration: 250ms;\n\t-moz-transform: translateY(0);\n\t-moz-animation-name: slideinfromtop;\n\t-moz-animation-duration: 250ms;\n\ttransform: translateY(0);\n\tanimation-name: slideinfromtop;\n\tanimation-duration: 250ms;\n}\n.slidedown.in.reverse {\n\t-webkit-animation-name: fadein;\n\t-webkit-animation-duration: 150ms;\n\t-moz-animation-name: fadein;\n\t-moz-animation-duration: 150ms;\n\tanimation-name: fadein;\n\tanimation-duration: 150ms;\n}\n.slidedown.out.reverse {\n\t-webkit-transform: translateY(-100%);\n\t-webkit-animation-name: slideouttotop;\n\t-webkit-animation-duration: 200ms;\n\t-moz-transform: translateY(-100%);\n\t-moz-animation-name: slideouttotop;\n\t-moz-animation-duration: 200ms;\n\ttransform: translateY(-100%);\n\tanimation-name: slideouttotop;\n\tanimation-duration: 200ms;\n}\n@-webkit-keyframes slideinfromtop {\n    from { -webkit-transform: translateY(-100%); }\n    to { -webkit-transform: translateY(0); }\n}\n@-moz-keyframes slideinfromtop {\n    from { -moz-transform: translateY(-100%); }\n    to { -moz-transform: translateY(0); }\n}\n@keyframes slideinfromtop {\n    from { transform: translateY(-100%); }\n    to { transform: translateY(0); }\n}\n@-webkit-keyframes slideouttotop {\n    from { -webkit-transform: translateY(0); }\n    to { -webkit-transform: translateY(-100%); }\n}\n@-moz-keyframes slideouttotop {\n    from { -moz-transform: translateY(0); }\n    to { -moz-transform: translateY(-100%); }\n}\n@keyframes slideouttotop {\n    from { transform: translateY(0); }\n    to { transform: translateY(-100%); }\n}\n/* slide up */\n.slideup.out {\n\t-webkit-animation-name: fadeout;\n\t-webkit-animation-duration: 100ms;\n\t-moz-animation-name: fadeout;\n\t-moz-animation-duration: 100ms;\n\tanimation-name: fadeout;\n\tanimation-duration: 100ms;\n}\n.slideup.in {\n\t-webkit-transform: translateY(0);\n\t-webkit-animation-name: slideinfrombottom;\n\t-webkit-animation-duration: 250ms;\n\t-moz-transform: translateY(0);\n\t-moz-animation-name: slideinfrombottom;\n\t-moz-animation-duration: 250ms;\n\ttransform: translateY(0);\n\tanimation-name: slideinfrombottom;\n\tanimation-duration: 250ms;\n}\n.slideup.in.reverse {\n\t-webkit-animation-name: fadein;\n\t-webkit-animation-duration: 150ms;\n\t-moz-animation-name: fadein;\n\t-moz-animation-duration: 150ms;\n\tanimation-name: fadein;\n\tanimation-duration: 150ms;\n}\n.slideup.out.reverse {\n\t-webkit-transform: translateY(100%);\n\t-webkit-animation-name: slideouttobottom;\n\t-webkit-animation-duration: 200ms;\n\t-moz-transform: translateY(100%);\n\t-moz-animation-name: slideouttobottom;\n\t-moz-animation-duration: 200ms;\n\ttransform: translateY(100%);\n\tanimation-name: slideouttobottom;\n\tanimation-duration: 200ms;\n}\n@-webkit-keyframes slideinfrombottom {\n    from { -webkit-transform: translateY(100%); }\n    to { -webkit-transform: translateY(0); }\n}\n@-moz-keyframes slideinfrombottom {\n    from { -moz-transform: translateY(100%); }\n    to { -moz-transform: translateY(0); }\n}\n@keyframes slideinfrombottom {\n    from { transform: translateY(100%); }\n    to { transform: translateY(0); }\n}\n@-webkit-keyframes slideouttobottom {\n    from { -webkit-transform: translateY(0); }\n    to { -webkit-transform: translateY(100%); }\n}\n@-moz-keyframes slideouttobottom {\n    from { -moz-transform: translateY(0); }\n    to { -moz-transform: translateY(100%); }\n}\n@keyframes slideouttobottom {\n    from { transform: translateY(0); }\n    to { transform: translateY(100%); }\n}\n/* The properties in this rule are only necessary for the 'flip' transition.\n * We need specify the perspective to create a projection matrix. This will add\n * some depth as the element flips. The depth number represents the distance of\n * the viewer from the z-plane. According to the CSS3 spec, 1000 is a moderate\n * value.\n */\n.viewport-flip {\n\t-webkit-perspective: 1000;\n\t-moz-perspective: 1000;\n\tperspective: 1000;\n\tposition: absolute;\n}\n.flip {\n\t-webkit-backface-visibility: hidden;\n\t-webkit-transform: translateX(0); /* Needed to work around an iOS 3.1 bug that causes listview thumbs to disappear when -webkit-visibility:hidden is used. */\n\t-moz-backface-visibility: hidden;\n\t-moz-transform: translateX(0);\n\tbackface-visibility: hidden;\n\ttransform: translateX(0);\n}\n.flip.out {\n\t-webkit-transform: rotateY(-90deg) scale(.9);\n\t-webkit-animation-name: flipouttoleft;\n\t-webkit-animation-duration: 175ms;\n\t-moz-transform: rotateY(-90deg) scale(.9);\n\t-moz-animation-name: flipouttoleft;\n\t-moz-animation-duration: 175ms;\n\ttransform: rotateY(-90deg) scale(.9);\n\tanimation-name: flipouttoleft;\n\tanimation-duration: 175ms;\n}\n.flip.in {\n\t-webkit-animation-name: flipintoright;\n\t-webkit-animation-duration: 225ms;\n\t-moz-animation-name: flipintoright;\n\t-moz-animation-duration: 225ms;\n\tanimation-name: flipintoright;\n\tanimation-duration: 225ms;\n}\n.flip.out.reverse {\n\t-webkit-transform: rotateY(90deg) scale(.9);\n\t-webkit-animation-name: flipouttoright;\n\t-moz-transform: rotateY(90deg) scale(.9);\n\t-moz-animation-name: flipouttoright;\n\ttransform: rotateY(90deg) scale(.9);\n\tanimation-name: flipouttoright;\n}\n.flip.in.reverse {\n\t-webkit-animation-name: flipintoleft;\n\t-moz-animation-name: flipintoleft;\n\tanimation-name: flipintoleft;\n}\n@-webkit-keyframes flipouttoleft {\n    from { -webkit-transform: rotateY(0); }\n    to { -webkit-transform: rotateY(-90deg) scale(.9); }\n}\n@-moz-keyframes flipouttoleft {\n    from { -moz-transform: rotateY(0); }\n    to { -moz-transform: rotateY(-90deg) scale(.9); }\n}\n@keyframes flipouttoleft {\n    from { transform: rotateY(0); }\n    to { transform: rotateY(-90deg) scale(.9); }\n}\n@-webkit-keyframes flipouttoright {\n    from { -webkit-transform: rotateY(0) ; }\n    to { -webkit-transform: rotateY(90deg) scale(.9); }\n}\n@-moz-keyframes flipouttoright {\n    from { -moz-transform: rotateY(0); }\n    to { -moz-transform: rotateY(90deg) scale(.9); }\n}\n@keyframes flipouttoright {\n    from { transform: rotateY(0); }\n    to { transform: rotateY(90deg) scale(.9); }\n}\n@-webkit-keyframes flipintoleft {\n    from { -webkit-transform: rotateY(-90deg) scale(.9); }\n    to { -webkit-transform: rotateY(0); }\n}\n@-moz-keyframes flipintoleft {\n    from { -moz-transform: rotateY(-90deg) scale(.9); }\n    to { -moz-transform: rotateY(0); }\n}\n@keyframes flipintoleft {\n    from { transform: rotateY(-90deg) scale(.9); }\n    to { transform: rotateY(0); }\n}\n@-webkit-keyframes flipintoright {\n    from { -webkit-transform: rotateY(90deg) scale(.9); }\n    to { -webkit-transform: rotateY(0); }\n}\n@-moz-keyframes flipintoright {\n    from { -moz-transform: rotateY(90deg) scale(.9); }\n    to { -moz-transform: rotateY(0); }\n}\n@keyframes flipintoright {\n    from { transform: rotateY(90deg) scale(.9); }\n    to { transform: rotateY(0); }\n}\n/* The properties in this rule are only necessary for the 'flip' transition.\n * We need specify the perspective to create a projection matrix. This will add\n * some depth as the element flips. The depth number represents the distance of\n * the viewer from the z-plane. According to the CSS3 spec, 1000 is a moderate\n * value.\n */\n.viewport-turn {\n\t-webkit-perspective: 200px;\n\t-moz-perspective: 200px;\n\t-ms-perspective: 200px;\n\tperspective: 200px;\n\tposition: absolute;\n}\n.turn {\n\t-webkit-backface-visibility: hidden;\n\t-webkit-transform: translateX(0); /* Needed to work around an iOS 3.1 bug that causes listview thumbs to disappear when -webkit-visibility:hidden is used. */\n\t-webkit-transform-origin: 0;\n\t\n\t-moz-backface-visibility: hidden;\n\t-moz-transform: translateX(0);\n\t-moz-transform-origin: 0;\n\t\n\tbackface-visibility :hidden;\n\ttransform: translateX(0);\n\ttransform-origin: 0;\n}\n.turn.out {\n\t-webkit-transform: rotateY(-90deg) scale(.9);\n\t-webkit-animation-name: flipouttoleft;\n\t-webkit-animation-duration: 125ms;\n\t-moz-transform: rotateY(-90deg) scale(.9);\n\t-moz-animation-name: flipouttoleft;\n\t-moz-animation-duration: 125ms;\n\ttransform: rotateY(-90deg) scale(.9);\n\tanimation-name: flipouttoleft;\n\tanimation-duration: 125ms;\n}\n.turn.in {\n\t-webkit-animation-name: flipintoright;\n\t-webkit-animation-duration: 250ms;\n\t-moz-animation-name: flipintoright;\n\t-moz-animation-duration: 250ms;\n\tanimation-name: flipintoright;\n\tanimation-duration: 250ms;\n\t\n}\n.turn.out.reverse {\n\t-webkit-transform: rotateY(90deg) scale(.9);\n\t-webkit-animation-name: flipouttoright;\n\t-moz-transform: rotateY(90deg) scale(.9);\n\t-moz-animation-name: flipouttoright;\n\ttransform: rotateY(90deg) scale(.9);\n\tanimation-name: flipouttoright;\n}\n.turn.in.reverse {\n\t-webkit-animation-name: flipintoleft;\n\t-moz-animation-name: flipintoleft;\n\tanimation-name: flipintoleft;\n}\n@-webkit-keyframes flipouttoleft {\n    from { -webkit-transform: rotateY(0); }\n    to { -webkit-transform: rotateY(-90deg) scale(.9); }\n}\n@-moz-keyframes flipouttoleft {\n    from { -moz-transform: rotateY(0); }\n    to { -moz-transform: rotateY(-90deg) scale(.9); }\n}\n@keyframes flipouttoleft {\n    from { transform: rotateY(0); }\n    to { transform: rotateY(-90deg) scale(.9); }\n}\n@-webkit-keyframes flipouttoright {\n    from { -webkit-transform: rotateY(0) ; }\n    to { -webkit-transform: rotateY(90deg) scale(.9); }\n}\n@-moz-keyframes flipouttoright {\n    from { -moz-transform: rotateY(0); }\n    to { -moz-transform: rotateY(90deg) scale(.9); }\n}\n@keyframes flipouttoright {\n    from { transform: rotateY(0); }\n    to { transform: rotateY(90deg) scale(.9); }\n}\n@-webkit-keyframes flipintoleft {\n    from { -webkit-transform: rotateY(-90deg) scale(.9); }\n    to { -webkit-transform: rotateY(0); }\n}\n@-moz-keyframes flipintoleft {\n    from { -moz-transform: rotateY(-90deg) scale(.9); }\n    to { -moz-transform: rotateY(0); }\n}\n@keyframes flipintoleft {\n    from { transform: rotateY(-90deg) scale(.9); }\n    to { transform: rotateY(0); }\n}\n@-webkit-keyframes flipintoright {\n    from { -webkit-transform: rotateY(90deg) scale(.9); }\n    to { -webkit-transform: rotateY(0); }\n}\n@-moz-keyframes flipintoright {\n    from { -moz-transform: rotateY(90deg) scale(.9); }\n    to { -moz-transform: rotateY(0); }\n}\n@keyframes flipintoright {\n    from { transform: rotateY(90deg) scale(.9); }\n    to { transform: rotateY(0); }\n}\n/* flow transition */\n.flow {\n\t-webkit-transform-origin: 50% 30%;\n\t-webkit-box-shadow: 0 0 20px rgba(0,0,0,.4);\n\t-moz-transform-origin: 50% 30%;\t\n\t-moz-box-shadow: 0 0 20px rgba(0,0,0,.4);\n\ttransform-origin: 50% 30%;\t\n\tbox-shadow: 0 0 20px rgba(0,0,0,.4);\n}\n.ui-dialog.flow {\n\t-webkit-transform-origin: none;\n\t-webkit-box-shadow: none;\n\t-moz-transform-origin: none;\t\n\t-moz-box-shadow: none;\n\ttransform-origin: none;\t\n\tbox-shadow: none;\n}\n.flow.out {\n\t-webkit-transform: translateX(-100%) scale(.7);\n\t-webkit-animation-name: flowouttoleft;\n\t-webkit-animation-timing-function: ease;\n\t-webkit-animation-duration: 350ms;\n\t-moz-transform: translateX(-100%) scale(.7);\n\t-moz-animation-name: flowouttoleft;\n\t-moz-animation-timing-function: ease;\n\t-moz-animation-duration: 350ms;\n\ttransform: translateX(-100%) scale(.7);\n\tanimation-name: flowouttoleft;\n\tanimation-timing-function: ease;\n\tanimation-duration: 350ms;\n}\n.flow.in {\n\t-webkit-transform: translateX(0) scale(1);\n\t-webkit-animation-name: flowinfromright;\n\t-webkit-animation-timing-function: ease;\n\t-webkit-animation-duration: 350ms;\n\t-moz-transform: translateX(0) scale(1);\n\t-moz-animation-name: flowinfromright;\n\t-moz-animation-timing-function: ease;\n\t-moz-animation-duration: 350ms;\n\ttransform: translateX(0) scale(1);\n\tanimation-name: flowinfromright;\n\tanimation-timing-function: ease;\n\tanimation-duration: 350ms;\n}\n.flow.out.reverse {\n\t-webkit-transform: translateX(100%);\n\t-webkit-animation-name: flowouttoright;\n\t-moz-transform: translateX(100%);\n\t-moz-animation-name: flowouttoright;\n\ttransform: translateX(100%);\n\tanimation-name: flowouttoright;\n}\n.flow.in.reverse {\n\t-webkit-animation-name: flowinfromleft;\n\t-moz-animation-name: flowinfromleft;\n\tanimation-name: flowinfromleft;\n}\n@-webkit-keyframes flowouttoleft {\n    0% { -webkit-transform: translateX(0) scale(1); }\n\t60%, 70% { -webkit-transform: translateX(0) scale(.7); }\n    100% { -webkit-transform: translateX(-100%) scale(.7); }\n}\n@-moz-keyframes flowouttoleft {\n    0% { -moz-transform: translateX(0) scale(1); }\n\t60%, 70% { -moz-transform: translateX(0) scale(.7); }\n    100% { -moz-transform:  translateX(-100%) scale(.7); }\n}\n@keyframes flowouttoleft {\n    0% { transform: translateX(0) scale(1); }\n\t60%, 70% { transform: translateX(0) scale(.7); }\n    100% { transform:  translateX(-100%) scale(.7); }\n}\n@-webkit-keyframes flowouttoright {\n    0% { -webkit-transform: translateX(0) scale(1); }\n\t60%, 70% { -webkit-transform: translateX(0) scale(.7); }\n    100% { -webkit-transform:  translateX(100%) scale(.7); }\n}\n@-moz-keyframes flowouttoright {\n    0% { -moz-transform: translateX(0) scale(1); }\n\t60%, 70% { -moz-transform: translateX(0) scale(.7); }\n    100% { -moz-transform:  translateX(100%) scale(.7); }\n}\n@keyframes flowouttoright {\n    0% { transform: translateX(0) scale(1); }\n\t60%, 70% { transform: translateX(0) scale(.7); }\n    100% { transform:  translateX(100%) scale(.7); }\n}\n@-webkit-keyframes flowinfromleft {\n    0% { -webkit-transform: translateX(-100%) scale(.7); }\n\t30%, 40% { -webkit-transform: translateX(0) scale(.7); }\n    100% { -webkit-transform: translateX(0) scale(1); }\n}\n@-moz-keyframes flowinfromleft {\n    0% { -moz-transform: translateX(-100%) scale(.7); }\n\t30%, 40% { -moz-transform: translateX(0) scale(.7); }\n    100% { -moz-transform: translateX(0) scale(1); }\n}\n@keyframes flowinfromleft {\n    0% { transform: translateX(-100%) scale(.7); }\n\t30%, 40% { transform: translateX(0) scale(.7); }\n    100% { transform: translateX(0) scale(1); }\n}\n@-webkit-keyframes flowinfromright {\n    0% { -webkit-transform: translateX(100%) scale(.7); }\n\t30%, 40% { -webkit-transform: translateX(0) scale(.7); }\n    100% { -webkit-transform: translateX(0) scale(1); }\n}\n@-moz-keyframes flowinfromright {\n    0% { -moz-transform: translateX(100%) scale(.7); }\n\t30%, 40% { -moz-transform: translateX(0) scale(.7); }\n    100% { -moz-transform: translateX(0) scale(1); }\n}\n@keyframes flowinfromright {\n    0% { transform: translateX(100%) scale(.7); }\n\t30%, 40% { transform: translateX(0) scale(.7); }\n    100% { transform: translateX(0) scale(1); }\n}\n.ui-field-contain,\n.ui-mobile fieldset.ui-field-contain {\n\tdisplay: block;\n\tposition: relative;\n\toverflow: visible;\n\tclear: both;\n\tpadding: .8em 0;\n}\n.ui-field-contain > label ~ [class*=\"ui-\"],\n.ui-field-contain .ui-controlgroup-controls {\n\tmargin: 0;\n}\n.ui-field-contain:last-child {\n\tborder-bottom-width: 0;\n}\n@media (min-width: 28em) {\n\t.ui-field-contain,\n\t.ui-mobile fieldset.ui-field-contain {\n\t\tpadding: 0;\n\t\tmargin: 1em 0;\n\t\tborder-bottom-width: 0;\n\t}\n\t.ui-field-contain:before,\n\t.ui-field-contain:after {\n\t\tcontent: \"\";\n\t\tdisplay: table;\n\t}\n\t.ui-field-contain:after {\n\t\tclear: both;\n\t}\n\t.ui-field-contain > label,\n\t.ui-field-contain .ui-controlgroup-label,\n\t.ui-field-contain > .ui-rangeslider > label {\n\t\tfloat: left;\n\t\twidth: 20%;\n\t\tmargin: .5em 2% 0 0;\n\t}\n\t.ui-popup .ui-field-contain > label,\n\t.ui-popup .ui-field-contain .ui-controlgroup-label,\n\t.ui-popup .ui-field-contain > .ui-rangeslider > label {\n\t\tfloat: none;\n\t\twidth: auto;\n\t\tmargin: 0 0 .4em;\n\t}\n\t.ui-field-contain > label ~ [class*=\"ui-\"],\n\t.ui-field-contain .ui-controlgroup-controls {\n\t\tfloat: left;\n\t\twidth: 78%;\n\t\t-webkit-box-sizing: border-box;\n\t\t-moz-box-sizing: border-box;\n\t\tbox-sizing: border-box;\n\t}\n\t/* ui-hide-label deprecated in 1.4. TODO: Remove in 1.5 */\n\t.ui-hide-label > label ~ [class*=\"ui-\"],\n\t.ui-hide-label .ui-controlgroup-controls,\n\t.ui-popup .ui-field-contain > label ~ [class*=\"ui-\"],\n\t.ui-popup .ui-field-contain .ui-controlgroup-controls {\n\t\tfloat: none;\n\t\twidth: 100%;\n\t}\n\t.ui-field-contain > label ~ .ui-btn-inline {\n\t\twidth: auto;\n\t\tmargin-right: .625em;\n\t}\n\t.ui-field-contain > label ~ .ui-btn-inline.ui-btn-icon-notext {\n\t\twidth: 1.75em;\n\t}\n}\n/* content configurations. */\n.ui-grid-a,\n.ui-grid-b,\n.ui-grid-c,\n.ui-grid-d,\n.ui-grid-solo {\n\toverflow: hidden;\n}\n.ui-block-a,\n.ui-block-b,\n.ui-block-c,\n.ui-block-d,\n.ui-block-e {\n\tmargin: 0;\n\tpadding: 0;\n\tborder: 0;\n\tfloat: left;\n\tmin-height: 1px;\n\t-webkit-box-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\tbox-sizing: border-box;\n}\n/* force new row */\n.ui-block-a {\n\tclear: left;\n}\nul.ui-grid-a,\nul.ui-grid-b,\nul.ui-grid-c,\nul.ui-grid-d,\nul.ui-grid-solo,\nli.ui-block-a,\nli.ui-block-b,\nli.ui-block-c,\nli.ui-block-d,\nli.ui-block-e {\n\tmargin-left: 0;\n\tmargin-right: 0;\n\tpadding: 0;\n\tlist-style: none;\n}\n/* No margin in grids for 100% width button elements until we can use max-width: fill-available; */\n[class*=\"ui-block-\"] > button.ui-btn {\n\tmargin-right: 0;\n\tmargin-left: 0;\n}\n[class*=\"ui-block-\"] > .ui-btn,\n[class*=\"ui-block-\"] > .ui-select,\n[class*=\"ui-block-\"] > .ui-checkbox,\n[class*=\"ui-block-\"] > .ui-radio,\n[class*=\"ui-block-\"] > button.ui-btn-inline,\n[class*=\"ui-block-\"] > button.ui-btn-icon-notext,\n.ui-header [class*=\"ui-block-\"] > button.ui-btn,\n.ui-footer [class*=\"ui-block-\"] > button.ui-btn {\n\tmargin-right: .3125em;\n\tmargin-left: .3125em;\n}\n.ui-grid-a > .ui-block-a,\n.ui-grid-a > .ui-block-b {\n\t/* width: 49.95%; IE7 */\n\t/* margin-right: -.5px; BB5 */\n\twidth: 50%;\n}\n.ui-grid-b > .ui-block-a,\n.ui-grid-b > .ui-block-b,\n.ui-grid-b > .ui-block-c {\n\t/* width: 33.25%; IE7 */\n\t/* margin-right: -.5px; BB5 */\n\twidth: 33.333%;\n}\n.ui-grid-c > .ui-block-a,\n.ui-grid-c > .ui-block-b,\n.ui-grid-c > .ui-block-c,\n.ui-grid-c > .ui-block-d {\n\t/* width: 24.925%; IE7 */\n\t/* margin-right: -.5px; BB5 */\n\twidth: 25%;\n}\n.ui-grid-d > .ui-block-a,\n.ui-grid-d > .ui-block-b,\n.ui-grid-d > .ui-block-c,\n.ui-grid-d > .ui-block-d,\n.ui-grid-d > .ui-block-e {\n\t/* width: 19.925%; IE7 */\n\twidth: 20%;\n}\n.ui-grid-solo > .ui-block-a {\n\twidth: 100%;\n\tfloat: none; \n}\n/* preset breakpoint to switch to stacked grid styles below 35em (560px) */\n@media (max-width: 35em) {\n\t.ui-responsive > .ui-block-a,\n\t.ui-responsive > .ui-block-b,\n\t.ui-responsive > .ui-block-c,\n\t.ui-responsive > .ui-block-d,\n\t.ui-responsive > .ui-block-e {\n\t\twidth: 100%; \n\t\tfloat: none; \n\t}\n}\n/* fixed page header & footer configuration */\n.ui-header-fixed,\n.ui-footer-fixed {\n\tleft: 0;\n\tright: 0;\n\twidth: 100%;\n\tposition: fixed;\n\tz-index: 1000;\n}\n.ui-header-fixed {\n\ttop: -1px;\n\tpadding-top: 1px;\n}\n.ui-header-fixed.ui-fixed-hidden {\n\ttop: 0;\n\tpadding-top: 0;\n}\n.ui-header-fixed .ui-btn-left,\n.ui-header-fixed .ui-btn-right {\n\tmargin-top: 1px;\n}\n.ui-header-fixed.ui-fixed-hidden .ui-btn-left,\n.ui-header-fixed.ui-fixed-hidden .ui-btn-right {\n\tmargin-top: 0;\n}\n.ui-footer-fixed {\n\tbottom: -1px;\n\tpadding-bottom: 1px;\n}\n.ui-footer-fixed.ui-fixed-hidden {\n\tbottom: 0;\n\tpadding-bottom: 0;\n}\n.ui-header-fullscreen,\n.ui-footer-fullscreen {\n\tfilter: Alpha(Opacity=90);\n\topacity: .9;\n}\n/* updatePagePadding() will update the padding to actual height of header and footer. */\n.ui-page-header-fixed {\n\tpadding-top: 2.8125em;\n}\n.ui-page-footer-fixed {\n\tpadding-bottom: 2.8125em;\n}\n.ui-page-header-fullscreen > .ui-content,\n.ui-page-footer-fullscreen > .ui-content {\n\tpadding: 0;\n}\n.ui-fixed-hidden {\n\tposition: absolute;\n}\n/* Tap toggle: hide external fixed footer. See issue #6604 */\n.ui-footer-fixed.ui-fixed-hidden {\n  display: none;\n}\n.ui-page .ui-footer-fixed.ui-fixed-hidden {\n  display: block\n}\n.ui-page-header-fullscreen .ui-fixed-hidden,\n.ui-page-footer-fullscreen .ui-fixed-hidden {\n\tposition: absolute !important;\n\theight: 1px;\n\twidth: 1px;\n\toverflow: hidden;\n\tclip: rect(1px,1px,1px,1px);\n}\n.ui-header-fixed .ui-btn,\n.ui-footer-fixed .ui-btn { \n\tz-index: 10;\n}\n/* workarounds for other widgets */\n.ui-android-2x-fixed .ui-li-has-thumb {\n\t-webkit-transform: translate3d(0,0,0);\n}\n.ui-navbar {\n\tmax-width: 100%;\n}\n.ui-navbar ul:before,\n.ui-navbar ul:after {\n\tcontent: \"\";\n\tdisplay: table;\n}\n.ui-navbar ul:after {\n\tclear: both;\n}\n.ui-navbar ul {\n\tlist-style: none;\n\tmargin: 0;\n\tpadding: 0;\n\tposition: relative;\n\tdisplay: block;\n\tborder: 0;\n\tmax-width: 100%;\n\toverflow: visible;\n}\n.ui-navbar li .ui-btn {\n\tfont-size: 12.5px;\n\tdisplay: block;\n\tmargin: 0;\n\tborder-right-width: 0;\n}\n.ui-header .ui-navbar li button.ui-btn,\n.ui-footer .ui-navbar li button.ui-btn {\n\tmargin: 0;\n\twidth: 100%;\n}\n.ui-navbar .ui-btn:focus {\n\tz-index: 1;\n}\n/* fixes gaps caused by subpixel problem */\n.ui-navbar li:last-child .ui-btn {\n\tmargin-right: -4px;\n}\n.ui-navbar li:last-child .ui-btn:after {\n\tmargin-right: 4px;\n}\n.ui-content .ui-navbar li:last-child .ui-btn,\n.ui-content .ui-navbar .ui-grid-duo .ui-block-b .ui-btn {\n\tborder-right-width: 1px;\n\tmargin-right: 0;\n}\n.ui-content .ui-navbar li:last-child .ui-btn:after,\n.ui-content .ui-navbar .ui-grid-duo .ui-block-b .ui-btn:after {\n\tmargin-right: 0;\n}\n.ui-navbar .ui-grid-duo .ui-block-a:last-child .ui-btn {\n\tborder-right-width: 1px;\n\tmargin-right: -1px;\n}\n.ui-navbar .ui-grid-duo .ui-block-a:last-child .ui-btn:after {\n\tmargin-right: 1px;\n}\n.ui-navbar .ui-grid-duo .ui-btn {\n\tborder-top-width: 0;\n}\n.ui-navbar .ui-grid-duo .ui-block-a:first-child .ui-btn,\n.ui-navbar .ui-grid-duo .ui-block-a:first-child + .ui-block-b .ui-btn {\n\tborder-top-width: 1px;\n}\n.ui-header .ui-navbar .ui-btn,\n.ui-footer .ui-navbar .ui-btn {\n\tborder-top-width: 0;\n\tborder-bottom-width: 0;\n}\n.ui-header .ui-navbar .ui-grid-duo .ui-block-a:first-child .ui-btn,\n.ui-footer .ui-navbar .ui-grid-duo .ui-block-a:first-child .ui-btn,\n.ui-header .ui-navbar .ui-grid-duo .ui-block-a:first-child + .ui-block-b .ui-btn,\n.ui-footer .ui-navbar .ui-grid-duo .ui-block-a:first-child + .ui-block-b .ui-btn {\n\tborder-top-width: 0;\n}\n.ui-header .ui-title ~ .ui-navbar .ui-btn,\n.ui-footer .ui-title ~ .ui-navbar .ui-btn,\n.ui-header .ui-navbar .ui-grid-duo .ui-btn,\n.ui-footer .ui-navbar .ui-grid-duo .ui-btn,\n.ui-header .ui-title ~ .ui-navbar .ui-grid-duo .ui-block-a:first-child .ui-btn,\n.ui-footer .ui-title ~ .ui-navbar .ui-grid-duo .ui-block-a:first-child .ui-btn,\n.ui-header .ui-title ~ .ui-navbar .ui-grid-duo .ui-block-a:first-child + .ui-block-b .ui-btn,\n.ui-footer .ui-title ~ .ui-navbar .ui-grid-duo .ui-block-a:first-child + .ui-block-b .ui-btn {\n\tborder-top-width: 1px;\n}\n/* Hide the native input element */\n.ui-input-btn input {\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n\twidth: 100%;\n\theight: 100%;\n\tpadding: 0;\n\tborder: 0;\n\toutline: 0;\n\t-webkit-border-radius: inherit;\n\tborder-radius: inherit;\t\n\t-webkit-appearance: none;\n\t-moz-appearance: none;\n\tcursor: pointer;\n\tbackground: #fff;\n\tbackground: rgba(255,255,255,0);\n\tfilter: Alpha(Opacity=0);\n\topacity: .1;\n\tfont-size: 1px;\n\ttext-indent: -9999px;\n\tz-index: 2;\n}\n/* Fixes IE/WP filter alpha opacity bugs */\n.ui-input-btn.ui-state-disabled input {\n\tposition: absolute !important;\n\theight: 1px;\n\twidth: 1px;\n\toverflow: hidden;\n\tclip: rect(1px,1px,1px,1px);\n}\n.ui-collapsible {\n\tmargin: 0 -1em;\n}\n.ui-collapsible-inset,\n.ui-collapsible-set {\n\tmargin: .5em 0;\n}\n.ui-collapsible-heading {\n\tdisplay: block;\n\tmargin: 0;\n\tpadding: 0;\n\tposition: relative;\n}\n.ui-collapsible-heading .ui-btn {\n\ttext-align: left;\n\tmargin: 0;\n\tborder-left-width: 0;\n\tborder-right-width: 0;\n}\n.ui-collapsible-heading .ui-btn-icon-top,\n.ui-collapsible-heading .ui-btn-icon-bottom {\n\ttext-align: center;\n}\n.ui-collapsible-inset .ui-collapsible-heading .ui-btn {\n\tborder-right-width: 1px;\n\tborder-left-width: 1px;\n}\n.ui-collapsible-collapsed + .ui-collapsible:not(.ui-collapsible-inset) > .ui-collapsible-heading .ui-btn {\n\tborder-top-width: 0;\n}\n.ui-collapsible-set .ui-collapsible:not(.ui-collapsible-inset) .ui-collapsible-heading .ui-btn {\n\tborder-top-width: 1px;\n}\n.ui-collapsible-heading-status {\n\tposition: absolute !important;\n\theight: 1px;\n\twidth: 1px;\n\toverflow: hidden;\n\tclip: rect(1px,1px,1px,1px);\n}\n.ui-collapsible-content {\n\tdisplay: block;\n\tmargin: 0;\t\n\tpadding: .5em 1em;\n}\n.ui-collapsible-themed-content .ui-collapsible-content {\n\tborder-left-width: 0;\n\tborder-right-width: 0;\n\tborder-top-width: 0;\n\tborder-bottom-width: 1px;\n\tborder-style: solid;\n}\n.ui-collapsible-inset.ui-collapsible-themed-content .ui-collapsible-content {\n\tborder-left-width: 1px;\n\tborder-right-width: 1px;\n}\n.ui-collapsible-inset .ui-collapsible-content {\n\tmargin: 0;\n}\n.ui-collapsible-content-collapsed {\n\tdisplay: none;\n}\n.ui-collapsible-set > .ui-collapsible.ui-corner-all {\n\t-webkit-border-radius: 0;\n\tborder-radius: 0;\n}\n.ui-collapsible-heading,\n.ui-collapsible-heading > .ui-btn {\n\t-webkit-border-radius: inherit;\t\n\tborder-radius: inherit;\t\n}\n.ui-collapsible-set .ui-collapsible.ui-first-child {\n\t-webkit-border-top-right-radius: inherit;\t\n\tborder-top-right-radius: inherit;\n\t-webkit-border-top-left-radius: inherit;\t\n\tborder-top-left-radius: inherit;\t\t\n}\n.ui-collapsible-content,\n.ui-collapsible-set .ui-collapsible.ui-last-child {\n\t-webkit-border-bottom-right-radius: inherit;\t\n\tborder-bottom-right-radius: inherit;\n\t-webkit-border-bottom-left-radius: inherit;\t\n\tborder-bottom-left-radius: inherit;\t\t\n}\n.ui-collapsible-themed-content:not(.ui-collapsible-collapsed) > .ui-collapsible-heading {\n\t-webkit-border-bottom-right-radius: 0;\t\n\tborder-bottom-right-radius: 0;\n\t-webkit-border-bottom-left-radius: 0;\t\n\tborder-bottom-left-radius: 0;\t\t\n}\n.ui-collapsible-set .ui-collapsible {\n\tmargin: -1px -1em 0;\n}\n.ui-collapsible-set .ui-collapsible-inset {\n\tmargin: -1px 0 0;\n}\n.ui-collapsible-set .ui-collapsible.ui-first-child {\n\tmargin-top: 0;\n}\n.ui-controlgroup,\nfieldset.ui-controlgroup {\n\tpadding: 0;\n\tmargin: .5em 0;\n}\n.ui-field-contain .ui-controlgroup,\n.ui-field-contain fieldset.ui-controlgroup {\n\tmargin: 0;\n}\n.ui-mini .ui-controlgroup-label {\n\tfont-size: 16px;\n}\n.ui-controlgroup.ui-mini .ui-btn-icon-notext,\n.ui-controlgroup .ui-mini.ui-btn-icon-notext {\n\tfont-size: inherit;\n}\n.ui-controlgroup-controls .ui-btn,\n.ui-controlgroup-controls .ui-checkbox,\n.ui-controlgroup-controls .ui-radio,\n.ui-controlgroup-controls .ui-select {\n\tmargin: 0;\n}\n.ui-controlgroup-controls .ui-btn:focus,\n.ui-controlgroup-controls .ui-btn.ui-focus {\n\tz-index: 1;\n}\n.ui-controlgroup-controls li {\n\tlist-style: none;\n}\n.ui-controlgroup-horizontal .ui-controlgroup-controls {\n\tdisplay: inline-block;\n\tvertical-align: middle;\n}\n.ui-controlgroup-horizontal .ui-controlgroup-controls:before,\n.ui-controlgroup-horizontal .ui-controlgroup-controls:after {\n\tcontent: \"\";\n\tdisplay: table;\n}\n.ui-controlgroup-horizontal .ui-controlgroup-controls:after {\n\tclear: both;\n}\n.ui-controlgroup-horizontal .ui-controlgroup-controls > .ui-btn,\n.ui-controlgroup-horizontal .ui-controlgroup-controls li > .ui-btn,\n.ui-controlgroup-horizontal .ui-controlgroup-controls .ui-checkbox,\n.ui-controlgroup-horizontal .ui-controlgroup-controls .ui-radio,\n.ui-controlgroup-horizontal .ui-controlgroup-controls .ui-select {\n\tfloat: left;\n\tclear: none;\n}\n.ui-controlgroup-horizontal .ui-controlgroup-controls button.ui-btn,\n.ui-controlgroup-controls .ui-btn-icon-notext {\n\twidth: auto;\n}\n.ui-controlgroup-horizontal .ui-controlgroup-controls .ui-btn-icon-notext,\n.ui-controlgroup-horizontal .ui-controlgroup-controls button.ui-btn-icon-notext {\n\twidth: 1.5em;\n}\n .ui-controlgroup-controls .ui-btn-icon-notext {\n\theight: auto;\n\tpadding: .7em 1em;\n}\n.ui-controlgroup-vertical .ui-controlgroup-controls .ui-btn {\n\tborder-bottom-width: 0;\n}\n.ui-controlgroup-vertical .ui-controlgroup-controls .ui-btn.ui-last-child {\n\tborder-bottom-width: 1px;\n}\n.ui-controlgroup-horizontal .ui-controlgroup-controls .ui-btn {\n\tborder-right-width: 0;\n}\n.ui-controlgroup-horizontal .ui-controlgroup-controls .ui-btn.ui-last-child {\n\tborder-right-width: 1px;\n}\n.ui-controlgroup-controls .ui-btn-corner-all,\n.ui-controlgroup-controls .ui-btn.ui-corner-all {\n\t-webkit-border-radius: 0;\n\tborder-radius: 0;\n}\n.ui-controlgroup-controls,\n.ui-controlgroup-controls .ui-radio,\n.ui-controlgroup-controls .ui-checkbox,\n.ui-controlgroup-controls .ui-select,\n.ui-controlgroup-controls li {\n\t-webkit-border-radius: inherit;\n\tborder-radius: inherit;\n}\n.ui-controlgroup-vertical .ui-btn.ui-first-child {\n\t-webkit-border-top-left-radius: inherit;\n\tborder-top-left-radius: inherit;\n\t-webkit-border-top-right-radius: inherit;\n\tborder-top-right-radius: inherit;\n}\n.ui-controlgroup-vertical .ui-btn.ui-last-child {\n\t-webkit-border-bottom-left-radius: inherit;\n\tborder-bottom-left-radius: inherit;\n\t-webkit-border-bottom-right-radius: inherit;\n\tborder-bottom-right-radius: inherit;\n}\n.ui-controlgroup-horizontal .ui-btn.ui-first-child {\n\t-webkit-border-top-left-radius: inherit;\n\tborder-top-left-radius: inherit;\n\t-webkit-border-bottom-left-radius: inherit;\n\tborder-bottom-left-radius: inherit;\n}\n.ui-controlgroup-horizontal .ui-btn.ui-last-child {\n\t-webkit-border-top-right-radius: inherit;\n\tborder-top-right-radius: inherit;\n\t-webkit-border-bottom-right-radius: inherit;\n\tborder-bottom-right-radius: inherit;\n}\n.ui-controlgroup-controls a.ui-shadow:not(:focus),\n.ui-controlgroup-controls button.ui-shadow:not(:focus),\n.ui-controlgroup-controls div.ui-shadow:not(.ui-focus) {\n\t-moz-box-shadow: none;\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n}\n/* Fixes legend not wrapping on IE10 */\n.ui-controlgroup-label legend {\n\tmax-width: 100%;\n}\n.ui-controlgroup-controls > label {\n\tposition: absolute !important;\n\theight: 1px;\n\twidth: 1px;\n\toverflow: hidden;\n\tclip: rect(1px,1px,1px,1px);\n}\n.ui-dialog {\n\t background: none !important; /* this is to ensure that dialog theming does not apply (by default at least) on the page div */\n}\n.ui-dialog-contain {\n\twidth: 92.5%;\n\tmax-width: 500px;\n\tmargin: 10% auto 1em auto;\n\tpadding: 0;\n\tposition: relative;\n\ttop: -1em;\n}\n.ui-dialog-contain > .ui-header, \n.ui-dialog-contain > .ui-content, \n.ui-dialog-contain > .ui-footer { \n\tdisplay: block;\n\tposition: relative; \n\twidth: auto;\n\tmargin: 0;\n}\n.ui-dialog-contain > .ui-header {\n\toverflow: hidden;\n\tz-index: 10; \n\tpadding: 0;\n\tborder-top-width: 0;\n}\n.ui-dialog-contain > .ui-footer {\n\tz-index: 10; \n\tpadding: 0 1em; \n\tborder-bottom-width: 0;\n}\n.ui-popup-open .ui-header-fixed,\n.ui-popup-open .ui-footer-fixed {\n\tposition: absolute !important; /* See issues #4816, #4844 and #4874 and popup.js */\n}\n.ui-popup-screen {\n\tbackground-image: url(\"data:image/gif;base64,R0lGODlhAQABAID/AMDAwAAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==\"); /* Necessary to set some form of background to ensure element is clickable in IE6/7. While legacy IE won't understand the data-URI'd image, it ensures no additional requests occur in all other browsers with little overhead. */\n\ttop: 0;\n\tleft: 0;\n\tright: 0;\n\tbottom: 1px;\n\tposition: absolute;\n\tfilter: Alpha(Opacity=0);\n\topacity: 0;\n\tz-index: 1099;\n}\n.ui-popup-screen.in {\n\topacity: 0.5;\n\tfilter: Alpha(Opacity=50);\n}\n.ui-popup-screen.out {\n\topacity: 0;\n\tfilter: Alpha(Opacity=0);\n}\n.ui-popup-container {\n\tz-index: 1100;\n\tdisplay: inline-block;\n\tposition: absolute;\n\tpadding: 0;\n\toutline: 0;\n}\n.ui-popup {\n\tposition: relative;\n}\n.ui-popup.ui-body-inherit {\n\tborder-width: 1px;\n\tborder-style: solid;\n}\n.ui-popup-hidden {\n\tleft: 0;\n\ttop: 0;\n\tposition: absolute !important;\n\tvisibility: hidden;\n}\n.ui-popup-truncate {\n\theight: 1px;\n\twidth: 1px;\n\tmargin: -1px;\n\toverflow: hidden;\n\tclip: rect(1px,1px,1px,1px);\n}\n.ui-popup.ui-content,\n.ui-popup .ui-content {\n\toverflow: visible;\n}\n.ui-popup > .ui-header {\n\tborder-top-width: 0;\n}\n.ui-popup > .ui-footer {\n\tborder-bottom-width: 0;\n}\n.ui-popup > p,\n.ui-popup > h1,\n.ui-popup > h2,\n.ui-popup > h3,\n.ui-popup > h4,\n.ui-popup > h5,\n.ui-popup > h6 {\n\tmargin: .5em .4375em;\n}\n.ui-popup > span {\n\tdisplay: block;\n\tmargin: .5em .4375em;\n}\n.ui-popup-container .ui-content > p,\n.ui-popup-container .ui-content > h1,\n.ui-popup-container .ui-content > h2,\n.ui-popup-container .ui-content > h3,\n.ui-popup-container .ui-content > h4,\n.ui-popup-container .ui-content > h5,\n.ui-popup-container .ui-content > h6 {\n\tmargin: .5em 0;\n}\n.ui-popup-container .ui-content > span {\n\tmargin: 0;\n}\n.ui-popup-container .ui-content > p:first-child,\n.ui-popup-container .ui-content > h1:first-child,\n.ui-popup-container .ui-content > h2:first-child,\n.ui-popup-container .ui-content > h3:first-child,\n.ui-popup-container .ui-content > h4:first-child,\n.ui-popup-container .ui-content > h5:first-child,\n.ui-popup-container .ui-content > h6:first-child {\n\tmargin-top: 0;\n}\n.ui-popup-container .ui-content > p:last-child,\n.ui-popup-container .ui-content > h1:last-child,\n.ui-popup-container .ui-content > h2:last-child,\n.ui-popup-container .ui-content > h3:last-child,\n.ui-popup-container .ui-content > h4:last-child,\n.ui-popup-container .ui-content > h5:last-child,\n.ui-popup-container .ui-content > h6:last-child {\n\tmargin-bottom: 0;\n}\n.ui-popup > img {\n\tmax-width: 100%;\n\tmax-height: 100%;\n\tvertical-align: middle;\n}\n.ui-popup:not(.ui-content) > img:only-child,\n.ui-popup:not(.ui-content) > .ui-btn-left:first-child + img:last-child,\n.ui-popup:not(.ui-content) > .ui-btn-right:first-child + img:last-child {\n\t-webkit-border-radius: inherit;\n\tborder-radius: inherit;\n}\n.ui-popup iframe {\n\tvertical-align: middle;\n}\n.ui-popup > .ui-btn-left,\n.ui-popup > .ui-btn-right {\n\tposition: absolute; \n\ttop: -11px;\n\tmargin: 0;\n\tz-index: 1101;\n}\n.ui-popup > .ui-btn-left {\n\tleft: -11px;\n}\n.ui-popup > .ui-btn-right {\n\tright: -11px;\n}\n/* Dimensions related to the popup arrow\n-----------------------------------------------------------------------------------------------------------*/\n/* desired triangle height: 10px */\n/**\n * guide for the arrow - its width, height, and offset are theme-dependent and\n * should be expessed as left, right, top, bottom, so that the element bearing\n * such a class becomes stretched inside its parent position: relative element.\n * The left/top/right/bottom specified below should reflect the corresponding\n * border radii and so it leaves room for the shadow:\n *     ..--------------------..\n *   .\"        ^ top           \".\n *  /          v                 \\\n * |     +------------------+     |\n * |     |                  |     |\n * | left|                  |right|\n * |<--->|                  |<--->|\n * |     +------------------+     |\n *  \\          ^                 /\n *   `.        v bottom        .'\n *     \"\"--------------------\"\"\n * The idea is that the top/left of the arrow container box does not move to a\n * coordinate smaller than the top/left of the guide and the right/bottom of\n * the arrow container box does not move to a coordinate larger than the\n * bottom/right of the guide. This will help us avoid the following situation:\n *        ..--------------------..\n *      .\"        ^ top           \".\n *   /|/          v                 \\\n *  / |     +------------------+     |\n *  \\ |     |                  |     |\n *   \\| left|                  |right|\n *    |<--->|                  |<--->|\n *    |     +------------------+     |\n *     \\          ^                 /\n *      `.        v bottom        .'\n *        \"\"--------------------\"\"\n * The arrow should not receive a top/left coordinate such that it is too close\n * to one of the corners, because then at first the shadow of the arrow and,\n * given a coordinate even closer to the corner, even the body of the arrow will\n * \"stick out\" of the corner of the popup. The guide provides a hint to the\n * arrow positioning code as to which range of values is acceptable for the\n * arrow container's top/left coordinate.\n **/\n.ui-popup-arrow-container {\n\twidth: 20px;\n\theight: 20px;\n}\n/* aside from the \"infinities\" (-1000,2000), triangle height is used */\n.ui-popup-arrow-container.ui-popup-arrow-l {\n\tleft: -10px;\n\tclip: rect(-1000px,10px,2000px,-1000px);\n}\n.ui-popup-arrow-container.ui-popup-arrow-t {\n\ttop: -10px;\n\tclip: rect(-1000px,2000px,10px,-1000px);\n}\n.ui-popup-arrow-container.ui-popup-arrow-r {\n\tright: -10px;\n\tclip: rect(-1000px,2000px,2000px,10px);\n}\n.ui-popup-arrow-container.ui-popup-arrow-b {\n\tbottom: -10px;\n\tclip: rect(10px,2000px,1000px,-1000px);\n}\n/**\n * For each side, the arrow is twice the desired size and its corner is aligned\n * with the edge of the container:\n *                                           \n *           /\\         /\\                +----+       /\\\n *          /  \\       /  \\               | /\\ |top   /  \\\n *      +----+  \\     /  +----+       +-->|/  \\|     /    \\\n *  left| /  |   \\   /   |  \\ |right  |   |    |    /      \\\n *      |/   |    \\ /    |   \\|       |  /|    |\\  /        \\\n *      |\\   |    / \\    |   /|       | / +----+ \\ \\ +----+ /\n *      | \\  |   /   \\   |  / |       | \\        /  \\|    |/\n *      +----+  /     \\  +----+       |  \\      /    |    |\n *       ^  \\  /       \\  /  ^        |   \\    /  +->|\\  /|\n *       |   \\/         \\/   |        |    \\  /   |  | \\/ |bottom\n *       |                   |        |     \\/    |  +----+\n *       +-------------------+--------+-----------+\n *                           |\n *                    arrow container\n *                     (clips arrow)\n **/\n.ui-popup-arrow-container .ui-popup-arrow {\n\t/* (4*desired triangle height)/sqrt(2) - does not account for border - centred within the outer rectangle */\n\twidth: 28.284271247px;\n\theight: 28.284271247px;\n\tborder-width: 1px;\n\tborder-style: solid;\n}\n.ui-popup-arrow-container.ui-popup-arrow-t .ui-popup-arrow {\n\tleft: -4.142135623px;\n\ttop: 5.857864376px;\n}\n.ui-popup-arrow-container.ui-popup-arrow-b .ui-popup-arrow {\n\tleft: -4.142135623px;\n\ttop: -14.142135623px;\n}\n.ui-popup-arrow-container.ui-popup-arrow-l .ui-popup-arrow {\n\tleft: 5.857864376px;\n\ttop: -4.142135623px;\n}\n.ui-popup-arrow-container.ui-popup-arrow-r .ui-popup-arrow {\n\tleft: -14.142135623px;\n\ttop: -4.142135623px;\n}\n/* Fix rotation center for oldIE - see http://www.useragentman.com/IETransformsTranslator/ */\n.ui-popup-arrow-container.ui-popup-arrow-t.ie .ui-popup-arrow {\n    margin-left: -5.857864376269049px;\n    margin-top: -7.0710678118654755px;\n}\n.ui-popup-arrow-container.ui-popup-arrow-b.ie .ui-popup-arrow {\n    margin-left: -5.857864376269049px;\n    margin-top: -4.142135623730951px;\n}\n \n.ui-popup-arrow-container.ui-popup-arrow-l.ie .ui-popup-arrow {\n    margin-left: -7.0710678118654755px;\n    margin-top: -5.857864376269049px;\n}\n.ui-popup-arrow-container.ui-popup-arrow-r.ie .ui-popup-arrow {\n    margin-left: -4.142135623730951px;\n    margin-top: -5.857864376269049px;\n}\n/* structure */\n.ui-popup > .ui-popup-arrow-guide {\n\tposition: absolute;\n\tleft: 0;\n\tright: 0;\n\ttop: 0;\n\tbottom: 0;\n\tvisibility: hidden;\n}\n.ui-popup-arrow-container {\n\tposition: absolute;\n}\n.ui-popup-arrow {\n\t-webkit-transform: rotate(45deg);\n\t-moz-transform: rotate(45deg);\n\t-ms-transform: rotate(45deg);\n\ttransform: rotate(45deg);\n\tposition: absolute;\n\toverflow: hidden;\n\tbox-sizing: border-box;\n}\n.ui-popup-arrow-container.ie .ui-popup-arrow {\n\t-ms-filter: \"progid:DXImageTransform.Microsoft.Matrix(M11=0.7071067811865474, M12=-0.7071067811865477, M21=0.7071067811865477, M22=0.7071067811865474, SizingMethod='auto expand')\";\n\tfilter: progid:DXImageTransform.Microsoft.Matrix(\n\t      \tM11=0.7071067811865474,\n        \tM12=-0.7071067811865477,\n        \tM21=0.7071067811865477,\n        \tM22=0.7071067811865474,\n        \tSizingMethod='auto expand');\n}\n.ui-checkbox,\n.ui-radio {\n\tmargin: .5em 0;\n\tposition: relative;\n}\n.ui-checkbox .ui-btn,\n.ui-radio .ui-btn {\n\tmargin: 0;\n\ttext-align: left;\n\twhite-space: normal; /* Nowrap + ellipsis doesn't work on label. Issue #1419. */\n\tz-index: 2;\n}\n.ui-controlgroup .ui-checkbox .ui-btn.ui-focus,\n.ui-controlgroup .ui-radio .ui-btn.ui-focus {\n\tz-index: 3;\n}\n.ui-checkbox .ui-btn-icon-top,\n.ui-radio .ui-btn-icon-top,\n.ui-checkbox .ui-btn-icon-bottom,\n.ui-radio .ui-btn-icon-bottom {\n\ttext-align: center;\n}\n.ui-controlgroup-horizontal .ui-checkbox .ui-btn:after,\n.ui-controlgroup-horizontal .ui-radio .ui-btn:after {\n\tcontent: none;\n\tdisplay: none;\n}\n/* Native input positioning */\n.ui-checkbox input,\n.ui-radio input {\n\tposition: absolute;\n\tleft: .466em;\n\ttop: 50%;\n\twidth: 22px;\n\theight: 22px;\n\tmargin: -11px 0 0 0;\n\toutline: 0 !important;\n\tz-index: 1;\n}\n.ui-controlgroup-horizontal .ui-checkbox input,\n.ui-controlgroup-horizontal .ui-radio input {\n\tleft: 50%;\n\tmargin-left: -9px;\n}\n.ui-checkbox input:disabled,\n.ui-radio input:disabled {\n\tposition: absolute !important;\n\theight: 1px;\n\twidth: 1px;\n\toverflow: hidden;\n\tclip: rect(1px,1px,1px,1px);\n}\n.ui-select {\n\tmargin-top: .5em;\n\tmargin-bottom: .5em; /* no shorthand for margin because it would override margin-right for inline selects */\n\tposition: relative;\n}\n.ui-select > select {\n\tposition: absolute !important;\n\theight: 1px;\n\twidth: 1px;\n\toverflow: hidden;\n\tclip: rect(1px,1px,1px,1px);\n}\n.ui-select .ui-btn {\n\tmargin: 0;\n\topacity: 1; /* Fixes #2588: When Windows Phone 7.5 (Mango) tries to calculate a numeric opacity for a select (including \"inherit\") without explicitly specifying an opacity on the parent to give it context, a bug appears where clicking elsewhere on the page after opening the select will open the select again. */\n}\n.ui-select .ui-btn select {\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n\twidth: 100%;\n\tmin-height: 1.5em;\n\tmin-height: 100%;\n\theight: 3em;\n\tmax-height: 100%;\n\toutline: 0;\n\t-webkit-border-radius: inherit;\n\tborder-radius: inherit;\t\n\t-webkit-appearance: none;\n\t-moz-appearance: none;\n\tcursor: pointer;\n\tfilter: Alpha(Opacity=0);\n\topacity: 0;\n\tz-index: 2;\n}\n@-moz-document url-prefix() {\n\t.ui-select .ui-btn select {\n\t\topacity: 0.0001;\n\t}\n}\n/* Display none because of issues with IE/WP's filter alpha opacity */\n.ui-select .ui-state-disabled select {\n\tdisplay: none;\n}\n/* Because we add all classes of the select and option elements to the span... */ \n.ui-select span.ui-state-disabled {\n\tfilter: Alpha(Opacity=100);\n\topacity: 1;\n}\n.ui-select .ui-btn.ui-select-nativeonly {\n\tborder-radius: 0;\n\tborder: 0;\n}\n.ui-select .ui-btn.ui-select-nativeonly select {\n\topacity: 1;\n\ttext-indent: 0;\n\tdisplay: block;\n}\n/* ui-li-count is styled in the listview CSS. We set padding and offset here because select supports icon position while listview doesn't. */\n.ui-select .ui-li-has-count.ui-btn {\n\tpadding-right: 2.8125em;\n}\n.ui-select .ui-li-has-count.ui-btn-icon-right {\n\tpadding-right: 4.6875em;\n}\n.ui-select .ui-btn-icon-right .ui-li-count {\n\tright: 3.2em;\n}\n/* We set the rules for the span as well to fix an issue on Chrome with text-overflow ellipsis for the button in combination with text-align center. */\n.ui-select .ui-btn > span:not(.ui-li-count) {\n\tdisplay: block;\n\ttext-overflow: ellipsis;\n\toverflow: hidden !important;\n\twhite-space: nowrap;\n}\n.ui-selectmenu.ui-popup {\n\tmin-width: 11em;\n}\n.ui-selectmenu .ui-dialog-contain {\n\toverflow: hidden;\n}\n.ui-selectmenu .ui-header {\n\tmargin: 0;\n\tpadding: 0;\n\tborder-width: 0;\n}\n.ui-selectmenu.ui-dialog .ui-header {\n\tz-index: 1;\n\tposition: relative;\n}\n.ui-selectmenu.ui-popup .ui-header {\n\t-webkit-border-bottom-right-radius: 0;\n\tborder-bottom-right-radius: 0;\n\t-webkit-border-bottom-left-radius: 0;\n\tborder-bottom-left-radius: 0;\n}\n/* when no placeholder is defined in a multiple select, the header height doesn't even extend past the close button.  this shim's content in there */\n.ui-selectmenu.ui-popup .ui-header h1:after {\n\tcontent: '.';\n\tvisibility: hidden;\n}\n.ui-selectmenu .ui-header .ui-title {\n\tmargin: 0 2.875em;\n}\n.ui-selectmenu.ui-dialog .ui-content {\n\toverflow: visible;\n\tz-index: 1;\n}\n.ui-selectmenu .ui-selectmenu-list {\n\tmargin: 0;\n\t-webkit-border-radius: inherit;\n\tborder-radius: inherit;\t\n}\n.ui-header:not(.ui-screen-hidden) + .ui-selectmenu-list {\n\t-webkit-border-top-right-radius: 0;\n\tborder-top-right-radius: 0;\n\t-webkit-border-top-left-radius: 0;\n\tborder-top-left-radius: 0;\n}\n.ui-header.ui-screen-hidden + .ui-selectmenu-list li.ui-first-child .ui-btn {\n\tborder-top-width: 0;\n}\n.ui-selectmenu .ui-selectmenu-list li.ui-last-child .ui-btn {\n\tborder-bottom-width: 0;\n}\n.ui-selectmenu .ui-btn.ui-li-divider {\n\tcursor: default;\n}\n.ui-selectmenu .ui-selectmenu-placeholder {\n\tdisplay: none;\n}\n.ui-listview,\n.ui-listview > li {\n\tmargin: 0;\n\tpadding: 0;\n\tlist-style: none;\n}\n.ui-content .ui-listview,\n.ui-panel-inner > .ui-listview {\n\tmargin: -1em;\n}\n.ui-content .ui-listview-inset,\n.ui-panel-inner > .ui-listview-inset {\n\tmargin: 1em 0;\n}\n.ui-collapsible-content > .ui-listview {\n\tmargin: -.5em -1em;\n}\n.ui-collapsible-content > .ui-listview-inset {\n\tmargin: .5em 0;\n}\n.ui-listview > li {\n\tdisplay: block;\n\tposition: relative;\n\toverflow: visible;\n}\n.ui-listview > .ui-li-static,\n.ui-listview > .ui-li-divider,\n.ui-listview > li > a.ui-btn {\n\tmargin: 0;\n\tdisplay: block;\n\tposition: relative;\n\ttext-align: left;\n\ttext-overflow: ellipsis;\n\toverflow: hidden;\n\twhite-space: nowrap;\n}\n.ui-listview > li > .ui-btn:focus {\n\tz-index: 1;\n}\n.ui-listview > .ui-li-static,\n.ui-listview > .ui-li-divider,\n.ui-listview > li > a.ui-btn {\n\tborder-width: 1px 0 0 0;\n\tborder-style: solid;\n}\n.ui-listview-inset > .ui-li-static,\n.ui-listview-inset > .ui-li-divider,\n.ui-listview-inset > li > a.ui-btn {\n\tborder-right-width: 1px;\n\tborder-left-width: 1px;\n}\n.ui-listview > .ui-li-static.ui-last-child,\n.ui-listview > .ui-li-divider.ui-last-child,\n.ui-listview > li.ui-last-child > a.ui-btn {\n\tborder-bottom-width: 1px;\n}\n.ui-collapsible-content > .ui-listview:not(.ui-listview-inset) > li.ui-first-child,\n.ui-collapsible-content > .ui-listview:not(.ui-listview-inset) > li.ui-first-child > a.ui-btn {\n\tborder-top-width: 0;\n}\n.ui-collapsible-themed-content .ui-listview:not(.ui-listview-inset) > li.ui-last-child,\n.ui-collapsible-themed-content .ui-listview:not(.ui-listview-inset) > li.ui-last-child > a.ui-btn {\n\tborder-bottom-width: 0;\n}\n.ui-listview > li.ui-first-child,\n.ui-listview > li.ui-first-child > a.ui-btn {\n\t-webkit-border-top-right-radius: inherit;\t\n\tborder-top-right-radius: inherit;\n\t-webkit-border-top-left-radius: inherit;\n\tborder-top-left-radius: inherit;\n}\n.ui-listview > li.ui-last-child,\n.ui-listview > li.ui-last-child > a.ui-btn {\n\t-webkit-border-bottom-right-radius: inherit;\n\tborder-bottom-right-radius: inherit;\n\t-webkit-border-bottom-left-radius: inherit;\n\tborder-bottom-left-radius: inherit;\n}\n.ui-listview > li.ui-li-has-alt > a.ui-btn {\n\t-webkit-border-top-right-radius: 0;\n\tborder-top-right-radius: 0;\n\t-webkit-border-bottom-right-radius: 0;\n\tborder-bottom-right-radius: 0;\n}\n.ui-listview > li.ui-first-child > a.ui-btn + a.ui-btn {\n\t-webkit-border-top-left-radius: 0;\t\n\tborder-top-left-radius: 0;\n\t-webkit-border-top-right-radius: inherit;\n\tborder-top-right-radius: inherit;\n}\n.ui-listview > li.ui-last-child > a.ui-btn + a.ui-btn {\n\t-webkit-border-bottom-left-radius: 0;\n\tborder-bottom-left-radius: 0;\n\t-webkit-border-bottom-right-radius: inherit;\n\tborder-bottom-right-radius: inherit;\n}\n.ui-listview > li.ui-first-child img:first-child:not(.ui-li-icon) {\n\t-webkit-border-top-left-radius: inherit;\n\tborder-top-left-radius: inherit;\t\n}\n.ui-listview > li.ui-last-child img:first-child:not(.ui-li-icon) {\n\t-webkit-border-bottom-left-radius: inherit;\n\tborder-bottom-left-radius: inherit;\t\n}\n.ui-collapsible-content > .ui-listview:not(.ui-listview-inset) {\n\t-webkit-border-radius: inherit;\n\tborder-radius: inherit;\t\n}\n.ui-listview > .ui-li-static {\n\tpadding: .7em 1em;\n}\n.ui-listview > .ui-li-divider {\n\tpadding: .5em 1.143em;\n\tfont-size: 14px;\n\tfont-weight: bold;\n\tcursor: default;\n\toutline: 0; /* Dividers in custom selectmenus have tabindex */\n}\n.ui-listview > .ui-li-has-count > .ui-btn,\n.ui-listview > .ui-li-static.ui-li-has-count,\n.ui-listview > .ui-li-divider.ui-li-has-count {\n\tpadding-right: 2.8125em;\n}\n.ui-listview > .ui-li-has-count > .ui-btn-icon-right {\n\tpadding-right: 4.6875em;\n}\n.ui-listview > .ui-li-has-thumb > .ui-btn,\n.ui-listview > .ui-li-static.ui-li-has-thumb {\n\tmin-height: 3.625em;\n\tpadding-left: 6.25em;\n}\n/* ui-li-has-icon deprecated in 1.4. TODO: remove in 1.5 */\n.ui-listview > .ui-li-has-icon > .ui-btn,\n.ui-listview > .ui-li-static.ui-li-has-icon {\n\tmin-height: 1.25em;\n\tpadding-left: 2.5em;\n}\n/* Used by both listview and custom multiple select button */\n.ui-li-count {\n\tposition: absolute;\n\tfont-size: 12.5px;\n\tfont-weight: bold;\n\ttext-align: center;\n\tborder-width: 1px;\n\tborder-style: solid;\n\tpadding: 0 .48em;\n\tline-height: 1.6em;\n\tmin-height: 1.6em;\n\tmin-width: .64em;\n\tright: .8em;\n\ttop: 50%;\n\tmargin-top: -.88em;\n}\n.ui-listview .ui-btn-icon-right .ui-li-count {\n\tright: 3.2em;\n}\n.ui-listview .ui-li-has-thumb > img:first-child,\n.ui-listview .ui-li-has-thumb > .ui-btn > img:first-child,\n.ui-listview .ui-li-has-thumb .ui-li-thumb {\n\tposition: absolute;\n\tleft: 0;\n\ttop: 0;\n\tmax-height: 5em;\n\tmax-width: 5em;\n}\n/* ui-li-has-icon deprecated in 1.4. TODO: remove in 1.5 */\n.ui-listview > .ui-li-has-icon > img:first-child,\n.ui-listview > .ui-li-has-icon > .ui-btn > img:first-child {\n\tposition: absolute;\n\tleft: .625em;\n\ttop: .9em;\n\tmax-height: 1em;\n\tmax-width: 1em;\n}\n.ui-listview > li h1,\n.ui-listview > li h2,\n.ui-listview > li h3,\n.ui-listview > li h4,\n.ui-listview > li h5,\n.ui-listview > li h6 {\n\tfont-size: 1em;\n\tfont-weight: bold;\n\tdisplay: block;\n\tmargin: .45em 0;\n\ttext-overflow: ellipsis;\n\toverflow: hidden;\n\twhite-space: nowrap;\n}\n.ui-listview > li p {\n\tfont-size: .75em;\n\tfont-weight: normal;\n\tdisplay: block;\n\tmargin: .6em 0;\n\ttext-overflow: ellipsis;\n\toverflow: hidden;\n\twhite-space: nowrap;\n}\n.ui-listview .ui-li-aside {\n\tposition: absolute;\n\ttop: 1em;\n\tright: 3.333em;\n\tmargin: 0;\n\ttext-align: right;\n}\n.ui-listview > li.ui-li-has-alt > .ui-btn {\n\tmargin-right: 2.5em;\n\tborder-right-width: 0;\n}\n.ui-listview > li.ui-li-has-alt > .ui-btn + .ui-btn {\n\tposition: absolute;\n\twidth: 2.5em;\n\theight: 100%;\n\tmin-height: auto;\n\t-webkit-box-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\tbox-sizing: border-box;\n\tborder-left-width: 1px;\n\ttop: 0;\n\tright: 0;\n\tmargin: 0;\n\tpadding: 0;\n\tz-index: 2;\n}\n.ui-listview-inset > li.ui-li-has-alt > .ui-btn + .ui-btn {\n\tborder-right-width: 1px;\n}\n.ui-listview > li.ui-li-has-alt > .ui-btn + .ui-btn:focus {\n\tz-index: 3;\n}\nol.ui-listview,\nol.ui-listview > .ui-li-divider {\n\tcounter-reset: listnumbering;\n}\nol.ui-listview > li > .ui-btn,\nol.ui-listview > li.ui-li-static {\n\tvertical-align: middle;\n}\nol.ui-listview > li > .ui-btn:first-child:before,\nol.ui-listview > li.ui-li-static:before,\nol.ui-listview > li.ui-field-contain > label:before,\nol.ui-listview > li.ui-field-contain > .ui-controlgroup-label:before {\n\tdisplay: inline-block;\n\tfont-size: .9em;\n\tfont-weight: normal;\n\tpadding-right: .3em;\n\tmin-width: 1.4em;\n\tline-height: 1.5;\n\tvertical-align: middle;\n\tcounter-increment: listnumbering;\n\tcontent: counter(listnumbering) \".\";\n}\nol.ui-listview > li.ui-field-contain:before {\n\tcontent: none;\n\tdisplay: none;\n}\nol.ui-listview > li h1:first-child,\nol.ui-listview > li h2:first-child,\nol.ui-listview > li h3:first-child,\nol.ui-listview > li h4:first-child,\nol.ui-listview > li h5:first-child,\nol.ui-listview > li h6:first-child,\nol.ui-listview > li p:first-child,\nol.ui-listview > li img:first-child + * {\n\tdisplay: inline-block;\n\tvertical-align: middle;\n}\nol.ui-listview > li h1:first-child ~ *,\nol.ui-listview > li h2:first-child ~ *,\nol.ui-listview > li h3:first-child ~ *,\nol.ui-listview > li h4:first-child ~ *,\nol.ui-listview > li h5:first-child ~ *,\nol.ui-listview > li h6:first-child ~ *,\nol.ui-listview > li p:first-child ~ *,\nol.ui-listview > li img:first-child + * ~ * {\n\tmargin-top: 0;\n\ttext-indent: 2.04em; /* (1.4em + .3em) * .9em / .75em */\n}\nhtml .ui-filterable + .ui-listview,\nhtml .ui-filterable.ui-listview {\n\tmargin-top: .5em;\n}\n.ui-collapsible-content > form.ui-filterable {\n\tmargin-top: -.5em;\n}\n.ui-collapsible-content > .ui-input-search.ui-filterable {\n\tmargin-top: 0;\n}\n.ui-collapsible-content > .ui-filterable + .ui-listview:not(.ui-listview-inset) > li.ui-first-child,\n.ui-collapsible-content > .ui-filterable + .ui-listview:not(.ui-listview-inset) > li.ui-first-child > a.ui-btn,\n.ui-collapsible-content > .ui-filterable.ui-listview:not(.ui-listview-inset) > li.ui-first-child,\n.ui-collapsible-content > .ui-filterable.ui-listview:not(.ui-listview-inset) > li.ui-first-child > a.ui-btn {\n\tborder-top-width: 1px;\n}\ndiv.ui-slider {\n\theight: 30px;\n\tmargin: .5em 0;\n\tpadding: 0;\n\t-ms-touch-action: pan-y pinch-zoom double-tap-zoom;\n}\ndiv.ui-slider:before,\ndiv.ui-slider:after {\n\tcontent: \"\";\n\tdisplay: table;\n}\ndiv.ui-slider:after {\n\tclear: both;\n}\ninput.ui-slider-input {\n\tdisplay: block;\n\tfloat: left;\n\tfont-size: 14px;\n\tfont-weight: bold;\n\tmargin: 0;\n\tpadding: 4px;\n\twidth: 40px;\n\theight: 20px;\n\tline-height: 20px;\n\tborder-width: 1px;\n\tborder-style: solid;\n\toutline: 0;\n\ttext-align: center;\n\tvertical-align: text-bottom;\n\t-webkit-appearance: none;\n\t-moz-appearance: none;\n\tappearance: none;\n\t-webkit-box-sizing: content-box;\n\t-moz-box-sizing: content-box;\n\tbox-sizing: content-box;\n}\n.ui-slider-input::-webkit-outer-spin-button,\n.ui-slider-input::-webkit-inner-spin-button {\n\t-webkit-appearance: none;\n\tmargin: 0;\n}\n.ui-slider-track {\n\tposition: relative;\n\toverflow: visible;\n\tborder-width: 1px;\n\tborder-style: solid;\n\theight: 15px;\n\tmargin: 0 15px 0 68px;\n\ttop: 6px;\n}\n.ui-slider-track.ui-mini {\n\theight: 12px;\n\ttop: 8px;\n}\n.ui-slider-track .ui-slider-bg {\n\theight: 100%;\n}\n/* High level of specificity to override button margins in grids */\n.ui-slider-track .ui-btn.ui-slider-handle {\n\tposition: absolute;\n\tz-index: 1;\n\ttop: 50%;\n\twidth: 28px;\n\theight: 28px;\n\tmargin: -15px 0 0 -15px;\n\toutline: 0;\n\tpadding: 0;\n}\n.ui-slider-track.ui-mini .ui-slider-handle {\n\theight: 14px;\n\twidth: 14px;\n\tmargin: -8px 0 0 -8px;\n}\nselect.ui-slider-switch {\n\tposition: absolute !important;\n\theight: 1px;\n\twidth: 1px;\n\toverflow: hidden;\n\tclip: rect(1px,1px,1px,1px);\n}\ndiv.ui-slider-switch {\n\tdisplay: inline-block;\n\theight: 32px;\n\twidth: 5.8em;\n\ttop: 0;\n}\n/* reset the clearfix */\ndiv.ui-slider-switch:before,\ndiv.ui-slider-switch:after {\n\tdisplay: none;\n\tclear: none;\n}\ndiv.ui-slider-switch.ui-mini {\n\theight: 29px;\n\ttop: 0;\n}\n.ui-slider-inneroffset {\n\tmargin: 0 16px;\n\tposition: relative;\n\tz-index: 1;\n}\n.ui-slider-switch.ui-mini .ui-slider-inneroffset {\n\tmargin: 0 15px 0 14px;\n}\n.ui-slider-switch .ui-btn.ui-slider-handle {\n\tmargin: 1px 0 0 -15px;\n}\n.ui-slider-switch.ui-mini .ui-slider-handle {\n\twidth: 25px;\n\theight: 25px;\n\tmargin: 1px 0 0 -13px;\n\tpadding: 0;\n}\n.ui-slider-handle-snapping {\n\t-webkit-transition: left 70ms linear;\n\t-moz-transition: left 70ms linear;\n\ttransition: left 70ms linear;\n}\n.ui-slider-switch .ui-slider-label {\n\tposition: absolute;\n\ttext-align: center;\n\twidth: 100%;\n\toverflow: hidden;\n\tfont-size: 16px;\n\ttop: 0;\n\tline-height: 2;\n\tmin-height: 100%;\n\twhite-space: nowrap;\n\tcursor: pointer;\n}\n.ui-slider-switch.ui-mini .ui-slider-label {\n\tfont-size: 14px;\n}\n.ui-slider-switch .ui-slider-label-a {\n\tz-index: 1;\n\tleft: 0;\n\ttext-indent: -1.5em;\n}\n.ui-slider-switch .ui-slider-label-b {\n\tz-index: 0;\n\tright: 0;\n\ttext-indent: 1.5em;\n}\n/* The corner radii for ui-slider-switch/track can be specified in theme CSS. The bg and handle inherits. */\n.ui-slider-track .ui-slider-bg,\n.ui-slider-switch .ui-slider-label,\n.ui-slider-switch .ui-slider-inneroffset,\n.ui-slider-handle {\n\t-webkit-border-radius: inherit;\n\tborder-radius: inherit;\n}\n.ui-field-contain div.ui-slider-switch {\n\tmargin: 0;\n}\n/* ui-hide-label deprecated in 1.4. TODO: Remove in 1.5 */\n.ui-field-contain div.ui-slider-switch,\n.ui-field-contain.ui-hide-label div.ui-slider-switch,\nhtml .ui-popup .ui-field-contain div.ui-slider-switch {\n\tdisplay: inline-block;\n\twidth: 5.8em;\n}\n/* slider tooltip\n-----------------------------------------------------------------------------------------------------------*/\n.ui-slider-popup {\n\twidth: 64px;\n\theight: 64px;\n\tfont-size: 36px;\n\tpadding-top: 14px;\n\topacity: 0.8;\n}\n.ui-slider-popup {\n\tposition: absolute !important;\n\ttext-align: center;\n\tz-index: 100;\n}\n.ui-slider-track .ui-btn.ui-slider-handle {\n\tfont-size: .9em;\n\tline-height: 30px;\n}\n.ui-rangeslider {\n\tmargin: .5em 0;\n}\n.ui-rangeslider:before,\n.ui-rangeslider:after {\n\tcontent: \"\";\n\tdisplay: table;\n}\n.ui-rangeslider:after {\n\tclear: both;\n}\n.ui-rangeslider .ui-slider-input.ui-rangeslider-last {\n\tfloat: right;\n}\n.ui-rangeslider .ui-rangeslider-sliders {\n\tposition: relative;\n\toverflow: visible;\n\theight: 30px;\n\tmargin: 0 68px;\n}\n.ui-rangeslider .ui-rangeslider-sliders .ui-slider-track {\n\tposition: absolute;\n\ttop: 6px;\n\tright: 0;\n\tleft: 0;\n\tmargin: 0;\n}\n.ui-rangeslider.ui-mini .ui-rangeslider-sliders .ui-slider-track {\n\ttop: 8px;\n}\n.ui-rangeslider .ui-slider-track:first-child .ui-slider-bg {\n\tdisplay: none;\n}\n.ui-rangeslider .ui-rangeslider-sliders .ui-slider-track:first-child {\n\tbackground-color: transparent;\n\tbackground: none;\n\tborder-width: 0;\n\theight: 0;\n}\n/* this makes ie6 and ie7 set height to 0 to fix z-index problem */\nhtml >/**/body .ui-rangeslider .ui-rangeslider-sliders .ui-slider-track:first-child {\n\theight: 15px;\n\tborder-width: 1px;\n}\nhtml >/**/body .ui-rangeslider.ui-mini .ui-rangeslider-sliders .ui-slider-track:first-child {\n\theight: 12px;\n}\n/* Hide the second label (the first is moved outside the div) */\ndiv.ui-rangeslider label {\n\tposition: absolute !important;\n\theight: 1px;\n\twidth: 1px;\n\toverflow: hidden;\n\tclip: rect(1px,1px,1px,1px);\n}\n.ui-field-contain .ui-rangeslider input.ui-slider-input,\n.ui-field-contain .ui-rangeslider.ui-mini input.ui-slider-input,\n.ui-field-contain .ui-rangeslider .ui-rangeslider-sliders,\n.ui-field-contain .ui-rangeslider.ui-mini .ui-rangeslider-sliders {\n\tmargin-top: 0;\n\tmargin-bottom: 0;\n}\n.ui-input-text,\n.ui-input-search {\n\tmargin: .5em 0;\n\tborder-width: 1px;\n\tborder-style: solid;\n}\n.ui-mini {\n\tmargin: .446em;\n}\n.ui-input-text input,\n.ui-input-search input,\ntextarea.ui-input-text {\n\tpadding: .4em;\n\tline-height: 1.4em;\n\tdisplay: block;\n\twidth: 100%;\n\t-webkit-box-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\tbox-sizing: border-box;\n\toutline: 0;\n}\n.ui-input-text input,\n.ui-input-search input {\n\tmargin: 0;\n\tmin-height: 2.2em;\n\ttext-align: left; /* Opera aligns type=\"date\" right by default */\n\tborder: 0;\n\tbackground: transparent none;\n\t-webkit-appearance: none;\n\t-webkit-border-radius: inherit;\n\tborder-radius: inherit;\n}\ntextarea.ui-input-text {\n\toverflow: auto;\n\tresize: vertical;\n}\n.ui-mini .ui-input-text input,\n.ui-mini .ui-input-search input,\n.ui-input-text.ui-mini input,\n.ui-input-search.ui-mini input,\n.ui-mini textarea.ui-input-text,\ntextarea.ui-mini {\n\tfont-size: 14px;\n}\n/* Same margin for mini textareas as other mini sized widgets (12.5/14 * 0.5em) */\n.ui-mini textarea.ui-input-text,\ntextarea.ui-mini {\n\tmargin: .446em 0;\n}\n.ui-input-has-clear,\n.ui-input-search {\n\tposition: relative;\n}\n/* Padding on the div instead of input because of browser spinners etc. */\n.ui-input-has-clear {\n\tpadding-right: 2.375em;\n}\n.ui-mini.ui-input-has-clear {\n\tpadding-right: 2.923em;\n}\n.ui-input-has-clear input {\n\tpadding-right: 0;\n\t/* Autofill on Chrome has bg color so we unset corners right as well. */\n\t-webkit-border-top-right-radius: 0;\n\tborder-top-right-radius: 0;\n\t-webkit-border-bottom-right-radius: 0;\n\tborder-bottom-right-radius: 0;\n}\n/* Search icon */\n.ui-input-search input {\n\tpadding-left: 1.75em;\n}\n.ui-input-search:after {\n\tposition: absolute;\n\tleft: .3125em;\n\ttop: 50%;\n\tmargin-top: -7px;\n\tcontent: \"\";\n\tbackground-position: center center;\n\tbackground-repeat: no-repeat;\n\twidth: 14px;\n\theight: 14px;\n\tfilter: Alpha(Opacity=50);\n\topacity: .5;\n}\n.ui-input-search.ui-input-has-clear .ui-btn.ui-input-clear,\n.ui-input-text.ui-input-has-clear .ui-btn.ui-input-clear {\n\tposition: absolute;\n\tright: 0;\n\ttop: 50%;\n\tmargin: -14px .3125em 0;\n\tborder: 0;\n\tbackground-color: transparent;\n}\n.ui-input-search .ui-input-clear-hidden,\n.ui-input-text .ui-input-clear-hidden {\n\tdisplay: none;\n}\n/* Resolves issue #5166: Added to support issue introduced in Firefox 15. We can likely remove this in the future. */\n.ui-input-text input::-moz-placeholder,\n.ui-input-search input::-moz-placeholder,\ntextarea.ui-input-text::-moz-placeholder {\n\tcolor: #aaa;\n}\n/* Same for IE10 */\n.ui-input-text input:-ms-input-placeholder,\n.ui-input-search input:-ms-input-placeholder,\ntextarea.ui-input-text:-ms-input-placeholder {\n\tcolor: #aaa;\n}\n/* Resolves issue #5131: Width of textinput depends on its type,\nfor Android 4.1 */\n.ui-input-text input[type=number]::-webkit-outer-spin-button {\n\tmargin: 0;\n}\n/* Resolves issue #5756: Textinput in IE10 has a default clear button */\n.ui-input-text input::-ms-clear,\n.ui-input-search input::-ms-clear {\n\tdisplay: none;\n}\n.ui-input-text input:focus,\n.ui-input-search input:focus {\n\t-webkit-box-shadow: none;\n\t-moz-box-shadow: none;\n\tbox-shadow: none;\n}\ntextarea.ui-input-text.ui-textinput-autogrow {\n\toverflow: hidden;\n}\n.ui-textinput-autogrow-resize {\n\t-webkit-transition: height 0.25s;\n\t-o-transition: height 0.25s;\n\t-moz-transition: height 0.25s;\n\ttransition: height 0.25s;\n}\n.ui-flipswitch {\n\tdisplay: inline-block;\n\tvertical-align: middle;\n\twidth: 5.875em; /* Override this and padding-left in next rule if you use labels other than \"on/off\" and need more space */\n\theight: 1.875em;\n\tborder-width: 1px;\n\tborder-style: solid;\n\tmargin: .5em 0;\n\toverflow: hidden;\n\t-webkit-transition-property: padding, width, background-color, color, border-color;\n\t-moz-transition-property: padding, width, background-color, color, border-color;\n\t-o-transition-property: padding, width, background-color, color, border-color;\n\ttransition-property: padding, width, background-color, color, border-color;\n\t-webkit-transition-duration: 100ms;\n\t-moz-transition-duration: 100ms;\n\t-o-transition-duration: 100ms;\n\ttransition-duration: 100ms;\n\t-webkit-touch-callout: none;\n\t-webkit-user-select: none;\n\t-moz-user-select: none;\n\t-ms-user-select: none;\n\tuser-select: none;\n\tcursor: pointer;\n}\n.ui-flipswitch.ui-flipswitch-active {\n\tpadding-left: 4em;  /* Override this and width in previous rule if you use labels other than \"on/off\" and need more space */\n\twidth: 1.875em;\n}\n.ui-flipswitch-input {\n\tposition: absolute;\n\theight: 1px;\n\twidth: 1px;\n\tmargin: -1px;\n\toverflow: hidden;\n\tclip: rect(1px,1px,1px,1px);\n\tborder: 0;\n\toutline: 0;\n\tfilter: Alpha(Opacity=0);\n\topacity: 0;\n}\n.ui-flipswitch .ui-btn.ui-flipswitch-on,\n.ui-flipswitch .ui-flipswitch-off {\n\tfloat: left;\n\theight: 1.75em;\n\tmargin: .0625em;\n\tline-height: 1.65em;\n}\n.ui-flipswitch .ui-btn.ui-flipswitch-on {\n\twidth: 1.75em;\n\tpadding: 0;\n\ttext-indent: -2.6em; /* Override this to center text if you use a label other than \"on\" */\n\ttext-align: left;\n\tborder-width: 1px;\n\tborder-style: solid;\n\t-webkit-box-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\tbox-sizing: border-box;\n\tborder-radius: inherit;\n\toverflow: visible;\n\tcolor: inherit;\n\ttext-shadow: inherit;\n}\n.ui-flipswitch .ui-flipswitch-off {\n\tpadding: 1px;\n\ttext-indent: 1em; /* Override this to center text if you use a label other than \"off\" */\n}\n/* Override field container CSS to prevent the flipswitch from becomming full width */\nhtml .ui-field-contain > label + .ui-flipswitch,\nhtml .ui-popup .ui-field-contain > label + .ui-flipswitch {\n\tdisplay: inline-block;\n\twidth: 5.875em; /* If you override the width for .ui-flipswitch you should repeat the same value here */\n\t-webkit-box-sizing: content-box;\n\t-moz-box-sizing: content-box;\n\tbox-sizing: content-box;\n}\n.ui-field-contain .ui-flipswitch.ui-flipswitch-active,\n.ui-popup .ui-field-contain .ui-flipswitch.ui-flipswitch-active {\n\twidth: 1.875em;\n}\n.ui-table {\n\tborder: 0;\n\tborder-collapse: collapse;\n\tpadding: 0;\n\twidth: 100%;\n}\n.ui-table th,\n.ui-table td {\n\tline-height: 1.5em;\n\ttext-align: left;\n\tpadding: .4em .5em;\n\tvertical-align:top;\n}\n.ui-table th .ui-btn,\n.ui-table td .ui-btn {\n\tline-height: normal;\n}\n.ui-table th {\n\tfont-weight: bold;\n}\n.ui-table caption {\n\ttext-align: left;\n\tmargin-bottom: 1.4em;\n\topacity: .5;\n}\n/*\n Styles for the table columntoggle mode\n*/\n.ui-table-columntoggle-btn {\n\tfloat: right;\n\tmargin-bottom: .8em;\n}\n/* Remove top/bottom margins around the fieldcontain on check list */\n.ui-table-columntoggle-popup fieldset {\n\tmargin:0;\n}\n.ui-table-columntoggle {\n\tclear: both;\n}\n/* Hide all prioritized columns by default */\n@media only all {\n\tth.ui-table-priority-6,\n\ttd.ui-table-priority-6,\n\tth.ui-table-priority-5,\n\ttd.ui-table-priority-5,\n\tth.ui-table-priority-4,\n\ttd.ui-table-priority-4,\n\tth.ui-table-priority-3,\n\ttd.ui-table-priority-3,\n\tth.ui-table-priority-2,\n\ttd.ui-table-priority-2,\n\tth.ui-table-priority-1,\n\ttd.ui-table-priority-1 {\n\t\tdisplay: none;\n\t}\n}\n/* Preset breakpoints if \".ui-responsive\" class added to table */\n/* Show priority 1 at 320px (20em x 16px) */\n@media screen and (min-width: 20em) {\n\t.ui-table-columntoggle.ui-responsive th.ui-table-priority-1,\n\t.ui-table-columntoggle.ui-responsive td.ui-table-priority-1 {\n\t\tdisplay: table-cell;\n\t}\n}\n/* Show priority 2 at 480px (30em x 16px) */\n@media screen and (min-width: 30em) {\n\t.ui-table-columntoggle.ui-responsive th.ui-table-priority-2,\n\t.ui-table-columntoggle.ui-responsive td.ui-table-priority-2 {\n\t\tdisplay: table-cell;\n\t}\n}\n/* Show priority 3 at 640px (40em x 16px) */\n@media screen and (min-width: 40em) {\n\t.ui-table-columntoggle.ui-responsive th.ui-table-priority-3,\n\t.ui-table-columntoggle.ui-responsive td.ui-table-priority-3 {\n\t\tdisplay: table-cell;\n\t}\n}\n/* Show priority 4 at 800px (50em x 16px) */\n@media screen and (min-width: 50em) {\n\t.ui-table-columntoggle.ui-responsive th.ui-table-priority-4,\n\t.ui-table-columntoggle.ui-responsive td.ui-table-priority-4 {\n\t\tdisplay: table-cell;\n\t}\n}\n/* Show priority 5 at 960px (60em x 16px) */\n@media screen and (min-width: 60em) {\n\t.ui-table-columntoggle.ui-responsive th.ui-table-priority-5,\n\t.ui-table-columntoggle.ui-responsive td.ui-table-priority-5 {\n\t\tdisplay: table-cell;\n\t}\n}\n/* Show priority 6 at 1,120px (70em x 16px) */\n@media screen and (min-width: 70em) {\n\t.ui-table-columntoggle.ui-responsive th.ui-table-priority-6,\n\t.ui-table-columntoggle.ui-responsive td.ui-table-priority-6 {\n\t\tdisplay: table-cell;\n\t}\n}\n/* Unchecked manually: Always hide */\n.ui-table-columntoggle th.ui-table-cell-hidden,\n.ui-table-columntoggle td.ui-table-cell-hidden,\n.ui-table-columntoggle.ui-responsive th.ui-table-cell-hidden,\n.ui-table-columntoggle.ui-responsive td.ui-table-cell-hidden {\n\tdisplay: none;\n}\n/* Checked manually: Always show */\n.ui-table-columntoggle th.ui-table-cell-visible,\n.ui-table-columntoggle td.ui-table-cell-visible,\n.ui-table-columntoggle.ui-responsive th.ui-table-cell-visible,\n.ui-table-columntoggle.ui-responsive td.ui-table-cell-visible {\n\tdisplay: table-cell;\n}\n/*\n Styles for the table columntoggle mode\n*/\n.ui-table-reflow td .ui-table-cell-label,\n.ui-table-reflow th .ui-table-cell-label { \n\tdisplay: none;\n}\n/* Mobile first styles: Begin with the stacked presentation at narrow widths */ \n@media only all {\n\t/* Hide the table headers */ \n\t.ui-table-reflow thead td, \n\t.ui-table-reflow thead th {\n\t\tdisplay: none;\n\t}\n\t/* Show the table cells as a block level element */ \n\t.ui-table-reflow td,\n\t.ui-table-reflow th { \n\t\ttext-align: left;\n\t\tdisplay: block;\n\t}\n\t/* Add a fair amount of top margin to visually separate each row when stacked */  \n\t.ui-table-reflow tbody th {\n\t\tmargin-top: 3em;\n\t}\n\t/* Make the label elements a percentage width */ \n\t.ui-table-reflow td .ui-table-cell-label,\n\t.ui-table-reflow th .ui-table-cell-label { \n\t\tpadding: .4em; \n\t\tmin-width: 30%; \n\t\tdisplay: inline-block;\n\t\tmargin: -.4em 1em -.4em -.4em;\n\t}\n\t/* For grouped headers, have a different style to visually separate the levels by classing the first label in each col group */ \n\t.ui-table-reflow th .ui-table-cell-label-top,\n\t.ui-table-reflow td .ui-table-cell-label-top {\n\t\tdisplay: block;\n\t\tpadding: .4em 0;\n\t\tmargin: .4em 0;\n\t\ttext-transform: uppercase;\n\t\tfont-size: .9em;\n\t\tfont-weight: normal;\n\t}\n}\n/* Breakpoint to show as a standard table at 560px (35em x 16px) or wider */ \n@media ( min-width: 35em ) {\n\t/* Show the table header rows */ \n\t.ui-table-reflow.ui-responsive td,\n\t.ui-table-reflow.ui-responsive th,\n\t.ui-table-reflow.ui-responsive tbody th,\n\t.ui-table-reflow.ui-responsive tbody td,\n\t.ui-table-reflow.ui-responsive thead td,\n\t.ui-table-reflow.ui-responsive thead th {\n\t\tdisplay: table-cell;\n\t\tmargin: 0;\n\t}\n\t/* Hide the labels in each cell */ \n\t.ui-table-reflow.ui-responsive td .ui-table-cell-label,\n\t.ui-table-reflow.ui-responsive th .ui-table-cell-label { \n\t\tdisplay: none;\n\t}\n}\n/* Hack to make IE9 and WP7.5 treat cells like block level elements, scoped to ui-responsive class */ \n/* Applied in a max-width media query up to the table layout breakpoint so we don't need to negate this*/ \n@media ( max-width: 35em ) {\n\t.ui-table-reflow.ui-responsive td,\n\t.ui-table-reflow.ui-responsive th {\n\t\twidth: 100%;\n\t\t-webkit-box-sizing: border-box;\n\t\t-moz-box-sizing: border-box;\n\t\tbox-sizing: border-box;\n\t\tfloat: left;\n\t\tclear: left;\n\t}\n}\n/* Panel */\n.ui-panel {\n\twidth: 17em;\n\tmin-height: 100%;\n\tmax-height: none;\n\tborder-width: 0;\n\tposition: absolute;\n\ttop: 0;\n\tdisplay: block;\n}\n.ui-panel-closed {\n\twidth: 0;\n\tmax-height: 100%;\n\toverflow: hidden;\n\tvisibility: hidden;\n\tleft: 0;\n\tclip: rect(1px,1px,1px,1px);\n}\n.ui-panel-fixed {\n\tposition: fixed;\n\tbottom: -1px; /* Fixes gap on Chrome for Android */\n\tpadding-bottom: 1px;\n}\n.ui-panel-display-reveal {\n\tz-index: 1;\n}\n.ui-panel-display-push {\n\tz-index: 999;\n}\n.ui-panel-display-overlay {\n\tz-index: 1001; /* Fixed toolbars have z-index 1000 */\n}\n.ui-panel-inner {\n\tpadding: 1em;\n}\n/* Container, page and wrapper */\n.ui-panel-page-container {\n\toverflow-x: visible;\n}\n.ui-panel-page-container-themed .ui-page-active {\n\tbackground: none;\n}\n.ui-panel-wrapper {\n\tposition: relative;\n\tmin-height: inherit;\n\tborder: 0;\n\toverflow-x: hidden;\n\tz-index: 999;\n}\n/* Fixed toolbars */\n.ui-panel-fixed-toolbar {\n\toverflow-x: hidden;\n}\n/* Dismiss */\n.ui-panel-dismiss {\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n\tright: 0;\n\theight: 100%;\n\tz-index: 1002;\n\tdisplay: none;\n}\n.ui-panel-dismiss-open {\n\tdisplay: block;\n}\n/* Animate class is added to panel, wrapper and fixed toolbars */\n.ui-panel-animate {\n\t-webkit-transition: -webkit-transform 300ms ease;\n\t-webkit-transition-duration: 300ms;\n\t-moz-transition: -moz-transform 300ms ease;\n\ttransition: transform 300ms ease;\n}\n/* Fix for Windows Phone issue #6349: unset the transition for transforms in case of fixed toolbars. */\n@media screen and ( max-device-width: 768px ) {\n\t.ui-page-header-fixed .ui-panel-animate.ui-panel-wrapper,\n\t.ui-page-footer-fixed .ui-panel-animate.ui-panel-wrapper,\n\t.ui-panel-animate.ui-panel-fixed-toolbar {\n\t\t-ms-transition: none;\n\t}\n\t/* We need a transitionend event ... */\n\t.ui-panel-animate.ui-panel-fixed-toolbar {\n\t\t-ms-transition: -ms-transform 1ms;\n\t\t-ms-transform: rotate(0deg);\n\t}\n}\n/* Hardware acceleration for smoother transitions on WebKit browsers */\n.ui-panel-animate.ui-panel:not(.ui-panel-display-reveal) {\n\t-webkit-backface-visibility: hidden;\n\t-webkit-transform: translate3d(0,0,0);\n}\n/* Panel positioning (for overlay and push) */\n/* Panel left closed */\n.ui-panel-position-left {\n\tleft: -17em;\n}\n/* Panel left closed animated */\n.ui-panel-animate.ui-panel-position-left.ui-panel-display-overlay,\n.ui-panel-animate.ui-panel-position-left.ui-panel-display-push {\n\tleft: 0;\n\t-webkit-transform: translate3d(-17em,0,0);\n\t-moz-transform: translate3d(-17em,0,0);\n\ttransform: translate3d(-17em,0,0);\n}\n/* Panel left open */\n.ui-panel-position-left.ui-panel-display-reveal, /* Unset \"panel left closed\" for reveal */\n.ui-panel-open.ui-panel-position-left {\n\tleft: 0;\n}\n/* Panel left open animated */\n.ui-panel-animate.ui-panel-open.ui-panel-position-left.ui-panel-display-overlay,\n.ui-panel-animate.ui-panel-open.ui-panel-position-left.ui-panel-display-push {\n\t-webkit-transform: translate3d(0,0,0);\n\ttransform: translate3d(0,0,0);\n\t-moz-transform: none;\n}\n/* Panel right closed */\n.ui-panel-position-right {\n\tright: -17em;\n}\n/* Panel right closed animated */\n.ui-panel-animate.ui-panel-position-right.ui-panel-display-overlay,\n.ui-panel-animate.ui-panel-position-right.ui-panel-display-push {\n\tright: 0;\n\t-webkit-transform: translate3d(17em,0,0);\n\t-moz-transform: translate3d(17em,0,0);\n\ttransform: translate3d(17em,0,0);\n}\n/* Panel right open */\n.ui-panel-position-right.ui-panel-display-reveal, /* Unset \"panel right closed\" for reveal */\n.ui-panel-position-right.ui-panel-open {\n\tright: 0;\n}\n/* Panel right open animated */\n.ui-panel-animate.ui-panel-open.ui-panel-position-right.ui-panel-display-overlay,\n.ui-panel-animate.ui-panel-open.ui-panel-position-right.ui-panel-display-push {\n\t-webkit-transform: translate3d(0,0,0);\n\ttransform: translate3d(0,0,0);\n\t-moz-transform: none;\n}\n/* Wrapper and fixed toolbars positioning (for reveal and push) */\n/* Panel left open */\n.ui-panel-page-content-position-left {\n\tleft: 17em;\n\tright: -17em;\n}\n/* Panel left open animated */\n.ui-panel-animate.ui-panel-page-content-position-left {\n\tleft: 0;\n\tright: 0;\n\t-webkit-transform: translate3d(17em,0,0);\n\t-moz-transform: translate3d(17em,0,0);\n\ttransform: translate3d(17em,0,0);\n}\n/* Panel right open */\n.ui-panel-page-content-position-right {\n\tleft: -17em;\n\tright: 17em;\n}\n/* Panel right open animated */\n.ui-panel-animate.ui-panel-page-content-position-right {\n\tleft: 0;\n\tright: 0;\n\t-webkit-transform: translate3d(-17em,0,0);\n\t-moz-transform: translate3d(-17em,0,0);\n\ttransform: translate3d(-17em,0,0);\n}\n/* Dismiss model open */\n.ui-panel-dismiss-open.ui-panel-dismiss-position-left {\n\tleft: 17em;\n}\n.ui-panel-dismiss-open.ui-panel-dismiss-position-right {\n\tright: 17em;\n}\n/* Shadows and borders */\n.ui-panel-display-reveal {\n\t-webkit-box-shadow: inset -5px 0 5px rgba(0,0,0,.15);\n\t-moz-box-shadow: inset -5px 0 5px rgba(0,0,0,.15);\n\tbox-shadow: inset -5px 0 5px rgba(0,0,0,.15);\n}\n.ui-panel-position-right.ui-panel-display-reveal {\n\t-webkit-box-shadow: inset 5px 0 5px rgba(0,0,0,.15);\n\t-moz-box-shadow: inset 5px 0 5px rgba(0,0,0,.15);\n\tbox-shadow: inset 5px 0 5px rgba(0,0,0,.15);\n}\n.ui-panel-display-overlay {\n\t-webkit-box-shadow: 5px 0 5px rgba(0,0,0,.15);\n\t-moz-box-shadow: 5px 0 5px rgba(0,0,0,.15);\n\tbox-shadow: 5px 0 5px rgba(0,0,0,.15);\n}\n.ui-panel-position-right.ui-panel-display-overlay {\n\t-webkit-box-shadow: -5px 0 5px rgba(0,0,0,.15);\n\t-moz-box-shadow: -5px 0 5px rgba(0,0,0,.15);\n\tbox-shadow: -5px 0 5px rgba(0,0,0,.15);\n}\n.ui-panel-open.ui-panel-position-left.ui-panel-display-push {\n\tborder-right-width: 1px;\n\tmargin-right: -1px;\n}\n.ui-panel-page-content-position-left.ui-panel-page-content-display-push {\n\tmargin-left: 1px;\n\twidth: auto;\n}\n.ui-panel-open.ui-panel-position-right.ui-panel-display-push {\n\tborder-left-width: 1px;\n\tmargin-left: -1px;\n}\n.ui-panel-page-content-position-right.ui-panel-page-content-display-push {\n\tmargin-right: 1px;\n\twidth: auto;\n}\n/* Responsive: wrap on wide viewports once open */\n@media (min-width:55em) {\n\t.ui-responsive-panel .ui-panel-page-content-open.ui-panel-page-content-position-left {\n\t\tmargin-right: 17em;\n\t}\n\t.ui-responsive-panel .ui-panel-page-content-open.ui-panel-page-content-position-right {\n\t\tmargin-left: 17em;\n\t}\n\t.ui-responsive-panel .ui-panel-page-content-open {\n\t\twidth: auto;\t\n\t}\n\t.ui-responsive-panel .ui-panel-dismiss-display-push,\n\t.ui-responsive-panel.ui-page-active ~ .ui-panel-dismiss-display-push {\n\t\tdisplay: none;\n\t}\n}\n.ui-tabs {\n\tposition: relative;/* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as \"fixed\") */\n\tpadding: .2em;\n}\n"
  },
  {
    "path": "stenogotchi/ui/web/static/js/jquery.mobile/jquery.mobile-1.4.5.js",
    "content": "/*!\n* jQuery Mobile 1.4.5\n* Git HEAD hash: 68e55e78b292634d3991c795f06f5e37a512decc <> Date: Fri Oct 31 2014 17:33:30 UTC\n* http://jquerymobile.com\n*\n* Copyright 2010, 2014 jQuery Foundation, Inc. and othercontributors\n* Released under the MIT license.\n* http://jquery.org/license\n*\n*/\n\n\n(function ( root, doc, factory ) {\n\tif ( typeof define === \"function\" && define.amd ) {\n\t\t// AMD. Register as an anonymous module.\n\t\tdefine( [ \"jquery\" ], function ( $ ) {\n\t\t\tfactory( $, root, doc );\n\t\t\treturn $.mobile;\n\t\t});\n\t} else {\n\t\t// Browser globals\n\t\tfactory( root.jQuery, root, doc );\n\t}\n}( this, document, function ( jQuery, window, document, undefined ) {\n(function( $ ) {\n\t$.mobile = {};\n}( jQuery ));\n\n/*!\n * jQuery UI Core c0ab71056b936627e8a7821f03c044aec6280a40\n * http://jqueryui.com\n *\n * Copyright 2013 jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n *\n * http://api.jqueryui.com/category/ui-core/\n */\n(function( $, undefined ) {\n\nvar uuid = 0,\n\truniqueId = /^ui-id-\\d+$/;\n\n// $.ui might exist from components with no dependencies, e.g., $.ui.position\n$.ui = $.ui || {};\n\n$.extend( $.ui, {\n\tversion: \"c0ab71056b936627e8a7821f03c044aec6280a40\",\n\n\tkeyCode: {\n\t\tBACKSPACE: 8,\n\t\tCOMMA: 188,\n\t\tDELETE: 46,\n\t\tDOWN: 40,\n\t\tEND: 35,\n\t\tENTER: 13,\n\t\tESCAPE: 27,\n\t\tHOME: 36,\n\t\tLEFT: 37,\n\t\tPAGE_DOWN: 34,\n\t\tPAGE_UP: 33,\n\t\tPERIOD: 190,\n\t\tRIGHT: 39,\n\t\tSPACE: 32,\n\t\tTAB: 9,\n\t\tUP: 38\n\t}\n});\n\n// plugins\n$.fn.extend({\n\tfocus: (function( orig ) {\n\t\treturn function( delay, fn ) {\n\t\t\treturn typeof delay === \"number\" ?\n\t\t\t\tthis.each(function() {\n\t\t\t\t\tvar elem = this;\n\t\t\t\t\tsetTimeout(function() {\n\t\t\t\t\t\t$( elem ).focus();\n\t\t\t\t\t\tif ( fn ) {\n\t\t\t\t\t\t\tfn.call( elem );\n\t\t\t\t\t\t}\n\t\t\t\t\t}, delay );\n\t\t\t\t}) :\n\t\t\t\torig.apply( this, arguments );\n\t\t};\n\t})( $.fn.focus ),\n\n\tscrollParent: function() {\n\t\tvar scrollParent;\n\t\tif (($.ui.ie && (/(static|relative)/).test(this.css(\"position\"))) || (/absolute/).test(this.css(\"position\"))) {\n\t\t\tscrollParent = this.parents().filter(function() {\n\t\t\t\treturn (/(relative|absolute|fixed)/).test($.css(this,\"position\")) && (/(auto|scroll)/).test($.css(this,\"overflow\")+$.css(this,\"overflow-y\")+$.css(this,\"overflow-x\"));\n\t\t\t}).eq(0);\n\t\t} else {\n\t\t\tscrollParent = this.parents().filter(function() {\n\t\t\t\treturn (/(auto|scroll)/).test($.css(this,\"overflow\")+$.css(this,\"overflow-y\")+$.css(this,\"overflow-x\"));\n\t\t\t}).eq(0);\n\t\t}\n\n\t\treturn ( /fixed/ ).test( this.css( \"position\") ) || !scrollParent.length ? $( this[ 0 ].ownerDocument || document ) : scrollParent;\n\t},\n\n\tuniqueId: function() {\n\t\treturn this.each(function() {\n\t\t\tif ( !this.id ) {\n\t\t\t\tthis.id = \"ui-id-\" + (++uuid);\n\t\t\t}\n\t\t});\n\t},\n\n\tremoveUniqueId: function() {\n\t\treturn this.each(function() {\n\t\t\tif ( runiqueId.test( this.id ) ) {\n\t\t\t\t$( this ).removeAttr( \"id\" );\n\t\t\t}\n\t\t});\n\t}\n});\n\n// selectors\nfunction focusable( element, isTabIndexNotNaN ) {\n\tvar map, mapName, img,\n\t\tnodeName = element.nodeName.toLowerCase();\n\tif ( \"area\" === nodeName ) {\n\t\tmap = element.parentNode;\n\t\tmapName = map.name;\n\t\tif ( !element.href || !mapName || map.nodeName.toLowerCase() !== \"map\" ) {\n\t\t\treturn false;\n\t\t}\n\t\timg = $( \"img[usemap=#\" + mapName + \"]\" )[0];\n\t\treturn !!img && visible( img );\n\t}\n\treturn ( /input|select|textarea|button|object/.test( nodeName ) ?\n\t\t!element.disabled :\n\t\t\"a\" === nodeName ?\n\t\t\telement.href || isTabIndexNotNaN :\n\t\t\tisTabIndexNotNaN) &&\n\t\t// the element and all of its ancestors must be visible\n\t\tvisible( element );\n}\n\nfunction visible( element ) {\n\treturn $.expr.filters.visible( element ) &&\n\t\t!$( element ).parents().addBack().filter(function() {\n\t\t\treturn $.css( this, \"visibility\" ) === \"hidden\";\n\t\t}).length;\n}\n\n$.extend( $.expr[ \":\" ], {\n\tdata: $.expr.createPseudo ?\n\t\t$.expr.createPseudo(function( dataName ) {\n\t\t\treturn function( elem ) {\n\t\t\t\treturn !!$.data( elem, dataName );\n\t\t\t};\n\t\t}) :\n\t\t// support: jQuery <1.8\n\t\tfunction( elem, i, match ) {\n\t\t\treturn !!$.data( elem, match[ 3 ] );\n\t\t},\n\n\tfocusable: function( element ) {\n\t\treturn focusable( element, !isNaN( $.attr( element, \"tabindex\" ) ) );\n\t},\n\n\ttabbable: function( element ) {\n\t\tvar tabIndex = $.attr( element, \"tabindex\" ),\n\t\t\tisTabIndexNaN = isNaN( tabIndex );\n\t\treturn ( isTabIndexNaN || tabIndex >= 0 ) && focusable( element, !isTabIndexNaN );\n\t}\n});\n\n// support: jQuery <1.8\nif ( !$( \"<a>\" ).outerWidth( 1 ).jquery ) {\n\t$.each( [ \"Width\", \"Height\" ], function( i, name ) {\n\t\tvar side = name === \"Width\" ? [ \"Left\", \"Right\" ] : [ \"Top\", \"Bottom\" ],\n\t\t\ttype = name.toLowerCase(),\n\t\t\torig = {\n\t\t\t\tinnerWidth: $.fn.innerWidth,\n\t\t\t\tinnerHeight: $.fn.innerHeight,\n\t\t\t\touterWidth: $.fn.outerWidth,\n\t\t\t\touterHeight: $.fn.outerHeight\n\t\t\t};\n\n\t\tfunction reduce( elem, size, border, margin ) {\n\t\t\t$.each( side, function() {\n\t\t\t\tsize -= parseFloat( $.css( elem, \"padding\" + this ) ) || 0;\n\t\t\t\tif ( border ) {\n\t\t\t\t\tsize -= parseFloat( $.css( elem, \"border\" + this + \"Width\" ) ) || 0;\n\t\t\t\t}\n\t\t\t\tif ( margin ) {\n\t\t\t\t\tsize -= parseFloat( $.css( elem, \"margin\" + this ) ) || 0;\n\t\t\t\t}\n\t\t\t});\n\t\t\treturn size;\n\t\t}\n\n\t\t$.fn[ \"inner\" + name ] = function( size ) {\n\t\t\tif ( size === undefined ) {\n\t\t\t\treturn orig[ \"inner\" + name ].call( this );\n\t\t\t}\n\n\t\t\treturn this.each(function() {\n\t\t\t\t$( this ).css( type, reduce( this, size ) + \"px\" );\n\t\t\t});\n\t\t};\n\n\t\t$.fn[ \"outer\" + name] = function( size, margin ) {\n\t\t\tif ( typeof size !== \"number\" ) {\n\t\t\t\treturn orig[ \"outer\" + name ].call( this, size );\n\t\t\t}\n\n\t\t\treturn this.each(function() {\n\t\t\t\t$( this).css( type, reduce( this, size, true, margin ) + \"px\" );\n\t\t\t});\n\t\t};\n\t});\n}\n\n// support: jQuery <1.8\nif ( !$.fn.addBack ) {\n\t$.fn.addBack = function( selector ) {\n\t\treturn this.add( selector == null ?\n\t\t\tthis.prevObject : this.prevObject.filter( selector )\n\t\t);\n\t};\n}\n\n// support: jQuery 1.6.1, 1.6.2 (http://bugs.jquery.com/ticket/9413)\nif ( $( \"<a>\" ).data( \"a-b\", \"a\" ).removeData( \"a-b\" ).data( \"a-b\" ) ) {\n\t$.fn.removeData = (function( removeData ) {\n\t\treturn function( key ) {\n\t\t\tif ( arguments.length ) {\n\t\t\t\treturn removeData.call( this, $.camelCase( key ) );\n\t\t\t} else {\n\t\t\t\treturn removeData.call( this );\n\t\t\t}\n\t\t};\n\t})( $.fn.removeData );\n}\n\n\n\n\n\n// deprecated\n$.ui.ie = !!/msie [\\w.]+/.exec( navigator.userAgent.toLowerCase() );\n\n$.support.selectstart = \"onselectstart\" in document.createElement( \"div\" );\n$.fn.extend({\n\tdisableSelection: function() {\n\t\treturn this.bind( ( $.support.selectstart ? \"selectstart\" : \"mousedown\" ) +\n\t\t\t\".ui-disableSelection\", function( event ) {\n\t\t\t\tevent.preventDefault();\n\t\t\t});\n\t},\n\n\tenableSelection: function() {\n\t\treturn this.unbind( \".ui-disableSelection\" );\n\t},\n\n\tzIndex: function( zIndex ) {\n\t\tif ( zIndex !== undefined ) {\n\t\t\treturn this.css( \"zIndex\", zIndex );\n\t\t}\n\n\t\tif ( this.length ) {\n\t\t\tvar elem = $( this[ 0 ] ), position, value;\n\t\t\twhile ( elem.length && elem[ 0 ] !== document ) {\n\t\t\t\t// Ignore z-index if position is set to a value where z-index is ignored by the browser\n\t\t\t\t// This makes behavior of this function consistent across browsers\n\t\t\t\t// WebKit always returns auto if the element is positioned\n\t\t\t\tposition = elem.css( \"position\" );\n\t\t\t\tif ( position === \"absolute\" || position === \"relative\" || position === \"fixed\" ) {\n\t\t\t\t\t// IE returns 0 when zIndex is not specified\n\t\t\t\t\t// other browsers return a string\n\t\t\t\t\t// we ignore the case of nested elements with an explicit value of 0\n\t\t\t\t\t// <div style=\"z-index: -10;\"><div style=\"z-index: 0;\"></div></div>\n\t\t\t\t\tvalue = parseInt( elem.css( \"zIndex\" ), 10 );\n\t\t\t\t\tif ( !isNaN( value ) && value !== 0 ) {\n\t\t\t\t\t\treturn value;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telem = elem.parent();\n\t\t\t}\n\t\t}\n\n\t\treturn 0;\n\t}\n});\n\n// $.ui.plugin is deprecated. Use $.widget() extensions instead.\n$.ui.plugin = {\n\tadd: function( module, option, set ) {\n\t\tvar i,\n\t\t\tproto = $.ui[ module ].prototype;\n\t\tfor ( i in set ) {\n\t\t\tproto.plugins[ i ] = proto.plugins[ i ] || [];\n\t\t\tproto.plugins[ i ].push( [ option, set[ i ] ] );\n\t\t}\n\t},\n\tcall: function( instance, name, args, allowDisconnected ) {\n\t\tvar i,\n\t\t\tset = instance.plugins[ name ];\n\n\t\tif ( !set ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( !allowDisconnected && ( !instance.element[ 0 ].parentNode || instance.element[ 0 ].parentNode.nodeType === 11 ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tfor ( i = 0; i < set.length; i++ ) {\n\t\t\tif ( instance.options[ set[ i ][ 0 ] ] ) {\n\t\t\t\tset[ i ][ 1 ].apply( instance.element, args );\n\t\t\t}\n\t\t}\n\t}\n};\n\n})( jQuery );\n\n(function( $, window, undefined ) {\n\n\t// Subtract the height of external toolbars from the page height, if the page does not have\n\t// internal toolbars of the same type. We take care to use the widget options if we find a\n\t// widget instance and the element's data-attributes otherwise.\n\tvar compensateToolbars = function( page, desiredHeight ) {\n\t\tvar pageParent = page.parent(),\n\t\t\ttoolbarsAffectingHeight = [],\n\n\t\t\t// We use this function to filter fixed toolbars with option updatePagePadding set to\n\t\t\t// true (which is the default) from our height subtraction, because fixed toolbars with\n\t\t\t// option updatePagePadding set to true compensate for their presence by adding padding\n\t\t\t// to the active page. We want to avoid double-counting by also subtracting their\n\t\t\t// height from the desired page height.\n\t\t\tnoPadders = function() {\n\t\t\t\tvar theElement = $( this ),\n\t\t\t\t\twidgetOptions = $.mobile.toolbar && theElement.data( \"mobile-toolbar\" ) ?\n\t\t\t\t\t\ttheElement.toolbar( \"option\" ) : {\n\t\t\t\t\t\t\tposition: theElement.attr( \"data-\" + $.mobile.ns + \"position\" ),\n\t\t\t\t\t\t\tupdatePagePadding: ( theElement.attr( \"data-\" + $.mobile.ns +\n\t\t\t\t\t\t\t\t\"update-page-padding\" ) !== false )\n\t\t\t\t\t\t};\n\n\t\t\t\treturn !( widgetOptions.position === \"fixed\" &&\n\t\t\t\t\twidgetOptions.updatePagePadding === true );\n\t\t\t},\n\t\t\texternalHeaders = pageParent.children( \":jqmData(role='header')\" ).filter( noPadders ),\n\t\t\tinternalHeaders = page.children( \":jqmData(role='header')\" ),\n\t\t\texternalFooters = pageParent.children( \":jqmData(role='footer')\" ).filter( noPadders ),\n\t\t\tinternalFooters = page.children( \":jqmData(role='footer')\" );\n\n\t\t// If we have no internal headers, but we do have external headers, then their height\n\t\t// reduces the page height\n\t\tif ( internalHeaders.length === 0 && externalHeaders.length > 0 ) {\n\t\t\ttoolbarsAffectingHeight = toolbarsAffectingHeight.concat( externalHeaders.toArray() );\n\t\t}\n\n\t\t// If we have no internal footers, but we do have external footers, then their height\n\t\t// reduces the page height\n\t\tif ( internalFooters.length === 0 && externalFooters.length > 0 ) {\n\t\t\ttoolbarsAffectingHeight = toolbarsAffectingHeight.concat( externalFooters.toArray() );\n\t\t}\n\n\t\t$.each( toolbarsAffectingHeight, function( index, value ) {\n\t\t\tdesiredHeight -= $( value ).outerHeight();\n\t\t});\n\n\t\t// Height must be at least zero\n\t\treturn Math.max( 0, desiredHeight );\n\t};\n\n\t$.extend( $.mobile, {\n\t\t// define the window and the document objects\n\t\twindow: $( window ),\n\t\tdocument: $( document ),\n\n\t\t// TODO: Remove and use $.ui.keyCode directly\n\t\tkeyCode: $.ui.keyCode,\n\n\t\t// Place to store various widget extensions\n\t\tbehaviors: {},\n\n\t\t// Scroll page vertically: scroll to 0 to hide iOS address bar, or pass a Y value\n\t\tsilentScroll: function( ypos ) {\n\t\t\tif ( $.type( ypos ) !== \"number\" ) {\n\t\t\t\typos = $.mobile.defaultHomeScroll;\n\t\t\t}\n\n\t\t\t// prevent scrollstart and scrollstop events\n\t\t\t$.event.special.scrollstart.enabled = false;\n\n\t\t\tsetTimeout(function() {\n\t\t\t\twindow.scrollTo( 0, ypos );\n\t\t\t\t$.mobile.document.trigger( \"silentscroll\", { x: 0, y: ypos });\n\t\t\t}, 20 );\n\n\t\t\tsetTimeout(function() {\n\t\t\t\t$.event.special.scrollstart.enabled = true;\n\t\t\t}, 150 );\n\t\t},\n\n\t\tgetClosestBaseUrl: function( ele )\t{\n\t\t\t// Find the closest page and extract out its url.\n\t\t\tvar url = $( ele ).closest( \".ui-page\" ).jqmData( \"url\" ),\n\t\t\t\tbase = $.mobile.path.documentBase.hrefNoHash;\n\n\t\t\tif ( !$.mobile.dynamicBaseEnabled || !url || !$.mobile.path.isPath( url ) ) {\n\t\t\t\turl = base;\n\t\t\t}\n\n\t\t\treturn $.mobile.path.makeUrlAbsolute( url, base );\n\t\t},\n\t\tremoveActiveLinkClass: function( forceRemoval ) {\n\t\t\tif ( !!$.mobile.activeClickedLink &&\n\t\t\t\t( !$.mobile.activeClickedLink.closest( \".\" + $.mobile.activePageClass ).length ||\n\t\t\t\t\tforceRemoval ) ) {\n\n\t\t\t\t$.mobile.activeClickedLink.removeClass( $.mobile.activeBtnClass );\n\t\t\t}\n\t\t\t$.mobile.activeClickedLink = null;\n\t\t},\n\n\t\t// DEPRECATED in 1.4\n\t\t// Find the closest parent with a theme class on it. Note that\n\t\t// we are not using $.fn.closest() on purpose here because this\n\t\t// method gets called quite a bit and we need it to be as fast\n\t\t// as possible.\n\t\tgetInheritedTheme: function( el, defaultTheme ) {\n\t\t\tvar e = el[ 0 ],\n\t\t\t\tltr = \"\",\n\t\t\t\tre = /ui-(bar|body|overlay)-([a-z])\\b/,\n\t\t\t\tc, m;\n\t\t\twhile ( e ) {\n\t\t\t\tc = e.className || \"\";\n\t\t\t\tif ( c && ( m = re.exec( c ) ) && ( ltr = m[ 2 ] ) ) {\n\t\t\t\t\t// We found a parent with a theme class\n\t\t\t\t\t// on it so bail from this loop.\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\te = e.parentNode;\n\t\t\t}\n\t\t\t// Return the theme letter we found, if none, return the\n\t\t\t// specified default.\n\t\t\treturn ltr || defaultTheme || \"a\";\n\t\t},\n\n\t\tenhanceable: function( elements ) {\n\t\t\treturn this.haveParents( elements, \"enhance\" );\n\t\t},\n\n\t\thijackable: function( elements ) {\n\t\t\treturn this.haveParents( elements, \"ajax\" );\n\t\t},\n\n\t\thaveParents: function( elements, attr ) {\n\t\t\tif ( !$.mobile.ignoreContentEnabled ) {\n\t\t\t\treturn elements;\n\t\t\t}\n\n\t\t\tvar count = elements.length,\n\t\t\t\t$newSet = $(),\n\t\t\t\te, $element, excluded,\n\t\t\t\ti, c;\n\n\t\t\tfor ( i = 0; i < count; i++ ) {\n\t\t\t\t$element = elements.eq( i );\n\t\t\t\texcluded = false;\n\t\t\t\te = elements[ i ];\n\n\t\t\t\twhile ( e ) {\n\t\t\t\t\tc = e.getAttribute ? e.getAttribute( \"data-\" + $.mobile.ns + attr ) : \"\";\n\n\t\t\t\t\tif ( c === \"false\" ) {\n\t\t\t\t\t\texcluded = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\te = e.parentNode;\n\t\t\t\t}\n\n\t\t\t\tif ( !excluded ) {\n\t\t\t\t\t$newSet = $newSet.add( $element );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn $newSet;\n\t\t},\n\n\t\tgetScreenHeight: function() {\n\t\t\t// Native innerHeight returns more accurate value for this across platforms,\n\t\t\t// jQuery version is here as a normalized fallback for platforms like Symbian\n\t\t\treturn window.innerHeight || $.mobile.window.height();\n\t\t},\n\n\t\t//simply set the active page's minimum height to screen height, depending on orientation\n\t\tresetActivePageHeight: function( height ) {\n\t\t\tvar page = $( \".\" + $.mobile.activePageClass ),\n\t\t\t\tpageHeight = page.height(),\n\t\t\t\tpageOuterHeight = page.outerHeight( true );\n\n\t\t\theight = compensateToolbars( page,\n\t\t\t\t( typeof height === \"number\" ) ? height : $.mobile.getScreenHeight() );\n\n\t\t\t// Remove any previous min-height setting\n\t\t\tpage.css( \"min-height\", \"\" );\n\n\t\t\t// Set the minimum height only if the height as determined by CSS is insufficient\n\t\t\tif ( page.height() < height ) {\n\t\t\t\tpage.css( \"min-height\", height - ( pageOuterHeight - pageHeight ) );\n\t\t\t}\n\t\t},\n\n\t\tloading: function() {\n\t\t\t// If this is the first call to this function, instantiate a loader widget\n\t\t\tvar loader = this.loading._widget || $( $.mobile.loader.prototype.defaultHtml ).loader(),\n\n\t\t\t\t// Call the appropriate method on the loader\n\t\t\t\treturnValue = loader.loader.apply( loader, arguments );\n\n\t\t\t// Make sure the loader is retained for future calls to this function.\n\t\t\tthis.loading._widget = loader;\n\n\t\t\treturn returnValue;\n\t\t}\n\t});\n\n\t$.addDependents = function( elem, newDependents ) {\n\t\tvar $elem = $( elem ),\n\t\t\tdependents = $elem.jqmData( \"dependents\" ) || $();\n\n\t\t$elem.jqmData( \"dependents\", $( dependents ).add( newDependents ) );\n\t};\n\n\t// plugins\n\t$.fn.extend({\n\t\tremoveWithDependents: function() {\n\t\t\t$.removeWithDependents( this );\n\t\t},\n\n\t\t// Enhance child elements\n\t\tenhanceWithin: function() {\n\t\t\tvar index,\n\t\t\t\twidgetElements = {},\n\t\t\t\tkeepNative = $.mobile.page.prototype.keepNativeSelector(),\n\t\t\t\tthat = this;\n\n\t\t\t// Add no js class to elements\n\t\t\tif ( $.mobile.nojs ) {\n\t\t\t\t$.mobile.nojs( this );\n\t\t\t}\n\n\t\t\t// Bind links for ajax nav\n\t\t\tif ( $.mobile.links ) {\n\t\t\t\t$.mobile.links( this );\n\t\t\t}\n\n\t\t\t// Degrade inputs for styleing\n\t\t\tif ( $.mobile.degradeInputsWithin ) {\n\t\t\t\t$.mobile.degradeInputsWithin( this );\n\t\t\t}\n\n\t\t\t// Run buttonmarkup\n\t\t\tif ( $.fn.buttonMarkup ) {\n\t\t\t\tthis.find( $.fn.buttonMarkup.initSelector ).not( keepNative )\n\t\t\t\t.jqmEnhanceable().buttonMarkup();\n\t\t\t}\n\n\t\t\t// Add classes for fieldContain\n\t\t\tif ( $.fn.fieldcontain ) {\n\t\t\t\tthis.find( \":jqmData(role='fieldcontain')\" ).not( keepNative )\n\t\t\t\t.jqmEnhanceable().fieldcontain();\n\t\t\t}\n\n\t\t\t// Enhance widgets\n\t\t\t$.each( $.mobile.widgets, function( name, constructor ) {\n\n\t\t\t\t// If initSelector not false find elements\n\t\t\t\tif ( constructor.initSelector ) {\n\n\t\t\t\t\t// Filter elements that should not be enhanced based on parents\n\t\t\t\t\tvar elements = $.mobile.enhanceable( that.find( constructor.initSelector ) );\n\n\t\t\t\t\t// If any matching elements remain filter ones with keepNativeSelector\n\t\t\t\t\tif ( elements.length > 0 ) {\n\n\t\t\t\t\t\t// $.mobile.page.prototype.keepNativeSelector is deprecated this is just for backcompat\n\t\t\t\t\t\t// Switch to $.mobile.keepNative in 1.5 which is just a value not a function\n\t\t\t\t\t\telements = elements.not( keepNative );\n\t\t\t\t\t}\n\n\t\t\t\t\t// Enhance whatever is left\n\t\t\t\t\tif ( elements.length > 0 ) {\n\t\t\t\t\t\twidgetElements[ constructor.prototype.widgetName ] = elements;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tfor ( index in widgetElements ) {\n\t\t\t\twidgetElements[ index ][ index ]();\n\t\t\t}\n\n\t\t\treturn this;\n\t\t},\n\n\t\taddDependents: function( newDependents ) {\n\t\t\t$.addDependents( this, newDependents );\n\t\t},\n\n\t\t// note that this helper doesn't attempt to handle the callback\n\t\t// or setting of an html element's text, its only purpose is\n\t\t// to return the html encoded version of the text in all cases. (thus the name)\n\t\tgetEncodedText: function() {\n\t\t\treturn $( \"<a>\" ).text( this.text() ).html();\n\t\t},\n\n\t\t// fluent helper function for the mobile namespaced equivalent\n\t\tjqmEnhanceable: function() {\n\t\t\treturn $.mobile.enhanceable( this );\n\t\t},\n\n\t\tjqmHijackable: function() {\n\t\t\treturn $.mobile.hijackable( this );\n\t\t}\n\t});\n\n\t$.removeWithDependents = function( nativeElement ) {\n\t\tvar element = $( nativeElement );\n\n\t\t( element.jqmData( \"dependents\" ) || $() ).remove();\n\t\telement.remove();\n\t};\n\t$.addDependents = function( nativeElement, newDependents ) {\n\t\tvar element = $( nativeElement ),\n\t\t\tdependents = element.jqmData( \"dependents\" ) || $();\n\n\t\telement.jqmData( \"dependents\", $( dependents ).add( newDependents ) );\n\t};\n\n\t$.find.matches = function( expr, set ) {\n\t\treturn $.find( expr, null, null, set );\n\t};\n\n\t$.find.matchesSelector = function( node, expr ) {\n\t\treturn $.find( expr, null, null, [ node ] ).length > 0;\n\t};\n\n})( jQuery, this );\n\n(function( $, window, undefined ) {\n\t$.extend( $.mobile, {\n\n\t\t// Version of the jQuery Mobile Framework\n\t\tversion: \"1.4.5\",\n\n\t\t// Deprecated and no longer used in 1.4 remove in 1.5\n\t\t// Define the url parameter used for referencing widget-generated sub-pages.\n\t\t// Translates to example.html&ui-page=subpageIdentifier\n\t\t// hash segment before &ui-page= is used to make Ajax request\n\t\tsubPageUrlKey: \"ui-page\",\n\n\t\thideUrlBar: true,\n\n\t\t// Keepnative Selector\n\t\tkeepNative: \":jqmData(role='none'), :jqmData(role='nojs')\",\n\n\t\t// Deprecated in 1.4 remove in 1.5\n\t\t// Class assigned to page currently in view, and during transitions\n\t\tactivePageClass: \"ui-page-active\",\n\n\t\t// Deprecated in 1.4 remove in 1.5\n\t\t// Class used for \"active\" button state, from CSS framework\n\t\tactiveBtnClass: \"ui-btn-active\",\n\n\t\t// Deprecated in 1.4 remove in 1.5\n\t\t// Class used for \"focus\" form element state, from CSS framework\n\t\tfocusClass: \"ui-focus\",\n\n\t\t// Automatically handle clicks and form submissions through Ajax, when same-domain\n\t\tajaxEnabled: true,\n\n\t\t// Automatically load and show pages based on location.hash\n\t\thashListeningEnabled: true,\n\n\t\t// disable to prevent jquery from bothering with links\n\t\tlinkBindingEnabled: true,\n\n\t\t// Set default page transition - 'none' for no transitions\n\t\tdefaultPageTransition: \"fade\",\n\n\t\t// Set maximum window width for transitions to apply - 'false' for no limit\n\t\tmaxTransitionWidth: false,\n\n\t\t// Minimum scroll distance that will be remembered when returning to a page\n\t\t// Deprecated remove in 1.5\n\t\tminScrollBack: 0,\n\n\t\t// Set default dialog transition - 'none' for no transitions\n\t\tdefaultDialogTransition: \"pop\",\n\n\t\t// Error response message - appears when an Ajax page request fails\n\t\tpageLoadErrorMessage: \"Error Loading Page\",\n\n\t\t// For error messages, which theme does the box use?\n\t\tpageLoadErrorMessageTheme: \"a\",\n\n\t\t// replace calls to window.history.back with phonegaps navigation helper\n\t\t// where it is provided on the window object\n\t\tphonegapNavigationEnabled: false,\n\n\t\t//automatically initialize the DOM when it's ready\n\t\tautoInitializePage: true,\n\n\t\tpushStateEnabled: true,\n\n\t\t// allows users to opt in to ignoring content by marking a parent element as\n\t\t// data-ignored\n\t\tignoreContentEnabled: false,\n\n\t\tbuttonMarkup: {\n\t\t\thoverDelay: 200\n\t\t},\n\n\t\t// disable the alteration of the dynamic base tag or links in the case\n\t\t// that a dynamic base tag isn't supported\n\t\tdynamicBaseEnabled: true,\n\n\t\t// default the property to remove dependency on assignment in init module\n\t\tpageContainer: $(),\n\n\t\t//enable cross-domain page support\n\t\tallowCrossDomainPages: false,\n\n\t\tdialogHashKey: \"&ui-state=dialog\"\n\t});\n})( jQuery, this );\n\n/*!\n * jQuery UI Widget c0ab71056b936627e8a7821f03c044aec6280a40\n * http://jqueryui.com\n *\n * Copyright 2013 jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n *\n * http://api.jqueryui.com/jQuery.widget/\n */\n(function( $, undefined ) {\n\nvar uuid = 0,\n\tslice = Array.prototype.slice,\n\t_cleanData = $.cleanData;\n$.cleanData = function( elems ) {\n\tfor ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {\n\t\ttry {\n\t\t\t$( elem ).triggerHandler( \"remove\" );\n\t\t// http://bugs.jquery.com/ticket/8235\n\t\t} catch( e ) {}\n\t}\n\t_cleanData( elems );\n};\n\n$.widget = function( name, base, prototype ) {\n\tvar fullName, existingConstructor, constructor, basePrototype,\n\t\t// proxiedPrototype allows the provided prototype to remain unmodified\n\t\t// so that it can be used as a mixin for multiple widgets (#8876)\n\t\tproxiedPrototype = {},\n\t\tnamespace = name.split( \".\" )[ 0 ];\n\n\tname = name.split( \".\" )[ 1 ];\n\tfullName = namespace + \"-\" + name;\n\n\tif ( !prototype ) {\n\t\tprototype = base;\n\t\tbase = $.Widget;\n\t}\n\n\t// create selector for plugin\n\t$.expr[ \":\" ][ fullName.toLowerCase() ] = function( elem ) {\n\t\treturn !!$.data( elem, fullName );\n\t};\n\n\t$[ namespace ] = $[ namespace ] || {};\n\texistingConstructor = $[ namespace ][ name ];\n\tconstructor = $[ namespace ][ name ] = function( options, element ) {\n\t\t// allow instantiation without \"new\" keyword\n\t\tif ( !this._createWidget ) {\n\t\t\treturn new constructor( options, element );\n\t\t}\n\n\t\t// allow instantiation without initializing for simple inheritance\n\t\t// must use \"new\" keyword (the code above always passes args)\n\t\tif ( arguments.length ) {\n\t\t\tthis._createWidget( options, element );\n\t\t}\n\t};\n\t// extend with the existing constructor to carry over any static properties\n\t$.extend( constructor, existingConstructor, {\n\t\tversion: prototype.version,\n\t\t// copy the object used to create the prototype in case we need to\n\t\t// redefine the widget later\n\t\t_proto: $.extend( {}, prototype ),\n\t\t// track widgets that inherit from this widget in case this widget is\n\t\t// redefined after a widget inherits from it\n\t\t_childConstructors: []\n\t});\n\n\tbasePrototype = new base();\n\t// we need to make the options hash a property directly on the new instance\n\t// otherwise we'll modify the options hash on the prototype that we're\n\t// inheriting from\n\tbasePrototype.options = $.widget.extend( {}, basePrototype.options );\n\t$.each( prototype, function( prop, value ) {\n\t\tif ( !$.isFunction( value ) ) {\n\t\t\tproxiedPrototype[ prop ] = value;\n\t\t\treturn;\n\t\t}\n\t\tproxiedPrototype[ prop ] = (function() {\n\t\t\tvar _super = function() {\n\t\t\t\t\treturn base.prototype[ prop ].apply( this, arguments );\n\t\t\t\t},\n\t\t\t\t_superApply = function( args ) {\n\t\t\t\t\treturn base.prototype[ prop ].apply( this, args );\n\t\t\t\t};\n\t\t\treturn function() {\n\t\t\t\tvar __super = this._super,\n\t\t\t\t\t__superApply = this._superApply,\n\t\t\t\t\treturnValue;\n\n\t\t\t\tthis._super = _super;\n\t\t\t\tthis._superApply = _superApply;\n\n\t\t\t\treturnValue = value.apply( this, arguments );\n\n\t\t\t\tthis._super = __super;\n\t\t\t\tthis._superApply = __superApply;\n\n\t\t\t\treturn returnValue;\n\t\t\t};\n\t\t})();\n\t});\n\tconstructor.prototype = $.widget.extend( basePrototype, {\n\t\t// TODO: remove support for widgetEventPrefix\n\t\t// always use the name + a colon as the prefix, e.g., draggable:start\n\t\t// don't prefix for widgets that aren't DOM-based\n\t\twidgetEventPrefix: existingConstructor ? (basePrototype.widgetEventPrefix || name) : name\n\t}, proxiedPrototype, {\n\t\tconstructor: constructor,\n\t\tnamespace: namespace,\n\t\twidgetName: name,\n\t\twidgetFullName: fullName\n\t});\n\n\t// If this widget is being redefined then we need to find all widgets that\n\t// are inheriting from it and redefine all of them so that they inherit from\n\t// the new version of this widget. We're essentially trying to replace one\n\t// level in the prototype chain.\n\tif ( existingConstructor ) {\n\t\t$.each( existingConstructor._childConstructors, function( i, child ) {\n\t\t\tvar childPrototype = child.prototype;\n\n\t\t\t// redefine the child widget using the same prototype that was\n\t\t\t// originally used, but inherit from the new version of the base\n\t\t\t$.widget( childPrototype.namespace + \".\" + childPrototype.widgetName, constructor, child._proto );\n\t\t});\n\t\t// remove the list of existing child constructors from the old constructor\n\t\t// so the old child constructors can be garbage collected\n\t\tdelete existingConstructor._childConstructors;\n\t} else {\n\t\tbase._childConstructors.push( constructor );\n\t}\n\n\t$.widget.bridge( name, constructor );\n\n\treturn constructor;\n};\n\n$.widget.extend = function( target ) {\n\tvar input = slice.call( arguments, 1 ),\n\t\tinputIndex = 0,\n\t\tinputLength = input.length,\n\t\tkey,\n\t\tvalue;\n\tfor ( ; inputIndex < inputLength; inputIndex++ ) {\n\t\tfor ( key in input[ inputIndex ] ) {\n\t\t\tvalue = input[ inputIndex ][ key ];\n\t\t\tif ( input[ inputIndex ].hasOwnProperty( key ) && value !== undefined ) {\n\t\t\t\t// Clone objects\n\t\t\t\tif ( $.isPlainObject( value ) ) {\n\t\t\t\t\ttarget[ key ] = $.isPlainObject( target[ key ] ) ?\n\t\t\t\t\t\t$.widget.extend( {}, target[ key ], value ) :\n\t\t\t\t\t\t// Don't extend strings, arrays, etc. with objects\n\t\t\t\t\t\t$.widget.extend( {}, value );\n\t\t\t\t// Copy everything else by reference\n\t\t\t\t} else {\n\t\t\t\t\ttarget[ key ] = value;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn target;\n};\n\n$.widget.bridge = function( name, object ) {\n\tvar fullName = object.prototype.widgetFullName || name;\n\t$.fn[ name ] = function( options ) {\n\t\tvar isMethodCall = typeof options === \"string\",\n\t\t\targs = slice.call( arguments, 1 ),\n\t\t\treturnValue = this;\n\n\t\t// allow multiple hashes to be passed on init\n\t\toptions = !isMethodCall && args.length ?\n\t\t\t$.widget.extend.apply( null, [ options ].concat(args) ) :\n\t\t\toptions;\n\n\t\tif ( isMethodCall ) {\n\t\t\tthis.each(function() {\n\t\t\t\tvar methodValue,\n\t\t\t\t\tinstance = $.data( this, fullName );\n\t\t\t\tif ( options === \"instance\" ) {\n\t\t\t\t\treturnValue = instance;\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tif ( !instance ) {\n\t\t\t\t\treturn $.error( \"cannot call methods on \" + name + \" prior to initialization; \" +\n\t\t\t\t\t\t\"attempted to call method '\" + options + \"'\" );\n\t\t\t\t}\n\t\t\t\tif ( !$.isFunction( instance[options] ) || options.charAt( 0 ) === \"_\" ) {\n\t\t\t\t\treturn $.error( \"no such method '\" + options + \"' for \" + name + \" widget instance\" );\n\t\t\t\t}\n\t\t\t\tmethodValue = instance[ options ].apply( instance, args );\n\t\t\t\tif ( methodValue !== instance && methodValue !== undefined ) {\n\t\t\t\t\treturnValue = methodValue && methodValue.jquery ?\n\t\t\t\t\t\treturnValue.pushStack( methodValue.get() ) :\n\t\t\t\t\t\tmethodValue;\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tthis.each(function() {\n\t\t\t\tvar instance = $.data( this, fullName );\n\t\t\t\tif ( instance ) {\n\t\t\t\t\tinstance.option( options || {} )._init();\n\t\t\t\t} else {\n\t\t\t\t\t$.data( this, fullName, new object( options, this ) );\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\treturn returnValue;\n\t};\n};\n\n$.Widget = function( /* options, element */ ) {};\n$.Widget._childConstructors = [];\n\n$.Widget.prototype = {\n\twidgetName: \"widget\",\n\twidgetEventPrefix: \"\",\n\tdefaultElement: \"<div>\",\n\toptions: {\n\t\tdisabled: false,\n\n\t\t// callbacks\n\t\tcreate: null\n\t},\n\t_createWidget: function( options, element ) {\n\t\telement = $( element || this.defaultElement || this )[ 0 ];\n\t\tthis.element = $( element );\n\t\tthis.uuid = uuid++;\n\t\tthis.eventNamespace = \".\" + this.widgetName + this.uuid;\n\t\tthis.options = $.widget.extend( {},\n\t\t\tthis.options,\n\t\t\tthis._getCreateOptions(),\n\t\t\toptions );\n\n\t\tthis.bindings = $();\n\t\tthis.hoverable = $();\n\t\tthis.focusable = $();\n\n\t\tif ( element !== this ) {\n\t\t\t$.data( element, this.widgetFullName, this );\n\t\t\tthis._on( true, this.element, {\n\t\t\t\tremove: function( event ) {\n\t\t\t\t\tif ( event.target === element ) {\n\t\t\t\t\t\tthis.destroy();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t\tthis.document = $( element.style ?\n\t\t\t\t// element within the document\n\t\t\t\telement.ownerDocument :\n\t\t\t\t// element is window or document\n\t\t\t\telement.document || element );\n\t\t\tthis.window = $( this.document[0].defaultView || this.document[0].parentWindow );\n\t\t}\n\n\t\tthis._create();\n\t\tthis._trigger( \"create\", null, this._getCreateEventData() );\n\t\tthis._init();\n\t},\n\t_getCreateOptions: $.noop,\n\t_getCreateEventData: $.noop,\n\t_create: $.noop,\n\t_init: $.noop,\n\n\tdestroy: function() {\n\t\tthis._destroy();\n\t\t// we can probably remove the unbind calls in 2.0\n\t\t// all event bindings should go through this._on()\n\t\tthis.element\n\t\t\t.unbind( this.eventNamespace )\n\t\t\t.removeData( this.widgetFullName )\n\t\t\t// support: jquery <1.6.3\n\t\t\t// http://bugs.jquery.com/ticket/9413\n\t\t\t.removeData( $.camelCase( this.widgetFullName ) );\n\t\tthis.widget()\n\t\t\t.unbind( this.eventNamespace )\n\t\t\t.removeAttr( \"aria-disabled\" )\n\t\t\t.removeClass(\n\t\t\t\tthis.widgetFullName + \"-disabled \" +\n\t\t\t\t\"ui-state-disabled\" );\n\n\t\t// clean up events and states\n\t\tthis.bindings.unbind( this.eventNamespace );\n\t\tthis.hoverable.removeClass( \"ui-state-hover\" );\n\t\tthis.focusable.removeClass( \"ui-state-focus\" );\n\t},\n\t_destroy: $.noop,\n\n\twidget: function() {\n\t\treturn this.element;\n\t},\n\n\toption: function( key, value ) {\n\t\tvar options = key,\n\t\t\tparts,\n\t\t\tcurOption,\n\t\t\ti;\n\n\t\tif ( arguments.length === 0 ) {\n\t\t\t// don't return a reference to the internal hash\n\t\t\treturn $.widget.extend( {}, this.options );\n\t\t}\n\n\t\tif ( typeof key === \"string\" ) {\n\t\t\t// handle nested keys, e.g., \"foo.bar\" => { foo: { bar: ___ } }\n\t\t\toptions = {};\n\t\t\tparts = key.split( \".\" );\n\t\t\tkey = parts.shift();\n\t\t\tif ( parts.length ) {\n\t\t\t\tcurOption = options[ key ] = $.widget.extend( {}, this.options[ key ] );\n\t\t\t\tfor ( i = 0; i < parts.length - 1; i++ ) {\n\t\t\t\t\tcurOption[ parts[ i ] ] = curOption[ parts[ i ] ] || {};\n\t\t\t\t\tcurOption = curOption[ parts[ i ] ];\n\t\t\t\t}\n\t\t\t\tkey = parts.pop();\n\t\t\t\tif ( value === undefined ) {\n\t\t\t\t\treturn curOption[ key ] === undefined ? null : curOption[ key ];\n\t\t\t\t}\n\t\t\t\tcurOption[ key ] = value;\n\t\t\t} else {\n\t\t\t\tif ( value === undefined ) {\n\t\t\t\t\treturn this.options[ key ] === undefined ? null : this.options[ key ];\n\t\t\t\t}\n\t\t\t\toptions[ key ] = value;\n\t\t\t}\n\t\t}\n\n\t\tthis._setOptions( options );\n\n\t\treturn this;\n\t},\n\t_setOptions: function( options ) {\n\t\tvar key;\n\n\t\tfor ( key in options ) {\n\t\t\tthis._setOption( key, options[ key ] );\n\t\t}\n\n\t\treturn this;\n\t},\n\t_setOption: function( key, value ) {\n\t\tthis.options[ key ] = value;\n\n\t\tif ( key === \"disabled\" ) {\n\t\t\tthis.widget()\n\t\t\t\t.toggleClass( this.widgetFullName + \"-disabled\", !!value );\n\t\t\tthis.hoverable.removeClass( \"ui-state-hover\" );\n\t\t\tthis.focusable.removeClass( \"ui-state-focus\" );\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tenable: function() {\n\t\treturn this._setOptions({ disabled: false });\n\t},\n\tdisable: function() {\n\t\treturn this._setOptions({ disabled: true });\n\t},\n\n\t_on: function( suppressDisabledCheck, element, handlers ) {\n\t\tvar delegateElement,\n\t\t\tinstance = this;\n\n\t\t// no suppressDisabledCheck flag, shuffle arguments\n\t\tif ( typeof suppressDisabledCheck !== \"boolean\" ) {\n\t\t\thandlers = element;\n\t\t\telement = suppressDisabledCheck;\n\t\t\tsuppressDisabledCheck = false;\n\t\t}\n\n\t\t// no element argument, shuffle and use this.element\n\t\tif ( !handlers ) {\n\t\t\thandlers = element;\n\t\t\telement = this.element;\n\t\t\tdelegateElement = this.widget();\n\t\t} else {\n\t\t\t// accept selectors, DOM elements\n\t\t\telement = delegateElement = $( element );\n\t\t\tthis.bindings = this.bindings.add( element );\n\t\t}\n\n\t\t$.each( handlers, function( event, handler ) {\n\t\t\tfunction handlerProxy() {\n\t\t\t\t// allow widgets to customize the disabled handling\n\t\t\t\t// - disabled as an array instead of boolean\n\t\t\t\t// - disabled class as method for disabling individual parts\n\t\t\t\tif ( !suppressDisabledCheck &&\n\t\t\t\t\t\t( instance.options.disabled === true ||\n\t\t\t\t\t\t\t$( this ).hasClass( \"ui-state-disabled\" ) ) ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\treturn ( typeof handler === \"string\" ? instance[ handler ] : handler )\n\t\t\t\t\t.apply( instance, arguments );\n\t\t\t}\n\n\t\t\t// copy the guid so direct unbinding works\n\t\t\tif ( typeof handler !== \"string\" ) {\n\t\t\t\thandlerProxy.guid = handler.guid =\n\t\t\t\t\thandler.guid || handlerProxy.guid || $.guid++;\n\t\t\t}\n\n\t\t\tvar match = event.match( /^(\\w+)\\s*(.*)$/ ),\n\t\t\t\teventName = match[1] + instance.eventNamespace,\n\t\t\t\tselector = match[2];\n\t\t\tif ( selector ) {\n\t\t\t\tdelegateElement.delegate( selector, eventName, handlerProxy );\n\t\t\t} else {\n\t\t\t\telement.bind( eventName, handlerProxy );\n\t\t\t}\n\t\t});\n\t},\n\n\t_off: function( element, eventName ) {\n\t\teventName = (eventName || \"\").split( \" \" ).join( this.eventNamespace + \" \" ) + this.eventNamespace;\n\t\telement.unbind( eventName ).undelegate( eventName );\n\t},\n\n\t_delay: function( handler, delay ) {\n\t\tfunction handlerProxy() {\n\t\t\treturn ( typeof handler === \"string\" ? instance[ handler ] : handler )\n\t\t\t\t.apply( instance, arguments );\n\t\t}\n\t\tvar instance = this;\n\t\treturn setTimeout( handlerProxy, delay || 0 );\n\t},\n\n\t_hoverable: function( element ) {\n\t\tthis.hoverable = this.hoverable.add( element );\n\t\tthis._on( element, {\n\t\t\tmouseenter: function( event ) {\n\t\t\t\t$( event.currentTarget ).addClass( \"ui-state-hover\" );\n\t\t\t},\n\t\t\tmouseleave: function( event ) {\n\t\t\t\t$( event.currentTarget ).removeClass( \"ui-state-hover\" );\n\t\t\t}\n\t\t});\n\t},\n\n\t_focusable: function( element ) {\n\t\tthis.focusable = this.focusable.add( element );\n\t\tthis._on( element, {\n\t\t\tfocusin: function( event ) {\n\t\t\t\t$( event.currentTarget ).addClass( \"ui-state-focus\" );\n\t\t\t},\n\t\t\tfocusout: function( event ) {\n\t\t\t\t$( event.currentTarget ).removeClass( \"ui-state-focus\" );\n\t\t\t}\n\t\t});\n\t},\n\n\t_trigger: function( type, event, data ) {\n\t\tvar prop, orig,\n\t\t\tcallback = this.options[ type ];\n\n\t\tdata = data || {};\n\t\tevent = $.Event( event );\n\t\tevent.type = ( type === this.widgetEventPrefix ?\n\t\t\ttype :\n\t\t\tthis.widgetEventPrefix + type ).toLowerCase();\n\t\t// the original event may come from any element\n\t\t// so we need to reset the target on the new event\n\t\tevent.target = this.element[ 0 ];\n\n\t\t// copy original event properties over to the new event\n\t\torig = event.originalEvent;\n\t\tif ( orig ) {\n\t\t\tfor ( prop in orig ) {\n\t\t\t\tif ( !( prop in event ) ) {\n\t\t\t\t\tevent[ prop ] = orig[ prop ];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tthis.element.trigger( event, data );\n\t\treturn !( $.isFunction( callback ) &&\n\t\t\tcallback.apply( this.element[0], [ event ].concat( data ) ) === false ||\n\t\t\tevent.isDefaultPrevented() );\n\t}\n};\n\n$.each( { show: \"fadeIn\", hide: \"fadeOut\" }, function( method, defaultEffect ) {\n\t$.Widget.prototype[ \"_\" + method ] = function( element, options, callback ) {\n\t\tif ( typeof options === \"string\" ) {\n\t\t\toptions = { effect: options };\n\t\t}\n\t\tvar hasOptions,\n\t\t\teffectName = !options ?\n\t\t\t\tmethod :\n\t\t\t\toptions === true || typeof options === \"number\" ?\n\t\t\t\t\tdefaultEffect :\n\t\t\t\t\toptions.effect || defaultEffect;\n\t\toptions = options || {};\n\t\tif ( typeof options === \"number\" ) {\n\t\t\toptions = { duration: options };\n\t\t}\n\t\thasOptions = !$.isEmptyObject( options );\n\t\toptions.complete = callback;\n\t\tif ( options.delay ) {\n\t\t\telement.delay( options.delay );\n\t\t}\n\t\tif ( hasOptions && $.effects && $.effects.effect[ effectName ] ) {\n\t\t\telement[ method ]( options );\n\t\t} else if ( effectName !== method && element[ effectName ] ) {\n\t\t\telement[ effectName ]( options.duration, options.easing, callback );\n\t\t} else {\n\t\t\telement.queue(function( next ) {\n\t\t\t\t$( this )[ method ]();\n\t\t\t\tif ( callback ) {\n\t\t\t\t\tcallback.call( element[ 0 ] );\n\t\t\t\t}\n\t\t\t\tnext();\n\t\t\t});\n\t\t}\n\t};\n});\n\n})( jQuery );\n\n(function( $, window, undefined ) {\n\tvar nsNormalizeDict = {},\n\t\toldFind = $.find,\n\t\trbrace = /(?:\\{[\\s\\S]*\\}|\\[[\\s\\S]*\\])$/,\n\t\tjqmDataRE = /:jqmData\\(([^)]*)\\)/g;\n\n\t$.extend( $.mobile, {\n\n\t\t// Namespace used framework-wide for data-attrs. Default is no namespace\n\n\t\tns: \"\",\n\n\t\t// Retrieve an attribute from an element and perform some massaging of the value\n\n\t\tgetAttribute: function( element, key ) {\n\t\t\tvar data;\n\n\t\t\telement = element.jquery ? element[0] : element;\n\n\t\t\tif ( element && element.getAttribute ) {\n\t\t\t\tdata = element.getAttribute( \"data-\" + $.mobile.ns + key );\n\t\t\t}\n\n\t\t\t// Copied from core's src/data.js:dataAttr()\n\t\t\t// Convert from a string to a proper data type\n\t\t\ttry {\n\t\t\t\tdata = data === \"true\" ? true :\n\t\t\t\t\tdata === \"false\" ? false :\n\t\t\t\t\tdata === \"null\" ? null :\n\t\t\t\t\t// Only convert to a number if it doesn't change the string\n\t\t\t\t\t+data + \"\" === data ? +data :\n\t\t\t\t\trbrace.test( data ) ? JSON.parse( data ) :\n\t\t\t\t\tdata;\n\t\t\t} catch( err ) {}\n\n\t\t\treturn data;\n\t\t},\n\n\t\t// Expose our cache for testing purposes.\n\t\tnsNormalizeDict: nsNormalizeDict,\n\n\t\t// Take a data attribute property, prepend the namespace\n\t\t// and then camel case the attribute string. Add the result\n\t\t// to our nsNormalizeDict so we don't have to do this again.\n\t\tnsNormalize: function( prop ) {\n\t\t\treturn nsNormalizeDict[ prop ] ||\n\t\t\t\t( nsNormalizeDict[ prop ] = $.camelCase( $.mobile.ns + prop ) );\n\t\t},\n\n\t\t// Find the closest javascript page element to gather settings data jsperf test\n\t\t// http://jsperf.com/single-complex-selector-vs-many-complex-selectors/edit\n\t\t// possibly naive, but it shows that the parsing overhead for *just* the page selector vs\n\t\t// the page and dialog selector is negligable. This could probably be speed up by\n\t\t// doing a similar parent node traversal to the one found in the inherited theme code above\n\t\tclosestPageData: function( $target ) {\n\t\t\treturn $target\n\t\t\t\t.closest( \":jqmData(role='page'), :jqmData(role='dialog')\" )\n\t\t\t\t.data( \"mobile-page\" );\n\t\t}\n\n\t});\n\n\t// Mobile version of data and removeData and hasData methods\n\t// ensures all data is set and retrieved using jQuery Mobile's data namespace\n\t$.fn.jqmData = function( prop, value ) {\n\t\tvar result;\n\t\tif ( typeof prop !== \"undefined\" ) {\n\t\t\tif ( prop ) {\n\t\t\t\tprop = $.mobile.nsNormalize( prop );\n\t\t\t}\n\n\t\t\t// undefined is permitted as an explicit input for the second param\n\t\t\t// in this case it returns the value and does not set it to undefined\n\t\t\tif ( arguments.length < 2 || value === undefined ) {\n\t\t\t\tresult = this.data( prop );\n\t\t\t} else {\n\t\t\t\tresult = this.data( prop, value );\n\t\t\t}\n\t\t}\n\t\treturn result;\n\t};\n\n\t$.jqmData = function( elem, prop, value ) {\n\t\tvar result;\n\t\tif ( typeof prop !== \"undefined\" ) {\n\t\t\tresult = $.data( elem, prop ? $.mobile.nsNormalize( prop ) : prop, value );\n\t\t}\n\t\treturn result;\n\t};\n\n\t$.fn.jqmRemoveData = function( prop ) {\n\t\treturn this.removeData( $.mobile.nsNormalize( prop ) );\n\t};\n\n\t$.jqmRemoveData = function( elem, prop ) {\n\t\treturn $.removeData( elem, $.mobile.nsNormalize( prop ) );\n\t};\n\n\t$.find = function( selector, context, ret, extra ) {\n\t\tif ( selector.indexOf( \":jqmData\" ) > -1 ) {\n\t\t\tselector = selector.replace( jqmDataRE, \"[data-\" + ( $.mobile.ns || \"\" ) + \"$1]\" );\n\t\t}\n\n\t\treturn oldFind.call( this, selector, context, ret, extra );\n\t};\n\n\t$.extend( $.find, oldFind );\n\n})( jQuery, this );\n\n(function( $, undefined ) {\n\nvar rcapitals = /[A-Z]/g,\n\treplaceFunction = function( c ) {\n\t\treturn \"-\" + c.toLowerCase();\n\t};\n\n$.extend( $.Widget.prototype, {\n\t_getCreateOptions: function() {\n\t\tvar option, value,\n\t\t\telem = this.element[ 0 ],\n\t\t\toptions = {};\n\n\t\t//\n\t\tif ( !$.mobile.getAttribute( elem, \"defaults\" ) ) {\n\t\t\tfor ( option in this.options ) {\n\t\t\t\tvalue = $.mobile.getAttribute( elem, option.replace( rcapitals, replaceFunction ) );\n\n\t\t\t\tif ( value != null ) {\n\t\t\t\t\toptions[ option ] = value;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn options;\n\t}\n});\n\n//TODO: Remove in 1.5 for backcompat only\n$.mobile.widget = $.Widget;\n\n})( jQuery );\n\n\n(function( $ ) {\n\t// TODO move loader class down into the widget settings\n\tvar loaderClass = \"ui-loader\", $html = $( \"html\" );\n\n\t$.widget( \"mobile.loader\", {\n\t\t// NOTE if the global config settings are defined they will override these\n\t\t//      options\n\t\toptions: {\n\t\t\t// the theme for the loading message\n\t\t\ttheme: \"a\",\n\n\t\t\t// whether the text in the loading message is shown\n\t\t\ttextVisible: false,\n\n\t\t\t// custom html for the inner content of the loading message\n\t\t\thtml: \"\",\n\n\t\t\t// the text to be displayed when the popup is shown\n\t\t\ttext: \"loading\"\n\t\t},\n\n\t\tdefaultHtml: \"<div class='\" + loaderClass + \"'>\" +\n\t\t\t\"<span class='ui-icon-loading'></span>\" +\n\t\t\t\"<h1></h1>\" +\n\t\t\t\"</div>\",\n\n\t\t// For non-fixed supportin browsers. Position at y center (if scrollTop supported), above the activeBtn (if defined), or just 100px from top\n\t\tfakeFixLoader: function() {\n\t\t\tvar activeBtn = $( \".\" + $.mobile.activeBtnClass ).first();\n\n\t\t\tthis.element\n\t\t\t\t.css({\n\t\t\t\t\ttop: $.support.scrollTop && this.window.scrollTop() + this.window.height() / 2 ||\n\t\t\t\t\t\tactiveBtn.length && activeBtn.offset().top || 100\n\t\t\t\t});\n\t\t},\n\n\t\t// check position of loader to see if it appears to be \"fixed\" to center\n\t\t// if not, use abs positioning\n\t\tcheckLoaderPosition: function() {\n\t\t\tvar offset = this.element.offset(),\n\t\t\t\tscrollTop = this.window.scrollTop(),\n\t\t\t\tscreenHeight = $.mobile.getScreenHeight();\n\n\t\t\tif ( offset.top < scrollTop || ( offset.top - scrollTop ) > screenHeight ) {\n\t\t\t\tthis.element.addClass( \"ui-loader-fakefix\" );\n\t\t\t\tthis.fakeFixLoader();\n\t\t\t\tthis.window\n\t\t\t\t\t.unbind( \"scroll\", this.checkLoaderPosition )\n\t\t\t\t\t.bind( \"scroll\", $.proxy( this.fakeFixLoader, this ) );\n\t\t\t}\n\t\t},\n\n\t\tresetHtml: function() {\n\t\t\tthis.element.html( $( this.defaultHtml ).html() );\n\t\t},\n\n\t\t// Turn on/off page loading message. Theme doubles as an object argument\n\t\t// with the following shape: { theme: '', text: '', html: '', textVisible: '' }\n\t\t// NOTE that the $.mobile.loading* settings and params past the first are deprecated\n\t\t// TODO sweet jesus we need to break some of this out\n\t\tshow: function( theme, msgText, textonly ) {\n\t\t\tvar textVisible, message, loadSettings;\n\n\t\t\tthis.resetHtml();\n\n\t\t\t// use the prototype options so that people can set them globally at\n\t\t\t// mobile init. Consistency, it's what's for dinner\n\t\t\tif ( $.type( theme ) === \"object\" ) {\n\t\t\t\tloadSettings = $.extend( {}, this.options, theme );\n\n\t\t\t\ttheme = loadSettings.theme;\n\t\t\t} else {\n\t\t\t\tloadSettings = this.options;\n\n\t\t\t\t// here we prefer the theme value passed as a string argument, then\n\t\t\t\t// we prefer the global option because we can't use undefined default\n\t\t\t\t// prototype options, then the prototype option\n\t\t\t\ttheme = theme || loadSettings.theme;\n\t\t\t}\n\n\t\t\t// set the message text, prefer the param, then the settings object\n\t\t\t// then loading message\n\t\t\tmessage = msgText || ( loadSettings.text === false ? \"\" : loadSettings.text );\n\n\t\t\t// prepare the dom\n\t\t\t$html.addClass( \"ui-loading\" );\n\n\t\t\ttextVisible = loadSettings.textVisible;\n\n\t\t\t// add the proper css given the options (theme, text, etc)\n\t\t\t// Force text visibility if the second argument was supplied, or\n\t\t\t// if the text was explicitly set in the object args\n\t\t\tthis.element.attr(\"class\", loaderClass +\n\t\t\t\t\" ui-corner-all ui-body-\" + theme +\n\t\t\t\t\" ui-loader-\" + ( textVisible || msgText || theme.text ? \"verbose\" : \"default\" ) +\n\t\t\t\t( loadSettings.textonly || textonly ? \" ui-loader-textonly\" : \"\" ) );\n\n\t\t\t// TODO verify that jquery.fn.html is ok to use in both cases here\n\t\t\t//      this might be overly defensive in preventing unknowing xss\n\t\t\t// if the html attribute is defined on the loading settings, use that\n\t\t\t// otherwise use the fallbacks from above\n\t\t\tif ( loadSettings.html ) {\n\t\t\t\tthis.element.html( loadSettings.html );\n\t\t\t} else {\n\t\t\t\tthis.element.find( \"h1\" ).text( message );\n\t\t\t}\n\n\t\t\t// If the pagecontainer widget has been defined we may use the :mobile-pagecontainer\n\t\t\t// and attach to the element on which the pagecontainer widget has been defined. If not,\n\t\t\t// we attach to the body.\n\t\t\tthis.element.appendTo( $.mobile.pagecontainer ?\n\t\t\t\t$( \":mobile-pagecontainer\" ) : $( \"body\" ) );\n\n\t\t\t// check that the loader is visible\n\t\t\tthis.checkLoaderPosition();\n\n\t\t\t// on scroll check the loader position\n\t\t\tthis.window.bind( \"scroll\", $.proxy( this.checkLoaderPosition, this ) );\n\t\t},\n\n\t\thide: function() {\n\t\t\t$html.removeClass( \"ui-loading\" );\n\n\t\t\tif ( this.options.text ) {\n\t\t\t\tthis.element.removeClass( \"ui-loader-fakefix\" );\n\t\t\t}\n\n\t\t\tthis.window.unbind( \"scroll\", this.fakeFixLoader );\n\t\t\tthis.window.unbind( \"scroll\", this.checkLoaderPosition );\n\t\t}\n\t});\n\n})(jQuery, this);\n\n\n/*!\n * jQuery hashchange event - v1.3 - 7/21/2010\n * http://benalman.com/projects/jquery-hashchange-plugin/\n * \n * Copyright (c) 2010 \"Cowboy\" Ben Alman\n * Dual licensed under the MIT and GPL licenses.\n * http://benalman.com/about/license/\n */\n\n// Script: jQuery hashchange event\n//\n// *Version: 1.3, Last updated: 7/21/2010*\n// \n// Project Home - http://benalman.com/projects/jquery-hashchange-plugin/\n// GitHub       - http://github.com/cowboy/jquery-hashchange/\n// Source       - http://github.com/cowboy/jquery-hashchange/raw/master/jquery.ba-hashchange.js\n// (Minified)   - http://github.com/cowboy/jquery-hashchange/raw/master/jquery.ba-hashchange.min.js (0.8kb gzipped)\n// \n// About: License\n// \n// Copyright (c) 2010 \"Cowboy\" Ben Alman,\n// Dual licensed under the MIT and GPL licenses.\n// http://benalman.com/about/license/\n// \n// About: Examples\n// \n// These working examples, complete with fully commented code, illustrate a few\n// ways in which this plugin can be used.\n// \n// hashchange event - http://benalman.com/code/projects/jquery-hashchange/examples/hashchange/\n// document.domain - http://benalman.com/code/projects/jquery-hashchange/examples/document_domain/\n// \n// About: Support and Testing\n// \n// Information about what version or versions of jQuery this plugin has been\n// tested with, what browsers it has been tested in, and where the unit tests\n// reside (so you can test it yourself).\n// \n// jQuery Versions - 1.2.6, 1.3.2, 1.4.1, 1.4.2\n// Browsers Tested - Internet Explorer 6-8, Firefox 2-4, Chrome 5-6, Safari 3.2-5,\n//                   Opera 9.6-10.60, iPhone 3.1, Android 1.6-2.2, BlackBerry 4.6-5.\n// Unit Tests      - http://benalman.com/code/projects/jquery-hashchange/unit/\n// \n// About: Known issues\n// \n// While this jQuery hashchange event implementation is quite stable and\n// robust, there are a few unfortunate browser bugs surrounding expected\n// hashchange event-based behaviors, independent of any JavaScript\n// window.onhashchange abstraction. See the following examples for more\n// information:\n// \n// Chrome: Back Button - http://benalman.com/code/projects/jquery-hashchange/examples/bug-chrome-back-button/\n// Firefox: Remote XMLHttpRequest - http://benalman.com/code/projects/jquery-hashchange/examples/bug-firefox-remote-xhr/\n// WebKit: Back Button in an Iframe - http://benalman.com/code/projects/jquery-hashchange/examples/bug-webkit-hash-iframe/\n// Safari: Back Button from a different domain - http://benalman.com/code/projects/jquery-hashchange/examples/bug-safari-back-from-diff-domain/\n// \n// Also note that should a browser natively support the window.onhashchange \n// event, but not report that it does, the fallback polling loop will be used.\n// \n// About: Release History\n// \n// 1.3   - (7/21/2010) Reorganized IE6/7 Iframe code to make it more\n//         \"removable\" for mobile-only development. Added IE6/7 document.title\n//         support. Attempted to make Iframe as hidden as possible by using\n//         techniques from http://www.paciellogroup.com/blog/?p=604. Added \n//         support for the \"shortcut\" format $(window).hashchange( fn ) and\n//         $(window).hashchange() like jQuery provides for built-in events.\n//         Renamed jQuery.hashchangeDelay to <jQuery.fn.hashchange.delay> and\n//         lowered its default value to 50. Added <jQuery.fn.hashchange.domain>\n//         and <jQuery.fn.hashchange.src> properties plus document-domain.html\n//         file to address access denied issues when setting document.domain in\n//         IE6/7.\n// 1.2   - (2/11/2010) Fixed a bug where coming back to a page using this plugin\n//         from a page on another domain would cause an error in Safari 4. Also,\n//         IE6/7 Iframe is now inserted after the body (this actually works),\n//         which prevents the page from scrolling when the event is first bound.\n//         Event can also now be bound before DOM ready, but it won't be usable\n//         before then in IE6/7.\n// 1.1   - (1/21/2010) Incorporated document.documentMode test to fix IE8 bug\n//         where browser version is incorrectly reported as 8.0, despite\n//         inclusion of the X-UA-Compatible IE=EmulateIE7 meta tag.\n// 1.0   - (1/9/2010) Initial Release. Broke out the jQuery BBQ event.special\n//         window.onhashchange functionality into a separate plugin for users\n//         who want just the basic event & back button support, without all the\n//         extra awesomeness that BBQ provides. This plugin will be included as\n//         part of jQuery BBQ, but also be available separately.\n\n(function($,window,undefined){\n  '$:nomunge'; // Used by YUI compressor.\n  \n  // Reused string.\n  var str_hashchange = 'hashchange',\n    \n    // Method / object references.\n    doc = document,\n    fake_onhashchange,\n    special = $.event.special,\n    \n    // Does the browser support window.onhashchange? Note that IE8 running in\n    // IE7 compatibility mode reports true for 'onhashchange' in window, even\n    // though the event isn't supported, so also test document.documentMode.\n    doc_mode = doc.documentMode,\n    supports_onhashchange = 'on' + str_hashchange in window && ( doc_mode === undefined || doc_mode > 7 );\n  \n  // Get location.hash (or what you'd expect location.hash to be) sans any\n  // leading #. Thanks for making this necessary, Firefox!\n  function get_fragment( url ) {\n    url = url || location.href;\n    return '#' + url.replace( /^[^#]*#?(.*)$/, '$1' );\n  };\n  \n  // Method: jQuery.fn.hashchange\n  // \n  // Bind a handler to the window.onhashchange event or trigger all bound\n  // window.onhashchange event handlers. This behavior is consistent with\n  // jQuery's built-in event handlers.\n  // \n  // Usage:\n  // \n  // > jQuery(window).hashchange( [ handler ] );\n  // \n  // Arguments:\n  // \n  //  handler - (Function) Optional handler to be bound to the hashchange\n  //    event. This is a \"shortcut\" for the more verbose form:\n  //    jQuery(window).bind( 'hashchange', handler ). If handler is omitted,\n  //    all bound window.onhashchange event handlers will be triggered. This\n  //    is a shortcut for the more verbose\n  //    jQuery(window).trigger( 'hashchange' ). These forms are described in\n  //    the <hashchange event> section.\n  // \n  // Returns:\n  // \n  //  (jQuery) The initial jQuery collection of elements.\n  \n  // Allow the \"shortcut\" format $(elem).hashchange( fn ) for binding and\n  // $(elem).hashchange() for triggering, like jQuery does for built-in events.\n  $.fn[ str_hashchange ] = function( fn ) {\n    return fn ? this.bind( str_hashchange, fn ) : this.trigger( str_hashchange );\n  };\n  \n  // Property: jQuery.fn.hashchange.delay\n  // \n  // The numeric interval (in milliseconds) at which the <hashchange event>\n  // polling loop executes. Defaults to 50.\n  \n  // Property: jQuery.fn.hashchange.domain\n  // \n  // If you're setting document.domain in your JavaScript, and you want hash\n  // history to work in IE6/7, not only must this property be set, but you must\n  // also set document.domain BEFORE jQuery is loaded into the page. This\n  // property is only applicable if you are supporting IE6/7 (or IE8 operating\n  // in \"IE7 compatibility\" mode).\n  // \n  // In addition, the <jQuery.fn.hashchange.src> property must be set to the\n  // path of the included \"document-domain.html\" file, which can be renamed or\n  // modified if necessary (note that the document.domain specified must be the\n  // same in both your main JavaScript as well as in this file).\n  // \n  // Usage:\n  // \n  // jQuery.fn.hashchange.domain = document.domain;\n  \n  // Property: jQuery.fn.hashchange.src\n  // \n  // If, for some reason, you need to specify an Iframe src file (for example,\n  // when setting document.domain as in <jQuery.fn.hashchange.domain>), you can\n  // do so using this property. Note that when using this property, history\n  // won't be recorded in IE6/7 until the Iframe src file loads. This property\n  // is only applicable if you are supporting IE6/7 (or IE8 operating in \"IE7\n  // compatibility\" mode).\n  // \n  // Usage:\n  // \n  // jQuery.fn.hashchange.src = 'path/to/file.html';\n  \n  $.fn[ str_hashchange ].delay = 50;\n  /*\n  $.fn[ str_hashchange ].domain = null;\n  $.fn[ str_hashchange ].src = null;\n  */\n  \n  // Event: hashchange event\n  // \n  // Fired when location.hash changes. In browsers that support it, the native\n  // HTML5 window.onhashchange event is used, otherwise a polling loop is\n  // initialized, running every <jQuery.fn.hashchange.delay> milliseconds to\n  // see if the hash has changed. In IE6/7 (and IE8 operating in \"IE7\n  // compatibility\" mode), a hidden Iframe is created to allow the back button\n  // and hash-based history to work.\n  // \n  // Usage as described in <jQuery.fn.hashchange>:\n  // \n  // > // Bind an event handler.\n  // > jQuery(window).hashchange( function(e) {\n  // >   var hash = location.hash;\n  // >   ...\n  // > });\n  // > \n  // > // Manually trigger the event handler.\n  // > jQuery(window).hashchange();\n  // \n  // A more verbose usage that allows for event namespacing:\n  // \n  // > // Bind an event handler.\n  // > jQuery(window).bind( 'hashchange', function(e) {\n  // >   var hash = location.hash;\n  // >   ...\n  // > });\n  // > \n  // > // Manually trigger the event handler.\n  // > jQuery(window).trigger( 'hashchange' );\n  // \n  // Additional Notes:\n  // \n  // * The polling loop and Iframe are not created until at least one handler\n  //   is actually bound to the 'hashchange' event.\n  // * If you need the bound handler(s) to execute immediately, in cases where\n  //   a location.hash exists on page load, via bookmark or page refresh for\n  //   example, use jQuery(window).hashchange() or the more verbose \n  //   jQuery(window).trigger( 'hashchange' ).\n  // * The event can be bound before DOM ready, but since it won't be usable\n  //   before then in IE6/7 (due to the necessary Iframe), recommended usage is\n  //   to bind it inside a DOM ready handler.\n  \n  // Override existing $.event.special.hashchange methods (allowing this plugin\n  // to be defined after jQuery BBQ in BBQ's source code).\n  special[ str_hashchange ] = $.extend( special[ str_hashchange ], {\n    \n    // Called only when the first 'hashchange' event is bound to window.\n    setup: function() {\n      // If window.onhashchange is supported natively, there's nothing to do..\n      if ( supports_onhashchange ) { return false; }\n      \n      // Otherwise, we need to create our own. And we don't want to call this\n      // until the user binds to the event, just in case they never do, since it\n      // will create a polling loop and possibly even a hidden Iframe.\n      $( fake_onhashchange.start );\n    },\n    \n    // Called only when the last 'hashchange' event is unbound from window.\n    teardown: function() {\n      // If window.onhashchange is supported natively, there's nothing to do..\n      if ( supports_onhashchange ) { return false; }\n      \n      // Otherwise, we need to stop ours (if possible).\n      $( fake_onhashchange.stop );\n    }\n    \n  });\n  \n  // fake_onhashchange does all the work of triggering the window.onhashchange\n  // event for browsers that don't natively support it, including creating a\n  // polling loop to watch for hash changes and in IE 6/7 creating a hidden\n  // Iframe to enable back and forward.\n  fake_onhashchange = (function(){\n    var self = {},\n      timeout_id,\n      \n      // Remember the initial hash so it doesn't get triggered immediately.\n      last_hash = get_fragment(),\n      \n      fn_retval = function(val){ return val; },\n      history_set = fn_retval,\n      history_get = fn_retval;\n    \n    // Start the polling loop.\n    self.start = function() {\n      timeout_id || poll();\n    };\n    \n    // Stop the polling loop.\n    self.stop = function() {\n      timeout_id && clearTimeout( timeout_id );\n      timeout_id = undefined;\n    };\n    \n    // This polling loop checks every $.fn.hashchange.delay milliseconds to see\n    // if location.hash has changed, and triggers the 'hashchange' event on\n    // window when necessary.\n    function poll() {\n      var hash = get_fragment(),\n        history_hash = history_get( last_hash );\n      \n      if ( hash !== last_hash ) {\n        history_set( last_hash = hash, history_hash );\n        \n        $(window).trigger( str_hashchange );\n        \n      } else if ( history_hash !== last_hash ) {\n        location.href = location.href.replace( /#.*/, '' ) + history_hash;\n      }\n      \n      timeout_id = setTimeout( poll, $.fn[ str_hashchange ].delay );\n    };\n    \n    // vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv\n    // vvvvvvvvvvvvvvvvvvv REMOVE IF NOT SUPPORTING IE6/7/8 vvvvvvvvvvvvvvvvvvv\n    // vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv\n    window.attachEvent && !window.addEventListener && !supports_onhashchange && (function(){\n      // Not only do IE6/7 need the \"magical\" Iframe treatment, but so does IE8\n      // when running in \"IE7 compatibility\" mode.\n      \n      var iframe,\n        iframe_src;\n      \n      // When the event is bound and polling starts in IE 6/7, create a hidden\n      // Iframe for history handling.\n      self.start = function(){\n        if ( !iframe ) {\n          iframe_src = $.fn[ str_hashchange ].src;\n          iframe_src = iframe_src && iframe_src + get_fragment();\n          \n          // Create hidden Iframe. Attempt to make Iframe as hidden as possible\n          // by using techniques from http://www.paciellogroup.com/blog/?p=604.\n          iframe = $('<iframe tabindex=\"-1\" title=\"empty\"/>').hide()\n            \n            // When Iframe has completely loaded, initialize the history and\n            // start polling.\n            .one( 'load', function(){\n              iframe_src || history_set( get_fragment() );\n              poll();\n            })\n            \n            // Load Iframe src if specified, otherwise nothing.\n            .attr( 'src', iframe_src || 'javascript:0' )\n            \n            // Append Iframe after the end of the body to prevent unnecessary\n            // initial page scrolling (yes, this works).\n            .insertAfter( 'body' )[0].contentWindow;\n          \n          // Whenever `document.title` changes, update the Iframe's title to\n          // prettify the back/next history menu entries. Since IE sometimes\n          // errors with \"Unspecified error\" the very first time this is set\n          // (yes, very useful) wrap this with a try/catch block.\n          doc.onpropertychange = function(){\n            try {\n              if ( event.propertyName === 'title' ) {\n                iframe.document.title = doc.title;\n              }\n            } catch(e) {}\n          };\n          \n        }\n      };\n      \n      // Override the \"stop\" method since an IE6/7 Iframe was created. Even\n      // if there are no longer any bound event handlers, the polling loop\n      // is still necessary for back/next to work at all!\n      self.stop = fn_retval;\n      \n      // Get history by looking at the hidden Iframe's location.hash.\n      history_get = function() {\n        return get_fragment( iframe.location.href );\n      };\n      \n      // Set a new history item by opening and then closing the Iframe\n      // document, *then* setting its location.hash. If document.domain has\n      // been set, update that as well.\n      history_set = function( hash, history_hash ) {\n        var iframe_doc = iframe.document,\n          domain = $.fn[ str_hashchange ].domain;\n        \n        if ( hash !== history_hash ) {\n          // Update Iframe with any initial `document.title` that might be set.\n          iframe_doc.title = doc.title;\n          \n          // Opening the Iframe's document after it has been closed is what\n          // actually adds a history entry.\n          iframe_doc.open();\n          \n          // Set document.domain for the Iframe document as well, if necessary.\n          domain && iframe_doc.write( '\\x3cscript>document.domain=\"' + domain + '\"\\x3c/script>' );\n          \n          iframe_doc.close();\n          \n          // Update the Iframe's hash, for great justice.\n          iframe.location.hash = hash;\n        }\n      };\n      \n    })();\n    // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n    // ^^^^^^^^^^^^^^^^^^^ REMOVE IF NOT SUPPORTING IE6/7/8 ^^^^^^^^^^^^^^^^^^^\n    // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n    \n    return self;\n  })();\n  \n})(jQuery,this);\n\n\n(function( $, undefined ) {\n\n\t/*! matchMedia() polyfill - Test a CSS media type/query in JS. Authors & copyright (c) 2012: Scott Jehl, Paul Irish, Nicholas Zakas. Dual MIT/BSD license */\n\twindow.matchMedia = window.matchMedia || (function( doc, undefined ) {\n\n\t\tvar bool,\n\t\t\tdocElem = doc.documentElement,\n\t\t\trefNode = docElem.firstElementChild || docElem.firstChild,\n\t\t\t// fakeBody required for <FF4 when executed in <head>\n\t\t\tfakeBody = doc.createElement( \"body\" ),\n\t\t\tdiv = doc.createElement( \"div\" );\n\n\t\tdiv.id = \"mq-test-1\";\n\t\tdiv.style.cssText = \"position:absolute;top:-100em\";\n\t\tfakeBody.style.background = \"none\";\n\t\tfakeBody.appendChild(div);\n\n\t\treturn function(q){\n\n\t\t\tdiv.innerHTML = \"&shy;<style media=\\\"\" + q + \"\\\"> #mq-test-1 { width: 42px; }</style>\";\n\n\t\t\tdocElem.insertBefore( fakeBody, refNode );\n\t\t\tbool = div.offsetWidth === 42;\n\t\t\tdocElem.removeChild( fakeBody );\n\n\t\t\treturn {\n\t\t\t\tmatches: bool,\n\t\t\t\tmedia: q\n\t\t\t};\n\n\t\t};\n\n\t}( document ));\n\n\t// $.mobile.media uses matchMedia to return a boolean.\n\t$.mobile.media = function( q ) {\n\t\treturn window.matchMedia( q ).matches;\n\t};\n\n})(jQuery);\n\n\t(function( $, undefined ) {\n\t\tvar support = {\n\t\t\ttouch: \"ontouchend\" in document\n\t\t};\n\n\t\t$.mobile.support = $.mobile.support || {};\n\t\t$.extend( $.support, support );\n\t\t$.extend( $.mobile.support, support );\n\t}( jQuery ));\n\n\t(function( $, undefined ) {\n\t\t$.extend( $.support, {\n\t\t\torientation: \"orientation\" in window && \"onorientationchange\" in window\n\t\t});\n\t}( jQuery ));\n\n(function( $, undefined ) {\n\n// thx Modernizr\nfunction propExists( prop ) {\n\tvar uc_prop = prop.charAt( 0 ).toUpperCase() + prop.substr( 1 ),\n\t\tprops = ( prop + \" \" + vendors.join( uc_prop + \" \" ) + uc_prop ).split( \" \" ),\n\t\tv;\n\n\tfor ( v in props ) {\n\t\tif ( fbCSS[ props[ v ] ] !== undefined ) {\n\t\t\treturn true;\n\t\t}\n\t}\n}\n\nvar fakeBody = $( \"<body>\" ).prependTo( \"html\" ),\n\tfbCSS = fakeBody[ 0 ].style,\n\tvendors = [ \"Webkit\", \"Moz\", \"O\" ],\n\twebos = \"palmGetResource\" in window, //only used to rule out scrollTop\n\toperamini = window.operamini && ({}).toString.call( window.operamini ) === \"[object OperaMini]\",\n\tbb = window.blackberry && !propExists( \"-webkit-transform\" ), //only used to rule out box shadow, as it's filled opaque on BB 5 and lower\n\tnokiaLTE7_3;\n\n// inline SVG support test\nfunction inlineSVG() {\n\t// Thanks Modernizr & Erik Dahlstrom\n\tvar w = window,\n\t\tsvg = !!w.document.createElementNS && !!w.document.createElementNS( \"http://www.w3.org/2000/svg\", \"svg\" ).createSVGRect && !( w.opera && navigator.userAgent.indexOf( \"Chrome\" ) === -1 ),\n\t\tsupport = function( data ) {\n\t\t\tif ( !( data && svg ) ) {\n\t\t\t\t$( \"html\" ).addClass( \"ui-nosvg\" );\n\t\t\t}\n\t\t},\n\t\timg = new w.Image();\n\n\timg.onerror = function() {\n\t\tsupport( false );\n\t};\n\timg.onload = function() {\n\t\tsupport( img.width === 1 && img.height === 1 );\n\t};\n\timg.src = \"data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///ywAAAAAAQABAAACAUwAOw==\";\n}\n\nfunction transform3dTest() {\n\tvar mqProp = \"transform-3d\",\n\t\t// Because the `translate3d` test below throws false positives in Android:\n\t\tret = $.mobile.media( \"(-\" + vendors.join( \"-\" + mqProp + \"),(-\" ) + \"-\" + mqProp + \"),(\" + mqProp + \")\" ),\n\t\tel, transforms, t;\n\n\tif ( ret ) {\n\t\treturn !!ret;\n\t}\n\n\tel = document.createElement( \"div\" );\n\ttransforms = {\n\t\t// We’re omitting Opera for the time being; MS uses unprefixed.\n\t\t\"MozTransform\": \"-moz-transform\",\n\t\t\"transform\": \"transform\"\n\t};\n\n\tfakeBody.append( el );\n\n\tfor ( t in transforms ) {\n\t\tif ( el.style[ t ] !== undefined ) {\n\t\t\tel.style[ t ] = \"translate3d( 100px, 1px, 1px )\";\n\t\t\tret = window.getComputedStyle( el ).getPropertyValue( transforms[ t ] );\n\t\t}\n\t}\n\treturn ( !!ret && ret !== \"none\" );\n}\n\n// Test for dynamic-updating base tag support ( allows us to avoid href,src attr rewriting )\nfunction baseTagTest() {\n\tvar fauxBase = location.protocol + \"//\" + location.host + location.pathname + \"ui-dir/\",\n\t\tbase = $( \"head base\" ),\n\t\tfauxEle = null,\n\t\thref = \"\",\n\t\tlink, rebase;\n\n\tif ( !base.length ) {\n\t\tbase = fauxEle = $( \"<base>\", { \"href\": fauxBase }).appendTo( \"head\" );\n\t} else {\n\t\thref = base.attr( \"href\" );\n\t}\n\n\tlink = $( \"<a href='testurl' />\" ).prependTo( fakeBody );\n\trebase = link[ 0 ].href;\n\tbase[ 0 ].href = href || location.pathname;\n\n\tif ( fauxEle ) {\n\t\tfauxEle.remove();\n\t}\n\treturn rebase.indexOf( fauxBase ) === 0;\n}\n\n// Thanks Modernizr\nfunction cssPointerEventsTest() {\n\tvar element = document.createElement( \"x\" ),\n\t\tdocumentElement = document.documentElement,\n\t\tgetComputedStyle = window.getComputedStyle,\n\t\tsupports;\n\n\tif ( !( \"pointerEvents\" in element.style ) ) {\n\t\treturn false;\n\t}\n\n\telement.style.pointerEvents = \"auto\";\n\telement.style.pointerEvents = \"x\";\n\tdocumentElement.appendChild( element );\n\tsupports = getComputedStyle &&\n\tgetComputedStyle( element, \"\" ).pointerEvents === \"auto\";\n\tdocumentElement.removeChild( element );\n\treturn !!supports;\n}\n\nfunction boundingRect() {\n\tvar div = document.createElement( \"div\" );\n\treturn typeof div.getBoundingClientRect !== \"undefined\";\n}\n\n// non-UA-based IE version check by James Padolsey, modified by jdalton - from http://gist.github.com/527683\n// allows for inclusion of IE 6+, including Windows Mobile 7\n$.extend( $.mobile, { browser: {} } );\n$.mobile.browser.oldIE = (function() {\n\tvar v = 3,\n\t\tdiv = document.createElement( \"div\" ),\n\t\ta = div.all || [];\n\n\tdo {\n\t\tdiv.innerHTML = \"<!--[if gt IE \" + ( ++v ) + \"]><br><![endif]-->\";\n\t} while( a[0] );\n\n\treturn v > 4 ? v : !v;\n})();\n\nfunction fixedPosition() {\n\tvar w = window,\n\t\tua = navigator.userAgent,\n\t\tplatform = navigator.platform,\n\t\t// Rendering engine is Webkit, and capture major version\n\t\twkmatch = ua.match( /AppleWebKit\\/([0-9]+)/ ),\n\t\twkversion = !!wkmatch && wkmatch[ 1 ],\n\t\tffmatch = ua.match( /Fennec\\/([0-9]+)/ ),\n\t\tffversion = !!ffmatch && ffmatch[ 1 ],\n\t\toperammobilematch = ua.match( /Opera Mobi\\/([0-9]+)/ ),\n\t\tomversion = !!operammobilematch && operammobilematch[ 1 ];\n\n\tif (\n\t\t// iOS 4.3 and older : Platform is iPhone/Pad/Touch and Webkit version is less than 534 (ios5)\n\t\t( ( platform.indexOf( \"iPhone\" ) > -1 || platform.indexOf( \"iPad\" ) > -1  || platform.indexOf( \"iPod\" ) > -1 ) && wkversion && wkversion < 534 ) ||\n\t\t// Opera Mini\n\t\t( w.operamini && ({}).toString.call( w.operamini ) === \"[object OperaMini]\" ) ||\n\t\t( operammobilematch && omversion < 7458 )\t||\n\t\t//Android lte 2.1: Platform is Android and Webkit version is less than 533 (Android 2.2)\n\t\t( ua.indexOf( \"Android\" ) > -1 && wkversion && wkversion < 533 ) ||\n\t\t// Firefox Mobile before 6.0 -\n\t\t( ffversion && ffversion < 6 ) ||\n\t\t// WebOS less than 3\n\t\t( \"palmGetResource\" in window && wkversion && wkversion < 534 )\t||\n\t\t// MeeGo\n\t\t( ua.indexOf( \"MeeGo\" ) > -1 && ua.indexOf( \"NokiaBrowser/8.5.0\" ) > -1 ) ) {\n\t\treturn false;\n\t}\n\n\treturn true;\n}\n\n$.extend( $.support, {\n\t// Note, Chrome for iOS has an extremely quirky implementation of popstate.\n\t// We've chosen to take the shortest path to a bug fix here for issue #5426\n\t// See the following link for information about the regex chosen\n\t// https://developers.google.com/chrome/mobile/docs/user-agent#chrome_for_ios_user-agent\n\tpushState: \"pushState\" in history &&\n\t\t\"replaceState\" in history &&\n\t\t// When running inside a FF iframe, calling replaceState causes an error\n\t\t!( window.navigator.userAgent.indexOf( \"Firefox\" ) >= 0 && window.top !== window ) &&\n\t\t( window.navigator.userAgent.search(/CriOS/) === -1 ),\n\n\tmediaquery: $.mobile.media( \"only all\" ),\n\tcssPseudoElement: !!propExists( \"content\" ),\n\ttouchOverflow: !!propExists( \"overflowScrolling\" ),\n\tcssTransform3d: transform3dTest(),\n\tboxShadow: !!propExists( \"boxShadow\" ) && !bb,\n\tfixedPosition: fixedPosition(),\n\tscrollTop: (\"pageXOffset\" in window ||\n\t\t\"scrollTop\" in document.documentElement ||\n\t\t\"scrollTop\" in fakeBody[ 0 ]) && !webos && !operamini,\n\n\tdynamicBaseTag: baseTagTest(),\n\tcssPointerEvents: cssPointerEventsTest(),\n\tboundingRect: boundingRect(),\n\tinlineSVG: inlineSVG\n});\n\nfakeBody.remove();\n\n// $.mobile.ajaxBlacklist is used to override ajaxEnabled on platforms that have known conflicts with hash history updates (BB5, Symbian)\n// or that generally work better browsing in regular http for full page refreshes (Opera Mini)\n// Note: This detection below is used as a last resort.\n// We recommend only using these detection methods when all other more reliable/forward-looking approaches are not possible\nnokiaLTE7_3 = (function() {\n\n\tvar ua = window.navigator.userAgent;\n\n\t//The following is an attempt to match Nokia browsers that are running Symbian/s60, with webkit, version 7.3 or older\n\treturn ua.indexOf( \"Nokia\" ) > -1 &&\n\t\t\t( ua.indexOf( \"Symbian/3\" ) > -1 || ua.indexOf( \"Series60/5\" ) > -1 ) &&\n\t\t\tua.indexOf( \"AppleWebKit\" ) > -1 &&\n\t\t\tua.match( /(BrowserNG|NokiaBrowser)\\/7\\.[0-3]/ );\n})();\n\n// Support conditions that must be met in order to proceed\n// default enhanced qualifications are media query support OR IE 7+\n\n$.mobile.gradeA = function() {\n\treturn ( ( $.support.mediaquery && $.support.cssPseudoElement ) || $.mobile.browser.oldIE && $.mobile.browser.oldIE >= 8 ) && ( $.support.boundingRect || $.fn.jquery.match(/1\\.[0-7+]\\.[0-9+]?/) !== null );\n};\n\n$.mobile.ajaxBlacklist =\n\t\t\t// BlackBerry browsers, pre-webkit\n\t\t\twindow.blackberry && !window.WebKitPoint ||\n\t\t\t// Opera Mini\n\t\t\toperamini ||\n\t\t\t// Symbian webkits pre 7.3\n\t\t\tnokiaLTE7_3;\n\n// Lastly, this workaround is the only way we've found so far to get pre 7.3 Symbian webkit devices\n// to render the stylesheets when they're referenced before this script, as we'd recommend doing.\n// This simply reappends the CSS in place, which for some reason makes it apply\nif ( nokiaLTE7_3 ) {\n\t$(function() {\n\t\t$( \"head link[rel='stylesheet']\" ).attr( \"rel\", \"alternate stylesheet\" ).attr( \"rel\", \"stylesheet\" );\n\t});\n}\n\n// For ruling out shadows via css\nif ( !$.support.boxShadow ) {\n\t$( \"html\" ).addClass( \"ui-noboxshadow\" );\n}\n\n})( jQuery );\n\n\n(function( $, undefined ) {\n\tvar $win = $.mobile.window, self,\n\t\tdummyFnToInitNavigate = function() {\n\t\t};\n\n\t$.event.special.beforenavigate = {\n\t\tsetup: function() {\n\t\t\t$win.on( \"navigate\", dummyFnToInitNavigate );\n\t\t},\n\n\t\tteardown: function() {\n\t\t\t$win.off( \"navigate\", dummyFnToInitNavigate );\n\t\t}\n\t};\n\n\t$.event.special.navigate = self = {\n\t\tbound: false,\n\n\t\tpushStateEnabled: true,\n\n\t\toriginalEventName: undefined,\n\n\t\t// If pushstate support is present and push state support is defined to\n\t\t// be true on the mobile namespace.\n\t\tisPushStateEnabled: function() {\n\t\t\treturn $.support.pushState &&\n\t\t\t\t$.mobile.pushStateEnabled === true &&\n\t\t\t\tthis.isHashChangeEnabled();\n\t\t},\n\n\t\t// !! assumes mobile namespace is present\n\t\tisHashChangeEnabled: function() {\n\t\t\treturn $.mobile.hashListeningEnabled === true;\n\t\t},\n\n\t\t// TODO a lot of duplication between popstate and hashchange\n\t\tpopstate: function( event ) {\n\t\t\tvar newEvent = new $.Event( \"navigate\" ),\n\t\t\t\tbeforeNavigate = new $.Event( \"beforenavigate\" ),\n\t\t\t\tstate = event.originalEvent.state || {};\n\n\t\t\tbeforeNavigate.originalEvent = event;\n\t\t\t$win.trigger( beforeNavigate );\n\n\t\t\tif ( beforeNavigate.isDefaultPrevented() ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( event.historyState ) {\n\t\t\t\t$.extend(state, event.historyState);\n\t\t\t}\n\n\t\t\t// Make sure the original event is tracked for the end\n\t\t\t// user to inspect incase they want to do something special\n\t\t\tnewEvent.originalEvent = event;\n\n\t\t\t// NOTE we let the current stack unwind because any assignment to\n\t\t\t//      location.hash will stop the world and run this event handler. By\n\t\t\t//      doing this we create a similar behavior to hashchange on hash\n\t\t\t//      assignment\n\t\t\tsetTimeout(function() {\n\t\t\t\t$win.trigger( newEvent, {\n\t\t\t\t\tstate: state\n\t\t\t\t});\n\t\t\t}, 0);\n\t\t},\n\n\t\thashchange: function( event /*, data */ ) {\n\t\t\tvar newEvent = new $.Event( \"navigate\" ),\n\t\t\t\tbeforeNavigate = new $.Event( \"beforenavigate\" );\n\n\t\t\tbeforeNavigate.originalEvent = event;\n\t\t\t$win.trigger( beforeNavigate );\n\n\t\t\tif ( beforeNavigate.isDefaultPrevented() ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Make sure the original event is tracked for the end\n\t\t\t// user to inspect incase they want to do something special\n\t\t\tnewEvent.originalEvent = event;\n\n\t\t\t// Trigger the hashchange with state provided by the user\n\t\t\t// that altered the hash\n\t\t\t$win.trigger( newEvent, {\n\t\t\t\t// Users that want to fully normalize the two events\n\t\t\t\t// will need to do history management down the stack and\n\t\t\t\t// add the state to the event before this binding is fired\n\t\t\t\t// TODO consider allowing for the explicit addition of callbacks\n\t\t\t\t//      to be fired before this value is set to avoid event timing issues\n\t\t\t\tstate: event.hashchangeState || {}\n\t\t\t});\n\t\t},\n\n\t\t// TODO We really only want to set this up once\n\t\t//      but I'm not clear if there's a beter way to achieve\n\t\t//      this with the jQuery special event structure\n\t\tsetup: function( /* data, namespaces */ ) {\n\t\t\tif ( self.bound ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tself.bound = true;\n\n\t\t\tif ( self.isPushStateEnabled() ) {\n\t\t\t\tself.originalEventName = \"popstate\";\n\t\t\t\t$win.bind( \"popstate.navigate\", self.popstate );\n\t\t\t} else if ( self.isHashChangeEnabled() ) {\n\t\t\t\tself.originalEventName = \"hashchange\";\n\t\t\t\t$win.bind( \"hashchange.navigate\", self.hashchange );\n\t\t\t}\n\t\t}\n\t};\n})( jQuery );\n\n\n\n(function( $, undefined ) {\n\t\tvar path, $base, dialogHashKey = \"&ui-state=dialog\";\n\n\t\t$.mobile.path = path = {\n\t\t\tuiStateKey: \"&ui-state\",\n\n\t\t\t// This scary looking regular expression parses an absolute URL or its relative\n\t\t\t// variants (protocol, site, document, query, and hash), into the various\n\t\t\t// components (protocol, host, path, query, fragment, etc that make up the\n\t\t\t// URL as well as some other commonly used sub-parts. When used with RegExp.exec()\n\t\t\t// or String.match, it parses the URL into a results array that looks like this:\n\t\t\t//\n\t\t\t//     [0]: http://jblas:password@mycompany.com:8080/mail/inbox?msg=1234&type=unread#msg-content\n\t\t\t//     [1]: http://jblas:password@mycompany.com:8080/mail/inbox?msg=1234&type=unread\n\t\t\t//     [2]: http://jblas:password@mycompany.com:8080/mail/inbox\n\t\t\t//     [3]: http://jblas:password@mycompany.com:8080\n\t\t\t//     [4]: http:\n\t\t\t//     [5]: //\n\t\t\t//     [6]: jblas:password@mycompany.com:8080\n\t\t\t//     [7]: jblas:password\n\t\t\t//     [8]: jblas\n\t\t\t//     [9]: password\n\t\t\t//    [10]: mycompany.com:8080\n\t\t\t//    [11]: mycompany.com\n\t\t\t//    [12]: 8080\n\t\t\t//    [13]: /mail/inbox\n\t\t\t//    [14]: /mail/\n\t\t\t//    [15]: inbox\n\t\t\t//    [16]: ?msg=1234&type=unread\n\t\t\t//    [17]: #msg-content\n\t\t\t//\n\t\t\turlParseRE: /^\\s*(((([^:\\/#\\?]+:)?(?:(\\/\\/)((?:(([^:@\\/#\\?]+)(?:\\:([^:@\\/#\\?]+))?)@)?(([^:\\/#\\?\\]\\[]+|\\[[^\\/\\]@#?]+\\])(?:\\:([0-9]+))?))?)?)?((\\/?(?:[^\\/\\?#]+\\/+)*)([^\\?#]*)))?(\\?[^#]+)?)(#.*)?/,\n\n\t\t\t// Abstraction to address xss (Issue #4787) by removing the authority in\n\t\t\t// browsers that auto-decode it. All references to location.href should be\n\t\t\t// replaced with a call to this method so that it can be dealt with properly here\n\t\t\tgetLocation: function( url ) {\n\t\t\t\tvar parsedUrl = this.parseUrl( url || location.href ),\n\t\t\t\t\turi = url ? parsedUrl : location,\n\n\t\t\t\t\t// Make sure to parse the url or the location object for the hash because using\n\t\t\t\t\t// location.hash is autodecoded in firefox, the rest of the url should be from\n\t\t\t\t\t// the object (location unless we're testing) to avoid the inclusion of the\n\t\t\t\t\t// authority\n\t\t\t\t\thash = parsedUrl.hash;\n\n\t\t\t\t// mimic the browser with an empty string when the hash is empty\n\t\t\t\thash = hash === \"#\" ? \"\" : hash;\n\n\t\t\t\treturn uri.protocol +\n\t\t\t\t\tparsedUrl.doubleSlash +\n\t\t\t\t\turi.host +\n\n\t\t\t\t\t// The pathname must start with a slash if there's a protocol, because you\n\t\t\t\t\t// can't have a protocol followed by a relative path. Also, it's impossible to\n\t\t\t\t\t// calculate absolute URLs from relative ones if the absolute one doesn't have\n\t\t\t\t\t// a leading \"/\".\n\t\t\t\t\t( ( uri.protocol !== \"\" && uri.pathname.substring( 0, 1 ) !== \"/\" ) ?\n\t\t\t\t\t\t\"/\" : \"\" ) +\n\t\t\t\t\turi.pathname +\n\t\t\t\t\turi.search +\n\t\t\t\t\thash;\n\t\t\t},\n\n\t\t\t//return the original document url\n\t\t\tgetDocumentUrl: function( asParsedObject ) {\n\t\t\t\treturn asParsedObject ? $.extend( {}, path.documentUrl ) : path.documentUrl.href;\n\t\t\t},\n\n\t\t\tparseLocation: function() {\n\t\t\t\treturn this.parseUrl( this.getLocation() );\n\t\t\t},\n\n\t\t\t//Parse a URL into a structure that allows easy access to\n\t\t\t//all of the URL components by name.\n\t\t\tparseUrl: function( url ) {\n\t\t\t\t// If we're passed an object, we'll assume that it is\n\t\t\t\t// a parsed url object and just return it back to the caller.\n\t\t\t\tif ( $.type( url ) === \"object\" ) {\n\t\t\t\t\treturn url;\n\t\t\t\t}\n\n\t\t\t\tvar matches = path.urlParseRE.exec( url || \"\" ) || [];\n\n\t\t\t\t\t// Create an object that allows the caller to access the sub-matches\n\t\t\t\t\t// by name. Note that IE returns an empty string instead of undefined,\n\t\t\t\t\t// like all other browsers do, so we normalize everything so its consistent\n\t\t\t\t\t// no matter what browser we're running on.\n\t\t\t\t\treturn {\n\t\t\t\t\t\thref:         matches[  0 ] || \"\",\n\t\t\t\t\t\threfNoHash:   matches[  1 ] || \"\",\n\t\t\t\t\t\threfNoSearch: matches[  2 ] || \"\",\n\t\t\t\t\t\tdomain:       matches[  3 ] || \"\",\n\t\t\t\t\t\tprotocol:     matches[  4 ] || \"\",\n\t\t\t\t\t\tdoubleSlash:  matches[  5 ] || \"\",\n\t\t\t\t\t\tauthority:    matches[  6 ] || \"\",\n\t\t\t\t\t\tusername:     matches[  8 ] || \"\",\n\t\t\t\t\t\tpassword:     matches[  9 ] || \"\",\n\t\t\t\t\t\thost:         matches[ 10 ] || \"\",\n\t\t\t\t\t\thostname:     matches[ 11 ] || \"\",\n\t\t\t\t\t\tport:         matches[ 12 ] || \"\",\n\t\t\t\t\t\tpathname:     matches[ 13 ] || \"\",\n\t\t\t\t\t\tdirectory:    matches[ 14 ] || \"\",\n\t\t\t\t\t\tfilename:     matches[ 15 ] || \"\",\n\t\t\t\t\t\tsearch:       matches[ 16 ] || \"\",\n\t\t\t\t\t\thash:         matches[ 17 ] || \"\"\n\t\t\t\t\t};\n\t\t\t},\n\n\t\t\t//Turn relPath into an asbolute path. absPath is\n\t\t\t//an optional absolute path which describes what\n\t\t\t//relPath is relative to.\n\t\t\tmakePathAbsolute: function( relPath, absPath ) {\n\t\t\t\tvar absStack,\n\t\t\t\t\trelStack,\n\t\t\t\t\ti, d;\n\n\t\t\t\tif ( relPath && relPath.charAt( 0 ) === \"/\" ) {\n\t\t\t\t\treturn relPath;\n\t\t\t\t}\n\n\t\t\t\trelPath = relPath || \"\";\n\t\t\t\tabsPath = absPath ? absPath.replace( /^\\/|(\\/[^\\/]*|[^\\/]+)$/g, \"\" ) : \"\";\n\n\t\t\t\tabsStack = absPath ? absPath.split( \"/\" ) : [];\n\t\t\t\trelStack = relPath.split( \"/\" );\n\n\t\t\t\tfor ( i = 0; i < relStack.length; i++ ) {\n\t\t\t\t\td = relStack[ i ];\n\t\t\t\t\tswitch ( d ) {\n\t\t\t\t\t\tcase \".\":\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \"..\":\n\t\t\t\t\t\t\tif ( absStack.length ) {\n\t\t\t\t\t\t\t\tabsStack.pop();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tabsStack.push( d );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn \"/\" + absStack.join( \"/\" );\n\t\t\t},\n\n\t\t\t//Returns true if both urls have the same domain.\n\t\t\tisSameDomain: function( absUrl1, absUrl2 ) {\n\t\t\t\treturn path.parseUrl( absUrl1 ).domain.toLowerCase() ===\n\t\t\t\t\tpath.parseUrl( absUrl2 ).domain.toLowerCase();\n\t\t\t},\n\n\t\t\t//Returns true for any relative variant.\n\t\t\tisRelativeUrl: function( url ) {\n\t\t\t\t// All relative Url variants have one thing in common, no protocol.\n\t\t\t\treturn path.parseUrl( url ).protocol === \"\";\n\t\t\t},\n\n\t\t\t//Returns true for an absolute url.\n\t\t\tisAbsoluteUrl: function( url ) {\n\t\t\t\treturn path.parseUrl( url ).protocol !== \"\";\n\t\t\t},\n\n\t\t\t//Turn the specified realtive URL into an absolute one. This function\n\t\t\t//can handle all relative variants (protocol, site, document, query, fragment).\n\t\t\tmakeUrlAbsolute: function( relUrl, absUrl ) {\n\t\t\t\tif ( !path.isRelativeUrl( relUrl ) ) {\n\t\t\t\t\treturn relUrl;\n\t\t\t\t}\n\n\t\t\t\tif ( absUrl === undefined ) {\n\t\t\t\t\tabsUrl = this.documentBase;\n\t\t\t\t}\n\n\t\t\t\tvar relObj = path.parseUrl( relUrl ),\n\t\t\t\t\tabsObj = path.parseUrl( absUrl ),\n\t\t\t\t\tprotocol = relObj.protocol || absObj.protocol,\n\t\t\t\t\tdoubleSlash = relObj.protocol ? relObj.doubleSlash : ( relObj.doubleSlash || absObj.doubleSlash ),\n\t\t\t\t\tauthority = relObj.authority || absObj.authority,\n\t\t\t\t\thasPath = relObj.pathname !== \"\",\n\t\t\t\t\tpathname = path.makePathAbsolute( relObj.pathname || absObj.filename, absObj.pathname ),\n\t\t\t\t\tsearch = relObj.search || ( !hasPath && absObj.search ) || \"\",\n\t\t\t\t\thash = relObj.hash;\n\n\t\t\t\treturn protocol + doubleSlash + authority + pathname + search + hash;\n\t\t\t},\n\n\t\t\t//Add search (aka query) params to the specified url.\n\t\t\taddSearchParams: function( url, params ) {\n\t\t\t\tvar u = path.parseUrl( url ),\n\t\t\t\t\tp = ( typeof params === \"object\" ) ? $.param( params ) : params,\n\t\t\t\t\ts = u.search || \"?\";\n\t\t\t\treturn u.hrefNoSearch + s + ( s.charAt( s.length - 1 ) !== \"?\" ? \"&\" : \"\" ) + p + ( u.hash || \"\" );\n\t\t\t},\n\n\t\t\tconvertUrlToDataUrl: function( absUrl ) {\n\t\t\t\tvar result = absUrl,\n\t\t\t\t\tu = path.parseUrl( absUrl );\n\n\t\t\t\tif ( path.isEmbeddedPage( u ) ) {\n\t\t\t\t\t// For embedded pages, remove the dialog hash key as in getFilePath(),\n\t\t\t\t\t// and remove otherwise the Data Url won't match the id of the embedded Page.\n\t\t\t\t\tresult = u.hash\n\t\t\t\t\t\t.split( dialogHashKey )[0]\n\t\t\t\t\t\t.replace( /^#/, \"\" )\n\t\t\t\t\t\t.replace( /\\?.*$/, \"\" );\n\t\t\t\t} else if ( path.isSameDomain( u, this.documentBase ) ) {\n\t\t\t\t\tresult = u.hrefNoHash.replace( this.documentBase.domain, \"\" ).split( dialogHashKey )[0];\n\t\t\t\t}\n\n\t\t\t\treturn window.decodeURIComponent( result );\n\t\t\t},\n\n\t\t\t//get path from current hash, or from a file path\n\t\t\tget: function( newPath ) {\n\t\t\t\tif ( newPath === undefined ) {\n\t\t\t\t\tnewPath = path.parseLocation().hash;\n\t\t\t\t}\n\t\t\t\treturn path.stripHash( newPath ).replace( /[^\\/]*\\.[^\\/*]+$/, \"\" );\n\t\t\t},\n\n\t\t\t//set location hash to path\n\t\t\tset: function( path ) {\n\t\t\t\tlocation.hash = path;\n\t\t\t},\n\n\t\t\t//test if a given url (string) is a path\n\t\t\t//NOTE might be exceptionally naive\n\t\t\tisPath: function( url ) {\n\t\t\t\treturn ( /\\// ).test( url );\n\t\t\t},\n\n\t\t\t//return a url path with the window's location protocol/hostname/pathname removed\n\t\t\tclean: function( url ) {\n\t\t\t\treturn url.replace( this.documentBase.domain, \"\" );\n\t\t\t},\n\n\t\t\t//just return the url without an initial #\n\t\t\tstripHash: function( url ) {\n\t\t\t\treturn url.replace( /^#/, \"\" );\n\t\t\t},\n\n\t\t\tstripQueryParams: function( url ) {\n\t\t\t\treturn url.replace( /\\?.*$/, \"\" );\n\t\t\t},\n\n\t\t\t//remove the preceding hash, any query params, and dialog notations\n\t\t\tcleanHash: function( hash ) {\n\t\t\t\treturn path.stripHash( hash.replace( /\\?.*$/, \"\" ).replace( dialogHashKey, \"\" ) );\n\t\t\t},\n\n\t\t\tisHashValid: function( hash ) {\n\t\t\t\treturn ( /^#[^#]+$/ ).test( hash );\n\t\t\t},\n\n\t\t\t//check whether a url is referencing the same domain, or an external domain or different protocol\n\t\t\t//could be mailto, etc\n\t\t\tisExternal: function( url ) {\n\t\t\t\tvar u = path.parseUrl( url );\n\n\t\t\t\treturn !!( u.protocol &&\n\t\t\t\t\t( u.domain.toLowerCase() !== this.documentUrl.domain.toLowerCase() ) );\n\t\t\t},\n\n\t\t\thasProtocol: function( url ) {\n\t\t\t\treturn ( /^(:?\\w+:)/ ).test( url );\n\t\t\t},\n\n\t\t\tisEmbeddedPage: function( url ) {\n\t\t\t\tvar u = path.parseUrl( url );\n\n\t\t\t\t//if the path is absolute, then we need to compare the url against\n\t\t\t\t//both the this.documentUrl and the documentBase. The main reason for this\n\t\t\t\t//is that links embedded within external documents will refer to the\n\t\t\t\t//application document, whereas links embedded within the application\n\t\t\t\t//document will be resolved against the document base.\n\t\t\t\tif ( u.protocol !== \"\" ) {\n\t\t\t\t\treturn ( !this.isPath(u.hash) && u.hash && ( u.hrefNoHash === this.documentUrl.hrefNoHash || ( this.documentBaseDiffers && u.hrefNoHash === this.documentBase.hrefNoHash ) ) );\n\t\t\t\t}\n\t\t\t\treturn ( /^#/ ).test( u.href );\n\t\t\t},\n\n\t\t\tsquash: function( url, resolutionUrl ) {\n\t\t\t\tvar href, cleanedUrl, search, stateIndex, docUrl,\n\t\t\t\t\tisPath = this.isPath( url ),\n\t\t\t\t\turi = this.parseUrl( url ),\n\t\t\t\t\tpreservedHash = uri.hash,\n\t\t\t\t\tuiState = \"\";\n\n\t\t\t\t// produce a url against which we can resolve the provided path\n\t\t\t\tif ( !resolutionUrl ) {\n\t\t\t\t\tif ( isPath ) {\n\t\t\t\t\t\tresolutionUrl = path.getLocation();\n\t\t\t\t\t} else {\n\t\t\t\t\t\tdocUrl = path.getDocumentUrl( true );\n\t\t\t\t\t\tif ( path.isPath( docUrl.hash ) ) {\n\t\t\t\t\t\t\tresolutionUrl = path.squash( docUrl.href );\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tresolutionUrl = docUrl.href;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// If the url is anything but a simple string, remove any preceding hash\n\t\t\t\t// eg #foo/bar -> foo/bar\n\t\t\t\t//    #foo -> #foo\n\t\t\t\tcleanedUrl = isPath ? path.stripHash( url ) : url;\n\n\t\t\t\t// If the url is a full url with a hash check if the parsed hash is a path\n\t\t\t\t// if it is, strip the #, and use it otherwise continue without change\n\t\t\t\tcleanedUrl = path.isPath( uri.hash ) ? path.stripHash( uri.hash ) : cleanedUrl;\n\n\t\t\t\t// Split the UI State keys off the href\n\t\t\t\tstateIndex = cleanedUrl.indexOf( this.uiStateKey );\n\n\t\t\t\t// store the ui state keys for use\n\t\t\t\tif ( stateIndex > -1 ) {\n\t\t\t\t\tuiState = cleanedUrl.slice( stateIndex );\n\t\t\t\t\tcleanedUrl = cleanedUrl.slice( 0, stateIndex );\n\t\t\t\t}\n\n\t\t\t\t// make the cleanedUrl absolute relative to the resolution url\n\t\t\t\thref = path.makeUrlAbsolute( cleanedUrl, resolutionUrl );\n\n\t\t\t\t// grab the search from the resolved url since parsing from\n\t\t\t\t// the passed url may not yield the correct result\n\t\t\t\tsearch = this.parseUrl( href ).search;\n\n\t\t\t\t// TODO all this crap is terrible, clean it up\n\t\t\t\tif ( isPath ) {\n\t\t\t\t\t// reject the hash if it's a path or it's just a dialog key\n\t\t\t\t\tif ( path.isPath( preservedHash ) || preservedHash.replace(\"#\", \"\").indexOf( this.uiStateKey ) === 0) {\n\t\t\t\t\t\tpreservedHash = \"\";\n\t\t\t\t\t}\n\n\t\t\t\t\t// Append the UI State keys where it exists and it's been removed\n\t\t\t\t\t// from the url\n\t\t\t\t\tif ( uiState && preservedHash.indexOf( this.uiStateKey ) === -1) {\n\t\t\t\t\t\tpreservedHash += uiState;\n\t\t\t\t\t}\n\n\t\t\t\t\t// make sure that pound is on the front of the hash\n\t\t\t\t\tif ( preservedHash.indexOf( \"#\" ) === -1 && preservedHash !== \"\" ) {\n\t\t\t\t\t\tpreservedHash = \"#\" + preservedHash;\n\t\t\t\t\t}\n\n\t\t\t\t\t// reconstruct each of the pieces with the new search string and hash\n\t\t\t\t\thref = path.parseUrl( href );\n\t\t\t\t\thref = href.protocol + href.doubleSlash + href.host + href.pathname + search +\n\t\t\t\t\t\tpreservedHash;\n\t\t\t\t} else {\n\t\t\t\t\thref += href.indexOf( \"#\" ) > -1 ? uiState : \"#\" + uiState;\n\t\t\t\t}\n\n\t\t\t\treturn href;\n\t\t\t},\n\n\t\t\tisPreservableHash: function( hash ) {\n\t\t\t\treturn hash.replace( \"#\", \"\" ).indexOf( this.uiStateKey ) === 0;\n\t\t\t},\n\n\t\t\t// Escape weird characters in the hash if it is to be used as a selector\n\t\t\thashToSelector: function( hash ) {\n\t\t\t\tvar hasHash = ( hash.substring( 0, 1 ) === \"#\" );\n\t\t\t\tif ( hasHash ) {\n\t\t\t\t\thash = hash.substring( 1 );\n\t\t\t\t}\n\t\t\t\treturn ( hasHash ? \"#\" : \"\" ) + hash.replace( /([!\"#$%&'()*+,./:;<=>?@[\\]^`{|}~])/g, \"\\\\$1\" );\n\t\t\t},\n\n\t\t\t// return the substring of a filepath before the dialogHashKey, for making a server\n\t\t\t// request\n\t\t\tgetFilePath: function( path ) {\n\t\t\t\treturn path && path.split( dialogHashKey )[0];\n\t\t\t},\n\n\t\t\t// check if the specified url refers to the first page in the main\n\t\t\t// application document.\n\t\t\tisFirstPageUrl: function( url ) {\n\t\t\t\t// We only deal with absolute paths.\n\t\t\t\tvar u = path.parseUrl( path.makeUrlAbsolute( url, this.documentBase ) ),\n\n\t\t\t\t\t// Does the url have the same path as the document?\n\t\t\t\t\tsamePath = u.hrefNoHash === this.documentUrl.hrefNoHash ||\n\t\t\t\t\t\t( this.documentBaseDiffers &&\n\t\t\t\t\t\t\tu.hrefNoHash === this.documentBase.hrefNoHash ),\n\n\t\t\t\t\t// Get the first page element.\n\t\t\t\t\tfp = $.mobile.firstPage,\n\n\t\t\t\t\t// Get the id of the first page element if it has one.\n\t\t\t\t\tfpId = fp && fp[0] ? fp[0].id : undefined;\n\n\t\t\t\t// The url refers to the first page if the path matches the document and\n\t\t\t\t// it either has no hash value, or the hash is exactly equal to the id\n\t\t\t\t// of the first page element.\n\t\t\t\treturn samePath &&\n\t\t\t\t\t( !u.hash ||\n\t\t\t\t\t\tu.hash === \"#\" ||\n\t\t\t\t\t\t( fpId && u.hash.replace( /^#/, \"\" ) === fpId ) );\n\t\t\t},\n\n\t\t\t// Some embedded browsers, like the web view in Phone Gap, allow\n\t\t\t// cross-domain XHR requests if the document doing the request was loaded\n\t\t\t// via the file:// protocol. This is usually to allow the application to\n\t\t\t// \"phone home\" and fetch app specific data. We normally let the browser\n\t\t\t// handle external/cross-domain urls, but if the allowCrossDomainPages\n\t\t\t// option is true, we will allow cross-domain http/https requests to go\n\t\t\t// through our page loading logic.\n\t\t\tisPermittedCrossDomainRequest: function( docUrl, reqUrl ) {\n\t\t\t\treturn $.mobile.allowCrossDomainPages &&\n\t\t\t\t\t(docUrl.protocol === \"file:\" || docUrl.protocol === \"content:\") &&\n\t\t\t\t\treqUrl.search( /^https?:/ ) !== -1;\n\t\t\t}\n\t\t};\n\n\t\tpath.documentUrl = path.parseLocation();\n\n\t\t$base = $( \"head\" ).find( \"base\" );\n\n\t\tpath.documentBase = $base.length ?\n\t\t\tpath.parseUrl( path.makeUrlAbsolute( $base.attr( \"href\" ), path.documentUrl.href ) ) :\n\t\t\tpath.documentUrl;\n\n\t\tpath.documentBaseDiffers = (path.documentUrl.hrefNoHash !== path.documentBase.hrefNoHash);\n\n\t\t//return the original document base url\n\t\tpath.getDocumentBase = function( asParsedObject ) {\n\t\t\treturn asParsedObject ? $.extend( {}, path.documentBase ) : path.documentBase.href;\n\t\t};\n\n\t\t// DEPRECATED as of 1.4.0 - remove in 1.5.0\n\t\t$.extend( $.mobile, {\n\n\t\t\t//return the original document url\n\t\t\tgetDocumentUrl: path.getDocumentUrl,\n\n\t\t\t//return the original document base url\n\t\t\tgetDocumentBase: path.getDocumentBase\n\t\t});\n})( jQuery );\n\n\n\n(function( $, undefined ) {\n\t$.mobile.History = function( stack, index ) {\n\t\tthis.stack = stack || [];\n\t\tthis.activeIndex = index || 0;\n\t};\n\n\t$.extend($.mobile.History.prototype, {\n\t\tgetActive: function() {\n\t\t\treturn this.stack[ this.activeIndex ];\n\t\t},\n\n\t\tgetLast: function() {\n\t\t\treturn this.stack[ this.previousIndex ];\n\t\t},\n\n\t\tgetNext: function() {\n\t\t\treturn this.stack[ this.activeIndex + 1 ];\n\t\t},\n\n\t\tgetPrev: function() {\n\t\t\treturn this.stack[ this.activeIndex - 1 ];\n\t\t},\n\n\t\t// addNew is used whenever a new page is added\n\t\tadd: function( url, data ) {\n\t\t\tdata = data || {};\n\n\t\t\t//if there's forward history, wipe it\n\t\t\tif ( this.getNext() ) {\n\t\t\t\tthis.clearForward();\n\t\t\t}\n\n\t\t\t// if the hash is included in the data make sure the shape\n\t\t\t// is consistent for comparison\n\t\t\tif ( data.hash && data.hash.indexOf( \"#\" ) === -1) {\n\t\t\t\tdata.hash = \"#\" + data.hash;\n\t\t\t}\n\n\t\t\tdata.url = url;\n\t\t\tthis.stack.push( data );\n\t\t\tthis.activeIndex = this.stack.length - 1;\n\t\t},\n\n\t\t//wipe urls ahead of active index\n\t\tclearForward: function() {\n\t\t\tthis.stack = this.stack.slice( 0, this.activeIndex + 1 );\n\t\t},\n\n\t\tfind: function( url, stack, earlyReturn ) {\n\t\t\tstack = stack || this.stack;\n\n\t\t\tvar entry, i, length = stack.length, index;\n\n\t\t\tfor ( i = 0; i < length; i++ ) {\n\t\t\t\tentry = stack[i];\n\n\t\t\t\tif ( decodeURIComponent(url) === decodeURIComponent(entry.url) ||\n\t\t\t\t\tdecodeURIComponent(url) === decodeURIComponent(entry.hash) ) {\n\t\t\t\t\tindex = i;\n\n\t\t\t\t\tif ( earlyReturn ) {\n\t\t\t\t\t\treturn index;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn index;\n\t\t},\n\n\t\tclosest: function( url ) {\n\t\t\tvar closest, a = this.activeIndex;\n\n\t\t\t// First, take the slice of the history stack before the current index and search\n\t\t\t// for a url match. If one is found, we'll avoid avoid looking through forward history\n\t\t\t// NOTE the preference for backward history movement is driven by the fact that\n\t\t\t//      most mobile browsers only have a dedicated back button, and users rarely use\n\t\t\t//      the forward button in desktop browser anyhow\n\t\t\tclosest = this.find( url, this.stack.slice(0, a) );\n\n\t\t\t// If nothing was found in backward history check forward. The `true`\n\t\t\t// value passed as the third parameter causes the find method to break\n\t\t\t// on the first match in the forward history slice. The starting index\n\t\t\t// of the slice must then be added to the result to get the element index\n\t\t\t// in the original history stack :( :(\n\t\t\t//\n\t\t\t// TODO this is hyper confusing and should be cleaned up (ugh so bad)\n\t\t\tif ( closest === undefined ) {\n\t\t\t\tclosest = this.find( url, this.stack.slice(a), true );\n\t\t\t\tclosest = closest === undefined ? closest : closest + a;\n\t\t\t}\n\n\t\t\treturn closest;\n\t\t},\n\n\t\tdirect: function( opts ) {\n\t\t\tvar newActiveIndex = this.closest( opts.url ), a = this.activeIndex;\n\n\t\t\t// save new page index, null check to prevent falsey 0 result\n\t\t\t// record the previous index for reference\n\t\t\tif ( newActiveIndex !== undefined ) {\n\t\t\t\tthis.activeIndex = newActiveIndex;\n\t\t\t\tthis.previousIndex = a;\n\t\t\t}\n\n\t\t\t// invoke callbacks where appropriate\n\t\t\t//\n\t\t\t// TODO this is also convoluted and confusing\n\t\t\tif ( newActiveIndex < a ) {\n\t\t\t\t( opts.present || opts.back || $.noop )( this.getActive(), \"back\" );\n\t\t\t} else if ( newActiveIndex > a ) {\n\t\t\t\t( opts.present || opts.forward || $.noop )( this.getActive(), \"forward\" );\n\t\t\t} else if ( newActiveIndex === undefined && opts.missing ) {\n\t\t\t\topts.missing( this.getActive() );\n\t\t\t}\n\t\t}\n\t});\n})( jQuery );\n\n\n\n(function( $, undefined ) {\n\tvar path = $.mobile.path,\n\t\tinitialHref = location.href;\n\n\t$.mobile.Navigator = function( history ) {\n\t\tthis.history = history;\n\t\tthis.ignoreInitialHashChange = true;\n\n\t\t$.mobile.window.bind({\n\t\t\t\"popstate.history\": $.proxy( this.popstate, this ),\n\t\t\t\"hashchange.history\": $.proxy( this.hashchange, this )\n\t\t});\n\t};\n\n\t$.extend($.mobile.Navigator.prototype, {\n\t\tsquash: function( url, data ) {\n\t\t\tvar state, href, hash = path.isPath(url) ? path.stripHash(url) : url;\n\n\t\t\thref = path.squash( url );\n\n\t\t\t// make sure to provide this information when it isn't explicitly set in the\n\t\t\t// data object that was passed to the squash method\n\t\t\tstate = $.extend({\n\t\t\t\thash: hash,\n\t\t\t\turl: href\n\t\t\t}, data);\n\n\t\t\t// replace the current url with the new href and store the state\n\t\t\t// Note that in some cases we might be replacing an url with the\n\t\t\t// same url. We do this anyways because we need to make sure that\n\t\t\t// all of our history entries have a state object associated with\n\t\t\t// them. This allows us to work around the case where $.mobile.back()\n\t\t\t// is called to transition from an external page to an embedded page.\n\t\t\t// In that particular case, a hashchange event is *NOT* generated by the browser.\n\t\t\t// Ensuring each history entry has a state object means that onPopState()\n\t\t\t// will always trigger our hashchange callback even when a hashchange event\n\t\t\t// is not fired.\n\t\t\twindow.history.replaceState( state, state.title || document.title, href );\n\n\t\t\treturn state;\n\t\t},\n\n\t\thash: function( url, href ) {\n\t\t\tvar parsed, loc, hash, resolved;\n\n\t\t\t// Grab the hash for recording. If the passed url is a path\n\t\t\t// we used the parsed version of the squashed url to reconstruct,\n\t\t\t// otherwise we assume it's a hash and store it directly\n\t\t\tparsed = path.parseUrl( url );\n\t\t\tloc = path.parseLocation();\n\n\t\t\tif ( loc.pathname + loc.search === parsed.pathname + parsed.search ) {\n\t\t\t\t// If the pathname and search of the passed url is identical to the current loc\n\t\t\t\t// then we must use the hash. Otherwise there will be no event\n\t\t\t\t// eg, url = \"/foo/bar?baz#bang\", location.href = \"http://example.com/foo/bar?baz\"\n\t\t\t\thash = parsed.hash ? parsed.hash : parsed.pathname + parsed.search;\n\t\t\t} else if ( path.isPath(url) ) {\n\t\t\t\tresolved = path.parseUrl( href );\n\t\t\t\t// If the passed url is a path, make it domain relative and remove any trailing hash\n\t\t\t\thash = resolved.pathname + resolved.search + (path.isPreservableHash( resolved.hash )? resolved.hash.replace( \"#\", \"\" ) : \"\");\n\t\t\t} else {\n\t\t\t\thash = url;\n\t\t\t}\n\n\t\t\treturn hash;\n\t\t},\n\n\t\t// TODO reconsider name\n\t\tgo: function( url, data, noEvents ) {\n\t\t\tvar state, href, hash, popstateEvent,\n\t\t\t\tisPopStateEvent = $.event.special.navigate.isPushStateEnabled();\n\n\t\t\t// Get the url as it would look squashed on to the current resolution url\n\t\t\thref = path.squash( url );\n\n\t\t\t// sort out what the hash sould be from the url\n\t\t\thash = this.hash( url, href );\n\n\t\t\t// Here we prevent the next hash change or popstate event from doing any\n\t\t\t// history management. In the case of hashchange we don't swallow it\n\t\t\t// if there will be no hashchange fired (since that won't reset the value)\n\t\t\t// and will swallow the following hashchange\n\t\t\tif ( noEvents && hash !== path.stripHash(path.parseLocation().hash) ) {\n\t\t\t\tthis.preventNextHashChange = noEvents;\n\t\t\t}\n\n\t\t\t// IMPORTANT in the case where popstate is supported the event will be triggered\n\t\t\t//      directly, stopping further execution - ie, interupting the flow of this\n\t\t\t//      method call to fire bindings at this expression. Below the navigate method\n\t\t\t//      there is a binding to catch this event and stop its propagation.\n\t\t\t//\n\t\t\t//      We then trigger a new popstate event on the window with a null state\n\t\t\t//      so that the navigate events can conclude their work properly\n\t\t\t//\n\t\t\t// if the url is a path we want to preserve the query params that are available on\n\t\t\t// the current url.\n\t\t\tthis.preventHashAssignPopState = true;\n\t\t\twindow.location.hash = hash;\n\n\t\t\t// If popstate is enabled and the browser triggers `popstate` events when the hash\n\t\t\t// is set (this often happens immediately in browsers like Chrome), then the\n\t\t\t// this flag will be set to false already. If it's a browser that does not trigger\n\t\t\t// a `popstate` on hash assignement or `replaceState` then we need avoid the branch\n\t\t\t// that swallows the event created by the popstate generated by the hash assignment\n\t\t\t// At the time of this writing this happens with Opera 12 and some version of IE\n\t\t\tthis.preventHashAssignPopState = false;\n\n\t\t\tstate = $.extend({\n\t\t\t\turl: href,\n\t\t\t\thash: hash,\n\t\t\t\ttitle: document.title\n\t\t\t}, data);\n\n\t\t\tif ( isPopStateEvent ) {\n\t\t\t\tpopstateEvent = new $.Event( \"popstate\" );\n\t\t\t\tpopstateEvent.originalEvent = {\n\t\t\t\t\ttype: \"popstate\",\n\t\t\t\t\tstate: null\n\t\t\t\t};\n\n\t\t\t\tthis.squash( url, state );\n\n\t\t\t\t// Trigger a new faux popstate event to replace the one that we\n\t\t\t\t// caught that was triggered by the hash setting above.\n\t\t\t\tif ( !noEvents ) {\n\t\t\t\t\tthis.ignorePopState = true;\n\t\t\t\t\t$.mobile.window.trigger( popstateEvent );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// record the history entry so that the information can be included\n\t\t\t// in hashchange event driven navigate events in a similar fashion to\n\t\t\t// the state that's provided by popstate\n\t\t\tthis.history.add( state.url, state );\n\t\t},\n\n\t\t// This binding is intended to catch the popstate events that are fired\n\t\t// when execution of the `$.navigate` method stops at window.location.hash = url;\n\t\t// and completely prevent them from propagating. The popstate event will then be\n\t\t// retriggered after execution resumes\n\t\t//\n\t\t// TODO grab the original event here and use it for the synthetic event in the\n\t\t//      second half of the navigate execution that will follow this binding\n\t\tpopstate: function( event ) {\n\t\t\tvar hash, state;\n\n\t\t\t// Partly to support our test suite which manually alters the support\n\t\t\t// value to test hashchange. Partly to prevent all around weirdness\n\t\t\tif ( !$.event.special.navigate.isPushStateEnabled() ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// If this is the popstate triggered by the actual alteration of the hash\n\t\t\t// prevent it completely. History is tracked manually\n\t\t\tif ( this.preventHashAssignPopState ) {\n\t\t\t\tthis.preventHashAssignPopState = false;\n\t\t\t\tevent.stopImmediatePropagation();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// if this is the popstate triggered after the `replaceState` call in the go\n\t\t\t// method, then simply ignore it. The history entry has already been captured\n\t\t\tif ( this.ignorePopState ) {\n\t\t\t\tthis.ignorePopState = false;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// If there is no state, and the history stack length is one were\n\t\t\t// probably getting the page load popstate fired by browsers like chrome\n\t\t\t// avoid it and set the one time flag to false.\n\t\t\t// TODO: Do we really need all these conditions? Comparing location hrefs\n\t\t\t// should be sufficient.\n\t\t\tif ( !event.originalEvent.state &&\n\t\t\t\tthis.history.stack.length === 1 &&\n\t\t\t\tthis.ignoreInitialHashChange ) {\n\t\t\t\tthis.ignoreInitialHashChange = false;\n\n\t\t\t\tif ( location.href === initialHref ) {\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// account for direct manipulation of the hash. That is, we will receive a popstate\n\t\t\t// when the hash is changed by assignment, and it won't have a state associated. We\n\t\t\t// then need to squash the hash. See below for handling of hash assignment that\n\t\t\t// matches an existing history entry\n\t\t\t// TODO it might be better to only add to the history stack\n\t\t\t//      when the hash is adjacent to the active history entry\n\t\t\thash = path.parseLocation().hash;\n\t\t\tif ( !event.originalEvent.state && hash ) {\n\t\t\t\t// squash the hash that's been assigned on the URL with replaceState\n\t\t\t\t// also grab the resulting state object for storage\n\t\t\t\tstate = this.squash( hash );\n\n\t\t\t\t// record the new hash as an additional history entry\n\t\t\t\t// to match the browser's treatment of hash assignment\n\t\t\t\tthis.history.add( state.url, state );\n\n\t\t\t\t// pass the newly created state information\n\t\t\t\t// along with the event\n\t\t\t\tevent.historyState = state;\n\n\t\t\t\t// do not alter history, we've added a new history entry\n\t\t\t\t// so we know where we are\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// If all else fails this is a popstate that comes from the back or forward buttons\n\t\t\t// make sure to set the state of our history stack properly, and record the directionality\n\t\t\tthis.history.direct({\n\t\t\t\turl: (event.originalEvent.state || {}).url || hash,\n\n\t\t\t\t// When the url is either forward or backward in history include the entry\n\t\t\t\t// as data on the event object for merging as data in the navigate event\n\t\t\t\tpresent: function( historyEntry, direction ) {\n\t\t\t\t\t// make sure to create a new object to pass down as the navigate event data\n\t\t\t\t\tevent.historyState = $.extend({}, historyEntry);\n\t\t\t\t\tevent.historyState.direction = direction;\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\n\t\t// NOTE must bind before `navigate` special event hashchange binding otherwise the\n\t\t//      navigation data won't be attached to the hashchange event in time for those\n\t\t//      bindings to attach it to the `navigate` special event\n\t\t// TODO add a check here that `hashchange.navigate` is bound already otherwise it's\n\t\t//      broken (exception?)\n\t\thashchange: function( event ) {\n\t\t\tvar history, hash;\n\n\t\t\t// If hashchange listening is explicitly disabled or pushstate is supported\n\t\t\t// avoid making use of the hashchange handler.\n\t\t\tif (!$.event.special.navigate.isHashChangeEnabled() ||\n\t\t\t\t$.event.special.navigate.isPushStateEnabled() ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// On occasion explicitly want to prevent the next hash from propogating because we only\n\t\t\t// with to alter the url to represent the new state do so here\n\t\t\tif ( this.preventNextHashChange ) {\n\t\t\t\tthis.preventNextHashChange = false;\n\t\t\t\tevent.stopImmediatePropagation();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\thistory = this.history;\n\t\t\thash = path.parseLocation().hash;\n\n\t\t\t// If this is a hashchange caused by the back or forward button\n\t\t\t// make sure to set the state of our history stack properly\n\t\t\tthis.history.direct({\n\t\t\t\turl: hash,\n\n\t\t\t\t// When the url is either forward or backward in history include the entry\n\t\t\t\t// as data on the event object for merging as data in the navigate event\n\t\t\t\tpresent: function( historyEntry, direction ) {\n\t\t\t\t\t// make sure to create a new object to pass down as the navigate event data\n\t\t\t\t\tevent.hashchangeState = $.extend({}, historyEntry);\n\t\t\t\t\tevent.hashchangeState.direction = direction;\n\t\t\t\t},\n\n\t\t\t\t// When we don't find a hash in our history clearly we're aiming to go there\n\t\t\t\t// record the entry as new for future traversal\n\t\t\t\t//\n\t\t\t\t// NOTE it's not entirely clear that this is the right thing to do given that we\n\t\t\t\t//      can't know the users intention. It might be better to explicitly _not_\n\t\t\t\t//      support location.hash assignment in preference to $.navigate calls\n\t\t\t\t// TODO first arg to add should be the href, but it causes issues in identifying\n\t\t\t\t//      embeded pages\n\t\t\t\tmissing: function() {\n\t\t\t\t\thistory.add( hash, {\n\t\t\t\t\t\thash: hash,\n\t\t\t\t\t\ttitle: document.title\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t});\n})( jQuery );\n\n\n\n(function( $, undefined ) {\n\t// TODO consider queueing navigation activity until previous activities have completed\n\t//      so that end users don't have to think about it. Punting for now\n\t// TODO !! move the event bindings into callbacks on the navigate event\n\t$.mobile.navigate = function( url, data, noEvents ) {\n\t\t$.mobile.navigate.navigator.go( url, data, noEvents );\n\t};\n\n\t// expose the history on the navigate method in anticipation of full integration with\n\t// existing navigation functionalty that is tightly coupled to the history information\n\t$.mobile.navigate.history = new $.mobile.History();\n\n\t// instantiate an instance of the navigator for use within the $.navigate method\n\t$.mobile.navigate.navigator = new $.mobile.Navigator( $.mobile.navigate.history );\n\n\tvar loc = $.mobile.path.parseLocation();\n\t$.mobile.navigate.history.add( loc.href, {hash: loc.hash} );\n})( jQuery );\n\n\n(function( $, undefined ) {\n\tvar props = {\n\t\t\t\"animation\": {},\n\t\t\t\"transition\": {}\n\t\t},\n\t\ttestElement = document.createElement( \"a\" ),\n\t\tvendorPrefixes = [ \"\", \"webkit-\", \"moz-\", \"o-\" ];\n\n\t$.each( [ \"animation\", \"transition\" ], function( i, test ) {\n\n\t\t// Get correct name for test\n\t\tvar testName = ( i === 0 ) ? test + \"-\" + \"name\" : test;\n\n\t\t$.each( vendorPrefixes, function( j, prefix ) {\n\t\t\tif ( testElement.style[ $.camelCase( prefix + testName ) ] !== undefined ) {\n\t\t\t\t props[ test ][ \"prefix\" ] = prefix;\n\t\t\t\treturn false;\n\t\t\t}\n\t\t});\n\n\t\t// Set event and duration names for later use\n\t\tprops[ test ][ \"duration\" ] =\n\t\t\t$.camelCase( props[ test ][ \"prefix\" ] + test + \"-\" + \"duration\" );\n\t\tprops[ test ][ \"event\" ] =\n\t\t\t$.camelCase( props[ test ][ \"prefix\" ] + test + \"-\" + \"end\" );\n\n\t\t// All lower case if not a vendor prop\n\t\tif ( props[ test ][ \"prefix\" ] === \"\" ) {\n\t\t\tprops[ test ][ \"event\" ] = props[ test ][ \"event\" ].toLowerCase();\n\t\t}\n\t});\n\n\t// If a valid prefix was found then the it is supported by the browser\n\t$.support.cssTransitions = ( props[ \"transition\" ][ \"prefix\" ] !== undefined );\n\t$.support.cssAnimations = ( props[ \"animation\" ][ \"prefix\" ] !== undefined );\n\n\t// Remove the testElement\n\t$( testElement ).remove();\n\n\t// Animation complete callback\n\t$.fn.animationComplete = function( callback, type, fallbackTime ) {\n\t\tvar timer, duration,\n\t\t\tthat = this,\n\t\t\teventBinding = function() {\n\n\t\t\t\t// Clear the timer so we don't call callback twice\n\t\t\t\tclearTimeout( timer );\n\t\t\t\tcallback.apply( this, arguments );\n\t\t\t},\n\t\t\tanimationType = ( !type || type === \"animation\" ) ? \"animation\" : \"transition\";\n\n\t\t// Make sure selected type is supported by browser\n\t\tif ( ( $.support.cssTransitions && animationType === \"transition\" ) ||\n\t\t\t( $.support.cssAnimations && animationType === \"animation\" ) ) {\n\n\t\t\t// If a fallback time was not passed set one\n\t\t\tif ( fallbackTime === undefined ) {\n\n\t\t\t\t// Make sure the was not bound to document before checking .css\n\t\t\t\tif ( $( this ).context !== document ) {\n\n\t\t\t\t\t// Parse the durration since its in second multiple by 1000 for milliseconds\n\t\t\t\t\t// Multiply by 3 to make sure we give the animation plenty of time.\n\t\t\t\t\tduration = parseFloat(\n\t\t\t\t\t\t$( this ).css( props[ animationType ].duration )\n\t\t\t\t\t) * 3000;\n\t\t\t\t}\n\n\t\t\t\t// If we could not read a duration use the default\n\t\t\t\tif ( duration === 0 || duration === undefined || isNaN( duration ) ) {\n\t\t\t\t\tduration = $.fn.animationComplete.defaultDuration;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Sets up the fallback if event never comes\n\t\t\ttimer = setTimeout( function() {\n\t\t\t\t$( that ).off( props[ animationType ].event, eventBinding );\n\t\t\t\tcallback.apply( that );\n\t\t\t}, duration );\n\n\t\t\t// Bind the event\n\t\t\treturn $( this ).one( props[ animationType ].event, eventBinding );\n\t\t} else {\n\n\t\t\t// CSS animation / transitions not supported\n\t\t\t// Defer execution for consistency between webkit/non webkit\n\t\t\tsetTimeout( $.proxy( callback, this ), 0 );\n\t\t\treturn $( this );\n\t\t}\n\t};\n\n\t// Allow default callback to be configured on mobileInit\n\t$.fn.animationComplete.defaultDuration = 1000;\n})( jQuery );\n\n// This plugin is an experiment for abstracting away the touch and mouse\n// events so that developers don't have to worry about which method of input\n// the device their document is loaded on supports.\n//\n// The idea here is to allow the developer to register listeners for the\n// basic mouse events, such as mousedown, mousemove, mouseup, and click,\n// and the plugin will take care of registering the correct listeners\n// behind the scenes to invoke the listener at the fastest possible time\n// for that device, while still retaining the order of event firing in\n// the traditional mouse environment, should multiple handlers be registered\n// on the same element for different events.\n//\n// The current version exposes the following virtual events to jQuery bind methods:\n// \"vmouseover vmousedown vmousemove vmouseup vclick vmouseout vmousecancel\"\n\n(function( $, window, document, undefined ) {\n\nvar dataPropertyName = \"virtualMouseBindings\",\n\ttouchTargetPropertyName = \"virtualTouchID\",\n\tvirtualEventNames = \"vmouseover vmousedown vmousemove vmouseup vclick vmouseout vmousecancel\".split( \" \" ),\n\ttouchEventProps = \"clientX clientY pageX pageY screenX screenY\".split( \" \" ),\n\tmouseHookProps = $.event.mouseHooks ? $.event.mouseHooks.props : [],\n\tmouseEventProps = $.event.props.concat( mouseHookProps ),\n\tactiveDocHandlers = {},\n\tresetTimerID = 0,\n\tstartX = 0,\n\tstartY = 0,\n\tdidScroll = false,\n\tclickBlockList = [],\n\tblockMouseTriggers = false,\n\tblockTouchTriggers = false,\n\teventCaptureSupported = \"addEventListener\" in document,\n\t$document = $( document ),\n\tnextTouchID = 1,\n\tlastTouchID = 0, threshold,\n\ti;\n\n$.vmouse = {\n\tmoveDistanceThreshold: 10,\n\tclickDistanceThreshold: 10,\n\tresetTimerDuration: 1500\n};\n\nfunction getNativeEvent( event ) {\n\n\twhile ( event && typeof event.originalEvent !== \"undefined\" ) {\n\t\tevent = event.originalEvent;\n\t}\n\treturn event;\n}\n\nfunction createVirtualEvent( event, eventType ) {\n\n\tvar t = event.type,\n\t\toe, props, ne, prop, ct, touch, i, j, len;\n\n\tevent = $.Event( event );\n\tevent.type = eventType;\n\n\toe = event.originalEvent;\n\tprops = $.event.props;\n\n\t// addresses separation of $.event.props in to $.event.mouseHook.props and Issue 3280\n\t// https://github.com/jquery/jquery-mobile/issues/3280\n\tif ( t.search( /^(mouse|click)/ ) > -1 ) {\n\t\tprops = mouseEventProps;\n\t}\n\n\t// copy original event properties over to the new event\n\t// this would happen if we could call $.event.fix instead of $.Event\n\t// but we don't have a way to force an event to be fixed multiple times\n\tif ( oe ) {\n\t\tfor ( i = props.length, prop; i; ) {\n\t\t\tprop = props[ --i ];\n\t\t\tevent[ prop ] = oe[ prop ];\n\t\t}\n\t}\n\n\t// make sure that if the mouse and click virtual events are generated\n\t// without a .which one is defined\n\tif ( t.search(/mouse(down|up)|click/) > -1 && !event.which ) {\n\t\tevent.which = 1;\n\t}\n\n\tif ( t.search(/^touch/) !== -1 ) {\n\t\tne = getNativeEvent( oe );\n\t\tt = ne.touches;\n\t\tct = ne.changedTouches;\n\t\ttouch = ( t && t.length ) ? t[0] : ( ( ct && ct.length ) ? ct[ 0 ] : undefined );\n\n\t\tif ( touch ) {\n\t\t\tfor ( j = 0, len = touchEventProps.length; j < len; j++) {\n\t\t\t\tprop = touchEventProps[ j ];\n\t\t\t\tevent[ prop ] = touch[ prop ];\n\t\t\t}\n\t\t}\n\t}\n\n\treturn event;\n}\n\nfunction getVirtualBindingFlags( element ) {\n\n\tvar flags = {},\n\t\tb, k;\n\n\twhile ( element ) {\n\n\t\tb = $.data( element, dataPropertyName );\n\n\t\tfor (  k in b ) {\n\t\t\tif ( b[ k ] ) {\n\t\t\t\tflags[ k ] = flags.hasVirtualBinding = true;\n\t\t\t}\n\t\t}\n\t\telement = element.parentNode;\n\t}\n\treturn flags;\n}\n\nfunction getClosestElementWithVirtualBinding( element, eventType ) {\n\tvar b;\n\twhile ( element ) {\n\n\t\tb = $.data( element, dataPropertyName );\n\n\t\tif ( b && ( !eventType || b[ eventType ] ) ) {\n\t\t\treturn element;\n\t\t}\n\t\telement = element.parentNode;\n\t}\n\treturn null;\n}\n\nfunction enableTouchBindings() {\n\tblockTouchTriggers = false;\n}\n\nfunction disableTouchBindings() {\n\tblockTouchTriggers = true;\n}\n\nfunction enableMouseBindings() {\n\tlastTouchID = 0;\n\tclickBlockList.length = 0;\n\tblockMouseTriggers = false;\n\n\t// When mouse bindings are enabled, our\n\t// touch bindings are disabled.\n\tdisableTouchBindings();\n}\n\nfunction disableMouseBindings() {\n\t// When mouse bindings are disabled, our\n\t// touch bindings are enabled.\n\tenableTouchBindings();\n}\n\nfunction startResetTimer() {\n\tclearResetTimer();\n\tresetTimerID = setTimeout( function() {\n\t\tresetTimerID = 0;\n\t\tenableMouseBindings();\n\t}, $.vmouse.resetTimerDuration );\n}\n\nfunction clearResetTimer() {\n\tif ( resetTimerID ) {\n\t\tclearTimeout( resetTimerID );\n\t\tresetTimerID = 0;\n\t}\n}\n\nfunction triggerVirtualEvent( eventType, event, flags ) {\n\tvar ve;\n\n\tif ( ( flags && flags[ eventType ] ) ||\n\t\t\t\t( !flags && getClosestElementWithVirtualBinding( event.target, eventType ) ) ) {\n\n\t\tve = createVirtualEvent( event, eventType );\n\n\t\t$( event.target).trigger( ve );\n\t}\n\n\treturn ve;\n}\n\nfunction mouseEventCallback( event ) {\n\tvar touchID = $.data( event.target, touchTargetPropertyName ),\n\t\tve;\n\n\tif ( !blockMouseTriggers && ( !lastTouchID || lastTouchID !== touchID ) ) {\n\t\tve = triggerVirtualEvent( \"v\" + event.type, event );\n\t\tif ( ve ) {\n\t\t\tif ( ve.isDefaultPrevented() ) {\n\t\t\t\tevent.preventDefault();\n\t\t\t}\n\t\t\tif ( ve.isPropagationStopped() ) {\n\t\t\t\tevent.stopPropagation();\n\t\t\t}\n\t\t\tif ( ve.isImmediatePropagationStopped() ) {\n\t\t\t\tevent.stopImmediatePropagation();\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction handleTouchStart( event ) {\n\n\tvar touches = getNativeEvent( event ).touches,\n\t\ttarget, flags, t;\n\n\tif ( touches && touches.length === 1 ) {\n\n\t\ttarget = event.target;\n\t\tflags = getVirtualBindingFlags( target );\n\n\t\tif ( flags.hasVirtualBinding ) {\n\n\t\t\tlastTouchID = nextTouchID++;\n\t\t\t$.data( target, touchTargetPropertyName, lastTouchID );\n\n\t\t\tclearResetTimer();\n\n\t\t\tdisableMouseBindings();\n\t\t\tdidScroll = false;\n\n\t\t\tt = getNativeEvent( event ).touches[ 0 ];\n\t\t\tstartX = t.pageX;\n\t\t\tstartY = t.pageY;\n\n\t\t\ttriggerVirtualEvent( \"vmouseover\", event, flags );\n\t\t\ttriggerVirtualEvent( \"vmousedown\", event, flags );\n\t\t}\n\t}\n}\n\nfunction handleScroll( event ) {\n\tif ( blockTouchTriggers ) {\n\t\treturn;\n\t}\n\n\tif ( !didScroll ) {\n\t\ttriggerVirtualEvent( \"vmousecancel\", event, getVirtualBindingFlags( event.target ) );\n\t}\n\n\tdidScroll = true;\n\tstartResetTimer();\n}\n\nfunction handleTouchMove( event ) {\n\tif ( blockTouchTriggers ) {\n\t\treturn;\n\t}\n\n\tvar t = getNativeEvent( event ).touches[ 0 ],\n\t\tdidCancel = didScroll,\n\t\tmoveThreshold = $.vmouse.moveDistanceThreshold,\n\t\tflags = getVirtualBindingFlags( event.target );\n\n\t\tdidScroll = didScroll ||\n\t\t\t( Math.abs( t.pageX - startX ) > moveThreshold ||\n\t\t\t\tMath.abs( t.pageY - startY ) > moveThreshold );\n\n\tif ( didScroll && !didCancel ) {\n\t\ttriggerVirtualEvent( \"vmousecancel\", event, flags );\n\t}\n\n\ttriggerVirtualEvent( \"vmousemove\", event, flags );\n\tstartResetTimer();\n}\n\nfunction handleTouchEnd( event ) {\n\tif ( blockTouchTriggers ) {\n\t\treturn;\n\t}\n\n\tdisableTouchBindings();\n\n\tvar flags = getVirtualBindingFlags( event.target ),\n\t\tve, t;\n\ttriggerVirtualEvent( \"vmouseup\", event, flags );\n\n\tif ( !didScroll ) {\n\t\tve = triggerVirtualEvent( \"vclick\", event, flags );\n\t\tif ( ve && ve.isDefaultPrevented() ) {\n\t\t\t// The target of the mouse events that follow the touchend\n\t\t\t// event don't necessarily match the target used during the\n\t\t\t// touch. This means we need to rely on coordinates for blocking\n\t\t\t// any click that is generated.\n\t\t\tt = getNativeEvent( event ).changedTouches[ 0 ];\n\t\t\tclickBlockList.push({\n\t\t\t\ttouchID: lastTouchID,\n\t\t\t\tx: t.clientX,\n\t\t\t\ty: t.clientY\n\t\t\t});\n\n\t\t\t// Prevent any mouse events that follow from triggering\n\t\t\t// virtual event notifications.\n\t\t\tblockMouseTriggers = true;\n\t\t}\n\t}\n\ttriggerVirtualEvent( \"vmouseout\", event, flags);\n\tdidScroll = false;\n\n\tstartResetTimer();\n}\n\nfunction hasVirtualBindings( ele ) {\n\tvar bindings = $.data( ele, dataPropertyName ),\n\t\tk;\n\n\tif ( bindings ) {\n\t\tfor ( k in bindings ) {\n\t\t\tif ( bindings[ k ] ) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t}\n\treturn false;\n}\n\nfunction dummyMouseHandler() {}\n\nfunction getSpecialEventObject( eventType ) {\n\tvar realType = eventType.substr( 1 );\n\n\treturn {\n\t\tsetup: function(/* data, namespace */) {\n\t\t\t// If this is the first virtual mouse binding for this element,\n\t\t\t// add a bindings object to its data.\n\n\t\t\tif ( !hasVirtualBindings( this ) ) {\n\t\t\t\t$.data( this, dataPropertyName, {} );\n\t\t\t}\n\n\t\t\t// If setup is called, we know it is the first binding for this\n\t\t\t// eventType, so initialize the count for the eventType to zero.\n\t\t\tvar bindings = $.data( this, dataPropertyName );\n\t\t\tbindings[ eventType ] = true;\n\n\t\t\t// If this is the first virtual mouse event for this type,\n\t\t\t// register a global handler on the document.\n\n\t\t\tactiveDocHandlers[ eventType ] = ( activeDocHandlers[ eventType ] || 0 ) + 1;\n\n\t\t\tif ( activeDocHandlers[ eventType ] === 1 ) {\n\t\t\t\t$document.bind( realType, mouseEventCallback );\n\t\t\t}\n\n\t\t\t// Some browsers, like Opera Mini, won't dispatch mouse/click events\n\t\t\t// for elements unless they actually have handlers registered on them.\n\t\t\t// To get around this, we register dummy handlers on the elements.\n\n\t\t\t$( this ).bind( realType, dummyMouseHandler );\n\n\t\t\t// For now, if event capture is not supported, we rely on mouse handlers.\n\t\t\tif ( eventCaptureSupported ) {\n\t\t\t\t// If this is the first virtual mouse binding for the document,\n\t\t\t\t// register our touchstart handler on the document.\n\n\t\t\t\tactiveDocHandlers[ \"touchstart\" ] = ( activeDocHandlers[ \"touchstart\" ] || 0) + 1;\n\n\t\t\t\tif ( activeDocHandlers[ \"touchstart\" ] === 1 ) {\n\t\t\t\t\t$document.bind( \"touchstart\", handleTouchStart )\n\t\t\t\t\t\t.bind( \"touchend\", handleTouchEnd )\n\n\t\t\t\t\t\t// On touch platforms, touching the screen and then dragging your finger\n\t\t\t\t\t\t// causes the window content to scroll after some distance threshold is\n\t\t\t\t\t\t// exceeded. On these platforms, a scroll prevents a click event from being\n\t\t\t\t\t\t// dispatched, and on some platforms, even the touchend is suppressed. To\n\t\t\t\t\t\t// mimic the suppression of the click event, we need to watch for a scroll\n\t\t\t\t\t\t// event. Unfortunately, some platforms like iOS don't dispatch scroll\n\t\t\t\t\t\t// events until *AFTER* the user lifts their finger (touchend). This means\n\t\t\t\t\t\t// we need to watch both scroll and touchmove events to figure out whether\n\t\t\t\t\t\t// or not a scroll happenens before the touchend event is fired.\n\n\t\t\t\t\t\t.bind( \"touchmove\", handleTouchMove )\n\t\t\t\t\t\t.bind( \"scroll\", handleScroll );\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tteardown: function(/* data, namespace */) {\n\t\t\t// If this is the last virtual binding for this eventType,\n\t\t\t// remove its global handler from the document.\n\n\t\t\t--activeDocHandlers[ eventType ];\n\n\t\t\tif ( !activeDocHandlers[ eventType ] ) {\n\t\t\t\t$document.unbind( realType, mouseEventCallback );\n\t\t\t}\n\n\t\t\tif ( eventCaptureSupported ) {\n\t\t\t\t// If this is the last virtual mouse binding in existence,\n\t\t\t\t// remove our document touchstart listener.\n\n\t\t\t\t--activeDocHandlers[ \"touchstart\" ];\n\n\t\t\t\tif ( !activeDocHandlers[ \"touchstart\" ] ) {\n\t\t\t\t\t$document.unbind( \"touchstart\", handleTouchStart )\n\t\t\t\t\t\t.unbind( \"touchmove\", handleTouchMove )\n\t\t\t\t\t\t.unbind( \"touchend\", handleTouchEnd )\n\t\t\t\t\t\t.unbind( \"scroll\", handleScroll );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tvar $this = $( this ),\n\t\t\t\tbindings = $.data( this, dataPropertyName );\n\n\t\t\t// teardown may be called when an element was\n\t\t\t// removed from the DOM. If this is the case,\n\t\t\t// jQuery core may have already stripped the element\n\t\t\t// of any data bindings so we need to check it before\n\t\t\t// using it.\n\t\t\tif ( bindings ) {\n\t\t\t\tbindings[ eventType ] = false;\n\t\t\t}\n\n\t\t\t// Unregister the dummy event handler.\n\n\t\t\t$this.unbind( realType, dummyMouseHandler );\n\n\t\t\t// If this is the last virtual mouse binding on the\n\t\t\t// element, remove the binding data from the element.\n\n\t\t\tif ( !hasVirtualBindings( this ) ) {\n\t\t\t\t$this.removeData( dataPropertyName );\n\t\t\t}\n\t\t}\n\t};\n}\n\n// Expose our custom events to the jQuery bind/unbind mechanism.\n\nfor ( i = 0; i < virtualEventNames.length; i++ ) {\n\t$.event.special[ virtualEventNames[ i ] ] = getSpecialEventObject( virtualEventNames[ i ] );\n}\n\n// Add a capture click handler to block clicks.\n// Note that we require event capture support for this so if the device\n// doesn't support it, we punt for now and rely solely on mouse events.\nif ( eventCaptureSupported ) {\n\tdocument.addEventListener( \"click\", function( e ) {\n\t\tvar cnt = clickBlockList.length,\n\t\t\ttarget = e.target,\n\t\t\tx, y, ele, i, o, touchID;\n\n\t\tif ( cnt ) {\n\t\t\tx = e.clientX;\n\t\t\ty = e.clientY;\n\t\t\tthreshold = $.vmouse.clickDistanceThreshold;\n\n\t\t\t// The idea here is to run through the clickBlockList to see if\n\t\t\t// the current click event is in the proximity of one of our\n\t\t\t// vclick events that had preventDefault() called on it. If we find\n\t\t\t// one, then we block the click.\n\t\t\t//\n\t\t\t// Why do we have to rely on proximity?\n\t\t\t//\n\t\t\t// Because the target of the touch event that triggered the vclick\n\t\t\t// can be different from the target of the click event synthesized\n\t\t\t// by the browser. The target of a mouse/click event that is synthesized\n\t\t\t// from a touch event seems to be implementation specific. For example,\n\t\t\t// some browsers will fire mouse/click events for a link that is near\n\t\t\t// a touch event, even though the target of the touchstart/touchend event\n\t\t\t// says the user touched outside the link. Also, it seems that with most\n\t\t\t// browsers, the target of the mouse/click event is not calculated until the\n\t\t\t// time it is dispatched, so if you replace an element that you touched\n\t\t\t// with another element, the target of the mouse/click will be the new\n\t\t\t// element underneath that point.\n\t\t\t//\n\t\t\t// Aside from proximity, we also check to see if the target and any\n\t\t\t// of its ancestors were the ones that blocked a click. This is necessary\n\t\t\t// because of the strange mouse/click target calculation done in the\n\t\t\t// Android 2.1 browser, where if you click on an element, and there is a\n\t\t\t// mouse/click handler on one of its ancestors, the target will be the\n\t\t\t// innermost child of the touched element, even if that child is no where\n\t\t\t// near the point of touch.\n\n\t\t\tele = target;\n\n\t\t\twhile ( ele ) {\n\t\t\t\tfor ( i = 0; i < cnt; i++ ) {\n\t\t\t\t\to = clickBlockList[ i ];\n\t\t\t\t\ttouchID = 0;\n\n\t\t\t\t\tif ( ( ele === target && Math.abs( o.x - x ) < threshold && Math.abs( o.y - y ) < threshold ) ||\n\t\t\t\t\t\t\t\t$.data( ele, touchTargetPropertyName ) === o.touchID ) {\n\t\t\t\t\t\t// XXX: We may want to consider removing matches from the block list\n\t\t\t\t\t\t//      instead of waiting for the reset timer to fire.\n\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\te.stopPropagation();\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tele = ele.parentNode;\n\t\t\t}\n\t\t}\n\t}, true);\n}\n})( jQuery, window, document );\n\n\n(function( $, window, undefined ) {\n\tvar $document = $( document ),\n\t\tsupportTouch = $.mobile.support.touch,\n\t\tscrollEvent = \"touchmove scroll\",\n\t\ttouchStartEvent = supportTouch ? \"touchstart\" : \"mousedown\",\n\t\ttouchStopEvent = supportTouch ? \"touchend\" : \"mouseup\",\n\t\ttouchMoveEvent = supportTouch ? \"touchmove\" : \"mousemove\";\n\n\t// setup new event shortcuts\n\t$.each( ( \"touchstart touchmove touchend \" +\n\t\t\"tap taphold \" +\n\t\t\"swipe swipeleft swiperight \" +\n\t\t\"scrollstart scrollstop\" ).split( \" \" ), function( i, name ) {\n\n\t\t$.fn[ name ] = function( fn ) {\n\t\t\treturn fn ? this.bind( name, fn ) : this.trigger( name );\n\t\t};\n\n\t\t// jQuery < 1.8\n\t\tif ( $.attrFn ) {\n\t\t\t$.attrFn[ name ] = true;\n\t\t}\n\t});\n\n\tfunction triggerCustomEvent( obj, eventType, event, bubble ) {\n\t\tvar originalType = event.type;\n\t\tevent.type = eventType;\n\t\tif ( bubble ) {\n\t\t\t$.event.trigger( event, undefined, obj );\n\t\t} else {\n\t\t\t$.event.dispatch.call( obj, event );\n\t\t}\n\t\tevent.type = originalType;\n\t}\n\n\t// also handles scrollstop\n\t$.event.special.scrollstart = {\n\n\t\tenabled: true,\n\t\tsetup: function() {\n\n\t\t\tvar thisObject = this,\n\t\t\t\t$this = $( thisObject ),\n\t\t\t\tscrolling,\n\t\t\t\ttimer;\n\n\t\t\tfunction trigger( event, state ) {\n\t\t\t\tscrolling = state;\n\t\t\t\ttriggerCustomEvent( thisObject, scrolling ? \"scrollstart\" : \"scrollstop\", event );\n\t\t\t}\n\n\t\t\t// iPhone triggers scroll after a small delay; use touchmove instead\n\t\t\t$this.bind( scrollEvent, function( event ) {\n\n\t\t\t\tif ( !$.event.special.scrollstart.enabled ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif ( !scrolling ) {\n\t\t\t\t\ttrigger( event, true );\n\t\t\t\t}\n\n\t\t\t\tclearTimeout( timer );\n\t\t\t\ttimer = setTimeout( function() {\n\t\t\t\t\ttrigger( event, false );\n\t\t\t\t}, 50 );\n\t\t\t});\n\t\t},\n\t\tteardown: function() {\n\t\t\t$( this ).unbind( scrollEvent );\n\t\t}\n\t};\n\n\t// also handles taphold\n\t$.event.special.tap = {\n\t\ttapholdThreshold: 750,\n\t\temitTapOnTaphold: true,\n\t\tsetup: function() {\n\t\t\tvar thisObject = this,\n\t\t\t\t$this = $( thisObject ),\n\t\t\t\tisTaphold = false;\n\n\t\t\t$this.bind( \"vmousedown\", function( event ) {\n\t\t\t\tisTaphold = false;\n\t\t\t\tif ( event.which && event.which !== 1 ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\tvar origTarget = event.target,\n\t\t\t\t\ttimer;\n\n\t\t\t\tfunction clearTapTimer() {\n\t\t\t\t\tclearTimeout( timer );\n\t\t\t\t}\n\n\t\t\t\tfunction clearTapHandlers() {\n\t\t\t\t\tclearTapTimer();\n\n\t\t\t\t\t$this.unbind( \"vclick\", clickHandler )\n\t\t\t\t\t\t.unbind( \"vmouseup\", clearTapTimer );\n\t\t\t\t\t$document.unbind( \"vmousecancel\", clearTapHandlers );\n\t\t\t\t}\n\n\t\t\t\tfunction clickHandler( event ) {\n\t\t\t\t\tclearTapHandlers();\n\n\t\t\t\t\t// ONLY trigger a 'tap' event if the start target is\n\t\t\t\t\t// the same as the stop target.\n\t\t\t\t\tif ( !isTaphold && origTarget === event.target ) {\n\t\t\t\t\t\ttriggerCustomEvent( thisObject, \"tap\", event );\n\t\t\t\t\t} else if ( isTaphold ) {\n\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t$this.bind( \"vmouseup\", clearTapTimer )\n\t\t\t\t\t.bind( \"vclick\", clickHandler );\n\t\t\t\t$document.bind( \"vmousecancel\", clearTapHandlers );\n\n\t\t\t\ttimer = setTimeout( function() {\n\t\t\t\t\tif ( !$.event.special.tap.emitTapOnTaphold ) {\n\t\t\t\t\t\tisTaphold = true;\n\t\t\t\t\t}\n\t\t\t\t\ttriggerCustomEvent( thisObject, \"taphold\", $.Event( \"taphold\", { target: origTarget } ) );\n\t\t\t\t}, $.event.special.tap.tapholdThreshold );\n\t\t\t});\n\t\t},\n\t\tteardown: function() {\n\t\t\t$( this ).unbind( \"vmousedown\" ).unbind( \"vclick\" ).unbind( \"vmouseup\" );\n\t\t\t$document.unbind( \"vmousecancel\" );\n\t\t}\n\t};\n\n\t// Also handles swipeleft, swiperight\n\t$.event.special.swipe = {\n\n\t\t// More than this horizontal displacement, and we will suppress scrolling.\n\t\tscrollSupressionThreshold: 30,\n\n\t\t// More time than this, and it isn't a swipe.\n\t\tdurationThreshold: 1000,\n\n\t\t// Swipe horizontal displacement must be more than this.\n\t\thorizontalDistanceThreshold: 30,\n\n\t\t// Swipe vertical displacement must be less than this.\n\t\tverticalDistanceThreshold: 30,\n\n\t\tgetLocation: function ( event ) {\n\t\t\tvar winPageX = window.pageXOffset,\n\t\t\t\twinPageY = window.pageYOffset,\n\t\t\t\tx = event.clientX,\n\t\t\t\ty = event.clientY;\n\n\t\t\tif ( event.pageY === 0 && Math.floor( y ) > Math.floor( event.pageY ) ||\n\t\t\t\tevent.pageX === 0 && Math.floor( x ) > Math.floor( event.pageX ) ) {\n\n\t\t\t\t// iOS4 clientX/clientY have the value that should have been\n\t\t\t\t// in pageX/pageY. While pageX/page/ have the value 0\n\t\t\t\tx = x - winPageX;\n\t\t\t\ty = y - winPageY;\n\t\t\t} else if ( y < ( event.pageY - winPageY) || x < ( event.pageX - winPageX ) ) {\n\n\t\t\t\t// Some Android browsers have totally bogus values for clientX/Y\n\t\t\t\t// when scrolling/zooming a page. Detectable since clientX/clientY\n\t\t\t\t// should never be smaller than pageX/pageY minus page scroll\n\t\t\t\tx = event.pageX - winPageX;\n\t\t\t\ty = event.pageY - winPageY;\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tx: x,\n\t\t\t\ty: y\n\t\t\t};\n\t\t},\n\n\t\tstart: function( event ) {\n\t\t\tvar data = event.originalEvent.touches ?\n\t\t\t\t\tevent.originalEvent.touches[ 0 ] : event,\n\t\t\t\tlocation = $.event.special.swipe.getLocation( data );\n\t\t\treturn {\n\t\t\t\t\t\ttime: ( new Date() ).getTime(),\n\t\t\t\t\t\tcoords: [ location.x, location.y ],\n\t\t\t\t\t\torigin: $( event.target )\n\t\t\t\t\t};\n\t\t},\n\n\t\tstop: function( event ) {\n\t\t\tvar data = event.originalEvent.touches ?\n\t\t\t\t\tevent.originalEvent.touches[ 0 ] : event,\n\t\t\t\tlocation = $.event.special.swipe.getLocation( data );\n\t\t\treturn {\n\t\t\t\t\t\ttime: ( new Date() ).getTime(),\n\t\t\t\t\t\tcoords: [ location.x, location.y ]\n\t\t\t\t\t};\n\t\t},\n\n\t\thandleSwipe: function( start, stop, thisObject, origTarget ) {\n\t\t\tif ( stop.time - start.time < $.event.special.swipe.durationThreshold &&\n\t\t\t\tMath.abs( start.coords[ 0 ] - stop.coords[ 0 ] ) > $.event.special.swipe.horizontalDistanceThreshold &&\n\t\t\t\tMath.abs( start.coords[ 1 ] - stop.coords[ 1 ] ) < $.event.special.swipe.verticalDistanceThreshold ) {\n\t\t\t\tvar direction = start.coords[0] > stop.coords[ 0 ] ? \"swipeleft\" : \"swiperight\";\n\n\t\t\t\ttriggerCustomEvent( thisObject, \"swipe\", $.Event( \"swipe\", { target: origTarget, swipestart: start, swipestop: stop }), true );\n\t\t\t\ttriggerCustomEvent( thisObject, direction,$.Event( direction, { target: origTarget, swipestart: start, swipestop: stop } ), true );\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn false;\n\n\t\t},\n\n\t\t// This serves as a flag to ensure that at most one swipe event event is\n\t\t// in work at any given time\n\t\teventInProgress: false,\n\n\t\tsetup: function() {\n\t\t\tvar events,\n\t\t\t\tthisObject = this,\n\t\t\t\t$this = $( thisObject ),\n\t\t\t\tcontext = {};\n\n\t\t\t// Retrieve the events data for this element and add the swipe context\n\t\t\tevents = $.data( this, \"mobile-events\" );\n\t\t\tif ( !events ) {\n\t\t\t\tevents = { length: 0 };\n\t\t\t\t$.data( this, \"mobile-events\", events );\n\t\t\t}\n\t\t\tevents.length++;\n\t\t\tevents.swipe = context;\n\n\t\t\tcontext.start = function( event ) {\n\n\t\t\t\t// Bail if we're already working on a swipe event\n\t\t\t\tif ( $.event.special.swipe.eventInProgress ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\t$.event.special.swipe.eventInProgress = true;\n\n\t\t\t\tvar stop,\n\t\t\t\t\tstart = $.event.special.swipe.start( event ),\n\t\t\t\t\torigTarget = event.target,\n\t\t\t\t\temitted = false;\n\n\t\t\t\tcontext.move = function( event ) {\n\t\t\t\t\tif ( !start || event.isDefaultPrevented() ) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tstop = $.event.special.swipe.stop( event );\n\t\t\t\t\tif ( !emitted ) {\n\t\t\t\t\t\temitted = $.event.special.swipe.handleSwipe( start, stop, thisObject, origTarget );\n\t\t\t\t\t\tif ( emitted ) {\n\n\t\t\t\t\t\t\t// Reset the context to make way for the next swipe event\n\t\t\t\t\t\t\t$.event.special.swipe.eventInProgress = false;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t// prevent scrolling\n\t\t\t\t\tif ( Math.abs( start.coords[ 0 ] - stop.coords[ 0 ] ) > $.event.special.swipe.scrollSupressionThreshold ) {\n\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t}\n\t\t\t\t};\n\n\t\t\t\tcontext.stop = function() {\n\t\t\t\t\t\temitted = true;\n\n\t\t\t\t\t\t// Reset the context to make way for the next swipe event\n\t\t\t\t\t\t$.event.special.swipe.eventInProgress = false;\n\t\t\t\t\t\t$document.off( touchMoveEvent, context.move );\n\t\t\t\t\t\tcontext.move = null;\n\t\t\t\t};\n\n\t\t\t\t$document.on( touchMoveEvent, context.move )\n\t\t\t\t\t.one( touchStopEvent, context.stop );\n\t\t\t};\n\t\t\t$this.on( touchStartEvent, context.start );\n\t\t},\n\n\t\tteardown: function() {\n\t\t\tvar events, context;\n\n\t\t\tevents = $.data( this, \"mobile-events\" );\n\t\t\tif ( events ) {\n\t\t\t\tcontext = events.swipe;\n\t\t\t\tdelete events.swipe;\n\t\t\t\tevents.length--;\n\t\t\t\tif ( events.length === 0 ) {\n\t\t\t\t\t$.removeData( this, \"mobile-events\" );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( context ) {\n\t\t\t\tif ( context.start ) {\n\t\t\t\t\t$( this ).off( touchStartEvent, context.start );\n\t\t\t\t}\n\t\t\t\tif ( context.move ) {\n\t\t\t\t\t$document.off( touchMoveEvent, context.move );\n\t\t\t\t}\n\t\t\t\tif ( context.stop ) {\n\t\t\t\t\t$document.off( touchStopEvent, context.stop );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n\t$.each({\n\t\tscrollstop: \"scrollstart\",\n\t\ttaphold: \"tap\",\n\t\tswipeleft: \"swipe.left\",\n\t\tswiperight: \"swipe.right\"\n\t}, function( event, sourceEvent ) {\n\n\t\t$.event.special[ event ] = {\n\t\t\tsetup: function() {\n\t\t\t\t$( this ).bind( sourceEvent, $.noop );\n\t\t\t},\n\t\t\tteardown: function() {\n\t\t\t\t$( this ).unbind( sourceEvent );\n\t\t\t}\n\t\t};\n\t});\n\n})( jQuery, this );\n\n\n\t// throttled resize event\n\t(function( $ ) {\n\t\t$.event.special.throttledresize = {\n\t\t\tsetup: function() {\n\t\t\t\t$( this ).bind( \"resize\", handler );\n\t\t\t},\n\t\t\tteardown: function() {\n\t\t\t\t$( this ).unbind( \"resize\", handler );\n\t\t\t}\n\t\t};\n\n\t\tvar throttle = 250,\n\t\t\thandler = function() {\n\t\t\t\tcurr = ( new Date() ).getTime();\n\t\t\t\tdiff = curr - lastCall;\n\n\t\t\t\tif ( diff >= throttle ) {\n\n\t\t\t\t\tlastCall = curr;\n\t\t\t\t\t$( this ).trigger( \"throttledresize\" );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( heldCall ) {\n\t\t\t\t\t\tclearTimeout( heldCall );\n\t\t\t\t\t}\n\n\t\t\t\t\t// Promise a held call will still execute\n\t\t\t\t\theldCall = setTimeout( handler, throttle - diff );\n\t\t\t\t}\n\t\t\t},\n\t\t\tlastCall = 0,\n\t\t\theldCall,\n\t\t\tcurr,\n\t\t\tdiff;\n\t})( jQuery );\n\n\n(function( $, window ) {\n\tvar win = $( window ),\n\t\tevent_name = \"orientationchange\",\n\t\tget_orientation,\n\t\tlast_orientation,\n\t\tinitial_orientation_is_landscape,\n\t\tinitial_orientation_is_default,\n\t\tportrait_map = { \"0\": true, \"180\": true },\n\t\tww, wh, landscape_threshold;\n\n\t// It seems that some device/browser vendors use window.orientation values 0 and 180 to\n\t// denote the \"default\" orientation. For iOS devices, and most other smart-phones tested,\n\t// the default orientation is always \"portrait\", but in some Android and RIM based tablets,\n\t// the default orientation is \"landscape\". The following code attempts to use the window\n\t// dimensions to figure out what the current orientation is, and then makes adjustments\n\t// to the to the portrait_map if necessary, so that we can properly decode the\n\t// window.orientation value whenever get_orientation() is called.\n\t//\n\t// Note that we used to use a media query to figure out what the orientation the browser\n\t// thinks it is in:\n\t//\n\t//     initial_orientation_is_landscape = $.mobile.media(\"all and (orientation: landscape)\");\n\t//\n\t// but there was an iPhone/iPod Touch bug beginning with iOS 4.2, up through iOS 5.1,\n\t// where the browser *ALWAYS* applied the landscape media query. This bug does not\n\t// happen on iPad.\n\n\tif ( $.support.orientation ) {\n\n\t\t// Check the window width and height to figure out what the current orientation\n\t\t// of the device is at this moment. Note that we've initialized the portrait map\n\t\t// values to 0 and 180, *AND* we purposely check for landscape so that if we guess\n\t\t// wrong, , we default to the assumption that portrait is the default orientation.\n\t\t// We use a threshold check below because on some platforms like iOS, the iPhone\n\t\t// form-factor can report a larger width than height if the user turns on the\n\t\t// developer console. The actual threshold value is somewhat arbitrary, we just\n\t\t// need to make sure it is large enough to exclude the developer console case.\n\n\t\tww = window.innerWidth || win.width();\n\t\twh = window.innerHeight || win.height();\n\t\tlandscape_threshold = 50;\n\n\t\tinitial_orientation_is_landscape = ww > wh && ( ww - wh ) > landscape_threshold;\n\n\t\t// Now check to see if the current window.orientation is 0 or 180.\n\t\tinitial_orientation_is_default = portrait_map[ window.orientation ];\n\n\t\t// If the initial orientation is landscape, but window.orientation reports 0 or 180, *OR*\n\t\t// if the initial orientation is portrait, but window.orientation reports 90 or -90, we\n\t\t// need to flip our portrait_map values because landscape is the default orientation for\n\t\t// this device/browser.\n\t\tif ( ( initial_orientation_is_landscape && initial_orientation_is_default ) || ( !initial_orientation_is_landscape && !initial_orientation_is_default ) ) {\n\t\t\tportrait_map = { \"-90\": true, \"90\": true };\n\t\t}\n\t}\n\n\t$.event.special.orientationchange = $.extend( {}, $.event.special.orientationchange, {\n\t\tsetup: function() {\n\t\t\t// If the event is supported natively, return false so that jQuery\n\t\t\t// will bind to the event using DOM methods.\n\t\t\tif ( $.support.orientation && !$.event.special.orientationchange.disabled ) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// Get the current orientation to avoid initial double-triggering.\n\t\t\tlast_orientation = get_orientation();\n\n\t\t\t// Because the orientationchange event doesn't exist, simulate the\n\t\t\t// event by testing window dimensions on resize.\n\t\t\twin.bind( \"throttledresize\", handler );\n\t\t},\n\t\tteardown: function() {\n\t\t\t// If the event is not supported natively, return false so that\n\t\t\t// jQuery will unbind the event using DOM methods.\n\t\t\tif ( $.support.orientation && !$.event.special.orientationchange.disabled ) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// Because the orientationchange event doesn't exist, unbind the\n\t\t\t// resize event handler.\n\t\t\twin.unbind( \"throttledresize\", handler );\n\t\t},\n\t\tadd: function( handleObj ) {\n\t\t\t// Save a reference to the bound event handler.\n\t\t\tvar old_handler = handleObj.handler;\n\n\t\t\thandleObj.handler = function( event ) {\n\t\t\t\t// Modify event object, adding the .orientation property.\n\t\t\t\tevent.orientation = get_orientation();\n\n\t\t\t\t// Call the originally-bound event handler and return its result.\n\t\t\t\treturn old_handler.apply( this, arguments );\n\t\t\t};\n\t\t}\n\t});\n\n\t// If the event is not supported natively, this handler will be bound to\n\t// the window resize event to simulate the orientationchange event.\n\tfunction handler() {\n\t\t// Get the current orientation.\n\t\tvar orientation = get_orientation();\n\n\t\tif ( orientation !== last_orientation ) {\n\t\t\t// The orientation has changed, so trigger the orientationchange event.\n\t\t\tlast_orientation = orientation;\n\t\t\twin.trigger( event_name );\n\t\t}\n\t}\n\n\t// Get the current page orientation. This method is exposed publicly, should it\n\t// be needed, as jQuery.event.special.orientationchange.orientation()\n\t$.event.special.orientationchange.orientation = get_orientation = function() {\n\t\tvar isPortrait = true, elem = document.documentElement;\n\n\t\t// prefer window orientation to the calculation based on screensize as\n\t\t// the actual screen resize takes place before or after the orientation change event\n\t\t// has been fired depending on implementation (eg android 2.3 is before, iphone after).\n\t\t// More testing is required to determine if a more reliable method of determining the new screensize\n\t\t// is possible when orientationchange is fired. (eg, use media queries + element + opacity)\n\t\tif ( $.support.orientation ) {\n\t\t\t// if the window orientation registers as 0 or 180 degrees report\n\t\t\t// portrait, otherwise landscape\n\t\t\tisPortrait = portrait_map[ window.orientation ];\n\t\t} else {\n\t\t\tisPortrait = elem && elem.clientWidth / elem.clientHeight < 1.1;\n\t\t}\n\n\t\treturn isPortrait ? \"portrait\" : \"landscape\";\n\t};\n\n\t$.fn[ event_name ] = function( fn ) {\n\t\treturn fn ? this.bind( event_name, fn ) : this.trigger( event_name );\n\t};\n\n\t// jQuery < 1.8\n\tif ( $.attrFn ) {\n\t\t$.attrFn[ event_name ] = true;\n\t}\n\n}( jQuery, this ));\n\n\n\n\n(function( $, undefined ) {\n\n\t// existing base tag?\n\tvar baseElement = $( \"head\" ).children( \"base\" ),\n\n\t// base element management, defined depending on dynamic base tag support\n\t// TODO move to external widget\n\tbase = {\n\n\t\t// define base element, for use in routing asset urls that are referenced\n\t\t// in Ajax-requested markup\n\t\telement: ( baseElement.length ? baseElement :\n\t\t\t$( \"<base>\", { href: $.mobile.path.documentBase.hrefNoHash } ).prependTo( $( \"head\" ) ) ),\n\n\t\tlinkSelector: \"[src], link[href], a[rel='external'], :jqmData(ajax='false'), a[target]\",\n\n\t\t// set the generated BASE element's href to a new page's base path\n\t\tset: function( href ) {\n\n\t\t\t// we should do nothing if the user wants to manage their url base\n\t\t\t// manually\n\t\t\tif ( !$.mobile.dynamicBaseEnabled ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// we should use the base tag if we can manipulate it dynamically\n\t\t\tif ( $.support.dynamicBaseTag ) {\n\t\t\t\tbase.element.attr( \"href\",\n\t\t\t\t\t$.mobile.path.makeUrlAbsolute( href, $.mobile.path.documentBase ) );\n\t\t\t}\n\t\t},\n\n\t\trewrite: function( href, page ) {\n\t\t\tvar newPath = $.mobile.path.get( href );\n\n\t\t\tpage.find( base.linkSelector ).each(function( i, link ) {\n\t\t\t\tvar thisAttr = $( link ).is( \"[href]\" ) ? \"href\" :\n\t\t\t\t\t$( link ).is( \"[src]\" ) ? \"src\" : \"action\",\n\t\t\t\ttheLocation = $.mobile.path.parseLocation(),\n\t\t\t\tthisUrl = $( link ).attr( thisAttr );\n\n\t\t\t\t// XXX_jblas: We need to fix this so that it removes the document\n\t\t\t\t//            base URL, and then prepends with the new page URL.\n\t\t\t\t// if full path exists and is same, chop it - helps IE out\n\t\t\t\tthisUrl = thisUrl.replace( theLocation.protocol + theLocation.doubleSlash +\n\t\t\t\t\ttheLocation.host + theLocation.pathname, \"\" );\n\n\t\t\t\tif ( !/^(\\w+:|#|\\/)/.test( thisUrl ) ) {\n\t\t\t\t\t$( link ).attr( thisAttr, newPath + thisUrl );\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\n\t\t// set the generated BASE element's href to a new page's base path\n\t\treset: function(/* href */) {\n\t\t\tbase.element.attr( \"href\", $.mobile.path.documentBase.hrefNoSearch );\n\t\t}\n\t};\n\n\t$.mobile.base = base;\n\n})( jQuery );\n\n\n(function( $, undefined ) {\n$.mobile.widgets = {};\n\nvar originalWidget = $.widget,\n\n\t// Record the original, non-mobileinit-modified version of $.mobile.keepNative\n\t// so we can later determine whether someone has modified $.mobile.keepNative\n\tkeepNativeFactoryDefault = $.mobile.keepNative;\n\n$.widget = (function( orig ) {\n\treturn function() {\n\t\tvar constructor = orig.apply( this, arguments ),\n\t\t\tname = constructor.prototype.widgetName;\n\n\t\tconstructor.initSelector = ( ( constructor.prototype.initSelector !== undefined ) ?\n\t\t\tconstructor.prototype.initSelector : \":jqmData(role='\" + name + \"')\" );\n\n\t\t$.mobile.widgets[ name ] = constructor;\n\n\t\treturn constructor;\n\t};\n})( $.widget );\n\n// Make sure $.widget still has bridge and extend methods\n$.extend( $.widget, originalWidget );\n\n// For backcompat remove in 1.5\n$.mobile.document.on( \"create\", function( event ) {\n\t$( event.target ).enhanceWithin();\n});\n\n$.widget( \"mobile.page\", {\n\toptions: {\n\t\ttheme: \"a\",\n\t\tdomCache: false,\n\n\t\t// Deprecated in 1.4 remove in 1.5\n\t\tkeepNativeDefault: $.mobile.keepNative,\n\n\t\t// Deprecated in 1.4 remove in 1.5\n\t\tcontentTheme: null,\n\t\tenhanced: false\n\t},\n\n\t// DEPRECATED for > 1.4\n\t// TODO remove at 1.5\n\t_createWidget: function() {\n\t\t$.Widget.prototype._createWidget.apply( this, arguments );\n\t\tthis._trigger( \"init\" );\n\t},\n\n\t_create: function() {\n\t\t// If false is returned by the callbacks do not create the page\n\t\tif ( this._trigger( \"beforecreate\" ) === false ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tif ( !this.options.enhanced ) {\n\t\t\tthis._enhance();\n\t\t}\n\n\t\tthis._on( this.element, {\n\t\t\tpagebeforehide: \"removeContainerBackground\",\n\t\t\tpagebeforeshow: \"_handlePageBeforeShow\"\n\t\t});\n\n\t\tthis.element.enhanceWithin();\n\t\t// Dialog widget is deprecated in 1.4 remove this in 1.5\n\t\tif ( $.mobile.getAttribute( this.element[0], \"role\" ) === \"dialog\" && $.mobile.dialog ) {\n\t\t\tthis.element.dialog();\n\t\t}\n\t},\n\n\t_enhance: function () {\n\t\tvar attrPrefix = \"data-\" + $.mobile.ns,\n\t\t\tself = this;\n\n\t\tif ( this.options.role ) {\n\t\t\tthis.element.attr( \"data-\" + $.mobile.ns + \"role\", this.options.role );\n\t\t}\n\n\t\tthis.element\n\t\t\t.attr( \"tabindex\", \"0\" )\n\t\t\t.addClass( \"ui-page ui-page-theme-\" + this.options.theme );\n\n\t\t// Manipulation of content os Deprecated as of 1.4 remove in 1.5\n\t\tthis.element.find( \"[\" + attrPrefix + \"role='content']\" ).each( function() {\n\t\t\tvar $this = $( this ),\n\t\t\t\ttheme = this.getAttribute( attrPrefix + \"theme\" ) || undefined;\n\t\t\t\tself.options.contentTheme = theme || self.options.contentTheme || ( self.options.dialog && self.options.theme ) || ( self.element.jqmData(\"role\") === \"dialog\" &&  self.options.theme );\n\t\t\t\t$this.addClass( \"ui-content\" );\n\t\t\t\tif ( self.options.contentTheme ) {\n\t\t\t\t\t$this.addClass( \"ui-body-\" + ( self.options.contentTheme ) );\n\t\t\t\t}\n\t\t\t\t// Add ARIA role\n\t\t\t\t$this.attr( \"role\", \"main\" ).addClass( \"ui-content\" );\n\t\t});\n\t},\n\n\tbindRemove: function( callback ) {\n\t\tvar page = this.element;\n\n\t\t// when dom caching is not enabled or the page is embedded bind to remove the page on hide\n\t\tif ( !page.data( \"mobile-page\" ).options.domCache &&\n\t\t\tpage.is( \":jqmData(external-page='true')\" ) ) {\n\n\t\t\t// TODO use _on - that is, sort out why it doesn't work in this case\n\t\t\tpage.bind( \"pagehide.remove\", callback || function( e, data ) {\n\n\t\t\t\t//check if this is a same page transition and if so don't remove the page\n\t\t\t\tif( !data.samePage ){\n\t\t\t\t\tvar $this = $( this ),\n\t\t\t\t\t\tprEvent = new $.Event( \"pageremove\" );\n\n\t\t\t\t\t$this.trigger( prEvent );\n\n\t\t\t\t\tif ( !prEvent.isDefaultPrevented() ) {\n\t\t\t\t\t\t$this.removeWithDependents();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t},\n\n\t_setOptions: function( o ) {\n\t\tif ( o.theme !== undefined ) {\n\t\t\tthis.element.removeClass( \"ui-page-theme-\" + this.options.theme ).addClass( \"ui-page-theme-\" + o.theme );\n\t\t}\n\n\t\tif ( o.contentTheme !== undefined ) {\n\t\t\tthis.element.find( \"[data-\" + $.mobile.ns + \"='content']\" ).removeClass( \"ui-body-\" + this.options.contentTheme )\n\t\t\t\t.addClass( \"ui-body-\" + o.contentTheme );\n\t\t}\n\t},\n\n\t_handlePageBeforeShow: function(/* e */) {\n\t\tthis.setContainerBackground();\n\t},\n\t// Deprecated in 1.4 remove in 1.5\n\tremoveContainerBackground: function() {\n\t\tthis.element.closest( \":mobile-pagecontainer\" ).pagecontainer({ \"theme\": \"none\" });\n\t},\n\t// Deprecated in 1.4 remove in 1.5\n\t// set the page container background to the page theme\n\tsetContainerBackground: function( theme ) {\n\t\tthis.element.parent().pagecontainer( { \"theme\": theme || this.options.theme } );\n\t},\n\t// Deprecated in 1.4 remove in 1.5\n\tkeepNativeSelector: function() {\n\t\tvar options = this.options,\n\t\t\tkeepNative = $.trim( options.keepNative || \"\" ),\n\t\t\tglobalValue = $.trim( $.mobile.keepNative ),\n\t\t\toptionValue = $.trim( options.keepNativeDefault ),\n\n\t\t\t// Check if $.mobile.keepNative has changed from the factory default\n\t\t\tnewDefault = ( keepNativeFactoryDefault === globalValue ?\n\t\t\t\t\"\" : globalValue ),\n\n\t\t\t// If $.mobile.keepNative has not changed, use options.keepNativeDefault\n\t\t\toldDefault = ( newDefault === \"\" ? optionValue : \"\" );\n\n\t\t// Concatenate keepNative selectors from all sources where the value has\n\t\t// changed or, if nothing has changed, return the default\n\t\treturn ( ( keepNative ? [ keepNative ] : [] )\n\t\t\t.concat( newDefault ? [ newDefault ] : [] )\n\t\t\t.concat( oldDefault ? [ oldDefault ] : [] )\n\t\t\t.join( \", \" ) );\n\t}\n});\n})( jQuery );\n\n(function( $, undefined ) {\n\n\t$.widget( \"mobile.pagecontainer\", {\n\t\toptions: {\n\t\t\ttheme: \"a\"\n\t\t},\n\n\t\tinitSelector: false,\n\n\t\t_create: function() {\n\t\t\tthis._trigger( \"beforecreate\" );\n\t\t\tthis.setLastScrollEnabled = true;\n\n\t\t\tthis._on( this.window, {\n\t\t\t\t// disable an scroll setting when a hashchange has been fired,\n\t\t\t\t// this only works because the recording of the scroll position\n\t\t\t\t// is delayed for 100ms after the browser might have changed the\n\t\t\t\t// position because of the hashchange\n\t\t\t\tnavigate: \"_disableRecordScroll\",\n\n\t\t\t\t// bind to scrollstop for the first page, \"pagechange\" won't be\n\t\t\t\t// fired in that case\n\t\t\t\tscrollstop: \"_delayedRecordScroll\"\n\t\t\t});\n\n\t\t\t// TODO consider moving the navigation handler OUT of widget into\n\t\t\t//      some other object as glue between the navigate event and the\n\t\t\t//      content widget load and change methods\n\t\t\tthis._on( this.window, { navigate: \"_filterNavigateEvents\" });\n\n\t\t\t// TODO move from page* events to content* events\n\t\t\tthis._on({ pagechange: \"_afterContentChange\" });\n\n\t\t\t// handle initial hashchange from chrome :(\n\t\t\tthis.window.one( \"navigate\", $.proxy(function() {\n\t\t\t\tthis.setLastScrollEnabled = true;\n\t\t\t}, this));\n\t\t},\n\n\t\t_setOptions: function( options ) {\n\t\t\tif ( options.theme !== undefined && options.theme !== \"none\" ) {\n\t\t\t\tthis.element.removeClass( \"ui-overlay-\" + this.options.theme )\n\t\t\t\t\t.addClass( \"ui-overlay-\" + options.theme );\n\t\t\t} else if ( options.theme !== undefined ) {\n\t\t\t\tthis.element.removeClass( \"ui-overlay-\" + this.options.theme );\n\t\t\t}\n\n\t\t\tthis._super( options );\n\t\t},\n\n\t\t_disableRecordScroll: function() {\n\t\t\tthis.setLastScrollEnabled = false;\n\t\t},\n\n\t\t_enableRecordScroll: function() {\n\t\t\tthis.setLastScrollEnabled = true;\n\t\t},\n\n\t\t// TODO consider the name here, since it's purpose specific\n\t\t_afterContentChange: function() {\n\t\t\t// once the page has changed, re-enable the scroll recording\n\t\t\tthis.setLastScrollEnabled = true;\n\n\t\t\t// remove any binding that previously existed on the get scroll\n\t\t\t// which may or may not be different than the scroll element\n\t\t\t// determined for this page previously\n\t\t\tthis._off( this.window, \"scrollstop\" );\n\n\t\t\t// determine and bind to the current scoll element which may be the\n\t\t\t// window or in the case of touch overflow the element touch overflow\n\t\t\tthis._on( this.window, { scrollstop: \"_delayedRecordScroll\" });\n\t\t},\n\n\t\t_recordScroll: function() {\n\t\t\t// this barrier prevents setting the scroll value based on\n\t\t\t// the browser scrolling the window based on a hashchange\n\t\t\tif ( !this.setLastScrollEnabled ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar active = this._getActiveHistory(),\n\t\t\t\tcurrentScroll, minScroll, defaultScroll;\n\n\t\t\tif ( active ) {\n\t\t\t\tcurrentScroll = this._getScroll();\n\t\t\t\tminScroll = this._getMinScroll();\n\t\t\t\tdefaultScroll = this._getDefaultScroll();\n\n\t\t\t\t// Set active page's lastScroll prop. If the location we're\n\t\t\t\t// scrolling to is less than minScrollBack, let it go.\n\t\t\t\tactive.lastScroll = currentScroll < minScroll ? defaultScroll : currentScroll;\n\t\t\t}\n\t\t},\n\n\t\t_delayedRecordScroll: function() {\n\t\t\tsetTimeout( $.proxy(this, \"_recordScroll\"), 100 );\n\t\t},\n\n\t\t_getScroll: function() {\n\t\t\treturn this.window.scrollTop();\n\t\t},\n\n\t\t_getMinScroll: function() {\n\t\t\treturn $.mobile.minScrollBack;\n\t\t},\n\n\t\t_getDefaultScroll: function() {\n\t\t\treturn $.mobile.defaultHomeScroll;\n\t\t},\n\n\t\t_filterNavigateEvents: function( e, data ) {\n\t\t\tvar url;\n\n\t\t\tif ( e.originalEvent && e.originalEvent.isDefaultPrevented() ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\turl = e.originalEvent.type.indexOf( \"hashchange\" ) > -1 ? data.state.hash : data.state.url;\n\n\t\t\tif ( !url ) {\n\t\t\t\turl = this._getHash();\n\t\t\t}\n\n\t\t\tif ( !url || url === \"#\" || url.indexOf( \"#\" + $.mobile.path.uiStateKey ) === 0 ) {\n\t\t\t\turl = location.href;\n\t\t\t}\n\n\t\t\tthis._handleNavigate( url, data.state );\n\t\t},\n\n\t\t_getHash: function() {\n\t\t\treturn $.mobile.path.parseLocation().hash;\n\t\t},\n\n\t\t// TODO active page should be managed by the container (ie, it should be a property)\n\t\tgetActivePage: function() {\n\t\t\treturn this.activePage;\n\t\t},\n\n\t\t// TODO the first page should be a property set during _create using the logic\n\t\t//      that currently resides in init\n\t\t_getInitialContent: function() {\n\t\t\treturn $.mobile.firstPage;\n\t\t},\n\n\t\t// TODO each content container should have a history object\n\t\t_getHistory: function() {\n\t\t\treturn $.mobile.navigate.history;\n\t\t},\n\n\t\t_getActiveHistory: function() {\n\t\t\treturn this._getHistory().getActive();\n\t\t},\n\n\t\t// TODO the document base should be determined at creation\n\t\t_getDocumentBase: function() {\n\t\t\treturn $.mobile.path.documentBase;\n\t\t},\n\n\t\tback: function() {\n\t\t\tthis.go( -1 );\n\t\t},\n\n\t\tforward: function() {\n\t\t\tthis.go( 1 );\n\t\t},\n\n\t\tgo: function( steps ) {\n\n\t\t\t//if hashlistening is enabled use native history method\n\t\t\tif ( $.mobile.hashListeningEnabled ) {\n\t\t\t\twindow.history.go( steps );\n\t\t\t} else {\n\n\t\t\t\t//we are not listening to the hash so handle history internally\n\t\t\t\tvar activeIndex = $.mobile.navigate.history.activeIndex,\n\t\t\t\t\tindex = activeIndex + parseInt( steps, 10 ),\n\t\t\t\t\turl = $.mobile.navigate.history.stack[ index ].url,\n\t\t\t\t\tdirection = ( steps >= 1 )? \"forward\" : \"back\";\n\n\t\t\t\t//update the history object\n\t\t\t\t$.mobile.navigate.history.activeIndex = index;\n\t\t\t\t$.mobile.navigate.history.previousIndex = activeIndex;\n\n\t\t\t\t//change to the new page\n\t\t\t\tthis.change( url, { direction: direction, changeHash: false, fromHashChange: true } );\n\t\t\t}\n\t\t},\n\n\t\t// TODO rename _handleDestination\n\t\t_handleDestination: function( to ) {\n\t\t\tvar history;\n\n\t\t\t// clean the hash for comparison if it's a url\n\t\t\tif ( $.type(to) === \"string\" ) {\n\t\t\t\tto = $.mobile.path.stripHash( to );\n\t\t\t}\n\n\t\t\tif ( to ) {\n\t\t\t\thistory = this._getHistory();\n\n\t\t\t\t// At this point, 'to' can be one of 3 things, a cached page\n\t\t\t\t// element from a history stack entry, an id, or site-relative /\n\t\t\t\t// absolute URL. If 'to' is an id, we need to resolve it against\n\t\t\t\t// the documentBase, not the location.href, since the hashchange\n\t\t\t\t// could've been the result of a forward/backward navigation\n\t\t\t\t// that crosses from an external page/dialog to an internal\n\t\t\t\t// page/dialog.\n\t\t\t\t//\n\t\t\t\t// TODO move check to history object or path object?\n\t\t\t\tto = !$.mobile.path.isPath( to ) ? ( $.mobile.path.makeUrlAbsolute( \"#\" + to, this._getDocumentBase() ) ) : to;\n\t\t\t}\n\t\t\treturn to || this._getInitialContent();\n\t\t},\n\n\t\t_transitionFromHistory: function( direction, defaultTransition ) {\n\t\t\tvar history = this._getHistory(),\n\t\t\t\tentry = ( direction === \"back\" ? history.getLast() : history.getActive() );\n\n\t\t\treturn ( entry && entry.transition ) || defaultTransition;\n\t\t},\n\n\t\t_handleDialog: function( changePageOptions, data ) {\n\t\t\tvar to, active, activeContent = this.getActivePage();\n\n\t\t\t// If current active page is not a dialog skip the dialog and continue\n\t\t\t// in the same direction\n\t\t\t// Note: The dialog widget is deprecated as of 1.4.0 and will be removed in 1.5.0.\n\t\t\t// Thus, as of 1.5.0 activeContent.data( \"mobile-dialog\" ) will always evaluate to\n\t\t\t// falsy, so the second condition in the if-statement below can be removed altogether.\n\t\t\tif ( activeContent && !activeContent.data( \"mobile-dialog\" ) ) {\n\t\t\t\t// determine if we're heading forward or backward and continue\n\t\t\t\t// accordingly past the current dialog\n\t\t\t\tif ( data.direction === \"back\" ) {\n\t\t\t\t\tthis.back();\n\t\t\t\t} else {\n\t\t\t\t\tthis.forward();\n\t\t\t\t}\n\n\t\t\t\t// prevent changePage call\n\t\t\t\treturn false;\n\t\t\t} else {\n\t\t\t\t// if the current active page is a dialog and we're navigating\n\t\t\t\t// to a dialog use the dialog objected saved in the stack\n\t\t\t\tto = data.pageUrl;\n\t\t\t\tactive = this._getActiveHistory();\n\n\t\t\t\t// make sure to set the role, transition and reversal\n\t\t\t\t// as most of this is lost by the domCache cleaning\n\t\t\t\t$.extend( changePageOptions, {\n\t\t\t\t\trole: active.role,\n\t\t\t\t\ttransition: this._transitionFromHistory(\n\t\t\t\t\t\tdata.direction,\n\t\t\t\t\t\tchangePageOptions.transition ),\n\t\t\t\t\treverse: data.direction === \"back\"\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn to;\n\t\t},\n\n\t\t_handleNavigate: function( url, data ) {\n\t\t\t//find first page via hash\n\t\t\t// TODO stripping the hash twice with handleUrl\n\t\t\tvar to = $.mobile.path.stripHash( url ), history = this._getHistory(),\n\n\t\t\t\t// transition is false if it's the first page, undefined\n\t\t\t\t// otherwise (and may be overridden by default)\n\t\t\t\ttransition = history.stack.length === 0 ? \"none\" :\n\t\t\t\t\tthis._transitionFromHistory( data.direction ),\n\n\t\t\t\t// default options for the changPage calls made after examining\n\t\t\t\t// the current state of the page and the hash, NOTE that the\n\t\t\t\t// transition is derived from the previous history entry\n\t\t\t\tchangePageOptions = {\n\t\t\t\t\tchangeHash: false,\n\t\t\t\t\tfromHashChange: true,\n\t\t\t\t\treverse: data.direction === \"back\"\n\t\t\t\t};\n\n\t\t\t$.extend( changePageOptions, data, {\n\t\t\t\ttransition: transition\n\t\t\t});\n\n\t\t\t// TODO move to _handleDestination ?\n\t\t\t// If this isn't the first page, if the current url is a dialog hash\n\t\t\t// key, and the initial destination isn't equal to the current target\n\t\t\t// page, use the special dialog handling\n\t\t\tif ( history.activeIndex > 0 &&\n\t\t\t\tto.indexOf( $.mobile.dialogHashKey ) > -1 ) {\n\n\t\t\t\tto = this._handleDialog( changePageOptions, data );\n\n\t\t\t\tif ( to === false ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis._changeContent( this._handleDestination( to ), changePageOptions );\n\t\t},\n\n\t\t_changeContent: function( to, opts ) {\n\t\t\t$.mobile.changePage( to, opts );\n\t\t},\n\n\t\t_getBase: function() {\n\t\t\treturn $.mobile.base;\n\t\t},\n\n\t\t_getNs: function() {\n\t\t\treturn $.mobile.ns;\n\t\t},\n\n\t\t_enhance: function( content, role ) {\n\t\t\t// TODO consider supporting a custom callback, and passing in\n\t\t\t// the settings which includes the role\n\t\t\treturn content.page({ role: role });\n\t\t},\n\n\t\t_include: function( page, settings ) {\n\t\t\t// append to page and enhance\n\t\t\tpage.appendTo( this.element );\n\n\t\t\t// use the page widget to enhance\n\t\t\tthis._enhance( page, settings.role );\n\n\t\t\t// remove page on hide\n\t\t\tpage.page( \"bindRemove\" );\n\t\t},\n\n\t\t_find: function( absUrl ) {\n\t\t\t// TODO consider supporting a custom callback\n\t\t\tvar fileUrl = this._createFileUrl( absUrl ),\n\t\t\t\tdataUrl = this._createDataUrl( absUrl ),\n\t\t\t\tpage, initialContent = this._getInitialContent();\n\n\t\t\t// Check to see if the page already exists in the DOM.\n\t\t\t// NOTE do _not_ use the :jqmData pseudo selector because parenthesis\n\t\t\t//      are a valid url char and it breaks on the first occurence\n\t\t\tpage = this.element\n\t\t\t\t.children( \"[data-\" + this._getNs() +\n\t\t\t\t\t\"url='\" + $.mobile.path.hashToSelector( dataUrl ) + \"']\" );\n\n\t\t\t// If we failed to find the page, check to see if the url is a\n\t\t\t// reference to an embedded page. If so, it may have been dynamically\n\t\t\t// injected by a developer, in which case it would be lacking a\n\t\t\t// data-url attribute and in need of enhancement.\n\t\t\tif ( page.length === 0 && dataUrl && !$.mobile.path.isPath( dataUrl ) ) {\n\t\t\t\tpage = this.element.children( $.mobile.path.hashToSelector(\"#\" + dataUrl) )\n\t\t\t\t\t.attr( \"data-\" + this._getNs() + \"url\", dataUrl )\n\t\t\t\t\t.jqmData( \"url\", dataUrl );\n\t\t\t}\n\n\t\t\t// If we failed to find a page in the DOM, check the URL to see if it\n\t\t\t// refers to the first page in the application. Also check to make sure\n\t\t\t// our cached-first-page is actually in the DOM. Some user deployed\n\t\t\t// apps are pruning the first page from the DOM for various reasons.\n\t\t\t// We check for this case here because we don't want a first-page with\n\t\t\t// an id falling through to the non-existent embedded page error case.\n\t\t\tif ( page.length === 0 &&\n\t\t\t\t$.mobile.path.isFirstPageUrl( fileUrl ) &&\n\t\t\t\tinitialContent &&\n\t\t\t\tinitialContent.parent().length ) {\n\t\t\t\tpage = $( initialContent );\n\t\t\t}\n\n\t\t\treturn page;\n\t\t},\n\n\t\t_getLoader: function() {\n\t\t\treturn $.mobile.loading();\n\t\t},\n\n\t\t_showLoading: function( delay, theme, msg, textonly ) {\n\t\t\t// This configurable timeout allows cached pages a brief\n\t\t\t// delay to load without showing a message\n\t\t\tif ( this._loadMsg ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis._loadMsg = setTimeout($.proxy(function() {\n\t\t\t\tthis._getLoader().loader( \"show\", theme, msg, textonly );\n\t\t\t\tthis._loadMsg = 0;\n\t\t\t}, this), delay );\n\t\t},\n\n\t\t_hideLoading: function() {\n\t\t\t// Stop message show timer\n\t\t\tclearTimeout( this._loadMsg );\n\t\t\tthis._loadMsg = 0;\n\n\t\t\t// Hide loading message\n\t\t\tthis._getLoader().loader( \"hide\" );\n\t\t},\n\n\t\t_showError: function() {\n\t\t\t// make sure to remove the current loading message\n\t\t\tthis._hideLoading();\n\n\t\t\t// show the error message\n\t\t\tthis._showLoading( 0, $.mobile.pageLoadErrorMessageTheme, $.mobile.pageLoadErrorMessage, true );\n\n\t\t\t// hide the error message after a delay\n\t\t\t// TODO configuration\n\t\t\tsetTimeout( $.proxy(this, \"_hideLoading\"), 1500 );\n\t\t},\n\n\t\t_parse: function( html, fileUrl ) {\n\t\t\t// TODO consider allowing customization of this method. It's very JQM specific\n\t\t\tvar page, all = $( \"<div></div>\" );\n\n\t\t\t//workaround to allow scripts to execute when included in page divs\n\t\t\tall.get( 0 ).innerHTML = html;\n\n\t\t\tpage = all.find( \":jqmData(role='page'), :jqmData(role='dialog')\" ).first();\n\n\t\t\t//if page elem couldn't be found, create one and insert the body element's contents\n\t\t\tif ( !page.length ) {\n\t\t\t\tpage = $( \"<div data-\" + this._getNs() + \"role='page'>\" +\n\t\t\t\t\t( html.split( /<\\/?body[^>]*>/gmi )[1] || \"\" ) +\n\t\t\t\t\t\"</div>\" );\n\t\t\t}\n\n\t\t\t// TODO tagging a page with external to make sure that embedded pages aren't\n\t\t\t// removed by the various page handling code is bad. Having page handling code\n\t\t\t// in many places is bad. Solutions post 1.0\n\t\t\tpage.attr( \"data-\" + this._getNs() + \"url\", this._createDataUrl( fileUrl ) )\n\t\t\t\t.attr( \"data-\" + this._getNs() + \"external-page\", true );\n\n\t\t\treturn page;\n\t\t},\n\n\t\t_setLoadedTitle: function( page, html ) {\n\t\t\t//page title regexp\n\t\t\tvar newPageTitle = html.match( /<title[^>]*>([^<]*)/ ) && RegExp.$1;\n\n\t\t\tif ( newPageTitle && !page.jqmData(\"title\") ) {\n\t\t\t\tnewPageTitle = $( \"<div>\" + newPageTitle + \"</div>\" ).text();\n\t\t\t\tpage.jqmData( \"title\", newPageTitle );\n\t\t\t}\n\t\t},\n\n\t\t_isRewritableBaseTag: function() {\n\t\t\treturn $.mobile.dynamicBaseEnabled && !$.support.dynamicBaseTag;\n\t\t},\n\n\t\t_createDataUrl: function( absoluteUrl ) {\n\t\t\treturn $.mobile.path.convertUrlToDataUrl( absoluteUrl );\n\t\t},\n\n\t\t_createFileUrl: function( absoluteUrl ) {\n\t\t\treturn $.mobile.path.getFilePath( absoluteUrl );\n\t\t},\n\n\t\t_triggerWithDeprecated: function( name, data, page ) {\n\t\t\tvar deprecatedEvent = $.Event( \"page\" + name ),\n\t\t\t\tnewEvent = $.Event( this.widgetName + name );\n\n\t\t\t// DEPRECATED\n\t\t\t// trigger the old deprecated event on the page if it's provided\n\t\t\t( page || this.element ).trigger( deprecatedEvent, data );\n\n\t\t\t// use the widget trigger method for the new content* event\n\t\t\tthis._trigger( name, newEvent, data );\n\n\t\t\treturn {\n\t\t\t\tdeprecatedEvent: deprecatedEvent,\n\t\t\t\tevent: newEvent\n\t\t\t};\n\t\t},\n\n\t\t// TODO it would be nice to split this up more but everything appears to be \"one off\"\n\t\t//      or require ordering such that other bits are sprinkled in between parts that\n\t\t//      could be abstracted out as a group\n\t\t_loadSuccess: function( absUrl, triggerData, settings, deferred ) {\n\t\t\tvar fileUrl = this._createFileUrl( absUrl );\n\n\t\t\treturn $.proxy(function( html, textStatus, xhr ) {\n\t\t\t\t//pre-parse html to check for a data-url,\n\t\t\t\t//use it as the new fileUrl, base path, etc\n\t\t\t\tvar content,\n\n\t\t\t\t\t// TODO handle dialogs again\n\t\t\t\t\tpageElemRegex = new RegExp( \"(<[^>]+\\\\bdata-\" + this._getNs() + \"role=[\\\"']?page[\\\"']?[^>]*>)\" ),\n\n\t\t\t\t\tdataUrlRegex = new RegExp( \"\\\\bdata-\" + this._getNs() + \"url=[\\\"']?([^\\\"'>]*)[\\\"']?\" );\n\n\t\t\t\t// data-url must be provided for the base tag so resource requests\n\t\t\t\t// can be directed to the correct url. loading into a temprorary\n\t\t\t\t// element makes these requests immediately\n\t\t\t\tif ( pageElemRegex.test( html ) &&\n\t\t\t\t\tRegExp.$1 &&\n\t\t\t\t\tdataUrlRegex.test( RegExp.$1 ) &&\n\t\t\t\t\tRegExp.$1 ) {\n\t\t\t\t\tfileUrl = $.mobile.path.getFilePath( $(\"<div>\" + RegExp.$1 + \"</div>\").text() );\n\n\t\t\t\t\t// We specify that, if a data-url attribute is given on the page div, its value\n\t\t\t\t\t// must be given non-URL-encoded. However, in this part of the code, fileUrl is\n\t\t\t\t\t// assumed to be URL-encoded, so we URL-encode the retrieved value here\n\t\t\t\t\tfileUrl = this.window[ 0 ].encodeURIComponent( fileUrl );\n\t\t\t\t}\n\n\t\t\t\t//dont update the base tag if we are prefetching\n\t\t\t\tif ( settings.prefetch === undefined ) {\n\t\t\t\t\tthis._getBase().set( fileUrl );\n\t\t\t\t}\n\n\t\t\t\tcontent = this._parse( html, fileUrl );\n\n\t\t\t\tthis._setLoadedTitle( content, html );\n\n\t\t\t\t// Add the content reference and xhr to our triggerData.\n\t\t\t\ttriggerData.xhr = xhr;\n\t\t\t\ttriggerData.textStatus = textStatus;\n\n\t\t\t\t// DEPRECATED\n\t\t\t\ttriggerData.page = content;\n\n\t\t\t\ttriggerData.content = content;\n\n\t\t\t\ttriggerData.toPage = content;\n\n\t\t\t\t// If the default behavior is prevented, stop here!\n\t\t\t\t// Note that it is the responsibility of the listener/handler\n\t\t\t\t// that called preventDefault(), to resolve/reject the\n\t\t\t\t// deferred object within the triggerData.\n\t\t\t\tif ( this._triggerWithDeprecated( \"load\", triggerData ).event.isDefaultPrevented() ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// rewrite src and href attrs to use a base url if the base tag won't work\n\t\t\t\tif ( this._isRewritableBaseTag() && content ) {\n\t\t\t\t\tthis._getBase().rewrite( fileUrl, content );\n\t\t\t\t}\n\n\t\t\t\tthis._include( content, settings );\n\n\t\t\t\t// Remove loading message.\n\t\t\t\tif ( settings.showLoadMsg ) {\n\t\t\t\t\tthis._hideLoading();\n\t\t\t\t}\n\n\t\t\t\tdeferred.resolve( absUrl, settings, content );\n\t\t\t}, this);\n\t\t},\n\n\t\t_loadDefaults: {\n\t\t\ttype: \"get\",\n\t\t\tdata: undefined,\n\n\t\t\t// DEPRECATED\n\t\t\treloadPage: false,\n\n\t\t\treload: false,\n\n\t\t\t// By default we rely on the role defined by the @data-role attribute.\n\t\t\trole: undefined,\n\n\t\t\tshowLoadMsg: false,\n\n\t\t\t// This delay allows loads that pull from browser cache to\n\t\t\t// occur without showing the loading message.\n\t\t\tloadMsgDelay: 50\n\t\t},\n\n\t\tload: function( url, options ) {\n\t\t\t// This function uses deferred notifications to let callers\n\t\t\t// know when the content is done loading, or if an error has occurred.\n\t\t\tvar deferred = ( options && options.deferred ) || $.Deferred(),\n\n\t\t\t\t// Examining the option \"reloadPage\" passed by the user is deprecated as of 1.4.0\n\t\t\t\t// and will be removed in 1.5.0.\n\t\t\t\t// Copy option \"reloadPage\" to \"reload\", but only if option \"reload\" is not present\n\t\t\t\treloadOptionExtension =\n\t\t\t\t\t( ( options && options.reload === undefined &&\n\t\t\t\t\t\toptions.reloadPage !== undefined ) ?\n\t\t\t\t\t\t\t{ reload: options.reloadPage } : {} ),\n\n\t\t\t\t// The default load options with overrides specified by the caller.\n\t\t\t\tsettings = $.extend( {}, this._loadDefaults, options, reloadOptionExtension ),\n\n\t\t\t\t// The DOM element for the content after it has been loaded.\n\t\t\t\tcontent = null,\n\n\t\t\t\t// The absolute version of the URL passed into the function. This\n\t\t\t\t// version of the URL may contain dialog/subcontent params in it.\n\t\t\t\tabsUrl = $.mobile.path.makeUrlAbsolute( url, this._findBaseWithDefault() ),\n\t\t\t\tfileUrl, dataUrl, pblEvent, triggerData;\n\n\t\t\t// If the caller provided data, and we're using \"get\" request,\n\t\t\t// append the data to the URL.\n\t\t\tif ( settings.data && settings.type === \"get\" ) {\n\t\t\t\tabsUrl = $.mobile.path.addSearchParams( absUrl, settings.data );\n\t\t\t\tsettings.data = undefined;\n\t\t\t}\n\n\t\t\t// If the caller is using a \"post\" request, reload must be true\n\t\t\tif ( settings.data && settings.type === \"post\" ) {\n\t\t\t\tsettings.reload = true;\n\t\t\t}\n\n\t\t\t// The absolute version of the URL minus any dialog/subcontent params.\n\t\t\t// In otherwords the real URL of the content to be loaded.\n\t\t\tfileUrl = this._createFileUrl( absUrl );\n\n\t\t\t// The version of the Url actually stored in the data-url attribute of\n\t\t\t// the content. For embedded content, it is just the id of the page. For\n\t\t\t// content within the same domain as the document base, it is the site\n\t\t\t// relative path. For cross-domain content (Phone Gap only) the entire\n\t\t\t// absolute Url is used to load the content.\n\t\t\tdataUrl = this._createDataUrl( absUrl );\n\n\t\t\tcontent = this._find( absUrl );\n\n\t\t\t// If it isn't a reference to the first content and refers to missing\n\t\t\t// embedded content reject the deferred and return\n\t\t\tif ( content.length === 0 &&\n\t\t\t\t$.mobile.path.isEmbeddedPage(fileUrl) &&\n\t\t\t\t!$.mobile.path.isFirstPageUrl(fileUrl) ) {\n\t\t\t\tdeferred.reject( absUrl, settings );\n\t\t\t\treturn deferred.promise();\n\t\t\t}\n\n\t\t\t// Reset base to the default document base\n\t\t\t// TODO figure out why we doe this\n\t\t\tthis._getBase().reset();\n\n\t\t\t// If the content we are interested in is already in the DOM,\n\t\t\t// and the caller did not indicate that we should force a\n\t\t\t// reload of the file, we are done. Resolve the deferrred so that\n\t\t\t// users can bind to .done on the promise\n\t\t\tif ( content.length && !settings.reload ) {\n\t\t\t\tthis._enhance( content, settings.role );\n\t\t\t\tdeferred.resolve( absUrl, settings, content );\n\n\t\t\t\t//if we are reloading the content make sure we update\n\t\t\t\t// the base if its not a prefetch\n\t\t\t\tif ( !settings.prefetch ) {\n\t\t\t\t\tthis._getBase().set(url);\n\t\t\t\t}\n\n\t\t\t\treturn deferred.promise();\n\t\t\t}\n\n\t\t\ttriggerData = {\n\t\t\t\turl: url,\n\t\t\t\tabsUrl: absUrl,\n\t\t\t\ttoPage: url,\n\t\t\t\tprevPage: options ? options.fromPage : undefined,\n\t\t\t\tdataUrl: dataUrl,\n\t\t\t\tdeferred: deferred,\n\t\t\t\toptions: settings\n\t\t\t};\n\n\t\t\t// Let listeners know we're about to load content.\n\t\t\tpblEvent = this._triggerWithDeprecated( \"beforeload\", triggerData );\n\n\t\t\t// If the default behavior is prevented, stop here!\n\t\t\tif ( pblEvent.deprecatedEvent.isDefaultPrevented() ||\n\t\t\t\tpblEvent.event.isDefaultPrevented() ) {\n\t\t\t\treturn deferred.promise();\n\t\t\t}\n\n\t\t\tif ( settings.showLoadMsg ) {\n\t\t\t\tthis._showLoading( settings.loadMsgDelay );\n\t\t\t}\n\n\t\t\t// Reset base to the default document base.\n\t\t\t// only reset if we are not prefetching\n\t\t\tif ( settings.prefetch === undefined ) {\n\t\t\t\tthis._getBase().reset();\n\t\t\t}\n\n\t\t\tif ( !( $.mobile.allowCrossDomainPages ||\n\t\t\t\t$.mobile.path.isSameDomain($.mobile.path.documentUrl, absUrl ) ) ) {\n\t\t\t\tdeferred.reject( absUrl, settings );\n\t\t\t\treturn deferred.promise();\n\t\t\t}\n\n\t\t\t// Load the new content.\n\t\t\t$.ajax({\n\t\t\t\turl: fileUrl,\n\t\t\t\ttype: settings.type,\n\t\t\t\tdata: settings.data,\n\t\t\t\tcontentType: settings.contentType,\n\t\t\t\tdataType: \"html\",\n\t\t\t\tsuccess: this._loadSuccess( absUrl, triggerData, settings, deferred ),\n\t\t\t\terror: this._loadError( absUrl, triggerData, settings, deferred )\n\t\t\t});\n\n\t\t\treturn deferred.promise();\n\t\t},\n\n\t\t_loadError: function( absUrl, triggerData, settings, deferred ) {\n\t\t\treturn $.proxy(function( xhr, textStatus, errorThrown ) {\n\t\t\t\t//set base back to current path\n\t\t\t\tthis._getBase().set( $.mobile.path.get() );\n\n\t\t\t\t// Add error info to our triggerData.\n\t\t\t\ttriggerData.xhr = xhr;\n\t\t\t\ttriggerData.textStatus = textStatus;\n\t\t\t\ttriggerData.errorThrown = errorThrown;\n\n\t\t\t\t// Let listeners know the page load failed.\n\t\t\t\tvar plfEvent = this._triggerWithDeprecated( \"loadfailed\", triggerData );\n\n\t\t\t\t// If the default behavior is prevented, stop here!\n\t\t\t\t// Note that it is the responsibility of the listener/handler\n\t\t\t\t// that called preventDefault(), to resolve/reject the\n\t\t\t\t// deferred object within the triggerData.\n\t\t\t\tif ( plfEvent.deprecatedEvent.isDefaultPrevented() ||\n\t\t\t\t\tplfEvent.event.isDefaultPrevented() ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Remove loading message.\n\t\t\t\tif ( settings.showLoadMsg ) {\n\t\t\t\t\tthis._showError();\n\t\t\t\t}\n\n\t\t\t\tdeferred.reject( absUrl, settings );\n\t\t\t}, this);\n\t\t},\n\n\t\t_getTransitionHandler: function( transition ) {\n\t\t\ttransition = $.mobile._maybeDegradeTransition( transition );\n\n\t\t\t//find the transition handler for the specified transition. If there\n\t\t\t//isn't one in our transitionHandlers dictionary, use the default one.\n\t\t\t//call the handler immediately to kick-off the transition.\n\t\t\treturn $.mobile.transitionHandlers[ transition ] || $.mobile.defaultTransitionHandler;\n\t\t},\n\n\t\t// TODO move into transition handlers?\n\t\t_triggerCssTransitionEvents: function( to, from, prefix ) {\n\t\t\tvar samePage = false;\n\n\t\t\tprefix = prefix || \"\";\n\n\t\t\t// TODO decide if these events should in fact be triggered on the container\n\t\t\tif ( from ) {\n\n\t\t\t\t//Check if this is a same page transition and tell the handler in page\n\t\t\t\tif( to[0] === from[0] ){\n\t\t\t\t\tsamePage = true;\n\t\t\t\t}\n\n\t\t\t\t//trigger before show/hide events\n\t\t\t\t// TODO deprecate nextPage in favor of next\n\t\t\t\tthis._triggerWithDeprecated( prefix + \"hide\", {\n\n\t\t\t\t\t// Deprecated in 1.4 remove in 1.5\n\t\t\t\t\tnextPage: to,\n\t\t\t\t\ttoPage: to,\n\t\t\t\t\tprevPage: from,\n\t\t\t\t\tsamePage: samePage\n\t\t\t\t}, from );\n\t\t\t}\n\n\t\t\t// TODO deprecate prevPage in favor of previous\n\t\t\tthis._triggerWithDeprecated( prefix + \"show\", {\n\t\t\t\tprevPage: from || $( \"\" ),\n\t\t\t\ttoPage: to\n\t\t\t}, to );\n\t\t},\n\n\t\t// TODO make private once change has been defined in the widget\n\t\t_cssTransition: function( to, from, options ) {\n\t\t\tvar transition = options.transition,\n\t\t\t\treverse = options.reverse,\n\t\t\t\tdeferred = options.deferred,\n\t\t\t\tTransitionHandler,\n\t\t\t\tpromise;\n\n\t\t\tthis._triggerCssTransitionEvents( to, from, \"before\" );\n\n\t\t\t// TODO put this in a binding to events *outside* the widget\n\t\t\tthis._hideLoading();\n\n\t\t\tTransitionHandler = this._getTransitionHandler( transition );\n\n\t\t\tpromise = ( new TransitionHandler( transition, reverse, to, from ) ).transition();\n\n\t\t\tpromise.done( $.proxy( function() {\n\t\t\t\tthis._triggerCssTransitionEvents( to, from );\n\t\t\t}, this ));\n\n\t\t\t// TODO temporary accomodation of argument deferred\n\t\t\tpromise.done(function() {\n\t\t\t\tdeferred.resolve.apply( deferred, arguments );\n\t\t\t});\n\t\t},\n\n\t\t_releaseTransitionLock: function() {\n\t\t\t//release transition lock so navigation is free again\n\t\t\tisPageTransitioning = false;\n\t\t\tif ( pageTransitionQueue.length > 0 ) {\n\t\t\t\t$.mobile.changePage.apply( null, pageTransitionQueue.pop() );\n\t\t\t}\n\t\t},\n\n\t\t_removeActiveLinkClass: function( force ) {\n\t\t\t//clear out the active button state\n\t\t\t$.mobile.removeActiveLinkClass( force );\n\t\t},\n\n\t\t_loadUrl: function( to, triggerData, settings ) {\n\t\t\t// preserve the original target as the dataUrl value will be\n\t\t\t// simplified eg, removing ui-state, and removing query params\n\t\t\t// from the hash this is so that users who want to use query\n\t\t\t// params have access to them in the event bindings for the page\n\t\t\t// life cycle See issue #5085\n\t\t\tsettings.target = to;\n\t\t\tsettings.deferred = $.Deferred();\n\n\t\t\tthis.load( to, settings );\n\n\t\t\tsettings.deferred.done($.proxy(function( url, options, content ) {\n\t\t\t\tisPageTransitioning = false;\n\n\t\t\t\t// store the original absolute url so that it can be provided\n\t\t\t\t// to events in the triggerData of the subsequent changePage call\n\t\t\t\toptions.absUrl = triggerData.absUrl;\n\n\t\t\t\tthis.transition( content, triggerData, options );\n\t\t\t}, this));\n\n\t\t\tsettings.deferred.fail($.proxy(function(/* url, options */) {\n\t\t\t\tthis._removeActiveLinkClass( true );\n\t\t\t\tthis._releaseTransitionLock();\n\t\t\t\tthis._triggerWithDeprecated( \"changefailed\", triggerData );\n\t\t\t}, this));\n\t\t},\n\n\t\t_triggerPageBeforeChange: function( to, triggerData, settings ) {\n\t\t\tvar returnEvents;\n\n\t\t\ttriggerData.prevPage = this.activePage;\n\t\t\t$.extend( triggerData, {\n\t\t\t\ttoPage: to,\n\t\t\t\toptions: settings\n\t\t\t});\n\n\t\t\t// NOTE: preserve the original target as the dataUrl value will be\n\t\t\t// simplified eg, removing ui-state, and removing query params from\n\t\t\t// the hash this is so that users who want to use query params have\n\t\t\t// access to them in the event bindings for the page life cycle\n\t\t\t// See issue #5085\n\t\t\tif ( $.type(to) === \"string\" ) {\n\t\t\t\t// if the toPage is a string simply convert it\n\t\t\t\ttriggerData.absUrl = $.mobile.path.makeUrlAbsolute( to, this._findBaseWithDefault() );\n\t\t\t} else {\n\t\t\t\t// if the toPage is a jQuery object grab the absolute url stored\n\t\t\t\t// in the loadPage callback where it exists\n\t\t\t\ttriggerData.absUrl = settings.absUrl;\n\t\t\t}\n\n\t\t\t// Let listeners know we're about to change the current page.\n\t\t\treturnEvents = this._triggerWithDeprecated( \"beforechange\", triggerData );\n\n\t\t\t// If the default behavior is prevented, stop here!\n\t\t\tif ( returnEvents.event.isDefaultPrevented() ||\n\t\t\t\treturnEvents.deprecatedEvent.isDefaultPrevented() ) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\treturn true;\n\t\t},\n\n\t\tchange: function( to, options ) {\n\t\t\t// If we are in the midst of a transition, queue the current request.\n\t\t\t// We'll call changePage() once we're done with the current transition\n\t\t\t// to service the request.\n\t\t\tif ( isPageTransitioning ) {\n\t\t\t\tpageTransitionQueue.unshift( arguments );\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar settings = $.extend( {}, $.mobile.changePage.defaults, options ),\n\t\t\t\ttriggerData = {};\n\n\t\t\t// Make sure we have a fromPage.\n\t\t\tsettings.fromPage = settings.fromPage || this.activePage;\n\n\t\t\t// if the page beforechange default is prevented return early\n\t\t\tif ( !this._triggerPageBeforeChange(to, triggerData, settings) ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// We allow \"pagebeforechange\" observers to modify the to in\n\t\t\t// the trigger data to allow for redirects. Make sure our to is\n\t\t\t// updated. We also need to re-evaluate whether it is a string,\n\t\t\t// because an object can also be replaced by a string\n\t\t\tto = triggerData.toPage;\n\n\t\t\t// If the caller passed us a url, call loadPage()\n\t\t\t// to make sure it is loaded into the DOM. We'll listen\n\t\t\t// to the promise object it returns so we know when\n\t\t\t// it is done loading or if an error ocurred.\n\t\t\tif ( $.type(to) === \"string\" ) {\n\t\t\t\t// Set the isPageTransitioning flag to prevent any requests from\n\t\t\t\t// entering this method while we are in the midst of loading a page\n\t\t\t\t// or transitioning.\n\t\t\t\tisPageTransitioning = true;\n\n\t\t\t\tthis._loadUrl( to, triggerData, settings );\n\t\t\t} else {\n\t\t\t\tthis.transition( to, triggerData, settings );\n\t\t\t}\n\t\t},\n\n\t\ttransition: function( toPage, triggerData, settings ) {\n\t\t\tvar fromPage, url, pageUrl, fileUrl,\n\t\t\t\tactive, activeIsInitialPage,\n\t\t\t\thistoryDir, pageTitle, isDialog,\n\t\t\t\talreadyThere, newPageTitle,\n\t\t\t\tparams,\tcssTransitionDeferred,\n\t\t\t\tbeforeTransition;\n\n\t\t\t// If we are in the midst of a transition, queue the current request.\n\t\t\t// We'll call changePage() once we're done with the current transition\n\t\t\t// to service the request.\n\t\t\tif ( isPageTransitioning ) {\n\t\t\t\t// make sure to only queue the to and settings values so the arguments\n\t\t\t\t// work with a call to the change method\n\t\t\t\tpageTransitionQueue.unshift( [toPage, settings] );\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// DEPRECATED - this call only, in favor of the before transition\n\t\t\t// if the page beforechange default is prevented return early\n\t\t\tif ( !this._triggerPageBeforeChange(toPage, triggerData, settings) ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\ttriggerData.prevPage = settings.fromPage;\n\t\t\t// if the (content|page)beforetransition default is prevented return early\n\t\t\t// Note, we have to check for both the deprecated and new events\n\t\t\tbeforeTransition = this._triggerWithDeprecated( \"beforetransition\", triggerData );\n\t\t\tif (beforeTransition.deprecatedEvent.isDefaultPrevented() ||\n\t\t\t\tbeforeTransition.event.isDefaultPrevented() ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Set the isPageTransitioning flag to prevent any requests from\n\t\t\t// entering this method while we are in the midst of loading a page\n\t\t\t// or transitioning.\n\t\t\tisPageTransitioning = true;\n\n\t\t\t// If we are going to the first-page of the application, we need to make\n\t\t\t// sure settings.dataUrl is set to the application document url. This allows\n\t\t\t// us to avoid generating a document url with an id hash in the case where the\n\t\t\t// first-page of the document has an id attribute specified.\n\t\t\tif ( toPage[ 0 ] === $.mobile.firstPage[ 0 ] && !settings.dataUrl ) {\n\t\t\t\tsettings.dataUrl = $.mobile.path.documentUrl.hrefNoHash;\n\t\t\t}\n\n\t\t\t// The caller passed us a real page DOM element. Update our\n\t\t\t// internal state and then trigger a transition to the page.\n\t\t\tfromPage = settings.fromPage;\n\t\t\turl = ( settings.dataUrl && $.mobile.path.convertUrlToDataUrl(settings.dataUrl) ) ||\n\t\t\t\ttoPage.jqmData( \"url\" );\n\n\t\t\t// The pageUrl var is usually the same as url, except when url is obscured\n\t\t\t// as a dialog url. pageUrl always contains the file path\n\t\t\tpageUrl = url;\n\t\t\tfileUrl = $.mobile.path.getFilePath( url );\n\t\t\tactive = $.mobile.navigate.history.getActive();\n\t\t\tactiveIsInitialPage = $.mobile.navigate.history.activeIndex === 0;\n\t\t\thistoryDir = 0;\n\t\t\tpageTitle = document.title;\n\t\t\tisDialog = ( settings.role === \"dialog\" ||\n\t\t\t\ttoPage.jqmData( \"role\" ) === \"dialog\" ) &&\n\t\t\t\ttoPage.jqmData( \"dialog\" ) !== true;\n\n\t\t\t// By default, we prevent changePage requests when the fromPage and toPage\n\t\t\t// are the same element, but folks that generate content\n\t\t\t// manually/dynamically and reuse pages want to be able to transition to\n\t\t\t// the same page. To allow this, they will need to change the default\n\t\t\t// value of allowSamePageTransition to true, *OR*, pass it in as an\n\t\t\t// option when they manually call changePage(). It should be noted that\n\t\t\t// our default transition animations assume that the formPage and toPage\n\t\t\t// are different elements, so they may behave unexpectedly. It is up to\n\t\t\t// the developer that turns on the allowSamePageTransitiona option to\n\t\t\t// either turn off transition animations, or make sure that an appropriate\n\t\t\t// animation transition is used.\n\t\t\tif ( fromPage && fromPage[0] === toPage[0] &&\n\t\t\t\t!settings.allowSamePageTransition ) {\n\n\t\t\t\tisPageTransitioning = false;\n\t\t\t\tthis._triggerWithDeprecated( \"transition\", triggerData );\n\t\t\t\tthis._triggerWithDeprecated( \"change\", triggerData );\n\n\t\t\t\t// Even if there is no page change to be done, we should keep the\n\t\t\t\t// urlHistory in sync with the hash changes\n\t\t\t\tif ( settings.fromHashChange ) {\n\t\t\t\t\t$.mobile.navigate.history.direct({ url: url });\n\t\t\t\t}\n\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// We need to make sure the page we are given has already been enhanced.\n\t\t\ttoPage.page({ role: settings.role });\n\n\t\t\t// If the changePage request was sent from a hashChange event, check to\n\t\t\t// see if the page is already within the urlHistory stack. If so, we'll\n\t\t\t// assume the user hit the forward/back button and will try to match the\n\t\t\t// transition accordingly.\n\t\t\tif ( settings.fromHashChange ) {\n\t\t\t\thistoryDir = settings.direction === \"back\" ? -1 : 1;\n\t\t\t}\n\n\t\t\t// Kill the keyboard.\n\t\t\t// XXX_jblas: We need to stop crawling the entire document to kill focus.\n\t\t\t//            Instead, we should be tracking focus with a delegate()\n\t\t\t//            handler so we already have the element in hand at this\n\t\t\t//            point.\n\t\t\t// Wrap this in a try/catch block since IE9 throw \"Unspecified error\" if\n\t\t\t// document.activeElement is undefined when we are in an IFrame.\n\t\t\ttry {\n\t\t\t\tif ( document.activeElement &&\n\t\t\t\t\tdocument.activeElement.nodeName.toLowerCase() !== \"body\" ) {\n\n\t\t\t\t\t$( document.activeElement ).blur();\n\t\t\t\t} else {\n\t\t\t\t\t$( \"input:focus, textarea:focus, select:focus\" ).blur();\n\t\t\t\t}\n\t\t\t} catch( e ) {}\n\n\t\t\t// Record whether we are at a place in history where a dialog used to be -\n\t\t\t// if so, do not add a new history entry and do not change the hash either\n\t\t\talreadyThere = false;\n\n\t\t\t// If we're displaying the page as a dialog, we don't want the url\n\t\t\t// for the dialog content to be used in the hash. Instead, we want\n\t\t\t// to append the dialogHashKey to the url of the current page.\n\t\t\tif ( isDialog && active ) {\n\t\t\t\t// on the initial page load active.url is undefined and in that case\n\t\t\t\t// should be an empty string. Moving the undefined -> empty string back\n\t\t\t\t// into urlHistory.addNew seemed imprudent given undefined better\n\t\t\t\t// represents the url state\n\n\t\t\t\t// If we are at a place in history that once belonged to a dialog, reuse\n\t\t\t\t// this state without adding to urlHistory and without modifying the\n\t\t\t\t// hash. However, if a dialog is already displayed at this point, and\n\t\t\t\t// we're about to display another dialog, then we must add another hash\n\t\t\t\t// and history entry on top so that one may navigate back to the\n\t\t\t\t// original dialog\n\t\t\t\tif ( active.url &&\n\t\t\t\t\tactive.url.indexOf( $.mobile.dialogHashKey ) > -1 &&\n\t\t\t\t\tthis.activePage &&\n\t\t\t\t\t!this.activePage.hasClass( \"ui-dialog\" ) &&\n\t\t\t\t\t$.mobile.navigate.history.activeIndex > 0 ) {\n\n\t\t\t\t\tsettings.changeHash = false;\n\t\t\t\t\talreadyThere = true;\n\t\t\t\t}\n\n\t\t\t\t// Normally, we tack on a dialog hash key, but if this is the location\n\t\t\t\t// of a stale dialog, we reuse the URL from the entry\n\t\t\t\turl = ( active.url || \"\" );\n\n\t\t\t\t// account for absolute urls instead of just relative urls use as hashes\n\t\t\t\tif ( !alreadyThere && url.indexOf(\"#\") > -1 ) {\n\t\t\t\t\turl += $.mobile.dialogHashKey;\n\t\t\t\t} else {\n\t\t\t\t\turl += \"#\" + $.mobile.dialogHashKey;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// if title element wasn't found, try the page div data attr too\n\t\t\t// If this is a deep-link or a reload ( active === undefined ) then just\n\t\t\t// use pageTitle\n\t\t\tnewPageTitle = ( !active ) ? pageTitle : toPage.jqmData( \"title\" ) ||\n\t\t\t\ttoPage.children( \":jqmData(role='header')\" ).find( \".ui-title\" ).text();\n\t\t\tif ( !!newPageTitle && pageTitle === document.title ) {\n\t\t\t\tpageTitle = newPageTitle;\n\t\t\t}\n\t\t\tif ( !toPage.jqmData( \"title\" ) ) {\n\t\t\t\ttoPage.jqmData( \"title\", pageTitle );\n\t\t\t}\n\n\t\t\t// Make sure we have a transition defined.\n\t\t\tsettings.transition = settings.transition ||\n\t\t\t\t( ( historyDir && !activeIsInitialPage ) ? active.transition : undefined ) ||\n\t\t\t\t( isDialog ? $.mobile.defaultDialogTransition : $.mobile.defaultPageTransition );\n\n\t\t\t//add page to history stack if it's not back or forward\n\t\t\tif ( !historyDir && alreadyThere ) {\n\t\t\t\t$.mobile.navigate.history.getActive().pageUrl = pageUrl;\n\t\t\t}\n\n\t\t\t// Set the location hash.\n\t\t\tif ( url && !settings.fromHashChange ) {\n\n\t\t\t\t// rebuilding the hash here since we loose it earlier on\n\t\t\t\t// TODO preserve the originally passed in path\n\t\t\t\tif ( !$.mobile.path.isPath( url ) && url.indexOf( \"#\" ) < 0 ) {\n\t\t\t\t\turl = \"#\" + url;\n\t\t\t\t}\n\n\t\t\t\t// TODO the property names here are just silly\n\t\t\t\tparams = {\n\t\t\t\t\ttransition: settings.transition,\n\t\t\t\t\ttitle: pageTitle,\n\t\t\t\t\tpageUrl: pageUrl,\n\t\t\t\t\trole: settings.role\n\t\t\t\t};\n\n\t\t\t\tif ( settings.changeHash !== false && $.mobile.hashListeningEnabled ) {\n\t\t\t\t\t$.mobile.navigate( this.window[ 0 ].encodeURI( url ), params, true);\n\t\t\t\t} else if ( toPage[ 0 ] !== $.mobile.firstPage[ 0 ] ) {\n\t\t\t\t\t$.mobile.navigate.history.add( url, params );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t//set page title\n\t\t\tdocument.title = pageTitle;\n\n\t\t\t//set \"toPage\" as activePage deprecated in 1.4 remove in 1.5\n\t\t\t$.mobile.activePage = toPage;\n\n\t\t\t//new way to handle activePage\n\t\t\tthis.activePage = toPage;\n\n\t\t\t// If we're navigating back in the URL history, set reverse accordingly.\n\t\t\tsettings.reverse = settings.reverse || historyDir < 0;\n\n\t\t\tcssTransitionDeferred = $.Deferred();\n\n\t\t\tthis._cssTransition(toPage, fromPage, {\n\t\t\t\ttransition: settings.transition,\n\t\t\t\treverse: settings.reverse,\n\t\t\t\tdeferred: cssTransitionDeferred\n\t\t\t});\n\n\t\t\tcssTransitionDeferred.done($.proxy(function( name, reverse, $to, $from, alreadyFocused ) {\n\t\t\t\t$.mobile.removeActiveLinkClass();\n\n\t\t\t\t//if there's a duplicateCachedPage, remove it from the DOM now that it's hidden\n\t\t\t\tif ( settings.duplicateCachedPage ) {\n\t\t\t\t\tsettings.duplicateCachedPage.remove();\n\t\t\t\t}\n\n\t\t\t\t// despite visibility: hidden addresses issue #2965\n\t\t\t\t// https://github.com/jquery/jquery-mobile/issues/2965\n\t\t\t\tif ( !alreadyFocused ) {\n\t\t\t\t\t$.mobile.focusPage( toPage );\n\t\t\t\t}\n\n\t\t\t\tthis._releaseTransitionLock();\n\t\t\t\tthis._triggerWithDeprecated( \"transition\", triggerData );\n\t\t\t\tthis._triggerWithDeprecated( \"change\", triggerData );\n\t\t\t}, this));\n\t\t},\n\n\t\t// determine the current base url\n\t\t_findBaseWithDefault: function() {\n\t\t\tvar closestBase = ( this.activePage &&\n\t\t\t$.mobile.getClosestBaseUrl( this.activePage ) );\n\t\treturn closestBase || $.mobile.path.documentBase.hrefNoHash;\n\t\t}\n\t});\n\n\t// The following handlers should be bound after mobileinit has been triggered\n\t// the following deferred is resolved in the init file\n\t$.mobile.navreadyDeferred = $.Deferred();\n\n\t//these variables make all page containers use the same queue and only navigate one at a time\n\t// queue to hold simultanious page transitions\n\tvar pageTransitionQueue = [],\n\n\t\t// indicates whether or not page is in process of transitioning\n\t\tisPageTransitioning = false;\n\n})( jQuery );\n\n(function( $, undefined ) {\n\n\t\t// resolved on domready\n\tvar domreadyDeferred = $.Deferred(),\n\n\t\t// resolved and nulled on window.load()\n\t\tloadDeferred = $.Deferred(),\n\n\t\t// function that resolves the above deferred\n\t\tpageIsFullyLoaded = function() {\n\n\t\t\t// Resolve and null the deferred\n\t\t\tloadDeferred.resolve();\n\t\t\tloadDeferred = null;\n\t\t},\n\n\t\tdocumentUrl = $.mobile.path.documentUrl,\n\n\t\t// used to track last vclicked element to make sure its value is added to form data\n\t\t$lastVClicked = null;\n\n\t/* Event Bindings - hashchange, submit, and click */\n\tfunction findClosestLink( ele )\t{\n\t\twhile ( ele ) {\n\t\t\t// Look for the closest element with a nodeName of \"a\".\n\t\t\t// Note that we are checking if we have a valid nodeName\n\t\t\t// before attempting to access it. This is because the\n\t\t\t// node we get called with could have originated from within\n\t\t\t// an embedded SVG document where some symbol instance elements\n\t\t\t// don't have nodeName defined on them, or strings are of type\n\t\t\t// SVGAnimatedString.\n\t\t\tif ( ( typeof ele.nodeName === \"string\" ) && ele.nodeName.toLowerCase() === \"a\" ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tele = ele.parentNode;\n\t\t}\n\t\treturn ele;\n\t}\n\n\t$.mobile.loadPage = function( url, opts ) {\n\t\tvar container;\n\n\t\topts = opts || {};\n\t\tcontainer = ( opts.pageContainer || $.mobile.pageContainer );\n\n\t\t// create the deferred that will be supplied to loadPage callers\n\t\t// and resolved by the content widget's load method\n\t\topts.deferred = $.Deferred();\n\n\t\t// Preferring to allow exceptions for uninitialized opts.pageContainer\n\t\t// widgets so we know if we need to force init here for users\n\t\tcontainer.pagecontainer( \"load\", url, opts );\n\n\t\t// provide the deferred\n\t\treturn opts.deferred.promise();\n\t};\n\n\t//define vars for interal use\n\n\t/* internal utility functions */\n\n\t// NOTE Issue #4950 Android phonegap doesn't navigate back properly\n\t//      when a full page refresh has taken place. It appears that hashchange\n\t//      and replacestate history alterations work fine but we need to support\n\t//      both forms of history traversal in our code that uses backward history\n\t//      movement\n\t$.mobile.back = function() {\n\t\tvar nav = window.navigator;\n\n\t\t// if the setting is on and the navigator object is\n\t\t// available use the phonegap navigation capability\n\t\tif ( this.phonegapNavigationEnabled &&\n\t\t\tnav &&\n\t\t\tnav.app &&\n\t\t\tnav.app.backHistory ) {\n\t\t\tnav.app.backHistory();\n\t\t} else {\n\t\t\t$.mobile.pageContainer.pagecontainer( \"back\" );\n\t\t}\n\t};\n\n\t// Direct focus to the page title, or otherwise first focusable element\n\t$.mobile.focusPage = function ( page ) {\n\t\tvar autofocus = page.find( \"[autofocus]\" ),\n\t\t\tpageTitle = page.find( \".ui-title:eq(0)\" );\n\n\t\tif ( autofocus.length ) {\n\t\t\tautofocus.focus();\n\t\t\treturn;\n\t\t}\n\n\t\tif ( pageTitle.length ) {\n\t\t\tpageTitle.focus();\n\t\t} else{\n\t\t\tpage.focus();\n\t\t}\n\t};\n\n\t// No-op implementation of transition degradation\n\t$.mobile._maybeDegradeTransition = $.mobile._maybeDegradeTransition || function( transition ) {\n\t\treturn transition;\n\t};\n\n\t// Exposed $.mobile methods\n\n\t$.mobile.changePage = function( to, options ) {\n\t\t$.mobile.pageContainer.pagecontainer( \"change\", to, options );\n\t};\n\n\t$.mobile.changePage.defaults = {\n\t\ttransition: undefined,\n\t\treverse: false,\n\t\tchangeHash: true,\n\t\tfromHashChange: false,\n\t\trole: undefined, // By default we rely on the role defined by the @data-role attribute.\n\t\tduplicateCachedPage: undefined,\n\t\tpageContainer: undefined,\n\t\tshowLoadMsg: true, //loading message shows by default when pages are being fetched during changePage\n\t\tdataUrl: undefined,\n\t\tfromPage: undefined,\n\t\tallowSamePageTransition: false\n\t};\n\n\t$.mobile._registerInternalEvents = function() {\n\t\tvar getAjaxFormData = function( $form, calculateOnly ) {\n\t\t\tvar url, ret = true, formData, vclickedName, method;\n\t\t\tif ( !$.mobile.ajaxEnabled ||\n\t\t\t\t\t// test that the form is, itself, ajax false\n\t\t\t\t\t$form.is( \":jqmData(ajax='false')\" ) ||\n\t\t\t\t\t// test that $.mobile.ignoreContentEnabled is set and\n\t\t\t\t\t// the form or one of it's parents is ajax=false\n\t\t\t\t\t!$form.jqmHijackable().length ||\n\t\t\t\t\t$form.attr( \"target\" ) ) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\turl = ( $lastVClicked && $lastVClicked.attr( \"formaction\" ) ) ||\n\t\t\t\t$form.attr( \"action\" );\n\t\t\tmethod = ( $form.attr( \"method\" ) || \"get\" ).toLowerCase();\n\n\t\t\t// If no action is specified, browsers default to using the\n\t\t\t// URL of the document containing the form. Since we dynamically\n\t\t\t// pull in pages from external documents, the form should submit\n\t\t\t// to the URL for the source document of the page containing\n\t\t\t// the form.\n\t\t\tif ( !url ) {\n\t\t\t\t// Get the @data-url for the page containing the form.\n\t\t\t\turl = $.mobile.getClosestBaseUrl( $form );\n\n\t\t\t\t// NOTE: If the method is \"get\", we need to strip off the query string\n\t\t\t\t// because it will get replaced with the new form data. See issue #5710.\n\t\t\t\tif ( method === \"get\" ) {\n\t\t\t\t\turl = $.mobile.path.parseUrl( url ).hrefNoSearch;\n\t\t\t\t}\n\n\t\t\t\tif ( url === $.mobile.path.documentBase.hrefNoHash ) {\n\t\t\t\t\t// The url we got back matches the document base,\n\t\t\t\t\t// which means the page must be an internal/embedded page,\n\t\t\t\t\t// so default to using the actual document url as a browser\n\t\t\t\t\t// would.\n\t\t\t\t\turl = documentUrl.hrefNoSearch;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\turl = $.mobile.path.makeUrlAbsolute(  url, $.mobile.getClosestBaseUrl( $form ) );\n\n\t\t\tif ( ( $.mobile.path.isExternal( url ) && !$.mobile.path.isPermittedCrossDomainRequest( documentUrl, url ) ) ) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tif ( !calculateOnly ) {\n\t\t\t\tformData = $form.serializeArray();\n\n\t\t\t\tif ( $lastVClicked && $lastVClicked[ 0 ].form === $form[ 0 ] ) {\n\t\t\t\t\tvclickedName = $lastVClicked.attr( \"name\" );\n\t\t\t\t\tif ( vclickedName ) {\n\t\t\t\t\t\t// Make sure the last clicked element is included in the form\n\t\t\t\t\t\t$.each( formData, function( key, value ) {\n\t\t\t\t\t\t\tif ( value.name === vclickedName ) {\n\t\t\t\t\t\t\t\t// Unset vclickedName - we've found it in the serialized data already\n\t\t\t\t\t\t\t\tvclickedName = \"\";\n\t\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t\tif ( vclickedName ) {\n\t\t\t\t\t\t\tformData.push( { name: vclickedName, value: $lastVClicked.attr( \"value\" ) } );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tret = {\n\t\t\t\t\turl: url,\n\t\t\t\t\toptions: {\n\t\t\t\t\t\ttype:\t\tmethod,\n\t\t\t\t\t\tdata:\t\t$.param( formData ),\n\t\t\t\t\t\ttransition:\t$form.jqmData( \"transition\" ),\n\t\t\t\t\t\treverse:\t$form.jqmData( \"direction\" ) === \"reverse\",\n\t\t\t\t\t\treloadPage:\ttrue\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn ret;\n\t\t};\n\n\t\t//bind to form submit events, handle with Ajax\n\t\t$.mobile.document.delegate( \"form\", \"submit\", function( event ) {\n\t\t\tvar formData;\n\n\t\t\tif ( !event.isDefaultPrevented() ) {\n\t\t\t\tformData = getAjaxFormData( $( this ) );\n\t\t\t\tif ( formData ) {\n\t\t\t\t\t$.mobile.changePage( formData.url, formData.options );\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\t//add active state on vclick\n\t\t$.mobile.document.bind( \"vclick\", function( event ) {\n\t\t\tvar $btn, btnEls, target = event.target, needClosest = false;\n\t\t\t// if this isn't a left click we don't care. Its important to note\n\t\t\t// that when the virtual event is generated it will create the which attr\n\t\t\tif ( event.which > 1 || !$.mobile.linkBindingEnabled ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Record that this element was clicked, in case we need it for correct\n\t\t\t// form submission during the \"submit\" handler above\n\t\t\t$lastVClicked = $( target );\n\n\t\t\t// Try to find a target element to which the active class will be applied\n\t\t\tif ( $.data( target, \"mobile-button\" ) ) {\n\t\t\t\t// If the form will not be submitted via AJAX, do not add active class\n\t\t\t\tif ( !getAjaxFormData( $( target ).closest( \"form\" ), true ) ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\t// We will apply the active state to this button widget - the parent\n\t\t\t\t// of the input that was clicked will have the associated data\n\t\t\t\tif ( target.parentNode ) {\n\t\t\t\t\ttarget = target.parentNode;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\ttarget = findClosestLink( target );\n\t\t\t\tif ( !( target && $.mobile.path.parseUrl( target.getAttribute( \"href\" ) || \"#\" ).hash !== \"#\" ) ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// TODO teach $.mobile.hijackable to operate on raw dom elements so the\n\t\t\t\t// link wrapping can be avoided\n\t\t\t\tif ( !$( target ).jqmHijackable().length ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Avoid calling .closest by using the data set during .buttonMarkup()\n\t\t\t// List items have the button data in the parent of the element clicked\n\t\t\tif ( !!~target.className.indexOf( \"ui-link-inherit\" ) ) {\n\t\t\t\tif ( target.parentNode ) {\n\t\t\t\t\tbtnEls = $.data( target.parentNode, \"buttonElements\" );\n\t\t\t\t}\n\t\t\t// Otherwise, look for the data on the target itself\n\t\t\t} else {\n\t\t\t\tbtnEls = $.data( target, \"buttonElements\" );\n\t\t\t}\n\t\t\t// If found, grab the button's outer element\n\t\t\tif ( btnEls ) {\n\t\t\t\ttarget = btnEls.outer;\n\t\t\t} else {\n\t\t\t\tneedClosest = true;\n\t\t\t}\n\n\t\t\t$btn = $( target );\n\t\t\t// If the outer element wasn't found by the our heuristics, use .closest()\n\t\t\tif ( needClosest ) {\n\t\t\t\t$btn = $btn.closest( \".ui-btn\" );\n\t\t\t}\n\n\t\t\tif ( $btn.length > 0 &&\n\t\t\t\t!( $btn.hasClass( \"ui-state-disabled\" ||\n\n\t\t\t\t\t// DEPRECATED as of 1.4.0 - remove after 1.4.0 release\n\t\t\t\t\t// only ui-state-disabled should be present thereafter\n\t\t\t\t\t$btn.hasClass( \"ui-disabled\" ) ) ) ) {\n\t\t\t\t$.mobile.removeActiveLinkClass( true );\n\t\t\t\t$.mobile.activeClickedLink = $btn;\n\t\t\t\t$.mobile.activeClickedLink.addClass( $.mobile.activeBtnClass );\n\t\t\t}\n\t\t});\n\n\t\t// click routing - direct to HTTP or Ajax, accordingly\n\t\t$.mobile.document.bind( \"click\", function( event ) {\n\t\t\tif ( !$.mobile.linkBindingEnabled || event.isDefaultPrevented() ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar link = findClosestLink( event.target ),\n\t\t\t\t$link = $( link ),\n\n\t\t\t\t//remove active link class if external (then it won't be there if you come back)\n\t\t\t\thttpCleanup = function() {\n\t\t\t\t\twindow.setTimeout(function() { $.mobile.removeActiveLinkClass( true ); }, 200 );\n\t\t\t\t},\n\t\t\t\tbaseUrl, href,\n\t\t\t\tuseDefaultUrlHandling, isExternal,\n\t\t\t\ttransition, reverse, role;\n\n\t\t\t// If a button was clicked, clean up the active class added by vclick above\n\t\t\tif ( $.mobile.activeClickedLink &&\n\t\t\t\t$.mobile.activeClickedLink[ 0 ] === event.target.parentNode ) {\n\t\t\t\thttpCleanup();\n\t\t\t}\n\n\t\t\t// If there is no link associated with the click or its not a left\n\t\t\t// click we want to ignore the click\n\t\t\t// TODO teach $.mobile.hijackable to operate on raw dom elements so the link wrapping\n\t\t\t// can be avoided\n\t\t\tif ( !link || event.which > 1 || !$link.jqmHijackable().length ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t//if there's a data-rel=back attr, go back in history\n\t\t\tif ( $link.is( \":jqmData(rel='back')\" ) ) {\n\t\t\t\t$.mobile.back();\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tbaseUrl = $.mobile.getClosestBaseUrl( $link );\n\n\t\t\t//get href, if defined, otherwise default to empty hash\n\t\t\thref = $.mobile.path.makeUrlAbsolute( $link.attr( \"href\" ) || \"#\", baseUrl );\n\n\t\t\t//if ajax is disabled, exit early\n\t\t\tif ( !$.mobile.ajaxEnabled && !$.mobile.path.isEmbeddedPage( href ) ) {\n\t\t\t\thttpCleanup();\n\t\t\t\t//use default click handling\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// XXX_jblas: Ideally links to application pages should be specified as\n\t\t\t//            an url to the application document with a hash that is either\n\t\t\t//            the site relative path or id to the page. But some of the\n\t\t\t//            internal code that dynamically generates sub-pages for nested\n\t\t\t//            lists and select dialogs, just write a hash in the link they\n\t\t\t//            create. This means the actual URL path is based on whatever\n\t\t\t//            the current value of the base tag is at the time this code\n\t\t\t//            is called.\n\t\t\tif ( href.search( \"#\" ) !== -1 &&\n\t\t\t\t!( $.mobile.path.isExternal( href ) && $.mobile.path.isAbsoluteUrl( href ) ) ) {\n\n\t\t\t\thref = href.replace( /[^#]*#/, \"\" );\n\t\t\t\tif ( !href ) {\n\t\t\t\t\t//link was an empty hash meant purely\n\t\t\t\t\t//for interaction, so we ignore it.\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\treturn;\n\t\t\t\t} else if ( $.mobile.path.isPath( href ) ) {\n\t\t\t\t\t//we have apath so make it the href we want to load.\n\t\t\t\t\thref = $.mobile.path.makeUrlAbsolute( href, baseUrl );\n\t\t\t\t} else {\n\t\t\t\t\t//we have a simple id so use the documentUrl as its base.\n\t\t\t\t\thref = $.mobile.path.makeUrlAbsolute( \"#\" + href, documentUrl.hrefNoHash );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Should we handle this link, or let the browser deal with it?\n\t\t\tuseDefaultUrlHandling = $link.is( \"[rel='external']\" ) || $link.is( \":jqmData(ajax='false')\" ) || $link.is( \"[target]\" );\n\n\t\t\t// Some embedded browsers, like the web view in Phone Gap, allow cross-domain XHR\n\t\t\t// requests if the document doing the request was loaded via the file:// protocol.\n\t\t\t// This is usually to allow the application to \"phone home\" and fetch app specific\n\t\t\t// data. We normally let the browser handle external/cross-domain urls, but if the\n\t\t\t// allowCrossDomainPages option is true, we will allow cross-domain http/https\n\t\t\t// requests to go through our page loading logic.\n\n\t\t\t//check for protocol or rel and its not an embedded page\n\t\t\t//TODO overlap in logic from isExternal, rel=external check should be\n\t\t\t//     moved into more comprehensive isExternalLink\n\t\t\tisExternal = useDefaultUrlHandling || ( $.mobile.path.isExternal( href ) && !$.mobile.path.isPermittedCrossDomainRequest( documentUrl, href ) );\n\n\t\t\tif ( isExternal ) {\n\t\t\t\thttpCleanup();\n\t\t\t\t//use default click handling\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t//use ajax\n\t\t\ttransition = $link.jqmData( \"transition\" );\n\t\t\treverse = $link.jqmData( \"direction\" ) === \"reverse\" ||\n\t\t\t\t\t\t// deprecated - remove by 1.0\n\t\t\t\t\t\t$link.jqmData( \"back\" );\n\n\t\t\t//this may need to be more specific as we use data-rel more\n\t\t\trole = $link.attr( \"data-\" + $.mobile.ns + \"rel\" ) || undefined;\n\n\t\t\t$.mobile.changePage( href, { transition: transition, reverse: reverse, role: role, link: $link } );\n\t\t\tevent.preventDefault();\n\t\t});\n\n\t\t//prefetch pages when anchors with data-prefetch are encountered\n\t\t$.mobile.document.delegate( \".ui-page\", \"pageshow.prefetch\", function() {\n\t\t\tvar urls = [];\n\t\t\t$( this ).find( \"a:jqmData(prefetch)\" ).each(function() {\n\t\t\t\tvar $link = $( this ),\n\t\t\t\t\turl = $link.attr( \"href\" );\n\n\t\t\t\tif ( url && $.inArray( url, urls ) === -1 ) {\n\t\t\t\t\turls.push( url );\n\n\t\t\t\t\t$.mobile.loadPage( url, { role: $link.attr( \"data-\" + $.mobile.ns + \"rel\" ),prefetch: true } );\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\n\t\t// TODO ensure that the navigate binding in the content widget happens at the right time\n\t\t$.mobile.pageContainer.pagecontainer();\n\n\t\t//set page min-heights to be device specific\n\t\t$.mobile.document.bind( \"pageshow\", function() {\n\n\t\t\t// We need to wait for window.load to make sure that styles have already been rendered,\n\t\t\t// otherwise heights of external toolbars will have the wrong value\n\t\t\tif ( loadDeferred ) {\n\t\t\t\tloadDeferred.done( $.mobile.resetActivePageHeight );\n\t\t\t} else {\n\t\t\t\t$.mobile.resetActivePageHeight();\n\t\t\t}\n\t\t});\n\t\t$.mobile.window.bind( \"throttledresize\", $.mobile.resetActivePageHeight );\n\n\t};//navreadyDeferred done callback\n\n\t$( function() { domreadyDeferred.resolve(); } );\n\n\t// Account for the possibility that the load event has already fired\n\tif ( document.readyState === \"complete\" ) {\n\t\tpageIsFullyLoaded();\n\t} else {\n\t\t$.mobile.window.load( pageIsFullyLoaded );\n\t}\n\n\t$.when( domreadyDeferred, $.mobile.navreadyDeferred ).done( function() { $.mobile._registerInternalEvents(); } );\n})( jQuery );\n\n\n(function( $, window, undefined ) {\n\n\t// TODO remove direct references to $.mobile and properties, we should\n\t//      favor injection with params to the constructor\n\t$.mobile.Transition = function() {\n\t\tthis.init.apply( this, arguments );\n\t};\n\n\t$.extend($.mobile.Transition.prototype, {\n\t\ttoPreClass: \" ui-page-pre-in\",\n\n\t\tinit: function( name, reverse, $to, $from ) {\n\t\t\t$.extend(this, {\n\t\t\t\tname: name,\n\t\t\t\treverse: reverse,\n\t\t\t\t$to: $to,\n\t\t\t\t$from: $from,\n\t\t\t\tdeferred: new $.Deferred()\n\t\t\t});\n\t\t},\n\n\t\tcleanFrom: function() {\n\t\t\tthis.$from\n\t\t\t\t.removeClass( $.mobile.activePageClass + \" out in reverse \" + this.name )\n\t\t\t\t.height( \"\" );\n\t\t},\n\n\t\t// NOTE overridden by child object prototypes, noop'd here as defaults\n\t\tbeforeDoneIn: function() {},\n\t\tbeforeDoneOut: function() {},\n\t\tbeforeStartOut: function() {},\n\n\t\tdoneIn: function() {\n\t\t\tthis.beforeDoneIn();\n\n\t\t\tthis.$to.removeClass( \"out in reverse \" + this.name ).height( \"\" );\n\n\t\t\tthis.toggleViewportClass();\n\n\t\t\t// In some browsers (iOS5), 3D transitions block the ability to scroll to the desired location during transition\n\t\t\t// This ensures we jump to that spot after the fact, if we aren't there already.\n\t\t\tif ( $.mobile.window.scrollTop() !== this.toScroll ) {\n\t\t\t\tthis.scrollPage();\n\t\t\t}\n\t\t\tif ( !this.sequential ) {\n\t\t\t\tthis.$to.addClass( $.mobile.activePageClass );\n\t\t\t}\n\t\t\tthis.deferred.resolve( this.name, this.reverse, this.$to, this.$from, true );\n\t\t},\n\n\t\tdoneOut: function( screenHeight, reverseClass, none, preventFocus ) {\n\t\t\tthis.beforeDoneOut();\n\t\t\tthis.startIn( screenHeight, reverseClass, none, preventFocus );\n\t\t},\n\n\t\thideIn: function( callback ) {\n\t\t\t// Prevent flickering in phonegap container: see comments at #4024 regarding iOS\n\t\t\tthis.$to.css( \"z-index\", -10 );\n\t\t\tcallback.call( this );\n\t\t\tthis.$to.css( \"z-index\", \"\" );\n\t\t},\n\n\t\tscrollPage: function() {\n\t\t\t// By using scrollTo instead of silentScroll, we can keep things better in order\n\t\t\t// Just to be precautios, disable scrollstart listening like silentScroll would\n\t\t\t$.event.special.scrollstart.enabled = false;\n\t\t\t//if we are hiding the url bar or the page was previously scrolled scroll to hide or return to position\n\t\t\tif ( $.mobile.hideUrlBar || this.toScroll !== $.mobile.defaultHomeScroll ) {\n\t\t\t\twindow.scrollTo( 0, this.toScroll );\n\t\t\t}\n\n\t\t\t// reenable scrollstart listening like silentScroll would\n\t\t\tsetTimeout( function() {\n\t\t\t\t$.event.special.scrollstart.enabled = true;\n\t\t\t}, 150 );\n\t\t},\n\n\t\tstartIn: function( screenHeight, reverseClass, none, preventFocus ) {\n\t\t\tthis.hideIn(function() {\n\t\t\t\tthis.$to.addClass( $.mobile.activePageClass + this.toPreClass );\n\n\t\t\t\t// Send focus to page as it is now display: block\n\t\t\t\tif ( !preventFocus ) {\n\t\t\t\t\t$.mobile.focusPage( this.$to );\n\t\t\t\t}\n\n\t\t\t\t// Set to page height\n\t\t\t\tthis.$to.height( screenHeight + this.toScroll );\n\n                if ( !none ) {\n                    this.scrollPage();\n                }\n\t\t\t});\n\n\t\t\tthis.$to\n\t\t\t\t.removeClass( this.toPreClass )\n\t\t\t\t.addClass( this.name + \" in \" + reverseClass );\n\n\t\t\tif ( !none ) {\n\t\t\t\tthis.$to.animationComplete( $.proxy(function() {\n\t\t\t\t\tthis.doneIn();\n\t\t\t\t}, this ));\n\t\t\t} else {\n\t\t\t\tthis.doneIn();\n\t\t\t}\n\n\t\t},\n\n\t\tstartOut: function( screenHeight, reverseClass, none ) {\n\t\t\tthis.beforeStartOut( screenHeight, reverseClass, none );\n\n\t\t\t// Set the from page's height and start it transitioning out\n\t\t\t// Note: setting an explicit height helps eliminate tiling in the transitions\n\t\t\tthis.$from\n\t\t\t\t.height( screenHeight + $.mobile.window.scrollTop() )\n\t\t\t\t.addClass( this.name + \" out\" + reverseClass );\n\t\t},\n\n\t\ttoggleViewportClass: function() {\n\t\t\t$.mobile.pageContainer.toggleClass( \"ui-mobile-viewport-transitioning viewport-\" + this.name );\n\t\t},\n\n\t\ttransition: function() {\n\t\t\t// NOTE many of these could be calculated/recorded in the constructor, it's my\n\t\t\t//      opinion that binding them as late as possible has value with regards to\n\t\t\t//      better transitions with fewer bugs. Ie, it's not guaranteed that the\n\t\t\t//      object will be created and transition will be run immediately after as\n\t\t\t//      it is today. So we wait until transition is invoked to gather the following\n\t\t\tvar none,\n\t\t\t\treverseClass = this.reverse ? \" reverse\" : \"\",\n\t\t\t\tscreenHeight = $.mobile.getScreenHeight(),\n\t\t\t\tmaxTransitionOverride = $.mobile.maxTransitionWidth !== false &&\n\t\t\t\t\t$.mobile.window.width() > $.mobile.maxTransitionWidth;\n\n\t\t\tthis.toScroll = $.mobile.navigate.history.getActive().lastScroll || $.mobile.defaultHomeScroll;\n\n\t\t\tnone = !$.support.cssTransitions || !$.support.cssAnimations ||\n\t\t\t\tmaxTransitionOverride || !this.name || this.name === \"none\" ||\n\t\t\t\tMath.max( $.mobile.window.scrollTop(), this.toScroll ) >\n\t\t\t\t\t$.mobile.getMaxScrollForTransition();\n\n\t\t\tthis.toggleViewportClass();\n\n\t\t\tif ( this.$from && !none ) {\n\t\t\t\tthis.startOut( screenHeight, reverseClass, none );\n\t\t\t} else {\n\t\t\t\tthis.doneOut( screenHeight, reverseClass, none, true );\n\t\t\t}\n\n\t\t\treturn this.deferred.promise();\n\t\t}\n\t});\n})( jQuery, this );\n\n\n(function( $ ) {\n\n\t$.mobile.SerialTransition = function() {\n\t\tthis.init.apply(this, arguments);\n\t};\n\n\t$.extend($.mobile.SerialTransition.prototype, $.mobile.Transition.prototype, {\n\t\tsequential: true,\n\n\t\tbeforeDoneOut: function() {\n\t\t\tif ( this.$from ) {\n\t\t\t\tthis.cleanFrom();\n\t\t\t}\n\t\t},\n\n\t\tbeforeStartOut: function( screenHeight, reverseClass, none ) {\n\t\t\tthis.$from.animationComplete($.proxy(function() {\n\t\t\t\tthis.doneOut( screenHeight, reverseClass, none );\n\t\t\t}, this ));\n\t\t}\n\t});\n\n})( jQuery );\n\n\n(function( $ ) {\n\n\t$.mobile.ConcurrentTransition = function() {\n\t\tthis.init.apply(this, arguments);\n\t};\n\n\t$.extend($.mobile.ConcurrentTransition.prototype, $.mobile.Transition.prototype, {\n\t\tsequential: false,\n\n\t\tbeforeDoneIn: function() {\n\t\t\tif ( this.$from ) {\n\t\t\t\tthis.cleanFrom();\n\t\t\t}\n\t\t},\n\n\t\tbeforeStartOut: function( screenHeight, reverseClass, none ) {\n\t\t\tthis.doneOut( screenHeight, reverseClass, none );\n\t\t}\n\t});\n\n})( jQuery );\n\n\n(function( $ ) {\n\n\t// generate the handlers from the above\n\tvar defaultGetMaxScrollForTransition = function() {\n\t\treturn $.mobile.getScreenHeight() * 3;\n\t};\n\n\t//transition handler dictionary for 3rd party transitions\n\t$.mobile.transitionHandlers = {\n\t\t\"sequential\": $.mobile.SerialTransition,\n\t\t\"simultaneous\": $.mobile.ConcurrentTransition\n\t};\n\n\t// Make our transition handler the public default.\n\t$.mobile.defaultTransitionHandler = $.mobile.transitionHandlers.sequential;\n\n\t$.mobile.transitionFallbacks = {};\n\n\t// If transition is defined, check if css 3D transforms are supported, and if not, if a fallback is specified\n\t$.mobile._maybeDegradeTransition = function( transition ) {\n\t\tif ( transition && !$.support.cssTransform3d && $.mobile.transitionFallbacks[ transition ] ) {\n\t\t\ttransition = $.mobile.transitionFallbacks[ transition ];\n\t\t}\n\n\t\treturn transition;\n\t};\n\n\t// Set the getMaxScrollForTransition to default if no implementation was set by user\n\t$.mobile.getMaxScrollForTransition = $.mobile.getMaxScrollForTransition || defaultGetMaxScrollForTransition;\n\n})( jQuery );\n\n/*\n* fallback transition for flip in non-3D supporting browsers (which tend to handle complex transitions poorly in general\n*/\n\n(function( $, window, undefined ) {\n\n$.mobile.transitionFallbacks.flip = \"fade\";\n\n})( jQuery, this );\n\n/*\n* fallback transition for flow in non-3D supporting browsers (which tend to handle complex transitions poorly in general\n*/\n\n(function( $, window, undefined ) {\n\n$.mobile.transitionFallbacks.flow = \"fade\";\n\n})( jQuery, this );\n\n/*\n* fallback transition for pop in non-3D supporting browsers (which tend to handle complex transitions poorly in general\n*/\n\n(function( $, window, undefined ) {\n\n$.mobile.transitionFallbacks.pop = \"fade\";\n\n})( jQuery, this );\n\n/*\n* fallback transition for slide in non-3D supporting browsers (which tend to handle complex transitions poorly in general\n*/\n\n(function( $, window, undefined ) {\n\n// Use the simultaneous transitions handler for slide transitions\n$.mobile.transitionHandlers.slide = $.mobile.transitionHandlers.simultaneous;\n\n// Set the slide transitions's fallback to \"fade\"\n$.mobile.transitionFallbacks.slide = \"fade\";\n\n})( jQuery, this );\n\n/*\n* fallback transition for slidedown in non-3D supporting browsers (which tend to handle complex transitions poorly in general\n*/\n\n(function( $, window, undefined ) {\n\n$.mobile.transitionFallbacks.slidedown = \"fade\";\n\n})( jQuery, this );\n\n/*\n* fallback transition for slidefade in non-3D supporting browsers (which tend to handle complex transitions poorly in general\n*/\n\n(function( $, window, undefined ) {\n\n// Set the slide transitions's fallback to \"fade\"\n$.mobile.transitionFallbacks.slidefade = \"fade\";\n\n})( jQuery, this );\n\n/*\n* fallback transition for slideup in non-3D supporting browsers (which tend to handle complex transitions poorly in general\n*/\n\n(function( $, window, undefined ) {\n\n$.mobile.transitionFallbacks.slideup = \"fade\";\n\n})( jQuery, this );\n\n/*\n* fallback transition for turn in non-3D supporting browsers (which tend to handle complex transitions poorly in general\n*/\n\n(function( $, window, undefined ) {\n\n$.mobile.transitionFallbacks.turn = \"fade\";\n\n})( jQuery, this );\n\n\n(function( $, undefined ) {\n\n$.mobile.degradeInputs = {\n\tcolor: false,\n\tdate: false,\n\tdatetime: false,\n\t\"datetime-local\": false,\n\temail: false,\n\tmonth: false,\n\tnumber: false,\n\trange: \"number\",\n\tsearch: \"text\",\n\ttel: false,\n\ttime: false,\n\turl: false,\n\tweek: false\n};\n// Backcompat remove in 1.5\n$.mobile.page.prototype.options.degradeInputs = $.mobile.degradeInputs;\n\n// Auto self-init widgets\n$.mobile.degradeInputsWithin = function( target ) {\n\n\ttarget = $( target );\n\n\t// Degrade inputs to avoid poorly implemented native functionality\n\ttarget.find( \"input\" ).not( $.mobile.page.prototype.keepNativeSelector() ).each(function() {\n\t\tvar element = $( this ),\n\t\t\ttype = this.getAttribute( \"type\" ),\n\t\t\toptType = $.mobile.degradeInputs[ type ] || \"text\",\n\t\t\thtml, hasType, findstr, repstr;\n\n\t\tif ( $.mobile.degradeInputs[ type ] ) {\n\t\t\thtml = $( \"<div>\" ).html( element.clone() ).html();\n\t\t\t// In IE browsers, the type sometimes doesn't exist in the cloned markup, so we replace the closing tag instead\n\t\t\thasType = html.indexOf( \" type=\" ) > -1;\n\t\t\tfindstr = hasType ? /\\s+type=[\"']?\\w+['\"]?/ : /\\/?>/;\n\t\t\trepstr = \" type=\\\"\" + optType + \"\\\" data-\" + $.mobile.ns + \"type=\\\"\" + type + \"\\\"\" + ( hasType ? \"\" : \">\" );\n\n\t\t\telement.replaceWith( html.replace( findstr, repstr ) );\n\t\t}\n\t});\n\n};\n\n})( jQuery );\n\n(function( $, window, undefined ) {\n\n$.widget( \"mobile.page\", $.mobile.page, {\n\toptions: {\n\n\t\t// Accepts left, right and none\n\t\tcloseBtn: \"left\",\n\t\tcloseBtnText: \"Close\",\n\t\toverlayTheme: \"a\",\n\t\tcorners: true,\n\t\tdialog: false\n\t},\n\n\t_create: function() {\n\t\tthis._super();\n\t\tif ( this.options.dialog ) {\n\n\t\t\t$.extend( this, {\n\t\t\t\t_inner: this.element.children(),\n\t\t\t\t_headerCloseButton: null\n\t\t\t});\n\n\t\t\tif ( !this.options.enhanced ) {\n\t\t\t\tthis._setCloseBtn( this.options.closeBtn );\n\t\t\t}\n\t\t}\n\t},\n\n\t_enhance: function() {\n\t\tthis._super();\n\n\t\t// Class the markup for dialog styling and wrap interior\n\t\tif ( this.options.dialog ) {\n\t\t\tthis.element.addClass( \"ui-dialog\" )\n\t\t\t\t.wrapInner( $( \"<div/>\", {\n\n\t\t\t\t\t// ARIA role\n\t\t\t\t\t\"role\" : \"dialog\",\n\t\t\t\t\t\"class\" : \"ui-dialog-contain ui-overlay-shadow\" +\n\t\t\t\t\t\t( this.options.corners ? \" ui-corner-all\" : \"\" )\n\t\t\t\t}));\n\t\t}\n\t},\n\n\t_setOptions: function( options ) {\n\t\tvar closeButtonLocation, closeButtonText,\n\t\t\tcurrentOpts = this.options;\n\n\t\tif ( options.corners !== undefined ) {\n\t\t\tthis._inner.toggleClass( \"ui-corner-all\", !!options.corners );\n\t\t}\n\n\t\tif ( options.overlayTheme !== undefined ) {\n\t\t\tif ( $.mobile.activePage[ 0 ] === this.element[ 0 ] ) {\n\t\t\t\tcurrentOpts.overlayTheme = options.overlayTheme;\n\t\t\t\tthis._handlePageBeforeShow();\n\t\t\t}\n\t\t}\n\n\t\tif ( options.closeBtnText !== undefined ) {\n\t\t\tcloseButtonLocation = currentOpts.closeBtn;\n\t\t\tcloseButtonText = options.closeBtnText;\n\t\t}\n\n\t\tif ( options.closeBtn !== undefined ) {\n\t\t\tcloseButtonLocation = options.closeBtn;\n\t\t}\n\n\t\tif ( closeButtonLocation ) {\n\t\t\tthis._setCloseBtn( closeButtonLocation, closeButtonText );\n\t\t}\n\n\t\tthis._super( options );\n\t},\n\n\t_handlePageBeforeShow: function () {\n\t\tif ( this.options.overlayTheme && this.options.dialog ) {\n\t\t\tthis.removeContainerBackground();\n\t\t\tthis.setContainerBackground( this.options.overlayTheme );\n\t\t} else {\n\t\t\tthis._super();\n\t\t}\n\t},\n\n\t_setCloseBtn: function( location, text ) {\n\t\tvar dst,\n\t\t\tbtn = this._headerCloseButton;\n\n\t\t// Sanitize value\n\t\tlocation = \"left\" === location ? \"left\" : \"right\" === location ? \"right\" : \"none\";\n\n\t\tif ( \"none\" === location ) {\n\t\t\tif ( btn ) {\n\t\t\t\tbtn.remove();\n\t\t\t\tbtn = null;\n\t\t\t}\n\t\t} else if ( btn ) {\n\t\t\tbtn.removeClass( \"ui-btn-left ui-btn-right\" ).addClass( \"ui-btn-\" + location );\n\t\t\tif ( text ) {\n\t\t\t\tbtn.text( text );\n\t\t\t}\n\t\t} else {\n\t\t\tdst = this._inner.find( \":jqmData(role='header')\" ).first();\n\t\t\tbtn = $( \"<a></a>\", {\n\t\t\t\t\t\"href\": \"#\",\n\t\t\t\t\t\"class\": \"ui-btn ui-corner-all ui-icon-delete ui-btn-icon-notext ui-btn-\" + location\n\t\t\t\t})\n\t\t\t\t.attr( \"data-\" + $.mobile.ns + \"rel\", \"back\" )\n\t\t\t\t.text( text || this.options.closeBtnText || \"\" )\n\t\t\t\t.prependTo( dst );\n\t\t}\n\n\t\tthis._headerCloseButton = btn;\n\t}\n});\n\n})( jQuery, this );\n\n(function( $, window, undefined ) {\n\n$.widget( \"mobile.dialog\", {\n\toptions: {\n\n\t\t// Accepts left, right and none\n\t\tcloseBtn: \"left\",\n\t\tcloseBtnText: \"Close\",\n\t\toverlayTheme: \"a\",\n\t\tcorners: true\n\t},\n\n\t// Override the theme set by the page plugin on pageshow\n\t_handlePageBeforeShow: function() {\n\t\tthis._isCloseable = true;\n\t\tif ( this.options.overlayTheme ) {\n\t\t\tthis.element\n\t\t\t\t.page( \"removeContainerBackground\" )\n\t\t\t\t.page( \"setContainerBackground\", this.options.overlayTheme );\n\t\t}\n\t},\n\n\t_handlePageBeforeHide: function() {\n\t\tthis._isCloseable = false;\n\t},\n\n\t// click and submit events:\n\t// - clicks and submits should use the closing transition that the dialog\n\t//   opened with unless a data-transition is specified on the link/form\n\t// - if the click was on the close button, or the link has a data-rel=\"back\"\n\t//   it'll go back in history naturally\n\t_handleVClickSubmit: function( event ) {\n\t\tvar attrs,\n\t\t\t$target = $( event.target ).closest( event.type === \"vclick\" ? \"a\" : \"form\" );\n\n\t\tif ( $target.length && !$target.jqmData( \"transition\" ) ) {\n\t\t\tattrs = {};\n\t\t\tattrs[ \"data-\" + $.mobile.ns + \"transition\" ] =\n\t\t\t\t( $.mobile.navigate.history.getActive() || {} )[ \"transition\" ] ||\n\t\t\t\t$.mobile.defaultDialogTransition;\n\t\t\tattrs[ \"data-\" + $.mobile.ns + \"direction\" ] = \"reverse\";\n\t\t\t$target.attr( attrs );\n\t\t}\n\t},\n\n\t_create: function() {\n\t\tvar elem = this.element,\n\t\t\topts = this.options;\n\n\t\t// Class the markup for dialog styling and wrap interior\n\t\telem.addClass( \"ui-dialog\" )\n\t\t\t.wrapInner( $( \"<div/>\", {\n\n\t\t\t\t// ARIA role\n\t\t\t\t\"role\" : \"dialog\",\n\t\t\t\t\"class\" : \"ui-dialog-contain ui-overlay-shadow\" +\n\t\t\t\t\t( !!opts.corners ? \" ui-corner-all\" : \"\" )\n\t\t\t}));\n\n\t\t$.extend( this, {\n\t\t\t_isCloseable: false,\n\t\t\t_inner: elem.children(),\n\t\t\t_headerCloseButton: null\n\t\t});\n\n\t\tthis._on( elem, {\n\t\t\tvclick: \"_handleVClickSubmit\",\n\t\t\tsubmit: \"_handleVClickSubmit\",\n\t\t\tpagebeforeshow: \"_handlePageBeforeShow\",\n\t\t\tpagebeforehide: \"_handlePageBeforeHide\"\n\t\t});\n\n\t\tthis._setCloseBtn( opts.closeBtn );\n\t},\n\n\t_setOptions: function( options ) {\n\t\tvar closeButtonLocation, closeButtonText,\n\t\t\tcurrentOpts = this.options;\n\n\t\tif ( options.corners !== undefined ) {\n\t\t\tthis._inner.toggleClass( \"ui-corner-all\", !!options.corners );\n\t\t}\n\n\t\tif ( options.overlayTheme !== undefined ) {\n\t\t\tif ( $.mobile.activePage[ 0 ] === this.element[ 0 ] ) {\n\t\t\t\tcurrentOpts.overlayTheme = options.overlayTheme;\n\t\t\t\tthis._handlePageBeforeShow();\n\t\t\t}\n\t\t}\n\n\t\tif ( options.closeBtnText !== undefined ) {\n\t\t\tcloseButtonLocation = currentOpts.closeBtn;\n\t\t\tcloseButtonText = options.closeBtnText;\n\t\t}\n\n\t\tif ( options.closeBtn !== undefined ) {\n\t\t\tcloseButtonLocation = options.closeBtn;\n\t\t}\n\n\t\tif ( closeButtonLocation ) {\n\t\t\tthis._setCloseBtn( closeButtonLocation, closeButtonText );\n\t\t}\n\n\t\tthis._super( options );\n\t},\n\n\t_setCloseBtn: function( location, text ) {\n\t\tvar dst,\n\t\t\tbtn = this._headerCloseButton;\n\n\t\t// Sanitize value\n\t\tlocation = \"left\" === location ? \"left\" : \"right\" === location ? \"right\" : \"none\";\n\n\t\tif ( \"none\" === location ) {\n\t\t\tif ( btn ) {\n\t\t\t\tbtn.remove();\n\t\t\t\tbtn = null;\n\t\t\t}\n\t\t} else if ( btn ) {\n\t\t\tbtn.removeClass( \"ui-btn-left ui-btn-right\" ).addClass( \"ui-btn-\" + location );\n\t\t\tif ( text ) {\n\t\t\t\tbtn.text( text );\n\t\t\t}\n\t\t} else {\n\t\t\tdst = this._inner.find( \":jqmData(role='header')\" ).first();\n\t\t\tbtn = $( \"<a></a>\", {\n\t\t\t\t\t\"role\": \"button\",\n\t\t\t\t\t\"href\": \"#\",\n\t\t\t\t\t\"class\": \"ui-btn ui-corner-all ui-icon-delete ui-btn-icon-notext ui-btn-\" + location\n\t\t\t\t})\n\t\t\t\t.text( text || this.options.closeBtnText || \"\" )\n\t\t\t\t.prependTo( dst );\n\t\t\tthis._on( btn, { click: \"close\" } );\n\t\t}\n\n\t\tthis._headerCloseButton = btn;\n\t},\n\n\t// Close method goes back in history\n\tclose: function() {\n\t\tvar hist = $.mobile.navigate.history;\n\n\t\tif ( this._isCloseable ) {\n\t\t\tthis._isCloseable = false;\n\t\t\t// If the hash listening is enabled and there is at least one preceding history\n\t\t\t// entry it's ok to go back. Initial pages with the dialog hash state are an example\n\t\t\t// where the stack check is necessary\n\t\t\tif ( $.mobile.hashListeningEnabled && hist.activeIndex > 0 ) {\n\t\t\t\t$.mobile.back();\n\t\t\t} else {\n\t\t\t\t$.mobile.pageContainer.pagecontainer( \"back\" );\n\t\t\t}\n\t\t}\n\t}\n});\n\n})( jQuery, this );\n\n(function( $, undefined ) {\n\nvar rInitialLetter = /([A-Z])/g,\n\n\t// Construct iconpos class from iconpos value\n\ticonposClass = function( iconpos ) {\n\t\treturn ( \"ui-btn-icon-\" + ( iconpos === null ? \"left\" : iconpos ) );\n\t};\n\n$.widget( \"mobile.collapsible\", {\n\toptions: {\n\t\tenhanced: false,\n\t\texpandCueText: null,\n\t\tcollapseCueText: null,\n\t\tcollapsed: true,\n\t\theading: \"h1,h2,h3,h4,h5,h6,legend\",\n\t\tcollapsedIcon: null,\n\t\texpandedIcon: null,\n\t\ticonpos: null,\n\t\ttheme: null,\n\t\tcontentTheme: null,\n\t\tinset: null,\n\t\tcorners: null,\n\t\tmini: null\n\t},\n\n\t_create: function() {\n\t\tvar elem = this.element,\n\t\t\tui = {\n\t\t\t\taccordion: elem\n\t\t\t\t\t.closest( \":jqmData(role='collapsible-set'),\" +\n\t\t\t\t\t\t\":jqmData(role='collapsibleset')\" +\n\t\t\t\t\t\t( $.mobile.collapsibleset ? \", :mobile-collapsibleset\" :\n\t\t\t\t\t\t\t\"\" ) )\n\t\t\t\t\t.addClass( \"ui-collapsible-set\" )\n\t\t\t};\n\n\t\tthis._ui = ui;\n\t\tthis._renderedOptions = this._getOptions( this.options );\n\n\t\tif ( this.options.enhanced ) {\n\t\t\tui.heading = this.element.children( \".ui-collapsible-heading\" );\n\t\t\tui.content = ui.heading.next();\n\t\t\tui.anchor = ui.heading.children();\n\t\t\tui.status = ui.anchor.children( \".ui-collapsible-heading-status\" );\n\t\t} else {\n\t\t\tthis._enhance( elem, ui );\n\t\t}\n\n\t\tthis._on( ui.heading, {\n\t\t\t\"tap\": function() {\n\t\t\t\tui.heading.find( \"a\" ).first().addClass( $.mobile.activeBtnClass );\n\t\t\t},\n\n\t\t\t\"click\": function( event ) {\n\t\t\t\tthis._handleExpandCollapse( !ui.heading.hasClass( \"ui-collapsible-heading-collapsed\" ) );\n\t\t\t\tevent.preventDefault();\n\t\t\t\tevent.stopPropagation();\n\t\t\t}\n\t\t});\n\t},\n\n\t// Adjust the keys inside options for inherited values\n\t_getOptions: function( options ) {\n\t\tvar key,\n\t\t\taccordion = this._ui.accordion,\n\t\t\taccordionWidget = this._ui.accordionWidget;\n\n\t\t// Copy options\n\t\toptions = $.extend( {}, options );\n\n\t\tif ( accordion.length && !accordionWidget ) {\n\t\t\tthis._ui.accordionWidget =\n\t\t\taccordionWidget = accordion.data( \"mobile-collapsibleset\" );\n\t\t}\n\n\t\tfor ( key in options ) {\n\n\t\t\t// Retrieve the option value first from the options object passed in and, if\n\t\t\t// null, from the parent accordion or, if that's null too, or if there's no\n\t\t\t// parent accordion, then from the defaults.\n\t\t\toptions[ key ] =\n\t\t\t\t( options[ key ] != null ) ? options[ key ] :\n\t\t\t\t( accordionWidget ) ? accordionWidget.options[ key ] :\n\t\t\t\taccordion.length ? $.mobile.getAttribute( accordion[ 0 ],\n\t\t\t\t\tkey.replace( rInitialLetter, \"-$1\" ).toLowerCase() ):\n\t\t\t\tnull;\n\n\t\t\tif ( null == options[ key ] ) {\n\t\t\t\toptions[ key ] = $.mobile.collapsible.defaults[ key ];\n\t\t\t}\n\t\t}\n\n\t\treturn options;\n\t},\n\n\t_themeClassFromOption: function( prefix, value ) {\n\t\treturn ( value ? ( value === \"none\" ? \"\" : prefix + value ) : \"\" );\n\t},\n\n\t_enhance: function( elem, ui ) {\n\t\tvar iconclass,\n\t\t\topts = this._renderedOptions,\n\t\t\tcontentThemeClass = this._themeClassFromOption( \"ui-body-\", opts.contentTheme );\n\n\t\telem.addClass( \"ui-collapsible \" +\n\t\t\t( opts.inset ? \"ui-collapsible-inset \" : \"\" ) +\n\t\t\t( opts.inset && opts.corners ? \"ui-corner-all \" : \"\" ) +\n\t\t\t( contentThemeClass ? \"ui-collapsible-themed-content \" : \"\" ) );\n\t\tui.originalHeading = elem.children( this.options.heading ).first(),\n\t\tui.content = elem\n\t\t\t.wrapInner( \"<div \" +\n\t\t\t\t\"class='ui-collapsible-content \" +\n\t\t\t\tcontentThemeClass + \"'></div>\" )\n\t\t\t.children( \".ui-collapsible-content\" ),\n\t\tui.heading = ui.originalHeading;\n\n\t\t// Replace collapsibleHeading if it's a legend\n\t\tif ( ui.heading.is( \"legend\" ) ) {\n\t\t\tui.heading = $( \"<div role='heading'>\"+ ui.heading.html() +\"</div>\" );\n\t\t\tui.placeholder = $( \"<div><!-- placeholder for legend --></div>\" ).insertBefore( ui.originalHeading );\n\t\t\tui.originalHeading.remove();\n\t\t}\n\n\t\ticonclass = ( opts.collapsed ? ( opts.collapsedIcon ? \"ui-icon-\" + opts.collapsedIcon : \"\" ):\n\t\t\t( opts.expandedIcon ? \"ui-icon-\" + opts.expandedIcon : \"\" ) );\n\n\t\tui.status = $( \"<span class='ui-collapsible-heading-status'></span>\" );\n\t\tui.anchor = ui.heading\n\t\t\t.detach()\n\t\t\t//modify markup & attributes\n\t\t\t.addClass( \"ui-collapsible-heading\" )\n\t\t\t.append( ui.status )\n\t\t\t.wrapInner( \"<a href='#' class='ui-collapsible-heading-toggle'></a>\" )\n\t\t\t.find( \"a\" )\n\t\t\t\t.first()\n\t\t\t\t.addClass( \"ui-btn \" +\n\t\t\t\t\t( iconclass ? iconclass + \" \" : \"\" ) +\n\t\t\t\t\t( iconclass ? iconposClass( opts.iconpos ) +\n\t\t\t\t\t\t\" \" : \"\" ) +\n\t\t\t\t\tthis._themeClassFromOption( \"ui-btn-\", opts.theme ) + \" \" +\n\t\t\t\t\t( opts.mini ? \"ui-mini \" : \"\" ) );\n\n\t\t//drop heading in before content\n\t\tui.heading.insertBefore( ui.content );\n\n\t\tthis._handleExpandCollapse( this.options.collapsed );\n\n\t\treturn ui;\n\t},\n\n\trefresh: function() {\n\t\tthis._applyOptions( this.options );\n\t\tthis._renderedOptions = this._getOptions( this.options );\n\t},\n\n\t_applyOptions: function( options ) {\n\t\tvar isCollapsed, newTheme, oldTheme, hasCorners, hasIcon,\n\t\t\telem = this.element,\n\t\t\tcurrentOpts = this._renderedOptions,\n\t\t\tui = this._ui,\n\t\t\tanchor = ui.anchor,\n\t\t\tstatus = ui.status,\n\t\t\topts = this._getOptions( options );\n\n\t\t// First and foremost we need to make sure the collapsible is in the proper\n\t\t// state, in case somebody decided to change the collapsed option at the\n\t\t// same time as another option\n\t\tif ( options.collapsed !== undefined ) {\n\t\t\tthis._handleExpandCollapse( options.collapsed );\n\t\t}\n\n\t\tisCollapsed = elem.hasClass( \"ui-collapsible-collapsed\" );\n\n\t\t// We only need to apply the cue text for the current state right away.\n\t\t// The cue text for the alternate state will be stored in the options\n\t\t// and applied the next time the collapsible's state is toggled\n\t\tif ( isCollapsed ) {\n\t\t\tif ( opts.expandCueText !== undefined ) {\n\t\t\t\tstatus.text( opts.expandCueText );\n\t\t\t}\n\t\t} else {\n\t\t\tif ( opts.collapseCueText !== undefined ) {\n\t\t\t\tstatus.text( opts.collapseCueText );\n\t\t\t}\n\t\t}\n\n\t\t// Update icon\n\n\t\t// Is it supposed to have an icon?\n\t\thasIcon =\n\n\t\t\t// If the collapsedIcon is being set, consult that\n\t\t\t( opts.collapsedIcon !== undefined ? opts.collapsedIcon !== false :\n\n\t\t\t\t// Otherwise consult the existing option value\n\t\t\t\tcurrentOpts.collapsedIcon !== false );\n\n\n\t\t// If any icon-related options have changed, make sure the new icon\n\t\t// state is reflected by first removing all icon-related classes\n\t\t// reflecting the current state and then adding all icon-related\n\t\t// classes for the new state\n\t\tif ( !( opts.iconpos === undefined &&\n\t\t\topts.collapsedIcon === undefined &&\n\t\t\topts.expandedIcon === undefined ) ) {\n\n\t\t\t// Remove all current icon-related classes\n\t\t\tanchor.removeClass( [ iconposClass( currentOpts.iconpos ) ]\n\t\t\t\t.concat( ( currentOpts.expandedIcon ?\n\t\t\t\t\t[ \"ui-icon-\" + currentOpts.expandedIcon ] : [] ) )\n\t\t\t\t.concat( ( currentOpts.collapsedIcon ?\n\t\t\t\t\t[ \"ui-icon-\" + currentOpts.collapsedIcon ] : [] ) )\n\t\t\t\t.join( \" \" ) );\n\n\t\t\t// Add new classes if an icon is supposed to be present\n\t\t\tif ( hasIcon ) {\n\t\t\t\tanchor.addClass(\n\t\t\t\t\t[ iconposClass( opts.iconpos !== undefined ?\n\t\t\t\t\t\topts.iconpos : currentOpts.iconpos ) ]\n\t\t\t\t\t\t.concat( isCollapsed ?\n\t\t\t\t\t\t\t[ \"ui-icon-\" + ( opts.collapsedIcon !== undefined ?\n\t\t\t\t\t\t\t\topts.collapsedIcon :\n\t\t\t\t\t\t\t\tcurrentOpts.collapsedIcon ) ] :\n\t\t\t\t\t\t\t[ \"ui-icon-\" + ( opts.expandedIcon !== undefined ?\n\t\t\t\t\t\t\t\topts.expandedIcon :\n\t\t\t\t\t\t\t\tcurrentOpts.expandedIcon ) ] )\n\t\t\t\t\t\t.join( \" \" ) );\n\t\t\t}\n\t\t}\n\n\t\tif ( opts.theme !== undefined ) {\n\t\t\toldTheme = this._themeClassFromOption( \"ui-btn-\", currentOpts.theme );\n\t\t\tnewTheme = this._themeClassFromOption( \"ui-btn-\", opts.theme );\n\t\t\tanchor.removeClass( oldTheme ).addClass( newTheme );\n\t\t}\n\n\t\tif ( opts.contentTheme !== undefined ) {\n\t\t\toldTheme = this._themeClassFromOption( \"ui-body-\",\n\t\t\t\tcurrentOpts.contentTheme );\n\t\t\tnewTheme = this._themeClassFromOption( \"ui-body-\",\n\t\t\t\topts.contentTheme );\n\t\t\tui.content.removeClass( oldTheme ).addClass( newTheme );\n\t\t}\n\n\t\tif ( opts.inset !== undefined ) {\n\t\t\telem.toggleClass( \"ui-collapsible-inset\", opts.inset );\n\t\t\thasCorners = !!( opts.inset && ( opts.corners || currentOpts.corners ) );\n\t\t}\n\n\t\tif ( opts.corners !== undefined ) {\n\t\t\thasCorners = !!( opts.corners && ( opts.inset || currentOpts.inset ) );\n\t\t}\n\n\t\tif ( hasCorners !== undefined ) {\n\t\t\telem.toggleClass( \"ui-corner-all\", hasCorners );\n\t\t}\n\n\t\tif ( opts.mini !== undefined ) {\n\t\t\tanchor.toggleClass( \"ui-mini\", opts.mini );\n\t\t}\n\t},\n\n\t_setOptions: function( options ) {\n\t\tthis._applyOptions( options );\n\t\tthis._super( options );\n\t\tthis._renderedOptions = this._getOptions( this.options );\n\t},\n\n\t_handleExpandCollapse: function( isCollapse ) {\n\t\tvar opts = this._renderedOptions,\n\t\t\tui = this._ui;\n\n\t\tui.status.text( isCollapse ? opts.expandCueText : opts.collapseCueText );\n\t\tui.heading\n\t\t\t.toggleClass( \"ui-collapsible-heading-collapsed\", isCollapse )\n\t\t\t.find( \"a\" ).first()\n\t\t\t.toggleClass( \"ui-icon-\" + opts.expandedIcon, !isCollapse )\n\n\t\t\t// logic or cause same icon for expanded/collapsed state would remove the ui-icon-class\n\t\t\t.toggleClass( \"ui-icon-\" + opts.collapsedIcon, ( isCollapse || opts.expandedIcon === opts.collapsedIcon ) )\n\t\t\t.removeClass( $.mobile.activeBtnClass );\n\n\t\tthis.element.toggleClass( \"ui-collapsible-collapsed\", isCollapse );\n\t\tui.content\n\t\t\t.toggleClass( \"ui-collapsible-content-collapsed\", isCollapse )\n\t\t\t.attr( \"aria-hidden\", isCollapse )\n\t\t\t.trigger( \"updatelayout\" );\n\t\tthis.options.collapsed = isCollapse;\n\t\tthis._trigger( isCollapse ? \"collapse\" : \"expand\" );\n\t},\n\n\texpand: function() {\n\t\tthis._handleExpandCollapse( false );\n\t},\n\n\tcollapse: function() {\n\t\tthis._handleExpandCollapse( true );\n\t},\n\n\t_destroy: function() {\n\t\tvar ui = this._ui,\n\t\t\topts = this.options;\n\n\t\tif ( opts.enhanced ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( ui.placeholder ) {\n\t\t\tui.originalHeading.insertBefore( ui.placeholder );\n\t\t\tui.placeholder.remove();\n\t\t\tui.heading.remove();\n\t\t} else {\n\t\t\tui.status.remove();\n\t\t\tui.heading\n\t\t\t\t.removeClass( \"ui-collapsible-heading ui-collapsible-heading-collapsed\" )\n\t\t\t\t.children()\n\t\t\t\t\t.contents()\n\t\t\t\t\t\t.unwrap();\n\t\t}\n\n\t\tui.anchor.contents().unwrap();\n\t\tui.content.contents().unwrap();\n\t\tthis.element\n\t\t\t.removeClass( \"ui-collapsible ui-collapsible-collapsed \" +\n\t\t\t\t\"ui-collapsible-themed-content ui-collapsible-inset ui-corner-all\" );\n\t}\n});\n\n// Defaults to be used by all instances of collapsible if per-instance values\n// are unset or if nothing is specified by way of inheritance from an accordion.\n// Note that this hash does not contain options \"collapsed\" or \"heading\",\n// because those are not inheritable.\n$.mobile.collapsible.defaults = {\n\texpandCueText: \" click to expand contents\",\n\tcollapseCueText: \" click to collapse contents\",\n\tcollapsedIcon: \"plus\",\n\tcontentTheme: \"inherit\",\n\texpandedIcon: \"minus\",\n\ticonpos: \"left\",\n\tinset: true,\n\tcorners: true,\n\ttheme: \"inherit\",\n\tmini: false\n};\n\n})( jQuery );\n\n(function( $, undefined ) {\n\nvar uiScreenHiddenRegex = /\\bui-screen-hidden\\b/;\nfunction noHiddenClass( elements ) {\n\tvar index,\n\t\tlength = elements.length,\n\t\tresult = [];\n\n\tfor ( index = 0; index < length; index++ ) {\n\t\tif ( !elements[ index ].className.match( uiScreenHiddenRegex ) ) {\n\t\t\tresult.push( elements[ index ] );\n\t\t}\n\t}\n\n\treturn $( result );\n}\n\n$.mobile.behaviors.addFirstLastClasses = {\n\t_getVisibles: function( $els, create ) {\n\t\tvar visibles;\n\n\t\tif ( create ) {\n\t\t\tvisibles = noHiddenClass( $els );\n\t\t} else {\n\t\t\tvisibles = $els.filter( \":visible\" );\n\t\t\tif ( visibles.length === 0 ) {\n\t\t\t\tvisibles = noHiddenClass( $els );\n\t\t\t}\n\t\t}\n\n\t\treturn visibles;\n\t},\n\n\t_addFirstLastClasses: function( $els, $visibles, create ) {\n\t\t$els.removeClass( \"ui-first-child ui-last-child\" );\n\t\t$visibles.eq( 0 ).addClass( \"ui-first-child\" ).end().last().addClass( \"ui-last-child\" );\n\t\tif ( !create ) {\n\t\t\tthis.element.trigger( \"updatelayout\" );\n\t\t}\n\t},\n\n\t_removeFirstLastClasses: function( $els ) {\n\t\t$els.removeClass( \"ui-first-child ui-last-child\" );\n\t}\n};\n\n})( jQuery );\n\n(function( $, undefined ) {\n\nvar childCollapsiblesSelector = \":mobile-collapsible, \" + $.mobile.collapsible.initSelector;\n\n$.widget( \"mobile.collapsibleset\", $.extend( {\n\n\t// The initSelector is deprecated as of 1.4.0. In 1.5.0 we will use\n\t// :jqmData(role='collapsibleset') which will allow us to get rid of the line\n\t// below altogether, because the autoinit will generate such an initSelector\n\tinitSelector: \":jqmData(role='collapsible-set'),:jqmData(role='collapsibleset')\",\n\n\toptions: $.extend( {\n\t\tenhanced: false\n\t}, $.mobile.collapsible.defaults ),\n\n\t_handleCollapsibleExpand: function( event ) {\n\t\tvar closestCollapsible = $( event.target ).closest( \".ui-collapsible\" );\n\n\t\tif ( closestCollapsible.parent().is( \":mobile-collapsibleset, :jqmData(role='collapsible-set')\" ) ) {\n\t\t\tclosestCollapsible\n\t\t\t\t.siblings( \".ui-collapsible:not(.ui-collapsible-collapsed)\" )\n\t\t\t\t.collapsible( \"collapse\" );\n\t\t}\n\t},\n\n\t_create: function() {\n\t\tvar elem = this.element,\n\t\t\topts = this.options;\n\n\t\t$.extend( this, {\n\t\t\t_classes: \"\"\n\t\t});\n\n\t\tif ( !opts.enhanced ) {\n\t\t\telem.addClass( \"ui-collapsible-set \" +\n\t\t\t\tthis._themeClassFromOption( \"ui-group-theme-\", opts.theme ) + \" \" +\n\t\t\t\t( opts.corners && opts.inset ? \"ui-corner-all \" : \"\" ) );\n\t\t\tthis.element.find( $.mobile.collapsible.initSelector ).collapsible();\n\t\t}\n\n\t\tthis._on( elem, { collapsibleexpand: \"_handleCollapsibleExpand\" } );\n\t},\n\n\t_themeClassFromOption: function( prefix, value ) {\n\t\treturn ( value ? ( value === \"none\" ? \"\" : prefix + value ) : \"\" );\n\t},\n\n\t_init: function() {\n\t\tthis._refresh( true );\n\n\t\t// Because the corners are handled by the collapsible itself and the default state is collapsed\n\t\t// That was causing https://github.com/jquery/jquery-mobile/issues/4116\n\t\tthis.element\n\t\t\t.children( childCollapsiblesSelector )\n\t\t\t.filter( \":jqmData(collapsed='false')\" )\n\t\t\t.collapsible( \"expand\" );\n\t},\n\n\t_setOptions: function( options ) {\n\t\tvar ret, hasCorners,\n\t\t\telem = this.element,\n\t\t\tthemeClass = this._themeClassFromOption( \"ui-group-theme-\", options.theme );\n\n\t\tif ( themeClass ) {\n\t\t\telem\n\t\t\t\t.removeClass( this._themeClassFromOption( \"ui-group-theme-\", this.options.theme ) )\n\t\t\t\t.addClass( themeClass );\n\t\t}\n\n\t\tif ( options.inset !== undefined ) {\n\t\t\thasCorners = !!( options.inset && ( options.corners || this.options.corners ) );\n\t\t}\n\n\t\tif ( options.corners !== undefined ) {\n\t\t\thasCorners = !!( options.corners && ( options.inset || this.options.inset ) );\n\t\t}\n\n\t\tif ( hasCorners !== undefined ) {\n\t\t\telem.toggleClass( \"ui-corner-all\", hasCorners );\n\t\t}\n\n\t\tret = this._super( options );\n\t\tthis.element.children( \":mobile-collapsible\" ).collapsible( \"refresh\" );\n\t\treturn ret;\n\t},\n\n\t_destroy: function() {\n\t\tvar el = this.element;\n\n\t\tthis._removeFirstLastClasses( el.children( childCollapsiblesSelector ) );\n\t\tel\n\t\t\t.removeClass( \"ui-collapsible-set ui-corner-all \" +\n\t\t\t\tthis._themeClassFromOption( \"ui-group-theme-\", this.options.theme ) )\n\t\t\t.children( \":mobile-collapsible\" )\n\t\t\t.collapsible( \"destroy\" );\n\t},\n\n\t_refresh: function( create ) {\n\t\tvar collapsiblesInSet = this.element.children( childCollapsiblesSelector );\n\n\t\tthis.element.find( $.mobile.collapsible.initSelector ).not( \".ui-collapsible\" ).collapsible();\n\n\t\tthis._addFirstLastClasses( collapsiblesInSet, this._getVisibles( collapsiblesInSet, create ), create );\n\t},\n\n\trefresh: function() {\n\t\tthis._refresh( false );\n\t}\n}, $.mobile.behaviors.addFirstLastClasses ) );\n\n})( jQuery );\n\n(function( $, undefined ) {\n\n// Deprecated in 1.4\n$.fn.fieldcontain = function(/* options */) {\n\treturn this.addClass( \"ui-field-contain\" );\n};\n\n})( jQuery );\n\n(function( $, undefined ) {\n\n$.fn.grid = function( options ) {\n\treturn this.each(function() {\n\n\t\tvar $this = $( this ),\n\t\t\to = $.extend({\n\t\t\t\tgrid: null\n\t\t\t}, options ),\n\t\t\t$kids = $this.children(),\n\t\t\tgridCols = { solo:1, a:2, b:3, c:4, d:5 },\n\t\t\tgrid = o.grid,\n\t\t\titerator,\n\t\t\tletter;\n\n\t\t\tif ( !grid ) {\n\t\t\t\tif ( $kids.length <= 5 ) {\n\t\t\t\t\tfor ( letter in gridCols ) {\n\t\t\t\t\t\tif ( gridCols[ letter ] === $kids.length ) {\n\t\t\t\t\t\t\tgrid = letter;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tgrid = \"a\";\n\t\t\t\t\t$this.addClass( \"ui-grid-duo\" );\n\t\t\t\t}\n\t\t\t}\n\t\t\titerator = gridCols[grid];\n\n\t\t$this.addClass( \"ui-grid-\" + grid );\n\n\t\t$kids.filter( \":nth-child(\" + iterator + \"n+1)\" ).addClass( \"ui-block-a\" );\n\n\t\tif ( iterator > 1 ) {\n\t\t\t$kids.filter( \":nth-child(\" + iterator + \"n+2)\" ).addClass( \"ui-block-b\" );\n\t\t}\n\t\tif ( iterator > 2 ) {\n\t\t\t$kids.filter( \":nth-child(\" + iterator + \"n+3)\" ).addClass( \"ui-block-c\" );\n\t\t}\n\t\tif ( iterator > 3 ) {\n\t\t\t$kids.filter( \":nth-child(\" + iterator + \"n+4)\" ).addClass( \"ui-block-d\" );\n\t\t}\n\t\tif ( iterator > 4 ) {\n\t\t\t$kids.filter( \":nth-child(\" + iterator + \"n+5)\" ).addClass( \"ui-block-e\" );\n\t\t}\n\t});\n};\n})( jQuery );\n\n(function( $, undefined ) {\n\n$.widget( \"mobile.navbar\", {\n\toptions: {\n\t\ticonpos: \"top\",\n\t\tgrid: null\n\t},\n\n\t_create: function() {\n\n\t\tvar $navbar = this.element,\n\t\t\t$navbtns = $navbar.find( \"a, button\" ),\n\t\t\ticonpos = $navbtns.filter( \":jqmData(icon)\" ).length ? this.options.iconpos : undefined;\n\n\t\t$navbar.addClass( \"ui-navbar\" )\n\t\t\t.attr( \"role\", \"navigation\" )\n\t\t\t.find( \"ul\" )\n\t\t\t.jqmEnhanceable()\n\t\t\t.grid({ grid: this.options.grid });\n\n\t\t$navbtns\n\t\t\t.each( function() {\n\t\t\t\tvar icon = $.mobile.getAttribute( this, \"icon\" ),\n\t\t\t\t\ttheme = $.mobile.getAttribute( this, \"theme\" ),\n\t\t\t\t\tclasses = \"ui-btn\";\n\n\t\t\t\tif ( theme ) {\n\t\t\t\t\tclasses += \" ui-btn-\" + theme;\n\t\t\t\t}\n\t\t\t\tif ( icon ) {\n\t\t\t\t\tclasses += \" ui-icon-\" + icon + \" ui-btn-icon-\" + iconpos;\n\t\t\t\t}\n\t\t\t\t$( this ).addClass( classes );\n\t\t\t});\n\n\t\t$navbar.delegate( \"a\", \"vclick\", function( /* event */ ) {\n\t\t\tvar activeBtn = $( this );\n\n\t\t\tif ( !( activeBtn.hasClass( \"ui-state-disabled\" ) ||\n\n\t\t\t\t// DEPRECATED as of 1.4.0 - remove after 1.4.0 release\n\t\t\t\t// only ui-state-disabled should be present thereafter\n\t\t\t\tactiveBtn.hasClass( \"ui-disabled\" ) ||\n\t\t\t\tactiveBtn.hasClass( $.mobile.activeBtnClass ) ) ) {\n\n\t\t\t\t$navbtns.removeClass( $.mobile.activeBtnClass );\n\t\t\t\tactiveBtn.addClass( $.mobile.activeBtnClass );\n\n\t\t\t\t// The code below is a workaround to fix #1181\n\t\t\t\t$( document ).one( \"pagehide\", function() {\n\t\t\t\t\tactiveBtn.removeClass( $.mobile.activeBtnClass );\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\n\t\t// Buttons in the navbar with ui-state-persist class should regain their active state before page show\n\t\t$navbar.closest( \".ui-page\" ).bind( \"pagebeforeshow\", function() {\n\t\t\t$navbtns.filter( \".ui-state-persist\" ).addClass( $.mobile.activeBtnClass );\n\t\t});\n\t}\n});\n\n})( jQuery );\n\n(function( $, undefined ) {\n\nvar getAttr = $.mobile.getAttribute;\n\n$.widget( \"mobile.listview\", $.extend( {\n\n\toptions: {\n\t\ttheme: null,\n\t\tcountTheme: null, /* Deprecated in 1.4 */\n\t\tdividerTheme: null,\n\t\ticon: \"carat-r\",\n\t\tsplitIcon: \"carat-r\",\n\t\tsplitTheme: null,\n\t\tcorners: true,\n\t\tshadow: true,\n\t\tinset: false\n\t},\n\n\t_create: function() {\n\t\tvar t = this,\n\t\t\tlistviewClasses = \"\";\n\n\t\tlistviewClasses += t.options.inset ? \" ui-listview-inset\" : \"\";\n\n\t\tif ( !!t.options.inset ) {\n\t\t\tlistviewClasses += t.options.corners ? \" ui-corner-all\" : \"\";\n\t\t\tlistviewClasses += t.options.shadow ? \" ui-shadow\" : \"\";\n\t\t}\n\n\t\t// create listview markup\n\t\tt.element.addClass( \" ui-listview\" + listviewClasses );\n\n\t\tt.refresh( true );\n\t},\n\n\t// TODO: Remove in 1.5\n\t_findFirstElementByTagName: function( ele, nextProp, lcName, ucName ) {\n\t\tvar dict = {};\n\t\tdict[ lcName ] = dict[ ucName ] = true;\n\t\twhile ( ele ) {\n\t\t\tif ( dict[ ele.nodeName ] ) {\n\t\t\t\treturn ele;\n\t\t\t}\n\t\t\tele = ele[ nextProp ];\n\t\t}\n\t\treturn null;\n\t},\n\t// TODO: Remove in 1.5\n\t_addThumbClasses: function( containers ) {\n\t\tvar i, img, len = containers.length;\n\t\tfor ( i = 0; i < len; i++ ) {\n\t\t\timg = $( this._findFirstElementByTagName( containers[ i ].firstChild, \"nextSibling\", \"img\", \"IMG\" ) );\n\t\t\tif ( img.length ) {\n\t\t\t\t$( this._findFirstElementByTagName( img[ 0 ].parentNode, \"parentNode\", \"li\", \"LI\" ) ).addClass( img.hasClass( \"ui-li-icon\" ) ? \"ui-li-has-icon\" : \"ui-li-has-thumb\" );\n\t\t\t}\n\t\t}\n\t},\n\n\t_getChildrenByTagName: function( ele, lcName, ucName ) {\n\t\tvar results = [],\n\t\t\tdict = {};\n\t\tdict[ lcName ] = dict[ ucName ] = true;\n\t\tele = ele.firstChild;\n\t\twhile ( ele ) {\n\t\t\tif ( dict[ ele.nodeName ] ) {\n\t\t\t\tresults.push( ele );\n\t\t\t}\n\t\t\tele = ele.nextSibling;\n\t\t}\n\t\treturn $( results );\n\t},\n\n\t_beforeListviewRefresh: $.noop,\n\t_afterListviewRefresh: $.noop,\n\n\trefresh: function( create ) {\n\t\tvar buttonClass, pos, numli, item, itemClass, itemTheme, itemIcon, icon, a,\n\t\t\tisDivider, startCount, newStartCount, value, last, splittheme, splitThemeClass, spliticon,\n\t\t\taltButtonClass, dividerTheme, li,\n\t\t\to = this.options,\n\t\t\t$list = this.element,\n\t\t\tol = !!$.nodeName( $list[ 0 ], \"ol\" ),\n\t\t\tstart = $list.attr( \"start\" ),\n\t\t\titemClassDict = {},\n\t\t\tcountBubbles = $list.find( \".ui-li-count\" ),\n\t\t\tcountTheme = getAttr( $list[ 0 ], \"counttheme\" ) || this.options.countTheme,\n\t\t\tcountThemeClass = countTheme ? \"ui-body-\" + countTheme : \"ui-body-inherit\";\n\n\t\tif ( o.theme ) {\n\t\t\t$list.addClass( \"ui-group-theme-\" + o.theme );\n\t\t}\n\n\t\t// Check if a start attribute has been set while taking a value of 0 into account\n\t\tif ( ol && ( start || start === 0 ) ) {\n\t\t\tstartCount = parseInt( start, 10 ) - 1;\n\t\t\t$list.css( \"counter-reset\", \"listnumbering \" + startCount );\n\t\t}\n\n\t\tthis._beforeListviewRefresh();\n\n\t\tli = this._getChildrenByTagName( $list[ 0 ], \"li\", \"LI\" );\n\n\t\tfor ( pos = 0, numli = li.length; pos < numli; pos++ ) {\n\t\t\titem = li.eq( pos );\n\t\t\titemClass = \"\";\n\n\t\t\tif ( create || item[ 0 ].className.search( /\\bui-li-static\\b|\\bui-li-divider\\b/ ) < 0 ) {\n\t\t\t\ta = this._getChildrenByTagName( item[ 0 ], \"a\", \"A\" );\n\t\t\t\tisDivider = ( getAttr( item[ 0 ], \"role\" ) === \"list-divider\" );\n\t\t\t\tvalue = item.attr( \"value\" );\n\t\t\t\titemTheme = getAttr( item[ 0 ], \"theme\" );\n\n\t\t\t\tif ( a.length && a[ 0 ].className.search( /\\bui-btn\\b/ ) < 0 && !isDivider ) {\n\t\t\t\t\titemIcon = getAttr( item[ 0 ], \"icon\" );\n\t\t\t\t\ticon = ( itemIcon === false ) ? false : ( itemIcon || o.icon );\n\n\t\t\t\t\t// TODO: Remove in 1.5 together with links.js (links.js / .ui-link deprecated in 1.4)\n\t\t\t\t\ta.removeClass( \"ui-link\" );\n\n\t\t\t\t\tbuttonClass = \"ui-btn\";\n\n\t\t\t\t\tif ( itemTheme ) {\n\t\t\t\t\t\tbuttonClass += \" ui-btn-\" + itemTheme;\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( a.length > 1 ) {\n\t\t\t\t\t\titemClass = \"ui-li-has-alt\";\n\n\t\t\t\t\t\tlast = a.last();\n\t\t\t\t\t\tsplittheme = getAttr( last[ 0 ], \"theme\" ) || o.splitTheme || getAttr( item[ 0 ], \"theme\", true );\n\t\t\t\t\t\tsplitThemeClass = splittheme ? \" ui-btn-\" + splittheme : \"\";\n\t\t\t\t\t\tspliticon = getAttr( last[ 0 ], \"icon\" ) || getAttr( item[ 0 ], \"icon\" ) || o.splitIcon;\n\t\t\t\t\t\taltButtonClass = \"ui-btn ui-btn-icon-notext ui-icon-\" + spliticon + splitThemeClass;\n\n\t\t\t\t\t\tlast\n\t\t\t\t\t\t\t.attr( \"title\", $.trim( last.getEncodedText() ) )\n\t\t\t\t\t\t\t.addClass( altButtonClass )\n\t\t\t\t\t\t\t.empty();\n\n\t\t\t\t\t\t// Reduce to the first anchor, because only the first gets the buttonClass\n\t\t\t\t\t\ta = a.first();\n\t\t\t\t\t} else if ( icon ) {\n\t\t\t\t\t\tbuttonClass += \" ui-btn-icon-right ui-icon-\" + icon;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Apply buttonClass to the (first) anchor\n\t\t\t\t\ta.addClass( buttonClass );\n\t\t\t\t} else if ( isDivider ) {\n\t\t\t\t\tdividerTheme = ( getAttr( item[ 0 ], \"theme\" ) || o.dividerTheme || o.theme );\n\n\t\t\t\t\titemClass = \"ui-li-divider ui-bar-\" + ( dividerTheme ? dividerTheme : \"inherit\" );\n\n\t\t\t\t\titem.attr( \"role\", \"heading\" );\n\t\t\t\t} else if ( a.length <= 0 ) {\n\t\t\t\t\titemClass = \"ui-li-static ui-body-\" + ( itemTheme ? itemTheme : \"inherit\" );\n\t\t\t\t}\n\t\t\t\tif ( ol && value ) {\n\t\t\t\t\tnewStartCount = parseInt( value , 10 ) - 1;\n\n\t\t\t\t\titem.css( \"counter-reset\", \"listnumbering \" + newStartCount );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Instead of setting item class directly on the list item\n\t\t\t// at this point in time, push the item into a dictionary\n\t\t\t// that tells us what class to set on it so we can do this after this\n\t\t\t// processing loop is finished.\n\n\t\t\tif ( !itemClassDict[ itemClass ] ) {\n\t\t\t\titemClassDict[ itemClass ] = [];\n\t\t\t}\n\n\t\t\titemClassDict[ itemClass ].push( item[ 0 ] );\n\t\t}\n\n\t\t// Set the appropriate listview item classes on each list item.\n\t\t// The main reason we didn't do this\n\t\t// in the for-loop above is because we can eliminate per-item function overhead\n\t\t// by calling addClass() and children() once or twice afterwards. This\n\t\t// can give us a significant boost on platforms like WP7.5.\n\n\t\tfor ( itemClass in itemClassDict ) {\n\t\t\t$( itemClassDict[ itemClass ] ).addClass( itemClass );\n\t\t}\n\n\t\tcountBubbles.each( function() {\n\t\t\t$( this ).closest( \"li\" ).addClass( \"ui-li-has-count\" );\n\t\t});\n\t\tif ( countThemeClass ) {\n\t\t\tcountBubbles.not( \"[class*='ui-body-']\" ).addClass( countThemeClass );\n\t\t}\n\n\t\t// Deprecated in 1.4. From 1.5 you have to add class ui-li-has-thumb or ui-li-has-icon to the LI.\n\t\tthis._addThumbClasses( li );\n\t\tthis._addThumbClasses( li.find( \".ui-btn\" ) );\n\n\t\tthis._afterListviewRefresh();\n\n\t\tthis._addFirstLastClasses( li, this._getVisibles( li, create ), create );\n\t}\n}, $.mobile.behaviors.addFirstLastClasses ) );\n\n})( jQuery );\n\n(function( $, undefined ) {\n\nfunction defaultAutodividersSelector( elt ) {\n\t// look for the text in the given element\n\tvar text = $.trim( elt.text() ) || null;\n\n\tif ( !text ) {\n\t\treturn null;\n\t}\n\n\t// create the text for the divider (first uppercased letter)\n\ttext = text.slice( 0, 1 ).toUpperCase();\n\n\treturn text;\n}\n\n$.widget( \"mobile.listview\", $.mobile.listview, {\n\toptions: {\n\t\tautodividers: false,\n\t\tautodividersSelector: defaultAutodividersSelector\n\t},\n\n\t_beforeListviewRefresh: function() {\n\t\tif ( this.options.autodividers ) {\n\t\t\tthis._replaceDividers();\n\t\t\tthis._superApply( arguments );\n\t\t}\n\t},\n\n\t_replaceDividers: function() {\n\t\tvar i, lis, li, dividerText,\n\t\t\tlastDividerText = null,\n\t\t\tlist = this.element,\n\t\t\tdivider;\n\n\t\tlist.children( \"li:jqmData(role='list-divider')\" ).remove();\n\n\t\tlis = list.children( \"li\" );\n\n\t\tfor ( i = 0; i < lis.length ; i++ ) {\n\t\t\tli = lis[ i ];\n\t\t\tdividerText = this.options.autodividersSelector( $( li ) );\n\n\t\t\tif ( dividerText && lastDividerText !== dividerText ) {\n\t\t\t\tdivider = document.createElement( \"li\" );\n\t\t\t\tdivider.appendChild( document.createTextNode( dividerText ) );\n\t\t\t\tdivider.setAttribute( \"data-\" + $.mobile.ns + \"role\", \"list-divider\" );\n\t\t\t\tli.parentNode.insertBefore( divider, li );\n\t\t\t}\n\n\t\t\tlastDividerText = dividerText;\n\t\t}\n\t}\n});\n\n})( jQuery );\n\n(function( $, undefined ) {\n\nvar rdivider = /(^|\\s)ui-li-divider($|\\s)/,\n\trhidden = /(^|\\s)ui-screen-hidden($|\\s)/;\n\n$.widget( \"mobile.listview\", $.mobile.listview, {\n\toptions: {\n\t\thideDividers: false\n\t},\n\n\t_afterListviewRefresh: function() {\n\t\tvar items, idx, item, hideDivider = true;\n\n\t\tthis._superApply( arguments );\n\n\t\tif ( this.options.hideDividers ) {\n\t\t\titems = this._getChildrenByTagName( this.element[ 0 ], \"li\", \"LI\" );\n\t\t\tfor ( idx = items.length - 1 ; idx > -1 ; idx-- ) {\n\t\t\t\titem = items[ idx ];\n\t\t\t\tif ( item.className.match( rdivider ) ) {\n\t\t\t\t\tif ( hideDivider ) {\n\t\t\t\t\t\titem.className = item.className + \" ui-screen-hidden\";\n\t\t\t\t\t}\n\t\t\t\t\thideDivider = true;\n\t\t\t\t} else {\n\t\t\t\t\tif ( !item.className.match( rhidden ) ) {\n\t\t\t\t\t\thideDivider = false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n});\n\n})( jQuery );\n\n(function( $, undefined ) {\n\n$.mobile.nojs = function( target ) {\n\t$( \":jqmData(role='nojs')\", target ).addClass( \"ui-nojs\" );\n};\n\n})( jQuery );\n\n(function( $, undefined ) {\n\n$.mobile.behaviors.formReset = {\n\t_handleFormReset: function() {\n\t\tthis._on( this.element.closest( \"form\" ), {\n\t\t\treset: function() {\n\t\t\t\tthis._delay( \"_reset\" );\n\t\t\t}\n\t\t});\n\t}\n};\n\n})( jQuery );\n\n/*\n* \"checkboxradio\" plugin\n*/\n\n(function( $, undefined ) {\n\nvar escapeId = $.mobile.path.hashToSelector;\n\n$.widget( \"mobile.checkboxradio\", $.extend( {\n\n\tinitSelector: \"input:not( :jqmData(role='flipswitch' ) )[type='checkbox'],input[type='radio']:not( :jqmData(role='flipswitch' ))\",\n\n\toptions: {\n\t\ttheme: \"inherit\",\n\t\tmini: false,\n\t\twrapperClass: null,\n\t\tenhanced: false,\n\t\ticonpos: \"left\"\n\n\t},\n\t_create: function() {\n\t\tvar input = this.element,\n\t\t\to = this.options,\n\t\t\tinheritAttr = function( input, dataAttr ) {\n\t\t\t\treturn input.jqmData( dataAttr ) ||\n\t\t\t\t\tinput.closest( \"form, fieldset\" ).jqmData( dataAttr );\n\t\t\t},\n\t\t\tlabel = this.options.enhanced ?\n\t\t\t\t{\n\t\t\t\t\telement: this.element.siblings( \"label\" ),\n\t\t\t\t\tisParent: false\n\t\t\t\t} :\n\t\t\t\tthis._findLabel(),\n\t\t\tinputtype = input[0].type,\n\t\t\tcheckedClass = \"ui-\" + inputtype + \"-on\",\n\t\t\tuncheckedClass = \"ui-\" + inputtype + \"-off\";\n\n\t\tif ( inputtype !== \"checkbox\" && inputtype !== \"radio\" ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( this.element[0].disabled ) {\n\t\t\tthis.options.disabled = true;\n\t\t}\n\n\t\to.iconpos = inheritAttr( input, \"iconpos\" ) ||\n\t\t\tlabel.element.attr( \"data-\" + $.mobile.ns + \"iconpos\" ) || o.iconpos,\n\n\t\t// Establish options\n\t\to.mini = inheritAttr( input, \"mini\" ) || o.mini;\n\n\t\t// Expose for other methods\n\t\t$.extend( this, {\n\t\t\tinput: input,\n\t\t\tlabel: label.element,\n\t\t\tlabelIsParent: label.isParent,\n\t\t\tinputtype: inputtype,\n\t\t\tcheckedClass: checkedClass,\n\t\t\tuncheckedClass: uncheckedClass\n\t\t});\n\n\t\tif ( !this.options.enhanced ) {\n\t\t\tthis._enhance();\n\t\t}\n\n\t\tthis._on( label.element, {\n\t\t\tvmouseover: \"_handleLabelVMouseOver\",\n\t\t\tvclick: \"_handleLabelVClick\"\n\t\t});\n\n\t\tthis._on( input, {\n\t\t\tvmousedown: \"_cacheVals\",\n\t\t\tvclick: \"_handleInputVClick\",\n\t\t\tfocus: \"_handleInputFocus\",\n\t\t\tblur: \"_handleInputBlur\"\n\t\t});\n\n\t\tthis._handleFormReset();\n\t\tthis.refresh();\n\t},\n\n\t_findLabel: function() {\n\t\tvar parentLabel, label, isParent,\n\t\t\tinput = this.element,\n\t\t\tlabelsList = input[ 0 ].labels;\n\n\t\tif( labelsList && labelsList.length > 0 ) {\n\t\t\tlabel = $( labelsList[ 0 ] );\n\t\t\tisParent = $.contains( label[ 0 ], input[ 0 ] );\n\t\t} else {\n\t\t\tparentLabel = input.closest( \"label\" );\n\t\t\tisParent = ( parentLabel.length > 0 );\n\n\t\t\t// NOTE: Windows Phone could not find the label through a selector\n\t\t\t// filter works though.\n\t\t\tlabel = isParent ? parentLabel :\n\t\t\t\t$( this.document[ 0 ].getElementsByTagName( \"label\" ) )\n\t\t\t\t\t.filter( \"[for='\" + escapeId( input[ 0 ].id ) + \"']\" )\n\t\t\t\t\t.first();\n\t\t}\n\n\t\treturn {\n\t\t\telement: label,\n\t\t\tisParent: isParent\n\t\t};\n\t},\n\n\t_enhance: function() {\n\t\tthis.label.addClass( \"ui-btn ui-corner-all\");\n\n\t\tif ( this.labelIsParent ) {\n\t\t\tthis.input.add( this.label ).wrapAll( this._wrapper() );\n\t\t} else {\n\t\t\t//this.element.replaceWith( this.input.add( this.label ).wrapAll( this._wrapper() ) );\n\t\t\tthis.element.wrap( this._wrapper() );\n\t\t\tthis.element.parent().prepend( this.label );\n\t\t}\n\n\t\t// Wrap the input + label in a div\n\n\t\tthis._setOptions({\n\t\t\t\"theme\": this.options.theme,\n\t\t\t\"iconpos\": this.options.iconpos,\n\t\t\t\"mini\": this.options.mini\n\t\t});\n\n\t},\n\n\t_wrapper: function() {\n\t\treturn $( \"<div class='\"  +\n\t\t\t( this.options.wrapperClass ? this.options.wrapperClass : \"\" ) +\n\t\t\t\" ui-\" + this.inputtype +\n\t\t\t( this.options.disabled ? \" ui-state-disabled\" : \"\" ) + \"' ></div>\" );\n\t},\n\n\t_handleInputFocus: function() {\n\t\tthis.label.addClass( $.mobile.focusClass );\n\t},\n\n\t_handleInputBlur: function() {\n\t\tthis.label.removeClass( $.mobile.focusClass );\n\t},\n\n\t_handleInputVClick: function() {\n\t\t// Adds checked attribute to checked input when keyboard is used\n\t\tthis.element.prop( \"checked\", this.element.is( \":checked\" ) );\n\t\tthis._getInputSet().not( this.element ).prop( \"checked\", false );\n\t\tthis._updateAll( true );\n\t},\n\n\t_handleLabelVMouseOver: function( event ) {\n\t\tif ( this.label.parent().hasClass( \"ui-state-disabled\" ) ) {\n\t\t\tevent.stopPropagation();\n\t\t}\n\t},\n\n\t_handleLabelVClick: function( event ) {\n\t\tvar input = this.element;\n\n\t\tif ( input.is( \":disabled\" ) ) {\n\t\t\tevent.preventDefault();\n\t\t\treturn;\n\t\t}\n\n\t\tthis._cacheVals();\n\n\t\tinput.prop( \"checked\", this.inputtype === \"radio\" && true || !input.prop( \"checked\" ) );\n\n\t\t// trigger click handler's bound directly to the input as a substitute for\n\t\t// how label clicks behave normally in the browsers\n\t\t// TODO: it would be nice to let the browser's handle the clicks and pass them\n\t\t//       through to the associate input. we can swallow that click at the parent\n\t\t//       wrapper element level\n\t\tinput.triggerHandler( \"click\" );\n\n\t\t// Input set for common radio buttons will contain all the radio\n\t\t// buttons, but will not for checkboxes. clearing the checked status\n\t\t// of other radios ensures the active button state is applied properly\n\t\tthis._getInputSet().not( input ).prop( \"checked\", false );\n\n\t\tthis._updateAll();\n\t\treturn false;\n\t},\n\n\t_cacheVals: function() {\n\t\tthis._getInputSet().each( function() {\n\t\t\t$( this ).attr(\"data-\" + $.mobile.ns + \"cacheVal\", this.checked );\n\t\t});\n\t},\n\n\t// Returns those radio buttons that are supposed to be in the same group as\n\t// this radio button. In the case of a checkbox or a radio lacking a name\n\t// attribute, it returns this.element.\n\t_getInputSet: function() {\n\t\tvar selector, formId,\n\t\t\tradio = this.element[ 0 ],\n\t\t\tname = radio.name,\n\t\t\tform = radio.form,\n\t\t\tdoc = this.element.parents().last().get( 0 ),\n\n\t\t\t// A radio is always a member of its own group\n\t\t\tradios = this.element;\n\n\t\t// Only start running selectors if this is an attached radio button with a name\n\t\tif ( name && this.inputtype === \"radio\" && doc ) {\n\t\t\tselector = \"input[type='radio'][name='\" + escapeId( name ) + \"']\";\n\n\t\t\t// If we're inside a form\n\t\t\tif ( form ) {\n\t\t\t\tformId = form.getAttribute( \"id\" );\n\n\t\t\t\t// If the form has an ID, collect radios scattered throught the document which\n\t\t\t\t// nevertheless are part of the form by way of the value of their form attribute\n\t\t\t\tif ( formId ) {\n\t\t\t\t\tradios = $( selector + \"[form='\" + escapeId( formId ) + \"']\", doc );\n\t\t\t\t}\n\n\t\t\t\t// Also add to those the radios in the form itself\n\t\t\t\tradios = $( form ).find( selector ).filter( function() {\n\n\t\t\t\t\t// Some radios inside the form may belong to some other form by virtue of\n\t\t\t\t\t// having a form attribute defined on them, so we must filter them out here\n\t\t\t\t\treturn ( this.form === form );\n\t\t\t\t}).add( radios );\n\n\t\t\t// If we're outside a form\n\t\t\t} else {\n\n\t\t\t\t// Collect all those radios which are also outside of a form and match our name\n\t\t\t\tradios = $( selector, doc ).filter( function() {\n\t\t\t\t\treturn !this.form;\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\treturn radios;\n\t},\n\n\t_updateAll: function( changeTriggered ) {\n\t\tvar self = this;\n\n\t\tthis._getInputSet().each( function() {\n\t\t\tvar $this = $( this );\n\n\t\t\tif ( ( this.checked || self.inputtype === \"checkbox\" ) && !changeTriggered ) {\n\t\t\t\t$this.trigger( \"change\" );\n\t\t\t}\n\t\t})\n\t\t.checkboxradio( \"refresh\" );\n\t},\n\n\t_reset: function() {\n\t\tthis.refresh();\n\t},\n\n\t// Is the widget supposed to display an icon?\n\t_hasIcon: function() {\n\t\tvar controlgroup, controlgroupWidget,\n\t\t\tcontrolgroupConstructor = $.mobile.controlgroup;\n\n\t\t// If the controlgroup widget is defined ...\n\t\tif ( controlgroupConstructor ) {\n\t\t\tcontrolgroup = this.element.closest(\n\t\t\t\t\":mobile-controlgroup,\" +\n\t\t\t\tcontrolgroupConstructor.prototype.initSelector );\n\n\t\t\t// ... and the checkbox is in a controlgroup ...\n\t\t\tif ( controlgroup.length > 0 ) {\n\n\t\t\t\t// ... look for a controlgroup widget instance, and ...\n\t\t\t\tcontrolgroupWidget = $.data( controlgroup[ 0 ], \"mobile-controlgroup\" );\n\n\t\t\t\t// ... if found, decide based on the option value, ...\n\t\t\t\treturn ( ( controlgroupWidget ? controlgroupWidget.options.type :\n\n\t\t\t\t\t// ... otherwise decide based on the \"type\" data attribute.\n\t\t\t\t\tcontrolgroup.attr( \"data-\" + $.mobile.ns + \"type\" ) ) !== \"horizontal\" );\n\t\t\t}\n\t\t}\n\n\t\t// Normally, the widget displays an icon.\n\t\treturn true;\n\t},\n\n\trefresh: function() {\n\t\tvar isChecked = this.element[ 0 ].checked,\n\t\t\tactive = $.mobile.activeBtnClass,\n\t\t\ticonposClass = \"ui-btn-icon-\" + this.options.iconpos,\n\t\t\taddClasses = [],\n\t\t\tremoveClasses = [];\n\n\t\tif ( this._hasIcon() ) {\n\t\t\tremoveClasses.push( active );\n\t\t\taddClasses.push( iconposClass );\n\t\t} else {\n\t\t\tremoveClasses.push( iconposClass );\n\t\t\t( isChecked ? addClasses : removeClasses ).push( active );\n\t\t}\n\n\t\tif ( isChecked ) {\n\t\t\taddClasses.push( this.checkedClass );\n\t\t\tremoveClasses.push( this.uncheckedClass );\n\t\t} else {\n\t\t\taddClasses.push( this.uncheckedClass );\n\t\t\tremoveClasses.push( this.checkedClass );\n\t\t}\n\n\t\tthis.widget().toggleClass( \"ui-state-disabled\", this.element.prop( \"disabled\" ) );\n\n\t\tthis.label\n\t\t\t.addClass( addClasses.join( \" \" ) )\n\t\t\t.removeClass( removeClasses.join( \" \" ) );\n\t},\n\n\twidget: function() {\n\t\treturn this.label.parent();\n\t},\n\n\t_setOptions: function( options ) {\n\t\tvar label = this.label,\n\t\t\tcurrentOptions = this.options,\n\t\t\touter = this.widget(),\n\t\t\thasIcon = this._hasIcon();\n\n\t\tif ( options.disabled !== undefined ) {\n\t\t\tthis.input.prop( \"disabled\", !!options.disabled );\n\t\t\touter.toggleClass( \"ui-state-disabled\", !!options.disabled );\n\t\t}\n\t\tif ( options.mini !== undefined ) {\n\t\t\touter.toggleClass( \"ui-mini\", !!options.mini );\n\t\t}\n\t\tif ( options.theme !== undefined ) {\n\t\t\tlabel\n\t\t\t\t.removeClass( \"ui-btn-\" + currentOptions.theme )\n\t\t\t\t.addClass( \"ui-btn-\" + options.theme );\n\t\t}\n\t\tif ( options.wrapperClass !== undefined ) {\n\t\t\touter\n\t\t\t\t.removeClass( currentOptions.wrapperClass )\n\t\t\t\t.addClass( options.wrapperClass );\n\t\t}\n\t\tif ( options.iconpos !== undefined && hasIcon ) {\n\t\t\tlabel.removeClass( \"ui-btn-icon-\" + currentOptions.iconpos ).addClass( \"ui-btn-icon-\" + options.iconpos );\n\t\t} else if ( !hasIcon ) {\n\t\t\tlabel.removeClass( \"ui-btn-icon-\" + currentOptions.iconpos );\n\t\t}\n\t\tthis._super( options );\n\t}\n\n}, $.mobile.behaviors.formReset ) );\n\n})( jQuery );\n\n(function( $, undefined ) {\n\n$.widget( \"mobile.button\", {\n\n\tinitSelector: \"input[type='button'], input[type='submit'], input[type='reset']\",\n\n\toptions: {\n\t\ttheme: null,\n\t\ticon: null,\n\t\ticonpos: \"left\",\n\t\ticonshadow: false, /* TODO: Deprecated in 1.4, remove in 1.5. */\n\t\tcorners: true,\n\t\tshadow: true,\n\t\tinline: null,\n\t\tmini: null,\n\t\twrapperClass: null,\n\t\tenhanced: false\n\t},\n\n\t_create: function() {\n\n\t\tif ( this.element.is( \":disabled\" ) ) {\n\t\t\tthis.options.disabled = true;\n\t\t}\n\n\t\tif ( !this.options.enhanced ) {\n\t\t\tthis._enhance();\n\t\t}\n\n\t\t$.extend( this, {\n\t\t\twrapper: this.element.parent()\n\t\t});\n\n\t\tthis._on( {\n\t\t\tfocus: function() {\n\t\t\t\tthis.widget().addClass( $.mobile.focusClass );\n\t\t\t},\n\n\t\t\tblur: function() {\n\t\t\t\tthis.widget().removeClass( $.mobile.focusClass );\n\t\t\t}\n\t\t});\n\n\t\tthis.refresh( true );\n\t},\n\n\t_enhance: function() {\n\t\tthis.element.wrap( this._button() );\n\t},\n\n\t_button: function() {\n\t\tvar options = this.options,\n\t\t\ticonClasses = this._getIconClasses( this.options );\n\n\t\treturn $(\"<div class='ui-btn ui-input-btn\" +\n\t\t\t( options.wrapperClass ? \" \" + options.wrapperClass : \"\" ) +\n\t\t\t( options.theme ? \" ui-btn-\" + options.theme : \"\" ) +\n\t\t\t( options.corners ? \" ui-corner-all\" : \"\" ) +\n\t\t\t( options.shadow ? \" ui-shadow\" : \"\" ) +\n\t\t\t( options.inline ? \" ui-btn-inline\" : \"\" ) +\n\t\t\t( options.mini ? \" ui-mini\" : \"\" ) +\n\t\t\t( options.disabled ? \" ui-state-disabled\" : \"\" ) +\n\t\t\t( iconClasses ? ( \" \" + iconClasses ) : \"\" ) +\n\t\t\t\"' >\" + this.element.val() + \"</div>\" );\n\t},\n\n\twidget: function() {\n\t\treturn this.wrapper;\n\t},\n\n\t_destroy: function() {\n\t\t\tthis.element.insertBefore( this.wrapper );\n\t\t\tthis.wrapper.remove();\n\t},\n\n\t_getIconClasses: function( options ) {\n\t\treturn ( options.icon ? ( \"ui-icon-\" + options.icon +\n\t\t\t( options.iconshadow ? \" ui-shadow-icon\" : \"\" ) + /* TODO: Deprecated in 1.4, remove in 1.5. */\n\t\t\t\" ui-btn-icon-\" + options.iconpos ) : \"\" );\n\t},\n\n\t_setOptions: function( options ) {\n\t\tvar outer = this.widget();\n\n\t\tif ( options.theme !== undefined ) {\n\t\t\touter\n\t\t\t\t.removeClass( this.options.theme )\n\t\t\t\t.addClass( \"ui-btn-\" + options.theme );\n\t\t}\n\t\tif ( options.corners !== undefined ) {\n\t\t\touter.toggleClass( \"ui-corner-all\", options.corners );\n\t\t}\n\t\tif ( options.shadow !== undefined ) {\n\t\t\touter.toggleClass( \"ui-shadow\", options.shadow );\n\t\t}\n\t\tif ( options.inline !== undefined ) {\n\t\t\touter.toggleClass( \"ui-btn-inline\", options.inline );\n\t\t}\n\t\tif ( options.mini !== undefined ) {\n\t\t\touter.toggleClass( \"ui-mini\", options.mini );\n\t\t}\n\t\tif ( options.disabled !== undefined ) {\n\t\t\tthis.element.prop( \"disabled\", options.disabled );\n\t\t\touter.toggleClass( \"ui-state-disabled\", options.disabled );\n\t\t}\n\n\t\tif ( options.icon !== undefined ||\n\t\t\t\toptions.iconshadow !== undefined || /* TODO: Deprecated in 1.4, remove in 1.5. */\n\t\t\t\toptions.iconpos !== undefined ) {\n\t\t\touter\n\t\t\t\t.removeClass( this._getIconClasses( this.options ) )\n\t\t\t\t.addClass( this._getIconClasses(\n\t\t\t\t\t$.extend( {}, this.options, options ) ) );\n\t\t}\n\n\t\tthis._super( options );\n\t},\n\n\trefresh: function( create ) {\n\t\tvar originalElement,\n\t\t\tisDisabled = this.element.prop( \"disabled\" );\n\n\t\tif ( this.options.icon && this.options.iconpos === \"notext\" && this.element.attr( \"title\" ) ) {\n\t\t\tthis.element.attr( \"title\", this.element.val() );\n\t\t}\n\t\tif ( !create ) {\n\t\t\toriginalElement = this.element.detach();\n\t\t\t$( this.wrapper ).text( this.element.val() ).append( originalElement );\n\t\t}\n\t\tif ( this.options.disabled !== isDisabled ) {\n\t\t\tthis._setOptions({ disabled: isDisabled });\n\t\t}\n\t}\n});\n\n})( jQuery );\n\n(function( $ ) {\n\tvar\tmeta = $( \"meta[name=viewport]\" ),\n\t\tinitialContent = meta.attr( \"content\" ),\n\t\tdisabledZoom = initialContent + \",maximum-scale=1, user-scalable=no\",\n\t\tenabledZoom = initialContent + \",maximum-scale=10, user-scalable=yes\",\n\t\tdisabledInitially = /(user-scalable[\\s]*=[\\s]*no)|(maximum-scale[\\s]*=[\\s]*1)[$,\\s]/.test( initialContent );\n\n\t$.mobile.zoom = $.extend( {}, {\n\t\tenabled: !disabledInitially,\n\t\tlocked: false,\n\t\tdisable: function( lock ) {\n\t\t\tif ( !disabledInitially && !$.mobile.zoom.locked ) {\n\t\t\t\tmeta.attr( \"content\", disabledZoom );\n\t\t\t\t$.mobile.zoom.enabled = false;\n\t\t\t\t$.mobile.zoom.locked = lock || false;\n\t\t\t}\n\t\t},\n\t\tenable: function( unlock ) {\n\t\t\tif ( !disabledInitially && ( !$.mobile.zoom.locked || unlock === true ) ) {\n\t\t\t\tmeta.attr( \"content\", enabledZoom );\n\t\t\t\t$.mobile.zoom.enabled = true;\n\t\t\t\t$.mobile.zoom.locked = false;\n\t\t\t}\n\t\t},\n\t\trestore: function() {\n\t\t\tif ( !disabledInitially ) {\n\t\t\t\tmeta.attr( \"content\", initialContent );\n\t\t\t\t$.mobile.zoom.enabled = true;\n\t\t\t}\n\t\t}\n\t});\n\n}( jQuery ));\n\n(function( $, undefined ) {\n\n$.widget( \"mobile.textinput\", {\n\tinitSelector: \"input[type='text'],\" +\n\t\t\"input[type='search'],\" +\n\t\t\":jqmData(type='search'),\" +\n\t\t\"input[type='number'],\" +\n\t\t\":jqmData(type='number'),\" +\n\t\t\"input[type='password'],\" +\n\t\t\"input[type='email'],\" +\n\t\t\"input[type='url'],\" +\n\t\t\"input[type='tel'],\" +\n\t\t\"textarea,\" +\n\t\t\"input[type='time'],\" +\n\t\t\"input[type='date'],\" +\n\t\t\"input[type='month'],\" +\n\t\t\"input[type='week'],\" +\n\t\t\"input[type='datetime'],\" +\n\t\t\"input[type='datetime-local'],\" +\n\t\t\"input[type='color'],\" +\n\t\t\"input:not([type]),\" +\n\t\t\"input[type='file']\",\n\n\toptions: {\n\t\ttheme: null,\n\t\tcorners: true,\n\t\tmini: false,\n\t\t// This option defaults to true on iOS devices.\n\t\tpreventFocusZoom: /iPhone|iPad|iPod/.test( navigator.platform ) && navigator.userAgent.indexOf( \"AppleWebKit\" ) > -1,\n\t\twrapperClass: \"\",\n\t\tenhanced: false\n\t},\n\n\t_create: function() {\n\n\t\tvar options = this.options,\n\t\t\tisSearch = this.element.is( \"[type='search'], :jqmData(type='search')\" ),\n\t\t\tisTextarea = this.element[ 0 ].tagName === \"TEXTAREA\",\n\t\t\tisRange = this.element.is( \"[data-\" + ( $.mobile.ns || \"\" ) + \"type='range']\" ),\n\t\t\tinputNeedsWrap = ( (this.element.is( \"input\" ) ||\n\t\t\t\tthis.element.is( \"[data-\" + ( $.mobile.ns || \"\" ) + \"type='search']\" ) ) &&\n\t\t\t\t\t!isRange );\n\n\t\tif ( this.element.prop( \"disabled\" ) ) {\n\t\t\toptions.disabled = true;\n\t\t}\n\n\t\t$.extend( this, {\n\t\t\tclasses: this._classesFromOptions(),\n\t\t\tisSearch: isSearch,\n\t\t\tisTextarea: isTextarea,\n\t\t\tisRange: isRange,\n\t\t\tinputNeedsWrap: inputNeedsWrap\n\t\t});\n\n\t\tthis._autoCorrect();\n\n\t\tif ( !options.enhanced ) {\n\t\t\tthis._enhance();\n\t\t}\n\n\t\tthis._on( {\n\t\t\t\"focus\": \"_handleFocus\",\n\t\t\t\"blur\": \"_handleBlur\"\n\t\t});\n\n\t},\n\n\trefresh: function() {\n\t\tthis.setOptions({\n\t\t\t\"disabled\" : this.element.is( \":disabled\" )\n\t\t});\n\t},\n\n\t_enhance: function() {\n\t\tvar elementClasses = [];\n\n\t\tif ( this.isTextarea ) {\n\t\t\telementClasses.push( \"ui-input-text\" );\n\t\t}\n\n\t\tif ( this.isTextarea || this.isRange ) {\n\t\t\telementClasses.push( \"ui-shadow-inset\" );\n\t\t}\n\n\t\t//\"search\" and \"text\" input widgets\n\t\tif ( this.inputNeedsWrap ) {\n\t\t\tthis.element.wrap( this._wrap() );\n\t\t} else {\n\t\t\telementClasses = elementClasses.concat( this.classes );\n\t\t}\n\n\t\tthis.element.addClass( elementClasses.join( \" \" ) );\n\t},\n\n\twidget: function() {\n\t\treturn ( this.inputNeedsWrap ) ? this.element.parent() : this.element;\n\t},\n\n\t_classesFromOptions: function() {\n\t\tvar options = this.options,\n\t\t\tclasses = [];\n\n\t\tclasses.push( \"ui-body-\" + ( ( options.theme === null ) ? \"inherit\" : options.theme ) );\n\t\tif ( options.corners ) {\n\t\t\tclasses.push( \"ui-corner-all\" );\n\t\t}\n\t\tif ( options.mini ) {\n\t\t\tclasses.push( \"ui-mini\" );\n\t\t}\n\t\tif ( options.disabled ) {\n\t\t\tclasses.push( \"ui-state-disabled\" );\n\t\t}\n\t\tif ( options.wrapperClass ) {\n\t\t\tclasses.push( options.wrapperClass );\n\t\t}\n\n\t\treturn classes;\n\t},\n\n\t_wrap: function() {\n\t\treturn $( \"<div class='\" +\n\t\t\t( this.isSearch ? \"ui-input-search \" : \"ui-input-text \" ) +\n\t\t\tthis.classes.join( \" \" ) + \" \" +\n\t\t\t\"ui-shadow-inset'></div>\" );\n\t},\n\n\t_autoCorrect: function() {\n\t\t// XXX: Temporary workaround for issue 785 (Apple bug 8910589).\n\t\t//      Turn off autocorrect and autocomplete on non-iOS 5 devices\n\t\t//      since the popup they use can't be dismissed by the user. Note\n\t\t//      that we test for the presence of the feature by looking for\n\t\t//      the autocorrect property on the input element. We currently\n\t\t//      have no test for iOS 5 or newer so we're temporarily using\n\t\t//      the touchOverflow support flag for jQM 1.0. Yes, I feel dirty.\n\t\t//      - jblas\n\t\tif ( typeof this.element[0].autocorrect !== \"undefined\" &&\n\t\t\t!$.support.touchOverflow ) {\n\n\t\t\t// Set the attribute instead of the property just in case there\n\t\t\t// is code that attempts to make modifications via HTML.\n\t\t\tthis.element[0].setAttribute( \"autocorrect\", \"off\" );\n\t\t\tthis.element[0].setAttribute( \"autocomplete\", \"off\" );\n\t\t}\n\t},\n\n\t_handleBlur: function() {\n\t\tthis.widget().removeClass( $.mobile.focusClass );\n\t\tif ( this.options.preventFocusZoom ) {\n\t\t\t$.mobile.zoom.enable( true );\n\t\t}\n\t},\n\n\t_handleFocus: function() {\n\t\t// In many situations, iOS will zoom into the input upon tap, this\n\t\t// prevents that from happening\n\t\tif ( this.options.preventFocusZoom ) {\n\t\t\t$.mobile.zoom.disable( true );\n\t\t}\n\t\tthis.widget().addClass( $.mobile.focusClass );\n\t},\n\n\t_setOptions: function ( options ) {\n\t\tvar outer = this.widget();\n\n\t\tthis._super( options );\n\n\t\tif ( !( options.disabled === undefined &&\n\t\t\toptions.mini === undefined &&\n\t\t\toptions.corners === undefined &&\n\t\t\toptions.theme === undefined &&\n\t\t\toptions.wrapperClass === undefined ) ) {\n\n\t\t\touter.removeClass( this.classes.join( \" \" ) );\n\t\t\tthis.classes = this._classesFromOptions();\n\t\t\touter.addClass( this.classes.join( \" \" ) );\n\t\t}\n\n\t\tif ( options.disabled !== undefined ) {\n\t\t\tthis.element.prop( \"disabled\", !!options.disabled );\n\t\t}\n\t},\n\n\t_destroy: function() {\n\t\tif ( this.options.enhanced ) {\n\t\t\treturn;\n\t\t}\n\t\tif ( this.inputNeedsWrap ) {\n\t\t\tthis.element.unwrap();\n\t\t}\n\t\tthis.element.removeClass( \"ui-input-text \" + this.classes.join( \" \" ) );\n\t}\n});\n\n})( jQuery );\n\n(function( $, undefined ) {\n\n$.widget( \"mobile.slider\", $.extend( {\n\tinitSelector: \"input[type='range'], :jqmData(type='range'), :jqmData(role='slider')\",\n\n\twidgetEventPrefix: \"slide\",\n\n\toptions: {\n\t\ttheme: null,\n\t\ttrackTheme: null,\n\t\tcorners: true,\n\t\tmini: false,\n\t\thighlight: false\n\t},\n\n\t_create: function() {\n\n\t\t// TODO: Each of these should have comments explain what they're for\n\t\tvar self = this,\n\t\t\tcontrol = this.element,\n\t\t\ttrackTheme = this.options.trackTheme || $.mobile.getAttribute( control[ 0 ], \"theme\" ),\n\t\t\ttrackThemeClass = trackTheme ? \" ui-bar-\" + trackTheme : \" ui-bar-inherit\",\n\t\t\tcornerClass = ( this.options.corners || control.jqmData( \"corners\" ) ) ? \" ui-corner-all\" : \"\",\n\t\t\tminiClass = ( this.options.mini || control.jqmData( \"mini\" ) ) ? \" ui-mini\" : \"\",\n\t\t\tcType = control[ 0 ].nodeName.toLowerCase(),\n\t\t\tisToggleSwitch = ( cType === \"select\" ),\n\t\t\tisRangeslider = control.parent().is( \":jqmData(role='rangeslider')\" ),\n\t\t\tselectClass = ( isToggleSwitch ) ? \"ui-slider-switch\" : \"\",\n\t\t\tcontrolID = control.attr( \"id\" ),\n\t\t\t$label = $( \"[for='\" + controlID + \"']\" ),\n\t\t\tlabelID = $label.attr( \"id\" ) || controlID + \"-label\",\n\t\t\tmin = !isToggleSwitch ? parseFloat( control.attr( \"min\" ) ) : 0,\n\t\t\tmax =  !isToggleSwitch ? parseFloat( control.attr( \"max\" ) ) : control.find( \"option\" ).length-1,\n\t\t\tstep = window.parseFloat( control.attr( \"step\" ) || 1 ),\n\t\t\tdomHandle = document.createElement( \"a\" ),\n\t\t\thandle = $( domHandle ),\n\t\t\tdomSlider = document.createElement( \"div\" ),\n\t\t\tslider = $( domSlider ),\n\t\t\tvaluebg = this.options.highlight && !isToggleSwitch ? (function() {\n\t\t\t\tvar bg = document.createElement( \"div\" );\n\t\t\t\tbg.className = \"ui-slider-bg \" + $.mobile.activeBtnClass;\n\t\t\t\treturn $( bg ).prependTo( slider );\n\t\t\t})() : false,\n\t\t\toptions,\n\t\t\twrapper,\n\t\t\tj, length,\n\t\t\ti, optionsCount, origTabIndex,\n\t\t\tside, activeClass, sliderImg;\n\n\t\t$label.attr( \"id\", labelID );\n\t\tthis.isToggleSwitch = isToggleSwitch;\n\n\t\tdomHandle.setAttribute( \"href\", \"#\" );\n\t\tdomSlider.setAttribute( \"role\", \"application\" );\n\t\tdomSlider.className = [ this.isToggleSwitch ? \"ui-slider ui-slider-track ui-shadow-inset \" : \"ui-slider-track ui-shadow-inset \", selectClass, trackThemeClass, cornerClass, miniClass ].join( \"\" );\n\t\tdomHandle.className = \"ui-slider-handle\";\n\t\tdomSlider.appendChild( domHandle );\n\n\t\thandle.attr({\n\t\t\t\"role\": \"slider\",\n\t\t\t\"aria-valuemin\": min,\n\t\t\t\"aria-valuemax\": max,\n\t\t\t\"aria-valuenow\": this._value(),\n\t\t\t\"aria-valuetext\": this._value(),\n\t\t\t\"title\": this._value(),\n\t\t\t\"aria-labelledby\": labelID\n\t\t});\n\n\t\t$.extend( this, {\n\t\t\tslider: slider,\n\t\t\thandle: handle,\n\t\t\tcontrol: control,\n\t\t\ttype: cType,\n\t\t\tstep: step,\n\t\t\tmax: max,\n\t\t\tmin: min,\n\t\t\tvaluebg: valuebg,\n\t\t\tisRangeslider: isRangeslider,\n\t\t\tdragging: false,\n\t\t\tbeforeStart: null,\n\t\t\tuserModified: false,\n\t\t\tmouseMoved: false\n\t\t});\n\n\t\tif ( isToggleSwitch ) {\n\t\t\t// TODO: restore original tabindex (if any) in a destroy method\n\t\t\torigTabIndex = control.attr( \"tabindex\" );\n\t\t\tif ( origTabIndex ) {\n\t\t\t\thandle.attr( \"tabindex\", origTabIndex );\n\t\t\t}\n\t\t\tcontrol.attr( \"tabindex\", \"-1\" ).focus(function() {\n\t\t\t\t$( this ).blur();\n\t\t\t\thandle.focus();\n\t\t\t});\n\n\t\t\twrapper = document.createElement( \"div\" );\n\t\t\twrapper.className = \"ui-slider-inneroffset\";\n\n\t\t\tfor ( j = 0, length = domSlider.childNodes.length; j < length; j++ ) {\n\t\t\t\twrapper.appendChild( domSlider.childNodes[j] );\n\t\t\t}\n\n\t\t\tdomSlider.appendChild( wrapper );\n\n\t\t\t// slider.wrapInner( \"<div class='ui-slider-inneroffset'></div>\" );\n\n\t\t\t// make the handle move with a smooth transition\n\t\t\thandle.addClass( \"ui-slider-handle-snapping\" );\n\n\t\t\toptions = control.find( \"option\" );\n\n\t\t\tfor ( i = 0, optionsCount = options.length; i < optionsCount; i++ ) {\n\t\t\t\tside = !i ? \"b\" : \"a\";\n\t\t\t\tactiveClass = !i ? \"\" : \" \" + $.mobile.activeBtnClass;\n\t\t\t\tsliderImg = document.createElement( \"span\" );\n\n\t\t\t\tsliderImg.className = [ \"ui-slider-label ui-slider-label-\", side, activeClass ].join( \"\" );\n\t\t\t\tsliderImg.setAttribute( \"role\", \"img\" );\n\t\t\t\tsliderImg.appendChild( document.createTextNode( options[i].innerHTML ) );\n\t\t\t\t$( sliderImg ).prependTo( slider );\n\t\t\t}\n\n\t\t\tself._labels = $( \".ui-slider-label\", slider );\n\n\t\t}\n\n\t\t// monitor the input for updated values\n\t\tcontrol.addClass( isToggleSwitch ? \"ui-slider-switch\" : \"ui-slider-input\" );\n\n\t\tthis._on( control, {\n\t\t\t\"change\": \"_controlChange\",\n\t\t\t\"keyup\": \"_controlKeyup\",\n\t\t\t\"blur\": \"_controlBlur\",\n\t\t\t\"vmouseup\": \"_controlVMouseUp\"\n\t\t});\n\n\t\tslider.bind( \"vmousedown\", $.proxy( this._sliderVMouseDown, this ) )\n\t\t\t.bind( \"vclick\", false );\n\n\t\t// We have to instantiate a new function object for the unbind to work properly\n\t\t// since the method itself is defined in the prototype (causing it to unbind everything)\n\t\tthis._on( document, { \"vmousemove\": \"_preventDocumentDrag\" });\n\t\tthis._on( slider.add( document ), { \"vmouseup\": \"_sliderVMouseUp\" });\n\n\t\tslider.insertAfter( control );\n\n\t\t// wrap in a div for styling purposes\n\t\tif ( !isToggleSwitch && !isRangeslider ) {\n\t\t\twrapper = this.options.mini ? \"<div class='ui-slider ui-mini'>\" : \"<div class='ui-slider'>\";\n\n\t\t\tcontrol.add( slider ).wrapAll( wrapper );\n\t\t}\n\n\t\t// bind the handle event callbacks and set the context to the widget instance\n\t\tthis._on( this.handle, {\n\t\t\t\"vmousedown\": \"_handleVMouseDown\",\n\t\t\t\"keydown\": \"_handleKeydown\",\n\t\t\t\"keyup\": \"_handleKeyup\"\n\t\t});\n\n\t\tthis.handle.bind( \"vclick\", false );\n\n\t\tthis._handleFormReset();\n\n\t\tthis.refresh( undefined, undefined, true );\n\t},\n\n\t_setOptions: function( options ) {\n\t\tif ( options.theme !== undefined ) {\n\t\t\tthis._setTheme( options.theme );\n\t\t}\n\n\t\tif ( options.trackTheme !== undefined ) {\n\t\t\tthis._setTrackTheme( options.trackTheme );\n\t\t}\n\n\t\tif ( options.corners !== undefined ) {\n\t\t\tthis._setCorners( options.corners );\n\t\t}\n\n\t\tif ( options.mini !== undefined ) {\n\t\t\tthis._setMini( options.mini );\n\t\t}\n\n\t\tif ( options.highlight !== undefined ) {\n\t\t\tthis._setHighlight( options.highlight );\n\t\t}\n\n\t\tif ( options.disabled !== undefined ) {\n\t\t\tthis._setDisabled( options.disabled );\n\t\t}\n\t\tthis._super( options );\n\t},\n\n\t_controlChange: function( event ) {\n\t\t// if the user dragged the handle, the \"change\" event was triggered from inside refresh(); don't call refresh() again\n\t\tif ( this._trigger( \"controlchange\", event ) === false ) {\n\t\t\treturn false;\n\t\t}\n\t\tif ( !this.mouseMoved ) {\n\t\t\tthis.refresh( this._value(), true );\n\t\t}\n\t},\n\n\t_controlKeyup: function(/* event */) { // necessary?\n\t\tthis.refresh( this._value(), true, true );\n\t},\n\n\t_controlBlur: function(/* event */) {\n\t\tthis.refresh( this._value(), true );\n\t},\n\n\t// it appears the clicking the up and down buttons in chrome on\n\t// range/number inputs doesn't trigger a change until the field is\n\t// blurred. Here we check thif the value has changed and refresh\n\t_controlVMouseUp: function(/* event */) {\n\t\tthis._checkedRefresh();\n\t},\n\n\t// NOTE force focus on handle\n\t_handleVMouseDown: function(/* event */) {\n\t\tthis.handle.focus();\n\t},\n\n\t_handleKeydown: function( event ) {\n\t\tvar index = this._value();\n\t\tif ( this.options.disabled ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// In all cases prevent the default and mark the handle as active\n\t\tswitch ( event.keyCode ) {\n\t\t\tcase $.mobile.keyCode.HOME:\n\t\t\tcase $.mobile.keyCode.END:\n\t\t\tcase $.mobile.keyCode.PAGE_UP:\n\t\t\tcase $.mobile.keyCode.PAGE_DOWN:\n\t\t\tcase $.mobile.keyCode.UP:\n\t\t\tcase $.mobile.keyCode.RIGHT:\n\t\t\tcase $.mobile.keyCode.DOWN:\n\t\t\tcase $.mobile.keyCode.LEFT:\n\t\t\t\tevent.preventDefault();\n\n\t\t\t\tif ( !this._keySliding ) {\n\t\t\t\t\tthis._keySliding = true;\n\t\t\t\t\tthis.handle.addClass( \"ui-state-active\" ); /* TODO: We don't use this class for styling. Do we need to add it? */\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\t\t}\n\n\t\t// move the slider according to the keypress\n\t\tswitch ( event.keyCode ) {\n\t\t\tcase $.mobile.keyCode.HOME:\n\t\t\t\tthis.refresh( this.min );\n\t\t\t\tbreak;\n\t\t\tcase $.mobile.keyCode.END:\n\t\t\t\tthis.refresh( this.max );\n\t\t\t\tbreak;\n\t\t\tcase $.mobile.keyCode.PAGE_UP:\n\t\t\tcase $.mobile.keyCode.UP:\n\t\t\tcase $.mobile.keyCode.RIGHT:\n\t\t\t\tthis.refresh( index + this.step );\n\t\t\t\tbreak;\n\t\t\tcase $.mobile.keyCode.PAGE_DOWN:\n\t\t\tcase $.mobile.keyCode.DOWN:\n\t\t\tcase $.mobile.keyCode.LEFT:\n\t\t\t\tthis.refresh( index - this.step );\n\t\t\t\tbreak;\n\t\t}\n\t}, // remove active mark\n\n\t_handleKeyup: function(/* event */) {\n\t\tif ( this._keySliding ) {\n\t\t\tthis._keySliding = false;\n\t\t\tthis.handle.removeClass( \"ui-state-active\" ); /* See comment above. */\n\t\t}\n\t},\n\n\t_sliderVMouseDown: function( event ) {\n\t\t// NOTE: we don't do this in refresh because we still want to\n\t\t//       support programmatic alteration of disabled inputs\n\t\tif ( this.options.disabled || !( event.which === 1 || event.which === 0 || event.which === undefined ) ) {\n\t\t\treturn false;\n\t\t}\n\t\tif ( this._trigger( \"beforestart\", event ) === false ) {\n\t\t\treturn false;\n\t\t}\n\t\tthis.dragging = true;\n\t\tthis.userModified = false;\n\t\tthis.mouseMoved = false;\n\n\t\tif ( this.isToggleSwitch ) {\n\t\t\tthis.beforeStart = this.element[0].selectedIndex;\n\t\t}\n\n\t\tthis.refresh( event );\n\t\tthis._trigger( \"start\" );\n\t\treturn false;\n\t},\n\n\t_sliderVMouseUp: function() {\n\t\tif ( this.dragging ) {\n\t\t\tthis.dragging = false;\n\n\t\t\tif ( this.isToggleSwitch ) {\n\t\t\t\t// make the handle move with a smooth transition\n\t\t\t\tthis.handle.addClass( \"ui-slider-handle-snapping\" );\n\n\t\t\t\tif ( this.mouseMoved ) {\n\t\t\t\t\t// this is a drag, change the value only if user dragged enough\n\t\t\t\t\tif ( this.userModified ) {\n\t\t\t\t\t\tthis.refresh( this.beforeStart === 0 ? 1 : 0 );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.refresh( this.beforeStart );\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// this is just a click, change the value\n\t\t\t\t\tthis.refresh( this.beforeStart === 0 ? 1 : 0 );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis.mouseMoved = false;\n\t\t\tthis._trigger( \"stop\" );\n\t\t\treturn false;\n\t\t}\n\t},\n\n\t_preventDocumentDrag: function( event ) {\n\t\t\t// NOTE: we don't do this in refresh because we still want to\n\t\t\t//       support programmatic alteration of disabled inputs\n\t\t\tif ( this._trigger( \"drag\", event ) === false) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tif ( this.dragging && !this.options.disabled ) {\n\n\t\t\t\t// this.mouseMoved must be updated before refresh() because it will be used in the control \"change\" event\n\t\t\t\tthis.mouseMoved = true;\n\n\t\t\t\tif ( this.isToggleSwitch ) {\n\t\t\t\t\t// make the handle move in sync with the mouse\n\t\t\t\t\tthis.handle.removeClass( \"ui-slider-handle-snapping\" );\n\t\t\t\t}\n\n\t\t\t\tthis.refresh( event );\n\n\t\t\t\t// only after refresh() you can calculate this.userModified\n\t\t\t\tthis.userModified = this.beforeStart !== this.element[0].selectedIndex;\n\t\t\t\treturn false;\n\t\t\t}\n\t\t},\n\n\t_checkedRefresh: function() {\n\t\tif ( this.value !== this._value() ) {\n\t\t\tthis.refresh( this._value() );\n\t\t}\n\t},\n\n\t_value: function() {\n\t\treturn  this.isToggleSwitch ? this.element[0].selectedIndex : parseFloat( this.element.val() ) ;\n\t},\n\n\t_reset: function() {\n\t\tthis.refresh( undefined, false, true );\n\t},\n\n\trefresh: function( val, isfromControl, preventInputUpdate ) {\n\t\t// NOTE: we don't return here because we want to support programmatic\n\t\t//       alteration of the input value, which should still update the slider\n\n\t\tvar self = this,\n\t\t\tparentTheme = $.mobile.getAttribute( this.element[ 0 ], \"theme\" ),\n\t\t\ttheme = this.options.theme || parentTheme,\n\t\t\tthemeClass =  theme ? \" ui-btn-\" + theme : \"\",\n\t\t\ttrackTheme = this.options.trackTheme || parentTheme,\n\t\t\ttrackThemeClass = trackTheme ? \" ui-bar-\" + trackTheme : \" ui-bar-inherit\",\n\t\t\tcornerClass = this.options.corners ? \" ui-corner-all\" : \"\",\n\t\t\tminiClass = this.options.mini ? \" ui-mini\" : \"\",\n\t\t\tleft, width, data, tol,\n\t\t\tpxStep, percent,\n\t\t\tcontrol, isInput, optionElements, min, max, step,\n\t\t\tnewval, valModStep, alignValue, percentPerStep,\n\t\t\thandlePercent, aPercent, bPercent,\n\t\t\tvalueChanged;\n\n\t\tself.slider[0].className = [ this.isToggleSwitch ? \"ui-slider ui-slider-switch ui-slider-track ui-shadow-inset\" : \"ui-slider-track ui-shadow-inset\", trackThemeClass, cornerClass, miniClass ].join( \"\" );\n\t\tif ( this.options.disabled || this.element.prop( \"disabled\" ) ) {\n\t\t\tthis.disable();\n\t\t}\n\n\t\t// set the stored value for comparison later\n\t\tthis.value = this._value();\n\t\tif ( this.options.highlight && !this.isToggleSwitch && this.slider.find( \".ui-slider-bg\" ).length === 0 ) {\n\t\t\tthis.valuebg = (function() {\n\t\t\t\tvar bg = document.createElement( \"div\" );\n\t\t\t\tbg.className = \"ui-slider-bg \" + $.mobile.activeBtnClass;\n\t\t\t\treturn $( bg ).prependTo( self.slider );\n\t\t\t})();\n\t\t}\n\t\tthis.handle.addClass( \"ui-btn\" + themeClass + \" ui-shadow\" );\n\n\t\tcontrol = this.element;\n\t\tisInput = !this.isToggleSwitch;\n\t\toptionElements = isInput ? [] : control.find( \"option\" );\n\t\tmin =  isInput ? parseFloat( control.attr( \"min\" ) ) : 0;\n\t\tmax = isInput ? parseFloat( control.attr( \"max\" ) ) : optionElements.length - 1;\n\t\tstep = ( isInput && parseFloat( control.attr( \"step\" ) ) > 0 ) ? parseFloat( control.attr( \"step\" ) ) : 1;\n\n\t\tif ( typeof val === \"object\" ) {\n\t\t\tdata = val;\n\t\t\t// a slight tolerance helped get to the ends of the slider\n\t\t\ttol = 8;\n\n\t\t\tleft = this.slider.offset().left;\n\t\t\twidth = this.slider.width();\n\t\t\tpxStep = width/((max-min)/step);\n\t\t\tif ( !this.dragging ||\n\t\t\t\t\tdata.pageX < left - tol ||\n\t\t\t\t\tdata.pageX > left + width + tol ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif ( pxStep > 1 ) {\n\t\t\t\tpercent = ( ( data.pageX - left ) / width ) * 100;\n\t\t\t} else {\n\t\t\t\tpercent = Math.round( ( ( data.pageX - left ) / width ) * 100 );\n\t\t\t}\n\t\t} else {\n\t\t\tif ( val == null ) {\n\t\t\t\tval = isInput ? parseFloat( control.val() || 0 ) : control[0].selectedIndex;\n\t\t\t}\n\t\t\tpercent = ( parseFloat( val ) - min ) / ( max - min ) * 100;\n\t\t}\n\n\t\tif ( isNaN( percent ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tnewval = ( percent / 100 ) * ( max - min ) + min;\n\n\t\t//from jQuery UI slider, the following source will round to the nearest step\n\t\tvalModStep = ( newval - min ) % step;\n\t\talignValue = newval - valModStep;\n\n\t\tif ( Math.abs( valModStep ) * 2 >= step ) {\n\t\t\talignValue += ( valModStep > 0 ) ? step : ( -step );\n\t\t}\n\n\t\tpercentPerStep = 100/((max-min)/step);\n\t\t// Since JavaScript has problems with large floats, round\n\t\t// the final value to 5 digits after the decimal point (see jQueryUI: #4124)\n\t\tnewval = parseFloat( alignValue.toFixed(5) );\n\n\t\tif ( typeof pxStep === \"undefined\" ) {\n\t\t\tpxStep = width / ( (max-min) / step );\n\t\t}\n\t\tif ( pxStep > 1 && isInput ) {\n\t\t\tpercent = ( newval - min ) * percentPerStep * ( 1 / step );\n\t\t}\n\t\tif ( percent < 0 ) {\n\t\t\tpercent = 0;\n\t\t}\n\n\t\tif ( percent > 100 ) {\n\t\t\tpercent = 100;\n\t\t}\n\n\t\tif ( newval < min ) {\n\t\t\tnewval = min;\n\t\t}\n\n\t\tif ( newval > max ) {\n\t\t\tnewval = max;\n\t\t}\n\n\t\tthis.handle.css( \"left\", percent + \"%\" );\n\n\t\tthis.handle[0].setAttribute( \"aria-valuenow\", isInput ? newval : optionElements.eq( newval ).attr( \"value\" ) );\n\n\t\tthis.handle[0].setAttribute( \"aria-valuetext\", isInput ? newval : optionElements.eq( newval ).getEncodedText() );\n\n\t\tthis.handle[0].setAttribute( \"title\", isInput ? newval : optionElements.eq( newval ).getEncodedText() );\n\n\t\tif ( this.valuebg ) {\n\t\t\tthis.valuebg.css( \"width\", percent + \"%\" );\n\t\t}\n\n\t\t// drag the label widths\n\t\tif ( this._labels ) {\n\t\t\thandlePercent = this.handle.width() / this.slider.width() * 100;\n\t\t\taPercent = percent && handlePercent + ( 100 - handlePercent ) * percent / 100;\n\t\t\tbPercent = percent === 100 ? 0 : Math.min( handlePercent + 100 - aPercent, 100 );\n\n\t\t\tthis._labels.each(function() {\n\t\t\t\tvar ab = $( this ).hasClass( \"ui-slider-label-a\" );\n\t\t\t\t$( this ).width( ( ab ? aPercent : bPercent  ) + \"%\" );\n\t\t\t});\n\t\t}\n\n\t\tif ( !preventInputUpdate ) {\n\t\t\tvalueChanged = false;\n\n\t\t\t// update control\"s value\n\t\t\tif ( isInput ) {\n\t\t\t\tvalueChanged = parseFloat( control.val() ) !== newval;\n\t\t\t\tcontrol.val( newval );\n\t\t\t} else {\n\t\t\t\tvalueChanged = control[ 0 ].selectedIndex !== newval;\n\t\t\t\tcontrol[ 0 ].selectedIndex = newval;\n\t\t\t}\n\t\t\tif ( this._trigger( \"beforechange\", val ) === false) {\n\t\t\t\t\treturn false;\n\t\t\t}\n\t\t\tif ( !isfromControl && valueChanged ) {\n\t\t\t\tcontrol.trigger( \"change\" );\n\t\t\t}\n\t\t}\n\t},\n\n\t_setHighlight: function( value ) {\n\t\tvalue = !!value;\n\t\tif ( value ) {\n\t\t\tthis.options.highlight = !!value;\n\t\t\tthis.refresh();\n\t\t} else if ( this.valuebg ) {\n\t\t\tthis.valuebg.remove();\n\t\t\tthis.valuebg = false;\n\t\t}\n\t},\n\n\t_setTheme: function( value ) {\n\t\tthis.handle\n\t\t\t.removeClass( \"ui-btn-\" + this.options.theme )\n\t\t\t.addClass( \"ui-btn-\" + value );\n\n\t\tvar currentTheme = this.options.theme ? this.options.theme : \"inherit\",\n\t\t\tnewTheme = value ? value : \"inherit\";\n\n\t\tthis.control\n\t\t\t.removeClass( \"ui-body-\" + currentTheme )\n\t\t\t.addClass( \"ui-body-\" + newTheme );\n\t},\n\n\t_setTrackTheme: function( value ) {\n\t\tvar currentTrackTheme = this.options.trackTheme ? this.options.trackTheme : \"inherit\",\n\t\t\tnewTrackTheme = value ? value : \"inherit\";\n\n\t\tthis.slider\n\t\t\t.removeClass( \"ui-body-\" + currentTrackTheme )\n\t\t\t.addClass( \"ui-body-\" + newTrackTheme );\n\t},\n\n\t_setMini: function( value ) {\n\t\tvalue = !!value;\n\t\tif ( !this.isToggleSwitch && !this.isRangeslider ) {\n\t\t\tthis.slider.parent().toggleClass( \"ui-mini\", value );\n\t\t\tthis.element.toggleClass( \"ui-mini\", value );\n\t\t}\n\t\tthis.slider.toggleClass( \"ui-mini\", value );\n\t},\n\n\t_setCorners: function( value ) {\n\t\tthis.slider.toggleClass( \"ui-corner-all\", value );\n\n\t\tif ( !this.isToggleSwitch ) {\n\t\t\tthis.control.toggleClass( \"ui-corner-all\", value );\n\t\t}\n\t},\n\n\t_setDisabled: function( value ) {\n\t\tvalue = !!value;\n\t\tthis.element.prop( \"disabled\", value );\n\t\tthis.slider\n\t\t\t.toggleClass( \"ui-state-disabled\", value )\n\t\t\t.attr( \"aria-disabled\", value );\n\n\t\tthis.element.toggleClass( \"ui-state-disabled\", value );\n\t}\n\n}, $.mobile.behaviors.formReset ) );\n\n})( jQuery );\n\n(function( $, undefined ) {\n\nvar popup;\n\nfunction getPopup() {\n\tif ( !popup ) {\n\t\tpopup = $( \"<div></div>\", {\n\t\t\t\"class\": \"ui-slider-popup ui-shadow ui-corner-all\"\n\t\t});\n\t}\n\treturn popup.clone();\n}\n\n$.widget( \"mobile.slider\", $.mobile.slider, {\n\toptions: {\n\t\tpopupEnabled: false,\n\t\tshowValue: false\n\t},\n\n\t_create: function() {\n\t\tthis._super();\n\n\t\t$.extend( this, {\n\t\t\t_currentValue: null,\n\t\t\t_popup: null,\n\t\t\t_popupVisible: false\n\t\t});\n\n\t\tthis._setOption( \"popupEnabled\", this.options.popupEnabled );\n\n\t\tthis._on( this.handle, { \"vmousedown\" : \"_showPopup\" } );\n\t\tthis._on( this.slider.add( this.document ), { \"vmouseup\" : \"_hidePopup\" } );\n\t\tthis._refresh();\n\t},\n\n\t// position the popup centered 5px above the handle\n\t_positionPopup: function() {\n\t\tvar dstOffset = this.handle.offset();\n\n\t\tthis._popup.offset( {\n\t\t\tleft: dstOffset.left + ( this.handle.width() - this._popup.width() ) / 2,\n\t\t\ttop: dstOffset.top - this._popup.outerHeight() - 5\n\t\t});\n\t},\n\n\t_setOption: function( key, value ) {\n\t\tthis._super( key, value );\n\n\t\tif ( key === \"showValue\" ) {\n\t\t\tthis.handle.html( value && !this.options.mini ? this._value() : \"\" );\n\t\t} else if ( key === \"popupEnabled\" ) {\n\t\t\tif ( value && !this._popup ) {\n\t\t\t\tthis._popup = getPopup()\n\t\t\t\t\t.addClass( \"ui-body-\" + ( this.options.theme || \"a\" ) )\n\t\t\t\t\t.hide()\n\t\t\t\t\t.insertBefore( this.element );\n\t\t\t}\n\t\t}\n\t},\n\n\t// show value on the handle and in popup\n\trefresh: function() {\n\t\tthis._super.apply( this, arguments );\n\t\tthis._refresh();\n\t},\n\n\t_refresh: function() {\n\t\tvar o = this.options, newValue;\n\n\t\tif ( o.popupEnabled ) {\n\t\t\t// remove the title attribute from the handle (which is\n\t\t\t// responsible for the annoying tooltip); NB we have\n\t\t\t// to do it here as the jqm slider sets it every time\n\t\t\t// the slider's value changes :(\n\t\t\tthis.handle.removeAttr( \"title\" );\n\t\t}\n\n\t\tnewValue = this._value();\n\t\tif ( newValue === this._currentValue ) {\n\t\t\treturn;\n\t\t}\n\t\tthis._currentValue = newValue;\n\n\t\tif ( o.popupEnabled && this._popup ) {\n\t\t\tthis._positionPopup();\n\t\t\tthis._popup.html( newValue );\n\t\t}\n\n\t\tif ( o.showValue && !this.options.mini ) {\n\t\t\tthis.handle.html( newValue );\n\t\t}\n\t},\n\n\t_showPopup: function() {\n\t\tif ( this.options.popupEnabled && !this._popupVisible ) {\n\t\t\tthis.handle.html( \"\" );\n\t\t\tthis._popup.show();\n\t\t\tthis._positionPopup();\n\t\t\tthis._popupVisible = true;\n\t\t}\n\t},\n\n\t_hidePopup: function() {\n\t\tvar o = this.options;\n\n\t\tif ( o.popupEnabled && this._popupVisible ) {\n\t\t\tif ( o.showValue && !o.mini ) {\n\t\t\t\tthis.handle.html( this._value() );\n\t\t\t}\n\t\t\tthis._popup.hide();\n\t\t\tthis._popupVisible = false;\n\t\t}\n\t}\n});\n\n})( jQuery );\n\n(function( $, undefined ) {\n\n$.widget( \"mobile.flipswitch\", $.extend({\n\n\toptions: {\n\t\tonText: \"On\",\n\t\toffText: \"Off\",\n\t\ttheme: null,\n\t\tenhanced: false,\n\t\twrapperClass: null,\n\t\tcorners: true,\n\t\tmini: false\n\t},\n\n\t_create: function() {\n\t\t\tif ( !this.options.enhanced ) {\n\t\t\t\tthis._enhance();\n\t\t\t} else {\n\t\t\t\t$.extend( this, {\n\t\t\t\t\tflipswitch: this.element.parent(),\n\t\t\t\t\ton: this.element.find( \".ui-flipswitch-on\" ).eq( 0 ),\n\t\t\t\t\toff: this.element.find( \".ui-flipswitch-off\" ).eq(0),\n\t\t\t\t\ttype: this.element.get( 0 ).tagName\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tthis._handleFormReset();\n\n\t\t\t// Transfer tabindex to \"on\" element and make input unfocusable\n\t\t\tthis._originalTabIndex = this.element.attr( \"tabindex\" );\n\t\t\tif ( this._originalTabIndex != null ) {\n\t\t\t\tthis.on.attr( \"tabindex\", this._originalTabIndex );\n\t\t\t}\n\t\t\tthis.element.attr( \"tabindex\", \"-1\" );\n\t\t\tthis._on({\n\t\t\t\t\"focus\" : \"_handleInputFocus\"\n\t\t\t});\n\n\t\t\tif ( this.element.is( \":disabled\" ) ) {\n\t\t\t\tthis._setOptions({\n\t\t\t\t\t\"disabled\": true\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tthis._on( this.flipswitch, {\n\t\t\t\t\"click\": \"_toggle\",\n\t\t\t\t\"swipeleft\": \"_left\",\n\t\t\t\t\"swiperight\": \"_right\"\n\t\t\t});\n\n\t\t\tthis._on( this.on, {\n\t\t\t\t\"keydown\": \"_keydown\"\n\t\t\t});\n\n\t\t\tthis._on( {\n\t\t\t\t\"change\": \"refresh\"\n\t\t\t});\n\t},\n\n\t_handleInputFocus: function() {\n\t\tthis.on.focus();\n\t},\n\n\twidget: function() {\n\t\treturn this.flipswitch;\n\t},\n\n\t_left: function() {\n\t\tthis.flipswitch.removeClass( \"ui-flipswitch-active\" );\n\t\tif ( this.type === \"SELECT\" ) {\n\t\t\tthis.element.get( 0 ).selectedIndex = 0;\n\t\t} else {\n\t\t\tthis.element.prop( \"checked\", false );\n\t\t}\n\t\tthis.element.trigger( \"change\" );\n\t},\n\n\t_right: function() {\n\t\tthis.flipswitch.addClass( \"ui-flipswitch-active\" );\n\t\tif ( this.type === \"SELECT\" ) {\n\t\t\tthis.element.get( 0 ).selectedIndex = 1;\n\t\t} else {\n\t\t\tthis.element.prop( \"checked\", true );\n\t\t}\n\t\tthis.element.trigger( \"change\" );\n\t},\n\n\t_enhance: function() {\n\t\tvar flipswitch = $( \"<div>\" ),\n\t\t\toptions = this.options,\n\t\t\telement = this.element,\n\t\t\ttheme = options.theme ? options.theme : \"inherit\",\n\n\t\t\t// The \"on\" button is an anchor so it's focusable\n\t\t\ton = $( \"<a></a>\", {\n\t\t\t\t\"href\": \"#\"\n\t\t\t}),\n\t\t\toff = $( \"<span></span>\" ),\n\t\t\ttype = element.get( 0 ).tagName,\n\t\t\tonText = ( type === \"INPUT\" ) ?\n\t\t\t\toptions.onText : element.find( \"option\" ).eq( 1 ).text(),\n\t\t\toffText = ( type === \"INPUT\" ) ?\n\t\t\t\toptions.offText : element.find( \"option\" ).eq( 0 ).text();\n\n\t\t\ton\n\t\t\t\t.addClass( \"ui-flipswitch-on ui-btn ui-shadow ui-btn-inherit\" )\n\t\t\t\t.text( onText );\n\t\t\toff\n\t\t\t\t.addClass( \"ui-flipswitch-off\" )\n\t\t\t\t.text( offText );\n\n\t\t\tflipswitch\n\t\t\t\t.addClass( \"ui-flipswitch ui-shadow-inset \" +\n\t\t\t\t\t\"ui-bar-\" + theme + \" \" +\n\t\t\t\t\t( options.wrapperClass ? options.wrapperClass : \"\" ) + \" \" +\n\t\t\t\t\t( ( element.is( \":checked\" ) ||\n\t\t\t\t\t\telement\n\t\t\t\t\t\t\t.find( \"option\" )\n\t\t\t\t\t\t\t.eq( 1 )\n\t\t\t\t\t\t\t.is( \":selected\" ) ) ? \"ui-flipswitch-active\" : \"\" ) +\n\t\t\t\t\t( element.is(\":disabled\") ? \" ui-state-disabled\": \"\") +\n\t\t\t\t\t( options.corners ? \" ui-corner-all\": \"\" ) +\n\t\t\t\t\t( options.mini ? \" ui-mini\": \"\" ) )\n\t\t\t\t.append( on, off );\n\n\t\t\telement\n\t\t\t\t.addClass( \"ui-flipswitch-input\" )\n\t\t\t\t.after( flipswitch )\n\t\t\t\t.appendTo( flipswitch );\n\n\t\t$.extend( this, {\n\t\t\tflipswitch: flipswitch,\n\t\t\ton: on,\n\t\t\toff: off,\n\t\t\ttype: type\n\t\t});\n\t},\n\n\t_reset: function() {\n\t\tthis.refresh();\n\t},\n\n\trefresh: function() {\n\t\tvar direction,\n\t\t\texistingDirection = this.flipswitch.hasClass( \"ui-flipswitch-active\" ) ? \"_right\" : \"_left\";\n\n\t\tif ( this.type === \"SELECT\" ) {\n\t\t\tdirection = ( this.element.get( 0 ).selectedIndex > 0 ) ? \"_right\": \"_left\";\n\t\t} else {\n\t\t\tdirection = this.element.prop( \"checked\" ) ? \"_right\": \"_left\";\n\t\t}\n\n\t\tif ( direction !== existingDirection ) {\n\t\t\tthis[ direction ]();\n\t\t}\n\t},\n\n\t_toggle: function() {\n\t\tvar direction = this.flipswitch.hasClass( \"ui-flipswitch-active\" ) ? \"_left\" : \"_right\";\n\n\t\tthis[ direction ]();\n\t},\n\n\t_keydown: function( e ) {\n\t\tif ( e.which === $.mobile.keyCode.LEFT ) {\n\t\t\tthis._left();\n\t\t} else if ( e.which === $.mobile.keyCode.RIGHT ) {\n\t\t\tthis._right();\n\t\t} else if ( e.which === $.mobile.keyCode.SPACE ) {\n\t\t\tthis._toggle();\n\t\t\te.preventDefault();\n\t\t}\n\t},\n\n\t_setOptions: function( options ) {\n\t\tif ( options.theme !== undefined ) {\n\t\t\tvar currentTheme = options.theme ? options.theme : \"inherit\",\n\t\t\t\tnewTheme = options.theme ? options.theme : \"inherit\";\n\n\t\t\tthis.widget()\n\t\t\t\t.removeClass( \"ui-bar-\" + currentTheme )\n\t\t\t\t.addClass( \"ui-bar-\" + newTheme );\n\t\t}\n\t\tif ( options.onText !== undefined ) {\n\t\t\tthis.on.text( options.onText );\n\t\t}\n\t\tif ( options.offText !== undefined ) {\n\t\t\tthis.off.text( options.offText );\n\t\t}\n\t\tif ( options.disabled !== undefined ) {\n\t\t\tthis.widget().toggleClass( \"ui-state-disabled\", options.disabled );\n\t\t}\n\t\tif ( options.mini !== undefined ) {\n\t\t\tthis.widget().toggleClass( \"ui-mini\", options.mini );\n\t\t}\n\t\tif ( options.corners !== undefined ) {\n\t\t\tthis.widget().toggleClass( \"ui-corner-all\", options.corners );\n\t\t}\n\n\t\tthis._super( options );\n\t},\n\n\t_destroy: function() {\n\t\tif ( this.options.enhanced ) {\n\t\t\treturn;\n\t\t}\n\t\tif ( this._originalTabIndex != null ) {\n\t\t\tthis.element.attr( \"tabindex\", this._originalTabIndex );\n\t\t} else {\n\t\t\tthis.element.removeAttr( \"tabindex\" );\n\t\t}\n\t\tthis.on.remove();\n\t\tthis.off.remove();\n\t\tthis.element.unwrap();\n\t\tthis.flipswitch.remove();\n\t\tthis.removeClass( \"ui-flipswitch-input\" );\n\t}\n\n}, $.mobile.behaviors.formReset ) );\n\n})( jQuery );\n\n(function( $, undefined ) {\n\t$.widget( \"mobile.rangeslider\", $.extend( {\n\n\t\toptions: {\n\t\t\ttheme: null,\n\t\t\ttrackTheme: null,\n\t\t\tcorners: true,\n\t\t\tmini: false,\n\t\t\thighlight: true\n\t\t},\n\n\t\t_create: function() {\n\t\t\tvar $el = this.element,\n\t\t\telClass = this.options.mini ? \"ui-rangeslider ui-mini\" : \"ui-rangeslider\",\n\t\t\t_inputFirst = $el.find( \"input\" ).first(),\n\t\t\t_inputLast = $el.find( \"input\" ).last(),\n\t\t\t_label = $el.find( \"label\" ).first(),\n\t\t\t_sliderWidgetFirst = $.data( _inputFirst.get( 0 ), \"mobile-slider\" ) ||\n\t\t\t\t$.data( _inputFirst.slider().get( 0 ), \"mobile-slider\" ),\n\t\t\t_sliderWidgetLast = $.data( _inputLast.get(0), \"mobile-slider\" ) ||\n\t\t\t\t$.data( _inputLast.slider().get( 0 ), \"mobile-slider\" ),\n\t\t\t_sliderFirst = _sliderWidgetFirst.slider,\n\t\t\t_sliderLast = _sliderWidgetLast.slider,\n\t\t\tfirstHandle = _sliderWidgetFirst.handle,\n\t\t\t_sliders = $( \"<div class='ui-rangeslider-sliders' />\" ).appendTo( $el );\n\n\t\t\t_inputFirst.addClass( \"ui-rangeslider-first\" );\n\t\t\t_inputLast.addClass( \"ui-rangeslider-last\" );\n\t\t\t$el.addClass( elClass );\n\n\t\t\t_sliderFirst.appendTo( _sliders );\n\t\t\t_sliderLast.appendTo( _sliders );\n\t\t\t_label.insertBefore( $el );\n\t\t\tfirstHandle.prependTo( _sliderLast );\n\n\t\t\t$.extend( this, {\n\t\t\t\t_inputFirst: _inputFirst,\n\t\t\t\t_inputLast: _inputLast,\n\t\t\t\t_sliderFirst: _sliderFirst,\n\t\t\t\t_sliderLast: _sliderLast,\n\t\t\t\t_label: _label,\n\t\t\t\t_targetVal: null,\n\t\t\t\t_sliderTarget: false,\n\t\t\t\t_sliders: _sliders,\n\t\t\t\t_proxy: false\n\t\t\t});\n\n\t\t\tthis.refresh();\n\t\t\tthis._on( this.element.find( \"input.ui-slider-input\" ), {\n\t\t\t\t\"slidebeforestart\": \"_slidebeforestart\",\n\t\t\t\t\"slidestop\": \"_slidestop\",\n\t\t\t\t\"slidedrag\": \"_slidedrag\",\n\t\t\t\t\"slidebeforechange\": \"_change\",\n\t\t\t\t\"blur\": \"_change\",\n\t\t\t\t\"keyup\": \"_change\"\n\t\t\t});\n\t\t\tthis._on({\n\t\t\t\t\"mousedown\":\"_change\"\n\t\t\t});\n\t\t\tthis._on( this.element.closest( \"form\" ), {\n\t\t\t\t\"reset\":\"_handleReset\"\n\t\t\t});\n\t\t\tthis._on( firstHandle, {\n\t\t\t\t\"vmousedown\": \"_dragFirstHandle\"\n\t\t\t});\n\t\t},\n\t\t_handleReset: function() {\n\t\t\tvar self = this;\n\t\t\t//we must wait for the stack to unwind before updateing other wise sliders will not have updated yet\n\t\t\tsetTimeout( function() {\n\t\t\t\tself._updateHighlight();\n\t\t\t},0);\n\t\t},\n\n\t\t_dragFirstHandle: function( event ) {\n\t\t\t//if the first handle is dragged send the event to the first slider\n\t\t\t$.data( this._inputFirst.get(0), \"mobile-slider\" ).dragging = true;\n\t\t\t$.data( this._inputFirst.get(0), \"mobile-slider\" ).refresh( event );\n\t\t\t$.data( this._inputFirst.get(0), \"mobile-slider\" )._trigger( \"start\" );\n\t\t\treturn false;\n\t\t},\n\n\t\t_slidedrag: function( event ) {\n\t\t\tvar first = $( event.target ).is( this._inputFirst ),\n\t\t\t\totherSlider = ( first ) ? this._inputLast : this._inputFirst;\n\n\t\t\tthis._sliderTarget = false;\n\t\t\t//if the drag was initiated on an extreme and the other handle is focused send the events to\n\t\t\t//the closest handle\n\t\t\tif ( ( this._proxy === \"first\" && first ) || ( this._proxy === \"last\" && !first ) ) {\n\t\t\t\t$.data( otherSlider.get(0), \"mobile-slider\" ).dragging = true;\n\t\t\t\t$.data( otherSlider.get(0), \"mobile-slider\" ).refresh( event );\n\t\t\t\treturn false;\n\t\t\t}\n\t\t},\n\n\t\t_slidestop: function( event ) {\n\t\t\tvar first = $( event.target ).is( this._inputFirst );\n\n\t\t\tthis._proxy = false;\n\t\t\t//this stops dragging of the handle and brings the active track to the front\n\t\t\t//this makes clicks on the track go the the last handle used\n\t\t\tthis.element.find( \"input\" ).trigger( \"vmouseup\" );\n\t\t\tthis._sliderFirst.css( \"z-index\", first ? 1 : \"\" );\n\t\t},\n\n\t\t_slidebeforestart: function( event ) {\n\t\t\tthis._sliderTarget = false;\n\t\t\t//if the track is the target remember this and the original value\n\t\t\tif ( $( event.originalEvent.target ).hasClass( \"ui-slider-track\" ) ) {\n\t\t\t\tthis._sliderTarget = true;\n\t\t\t\tthis._targetVal = $( event.target ).val();\n\t\t\t}\n\t\t},\n\n\t\t_setOptions: function( options ) {\n\t\t\tif ( options.theme !== undefined ) {\n\t\t\t\tthis._setTheme( options.theme );\n\t\t\t}\n\n\t\t\tif ( options.trackTheme !== undefined ) {\n\t\t\t\tthis._setTrackTheme( options.trackTheme );\n\t\t\t}\n\n\t\t\tif ( options.mini !== undefined ) {\n\t\t\t\tthis._setMini( options.mini );\n\t\t\t}\n\n\t\t\tif ( options.highlight !== undefined ) {\n\t\t\t\tthis._setHighlight( options.highlight );\n\t\t\t}\n\n\t\t\tif ( options.disabled !== undefined ) {\n\t\t\t\tthis._setDisabled( options.disabled );\n\t\t\t}\n\n\t\t\tthis._super( options );\n\t\t\tthis.refresh();\n\t\t},\n\n\t\trefresh: function() {\n\t\t\tvar $el = this.element,\n\t\t\t\to = this.options;\n\n\t\t\tif ( this._inputFirst.is( \":disabled\" ) || this._inputLast.is( \":disabled\" ) ) {\n\t\t\t\tthis.options.disabled = true;\n\t\t\t}\n\n\t\t\t$el.find( \"input\" ).slider({\n\t\t\t\ttheme: o.theme,\n\t\t\t\ttrackTheme: o.trackTheme,\n\t\t\t\tdisabled: o.disabled,\n\t\t\t\tcorners: o.corners,\n\t\t\t\tmini: o.mini,\n\t\t\t\thighlight: o.highlight\n\t\t\t}).slider( \"refresh\" );\n\t\t\tthis._updateHighlight();\n\t\t},\n\n\t\t_change: function( event ) {\n\t\t\tif ( event.type === \"keyup\" ) {\n\t\t\t\tthis._updateHighlight();\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tvar self = this,\n\t\t\t\tmin = parseFloat( this._inputFirst.val(), 10 ),\n\t\t\t\tmax = parseFloat( this._inputLast.val(), 10 ),\n\t\t\t\tfirst = $( event.target ).hasClass( \"ui-rangeslider-first\" ),\n\t\t\t\tthisSlider = first ? this._inputFirst : this._inputLast,\n\t\t\t\totherSlider = first ? this._inputLast : this._inputFirst;\n\n\t\t\tif ( ( this._inputFirst.val() > this._inputLast.val() && event.type === \"mousedown\" && !$(event.target).hasClass(\"ui-slider-handle\")) ) {\n\t\t\t\tthisSlider.blur();\n\t\t\t} else if ( event.type === \"mousedown\" ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif ( min > max && !this._sliderTarget ) {\n\t\t\t\t//this prevents min from being greater then max\n\t\t\t\tthisSlider.val( first ? max: min ).slider( \"refresh\" );\n\t\t\t\tthis._trigger( \"normalize\" );\n\t\t\t} else if ( min > max ) {\n\t\t\t\t//this makes it so clicks on the target on either extreme go to the closest handle\n\t\t\t\tthisSlider.val( this._targetVal ).slider( \"refresh\" );\n\n\t\t\t\t//You must wait for the stack to unwind so first slider is updated before updating second\n\t\t\t\tsetTimeout( function() {\n\t\t\t\t\totherSlider.val( first ? min: max ).slider( \"refresh\" );\n\t\t\t\t\t$.data( otherSlider.get(0), \"mobile-slider\" ).handle.focus();\n\t\t\t\t\tself._sliderFirst.css( \"z-index\", first ? \"\" : 1 );\n\t\t\t\t\tself._trigger( \"normalize\" );\n\t\t\t\t}, 0 );\n\t\t\t\tthis._proxy = ( first ) ? \"first\" : \"last\";\n\t\t\t}\n\t\t\t//fixes issue where when both _sliders are at min they cannot be adjusted\n\t\t\tif ( min === max ) {\n\t\t\t\t$.data( thisSlider.get(0), \"mobile-slider\" ).handle.css( \"z-index\", 1 );\n\t\t\t\t$.data( otherSlider.get(0), \"mobile-slider\" ).handle.css( \"z-index\", 0 );\n\t\t\t} else {\n\t\t\t\t$.data( otherSlider.get(0), \"mobile-slider\" ).handle.css( \"z-index\", \"\" );\n\t\t\t\t$.data( thisSlider.get(0), \"mobile-slider\" ).handle.css( \"z-index\", \"\" );\n\t\t\t}\n\n\t\t\tthis._updateHighlight();\n\n\t\t\tif ( min >= max ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t},\n\n\t\t_updateHighlight: function() {\n\t\t\tvar min = parseInt( $.data( this._inputFirst.get(0), \"mobile-slider\" ).handle.get(0).style.left, 10 ),\n\t\t\t\tmax = parseInt( $.data( this._inputLast.get(0), \"mobile-slider\" ).handle.get(0).style.left, 10 ),\n\t\t\t\twidth = (max - min);\n\n\t\t\tthis.element.find( \".ui-slider-bg\" ).css({\n\t\t\t\t\"margin-left\": min + \"%\",\n\t\t\t\t\"width\": width + \"%\"\n\t\t\t});\n\t\t},\n\n\t\t_setTheme: function( value ) {\n\t\t\tthis._inputFirst.slider( \"option\", \"theme\", value );\n\t\t\tthis._inputLast.slider( \"option\", \"theme\", value );\n\t\t},\n\n\t\t_setTrackTheme: function( value ) {\n\t\t\tthis._inputFirst.slider( \"option\", \"trackTheme\", value );\n\t\t\tthis._inputLast.slider( \"option\", \"trackTheme\", value );\n\t\t},\n\n\t\t_setMini: function( value ) {\n\t\t\tthis._inputFirst.slider( \"option\", \"mini\", value );\n\t\t\tthis._inputLast.slider( \"option\", \"mini\", value );\n\t\t\tthis.element.toggleClass( \"ui-mini\", !!value );\n\t\t},\n\n\t\t_setHighlight: function( value ) {\n\t\t\tthis._inputFirst.slider( \"option\", \"highlight\", value );\n\t\t\tthis._inputLast.slider( \"option\", \"highlight\", value );\n\t\t},\n\n\t\t_setDisabled: function( value ) {\n\t\t\tthis._inputFirst.prop( \"disabled\", value );\n\t\t\tthis._inputLast.prop( \"disabled\", value );\n\t\t},\n\n\t\t_destroy: function() {\n\t\t\tthis._label.prependTo( this.element );\n\t\t\tthis.element.removeClass( \"ui-rangeslider ui-mini\" );\n\t\t\tthis._inputFirst.after( this._sliderFirst );\n\t\t\tthis._inputLast.after( this._sliderLast );\n\t\t\tthis._sliders.remove();\n\t\t\tthis.element.find( \"input\" ).removeClass( \"ui-rangeslider-first ui-rangeslider-last\" ).slider( \"destroy\" );\n\t\t}\n\n\t}, $.mobile.behaviors.formReset ) );\n\n})( jQuery );\n\n(function( $, undefined ) {\n\n\t$.widget( \"mobile.textinput\", $.mobile.textinput, {\n\t\toptions: {\n\t\t\tclearBtn: false,\n\t\t\tclearBtnText: \"Clear text\"\n\t\t},\n\n\t\t_create: function() {\n\t\t\tthis._super();\n\n\t\t\tif ( this.isSearch ) {\n\t\t\t\tthis.options.clearBtn = true;\n\t\t\t}\n\n\t\t\tif ( !!this.options.clearBtn && this.inputNeedsWrap ) {\n\t\t\t\tthis._addClearBtn();\n\t\t\t}\n\t\t},\n\n\t\tclearButton: function() {\n\t\t\treturn $( \"<a href='#' tabindex='-1' aria-hidden='true' \" +\n\t\t\t\t\"class='ui-input-clear ui-btn ui-icon-delete ui-btn-icon-notext ui-corner-all'>\" +\n\t\t\t\t\"</a>\" )\n\t\t\t\t\t.attr( \"title\", this.options.clearBtnText )\n\t\t\t\t\t.text( this.options.clearBtnText );\n\t\t},\n\n\t\t_clearBtnClick: function( event ) {\n\t\t\tthis.element.val( \"\" )\n\t\t\t\t\t.focus()\n\t\t\t\t\t.trigger( \"change\" );\n\n\t\t\tthis._clearBtn.addClass( \"ui-input-clear-hidden\" );\n\t\t\tevent.preventDefault();\n\t\t},\n\n\t\t_addClearBtn: function() {\n\n\t\t\tif ( !this.options.enhanced ) {\n\t\t\t\tthis._enhanceClear();\n\t\t\t}\n\n\t\t\t$.extend( this, {\n\t\t\t\t_clearBtn: this.widget().find(\"a.ui-input-clear\")\n\t\t\t});\n\n\t\t\tthis._bindClearEvents();\n\n\t\t\tthis._toggleClear();\n\n\t\t},\n\n\t\t_enhanceClear: function() {\n\n\t\t\tthis.clearButton().appendTo( this.widget() );\n\t\t\tthis.widget().addClass( \"ui-input-has-clear\" );\n\n\t\t},\n\n\t\t_bindClearEvents: function() {\n\n\t\t\tthis._on( this._clearBtn, {\n\t\t\t\t\"click\": \"_clearBtnClick\"\n\t\t\t});\n\n\t\t\tthis._on({\n\t\t\t\t\"keyup\": \"_toggleClear\",\n\t\t\t\t\"change\": \"_toggleClear\",\n\t\t\t\t\"input\": \"_toggleClear\",\n\t\t\t\t\"focus\": \"_toggleClear\",\n\t\t\t\t\"blur\": \"_toggleClear\",\n\t\t\t\t\"cut\": \"_toggleClear\",\n\t\t\t\t\"paste\": \"_toggleClear\"\n\n\t\t\t});\n\n\t\t},\n\n\t\t_unbindClear: function() {\n\t\t\tthis._off( this._clearBtn, \"click\");\n\t\t\tthis._off( this.element, \"keyup change input focus blur cut paste\" );\n\t\t},\n\n\t\t_setOptions: function( options ) {\n\t\t\tthis._super( options );\n\n\t\t\tif ( options.clearBtn !== undefined &&\n\t\t\t\t!this.element.is( \"textarea, :jqmData(type='range')\" ) ) {\n\t\t\t\tif ( options.clearBtn ) {\n\t\t\t\t\tthis._addClearBtn();\n\t\t\t\t} else {\n\t\t\t\t\tthis._destroyClear();\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( options.clearBtnText !== undefined && this._clearBtn !== undefined ) {\n\t\t\t\tthis._clearBtn.text( options.clearBtnText )\n\t\t\t\t\t.attr(\"title\", options.clearBtnText);\n\t\t\t}\n\t\t},\n\n\t\t_toggleClear: function() {\n\t\t\tthis._delay( \"_toggleClearClass\", 0 );\n\t\t},\n\n\t\t_toggleClearClass: function() {\n\t\t\tthis._clearBtn.toggleClass( \"ui-input-clear-hidden\", !this.element.val() );\n\t\t},\n\n\t\t_destroyClear: function() {\n\t\t\tthis.widget().removeClass( \"ui-input-has-clear\" );\n\t\t\tthis._unbindClear();\n\t\t\tthis._clearBtn.remove();\n\t\t},\n\n\t\t_destroy: function() {\n\t\t\tthis._super();\n\t\t\tif ( this.options.clearBtn ) {\n\t\t\t\tthis._destroyClear();\n\t\t\t}\n\t\t}\n\n\t});\n\n})( jQuery );\n\n(function( $, undefined ) {\n\n\t$.widget( \"mobile.textinput\", $.mobile.textinput, {\n\t\toptions: {\n\t\t\tautogrow:true,\n\t\t\tkeyupTimeoutBuffer: 100\n\t\t},\n\n\t\t_create: function() {\n\t\t\tthis._super();\n\n\t\t\tif ( this.options.autogrow && this.isTextarea ) {\n\t\t\t\tthis._autogrow();\n\t\t\t}\n\t\t},\n\n\t\t_autogrow: function() {\n\t\t\tthis.element.addClass( \"ui-textinput-autogrow\" );\n\n\t\t\tthis._on({\n\t\t\t\t\"keyup\": \"_timeout\",\n\t\t\t\t\"change\": \"_timeout\",\n\t\t\t\t\"input\": \"_timeout\",\n\t\t\t\t\"paste\": \"_timeout\"\n\t\t\t});\n\n\t\t\t// Attach to the various you-have-become-visible notifications that the\n\t\t\t// various framework elements emit.\n\t\t\t// TODO: Remove all but the updatelayout handler once #6426 is fixed.\n\t\t\tthis._on( true, this.document, {\n\n\t\t\t\t// TODO: Move to non-deprecated event\n\t\t\t\t\"pageshow\": \"_handleShow\",\n\t\t\t\t\"popupbeforeposition\": \"_handleShow\",\n\t\t\t\t\"updatelayout\": \"_handleShow\",\n\t\t\t\t\"panelopen\": \"_handleShow\"\n\t\t\t});\n\t\t},\n\n\t\t// Synchronously fix the widget height if this widget's parents are such\n\t\t// that they show/hide content at runtime. We still need to check whether\n\t\t// the widget is actually visible in case it is contained inside multiple\n\t\t// such containers. For example: panel contains collapsible contains\n\t\t// autogrow textinput. The panel may emit \"panelopen\" indicating that its\n\t\t// content has become visible, but the collapsible is still collapsed, so\n\t\t// the autogrow textarea is still not visible.\n\t\t_handleShow: function( event ) {\n\t\t\tif ( $.contains( event.target, this.element[ 0 ] ) &&\n\t\t\t\tthis.element.is( \":visible\" ) ) {\n\n\t\t\t\tif ( event.type !== \"popupbeforeposition\" ) {\n\t\t\t\t\tthis.element\n\t\t\t\t\t\t.addClass( \"ui-textinput-autogrow-resize\" )\n\t\t\t\t\t\t.animationComplete(\n\t\t\t\t\t\t\t$.proxy( function() {\n\t\t\t\t\t\t\t\tthis.element.removeClass( \"ui-textinput-autogrow-resize\" );\n\t\t\t\t\t\t\t}, this ),\n\t\t\t\t\t\t\"transition\" );\n\t\t\t\t}\n\t\t\t\tthis._prepareHeightUpdate();\n\t\t\t}\n\t\t},\n\n\t\t_unbindAutogrow: function() {\n\t\t\tthis.element.removeClass( \"ui-textinput-autogrow\" );\n\t\t\tthis._off( this.element, \"keyup change input paste\" );\n\t\t\tthis._off( this.document,\n\t\t\t\t\"pageshow popupbeforeposition updatelayout panelopen\" );\n\t\t},\n\n\t\tkeyupTimeout: null,\n\n\t\t_prepareHeightUpdate: function( delay ) {\n\t\t\tif ( this.keyupTimeout ) {\n\t\t\t\tclearTimeout( this.keyupTimeout );\n\t\t\t}\n\t\t\tif ( delay === undefined ) {\n\t\t\t\tthis._updateHeight();\n\t\t\t} else {\n\t\t\t\tthis.keyupTimeout = this._delay( \"_updateHeight\", delay );\n\t\t\t}\n\t\t},\n\n\t\t_timeout: function() {\n\t\t\tthis._prepareHeightUpdate( this.options.keyupTimeoutBuffer );\n\t\t},\n\n\t\t_updateHeight: function() {\n\t\t\tvar paddingTop, paddingBottom, paddingHeight, scrollHeight, clientHeight,\n\t\t\t\tborderTop, borderBottom, borderHeight, height,\n\t\t\t\tscrollTop = this.window.scrollTop();\n\t\t\tthis.keyupTimeout = 0;\n\n\t\t\t// IE8 textareas have the onpage property - others do not\n\t\t\tif ( !( \"onpage\" in this.element[ 0 ] ) ) {\n\t\t\t\tthis.element.css({\n\t\t\t\t\t\"height\": 0,\n\t\t\t\t\t\"min-height\": 0,\n\t\t\t\t\t\"max-height\": 0\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tscrollHeight = this.element[ 0 ].scrollHeight;\n\t\t\tclientHeight = this.element[ 0 ].clientHeight;\n\t\t\tborderTop = parseFloat( this.element.css( \"border-top-width\" ) );\n\t\t\tborderBottom = parseFloat( this.element.css( \"border-bottom-width\" ) );\n\t\t\tborderHeight = borderTop + borderBottom;\n\t\t\theight = scrollHeight + borderHeight + 15;\n\n\t\t\t// Issue 6179: Padding is not included in scrollHeight and\n\t\t\t// clientHeight by Firefox if no scrollbar is visible. Because\n\t\t\t// textareas use the border-box box-sizing model, padding should be\n\t\t\t// included in the new (assigned) height. Because the height is set\n\t\t\t// to 0, clientHeight == 0 in Firefox. Therefore, we can use this to\n\t\t\t// check if padding must be added.\n\t\t\tif ( clientHeight === 0 ) {\n\t\t\t\tpaddingTop = parseFloat( this.element.css( \"padding-top\" ) );\n\t\t\t\tpaddingBottom = parseFloat( this.element.css( \"padding-bottom\" ) );\n\t\t\t\tpaddingHeight = paddingTop + paddingBottom;\n\n\t\t\t\theight += paddingHeight;\n\t\t\t}\n\n\t\t\tthis.element.css({\n\t\t\t\t\"height\": height,\n\t\t\t\t\"min-height\": \"\",\n\t\t\t\t\"max-height\": \"\"\n\t\t\t});\n\n\t\t\tthis.window.scrollTop( scrollTop );\n\t\t},\n\n\t\trefresh: function() {\n\t\t\tif ( this.options.autogrow && this.isTextarea ) {\n\t\t\t\tthis._updateHeight();\n\t\t\t}\n\t\t},\n\n\t\t_setOptions: function( options ) {\n\n\t\t\tthis._super( options );\n\n\t\t\tif ( options.autogrow !== undefined && this.isTextarea ) {\n\t\t\t\tif ( options.autogrow ) {\n\t\t\t\t\tthis._autogrow();\n\t\t\t\t} else {\n\t\t\t\t\tthis._unbindAutogrow();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t});\n})( jQuery );\n\n(function( $, undefined ) {\n\n$.widget( \"mobile.selectmenu\", $.extend( {\n\tinitSelector: \"select:not( :jqmData(role='slider')):not( :jqmData(role='flipswitch') )\",\n\n\toptions: {\n\t\ttheme: null,\n\t\ticon: \"carat-d\",\n\t\ticonpos: \"right\",\n\t\tinline: false,\n\t\tcorners: true,\n\t\tshadow: true,\n\t\ticonshadow: false, /* TODO: Deprecated in 1.4, remove in 1.5. */\n\t\toverlayTheme: null,\n\t\tdividerTheme: null,\n\t\thidePlaceholderMenuItems: true,\n\t\tcloseText: \"Close\",\n\t\tnativeMenu: true,\n\t\t// This option defaults to true on iOS devices.\n\t\tpreventFocusZoom: /iPhone|iPad|iPod/.test( navigator.platform ) && navigator.userAgent.indexOf( \"AppleWebKit\" ) > -1,\n\t\tmini: false\n\t},\n\n\t_button: function() {\n\t\treturn $( \"<div/>\" );\n\t},\n\n\t_setDisabled: function( value ) {\n\t\tthis.element.attr( \"disabled\", value );\n\t\tthis.button.attr( \"aria-disabled\", value );\n\t\treturn this._setOption( \"disabled\", value );\n\t},\n\n\t_focusButton : function() {\n\t\tvar self = this;\n\n\t\tsetTimeout( function() {\n\t\t\tself.button.focus();\n\t\t}, 40);\n\t},\n\n\t_selectOptions: function() {\n\t\treturn this.select.find( \"option\" );\n\t},\n\n\t// setup items that are generally necessary for select menu extension\n\t_preExtension: function() {\n\t\tvar inline = this.options.inline || this.element.jqmData( \"inline\" ),\n\t\t\tmini = this.options.mini || this.element.jqmData( \"mini\" ),\n\t\t\tclasses = \"\";\n\t\t// TODO: Post 1.1--once we have time to test thoroughly--any classes manually applied to the original element should be carried over to the enhanced element, with an `-enhanced` suffix. See https://github.com/jquery/jquery-mobile/issues/3577\n\t\t/* if ( $el[0].className.length ) {\n\t\t\tclasses = $el[0].className;\n\t\t} */\n\t\tif ( !!~this.element[0].className.indexOf( \"ui-btn-left\" ) ) {\n\t\t\tclasses = \" ui-btn-left\";\n\t\t}\n\n\t\tif (  !!~this.element[0].className.indexOf( \"ui-btn-right\" ) ) {\n\t\t\tclasses = \" ui-btn-right\";\n\t\t}\n\n\t\tif ( inline ) {\n\t\t\tclasses += \" ui-btn-inline\";\n\t\t}\n\t\tif ( mini ) {\n\t\t\tclasses += \" ui-mini\";\n\t\t}\n\n\t\tthis.select = this.element.removeClass( \"ui-btn-left ui-btn-right\" ).wrap( \"<div class='ui-select\" + classes + \"'>\" );\n\t\tthis.selectId  = this.select.attr( \"id\" ) || ( \"select-\" + this.uuid );\n\t\tthis.buttonId = this.selectId + \"-button\";\n\t\tthis.label = $( \"label[for='\"+ this.selectId +\"']\" );\n\t\tthis.isMultiple = this.select[ 0 ].multiple;\n\t},\n\n\t_destroy: function() {\n\t\tvar wrapper = this.element.parents( \".ui-select\" );\n\t\tif ( wrapper.length > 0 ) {\n\t\t\tif ( wrapper.is( \".ui-btn-left, .ui-btn-right\" ) ) {\n\t\t\t\tthis.element.addClass( wrapper.hasClass( \"ui-btn-left\" ) ? \"ui-btn-left\" : \"ui-btn-right\" );\n\t\t\t}\n\t\t\tthis.element.insertAfter( wrapper );\n\t\t\twrapper.remove();\n\t\t}\n\t},\n\n\t_create: function() {\n\t\tthis._preExtension();\n\n\t\tthis.button = this._button();\n\n\t\tvar self = this,\n\n\t\t\toptions = this.options,\n\n\t\t\ticonpos = options.icon ? ( options.iconpos || this.select.jqmData( \"iconpos\" ) ) : false,\n\n\t\t\tbutton = this.button\n\t\t\t\t.insertBefore( this.select )\n\t\t\t\t.attr( \"id\", this.buttonId )\n\t\t\t\t.addClass( \"ui-btn\" +\n\t\t\t\t\t( options.icon ? ( \" ui-icon-\" + options.icon + \" ui-btn-icon-\" + iconpos +\n\t\t\t\t\t( options.iconshadow ? \" ui-shadow-icon\" : \"\" ) ) :\t\"\" ) + /* TODO: Remove in 1.5. */\n\t\t\t\t\t( options.theme ? \" ui-btn-\" + options.theme : \"\" ) +\n\t\t\t\t\t( options.corners ? \" ui-corner-all\" : \"\" ) +\n\t\t\t\t\t( options.shadow ? \" ui-shadow\" : \"\" ) );\n\n\t\tthis.setButtonText();\n\n\t\t// Opera does not properly support opacity on select elements\n\t\t// In Mini, it hides the element, but not its text\n\t\t// On the desktop,it seems to do the opposite\n\t\t// for these reasons, using the nativeMenu option results in a full native select in Opera\n\t\tif ( options.nativeMenu && window.opera && window.opera.version ) {\n\t\t\tbutton.addClass( \"ui-select-nativeonly\" );\n\t\t}\n\n\t\t// Add counter for multi selects\n\t\tif ( this.isMultiple ) {\n\t\t\tthis.buttonCount = $( \"<span>\" )\n\t\t\t\t.addClass( \"ui-li-count ui-body-inherit\" )\n\t\t\t\t.hide()\n\t\t\t\t.appendTo( button.addClass( \"ui-li-has-count\" ) );\n\t\t}\n\n\t\t// Disable if specified\n\t\tif ( options.disabled || this.element.attr( \"disabled\" )) {\n\t\t\tthis.disable();\n\t\t}\n\n\t\t// Events on native select\n\t\tthis.select.change(function() {\n\t\t\tself.refresh();\n\n\t\t\tif ( !!options.nativeMenu ) {\n\t\t\t\tself._delay( function() {\n\t\t\t\t\tself.select.blur();\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\n\t\tthis._handleFormReset();\n\n\t\tthis._on( this.button, {\n\t\t\tkeydown: \"_handleKeydown\"\n\t\t});\n\n\t\tthis.build();\n\t},\n\n\tbuild: function() {\n\t\tvar self = this;\n\n\t\tthis.select\n\t\t\t.appendTo( self.button )\n\t\t\t.bind( \"vmousedown\", function() {\n\t\t\t\t// Add active class to button\n\t\t\t\tself.button.addClass( $.mobile.activeBtnClass );\n\t\t\t})\n\t\t\t.bind( \"focus\", function() {\n\t\t\t\tself.button.addClass( $.mobile.focusClass );\n\t\t\t})\n\t\t\t.bind( \"blur\", function() {\n\t\t\t\tself.button.removeClass( $.mobile.focusClass );\n\t\t\t})\n\t\t\t.bind( \"focus vmouseover\", function() {\n\t\t\t\tself.button.trigger( \"vmouseover\" );\n\t\t\t})\n\t\t\t.bind( \"vmousemove\", function() {\n\t\t\t\t// Remove active class on scroll/touchmove\n\t\t\t\tself.button.removeClass( $.mobile.activeBtnClass );\n\t\t\t})\n\t\t\t.bind( \"change blur vmouseout\", function() {\n\t\t\t\tself.button.trigger( \"vmouseout\" )\n\t\t\t\t\t.removeClass( $.mobile.activeBtnClass );\n\t\t\t});\n\n\t\t// In many situations, iOS will zoom into the select upon tap, this prevents that from happening\n\t\tself.button.bind( \"vmousedown\", function() {\n\t\t\tif ( self.options.preventFocusZoom ) {\n\t\t\t\t\t$.mobile.zoom.disable( true );\n\t\t\t}\n\t\t});\n\t\tself.label.bind( \"click focus\", function() {\n\t\t\tif ( self.options.preventFocusZoom ) {\n\t\t\t\t\t$.mobile.zoom.disable( true );\n\t\t\t}\n\t\t});\n\t\tself.select.bind( \"focus\", function() {\n\t\t\tif ( self.options.preventFocusZoom ) {\n\t\t\t\t\t$.mobile.zoom.disable( true );\n\t\t\t}\n\t\t});\n\t\tself.button.bind( \"mouseup\", function() {\n\t\t\tif ( self.options.preventFocusZoom ) {\n\t\t\t\tsetTimeout(function() {\n\t\t\t\t\t$.mobile.zoom.enable( true );\n\t\t\t\t}, 0 );\n\t\t\t}\n\t\t});\n\t\tself.select.bind( \"blur\", function() {\n\t\t\tif ( self.options.preventFocusZoom ) {\n\t\t\t\t$.mobile.zoom.enable( true );\n\t\t\t}\n\t\t});\n\n\t},\n\n\tselected: function() {\n\t\treturn this._selectOptions().filter( \":selected\" );\n\t},\n\n\tselectedIndices: function() {\n\t\tvar self = this;\n\n\t\treturn this.selected().map(function() {\n\t\t\treturn self._selectOptions().index( this );\n\t\t}).get();\n\t},\n\n\tsetButtonText: function() {\n\t\tvar self = this,\n\t\t\tselected = this.selected(),\n\t\t\ttext = this.placeholder,\n\t\t\tspan = $( document.createElement( \"span\" ) );\n\n\t\tthis.button.children( \"span\" ).not( \".ui-li-count\" ).remove().end().end().prepend( (function() {\n\t\t\tif ( selected.length ) {\n\t\t\t\ttext = selected.map(function() {\n\t\t\t\t\treturn $( this ).text();\n\t\t\t\t}).get().join( \", \" );\n\t\t\t} else {\n\t\t\t\ttext = self.placeholder;\n\t\t\t}\n\n\t\t\tif ( text ) {\n\t\t\t\tspan.text( text );\n\t\t\t} else {\n\n\t\t\t\t// Set the contents to &nbsp; which we write as &#160; to be XHTML compliant - see gh-6699\n\t\t\t\tspan.html( \"&#160;\" );\n\t\t\t}\n\n\t\t\t// TODO possibly aggregate multiple select option classes\n\t\t\treturn span\n\t\t\t\t.addClass( self.select.attr( \"class\" ) )\n\t\t\t\t.addClass( selected.attr( \"class\" ) )\n\t\t\t\t.removeClass( \"ui-screen-hidden\" );\n\t\t})());\n\t},\n\n\tsetButtonCount: function() {\n\t\tvar selected = this.selected();\n\n\t\t// multiple count inside button\n\t\tif ( this.isMultiple ) {\n\t\t\tthis.buttonCount[ selected.length > 1 ? \"show\" : \"hide\" ]().text( selected.length );\n\t\t}\n\t},\n\n\t_handleKeydown: function( /* event */ ) {\n\t\tthis._delay( \"_refreshButton\" );\n\t},\n\n\t_reset: function() {\n\t\tthis.refresh();\n\t},\n\n\t_refreshButton: function() {\n\t\tthis.setButtonText();\n\t\tthis.setButtonCount();\n\t},\n\n\trefresh: function() {\n\t\tthis._refreshButton();\n\t},\n\n\t// open and close preserved in native selects\n\t// to simplify users code when looping over selects\n\topen: $.noop,\n\tclose: $.noop,\n\n\tdisable: function() {\n\t\tthis._setDisabled( true );\n\t\tthis.button.addClass( \"ui-state-disabled\" );\n\t},\n\n\tenable: function() {\n\t\tthis._setDisabled( false );\n\t\tthis.button.removeClass( \"ui-state-disabled\" );\n\t}\n}, $.mobile.behaviors.formReset ) );\n\n})( jQuery );\n\n(function( $, undefined ) {\n\n$.mobile.links = function( target ) {\n\n\t//links within content areas, tests included with page\n\t$( target )\n\t\t.find( \"a\" )\n\t\t.jqmEnhanceable()\n\t\t.filter( \":jqmData(rel='popup')[href][href!='']\" )\n\t\t.each( function() {\n\t\t\t// Accessibility info for popups\n\t\t\tvar element = this,\n\t\t\t\tidref = element.getAttribute( \"href\" ).substring( 1 );\n\n\t\t\tif ( idref ) {\n\t\t\t\telement.setAttribute( \"aria-haspopup\", true );\n\t\t\t\telement.setAttribute( \"aria-owns\", idref );\n\t\t\t\telement.setAttribute( \"aria-expanded\", false );\n\t\t\t}\n\t\t})\n\t\t.end()\n\t\t.not( \".ui-btn, :jqmData(role='none'), :jqmData(role='nojs')\" )\n\t\t.addClass( \"ui-link\" );\n\n};\n\n})( jQuery );\n\n\n(function( $, undefined ) {\n\nfunction fitSegmentInsideSegment( windowSize, segmentSize, offset, desired ) {\n\tvar returnValue = desired;\n\n\tif ( windowSize < segmentSize ) {\n\t\t// Center segment if it's bigger than the window\n\t\treturnValue = offset + ( windowSize - segmentSize ) / 2;\n\t} else {\n\t\t// Otherwise center it at the desired coordinate while keeping it completely inside the window\n\t\treturnValue = Math.min( Math.max( offset, desired - segmentSize / 2 ), offset + windowSize - segmentSize );\n\t}\n\n\treturn returnValue;\n}\n\nfunction getWindowCoordinates( theWindow ) {\n\treturn {\n\t\tx: theWindow.scrollLeft(),\n\t\ty: theWindow.scrollTop(),\n\t\tcx: ( theWindow[ 0 ].innerWidth || theWindow.width() ),\n\t\tcy: ( theWindow[ 0 ].innerHeight || theWindow.height() )\n\t};\n}\n\n$.widget( \"mobile.popup\", {\n\toptions: {\n\t\twrapperClass: null,\n\t\ttheme: null,\n\t\toverlayTheme: null,\n\t\tshadow: true,\n\t\tcorners: true,\n\t\ttransition: \"none\",\n\t\tpositionTo: \"origin\",\n\t\ttolerance: null,\n\t\tcloseLinkSelector: \"a:jqmData(rel='back')\",\n\t\tcloseLinkEvents: \"click.popup\",\n\t\tnavigateEvents: \"navigate.popup\",\n\t\tcloseEvents: \"navigate.popup pagebeforechange.popup\",\n\t\tdismissible: true,\n\t\tenhanced: false,\n\n\t\t// NOTE Windows Phone 7 has a scroll position caching issue that\n\t\t//      requires us to disable popup history management by default\n\t\t//      https://github.com/jquery/jquery-mobile/issues/4784\n\t\t//\n\t\t// NOTE this option is modified in _create!\n\t\thistory: !$.mobile.browser.oldIE\n\t},\n\n\t// When the user depresses the mouse/finger on an element inside the popup while the popup is\n\t// open, we ignore resize events for a short while. This prevents #6961.\n\t_handleDocumentVmousedown: function( theEvent ) {\n\t\tif ( this._isOpen && $.contains( this._ui.container[ 0 ], theEvent.target ) ) {\n\t\t\tthis._ignoreResizeEvents();\n\t\t}\n\t},\n\n\t_create: function() {\n\t\tvar theElement = this.element,\n\t\t\tmyId = theElement.attr( \"id\" ),\n\t\t\tcurrentOptions = this.options;\n\n\t\t// We need to adjust the history option to be false if there's no AJAX nav.\n\t\t// We can't do it in the option declarations because those are run before\n\t\t// it is determined whether there shall be AJAX nav.\n\t\tcurrentOptions.history = currentOptions.history && $.mobile.ajaxEnabled && $.mobile.hashListeningEnabled;\n\n\t\tthis._on( this.document, {\n\t\t\t\"vmousedown\": \"_handleDocumentVmousedown\"\n\t\t});\n\n\t\t// Define instance variables\n\t\t$.extend( this, {\n\t\t\t_scrollTop: 0,\n\t\t\t_page: theElement.closest( \".ui-page\" ),\n\t\t\t_ui: null,\n\t\t\t_fallbackTransition: \"\",\n\t\t\t_currentTransition: false,\n\t\t\t_prerequisites: null,\n\t\t\t_isOpen: false,\n\t\t\t_tolerance: null,\n\t\t\t_resizeData: null,\n\t\t\t_ignoreResizeTo: 0,\n\t\t\t_orientationchangeInProgress: false\n\t\t});\n\n\t\tif ( this._page.length === 0 ) {\n\t\t\tthis._page = $( \"body\" );\n\t\t}\n\n\t\tif ( currentOptions.enhanced ) {\n\t\t\tthis._ui = {\n\t\t\t\tcontainer: theElement.parent(),\n\t\t\t\tscreen: theElement.parent().prev(),\n\t\t\t\tplaceholder: $( this.document[ 0 ].getElementById( myId + \"-placeholder\" ) )\n\t\t\t};\n\t\t} else {\n\t\t\tthis._ui = this._enhance( theElement, myId );\n\t\t\tthis._applyTransition( currentOptions.transition );\n\t\t}\n\t\tthis\n\t\t\t._setTolerance( currentOptions.tolerance )\n\t\t\t._ui.focusElement = this._ui.container;\n\n\t\t// Event handlers\n\t\tthis._on( this._ui.screen, { \"vclick\": \"_eatEventAndClose\" } );\n\t\tthis._on( this.window, {\n\t\t\torientationchange: $.proxy( this, \"_handleWindowOrientationchange\" ),\n\t\t\tresize: $.proxy( this, \"_handleWindowResize\" ),\n\t\t\tkeyup: $.proxy( this, \"_handleWindowKeyUp\" )\n\t\t});\n\t\tthis._on( this.document, { \"focusin\": \"_handleDocumentFocusIn\" } );\n\t},\n\n\t_enhance: function( theElement, myId ) {\n\t\tvar currentOptions = this.options,\n\t\t\twrapperClass = currentOptions.wrapperClass,\n\t\t\tui = {\n\t\t\t\tscreen: $( \"<div class='ui-screen-hidden ui-popup-screen \" +\n\t\t\t\tthis._themeClassFromOption( \"ui-overlay-\", currentOptions.overlayTheme ) + \"'></div>\" ),\n\t\t\t\tplaceholder: $( \"<div style='display: none;'><!-- placeholder --></div>\" ),\n\t\t\t\tcontainer: $( \"<div class='ui-popup-container ui-popup-hidden ui-popup-truncate\" +\n\t\t\t\t\t( wrapperClass ? ( \" \" + wrapperClass ) : \"\" ) + \"'></div>\" )\n\t\t\t},\n\t\t\tfragment = this.document[ 0 ].createDocumentFragment();\n\n\t\tfragment.appendChild( ui.screen[ 0 ] );\n\t\tfragment.appendChild( ui.container[ 0 ] );\n\n\t\tif ( myId ) {\n\t\t\tui.screen.attr( \"id\", myId + \"-screen\" );\n\t\t\tui.container.attr( \"id\", myId + \"-popup\" );\n\t\t\tui.placeholder\n\t\t\t\t.attr( \"id\", myId + \"-placeholder\" )\n\t\t\t\t.html( \"<!-- placeholder for \" + myId + \" -->\" );\n\t\t}\n\n\t\t// Apply the proto\n\t\tthis._page[ 0 ].appendChild( fragment );\n\t\t// Leave a placeholder where the element used to be\n\t\tui.placeholder.insertAfter( theElement );\n\t\ttheElement\n\t\t\t.detach()\n\t\t\t.addClass( \"ui-popup \" +\n\t\t\t\tthis._themeClassFromOption( \"ui-body-\", currentOptions.theme ) + \" \" +\n\t\t\t\t( currentOptions.shadow ? \"ui-overlay-shadow \" : \"\" ) +\n\t\t\t\t( currentOptions.corners ? \"ui-corner-all \" : \"\" ) )\n\t\t\t.appendTo( ui.container );\n\n\t\treturn ui;\n\t},\n\n\t_eatEventAndClose: function( theEvent ) {\n\t\ttheEvent.preventDefault();\n\t\ttheEvent.stopImmediatePropagation();\n\t\tif ( this.options.dismissible ) {\n\t\t\tthis.close();\n\t\t}\n\t\treturn false;\n\t},\n\n\t// Make sure the screen covers the entire document - CSS is sometimes not\n\t// enough to accomplish this.\n\t_resizeScreen: function() {\n\t\tvar screen = this._ui.screen,\n\t\t\tpopupHeight = this._ui.container.outerHeight( true ),\n\t\t\tscreenHeight = screen.removeAttr( \"style\" ).height(),\n\n\t\t\t// Subtracting 1 here is necessary for an obscure Andrdoid 4.0 bug where\n\t\t\t// the browser hangs if the screen covers the entire document :/\n\t\t\tdocumentHeight = this.document.height() - 1;\n\n\t\tif ( screenHeight < documentHeight ) {\n\t\t\tscreen.height( documentHeight );\n\t\t} else if ( popupHeight > screenHeight ) {\n\t\t\tscreen.height( popupHeight );\n\t\t}\n\t},\n\n\t_handleWindowKeyUp: function( theEvent ) {\n\t\tif ( this._isOpen && theEvent.keyCode === $.mobile.keyCode.ESCAPE ) {\n\t\t\treturn this._eatEventAndClose( theEvent );\n\t\t}\n\t},\n\n\t_expectResizeEvent: function() {\n\t\tvar windowCoordinates = getWindowCoordinates( this.window );\n\n\t\tif ( this._resizeData ) {\n\t\t\tif ( windowCoordinates.x === this._resizeData.windowCoordinates.x &&\n\t\t\t\twindowCoordinates.y === this._resizeData.windowCoordinates.y &&\n\t\t\t\twindowCoordinates.cx === this._resizeData.windowCoordinates.cx &&\n\t\t\t\twindowCoordinates.cy === this._resizeData.windowCoordinates.cy ) {\n\t\t\t\t// timeout not refreshed\n\t\t\t\treturn false;\n\t\t\t} else {\n\t\t\t\t// clear existing timeout - it will be refreshed below\n\t\t\t\tclearTimeout( this._resizeData.timeoutId );\n\t\t\t}\n\t\t}\n\n\t\tthis._resizeData = {\n\t\t\ttimeoutId: this._delay( \"_resizeTimeout\", 200 ),\n\t\t\twindowCoordinates: windowCoordinates\n\t\t};\n\n\t\treturn true;\n\t},\n\n\t_resizeTimeout: function() {\n\t\tif ( this._isOpen ) {\n\t\t\tif ( !this._expectResizeEvent() ) {\n\t\t\t\tif ( this._ui.container.hasClass( \"ui-popup-hidden\" ) ) {\n\t\t\t\t\t// effectively rapid-open the popup while leaving the screen intact\n\t\t\t\t\tthis._ui.container.removeClass( \"ui-popup-hidden ui-popup-truncate\" );\n\t\t\t\t\tthis.reposition( { positionTo: \"window\" } );\n\t\t\t\t\tthis._ignoreResizeEvents();\n\t\t\t\t}\n\n\t\t\t\tthis._resizeScreen();\n\t\t\t\tthis._resizeData = null;\n\t\t\t\tthis._orientationchangeInProgress = false;\n\t\t\t}\n\t\t} else {\n\t\t\tthis._resizeData = null;\n\t\t\tthis._orientationchangeInProgress = false;\n\t\t}\n\t},\n\n\t_stopIgnoringResizeEvents: function() {\n\t\tthis._ignoreResizeTo = 0;\n\t},\n\n\t_ignoreResizeEvents: function() {\n\t\tif ( this._ignoreResizeTo ) {\n\t\t\tclearTimeout( this._ignoreResizeTo );\n\t\t}\n\t\tthis._ignoreResizeTo = this._delay( \"_stopIgnoringResizeEvents\", 1000 );\n\t},\n\n\t_handleWindowResize: function(/* theEvent */) {\n\t\tif ( this._isOpen && this._ignoreResizeTo === 0 ) {\n\t\t\tif ( ( this._expectResizeEvent() || this._orientationchangeInProgress ) &&\n\t\t\t\t!this._ui.container.hasClass( \"ui-popup-hidden\" ) ) {\n\t\t\t\t// effectively rapid-close the popup while leaving the screen intact\n\t\t\t\tthis._ui.container\n\t\t\t\t\t.addClass( \"ui-popup-hidden ui-popup-truncate\" )\n\t\t\t\t\t.removeAttr( \"style\" );\n\t\t\t}\n\t\t}\n\t},\n\n\t_handleWindowOrientationchange: function(/* theEvent */) {\n\t\tif ( !this._orientationchangeInProgress && this._isOpen && this._ignoreResizeTo === 0 ) {\n\t\t\tthis._expectResizeEvent();\n\t\t\tthis._orientationchangeInProgress = true;\n\t\t}\n\t},\n\n\t// When the popup is open, attempting to focus on an element that is not a\n\t// child of the popup will redirect focus to the popup\n\t_handleDocumentFocusIn: function( theEvent ) {\n\t\tvar target,\n\t\t\ttargetElement = theEvent.target,\n\t\t\tui = this._ui;\n\n\t\tif ( !this._isOpen ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( targetElement !== ui.container[ 0 ] ) {\n\t\t\ttarget = $( targetElement );\n\t\t\tif ( !$.contains( ui.container[ 0 ], targetElement ) ) {\n\t\t\t\t$( this.document[ 0 ].activeElement ).one( \"focus\", $.proxy( function() {\n\t\t\t\t\tthis._safelyBlur( targetElement );\n\t\t\t\t}, this ) );\n\t\t\t\tui.focusElement.focus();\n\t\t\t\ttheEvent.preventDefault();\n\t\t\t\ttheEvent.stopImmediatePropagation();\n\t\t\t\treturn false;\n\t\t\t} else if ( ui.focusElement[ 0 ] === ui.container[ 0 ] ) {\n\t\t\t\tui.focusElement = target;\n\t\t\t}\n\t\t}\n\n\t\tthis._ignoreResizeEvents();\n\t},\n\n\t_themeClassFromOption: function( prefix, value ) {\n\t\treturn ( value ? ( value === \"none\" ? \"\" : ( prefix + value ) ) : ( prefix + \"inherit\" ) );\n\t},\n\n\t_applyTransition: function( value ) {\n\t\tif ( value ) {\n\t\t\tthis._ui.container.removeClass( this._fallbackTransition );\n\t\t\tif ( value !== \"none\" ) {\n\t\t\t\tthis._fallbackTransition = $.mobile._maybeDegradeTransition( value );\n\t\t\t\tif ( this._fallbackTransition === \"none\" ) {\n\t\t\t\t\tthis._fallbackTransition = \"\";\n\t\t\t\t}\n\t\t\t\tthis._ui.container.addClass( this._fallbackTransition );\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\t_setOptions: function( newOptions ) {\n\t\tvar currentOptions = this.options,\n\t\t\ttheElement = this.element,\n\t\t\tscreen = this._ui.screen;\n\n\t\tif ( newOptions.wrapperClass !== undefined ) {\n\t\t\tthis._ui.container\n\t\t\t\t.removeClass( currentOptions.wrapperClass )\n\t\t\t\t.addClass( newOptions.wrapperClass );\n\t\t}\n\n\t\tif ( newOptions.theme !== undefined ) {\n\t\t\ttheElement\n\t\t\t\t.removeClass( this._themeClassFromOption( \"ui-body-\", currentOptions.theme ) )\n\t\t\t\t.addClass( this._themeClassFromOption( \"ui-body-\", newOptions.theme ) );\n\t\t}\n\n\t\tif ( newOptions.overlayTheme !== undefined ) {\n\t\t\tscreen\n\t\t\t\t.removeClass( this._themeClassFromOption( \"ui-overlay-\", currentOptions.overlayTheme ) )\n\t\t\t\t.addClass( this._themeClassFromOption( \"ui-overlay-\", newOptions.overlayTheme ) );\n\n\t\t\tif ( this._isOpen ) {\n\t\t\t\tscreen.addClass( \"in\" );\n\t\t\t}\n\t\t}\n\n\t\tif ( newOptions.shadow !== undefined ) {\n\t\t\ttheElement.toggleClass( \"ui-overlay-shadow\", newOptions.shadow );\n\t\t}\n\n\t\tif ( newOptions.corners !== undefined ) {\n\t\t\ttheElement.toggleClass( \"ui-corner-all\", newOptions.corners );\n\t\t}\n\n\t\tif ( newOptions.transition !== undefined ) {\n\t\t\tif ( !this._currentTransition ) {\n\t\t\t\tthis._applyTransition( newOptions.transition );\n\t\t\t}\n\t\t}\n\n\t\tif ( newOptions.tolerance !== undefined ) {\n\t\t\tthis._setTolerance( newOptions.tolerance );\n\t\t}\n\n\t\tif ( newOptions.disabled !== undefined ) {\n\t\t\tif ( newOptions.disabled ) {\n\t\t\t\tthis.close();\n\t\t\t}\n\t\t}\n\n\t\treturn this._super( newOptions );\n\t},\n\n\t_setTolerance: function( value ) {\n\t\tvar tol = { t: 30, r: 15, b: 30, l: 15 },\n\t\t\tar;\n\n\t\tif ( value !== undefined ) {\n\t\t\tar = String( value ).split( \",\" );\n\n\t\t\t$.each( ar, function( idx, val ) { ar[ idx ] = parseInt( val, 10 ); } );\n\n\t\t\tswitch( ar.length ) {\n\t\t\t\t// All values are to be the same\n\t\t\t\tcase 1:\n\t\t\t\t\tif ( !isNaN( ar[ 0 ] ) ) {\n\t\t\t\t\t\ttol.t = tol.r = tol.b = tol.l = ar[ 0 ];\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\n\t\t\t\t// The first value denotes top/bottom tolerance, and the second value denotes left/right tolerance\n\t\t\t\tcase 2:\n\t\t\t\t\tif ( !isNaN( ar[ 0 ] ) ) {\n\t\t\t\t\t\ttol.t = tol.b = ar[ 0 ];\n\t\t\t\t\t}\n\t\t\t\t\tif ( !isNaN( ar[ 1 ] ) ) {\n\t\t\t\t\t\ttol.l = tol.r = ar[ 1 ];\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\n\t\t\t\t// The array contains values in the order top, right, bottom, left\n\t\t\t\tcase 4:\n\t\t\t\t\tif ( !isNaN( ar[ 0 ] ) ) {\n\t\t\t\t\t\ttol.t = ar[ 0 ];\n\t\t\t\t\t}\n\t\t\t\t\tif ( !isNaN( ar[ 1 ] ) ) {\n\t\t\t\t\t\ttol.r = ar[ 1 ];\n\t\t\t\t\t}\n\t\t\t\t\tif ( !isNaN( ar[ 2 ] ) ) {\n\t\t\t\t\t\ttol.b = ar[ 2 ];\n\t\t\t\t\t}\n\t\t\t\t\tif ( !isNaN( ar[ 3 ] ) ) {\n\t\t\t\t\t\ttol.l = ar[ 3 ];\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tthis._tolerance = tol;\n\t\treturn this;\n\t},\n\n\t_clampPopupWidth: function( infoOnly ) {\n\t\tvar menuSize,\n\t\t\twindowCoordinates = getWindowCoordinates( this.window ),\n\t\t\t// rectangle within which the popup must fit\n\t\t\trectangle = {\n\t\t\t\tx: this._tolerance.l,\n\t\t\t\ty: windowCoordinates.y + this._tolerance.t,\n\t\t\t\tcx: windowCoordinates.cx - this._tolerance.l - this._tolerance.r,\n\t\t\t\tcy: windowCoordinates.cy - this._tolerance.t - this._tolerance.b\n\t\t\t};\n\n\t\tif ( !infoOnly ) {\n\t\t\t// Clamp the width of the menu before grabbing its size\n\t\t\tthis._ui.container.css( \"max-width\", rectangle.cx );\n\t\t}\n\n\t\tmenuSize = {\n\t\t\tcx: this._ui.container.outerWidth( true ),\n\t\t\tcy: this._ui.container.outerHeight( true )\n\t\t};\n\n\t\treturn { rc: rectangle, menuSize: menuSize };\n\t},\n\n\t_calculateFinalLocation: function( desired, clampInfo ) {\n\t\tvar returnValue,\n\t\t\trectangle = clampInfo.rc,\n\t\t\tmenuSize = clampInfo.menuSize;\n\n\t\t// Center the menu over the desired coordinates, while not going outside\n\t\t// the window tolerances. This will center wrt. the window if the popup is\n\t\t// too large.\n\t\treturnValue = {\n\t\t\tleft: fitSegmentInsideSegment( rectangle.cx, menuSize.cx, rectangle.x, desired.x ),\n\t\t\ttop: fitSegmentInsideSegment( rectangle.cy, menuSize.cy, rectangle.y, desired.y )\n\t\t};\n\n\t\t// Make sure the top of the menu is visible\n\t\treturnValue.top = Math.max( 0, returnValue.top );\n\n\t\t// If the height of the menu is smaller than the height of the document\n\t\t// align the bottom with the bottom of the document\n\n\t\treturnValue.top -= Math.min( returnValue.top,\n\t\t\tMath.max( 0, returnValue.top + menuSize.cy - this.document.height() ) );\n\n\t\treturn returnValue;\n\t},\n\n\t// Try and center the overlay over the given coordinates\n\t_placementCoords: function( desired ) {\n\t\treturn this._calculateFinalLocation( desired, this._clampPopupWidth() );\n\t},\n\n\t_createPrerequisites: function( screenPrerequisite, containerPrerequisite, whenDone ) {\n\t\tvar prerequisites,\n\t\t\tself = this;\n\n\t\t// It is important to maintain both the local variable prerequisites and\n\t\t// self._prerequisites. The local variable remains in the closure of the\n\t\t// functions which call the callbacks passed in. The comparison between the\n\t\t// local variable and self._prerequisites is necessary, because once a\n\t\t// function has been passed to .animationComplete() it will be called next\n\t\t// time an animation completes, even if that's not the animation whose end\n\t\t// the function was supposed to catch (for example, if an abort happens\n\t\t// during the opening animation, the .animationComplete handler is not\n\t\t// called for that animation anymore, but the handler remains attached, so\n\t\t// it is called the next time the popup is opened - making it stale.\n\t\t// Comparing the local variable prerequisites to the widget-level variable\n\t\t// self._prerequisites ensures that callbacks triggered by a stale\n\t\t// .animationComplete will be ignored.\n\n\t\tprerequisites = {\n\t\t\tscreen: $.Deferred(),\n\t\t\tcontainer: $.Deferred()\n\t\t};\n\n\t\tprerequisites.screen.then( function() {\n\t\t\tif ( prerequisites === self._prerequisites ) {\n\t\t\t\tscreenPrerequisite();\n\t\t\t}\n\t\t});\n\n\t\tprerequisites.container.then( function() {\n\t\t\tif ( prerequisites === self._prerequisites ) {\n\t\t\t\tcontainerPrerequisite();\n\t\t\t}\n\t\t});\n\n\t\t$.when( prerequisites.screen, prerequisites.container ).done( function() {\n\t\t\tif ( prerequisites === self._prerequisites ) {\n\t\t\t\tself._prerequisites = null;\n\t\t\t\twhenDone();\n\t\t\t}\n\t\t});\n\n\t\tself._prerequisites = prerequisites;\n\t},\n\n\t_animate: function( args ) {\n\t\t// NOTE before removing the default animation of the screen\n\t\t//      this had an animate callback that would resolve the deferred\n\t\t//      now the deferred is resolved immediately\n\t\t// TODO remove the dependency on the screen deferred\n\t\tthis._ui.screen\n\t\t\t.removeClass( args.classToRemove )\n\t\t\t.addClass( args.screenClassToAdd );\n\n\t\targs.prerequisites.screen.resolve();\n\n\t\tif ( args.transition && args.transition !== \"none\" ) {\n\t\t\tif ( args.applyTransition ) {\n\t\t\t\tthis._applyTransition( args.transition );\n\t\t\t}\n\t\t\tif ( this._fallbackTransition ) {\n\t\t\t\tthis._ui.container\n\t\t\t\t\t.addClass( args.containerClassToAdd )\n\t\t\t\t\t.removeClass( args.classToRemove )\n\t\t\t\t\t.animationComplete( $.proxy( args.prerequisites.container, \"resolve\" ) );\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\tthis._ui.container.removeClass( args.classToRemove );\n\t\targs.prerequisites.container.resolve();\n\t},\n\n\t// The desired coordinates passed in will be returned untouched if no reference element can be identified via\n\t// desiredPosition.positionTo. Nevertheless, this function ensures that its return value always contains valid\n\t// x and y coordinates by specifying the center middle of the window if the coordinates are absent.\n\t// options: { x: coordinate, y: coordinate, positionTo: string: \"origin\", \"window\", or jQuery selector\n\t_desiredCoords: function( openOptions ) {\n\t\tvar offset,\n\t\t\tdst = null,\n\t\t\twindowCoordinates = getWindowCoordinates( this.window ),\n\t\t\tx = openOptions.x,\n\t\t\ty = openOptions.y,\n\t\t\tpTo = openOptions.positionTo;\n\n\t\t// Establish which element will serve as the reference\n\t\tif ( pTo && pTo !== \"origin\" ) {\n\t\t\tif ( pTo === \"window\" ) {\n\t\t\t\tx = windowCoordinates.cx / 2 + windowCoordinates.x;\n\t\t\t\ty = windowCoordinates.cy / 2 + windowCoordinates.y;\n\t\t\t} else {\n\t\t\t\ttry {\n\t\t\t\t\tdst = $( pTo );\n\t\t\t\t} catch( err ) {\n\t\t\t\t\tdst = null;\n\t\t\t\t}\n\t\t\t\tif ( dst ) {\n\t\t\t\t\tdst.filter( \":visible\" );\n\t\t\t\t\tif ( dst.length === 0 ) {\n\t\t\t\t\t\tdst = null;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// If an element was found, center over it\n\t\tif ( dst ) {\n\t\t\toffset = dst.offset();\n\t\t\tx = offset.left + dst.outerWidth() / 2;\n\t\t\ty = offset.top + dst.outerHeight() / 2;\n\t\t}\n\n\t\t// Make sure x and y are valid numbers - center over the window\n\t\tif ( $.type( x ) !== \"number\" || isNaN( x ) ) {\n\t\t\tx = windowCoordinates.cx / 2 + windowCoordinates.x;\n\t\t}\n\t\tif ( $.type( y ) !== \"number\" || isNaN( y ) ) {\n\t\t\ty = windowCoordinates.cy / 2 + windowCoordinates.y;\n\t\t}\n\n\t\treturn { x: x, y: y };\n\t},\n\n\t_reposition: function( openOptions ) {\n\t\t// We only care about position-related parameters for repositioning\n\t\topenOptions = {\n\t\t\tx: openOptions.x,\n\t\t\ty: openOptions.y,\n\t\t\tpositionTo: openOptions.positionTo\n\t\t};\n\t\tthis._trigger( \"beforeposition\", undefined, openOptions );\n\t\tthis._ui.container.offset( this._placementCoords( this._desiredCoords( openOptions ) ) );\n\t},\n\n\treposition: function( openOptions ) {\n\t\tif ( this._isOpen ) {\n\t\t\tthis._reposition( openOptions );\n\t\t}\n\t},\n\n\t_safelyBlur: function( currentElement ){\n\t\tif ( currentElement !== this.window[ 0 ] &&\n\t\t\tcurrentElement.nodeName.toLowerCase() !== \"body\" ) {\n\t\t\t\t$( currentElement ).blur();\n\t\t}\n\t},\n\n\t_openPrerequisitesComplete: function() {\n\t\tvar id = this.element.attr( \"id\" ),\n\t\t\tfirstFocus = this._ui.container.find( \":focusable\" ).first();\n\n\t\tthis._ui.container.addClass( \"ui-popup-active\" );\n\t\tthis._isOpen = true;\n\t\tthis._resizeScreen();\n\n\t\t// Check to see if currElement is not a child of the container.  If it's not, blur\n\t\tif ( !$.contains( this._ui.container[ 0 ], this.document[ 0 ].activeElement ) ) {\n\t\t\tthis._safelyBlur( this.document[ 0 ].activeElement );\n\t\t}\n\t\tif ( firstFocus.length > 0 ) {\n\t\t\tthis._ui.focusElement = firstFocus;\n\t\t}\n\t\tthis._ignoreResizeEvents();\n\t\tif ( id ) {\n\t\t\tthis.document.find( \"[aria-haspopup='true'][aria-owns='\" +  id + \"']\" ).attr( \"aria-expanded\", true );\n\t\t}\n\t\tthis._trigger( \"afteropen\" );\n\t},\n\n\t_open: function( options ) {\n\t\tvar openOptions = $.extend( {}, this.options, options ),\n\t\t\t// TODO move blacklist to private method\n\t\t\tandroidBlacklist = ( function() {\n\t\t\t\tvar ua = navigator.userAgent,\n\t\t\t\t\t// Rendering engine is Webkit, and capture major version\n\t\t\t\t\twkmatch = ua.match( /AppleWebKit\\/([0-9\\.]+)/ ),\n\t\t\t\t\twkversion = !!wkmatch && wkmatch[ 1 ],\n\t\t\t\t\tandroidmatch = ua.match( /Android (\\d+(?:\\.\\d+))/ ),\n\t\t\t\t\tandversion = !!androidmatch && androidmatch[ 1 ],\n\t\t\t\t\tchromematch = ua.indexOf( \"Chrome\" ) > -1;\n\n\t\t\t\t// Platform is Android, WebKit version is greater than 534.13 ( Android 3.2.1 ) and not Chrome.\n\t\t\t\tif ( androidmatch !== null && andversion === \"4.0\" && wkversion && wkversion > 534.13 && !chromematch ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t}());\n\n\t\t// Count down to triggering \"popupafteropen\" - we have two prerequisites:\n\t\t// 1. The popup window animation completes (container())\n\t\t// 2. The screen opacity animation completes (screen())\n\t\tthis._createPrerequisites(\n\t\t\t$.noop,\n\t\t\t$.noop,\n\t\t\t$.proxy( this, \"_openPrerequisitesComplete\" ) );\n\n\t\tthis._currentTransition = openOptions.transition;\n\t\tthis._applyTransition( openOptions.transition );\n\n\t\tthis._ui.screen.removeClass( \"ui-screen-hidden\" );\n\t\tthis._ui.container.removeClass( \"ui-popup-truncate\" );\n\n\t\t// Give applications a chance to modify the contents of the container before it appears\n\t\tthis._reposition( openOptions );\n\n\t\tthis._ui.container.removeClass( \"ui-popup-hidden\" );\n\n\t\tif ( this.options.overlayTheme && androidBlacklist ) {\n\t\t\t/* TODO: The native browser on Android 4.0.X (\"Ice Cream Sandwich\") suffers from an issue where the popup overlay appears to be z-indexed above the popup itself when certain other styles exist on the same page -- namely, any element set to `position: fixed` and certain types of input. These issues are reminiscent of previously uncovered bugs in older versions of Android's native browser: https://github.com/scottjehl/Device-Bugs/issues/3\n\t\t\tThis fix closes the following bugs ( I use \"closes\" with reluctance, and stress that this issue should be revisited as soon as possible ):\n\t\t\thttps://github.com/jquery/jquery-mobile/issues/4816\n\t\t\thttps://github.com/jquery/jquery-mobile/issues/4844\n\t\t\thttps://github.com/jquery/jquery-mobile/issues/4874\n\t\t\t*/\n\n\t\t\t// TODO sort out why this._page isn't working\n\t\t\tthis.element.closest( \".ui-page\" ).addClass( \"ui-popup-open\" );\n\t\t}\n\t\tthis._animate({\n\t\t\tadditionalCondition: true,\n\t\t\ttransition: openOptions.transition,\n\t\t\tclassToRemove: \"\",\n\t\t\tscreenClassToAdd: \"in\",\n\t\t\tcontainerClassToAdd: \"in\",\n\t\t\tapplyTransition: false,\n\t\t\tprerequisites: this._prerequisites\n\t\t});\n\t},\n\n\t_closePrerequisiteScreen: function() {\n\t\tthis._ui.screen\n\t\t\t.removeClass( \"out\" )\n\t\t\t.addClass( \"ui-screen-hidden\" );\n\t},\n\n\t_closePrerequisiteContainer: function() {\n\t\tthis._ui.container\n\t\t\t.removeClass( \"reverse out\" )\n\t\t\t.addClass( \"ui-popup-hidden ui-popup-truncate\" )\n\t\t\t.removeAttr( \"style\" );\n\t},\n\n\t_closePrerequisitesDone: function() {\n\t\tvar container = this._ui.container,\n\t\t\tid = this.element.attr( \"id\" );\n\n\t\t// remove the global mutex for popups\n\t\t$.mobile.popup.active = undefined;\n\n\t\t// Blur elements inside the container, including the container\n\t\t$( \":focus\", container[ 0 ] ).add( container[ 0 ] ).blur();\n\n\t\tif ( id ) {\n\t\t\tthis.document.find( \"[aria-haspopup='true'][aria-owns='\" +  id + \"']\" ).attr( \"aria-expanded\", false );\n\t\t}\n\n\t\t// alert users that the popup is closed\n\t\tthis._trigger( \"afterclose\" );\n\t},\n\n\t_close: function( immediate ) {\n\t\tthis._ui.container.removeClass( \"ui-popup-active\" );\n\t\tthis._page.removeClass( \"ui-popup-open\" );\n\n\t\tthis._isOpen = false;\n\n\t\t// Count down to triggering \"popupafterclose\" - we have two prerequisites:\n\t\t// 1. The popup window reverse animation completes (container())\n\t\t// 2. The screen opacity animation completes (screen())\n\t\tthis._createPrerequisites(\n\t\t\t$.proxy( this, \"_closePrerequisiteScreen\" ),\n\t\t\t$.proxy( this, \"_closePrerequisiteContainer\" ),\n\t\t\t$.proxy( this, \"_closePrerequisitesDone\" ) );\n\n\t\tthis._animate( {\n\t\t\tadditionalCondition: this._ui.screen.hasClass( \"in\" ),\n\t\t\ttransition: ( immediate ? \"none\" : ( this._currentTransition ) ),\n\t\t\tclassToRemove: \"in\",\n\t\t\tscreenClassToAdd: \"out\",\n\t\t\tcontainerClassToAdd: \"reverse out\",\n\t\t\tapplyTransition: true,\n\t\t\tprerequisites: this._prerequisites\n\t\t});\n\t},\n\n\t_unenhance: function() {\n\t\tif ( this.options.enhanced ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Put the element back to where the placeholder was and remove the \"ui-popup\" class\n\t\tthis._setOptions( { theme: $.mobile.popup.prototype.options.theme } );\n\t\tthis.element\n\t\t\t// Cannot directly insertAfter() - we need to detach() first, because\n\t\t\t// insertAfter() will do nothing if the payload div was not attached\n\t\t\t// to the DOM at the time the widget was created, and so the payload\n\t\t\t// will remain inside the container even after we call insertAfter().\n\t\t\t// If that happens and we remove the container a few lines below, we\n\t\t\t// will cause an infinite recursion - #5244\n\t\t\t.detach()\n\t\t\t.insertAfter( this._ui.placeholder )\n\t\t\t.removeClass( \"ui-popup ui-overlay-shadow ui-corner-all ui-body-inherit\" );\n\t\tthis._ui.screen.remove();\n\t\tthis._ui.container.remove();\n\t\tthis._ui.placeholder.remove();\n\t},\n\n\t_destroy: function() {\n\t\tif ( $.mobile.popup.active === this ) {\n\t\t\tthis.element.one( \"popupafterclose\", $.proxy( this, \"_unenhance\" ) );\n\t\t\tthis.close();\n\t\t} else {\n\t\t\tthis._unenhance();\n\t\t}\n\n\t\treturn this;\n\t},\n\n\t_closePopup: function( theEvent, data ) {\n\t\tvar parsedDst, toUrl,\n\t\t\tcurrentOptions = this.options,\n\t\t\timmediate = false;\n\n\t\tif ( ( theEvent && theEvent.isDefaultPrevented() ) || $.mobile.popup.active !== this ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// restore location on screen\n\t\twindow.scrollTo( 0, this._scrollTop );\n\n\t\tif ( theEvent && theEvent.type === \"pagebeforechange\" && data ) {\n\t\t\t// Determine whether we need to rapid-close the popup, or whether we can\n\t\t\t// take the time to run the closing transition\n\t\t\tif ( typeof data.toPage === \"string\" ) {\n\t\t\t\tparsedDst = data.toPage;\n\t\t\t} else {\n\t\t\t\tparsedDst = data.toPage.jqmData( \"url\" );\n\t\t\t}\n\t\t\tparsedDst = $.mobile.path.parseUrl( parsedDst );\n\t\t\ttoUrl = parsedDst.pathname + parsedDst.search + parsedDst.hash;\n\n\t\t\tif ( this._myUrl !== $.mobile.path.makeUrlAbsolute( toUrl ) ) {\n\t\t\t\t// Going to a different page - close immediately\n\t\t\t\timmediate = true;\n\t\t\t} else {\n\t\t\t\ttheEvent.preventDefault();\n\t\t\t}\n\t\t}\n\n\t\t// remove nav bindings\n\t\tthis.window.off( currentOptions.closeEvents );\n\t\t// unbind click handlers added when history is disabled\n\t\tthis.element.undelegate( currentOptions.closeLinkSelector, currentOptions.closeLinkEvents );\n\n\t\tthis._close( immediate );\n\t},\n\n\t// any navigation event after a popup is opened should close the popup\n\t// NOTE the pagebeforechange is bound to catch navigation events that don't\n\t//      alter the url (eg, dialogs from popups)\n\t_bindContainerClose: function() {\n\t\tthis.window\n\t\t\t.on( this.options.closeEvents, $.proxy( this, \"_closePopup\" ) );\n\t},\n\n\twidget: function() {\n\t\treturn this._ui.container;\n\t},\n\n\t// TODO no clear deliniation of what should be here and\n\t// what should be in _open. Seems to be \"visual\" vs \"history\" for now\n\topen: function( options ) {\n\t\tvar url, hashkey, activePage, currentIsDialog, hasHash, urlHistory,\n\t\t\tself = this,\n\t\t\tcurrentOptions = this.options;\n\n\t\t// make sure open is idempotent\n\t\tif ( $.mobile.popup.active || currentOptions.disabled ) {\n\t\t\treturn this;\n\t\t}\n\n\t\t// set the global popup mutex\n\t\t$.mobile.popup.active = this;\n\t\tthis._scrollTop = this.window.scrollTop();\n\n\t\t// if history alteration is disabled close on navigate events\n\t\t// and leave the url as is\n\t\tif ( !( currentOptions.history ) ) {\n\t\t\tself._open( options );\n\t\t\tself._bindContainerClose();\n\n\t\t\t// When histoy is disabled we have to grab the data-rel\n\t\t\t// back link clicks so we can close the popup instead of\n\t\t\t// relying on history to do it for us\n\t\t\tself.element\n\t\t\t\t.delegate( currentOptions.closeLinkSelector, currentOptions.closeLinkEvents, function( theEvent ) {\n\t\t\t\t\tself.close();\n\t\t\t\t\ttheEvent.preventDefault();\n\t\t\t\t});\n\n\t\t\treturn this;\n\t\t}\n\n\t\t// cache some values for min/readability\n\t\turlHistory = $.mobile.navigate.history;\n\t\thashkey = $.mobile.dialogHashKey;\n\t\tactivePage = $.mobile.activePage;\n\t\tcurrentIsDialog = ( activePage ? activePage.hasClass( \"ui-dialog\" ) : false );\n\t\tthis._myUrl = url = urlHistory.getActive().url;\n\t\thasHash = ( url.indexOf( hashkey ) > -1 ) && !currentIsDialog && ( urlHistory.activeIndex > 0 );\n\n\t\tif ( hasHash ) {\n\t\t\tself._open( options );\n\t\t\tself._bindContainerClose();\n\t\t\treturn this;\n\t\t}\n\n\t\t// if the current url has no dialog hash key proceed as normal\n\t\t// otherwise, if the page is a dialog simply tack on the hash key\n\t\tif ( url.indexOf( hashkey ) === -1 && !currentIsDialog ) {\n\t\t\turl = url + (url.indexOf( \"#\" ) > -1 ? hashkey : \"#\" + hashkey);\n\t\t} else {\n\t\t\turl = $.mobile.path.parseLocation().hash + hashkey;\n\t\t}\n\n\t\t// swallow the the initial navigation event, and bind for the next\n\t\tthis.window.one( \"beforenavigate\", function( theEvent ) {\n\t\t\ttheEvent.preventDefault();\n\t\t\tself._open( options );\n\t\t\tself._bindContainerClose();\n\t\t});\n\n\t\tthis.urlAltered = true;\n\t\t$.mobile.navigate( url, { role: \"dialog\" } );\n\n\t\treturn this;\n\t},\n\n\tclose: function() {\n\t\t// make sure close is idempotent\n\t\tif ( $.mobile.popup.active !== this ) {\n\t\t\treturn this;\n\t\t}\n\n\t\tthis._scrollTop = this.window.scrollTop();\n\n\t\tif ( this.options.history && this.urlAltered ) {\n\t\t\t$.mobile.back();\n\t\t\tthis.urlAltered = false;\n\t\t} else {\n\t\t\t// simulate the nav bindings having fired\n\t\t\tthis._closePopup();\n\t\t}\n\n\t\treturn this;\n\t}\n});\n\n// TODO this can be moved inside the widget\n$.mobile.popup.handleLink = function( $link ) {\n\tvar offset,\n\t\tpath = $.mobile.path,\n\n\t\t// NOTE make sure to get only the hash from the href because ie7 (wp7)\n\t\t//      returns the absolute href in this case ruining the element selection\n\t\tpopup = $( path.hashToSelector( path.parseUrl( $link.attr( \"href\" ) ).hash ) ).first();\n\n\tif ( popup.length > 0 && popup.data( \"mobile-popup\" ) ) {\n\t\toffset = $link.offset();\n\t\tpopup.popup( \"open\", {\n\t\t\tx: offset.left + $link.outerWidth() / 2,\n\t\t\ty: offset.top + $link.outerHeight() / 2,\n\t\t\ttransition: $link.jqmData( \"transition\" ),\n\t\t\tpositionTo: $link.jqmData( \"position-to\" )\n\t\t});\n\t}\n\n\t//remove after delay\n\tsetTimeout( function() {\n\t\t$link.removeClass( $.mobile.activeBtnClass );\n\t}, 300 );\n};\n\n// TODO move inside _create\n$.mobile.document.on( \"pagebeforechange\", function( theEvent, data ) {\n\tif ( data.options.role === \"popup\" ) {\n\t\t$.mobile.popup.handleLink( data.options.link );\n\t\ttheEvent.preventDefault();\n\t}\n});\n\n})( jQuery );\n\n/*\n* custom \"selectmenu\" plugin\n*/\n\n(function( $, undefined ) {\n\nvar unfocusableItemSelector = \".ui-disabled,.ui-state-disabled,.ui-li-divider,.ui-screen-hidden,:jqmData(role='placeholder')\",\n\tgoToAdjacentItem = function( item, target, direction ) {\n\t\tvar adjacent = item[ direction + \"All\" ]()\n\t\t\t.not( unfocusableItemSelector )\n\t\t\t.first();\n\n\t\t// if there's a previous option, focus it\n\t\tif ( adjacent.length ) {\n\t\t\ttarget\n\t\t\t\t.blur()\n\t\t\t\t.attr( \"tabindex\", \"-1\" );\n\n\t\t\tadjacent.find( \"a\" ).first().focus();\n\t\t}\n\t};\n\n$.widget( \"mobile.selectmenu\", $.mobile.selectmenu, {\n\t_create: function() {\n\t\tvar o = this.options;\n\n\t\t// Custom selects cannot exist inside popups, so revert the \"nativeMenu\"\n\t\t// option to true if a parent is a popup\n\t\to.nativeMenu = o.nativeMenu || ( this.element.parents( \":jqmData(role='popup'),:mobile-popup\" ).length > 0 );\n\n\t\treturn this._super();\n\t},\n\n\t_handleSelectFocus: function() {\n\t\tthis.element.blur();\n\t\tthis.button.focus();\n\t},\n\n\t_handleKeydown: function( event ) {\n\t\tthis._super( event );\n\t\tthis._handleButtonVclickKeydown( event );\n\t},\n\n\t_handleButtonVclickKeydown: function( event ) {\n\t\tif ( this.options.disabled || this.isOpen || this.options.nativeMenu ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (event.type === \"vclick\" ||\n\t\t\t\tevent.keyCode && (event.keyCode === $.mobile.keyCode.ENTER || event.keyCode === $.mobile.keyCode.SPACE)) {\n\n\t\t\tthis._decideFormat();\n\t\t\tif ( this.menuType === \"overlay\" ) {\n\t\t\t\tthis.button.attr( \"href\", \"#\" + this.popupId ).attr( \"data-\" + ( $.mobile.ns || \"\" ) + \"rel\", \"popup\" );\n\t\t\t} else {\n\t\t\t\tthis.button.attr( \"href\", \"#\" + this.dialogId ).attr( \"data-\" + ( $.mobile.ns || \"\" ) + \"rel\", \"dialog\" );\n\t\t\t}\n\t\t\tthis.isOpen = true;\n\t\t\t// Do not prevent default, so the navigation may have a chance to actually open the chosen format\n\t\t}\n\t},\n\n\t_handleListFocus: function( e ) {\n\t\tvar params = ( e.type === \"focusin\" ) ?\n\t\t\t{ tabindex: \"0\", event: \"vmouseover\" }:\n\t\t\t{ tabindex: \"-1\", event: \"vmouseout\" };\n\n\t\t$( e.target )\n\t\t\t.attr( \"tabindex\", params.tabindex )\n\t\t\t.trigger( params.event );\n\t},\n\n\t_handleListKeydown: function( event ) {\n\t\tvar target = $( event.target ),\n\t\t\tli = target.closest( \"li\" );\n\n\t\t// switch logic based on which key was pressed\n\t\tswitch ( event.keyCode ) {\n\t\t\t// up or left arrow keys\n\t\tcase 38:\n\t\t\tgoToAdjacentItem( li, target, \"prev\" );\n\t\t\treturn false;\n\t\t\t// down or right arrow keys\n\t\tcase 40:\n\t\t\tgoToAdjacentItem( li, target, \"next\" );\n\t\t\treturn false;\n\t\t\t// If enter or space is pressed, trigger click\n\t\tcase 13:\n\t\tcase 32:\n\t\t\ttarget.trigger( \"click\" );\n\t\t\treturn false;\n\t\t}\n\t},\n\n\t_handleMenuPageHide: function() {\n\n\t\t// After the dialog's done, we may want to trigger change if the value has actually changed\n\t\tthis._delayedTrigger();\n\n\t\t// TODO centralize page removal binding / handling in the page plugin.\n\t\t// Suggestion from @jblas to do refcounting\n\t\t//\n\t\t// TODO extremely confusing dependency on the open method where the pagehide.remove\n\t\t// bindings are stripped to prevent the parent page from disappearing. The way\n\t\t// we're keeping pages in the DOM right now sucks\n\t\t//\n\t\t// rebind the page remove that was unbound in the open function\n\t\t// to allow for the parent page removal from actions other than the use\n\t\t// of a dialog sized custom select\n\t\t//\n\t\t// doing this here provides for the back button on the custom select dialog\n\t\tthis.thisPage.page( \"bindRemove\" );\n\t},\n\n\t_handleHeaderCloseClick: function() {\n\t\tif ( this.menuType === \"overlay\" ) {\n\t\t\tthis.close();\n\t\t\treturn false;\n\t\t}\n\t},\n\n\t_handleListItemClick: function( event ) {\n\t\tvar listItem = $( event.target ).closest( \"li\" ),\n\n\t\t\t// Index of option tag to be selected\n\t\t\toldIndex = this.select[ 0 ].selectedIndex,\n\t\t\tnewIndex = $.mobile.getAttribute( listItem, \"option-index\" ),\n\t\t\toption = this._selectOptions().eq( newIndex )[ 0 ];\n\n\t\t// Toggle selected status on the tag for multi selects\n\t\toption.selected = this.isMultiple ? !option.selected : true;\n\n\t\t// Toggle checkbox class for multiple selects\n\t\tif ( this.isMultiple ) {\n\t\t\tlistItem.find( \"a\" )\n\t\t\t\t.toggleClass( \"ui-checkbox-on\", option.selected )\n\t\t\t\t.toggleClass( \"ui-checkbox-off\", !option.selected );\n\t\t}\n\n\t\t// If it's not a multiple select, trigger change after it has finished closing\n\t\tif ( !this.isMultiple && oldIndex !== newIndex ) {\n\t\t\tthis._triggerChange = true;\n\t\t}\n\n\t\t// Trigger change if it's a multiple select\n\t\t// Hide custom select for single selects only - otherwise focus clicked item\n\t\t// We need to grab the clicked item the hard way, because the list may have been rebuilt\n\t\tif ( this.isMultiple ) {\n\t\t\tthis.select.trigger( \"change\" );\n\t\t\tthis.list.find( \"li:not(.ui-li-divider)\" ).eq( newIndex )\n\t\t\t\t.find( \"a\" ).first().focus();\n\t\t}\n\t\telse {\n\t\t\tthis.close();\n\t\t}\n\n\t\tevent.preventDefault();\n\t},\n\n\tbuild: function() {\n\t\tvar selectId, popupId, dialogId, label, thisPage, isMultiple, menuId,\n\t\t\tthemeAttr, overlayTheme, overlayThemeAttr, dividerThemeAttr,\n\t\t\tmenuPage, listbox, list, header, headerTitle, menuPageContent,\n\t\t\tmenuPageClose, headerClose,\n\t\t\to = this.options;\n\n\t\tif ( o.nativeMenu ) {\n\t\t\treturn this._super();\n\t\t}\n\n\t\tselectId = this.selectId;\n\t\tpopupId = selectId + \"-listbox\";\n\t\tdialogId = selectId + \"-dialog\";\n\t\tlabel = this.label;\n\t\tthisPage = this.element.closest( \".ui-page\" );\n\t\tisMultiple = this.element[ 0 ].multiple;\n\t\tmenuId = selectId + \"-menu\";\n\t\tthemeAttr = o.theme ? ( \" data-\" + $.mobile.ns + \"theme='\" + o.theme + \"'\" ) : \"\";\n\t\toverlayTheme = o.overlayTheme || o.theme || null;\n\t\toverlayThemeAttr = overlayTheme ? ( \" data-\" + $.mobile.ns +\n\t\t\t\"overlay-theme='\" + overlayTheme + \"'\" ) : \"\";\n\t\tdividerThemeAttr = ( o.dividerTheme && isMultiple ) ? ( \" data-\" + $.mobile.ns + \"divider-theme='\" + o.dividerTheme + \"'\" ) : \"\";\n\t\tmenuPage = $( \"<div data-\" + $.mobile.ns + \"role='dialog' class='ui-selectmenu' id='\" + dialogId + \"'\" + themeAttr + overlayThemeAttr + \">\" +\n\t\t\t\"<div data-\" + $.mobile.ns + \"role='header'>\" +\n\t\t\t\"<div class='ui-title'></div>\"+\n\t\t\t\"</div>\"+\n\t\t\t\"<div data-\" + $.mobile.ns + \"role='content'></div>\"+\n\t\t\t\"</div>\" );\n\t\tlistbox = $( \"<div\" + themeAttr + overlayThemeAttr + \" id='\" + popupId +\n\t\t\t\t\"' class='ui-selectmenu'></div>\" )\n\t\t\t.insertAfter( this.select )\n\t\t\t.popup();\n\t\tlist = $( \"<ul class='ui-selectmenu-list' id='\" + menuId + \"' role='listbox' aria-labelledby='\" + this.buttonId + \"'\" + themeAttr + dividerThemeAttr + \"></ul>\" ).appendTo( listbox );\n\t\theader = $( \"<div class='ui-header ui-bar-\" + ( o.theme ? o.theme : \"inherit\" ) + \"'></div>\" ).prependTo( listbox );\n\t\theaderTitle = $( \"<h1 class='ui-title'></h1>\" ).appendTo( header );\n\n\t\tif ( this.isMultiple ) {\n\t\t\theaderClose = $( \"<a>\", {\n\t\t\t\t\"role\": \"button\",\n\t\t\t\t\"text\": o.closeText,\n\t\t\t\t\"href\": \"#\",\n\t\t\t\t\"class\": \"ui-btn ui-corner-all ui-btn-left ui-btn-icon-notext ui-icon-delete\"\n\t\t\t}).appendTo( header );\n\t\t}\n\n\t\t$.extend( this, {\n\t\t\tselectId: selectId,\n\t\t\tmenuId: menuId,\n\t\t\tpopupId: popupId,\n\t\t\tdialogId: dialogId,\n\t\t\tthisPage: thisPage,\n\t\t\tmenuPage: menuPage,\n\t\t\tlabel: label,\n\t\t\tisMultiple: isMultiple,\n\t\t\ttheme: o.theme,\n\t\t\tlistbox: listbox,\n\t\t\tlist: list,\n\t\t\theader: header,\n\t\t\theaderTitle: headerTitle,\n\t\t\theaderClose: headerClose,\n\t\t\tmenuPageContent: menuPageContent,\n\t\t\tmenuPageClose: menuPageClose,\n\t\t\tplaceholder: \"\"\n\t\t});\n\n\t\t// Create list from select, update state\n\t\tthis.refresh();\n\n\t\tif ( this._origTabIndex === undefined ) {\n\t\t\t// Map undefined to false, because this._origTabIndex === undefined\n\t\t\t// indicates that we have not yet checked whether the select has\n\t\t\t// originally had a tabindex attribute, whereas false indicates that\n\t\t\t// we have checked the select for such an attribute, and have found\n\t\t\t// none present.\n\t\t\tthis._origTabIndex = ( this.select[ 0 ].getAttribute( \"tabindex\" ) === null ) ? false : this.select.attr( \"tabindex\" );\n\t\t}\n\t\tthis.select.attr( \"tabindex\", \"-1\" );\n\t\tthis._on( this.select, { focus : \"_handleSelectFocus\" } );\n\n\t\t// Button events\n\t\tthis._on( this.button, {\n\t\t\tvclick: \"_handleButtonVclickKeydown\"\n\t\t});\n\n\t\t// Events for list items\n\t\tthis.list.attr( \"role\", \"listbox\" );\n\t\tthis._on( this.list, {\n\t\t\t\"focusin\": \"_handleListFocus\",\n\t\t\t\"focusout\": \"_handleListFocus\",\n\t\t\t\"keydown\": \"_handleListKeydown\",\n\t\t\t\"click li:not(.ui-disabled,.ui-state-disabled,.ui-li-divider)\": \"_handleListItemClick\"\n\t\t});\n\n\t\t// button refocus ensures proper height calculation\n\t\t// by removing the inline style and ensuring page inclusion\n\t\tthis._on( this.menuPage, { pagehide: \"_handleMenuPageHide\" } );\n\n\t\t// Events on the popup\n\t\tthis._on( this.listbox, { popupafterclose: \"_popupClosed\" } );\n\n\t\t// Close button on small overlays\n\t\tif ( this.isMultiple ) {\n\t\t\tthis._on( this.headerClose, { click: \"_handleHeaderCloseClick\" } );\n\t\t}\n\n\t\treturn this;\n\t},\n\n\t_popupClosed: function() {\n\t\tthis.close();\n\t\tthis._delayedTrigger();\n\t},\n\n\t_delayedTrigger: function() {\n\t\tif ( this._triggerChange ) {\n\t\t\tthis.element.trigger( \"change\" );\n\t\t}\n\t\tthis._triggerChange = false;\n\t},\n\n\t_isRebuildRequired: function() {\n\t\tvar list = this.list.find( \"li\" ),\n\t\t\toptions = this._selectOptions().not( \".ui-screen-hidden\" );\n\n\t\t// TODO exceedingly naive method to determine difference\n\t\t// ignores value changes etc in favor of a forcedRebuild\n\t\t// from the user in the refresh method\n\t\treturn options.text() !== list.text();\n\t},\n\n\tselected: function() {\n\t\treturn this._selectOptions().filter( \":selected:not( :jqmData(placeholder='true') )\" );\n\t},\n\n\trefresh: function( force ) {\n\t\tvar self, indices;\n\n\t\tif ( this.options.nativeMenu ) {\n\t\t\treturn this._super( force );\n\t\t}\n\n\t\tself = this;\n\t\tif ( force || this._isRebuildRequired() ) {\n\t\t\tself._buildList();\n\t\t}\n\n\t\tindices = this.selectedIndices();\n\n\t\tself.setButtonText();\n\t\tself.setButtonCount();\n\n\t\tself.list.find( \"li:not(.ui-li-divider)\" )\n\t\t\t.find( \"a\" ).removeClass( $.mobile.activeBtnClass ).end()\n\t\t\t.attr( \"aria-selected\", false )\n\t\t\t.each(function( i ) {\n\t\t\t\tvar item = $( this );\n\t\t\t\tif ( $.inArray( i, indices ) > -1 ) {\n\n\t\t\t\t\t// Aria selected attr\n\t\t\t\t\titem.attr( \"aria-selected\", true );\n\n\t\t\t\t\t// Multiple selects: add the \"on\" checkbox state to the icon\n\t\t\t\t\tif ( self.isMultiple ) {\n\t\t\t\t\t\titem.find( \"a\" ).removeClass( \"ui-checkbox-off\" ).addClass( \"ui-checkbox-on\" );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif ( item.hasClass( \"ui-screen-hidden\" ) ) {\n\t\t\t\t\t\t\titem.next().find( \"a\" ).addClass( $.mobile.activeBtnClass );\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\titem.find( \"a\" ).addClass( $.mobile.activeBtnClass );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else if ( self.isMultiple ) {\n\t\t\t\t\titem.find( \"a\" ).removeClass( \"ui-checkbox-on\" ).addClass( \"ui-checkbox-off\" );\n\t\t\t\t}\n\t\t\t});\n\t},\n\n\tclose: function() {\n\t\tif ( this.options.disabled || !this.isOpen ) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar self = this;\n\n\t\tif ( self.menuType === \"page\" ) {\n\t\t\tself.menuPage.dialog( \"close\" );\n\t\t\tself.list.appendTo( self.listbox );\n\t\t} else {\n\t\t\tself.listbox.popup( \"close\" );\n\t\t}\n\n\t\tself._focusButton();\n\t\t// allow the dialog to be closed again\n\t\tself.isOpen = false;\n\t},\n\n\topen: function() {\n\t\tthis.button.click();\n\t},\n\n\t_focusMenuItem: function() {\n\t\tvar selector = this.list.find( \"a.\" + $.mobile.activeBtnClass );\n\t\tif ( selector.length === 0 ) {\n\t\t\tselector = this.list.find( \"li:not(\" + unfocusableItemSelector + \") a.ui-btn\" );\n\t\t}\n\t\tselector.first().focus();\n\t},\n\n\t_decideFormat: function() {\n\t\tvar self = this,\n\t\t\t$window = this.window,\n\t\t\tselfListParent = self.list.parent(),\n\t\t\tmenuHeight = selfListParent.outerHeight(),\n\t\t\tscrollTop = $window.scrollTop(),\n\t\t\tbtnOffset = self.button.offset().top,\n\t\t\tscreenHeight = $window.height();\n\n\t\tif ( menuHeight > screenHeight - 80 || !$.support.scrollTop ) {\n\n\t\t\tself.menuPage.appendTo( $.mobile.pageContainer ).page();\n\t\t\tself.menuPageContent = self.menuPage.find( \".ui-content\" );\n\t\t\tself.menuPageClose = self.menuPage.find( \".ui-header a\" );\n\n\t\t\t// prevent the parent page from being removed from the DOM,\n\t\t\t// otherwise the results of selecting a list item in the dialog\n\t\t\t// fall into a black hole\n\t\t\tself.thisPage.unbind( \"pagehide.remove\" );\n\n\t\t\t//for WebOS/Opera Mini (set lastscroll using button offset)\n\t\t\tif ( scrollTop === 0 && btnOffset > screenHeight ) {\n\t\t\t\tself.thisPage.one( \"pagehide\", function() {\n\t\t\t\t\t$( this ).jqmData( \"lastScroll\", btnOffset );\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tself.menuPage.one( {\n\t\t\t\tpageshow: $.proxy( this, \"_focusMenuItem\" ),\n\t\t\t\tpagehide: $.proxy( this, \"close\" )\n\t\t\t});\n\n\t\t\tself.menuType = \"page\";\n\t\t\tself.menuPageContent.append( self.list );\n\t\t\tself.menuPage\n\t\t\t\t.find( \"div .ui-title\" )\n\t\t\t\t\t.text( self.label.getEncodedText() || self.placeholder );\n\t\t} else {\n\t\t\tself.menuType = \"overlay\";\n\n\t\t\tself.listbox.one( { popupafteropen: $.proxy( this, \"_focusMenuItem\" ) } );\n\t\t}\n\t},\n\n\t_buildList: function() {\n\t\tvar self = this,\n\t\t\to = this.options,\n\t\t\tplaceholder = this.placeholder,\n\t\t\tneedPlaceholder = true,\n\t\t\tdataIcon = \"false\",\n\t\t\t$options, numOptions, select,\n\t\t\tdataPrefix = \"data-\" + $.mobile.ns,\n\t\t\tdataIndexAttr = dataPrefix + \"option-index\",\n\t\t\tdataIconAttr = dataPrefix + \"icon\",\n\t\t\tdataRoleAttr = dataPrefix + \"role\",\n\t\t\tdataPlaceholderAttr = dataPrefix + \"placeholder\",\n\t\t\tfragment = document.createDocumentFragment(),\n\t\t\tisPlaceholderItem = false,\n\t\t\toptGroup,\n\t\t\ti,\n\t\t\toption, $option, parent, text, anchor, classes,\n\t\t\toptLabel, divider, item;\n\n\t\tself.list.empty().filter( \".ui-listview\" ).listview( \"destroy\" );\n\t\t$options = this._selectOptions();\n\t\tnumOptions = $options.length;\n\t\tselect = this.select[ 0 ];\n\n\t\tfor ( i = 0; i < numOptions;i++, isPlaceholderItem = false) {\n\t\t\toption = $options[i];\n\t\t\t$option = $( option );\n\n\t\t\t// Do not create options based on ui-screen-hidden select options\n\t\t\tif ( $option.hasClass( \"ui-screen-hidden\" ) ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tparent = option.parentNode;\n\t\t\tclasses = [];\n\n\t\t\t// Although using .text() here raises the risk that, when we later paste this into the\n\t\t\t// list item we end up pasting possibly malicious things like <script> tags, that risk\n\t\t\t// only arises if we do something like $( \"<li><a href='#'>\" + text + \"</a></li>\" ). We\n\t\t\t// don't do that. We do document.createTextNode( text ) instead, which guarantees that\n\t\t\t// whatever we paste in will end up as text, with characters like <, > and & escaped.\n\t\t\ttext = $option.text();\n\t\t\tanchor = document.createElement( \"a\" );\n\t\t\tanchor.setAttribute( \"href\", \"#\" );\n\t\t\tanchor.appendChild( document.createTextNode( text ) );\n\n\t\t\t// Are we inside an optgroup?\n\t\t\tif ( parent !== select && parent.nodeName.toLowerCase() === \"optgroup\" ) {\n\t\t\t\toptLabel = parent.getAttribute( \"label\" );\n\t\t\t\tif ( optLabel !== optGroup ) {\n\t\t\t\t\tdivider = document.createElement( \"li\" );\n\t\t\t\t\tdivider.setAttribute( dataRoleAttr, \"list-divider\" );\n\t\t\t\t\tdivider.setAttribute( \"role\", \"option\" );\n\t\t\t\t\tdivider.setAttribute( \"tabindex\", \"-1\" );\n\t\t\t\t\tdivider.appendChild( document.createTextNode( optLabel ) );\n\t\t\t\t\tfragment.appendChild( divider );\n\t\t\t\t\toptGroup = optLabel;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( needPlaceholder && ( !option.getAttribute( \"value\" ) || text.length === 0 || $option.jqmData( \"placeholder\" ) ) ) {\n\t\t\t\tneedPlaceholder = false;\n\t\t\t\tisPlaceholderItem = true;\n\n\t\t\t\t// If we have identified a placeholder, record the fact that it was\n\t\t\t\t// us who have added the placeholder to the option and mark it\n\t\t\t\t// retroactively in the select as well\n\t\t\t\tif ( null === option.getAttribute( dataPlaceholderAttr ) ) {\n\t\t\t\t\tthis._removePlaceholderAttr = true;\n\t\t\t\t}\n\t\t\t\toption.setAttribute( dataPlaceholderAttr, true );\n\t\t\t\tif ( o.hidePlaceholderMenuItems ) {\n\t\t\t\t\tclasses.push( \"ui-screen-hidden\" );\n\t\t\t\t}\n\t\t\t\tif ( placeholder !== text ) {\n\t\t\t\t\tplaceholder = self.placeholder = text;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\titem = document.createElement( \"li\" );\n\t\t\tif ( option.disabled ) {\n\t\t\t\tclasses.push( \"ui-state-disabled\" );\n\t\t\t\titem.setAttribute( \"aria-disabled\", true );\n\t\t\t}\n\t\t\titem.setAttribute( dataIndexAttr, i );\n\t\t\titem.setAttribute( dataIconAttr, dataIcon );\n\t\t\tif ( isPlaceholderItem ) {\n\t\t\t\titem.setAttribute( dataPlaceholderAttr, true );\n\t\t\t}\n\t\t\titem.className = classes.join( \" \" );\n\t\t\titem.setAttribute( \"role\", \"option\" );\n\t\t\tanchor.setAttribute( \"tabindex\", \"-1\" );\n\t\t\tif ( this.isMultiple ) {\n\t\t\t\t$( anchor ).addClass( \"ui-btn ui-checkbox-off ui-btn-icon-right\" );\n\t\t\t}\n\n\t\t\titem.appendChild( anchor );\n\t\t\tfragment.appendChild( item );\n\t\t}\n\n\t\tself.list[0].appendChild( fragment );\n\n\t\t// Hide header if it's not a multiselect and there's no placeholder\n\t\tif ( !this.isMultiple && !placeholder.length ) {\n\t\t\tthis.header.addClass( \"ui-screen-hidden\" );\n\t\t} else {\n\t\t\tthis.headerTitle.text( this.placeholder );\n\t\t}\n\n\t\t// Now populated, create listview\n\t\tself.list.listview();\n\t},\n\n\t_button: function() {\n\t\treturn this.options.nativeMenu ?\n\t\t\tthis._super() :\n\t\t\t$( \"<a>\", {\n\t\t\t\t\"href\": \"#\",\n\t\t\t\t\"role\": \"button\",\n\t\t\t\t// TODO value is undefined at creation\n\t\t\t\t\"id\": this.buttonId,\n\t\t\t\t\"aria-haspopup\": \"true\",\n\n\t\t\t\t// TODO value is undefined at creation\n\t\t\t\t\"aria-owns\": this.menuId\n\t\t\t});\n\t},\n\n\t_destroy: function() {\n\n\t\tif ( !this.options.nativeMenu ) {\n\t\t\tthis.close();\n\n\t\t\t// Restore the tabindex attribute to its original value\n\t\t\tif ( this._origTabIndex !== undefined ) {\n\t\t\t\tif ( this._origTabIndex !== false ) {\n\t\t\t\t\tthis.select.attr( \"tabindex\", this._origTabIndex );\n\t\t\t\t} else {\n\t\t\t\t\tthis.select.removeAttr( \"tabindex\" );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Remove the placeholder attribute if we were the ones to add it\n\t\t\tif ( this._removePlaceholderAttr ) {\n\t\t\t\tthis._selectOptions().removeAttr( \"data-\" + $.mobile.ns + \"placeholder\" );\n\t\t\t}\n\n\t\t\t// Remove the popup\n\t\t\tthis.listbox.remove();\n\n\t\t\t// Remove the dialog\n\t\t\tthis.menuPage.remove();\n\t\t}\n\n\t\t// Chain up\n\t\tthis._super();\n\t}\n});\n\n})( jQuery );\n\n\n// buttonMarkup is deprecated as of 1.4.0 and will be removed in 1.5.0.\n\n(function( $, undefined ) {\n\n// General policy: Do not access data-* attributes except during enhancement.\n// In all other cases we determine the state of the button exclusively from its\n// className. That's why optionsToClasses expects a full complement of options,\n// and the jQuery plugin completes the set of options from the default values.\n\n// Map classes to buttonMarkup boolean options - used in classNameToOptions()\nvar reverseBoolOptionMap = {\n\t\t\"ui-shadow\" : \"shadow\",\n\t\t\"ui-corner-all\" : \"corners\",\n\t\t\"ui-btn-inline\" : \"inline\",\n\t\t\"ui-shadow-icon\" : \"iconshadow\", /* TODO: Remove in 1.5 */\n\t\t\"ui-mini\" : \"mini\"\n\t},\n\tgetAttrFixed = function() {\n\t\tvar ret = $.mobile.getAttribute.apply( this, arguments );\n\n\t\treturn ( ret == null ? undefined : ret );\n\t},\n\tcapitalLettersRE = /[A-Z]/g;\n\n// optionsToClasses:\n// @options: A complete set of options to convert to class names.\n// @existingClasses: extra classes to add to the result\n//\n// Converts @options to buttonMarkup classes and returns the result as an array\n// that can be converted to an element's className with .join( \" \" ). All\n// possible options must be set inside @options. Use $.fn.buttonMarkup.defaults\n// to get a complete set and use $.extend to override your choice of options\n// from that set.\nfunction optionsToClasses( options, existingClasses ) {\n\tvar classes = existingClasses ? existingClasses : [];\n\n\t// Add classes to the array - first ui-btn\n\tclasses.push( \"ui-btn\" );\n\n\t// If there is a theme\n\tif ( options.theme ) {\n\t\tclasses.push( \"ui-btn-\" + options.theme );\n\t}\n\n\t// If there's an icon, add the icon-related classes\n\tif ( options.icon ) {\n\t\tclasses = classes.concat([\n\t\t\t\"ui-icon-\" + options.icon,\n\t\t\t\"ui-btn-icon-\" + options.iconpos\n\t\t]);\n\t\tif ( options.iconshadow ) {\n\t\t\tclasses.push( \"ui-shadow-icon\" ); /* TODO: Remove in 1.5 */\n\t\t}\n\t}\n\n\t// Add the appropriate class for each boolean option\n\tif ( options.inline ) {\n\t\tclasses.push( \"ui-btn-inline\" );\n\t}\n\tif ( options.shadow ) {\n\t\tclasses.push( \"ui-shadow\" );\n\t}\n\tif ( options.corners ) {\n\t\tclasses.push( \"ui-corner-all\" );\n\t}\n\tif ( options.mini ) {\n\t\tclasses.push( \"ui-mini\" );\n\t}\n\n\t// Create a string from the array and return it\n\treturn classes;\n}\n\n// classNameToOptions:\n// @classes: A string containing a .className-style space-separated class list\n//\n// Loops over @classes and calculates an options object based on the\n// buttonMarkup-related classes it finds. It records unrecognized classes in an\n// array.\n//\n// Returns: An object containing the following items:\n//\n// \"options\": buttonMarkup options found to be present because of the\n// presence/absence of corresponding classes\n//\n// \"unknownClasses\": a string containing all the non-buttonMarkup-related\n// classes found in @classes\n//\n// \"alreadyEnhanced\": A boolean indicating whether the ui-btn class was among\n// those found to be present\nfunction classNameToOptions( classes ) {\n\tvar idx, map, unknownClass,\n\t\talreadyEnhanced = false,\n\t\tnoIcon = true,\n\t\to = {\n\t\t\ticon: \"\",\n\t\t\tinline: false,\n\t\t\tshadow: false,\n\t\t\tcorners: false,\n\t\t\ticonshadow: false,\n\t\t\tmini: false\n\t\t},\n\t\tunknownClasses = [];\n\n\tclasses = classes.split( \" \" );\n\n\t// Loop over the classes\n\tfor ( idx = 0 ; idx < classes.length ; idx++ ) {\n\n\t\t// Assume it's an unrecognized class\n\t\tunknownClass = true;\n\n\t\t// Recognize boolean options from the presence of classes\n\t\tmap = reverseBoolOptionMap[ classes[ idx ] ];\n\t\tif ( map !== undefined ) {\n\t\t\tunknownClass = false;\n\t\t\to[ map ] = true;\n\n\t\t// Recognize the presence of an icon and establish the icon position\n\t\t} else if ( classes[ idx ].indexOf( \"ui-btn-icon-\" ) === 0 ) {\n\t\t\tunknownClass = false;\n\t\t\tnoIcon = false;\n\t\t\to.iconpos = classes[ idx ].substring( 12 );\n\n\t\t// Establish which icon is present\n\t\t} else if ( classes[ idx ].indexOf( \"ui-icon-\" ) === 0 ) {\n\t\t\tunknownClass = false;\n\t\t\to.icon = classes[ idx ].substring( 8 );\n\n\t\t// Establish the theme - this recognizes one-letter theme swatch names\n\t\t} else if ( classes[ idx ].indexOf( \"ui-btn-\" ) === 0 && classes[ idx ].length === 8 ) {\n\t\t\tunknownClass = false;\n\t\t\to.theme = classes[ idx ].substring( 7 );\n\n\t\t// Recognize that this element has already been buttonMarkup-enhanced\n\t\t} else if ( classes[ idx ] === \"ui-btn\" ) {\n\t\t\tunknownClass = false;\n\t\t\talreadyEnhanced = true;\n\t\t}\n\n\t\t// If this class has not been recognized, add it to the list\n\t\tif ( unknownClass ) {\n\t\t\tunknownClasses.push( classes[ idx ] );\n\t\t}\n\t}\n\n\t// If a \"ui-btn-icon-*\" icon position class is absent there cannot be an icon\n\tif ( noIcon ) {\n\t\to.icon = \"\";\n\t}\n\n\treturn {\n\t\toptions: o,\n\t\tunknownClasses: unknownClasses,\n\t\talreadyEnhanced: alreadyEnhanced\n\t};\n}\n\nfunction camelCase2Hyphenated( c ) {\n\treturn \"-\" + c.toLowerCase();\n}\n\n// $.fn.buttonMarkup:\n// DOM: gets/sets .className\n//\n// @options: options to apply to the elements in the jQuery object\n// @overwriteClasses: boolean indicating whether to honour existing classes\n//\n// Calculates the classes to apply to the elements in the jQuery object based on\n// the options passed in. If @overwriteClasses is true, it sets the className\n// property of each element in the jQuery object to the buttonMarkup classes\n// it calculates based on the options passed in.\n//\n// If you wish to preserve any classes that are already present on the elements\n// inside the jQuery object, including buttonMarkup-related classes that were\n// added by a previous call to $.fn.buttonMarkup() or during page enhancement\n// then you should omit @overwriteClasses or set it to false.\n$.fn.buttonMarkup = function( options, overwriteClasses ) {\n\tvar idx, data, el, retrievedOptions, optionKey,\n\t\tdefaults = $.fn.buttonMarkup.defaults;\n\n\tfor ( idx = 0 ; idx < this.length ; idx++ ) {\n\t\tel = this[ idx ];\n\t\tdata = overwriteClasses ?\n\n\t\t\t// Assume this element is not enhanced and ignore its classes\n\t\t\t{ alreadyEnhanced: false, unknownClasses: [] } :\n\n\t\t\t// Otherwise analyze existing classes to establish existing options and\n\t\t\t// classes\n\t\t\tclassNameToOptions( el.className );\n\n\t\tretrievedOptions = $.extend( {},\n\n\t\t\t// If the element already has the class ui-btn, then we assume that\n\t\t\t// it has passed through buttonMarkup before - otherwise, the options\n\t\t\t// returned by classNameToOptions do not correctly reflect the state of\n\t\t\t// the element\n\t\t\t( data.alreadyEnhanced ? data.options : {} ),\n\n\t\t\t// Finally, apply the options passed in\n\t\t\toptions );\n\n\t\t// If this is the first call on this element, retrieve remaining options\n\t\t// from the data-attributes\n\t\tif ( !data.alreadyEnhanced ) {\n\t\t\tfor ( optionKey in defaults ) {\n\t\t\t\tif ( retrievedOptions[ optionKey ] === undefined ) {\n\t\t\t\t\tretrievedOptions[ optionKey ] = getAttrFixed( el,\n\t\t\t\t\t\toptionKey.replace( capitalLettersRE, camelCase2Hyphenated )\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tel.className = optionsToClasses(\n\n\t\t\t// Merge all the options and apply them as classes\n\t\t\t$.extend( {},\n\n\t\t\t\t// The defaults form the basis\n\t\t\t\tdefaults,\n\n\t\t\t\t// Add the computed options\n\t\t\t\tretrievedOptions\n\t\t\t),\n\n\t\t\t// ... and re-apply any unrecognized classes that were found\n\t\t\tdata.unknownClasses ).join( \" \" );\n\t\tif ( el.tagName.toLowerCase() !== \"button\" ) {\n\t\t\tel.setAttribute( \"role\", \"button\" );\n\t\t}\n\t}\n\n\treturn this;\n};\n\n// buttonMarkup defaults. This must be a complete set, i.e., a value must be\n// given here for all recognized options\n$.fn.buttonMarkup.defaults = {\n\ticon: \"\",\n\ticonpos: \"left\",\n\ttheme: null,\n\tinline: false,\n\tshadow: true,\n\tcorners: true,\n\ticonshadow: false, /* TODO: Remove in 1.5. Option deprecated in 1.4. */\n\tmini: false\n};\n\n$.extend( $.fn.buttonMarkup, {\n\tinitSelector: \"a:jqmData(role='button'), .ui-bar > a, .ui-bar > :jqmData(role='controlgroup') > a, button:not(:jqmData(role='navbar') button)\"\n});\n\n})( jQuery );\n\n\n(function( $, undefined ) {\n\n$.widget( \"mobile.controlgroup\", $.extend( {\n\toptions: {\n\t\tenhanced: false,\n\t\ttheme: null,\n\t\tshadow: false,\n\t\tcorners: true,\n\t\texcludeInvisible: true,\n\t\ttype: \"vertical\",\n\t\tmini: false\n\t},\n\n\t_create: function() {\n\t\tvar elem = this.element,\n\t\t\topts = this.options,\n\t\t\tkeepNative = $.mobile.page.prototype.keepNativeSelector();\n\n\t\t// Run buttonmarkup\n\t\tif ( $.fn.buttonMarkup ) {\n\t\t\tthis.element\n\t\t\t\t.find( $.fn.buttonMarkup.initSelector )\n\t\t\t\t.not( keepNative )\n\t\t\t\t.buttonMarkup();\n\t\t}\n\t\t// Enhance child widgets\n\t\t$.each( this._childWidgets, $.proxy( function( number, widgetName ) {\n\t\t\tif ( $.mobile[ widgetName ] ) {\n\t\t\t\tthis.element\n\t\t\t\t\t.find( $.mobile[ widgetName ].initSelector )\n\t\t\t\t\t.not( keepNative )[ widgetName ]();\n\t\t\t}\n\t\t}, this ));\n\n\t\t$.extend( this, {\n\t\t\t_ui: null,\n\t\t\t_initialRefresh: true\n\t\t});\n\n\t\tif ( opts.enhanced ) {\n\t\t\tthis._ui = {\n\t\t\t\tgroupLegend: elem.children( \".ui-controlgroup-label\" ).children(),\n\t\t\t\tchildWrapper: elem.children( \".ui-controlgroup-controls\" )\n\t\t\t};\n\t\t} else {\n\t\t\tthis._ui = this._enhance();\n\t\t}\n\n\t},\n\n\t_childWidgets: [ \"checkboxradio\", \"selectmenu\", \"button\" ],\n\n\t_themeClassFromOption: function( value ) {\n\t\treturn ( value ? ( value === \"none\" ? \"\" : \"ui-group-theme-\" + value ) : \"\" );\n\t},\n\n\t_enhance: function() {\n\t\tvar elem = this.element,\n\t\t\topts = this.options,\n\t\t\tui = {\n\t\t\t\tgroupLegend: elem.children( \"legend\" ),\n\t\t\t\tchildWrapper: elem\n\t\t\t\t\t.addClass( \"ui-controlgroup \" +\n\t\t\t\t\t\t\"ui-controlgroup-\" +\n\t\t\t\t\t\t\t( opts.type === \"horizontal\" ? \"horizontal\" : \"vertical\" ) + \" \" +\n\t\t\t\t\t\tthis._themeClassFromOption( opts.theme ) + \" \" +\n\t\t\t\t\t\t( opts.corners ? \"ui-corner-all \" : \"\" ) +\n\t\t\t\t\t\t( opts.mini ? \"ui-mini \" : \"\" ) )\n\t\t\t\t\t.wrapInner( \"<div \" +\n\t\t\t\t\t\t\"class='ui-controlgroup-controls \" +\n\t\t\t\t\t\t\t( opts.shadow === true ? \"ui-shadow\" : \"\" ) + \"'></div>\" )\n\t\t\t\t\t.children()\n\t\t\t};\n\n\t\tif ( ui.groupLegend.length > 0 ) {\n\t\t\t$( \"<div role='heading' class='ui-controlgroup-label'></div>\" )\n\t\t\t\t.append( ui.groupLegend )\n\t\t\t\t.prependTo( elem );\n\t\t}\n\n\t\treturn ui;\n\t},\n\n\t_init: function() {\n\t\tthis.refresh();\n\t},\n\n\t_setOptions: function( options ) {\n\t\tvar callRefresh, returnValue,\n\t\t\telem = this.element;\n\n\t\t// Must have one of horizontal or vertical\n\t\tif ( options.type !== undefined ) {\n\t\t\telem\n\t\t\t\t.removeClass( \"ui-controlgroup-horizontal ui-controlgroup-vertical\" )\n\t\t\t\t.addClass( \"ui-controlgroup-\" + ( options.type === \"horizontal\" ? \"horizontal\" : \"vertical\" ) );\n\t\t\tcallRefresh = true;\n\t\t}\n\n\t\tif ( options.theme !== undefined ) {\n\t\t\telem\n\t\t\t\t.removeClass( this._themeClassFromOption( this.options.theme ) )\n\t\t\t\t.addClass( this._themeClassFromOption( options.theme ) );\n\t\t}\n\n\t\tif ( options.corners !== undefined ) {\n\t\t\telem.toggleClass( \"ui-corner-all\", options.corners );\n\t\t}\n\n\t\tif ( options.mini !== undefined ) {\n\t\t\telem.toggleClass( \"ui-mini\", options.mini );\n\t\t}\n\n\t\tif ( options.shadow !== undefined ) {\n\t\t\tthis._ui.childWrapper.toggleClass( \"ui-shadow\", options.shadow );\n\t\t}\n\n\t\tif ( options.excludeInvisible !== undefined ) {\n\t\t\tthis.options.excludeInvisible = options.excludeInvisible;\n\t\t\tcallRefresh = true;\n\t\t}\n\n\t\treturnValue = this._super( options );\n\n\t\tif ( callRefresh ) {\n\t\t\tthis.refresh();\n\t\t}\n\n\t\treturn returnValue;\n\t},\n\n\tcontainer: function() {\n\t\treturn this._ui.childWrapper;\n\t},\n\n\trefresh: function() {\n\t\tvar $el = this.container(),\n\t\t\tels = $el.find( \".ui-btn\" ).not( \".ui-slider-handle\" ),\n\t\t\tcreate = this._initialRefresh;\n\t\tif ( $.mobile.checkboxradio ) {\n\t\t\t$el.find( \":mobile-checkboxradio\" ).checkboxradio( \"refresh\" );\n\t\t}\n\t\tthis._addFirstLastClasses( els,\n\t\t\tthis.options.excludeInvisible ? this._getVisibles( els, create ) : els,\n\t\t\tcreate );\n\t\tthis._initialRefresh = false;\n\t},\n\n\t// Caveat: If the legend is not the first child of the controlgroup at enhance\n\t// time, it will be after _destroy().\n\t_destroy: function() {\n\t\tvar ui, buttons,\n\t\t\topts = this.options;\n\n\t\tif ( opts.enhanced ) {\n\t\t\treturn this;\n\t\t}\n\n\t\tui = this._ui;\n\t\tbuttons = this.element\n\t\t\t.removeClass( \"ui-controlgroup \" +\n\t\t\t\t\"ui-controlgroup-horizontal ui-controlgroup-vertical ui-corner-all ui-mini \" +\n\t\t\t\tthis._themeClassFromOption( opts.theme ) )\n\t\t\t.find( \".ui-btn\" )\n\t\t\t.not( \".ui-slider-handle\" );\n\n\t\tthis._removeFirstLastClasses( buttons );\n\n\t\tui.groupLegend.unwrap();\n\t\tui.childWrapper.children().unwrap();\n\t}\n}, $.mobile.behaviors.addFirstLastClasses ) );\n\n})(jQuery);\n\n(function( $, undefined ) {\n\n\t$.widget( \"mobile.toolbar\", {\n\t\tinitSelector: \":jqmData(role='footer'), :jqmData(role='header')\",\n\n\t\toptions: {\n\t\t\ttheme: null,\n\t\t\taddBackBtn: false,\n\t\t\tbackBtnTheme: null,\n\t\t\tbackBtnText: \"Back\"\n\t\t},\n\n\t\t_create: function() {\n\t\t\tvar leftbtn, rightbtn,\n\t\t\t\trole =  this.element.is( \":jqmData(role='header')\" ) ? \"header\" : \"footer\",\n\t\t\t\tpage = this.element.closest( \".ui-page\" );\n\t\t\tif ( page.length === 0 ) {\n\t\t\t\tpage = false;\n\t\t\t\tthis._on( this.document, {\n\t\t\t\t\t\"pageshow\": \"refresh\"\n\t\t\t\t});\n\t\t\t}\n\t\t\t$.extend( this, {\n\t\t\t\trole: role,\n\t\t\t\tpage: page,\n\t\t\t\tleftbtn: leftbtn,\n\t\t\t\trightbtn: rightbtn\n\t\t\t});\n\t\t\tthis.element.attr( \"role\", role === \"header\" ? \"banner\" : \"contentinfo\" ).addClass( \"ui-\" + role );\n\t\t\tthis.refresh();\n\t\t\tthis._setOptions( this.options );\n\t\t},\n\t\t_setOptions: function( o ) {\n\t\t\tif ( o.addBackBtn !== undefined ) {\n\t\t\t\tthis._updateBackButton();\n\t\t\t}\n\t\t\tif ( o.backBtnTheme != null ) {\n\t\t\t\tthis.element\n\t\t\t\t\t.find( \".ui-toolbar-back-btn\" )\n\t\t\t\t\t.addClass( \"ui-btn ui-btn-\" + o.backBtnTheme );\n\t\t\t}\n\t\t\tif ( o.backBtnText !== undefined ) {\n\t\t\t\tthis.element.find( \".ui-toolbar-back-btn .ui-btn-text\" ).text( o.backBtnText );\n\t\t\t}\n\t\t\tif ( o.theme !== undefined ) {\n\t\t\t\tvar currentTheme = this.options.theme ? this.options.theme : \"inherit\",\n\t\t\t\t\tnewTheme = o.theme ? o.theme : \"inherit\";\n\n\t\t\t\tthis.element.removeClass( \"ui-bar-\" + currentTheme ).addClass( \"ui-bar-\" + newTheme );\n\t\t\t}\n\n\t\t\tthis._super( o );\n\t\t},\n\t\trefresh: function() {\n\t\t\tif ( this.role === \"header\" ) {\n\t\t\t\tthis._addHeaderButtonClasses();\n\t\t\t}\n\t\t\tif ( !this.page ) {\n\t\t\t\tthis._setRelative();\n\t\t\t\tif ( this.role === \"footer\" ) {\n\t\t\t\t\tthis.element.appendTo( \"body\" );\n\t\t\t\t} else if ( this.role === \"header\" ) {\n\t\t\t\t\tthis._updateBackButton();\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis._addHeadingClasses();\n\t\t\tthis._btnMarkup();\n\t\t},\n\n\t\t//we only want this to run on non fixed toolbars so make it easy to override\n\t\t_setRelative: function() {\n\t\t\t$( \"[data-\"+ $.mobile.ns + \"role='page']\" ).css({ \"position\": \"relative\" });\n\t\t},\n\n\t\t// Deprecated in 1.4. As from 1.5 button classes have to be present in the markup.\n\t\t_btnMarkup: function() {\n\t\t\tthis.element\n\t\t\t\t.children( \"a\" )\n\t\t\t\t.filter( \":not([data-\" + $.mobile.ns + \"role='none'])\" )\n\t\t\t\t.attr( \"data-\" + $.mobile.ns + \"role\", \"button\" );\n\t\t\tthis.element.trigger( \"create\" );\n\t\t},\n\t\t// Deprecated in 1.4. As from 1.5 ui-btn-left/right classes have to be present in the markup.\n\t\t_addHeaderButtonClasses: function() {\n\t\t\tvar headerAnchors = this.element.children( \"a, button\" );\n\n\t\t\t// Do not mistake a back button for a left toolbar button\n\t\t\tthis.leftbtn = headerAnchors.hasClass( \"ui-btn-left\" ) &&\n\t\t\t\t!headerAnchors.hasClass( \"ui-toolbar-back-btn\" );\n\n\t\t\tthis.rightbtn = headerAnchors.hasClass( \"ui-btn-right\" );\n\n\t\t\t// Filter out right buttons and back buttons\n\t\t\tthis.leftbtn = this.leftbtn ||\n\t\t\t\theaderAnchors.eq( 0 )\n\t\t\t\t\t.not( \".ui-btn-right,.ui-toolbar-back-btn\" )\n\t\t\t\t\t.addClass( \"ui-btn-left\" )\n\t\t\t\t\t.length;\n\n\t\t\tthis.rightbtn = this.rightbtn || headerAnchors.eq( 1 ).addClass( \"ui-btn-right\" ).length;\n\t\t},\n\t\t_updateBackButton: function() {\n\t\t\tvar backButton,\n\t\t\t\toptions = this.options,\n\t\t\t\ttheme = options.backBtnTheme || options.theme;\n\n\t\t\t// Retrieve the back button or create a new, empty one\n\t\t\tbackButton = this._backButton = ( this._backButton || {} );\n\n\t\t\t// We add a back button only if the option to do so is on\n\t\t\tif ( this.options.addBackBtn &&\n\n\t\t\t\t\t// This must also be a header toolbar\n\t\t\t\t\tthis.role === \"header\" &&\n\n\t\t\t\t\t// There must be multiple pages in the DOM\n\t\t\t\t\t$( \".ui-page\" ).length > 1 &&\n\t\t\t\t\t( this.page ?\n\n\t\t\t\t\t\t// If the toolbar is internal the page's URL must differ from the hash\n\t\t\t\t\t\t( this.page[ 0 ].getAttribute( \"data-\" + $.mobile.ns + \"url\" ) !==\n\t\t\t\t\t\t\t$.mobile.path.stripHash( location.hash ) ) :\n\n\t\t\t\t\t\t// Otherwise, if the toolbar is external there must be at least one\n\t\t\t\t\t\t// history item to which one can go back\n\t\t\t\t\t\t( $.mobile.navigate && $.mobile.navigate.history &&\n\t\t\t\t\t\t\t$.mobile.navigate.history.activeIndex > 0 ) ) &&\n\n\t\t\t\t\t// The toolbar does not have a left button\n\t\t\t\t\t!this.leftbtn ) {\n\n\t\t\t\t// Skip back button creation if one is already present\n\t\t\t\tif ( !backButton.attached ) {\n\t\t\t\t\tthis.backButton = backButton.element = ( backButton.element ||\n\t\t\t\t\t\t$( \"<a role='button' href='javascript:void(0);' \" +\n\t\t\t\t\t\t\t\"class='ui-btn ui-corner-all ui-shadow ui-btn-left \" +\n\t\t\t\t\t\t\t\t( theme ? \"ui-btn-\" + theme + \" \" : \"\" ) +\n\t\t\t\t\t\t\t\t\"ui-toolbar-back-btn ui-icon-carat-l ui-btn-icon-left' \" +\n\t\t\t\t\t\t\t\"data-\" + $.mobile.ns + \"rel='back'>\" + options.backBtnText +\n\t\t\t\t\t\t\t\"</a>\" ) )\n\t\t\t\t\t\t\t.prependTo( this.element );\n\t\t\t\t\tbackButton.attached = true;\n\t\t\t\t}\n\n\t\t\t// If we are not adding a back button, then remove the one present, if any\n\t\t\t} else if ( backButton.element ) {\n\t\t\t\tbackButton.element.detach();\n\t\t\t\tbackButton.attached = false;\n\t\t\t}\n\t\t},\n\t\t_addHeadingClasses: function() {\n\t\t\tthis.element.children( \"h1, h2, h3, h4, h5, h6\" )\n\t\t\t\t.addClass( \"ui-title\" )\n\t\t\t\t// Regardless of h element number in src, it becomes h1 for the enhanced page\n\t\t\t\t.attr({\n\t\t\t\t\t\"role\": \"heading\",\n\t\t\t\t\t\"aria-level\": \"1\"\n\t\t\t\t});\n\t\t},\n\t\t_destroy: function() {\n\t\t\tvar currentTheme;\n\n\t\t\tthis.element.children( \"h1, h2, h3, h4, h5, h6\" )\n\t\t\t\t.removeClass( \"ui-title\" )\n\t\t\t\t.removeAttr( \"role\" )\n\t\t\t\t.removeAttr( \"aria-level\" );\n\n\t\t\tif ( this.role === \"header\" ) {\n\t\t\t\tthis.element.children( \"a, button\" )\n\t\t\t\t\t.removeClass( \"ui-btn-left ui-btn-right ui-btn ui-shadow ui-corner-all\" );\n\t\t\t\tif ( this.backButton) {\n\t\t\t\t\tthis.backButton.remove();\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tcurrentTheme = this.options.theme ? this.options.theme : \"inherit\";\n\t\t\tthis.element.removeClass( \"ui-bar-\" + currentTheme );\n\n\t\t\tthis.element.removeClass( \"ui-\" + this.role ).removeAttr( \"role\" );\n\t\t}\n\t});\n\n})( jQuery );\n\n(function( $, undefined ) {\n\n\t$.widget( \"mobile.toolbar\", $.mobile.toolbar, {\n\t\toptions: {\n\t\t\tposition:null,\n\t\t\tvisibleOnPageShow: true,\n\t\t\tdisablePageZoom: true,\n\t\t\ttransition: \"slide\", //can be none, fade, slide (slide maps to slideup or slidedown)\n\t\t\tfullscreen: false,\n\t\t\ttapToggle: true,\n\t\t\ttapToggleBlacklist: \"a, button, input, select, textarea, .ui-header-fixed, .ui-footer-fixed, .ui-flipswitch, .ui-popup, .ui-panel, .ui-panel-dismiss-open\",\n\t\t\thideDuringFocus: \"input, textarea, select\",\n\t\t\tupdatePagePadding: true,\n\t\t\ttrackPersistentToolbars: true,\n\n\t\t\t// Browser detection! Weeee, here we go...\n\t\t\t// Unfortunately, position:fixed is costly, not to mention probably impossible, to feature-detect accurately.\n\t\t\t// Some tests exist, but they currently return false results in critical devices and browsers, which could lead to a broken experience.\n\t\t\t// Testing fixed positioning is also pretty obtrusive to page load, requiring injected elements and scrolling the window\n\t\t\t// The following function serves to rule out some popular browsers with known fixed-positioning issues\n\t\t\t// This is a plugin option like any other, so feel free to improve or overwrite it\n\t\t\tsupportBlacklist: function() {\n\t\t\t\treturn !$.support.fixedPosition;\n\t\t\t}\n\t\t},\n\n\t\t_create: function() {\n\t\t\tthis._super();\n\t\t\tthis.pagecontainer = $( \":mobile-pagecontainer\" );\n\t\t\tif ( this.options.position === \"fixed\" && !this.options.supportBlacklist() ) {\n\t\t\t\tthis._makeFixed();\n\t\t\t}\n\t\t},\n\n\t\t_makeFixed: function() {\n\t\t\tthis.element.addClass( \"ui-\"+ this.role +\"-fixed\" );\n\t\t\tthis.updatePagePadding();\n\t\t\tthis._addTransitionClass();\n\t\t\tthis._bindPageEvents();\n\t\t\tthis._bindToggleHandlers();\n\t\t},\n\n\t\t_setOptions: function( o ) {\n\t\t\tif ( o.position === \"fixed\" && this.options.position !== \"fixed\" ) {\n\t\t\t\tthis._makeFixed();\n\t\t\t}\n\t\t\tif ( this.options.position === \"fixed\" && !this.options.supportBlacklist() ) {\n\t\t\t\tvar $page = ( !!this.page )? this.page: ( $(\".ui-page-active\").length > 0 )? $(\".ui-page-active\"): $(\".ui-page\").eq(0);\n\n\t\t\t\tif ( o.fullscreen !== undefined) {\n\t\t\t\t\tif ( o.fullscreen ) {\n\t\t\t\t\t\tthis.element.addClass( \"ui-\"+ this.role +\"-fullscreen\" );\n\t\t\t\t\t\t$page.addClass( \"ui-page-\" + this.role + \"-fullscreen\" );\n\t\t\t\t\t}\n\t\t\t\t\t// If not fullscreen, add class to page to set top or bottom padding\n\t\t\t\t\telse {\n\t\t\t\t\t\tthis.element.removeClass( \"ui-\"+ this.role +\"-fullscreen\" );\n\t\t\t\t\t\t$page.removeClass( \"ui-page-\" + this.role + \"-fullscreen\" ).addClass( \"ui-page-\" + this.role+ \"-fixed\" );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis._super(o);\n\t\t},\n\n\t\t_addTransitionClass: function() {\n\t\t\tvar tclass = this.options.transition;\n\n\t\t\tif ( tclass && tclass !== \"none\" ) {\n\t\t\t\t// use appropriate slide for header or footer\n\t\t\t\tif ( tclass === \"slide\" ) {\n\t\t\t\t\ttclass = this.element.hasClass( \"ui-header\" ) ? \"slidedown\" : \"slideup\";\n\t\t\t\t}\n\n\t\t\t\tthis.element.addClass( tclass );\n\t\t\t}\n\t\t},\n\n\t\t_bindPageEvents: function() {\n\t\t\tvar page = ( !!this.page )? this.element.closest( \".ui-page\" ): this.document;\n\t\t\t//page event bindings\n\t\t\t// Fixed toolbars require page zoom to be disabled, otherwise usability issues crop up\n\t\t\t// This method is meant to disable zoom while a fixed-positioned toolbar page is visible\n\t\t\tthis._on( page , {\n\t\t\t\t\"pagebeforeshow\": \"_handlePageBeforeShow\",\n\t\t\t\t\"webkitAnimationStart\":\"_handleAnimationStart\",\n\t\t\t\t\"animationstart\":\"_handleAnimationStart\",\n\t\t\t\t\"updatelayout\": \"_handleAnimationStart\",\n\t\t\t\t\"pageshow\": \"_handlePageShow\",\n\t\t\t\t\"pagebeforehide\": \"_handlePageBeforeHide\"\n\t\t\t});\n\t\t},\n\n\t\t_handlePageBeforeShow: function( ) {\n\t\t\tvar o = this.options;\n\t\t\tif ( o.disablePageZoom ) {\n\t\t\t\t$.mobile.zoom.disable( true );\n\t\t\t}\n\t\t\tif ( !o.visibleOnPageShow ) {\n\t\t\t\tthis.hide( true );\n\t\t\t}\n\t\t},\n\n\t\t_handleAnimationStart: function() {\n\t\t\tif ( this.options.updatePagePadding ) {\n\t\t\t\tthis.updatePagePadding( ( !!this.page )? this.page: \".ui-page-active\" );\n\t\t\t}\n\t\t},\n\n\t\t_handlePageShow: function() {\n\t\t\tthis.updatePagePadding( ( !!this.page )? this.page: \".ui-page-active\" );\n\t\t\tif ( this.options.updatePagePadding ) {\n\t\t\t\tthis._on( this.window, { \"throttledresize\": \"updatePagePadding\" } );\n\t\t\t}\n\t\t},\n\n\t\t_handlePageBeforeHide: function( e, ui ) {\n\t\t\tvar o = this.options,\n\t\t\t\tthisFooter, thisHeader, nextFooter, nextHeader;\n\n\t\t\tif ( o.disablePageZoom ) {\n\t\t\t\t$.mobile.zoom.enable( true );\n\t\t\t}\n\t\t\tif ( o.updatePagePadding ) {\n\t\t\t\tthis._off( this.window, \"throttledresize\" );\n\t\t\t}\n\n\t\t\tif ( o.trackPersistentToolbars ) {\n\t\t\t\tthisFooter = $( \".ui-footer-fixed:jqmData(id)\", this.page );\n\t\t\t\tthisHeader = $( \".ui-header-fixed:jqmData(id)\", this.page );\n\t\t\t\tnextFooter = thisFooter.length && ui.nextPage && $( \".ui-footer-fixed:jqmData(id='\" + thisFooter.jqmData( \"id\" ) + \"')\", ui.nextPage ) || $();\n\t\t\t\tnextHeader = thisHeader.length && ui.nextPage && $( \".ui-header-fixed:jqmData(id='\" + thisHeader.jqmData( \"id\" ) + \"')\", ui.nextPage ) || $();\n\n\t\t\t\tif ( nextFooter.length || nextHeader.length ) {\n\n\t\t\t\t\tnextFooter.add( nextHeader ).appendTo( $.mobile.pageContainer );\n\n\t\t\t\t\tui.nextPage.one( \"pageshow\", function() {\n\t\t\t\t\t\tnextHeader.prependTo( this );\n\t\t\t\t\t\tnextFooter.appendTo( this );\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t_visible: true,\n\n\t\t// This will set the content element's top or bottom padding equal to the toolbar's height\n\t\tupdatePagePadding: function( tbPage ) {\n\t\t\tvar $el = this.element,\n\t\t\t\theader = ( this.role ===\"header\" ),\n\t\t\t\tpos = parseFloat( $el.css( header ? \"top\" : \"bottom\" ) );\n\n\t\t\t// This behavior only applies to \"fixed\", not \"fullscreen\"\n\t\t\tif ( this.options.fullscreen ) { return; }\n\t\t\t// tbPage argument can be a Page object or an event, if coming from throttled resize.\n\t\t\ttbPage = ( tbPage && tbPage.type === undefined && tbPage ) || this.page || $el.closest( \".ui-page\" );\n\t\t\ttbPage = ( !!this.page )? this.page: \".ui-page-active\";\n\t\t\t$( tbPage ).css( \"padding-\" + ( header ? \"top\" : \"bottom\" ), $el.outerHeight() + pos );\n\t\t},\n\n\t\t_useTransition: function( notransition ) {\n\t\t\tvar $win = this.window,\n\t\t\t\t$el = this.element,\n\t\t\t\tscroll = $win.scrollTop(),\n\t\t\t\telHeight = $el.height(),\n\t\t\t\tpHeight = ( !!this.page )? $el.closest( \".ui-page\" ).height():$(\".ui-page-active\").height(),\n\t\t\t\tviewportHeight = $.mobile.getScreenHeight();\n\n\t\t\treturn !notransition &&\n\t\t\t\t( this.options.transition && this.options.transition !== \"none\" &&\n\t\t\t\t(\n\t\t\t\t\t( this.role === \"header\" && !this.options.fullscreen && scroll > elHeight ) ||\n\t\t\t\t\t( this.role === \"footer\" && !this.options.fullscreen && scroll + viewportHeight < pHeight - elHeight )\n\t\t\t\t) || this.options.fullscreen\n\t\t\t\t);\n\t\t},\n\n\t\tshow: function( notransition ) {\n\t\t\tvar hideClass = \"ui-fixed-hidden\",\n\t\t\t\t$el = this.element;\n\n\t\t\tif ( this._useTransition( notransition ) ) {\n\t\t\t\t$el\n\t\t\t\t\t.removeClass( \"out \" + hideClass )\n\t\t\t\t\t.addClass( \"in\" )\n\t\t\t\t\t.animationComplete(function () {\n\t\t\t\t\t\t$el.removeClass( \"in\" );\n\t\t\t\t\t});\n\t\t\t}\n\t\t\telse {\n\t\t\t\t$el.removeClass( hideClass );\n\t\t\t}\n\t\t\tthis._visible = true;\n\t\t},\n\n\t\thide: function( notransition ) {\n\t\t\tvar hideClass = \"ui-fixed-hidden\",\n\t\t\t\t$el = this.element,\n\t\t\t\t// if it's a slide transition, our new transitions need the reverse class as well to slide outward\n\t\t\t\toutclass = \"out\" + ( this.options.transition === \"slide\" ? \" reverse\" : \"\" );\n\n\t\t\tif ( this._useTransition( notransition ) ) {\n\t\t\t\t$el\n\t\t\t\t\t.addClass( outclass )\n\t\t\t\t\t.removeClass( \"in\" )\n\t\t\t\t\t.animationComplete(function() {\n\t\t\t\t\t\t$el.addClass( hideClass ).removeClass( outclass );\n\t\t\t\t\t});\n\t\t\t}\n\t\t\telse {\n\t\t\t\t$el.addClass( hideClass ).removeClass( outclass );\n\t\t\t}\n\t\t\tthis._visible = false;\n\t\t},\n\n\t\ttoggle: function() {\n\t\t\tthis[ this._visible ? \"hide\" : \"show\" ]();\n\t\t},\n\n\t\t_bindToggleHandlers: function() {\n\t\t\tvar self = this,\n\t\t\t\to = self.options,\n\t\t\t\tdelayShow, delayHide,\n\t\t\t\tisVisible = true,\n\t\t\t\tpage = ( !!this.page )? this.page: $(\".ui-page\");\n\n\t\t\t// tap toggle\n\t\t\tpage\n\t\t\t\t.bind( \"vclick\", function( e ) {\n\t\t\t\t\tif ( o.tapToggle && !$( e.target ).closest( o.tapToggleBlacklist ).length ) {\n\t\t\t\t\t\tself.toggle();\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\t.bind( \"focusin focusout\", function( e ) {\n\t\t\t\t\t//this hides the toolbars on a keyboard pop to give more screen room and prevent ios bug which\n\t\t\t\t\t//positions fixed toolbars in the middle of the screen on pop if the input is near the top or\n\t\t\t\t\t//bottom of the screen addresses issues #4410 Footer navbar moves up when clicking on a textbox in an Android environment\n\t\t\t\t\t//and issue #4113 Header and footer change their position after keyboard popup - iOS\n\t\t\t\t\t//and issue #4410 Footer navbar moves up when clicking on a textbox in an Android environment\n\t\t\t\t\tif ( screen.width < 1025 && $( e.target ).is( o.hideDuringFocus ) && !$( e.target ).closest( \".ui-header-fixed, .ui-footer-fixed\" ).length ) {\n\t\t\t\t\t\t//Fix for issue #4724 Moving through form in Mobile Safari with \"Next\" and \"Previous\" system\n\t\t\t\t\t\t//controls causes fixed position, tap-toggle false Header to reveal itself\n\t\t\t\t\t\t// isVisible instead of self._visible because the focusin and focusout events fire twice at the same time\n\t\t\t\t\t\t// Also use a delay for hiding the toolbars because on Android native browser focusin is direclty followed\n\t\t\t\t\t\t// by a focusout when a native selects opens and the other way around when it closes.\n\t\t\t\t\t\tif ( e.type === \"focusout\" && !isVisible ) {\n\t\t\t\t\t\t\tisVisible = true;\n\t\t\t\t\t\t\t//wait for the stack to unwind and see if we have jumped to another input\n\t\t\t\t\t\t\tclearTimeout( delayHide );\n\t\t\t\t\t\t\tdelayShow = setTimeout( function() {\n\t\t\t\t\t\t\t\tself.show();\n\t\t\t\t\t\t\t}, 0 );\n\t\t\t\t\t\t} else if ( e.type === \"focusin\" && !!isVisible ) {\n\t\t\t\t\t\t\t//if we have jumped to another input clear the time out to cancel the show.\n\t\t\t\t\t\t\tclearTimeout( delayShow );\n\t\t\t\t\t\t\tisVisible = false;\n\t\t\t\t\t\t\tdelayHide = setTimeout( function() {\n\t\t\t\t\t\t\t\tself.hide();\n\t\t\t\t\t\t\t}, 0 );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t},\n\n\t\t_setRelative: function() {\n\t\t\tif( this.options.position !== \"fixed\" ){\n\t\t\t\t$( \"[data-\"+ $.mobile.ns + \"role='page']\" ).css({ \"position\": \"relative\" });\n\t\t\t}\n\t\t},\n\n\t\t_destroy: function() {\n\t\t\tvar pageClasses, toolbarClasses, hasFixed, header, hasFullscreen,\n\t\t\t\tpage = this.pagecontainer.pagecontainer( \"getActivePage\" );\n\n\t\t\tthis._super();\n\t\t\tif ( this.options.position === \"fixed\" ) {\n\t\t\t\thasFixed = $(  \"body>.ui-\" + this.role + \"-fixed\" )\n\t\t\t\t\t\t\t.add( page.find( \".ui-\" + this.options.role + \"-fixed\" ) )\n\t\t\t\t\t\t\t.not( this.element ).length > 0;\n\t\t\t\thasFullscreen = $(  \"body>.ui-\" + this.role + \"-fixed\" )\n\t\t\t\t\t\t\t.add( page.find( \".ui-\" + this.options.role + \"-fullscreen\" ) )\n\t\t\t\t\t\t\t.not( this.element ).length > 0;\n\t\t\t\ttoolbarClasses =  \"ui-header-fixed ui-footer-fixed ui-header-fullscreen in out\" +\n\t\t\t\t\t\" ui-footer-fullscreen fade slidedown slideup ui-fixed-hidden\";\n\t\t\t\tthis.element.removeClass( toolbarClasses );\n\t\t\t\tif ( !hasFullscreen ) {\n\t\t\t\t\tpageClasses = \"ui-page-\" + this.role + \"-fullscreen\";\n\t\t\t\t}\n\t\t\t\tif ( !hasFixed ) {\n\t\t\t\t\theader = this.role === \"header\";\n\t\t\t\t\tpageClasses += \" ui-page-\" + this.role + \"-fixed\";\n\t\t\t\t\tpage.css( \"padding-\" + ( header ? \"top\" : \"bottom\" ), \"\" );\n\t\t\t\t}\n\t\t\t\tpage.removeClass( pageClasses );\n\t\t\t}\n\t\t}\n\n\t});\n})( jQuery );\n\n(function( $, undefined ) {\n\t$.widget( \"mobile.toolbar\", $.mobile.toolbar, {\n\n\t\t_makeFixed: function() {\n\t\t\tthis._super();\n\t\t\tthis._workarounds();\n\t\t},\n\n\t\t//check the browser and version and run needed workarounds\n\t\t_workarounds: function() {\n\t\t\tvar ua = navigator.userAgent,\n\t\t\tplatform = navigator.platform,\n\t\t\t// Rendering engine is Webkit, and capture major version\n\t\t\twkmatch = ua.match( /AppleWebKit\\/([0-9]+)/ ),\n\t\t\twkversion = !!wkmatch && wkmatch[ 1 ],\n\t\t\tos = null,\n\t\t\tself = this;\n\t\t\t//set the os we are working in if it dosent match one with workarounds return\n\t\t\tif ( platform.indexOf( \"iPhone\" ) > -1 || platform.indexOf( \"iPad\" ) > -1  || platform.indexOf( \"iPod\" ) > -1 ) {\n\t\t\t\tos = \"ios\";\n\t\t\t} else if ( ua.indexOf( \"Android\" ) > -1 ) {\n\t\t\t\tos = \"android\";\n\t\t\t} else {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t//check os version if it dosent match one with workarounds return\n\t\t\tif ( os === \"ios\" ) {\n\t\t\t\t//iOS  workarounds\n\t\t\t\tself._bindScrollWorkaround();\n\t\t\t} else if ( os === \"android\" && wkversion && wkversion < 534 ) {\n\t\t\t\t//Android 2.3 run all Android 2.3 workaround\n\t\t\t\tself._bindScrollWorkaround();\n\t\t\t\tself._bindListThumbWorkaround();\n\t\t\t} else {\n\t\t\t\treturn;\n\t\t\t}\n\t\t},\n\n\t\t//Utility class for checking header and footer positions relative to viewport\n\t\t_viewportOffset: function() {\n\t\t\tvar $el = this.element,\n\t\t\t\theader = $el.hasClass( \"ui-header\" ),\n\t\t\t\toffset = Math.abs( $el.offset().top - this.window.scrollTop() );\n\t\t\tif ( !header ) {\n\t\t\t\toffset = Math.round( offset - this.window.height() + $el.outerHeight() ) - 60;\n\t\t\t}\n\t\t\treturn offset;\n\t\t},\n\n\t\t//bind events for _triggerRedraw() function\n\t\t_bindScrollWorkaround: function() {\n\t\t\tvar self = this;\n\t\t\t//bind to scrollstop and check if the toolbars are correctly positioned\n\t\t\tthis._on( this.window, { scrollstop: function() {\n\t\t\t\tvar viewportOffset = self._viewportOffset();\n\t\t\t\t//check if the header is visible and if its in the right place\n\t\t\t\tif ( viewportOffset > 2 && self._visible ) {\n\t\t\t\t\tself._triggerRedraw();\n\t\t\t\t}\n\t\t\t}});\n\t\t},\n\n\t\t//this addresses issue #4250 Persistent footer instability in v1.1 with long select lists in Android 2.3.3\n\t\t//and issue #3748 Android 2.x: Page transitions broken when fixed toolbars used\n\t\t//the absolutely positioned thumbnail in a list view causes problems with fixed position buttons above in a nav bar\n\t\t//setting the li's to -webkit-transform:translate3d(0,0,0); solves this problem to avoide potential issues in other\n\t\t//platforms we scope this with the class ui-android-2x-fix\n\t\t_bindListThumbWorkaround: function() {\n\t\t\tthis.element.closest( \".ui-page\" ).addClass( \"ui-android-2x-fixed\" );\n\t\t},\n\t\t//this addresses issues #4337 Fixed header problem after scrolling content on iOS and Android\n\t\t//and device bugs project issue #1 Form elements can lose click hit area in position: fixed containers.\n\t\t//this also addresses not on fixed toolbars page in docs\n\t\t//adding 1px of padding to the bottom then removing it causes a \"redraw\"\n\t\t//which positions the toolbars correctly (they will always be visually correct)\n\t\t_triggerRedraw: function() {\n\t\t\tvar paddingBottom = parseFloat( $( \".ui-page-active\" ).css( \"padding-bottom\" ) );\n\t\t\t//trigger page redraw to fix incorrectly positioned fixed elements\n\t\t\t$( \".ui-page-active\" ).css( \"padding-bottom\", ( paddingBottom + 1 ) + \"px\" );\n\t\t\t//if the padding is reset with out a timeout the reposition will not occure.\n\t\t\t//this is independant of JQM the browser seems to need the time to react.\n\t\t\tsetTimeout( function() {\n\t\t\t\t$( \".ui-page-active\" ).css( \"padding-bottom\", paddingBottom + \"px\" );\n\t\t\t}, 0 );\n\t\t},\n\n\t\tdestroy: function() {\n\t\t\tthis._super();\n\t\t\t//Remove the class we added to the page previously in android 2.x\n\t\t\tthis.element.closest( \".ui-page-active\" ).removeClass( \"ui-android-2x-fix\" );\n\t\t}\n\t});\n\n})( jQuery );\n\n\n( function( $, undefined ) {\n\nvar ieHack = ( $.mobile.browser.oldIE && $.mobile.browser.oldIE <= 8 ),\n\tuiTemplate = $(\n\t\t\"<div class='ui-popup-arrow-guide'></div>\" +\n\t\t\"<div class='ui-popup-arrow-container\" + ( ieHack ? \" ie\" : \"\" ) + \"'>\" +\n\t\t\t\"<div class='ui-popup-arrow'></div>\" +\n\t\t\"</div>\"\n\t);\n\nfunction getArrow() {\n\tvar clone = uiTemplate.clone(),\n\t\tgd = clone.eq( 0 ),\n\t\tct = clone.eq( 1 ),\n\t\tar = ct.children();\n\n\treturn { arEls: ct.add( gd ), gd: gd, ct: ct, ar: ar };\n}\n\n$.widget( \"mobile.popup\", $.mobile.popup, {\n\toptions: {\n\n\t\tarrow: \"\"\n\t},\n\n\t_create: function() {\n\t\tvar ar,\n\t\t\tret = this._super();\n\n\t\tif ( this.options.arrow ) {\n\t\t\tthis._ui.arrow = ar = this._addArrow();\n\t\t}\n\n\t\treturn ret;\n\t},\n\n\t_addArrow: function() {\n\t\tvar theme,\n\t\t\topts = this.options,\n\t\t\tar = getArrow();\n\n\t\ttheme = this._themeClassFromOption( \"ui-body-\", opts.theme );\n\t\tar.ar.addClass( theme + ( opts.shadow ? \" ui-overlay-shadow\" : \"\" ) );\n\t\tar.arEls.hide().appendTo( this.element );\n\n\t\treturn ar;\n\t},\n\n\t_unenhance: function() {\n\t\tvar ar = this._ui.arrow;\n\n\t\tif ( ar ) {\n\t\t\tar.arEls.remove();\n\t\t}\n\n\t\treturn this._super();\n\t},\n\n\t// Pretend to show an arrow described by @p and @dir and calculate the\n\t// distance from the desired point. If a best-distance is passed in, return\n\t// the minimum of the one passed in and the one calculated.\n\t_tryAnArrow: function( p, dir, desired, s, best ) {\n\t\tvar result, r, diff, desiredForArrow = {}, tip = {};\n\n\t\t// If the arrow has no wiggle room along the edge of the popup, it cannot\n\t\t// be displayed along the requested edge without it sticking out.\n\t\tif ( s.arFull[ p.dimKey ] > s.guideDims[ p.dimKey ] ) {\n\t\t\treturn best;\n\t\t}\n\n\t\tdesiredForArrow[ p.fst ] = desired[ p.fst ] +\n\t\t\t( s.arHalf[ p.oDimKey ] + s.menuHalf[ p.oDimKey ] ) * p.offsetFactor -\n\t\t\ts.contentBox[ p.fst ] + ( s.clampInfo.menuSize[ p.oDimKey ] - s.contentBox[ p.oDimKey ] ) * p.arrowOffsetFactor;\n\t\tdesiredForArrow[ p.snd ] = desired[ p.snd ];\n\n\t\tresult = s.result || this._calculateFinalLocation( desiredForArrow, s.clampInfo );\n\t\tr = { x: result.left, y: result.top };\n\n\t\ttip[ p.fst ] = r[ p.fst ] + s.contentBox[ p.fst ] + p.tipOffset;\n\t\ttip[ p.snd ] = Math.max( result[ p.prop ] + s.guideOffset[ p.prop ] + s.arHalf[ p.dimKey ],\n\t\t\tMath.min( result[ p.prop ] + s.guideOffset[ p.prop ] + s.guideDims[ p.dimKey ] - s.arHalf[ p.dimKey ],\n\t\t\t\tdesired[ p.snd ] ) );\n\n\t\tdiff = Math.abs( desired.x - tip.x ) + Math.abs( desired.y - tip.y );\n\t\tif ( !best || diff < best.diff ) {\n\t\t\t// Convert tip offset to coordinates inside the popup\n\t\t\ttip[ p.snd ] -= s.arHalf[ p.dimKey ] + result[ p.prop ] + s.contentBox[ p.snd ];\n\t\t\tbest = { dir: dir, diff: diff, result: result, posProp: p.prop, posVal: tip[ p.snd ] };\n\t\t}\n\n\t\treturn best;\n\t},\n\n\t_getPlacementState: function( clamp ) {\n\t\tvar offset, gdOffset,\n\t\t\tar = this._ui.arrow,\n\t\t\tstate = {\n\t\t\t\tclampInfo: this._clampPopupWidth( !clamp ),\n\t\t\t\tarFull: { cx: ar.ct.width(), cy: ar.ct.height() },\n\t\t\t\tguideDims: { cx: ar.gd.width(), cy: ar.gd.height() },\n\t\t\t\tguideOffset: ar.gd.offset()\n\t\t\t};\n\n\t\toffset = this.element.offset();\n\n\t\tar.gd.css( { left: 0, top: 0, right: 0, bottom: 0 } );\n\t\tgdOffset = ar.gd.offset();\n\t\tstate.contentBox = {\n\t\t\tx: gdOffset.left - offset.left,\n\t\t\ty: gdOffset.top - offset.top,\n\t\t\tcx: ar.gd.width(),\n\t\t\tcy: ar.gd.height()\n\t\t};\n\t\tar.gd.removeAttr( \"style\" );\n\n\t\t// The arrow box moves between guideOffset and guideOffset + guideDims - arFull\n\t\tstate.guideOffset = { left: state.guideOffset.left - offset.left, top: state.guideOffset.top - offset.top };\n\t\tstate.arHalf = { cx: state.arFull.cx / 2, cy: state.arFull.cy / 2 };\n\t\tstate.menuHalf = { cx: state.clampInfo.menuSize.cx / 2, cy: state.clampInfo.menuSize.cy / 2 };\n\n\t\treturn state;\n\t},\n\n\t_placementCoords: function( desired ) {\n\t\tvar state, best, params, elOffset, bgRef,\n\t\t\toptionValue = this.options.arrow,\n\t\t\tar = this._ui.arrow;\n\n\t\tif ( !ar ) {\n\t\t\treturn this._super( desired );\n\t\t}\n\n\t\tar.arEls.show();\n\n\t\tbgRef = {};\n\t\tstate = this._getPlacementState( true );\n\t\tparams = {\n\t\t\t\"l\": { fst: \"x\", snd: \"y\", prop: \"top\", dimKey: \"cy\", oDimKey: \"cx\", offsetFactor: 1, tipOffset:  -state.arHalf.cx, arrowOffsetFactor: 0 },\n\t\t\t\"r\": { fst: \"x\", snd: \"y\", prop: \"top\", dimKey: \"cy\", oDimKey: \"cx\", offsetFactor: -1, tipOffset: state.arHalf.cx + state.contentBox.cx, arrowOffsetFactor: 1 },\n\t\t\t\"b\": { fst: \"y\", snd: \"x\", prop: \"left\", dimKey: \"cx\", oDimKey: \"cy\", offsetFactor: -1, tipOffset: state.arHalf.cy + state.contentBox.cy, arrowOffsetFactor: 1 },\n\t\t\t\"t\": { fst: \"y\", snd: \"x\", prop: \"left\", dimKey: \"cx\", oDimKey: \"cy\", offsetFactor: 1, tipOffset: -state.arHalf.cy, arrowOffsetFactor: 0 }\n\t\t};\n\n\t\t// Try each side specified in the options to see on which one the arrow\n\t\t// should be placed such that the distance between the tip of the arrow and\n\t\t// the desired coordinates is the shortest.\n\t\t$.each( ( optionValue === true ? \"l,t,r,b\" : optionValue ).split( \",\" ),\n\t\t\t$.proxy( function( key, value ) {\n\t\t\t\tbest = this._tryAnArrow( params[ value ], value, desired, state, best );\n\t\t\t}, this ) );\n\n\t\t// Could not place the arrow along any of the edges - behave as if showing\n\t\t// the arrow was turned off.\n\t\tif ( !best ) {\n\t\t\tar.arEls.hide();\n\t\t\treturn this._super( desired );\n\t\t}\n\n\t\t// Move the arrow into place\n\t\tar.ct\n\t\t\t.removeClass( \"ui-popup-arrow-l ui-popup-arrow-t ui-popup-arrow-r ui-popup-arrow-b\" )\n\t\t\t.addClass( \"ui-popup-arrow-\" + best.dir )\n\t\t\t.removeAttr( \"style\" ).css( best.posProp, best.posVal )\n\t\t\t.show();\n\n\t\t// Do not move/size the background div on IE, because we use the arrow div for background as well.\n\t\tif ( !ieHack ) {\n\t\t\telOffset = this.element.offset();\n\t\t\tbgRef[ params[ best.dir ].fst ] = ar.ct.offset();\n\t\t\tbgRef[ params[ best.dir ].snd ] = {\n\t\t\t\tleft: elOffset.left + state.contentBox.x,\n\t\t\t\ttop: elOffset.top + state.contentBox.y\n\t\t\t};\n\t\t}\n\n\t\treturn best.result;\n\t},\n\n\t_setOptions: function( opts ) {\n\t\tvar newTheme,\n\t\t\toldTheme = this.options.theme,\n\t\t\tar = this._ui.arrow,\n\t\t\tret = this._super( opts );\n\n\t\tif ( opts.arrow !== undefined ) {\n\t\t\tif ( !ar && opts.arrow ) {\n\t\t\t\tthis._ui.arrow = this._addArrow();\n\n\t\t\t\t// Important to return here so we don't set the same options all over\n\t\t\t\t// again below.\n\t\t\t\treturn;\n\t\t\t} else if ( ar && !opts.arrow ) {\n\t\t\t\tar.arEls.remove();\n\t\t\t\tthis._ui.arrow = null;\n\t\t\t}\n\t\t}\n\n\t\t// Reassign with potentially new arrow\n\t\tar = this._ui.arrow;\n\n\t\tif ( ar ) {\n\t\t\tif ( opts.theme !== undefined ) {\n\t\t\t\toldTheme = this._themeClassFromOption( \"ui-body-\", oldTheme );\n\t\t\t\tnewTheme = this._themeClassFromOption( \"ui-body-\", opts.theme );\n\t\t\t\tar.ar.removeClass( oldTheme ).addClass( newTheme );\n\t\t\t}\n\n\t\t\tif ( opts.shadow !== undefined ) {\n\t\t\t\tar.ar.toggleClass( \"ui-overlay-shadow\", opts.shadow );\n\t\t\t}\n\t\t}\n\n\t\treturn ret;\n\t},\n\n\t_destroy: function() {\n\t\tvar ar = this._ui.arrow;\n\n\t\tif ( ar ) {\n\t\t\tar.arEls.remove();\n\t\t}\n\n\t\treturn this._super();\n\t}\n});\n\n})( jQuery );\n\n\n(function( $, undefined ) {\n\n$.widget( \"mobile.panel\", {\n\toptions: {\n\t\tclasses: {\n\t\t\tpanel: \"ui-panel\",\n\t\t\tpanelOpen: \"ui-panel-open\",\n\t\t\tpanelClosed: \"ui-panel-closed\",\n\t\t\tpanelFixed: \"ui-panel-fixed\",\n\t\t\tpanelInner: \"ui-panel-inner\",\n\t\t\tmodal: \"ui-panel-dismiss\",\n\t\t\tmodalOpen: \"ui-panel-dismiss-open\",\n\t\t\tpageContainer: \"ui-panel-page-container\",\n\t\t\tpageWrapper: \"ui-panel-wrapper\",\n\t\t\tpageFixedToolbar: \"ui-panel-fixed-toolbar\",\n\t\t\tpageContentPrefix: \"ui-panel-page-content\", /* Used for wrapper and fixed toolbars position, display and open classes. */\n\t\t\tanimate: \"ui-panel-animate\"\n\t\t},\n\t\tanimate: true,\n\t\ttheme: null,\n\t\tposition: \"left\",\n\t\tdismissible: true,\n\t\tdisplay: \"reveal\", //accepts reveal, push, overlay\n\t\tswipeClose: true,\n\t\tpositionFixed: false\n\t},\n\n\t_closeLink: null,\n\t_parentPage: null,\n\t_page: null,\n\t_modal: null,\n\t_panelInner: null,\n\t_wrapper: null,\n\t_fixedToolbars: null,\n\n\t_create: function() {\n\t\tvar el = this.element,\n\t\t\tparentPage = el.closest( \".ui-page, :jqmData(role='page')\" );\n\n\t\t// expose some private props to other methods\n\t\t$.extend( this, {\n\t\t\t_closeLink: el.find( \":jqmData(rel='close')\" ),\n\t\t\t_parentPage: ( parentPage.length > 0 ) ? parentPage : false,\n\t\t\t_openedPage: null,\n\t\t\t_page: this._getPage,\n\t\t\t_panelInner: this._getPanelInner(),\n\t\t\t_fixedToolbars: this._getFixedToolbars\n\t\t});\n\t\tif ( this.options.display !== \"overlay\" ){\n\t\t\tthis._getWrapper();\n\t\t}\n\t\tthis._addPanelClasses();\n\n\t\t// if animating, add the class to do so\n\t\tif ( $.support.cssTransform3d && !!this.options.animate ) {\n\t\t\tthis.element.addClass( this.options.classes.animate );\n\t\t}\n\n\t\tthis._bindUpdateLayout();\n\t\tthis._bindCloseEvents();\n\t\tthis._bindLinkListeners();\n\t\tthis._bindPageEvents();\n\n\t\tif ( !!this.options.dismissible ) {\n\t\t\tthis._createModal();\n\t\t}\n\n\t\tthis._bindSwipeEvents();\n\t},\n\n\t_getPanelInner: function() {\n\t\tvar panelInner = this.element.find( \".\" + this.options.classes.panelInner );\n\n\t\tif ( panelInner.length === 0 ) {\n\t\t\tpanelInner = this.element.children().wrapAll( \"<div class='\" + this.options.classes.panelInner + \"' />\" ).parent();\n\t\t}\n\n\t\treturn panelInner;\n\t},\n\n\t_createModal: function() {\n\t\tvar self = this,\n\t\t\ttarget = self._parentPage ? self._parentPage.parent() : self.element.parent();\n\n\t\tself._modal = $( \"<div class='\" + self.options.classes.modal + \"'></div>\" )\n\t\t\t.on( \"mousedown\", function() {\n\t\t\t\tself.close();\n\t\t\t})\n\t\t\t.appendTo( target );\n\t},\n\n\t_getPage: function() {\n\t\tvar page = this._openedPage || this._parentPage || $( \".\" + $.mobile.activePageClass );\n\n\t\treturn page;\n\t},\n\n\t_getWrapper: function() {\n\t\tvar wrapper = this._page().find( \".\" + this.options.classes.pageWrapper );\n\t\tif ( wrapper.length === 0 ) {\n\t\t\twrapper = this._page().children( \".ui-header:not(.ui-header-fixed), .ui-content:not(.ui-popup), .ui-footer:not(.ui-footer-fixed)\" )\n\t\t\t\t.wrapAll( \"<div class='\" + this.options.classes.pageWrapper + \"'></div>\" )\n\t\t\t\t.parent();\n\t\t}\n\n\t\tthis._wrapper = wrapper;\n\t},\n\n\t_getFixedToolbars: function() {\n\t\tvar extFixedToolbars = $( \"body\" ).children( \".ui-header-fixed, .ui-footer-fixed\" ),\n\t\t\tintFixedToolbars = this._page().find( \".ui-header-fixed, .ui-footer-fixed\" ),\n\t\t\tfixedToolbars = extFixedToolbars.add( intFixedToolbars ).addClass( this.options.classes.pageFixedToolbar );\n\n\t\treturn fixedToolbars;\n\t},\n\n\t_getPosDisplayClasses: function( prefix ) {\n\t\treturn prefix + \"-position-\" + this.options.position + \" \" + prefix + \"-display-\" + this.options.display;\n\t},\n\n\t_getPanelClasses: function() {\n\t\tvar panelClasses = this.options.classes.panel +\n\t\t\t\" \" + this._getPosDisplayClasses( this.options.classes.panel ) +\n\t\t\t\" \" + this.options.classes.panelClosed +\n\t\t\t\" \" + \"ui-body-\" + ( this.options.theme ? this.options.theme : \"inherit\" );\n\n\t\tif ( !!this.options.positionFixed ) {\n\t\t\tpanelClasses += \" \" + this.options.classes.panelFixed;\n\t\t}\n\n\t\treturn panelClasses;\n\t},\n\n\t_addPanelClasses: function() {\n\t\tthis.element.addClass( this._getPanelClasses() );\n\t},\n\n\t_handleCloseClick: function( event ) {\n\t\tif ( !event.isDefaultPrevented() ) {\n\t\t\tthis.close();\n\t\t}\n\t},\n\n\t_bindCloseEvents: function() {\n\t\tthis._on( this._closeLink, {\n\t\t\t\"click\": \"_handleCloseClick\"\n\t\t});\n\n\t\tthis._on({\n\t\t\t\"click a:jqmData(ajax='false')\": \"_handleCloseClick\"\n\t\t});\n\t},\n\n\t_positionPanel: function( scrollToTop ) {\n\t\tvar self = this,\n\t\t\tpanelInnerHeight = self._panelInner.outerHeight(),\n\t\t\texpand = panelInnerHeight > $.mobile.getScreenHeight();\n\n\t\tif ( expand || !self.options.positionFixed ) {\n\t\t\tif ( expand ) {\n\t\t\t\tself._unfixPanel();\n\t\t\t\t$.mobile.resetActivePageHeight( panelInnerHeight );\n\t\t\t}\n\t\t\tif ( scrollToTop ) {\n\t\t\t\tthis.window[ 0 ].scrollTo( 0, $.mobile.defaultHomeScroll );\n\t\t\t}\n\t\t} else {\n\t\t\tself._fixPanel();\n\t\t}\n\t},\n\n\t_bindFixListener: function() {\n\t\tthis._on( $( window ), { \"throttledresize\": \"_positionPanel\" });\n\t},\n\n\t_unbindFixListener: function() {\n\t\tthis._off( $( window ), \"throttledresize\" );\n\t},\n\n\t_unfixPanel: function() {\n\t\tif ( !!this.options.positionFixed && $.support.fixedPosition ) {\n\t\t\tthis.element.removeClass( this.options.classes.panelFixed );\n\t\t}\n\t},\n\n\t_fixPanel: function() {\n\t\tif ( !!this.options.positionFixed && $.support.fixedPosition ) {\n\t\t\tthis.element.addClass( this.options.classes.panelFixed );\n\t\t}\n\t},\n\n\t_bindUpdateLayout: function() {\n\t\tvar self = this;\n\n\t\tself.element.on( \"updatelayout\", function(/* e */) {\n\t\t\tif ( self._open ) {\n\t\t\t\tself._positionPanel();\n\t\t\t}\n\t\t});\n\t},\n\n\t_bindLinkListeners: function() {\n\t\tthis._on( \"body\", {\n\t\t\t\"click a\": \"_handleClick\"\n\t\t});\n\n\t},\n\n\t_handleClick: function( e ) {\n\t\tvar link,\n\t\t\tpanelId = this.element.attr( \"id\" );\n\n\t\tif ( e.currentTarget.href.split( \"#\" )[ 1 ] === panelId && panelId !== undefined ) {\n\n\t\t\te.preventDefault();\n\t\t\tlink = $( e.target );\n\t\t\tif ( link.hasClass( \"ui-btn\" ) ) {\n\t\t\t\tlink.addClass( $.mobile.activeBtnClass );\n\t\t\t\tthis.element.one( \"panelopen panelclose\", function() {\n\t\t\t\t\tlink.removeClass( $.mobile.activeBtnClass );\n\t\t\t\t});\n\t\t\t}\n\t\t\tthis.toggle();\n\t\t}\n\t},\n\n\t_bindSwipeEvents: function() {\n\t\tvar self = this,\n\t\t\tarea = self._modal ? self.element.add( self._modal ) : self.element;\n\n\t\t// on swipe, close the panel\n\t\tif ( !!self.options.swipeClose ) {\n\t\t\tif ( self.options.position === \"left\" ) {\n\t\t\t\tarea.on( \"swipeleft.panel\", function(/* e */) {\n\t\t\t\t\tself.close();\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tarea.on( \"swiperight.panel\", function(/* e */) {\n\t\t\t\t\tself.close();\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t},\n\n\t_bindPageEvents: function() {\n\t\tvar self = this;\n\n\t\tthis.document\n\t\t\t// Close the panel if another panel on the page opens\n\t\t\t.on( \"panelbeforeopen\", function( e ) {\n\t\t\t\tif ( self._open && e.target !== self.element[ 0 ] ) {\n\t\t\t\t\tself.close();\n\t\t\t\t}\n\t\t\t})\n\t\t\t// On escape, close? might need to have a target check too...\n\t\t\t.on( \"keyup.panel\", function( e ) {\n\t\t\t\tif ( e.keyCode === 27 && self._open ) {\n\t\t\t\t\tself.close();\n\t\t\t\t}\n\t\t\t});\n\t\tif ( !this._parentPage && this.options.display !== \"overlay\" ) {\n\t\t\tthis._on( this.document, {\n\t\t\t\t\"pageshow\": function() {\n\t\t\t\t\tthis._openedPage = null;\n\t\t\t\t\tthis._getWrapper();\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t\t// Clean up open panels after page hide\n\t\tif ( self._parentPage ) {\n\t\t\tthis.document.on( \"pagehide\", \":jqmData(role='page')\", function() {\n\t\t\t\tif ( self._open ) {\n\t\t\t\t\tself.close( true );\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tthis.document.on( \"pagebeforehide\", function() {\n\t\t\t\tif ( self._open ) {\n\t\t\t\t\tself.close( true );\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t},\n\n\t// state storage of open or closed\n\t_open: false,\n\t_pageContentOpenClasses: null,\n\t_modalOpenClasses: null,\n\n\topen: function( immediate ) {\n\t\tif ( !this._open ) {\n\t\t\tvar self = this,\n\t\t\t\to = self.options,\n\n\t\t\t\t_openPanel = function() {\n\t\t\t\t\tself._off( self.document , \"panelclose\" );\n\t\t\t\t\tself._page().jqmData( \"panel\", \"open\" );\n\n\t\t\t\t\tif ( $.support.cssTransform3d && !!o.animate && o.display !== \"overlay\" ) {\n\t\t\t\t\t\tself._wrapper.addClass( o.classes.animate );\n\t\t\t\t\t\tself._fixedToolbars().addClass( o.classes.animate );\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( !immediate && $.support.cssTransform3d && !!o.animate ) {\n\t\t\t\t\t\t( self._wrapper || self.element )\n\t\t\t\t\t\t\t.animationComplete( complete, \"transition\" );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tsetTimeout( complete, 0 );\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( o.theme && o.display !== \"overlay\" ) {\n\t\t\t\t\t\tself._page().parent()\n\t\t\t\t\t\t\t.addClass( o.classes.pageContainer + \"-themed \" + o.classes.pageContainer + \"-\" + o.theme );\n\t\t\t\t\t}\n\n\t\t\t\t\tself.element\n\t\t\t\t\t\t.removeClass( o.classes.panelClosed )\n\t\t\t\t\t\t.addClass( o.classes.panelOpen );\n\n\t\t\t\t\tself._positionPanel( true );\n\n\t\t\t\t\tself._pageContentOpenClasses = self._getPosDisplayClasses( o.classes.pageContentPrefix );\n\n\t\t\t\t\tif ( o.display !== \"overlay\" ) {\n\t\t\t\t\t\tself._page().parent().addClass( o.classes.pageContainer );\n\t\t\t\t\t\tself._wrapper.addClass( self._pageContentOpenClasses );\n\t\t\t\t\t\tself._fixedToolbars().addClass( self._pageContentOpenClasses );\n\t\t\t\t\t}\n\n\t\t\t\t\tself._modalOpenClasses = self._getPosDisplayClasses( o.classes.modal ) + \" \" + o.classes.modalOpen;\n\t\t\t\t\tif ( self._modal ) {\n\t\t\t\t\t\tself._modal\n\t\t\t\t\t\t\t.addClass( self._modalOpenClasses )\n\t\t\t\t\t\t\t.height( Math.max( self._modal.height(), self.document.height() ) );\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tcomplete = function() {\n\n\t\t\t\t\t// Bail if the panel was closed before the opening animation has completed\n\t\t\t\t\tif ( !self._open ) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( o.display !== \"overlay\" ) {\n\t\t\t\t\t\tself._wrapper.addClass( o.classes.pageContentPrefix + \"-open\" );\n\t\t\t\t\t\tself._fixedToolbars().addClass( o.classes.pageContentPrefix + \"-open\" );\n\t\t\t\t\t}\n\n\t\t\t\t\tself._bindFixListener();\n\n\t\t\t\t\tself._trigger( \"open\" );\n\n\t\t\t\t\tself._openedPage = self._page();\n\t\t\t\t};\n\n\t\t\tself._trigger( \"beforeopen\" );\n\n\t\t\tif ( self._page().jqmData( \"panel\" ) === \"open\" ) {\n\t\t\t\tself._on( self.document, {\n\t\t\t\t\t\"panelclose\": _openPanel\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\t_openPanel();\n\t\t\t}\n\n\t\t\tself._open = true;\n\t\t}\n\t},\n\n\tclose: function( immediate ) {\n\t\tif ( this._open ) {\n\t\t\tvar self = this,\n\t\t\t\to = this.options,\n\n\t\t\t\t_closePanel = function() {\n\n\t\t\t\t\tself.element.removeClass( o.classes.panelOpen );\n\n\t\t\t\t\tif ( o.display !== \"overlay\" ) {\n\t\t\t\t\t\tself._wrapper.removeClass( self._pageContentOpenClasses );\n\t\t\t\t\t\tself._fixedToolbars().removeClass( self._pageContentOpenClasses );\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( !immediate && $.support.cssTransform3d && !!o.animate ) {\n\t\t\t\t\t\t( self._wrapper || self.element )\n\t\t\t\t\t\t\t.animationComplete( complete, \"transition\" );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tsetTimeout( complete, 0 );\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( self._modal ) {\n\t\t\t\t\t\tself._modal\n\t\t\t\t\t\t\t.removeClass( self._modalOpenClasses )\n\t\t\t\t\t\t\t.height( \"\" );\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tcomplete = function() {\n\t\t\t\t\tif ( o.theme && o.display !== \"overlay\" ) {\n\t\t\t\t\t\tself._page().parent().removeClass( o.classes.pageContainer + \"-themed \" + o.classes.pageContainer + \"-\" + o.theme );\n\t\t\t\t\t}\n\n\t\t\t\t\tself.element.addClass( o.classes.panelClosed );\n\n\t\t\t\t\tif ( o.display !== \"overlay\" ) {\n\t\t\t\t\t\tself._page().parent().removeClass( o.classes.pageContainer );\n\t\t\t\t\t\tself._wrapper.removeClass( o.classes.pageContentPrefix + \"-open\" );\n\t\t\t\t\t\tself._fixedToolbars().removeClass( o.classes.pageContentPrefix + \"-open\" );\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( $.support.cssTransform3d && !!o.animate && o.display !== \"overlay\" ) {\n\t\t\t\t\t\tself._wrapper.removeClass( o.classes.animate );\n\t\t\t\t\t\tself._fixedToolbars().removeClass( o.classes.animate );\n\t\t\t\t\t}\n\n\t\t\t\t\tself._fixPanel();\n\t\t\t\t\tself._unbindFixListener();\n\t\t\t\t\t$.mobile.resetActivePageHeight();\n\n\t\t\t\t\tself._page().jqmRemoveData( \"panel\" );\n\n\t\t\t\t\tself._trigger( \"close\" );\n\n\t\t\t\t\tself._openedPage = null;\n\t\t\t\t};\n\n\t\t\tself._trigger( \"beforeclose\" );\n\n\t\t\t_closePanel();\n\n\t\t\tself._open = false;\n\t\t}\n\t},\n\n\ttoggle: function() {\n\t\tthis[ this._open ? \"close\" : \"open\" ]();\n\t},\n\n\t_destroy: function() {\n\t\tvar otherPanels,\n\t\to = this.options,\n\t\tmultiplePanels = ( $( \"body > :mobile-panel\" ).length + $.mobile.activePage.find( \":mobile-panel\" ).length ) > 1;\n\n\t\tif ( o.display !== \"overlay\" ) {\n\n\t\t\t//  remove the wrapper if not in use by another panel\n\t\t\totherPanels = $( \"body > :mobile-panel\" ).add( $.mobile.activePage.find( \":mobile-panel\" ) );\n\t\t\tif ( otherPanels.not( \".ui-panel-display-overlay\" ).not( this.element ).length === 0 ) {\n\t\t\t\tthis._wrapper.children().unwrap();\n\t\t\t}\n\n\t\t\tif ( this._open ) {\n\n\t\t\t\tthis._fixedToolbars().removeClass( o.classes.pageContentPrefix + \"-open\" );\n\n\t\t\t\tif ( $.support.cssTransform3d && !!o.animate ) {\n\t\t\t\t\tthis._fixedToolbars().removeClass( o.classes.animate );\n\t\t\t\t}\n\n\t\t\t\tthis._page().parent().removeClass( o.classes.pageContainer );\n\n\t\t\t\tif ( o.theme ) {\n\t\t\t\t\tthis._page().parent().removeClass( o.classes.pageContainer + \"-themed \" + o.classes.pageContainer + \"-\" + o.theme );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif ( !multiplePanels ) {\n\n\t\t\tthis.document.off( \"panelopen panelclose\" );\n\n\t\t}\n\n\t\tif ( this._open ) {\n\t\t\tthis._page().jqmRemoveData( \"panel\" );\n\t\t}\n\n\t\tthis._panelInner.children().unwrap();\n\n\t\tthis.element\n\t\t\t.removeClass( [ this._getPanelClasses(), o.classes.panelOpen, o.classes.animate ].join( \" \" ) )\n\t\t\t.off( \"swipeleft.panel swiperight.panel\" )\n\t\t\t.off( \"panelbeforeopen\" )\n\t\t\t.off( \"panelhide\" )\n\t\t\t.off( \"keyup.panel\" )\n\t\t\t.off( \"updatelayout\" );\n\n\t\tif ( this._modal ) {\n\t\t\tthis._modal.remove();\n\t\t}\n\t}\n});\n\n})( jQuery );\n\n(function( $, undefined ) {\n\n$.widget( \"mobile.table\", {\n\toptions: {\n\t\tclasses: {\n\t\t\ttable: \"ui-table\"\n\t\t},\n\t\tenhanced: false\n\t},\n\n\t_create: function() {\n\t\tif ( !this.options.enhanced ) {\n\t\t\tthis.element.addClass( this.options.classes.table );\n\t\t}\n\n\t\t// extend here, assign on refresh > _setHeaders\n\t\t$.extend( this, {\n\n\t\t\t// Expose headers and allHeaders properties on the widget\n\t\t\t// headers references the THs within the first TR in the table\n\t\t\theaders: undefined,\n\n\t\t\t// allHeaders references headers, plus all THs in the thead, which may\n\t\t\t// include several rows, or not\n\t\t\tallHeaders: undefined\n\t\t});\n\n\t\tthis._refresh( true );\n\t},\n\n\t_setHeaders: function() {\n\t\tvar trs = this.element.find( \"thead tr\" );\n\n\t\tthis.headers = this.element.find( \"tr:eq(0)\" ).children();\n\t\tthis.allHeaders = this.headers.add( trs.children() );\n\t},\n\n\trefresh: function() {\n\t\tthis._refresh();\n\t},\n\n\trebuild: $.noop,\n\n\t_refresh: function( /* create */ ) {\n\t\tvar table = this.element,\n\t\t\ttrs = table.find( \"thead tr\" );\n\n\t\t// updating headers on refresh (fixes #5880)\n\t\tthis._setHeaders();\n\n\t\t// Iterate over the trs\n\t\ttrs.each( function() {\n\t\t\tvar columnCount = 0;\n\n\t\t\t// Iterate over the children of the tr\n\t\t\t$( this ).children().each( function() {\n\t\t\t\tvar span = parseInt( this.getAttribute( \"colspan\" ), 10 ),\n\t\t\t\t\tselector = \":nth-child(\" + ( columnCount + 1 ) + \")\",\n\t\t\t\t\tj;\n\n\t\t\t\tthis.setAttribute( \"data-\" + $.mobile.ns + \"colstart\", columnCount + 1 );\n\n\t\t\t\tif ( span ) {\n\t\t\t\t\tfor( j = 0; j < span - 1; j++ ) {\n\t\t\t\t\t\tcolumnCount++;\n\t\t\t\t\t\tselector += \", :nth-child(\" + ( columnCount + 1 ) + \")\";\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Store \"cells\" data on header as a reference to all cells in the\n\t\t\t\t// same column as this TH\n\t\t\t\t$( this ).jqmData( \"cells\", table.find( \"tr\" ).not( trs.eq( 0 ) ).not( this ).children( selector ) );\n\n\t\t\t\tcolumnCount++;\n\t\t\t});\n\t\t});\n\t}\n});\n\n})( jQuery );\n\n\n(function( $, undefined ) {\n\n$.widget( \"mobile.table\", $.mobile.table, {\n\toptions: {\n\t\tmode: \"columntoggle\",\n\t\tcolumnBtnTheme: null,\n\t\tcolumnPopupTheme: null,\n\t\tcolumnBtnText: \"Columns...\",\n\t\tclasses: $.extend( $.mobile.table.prototype.options.classes, {\n\t\t\tpopup: \"ui-table-columntoggle-popup\",\n\t\t\tcolumnBtn: \"ui-table-columntoggle-btn\",\n\t\t\tpriorityPrefix: \"ui-table-priority-\",\n\t\t\tcolumnToggleTable: \"ui-table-columntoggle\"\n\t\t})\n\t},\n\n\t_create: function() {\n\t\tthis._super();\n\n\t\tif ( this.options.mode !== \"columntoggle\" ) {\n\t\t\treturn;\n\t\t}\n\n\t\t$.extend( this, {\n\t\t\t_menu: null\n\t\t});\n\n\t\tif ( this.options.enhanced ) {\n\t\t\tthis._menu = $( this.document[ 0 ].getElementById( this._id() + \"-popup\" ) ).children().first();\n\t\t\tthis._addToggles( this._menu, true );\n\t\t} else {\n\t\t\tthis._menu = this._enhanceColToggle();\n\t\t\tthis.element.addClass( this.options.classes.columnToggleTable );\n\t\t}\n\n\t\tthis._setupEvents();\n\n\t\tthis._setToggleState();\n\t},\n\n\t_id: function() {\n\t\treturn ( this.element.attr( \"id\" ) || ( this.widgetName + this.uuid ) );\n\t},\n\n\t_setupEvents: function() {\n\t\t//NOTE: inputs are bound in bindToggles,\n\t\t// so it can be called on refresh, too\n\n\t\t// update column toggles on resize\n\t\tthis._on( this.window, {\n\t\t\tthrottledresize: \"_setToggleState\"\n\t\t});\n\t\tthis._on( this._menu, {\n\t\t\t\"change input\": \"_menuInputChange\"\n\t\t});\n\t},\n\n\t_addToggles: function( menu, keep ) {\n\t\tvar inputs,\n\t\t\tcheckboxIndex = 0,\n\t\t\topts = this.options,\n\t\t\tcontainer = menu.controlgroup( \"container\" );\n\n\t\t// allow update of menu on refresh (fixes #5880)\n\t\tif ( keep ) {\n\t\t\tinputs = menu.find( \"input\" );\n\t\t} else {\n\t\t\tcontainer.empty();\n\t\t}\n\n\t\t// create the hide/show toggles\n\t\tthis.headers.not( \"td\" ).each( function() {\n\t\t\tvar input, cells,\n\t\t\t\theader = $( this ),\n\t\t\t\tpriority = $.mobile.getAttribute( this, \"priority\" );\n\n\t\t\tif ( priority ) {\n\t\t\t\tcells = header.add( header.jqmData( \"cells\" ) );\n\t\t\t\tcells.addClass( opts.classes.priorityPrefix + priority );\n\n\t\t\t\t// Make sure the (new?) checkbox is associated with its header via .jqmData() and\n\t\t\t\t// that, vice versa, the header is also associated with the checkbox\n\t\t\t\tinput = ( keep ? inputs.eq( checkboxIndex++ ) :\n\t\t\t\t\t$(\"<label><input type='checkbox' checked />\" +\n\t\t\t\t\t\t( header.children( \"abbr\" ).first().attr( \"title\" ) ||\n\t\t\t\t\t\t\theader.text() ) +\n\t\t\t\t\t\t\"</label>\" )\n\t\t\t\t\t\t.appendTo( container )\n\t\t\t\t\t\t.children( 0 )\n\t\t\t\t\t\t.checkboxradio( {\n\t\t\t\t\t\t\ttheme: opts.columnPopupTheme\n\t\t\t\t\t\t}) )\n\n\t\t\t\t\t\t// Associate the header with the checkbox\n\t\t\t\t\t\t.jqmData( \"header\", header )\n\t\t\t\t\t\t.jqmData( \"cells\", cells );\n\n\t\t\t\t// Associate the checkbox with the header\n\t\t\t\theader.jqmData( \"input\", input );\n\t\t\t}\n\t\t});\n\n\t\t// set bindings here\n\t\tif ( !keep ) {\n\t\t\tmenu.controlgroup( \"refresh\" );\n\t\t}\n\t},\n\n\t_menuInputChange: function( evt ) {\n\t\tvar input = $( evt.target ),\n\t\t\tchecked = input[ 0 ].checked;\n\n\t\tinput.jqmData( \"cells\" )\n\t\t\t.toggleClass( \"ui-table-cell-hidden\", !checked )\n\t\t\t.toggleClass( \"ui-table-cell-visible\", checked );\n\t},\n\n\t_unlockCells: function( cells ) {\n\t\t// allow hide/show via CSS only = remove all toggle-locks\n\t\tcells.removeClass( \"ui-table-cell-hidden ui-table-cell-visible\");\n\t},\n\n\t_enhanceColToggle: function() {\n\t\tvar id , menuButton, popup, menu,\n\t\t\ttable = this.element,\n\t\t\topts = this.options,\n\t\t\tns = $.mobile.ns,\n\t\t\tfragment = this.document[ 0 ].createDocumentFragment();\n\n\t\tid = this._id() + \"-popup\";\n\t\tmenuButton = $( \"<a href='#\" + id + \"' \" +\n\t\t\t\"class='\" + opts.classes.columnBtn + \" ui-btn \" +\n\t\t\t\"ui-btn-\" + ( opts.columnBtnTheme || \"a\" ) +\n\t\t\t\" ui-corner-all ui-shadow ui-mini' \" +\n\t\t\t\"data-\" + ns + \"rel='popup'>\" + opts.columnBtnText + \"</a>\" );\n\t\tpopup = $( \"<div class='\" + opts.classes.popup + \"' id='\" + id + \"'></div>\" );\n\t\tmenu = $( \"<fieldset></fieldset>\" ).controlgroup();\n\n\t\t// set extension here, send \"false\" to trigger build/rebuild\n\t\tthis._addToggles( menu, false );\n\n\t\tmenu.appendTo( popup );\n\n\t\tfragment.appendChild( popup[ 0 ] );\n\t\tfragment.appendChild( menuButton[ 0 ] );\n\t\ttable.before( fragment );\n\n\t\tpopup.popup();\n\n\t\treturn menu;\n\t},\n\n\trebuild: function() {\n\t\tthis._super();\n\n\t\tif ( this.options.mode === \"columntoggle\" ) {\n\t\t\t// NOTE: rebuild passes \"false\", while refresh passes \"undefined\"\n\t\t\t// both refresh the table, but inside addToggles, !false will be true,\n\t\t\t// so a rebuild call can be indentified\n\t\t\tthis._refresh( false );\n\t\t}\n\t},\n\n\t_refresh: function( create ) {\n\t\tvar headers, hiddenColumns, index;\n\n\t\t// Calling _super() here updates this.headers\n\t\tthis._super( create );\n\n\t\tif ( !create && this.options.mode === \"columntoggle\" ) {\n\t\t\theaders = this.headers;\n\t\t\thiddenColumns = [];\n\n\t\t\t// Find the index of the column header associated with each old checkbox among the\n\t\t\t// post-refresh headers and, if the header is still there, make sure the corresponding\n\t\t\t// column will be hidden if the pre-refresh checkbox indicates that the column is\n\t\t\t// hidden by recording its index in the array of hidden columns.\n\t\t\tthis._menu.find( \"input\" ).each( function() {\n\t\t\t\tvar input = $( this ),\n\t\t\t\t\theader = input.jqmData( \"header\" ),\n\t\t\t\t\tindex = headers.index( header[ 0 ] );\n\n\t\t\t\tif ( index > -1 && !input.prop( \"checked\" ) ) {\n\n\t\t\t\t\t// The column header associated with /this/ checkbox is still present in the\n\t\t\t\t\t// post-refresh table and the checkbox is not checked, so the column associated\n\t\t\t\t\t// with this column header is currently hidden. Let's record that.\n\t\t\t\t\thiddenColumns.push( index );\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// columns not being replaced must be cleared from input toggle-locks\n\t\t\tthis._unlockCells( this.element.find( \".ui-table-cell-hidden, \" +\n\t\t\t\t\".ui-table-cell-visible\" ) );\n\n\t\t\t// update columntoggles and cells\n\t\t\tthis._addToggles( this._menu, create );\n\n\t\t\t// At this point all columns are visible, so uncheck the checkboxes that correspond to\n\t\t\t// those columns we've found to be hidden\n\t\t\tfor ( index = hiddenColumns.length - 1 ; index > -1 ; index-- ) {\n\t\t\t\theaders.eq( hiddenColumns[ index ] ).jqmData( \"input\" )\n\t\t\t\t\t.prop( \"checked\", false )\n\t\t\t\t\t.checkboxradio( \"refresh\" )\n\t\t\t\t\t.trigger( \"change\" );\n\t\t\t}\n\t\t}\n\t},\n\n\t_setToggleState: function() {\n\t\tthis._menu.find( \"input\" ).each( function() {\n\t\t\tvar checkbox = $( this );\n\n\t\t\tthis.checked = checkbox.jqmData( \"cells\" ).eq( 0 ).css( \"display\" ) === \"table-cell\";\n\t\t\tcheckbox.checkboxradio( \"refresh\" );\n\t\t});\n\t},\n\n\t_destroy: function() {\n\t\tthis._super();\n\t}\n});\n\n})( jQuery );\n\n(function( $, undefined ) {\n\n$.widget( \"mobile.table\", $.mobile.table, {\n\toptions: {\n\t\tmode: \"reflow\",\n\t\tclasses: $.extend( $.mobile.table.prototype.options.classes, {\n\t\t\treflowTable: \"ui-table-reflow\",\n\t\t\tcellLabels: \"ui-table-cell-label\"\n\t\t})\n\t},\n\n\t_create: function() {\n\t\tthis._super();\n\n\t\t// If it's not reflow mode, return here.\n\t\tif ( this.options.mode !== \"reflow\" ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( !this.options.enhanced ) {\n\t\t\tthis.element.addClass( this.options.classes.reflowTable );\n\n\t\t\tthis._updateReflow();\n\t\t}\n\t},\n\n\trebuild: function() {\n\t\tthis._super();\n\n\t\tif ( this.options.mode === \"reflow\" ) {\n\t\t\tthis._refresh( false );\n\t\t}\n\t},\n\n\t_refresh: function( create ) {\n\t\tthis._super( create );\n\t\tif ( !create && this.options.mode === \"reflow\" ) {\n\t\t\tthis._updateReflow( );\n\t\t}\n\t},\n\n\t_updateReflow: function() {\n\t\tvar table = this,\n\t\t\topts = this.options;\n\n\t\t// get headers in reverse order so that top-level headers are appended last\n\t\t$( table.allHeaders.get().reverse() ).each( function() {\n\t\t\tvar cells = $( this ).jqmData( \"cells\" ),\n\t\t\t\tcolstart = $.mobile.getAttribute( this, \"colstart\" ),\n\t\t\t\thierarchyClass = cells.not( this ).filter( \"thead th\" ).length && \" ui-table-cell-label-top\",\n\t\t\t\tcontents = $( this ).clone().contents(),\n\t\t\t\titeration, filter;\n\n\t\t\t\tif ( contents.length > 0  ) {\n\n\t\t\t\t\tif ( hierarchyClass ) {\n\t\t\t\t\t\titeration = parseInt( this.getAttribute( \"colspan\" ), 10 );\n\t\t\t\t\t\tfilter = \"\";\n\n\t\t\t\t\t\tif ( iteration ) {\n\t\t\t\t\t\t\tfilter = \"td:nth-child(\"+ iteration +\"n + \" + ( colstart ) +\")\";\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\ttable._addLabels( cells.filter( filter ),\n\t\t\t\t\t\t\topts.classes.cellLabels + hierarchyClass, contents );\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttable._addLabels( cells, opts.classes.cellLabels, contents );\n\t\t\t\t\t}\n\n\t\t\t\t}\n\t\t});\n\t},\n\n\t_addLabels: function( cells, label, contents ) {\n\t\tif ( contents.length === 1 && contents[ 0 ].nodeName.toLowerCase() === \"abbr\" ) {\n\t\t\tcontents = contents.eq( 0 ).attr( \"title\" );\n\t\t}\n\t\t// .not fixes #6006\n\t\tcells\n\t\t\t.not( \":has(b.\" + label + \")\" )\n\t\t\t\t.prepend( $( \"<b class='\" + label + \"'></b>\" ).append( contents ) );\n\t}\n});\n\n})( jQuery );\n\n(function( $, undefined ) {\n\n// TODO rename filterCallback/deprecate and default to the item itself as the first argument\nvar defaultFilterCallback = function( index, searchValue ) {\n\treturn ( ( \"\" + ( $.mobile.getAttribute( this, \"filtertext\" ) || $( this ).text() ) )\n\t\t.toLowerCase().indexOf( searchValue ) === -1 );\n};\n\n$.widget( \"mobile.filterable\", {\n\n\tinitSelector: \":jqmData(filter='true')\",\n\n\toptions: {\n\t\tfilterReveal: false,\n\t\tfilterCallback: defaultFilterCallback,\n\t\tenhanced: false,\n\t\tinput: null,\n\t\tchildren: \"> li, > option, > optgroup option, > tbody tr, > .ui-controlgroup-controls > .ui-btn, > .ui-controlgroup-controls > .ui-checkbox, > .ui-controlgroup-controls > .ui-radio\"\n\t},\n\n\t_create: function() {\n\t\tvar opts = this.options;\n\n\t\t$.extend( this, {\n\t\t\t_search: null,\n\t\t\t_timer: 0\n\t\t});\n\n\t\tthis._setInput( opts.input );\n\t\tif ( !opts.enhanced ) {\n\t\t\tthis._filterItems( ( ( this._search && this._search.val() ) || \"\" ).toLowerCase() );\n\t\t}\n\t},\n\n\t_onKeyUp: function() {\n\t\tvar val, lastval,\n\t\t\tsearch = this._search;\n\n\t\tif ( search ) {\n\t\t\tval = search.val().toLowerCase(),\n\t\t\tlastval = $.mobile.getAttribute( search[ 0 ], \"lastval\" ) + \"\";\n\n\t\t\tif ( lastval && lastval === val ) {\n\t\t\t\t// Execute the handler only once per value change\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( this._timer ) {\n\t\t\t\twindow.clearTimeout( this._timer );\n\t\t\t\tthis._timer = 0;\n\t\t\t}\n\n\t\t\tthis._timer = this._delay( function() {\n\t\t\t\tif ( this._trigger( \"beforefilter\", null, { input: search } ) === false ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\t// Change val as lastval for next execution\n\t\t\t\tsearch[ 0 ].setAttribute( \"data-\" + $.mobile.ns + \"lastval\", val );\n\n\t\t\t\tthis._filterItems( val );\n\t\t\t\tthis._timer = 0;\n\t\t\t}, 250 );\n\t\t}\n\t},\n\n\t_getFilterableItems: function() {\n\t\tvar elem = this.element,\n\t\t\tchildren = this.options.children,\n\t\t\titems = !children ? { length: 0 }:\n\t\t\t\t$.isFunction( children ) ? children():\n\t\t\t\tchildren.nodeName ? $( children ):\n\t\t\t\tchildren.jquery ? children:\n\t\t\t\tthis.element.find( children );\n\n\t\tif ( items.length === 0 ) {\n\t\t\titems = elem.children();\n\t\t}\n\n\t\treturn items;\n\t},\n\n\t_filterItems: function( val ) {\n\t\tvar idx, callback, length, dst,\n\t\t\tshow = [],\n\t\t\thide = [],\n\t\t\topts = this.options,\n\t\t\tfilterItems = this._getFilterableItems();\n\n\t\tif ( val != null ) {\n\t\t\tcallback = opts.filterCallback || defaultFilterCallback;\n\t\t\tlength = filterItems.length;\n\n\t\t\t// Partition the items into those to be hidden and those to be shown\n\t\t\tfor ( idx = 0 ; idx < length ; idx++ ) {\n\t\t\t\tdst = ( callback.call( filterItems[ idx ], idx, val ) ) ? hide : show;\n\t\t\t\tdst.push( filterItems[ idx ] );\n\t\t\t}\n\t\t}\n\n\t\t// If nothing is hidden, then the decision whether to hide or show the items\n\t\t// is based on the \"filterReveal\" option.\n\t\tif ( hide.length === 0 ) {\n\t\t\tfilterItems[ ( opts.filterReveal && val.length === 0 ) ?\n\t\t\t\t\"addClass\" : \"removeClass\" ]( \"ui-screen-hidden\" );\n\t\t} else {\n\t\t\t$( hide ).addClass( \"ui-screen-hidden\" );\n\t\t\t$( show ).removeClass( \"ui-screen-hidden\" );\n\t\t}\n\n\t\tthis._refreshChildWidget();\n\n\t\tthis._trigger( \"filter\", null, {\n\t\t\titems: filterItems\n\t\t});\n\t},\n\n\t// The Default implementation of _refreshChildWidget attempts to call\n\t// refresh on collapsibleset, controlgroup, selectmenu, or listview\n\t_refreshChildWidget: function() {\n\t\tvar widget, idx,\n\t\t\trecognizedWidgets = [ \"collapsibleset\", \"selectmenu\", \"controlgroup\", \"listview\" ];\n\n\t\tfor ( idx = recognizedWidgets.length - 1 ; idx > -1 ; idx-- ) {\n\t\t\twidget = recognizedWidgets[ idx ];\n\t\t\tif ( $.mobile[ widget ] ) {\n\t\t\t\twidget = this.element.data( \"mobile-\" + widget );\n\t\t\t\tif ( widget && $.isFunction( widget.refresh ) ) {\n\t\t\t\t\twidget.refresh();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\t// TODO: When the input is not internal, do not even store it in this._search\n\t_setInput: function ( selector ) {\n\t\tvar search = this._search;\n\n\t\t// Stop a pending filter operation\n\t\tif ( this._timer ) {\n\t\t\twindow.clearTimeout( this._timer );\n\t\t\tthis._timer = 0;\n\t\t}\n\n\t\tif ( search ) {\n\t\t\tthis._off( search, \"keyup change input\" );\n\t\t\tsearch = null;\n\t\t}\n\n\t\tif ( selector ) {\n\t\t\tsearch = selector.jquery ? selector:\n\t\t\t\tselector.nodeName ? $( selector ):\n\t\t\t\tthis.document.find( selector );\n\n\t\t\tthis._on( search, {\n\t\t\t\tkeydown: \"_onKeyDown\",\n\t\t\t\tkeypress: \"_onKeyPress\",\n\t\t\t\tkeyup: \"_onKeyUp\",\n\t\t\t\tchange: \"_onKeyUp\",\n\t\t\t\tinput: \"_onKeyUp\"\n\t\t\t});\n\t\t}\n\n\t\tthis._search = search;\n\t},\n\n\t// Prevent form submission\n\t_onKeyDown: function( event ) {\n\t\tif ( event.keyCode === $.ui.keyCode.ENTER ) {\n\t\t\tevent.preventDefault();\n\t\t\tthis._preventKeyPress = true;\n\t\t}\n\t},\n\n\t_onKeyPress: function( event ) {\n\t\tif ( this._preventKeyPress ) {\n\t\t\tevent.preventDefault();\n\t\t\tthis._preventKeyPress = false;\n\t\t}\n\t},\n\n\t_setOptions: function( options ) {\n\t\tvar refilter = !( ( options.filterReveal === undefined ) &&\n\t\t\t\t( options.filterCallback === undefined ) &&\n\t\t\t\t( options.children === undefined ) );\n\n\t\tthis._super( options );\n\n\t\tif ( options.input !== undefined ) {\n\t\t\tthis._setInput( options.input );\n\t\t\trefilter = true;\n\t\t}\n\n\t\tif ( refilter ) {\n\t\t\tthis.refresh();\n\t\t}\n\t},\n\n\t_destroy: function() {\n\t\tvar opts = this.options,\n\t\t\titems = this._getFilterableItems();\n\n\t\tif ( opts.enhanced ) {\n\t\t\titems.toggleClass( \"ui-screen-hidden\", opts.filterReveal );\n\t\t} else {\n\t\t\titems.removeClass( \"ui-screen-hidden\" );\n\t\t}\n\t},\n\n\trefresh: function() {\n\t\tif ( this._timer ) {\n\t\t\twindow.clearTimeout( this._timer );\n\t\t\tthis._timer = 0;\n\t\t}\n\t\tthis._filterItems( ( ( this._search && this._search.val() ) || \"\" ).toLowerCase() );\n\t}\n});\n\n})( jQuery );\n\n(function( $, undefined ) {\n\n// Create a function that will replace the _setOptions function of a widget,\n// and will pass the options on to the input of the filterable.\nvar replaceSetOptions = function( self, orig ) {\n\t\treturn function( options ) {\n\t\t\torig.call( this, options );\n\t\t\tself._syncTextInputOptions( options );\n\t\t};\n\t},\n\trDividerListItem = /(^|\\s)ui-li-divider(\\s|$)/,\n\torigDefaultFilterCallback = $.mobile.filterable.prototype.options.filterCallback;\n\n// Override the default filter callback with one that does not hide list dividers\n$.mobile.filterable.prototype.options.filterCallback = function( index, searchValue ) {\n\treturn !this.className.match( rDividerListItem ) &&\n\t\torigDefaultFilterCallback.call( this, index, searchValue );\n};\n\n$.widget( \"mobile.filterable\", $.mobile.filterable, {\n\toptions: {\n\t\tfilterPlaceholder: \"Filter items...\",\n\t\tfilterTheme: null\n\t},\n\n\t_create: function() {\n\t\tvar idx, widgetName,\n\t\t\telem = this.element,\n\t\t\trecognizedWidgets = [ \"collapsibleset\", \"selectmenu\", \"controlgroup\", \"listview\" ],\n\t\t\tcreateHandlers = {};\n\n\t\tthis._super();\n\n\t\t$.extend( this, {\n\t\t\t_widget: null\n\t\t});\n\n\t\tfor ( idx = recognizedWidgets.length - 1 ; idx > -1 ; idx-- ) {\n\t\t\twidgetName = recognizedWidgets[ idx ];\n\t\t\tif ( $.mobile[ widgetName ] ) {\n\t\t\t\tif ( this._setWidget( elem.data( \"mobile-\" + widgetName ) ) ) {\n\t\t\t\t\tbreak;\n\t\t\t\t} else {\n\t\t\t\t\tcreateHandlers[ widgetName + \"create\" ] = \"_handleCreate\";\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif ( !this._widget ) {\n\t\t\tthis._on( elem, createHandlers );\n\t\t}\n\t},\n\n\t_handleCreate: function( evt ) {\n\t\tthis._setWidget( this.element.data( \"mobile-\" + evt.type.substring( 0, evt.type.length - 6 ) ) );\n\t},\n\n\t_trigger: function( type, event, data ) {\n\t\tif ( this._widget && this._widget.widgetFullName === \"mobile-listview\" &&\n\t\t\ttype === \"beforefilter\" ) {\n\n\t\t\t// Also trigger listviewbeforefilter if this widget is also a listview\n\t\t\tthis._widget._trigger( \"beforefilter\", event, data );\n\t\t}\n\n\t\t// Passing back the response enables calling preventDefault()\n\t\treturn this._super( type, event, data );\n\t},\n\n\t_setWidget: function( widget ) {\n\t\tif ( !this._widget && widget ) {\n\t\t\tthis._widget = widget;\n\t\t\tthis._widget._setOptions = replaceSetOptions( this, this._widget._setOptions );\n\t\t}\n\n\t\tif ( !!this._widget ) {\n\t\t\tthis._syncTextInputOptions( this._widget.options );\n\t\t\tif ( this._widget.widgetName === \"listview\" ) {\n\t\t\t\tthis._widget.options.hideDividers = true;\n\t\t\t\tthis._widget.element.listview( \"refresh\" );\n\t\t\t}\n\t\t}\n\n\t\treturn !!this._widget;\n\t},\n\n\t_isSearchInternal: function() {\n\t\treturn ( this._search && this._search.jqmData( \"ui-filterable-\" + this.uuid + \"-internal\" ) );\n\t},\n\n\t_setInput: function( selector ) {\n\t\tvar opts = this.options,\n\t\t\tupdatePlaceholder = true,\n\t\t\ttextinputOpts = {};\n\n\t\tif ( !selector ) {\n\t\t\tif ( this._isSearchInternal() ) {\n\n\t\t\t\t// Ignore the call to set a new input if the selector goes to falsy and\n\t\t\t\t// the current textinput is already of the internally generated variety.\n\t\t\t\treturn;\n\t\t\t} else {\n\n\t\t\t\t// Generating a new textinput widget. No need to set the placeholder\n\t\t\t\t// further down the function.\n\t\t\t\tupdatePlaceholder = false;\n\t\t\t\tselector = $( \"<input \" +\n\t\t\t\t\t\"data-\" + $.mobile.ns + \"type='search' \" +\n\t\t\t\t\t\"placeholder='\" + opts.filterPlaceholder + \"'></input>\" )\n\t\t\t\t\t.jqmData( \"ui-filterable-\" + this.uuid + \"-internal\", true );\n\t\t\t\t$( \"<form class='ui-filterable'></form>\" )\n\t\t\t\t\t.append( selector )\n\t\t\t\t\t.submit( function( evt ) {\n\t\t\t\t\t\tevt.preventDefault();\n\t\t\t\t\t\tselector.blur();\n\t\t\t\t\t})\n\t\t\t\t\t.insertBefore( this.element );\n\t\t\t\tif ( $.mobile.textinput ) {\n\t\t\t\t\tif ( this.options.filterTheme != null ) {\n\t\t\t\t\t\ttextinputOpts[ \"theme\" ] = opts.filterTheme;\n\t\t\t\t\t}\n\n\t\t\t\t\tselector.textinput( textinputOpts );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tthis._super( selector );\n\n\t\tif ( this._isSearchInternal() && updatePlaceholder ) {\n\t\t\tthis._search.attr( \"placeholder\", this.options.filterPlaceholder );\n\t\t}\n\t},\n\n\t_setOptions: function( options ) {\n\t\tvar ret = this._super( options );\n\n\t\t// Need to set the filterPlaceholder after having established the search input\n\t\tif ( options.filterPlaceholder !== undefined ) {\n\t\t\tif ( this._isSearchInternal() ) {\n\t\t\t\tthis._search.attr( \"placeholder\", options.filterPlaceholder );\n\t\t\t}\n\t\t}\n\n\t\tif ( options.filterTheme !== undefined && this._search && $.mobile.textinput ) {\n\t\t\tthis._search.textinput( \"option\", \"theme\", options.filterTheme );\n\t\t}\n\n\t\treturn ret;\n\t},\n\n\t// The listview implementation accompanying this filterable backcompat layer will call\n\t// filterable.refresh() after it's done refreshing the listview to make sure the filterable\n\t// filters out any new items added. However, when the listview refresh has been initiated by\n\t// the filterable itself, then such filtering has already taken place, and calling the\n\t// filterable's refresh() method will cause an infinite recursion. We stop this by setting a\n\t// flag that will cause the filterable's refresh() method to short-circuit.\n\t_refreshChildWidget: function() {\n\t\tthis._refreshingChildWidget = true;\n\t\tthis._superApply( arguments );\n\t\tthis._refreshingChildWidget = false;\n\t},\n\n\trefresh: function() {\n\t\tif ( !this._refreshingChildWidget ) {\n\t\t\tthis._superApply( arguments );\n\t\t}\n\t},\n\n\t_destroy: function() {\n\t\tif ( this._isSearchInternal() ) {\n\t\t\tthis._search.remove();\n\t\t}\n\t\tthis._super();\n\t},\n\n\t_syncTextInputOptions: function( options ) {\n\t\tvar idx,\n\t\t\ttextinputOptions = {};\n\n\t\t// We only sync options if the filterable's textinput is of the internally\n\t\t// generated variety, rather than one specified by the user.\n\t\tif ( this._isSearchInternal() && $.mobile.textinput ) {\n\n\t\t\t// Apply only the options understood by textinput\n\t\t\tfor ( idx in $.mobile.textinput.prototype.options ) {\n\t\t\t\tif ( options[ idx ] !== undefined ) {\n\t\t\t\t\tif ( idx === \"theme\" && this.options.filterTheme != null ) {\n\t\t\t\t\t\ttextinputOptions[ idx ] = this.options.filterTheme;\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttextinputOptions[ idx ] = options[ idx ];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis._search.textinput( \"option\", textinputOptions );\n\t\t}\n\t}\n});\n\n// Instantiate a filterable on a listview that has the data-filter=\"true\" attribute\n// This is not necessary for static content, because the auto-enhance takes care of instantiating\n// the filterable upon encountering data-filter=\"true\". However, because of 1.3.x it is expected\n// that a listview with data-filter=\"true\" will be filterable even if you just instantiate a\n// listview on it. The extension below ensures that this continues to happen in 1.4.x.\n$.widget( \"mobile.listview\", $.mobile.listview, {\n\toptions: {\n\t\tfilter: false\n\t},\n\t_create: function() {\n\t\tif ( this.options.filter === true &&\n\t\t\t\t!this.element.data( \"mobile-filterable\" ) ) {\n\t\t\tthis.element.filterable();\n\t\t}\n\t\treturn this._super();\n\t},\n\n\trefresh: function() {\n\t\tvar filterable;\n\n\t\tthis._superApply( arguments );\n\n\t\tif ( this.options.filter === true ) {\n\t\t\tfilterable = this.element.data( \"mobile-filterable\" );\n\n\t\t\tif ( filterable ) {\n\t\t\t\tfilterable.refresh();\n\t\t\t}\n\t\t}\n\t}\n});\n\n})( jQuery );\n\n/*!\n * jQuery UI Tabs fadf2b312a05040436451c64bbfaf4814bc62c56\n * http://jqueryui.com\n *\n * Copyright 2013 jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n *\n * http://api.jqueryui.com/tabs/\n *\n * Depends:\n *\tjquery.ui.core.js\n *\tjquery.ui.widget.js\n */\n(function( $, undefined ) {\n\nvar tabId = 0,\n\trhash = /#.*$/;\n\nfunction getNextTabId() {\n\treturn ++tabId;\n}\n\nfunction isLocal( anchor ) {\n\treturn anchor.hash.length > 1 &&\n\t\tdecodeURIComponent( anchor.href.replace( rhash, \"\" ) ) ===\n\t\t\tdecodeURIComponent( location.href.replace( rhash, \"\" ) );\n}\n\n$.widget( \"ui.tabs\", {\n\tversion: \"fadf2b312a05040436451c64bbfaf4814bc62c56\",\n\tdelay: 300,\n\toptions: {\n\t\tactive: null,\n\t\tcollapsible: false,\n\t\tevent: \"click\",\n\t\theightStyle: \"content\",\n\t\thide: null,\n\t\tshow: null,\n\n\t\t// callbacks\n\t\tactivate: null,\n\t\tbeforeActivate: null,\n\t\tbeforeLoad: null,\n\t\tload: null\n\t},\n\n\t_create: function() {\n\t\tvar that = this,\n\t\t\toptions = this.options;\n\n\t\tthis.running = false;\n\n\t\tthis.element\n\t\t\t.addClass( \"ui-tabs ui-widget ui-widget-content ui-corner-all\" )\n\t\t\t.toggleClass( \"ui-tabs-collapsible\", options.collapsible )\n\t\t\t// Prevent users from focusing disabled tabs via click\n\t\t\t.delegate( \".ui-tabs-nav > li\", \"mousedown\" + this.eventNamespace, function( event ) {\n\t\t\t\tif ( $( this ).is( \".ui-state-disabled\" ) ) {\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t}\n\t\t\t})\n\t\t\t// support: IE <9\n\t\t\t// Preventing the default action in mousedown doesn't prevent IE\n\t\t\t// from focusing the element, so if the anchor gets focused, blur.\n\t\t\t// We don't have to worry about focusing the previously focused\n\t\t\t// element since clicking on a non-focusable element should focus\n\t\t\t// the body anyway.\n\t\t\t.delegate( \".ui-tabs-anchor\", \"focus\" + this.eventNamespace, function() {\n\t\t\t\tif ( $( this ).closest( \"li\" ).is( \".ui-state-disabled\" ) ) {\n\t\t\t\t\tthis.blur();\n\t\t\t\t}\n\t\t\t});\n\n\t\tthis._processTabs();\n\t\toptions.active = this._initialActive();\n\n\t\t// Take disabling tabs via class attribute from HTML\n\t\t// into account and update option properly.\n\t\tif ( $.isArray( options.disabled ) ) {\n\t\t\toptions.disabled = $.unique( options.disabled.concat(\n\t\t\t\t$.map( this.tabs.filter( \".ui-state-disabled\" ), function( li ) {\n\t\t\t\t\treturn that.tabs.index( li );\n\t\t\t\t})\n\t\t\t) ).sort();\n\t\t}\n\n\t\t// check for length avoids error when initializing empty list\n\t\tif ( this.options.active !== false && this.anchors.length ) {\n\t\t\tthis.active = this._findActive( options.active );\n\t\t} else {\n\t\t\tthis.active = $();\n\t\t}\n\n\t\tthis._refresh();\n\n\t\tif ( this.active.length ) {\n\t\t\tthis.load( options.active );\n\t\t}\n\t},\n\n\t_initialActive: function() {\n\t\tvar active = this.options.active,\n\t\t\tcollapsible = this.options.collapsible,\n\t\t\tlocationHash = location.hash.substring( 1 );\n\n\t\tif ( active === null ) {\n\t\t\t// check the fragment identifier in the URL\n\t\t\tif ( locationHash ) {\n\t\t\t\tthis.tabs.each(function( i, tab ) {\n\t\t\t\t\tif ( $( tab ).attr( \"aria-controls\" ) === locationHash ) {\n\t\t\t\t\t\tactive = i;\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// check for a tab marked active via a class\n\t\t\tif ( active === null ) {\n\t\t\t\tactive = this.tabs.index( this.tabs.filter( \".ui-tabs-active\" ) );\n\t\t\t}\n\n\t\t\t// no active tab, set to false\n\t\t\tif ( active === null || active === -1 ) {\n\t\t\t\tactive = this.tabs.length ? 0 : false;\n\t\t\t}\n\t\t}\n\n\t\t// handle numbers: negative, out of range\n\t\tif ( active !== false ) {\n\t\t\tactive = this.tabs.index( this.tabs.eq( active ) );\n\t\t\tif ( active === -1 ) {\n\t\t\t\tactive = collapsible ? false : 0;\n\t\t\t}\n\t\t}\n\n\t\t// don't allow collapsible: false and active: false\n\t\tif ( !collapsible && active === false && this.anchors.length ) {\n\t\t\tactive = 0;\n\t\t}\n\n\t\treturn active;\n\t},\n\n\t_getCreateEventData: function() {\n\t\treturn {\n\t\t\ttab: this.active,\n\t\t\tpanel: !this.active.length ? $() : this._getPanelForTab( this.active )\n\t\t};\n\t},\n\n\t_tabKeydown: function( event ) {\n\t\tvar focusedTab = $( this.document[0].activeElement ).closest( \"li\" ),\n\t\t\tselectedIndex = this.tabs.index( focusedTab ),\n\t\t\tgoingForward = true;\n\n\t\tif ( this._handlePageNav( event ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tswitch ( event.keyCode ) {\n\t\t\tcase $.ui.keyCode.RIGHT:\n\t\t\tcase $.ui.keyCode.DOWN:\n\t\t\t\tselectedIndex++;\n\t\t\t\tbreak;\n\t\t\tcase $.ui.keyCode.UP:\n\t\t\tcase $.ui.keyCode.LEFT:\n\t\t\t\tgoingForward = false;\n\t\t\t\tselectedIndex--;\n\t\t\t\tbreak;\n\t\t\tcase $.ui.keyCode.END:\n\t\t\t\tselectedIndex = this.anchors.length - 1;\n\t\t\t\tbreak;\n\t\t\tcase $.ui.keyCode.HOME:\n\t\t\t\tselectedIndex = 0;\n\t\t\t\tbreak;\n\t\t\tcase $.ui.keyCode.SPACE:\n\t\t\t\t// Activate only, no collapsing\n\t\t\t\tevent.preventDefault();\n\t\t\t\tclearTimeout( this.activating );\n\t\t\t\tthis._activate( selectedIndex );\n\t\t\t\treturn;\n\t\t\tcase $.ui.keyCode.ENTER:\n\t\t\t\t// Toggle (cancel delayed activation, allow collapsing)\n\t\t\t\tevent.preventDefault();\n\t\t\t\tclearTimeout( this.activating );\n\t\t\t\t// Determine if we should collapse or activate\n\t\t\t\tthis._activate( selectedIndex === this.options.active ? false : selectedIndex );\n\t\t\t\treturn;\n\t\t\tdefault:\n\t\t\t\treturn;\n\t\t}\n\n\t\t// Focus the appropriate tab, based on which key was pressed\n\t\tevent.preventDefault();\n\t\tclearTimeout( this.activating );\n\t\tselectedIndex = this._focusNextTab( selectedIndex, goingForward );\n\n\t\t// Navigating with control key will prevent automatic activation\n\t\tif ( !event.ctrlKey ) {\n\t\t\t// Update aria-selected immediately so that AT think the tab is already selected.\n\t\t\t// Otherwise AT may confuse the user by stating that they need to activate the tab,\n\t\t\t// but the tab will already be activated by the time the announcement finishes.\n\t\t\tfocusedTab.attr( \"aria-selected\", \"false\" );\n\t\t\tthis.tabs.eq( selectedIndex ).attr( \"aria-selected\", \"true\" );\n\n\t\t\tthis.activating = this._delay(function() {\n\t\t\t\tthis.option( \"active\", selectedIndex );\n\t\t\t}, this.delay );\n\t\t}\n\t},\n\n\t_panelKeydown: function( event ) {\n\t\tif ( this._handlePageNav( event ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Ctrl+up moves focus to the current tab\n\t\tif ( event.ctrlKey && event.keyCode === $.ui.keyCode.UP ) {\n\t\t\tevent.preventDefault();\n\t\t\tthis.active.focus();\n\t\t}\n\t},\n\n\t// Alt+page up/down moves focus to the previous/next tab (and activates)\n\t_handlePageNav: function( event ) {\n\t\tif ( event.altKey && event.keyCode === $.ui.keyCode.PAGE_UP ) {\n\t\t\tthis._activate( this._focusNextTab( this.options.active - 1, false ) );\n\t\t\treturn true;\n\t\t}\n\t\tif ( event.altKey && event.keyCode === $.ui.keyCode.PAGE_DOWN ) {\n\t\t\tthis._activate( this._focusNextTab( this.options.active + 1, true ) );\n\t\t\treturn true;\n\t\t}\n\t},\n\n\t_findNextTab: function( index, goingForward ) {\n\t\tvar lastTabIndex = this.tabs.length - 1;\n\n\t\tfunction constrain() {\n\t\t\tif ( index > lastTabIndex ) {\n\t\t\t\tindex = 0;\n\t\t\t}\n\t\t\tif ( index < 0 ) {\n\t\t\t\tindex = lastTabIndex;\n\t\t\t}\n\t\t\treturn index;\n\t\t}\n\n\t\twhile ( $.inArray( constrain(), this.options.disabled ) !== -1 ) {\n\t\t\tindex = goingForward ? index + 1 : index - 1;\n\t\t}\n\n\t\treturn index;\n\t},\n\n\t_focusNextTab: function( index, goingForward ) {\n\t\tindex = this._findNextTab( index, goingForward );\n\t\tthis.tabs.eq( index ).focus();\n\t\treturn index;\n\t},\n\n\t_setOption: function( key, value ) {\n\t\tif ( key === \"active\" ) {\n\t\t\t// _activate() will handle invalid values and update this.options\n\t\t\tthis._activate( value );\n\t\t\treturn;\n\t\t}\n\n\t\tif ( key === \"disabled\" ) {\n\t\t\t// don't use the widget factory's disabled handling\n\t\t\tthis._setupDisabled( value );\n\t\t\treturn;\n\t\t}\n\n\t\tthis._super( key, value);\n\n\t\tif ( key === \"collapsible\" ) {\n\t\t\tthis.element.toggleClass( \"ui-tabs-collapsible\", value );\n\t\t\t// Setting collapsible: false while collapsed; open first panel\n\t\t\tif ( !value && this.options.active === false ) {\n\t\t\t\tthis._activate( 0 );\n\t\t\t}\n\t\t}\n\n\t\tif ( key === \"event\" ) {\n\t\t\tthis._setupEvents( value );\n\t\t}\n\n\t\tif ( key === \"heightStyle\" ) {\n\t\t\tthis._setupHeightStyle( value );\n\t\t}\n\t},\n\n\t_tabId: function( tab ) {\n\t\treturn tab.attr( \"aria-controls\" ) || \"ui-tabs-\" + getNextTabId();\n\t},\n\n\t_sanitizeSelector: function( hash ) {\n\t\treturn hash ? hash.replace( /[!\"$%&'()*+,.\\/:;<=>?@\\[\\]\\^`{|}~]/g, \"\\\\$&\" ) : \"\";\n\t},\n\n\trefresh: function() {\n\t\tvar options = this.options,\n\t\t\tlis = this.tablist.children( \":has(a[href])\" );\n\n\t\t// get disabled tabs from class attribute from HTML\n\t\t// this will get converted to a boolean if needed in _refresh()\n\t\toptions.disabled = $.map( lis.filter( \".ui-state-disabled\" ), function( tab ) {\n\t\t\treturn lis.index( tab );\n\t\t});\n\n\t\tthis._processTabs();\n\n\t\t// was collapsed or no tabs\n\t\tif ( options.active === false || !this.anchors.length ) {\n\t\t\toptions.active = false;\n\t\t\tthis.active = $();\n\t\t// was active, but active tab is gone\n\t\t} else if ( this.active.length && !$.contains( this.tablist[ 0 ], this.active[ 0 ] ) ) {\n\t\t\t// all remaining tabs are disabled\n\t\t\tif ( this.tabs.length === options.disabled.length ) {\n\t\t\t\toptions.active = false;\n\t\t\t\tthis.active = $();\n\t\t\t// activate previous tab\n\t\t\t} else {\n\t\t\t\tthis._activate( this._findNextTab( Math.max( 0, options.active - 1 ), false ) );\n\t\t\t}\n\t\t// was active, active tab still exists\n\t\t} else {\n\t\t\t// make sure active index is correct\n\t\t\toptions.active = this.tabs.index( this.active );\n\t\t}\n\n\t\tthis._refresh();\n\t},\n\n\t_refresh: function() {\n\t\tthis._setupDisabled( this.options.disabled );\n\t\tthis._setupEvents( this.options.event );\n\t\tthis._setupHeightStyle( this.options.heightStyle );\n\n\t\tthis.tabs.not( this.active ).attr({\n\t\t\t\"aria-selected\": \"false\",\n\t\t\ttabIndex: -1\n\t\t});\n\t\tthis.panels.not( this._getPanelForTab( this.active ) )\n\t\t\t.hide()\n\t\t\t.attr({\n\t\t\t\t\"aria-expanded\": \"false\",\n\t\t\t\t\"aria-hidden\": \"true\"\n\t\t\t});\n\n\t\t// Make sure one tab is in the tab order\n\t\tif ( !this.active.length ) {\n\t\t\tthis.tabs.eq( 0 ).attr( \"tabIndex\", 0 );\n\t\t} else {\n\t\t\tthis.active\n\t\t\t\t.addClass( \"ui-tabs-active ui-state-active\" )\n\t\t\t\t.attr({\n\t\t\t\t\t\"aria-selected\": \"true\",\n\t\t\t\t\ttabIndex: 0\n\t\t\t\t});\n\t\t\tthis._getPanelForTab( this.active )\n\t\t\t\t.show()\n\t\t\t\t.attr({\n\t\t\t\t\t\"aria-expanded\": \"true\",\n\t\t\t\t\t\"aria-hidden\": \"false\"\n\t\t\t\t});\n\t\t}\n\t},\n\n\t_processTabs: function() {\n\t\tvar that = this;\n\n\t\tthis.tablist = this._getList()\n\t\t\t.addClass( \"ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all\" )\n\t\t\t.attr( \"role\", \"tablist\" );\n\n\t\tthis.tabs = this.tablist.find( \"> li:has(a[href])\" )\n\t\t\t.addClass( \"ui-state-default ui-corner-top\" )\n\t\t\t.attr({\n\t\t\t\trole: \"tab\",\n\t\t\t\ttabIndex: -1\n\t\t\t});\n\n\t\tthis.anchors = this.tabs.map(function() {\n\t\t\t\treturn $( \"a\", this )[ 0 ];\n\t\t\t})\n\t\t\t.addClass( \"ui-tabs-anchor\" )\n\t\t\t.attr({\n\t\t\t\trole: \"presentation\",\n\t\t\t\ttabIndex: -1\n\t\t\t});\n\n\t\tthis.panels = $();\n\n\t\tthis.anchors.each(function( i, anchor ) {\n\t\t\tvar selector, panel, panelId,\n\t\t\t\tanchorId = $( anchor ).uniqueId().attr( \"id\" ),\n\t\t\t\ttab = $( anchor ).closest( \"li\" ),\n\t\t\t\toriginalAriaControls = tab.attr( \"aria-controls\" );\n\n\t\t\t// inline tab\n\t\t\tif ( isLocal( anchor ) ) {\n\t\t\t\tselector = anchor.hash;\n\t\t\t\tpanel = that.element.find( that._sanitizeSelector( selector ) );\n\t\t\t// remote tab\n\t\t\t} else {\n\t\t\t\tpanelId = that._tabId( tab );\n\t\t\t\tselector = \"#\" + panelId;\n\t\t\t\tpanel = that.element.find( selector );\n\t\t\t\tif ( !panel.length ) {\n\t\t\t\t\tpanel = that._createPanel( panelId );\n\t\t\t\t\tpanel.insertAfter( that.panels[ i - 1 ] || that.tablist );\n\t\t\t\t}\n\t\t\t\tpanel.attr( \"aria-live\", \"polite\" );\n\t\t\t}\n\n\t\t\tif ( panel.length) {\n\t\t\t\tthat.panels = that.panels.add( panel );\n\t\t\t}\n\t\t\tif ( originalAriaControls ) {\n\t\t\t\ttab.data( \"ui-tabs-aria-controls\", originalAriaControls );\n\t\t\t}\n\t\t\ttab.attr({\n\t\t\t\t\"aria-controls\": selector.substring( 1 ),\n\t\t\t\t\"aria-labelledby\": anchorId\n\t\t\t});\n\t\t\tpanel.attr( \"aria-labelledby\", anchorId );\n\t\t});\n\n\t\tthis.panels\n\t\t\t.addClass( \"ui-tabs-panel ui-widget-content ui-corner-bottom\" )\n\t\t\t.attr( \"role\", \"tabpanel\" );\n\t},\n\n\t// allow overriding how to find the list for rare usage scenarios (#7715)\n\t_getList: function() {\n\t\treturn this.element.find( \"ol,ul\" ).eq( 0 );\n\t},\n\n\t_createPanel: function( id ) {\n\t\treturn $( \"<div>\" )\n\t\t\t.attr( \"id\", id )\n\t\t\t.addClass( \"ui-tabs-panel ui-widget-content ui-corner-bottom\" )\n\t\t\t.data( \"ui-tabs-destroy\", true );\n\t},\n\n\t_setupDisabled: function( disabled ) {\n\t\tif ( $.isArray( disabled ) ) {\n\t\t\tif ( !disabled.length ) {\n\t\t\t\tdisabled = false;\n\t\t\t} else if ( disabled.length === this.anchors.length ) {\n\t\t\t\tdisabled = true;\n\t\t\t}\n\t\t}\n\n\t\t// disable tabs\n\t\tfor ( var i = 0, li; ( li = this.tabs[ i ] ); i++ ) {\n\t\t\tif ( disabled === true || $.inArray( i, disabled ) !== -1 ) {\n\t\t\t\t$( li )\n\t\t\t\t\t.addClass( \"ui-state-disabled\" )\n\t\t\t\t\t.attr( \"aria-disabled\", \"true\" );\n\t\t\t} else {\n\t\t\t\t$( li )\n\t\t\t\t\t.removeClass( \"ui-state-disabled\" )\n\t\t\t\t\t.removeAttr( \"aria-disabled\" );\n\t\t\t}\n\t\t}\n\n\t\tthis.options.disabled = disabled;\n\t},\n\n\t_setupEvents: function( event ) {\n\t\tvar events = {\n\t\t\tclick: function( event ) {\n\t\t\t\tevent.preventDefault();\n\t\t\t}\n\t\t};\n\t\tif ( event ) {\n\t\t\t$.each( event.split(\" \"), function( index, eventName ) {\n\t\t\t\tevents[ eventName ] = \"_eventHandler\";\n\t\t\t});\n\t\t}\n\n\t\tthis._off( this.anchors.add( this.tabs ).add( this.panels ) );\n\t\tthis._on( this.anchors, events );\n\t\tthis._on( this.tabs, { keydown: \"_tabKeydown\" } );\n\t\tthis._on( this.panels, { keydown: \"_panelKeydown\" } );\n\n\t\tthis._focusable( this.tabs );\n\t\tthis._hoverable( this.tabs );\n\t},\n\n\t_setupHeightStyle: function( heightStyle ) {\n\t\tvar maxHeight,\n\t\t\tparent = this.element.parent();\n\n\t\tif ( heightStyle === \"fill\" ) {\n\t\t\tmaxHeight = parent.height();\n\t\t\tmaxHeight -= this.element.outerHeight() - this.element.height();\n\n\t\t\tthis.element.siblings( \":visible\" ).each(function() {\n\t\t\t\tvar elem = $( this ),\n\t\t\t\t\tposition = elem.css( \"position\" );\n\n\t\t\t\tif ( position === \"absolute\" || position === \"fixed\" ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tmaxHeight -= elem.outerHeight( true );\n\t\t\t});\n\n\t\t\tthis.element.children().not( this.panels ).each(function() {\n\t\t\t\tmaxHeight -= $( this ).outerHeight( true );\n\t\t\t});\n\n\t\t\tthis.panels.each(function() {\n\t\t\t\t$( this ).height( Math.max( 0, maxHeight -\n\t\t\t\t\t$( this ).innerHeight() + $( this ).height() ) );\n\t\t\t})\n\t\t\t.css( \"overflow\", \"auto\" );\n\t\t} else if ( heightStyle === \"auto\" ) {\n\t\t\tmaxHeight = 0;\n\t\t\tthis.panels.each(function() {\n\t\t\t\tmaxHeight = Math.max( maxHeight, $( this ).height( \"\" ).height() );\n\t\t\t}).height( maxHeight );\n\t\t}\n\t},\n\n\t_eventHandler: function( event ) {\n\t\tvar options = this.options,\n\t\t\tactive = this.active,\n\t\t\tanchor = $( event.currentTarget ),\n\t\t\ttab = anchor.closest( \"li\" ),\n\t\t\tclickedIsActive = tab[ 0 ] === active[ 0 ],\n\t\t\tcollapsing = clickedIsActive && options.collapsible,\n\t\t\ttoShow = collapsing ? $() : this._getPanelForTab( tab ),\n\t\t\ttoHide = !active.length ? $() : this._getPanelForTab( active ),\n\t\t\teventData = {\n\t\t\t\toldTab: active,\n\t\t\t\toldPanel: toHide,\n\t\t\t\tnewTab: collapsing ? $() : tab,\n\t\t\t\tnewPanel: toShow\n\t\t\t};\n\n\t\tevent.preventDefault();\n\n\t\tif ( tab.hasClass( \"ui-state-disabled\" ) ||\n\t\t\t\t// tab is already loading\n\t\t\t\ttab.hasClass( \"ui-tabs-loading\" ) ||\n\t\t\t\t// can't switch durning an animation\n\t\t\t\tthis.running ||\n\t\t\t\t// click on active header, but not collapsible\n\t\t\t\t( clickedIsActive && !options.collapsible ) ||\n\t\t\t\t// allow canceling activation\n\t\t\t\t( this._trigger( \"beforeActivate\", event, eventData ) === false ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\toptions.active = collapsing ? false : this.tabs.index( tab );\n\n\t\tthis.active = clickedIsActive ? $() : tab;\n\t\tif ( this.xhr ) {\n\t\t\tthis.xhr.abort();\n\t\t}\n\n\t\tif ( !toHide.length && !toShow.length ) {\n\t\t\t$.error( \"jQuery UI Tabs: Mismatching fragment identifier.\" );\n\t\t}\n\n\t\tif ( toShow.length ) {\n\t\t\tthis.load( this.tabs.index( tab ), event );\n\t\t}\n\t\tthis._toggle( event, eventData );\n\t},\n\n\t// handles show/hide for selecting tabs\n\t_toggle: function( event, eventData ) {\n\t\tvar that = this,\n\t\t\ttoShow = eventData.newPanel,\n\t\t\ttoHide = eventData.oldPanel;\n\n\t\tthis.running = true;\n\n\t\tfunction complete() {\n\t\t\tthat.running = false;\n\t\t\tthat._trigger( \"activate\", event, eventData );\n\t\t}\n\n\t\tfunction show() {\n\t\t\teventData.newTab.closest( \"li\" ).addClass( \"ui-tabs-active ui-state-active\" );\n\n\t\t\tif ( toShow.length && that.options.show ) {\n\t\t\t\tthat._show( toShow, that.options.show, complete );\n\t\t\t} else {\n\t\t\t\ttoShow.show();\n\t\t\t\tcomplete();\n\t\t\t}\n\t\t}\n\n\t\t// start out by hiding, then showing, then completing\n\t\tif ( toHide.length && this.options.hide ) {\n\t\t\tthis._hide( toHide, this.options.hide, function() {\n\t\t\t\teventData.oldTab.closest( \"li\" ).removeClass( \"ui-tabs-active ui-state-active\" );\n\t\t\t\tshow();\n\t\t\t});\n\t\t} else {\n\t\t\teventData.oldTab.closest( \"li\" ).removeClass( \"ui-tabs-active ui-state-active\" );\n\t\t\ttoHide.hide();\n\t\t\tshow();\n\t\t}\n\n\t\ttoHide.attr({\n\t\t\t\"aria-expanded\": \"false\",\n\t\t\t\"aria-hidden\": \"true\"\n\t\t});\n\t\teventData.oldTab.attr( \"aria-selected\", \"false\" );\n\t\t// If we're switching tabs, remove the old tab from the tab order.\n\t\t// If we're opening from collapsed state, remove the previous tab from the tab order.\n\t\t// If we're collapsing, then keep the collapsing tab in the tab order.\n\t\tif ( toShow.length && toHide.length ) {\n\t\t\teventData.oldTab.attr( \"tabIndex\", -1 );\n\t\t} else if ( toShow.length ) {\n\t\t\tthis.tabs.filter(function() {\n\t\t\t\treturn $( this ).attr( \"tabIndex\" ) === 0;\n\t\t\t})\n\t\t\t.attr( \"tabIndex\", -1 );\n\t\t}\n\n\t\ttoShow.attr({\n\t\t\t\"aria-expanded\": \"true\",\n\t\t\t\"aria-hidden\": \"false\"\n\t\t});\n\t\teventData.newTab.attr({\n\t\t\t\"aria-selected\": \"true\",\n\t\t\ttabIndex: 0\n\t\t});\n\t},\n\n\t_activate: function( index ) {\n\t\tvar anchor,\n\t\t\tactive = this._findActive( index );\n\n\t\t// trying to activate the already active panel\n\t\tif ( active[ 0 ] === this.active[ 0 ] ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// trying to collapse, simulate a click on the current active header\n\t\tif ( !active.length ) {\n\t\t\tactive = this.active;\n\t\t}\n\n\t\tanchor = active.find( \".ui-tabs-anchor\" )[ 0 ];\n\t\tthis._eventHandler({\n\t\t\ttarget: anchor,\n\t\t\tcurrentTarget: anchor,\n\t\t\tpreventDefault: $.noop\n\t\t});\n\t},\n\n\t_findActive: function( index ) {\n\t\treturn index === false ? $() : this.tabs.eq( index );\n\t},\n\n\t_getIndex: function( index ) {\n\t\t// meta-function to give users option to provide a href string instead of a numerical index.\n\t\tif ( typeof index === \"string\" ) {\n\t\t\tindex = this.anchors.index( this.anchors.filter( \"[href$='\" + index + \"']\" ) );\n\t\t}\n\n\t\treturn index;\n\t},\n\n\t_destroy: function() {\n\t\tif ( this.xhr ) {\n\t\t\tthis.xhr.abort();\n\t\t}\n\n\t\tthis.element.removeClass( \"ui-tabs ui-widget ui-widget-content ui-corner-all ui-tabs-collapsible\" );\n\n\t\tthis.tablist\n\t\t\t.removeClass( \"ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all\" )\n\t\t\t.removeAttr( \"role\" );\n\n\t\tthis.anchors\n\t\t\t.removeClass( \"ui-tabs-anchor\" )\n\t\t\t.removeAttr( \"role\" )\n\t\t\t.removeAttr( \"tabIndex\" )\n\t\t\t.removeUniqueId();\n\n\t\tthis.tabs.add( this.panels ).each(function() {\n\t\t\tif ( $.data( this, \"ui-tabs-destroy\" ) ) {\n\t\t\t\t$( this ).remove();\n\t\t\t} else {\n\t\t\t\t$( this )\n\t\t\t\t\t.removeClass( \"ui-state-default ui-state-active ui-state-disabled \" +\n\t\t\t\t\t\t\"ui-corner-top ui-corner-bottom ui-widget-content ui-tabs-active ui-tabs-panel\" )\n\t\t\t\t\t.removeAttr( \"tabIndex\" )\n\t\t\t\t\t.removeAttr( \"aria-live\" )\n\t\t\t\t\t.removeAttr( \"aria-busy\" )\n\t\t\t\t\t.removeAttr( \"aria-selected\" )\n\t\t\t\t\t.removeAttr( \"aria-labelledby\" )\n\t\t\t\t\t.removeAttr( \"aria-hidden\" )\n\t\t\t\t\t.removeAttr( \"aria-expanded\" )\n\t\t\t\t\t.removeAttr( \"role\" );\n\t\t\t}\n\t\t});\n\n\t\tthis.tabs.each(function() {\n\t\t\tvar li = $( this ),\n\t\t\t\tprev = li.data( \"ui-tabs-aria-controls\" );\n\t\t\tif ( prev ) {\n\t\t\t\tli\n\t\t\t\t\t.attr( \"aria-controls\", prev )\n\t\t\t\t\t.removeData( \"ui-tabs-aria-controls\" );\n\t\t\t} else {\n\t\t\t\tli.removeAttr( \"aria-controls\" );\n\t\t\t}\n\t\t});\n\n\t\tthis.panels.show();\n\n\t\tif ( this.options.heightStyle !== \"content\" ) {\n\t\t\tthis.panels.css( \"height\", \"\" );\n\t\t}\n\t},\n\n\tenable: function( index ) {\n\t\tvar disabled = this.options.disabled;\n\t\tif ( disabled === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( index === undefined ) {\n\t\t\tdisabled = false;\n\t\t} else {\n\t\t\tindex = this._getIndex( index );\n\t\t\tif ( $.isArray( disabled ) ) {\n\t\t\t\tdisabled = $.map( disabled, function( num ) {\n\t\t\t\t\treturn num !== index ? num : null;\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tdisabled = $.map( this.tabs, function( li, num ) {\n\t\t\t\t\treturn num !== index ? num : null;\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\tthis._setupDisabled( disabled );\n\t},\n\n\tdisable: function( index ) {\n\t\tvar disabled = this.options.disabled;\n\t\tif ( disabled === true ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( index === undefined ) {\n\t\t\tdisabled = true;\n\t\t} else {\n\t\t\tindex = this._getIndex( index );\n\t\t\tif ( $.inArray( index, disabled ) !== -1 ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif ( $.isArray( disabled ) ) {\n\t\t\t\tdisabled = $.merge( [ index ], disabled ).sort();\n\t\t\t} else {\n\t\t\t\tdisabled = [ index ];\n\t\t\t}\n\t\t}\n\t\tthis._setupDisabled( disabled );\n\t},\n\n\tload: function( index, event ) {\n\t\tindex = this._getIndex( index );\n\t\tvar that = this,\n\t\t\ttab = this.tabs.eq( index ),\n\t\t\tanchor = tab.find( \".ui-tabs-anchor\" ),\n\t\t\tpanel = this._getPanelForTab( tab ),\n\t\t\teventData = {\n\t\t\t\ttab: tab,\n\t\t\t\tpanel: panel\n\t\t\t};\n\n\t\t// not remote\n\t\tif ( isLocal( anchor[ 0 ] ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.xhr = $.ajax( this._ajaxSettings( anchor, event, eventData ) );\n\n\t\t// support: jQuery <1.8\n\t\t// jQuery <1.8 returns false if the request is canceled in beforeSend,\n\t\t// but as of 1.8, $.ajax() always returns a jqXHR object.\n\t\tif ( this.xhr && this.xhr.statusText !== \"canceled\" ) {\n\t\t\ttab.addClass( \"ui-tabs-loading\" );\n\t\t\tpanel.attr( \"aria-busy\", \"true\" );\n\n\t\t\tthis.xhr\n\t\t\t\t.success(function( response ) {\n\t\t\t\t\t// support: jQuery <1.8\n\t\t\t\t\t// http://bugs.jquery.com/ticket/11778\n\t\t\t\t\tsetTimeout(function() {\n\t\t\t\t\t\tpanel.html( response );\n\t\t\t\t\t\tthat._trigger( \"load\", event, eventData );\n\t\t\t\t\t}, 1 );\n\t\t\t\t})\n\t\t\t\t.complete(function( jqXHR, status ) {\n\t\t\t\t\t// support: jQuery <1.8\n\t\t\t\t\t// http://bugs.jquery.com/ticket/11778\n\t\t\t\t\tsetTimeout(function() {\n\t\t\t\t\t\tif ( status === \"abort\" ) {\n\t\t\t\t\t\t\tthat.panels.stop( false, true );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\ttab.removeClass( \"ui-tabs-loading\" );\n\t\t\t\t\t\tpanel.removeAttr( \"aria-busy\" );\n\n\t\t\t\t\t\tif ( jqXHR === that.xhr ) {\n\t\t\t\t\t\t\tdelete that.xhr;\n\t\t\t\t\t\t}\n\t\t\t\t\t}, 1 );\n\t\t\t\t});\n\t\t}\n\t},\n\n\t_ajaxSettings: function( anchor, event, eventData ) {\n\t\tvar that = this;\n\t\treturn {\n\t\t\turl: anchor.attr( \"href\" ),\n\t\t\tbeforeSend: function( jqXHR, settings ) {\n\t\t\t\treturn that._trigger( \"beforeLoad\", event,\n\t\t\t\t\t$.extend( { jqXHR : jqXHR, ajaxSettings: settings }, eventData ) );\n\t\t\t}\n\t\t};\n\t},\n\n\t_getPanelForTab: function( tab ) {\n\t\tvar id = $( tab ).attr( \"aria-controls\" );\n\t\treturn this.element.find( this._sanitizeSelector( \"#\" + id ) );\n\t}\n});\n\n})( jQuery );\n\n(function( $, undefined ) {\n\n})( jQuery );\n\n(function( $, window ) {\n\n\t$.mobile.iosorientationfixEnabled = true;\n\n\t// This fix addresses an iOS bug, so return early if the UA claims it's something else.\n\tvar ua = navigator.userAgent,\n\t\tzoom,\n\t\tevt, x, y, z, aig;\n\tif ( !( /iPhone|iPad|iPod/.test( navigator.platform ) && /OS [1-5]_[0-9_]* like Mac OS X/i.test( ua ) && ua.indexOf( \"AppleWebKit\" ) > -1 ) ) {\n\t\t$.mobile.iosorientationfixEnabled = false;\n\t\treturn;\n\t}\n\n\tzoom = $.mobile.zoom;\n\n\tfunction checkTilt( e ) {\n\t\tevt = e.originalEvent;\n\t\taig = evt.accelerationIncludingGravity;\n\n\t\tx = Math.abs( aig.x );\n\t\ty = Math.abs( aig.y );\n\t\tz = Math.abs( aig.z );\n\n\t\t// If portrait orientation and in one of the danger zones\n\t\tif ( !window.orientation && ( x > 7 || ( ( z > 6 && y < 8 || z < 8 && y > 6 ) && x > 5 ) ) ) {\n\t\t\t\tif ( zoom.enabled ) {\n\t\t\t\t\tzoom.disable();\n\t\t\t\t}\n\t\t}\telse if ( !zoom.enabled ) {\n\t\t\t\tzoom.enable();\n\t\t}\n\t}\n\n\t$.mobile.document.on( \"mobileinit\", function() {\n\t\tif ( $.mobile.iosorientationfixEnabled ) {\n\t\t\t$.mobile.window\n\t\t\t\t.bind( \"orientationchange.iosorientationfix\", zoom.enable )\n\t\t\t\t.bind( \"devicemotion.iosorientationfix\", checkTilt );\n\t\t}\n\t});\n\n}( jQuery, this ));\n\n(function( $, window, undefined ) {\n\tvar\t$html = $( \"html\" ),\n\t\t$window = $.mobile.window;\n\n\t//remove initial build class (only present on first pageshow)\n\tfunction hideRenderingClass() {\n\t\t$html.removeClass( \"ui-mobile-rendering\" );\n\t}\n\n\t// trigger mobileinit event - useful hook for configuring $.mobile settings before they're used\n\t$( window.document ).trigger( \"mobileinit\" );\n\n\t// support conditions\n\t// if device support condition(s) aren't met, leave things as they are -> a basic, usable experience,\n\t// otherwise, proceed with the enhancements\n\tif ( !$.mobile.gradeA() ) {\n\t\treturn;\n\t}\n\n\t// override ajaxEnabled on platforms that have known conflicts with hash history updates\n\t// or generally work better browsing in regular http for full page refreshes (BB5, Opera Mini)\n\tif ( $.mobile.ajaxBlacklist ) {\n\t\t$.mobile.ajaxEnabled = false;\n\t}\n\n\t// Add mobile, initial load \"rendering\" classes to docEl\n\t$html.addClass( \"ui-mobile ui-mobile-rendering\" );\n\n\t// This is a fallback. If anything goes wrong (JS errors, etc), or events don't fire,\n\t// this ensures the rendering class is removed after 5 seconds, so content is visible and accessible\n\tsetTimeout( hideRenderingClass, 5000 );\n\n\t$.extend( $.mobile, {\n\t\t// find and enhance the pages in the dom and transition to the first page.\n\t\tinitializePage: function() {\n\t\t\t// find present pages\n\t\t\tvar path = $.mobile.path,\n\t\t\t\t$pages = $( \":jqmData(role='page'), :jqmData(role='dialog')\" ),\n\t\t\t\thash = path.stripHash( path.stripQueryParams(path.parseLocation().hash) ),\n\t\t\t\ttheLocation = $.mobile.path.parseLocation(),\n\t\t\t\thashPage = hash ? document.getElementById( hash ) : undefined;\n\n\t\t\t// if no pages are found, create one with body's inner html\n\t\t\tif ( !$pages.length ) {\n\t\t\t\t$pages = $( \"body\" ).wrapInner( \"<div data-\" + $.mobile.ns + \"role='page'></div>\" ).children( 0 );\n\t\t\t}\n\n\t\t\t// add dialogs, set data-url attrs\n\t\t\t$pages.each(function() {\n\t\t\t\tvar $this = $( this );\n\n\t\t\t\t// unless the data url is already set set it to the pathname\n\t\t\t\tif ( !$this[ 0 ].getAttribute( \"data-\" + $.mobile.ns + \"url\" ) ) {\n\t\t\t\t\t$this.attr( \"data-\" + $.mobile.ns + \"url\", $this.attr( \"id\" ) ||\n\t\t\t\t\t\tpath.convertUrlToDataUrl( theLocation.pathname + theLocation.search ) );\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// define first page in dom case one backs out to the directory root (not always the first page visited, but defined as fallback)\n\t\t\t$.mobile.firstPage = $pages.first();\n\n\t\t\t// define page container\n\t\t\t$.mobile.pageContainer = $.mobile.firstPage\n\t\t\t\t.parent()\n\t\t\t\t.addClass( \"ui-mobile-viewport\" )\n\t\t\t\t.pagecontainer();\n\n\t\t\t// initialize navigation events now, after mobileinit has occurred and the page container\n\t\t\t// has been created but before the rest of the library is alerted to that fact\n\t\t\t$.mobile.navreadyDeferred.resolve();\n\n\t\t\t// alert listeners that the pagecontainer has been determined for binding\n\t\t\t// to events triggered on it\n\t\t\t$window.trigger( \"pagecontainercreate\" );\n\n\t\t\t// cue page loading message\n\t\t\t$.mobile.loading( \"show\" );\n\n\t\t\t//remove initial build class (only present on first pageshow)\n\t\t\thideRenderingClass();\n\n\t\t\t// if hashchange listening is disabled, there's no hash deeplink,\n\t\t\t// the hash is not valid (contains more than one # or does not start with #)\n\t\t\t// or there is no page with that hash, change to the first page in the DOM\n\t\t\t// Remember, however, that the hash can also be a path!\n\t\t\tif ( ! ( $.mobile.hashListeningEnabled &&\n\t\t\t\t$.mobile.path.isHashValid( location.hash ) &&\n\t\t\t\t( $( hashPage ).is( \":jqmData(role='page')\" ) ||\n\t\t\t\t\t$.mobile.path.isPath( hash ) ||\n\t\t\t\t\thash === $.mobile.dialogHashKey ) ) ) {\n\n\t\t\t\t// make sure to set initial popstate state if it exists\n\t\t\t\t// so that navigation back to the initial page works properly\n\t\t\t\tif ( $.event.special.navigate.isPushStateEnabled() ) {\n\t\t\t\t\t$.mobile.navigate.navigator.squash( path.parseLocation().href );\n\t\t\t\t}\n\n\t\t\t\t$.mobile.changePage( $.mobile.firstPage, {\n\t\t\t\t\ttransition: \"none\",\n\t\t\t\t\treverse: true,\n\t\t\t\t\tchangeHash: false,\n\t\t\t\t\tfromHashChange: true\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\t// trigger hashchange or navigate to squash and record the correct\n\t\t\t\t// history entry for an initial hash path\n\t\t\t\tif ( !$.event.special.navigate.isPushStateEnabled() ) {\n\t\t\t\t\t$window.trigger( \"hashchange\", [true] );\n\t\t\t\t} else {\n\t\t\t\t\t// TODO figure out how to simplify this interaction with the initial history entry\n\t\t\t\t\t// at the bottom js/navigate/navigate.js\n\t\t\t\t\t$.mobile.navigate.history.stack = [];\n\t\t\t\t\t$.mobile.navigate( $.mobile.path.isPath( location.hash ) ? location.hash : location.href );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t});\n\n\t$(function() {\n\t\t//Run inlineSVG support test\n\t\t$.support.inlineSVG();\n\n\t\t// check which scrollTop value should be used by scrolling to 1 immediately at domready\n\t\t// then check what the scroll top is. Android will report 0... others 1\n\t\t// note that this initial scroll won't hide the address bar. It's just for the check.\n\n\t\t// hide iOS browser chrome on load if hideUrlBar is true this is to try and do it as soon as possible\n\t\tif ( $.mobile.hideUrlBar ) {\n\t\t\twindow.scrollTo( 0, 1 );\n\t\t}\n\n\t\t// if defaultHomeScroll hasn't been set yet, see if scrollTop is 1\n\t\t// it should be 1 in most browsers, but android treats 1 as 0 (for hiding addr bar)\n\t\t// so if it's 1, use 0 from now on\n\t\t$.mobile.defaultHomeScroll = ( !$.support.scrollTop || $.mobile.window.scrollTop() === 1 ) ? 0 : 1;\n\n\t\t//dom-ready inits\n\t\tif ( $.mobile.autoInitializePage ) {\n\t\t\t$.mobile.initializePage();\n\t\t}\n\n\t\t// window load event\n\t\t// hide iOS browser chrome on load if hideUrlBar is true this is as fall back incase we were too early before\n\t\tif ( $.mobile.hideUrlBar ) {\n\t\t\t$window.load( $.mobile.silentScroll );\n\t\t}\n\n\t\tif ( !$.support.cssPointerEvents ) {\n\t\t\t// IE and Opera don't support CSS pointer-events: none that we use to disable link-based buttons\n\t\t\t// by adding the 'ui-disabled' class to them. Using a JavaScript workaround for those browser.\n\t\t\t// https://github.com/jquery/jquery-mobile/issues/3558\n\n\t\t\t// DEPRECATED as of 1.4.0 - remove ui-disabled after 1.4.0 release\n\t\t\t// only ui-state-disabled should be present thereafter\n\t\t\t$.mobile.document.delegate( \".ui-state-disabled,.ui-disabled\", \"vclick\",\n\t\t\t\tfunction( e ) {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\te.stopImmediatePropagation();\n\t\t\t\t}\n\t\t\t);\n\t\t}\n\t});\n}( jQuery, this ));\n\n\n}));\n"
  },
  {
    "path": "stenogotchi/ui/web/static/js/jquery.mobile/jquery.mobile.external-png-1.4.5.css",
    "content": "/*!\n* jQuery Mobile 1.4.5\n* Git HEAD hash: 68e55e78b292634d3991c795f06f5e37a512decc <> Date: Fri Oct 31 2014 17:33:30 UTC\n* http://jquerymobile.com\n*\n* Copyright 2010, 2014 jQuery Foundation, Inc. and othercontributors\n* Released under the MIT license.\n* http://jquery.org/license\n*\n*/\n\n\n.ui-icon-action:after {\n\tbackground-image: url(images/icons-png/action-white.png);\n}\n.ui-icon-alert:after {\n\tbackground-image: url(images/icons-png/alert-white.png);\n}\n.ui-icon-arrow-d-l:after {\n\tbackground-image: url(images/icons-png/arrow-d-l-white.png);\n}\n.ui-icon-arrow-d-r:after {\n\tbackground-image: url(images/icons-png/arrow-d-r-white.png);\n}\n.ui-icon-arrow-d:after {\n\tbackground-image: url(images/icons-png/arrow-d-white.png);\n}\n.ui-icon-arrow-l:after {\n\tbackground-image: url(images/icons-png/arrow-l-white.png);\n}\n.ui-icon-arrow-r:after {\n\tbackground-image: url(images/icons-png/arrow-r-white.png);\n}\n.ui-icon-arrow-u-l:after {\n\tbackground-image: url(images/icons-png/arrow-u-l-white.png);\n}\n.ui-icon-arrow-u-r:after {\n\tbackground-image: url(images/icons-png/arrow-u-r-white.png);\n}\n.ui-icon-arrow-u:after {\n\tbackground-image: url(images/icons-png/arrow-u-white.png);\n}\n.ui-icon-audio:after {\n\tbackground-image: url(images/icons-png/audio-white.png);\n}\n.ui-icon-back:after {\n\tbackground-image: url(images/icons-png/back-white.png);\n}\n.ui-icon-bars:after {\n\tbackground-image: url(images/icons-png/bars-white.png);\n}\n.ui-icon-bullets:after {\n\tbackground-image: url(images/icons-png/bullets-white.png);\n}\n.ui-icon-calendar:after {\n\tbackground-image: url(images/icons-png/calendar-white.png);\n}\n.ui-icon-camera:after {\n\tbackground-image: url(images/icons-png/camera-white.png);\n}\n.ui-icon-carat-d:after {\n\tbackground-image: url(images/icons-png/carat-d-white.png);\n}\n.ui-icon-carat-l:after {\n\tbackground-image: url(images/icons-png/carat-l-white.png);\n}\n.ui-icon-carat-r:after {\n\tbackground-image: url(images/icons-png/carat-r-white.png);\n}\n.ui-icon-carat-u:after {\n\tbackground-image: url(images/icons-png/carat-u-white.png);\n}\n.ui-icon-check:after,\n/* Used ui-checkbox-on twice to increase specificity. If active state has background-image for gradient this rule overrides. */\nhtml .ui-btn.ui-checkbox-on.ui-checkbox-on:after {\n\tbackground-image: url(images/icons-png/check-white.png);\n}\n.ui-icon-clock:after {\n\tbackground-image: url(images/icons-png/clock-white.png);\n}\n.ui-icon-cloud:after {\n\tbackground-image: url(images/icons-png/cloud-white.png);\n}\n.ui-icon-comment:after {\n\tbackground-image: url(images/icons-png/comment-white.png);\n}\n.ui-icon-delete:after {\n\tbackground-image: url(images/icons-png/delete-white.png);\n}\n.ui-icon-edit:after {\n\tbackground-image: url(images/icons-png/edit-white.png);\n}\n.ui-icon-eye:after {\n\tbackground-image: url(images/icons-png/eye-white.png);\n}\n.ui-icon-forbidden:after {\n\tbackground-image: url(images/icons-png/forbidden-white.png);\n}\n.ui-icon-forward:after {\n\tbackground-image: url(images/icons-png/forward-white.png);\n}\n.ui-icon-gear:after {\n\tbackground-image: url(images/icons-png/gear-white.png);\n}\n.ui-icon-grid:after {\n\tbackground-image: url(images/icons-png/grid-white.png);\n}\n.ui-icon-heart:after {\n\tbackground-image: url(images/icons-png/heart-white.png);\n}\n.ui-icon-home:after {\n\tbackground-image: url(images/icons-png/home-white.png);\n}\n.ui-icon-info:after {\n\tbackground-image: url(images/icons-png/info-white.png);\n}\n.ui-icon-location:after {\n\tbackground-image: url(images/icons-png/location-white.png);\n}\n.ui-icon-lock:after {\n\tbackground-image: url(images/icons-png/lock-white.png);\n}\n.ui-icon-mail:after {\n\tbackground-image: url(images/icons-png/mail-white.png);\n}\n.ui-icon-minus:after {\n\tbackground-image: url(images/icons-png/minus-white.png);\n}\n.ui-icon-navigation:after {\n\tbackground-image: url(images/icons-png/navigation-white.png);\n}\n.ui-icon-phone:after {\n\tbackground-image: url(images/icons-png/phone-white.png);\n}\n.ui-icon-plus:after {\n\tbackground-image: url(images/icons-png/plus-white.png);\n}\n.ui-icon-power:after {\n\tbackground-image: url(images/icons-png/power-white.png);\n}\n.ui-icon-recycle:after {\n\tbackground-image: url(images/icons-png/recycle-white.png);\n}\n.ui-icon-refresh:after {\n\tbackground-image: url(images/icons-png/refresh-white.png);\n}\n.ui-icon-search:after {\n\tbackground-image: url(images/icons-png/search-white.png);\n}\n.ui-icon-shop:after {\n\tbackground-image: url(images/icons-png/shop-white.png);\n}\n.ui-icon-star:after {\n\tbackground-image: url(images/icons-png/star-white.png);\n}\n.ui-icon-tag:after {\n\tbackground-image: url(images/icons-png/tag-white.png);\n}\n.ui-icon-user:after {\n\tbackground-image: url(images/icons-png/user-white.png);\n}\n.ui-icon-video:after {\n\tbackground-image: url(images/icons-png/video-white.png);\n}\n/* Alt icons */\n.ui-alt-icon.ui-icon-action:after,\n.ui-alt-icon .ui-icon-action:after {\n\tbackground-image: url(images/icons-png/action-black.png);\n}\n.ui-alt-icon.ui-icon-alert:after,\n.ui-alt-icon .ui-icon-alert:after {\n\tbackground-image: url(images/icons-png/alert-black.png);\n}\n.ui-alt-icon.ui-icon-arrow-d:after,\n.ui-alt-icon .ui-icon-arrow-d:after {\n\tbackground-image: url(images/icons-png/arrow-d-black.png);\n}\n.ui-alt-icon.ui-icon-arrow-d-l:after,\n.ui-alt-icon .ui-icon-arrow-d-l:after {\n\tbackground-image: url(images/icons-png/arrow-d-l-black.png);\n}\n.ui-alt-icon.ui-icon-arrow-d-r:after,\n.ui-alt-icon .ui-icon-arrow-d-r:after {\n\tbackground-image: url(images/icons-png/arrow-d-r-black.png);\n}\n.ui-alt-icon.ui-icon-arrow-l:after,\n.ui-alt-icon .ui-icon-arrow-l:after {\n\tbackground-image: url(images/icons-png/arrow-l-black.png);\n}\n.ui-alt-icon.ui-icon-arrow-r:after,\n.ui-alt-icon .ui-icon-arrow-r:after {\n\tbackground-image: url(images/icons-png/arrow-r-black.png);\n}\n.ui-alt-icon.ui-icon-arrow-u:after,\n.ui-alt-icon .ui-icon-arrow-u:after {\n\tbackground-image: url(images/icons-png/arrow-u-black.png);\n}\n.ui-alt-icon.ui-icon-arrow-u-l:after,\n.ui-alt-icon .ui-icon-arrow-u-l:after {\n\tbackground-image: url(images/icons-png/arrow-u-l-black.png);\n}\n.ui-alt-icon.ui-icon-arrow-u-r:after,\n.ui-alt-icon .ui-icon-arrow-u-r:after {\n\tbackground-image: url(images/icons-png/arrow-u-r-black.png);\n}\n.ui-alt-icon.ui-icon-audio:after,\n.ui-alt-icon .ui-icon-audio:after {\n\tbackground-image: url(images/icons-png/audio-black.png);\n}\n.ui-alt-icon.ui-icon-back:after,\n.ui-alt-icon .ui-icon-back:after {\n\tbackground-image: url(images/icons-png/back-black.png);\n}\n.ui-alt-icon.ui-icon-bars:after,\n.ui-alt-icon .ui-icon-bars:after {\n\tbackground-image: url(images/icons-png/bars-black.png);\n}\n.ui-alt-icon.ui-icon-bullets:after,\n.ui-alt-icon .ui-icon-bullets:after {\n\tbackground-image: url(images/icons-png/bullets-black.png);\n}\n.ui-alt-icon.ui-icon-calendar:after,\n.ui-alt-icon .ui-icon-calendar:after {\n\tbackground-image: url(images/icons-png/calendar-black.png);\n}\n.ui-alt-icon.ui-icon-camera:after,\n.ui-alt-icon .ui-icon-camera:after {\n\tbackground-image: url(images/icons-png/camera-black.png);\n}\n.ui-alt-icon.ui-icon-carat-d:after,\n.ui-alt-icon .ui-icon-carat-d:after {\n\tbackground-image: url(images/icons-png/carat-d-black.png);\n}\n.ui-alt-icon.ui-icon-carat-l:after,\n.ui-alt-icon .ui-icon-carat-l:after {\n\tbackground-image: url(images/icons-png/carat-l-black.png);\n}\n.ui-alt-icon.ui-icon-carat-r:after,\n.ui-alt-icon .ui-icon-carat-r:after {\n\tbackground-image: url(images/icons-png/carat-r-black.png);\n}\n.ui-alt-icon.ui-icon-carat-u:after,\n.ui-alt-icon .ui-icon-carat-u:after {\n\tbackground-image: url(images/icons-png/carat-u-black.png);\n}\n.ui-alt-icon.ui-icon-check:after,\n.ui-alt-icon .ui-icon-check:after,\nhtml .ui-alt-icon.ui-btn.ui-checkbox-on:after,\nhtml .ui-alt-icon .ui-btn.ui-checkbox-on:after {\n\tbackground-image: url(images/icons-png/check-black.png);\n}\n.ui-alt-icon.ui-icon-clock:after,\n.ui-alt-icon .ui-icon-clock:after {\n\tbackground-image: url(images/icons-png/clock-black.png);\n}\n.ui-alt-icon.ui-icon-cloud:after,\n.ui-alt-icon .ui-icon-cloud:after {\n\tbackground-image: url(images/icons-png/cloud-black.png);\n}\n.ui-alt-icon.ui-icon-comment:after,\n.ui-alt-icon .ui-icon-comment:after {\n\tbackground-image: url(images/icons-png/comment-black.png);\n}\n.ui-alt-icon.ui-icon-delete:after,\n.ui-alt-icon .ui-icon-delete:after {\n\tbackground-image: url(images/icons-png/delete-black.png);\n}\n.ui-alt-icon.ui-icon-edit:after,\n.ui-alt-icon .ui-icon-edit:after {\n\tbackground-image: url(images/icons-png/edit-black.png);\n}\n.ui-alt-icon.ui-icon-eye:after,\n.ui-alt-icon .ui-icon-eye:after {\n\tbackground-image: url(images/icons-png/eye-black.png);\n}\n.ui-alt-icon.ui-icon-forbidden:after,\n.ui-alt-icon .ui-icon-forbidden:after {\n\tbackground-image: url(images/icons-png/forbidden-black.png);\n}\n.ui-alt-icon.ui-icon-forward:after,\n.ui-alt-icon .ui-icon-forward:after {\n\tbackground-image: url(images/icons-png/forward-black.png);\n}\n.ui-alt-icon.ui-icon-gear:after,\n.ui-alt-icon .ui-icon-gear:after {\n\tbackground-image: url(images/icons-png/gear-black.png);\n}\n.ui-alt-icon.ui-icon-grid:after,\n.ui-alt-icon .ui-icon-grid:after {\n\tbackground-image: url(images/icons-png/grid-black.png);\n}\n.ui-alt-icon.ui-icon-heart:after,\n.ui-alt-icon .ui-icon-heart:after {\n\tbackground-image: url(images/icons-png/heart-black.png);\n}\n.ui-alt-icon.ui-icon-home:after,\n.ui-alt-icon .ui-icon-home:after {\n\tbackground-image: url(images/icons-png/home-black.png);\n}\n.ui-alt-icon.ui-icon-info:after,\n.ui-alt-icon .ui-icon-info:after {\n\tbackground-image: url(images/icons-png/info-black.png);\n}\n.ui-alt-icon.ui-icon-location:after,\n.ui-alt-icon .ui-icon-location:after {\n\tbackground-image: url(images/icons-png/location-black.png);\n}\n.ui-alt-icon.ui-icon-lock:after,\n.ui-alt-icon .ui-icon-lock:after {\n\tbackground-image: url(images/icons-png/lock-black.png);\n}\n.ui-alt-icon.ui-icon-mail:after,\n.ui-alt-icon .ui-icon-mail:after {\n\tbackground-image: url(images/icons-png/mail-black.png);\n}\n.ui-alt-icon.ui-icon-minus:after,\n.ui-alt-icon .ui-icon-minus:after {\n\tbackground-image: url(images/icons-png/minus-black.png);\n}\n.ui-alt-icon.ui-icon-navigation:after,\n.ui-alt-icon .ui-icon-navigation:after {\n\tbackground-image: url(images/icons-png/navigation-black.png);\n}\n.ui-alt-icon.ui-icon-phone:after,\n.ui-alt-icon .ui-icon-phone:after {\n\tbackground-image: url(images/icons-png/phone-black.png);\n}\n.ui-alt-icon.ui-icon-plus:after,\n.ui-alt-icon .ui-icon-plus:after {\n\tbackground-image: url(images/icons-png/plus-black.png);\n}\n.ui-alt-icon.ui-icon-power:after,\n.ui-alt-icon .ui-icon-power:after {\n\tbackground-image: url(images/icons-png/power-black.png);\n}\n.ui-alt-icon.ui-icon-recycle:after,\n.ui-alt-icon .ui-icon-recycle:after {\n\tbackground-image: url(images/icons-png/recycle-black.png);\n}\n.ui-alt-icon.ui-icon-refresh:after,\n.ui-alt-icon .ui-icon-refresh:after {\n\tbackground-image: url(images/icons-png/refresh-black.png);\n}\n.ui-alt-icon.ui-icon-search:after,\n.ui-alt-icon .ui-icon-search:after,\n.ui-input-search:after {\n\tbackground-image: url(images/icons-png/search-black.png);\n}\n.ui-alt-icon.ui-icon-shop:after,\n.ui-alt-icon .ui-icon-shop:after {\n\tbackground-image: url(images/icons-png/shop-black.png);\n}\n.ui-alt-icon.ui-icon-star:after,\n.ui-alt-icon .ui-icon-star:after {\n\tbackground-image: url(images/icons-png/star-black.png);\n}\n.ui-alt-icon.ui-icon-tag:after,\n.ui-alt-icon .ui-icon-tag:after {\n\tbackground-image: url(images/icons-png/tag-black.png);\n}\n.ui-alt-icon.ui-icon-user:after,\n.ui-alt-icon .ui-icon-user:after {\n\tbackground-image: url(images/icons-png/user-black.png);\n}\n.ui-alt-icon.ui-icon-video:after,\n.ui-alt-icon .ui-icon-video:after {\n\tbackground-image: url(images/icons-png/video-black.png);\n}\n/* Globals */\n/* Font\n-----------------------------------------------------------------------------------------------------------*/\nhtml {\n\tfont-size: 100%;\n}\nbody,\ninput,\nselect,\ntextarea,\nbutton,\n.ui-btn {\n\tfont-size: 1em;\n\tline-height: 1.3;\n\tfont-family: sans-serif /*{global-font-family}*/;\n}\nlegend,\n.ui-input-text input,\n.ui-input-search input {\n\tcolor: inherit;\n\ttext-shadow: inherit;\n}\n/* Form labels (overrides font-weight bold in bars, and mini font-size) */\n.ui-mobile label,\ndiv.ui-controlgroup-label {\n\tfont-weight: normal;\n\tfont-size: 16px;\n}\n/* Separators\n-----------------------------------------------------------------------------------------------------------*/\n/* Field contain separator (< 28em) */\n.ui-field-contain {\n\tborder-bottom-color: #828282;\n\tborder-bottom-color: rgba(0,0,0,.15);\n\tborder-bottom-width: 1px;\n\tborder-bottom-style: solid;\n}\n/* Table opt-in classes: strokes between each row, and alternating row stripes */\n/* Classes table-stroke and table-stripe are deprecated in 1.4. */\n.table-stroke thead th,\n.table-stripe thead th,\n.table-stripe tbody tr:last-child {\n\tborder-bottom: 1px solid #d6d6d6; /* non-RGBA fallback */\n\tborder-bottom: 1px solid rgba(0,0,0,.1);\n}\n.table-stroke tbody th,\n.table-stroke tbody td {\n\tborder-bottom: 1px solid #e6e6e6; /* non-RGBA fallback  */\n\tborder-bottom: 1px solid rgba(0,0,0,.05);\n}\n.table-stripe.table-stroke tbody tr:last-child th,\n.table-stripe.table-stroke tbody tr:last-child td {\n\tborder-bottom: 0;\n}\n.table-stripe tbody tr:nth-child(odd) td,\n.table-stripe tbody tr:nth-child(odd) th {\n\tbackground-color: #eeeeee; /* non-RGBA fallback  */\n\tbackground-color: rgba(0,0,0,.04);\n}\n/* Buttons\n-----------------------------------------------------------------------------------------------------------*/\n.ui-btn,\nlabel.ui-btn {\n\tfont-weight: bold;\n\tborder-width: 1px;\n\tborder-style: solid;\n}\n.ui-btn {\n\ttext-decoration: none !important;\n}\n.ui-btn-active {\n\tcursor: pointer;\n}\n/* Corner rounding\n-----------------------------------------------------------------------------------------------------------*/\n/* Class ui-btn-corner-all deprecated in 1.4 */\n.ui-corner-all {\n\t-webkit-border-radius: \t\t\t\t.3125em /*{global-radii-blocks}*/;\n\tborder-radius: \t\t\t\t\t\t.3125em /*{global-radii-blocks}*/;\n}\n/* Buttons */\n.ui-btn-corner-all,\n.ui-btn.ui-corner-all,\n/* Slider track */\n.ui-slider-track.ui-corner-all,\n/* Flipswitch */\n.ui-flipswitch.ui-corner-all,\n/* Count bubble */\n.ui-li-count {\n\t-webkit-border-radius: \t\t\t\t.3125em /*{global-radii-buttons}*/;\n\tborder-radius: \t\t\t\t\t\t.3125em /*{global-radii-buttons}*/;\n}\n/* Icon-only buttons */\n.ui-btn-icon-notext.ui-btn-corner-all,\n.ui-btn-icon-notext.ui-corner-all {\n\t-webkit-border-radius: 1em;\n\tborder-radius: 1em;\n}\n/* Radius clip workaround for cleaning up corner trapping */\n.ui-btn-corner-all,\n.ui-corner-all {\n\t-webkit-background-clip: padding;\n\tbackground-clip: padding-box;\n}\n/* Popup arrow */\n.ui-popup.ui-corner-all > .ui-popup-arrow-guide {\n\tleft: .6em /*{global-radii-blocks}*/;\n\tright: .6em /*{global-radii-blocks}*/;\n\ttop: .6em /*{global-radii-blocks}*/;\n\tbottom: .6em /*{global-radii-blocks}*/;\n}\n/* Shadow\n-----------------------------------------------------------------------------------------------------------*/\n.ui-shadow {\n\t-webkit-box-shadow: 0 1px 3px /*{global-box-shadow-size}*/ \t\trgba(0,0,0,.15) /*{global-box-shadow-color}*/;\n\t-moz-box-shadow: 0 1px 3px /*{global-box-shadow-size}*/ \t\trgba(0,0,0,.15) /*{global-box-shadow-color}*/;\n\tbox-shadow: 0 1px 3px /*{global-box-shadow-size}*/ \t\t\t\trgba(0,0,0,.15) /*{global-box-shadow-color}*/;\n}\n.ui-shadow-inset {\n\t-webkit-box-shadow: inset 0 1px 3px /*{global-box-shadow-size}*/ \trgba(0,0,0,.2) /*{global-box-shadow-color}*/;\n\t-moz-box-shadow: inset 0 1px 3px /*{global-box-shadow-size}*/ \t\trgba(0,0,0,.2) /*{global-box-shadow-color}*/;\n\tbox-shadow: inset 0 1px 3px /*{global-box-shadow-size}*/ \trgba(0,0,0,.2) /*{global-box-shadow-color}*/;\n}\n.ui-overlay-shadow {\n\t-webkit-box-shadow: 0 0 12px \t\trgba(0,0,0,.6);\n\t-moz-box-shadow: 0 0 12px \t\t\trgba(0,0,0,.6);\n\tbox-shadow: 0 0 12px \t\t\t\trgba(0,0,0,.6);\n}\n/* Icons\n-----------------------------------------------------------------------------------------------------------*/\n.ui-btn-icon-left:after,\n.ui-btn-icon-right:after,\n.ui-btn-icon-top:after,\n.ui-btn-icon-bottom:after,\n.ui-btn-icon-notext:after {\n\tbackground-color: \t\t\t\t\t#666 /*{global-icon-color}*/;\n\tbackground-color: \t\t\t\t\trgba(0,0,0,.3) /*{global-icon-disc}*/;\n\tbackground-position: center center;\n\tbackground-repeat: no-repeat;\n\t-webkit-border-radius: 1em;\n\tborder-radius: 1em;\n}\n/* Alt icons */\n.ui-alt-icon.ui-btn:after,\n.ui-alt-icon .ui-btn:after,\nhtml .ui-alt-icon.ui-checkbox-off:after,\nhtml .ui-alt-icon.ui-radio-off:after,\nhtml .ui-alt-icon .ui-checkbox-off:after,\nhtml .ui-alt-icon .ui-radio-off:after {\n\tbackground-color: \t\t\t\t\t#666 /*{global-icon-color}*/;\n\tbackground-color: \t\t\t\t\trgba(0,0,0,.15) /*{global-icon-disc}*/;\n}\n/* No disc */\n.ui-nodisc-icon.ui-btn:after,\n.ui-nodisc-icon .ui-btn:after {\n\tbackground-color: transparent;\n}\n/* Icon shadow */\n.ui-shadow-icon.ui-btn:after,\n.ui-shadow-icon .ui-btn:after {\n\t-webkit-box-shadow: 0 1px 0 \t\t\trgba(255,255,255,.3) /*{global-icon-shadow}*/;\n\t-moz-box-shadow: 0 1px 0 \t\t\t\trgba(255,255,255,.3) /*{global-icon-shadow}*/;\n\tbox-shadow: 0 1px 0 \t\t\t\t\trgba(255,255,255,.3) /*{global-icon-shadow}*/;\n}\n/* Checkbox and radio */\n.ui-btn.ui-checkbox-off:after,\n.ui-btn.ui-checkbox-on:after,\n.ui-btn.ui-radio-off:after,\n.ui-btn.ui-radio-on:after {\n\tdisplay: block;\n\twidth: 18px;\n\theight: 18px;\n\tmargin: -9px 2px 0 2px;\n}\n.ui-checkbox-off:after,\n.ui-btn.ui-radio-off:after {\n\tfilter: Alpha(Opacity=30);\n\topacity: .3;\n}\n.ui-btn.ui-checkbox-off:after,\n.ui-btn.ui-checkbox-on:after {\n\t-webkit-border-radius: .1875em;\n\tborder-radius: .1875em;\n}\n.ui-btn.ui-checkbox-off:after {\n\tbackground-color: #666;\n\tbackground-color: rgba(0,0,0,.3);\n}\n.ui-radio .ui-btn.ui-radio-on:after {\n\tbackground-image: none;\n\tbackground-color: #fff;\n\twidth: 8px;\n\theight: 8px;\n\tborder-width: 5px;\n\tborder-style: solid; \n}\n.ui-alt-icon.ui-btn.ui-radio-on:after,\n.ui-alt-icon .ui-btn.ui-radio-on:after {\n\tbackground-color: #000;\n}\n/* Loader */\n.ui-icon-loading {\n\tbackground: url(images/ajax-loader.gif);\n\tbackground-size: 2.875em 2.875em;\n}\n/* Swatches */\n/* A\n-----------------------------------------------------------------------------------------------------------*/\n/* Bar: Toolbars, dividers, slider track */\n.ui-bar-a,\n.ui-page-theme-a .ui-bar-inherit,\nhtml .ui-bar-a .ui-bar-inherit,\nhtml .ui-body-a .ui-bar-inherit,\nhtml body .ui-group-theme-a .ui-bar-inherit {\n\tbackground-color: \t\t\t#e9e9e9 /*{a-bar-background-color}*/;\n\tborder-color:\t \t\t#ddd /*{a-bar-border}*/;\n\tcolor: \t\t\t\t\t#333 /*{a-bar-color}*/;\n\ttext-shadow: 0 /*{a-bar-shadow-x}*/ 1px /*{a-bar-shadow-y}*/ 0 /*{a-bar-shadow-radius}*/ \t#eee /*{a-bar-shadow-color}*/;\n\tfont-weight: bold;\n}\n.ui-bar-a {\n\tborder-width: 1px;\n\tborder-style: solid;\n}\n/* Page and overlay */\n.ui-overlay-a,\n.ui-page-theme-a,\n.ui-page-theme-a .ui-panel-wrapper {\n\tbackground-color: \t\t\t#f9f9f9 /*{a-page-background-color}*/;\n\tborder-color:\t \t\t#bbb /*{a-page-border}*/;\n\tcolor: \t\t\t\t\t#333 /*{a-page-color}*/;\n\ttext-shadow: 0 /*{a-page-shadow-x}*/ 1px /*{a-page-shadow-y}*/ 0 /*{a-page-shadow-radius}*/ \t#f3f3f3 /*{a-page-shadow-color}*/;\n}\n/* Body: Read-only lists, text inputs, collapsible content */\n.ui-body-a,\n.ui-page-theme-a .ui-body-inherit,\nhtml .ui-bar-a .ui-body-inherit,\nhtml .ui-body-a .ui-body-inherit,\nhtml body .ui-group-theme-a .ui-body-inherit,\nhtml .ui-panel-page-container-a {\n\tbackground-color: \t\t\t#fff /*{a-body-background-color}*/;\n\tborder-color:\t \t\t#ddd /*{a-body-border}*/;\n\tcolor: \t\t\t\t\t#333 /*{a-body-color}*/;\n\ttext-shadow: 0 /*{a-body-shadow-x}*/ 1px /*{a-body-shadow-y}*/ 0 /*{a-body-shadow-radius}*/ \t#f3f3f3 /*{a-body-shadow-color}*/;\n}\n.ui-body-a {\n\tborder-width: 1px;\n\tborder-style: solid;\n}\n/* Links */\n.ui-page-theme-a a,\nhtml .ui-bar-a a,\nhtml .ui-body-a a,\nhtml body .ui-group-theme-a a {\n\tcolor: #3388cc /*{a-link-color}*/;\n\tfont-weight: bold;\n}\n.ui-page-theme-a a:visited,\nhtml .ui-bar-a a:visited,\nhtml .ui-body-a a:visited,\nhtml body .ui-group-theme-a a:visited {\n    color: #3388cc /*{a-link-visited}*/;\n}\n.ui-page-theme-a a:hover,\nhtml .ui-bar-a a:hover,\nhtml .ui-body-a a:hover,\nhtml body .ui-group-theme-a a:hover {\n\tcolor: #005599 /*{a-link-hover}*/;\n}\n.ui-page-theme-a a:active,\nhtml .ui-bar-a a:active,\nhtml .ui-body-a a:active,\nhtml body .ui-group-theme-a a:active {\n\tcolor: #005599 /*{a-link-active}*/;\n}\n/* Button up */\n.ui-page-theme-a .ui-btn,\nhtml .ui-bar-a .ui-btn,\nhtml .ui-body-a .ui-btn,\nhtml body .ui-group-theme-a .ui-btn,\nhtml head + body .ui-btn.ui-btn-a,\n/* Button visited */\n.ui-page-theme-a .ui-btn:visited,\nhtml .ui-bar-a .ui-btn:visited,\nhtml .ui-body-a .ui-btn:visited,\nhtml body .ui-group-theme-a .ui-btn:visited,\nhtml head + body .ui-btn.ui-btn-a:visited {\n\tbackground-color: \t\t\t#f6f6f6 /*{a-bup-background-color}*/;\n\tborder-color:\t \t\t#ddd /*{a-bup-border}*/;\n\tcolor: \t\t\t\t\t#333 /*{a-bup-color}*/;\n\ttext-shadow: 0 /*{a-bup-shadow-x}*/ 1px /*{a-bup-shadow-y}*/ 0 /*{a-bup-shadow-radius}*/ #f3f3f3 /*{a-bup-shadow-color}*/;\n}\n/* Button hover */\n.ui-page-theme-a .ui-btn:hover,\nhtml .ui-bar-a .ui-btn:hover,\nhtml .ui-body-a .ui-btn:hover,\nhtml body .ui-group-theme-a .ui-btn:hover,\nhtml head + body .ui-btn.ui-btn-a:hover {\n\tbackground-color: \t\t\t#ededed /*{a-bhover-background-color}*/;\n\tborder-color:\t \t\t#ddd /*{a-bhover-border}*/;\n\tcolor: \t\t\t\t\t#333 /*{a-bhover-color}*/;\n\ttext-shadow: 0 /*{a-bhover-shadow-x}*/ 1px /*{a-bhover-shadow-y}*/ 0 /*{a-bhover-shadow-radius}*/ #f3f3f3 /*{a-bhover-shadow-color}*/;\n}\n/* Button down */\n.ui-page-theme-a .ui-btn:active,\nhtml .ui-bar-a .ui-btn:active,\nhtml .ui-body-a .ui-btn:active,\nhtml body .ui-group-theme-a .ui-btn:active,\nhtml head + body .ui-btn.ui-btn-a:active {\n\tbackground-color: \t\t\t#e8e8e8 /*{a-bdown-background-color}*/;\n\tborder-color:\t \t\t#ddd /*{a-bdown-border}*/;\n\tcolor: \t\t\t\t\t#333 /*{a-bdown-color}*/;\n\ttext-shadow: 0 /*{a-bdown-shadow-x}*/ 1px /*{a-bdown-shadow-y}*/ 0 /*{a-bdown-shadow-radius}*/ #f3f3f3 /*{a-bdown-shadow-color}*/;\n}\n/* Active button */\n.ui-page-theme-a .ui-btn.ui-btn-active,\nhtml .ui-bar-a .ui-btn.ui-btn-active,\nhtml .ui-body-a .ui-btn.ui-btn-active,\nhtml body .ui-group-theme-a .ui-btn.ui-btn-active,\nhtml head + body .ui-btn.ui-btn-a.ui-btn-active,\n/* Active checkbox icon */\n.ui-page-theme-a .ui-checkbox-on:after,\nhtml .ui-bar-a .ui-checkbox-on:after,\nhtml .ui-body-a .ui-checkbox-on:after,\nhtml body .ui-group-theme-a .ui-checkbox-on:after,\n.ui-btn.ui-checkbox-on.ui-btn-a:after,\n/* Active flipswitch background */\n.ui-page-theme-a .ui-flipswitch-active,\nhtml .ui-bar-a .ui-flipswitch-active,\nhtml .ui-body-a .ui-flipswitch-active,\nhtml body .ui-group-theme-a .ui-flipswitch-active,\nhtml body .ui-flipswitch.ui-bar-a.ui-flipswitch-active,\n/* Active slider track */\n.ui-page-theme-a .ui-slider-track .ui-btn-active,\nhtml .ui-bar-a .ui-slider-track .ui-btn-active,\nhtml .ui-body-a .ui-slider-track .ui-btn-active,\nhtml body .ui-group-theme-a .ui-slider-track .ui-btn-active,\nhtml body div.ui-slider-track.ui-body-a .ui-btn-active {\n\tbackground-color: \t\t#3388cc /*{a-active-background-color}*/;\n\tborder-color:\t \t\t#3388cc /*{a-active-border}*/;\n\tcolor: \t\t\t\t\t#fff /*{a-active-color}*/;\n\ttext-shadow: 0 /*{a-active-shadow-x}*/ 1px /*{a-active-shadow-y}*/ 0 /*{a-active-shadow-radius}*/ #005599 /*{a-active-shadow-color}*/;\n}\n/* Active radio button icon */\n.ui-page-theme-a .ui-radio-on:after,\nhtml .ui-bar-a .ui-radio-on:after,\nhtml .ui-body-a .ui-radio-on:after,\nhtml body .ui-group-theme-a .ui-radio-on:after,\n.ui-btn.ui-radio-on.ui-btn-a:after {\n\tborder-color:\t\t\t#3388cc /*{a-active-background-color}*/;\n}\n/* Focus */\n.ui-page-theme-a .ui-btn:focus,\nhtml .ui-bar-a .ui-btn:focus,\nhtml .ui-body-a .ui-btn:focus,\nhtml body .ui-group-theme-a .ui-btn:focus,\nhtml head + body .ui-btn.ui-btn-a:focus,\n/* Focus buttons and text inputs with div wrap */\n.ui-page-theme-a .ui-focus,\nhtml .ui-bar-a .ui-focus,\nhtml .ui-body-a .ui-focus,\nhtml body .ui-group-theme-a .ui-focus,\nhtml head + body .ui-btn-a.ui-focus,\nhtml head + body .ui-body-a.ui-focus {\n\t-webkit-box-shadow: 0 0 12px \t#3388cc /*{a-active-background-color}*/;\n\t-moz-box-shadow: 0 0 12px \t\t#3388cc /*{a-active-background-color}*/;\n\tbox-shadow: 0 0 12px \t\t\t#3388cc /*{a-active-background-color}*/;\n}\n/* B\n-----------------------------------------------------------------------------------------------------------*/\n/* Bar: Toolbars, dividers, slider track */\n.ui-bar-b,\n.ui-page-theme-b .ui-bar-inherit,\nhtml .ui-bar-b .ui-bar-inherit,\nhtml .ui-body-b .ui-bar-inherit,\nhtml body .ui-group-theme-b .ui-bar-inherit {\n\tbackground-color: \t\t\t#1d1d1d /*{b-bar-background-color}*/;\n\tborder-color:\t \t\t#1b1b1b /*{b-bar-border}*/;\n\tcolor: \t\t\t\t\t#fff /*{b-bar-color}*/;\n\ttext-shadow: 0 /*{b-bar-shadow-x}*/ 1px /*{b-bar-shadow-y}*/ 0 /*{b-bar-shadow-radius}*/ \t#111 /*{b-bar-shadow-color}*/;\n\tfont-weight: bold;\n}\n.ui-bar-b {\n\tborder-width: 1px;\n\tborder-style: solid;\n}\n/* Page and overlay */\n.ui-overlay-b,\n.ui-page-theme-b,\n.ui-page-theme-b .ui-panel-wrapper {\n\tbackground-color: \t\t\t#252525 /*{b-page-background-color}*/;\n\tborder-color:\t \t\t#454545 /*{b-page-border}*/;\n\tcolor: \t\t\t\t\t#fff /*{b-page-color}*/;\n\ttext-shadow: 0 /*{b-page-shadow-x}*/ 1px /*{b-page-shadow-y}*/ 0 /*{b-page-shadow-radius}*/ \t#111 /*{b-page-shadow-color}*/;\n}\n/* Body: Read-only lists, text inputs, collapsible content */\n.ui-body-b,\n.ui-page-theme-b .ui-body-inherit,\nhtml .ui-bar-b .ui-body-inherit,\nhtml .ui-body-b .ui-body-inherit,\nhtml body .ui-group-theme-b .ui-body-inherit,\nhtml .ui-panel-page-container-b {\n\tbackground-color: \t\t\t#2a2a2a /*{b-body-background-color}*/;\n\tborder-color:\t \t\t#1d1d1d /*{b-body-border}*/;\n\tcolor: \t\t\t\t\t#fff /*{b-body-color}*/;\n\ttext-shadow: 0 /*{b-body-shadow-x}*/ 1px /*{b-body-shadow-y}*/ 0 /*{b-body-shadow-radius}*/ \t#111 /*{b-body-shadow-color}*/;\n}\n.ui-body-b {\n\tborder-width: 1px;\n\tborder-style: solid;\n}\n/* Links */\n.ui-page-theme-b a,\nhtml .ui-bar-b a,\nhtml .ui-body-b a,\nhtml body .ui-group-theme-b a {\n\tcolor: #22aadd /*{b-link-color}*/;\n\tfont-weight: bold;\n}\n.ui-page-theme-b a:visited,\nhtml .ui-bar-b a:visited,\nhtml .ui-body-b a:visited,\nhtml body .ui-group-theme-b a:visited {\n    color: #22aadd /*{b-link-visited}*/;\n}\n.ui-page-theme-b a:hover,\nhtml .ui-bar-b a:hover,\nhtml .ui-body-b a:hover,\nhtml body .ui-group-theme-b a:hover {\n\tcolor: #0088bb /*{b-link-hover}*/;\n}\n.ui-page-theme-b a:active,\nhtml .ui-bar-b a:active,\nhtml .ui-body-b a:active,\nhtml body .ui-group-theme-b a:active {\n\tcolor: #0088bb /*{b-link-active}*/;\n}\n/* Button up */\n.ui-page-theme-b .ui-btn,\nhtml .ui-bar-b .ui-btn,\nhtml .ui-body-b .ui-btn,\nhtml body .ui-group-theme-b .ui-btn,\nhtml head + body .ui-btn.ui-btn-b,\n/* Button visited */\n.ui-page-theme-b .ui-btn:visited,\nhtml .ui-bar-b .ui-btn:visited,\nhtml .ui-body-b .ui-btn:visited,\nhtml body .ui-group-theme-b .ui-btn:visited,\nhtml head + body .ui-btn.ui-btn-b:visited {\n\tbackground-color: \t\t\t#333 /*{b-bup-background-color}*/;\n\tborder-color:\t \t\t#1f1f1f /*{b-bup-border}*/;\n\tcolor: \t\t\t\t\t#fff /*{b-bup-color}*/;\n\ttext-shadow: 0 /*{b-bup-shadow-x}*/ 1px /*{b-bup-shadow-y}*/ 0 /*{b-bup-shadow-radius}*/ #111 /*{b-bup-shadow-color}*/;\n}\n/* Button hover */\n.ui-page-theme-b .ui-btn:hover,\nhtml .ui-bar-b .ui-btn:hover,\nhtml .ui-body-b .ui-btn:hover,\nhtml body .ui-group-theme-b .ui-btn:hover,\nhtml head + body .ui-btn.ui-btn-b:hover {\n\tbackground-color: \t\t\t#373737 /*{b-bhover-background-color}*/;\n\tborder-color:\t \t\t#1f1f1f /*{b-bhover-border}*/;\n\tcolor: \t\t\t\t\t#fff /*{b-bhover-color}*/;\n\ttext-shadow: 0 /*{b-bhover-shadow-x}*/ 1px /*{b-bhover-shadow-y}*/ 0 /*{b-bhover-shadow-radius}*/ #111 /*{b-bhover-shadow-color}*/;\n}\n/* Button down */\n.ui-page-theme-b .ui-btn:active,\nhtml .ui-bar-b .ui-btn:active,\nhtml .ui-body-b .ui-btn:active,\nhtml body .ui-group-theme-b .ui-btn:active,\nhtml head + body .ui-btn.ui-btn-b:active {\n\tbackground-color: \t\t\t#404040 /*{b-bdown-background-color}*/;\n\tborder-color:\t \t\t#1f1f1f /*{b-bdown-border}*/;\n\tcolor: \t\t\t\t\t#fff /*{b-bdown-color}*/;\n\ttext-shadow: 0 /*{b-bdown-shadow-x}*/ 1px /*{b-bdown-shadow-y}*/ 0 /*{b-bdown-shadow-radius}*/ #111 /*{b-bdown-shadow-color}*/;\n}\n/* Active button */\n.ui-page-theme-b .ui-btn.ui-btn-active,\nhtml .ui-bar-b .ui-btn.ui-btn-active,\nhtml .ui-body-b .ui-btn.ui-btn-active,\nhtml body .ui-group-theme-b .ui-btn.ui-btn-active,\nhtml head + body .ui-btn.ui-btn-b.ui-btn-active,\n/* Active checkbox icon */\n.ui-page-theme-b .ui-checkbox-on:after,\nhtml .ui-bar-b .ui-checkbox-on:after,\nhtml .ui-body-b .ui-checkbox-on:after,\nhtml body .ui-group-theme-b .ui-checkbox-on:after,\n.ui-btn.ui-checkbox-on.ui-btn-b:after,\n/* Active flipswitch background */\n.ui-page-theme-b .ui-flipswitch-active,\nhtml .ui-bar-b .ui-flipswitch-active,\nhtml .ui-body-b .ui-flipswitch-active,\nhtml body .ui-group-theme-b .ui-flipswitch-active,\nhtml body .ui-flipswitch.ui-bar-b.ui-flipswitch-active,\n/* Active slider track */\n.ui-page-theme-b .ui-slider-track .ui-btn-active,\nhtml .ui-bar-b .ui-slider-track .ui-btn-active,\nhtml .ui-body-b .ui-slider-track .ui-btn-active,\nhtml body .ui-group-theme-b .ui-slider-track .ui-btn-active,\nhtml body div.ui-slider-track.ui-body-b .ui-btn-active {\n\tbackground-color: \t\t#22aadd /*{b-active-background-color}*/;\n\tborder-color:\t \t\t#22aadd /*{b-active-border}*/;\n\tcolor: \t\t\t\t\t#fff /*{b-active-color}*/;\n\ttext-shadow: 0 /*{b-active-shadow-x}*/ 1px /*{b-active-shadow-y}*/ 0 /*{b-active-shadow-radius}*/ #0088bb /*{b-active-shadow-color}*/;\n}\n/* Active radio button icon */\n.ui-page-theme-b .ui-radio-on:after,\nhtml .ui-bar-b .ui-radio-on:after,\nhtml .ui-body-b .ui-radio-on:after,\nhtml body .ui-group-theme-b .ui-radio-on:after,\n.ui-btn.ui-radio-on.ui-btn-b:after {\n\tborder-color:\t\t\t#22aadd /*{b-active-background-color}*/;\n}\n/* Focus */\n.ui-page-theme-b .ui-btn:focus,\nhtml .ui-bar-b .ui-btn:focus,\nhtml .ui-body-b .ui-btn:focus,\nhtml body .ui-group-theme-b .ui-btn:focus,\nhtml head + body .ui-btn.ui-btn-b:focus,\n/* Focus buttons and text inputs with div wrap */\n.ui-page-theme-b .ui-focus,\nhtml .ui-bar-b .ui-focus,\nhtml .ui-body-b .ui-focus,\nhtml body .ui-group-theme-b .ui-focus,\nhtml head + body .ui-btn-b.ui-focus,\nhtml head + body .ui-body-b.ui-focus {\n\t-webkit-box-shadow: 0 0 12px \t#22aadd /*{b-active-background-color}*/;\n\t-moz-box-shadow: 0 0 12px \t\t#22aadd /*{b-active-background-color}*/;\n\tbox-shadow: 0 0 12px \t\t\t#22aadd /*{b-active-background-color}*/;\n}\n/* Structure */\n/* Disabled\n-----------------------------------------------------------------------------------------------------------*/\n/* Class ui-disabled deprecated in 1.4. :disabled not supported by IE8 so we use [disabled] */\n.ui-disabled,\n.ui-state-disabled,\nbutton[disabled],\n.ui-select .ui-btn.ui-state-disabled {\n\tfilter: Alpha(Opacity=30);\n\topacity: .3;\n\tcursor: default !important;\n\tpointer-events: none;\n}\n/* Focus state outline\n-----------------------------------------------------------------------------------------------------------*/\n.ui-btn:focus,\n.ui-btn.ui-focus {\n\toutline: 0;\n}\n/* Unset box-shadow in browsers that don't do it right */\n.ui-noboxshadow .ui-shadow,\n.ui-noboxshadow .ui-shadow-inset,\n.ui-noboxshadow .ui-overlay-shadow,\n.ui-noboxshadow .ui-shadow-icon.ui-btn:after,\n.ui-noboxshadow .ui-shadow-icon .ui-btn:after,\n.ui-noboxshadow .ui-focus,\n.ui-noboxshadow .ui-btn:focus,\n.ui-noboxshadow  input:focus,\n.ui-noboxshadow .ui-panel {\n\t-webkit-box-shadow: none !important;\n\t-moz-box-shadow: none !important;\n\tbox-shadow: none !important;\n}\n.ui-noboxshadow .ui-btn:focus,\n.ui-noboxshadow .ui-focus {\n\toutline-width: 1px;\n\toutline-style: auto;\n}\n/* Some unsets */\n.ui-mobile,\n.ui-mobile body {\n\theight: 99.9%;\n}\n.ui-mobile fieldset,\n.ui-page {\n\tpadding: 0;\n\tmargin: 0;\n}\n.ui-mobile a img,\n.ui-mobile fieldset {\n\tborder-width: 0;\n}\n/* Fixes for fieldset issues on IE10 and FF (see #6077) */\n.ui-mobile fieldset {\n\tmin-width: 0;\n}\n@-moz-document url-prefix() {\n\t.ui-mobile fieldset {\n\t\tdisplay: table-column;\n\t\tvertical-align: middle;\n\t}\n}\n/* Viewport */\n.ui-mobile-viewport {\n\tmargin: 0;\n\toverflow-x: visible;\n\t-webkit-text-size-adjust: 100%;\n\t-ms-text-size-adjust:none;\n\t-webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\n/* Issue #2066 */\nbody.ui-mobile-viewport,\ndiv.ui-mobile-viewport {\n\toverflow-x: hidden;\n}\n/* \"page\" containers - full-screen views, one should always be in view post-pageload */\n.ui-mobile [data-role=page],\n.ui-mobile [data-role=dialog],\n.ui-page {\n\ttop: 0;\n\tleft: 0;\n\twidth: 100%;\n\tmin-height: 100%;\n\tposition: absolute;\n\tdisplay: none;\n\tborder: 0;\n}\n/* On ios4, setting focus on the page element causes flashing during transitions when there is an outline, so we turn off outlines */\n.ui-page {\n\toutline: none;\n}\n.ui-mobile .ui-page-active {\n\tdisplay: block;\n\toverflow: visible;\n\toverflow-x: hidden;\n}\n@media screen and (orientation: portrait) {\n\t.ui-mobile .ui-page {\n\t\tmin-height: 420px;\n\t}\n}\n@media screen and (orientation: landscape) {\n\t.ui-mobile .ui-page {\n\t\tmin-height: 300px;\n\t}\n}\n/* Fouc */\n.ui-mobile-rendering > * {\n\tvisibility: hidden;\n}\n/* Non-js content hiding */\n.ui-nojs {\n\tposition: absolute !important;\n\theight: 1px;\n\twidth: 1px;\n\toverflow: hidden;\n\tclip: rect(1px,1px,1px,1px);\n}\n/* Loading screen */\n.ui-loading .ui-loader {\n\tdisplay: block;\n}\n.ui-loader {\n\tdisplay: none;\n\tz-index: 9999999;\n\tposition: fixed;\n\ttop: 50%;\n\tleft: 50%;\n\tborder:0;\n}\n.ui-loader-default {\n\tbackground: none;\n\tfilter: Alpha(Opacity=18);\n\topacity: .18;\n\twidth: 2.875em;\n\theight: 2.875em;\n\tmargin-left: -1.4375em;\n\tmargin-top: -1.4375em;\n}\n.ui-loader-verbose {\n\twidth: 12.5em;\n\tfilter: Alpha(Opacity=88);\n\topacity: .88;\n\tbox-shadow: 0 1px 1px -1px #fff;\n\theight: auto;\n\tmargin-left: -6.875em;\n\tmargin-top: -2.6875em;\n\tpadding: .625em;\n}\n.ui-loader-default h1 {\n\tfont-size: 0;\n\twidth: 0;\n\theight: 0;\n\toverflow: hidden;\n}\n.ui-loader-verbose h1 {\n\tfont-size: 1em;\n\tmargin: 0;\n\ttext-align: center;\n}\n.ui-loader .ui-icon-loading {\n\tbackground-color: #000;\n\tdisplay: block;\n\tmargin: 0;\n\twidth: 2.75em;\n\theight: 2.75em;\n\tpadding: .0625em;\n\t-webkit-border-radius: 2.25em;\n\tborder-radius: 2.25em;\n}\n.ui-loader-verbose .ui-icon-loading {\n\tmargin: 0 auto .625em;\n\tfilter: Alpha(Opacity=75);\n\topacity: .75;\n}\n.ui-loader-textonly {\n\tpadding: .9375em;\n\tmargin-left: -7.1875em;\n}\n.ui-loader-textonly .ui-icon-loading {\n\tdisplay: none;\n}\n.ui-loader-fakefix {\n\tposition: absolute;\n}\n/* Headers, content panels */\n.ui-bar,\n.ui-body {\n\tposition: relative;\n\tpadding: .4em 1em;\n\toverflow: hidden;\n\tdisplay: block;\n\tclear: both;\n}\n.ui-bar h1,\n.ui-bar h2,\n.ui-bar h3,\n.ui-bar h4,\n.ui-bar h5,\n.ui-bar h6 {\n\tmargin: 0;\n\tpadding: 0;\n\tfont-size: 1em;\n\tdisplay: inline-block;\n}\n.ui-header,\n.ui-footer {\n\tborder-width: 1px 0;\n\tborder-style: solid;\n\tposition: relative;\n}\n.ui-header:empty,\n.ui-footer:empty {\n\tmin-height: 2.6875em;\n}\n.ui-header .ui-title,\n.ui-footer .ui-title {\n\tfont-size: 1em;\n\tmin-height: 1.1em;\n\ttext-align: center;\n\tdisplay: block;\n\tmargin: 0 30%;\n\tpadding: .7em 0;\n\ttext-overflow: ellipsis;\n\toverflow: hidden;\n\twhite-space: nowrap;\n\toutline: 0 !important;\n}\n.ui-footer .ui-title {\n\tmargin: 0 1em;\n}\n.ui-content {\n\tborder-width: 0;\n\toverflow: visible;\n\toverflow-x: hidden;\n\tpadding: 1em;\n}\n/* Corner styling for dialogs and popups */\n.ui-corner-all > .ui-header:first-child,\n.ui-corner-all > .ui-content:first-child,\n.ui-corner-all > .ui-footer:first-child {\n\t-webkit-border-top-left-radius: inherit;\n\tborder-top-left-radius: inherit;\n\t-webkit-border-top-right-radius: inherit;\n\tborder-top-right-radius: inherit;\n}\n.ui-corner-all > .ui-header:last-child,\n.ui-corner-all > .ui-content:last-child,\n.ui-corner-all > .ui-footer:last-child {\n\t-webkit-border-bottom-left-radius: inherit;\n\tborder-bottom-left-radius: inherit;\n\t-webkit-border-bottom-right-radius: inherit;\n\tborder-bottom-right-radius: inherit;\n}\n/* Buttons and icons */\n.ui-btn {\n\tfont-size: 16px;\n\tmargin: .5em 0;\n\tpadding: .7em 1em;\n\tdisplay: block;\n\tposition: relative;\n\ttext-align: center;\n\ttext-overflow: ellipsis;\n\toverflow: hidden;\n\twhite-space: nowrap;\n\tcursor: pointer;\n\t-webkit-user-select: none;\n\t-moz-user-select: none;\n\t-ms-user-select: none;\n\tuser-select: none;\n}\n.ui-btn-icon-notext,\n.ui-header button.ui-btn.ui-btn-icon-notext,\n.ui-footer button.ui-btn.ui-btn-icon-notext {\n\tpadding: 0;\n\twidth: 1.75em;\n\theight: 1.75em;\n\ttext-indent: -9999px;\n\twhite-space: nowrap !important;\n}\n.ui-mini {\n\tfont-size: 12.5px;\n}\n.ui-mini .ui-btn {\n\tfont-size: inherit;\n}\n/* Make buttons in toolbars default to mini and inline. */\n.ui-header .ui-btn,\n.ui-footer .ui-btn {\n\tfont-size: 12.5px;\n\tdisplay: inline-block;\n\tvertical-align: middle;\n}\n.ui-header .ui-controlgroup .ui-btn-icon-notext,\n.ui-footer .ui-controlgroup .ui-btn-icon-notext {\n    font-size: 12.5px;\n}\n/* To ensure same top and left/right position when ui-btn-left/right are added to something other than buttons. */\n.ui-header .ui-btn-left,\n.ui-header .ui-btn-right {\n\tfont-size: 12.5px;\n}\n.ui-mini.ui-btn-icon-notext,\n.ui-mini .ui-btn-icon-notext,\n.ui-header .ui-btn-icon-notext,\n.ui-footer .ui-btn-icon-notext {\n\tfont-size: 16px;\t\n\tpadding: 0;\n}\n.ui-btn-inline {\n\tdisplay: inline-block;\n\tvertical-align: middle;\n\tmargin-right: .625em;\n}\n.ui-btn-icon-left {\n\tpadding-left: 2.5em;\n}\n.ui-btn-icon-right {\n\tpadding-right: 2.5em;\n}\n.ui-btn-icon-top {\n\tpadding-top: 2.5em;\n}\n.ui-btn-icon-bottom {\n\tpadding-bottom: 2.5em;\n}\n.ui-header .ui-btn-icon-top,\n.ui-footer .ui-btn-icon-top,\n.ui-header .ui-btn-icon-bottom,\n.ui-footer .ui-btn-icon-bottom {\n\tpadding-left: .3125em;\n\tpadding-right: .3125em;\n}\n.ui-btn-icon-left:after,\n.ui-btn-icon-right:after,\n.ui-btn-icon-top:after,\n.ui-btn-icon-bottom:after,\n.ui-btn-icon-notext:after {\n\tcontent: \"\";\n\tposition: absolute;\n\tdisplay: block;\n\twidth: 22px;\n\theight: 22px;\n}\n.ui-btn-icon-notext:after,\n.ui-btn-icon-left:after,\n.ui-btn-icon-right:after {\n\ttop: 50%;\n\tmargin-top: -11px;\n}\n.ui-btn-icon-left:after {\n\tleft: .5625em;\n}\n.ui-btn-icon-right:after {\n\tright: .5625em;\n}\n.ui-mini.ui-btn-icon-left:after,\n.ui-mini .ui-btn-icon-left:after,\n.ui-header .ui-btn-icon-left:after,\n.ui-footer .ui-btn-icon-left:after {\n\tleft: .37em;\n}\n.ui-mini.ui-btn-icon-right:after,\n.ui-mini .ui-btn-icon-right:after,\n.ui-header .ui-btn-icon-right:after,\n.ui-footer .ui-btn-icon-right:after {\n\tright: .37em;\n}\n.ui-btn-icon-notext:after,\n.ui-btn-icon-top:after,\n.ui-btn-icon-bottom:after {\n\tleft: 50%;\n\tmargin-left: -11px;\n}\n.ui-btn-icon-top:after {\n\ttop: .5625em;\n}\n.ui-btn-icon-bottom:after {\n\ttop: auto;\n\tbottom: .5625em;\n}\n/* Buttons in header position classes */\n.ui-header .ui-btn-left,\n.ui-header .ui-btn-right,\n.ui-btn-left > [class*=\"ui-\"],\n.ui-btn-right > [class*=\"ui-\"] {\n\tmargin: 0;\n}\n.ui-btn-left,\n.ui-btn-right {\n\tposition: absolute;\n\ttop: .24em;\n}\n.ui-btn-left {\n\tleft: .4em;\n}\n.ui-btn-right {\n\tright: .4em;\n}\n.ui-btn-icon-notext.ui-btn-left {\n\ttop: .3125em;\n\tleft: .3125em;\n}\n.ui-btn-icon-notext.ui-btn-right {\n\ttop: .3125em;\n\tright: .3125em;\n}\n/* Button elements */\nbutton.ui-btn,\n.ui-controlgroup-controls button.ui-btn-icon-notext {\n\t-webkit-box-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\tbox-sizing: border-box;\n\t-webkit-appearance: none;\n\t-moz-appearance: none;\n\twidth: 100%;\n}\nbutton.ui-btn-inline,\n.ui-header button.ui-btn,\n.ui-footer button.ui-btn {\n\twidth: auto;\n}\n/* Firefox adds a 1px border in a button element. We negate this to make sure they have the same height as other buttons in controlgroups. */\nbutton.ui-btn::-moz-focus-inner {\n\tborder: 0;\n}\nbutton.ui-btn-icon-notext,\n.ui-controlgroup-horizontal .ui-controlgroup-controls button.ui-btn {\n\t-webkit-box-sizing: content-box;\n\t-moz-box-sizing: content-box;\n\tbox-sizing: content-box;\n\twidth: 1.75em;\n}\n/* Form labels */\n.ui-mobile label,\n.ui-controlgroup-label {\n\tdisplay: block;\n\tmargin: 0 0 .4em;\n}\n/* Accessible content hiding */\n/* ui-hide-label deprecated in 1.4. TODO: Remove in 1.5 */\n.ui-hide-label > label,\n.ui-hide-label .ui-controlgroup-label,\n.ui-hide-label .ui-rangeslider label,\n.ui-hidden-accessible {\n\tposition: absolute !important;\n\theight: 1px;\n\twidth: 1px;\n\toverflow: hidden;\n\tclip: rect(1px,1px,1px,1px);\n}\n/* Used for hiding elements by the filterable widget. You can also use this class to hide list items or buttons in controlgroups; this ensures correct corner styling. */\n.ui-screen-hidden {\n\tdisplay: none !important;\n}\n/* Transitions originally inspired by those from jQtouch, nice work, folks */\n.ui-mobile-viewport-transitioning,\n.ui-mobile-viewport-transitioning .ui-page {\n\twidth: 100%;\n\theight: 100%;\n\toverflow: hidden;\n\t-webkit-box-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\tbox-sizing: border-box;\n}\n.ui-page-pre-in {\n\topacity: 0;\n}\n.in {\n\t-webkit-animation-timing-function: ease-out;\n\t-webkit-animation-duration: 350ms;\n\t-moz-animation-timing-function: ease-out;\n\t-moz-animation-duration: 350ms;\n\tanimation-timing-function: ease-out;\n\tanimation-duration: 350ms;\n}\n.out {\n\t-webkit-animation-timing-function: ease-in;\n\t-webkit-animation-duration: 225ms;\n\t-moz-animation-timing-function: ease-in;\n\t-moz-animation-duration: 225ms;\n\tanimation-timing-function: ease-in;\n\tanimation-duration: 225ms;\n}\n@-webkit-keyframes fadein {\n    from { opacity: 0; }\n    to { opacity: 1; }\n}\n@-moz-keyframes fadein {\n    from { opacity: 0; }\n    to { opacity: 1; }\n}\n@keyframes fadein {\n    from { opacity: 0; }\n    to { opacity: 1; }\n}\n@-webkit-keyframes fadeout {\n    from { opacity: 1; }\n    to { opacity: 0; }\n}\n@-moz-keyframes fadeout {\n    from { opacity: 1; }\n    to { opacity: 0; }\n}\n@keyframes fadeout {\n    from { opacity: 1; }\n    to { opacity: 0; }\n}\n.fade.out {\n\topacity: 0;\n\t-webkit-animation-duration: 125ms;\n\t-webkit-animation-name: fadeout;\n\t-moz-animation-duration: 125ms;\n\t-moz-animation-name: fadeout;\n\tanimation-duration: 125ms;\n\tanimation-name: fadeout;\n}\n.fade.in {\n\topacity: 1;\n\t-webkit-animation-duration: 225ms;\n\t-webkit-animation-name: fadein;\n\t-moz-animation-duration: 225ms;\n\t-moz-animation-name: fadein;\n\tanimation-duration: 225ms;\n\tanimation-name: fadein;\n}\n.pop {\n\t-webkit-transform-origin: 50% 50%;\n\t-moz-transform-origin: 50% 50%;\n\ttransform-origin: 50% 50%;\n}\n.pop.in {\n\t-webkit-transform: scale(1);\n\t-webkit-animation-name: popin;\n\t-webkit-animation-duration: 350ms;\n\t-moz-transform: scale(1);\n\t-moz-animation-name: popin;\n\t-moz-animation-duration: 350ms;\n\ttransform: scale(1);\n\tanimation-name: popin;\n\tanimation-duration: 350ms;\n    opacity: 1;\n}\n.pop.out {\n\t-webkit-animation-name: fadeout;\n\t-webkit-animation-duration: 100ms;\n\t-moz-animation-name: fadeout;\n\t-moz-animation-duration: 100ms;\n\tanimation-name: fadeout;\n\tanimation-duration: 100ms;\n\topacity: 0;\n}\n.pop.in.reverse {\n\t-webkit-animation-name: fadein;\n\t-moz-animation-name: fadein;\n\tanimation-name: fadein;\n}\n.pop.out.reverse {\n\t-webkit-transform: scale(.8);\n\t-webkit-animation-name: popout;\n\t-moz-transform: scale(.8);\n\t-moz-animation-name: popout;\n\ttransform: scale(.8);\n\tanimation-name: popout;\n}\n@-webkit-keyframes popin {\n    from {\n        -webkit-transform: scale(.8);\n        opacity: 0;\n    }\n    to {\n        -webkit-transform: scale(1);\n        opacity: 1;\n    }\n}\n@-moz-keyframes popin {\n    from {\n        -moz-transform: scale(.8);\n        opacity: 0;\n    }\n    to {\n        -moz-transform: scale(1);\n        opacity: 1;\n    }\n}\n@keyframes popin {\n    from {\n        transform: scale(.8);\n        opacity: 0;\n    }\n    to {\n        transform: scale(1);\n        opacity: 1;\n    }\n}\n@-webkit-keyframes popout {\n    from {\n        -webkit-transform: scale(1);\n        opacity: 1;\n    }\n    to {\n        -webkit-transform: scale(.8);\n        opacity: 0;\n    }\n}\n@-moz-keyframes popout {\n    from {\n        -moz-transform: scale(1);\n        opacity: 1;\n    }\n    to {\n        -moz-transform: scale(.8);\n        opacity: 0;\n    }\n}\n@keyframes popout {\n    from {\n        transform: scale(1);\n        opacity: 1;\n    }\n    to {\n        transform: scale(.8);\n        opacity: 0;\n    }\n}\n/* keyframes for slidein from sides */\n@-webkit-keyframes slideinfromright {\n    from { -webkit-transform: translate3d(100%,0,0); }\n    to { -webkit-transform: translate3d(0,0,0); }\n}\n@-moz-keyframes slideinfromright {\n    from { -moz-transform: translateX(100%); }\n    to { -moz-transform: translateX(0); }\n}\n@keyframes slideinfromright {\n    from { transform: translateX(100%); }\n    to { transform: translateX(0); }\n}\n@-webkit-keyframes slideinfromleft {\n    from { -webkit-transform: translate3d(-100%,0,0); }\n    to { -webkit-transform: translate3d(0,0,0); }\n}\n@-moz-keyframes slideinfromleft {\n    from { -moz-transform: translateX(-100%); }\n    to { -moz-transform: translateX(0); }\n}\n@keyframes slideinfromleft {\n    from { transform: translateX(-100%); }\n    to { transform: translateX(0); }\n}\n/* keyframes for slideout to sides */\n@-webkit-keyframes slideouttoleft {\n    from { -webkit-transform: translate3d(0,0,0); }\n    to { -webkit-transform: translate3d(-100%,0,0); }\n}\n@-moz-keyframes slideouttoleft {\n    from { -moz-transform: translateX(0); }\n    to { -moz-transform: translateX(-100%); }\n}\n@keyframes slideouttoleft {\n    from { transform: translateX(0); }\n    to { transform: translateX(-100%); }\n}\n@-webkit-keyframes slideouttoright {\n    from { -webkit-transform: translate3d(0,0,0); }\n    to { -webkit-transform: translate3d(100%,0,0); }\n}\n@-moz-keyframes slideouttoright {\n    from { -moz-transform: translateX(0); }\n    to { -moz-transform: translateX(100%); }\n}\n@keyframes slideouttoright {\n    from { transform: translateX(0); }\n    to { transform: translateX(100%); }\n}\n.slide.out, .slide.in {\n\t-webkit-animation-timing-function: ease-out;\n\t-webkit-animation-duration: 350ms;\n\t-moz-animation-timing-function: ease-out;\n\t-moz-animation-duration: 350ms;\n\tanimation-timing-function: ease-out;\n\tanimation-duration: 350ms;\n}\n.slide.out {\n\t-webkit-transform: translate3d(-100%,0,0);\n\t-webkit-animation-name: slideouttoleft;\n\t-moz-transform: translateX(-100%);\n\t-moz-animation-name: slideouttoleft;\n\ttransform: translateX(-100%);\n\tanimation-name: slideouttoleft;\n}\n.slide.in {\n\t-webkit-transform: translate3d(0,0,0);\n\t-webkit-animation-name: slideinfromright;\n\t-moz-transform: translateX(0);\n\t-moz-animation-name: slideinfromright;\n\ttransform: translateX(0);\n\tanimation-name: slideinfromright;\n}\n.slide.out.reverse {\n\t-webkit-transform: translate3d(100%,0,0);\n\t-webkit-animation-name: slideouttoright;\n\t-moz-transform: translateX(100%);\n\t-moz-animation-name: slideouttoright;\n\ttransform: translateX(100%);\n\tanimation-name: slideouttoright;\n}\n.slide.in.reverse {\n\t-webkit-transform: translate3d(0,0,0);\n\t-webkit-animation-name: slideinfromleft;\n\t-moz-transform: translateX(0);\n\t-moz-animation-name: slideinfromleft;\n\ttransform: translateX(0);\n\tanimation-name: slideinfromleft;\n}\n.slidefade.out {\n\t-webkit-transform: translateX(-100%);\n\t-webkit-animation-name: slideouttoleft;\n\t-webkit-animation-duration: 225ms;\n\t-moz-transform: translateX(-100%);\n\t-moz-animation-name: slideouttoleft;\n\t-moz-animation-duration: 225ms;\n\ttransform: translateX(-100%);\n\tanimation-name: slideouttoleft;\n\tanimation-duration: 225ms;\n}\n.slidefade.in {\n\t-webkit-transform: translateX(0);\n\t-webkit-animation-name: fadein;\n\t-webkit-animation-duration: 200ms;\n\t-moz-transform: translateX(0);\n\t-moz-animation-name: fadein;\n\t-moz-animation-duration: 200ms;\n\ttransform: translateX(0);\n\tanimation-name: fadein;\n\tanimation-duration: 200ms;\n}\n.slidefade.out.reverse {\n\t-webkit-transform: translateX(100%);\n\t-webkit-animation-name: slideouttoright;\n\t-webkit-animation-duration: 200ms;\n\t-moz-transform: translateX(100%);\n\t-moz-animation-name: slideouttoright;\n\t-moz-animation-duration: 200ms;\n\ttransform: translateX(100%);\n\tanimation-name: slideouttoright;\n\tanimation-duration: 200ms;\n}\n.slidefade.in.reverse {\n\t-webkit-transform: translateX(0);\n\t-webkit-animation-name: fadein;\n\t-webkit-animation-duration: 200ms;\n\t-moz-transform: translateX(0);\n\t-moz-animation-name: fadein;\n\t-moz-animation-duration: 200ms;\n\ttransform: translateX(0);\n\tanimation-name: fadein;\n\tanimation-duration: 200ms;\n}\n/* slide down */\n.slidedown.out {\n\t-webkit-animation-name: fadeout;\n\t-webkit-animation-duration: 100ms;\n\t-moz-animation-name: fadeout;\n\t-moz-animation-duration: 100ms;\n\tanimation-name: fadeout;\n\tanimation-duration: 100ms;\n}\n.slidedown.in {\n\t-webkit-transform: translateY(0);\n\t-webkit-animation-name: slideinfromtop;\n\t-webkit-animation-duration: 250ms;\n\t-moz-transform: translateY(0);\n\t-moz-animation-name: slideinfromtop;\n\t-moz-animation-duration: 250ms;\n\ttransform: translateY(0);\n\tanimation-name: slideinfromtop;\n\tanimation-duration: 250ms;\n}\n.slidedown.in.reverse {\n\t-webkit-animation-name: fadein;\n\t-webkit-animation-duration: 150ms;\n\t-moz-animation-name: fadein;\n\t-moz-animation-duration: 150ms;\n\tanimation-name: fadein;\n\tanimation-duration: 150ms;\n}\n.slidedown.out.reverse {\n\t-webkit-transform: translateY(-100%);\n\t-webkit-animation-name: slideouttotop;\n\t-webkit-animation-duration: 200ms;\n\t-moz-transform: translateY(-100%);\n\t-moz-animation-name: slideouttotop;\n\t-moz-animation-duration: 200ms;\n\ttransform: translateY(-100%);\n\tanimation-name: slideouttotop;\n\tanimation-duration: 200ms;\n}\n@-webkit-keyframes slideinfromtop {\n    from { -webkit-transform: translateY(-100%); }\n    to { -webkit-transform: translateY(0); }\n}\n@-moz-keyframes slideinfromtop {\n    from { -moz-transform: translateY(-100%); }\n    to { -moz-transform: translateY(0); }\n}\n@keyframes slideinfromtop {\n    from { transform: translateY(-100%); }\n    to { transform: translateY(0); }\n}\n@-webkit-keyframes slideouttotop {\n    from { -webkit-transform: translateY(0); }\n    to { -webkit-transform: translateY(-100%); }\n}\n@-moz-keyframes slideouttotop {\n    from { -moz-transform: translateY(0); }\n    to { -moz-transform: translateY(-100%); }\n}\n@keyframes slideouttotop {\n    from { transform: translateY(0); }\n    to { transform: translateY(-100%); }\n}\n/* slide up */\n.slideup.out {\n\t-webkit-animation-name: fadeout;\n\t-webkit-animation-duration: 100ms;\n\t-moz-animation-name: fadeout;\n\t-moz-animation-duration: 100ms;\n\tanimation-name: fadeout;\n\tanimation-duration: 100ms;\n}\n.slideup.in {\n\t-webkit-transform: translateY(0);\n\t-webkit-animation-name: slideinfrombottom;\n\t-webkit-animation-duration: 250ms;\n\t-moz-transform: translateY(0);\n\t-moz-animation-name: slideinfrombottom;\n\t-moz-animation-duration: 250ms;\n\ttransform: translateY(0);\n\tanimation-name: slideinfrombottom;\n\tanimation-duration: 250ms;\n}\n.slideup.in.reverse {\n\t-webkit-animation-name: fadein;\n\t-webkit-animation-duration: 150ms;\n\t-moz-animation-name: fadein;\n\t-moz-animation-duration: 150ms;\n\tanimation-name: fadein;\n\tanimation-duration: 150ms;\n}\n.slideup.out.reverse {\n\t-webkit-transform: translateY(100%);\n\t-webkit-animation-name: slideouttobottom;\n\t-webkit-animation-duration: 200ms;\n\t-moz-transform: translateY(100%);\n\t-moz-animation-name: slideouttobottom;\n\t-moz-animation-duration: 200ms;\n\ttransform: translateY(100%);\n\tanimation-name: slideouttobottom;\n\tanimation-duration: 200ms;\n}\n@-webkit-keyframes slideinfrombottom {\n    from { -webkit-transform: translateY(100%); }\n    to { -webkit-transform: translateY(0); }\n}\n@-moz-keyframes slideinfrombottom {\n    from { -moz-transform: translateY(100%); }\n    to { -moz-transform: translateY(0); }\n}\n@keyframes slideinfrombottom {\n    from { transform: translateY(100%); }\n    to { transform: translateY(0); }\n}\n@-webkit-keyframes slideouttobottom {\n    from { -webkit-transform: translateY(0); }\n    to { -webkit-transform: translateY(100%); }\n}\n@-moz-keyframes slideouttobottom {\n    from { -moz-transform: translateY(0); }\n    to { -moz-transform: translateY(100%); }\n}\n@keyframes slideouttobottom {\n    from { transform: translateY(0); }\n    to { transform: translateY(100%); }\n}\n/* The properties in this rule are only necessary for the 'flip' transition.\n * We need specify the perspective to create a projection matrix. This will add\n * some depth as the element flips. The depth number represents the distance of\n * the viewer from the z-plane. According to the CSS3 spec, 1000 is a moderate\n * value.\n */\n.viewport-flip {\n\t-webkit-perspective: 1000;\n\t-moz-perspective: 1000;\n\tperspective: 1000;\n\tposition: absolute;\n}\n.flip {\n\t-webkit-backface-visibility: hidden;\n\t-webkit-transform: translateX(0); /* Needed to work around an iOS 3.1 bug that causes listview thumbs to disappear when -webkit-visibility:hidden is used. */\n\t-moz-backface-visibility: hidden;\n\t-moz-transform: translateX(0);\n\tbackface-visibility: hidden;\n\ttransform: translateX(0);\n}\n.flip.out {\n\t-webkit-transform: rotateY(-90deg) scale(.9);\n\t-webkit-animation-name: flipouttoleft;\n\t-webkit-animation-duration: 175ms;\n\t-moz-transform: rotateY(-90deg) scale(.9);\n\t-moz-animation-name: flipouttoleft;\n\t-moz-animation-duration: 175ms;\n\ttransform: rotateY(-90deg) scale(.9);\n\tanimation-name: flipouttoleft;\n\tanimation-duration: 175ms;\n}\n.flip.in {\n\t-webkit-animation-name: flipintoright;\n\t-webkit-animation-duration: 225ms;\n\t-moz-animation-name: flipintoright;\n\t-moz-animation-duration: 225ms;\n\tanimation-name: flipintoright;\n\tanimation-duration: 225ms;\n}\n.flip.out.reverse {\n\t-webkit-transform: rotateY(90deg) scale(.9);\n\t-webkit-animation-name: flipouttoright;\n\t-moz-transform: rotateY(90deg) scale(.9);\n\t-moz-animation-name: flipouttoright;\n\ttransform: rotateY(90deg) scale(.9);\n\tanimation-name: flipouttoright;\n}\n.flip.in.reverse {\n\t-webkit-animation-name: flipintoleft;\n\t-moz-animation-name: flipintoleft;\n\tanimation-name: flipintoleft;\n}\n@-webkit-keyframes flipouttoleft {\n    from { -webkit-transform: rotateY(0); }\n    to { -webkit-transform: rotateY(-90deg) scale(.9); }\n}\n@-moz-keyframes flipouttoleft {\n    from { -moz-transform: rotateY(0); }\n    to { -moz-transform: rotateY(-90deg) scale(.9); }\n}\n@keyframes flipouttoleft {\n    from { transform: rotateY(0); }\n    to { transform: rotateY(-90deg) scale(.9); }\n}\n@-webkit-keyframes flipouttoright {\n    from { -webkit-transform: rotateY(0) ; }\n    to { -webkit-transform: rotateY(90deg) scale(.9); }\n}\n@-moz-keyframes flipouttoright {\n    from { -moz-transform: rotateY(0); }\n    to { -moz-transform: rotateY(90deg) scale(.9); }\n}\n@keyframes flipouttoright {\n    from { transform: rotateY(0); }\n    to { transform: rotateY(90deg) scale(.9); }\n}\n@-webkit-keyframes flipintoleft {\n    from { -webkit-transform: rotateY(-90deg) scale(.9); }\n    to { -webkit-transform: rotateY(0); }\n}\n@-moz-keyframes flipintoleft {\n    from { -moz-transform: rotateY(-90deg) scale(.9); }\n    to { -moz-transform: rotateY(0); }\n}\n@keyframes flipintoleft {\n    from { transform: rotateY(-90deg) scale(.9); }\n    to { transform: rotateY(0); }\n}\n@-webkit-keyframes flipintoright {\n    from { -webkit-transform: rotateY(90deg) scale(.9); }\n    to { -webkit-transform: rotateY(0); }\n}\n@-moz-keyframes flipintoright {\n    from { -moz-transform: rotateY(90deg) scale(.9); }\n    to { -moz-transform: rotateY(0); }\n}\n@keyframes flipintoright {\n    from { transform: rotateY(90deg) scale(.9); }\n    to { transform: rotateY(0); }\n}\n/* The properties in this rule are only necessary for the 'flip' transition.\n * We need specify the perspective to create a projection matrix. This will add\n * some depth as the element flips. The depth number represents the distance of\n * the viewer from the z-plane. According to the CSS3 spec, 1000 is a moderate\n * value.\n */\n.viewport-turn {\n\t-webkit-perspective: 200px;\n\t-moz-perspective: 200px;\n\t-ms-perspective: 200px;\n\tperspective: 200px;\n\tposition: absolute;\n}\n.turn {\n\t-webkit-backface-visibility: hidden;\n\t-webkit-transform: translateX(0); /* Needed to work around an iOS 3.1 bug that causes listview thumbs to disappear when -webkit-visibility:hidden is used. */\n\t-webkit-transform-origin: 0;\n\t\n\t-moz-backface-visibility: hidden;\n\t-moz-transform: translateX(0);\n\t-moz-transform-origin: 0;\n\t\n\tbackface-visibility :hidden;\n\ttransform: translateX(0);\n\ttransform-origin: 0;\n}\n.turn.out {\n\t-webkit-transform: rotateY(-90deg) scale(.9);\n\t-webkit-animation-name: flipouttoleft;\n\t-webkit-animation-duration: 125ms;\n\t-moz-transform: rotateY(-90deg) scale(.9);\n\t-moz-animation-name: flipouttoleft;\n\t-moz-animation-duration: 125ms;\n\ttransform: rotateY(-90deg) scale(.9);\n\tanimation-name: flipouttoleft;\n\tanimation-duration: 125ms;\n}\n.turn.in {\n\t-webkit-animation-name: flipintoright;\n\t-webkit-animation-duration: 250ms;\n\t-moz-animation-name: flipintoright;\n\t-moz-animation-duration: 250ms;\n\tanimation-name: flipintoright;\n\tanimation-duration: 250ms;\n\t\n}\n.turn.out.reverse {\n\t-webkit-transform: rotateY(90deg) scale(.9);\n\t-webkit-animation-name: flipouttoright;\n\t-moz-transform: rotateY(90deg) scale(.9);\n\t-moz-animation-name: flipouttoright;\n\ttransform: rotateY(90deg) scale(.9);\n\tanimation-name: flipouttoright;\n}\n.turn.in.reverse {\n\t-webkit-animation-name: flipintoleft;\n\t-moz-animation-name: flipintoleft;\n\tanimation-name: flipintoleft;\n}\n@-webkit-keyframes flipouttoleft {\n    from { -webkit-transform: rotateY(0); }\n    to { -webkit-transform: rotateY(-90deg) scale(.9); }\n}\n@-moz-keyframes flipouttoleft {\n    from { -moz-transform: rotateY(0); }\n    to { -moz-transform: rotateY(-90deg) scale(.9); }\n}\n@keyframes flipouttoleft {\n    from { transform: rotateY(0); }\n    to { transform: rotateY(-90deg) scale(.9); }\n}\n@-webkit-keyframes flipouttoright {\n    from { -webkit-transform: rotateY(0) ; }\n    to { -webkit-transform: rotateY(90deg) scale(.9); }\n}\n@-moz-keyframes flipouttoright {\n    from { -moz-transform: rotateY(0); }\n    to { -moz-transform: rotateY(90deg) scale(.9); }\n}\n@keyframes flipouttoright {\n    from { transform: rotateY(0); }\n    to { transform: rotateY(90deg) scale(.9); }\n}\n@-webkit-keyframes flipintoleft {\n    from { -webkit-transform: rotateY(-90deg) scale(.9); }\n    to { -webkit-transform: rotateY(0); }\n}\n@-moz-keyframes flipintoleft {\n    from { -moz-transform: rotateY(-90deg) scale(.9); }\n    to { -moz-transform: rotateY(0); }\n}\n@keyframes flipintoleft {\n    from { transform: rotateY(-90deg) scale(.9); }\n    to { transform: rotateY(0); }\n}\n@-webkit-keyframes flipintoright {\n    from { -webkit-transform: rotateY(90deg) scale(.9); }\n    to { -webkit-transform: rotateY(0); }\n}\n@-moz-keyframes flipintoright {\n    from { -moz-transform: rotateY(90deg) scale(.9); }\n    to { -moz-transform: rotateY(0); }\n}\n@keyframes flipintoright {\n    from { transform: rotateY(90deg) scale(.9); }\n    to { transform: rotateY(0); }\n}\n/* flow transition */\n.flow {\n\t-webkit-transform-origin: 50% 30%;\n\t-webkit-box-shadow: 0 0 20px rgba(0,0,0,.4);\n\t-moz-transform-origin: 50% 30%;\t\n\t-moz-box-shadow: 0 0 20px rgba(0,0,0,.4);\n\ttransform-origin: 50% 30%;\t\n\tbox-shadow: 0 0 20px rgba(0,0,0,.4);\n}\n.ui-dialog.flow {\n\t-webkit-transform-origin: none;\n\t-webkit-box-shadow: none;\n\t-moz-transform-origin: none;\t\n\t-moz-box-shadow: none;\n\ttransform-origin: none;\t\n\tbox-shadow: none;\n}\n.flow.out {\n\t-webkit-transform: translateX(-100%) scale(.7);\n\t-webkit-animation-name: flowouttoleft;\n\t-webkit-animation-timing-function: ease;\n\t-webkit-animation-duration: 350ms;\n\t-moz-transform: translateX(-100%) scale(.7);\n\t-moz-animation-name: flowouttoleft;\n\t-moz-animation-timing-function: ease;\n\t-moz-animation-duration: 350ms;\n\ttransform: translateX(-100%) scale(.7);\n\tanimation-name: flowouttoleft;\n\tanimation-timing-function: ease;\n\tanimation-duration: 350ms;\n}\n.flow.in {\n\t-webkit-transform: translateX(0) scale(1);\n\t-webkit-animation-name: flowinfromright;\n\t-webkit-animation-timing-function: ease;\n\t-webkit-animation-duration: 350ms;\n\t-moz-transform: translateX(0) scale(1);\n\t-moz-animation-name: flowinfromright;\n\t-moz-animation-timing-function: ease;\n\t-moz-animation-duration: 350ms;\n\ttransform: translateX(0) scale(1);\n\tanimation-name: flowinfromright;\n\tanimation-timing-function: ease;\n\tanimation-duration: 350ms;\n}\n.flow.out.reverse {\n\t-webkit-transform: translateX(100%);\n\t-webkit-animation-name: flowouttoright;\n\t-moz-transform: translateX(100%);\n\t-moz-animation-name: flowouttoright;\n\ttransform: translateX(100%);\n\tanimation-name: flowouttoright;\n}\n.flow.in.reverse {\n\t-webkit-animation-name: flowinfromleft;\n\t-moz-animation-name: flowinfromleft;\n\tanimation-name: flowinfromleft;\n}\n@-webkit-keyframes flowouttoleft {\n    0% { -webkit-transform: translateX(0) scale(1); }\n\t60%, 70% { -webkit-transform: translateX(0) scale(.7); }\n    100% { -webkit-transform: translateX(-100%) scale(.7); }\n}\n@-moz-keyframes flowouttoleft {\n    0% { -moz-transform: translateX(0) scale(1); }\n\t60%, 70% { -moz-transform: translateX(0) scale(.7); }\n    100% { -moz-transform:  translateX(-100%) scale(.7); }\n}\n@keyframes flowouttoleft {\n    0% { transform: translateX(0) scale(1); }\n\t60%, 70% { transform: translateX(0) scale(.7); }\n    100% { transform:  translateX(-100%) scale(.7); }\n}\n@-webkit-keyframes flowouttoright {\n    0% { -webkit-transform: translateX(0) scale(1); }\n\t60%, 70% { -webkit-transform: translateX(0) scale(.7); }\n    100% { -webkit-transform:  translateX(100%) scale(.7); }\n}\n@-moz-keyframes flowouttoright {\n    0% { -moz-transform: translateX(0) scale(1); }\n\t60%, 70% { -moz-transform: translateX(0) scale(.7); }\n    100% { -moz-transform:  translateX(100%) scale(.7); }\n}\n@keyframes flowouttoright {\n    0% { transform: translateX(0) scale(1); }\n\t60%, 70% { transform: translateX(0) scale(.7); }\n    100% { transform:  translateX(100%) scale(.7); }\n}\n@-webkit-keyframes flowinfromleft {\n    0% { -webkit-transform: translateX(-100%) scale(.7); }\n\t30%, 40% { -webkit-transform: translateX(0) scale(.7); }\n    100% { -webkit-transform: translateX(0) scale(1); }\n}\n@-moz-keyframes flowinfromleft {\n    0% { -moz-transform: translateX(-100%) scale(.7); }\n\t30%, 40% { -moz-transform: translateX(0) scale(.7); }\n    100% { -moz-transform: translateX(0) scale(1); }\n}\n@keyframes flowinfromleft {\n    0% { transform: translateX(-100%) scale(.7); }\n\t30%, 40% { transform: translateX(0) scale(.7); }\n    100% { transform: translateX(0) scale(1); }\n}\n@-webkit-keyframes flowinfromright {\n    0% { -webkit-transform: translateX(100%) scale(.7); }\n\t30%, 40% { -webkit-transform: translateX(0) scale(.7); }\n    100% { -webkit-transform: translateX(0) scale(1); }\n}\n@-moz-keyframes flowinfromright {\n    0% { -moz-transform: translateX(100%) scale(.7); }\n\t30%, 40% { -moz-transform: translateX(0) scale(.7); }\n    100% { -moz-transform: translateX(0) scale(1); }\n}\n@keyframes flowinfromright {\n    0% { transform: translateX(100%) scale(.7); }\n\t30%, 40% { transform: translateX(0) scale(.7); }\n    100% { transform: translateX(0) scale(1); }\n}\n.ui-field-contain,\n.ui-mobile fieldset.ui-field-contain {\n\tdisplay: block;\n\tposition: relative;\n\toverflow: visible;\n\tclear: both;\n\tpadding: .8em 0;\n}\n.ui-field-contain > label ~ [class*=\"ui-\"],\n.ui-field-contain .ui-controlgroup-controls {\n\tmargin: 0;\n}\n.ui-field-contain:last-child {\n\tborder-bottom-width: 0;\n}\n@media (min-width: 28em) {\n\t.ui-field-contain,\n\t.ui-mobile fieldset.ui-field-contain {\n\t\tpadding: 0;\n\t\tmargin: 1em 0;\n\t\tborder-bottom-width: 0;\n\t}\n\t.ui-field-contain:before,\n\t.ui-field-contain:after {\n\t\tcontent: \"\";\n\t\tdisplay: table;\n\t}\n\t.ui-field-contain:after {\n\t\tclear: both;\n\t}\n\t.ui-field-contain > label,\n\t.ui-field-contain .ui-controlgroup-label,\n\t.ui-field-contain > .ui-rangeslider > label {\n\t\tfloat: left;\n\t\twidth: 20%;\n\t\tmargin: .5em 2% 0 0;\n\t}\n\t.ui-popup .ui-field-contain > label,\n\t.ui-popup .ui-field-contain .ui-controlgroup-label,\n\t.ui-popup .ui-field-contain > .ui-rangeslider > label {\n\t\tfloat: none;\n\t\twidth: auto;\n\t\tmargin: 0 0 .4em;\n\t}\n\t.ui-field-contain > label ~ [class*=\"ui-\"],\n\t.ui-field-contain .ui-controlgroup-controls {\n\t\tfloat: left;\n\t\twidth: 78%;\n\t\t-webkit-box-sizing: border-box;\n\t\t-moz-box-sizing: border-box;\n\t\tbox-sizing: border-box;\n\t}\n\t/* ui-hide-label deprecated in 1.4. TODO: Remove in 1.5 */\n\t.ui-hide-label > label ~ [class*=\"ui-\"],\n\t.ui-hide-label .ui-controlgroup-controls,\n\t.ui-popup .ui-field-contain > label ~ [class*=\"ui-\"],\n\t.ui-popup .ui-field-contain .ui-controlgroup-controls {\n\t\tfloat: none;\n\t\twidth: 100%;\n\t}\n\t.ui-field-contain > label ~ .ui-btn-inline {\n\t\twidth: auto;\n\t\tmargin-right: .625em;\n\t}\n\t.ui-field-contain > label ~ .ui-btn-inline.ui-btn-icon-notext {\n\t\twidth: 1.75em;\n\t}\n}\n/* content configurations. */\n.ui-grid-a,\n.ui-grid-b,\n.ui-grid-c,\n.ui-grid-d,\n.ui-grid-solo {\n\toverflow: hidden;\n}\n.ui-block-a,\n.ui-block-b,\n.ui-block-c,\n.ui-block-d,\n.ui-block-e {\n\tmargin: 0;\n\tpadding: 0;\n\tborder: 0;\n\tfloat: left;\n\tmin-height: 1px;\n\t-webkit-box-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\tbox-sizing: border-box;\n}\n/* force new row */\n.ui-block-a {\n\tclear: left;\n}\nul.ui-grid-a,\nul.ui-grid-b,\nul.ui-grid-c,\nul.ui-grid-d,\nul.ui-grid-solo,\nli.ui-block-a,\nli.ui-block-b,\nli.ui-block-c,\nli.ui-block-d,\nli.ui-block-e {\n\tmargin-left: 0;\n\tmargin-right: 0;\n\tpadding: 0;\n\tlist-style: none;\n}\n/* No margin in grids for 100% width button elements until we can use max-width: fill-available; */\n[class*=\"ui-block-\"] > button.ui-btn {\n\tmargin-right: 0;\n\tmargin-left: 0;\n}\n[class*=\"ui-block-\"] > .ui-btn,\n[class*=\"ui-block-\"] > .ui-select,\n[class*=\"ui-block-\"] > .ui-checkbox,\n[class*=\"ui-block-\"] > .ui-radio,\n[class*=\"ui-block-\"] > button.ui-btn-inline,\n[class*=\"ui-block-\"] > button.ui-btn-icon-notext,\n.ui-header [class*=\"ui-block-\"] > button.ui-btn,\n.ui-footer [class*=\"ui-block-\"] > button.ui-btn {\n\tmargin-right: .3125em;\n\tmargin-left: .3125em;\n}\n.ui-grid-a > .ui-block-a,\n.ui-grid-a > .ui-block-b {\n\t/* width: 49.95%; IE7 */\n\t/* margin-right: -.5px; BB5 */\n\twidth: 50%;\n}\n.ui-grid-b > .ui-block-a,\n.ui-grid-b > .ui-block-b,\n.ui-grid-b > .ui-block-c {\n\t/* width: 33.25%; IE7 */\n\t/* margin-right: -.5px; BB5 */\n\twidth: 33.333%;\n}\n.ui-grid-c > .ui-block-a,\n.ui-grid-c > .ui-block-b,\n.ui-grid-c > .ui-block-c,\n.ui-grid-c > .ui-block-d {\n\t/* width: 24.925%; IE7 */\n\t/* margin-right: -.5px; BB5 */\n\twidth: 25%;\n}\n.ui-grid-d > .ui-block-a,\n.ui-grid-d > .ui-block-b,\n.ui-grid-d > .ui-block-c,\n.ui-grid-d > .ui-block-d,\n.ui-grid-d > .ui-block-e {\n\t/* width: 19.925%; IE7 */\n\twidth: 20%;\n}\n.ui-grid-solo > .ui-block-a {\n\twidth: 100%;\n\tfloat: none; \n}\n/* preset breakpoint to switch to stacked grid styles below 35em (560px) */\n@media (max-width: 35em) {\n\t.ui-responsive > .ui-block-a,\n\t.ui-responsive > .ui-block-b,\n\t.ui-responsive > .ui-block-c,\n\t.ui-responsive > .ui-block-d,\n\t.ui-responsive > .ui-block-e {\n\t\twidth: 100%; \n\t\tfloat: none; \n\t}\n}\n/* fixed page header & footer configuration */\n.ui-header-fixed,\n.ui-footer-fixed {\n\tleft: 0;\n\tright: 0;\n\twidth: 100%;\n\tposition: fixed;\n\tz-index: 1000;\n}\n.ui-header-fixed {\n\ttop: -1px;\n\tpadding-top: 1px;\n}\n.ui-header-fixed.ui-fixed-hidden {\n\ttop: 0;\n\tpadding-top: 0;\n}\n.ui-header-fixed .ui-btn-left,\n.ui-header-fixed .ui-btn-right {\n\tmargin-top: 1px;\n}\n.ui-header-fixed.ui-fixed-hidden .ui-btn-left,\n.ui-header-fixed.ui-fixed-hidden .ui-btn-right {\n\tmargin-top: 0;\n}\n.ui-footer-fixed {\n\tbottom: -1px;\n\tpadding-bottom: 1px;\n}\n.ui-footer-fixed.ui-fixed-hidden {\n\tbottom: 0;\n\tpadding-bottom: 0;\n}\n.ui-header-fullscreen,\n.ui-footer-fullscreen {\n\tfilter: Alpha(Opacity=90);\n\topacity: .9;\n}\n/* updatePagePadding() will update the padding to actual height of header and footer. */\n.ui-page-header-fixed {\n\tpadding-top: 2.8125em;\n}\n.ui-page-footer-fixed {\n\tpadding-bottom: 2.8125em;\n}\n.ui-page-header-fullscreen > .ui-content,\n.ui-page-footer-fullscreen > .ui-content {\n\tpadding: 0;\n}\n.ui-fixed-hidden {\n\tposition: absolute;\n}\n/* Tap toggle: hide external fixed footer. See issue #6604 */\n.ui-footer-fixed.ui-fixed-hidden {\n  display: none;\n}\n.ui-page .ui-footer-fixed.ui-fixed-hidden {\n  display: block\n}\n.ui-page-header-fullscreen .ui-fixed-hidden,\n.ui-page-footer-fullscreen .ui-fixed-hidden {\n\tposition: absolute !important;\n\theight: 1px;\n\twidth: 1px;\n\toverflow: hidden;\n\tclip: rect(1px,1px,1px,1px);\n}\n.ui-header-fixed .ui-btn,\n.ui-footer-fixed .ui-btn { \n\tz-index: 10;\n}\n/* workarounds for other widgets */\n.ui-android-2x-fixed .ui-li-has-thumb {\n\t-webkit-transform: translate3d(0,0,0);\n}\n.ui-navbar {\n\tmax-width: 100%;\n}\n.ui-navbar ul:before,\n.ui-navbar ul:after {\n\tcontent: \"\";\n\tdisplay: table;\n}\n.ui-navbar ul:after {\n\tclear: both;\n}\n.ui-navbar ul {\n\tlist-style: none;\n\tmargin: 0;\n\tpadding: 0;\n\tposition: relative;\n\tdisplay: block;\n\tborder: 0;\n\tmax-width: 100%;\n\toverflow: visible;\n}\n.ui-navbar li .ui-btn {\n\tfont-size: 12.5px;\n\tdisplay: block;\n\tmargin: 0;\n\tborder-right-width: 0;\n}\n.ui-header .ui-navbar li button.ui-btn,\n.ui-footer .ui-navbar li button.ui-btn {\n\tmargin: 0;\n\twidth: 100%;\n}\n.ui-navbar .ui-btn:focus {\n\tz-index: 1;\n}\n/* fixes gaps caused by subpixel problem */\n.ui-navbar li:last-child .ui-btn {\n\tmargin-right: -4px;\n}\n.ui-navbar li:last-child .ui-btn:after {\n\tmargin-right: 4px;\n}\n.ui-content .ui-navbar li:last-child .ui-btn,\n.ui-content .ui-navbar .ui-grid-duo .ui-block-b .ui-btn {\n\tborder-right-width: 1px;\n\tmargin-right: 0;\n}\n.ui-content .ui-navbar li:last-child .ui-btn:after,\n.ui-content .ui-navbar .ui-grid-duo .ui-block-b .ui-btn:after {\n\tmargin-right: 0;\n}\n.ui-navbar .ui-grid-duo .ui-block-a:last-child .ui-btn {\n\tborder-right-width: 1px;\n\tmargin-right: -1px;\n}\n.ui-navbar .ui-grid-duo .ui-block-a:last-child .ui-btn:after {\n\tmargin-right: 1px;\n}\n.ui-navbar .ui-grid-duo .ui-btn {\n\tborder-top-width: 0;\n}\n.ui-navbar .ui-grid-duo .ui-block-a:first-child .ui-btn,\n.ui-navbar .ui-grid-duo .ui-block-a:first-child + .ui-block-b .ui-btn {\n\tborder-top-width: 1px;\n}\n.ui-header .ui-navbar .ui-btn,\n.ui-footer .ui-navbar .ui-btn {\n\tborder-top-width: 0;\n\tborder-bottom-width: 0;\n}\n.ui-header .ui-navbar .ui-grid-duo .ui-block-a:first-child .ui-btn,\n.ui-footer .ui-navbar .ui-grid-duo .ui-block-a:first-child .ui-btn,\n.ui-header .ui-navbar .ui-grid-duo .ui-block-a:first-child + .ui-block-b .ui-btn,\n.ui-footer .ui-navbar .ui-grid-duo .ui-block-a:first-child + .ui-block-b .ui-btn {\n\tborder-top-width: 0;\n}\n.ui-header .ui-title ~ .ui-navbar .ui-btn,\n.ui-footer .ui-title ~ .ui-navbar .ui-btn,\n.ui-header .ui-navbar .ui-grid-duo .ui-btn,\n.ui-footer .ui-navbar .ui-grid-duo .ui-btn,\n.ui-header .ui-title ~ .ui-navbar .ui-grid-duo .ui-block-a:first-child .ui-btn,\n.ui-footer .ui-title ~ .ui-navbar .ui-grid-duo .ui-block-a:first-child .ui-btn,\n.ui-header .ui-title ~ .ui-navbar .ui-grid-duo .ui-block-a:first-child + .ui-block-b .ui-btn,\n.ui-footer .ui-title ~ .ui-navbar .ui-grid-duo .ui-block-a:first-child + .ui-block-b .ui-btn {\n\tborder-top-width: 1px;\n}\n/* Hide the native input element */\n.ui-input-btn input {\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n\twidth: 100%;\n\theight: 100%;\n\tpadding: 0;\n\tborder: 0;\n\toutline: 0;\n\t-webkit-border-radius: inherit;\n\tborder-radius: inherit;\t\n\t-webkit-appearance: none;\n\t-moz-appearance: none;\n\tcursor: pointer;\n\tbackground: #fff;\n\tbackground: rgba(255,255,255,0);\n\tfilter: Alpha(Opacity=0);\n\topacity: .1;\n\tfont-size: 1px;\n\ttext-indent: -9999px;\n\tz-index: 2;\n}\n/* Fixes IE/WP filter alpha opacity bugs */\n.ui-input-btn.ui-state-disabled input {\n\tposition: absolute !important;\n\theight: 1px;\n\twidth: 1px;\n\toverflow: hidden;\n\tclip: rect(1px,1px,1px,1px);\n}\n.ui-collapsible {\n\tmargin: 0 -1em;\n}\n.ui-collapsible-inset,\n.ui-collapsible-set {\n\tmargin: .5em 0;\n}\n.ui-collapsible-heading {\n\tdisplay: block;\n\tmargin: 0;\n\tpadding: 0;\n\tposition: relative;\n}\n.ui-collapsible-heading .ui-btn {\n\ttext-align: left;\n\tmargin: 0;\n\tborder-left-width: 0;\n\tborder-right-width: 0;\n}\n.ui-collapsible-heading .ui-btn-icon-top,\n.ui-collapsible-heading .ui-btn-icon-bottom {\n\ttext-align: center;\n}\n.ui-collapsible-inset .ui-collapsible-heading .ui-btn {\n\tborder-right-width: 1px;\n\tborder-left-width: 1px;\n}\n.ui-collapsible-collapsed + .ui-collapsible:not(.ui-collapsible-inset) > .ui-collapsible-heading .ui-btn {\n\tborder-top-width: 0;\n}\n.ui-collapsible-set .ui-collapsible:not(.ui-collapsible-inset) .ui-collapsible-heading .ui-btn {\n\tborder-top-width: 1px;\n}\n.ui-collapsible-heading-status {\n\tposition: absolute !important;\n\theight: 1px;\n\twidth: 1px;\n\toverflow: hidden;\n\tclip: rect(1px,1px,1px,1px);\n}\n.ui-collapsible-content {\n\tdisplay: block;\n\tmargin: 0;\t\n\tpadding: .5em 1em;\n}\n.ui-collapsible-themed-content .ui-collapsible-content {\n\tborder-left-width: 0;\n\tborder-right-width: 0;\n\tborder-top-width: 0;\n\tborder-bottom-width: 1px;\n\tborder-style: solid;\n}\n.ui-collapsible-inset.ui-collapsible-themed-content .ui-collapsible-content {\n\tborder-left-width: 1px;\n\tborder-right-width: 1px;\n}\n.ui-collapsible-inset .ui-collapsible-content {\n\tmargin: 0;\n}\n.ui-collapsible-content-collapsed {\n\tdisplay: none;\n}\n.ui-collapsible-set > .ui-collapsible.ui-corner-all {\n\t-webkit-border-radius: 0;\n\tborder-radius: 0;\n}\n.ui-collapsible-heading,\n.ui-collapsible-heading > .ui-btn {\n\t-webkit-border-radius: inherit;\t\n\tborder-radius: inherit;\t\n}\n.ui-collapsible-set .ui-collapsible.ui-first-child {\n\t-webkit-border-top-right-radius: inherit;\t\n\tborder-top-right-radius: inherit;\n\t-webkit-border-top-left-radius: inherit;\t\n\tborder-top-left-radius: inherit;\t\t\n}\n.ui-collapsible-content,\n.ui-collapsible-set .ui-collapsible.ui-last-child {\n\t-webkit-border-bottom-right-radius: inherit;\t\n\tborder-bottom-right-radius: inherit;\n\t-webkit-border-bottom-left-radius: inherit;\t\n\tborder-bottom-left-radius: inherit;\t\t\n}\n.ui-collapsible-themed-content:not(.ui-collapsible-collapsed) > .ui-collapsible-heading {\n\t-webkit-border-bottom-right-radius: 0;\t\n\tborder-bottom-right-radius: 0;\n\t-webkit-border-bottom-left-radius: 0;\t\n\tborder-bottom-left-radius: 0;\t\t\n}\n.ui-collapsible-set .ui-collapsible {\n\tmargin: -1px -1em 0;\n}\n.ui-collapsible-set .ui-collapsible-inset {\n\tmargin: -1px 0 0;\n}\n.ui-collapsible-set .ui-collapsible.ui-first-child {\n\tmargin-top: 0;\n}\n.ui-controlgroup,\nfieldset.ui-controlgroup {\n\tpadding: 0;\n\tmargin: .5em 0;\n}\n.ui-field-contain .ui-controlgroup,\n.ui-field-contain fieldset.ui-controlgroup {\n\tmargin: 0;\n}\n.ui-mini .ui-controlgroup-label {\n\tfont-size: 16px;\n}\n.ui-controlgroup.ui-mini .ui-btn-icon-notext,\n.ui-controlgroup .ui-mini.ui-btn-icon-notext {\n\tfont-size: inherit;\n}\n.ui-controlgroup-controls .ui-btn,\n.ui-controlgroup-controls .ui-checkbox,\n.ui-controlgroup-controls .ui-radio,\n.ui-controlgroup-controls .ui-select {\n\tmargin: 0;\n}\n.ui-controlgroup-controls .ui-btn:focus,\n.ui-controlgroup-controls .ui-btn.ui-focus {\n\tz-index: 1;\n}\n.ui-controlgroup-controls li {\n\tlist-style: none;\n}\n.ui-controlgroup-horizontal .ui-controlgroup-controls {\n\tdisplay: inline-block;\n\tvertical-align: middle;\n}\n.ui-controlgroup-horizontal .ui-controlgroup-controls:before,\n.ui-controlgroup-horizontal .ui-controlgroup-controls:after {\n\tcontent: \"\";\n\tdisplay: table;\n}\n.ui-controlgroup-horizontal .ui-controlgroup-controls:after {\n\tclear: both;\n}\n.ui-controlgroup-horizontal .ui-controlgroup-controls > .ui-btn,\n.ui-controlgroup-horizontal .ui-controlgroup-controls li > .ui-btn,\n.ui-controlgroup-horizontal .ui-controlgroup-controls .ui-checkbox,\n.ui-controlgroup-horizontal .ui-controlgroup-controls .ui-radio,\n.ui-controlgroup-horizontal .ui-controlgroup-controls .ui-select {\n\tfloat: left;\n\tclear: none;\n}\n.ui-controlgroup-horizontal .ui-controlgroup-controls button.ui-btn,\n.ui-controlgroup-controls .ui-btn-icon-notext {\n\twidth: auto;\n}\n.ui-controlgroup-horizontal .ui-controlgroup-controls .ui-btn-icon-notext,\n.ui-controlgroup-horizontal .ui-controlgroup-controls button.ui-btn-icon-notext {\n\twidth: 1.5em;\n}\n .ui-controlgroup-controls .ui-btn-icon-notext {\n\theight: auto;\n\tpadding: .7em 1em;\n}\n.ui-controlgroup-vertical .ui-controlgroup-controls .ui-btn {\n\tborder-bottom-width: 0;\n}\n.ui-controlgroup-vertical .ui-controlgroup-controls .ui-btn.ui-last-child {\n\tborder-bottom-width: 1px;\n}\n.ui-controlgroup-horizontal .ui-controlgroup-controls .ui-btn {\n\tborder-right-width: 0;\n}\n.ui-controlgroup-horizontal .ui-controlgroup-controls .ui-btn.ui-last-child {\n\tborder-right-width: 1px;\n}\n.ui-controlgroup-controls .ui-btn-corner-all,\n.ui-controlgroup-controls .ui-btn.ui-corner-all {\n\t-webkit-border-radius: 0;\n\tborder-radius: 0;\n}\n.ui-controlgroup-controls,\n.ui-controlgroup-controls .ui-radio,\n.ui-controlgroup-controls .ui-checkbox,\n.ui-controlgroup-controls .ui-select,\n.ui-controlgroup-controls li {\n\t-webkit-border-radius: inherit;\n\tborder-radius: inherit;\n}\n.ui-controlgroup-vertical .ui-btn.ui-first-child {\n\t-webkit-border-top-left-radius: inherit;\n\tborder-top-left-radius: inherit;\n\t-webkit-border-top-right-radius: inherit;\n\tborder-top-right-radius: inherit;\n}\n.ui-controlgroup-vertical .ui-btn.ui-last-child {\n\t-webkit-border-bottom-left-radius: inherit;\n\tborder-bottom-left-radius: inherit;\n\t-webkit-border-bottom-right-radius: inherit;\n\tborder-bottom-right-radius: inherit;\n}\n.ui-controlgroup-horizontal .ui-btn.ui-first-child {\n\t-webkit-border-top-left-radius: inherit;\n\tborder-top-left-radius: inherit;\n\t-webkit-border-bottom-left-radius: inherit;\n\tborder-bottom-left-radius: inherit;\n}\n.ui-controlgroup-horizontal .ui-btn.ui-last-child {\n\t-webkit-border-top-right-radius: inherit;\n\tborder-top-right-radius: inherit;\n\t-webkit-border-bottom-right-radius: inherit;\n\tborder-bottom-right-radius: inherit;\n}\n.ui-controlgroup-controls a.ui-shadow:not(:focus),\n.ui-controlgroup-controls button.ui-shadow:not(:focus),\n.ui-controlgroup-controls div.ui-shadow:not(.ui-focus) {\n\t-moz-box-shadow: none;\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n}\n/* Fixes legend not wrapping on IE10 */\n.ui-controlgroup-label legend {\n\tmax-width: 100%;\n}\n.ui-controlgroup-controls > label {\n\tposition: absolute !important;\n\theight: 1px;\n\twidth: 1px;\n\toverflow: hidden;\n\tclip: rect(1px,1px,1px,1px);\n}\n.ui-dialog {\n\t background: none !important; /* this is to ensure that dialog theming does not apply (by default at least) on the page div */\n}\n.ui-dialog-contain {\n\twidth: 92.5%;\n\tmax-width: 500px;\n\tmargin: 10% auto 1em auto;\n\tpadding: 0;\n\tposition: relative;\n\ttop: -1em;\n}\n.ui-dialog-contain > .ui-header, \n.ui-dialog-contain > .ui-content, \n.ui-dialog-contain > .ui-footer { \n\tdisplay: block;\n\tposition: relative; \n\twidth: auto;\n\tmargin: 0;\n}\n.ui-dialog-contain > .ui-header {\n\toverflow: hidden;\n\tz-index: 10; \n\tpadding: 0;\n\tborder-top-width: 0;\n}\n.ui-dialog-contain > .ui-footer {\n\tz-index: 10; \n\tpadding: 0 1em; \n\tborder-bottom-width: 0;\n}\n.ui-popup-open .ui-header-fixed,\n.ui-popup-open .ui-footer-fixed {\n\tposition: absolute !important; /* See issues #4816, #4844 and #4874 and popup.js */\n}\n.ui-popup-screen {\n\tbackground-image: url(\"data:image/gif;base64,R0lGODlhAQABAID/AMDAwAAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==\"); /* Necessary to set some form of background to ensure element is clickable in IE6/7. While legacy IE won't understand the data-URI'd image, it ensures no additional requests occur in all other browsers with little overhead. */\n\ttop: 0;\n\tleft: 0;\n\tright: 0;\n\tbottom: 1px;\n\tposition: absolute;\n\tfilter: Alpha(Opacity=0);\n\topacity: 0;\n\tz-index: 1099;\n}\n.ui-popup-screen.in {\n\topacity: 0.5;\n\tfilter: Alpha(Opacity=50);\n}\n.ui-popup-screen.out {\n\topacity: 0;\n\tfilter: Alpha(Opacity=0);\n}\n.ui-popup-container {\n\tz-index: 1100;\n\tdisplay: inline-block;\n\tposition: absolute;\n\tpadding: 0;\n\toutline: 0;\n}\n.ui-popup {\n\tposition: relative;\n}\n.ui-popup.ui-body-inherit {\n\tborder-width: 1px;\n\tborder-style: solid;\n}\n.ui-popup-hidden {\n\tleft: 0;\n\ttop: 0;\n\tposition: absolute !important;\n\tvisibility: hidden;\n}\n.ui-popup-truncate {\n\theight: 1px;\n\twidth: 1px;\n\tmargin: -1px;\n\toverflow: hidden;\n\tclip: rect(1px,1px,1px,1px);\n}\n.ui-popup.ui-content,\n.ui-popup .ui-content {\n\toverflow: visible;\n}\n.ui-popup > .ui-header {\n\tborder-top-width: 0;\n}\n.ui-popup > .ui-footer {\n\tborder-bottom-width: 0;\n}\n.ui-popup > p,\n.ui-popup > h1,\n.ui-popup > h2,\n.ui-popup > h3,\n.ui-popup > h4,\n.ui-popup > h5,\n.ui-popup > h6 {\n\tmargin: .5em .4375em;\n}\n.ui-popup > span {\n\tdisplay: block;\n\tmargin: .5em .4375em;\n}\n.ui-popup-container .ui-content > p,\n.ui-popup-container .ui-content > h1,\n.ui-popup-container .ui-content > h2,\n.ui-popup-container .ui-content > h3,\n.ui-popup-container .ui-content > h4,\n.ui-popup-container .ui-content > h5,\n.ui-popup-container .ui-content > h6 {\n\tmargin: .5em 0;\n}\n.ui-popup-container .ui-content > span {\n\tmargin: 0;\n}\n.ui-popup-container .ui-content > p:first-child,\n.ui-popup-container .ui-content > h1:first-child,\n.ui-popup-container .ui-content > h2:first-child,\n.ui-popup-container .ui-content > h3:first-child,\n.ui-popup-container .ui-content > h4:first-child,\n.ui-popup-container .ui-content > h5:first-child,\n.ui-popup-container .ui-content > h6:first-child {\n\tmargin-top: 0;\n}\n.ui-popup-container .ui-content > p:last-child,\n.ui-popup-container .ui-content > h1:last-child,\n.ui-popup-container .ui-content > h2:last-child,\n.ui-popup-container .ui-content > h3:last-child,\n.ui-popup-container .ui-content > h4:last-child,\n.ui-popup-container .ui-content > h5:last-child,\n.ui-popup-container .ui-content > h6:last-child {\n\tmargin-bottom: 0;\n}\n.ui-popup > img {\n\tmax-width: 100%;\n\tmax-height: 100%;\n\tvertical-align: middle;\n}\n.ui-popup:not(.ui-content) > img:only-child,\n.ui-popup:not(.ui-content) > .ui-btn-left:first-child + img:last-child,\n.ui-popup:not(.ui-content) > .ui-btn-right:first-child + img:last-child {\n\t-webkit-border-radius: inherit;\n\tborder-radius: inherit;\n}\n.ui-popup iframe {\n\tvertical-align: middle;\n}\n.ui-popup > .ui-btn-left,\n.ui-popup > .ui-btn-right {\n\tposition: absolute; \n\ttop: -11px;\n\tmargin: 0;\n\tz-index: 1101;\n}\n.ui-popup > .ui-btn-left {\n\tleft: -11px;\n}\n.ui-popup > .ui-btn-right {\n\tright: -11px;\n}\n/* Dimensions related to the popup arrow\n-----------------------------------------------------------------------------------------------------------*/\n/* desired triangle height: 10px */\n/**\n * guide for the arrow - its width, height, and offset are theme-dependent and\n * should be expessed as left, right, top, bottom, so that the element bearing\n * such a class becomes stretched inside its parent position: relative element.\n * The left/top/right/bottom specified below should reflect the corresponding\n * border radii and so it leaves room for the shadow:\n *     ..--------------------..\n *   .\"        ^ top           \".\n *  /          v                 \\\n * |     +------------------+     |\n * |     |                  |     |\n * | left|                  |right|\n * |<--->|                  |<--->|\n * |     +------------------+     |\n *  \\          ^                 /\n *   `.        v bottom        .'\n *     \"\"--------------------\"\"\n * The idea is that the top/left of the arrow container box does not move to a\n * coordinate smaller than the top/left of the guide and the right/bottom of\n * the arrow container box does not move to a coordinate larger than the\n * bottom/right of the guide. This will help us avoid the following situation:\n *        ..--------------------..\n *      .\"        ^ top           \".\n *   /|/          v                 \\\n *  / |     +------------------+     |\n *  \\ |     |                  |     |\n *   \\| left|                  |right|\n *    |<--->|                  |<--->|\n *    |     +------------------+     |\n *     \\          ^                 /\n *      `.        v bottom        .'\n *        \"\"--------------------\"\"\n * The arrow should not receive a top/left coordinate such that it is too close\n * to one of the corners, because then at first the shadow of the arrow and,\n * given a coordinate even closer to the corner, even the body of the arrow will\n * \"stick out\" of the corner of the popup. The guide provides a hint to the\n * arrow positioning code as to which range of values is acceptable for the\n * arrow container's top/left coordinate.\n **/\n.ui-popup-arrow-container {\n\twidth: 20px;\n\theight: 20px;\n}\n/* aside from the \"infinities\" (-1000,2000), triangle height is used */\n.ui-popup-arrow-container.ui-popup-arrow-l {\n\tleft: -10px;\n\tclip: rect(-1000px,10px,2000px,-1000px);\n}\n.ui-popup-arrow-container.ui-popup-arrow-t {\n\ttop: -10px;\n\tclip: rect(-1000px,2000px,10px,-1000px);\n}\n.ui-popup-arrow-container.ui-popup-arrow-r {\n\tright: -10px;\n\tclip: rect(-1000px,2000px,2000px,10px);\n}\n.ui-popup-arrow-container.ui-popup-arrow-b {\n\tbottom: -10px;\n\tclip: rect(10px,2000px,1000px,-1000px);\n}\n/**\n * For each side, the arrow is twice the desired size and its corner is aligned\n * with the edge of the container:\n *                                           \n *           /\\         /\\                +----+       /\\\n *          /  \\       /  \\               | /\\ |top   /  \\\n *      +----+  \\     /  +----+       +-->|/  \\|     /    \\\n *  left| /  |   \\   /   |  \\ |right  |   |    |    /      \\\n *      |/   |    \\ /    |   \\|       |  /|    |\\  /        \\\n *      |\\   |    / \\    |   /|       | / +----+ \\ \\ +----+ /\n *      | \\  |   /   \\   |  / |       | \\        /  \\|    |/\n *      +----+  /     \\  +----+       |  \\      /    |    |\n *       ^  \\  /       \\  /  ^        |   \\    /  +->|\\  /|\n *       |   \\/         \\/   |        |    \\  /   |  | \\/ |bottom\n *       |                   |        |     \\/    |  +----+\n *       +-------------------+--------+-----------+\n *                           |\n *                    arrow container\n *                     (clips arrow)\n **/\n.ui-popup-arrow-container .ui-popup-arrow {\n\t/* (4*desired triangle height)/sqrt(2) - does not account for border - centred within the outer rectangle */\n\twidth: 28.284271247px;\n\theight: 28.284271247px;\n\tborder-width: 1px;\n\tborder-style: solid;\n}\n.ui-popup-arrow-container.ui-popup-arrow-t .ui-popup-arrow {\n\tleft: -4.142135623px;\n\ttop: 5.857864376px;\n}\n.ui-popup-arrow-container.ui-popup-arrow-b .ui-popup-arrow {\n\tleft: -4.142135623px;\n\ttop: -14.142135623px;\n}\n.ui-popup-arrow-container.ui-popup-arrow-l .ui-popup-arrow {\n\tleft: 5.857864376px;\n\ttop: -4.142135623px;\n}\n.ui-popup-arrow-container.ui-popup-arrow-r .ui-popup-arrow {\n\tleft: -14.142135623px;\n\ttop: -4.142135623px;\n}\n/* Fix rotation center for oldIE - see http://www.useragentman.com/IETransformsTranslator/ */\n.ui-popup-arrow-container.ui-popup-arrow-t.ie .ui-popup-arrow {\n    margin-left: -5.857864376269049px;\n    margin-top: -7.0710678118654755px;\n}\n.ui-popup-arrow-container.ui-popup-arrow-b.ie .ui-popup-arrow {\n    margin-left: -5.857864376269049px;\n    margin-top: -4.142135623730951px;\n}\n \n.ui-popup-arrow-container.ui-popup-arrow-l.ie .ui-popup-arrow {\n    margin-left: -7.0710678118654755px;\n    margin-top: -5.857864376269049px;\n}\n.ui-popup-arrow-container.ui-popup-arrow-r.ie .ui-popup-arrow {\n    margin-left: -4.142135623730951px;\n    margin-top: -5.857864376269049px;\n}\n/* structure */\n.ui-popup > .ui-popup-arrow-guide {\n\tposition: absolute;\n\tleft: 0;\n\tright: 0;\n\ttop: 0;\n\tbottom: 0;\n\tvisibility: hidden;\n}\n.ui-popup-arrow-container {\n\tposition: absolute;\n}\n.ui-popup-arrow {\n\t-webkit-transform: rotate(45deg);\n\t-moz-transform: rotate(45deg);\n\t-ms-transform: rotate(45deg);\n\ttransform: rotate(45deg);\n\tposition: absolute;\n\toverflow: hidden;\n\tbox-sizing: border-box;\n}\n.ui-popup-arrow-container.ie .ui-popup-arrow {\n\t-ms-filter: \"progid:DXImageTransform.Microsoft.Matrix(M11=0.7071067811865474, M12=-0.7071067811865477, M21=0.7071067811865477, M22=0.7071067811865474, SizingMethod='auto expand')\";\n\tfilter: progid:DXImageTransform.Microsoft.Matrix(\n\t      \tM11=0.7071067811865474,\n        \tM12=-0.7071067811865477,\n        \tM21=0.7071067811865477,\n        \tM22=0.7071067811865474,\n        \tSizingMethod='auto expand');\n}\n.ui-checkbox,\n.ui-radio {\n\tmargin: .5em 0;\n\tposition: relative;\n}\n.ui-checkbox .ui-btn,\n.ui-radio .ui-btn {\n\tmargin: 0;\n\ttext-align: left;\n\twhite-space: normal; /* Nowrap + ellipsis doesn't work on label. Issue #1419. */\n\tz-index: 2;\n}\n.ui-controlgroup .ui-checkbox .ui-btn.ui-focus,\n.ui-controlgroup .ui-radio .ui-btn.ui-focus {\n\tz-index: 3;\n}\n.ui-checkbox .ui-btn-icon-top,\n.ui-radio .ui-btn-icon-top,\n.ui-checkbox .ui-btn-icon-bottom,\n.ui-radio .ui-btn-icon-bottom {\n\ttext-align: center;\n}\n.ui-controlgroup-horizontal .ui-checkbox .ui-btn:after,\n.ui-controlgroup-horizontal .ui-radio .ui-btn:after {\n\tcontent: none;\n\tdisplay: none;\n}\n/* Native input positioning */\n.ui-checkbox input,\n.ui-radio input {\n\tposition: absolute;\n\tleft: .466em;\n\ttop: 50%;\n\twidth: 22px;\n\theight: 22px;\n\tmargin: -11px 0 0 0;\n\toutline: 0 !important;\n\tz-index: 1;\n}\n.ui-controlgroup-horizontal .ui-checkbox input,\n.ui-controlgroup-horizontal .ui-radio input {\n\tleft: 50%;\n\tmargin-left: -9px;\n}\n.ui-checkbox input:disabled,\n.ui-radio input:disabled {\n\tposition: absolute !important;\n\theight: 1px;\n\twidth: 1px;\n\toverflow: hidden;\n\tclip: rect(1px,1px,1px,1px);\n}\n.ui-select {\n\tmargin-top: .5em;\n\tmargin-bottom: .5em; /* no shorthand for margin because it would override margin-right for inline selects */\n\tposition: relative;\n}\n.ui-select > select {\n\tposition: absolute !important;\n\theight: 1px;\n\twidth: 1px;\n\toverflow: hidden;\n\tclip: rect(1px,1px,1px,1px);\n}\n.ui-select .ui-btn {\n\tmargin: 0;\n\topacity: 1; /* Fixes #2588: When Windows Phone 7.5 (Mango) tries to calculate a numeric opacity for a select (including \"inherit\") without explicitly specifying an opacity on the parent to give it context, a bug appears where clicking elsewhere on the page after opening the select will open the select again. */\n}\n.ui-select .ui-btn select {\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n\twidth: 100%;\n\tmin-height: 1.5em;\n\tmin-height: 100%;\n\theight: 3em;\n\tmax-height: 100%;\n\toutline: 0;\n\t-webkit-border-radius: inherit;\n\tborder-radius: inherit;\t\n\t-webkit-appearance: none;\n\t-moz-appearance: none;\n\tcursor: pointer;\n\tfilter: Alpha(Opacity=0);\n\topacity: 0;\n\tz-index: 2;\n}\n@-moz-document url-prefix() {\n\t.ui-select .ui-btn select {\n\t\topacity: 0.0001;\n\t}\n}\n/* Display none because of issues with IE/WP's filter alpha opacity */\n.ui-select .ui-state-disabled select {\n\tdisplay: none;\n}\n/* Because we add all classes of the select and option elements to the span... */ \n.ui-select span.ui-state-disabled {\n\tfilter: Alpha(Opacity=100);\n\topacity: 1;\n}\n.ui-select .ui-btn.ui-select-nativeonly {\n\tborder-radius: 0;\n\tborder: 0;\n}\n.ui-select .ui-btn.ui-select-nativeonly select {\n\topacity: 1;\n\ttext-indent: 0;\n\tdisplay: block;\n}\n/* ui-li-count is styled in the listview CSS. We set padding and offset here because select supports icon position while listview doesn't. */\n.ui-select .ui-li-has-count.ui-btn {\n\tpadding-right: 2.8125em;\n}\n.ui-select .ui-li-has-count.ui-btn-icon-right {\n\tpadding-right: 4.6875em;\n}\n.ui-select .ui-btn-icon-right .ui-li-count {\n\tright: 3.2em;\n}\n/* We set the rules for the span as well to fix an issue on Chrome with text-overflow ellipsis for the button in combination with text-align center. */\n.ui-select .ui-btn > span:not(.ui-li-count) {\n\tdisplay: block;\n\ttext-overflow: ellipsis;\n\toverflow: hidden !important;\n\twhite-space: nowrap;\n}\n.ui-selectmenu.ui-popup {\n\tmin-width: 11em;\n}\n.ui-selectmenu .ui-dialog-contain {\n\toverflow: hidden;\n}\n.ui-selectmenu .ui-header {\n\tmargin: 0;\n\tpadding: 0;\n\tborder-width: 0;\n}\n.ui-selectmenu.ui-dialog .ui-header {\n\tz-index: 1;\n\tposition: relative;\n}\n.ui-selectmenu.ui-popup .ui-header {\n\t-webkit-border-bottom-right-radius: 0;\n\tborder-bottom-right-radius: 0;\n\t-webkit-border-bottom-left-radius: 0;\n\tborder-bottom-left-radius: 0;\n}\n/* when no placeholder is defined in a multiple select, the header height doesn't even extend past the close button.  this shim's content in there */\n.ui-selectmenu.ui-popup .ui-header h1:after {\n\tcontent: '.';\n\tvisibility: hidden;\n}\n.ui-selectmenu .ui-header .ui-title {\n\tmargin: 0 2.875em;\n}\n.ui-selectmenu.ui-dialog .ui-content {\n\toverflow: visible;\n\tz-index: 1;\n}\n.ui-selectmenu .ui-selectmenu-list {\n\tmargin: 0;\n\t-webkit-border-radius: inherit;\n\tborder-radius: inherit;\t\n}\n.ui-header:not(.ui-screen-hidden) + .ui-selectmenu-list {\n\t-webkit-border-top-right-radius: 0;\n\tborder-top-right-radius: 0;\n\t-webkit-border-top-left-radius: 0;\n\tborder-top-left-radius: 0;\n}\n.ui-header.ui-screen-hidden + .ui-selectmenu-list li.ui-first-child .ui-btn {\n\tborder-top-width: 0;\n}\n.ui-selectmenu .ui-selectmenu-list li.ui-last-child .ui-btn {\n\tborder-bottom-width: 0;\n}\n.ui-selectmenu .ui-btn.ui-li-divider {\n\tcursor: default;\n}\n.ui-selectmenu .ui-selectmenu-placeholder {\n\tdisplay: none;\n}\n.ui-listview,\n.ui-listview > li {\n\tmargin: 0;\n\tpadding: 0;\n\tlist-style: none;\n}\n.ui-content .ui-listview,\n.ui-panel-inner > .ui-listview {\n\tmargin: -1em;\n}\n.ui-content .ui-listview-inset,\n.ui-panel-inner > .ui-listview-inset {\n\tmargin: 1em 0;\n}\n.ui-collapsible-content > .ui-listview {\n\tmargin: -.5em -1em;\n}\n.ui-collapsible-content > .ui-listview-inset {\n\tmargin: .5em 0;\n}\n.ui-listview > li {\n\tdisplay: block;\n\tposition: relative;\n\toverflow: visible;\n}\n.ui-listview > .ui-li-static,\n.ui-listview > .ui-li-divider,\n.ui-listview > li > a.ui-btn {\n\tmargin: 0;\n\tdisplay: block;\n\tposition: relative;\n\ttext-align: left;\n\ttext-overflow: ellipsis;\n\toverflow: hidden;\n\twhite-space: nowrap;\n}\n.ui-listview > li > .ui-btn:focus {\n\tz-index: 1;\n}\n.ui-listview > .ui-li-static,\n.ui-listview > .ui-li-divider,\n.ui-listview > li > a.ui-btn {\n\tborder-width: 1px 0 0 0;\n\tborder-style: solid;\n}\n.ui-listview-inset > .ui-li-static,\n.ui-listview-inset > .ui-li-divider,\n.ui-listview-inset > li > a.ui-btn {\n\tborder-right-width: 1px;\n\tborder-left-width: 1px;\n}\n.ui-listview > .ui-li-static.ui-last-child,\n.ui-listview > .ui-li-divider.ui-last-child,\n.ui-listview > li.ui-last-child > a.ui-btn {\n\tborder-bottom-width: 1px;\n}\n.ui-collapsible-content > .ui-listview:not(.ui-listview-inset) > li.ui-first-child,\n.ui-collapsible-content > .ui-listview:not(.ui-listview-inset) > li.ui-first-child > a.ui-btn {\n\tborder-top-width: 0;\n}\n.ui-collapsible-themed-content .ui-listview:not(.ui-listview-inset) > li.ui-last-child,\n.ui-collapsible-themed-content .ui-listview:not(.ui-listview-inset) > li.ui-last-child > a.ui-btn {\n\tborder-bottom-width: 0;\n}\n.ui-listview > li.ui-first-child,\n.ui-listview > li.ui-first-child > a.ui-btn {\n\t-webkit-border-top-right-radius: inherit;\t\n\tborder-top-right-radius: inherit;\n\t-webkit-border-top-left-radius: inherit;\n\tborder-top-left-radius: inherit;\n}\n.ui-listview > li.ui-last-child,\n.ui-listview > li.ui-last-child > a.ui-btn {\n\t-webkit-border-bottom-right-radius: inherit;\n\tborder-bottom-right-radius: inherit;\n\t-webkit-border-bottom-left-radius: inherit;\n\tborder-bottom-left-radius: inherit;\n}\n.ui-listview > li.ui-li-has-alt > a.ui-btn {\n\t-webkit-border-top-right-radius: 0;\n\tborder-top-right-radius: 0;\n\t-webkit-border-bottom-right-radius: 0;\n\tborder-bottom-right-radius: 0;\n}\n.ui-listview > li.ui-first-child > a.ui-btn + a.ui-btn {\n\t-webkit-border-top-left-radius: 0;\t\n\tborder-top-left-radius: 0;\n\t-webkit-border-top-right-radius: inherit;\n\tborder-top-right-radius: inherit;\n}\n.ui-listview > li.ui-last-child > a.ui-btn + a.ui-btn {\n\t-webkit-border-bottom-left-radius: 0;\n\tborder-bottom-left-radius: 0;\n\t-webkit-border-bottom-right-radius: inherit;\n\tborder-bottom-right-radius: inherit;\n}\n.ui-listview > li.ui-first-child img:first-child:not(.ui-li-icon) {\n\t-webkit-border-top-left-radius: inherit;\n\tborder-top-left-radius: inherit;\t\n}\n.ui-listview > li.ui-last-child img:first-child:not(.ui-li-icon) {\n\t-webkit-border-bottom-left-radius: inherit;\n\tborder-bottom-left-radius: inherit;\t\n}\n.ui-collapsible-content > .ui-listview:not(.ui-listview-inset) {\n\t-webkit-border-radius: inherit;\n\tborder-radius: inherit;\t\n}\n.ui-listview > .ui-li-static {\n\tpadding: .7em 1em;\n}\n.ui-listview > .ui-li-divider {\n\tpadding: .5em 1.143em;\n\tfont-size: 14px;\n\tfont-weight: bold;\n\tcursor: default;\n\toutline: 0; /* Dividers in custom selectmenus have tabindex */\n}\n.ui-listview > .ui-li-has-count > .ui-btn,\n.ui-listview > .ui-li-static.ui-li-has-count,\n.ui-listview > .ui-li-divider.ui-li-has-count {\n\tpadding-right: 2.8125em;\n}\n.ui-listview > .ui-li-has-count > .ui-btn-icon-right {\n\tpadding-right: 4.6875em;\n}\n.ui-listview > .ui-li-has-thumb > .ui-btn,\n.ui-listview > .ui-li-static.ui-li-has-thumb {\n\tmin-height: 3.625em;\n\tpadding-left: 6.25em;\n}\n/* ui-li-has-icon deprecated in 1.4. TODO: remove in 1.5 */\n.ui-listview > .ui-li-has-icon > .ui-btn,\n.ui-listview > .ui-li-static.ui-li-has-icon {\n\tmin-height: 1.25em;\n\tpadding-left: 2.5em;\n}\n/* Used by both listview and custom multiple select button */\n.ui-li-count {\n\tposition: absolute;\n\tfont-size: 12.5px;\n\tfont-weight: bold;\n\ttext-align: center;\n\tborder-width: 1px;\n\tborder-style: solid;\n\tpadding: 0 .48em;\n\tline-height: 1.6em;\n\tmin-height: 1.6em;\n\tmin-width: .64em;\n\tright: .8em;\n\ttop: 50%;\n\tmargin-top: -.88em;\n}\n.ui-listview .ui-btn-icon-right .ui-li-count {\n\tright: 3.2em;\n}\n.ui-listview .ui-li-has-thumb > img:first-child,\n.ui-listview .ui-li-has-thumb > .ui-btn > img:first-child,\n.ui-listview .ui-li-has-thumb .ui-li-thumb {\n\tposition: absolute;\n\tleft: 0;\n\ttop: 0;\n\tmax-height: 5em;\n\tmax-width: 5em;\n}\n/* ui-li-has-icon deprecated in 1.4. TODO: remove in 1.5 */\n.ui-listview > .ui-li-has-icon > img:first-child,\n.ui-listview > .ui-li-has-icon > .ui-btn > img:first-child {\n\tposition: absolute;\n\tleft: .625em;\n\ttop: .9em;\n\tmax-height: 1em;\n\tmax-width: 1em;\n}\n.ui-listview > li h1,\n.ui-listview > li h2,\n.ui-listview > li h3,\n.ui-listview > li h4,\n.ui-listview > li h5,\n.ui-listview > li h6 {\n\tfont-size: 1em;\n\tfont-weight: bold;\n\tdisplay: block;\n\tmargin: .45em 0;\n\ttext-overflow: ellipsis;\n\toverflow: hidden;\n\twhite-space: nowrap;\n}\n.ui-listview > li p {\n\tfont-size: .75em;\n\tfont-weight: normal;\n\tdisplay: block;\n\tmargin: .6em 0;\n\ttext-overflow: ellipsis;\n\toverflow: hidden;\n\twhite-space: nowrap;\n}\n.ui-listview .ui-li-aside {\n\tposition: absolute;\n\ttop: 1em;\n\tright: 3.333em;\n\tmargin: 0;\n\ttext-align: right;\n}\n.ui-listview > li.ui-li-has-alt > .ui-btn {\n\tmargin-right: 2.5em;\n\tborder-right-width: 0;\n}\n.ui-listview > li.ui-li-has-alt > .ui-btn + .ui-btn {\n\tposition: absolute;\n\twidth: 2.5em;\n\theight: 100%;\n\tmin-height: auto;\n\t-webkit-box-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\tbox-sizing: border-box;\n\tborder-left-width: 1px;\n\ttop: 0;\n\tright: 0;\n\tmargin: 0;\n\tpadding: 0;\n\tz-index: 2;\n}\n.ui-listview-inset > li.ui-li-has-alt > .ui-btn + .ui-btn {\n\tborder-right-width: 1px;\n}\n.ui-listview > li.ui-li-has-alt > .ui-btn + .ui-btn:focus {\n\tz-index: 3;\n}\nol.ui-listview,\nol.ui-listview > .ui-li-divider {\n\tcounter-reset: listnumbering;\n}\nol.ui-listview > li > .ui-btn,\nol.ui-listview > li.ui-li-static {\n\tvertical-align: middle;\n}\nol.ui-listview > li > .ui-btn:first-child:before,\nol.ui-listview > li.ui-li-static:before,\nol.ui-listview > li.ui-field-contain > label:before,\nol.ui-listview > li.ui-field-contain > .ui-controlgroup-label:before {\n\tdisplay: inline-block;\n\tfont-size: .9em;\n\tfont-weight: normal;\n\tpadding-right: .3em;\n\tmin-width: 1.4em;\n\tline-height: 1.5;\n\tvertical-align: middle;\n\tcounter-increment: listnumbering;\n\tcontent: counter(listnumbering) \".\";\n}\nol.ui-listview > li.ui-field-contain:before {\n\tcontent: none;\n\tdisplay: none;\n}\nol.ui-listview > li h1:first-child,\nol.ui-listview > li h2:first-child,\nol.ui-listview > li h3:first-child,\nol.ui-listview > li h4:first-child,\nol.ui-listview > li h5:first-child,\nol.ui-listview > li h6:first-child,\nol.ui-listview > li p:first-child,\nol.ui-listview > li img:first-child + * {\n\tdisplay: inline-block;\n\tvertical-align: middle;\n}\nol.ui-listview > li h1:first-child ~ *,\nol.ui-listview > li h2:first-child ~ *,\nol.ui-listview > li h3:first-child ~ *,\nol.ui-listview > li h4:first-child ~ *,\nol.ui-listview > li h5:first-child ~ *,\nol.ui-listview > li h6:first-child ~ *,\nol.ui-listview > li p:first-child ~ *,\nol.ui-listview > li img:first-child + * ~ * {\n\tmargin-top: 0;\n\ttext-indent: 2.04em; /* (1.4em + .3em) * .9em / .75em */\n}\nhtml .ui-filterable + .ui-listview,\nhtml .ui-filterable.ui-listview {\n\tmargin-top: .5em;\n}\n.ui-collapsible-content > form.ui-filterable {\n\tmargin-top: -.5em;\n}\n.ui-collapsible-content > .ui-input-search.ui-filterable {\n\tmargin-top: 0;\n}\n.ui-collapsible-content > .ui-filterable + .ui-listview:not(.ui-listview-inset) > li.ui-first-child,\n.ui-collapsible-content > .ui-filterable + .ui-listview:not(.ui-listview-inset) > li.ui-first-child > a.ui-btn,\n.ui-collapsible-content > .ui-filterable.ui-listview:not(.ui-listview-inset) > li.ui-first-child,\n.ui-collapsible-content > .ui-filterable.ui-listview:not(.ui-listview-inset) > li.ui-first-child > a.ui-btn {\n\tborder-top-width: 1px;\n}\ndiv.ui-slider {\n\theight: 30px;\n\tmargin: .5em 0;\n\tpadding: 0;\n\t-ms-touch-action: pan-y pinch-zoom double-tap-zoom;\n}\ndiv.ui-slider:before,\ndiv.ui-slider:after {\n\tcontent: \"\";\n\tdisplay: table;\n}\ndiv.ui-slider:after {\n\tclear: both;\n}\ninput.ui-slider-input {\n\tdisplay: block;\n\tfloat: left;\n\tfont-size: 14px;\n\tfont-weight: bold;\n\tmargin: 0;\n\tpadding: 4px;\n\twidth: 40px;\n\theight: 20px;\n\tline-height: 20px;\n\tborder-width: 1px;\n\tborder-style: solid;\n\toutline: 0;\n\ttext-align: center;\n\tvertical-align: text-bottom;\n\t-webkit-appearance: none;\n\t-moz-appearance: none;\n\tappearance: none;\n\t-webkit-box-sizing: content-box;\n\t-moz-box-sizing: content-box;\n\tbox-sizing: content-box;\n}\n.ui-slider-input::-webkit-outer-spin-button,\n.ui-slider-input::-webkit-inner-spin-button {\n\t-webkit-appearance: none;\n\tmargin: 0;\n}\n.ui-slider-track {\n\tposition: relative;\n\toverflow: visible;\n\tborder-width: 1px;\n\tborder-style: solid;\n\theight: 15px;\n\tmargin: 0 15px 0 68px;\n\ttop: 6px;\n}\n.ui-slider-track.ui-mini {\n\theight: 12px;\n\ttop: 8px;\n}\n.ui-slider-track .ui-slider-bg {\n\theight: 100%;\n}\n/* High level of specificity to override button margins in grids */\n.ui-slider-track .ui-btn.ui-slider-handle {\n\tposition: absolute;\n\tz-index: 1;\n\ttop: 50%;\n\twidth: 28px;\n\theight: 28px;\n\tmargin: -15px 0 0 -15px;\n\toutline: 0;\n\tpadding: 0;\n}\n.ui-slider-track.ui-mini .ui-slider-handle {\n\theight: 14px;\n\twidth: 14px;\n\tmargin: -8px 0 0 -8px;\n}\nselect.ui-slider-switch {\n\tposition: absolute !important;\n\theight: 1px;\n\twidth: 1px;\n\toverflow: hidden;\n\tclip: rect(1px,1px,1px,1px);\n}\ndiv.ui-slider-switch {\n\tdisplay: inline-block;\n\theight: 32px;\n\twidth: 5.8em;\n\ttop: 0;\n}\n/* reset the clearfix */\ndiv.ui-slider-switch:before,\ndiv.ui-slider-switch:after {\n\tdisplay: none;\n\tclear: none;\n}\ndiv.ui-slider-switch.ui-mini {\n\theight: 29px;\n\ttop: 0;\n}\n.ui-slider-inneroffset {\n\tmargin: 0 16px;\n\tposition: relative;\n\tz-index: 1;\n}\n.ui-slider-switch.ui-mini .ui-slider-inneroffset {\n\tmargin: 0 15px 0 14px;\n}\n.ui-slider-switch .ui-btn.ui-slider-handle {\n\tmargin: 1px 0 0 -15px;\n}\n.ui-slider-switch.ui-mini .ui-slider-handle {\n\twidth: 25px;\n\theight: 25px;\n\tmargin: 1px 0 0 -13px;\n\tpadding: 0;\n}\n.ui-slider-handle-snapping {\n\t-webkit-transition: left 70ms linear;\n\t-moz-transition: left 70ms linear;\n\ttransition: left 70ms linear;\n}\n.ui-slider-switch .ui-slider-label {\n\tposition: absolute;\n\ttext-align: center;\n\twidth: 100%;\n\toverflow: hidden;\n\tfont-size: 16px;\n\ttop: 0;\n\tline-height: 2;\n\tmin-height: 100%;\n\twhite-space: nowrap;\n\tcursor: pointer;\n}\n.ui-slider-switch.ui-mini .ui-slider-label {\n\tfont-size: 14px;\n}\n.ui-slider-switch .ui-slider-label-a {\n\tz-index: 1;\n\tleft: 0;\n\ttext-indent: -1.5em;\n}\n.ui-slider-switch .ui-slider-label-b {\n\tz-index: 0;\n\tright: 0;\n\ttext-indent: 1.5em;\n}\n/* The corner radii for ui-slider-switch/track can be specified in theme CSS. The bg and handle inherits. */\n.ui-slider-track .ui-slider-bg,\n.ui-slider-switch .ui-slider-label,\n.ui-slider-switch .ui-slider-inneroffset,\n.ui-slider-handle {\n\t-webkit-border-radius: inherit;\n\tborder-radius: inherit;\n}\n.ui-field-contain div.ui-slider-switch {\n\tmargin: 0;\n}\n/* ui-hide-label deprecated in 1.4. TODO: Remove in 1.5 */\n.ui-field-contain div.ui-slider-switch,\n.ui-field-contain.ui-hide-label div.ui-slider-switch,\nhtml .ui-popup .ui-field-contain div.ui-slider-switch {\n\tdisplay: inline-block;\n\twidth: 5.8em;\n}\n/* slider tooltip\n-----------------------------------------------------------------------------------------------------------*/\n.ui-slider-popup {\n\twidth: 64px;\n\theight: 64px;\n\tfont-size: 36px;\n\tpadding-top: 14px;\n\topacity: 0.8;\n}\n.ui-slider-popup {\n\tposition: absolute !important;\n\ttext-align: center;\n\tz-index: 100;\n}\n.ui-slider-track .ui-btn.ui-slider-handle {\n\tfont-size: .9em;\n\tline-height: 30px;\n}\n.ui-rangeslider {\n\tmargin: .5em 0;\n}\n.ui-rangeslider:before,\n.ui-rangeslider:after {\n\tcontent: \"\";\n\tdisplay: table;\n}\n.ui-rangeslider:after {\n\tclear: both;\n}\n.ui-rangeslider .ui-slider-input.ui-rangeslider-last {\n\tfloat: right;\n}\n.ui-rangeslider .ui-rangeslider-sliders {\n\tposition: relative;\n\toverflow: visible;\n\theight: 30px;\n\tmargin: 0 68px;\n}\n.ui-rangeslider .ui-rangeslider-sliders .ui-slider-track {\n\tposition: absolute;\n\ttop: 6px;\n\tright: 0;\n\tleft: 0;\n\tmargin: 0;\n}\n.ui-rangeslider.ui-mini .ui-rangeslider-sliders .ui-slider-track {\n\ttop: 8px;\n}\n.ui-rangeslider .ui-slider-track:first-child .ui-slider-bg {\n\tdisplay: none;\n}\n.ui-rangeslider .ui-rangeslider-sliders .ui-slider-track:first-child {\n\tbackground-color: transparent;\n\tbackground: none;\n\tborder-width: 0;\n\theight: 0;\n}\n/* this makes ie6 and ie7 set height to 0 to fix z-index problem */\nhtml >/**/body .ui-rangeslider .ui-rangeslider-sliders .ui-slider-track:first-child {\n\theight: 15px;\n\tborder-width: 1px;\n}\nhtml >/**/body .ui-rangeslider.ui-mini .ui-rangeslider-sliders .ui-slider-track:first-child {\n\theight: 12px;\n}\n/* Hide the second label (the first is moved outside the div) */\ndiv.ui-rangeslider label {\n\tposition: absolute !important;\n\theight: 1px;\n\twidth: 1px;\n\toverflow: hidden;\n\tclip: rect(1px,1px,1px,1px);\n}\n.ui-field-contain .ui-rangeslider input.ui-slider-input,\n.ui-field-contain .ui-rangeslider.ui-mini input.ui-slider-input,\n.ui-field-contain .ui-rangeslider .ui-rangeslider-sliders,\n.ui-field-contain .ui-rangeslider.ui-mini .ui-rangeslider-sliders {\n\tmargin-top: 0;\n\tmargin-bottom: 0;\n}\n.ui-input-text,\n.ui-input-search {\n\tmargin: .5em 0;\n\tborder-width: 1px;\n\tborder-style: solid;\n}\n.ui-mini {\n\tmargin: .446em;\n}\n.ui-input-text input,\n.ui-input-search input,\ntextarea.ui-input-text {\n\tpadding: .4em;\n\tline-height: 1.4em;\n\tdisplay: block;\n\twidth: 100%;\n\t-webkit-box-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\tbox-sizing: border-box;\n\toutline: 0;\n}\n.ui-input-text input,\n.ui-input-search input {\n\tmargin: 0;\n\tmin-height: 2.2em;\n\ttext-align: left; /* Opera aligns type=\"date\" right by default */\n\tborder: 0;\n\tbackground: transparent none;\n\t-webkit-appearance: none;\n\t-webkit-border-radius: inherit;\n\tborder-radius: inherit;\n}\ntextarea.ui-input-text {\n\toverflow: auto;\n\tresize: vertical;\n}\n.ui-mini .ui-input-text input,\n.ui-mini .ui-input-search input,\n.ui-input-text.ui-mini input,\n.ui-input-search.ui-mini input,\n.ui-mini textarea.ui-input-text,\ntextarea.ui-mini {\n\tfont-size: 14px;\n}\n/* Same margin for mini textareas as other mini sized widgets (12.5/14 * 0.5em) */\n.ui-mini textarea.ui-input-text,\ntextarea.ui-mini {\n\tmargin: .446em 0;\n}\n.ui-input-has-clear,\n.ui-input-search {\n\tposition: relative;\n}\n/* Padding on the div instead of input because of browser spinners etc. */\n.ui-input-has-clear {\n\tpadding-right: 2.375em;\n}\n.ui-mini.ui-input-has-clear {\n\tpadding-right: 2.923em;\n}\n.ui-input-has-clear input {\n\tpadding-right: 0;\n\t/* Autofill on Chrome has bg color so we unset corners right as well. */\n\t-webkit-border-top-right-radius: 0;\n\tborder-top-right-radius: 0;\n\t-webkit-border-bottom-right-radius: 0;\n\tborder-bottom-right-radius: 0;\n}\n/* Search icon */\n.ui-input-search input {\n\tpadding-left: 1.75em;\n}\n.ui-input-search:after {\n\tposition: absolute;\n\tleft: .3125em;\n\ttop: 50%;\n\tmargin-top: -7px;\n\tcontent: \"\";\n\tbackground-position: center center;\n\tbackground-repeat: no-repeat;\n\twidth: 14px;\n\theight: 14px;\n\tfilter: Alpha(Opacity=50);\n\topacity: .5;\n}\n.ui-input-search.ui-input-has-clear .ui-btn.ui-input-clear,\n.ui-input-text.ui-input-has-clear .ui-btn.ui-input-clear {\n\tposition: absolute;\n\tright: 0;\n\ttop: 50%;\n\tmargin: -14px .3125em 0;\n\tborder: 0;\n\tbackground-color: transparent;\n}\n.ui-input-search .ui-input-clear-hidden,\n.ui-input-text .ui-input-clear-hidden {\n\tdisplay: none;\n}\n/* Resolves issue #5166: Added to support issue introduced in Firefox 15. We can likely remove this in the future. */\n.ui-input-text input::-moz-placeholder,\n.ui-input-search input::-moz-placeholder,\ntextarea.ui-input-text::-moz-placeholder {\n\tcolor: #aaa;\n}\n/* Same for IE10 */\n.ui-input-text input:-ms-input-placeholder,\n.ui-input-search input:-ms-input-placeholder,\ntextarea.ui-input-text:-ms-input-placeholder {\n\tcolor: #aaa;\n}\n/* Resolves issue #5131: Width of textinput depends on its type,\nfor Android 4.1 */\n.ui-input-text input[type=number]::-webkit-outer-spin-button {\n\tmargin: 0;\n}\n/* Resolves issue #5756: Textinput in IE10 has a default clear button */\n.ui-input-text input::-ms-clear,\n.ui-input-search input::-ms-clear {\n\tdisplay: none;\n}\n.ui-input-text input:focus,\n.ui-input-search input:focus {\n\t-webkit-box-shadow: none;\n\t-moz-box-shadow: none;\n\tbox-shadow: none;\n}\ntextarea.ui-input-text.ui-textinput-autogrow {\n\toverflow: hidden;\n}\n.ui-textinput-autogrow-resize {\n\t-webkit-transition: height 0.25s;\n\t-o-transition: height 0.25s;\n\t-moz-transition: height 0.25s;\n\ttransition: height 0.25s;\n}\n.ui-flipswitch {\n\tdisplay: inline-block;\n\tvertical-align: middle;\n\twidth: 5.875em; /* Override this and padding-left in next rule if you use labels other than \"on/off\" and need more space */\n\theight: 1.875em;\n\tborder-width: 1px;\n\tborder-style: solid;\n\tmargin: .5em 0;\n\toverflow: hidden;\n\t-webkit-transition-property: padding, width, background-color, color, border-color;\n\t-moz-transition-property: padding, width, background-color, color, border-color;\n\t-o-transition-property: padding, width, background-color, color, border-color;\n\ttransition-property: padding, width, background-color, color, border-color;\n\t-webkit-transition-duration: 100ms;\n\t-moz-transition-duration: 100ms;\n\t-o-transition-duration: 100ms;\n\ttransition-duration: 100ms;\n\t-webkit-touch-callout: none;\n\t-webkit-user-select: none;\n\t-moz-user-select: none;\n\t-ms-user-select: none;\n\tuser-select: none;\n\tcursor: pointer;\n}\n.ui-flipswitch.ui-flipswitch-active {\n\tpadding-left: 4em;  /* Override this and width in previous rule if you use labels other than \"on/off\" and need more space */\n\twidth: 1.875em;\n}\n.ui-flipswitch-input {\n\tposition: absolute;\n\theight: 1px;\n\twidth: 1px;\n\tmargin: -1px;\n\toverflow: hidden;\n\tclip: rect(1px,1px,1px,1px);\n\tborder: 0;\n\toutline: 0;\n\tfilter: Alpha(Opacity=0);\n\topacity: 0;\n}\n.ui-flipswitch .ui-btn.ui-flipswitch-on,\n.ui-flipswitch .ui-flipswitch-off {\n\tfloat: left;\n\theight: 1.75em;\n\tmargin: .0625em;\n\tline-height: 1.65em;\n}\n.ui-flipswitch .ui-btn.ui-flipswitch-on {\n\twidth: 1.75em;\n\tpadding: 0;\n\ttext-indent: -2.6em; /* Override this to center text if you use a label other than \"on\" */\n\ttext-align: left;\n\tborder-width: 1px;\n\tborder-style: solid;\n\t-webkit-box-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\tbox-sizing: border-box;\n\tborder-radius: inherit;\n\toverflow: visible;\n\tcolor: inherit;\n\ttext-shadow: inherit;\n}\n.ui-flipswitch .ui-flipswitch-off {\n\tpadding: 1px;\n\ttext-indent: 1em; /* Override this to center text if you use a label other than \"off\" */\n}\n/* Override field container CSS to prevent the flipswitch from becomming full width */\nhtml .ui-field-contain > label + .ui-flipswitch,\nhtml .ui-popup .ui-field-contain > label + .ui-flipswitch {\n\tdisplay: inline-block;\n\twidth: 5.875em; /* If you override the width for .ui-flipswitch you should repeat the same value here */\n\t-webkit-box-sizing: content-box;\n\t-moz-box-sizing: content-box;\n\tbox-sizing: content-box;\n}\n.ui-field-contain .ui-flipswitch.ui-flipswitch-active,\n.ui-popup .ui-field-contain .ui-flipswitch.ui-flipswitch-active {\n\twidth: 1.875em;\n}\n.ui-table {\n\tborder: 0;\n\tborder-collapse: collapse;\n\tpadding: 0;\n\twidth: 100%;\n}\n.ui-table th,\n.ui-table td {\n\tline-height: 1.5em;\n\ttext-align: left;\n\tpadding: .4em .5em;\n\tvertical-align:top;\n}\n.ui-table th .ui-btn,\n.ui-table td .ui-btn {\n\tline-height: normal;\n}\n.ui-table th {\n\tfont-weight: bold;\n}\n.ui-table caption {\n\ttext-align: left;\n\tmargin-bottom: 1.4em;\n\topacity: .5;\n}\n/*\n Styles for the table columntoggle mode\n*/\n.ui-table-columntoggle-btn {\n\tfloat: right;\n\tmargin-bottom: .8em;\n}\n/* Remove top/bottom margins around the fieldcontain on check list */\n.ui-table-columntoggle-popup fieldset {\n\tmargin:0;\n}\n.ui-table-columntoggle {\n\tclear: both;\n}\n/* Hide all prioritized columns by default */\n@media only all {\n\tth.ui-table-priority-6,\n\ttd.ui-table-priority-6,\n\tth.ui-table-priority-5,\n\ttd.ui-table-priority-5,\n\tth.ui-table-priority-4,\n\ttd.ui-table-priority-4,\n\tth.ui-table-priority-3,\n\ttd.ui-table-priority-3,\n\tth.ui-table-priority-2,\n\ttd.ui-table-priority-2,\n\tth.ui-table-priority-1,\n\ttd.ui-table-priority-1 {\n\t\tdisplay: none;\n\t}\n}\n/* Preset breakpoints if \".ui-responsive\" class added to table */\n/* Show priority 1 at 320px (20em x 16px) */\n@media screen and (min-width: 20em) {\n\t.ui-table-columntoggle.ui-responsive th.ui-table-priority-1,\n\t.ui-table-columntoggle.ui-responsive td.ui-table-priority-1 {\n\t\tdisplay: table-cell;\n\t}\n}\n/* Show priority 2 at 480px (30em x 16px) */\n@media screen and (min-width: 30em) {\n\t.ui-table-columntoggle.ui-responsive th.ui-table-priority-2,\n\t.ui-table-columntoggle.ui-responsive td.ui-table-priority-2 {\n\t\tdisplay: table-cell;\n\t}\n}\n/* Show priority 3 at 640px (40em x 16px) */\n@media screen and (min-width: 40em) {\n\t.ui-table-columntoggle.ui-responsive th.ui-table-priority-3,\n\t.ui-table-columntoggle.ui-responsive td.ui-table-priority-3 {\n\t\tdisplay: table-cell;\n\t}\n}\n/* Show priority 4 at 800px (50em x 16px) */\n@media screen and (min-width: 50em) {\n\t.ui-table-columntoggle.ui-responsive th.ui-table-priority-4,\n\t.ui-table-columntoggle.ui-responsive td.ui-table-priority-4 {\n\t\tdisplay: table-cell;\n\t}\n}\n/* Show priority 5 at 960px (60em x 16px) */\n@media screen and (min-width: 60em) {\n\t.ui-table-columntoggle.ui-responsive th.ui-table-priority-5,\n\t.ui-table-columntoggle.ui-responsive td.ui-table-priority-5 {\n\t\tdisplay: table-cell;\n\t}\n}\n/* Show priority 6 at 1,120px (70em x 16px) */\n@media screen and (min-width: 70em) {\n\t.ui-table-columntoggle.ui-responsive th.ui-table-priority-6,\n\t.ui-table-columntoggle.ui-responsive td.ui-table-priority-6 {\n\t\tdisplay: table-cell;\n\t}\n}\n/* Unchecked manually: Always hide */\n.ui-table-columntoggle th.ui-table-cell-hidden,\n.ui-table-columntoggle td.ui-table-cell-hidden,\n.ui-table-columntoggle.ui-responsive th.ui-table-cell-hidden,\n.ui-table-columntoggle.ui-responsive td.ui-table-cell-hidden {\n\tdisplay: none;\n}\n/* Checked manually: Always show */\n.ui-table-columntoggle th.ui-table-cell-visible,\n.ui-table-columntoggle td.ui-table-cell-visible,\n.ui-table-columntoggle.ui-responsive th.ui-table-cell-visible,\n.ui-table-columntoggle.ui-responsive td.ui-table-cell-visible {\n\tdisplay: table-cell;\n}\n/*\n Styles for the table columntoggle mode\n*/\n.ui-table-reflow td .ui-table-cell-label,\n.ui-table-reflow th .ui-table-cell-label { \n\tdisplay: none;\n}\n/* Mobile first styles: Begin with the stacked presentation at narrow widths */ \n@media only all {\n\t/* Hide the table headers */ \n\t.ui-table-reflow thead td, \n\t.ui-table-reflow thead th {\n\t\tdisplay: none;\n\t}\n\t/* Show the table cells as a block level element */ \n\t.ui-table-reflow td,\n\t.ui-table-reflow th { \n\t\ttext-align: left;\n\t\tdisplay: block;\n\t}\n\t/* Add a fair amount of top margin to visually separate each row when stacked */  \n\t.ui-table-reflow tbody th {\n\t\tmargin-top: 3em;\n\t}\n\t/* Make the label elements a percentage width */ \n\t.ui-table-reflow td .ui-table-cell-label,\n\t.ui-table-reflow th .ui-table-cell-label { \n\t\tpadding: .4em; \n\t\tmin-width: 30%; \n\t\tdisplay: inline-block;\n\t\tmargin: -.4em 1em -.4em -.4em;\n\t}\n\t/* For grouped headers, have a different style to visually separate the levels by classing the first label in each col group */ \n\t.ui-table-reflow th .ui-table-cell-label-top,\n\t.ui-table-reflow td .ui-table-cell-label-top {\n\t\tdisplay: block;\n\t\tpadding: .4em 0;\n\t\tmargin: .4em 0;\n\t\ttext-transform: uppercase;\n\t\tfont-size: .9em;\n\t\tfont-weight: normal;\n\t}\n}\n/* Breakpoint to show as a standard table at 560px (35em x 16px) or wider */ \n@media ( min-width: 35em ) {\n\t/* Show the table header rows */ \n\t.ui-table-reflow.ui-responsive td,\n\t.ui-table-reflow.ui-responsive th,\n\t.ui-table-reflow.ui-responsive tbody th,\n\t.ui-table-reflow.ui-responsive tbody td,\n\t.ui-table-reflow.ui-responsive thead td,\n\t.ui-table-reflow.ui-responsive thead th {\n\t\tdisplay: table-cell;\n\t\tmargin: 0;\n\t}\n\t/* Hide the labels in each cell */ \n\t.ui-table-reflow.ui-responsive td .ui-table-cell-label,\n\t.ui-table-reflow.ui-responsive th .ui-table-cell-label { \n\t\tdisplay: none;\n\t}\n}\n/* Hack to make IE9 and WP7.5 treat cells like block level elements, scoped to ui-responsive class */ \n/* Applied in a max-width media query up to the table layout breakpoint so we don't need to negate this*/ \n@media ( max-width: 35em ) {\n\t.ui-table-reflow.ui-responsive td,\n\t.ui-table-reflow.ui-responsive th {\n\t\twidth: 100%;\n\t\t-webkit-box-sizing: border-box;\n\t\t-moz-box-sizing: border-box;\n\t\tbox-sizing: border-box;\n\t\tfloat: left;\n\t\tclear: left;\n\t}\n}\n/* Panel */\n.ui-panel {\n\twidth: 17em;\n\tmin-height: 100%;\n\tmax-height: none;\n\tborder-width: 0;\n\tposition: absolute;\n\ttop: 0;\n\tdisplay: block;\n}\n.ui-panel-closed {\n\twidth: 0;\n\tmax-height: 100%;\n\toverflow: hidden;\n\tvisibility: hidden;\n\tleft: 0;\n\tclip: rect(1px,1px,1px,1px);\n}\n.ui-panel-fixed {\n\tposition: fixed;\n\tbottom: -1px; /* Fixes gap on Chrome for Android */\n\tpadding-bottom: 1px;\n}\n.ui-panel-display-reveal {\n\tz-index: 1;\n}\n.ui-panel-display-push {\n\tz-index: 999;\n}\n.ui-panel-display-overlay {\n\tz-index: 1001; /* Fixed toolbars have z-index 1000 */\n}\n.ui-panel-inner {\n\tpadding: 1em;\n}\n/* Container, page and wrapper */\n.ui-panel-page-container {\n\toverflow-x: visible;\n}\n.ui-panel-page-container-themed .ui-page-active {\n\tbackground: none;\n}\n.ui-panel-wrapper {\n\tposition: relative;\n\tmin-height: inherit;\n\tborder: 0;\n\toverflow-x: hidden;\n\tz-index: 999;\n}\n/* Fixed toolbars */\n.ui-panel-fixed-toolbar {\n\toverflow-x: hidden;\n}\n/* Dismiss */\n.ui-panel-dismiss {\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n\tright: 0;\n\theight: 100%;\n\tz-index: 1002;\n\tdisplay: none;\n}\n.ui-panel-dismiss-open {\n\tdisplay: block;\n}\n/* Animate class is added to panel, wrapper and fixed toolbars */\n.ui-panel-animate {\n\t-webkit-transition: -webkit-transform 300ms ease;\n\t-webkit-transition-duration: 300ms;\n\t-moz-transition: -moz-transform 300ms ease;\n\ttransition: transform 300ms ease;\n}\n/* Fix for Windows Phone issue #6349: unset the transition for transforms in case of fixed toolbars. */\n@media screen and ( max-device-width: 768px ) {\n\t.ui-page-header-fixed .ui-panel-animate.ui-panel-wrapper,\n\t.ui-page-footer-fixed .ui-panel-animate.ui-panel-wrapper,\n\t.ui-panel-animate.ui-panel-fixed-toolbar {\n\t\t-ms-transition: none;\n\t}\n\t/* We need a transitionend event ... */\n\t.ui-panel-animate.ui-panel-fixed-toolbar {\n\t\t-ms-transition: -ms-transform 1ms;\n\t\t-ms-transform: rotate(0deg);\n\t}\n}\n/* Hardware acceleration for smoother transitions on WebKit browsers */\n.ui-panel-animate.ui-panel:not(.ui-panel-display-reveal) {\n\t-webkit-backface-visibility: hidden;\n\t-webkit-transform: translate3d(0,0,0);\n}\n/* Panel positioning (for overlay and push) */\n/* Panel left closed */\n.ui-panel-position-left {\n\tleft: -17em;\n}\n/* Panel left closed animated */\n.ui-panel-animate.ui-panel-position-left.ui-panel-display-overlay,\n.ui-panel-animate.ui-panel-position-left.ui-panel-display-push {\n\tleft: 0;\n\t-webkit-transform: translate3d(-17em,0,0);\n\t-moz-transform: translate3d(-17em,0,0);\n\ttransform: translate3d(-17em,0,0);\n}\n/* Panel left open */\n.ui-panel-position-left.ui-panel-display-reveal, /* Unset \"panel left closed\" for reveal */\n.ui-panel-open.ui-panel-position-left {\n\tleft: 0;\n}\n/* Panel left open animated */\n.ui-panel-animate.ui-panel-open.ui-panel-position-left.ui-panel-display-overlay,\n.ui-panel-animate.ui-panel-open.ui-panel-position-left.ui-panel-display-push {\n\t-webkit-transform: translate3d(0,0,0);\n\ttransform: translate3d(0,0,0);\n\t-moz-transform: none;\n}\n/* Panel right closed */\n.ui-panel-position-right {\n\tright: -17em;\n}\n/* Panel right closed animated */\n.ui-panel-animate.ui-panel-position-right.ui-panel-display-overlay,\n.ui-panel-animate.ui-panel-position-right.ui-panel-display-push {\n\tright: 0;\n\t-webkit-transform: translate3d(17em,0,0);\n\t-moz-transform: translate3d(17em,0,0);\n\ttransform: translate3d(17em,0,0);\n}\n/* Panel right open */\n.ui-panel-position-right.ui-panel-display-reveal, /* Unset \"panel right closed\" for reveal */\n.ui-panel-position-right.ui-panel-open {\n\tright: 0;\n}\n/* Panel right open animated */\n.ui-panel-animate.ui-panel-open.ui-panel-position-right.ui-panel-display-overlay,\n.ui-panel-animate.ui-panel-open.ui-panel-position-right.ui-panel-display-push {\n\t-webkit-transform: translate3d(0,0,0);\n\ttransform: translate3d(0,0,0);\n\t-moz-transform: none;\n}\n/* Wrapper and fixed toolbars positioning (for reveal and push) */\n/* Panel left open */\n.ui-panel-page-content-position-left {\n\tleft: 17em;\n\tright: -17em;\n}\n/* Panel left open animated */\n.ui-panel-animate.ui-panel-page-content-position-left {\n\tleft: 0;\n\tright: 0;\n\t-webkit-transform: translate3d(17em,0,0);\n\t-moz-transform: translate3d(17em,0,0);\n\ttransform: translate3d(17em,0,0);\n}\n/* Panel right open */\n.ui-panel-page-content-position-right {\n\tleft: -17em;\n\tright: 17em;\n}\n/* Panel right open animated */\n.ui-panel-animate.ui-panel-page-content-position-right {\n\tleft: 0;\n\tright: 0;\n\t-webkit-transform: translate3d(-17em,0,0);\n\t-moz-transform: translate3d(-17em,0,0);\n\ttransform: translate3d(-17em,0,0);\n}\n/* Dismiss model open */\n.ui-panel-dismiss-open.ui-panel-dismiss-position-left {\n\tleft: 17em;\n}\n.ui-panel-dismiss-open.ui-panel-dismiss-position-right {\n\tright: 17em;\n}\n/* Shadows and borders */\n.ui-panel-display-reveal {\n\t-webkit-box-shadow: inset -5px 0 5px rgba(0,0,0,.15);\n\t-moz-box-shadow: inset -5px 0 5px rgba(0,0,0,.15);\n\tbox-shadow: inset -5px 0 5px rgba(0,0,0,.15);\n}\n.ui-panel-position-right.ui-panel-display-reveal {\n\t-webkit-box-shadow: inset 5px 0 5px rgba(0,0,0,.15);\n\t-moz-box-shadow: inset 5px 0 5px rgba(0,0,0,.15);\n\tbox-shadow: inset 5px 0 5px rgba(0,0,0,.15);\n}\n.ui-panel-display-overlay {\n\t-webkit-box-shadow: 5px 0 5px rgba(0,0,0,.15);\n\t-moz-box-shadow: 5px 0 5px rgba(0,0,0,.15);\n\tbox-shadow: 5px 0 5px rgba(0,0,0,.15);\n}\n.ui-panel-position-right.ui-panel-display-overlay {\n\t-webkit-box-shadow: -5px 0 5px rgba(0,0,0,.15);\n\t-moz-box-shadow: -5px 0 5px rgba(0,0,0,.15);\n\tbox-shadow: -5px 0 5px rgba(0,0,0,.15);\n}\n.ui-panel-open.ui-panel-position-left.ui-panel-display-push {\n\tborder-right-width: 1px;\n\tmargin-right: -1px;\n}\n.ui-panel-page-content-position-left.ui-panel-page-content-display-push {\n\tmargin-left: 1px;\n\twidth: auto;\n}\n.ui-panel-open.ui-panel-position-right.ui-panel-display-push {\n\tborder-left-width: 1px;\n\tmargin-left: -1px;\n}\n.ui-panel-page-content-position-right.ui-panel-page-content-display-push {\n\tmargin-right: 1px;\n\twidth: auto;\n}\n/* Responsive: wrap on wide viewports once open */\n@media (min-width:55em) {\n\t.ui-responsive-panel .ui-panel-page-content-open.ui-panel-page-content-position-left {\n\t\tmargin-right: 17em;\n\t}\n\t.ui-responsive-panel .ui-panel-page-content-open.ui-panel-page-content-position-right {\n\t\tmargin-left: 17em;\n\t}\n\t.ui-responsive-panel .ui-panel-page-content-open {\n\t\twidth: auto;\t\n\t}\n\t.ui-responsive-panel .ui-panel-dismiss-display-push,\n\t.ui-responsive-panel.ui-page-active ~ .ui-panel-dismiss-display-push {\n\t\tdisplay: none;\n\t}\n}\n.ui-tabs {\n\tposition: relative;/* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as \"fixed\") */\n\tpadding: .2em;\n}\n"
  },
  {
    "path": "stenogotchi/ui/web/static/js/jquery.mobile/jquery.mobile.icons-1.4.5.css",
    "content": "/*!\n* jQuery Mobile 1.4.5\n* Git HEAD hash: 68e55e78b292634d3991c795f06f5e37a512decc <> Date: Fri Oct 31 2014 17:33:30 UTC\n* http://jquerymobile.com\n*\n* Copyright 2010, 2014 jQuery Foundation, Inc. and othercontributors\n* Released under the MIT license.\n* http://jquery.org/license\n*\n*/\n\n\n/* SVG icons */\n.ui-icon-action:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20style%3D%22fill%3A%23FFFFFF%3B%22%20d%3D%22M9%2C5v3l5-4L9%2C0v3c0%2C0-5%2C0-5%2C7C6%2C5%2C9%2C5%2C9%2C5z%20M11%2C12H2V5h1l2-2H0v11h13V7l-2%2C2V12z%22%2F%3E%3C%2Fsvg%3E\");\n}\n.ui-icon-alert:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20style%3D%22fill%3A%23FFFFFF%3B%22%20d%3D%22M7%2C0L0%2C12h14L7%2C0z%20M7%2C11c-0.553%2C0-1-0.447-1-1s0.447-1%2C1-1c0.553%2C0%2C1%2C0.447%2C1%2C1S7.553%2C11%2C7%2C11z%20M7%2C8%20C6.447%2C8%2C6%2C7.553%2C6%2C7V5c0-0.553%2C0.447-1%2C1-1c0.553%2C0%2C1%2C0.447%2C1%2C1v2C8%2C7.553%2C7.553%2C8%2C7%2C8z%22%2F%3E%3C%2Fsvg%3E\");\n}\n.ui-icon-arrow-d-l:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpolygon%20fill%3D%22%23FFF%22%20points%3D%2214%2C3%2011%2C0%203.5%2C7.5%200%2C4%200%2C14%2010%2C14%206.5%2C10.5%20%22%2F%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3C%2Fsvg%3E\");\n}\n.ui-icon-arrow-d-r:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpolygon%20fill%3D%22%23FFF%22%20points%3D%2210.5%2C7.5%203%2C0%200%2C3%207.5%2C10.5%204%2C14%2014%2C14%2014%2C4%20%22%2F%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3C%2Fsvg%3E\");\n}\n.ui-icon-arrow-d:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpolygon%20fill%3D%22%23FFF%22%20points%3D%229%2C7%209%2C0%205%2C0%205%2C7%200%2C7%207%2C14%2014%2C7%20%22%2F%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3C%2Fsvg%3E\");\n}\n.ui-icon-arrow-l:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpolygon%20fill%3D%22%23FFF%22%20points%3D%227%2C5%207%2C0%200%2C7%207%2C14%207%2C9%2014%2C9%2014%2C5%20%22%2F%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3C%2Fsvg%3E\");\n}\n.ui-icon-arrow-r:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpolygon%20fill%3D%22%23FFF%22%20points%3D%2214%2C7%207%2C0%207%2C5%200%2C5%200%2C9%207%2C9%207%2C14%20%22%2F%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3C%2Fsvg%3E\");\n}\n.ui-icon-arrow-u-l:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpolygon%20fill%3D%22%23FFF%22%20points%3D%2214%2C11%206.5%2C3.5%2010%2C0%200%2C0%200%2C10%203.5%2C6.5%2011%2C14%20%22%2F%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3C%2Fsvg%3E\");\n}\n.ui-icon-arrow-u-r:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpolygon%20fill%3D%22%23FFF%22%20points%3D%2214%2C0%204%2C0%207.5%2C3.5%200%2C11%203%2C14%2010.5%2C6.5%2014%2C10%20%22%2F%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3C%2Fsvg%3E\");\n}\n.ui-icon-arrow-u:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpolygon%20fill%3D%22%23FFF%22%20points%3D%227%2C0%200%2C7%205%2C7%205%2C14%209%2C14%209%2C7%2014%2C7%20%22%2F%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3C%2Fsvg%3E\");\n}\n.ui-icon-audio:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214.018px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014.018%2014%22%20style%3D%22enable-background%3Anew%200%200%2014.018%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20fill%3D%22%23FFF%22%20d%3D%22M1%2C4C0.447%2C4%2C0%2C4.447%2C0%2C5v4c0%2C0.553%2C0.447%2C1%2C1%2C1h1l4%2C4V0L2%2C4H1z%20M10.346%2C7c0-1.699-1.042-3.154-2.546-3.867L6.982%2C4.68%20C7.885%2C5.107%2C8.51%2C5.98%2C8.51%2C7S7.885%2C8.893%2C6.982%2C9.32L7.8%2C10.867C9.304%2C10.154%2C10.346%2C8.699%2C10.346%2C7z%20M9.447%2C0.017L8.618%2C1.586%20C10.723%2C2.584%2C12.182%2C4.621%2C12.182%2C7s-1.459%2C4.416-3.563%2C5.414l0.829%2C1.569c2.707-1.283%2C4.57-3.925%2C4.57-6.983%20S12.154%2C1.3%2C9.447%2C0.017z%22%2F%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3C%2Fsvg%3E\");\n}\n.ui-icon-back:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20style%3D%22fill%3A%23FFFFFF%3B%22%20d%3D%22M5%2C3V0L1%2C4l4%2C4V5c0%2C0%2C6%2C0%2C6%2C3s-5%2C4-5%2C4v2c0%2C0%2C7-1%2C7-6C13%2C4%2C8%2C3%2C5%2C3z%22%2F%3E%3C%2Fsvg%3E\");\n}\n.ui-icon-bars:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20style%3D%22fill%3A%23FFFFFF%3B%22%20d%3D%22M1%2C4h12c0.553%2C0%2C1-0.447%2C1-1s-0.447-1-1-1H1C0.447%2C2%2C0%2C2.447%2C0%2C3S0.447%2C4%2C1%2C4z%20M13%2C6H1%20C0.447%2C6%2C0%2C6.447%2C0%2C7c0%2C0.553%2C0.447%2C1%2C1%2C1h12c0.553%2C0%2C1-0.447%2C1-1C14%2C6.447%2C13.553%2C6%2C13%2C6z%20M13%2C10H1c-0.553%2C0-1%2C0.447-1%2C1%20s0.447%2C1%2C1%2C1h12c0.553%2C0%2C1-0.447%2C1-1S13.553%2C10%2C13%2C10z%22%2F%3E%3C%2Fsvg%3E\");\n}\n.ui-icon-bullets:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20style%3D%22fill%3A%23FFFFFF%3B%22%20d%3D%22M5%2C4h8c0.553%2C0%2C1-0.447%2C1-1s-0.447-1-1-1H5C4.447%2C2%2C4%2C2.447%2C4%2C3S4.447%2C4%2C5%2C4z%20M13%2C6H5%20C4.447%2C6%2C4%2C6.447%2C4%2C7c0%2C0.553%2C0.447%2C1%2C1%2C1h8c0.553%2C0%2C1-0.447%2C1-1C14%2C6.447%2C13.553%2C6%2C13%2C6z%20M13%2C10H5c-0.553%2C0-1%2C0.447-1%2C1%20s0.447%2C1%2C1%2C1h8c0.553%2C0%2C1-0.447%2C1-1S13.553%2C10%2C13%2C10z%20M1%2C2C0.447%2C2%2C0%2C2.447%2C0%2C3s0.447%2C1%2C1%2C1s1-0.447%2C1-1S1.553%2C2%2C1%2C2z%20M1%2C6%20C0.447%2C6%2C0%2C6.447%2C0%2C7c0%2C0.553%2C0.447%2C1%2C1%2C1s1-0.447%2C1-1C2%2C6.447%2C1.553%2C6%2C1%2C6z%20M1%2C10c-0.553%2C0-1%2C0.447-1%2C1s0.447%2C1%2C1%2C1s1-0.447%2C1-1%20S1.553%2C10%2C1%2C10z%22%2F%3E%3C%2Fsvg%3E\");\n}\n.ui-icon-calendar:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20fill%3D%22%23FFF%22%20d%3D%22M0%2C8h2V6H0V8z%20M3%2C8h2V6H3V8z%20M6%2C8h2V6H6V8z%20M9%2C8h2V6H9V8z%20M12%2C8h2V6h-2V8z%20M0%2C11h2V9H0V11z%20M3%2C11h2V9H3V11z%20M6%2C11h2V9H6V11z%20%20M9%2C11h2V9H9V11z%20M12%2C11h2V9h-2V11z%20M0%2C14h2v-2H0V14z%20M3%2C14h2v-2H3V14z%20M6%2C14h2v-2H6V14z%20M9%2C14h2v-2H9V14z%20M12%2C1%20c0-0.553-0.447-1-1-1s-1%2C0.447-1%2C1H4c0-0.553-0.447-1-1-1S2%2C0.447%2C2%2C1H0v4h14V1H12z%22%2F%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3C%2Fsvg%3E\");\n}\n.ui-icon-camera:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20style%3D%22fill%3A%23FFFFFF%3B%22%20d%3D%22M12%2C2.5H9.908c-0.206-0.581-0.756-1-1.408-1h-3c-0.652%2C0-1.202%2C0.419-1.408%2C1H2c-1.104%2C0-2%2C0.896-2%2C2%20v6c0%2C1.104%2C0.896%2C2%2C2%2C2h10c1.104%2C0%2C2-0.896%2C2-2v-6C14%2C3.396%2C13.104%2C2.5%2C12%2C2.5z%20M7%2C10.5c-1.657%2C0-3-1.344-3-3c0-1.657%2C1.343-3%2C3-3%20s3%2C1.343%2C3%2C3C10%2C9.156%2C8.657%2C10.5%2C7%2C10.5z%20M7%2C5.5c-1.104%2C0-2%2C0.896-2%2C2c0%2C1.104%2C0.896%2C2%2C2%2C2c1.104%2C0%2C2-0.896%2C2-2%20C9%2C6.396%2C8.104%2C5.5%2C7%2C5.5z%22%2F%3E%3C%2Fsvg%3E\");\n}\n.ui-icon-carat-d:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpolygon%20style%3D%22fill%3A%23FFFFFF%3B%22%20points%3D%2211.949%2C3.404%207%2C8.354%202.05%2C3.404%20-0.071%2C5.525%207%2C12.596%2014.07%2C5.525%20%22%2F%3E%3C%2Fsvg%3E\");\n}\n.ui-icon-carat-l:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpolygon%20style%3D%22fill%3A%23FFFFFF%3B%22%20points%3D%2210.596%2C11.949%205.646%2C7%2010.596%2C2.05%208.475%2C-0.071%201.404%2C7%208.475%2C14.07%20%22%2F%3E%3C%2Fsvg%3E\");\n}\n.ui-icon-carat-r:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpolygon%20style%3D%22fill%3A%23FFFFFF%3B%22%20points%3D%223.404%2C2.051%208.354%2C7%203.404%2C11.95%205.525%2C14.07%2012.596%2C7%205.525%2C-0.071%20%22%2F%3E%3C%2Fsvg%3E\");\n}\n.ui-icon-carat-u:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpolygon%20style%3D%22fill%3A%23FFFFFF%3B%22%20points%3D%222.051%2C10.596%207%2C5.646%2011.95%2C10.596%2014.07%2C8.475%207%2C1.404%20-0.071%2C8.475%20%22%2F%3E%3C%2Fsvg%3E\");\n}\n.ui-icon-check:after,\n/* Used ui-checkbox-on twice to increase specificity. If active state has background-image for gradient this rule overrides. */\nhtml .ui-btn.ui-checkbox-on.ui-checkbox-on:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpolygon%20style%3D%22fill%3A%23FFFFFF%3B%22%20points%3D%2214%2C4%2011%2C1%205.003%2C6.997%203%2C5%200%2C8%204.966%2C13%204.983%2C12.982%205%2C13%20%22%2F%3E%3C%2Fsvg%3E\");\n}\n.ui-icon-clock:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20fill%3D%22%23FFF%22%20d%3D%22M7%2C0C3.134%2C0%2C0%2C3.134%2C0%2C7s3.134%2C7%2C7%2C7s7-3.134%2C7-7S10.866%2C0%2C7%2C0z%20M7%2C12c-2.762%2C0-5-2.238-5-5s2.238-5%2C5-5s5%2C2.238%2C5%2C5%20S9.762%2C12%2C7%2C12z%20M9%2C6H8V4c0-0.553-0.447-1-1-1S6%2C3.447%2C6%2C4v3c0%2C0.553%2C0.447%2C1%2C1%2C1h2c0.553%2C0%2C1-0.447%2C1-1S9.553%2C6%2C9%2C6z%22%2F%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3C%2Fsvg%3E\");\n}\n.ui-icon-cloud:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20style%3D%22fill%3A%23FFFFFF%3B%22%20d%3D%22M14%2C9.5c0-0.793-0.465-1.473-1.134-1.795C12.949%2C7.484%2C13%2C7.249%2C13%2C7c0-1.104-0.896-2-2-2%20c-0.158%2C0-0.311%2C0.023-0.457%2C0.058C9.816%2C3.549%2C8.286%2C2.5%2C6.5%2C2.5c-2.33%2C0-4.224%2C1.777-4.454%2C4.046C0.883%2C6.76%2C0%2C7.773%2C0%2C9%20c0%2C1.381%2C1.119%2C2.5%2C2.5%2C2.5h10v-0.07C13.361%2C11.206%2C14%2C10.432%2C14%2C9.5z%22%2F%3E%3C%2Fsvg%3E\");\n}\n.ui-icon-comment:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20fill%3D%22%23FFF%22%20d%3D%22M12%2C0H2C0.896%2C0%2C0%2C0.896%2C0%2C2v7c0%2C1.104%2C0.896%2C2%2C2%2C2h1v3l3-3h6c1.104%2C0%2C2-0.896%2C2-2V2C14%2C0.896%2C13.104%2C0%2C12%2C0z%22%2F%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3C%2Fsvg%3E\");\n}\n.ui-icon-delete:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpolygon%20fill%3D%22%23FFF%22%20points%3D%2214%2C3%2011%2C0%207%2C4%203%2C0%200%2C3%204%2C7%200%2C11%203%2C14%207%2C10%2011%2C14%2014%2C11%2010%2C7%20%22%2F%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3C%2Fsvg%3E\");\n}\n.ui-icon-edit:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20fill%3D%22%23FFF%22%20d%3D%22M1%2C10l-1%2C4l4-1l7-7L8%2C3L1%2C10z%20M11%2C0L9%2C2l3%2C3l2-2L11%2C0z%22%2F%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3C%2Fsvg%3E\");\n}\n.ui-icon-eye:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20style%3D%22fill%3A%23FFFFFF%3B%22%20d%3D%22M7%2C2C3%2C2%2C0%2C7%2C0%2C7s3%2C5%2C7%2C5s7-5%2C7-5S11%2C2%2C7%2C2z%20M7%2C10c-1.657%2C0-3-1.344-3-3c0-1.657%2C1.343-3%2C3-3%20s3%2C1.343%2C3%2C3C10%2C8.656%2C8.657%2C10%2C7%2C10z%20M7%2C6C6.448%2C6%2C6%2C6.447%2C6%2C7c0%2C0.553%2C0.448%2C1%2C1%2C1s1-0.447%2C1-1C8%2C6.447%2C7.552%2C6%2C7%2C6z%22%2F%3E%3C%2Fsvg%3E\");\n}\n.ui-icon-forbidden:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20fill%3D%22%23FFF%22%20d%3D%22M12.601%2C11.187C13.476%2C10.018%2C14%2C8.572%2C14%2C7c0-3.866-3.134-7-7-7C5.428%2C0%2C3.982%2C0.524%2C2.813%2C1.399L2.757%2C1.343L2.053%2C2.048%20L2.048%2C2.053L1.343%2C2.758l0.056%2C0.056C0.524%2C3.982%2C0%2C5.428%2C0%2C7c0%2C3.866%2C3.134%2C7%2C7%2C7c1.572%2C0%2C3.018-0.524%2C4.187-1.399l0.056%2C0.057%20l0.705-0.705l0.005-0.005l0.705-0.705L12.601%2C11.187z%20M7%2C2c2.761%2C0%2C5%2C2.238%2C5%2C5c0%2C1.019-0.308%2C1.964-0.832%2C2.754L4.246%2C2.832%20C5.036%2C2.308%2C5.981%2C2%2C7%2C2z%20M7%2C12c-2.761%2C0-5-2.238-5-5c0-1.019%2C0.308-1.964%2C0.832-2.754l6.922%2C6.922C8.964%2C11.692%2C8.019%2C12%2C7%2C12z%22%2F%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3C%2Fsvg%3E\");\n}\n.ui-icon-forward:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20style%3D%22fill%3A%23FFFFFF%3B%22%20d%3D%22M13%2C4L9%2C0v3C6%2C3%2C1%2C4%2C1%2C8c0%2C5%2C7%2C6%2C7%2C6v-2c0%2C0-5-1-5-4s6-3%2C6-3v3L13%2C4z%22%2F%3E%3C%2Fsvg%3E\");\n}\n.ui-icon-gear:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20fill%3D%22%23FFF%22%20d%3D%22M13.621%2C5.904l-1.036-0.259c-0.168-0.042-0.303-0.168-0.355-0.332c-0.092-0.284-0.205-0.559-0.339-0.82%20c-0.079-0.153-0.073-0.337%2C0.017-0.486l0.549-0.915c0.118-0.196%2C0.088-0.448-0.075-0.61l-0.862-0.863%20c-0.162-0.163-0.414-0.193-0.611-0.075l-0.916%2C0.55C9.844%2C2.182%2C9.659%2C2.188%2C9.506%2C2.109C9.244%2C1.975%2C8.97%2C1.861%2C8.686%2C1.77%20c-0.165-0.052-0.29-0.187-0.332-0.354L8.095%2C0.379C8.039%2C0.156%2C7.839%2C0%2C7.609%2C0H6.391c-0.229%2C0-0.43%2C0.156-0.485%2C0.379L5.646%2C1.415%20C5.604%2C1.582%2C5.479%2C1.718%2C5.313%2C1.77c-0.284%2C0.092-0.559%2C0.206-0.82%2C0.34C4.339%2C2.188%2C4.155%2C2.182%2C4.007%2C2.093L3.092%2C1.544%20c-0.196-0.118-0.448-0.087-0.61%2C0.075L1.619%2C2.481C1.457%2C2.644%2C1.426%2C2.896%2C1.544%2C3.093l0.549%2C0.914%20c0.089%2C0.148%2C0.095%2C0.332%2C0.017%2C0.486C1.975%2C4.755%2C1.861%2C5.029%2C1.77%2C5.314c-0.053%2C0.164-0.188%2C0.29-0.354%2C0.332L0.379%2C5.905%20C0.156%2C5.961%2C0%2C6.161%2C0%2C6.391v1.219c0%2C0.229%2C0.156%2C0.43%2C0.379%2C0.485l1.036%2C0.26C1.582%2C8.396%2C1.717%2C8.521%2C1.77%2C8.687%20c0.092%2C0.284%2C0.205%2C0.559%2C0.34%2C0.82C2.188%2C9.66%2C2.182%2C9.844%2C2.093%2C9.993l-0.549%2C0.915c-0.118%2C0.195-0.087%2C0.448%2C0.075%2C0.61%20l0.862%2C0.862c0.162%2C0.163%2C0.414%2C0.193%2C0.61%2C0.075l0.915-0.549c0.148-0.089%2C0.332-0.095%2C0.486-0.017%20c0.262%2C0.135%2C0.536%2C0.248%2C0.82%2C0.34c0.165%2C0.053%2C0.291%2C0.187%2C0.332%2C0.354l0.259%2C1.036C5.96%2C13.844%2C6.16%2C14%2C6.39%2C14h1.22%20c0.229%2C0%2C0.43-0.156%2C0.485-0.379l0.259-1.036c0.042-0.167%2C0.168-0.302%2C0.333-0.354c0.284-0.092%2C0.559-0.205%2C0.82-0.34%20c0.154-0.078%2C0.338-0.072%2C0.486%2C0.017l0.914%2C0.549c0.197%2C0.118%2C0.449%2C0.088%2C0.611-0.074l0.862-0.863%20c0.163-0.162%2C0.193-0.415%2C0.075-0.611l-0.549-0.915c-0.089-0.148-0.096-0.332-0.017-0.485c0.134-0.263%2C0.248-0.536%2C0.339-0.82%20c0.053-0.165%2C0.188-0.291%2C0.355-0.333l1.036-0.259C13.844%2C8.039%2C14%2C7.839%2C14%2C7.609V6.39C14%2C6.16%2C13.844%2C5.96%2C13.621%2C5.904z%20M7%2C10%20c-1.657%2C0-3-1.343-3-3s1.343-3%2C3-3s3%2C1.343%2C3%2C3S8.657%2C10%2C7%2C10z%22%2F%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3C%2Fsvg%3E\");\n}\n.ui-icon-grid:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20fill%3D%22%23FFF%22%20d%3D%22M3%2C0H1C0.447%2C0%2C0%2C0.447%2C0%2C1v2c0%2C0.553%2C0.447%2C1%2C1%2C1h2c0.553%2C0%2C1-0.447%2C1-1V1C4%2C0.447%2C3.553%2C0%2C3%2C0z%20M8%2C0H6%20C5.447%2C0%2C5%2C0.447%2C5%2C1v2c0%2C0.553%2C0.447%2C1%2C1%2C1h2c0.553%2C0%2C1-0.447%2C1-1V1C9%2C0.447%2C8.553%2C0%2C8%2C0z%20M13%2C0h-2c-0.553%2C0-1%2C0.447-1%2C1v2%20c0%2C0.553%2C0.447%2C1%2C1%2C1h2c0.553%2C0%2C1-0.447%2C1-1V1C14%2C0.447%2C13.553%2C0%2C13%2C0z%20M3%2C5H1C0.447%2C5%2C0%2C5.447%2C0%2C6v2c0%2C0.553%2C0.447%2C1%2C1%2C1h2%20c0.553%2C0%2C1-0.447%2C1-1V6C4%2C5.447%2C3.553%2C5%2C3%2C5z%20M8%2C5H6C5.447%2C5%2C5%2C5.447%2C5%2C6v2c0%2C0.553%2C0.447%2C1%2C1%2C1h2c0.553%2C0%2C1-0.447%2C1-1V6%20C9%2C5.447%2C8.553%2C5%2C8%2C5z%20M13%2C5h-2c-0.553%2C0-1%2C0.447-1%2C1v2c0%2C0.553%2C0.447%2C1%2C1%2C1h2c0.553%2C0%2C1-0.447%2C1-1V6C14%2C5.447%2C13.553%2C5%2C13%2C5z%20M3%2C10%20H1c-0.553%2C0-1%2C0.447-1%2C1v2c0%2C0.553%2C0.447%2C1%2C1%2C1h2c0.553%2C0%2C1-0.447%2C1-1v-2C4%2C10.447%2C3.553%2C10%2C3%2C10z%20M8%2C10H6c-0.553%2C0-1%2C0.447-1%2C1v2%20c0%2C0.553%2C0.447%2C1%2C1%2C1h2c0.553%2C0%2C1-0.447%2C1-1v-2C9%2C10.447%2C8.553%2C10%2C8%2C10z%20M13%2C10h-2c-0.553%2C0-1%2C0.447-1%2C1v2c0%2C0.553%2C0.447%2C1%2C1%2C1h2%20c0.553%2C0%2C1-0.447%2C1-1v-2C14%2C10.447%2C13.553%2C10%2C13%2C10z%22%2F%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3C%2Fsvg%3E\");\n}\n.ui-icon-heart:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20style%3D%22fill%3A%23FFFFFF%3B%22%20d%3D%22M7%2C1.872c-2-3-7-2-7%2C2c0%2C3%2C4%2C7%2C4%2C7s2.417%2C2.479%2C3%2C3c0.583-0.521%2C3-3%2C3-3s4-4%2C4-7%20C14-0.128%2C9-1.128%2C7%2C1.872z%22%2F%3E%3C%2Fsvg%3E\");\n}\n.ui-icon-home:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpolygon%20fill%3D%22%23FFF%22%20points%3D%227%2C0%200%2C7%202%2C7%202%2C14%205%2C14%205%2C9%209%2C9%209%2C14%2012%2C14%2012%2C7%2014%2C7%20%22%2F%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3C%2Fsvg%3E\");\n}\n.ui-icon-info:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20fill%3D%22%23FFF%22%20d%3D%22M7%2C0C3.134%2C0%2C0%2C3.134%2C0%2C7s3.134%2C7%2C7%2C7s7-3.134%2C7-7S10.866%2C0%2C7%2C0z%20M7%2C2c0.552%2C0%2C1%2C0.447%2C1%2C1S7.552%2C4%2C7%2C4S6%2C3.553%2C6%2C3%20S6.448%2C2%2C7%2C2z%20M9%2C11H5v-1h1V6H5V5h3v5h1V11z%22%2F%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3C%2Fsvg%3E\");\n}\n.ui-icon-location:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20style%3D%22fill%3A%23FFFFFF%3B%22%20d%3D%22M7%2C0C4.791%2C0%2C3%2C1.791%2C3%2C4c0%2C2%2C4%2C10%2C4%2C10s4-8%2C4-10C11%2C1.791%2C9.209%2C0%2C7%2C0z%20M7%2C6C5.896%2C6%2C5%2C5.104%2C5%2C4%20s0.896-2%2C2-2c1.104%2C0%2C2%2C0.896%2C2%2C2S8.104%2C6%2C7%2C6z%22%2F%3E%3C%2Fsvg%3E\");\n}\n.ui-icon-lock:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20style%3D%22fill%3A%23FFFFFF%3B%22%20d%3D%22M12%2C6V5c0-2.762-2.238-5-5-5C4.239%2C0%2C2%2C2.238%2C2%2C5v1H1v8h12V6H12z%20M7.5%2C9.848V12h-1V9.848%20C6.207%2C9.673%2C6%2C9.366%2C6%2C9c0-0.553%2C0.448-1%2C1-1s1%2C0.447%2C1%2C1C8%2C9.366%2C7.793%2C9.673%2C7.5%2C9.848z%20M10%2C6H4V5c0-1.657%2C1.343-3%2C3-3%20s3%2C1.343%2C3%2C3V6z%22%2F%3E%3C%2Fsvg%3E\");\n}\n.ui-icon-mail:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20style%3D%22fill%3A%23FFFFFF%3B%22%20d%3D%22M0%2C3.75V12h14V3.75L7%2C9L0%2C3.75z%20M14%2C2H0l7%2C5L14%2C2z%22%2F%3E%3C%2Fsvg%3E\");\n}\n.ui-icon-minus:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Crect%20y%3D%225%22%20style%3D%22fill%3A%23FFFFFF%3B%22%20width%3D%2214%22%20height%3D%224%22%2F%3E%3C%2Fsvg%3E\");\n}\n.ui-icon-navigation:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpolygon%20style%3D%22fill%3A%23FFFFFF%3B%22%20points%3D%2213%2C1%200%2C6%207%2C7%208%2C14%20%22%2F%3E%3C%2Fsvg%3E\");\n}\n.ui-icon-phone:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%22-0.01%200.008%2014%2014%22%20style%3D%22enable-background%3Anew%20-0.01%200.008%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20style%3D%22fill%3A%23FFFFFF%3B%22%20d%3D%22M6.939%2C9.189C6.165%2C8.557%2C5.271%2C7.705%2C4.497%2C6.744C3.953%2C6.071%2C3.473%2C5.363%2C3.969%2C4.866l-3.482-3.48%20C-0.021%2C2.02-1.146%2C5.04%2C3.675%2C9.984c5.08%2C5.211%2C8.356%2C4.097%2C8.92%2C3.511l-3.396-3.4C8.725%2C10.568%2C8.113%2C10.146%2C6.939%2C9.189z%20%20M13.82%2C11.519v-0.004c0%2C0-2.648-2.646-2.649-2.647c-0.21-0.211-0.546-0.205-0.754%2C0.002L9.455%2C9.831l3.403%2C3.407%20c0%2C0%2C0.962-0.96%2C0.961-0.961l0.002-0.001C14.043%2C12.056%2C14.021%2C11.721%2C13.82%2C11.519z%20M5.192%2C3.644V3.642%20c0.222-0.222%2C0.2-0.557%2C0-0.758V2.881c0%2C0-2.726-2.725-2.727-2.726C2.255-0.055%2C1.92-0.05%2C1.712%2C0.156L0.751%2C1.121l3.479%2C3.482%20C4.231%2C4.604%2C5.192%2C3.645%2C5.192%2C3.644z%22%2F%3E%3C%2Fsvg%3E\");\n}\n.ui-icon-plus:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpolygon%20fill%3D%22%23FFF%22%20points%3D%2214%2C5%209%2C5%209%2C0%205%2C0%205%2C5%200%2C5%200%2C9%205%2C9%205%2C14%209%2C14%209%2C9%2014%2C9%20%22%2F%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3C%2Fsvg%3E\");\n}\n.ui-icon-power:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20style%3D%22fill%3A%23FFFFFF%3B%22%20d%3D%22M11.243%2C2.408c-0.392-0.401-1.024-0.401-1.415%2C0c-0.391%2C0.401-0.391%2C1.054%2C0%2C1.455%20C10.584%2C4.642%2C11%2C5.675%2C11%2C6.773s-0.416%2C2.133-1.172%2C2.91c-1.512%2C1.558-4.145%2C1.558-5.656%2C0C3.416%2C8.904%2C3%2C7.872%2C3%2C6.773%20C3%2C5.673%2C3.416%2C4.64%2C4.172%2C3.863c0.39-0.401%2C0.39-1.054%2C0-1.455c-0.391-0.401-1.024-0.401-1.415%2C0C1.624%2C3.574%2C1%2C5.125%2C1%2C6.773%20c0%2C1.647%2C0.624%2C3.199%2C1.757%2C4.365c1.134%2C1.166%2C2.64%2C1.809%2C4.243%2C1.809c1.604%2C0%2C3.109-0.645%2C4.243-1.811%20C12.376%2C9.975%2C13%2C8.423%2C13%2C6.773C13%2C5.125%2C12.376%2C3.574%2C11.243%2C2.408z%20M7%2C8.053c0.553%2C0%2C1-0.445%2C1-1v-6c0-0.553-0.447-1-1-1%20c-0.553%2C0-1%2C0.447-1%2C1v6C6%2C7.604%2C6.447%2C8.053%2C7%2C8.053z%22%2F%3E%3C%2Fsvg%3E\");\n}\n.ui-icon-recycle:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20style%3D%22fill%3A%23FFFFFF%3B%22%20d%3D%22M3%2C7h1L2%2C4L0%2C7h1c0%2C3.313%2C2.687%2C6%2C6%2C6c0.702%2C0%2C1.374-0.127%2C2-0.35v-2.205C8.41%2C10.789%2C7.732%2C11%2C7%2C11%20C4.791%2C11%2C3%2C9.209%2C3%2C7z%20M13%2C7c0-3.313-2.688-6-6-6C6.298%2C1%2C5.626%2C1.127%2C5%2C1.349v2.206C5.59%2C3.211%2C6.268%2C3%2C7%2C3c2.209%2C0%2C4%2C1.791%2C4%2C4%20h-1l2%2C3l2-3H13z%22%2F%3E%3C%2Fsvg%3E\");\n}\n.ui-icon-refresh:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214.001px%22%20height%3D%2214.002px%22%20viewBox%3D%220%200%2014.001%2014.002%22%20style%3D%22enable-background%3Anew%200%200%2014.001%2014.002%3B%22%20%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20fill%3D%22%23FFF%22%20d%3D%22M14.001%2C6.001v-6l-2.06%2C2.06c-0.423-0.424-0.897-0.809-1.44-1.122C7.153-0.994%2C2.872%2C0.153%2C0.939%2C3.501%20c-1.933%2C3.348-0.786%2C7.629%2C2.562%2C9.562c3.348%2C1.933%2C7.629%2C0.785%2C9.562-2.562l-1.732-1c-1.381%2C2.392-4.438%2C3.211-6.83%2C1.83%20s-3.211-4.438-1.83-6.83s4.438-3.211%2C6.83-1.83c0.389%2C0.225%2C0.718%2C0.506%2C1.02%2C0.81l-2.52%2C2.52H14.001z%22%2F%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3C%2Fsvg%3E\");\n}\n.ui-icon-search:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20style%3D%22fill%3A%23FFFFFF%3B%22%20d%3D%22M10.171%2C8.766c0.617-0.888%2C0.979-1.964%2C0.979-3.126c0-3.037-2.463-5.5-5.5-5.5s-5.5%2C2.463-5.5%2C5.5%20s2.463%2C5.5%2C5.5%2C5.5c1.152%2C0%2C2.223-0.355%2C3.104-0.962l3.684%2C3.683l1.414-1.414L10.171%2C8.766z%20M5.649%2C9.14c-1.933%2C0-3.5-1.567-3.5-3.5%20c0-1.933%2C1.567-3.5%2C3.5-3.5c1.933%2C0%2C3.5%2C1.567%2C3.5%2C3.5C9.149%2C7.572%2C7.582%2C9.14%2C5.649%2C9.14z%22%2F%3E%3C%2Fsvg%3E\");\n}\n.ui-icon-shop:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20style%3D%22fill%3A%23FFFFFF%3B%22%20d%3D%22M10%2C4V3c0-1.657-1.343-3-3-3S4%2C1.343%2C4%2C3v1H1v10h12V4H10z%20M4.5%2C6C4.224%2C6%2C4%2C5.776%2C4%2C5.5%20S4.224%2C5%2C4.5%2C5S5%2C5.224%2C5%2C5.5S4.776%2C6%2C4.5%2C6z%20M5%2C3c0-1.104%2C0.896-2%2C2-2c1.104%2C0%2C2%2C0.896%2C2%2C2v1H5V3z%20M9.5%2C6C9.225%2C6%2C9%2C5.776%2C9%2C5.5%20S9.225%2C5%2C9.5%2C5S10%2C5.224%2C10%2C5.5S9.775%2C6%2C9.5%2C6z%22%2F%3E%3C%2Fsvg%3E\");\n}\n.ui-icon-star:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpolygon%20style%3D%22fill%3A%23FFFFFF%3B%22%20points%3D%2214%2C5%209%2C5%207%2C0%205%2C5%200%2C5%204%2C8%202.625%2C13%207%2C10%2011.375%2C13%2010%2C8%20%22%2F%3E%3C%2Fsvg%3E\");\n}\n.ui-icon-tag:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20fill%3D%22%23FFF%22%20d%3D%22M5%2C0H0v5l9%2C9l5-5L5%2C0z%20M3%2C4C2.447%2C4%2C2%2C3.553%2C2%2C3s0.447-1%2C1-1s1%2C0.447%2C1%2C1S3.553%2C4%2C3%2C4z%22%2F%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3C%2Fsvg%3E\");\n}\n.ui-icon-user:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20fill%3D%22%23FFF%22%20d%3D%22M8.851%2C10.101c-0.18-0.399-0.2-0.763-0.153-1.104C9.383%2C8.49%2C9.738%2C7.621%2C9.891%2C6.465C10.493%2C6.355%2C10.5%2C5.967%2C10.5%2C5.5%20c0-0.437-0.008-0.804-0.502-0.94C9.999%2C4.539%2C10%2C4.521%2C10%2C4.5c0-2.103-1-4-2-4C8%2C0.5%2C7.5%2C0%2C6.5%2C0C5%2C0%2C4%2C1.877%2C4%2C4.5%20c0%2C0.021%2C0.001%2C0.039%2C0.002%2C0.06C3.508%2C4.696%2C3.5%2C5.063%2C3.5%2C5.5c0%2C0.467%2C0.007%2C0.855%2C0.609%2C0.965%20C4.262%2C7.621%2C4.617%2C8.49%2C5.303%2C8.997c0.047%2C0.341%2C0.026%2C0.704-0.153%2C1.104C1.503%2C10.503%2C0%2C12%2C0%2C12v2h14v-2%20C14%2C12%2C12.497%2C10.503%2C8.851%2C10.101z%22%2F%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3C%2Fsvg%3E\");\n}\n.ui-icon-video:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%20-2%2014%2014%22%20style%3D%22enable-background%3Anew%200%20-2%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20style%3D%22fill%3A%23FFFFFF%3B%22%20d%3D%22M8%2C0H2C0.896%2C0%2C0%2C0.896%2C0%2C2v6c0%2C1.104%2C0.896%2C2%2C2%2C2h6c1.104%2C0%2C2-0.896%2C2-2V5V2C10%2C0.896%2C9.104%2C0%2C8%2C0z%20%20M10%2C5l4%2C4V1L10%2C5z%22%2F%3E%3C%2Fsvg%3E\");\n}\n/* Alt icons */\n.ui-alt-icon.ui-icon-action:after,\n.ui-alt-icon .ui-icon-action:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20d%3D%22M9%2C5v3l5-4L9%2C0v3c0%2C0-5%2C0-5%2C7C6%2C5%2C9%2C5%2C9%2C5z%20M11%2C12H2V5h1l2-2H0v11h13V7l-2%2C2V12z%22%2F%3E%3C%2Fsvg%3E\");\n}\n.ui-alt-icon.ui-icon-alert:after,\n.ui-alt-icon .ui-icon-alert:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20d%3D%22M7%2C0L0%2C12h14L7%2C0z%20M7%2C11c-0.553%2C0-1-0.447-1-1s0.447-1%2C1-1c0.553%2C0%2C1%2C0.447%2C1%2C1S7.553%2C11%2C7%2C11z%20M7%2C8C6.447%2C8%2C6%2C7.553%2C6%2C7V5%20c0-0.553%2C0.447-1%2C1-1c0.553%2C0%2C1%2C0.447%2C1%2C1v2C8%2C7.553%2C7.553%2C8%2C7%2C8z%22%2F%3E%3C%2Fsvg%3E\");\n}\n.ui-alt-icon.ui-icon-arrow-d:after,\n.ui-alt-icon .ui-icon-arrow-d:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpolygon%20points%3D%229%2C7%209%2C0%205%2C0%205%2C7%200%2C7%207%2C14%2014%2C7%20%22%2F%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3C%2Fsvg%3E\");\n}\n.ui-alt-icon.ui-icon-arrow-d-l:after,\n.ui-alt-icon .ui-icon-arrow-d-l:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpolygon%20points%3D%2214%2C3%2011%2C0%203.5%2C7.5%200%2C4%200%2C14%2010%2C14%206.5%2C10.5%20%22%2F%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3C%2Fsvg%3E\");\n}\n.ui-alt-icon.ui-icon-arrow-d-r:after,\n.ui-alt-icon .ui-icon-arrow-d-r:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpolygon%20points%3D%2210.5%2C7.5%203%2C0%200%2C3%207.5%2C10.5%204%2C14%2014%2C14%2014%2C4%20%22%2F%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3C%2Fsvg%3E\");\n}\n.ui-alt-icon.ui-icon-arrow-l:after,\n.ui-alt-icon .ui-icon-arrow-l:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpolygon%20points%3D%227%2C5%207%2C0%200%2C7%207%2C14%207%2C9%2014%2C9%2014%2C5%20%22%2F%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3C%2Fsvg%3E\");\n}\n.ui-alt-icon.ui-icon-arrow-r:after,\n.ui-alt-icon .ui-icon-arrow-r:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpolygon%20points%3D%2214%2C7%207%2C0%207%2C5%200%2C5%200%2C9%207%2C9%207%2C14%20%22%2F%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3C%2Fsvg%3E\");\n}\n.ui-alt-icon.ui-icon-arrow-u:after,\n.ui-alt-icon .ui-icon-arrow-u:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpolygon%20points%3D%227%2C0%200%2C7%205%2C7%205%2C14%209%2C14%209%2C7%2014%2C7%20%22%2F%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3C%2Fsvg%3E\");\n}\n.ui-alt-icon.ui-icon-arrow-u-l:after,\n.ui-alt-icon .ui-icon-arrow-u-l:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpolygon%20points%3D%2214%2C11%206.5%2C3.5%2010%2C0%200%2C0%200%2C10%203.5%2C6.5%2011%2C14%20%22%2F%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3C%2Fsvg%3E\");\n}\n.ui-alt-icon.ui-icon-arrow-u-r:after,\n.ui-alt-icon .ui-icon-arrow-u-r:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpolygon%20points%3D%2214%2C0%204%2C0%207.5%2C3.5%200%2C11%203%2C14%2010.5%2C6.5%2014%2C10%20%22%2F%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3C%2Fsvg%3E\");\n}\n.ui-alt-icon.ui-icon-audio:after,\n.ui-alt-icon .ui-icon-audio:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214.018px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014.018%2014%22%20style%3D%22enable-background%3Anew%200%200%2014.018%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20d%3D%22M1%2C4C0.447%2C4%2C0%2C4.447%2C0%2C5v4c0%2C0.553%2C0.447%2C1%2C1%2C1h1l4%2C4V0L2%2C4H1z%20M10.346%2C7c0-1.699-1.042-3.154-2.546-3.867L6.982%2C4.68%20C7.885%2C5.107%2C8.51%2C5.98%2C8.51%2C7S7.885%2C8.893%2C6.982%2C9.32L7.8%2C10.867C9.304%2C10.154%2C10.346%2C8.699%2C10.346%2C7z%20M9.447%2C0.017L8.618%2C1.586%20C10.723%2C2.584%2C12.182%2C4.621%2C12.182%2C7s-1.459%2C4.416-3.563%2C5.414l0.829%2C1.569c2.707-1.283%2C4.57-3.925%2C4.57-6.983%20S12.154%2C1.3%2C9.447%2C0.017z%22%2F%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3C%2Fsvg%3E\");\n}\n.ui-alt-icon.ui-icon-back:after,\n.ui-alt-icon .ui-icon-back:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20d%3D%22M5%2C3V0L1%2C4l4%2C4V5c0%2C0%2C6%2C0%2C6%2C3s-5%2C4-5%2C4v2c0%2C0%2C7-1%2C7-6C13%2C4%2C8%2C3%2C5%2C3z%22%2F%3E%3C%2Fsvg%3E\");\n}\n.ui-alt-icon.ui-icon-bars:after,\n.ui-alt-icon .ui-icon-bars:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20d%3D%22M1%2C4h12c0.553%2C0%2C1-0.447%2C1-1s-0.447-1-1-1H1C0.447%2C2%2C0%2C2.447%2C0%2C3S0.447%2C4%2C1%2C4z%20M13%2C6H1C0.447%2C6%2C0%2C6.447%2C0%2C7%20c0%2C0.553%2C0.447%2C1%2C1%2C1h12c0.553%2C0%2C1-0.447%2C1-1C14%2C6.447%2C13.553%2C6%2C13%2C6z%20M13%2C10H1c-0.553%2C0-1%2C0.447-1%2C1s0.447%2C1%2C1%2C1h12%20c0.553%2C0%2C1-0.447%2C1-1S13.553%2C10%2C13%2C10z%22%2F%3E%3C%2Fsvg%3E\");\n}\n.ui-alt-icon.ui-icon-bullets:after,\n.ui-alt-icon .ui-icon-bullets:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20d%3D%22M5%2C4h8c0.553%2C0%2C1-0.447%2C1-1s-0.447-1-1-1H5C4.447%2C2%2C4%2C2.447%2C4%2C3S4.447%2C4%2C5%2C4z%20M13%2C6H5C4.447%2C6%2C4%2C6.447%2C4%2C7%20c0%2C0.553%2C0.447%2C1%2C1%2C1h8c0.553%2C0%2C1-0.447%2C1-1C14%2C6.447%2C13.553%2C6%2C13%2C6z%20M13%2C10H5c-0.553%2C0-1%2C0.447-1%2C1s0.447%2C1%2C1%2C1h8%20c0.553%2C0%2C1-0.447%2C1-1S13.553%2C10%2C13%2C10z%20M1%2C2C0.447%2C2%2C0%2C2.447%2C0%2C3s0.447%2C1%2C1%2C1s1-0.447%2C1-1S1.553%2C2%2C1%2C2z%20M1%2C6C0.447%2C6%2C0%2C6.447%2C0%2C7%20c0%2C0.553%2C0.447%2C1%2C1%2C1s1-0.447%2C1-1C2%2C6.447%2C1.553%2C6%2C1%2C6z%20M1%2C10c-0.553%2C0-1%2C0.447-1%2C1s0.447%2C1%2C1%2C1s1-0.447%2C1-1S1.553%2C10%2C1%2C10z%22%2F%3E%3C%2Fsvg%3E\");\n}\n.ui-alt-icon.ui-icon-calendar:after,\n.ui-alt-icon .ui-icon-calendar:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20d%3D%22M0%2C8h2V6H0V8z%20M3%2C8h2V6H3V8z%20M6%2C8h2V6H6V8z%20M9%2C8h2V6H9V8z%20M12%2C8h2V6h-2V8z%20M0%2C11h2V9H0V11z%20M3%2C11h2V9H3V11z%20M6%2C11h2V9H6V11z%20%20M9%2C11h2V9H9V11z%20M12%2C11h2V9h-2V11z%20M0%2C14h2v-2H0V14z%20M3%2C14h2v-2H3V14z%20M6%2C14h2v-2H6V14z%20M9%2C14h2v-2H9V14z%20M12%2C1%20c0-0.553-0.447-1-1-1s-1%2C0.447-1%2C1H4c0-0.553-0.447-1-1-1S2%2C0.447%2C2%2C1H0v4h14V1H12z%22%2F%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3C%2Fsvg%3E\");\n}\n.ui-alt-icon.ui-icon-camera:after,\n.ui-alt-icon .ui-icon-camera:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20d%3D%22M12%2C2.5H9.908c-0.206-0.581-0.756-1-1.408-1h-3c-0.652%2C0-1.202%2C0.419-1.408%2C1H2c-1.104%2C0-2%2C0.896-2%2C2v6c0%2C1.104%2C0.896%2C2%2C2%2C2%20h10c1.104%2C0%2C2-0.896%2C2-2v-6C14%2C3.396%2C13.104%2C2.5%2C12%2C2.5z%20M7%2C10.5c-1.657%2C0-3-1.344-3-3c0-1.657%2C1.343-3%2C3-3s3%2C1.343%2C3%2C3%20C10%2C9.156%2C8.657%2C10.5%2C7%2C10.5z%20M7%2C5.5c-1.104%2C0-2%2C0.896-2%2C2c0%2C1.104%2C0.896%2C2%2C2%2C2c1.104%2C0%2C2-0.896%2C2-2C9%2C6.396%2C8.104%2C5.5%2C7%2C5.5z%22%2F%3E%3C%2Fsvg%3E\");\n}\n.ui-alt-icon.ui-icon-carat-d:after,\n.ui-alt-icon .ui-icon-carat-d:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpolygon%20points%3D%2211.949%2C3.404%207%2C8.354%202.05%2C3.404%20-0.071%2C5.525%207%2C12.596%2014.07%2C5.525%20%22%2F%3E%3C%2Fsvg%3E\");\n}\n.ui-alt-icon.ui-icon-carat-l:after,\n.ui-alt-icon .ui-icon-carat-l:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpolygon%20points%3D%2210.596%2C11.949%205.646%2C7%2010.596%2C2.05%208.475%2C-0.071%201.404%2C7%208.475%2C14.07%20%22%2F%3E%3C%2Fsvg%3E\");\n}\n.ui-alt-icon.ui-icon-carat-r:after,\n.ui-alt-icon .ui-icon-carat-r:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpolygon%20points%3D%223.404%2C2.051%208.354%2C7%203.404%2C11.95%205.525%2C14.07%2012.596%2C7%205.525%2C-0.071%20%22%2F%3E%3C%2Fsvg%3E\");\n}\n.ui-alt-icon.ui-icon-carat-u:after,\n.ui-alt-icon .ui-icon-carat-u:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpolygon%20points%3D%222.051%2C10.596%207%2C5.646%2011.95%2C10.596%2014.07%2C8.475%207%2C1.404%20-0.071%2C8.475%20%22%2F%3E%3C%2Fsvg%3E\");\n}\n.ui-alt-icon.ui-icon-check:after,\n.ui-alt-icon .ui-icon-check:after,\nhtml .ui-alt-icon.ui-btn.ui-checkbox-on:after,\nhtml .ui-alt-icon .ui-btn.ui-checkbox-on:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpolygon%20points%3D%2214%2C4%2011%2C1%205.003%2C6.997%203%2C5%200%2C8%204.966%2C13%204.983%2C12.982%205%2C13%20%22%2F%3E%3C%2Fsvg%3E\");\n}\n.ui-alt-icon.ui-icon-clock:after,\n.ui-alt-icon .ui-icon-clock:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20d%3D%22M7%2C0C3.134%2C0%2C0%2C3.134%2C0%2C7s3.134%2C7%2C7%2C7s7-3.134%2C7-7S10.866%2C0%2C7%2C0z%20M7%2C12c-2.762%2C0-5-2.238-5-5s2.238-5%2C5-5s5%2C2.238%2C5%2C5%20S9.762%2C12%2C7%2C12z%20M9%2C6H8V4c0-0.553-0.447-1-1-1S6%2C3.447%2C6%2C4v3c0%2C0.553%2C0.447%2C1%2C1%2C1h2c0.553%2C0%2C1-0.447%2C1-1S9.553%2C6%2C9%2C6z%22%2F%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3C%2Fsvg%3E\");\n}\n.ui-alt-icon.ui-icon-cloud:after,\n.ui-alt-icon .ui-icon-cloud:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20d%3D%22M14%2C9.5c0-0.793-0.465-1.473-1.134-1.795C12.949%2C7.484%2C13%2C7.249%2C13%2C7c0-1.104-0.896-2-2-2c-0.158%2C0-0.311%2C0.023-0.457%2C0.058%20C9.816%2C3.549%2C8.286%2C2.5%2C6.5%2C2.5c-2.33%2C0-4.224%2C1.777-4.454%2C4.046C0.883%2C6.76%2C0%2C7.773%2C0%2C9c0%2C1.381%2C1.119%2C2.5%2C2.5%2C2.5h10v-0.07%20C13.361%2C11.206%2C14%2C10.432%2C14%2C9.5z%22%2F%3E%3C%2Fsvg%3E\");\n}\n.ui-alt-icon.ui-icon-comment:after,\n.ui-alt-icon .ui-icon-comment:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20d%3D%22M12%2C0H2C0.896%2C0%2C0%2C0.896%2C0%2C2v7c0%2C1.104%2C0.896%2C2%2C2%2C2h1v3l3-3h6c1.104%2C0%2C2-0.896%2C2-2V2C14%2C0.896%2C13.104%2C0%2C12%2C0z%22%2F%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3C%2Fsvg%3E\");\n}\n.ui-alt-icon.ui-icon-delete:after,\n.ui-alt-icon .ui-icon-delete:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpolygon%20points%3D%2214%2C3%2011%2C0%207%2C4%203%2C0%200%2C3%204%2C7%200%2C11%203%2C14%207%2C10%2011%2C14%2014%2C11%2010%2C7%20%22%2F%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3C%2Fsvg%3E\");\n}\n.ui-alt-icon.ui-icon-edit:after,\n.ui-alt-icon .ui-icon-edit:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20d%3D%22M1%2C10l-1%2C4l4-1l7-7L8%2C3L1%2C10z%20M11%2C0L9%2C2l3%2C3l2-2L11%2C0z%22%2F%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3C%2Fsvg%3E\");\n}\n.ui-alt-icon.ui-icon-eye:after,\n.ui-alt-icon .ui-icon-eye:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20d%3D%22M7%2C2C3%2C2%2C0%2C7%2C0%2C7s3%2C5%2C7%2C5s7-5%2C7-5S11%2C2%2C7%2C2z%20M7%2C10c-1.657%2C0-3-1.344-3-3c0-1.657%2C1.343-3%2C3-3s3%2C1.343%2C3%2C3%20C10%2C8.656%2C8.657%2C10%2C7%2C10z%20M7%2C6C6.448%2C6%2C6%2C6.447%2C6%2C7c0%2C0.553%2C0.448%2C1%2C1%2C1s1-0.447%2C1-1C8%2C6.447%2C7.552%2C6%2C7%2C6z%22%2F%3E%3C%2Fsvg%3E\");\n}\n.ui-alt-icon.ui-icon-forbidden:after,\n.ui-alt-icon .ui-icon-forbidden:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20d%3D%22M12.601%2C11.187C13.476%2C10.018%2C14%2C8.572%2C14%2C7c0-3.866-3.134-7-7-7C5.428%2C0%2C3.982%2C0.524%2C2.813%2C1.399L2.757%2C1.343L2.053%2C2.048%20L2.048%2C2.053L1.343%2C2.758l0.056%2C0.056C0.524%2C3.982%2C0%2C5.428%2C0%2C7c0%2C3.866%2C3.134%2C7%2C7%2C7c1.572%2C0%2C3.018-0.524%2C4.187-1.399l0.056%2C0.057%20l0.705-0.705l0.005-0.005l0.705-0.705L12.601%2C11.187z%20M7%2C2c2.761%2C0%2C5%2C2.238%2C5%2C5c0%2C1.019-0.308%2C1.964-0.832%2C2.754L4.246%2C2.832%20C5.036%2C2.308%2C5.981%2C2%2C7%2C2z%20M7%2C12c-2.761%2C0-5-2.238-5-5c0-1.019%2C0.308-1.964%2C0.832-2.754l6.922%2C6.922C8.964%2C11.692%2C8.019%2C12%2C7%2C12z%22%2F%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3C%2Fsvg%3E\");\n}\n.ui-alt-icon.ui-icon-forward:after,\n.ui-alt-icon .ui-icon-forward:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20d%3D%22M13%2C4L9%2C0v3C6%2C3%2C1%2C4%2C1%2C8c0%2C5%2C7%2C6%2C7%2C6v-2c0%2C0-5-1-5-4s6-3%2C6-3v3L13%2C4z%22%2F%3E%3C%2Fsvg%3E\");\n}\n.ui-alt-icon.ui-icon-gear:after,\n.ui-alt-icon .ui-icon-gear:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20d%3D%22M13.621%2C5.904l-1.036-0.259c-0.168-0.042-0.303-0.168-0.355-0.332c-0.092-0.284-0.205-0.559-0.339-0.82%20c-0.079-0.153-0.073-0.337%2C0.017-0.486l0.549-0.915c0.118-0.196%2C0.088-0.448-0.075-0.61l-0.862-0.863%20c-0.162-0.163-0.414-0.193-0.611-0.075l-0.916%2C0.55C9.844%2C2.182%2C9.659%2C2.188%2C9.506%2C2.109C9.244%2C1.975%2C8.97%2C1.861%2C8.686%2C1.77%20c-0.165-0.052-0.29-0.187-0.332-0.354L8.095%2C0.379C8.039%2C0.156%2C7.839%2C0%2C7.609%2C0H6.391c-0.229%2C0-0.43%2C0.156-0.485%2C0.379L5.646%2C1.415%20C5.604%2C1.582%2C5.479%2C1.718%2C5.313%2C1.77c-0.284%2C0.092-0.559%2C0.206-0.82%2C0.34C4.339%2C2.188%2C4.155%2C2.182%2C4.007%2C2.093L3.092%2C1.544%20c-0.196-0.118-0.448-0.087-0.61%2C0.075L1.619%2C2.481C1.457%2C2.644%2C1.426%2C2.896%2C1.544%2C3.093l0.549%2C0.914%20c0.089%2C0.148%2C0.095%2C0.332%2C0.017%2C0.486C1.975%2C4.755%2C1.861%2C5.029%2C1.77%2C5.314c-0.053%2C0.164-0.188%2C0.29-0.354%2C0.332L0.379%2C5.905%20C0.156%2C5.961%2C0%2C6.161%2C0%2C6.391v1.219c0%2C0.229%2C0.156%2C0.43%2C0.379%2C0.485l1.036%2C0.26C1.582%2C8.396%2C1.717%2C8.521%2C1.77%2C8.687%20c0.092%2C0.284%2C0.205%2C0.559%2C0.34%2C0.82C2.188%2C9.66%2C2.182%2C9.844%2C2.093%2C9.993l-0.549%2C0.915c-0.118%2C0.195-0.087%2C0.448%2C0.075%2C0.61%20l0.862%2C0.862c0.162%2C0.163%2C0.414%2C0.193%2C0.61%2C0.075l0.915-0.549c0.148-0.089%2C0.332-0.095%2C0.486-0.017%20c0.262%2C0.135%2C0.536%2C0.248%2C0.82%2C0.34c0.165%2C0.053%2C0.291%2C0.187%2C0.332%2C0.354l0.259%2C1.036C5.96%2C13.844%2C6.16%2C14%2C6.39%2C14h1.22%20c0.229%2C0%2C0.43-0.156%2C0.485-0.379l0.259-1.036c0.042-0.167%2C0.168-0.302%2C0.333-0.354c0.284-0.092%2C0.559-0.205%2C0.82-0.34%20c0.154-0.078%2C0.338-0.072%2C0.486%2C0.017l0.914%2C0.549c0.197%2C0.118%2C0.449%2C0.088%2C0.611-0.074l0.862-0.863%20c0.163-0.162%2C0.193-0.415%2C0.075-0.611l-0.549-0.915c-0.089-0.148-0.096-0.332-0.017-0.485c0.134-0.263%2C0.248-0.536%2C0.339-0.82%20c0.053-0.165%2C0.188-0.291%2C0.355-0.333l1.036-0.259C13.844%2C8.039%2C14%2C7.839%2C14%2C7.609V6.39C14%2C6.16%2C13.844%2C5.96%2C13.621%2C5.904z%20M7%2C10%20c-1.657%2C0-3-1.343-3-3s1.343-3%2C3-3s3%2C1.343%2C3%2C3S8.657%2C10%2C7%2C10z%22%2F%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3C%2Fsvg%3E\");\n}\n.ui-alt-icon.ui-icon-grid:after,\n.ui-alt-icon .ui-icon-grid:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20d%3D%22M3%2C0H1C0.447%2C0%2C0%2C0.447%2C0%2C1v2c0%2C0.553%2C0.447%2C1%2C1%2C1h2c0.553%2C0%2C1-0.447%2C1-1V1C4%2C0.447%2C3.553%2C0%2C3%2C0z%20M8%2C0H6%20C5.447%2C0%2C5%2C0.447%2C5%2C1v2c0%2C0.553%2C0.447%2C1%2C1%2C1h2c0.553%2C0%2C1-0.447%2C1-1V1C9%2C0.447%2C8.553%2C0%2C8%2C0z%20M13%2C0h-2c-0.553%2C0-1%2C0.447-1%2C1v2%20c0%2C0.553%2C0.447%2C1%2C1%2C1h2c0.553%2C0%2C1-0.447%2C1-1V1C14%2C0.447%2C13.553%2C0%2C13%2C0z%20M3%2C5H1C0.447%2C5%2C0%2C5.447%2C0%2C6v2c0%2C0.553%2C0.447%2C1%2C1%2C1h2%20c0.553%2C0%2C1-0.447%2C1-1V6C4%2C5.447%2C3.553%2C5%2C3%2C5z%20M8%2C5H6C5.447%2C5%2C5%2C5.447%2C5%2C6v2c0%2C0.553%2C0.447%2C1%2C1%2C1h2c0.553%2C0%2C1-0.447%2C1-1V6%20C9%2C5.447%2C8.553%2C5%2C8%2C5z%20M13%2C5h-2c-0.553%2C0-1%2C0.447-1%2C1v2c0%2C0.553%2C0.447%2C1%2C1%2C1h2c0.553%2C0%2C1-0.447%2C1-1V6C14%2C5.447%2C13.553%2C5%2C13%2C5z%20M3%2C10%20H1c-0.553%2C0-1%2C0.447-1%2C1v2c0%2C0.553%2C0.447%2C1%2C1%2C1h2c0.553%2C0%2C1-0.447%2C1-1v-2C4%2C10.447%2C3.553%2C10%2C3%2C10z%20M8%2C10H6c-0.553%2C0-1%2C0.447-1%2C1v2%20c0%2C0.553%2C0.447%2C1%2C1%2C1h2c0.553%2C0%2C1-0.447%2C1-1v-2C9%2C10.447%2C8.553%2C10%2C8%2C10z%20M13%2C10h-2c-0.553%2C0-1%2C0.447-1%2C1v2c0%2C0.553%2C0.447%2C1%2C1%2C1h2%20c0.553%2C0%2C1-0.447%2C1-1v-2C14%2C10.447%2C13.553%2C10%2C13%2C10z%22%2F%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3C%2Fsvg%3E\");\n}\n.ui-alt-icon.ui-icon-heart:after,\n.ui-alt-icon .ui-icon-heart:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20d%3D%22M7%2C1.958c-2-3-7-2.128-7%2C1.872c0%2C3%2C4%2C7%2C4%2C7s2.417%2C2.48%2C3%2C3c0.583-0.52%2C3-3%2C3-3s4-4%2C4-7C14-0.169%2C9-1.042%2C7%2C1.958z%22%2F%3E%3C%2Fsvg%3E\");\n}\n.ui-alt-icon.ui-icon-home:after,\n.ui-alt-icon .ui-icon-home:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpolygon%20points%3D%227%2C0%200%2C7%202%2C7%202%2C14%205%2C14%205%2C9%209%2C9%209%2C14%2012%2C14%2012%2C7%2014%2C7%20%22%2F%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3C%2Fsvg%3E\");\n}\n.ui-alt-icon.ui-icon-info:after,\n.ui-alt-icon .ui-icon-info:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20d%3D%22M7%2C0C3.134%2C0%2C0%2C3.134%2C0%2C7s3.134%2C7%2C7%2C7s7-3.134%2C7-7S10.866%2C0%2C7%2C0z%20M7%2C2c0.552%2C0%2C1%2C0.447%2C1%2C1S7.552%2C4%2C7%2C4S6%2C3.553%2C6%2C3%20S6.448%2C2%2C7%2C2z%20M9%2C11H5v-1h1V6H5V5h3v5h1V11z%22%2F%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3C%2Fsvg%3E\");\n}\n.ui-alt-icon.ui-icon-location:after,\n.ui-alt-icon .ui-icon-location:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20d%3D%22M7%2C0C4.791%2C0%2C3%2C1.791%2C3%2C4c0%2C2%2C4%2C10%2C4%2C10s4-8%2C4-10C11%2C1.791%2C9.209%2C0%2C7%2C0z%20M7%2C6C5.896%2C6%2C5%2C5.104%2C5%2C4s0.896-2%2C2-2%20c1.104%2C0%2C2%2C0.896%2C2%2C2S8.104%2C6%2C7%2C6z%22%2F%3E%3C%2Fsvg%3E\");\n}\n.ui-alt-icon.ui-icon-lock:after,\n.ui-alt-icon .ui-icon-lock:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20d%3D%22M12%2C6V5c0-2.762-2.238-5-5-5C4.239%2C0%2C2%2C2.238%2C2%2C5v1H1v8h12V6H12z%20M7.5%2C9.848V12h-1V9.848C6.207%2C9.673%2C6%2C9.366%2C6%2C9%20c0-0.553%2C0.448-1%2C1-1s1%2C0.447%2C1%2C1C8%2C9.366%2C7.793%2C9.673%2C7.5%2C9.848z%20M10%2C6H4V5c0-1.657%2C1.343-3%2C3-3s3%2C1.343%2C3%2C3V6z%22%2F%3E%3C%2Fsvg%3E\");\n}\n.ui-alt-icon.ui-icon-mail:after,\n.ui-alt-icon .ui-icon-mail:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20d%3D%22M0%2C3.75V12h14V3.75L7%2C9L0%2C3.75z%20M14%2C2H0l7%2C5L14%2C2z%22%2F%3E%3C%2Fsvg%3E\");\n}\n.ui-alt-icon.ui-icon-minus:after,\n.ui-alt-icon .ui-icon-minus:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Crect%20y%3D%225%22%20width%3D%2214%22%20height%3D%224%22%2F%3E%3C%2Fsvg%3E\");\n}\n.ui-alt-icon.ui-icon-navigation:after,\n.ui-alt-icon .ui-icon-navigation:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpolygon%20points%3D%2213%2C1%200%2C6%207%2C7%208%2C14%20%22%2F%3E%3C%2Fsvg%3E\");\n}\n.ui-alt-icon.ui-icon-phone:after,\n.ui-alt-icon .ui-icon-phone:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20d%3D%22M6.949%2C9.182C6.175%2C8.549%2C5.281%2C7.697%2C4.507%2C6.736C3.963%2C6.063%2C3.483%2C5.355%2C3.979%2C4.858l-3.482-3.48%20c-0.508%2C0.634-1.633%2C3.654%2C3.188%2C8.598c5.08%2C5.211%2C8.356%2C4.097%2C8.92%2C3.511l-3.396-3.399C8.734%2C10.561%2C8.123%2C10.139%2C6.949%2C9.182z%20%20M13.83%2C11.512v-0.004c0%2C0-2.648-2.646-2.649-2.647c-0.21-0.212-0.546-0.205-0.754%2C0.002L9.465%2C9.823l3.402%2C3.407%20c0%2C0%2C0.963-0.961%2C0.961-0.961l0.002-0.002C14.053%2C12.049%2C14.031%2C11.713%2C13.83%2C11.512z%20M5.202%2C3.636V3.634%20c0.222-0.222%2C0.2-0.557%2C0-0.758V2.873c0%2C0-2.726-2.725-2.727-2.726c-0.21-0.21-0.545-0.205-0.753%2C0.001L0.761%2C1.113L4.24%2C4.595%20C4.241%2C4.596%2C5.202%2C3.637%2C5.202%2C3.636z%22%2F%3E%3C%2Fsvg%3E\");\n}\n.ui-alt-icon.ui-icon-plus:after,\n.ui-alt-icon .ui-icon-plus:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpolygon%20points%3D%2214%2C5%209%2C5%209%2C0%205%2C0%205%2C5%200%2C5%200%2C9%205%2C9%205%2C14%209%2C14%209%2C9%2014%2C9%20%22%2F%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3C%2Fsvg%3E\");\n}\n.ui-alt-icon.ui-icon-power:after,\n.ui-alt-icon .ui-icon-power:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20d%3D%22M11.243%2C2.408c-0.392-0.401-1.024-0.401-1.415%2C0c-0.391%2C0.401-0.391%2C1.054%2C0%2C1.455C10.584%2C4.642%2C11%2C5.675%2C11%2C6.773%20s-0.416%2C2.133-1.172%2C2.91c-1.512%2C1.558-4.145%2C1.558-5.656%2C0C3.416%2C8.904%2C3%2C7.872%2C3%2C6.773C3%2C5.673%2C3.416%2C4.64%2C4.172%2C3.863%20c0.39-0.401%2C0.39-1.054%2C0-1.455c-0.391-0.401-1.024-0.401-1.415%2C0C1.624%2C3.574%2C1%2C5.125%2C1%2C6.773c0%2C1.647%2C0.624%2C3.199%2C1.757%2C4.365%20c1.134%2C1.166%2C2.64%2C1.809%2C4.243%2C1.809c1.604%2C0%2C3.109-0.645%2C4.243-1.811C12.376%2C9.975%2C13%2C8.423%2C13%2C6.773%20C13%2C5.125%2C12.376%2C3.574%2C11.243%2C2.408z%20M7%2C8.053c0.553%2C0%2C1-0.445%2C1-1v-6c0-0.553-0.447-1-1-1c-0.553%2C0-1%2C0.447-1%2C1v6%20C6%2C7.604%2C6.447%2C8.053%2C7%2C8.053z%22%2F%3E%3C%2Fsvg%3E\");\n}\n.ui-alt-icon.ui-icon-recycle:after,\n.ui-alt-icon .ui-icon-recycle:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20d%3D%22M3%2C7h1L2%2C4L0%2C7h1c0%2C3.313%2C2.687%2C6%2C6%2C6c0.702%2C0%2C1.374-0.127%2C2-0.35v-2.205C8.41%2C10.789%2C7.732%2C11%2C7%2C11C4.791%2C11%2C3%2C9.209%2C3%2C7z%20%20M13%2C7c0-3.313-2.688-6-6-6C6.298%2C1%2C5.626%2C1.127%2C5%2C1.349v2.206C5.59%2C3.211%2C6.268%2C3%2C7%2C3c2.209%2C0%2C4%2C1.791%2C4%2C4h-1l2%2C3l2-3H13z%22%2F%3E%3C%2Fsvg%3E\");\n}\n.ui-alt-icon.ui-icon-refresh:after,\n.ui-alt-icon .ui-icon-refresh:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214.001px%22%20height%3D%2214.002px%22%20viewBox%3D%220%200%2014.001%2014.002%22%20style%3D%22enable-background%3Anew%200%200%2014.001%2014.002%3B%22%20%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20d%3D%22M14.001%2C6.001v-6l-2.06%2C2.06c-0.423-0.424-0.897-0.809-1.44-1.122C7.153-0.994%2C2.872%2C0.153%2C0.939%2C3.501%20c-1.933%2C3.348-0.786%2C7.629%2C2.562%2C9.562c3.348%2C1.933%2C7.629%2C0.785%2C9.562-2.562l-1.732-1c-1.381%2C2.392-4.438%2C3.211-6.83%2C1.83%20s-3.211-4.438-1.83-6.83s4.438-3.211%2C6.83-1.83c0.389%2C0.225%2C0.718%2C0.506%2C1.02%2C0.81l-2.52%2C2.52H14.001z%22%2F%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3C%2Fsvg%3E\");\n}\n.ui-alt-icon.ui-icon-search:after,\n.ui-alt-icon .ui-icon-search:after,\n.ui-input-search:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20d%3D%22M10.171%2C8.766c0.617-0.888%2C0.979-1.964%2C0.979-3.126c0-3.037-2.463-5.5-5.5-5.5s-5.5%2C2.463-5.5%2C5.5s2.463%2C5.5%2C5.5%2C5.5%20c1.152%2C0%2C2.223-0.355%2C3.104-0.962l3.684%2C3.683l1.414-1.414L10.171%2C8.766z%20M5.649%2C9.14c-1.933%2C0-3.5-1.567-3.5-3.5%20c0-1.933%2C1.567-3.5%2C3.5-3.5c1.933%2C0%2C3.5%2C1.567%2C3.5%2C3.5C9.149%2C7.572%2C7.582%2C9.14%2C5.649%2C9.14z%22%2F%3E%3C%2Fsvg%3E\");\n}\n.ui-alt-icon.ui-icon-shop:after,\n.ui-alt-icon .ui-icon-shop:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20d%3D%22M10%2C4V3c0-1.657-1.343-3-3-3S4%2C1.343%2C4%2C3v1H1v10h12V4H10z%20M4.5%2C6C4.224%2C6%2C4%2C5.776%2C4%2C5.5S4.224%2C5%2C4.5%2C5S5%2C5.224%2C5%2C5.5%20S4.776%2C6%2C4.5%2C6z%20M5%2C3c0-1.104%2C0.896-2%2C2-2c1.104%2C0%2C2%2C0.896%2C2%2C2v1H5V3z%20M9.5%2C6C9.225%2C6%2C9%2C5.776%2C9%2C5.5S9.225%2C5%2C9.5%2C5S10%2C5.224%2C10%2C5.5%20S9.775%2C6%2C9.5%2C6z%22%2F%3E%3C%2Fsvg%3E\");\n}\n.ui-alt-icon.ui-icon-star:after,\n.ui-alt-icon .ui-icon-star:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpolygon%20points%3D%2214%2C5%209%2C5%207%2C0%205%2C5%200%2C5%204%2C8%202.625%2C13%207%2C10%2011.375%2C13%2010%2C8%20%22%2F%3E%3C%2Fsvg%3E\");\n}\n.ui-alt-icon.ui-icon-tag:after,\n.ui-alt-icon .ui-icon-tag:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20d%3D%22M5%2C0H0v5l9%2C9l5-5L5%2C0z%20M3%2C4C2.447%2C4%2C2%2C3.553%2C2%2C3s0.447-1%2C1-1s1%2C0.447%2C1%2C1S3.553%2C4%2C3%2C4z%22%2F%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3C%2Fsvg%3E\");\n}\n.ui-alt-icon.ui-icon-user:after,\n.ui-alt-icon .ui-icon-user:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20d%3D%22M8.851%2C10.101c-0.18-0.399-0.2-0.763-0.153-1.104C9.383%2C8.49%2C9.738%2C7.621%2C9.891%2C6.465C10.493%2C6.355%2C10.5%2C5.967%2C10.5%2C5.5%20c0-0.437-0.008-0.804-0.502-0.94C9.999%2C4.539%2C10%2C4.521%2C10%2C4.5c0-2.103-1-4-2-4C8%2C0.5%2C7.5%2C0%2C6.5%2C0C5%2C0%2C4%2C1.877%2C4%2C4.5%20c0%2C0.021%2C0.001%2C0.039%2C0.002%2C0.06C3.508%2C4.696%2C3.5%2C5.063%2C3.5%2C5.5c0%2C0.467%2C0.007%2C0.855%2C0.609%2C0.965%20C4.262%2C7.621%2C4.617%2C8.49%2C5.303%2C8.997c0.047%2C0.341%2C0.026%2C0.704-0.153%2C1.104C1.503%2C10.503%2C0%2C12%2C0%2C12v2h14v-2%20C14%2C12%2C12.497%2C10.503%2C8.851%2C10.101z%22%2F%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3C%2Fsvg%3E\");\n}\n.ui-alt-icon.ui-icon-video:after,\n.ui-alt-icon .ui-icon-video:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%20-2%2014%2014%22%20style%3D%22enable-background%3Anew%200%20-2%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20d%3D%22M8%2C0H2C0.896%2C0%2C0%2C0.896%2C0%2C2v6c0%2C1.104%2C0.896%2C2%2C2%2C2h6c1.104%2C0%2C2-0.896%2C2-2V5V2C10%2C0.896%2C9.104%2C0%2C8%2C0z%20M10%2C5l4%2C4V1L10%2C5z%22%2F%3E%3C%2Fsvg%3E\");\n}\n/* PNG icons */\n.ui-nosvg .ui-icon-action:after {\n\tbackground-image: url(\"images/icons-png/action-white.png\");\n}\n.ui-nosvg .ui-icon-alert:after {\n\tbackground-image: url(\"images/icons-png/alert-white.png\");\n}\n.ui-nosvg .ui-icon-arrow-d-l:after {\n\tbackground-image: url(\"images/icons-png/arrow-d-l-white.png\");\n}\n.ui-nosvg .ui-icon-arrow-d-r:after {\n\tbackground-image: url(\"images/icons-png/arrow-d-r-white.png\");\n}\n.ui-nosvg .ui-icon-arrow-d:after {\n\tbackground-image: url(\"images/icons-png/arrow-d-white.png\");\n}\n.ui-nosvg .ui-icon-arrow-l:after {\n\tbackground-image: url(\"images/icons-png/arrow-l-white.png\");\n}\n.ui-nosvg .ui-icon-arrow-r:after {\n\tbackground-image: url(\"images/icons-png/arrow-r-white.png\");\n}\n.ui-nosvg .ui-icon-arrow-u-l:after {\n\tbackground-image: url(\"images/icons-png/arrow-u-l-white.png\");\n}\n.ui-nosvg .ui-icon-arrow-u-r:after {\n\tbackground-image: url(\"images/icons-png/arrow-u-r-white.png\");\n}\n.ui-nosvg .ui-icon-arrow-u:after {\n\tbackground-image: url(\"images/icons-png/arrow-u-white.png\");\n}\n.ui-nosvg .ui-icon-audio:after {\n\tbackground-image: url(\"images/icons-png/audio-white.png\");\n}\n.ui-nosvg .ui-icon-back:after {\n\tbackground-image: url(\"images/icons-png/back-white.png\");\n}\n.ui-nosvg .ui-icon-bars:after {\n\tbackground-image: url(\"images/icons-png/bars-white.png\");\n}\n.ui-nosvg .ui-icon-bullets:after {\n\tbackground-image: url(\"images/icons-png/bullets-white.png\");\n}\n.ui-nosvg .ui-icon-calendar:after {\n\tbackground-image: url(\"images/icons-png/calendar-white.png\");\n}\n.ui-nosvg .ui-icon-camera:after {\n\tbackground-image: url(\"images/icons-png/camera-white.png\");\n}\n.ui-nosvg .ui-icon-carat-d:after {\n\tbackground-image: url(\"images/icons-png/carat-d-white.png\");\n}\n.ui-nosvg .ui-icon-carat-l:after {\n\tbackground-image: url(\"images/icons-png/carat-l-white.png\");\n}\n.ui-nosvg .ui-icon-carat-r:after {\n\tbackground-image: url(\"images/icons-png/carat-r-white.png\");\n}\n.ui-nosvg .ui-icon-carat-u:after {\n\tbackground-image: url(\"images/icons-png/carat-u-white.png\");\n}\n.ui-nosvg .ui-icon-check:after,\nhtml.ui-nosvg .ui-btn.ui-checkbox-on:after {\n\tbackground-image: url(\"images/icons-png/check-white.png\");\n}\n.ui-nosvg .ui-icon-clock:after {\n\tbackground-image: url(\"images/icons-png/clock-white.png\");\n}\n.ui-nosvg .ui-icon-cloud:after {\n\tbackground-image: url(\"images/icons-png/cloud-white.png\");\n}\n.ui-nosvg .ui-icon-comment:after {\n\tbackground-image: url(\"images/icons-png/comment-white.png\");\n}\n.ui-nosvg .ui-icon-delete:after {\n\tbackground-image: url(\"images/icons-png/delete-white.png\");\n}\n.ui-nosvg .ui-icon-edit:after {\n\tbackground-image: url(\"images/icons-png/edit-white.png\");\n}\n.ui-nosvg .ui-icon-eye:after {\n\tbackground-image: url(\"images/icons-png/eye-white.png\");\n}\n.ui-nosvg .ui-icon-forbidden:after {\n\tbackground-image: url(\"images/icons-png/forbidden-white.png\");\n}\n.ui-nosvg .ui-icon-forward:after {\n\tbackground-image: url(\"images/icons-png/forward-white.png\");\n}\n.ui-nosvg .ui-icon-gear:after {\n\tbackground-image: url(\"images/icons-png/gear-white.png\");\n}\n.ui-nosvg .ui-icon-grid:after {\n\tbackground-image: url(\"images/icons-png/grid-white.png\");\n}\n.ui-nosvg .ui-icon-heart:after {\n\tbackground-image: url(\"images/icons-png/heart-white.png\");\n}\n.ui-nosvg .ui-icon-home:after {\n\tbackground-image: url(\"images/icons-png/home-white.png\");\n}\n.ui-nosvg .ui-icon-info:after {\n\tbackground-image: url(\"images/icons-png/info-white.png\");\n}\n.ui-nosvg .ui-icon-location:after {\n\tbackground-image: url(\"images/icons-png/location-white.png\");\n}\n.ui-nosvg .ui-icon-lock:after {\n\tbackground-image: url(\"images/icons-png/lock-white.png\");\n}\n.ui-nosvg .ui-icon-mail:after {\n\tbackground-image: url(\"images/icons-png/mail-white.png\");\n}\n.ui-nosvg .ui-icon-minus:after {\n\tbackground-image: url(\"images/icons-png/minus-white.png\");\n}\n.ui-nosvg .ui-icon-navigation:after {\n\tbackground-image: url(\"images/icons-png/navigation-white.png\");\n}\n.ui-nosvg .ui-icon-phone:after {\n\tbackground-image: url(\"images/icons-png/phone-white.png\");\n}\n.ui-nosvg .ui-icon-plus:after {\n\tbackground-image: url(\"images/icons-png/plus-white.png\");\n}\n.ui-nosvg .ui-icon-power:after {\n\tbackground-image: url(\"images/icons-png/power-white.png\");\n}\n.ui-nosvg .ui-icon-recycle:after {\n\tbackground-image: url(\"images/icons-png/recycle-white.png\");\n}\n.ui-nosvg .ui-icon-refresh:after {\n\tbackground-image: url(\"images/icons-png/refresh-white.png\");\n}\n.ui-nosvg .ui-icon-search:after {\n\tbackground-image: url(\"images/icons-png/search-white.png\");\n}\n.ui-nosvg .ui-icon-shop:after {\n\tbackground-image: url(\"images/icons-png/shop-white.png\");\n}\n.ui-nosvg .ui-icon-star:after {\n\tbackground-image: url(\"images/icons-png/star-white.png\");\n}\n.ui-nosvg .ui-icon-tag:after {\n\tbackground-image: url(\"images/icons-png/tag-white.png\");\n}\n.ui-nosvg .ui-icon-user:after {\n\tbackground-image: url(\"images/icons-png/user-white.png\");\n}\n.ui-nosvg .ui-icon-video:after {\n\tbackground-image: url(\"images/icons-png/video-white.png\");\n}\n/* Alt icons */\n.ui-nosvg .ui-alt-icon.ui-icon-action:after,\n.ui-nosvg .ui-alt-icon .ui-icon-action:after {\n\tbackground-image: url(\"images/icons-png/action-black.png\");\n}\n.ui-nosvg .ui-alt-icon.ui-icon-alert:after,\n.ui-nosvg .ui-alt-icon .ui-icon-alert:after {\n\tbackground-image: url(\"images/icons-png/alert-black.png\");\n}\n.ui-nosvg .ui-alt-icon.ui-icon-arrow-d:after,\n.ui-nosvg .ui-alt-icon .ui-icon-arrow-d:after {\n\tbackground-image: url(\"images/icons-png/arrow-d-black.png\");\n}\n.ui-nosvg .ui-alt-icon.ui-icon-arrow-d-l:after,\n.ui-nosvg .ui-alt-icon .ui-icon-arrow-d-l:after {\n\tbackground-image: url(\"images/icons-png/arrow-d-l-black.png\");\n}\n.ui-nosvg .ui-alt-icon.ui-icon-arrow-d-r:after,\n.ui-nosvg .ui-alt-icon .ui-icon-arrow-d-r:after {\n\tbackground-image: url(\"images/icons-png/arrow-d-r-black.png\");\n}\n.ui-nosvg .ui-alt-icon.ui-icon-arrow-l:after,\n.ui-nosvg .ui-alt-icon .ui-icon-arrow-l:after {\n\tbackground-image: url(\"images/icons-png/arrow-l-black.png\");\n}\n.ui-nosvg .ui-alt-icon.ui-icon-arrow-r:after,\n.ui-nosvg .ui-alt-icon .ui-icon-arrow-r:after {\n\tbackground-image: url(\"images/icons-png/arrow-r-black.png\");\n}\n.ui-nosvg .ui-alt-icon.ui-icon-arrow-u:after,\n.ui-nosvg .ui-alt-icon .ui-icon-arrow-u:after {\n\tbackground-image: url(\"images/icons-png/arrow-u-black.png\");\n}\n.ui-nosvg .ui-alt-icon.ui-icon-arrow-u-l:after,\n.ui-nosvg .ui-alt-icon .ui-icon-arrow-u-l:after {\n\tbackground-image: url(\"images/icons-png/arrow-u-l-black.png\");\n}\n.ui-nosvg .ui-alt-icon.ui-icon-arrow-u-r:after,\n.ui-nosvg .ui-alt-icon .ui-icon-arrow-u-r:after {\n\tbackground-image: url(\"images/icons-png/arrow-u-r-black.png\");\n}\n.ui-nosvg .ui-alt-icon.ui-icon-audio:after,\n.ui-nosvg .ui-alt-icon .ui-icon-audio:after {\n\tbackground-image: url(\"images/icons-png/audio-black.png\");\n}\n.ui-nosvg .ui-alt-icon.ui-icon-back:after,\n.ui-nosvg .ui-alt-icon .ui-icon-back:after {\n\tbackground-image: url(\"images/icons-png/back-black.png\");\n}\n.ui-nosvg .ui-alt-icon.ui-icon-bars:after,\n.ui-nosvg .ui-alt-icon .ui-icon-bars:after {\n\tbackground-image: url(\"images/icons-png/bars-black.png\");\n}\n.ui-nosvg .ui-alt-icon.ui-icon-bullets:after,\n.ui-nosvg .ui-alt-icon .ui-icon-bullets:after {\n\tbackground-image: url(\"images/icons-png/bullets-black.png\");\n}\n.ui-nosvg .ui-alt-icon.ui-icon-calendar:after,\n.ui-nosvg .ui-alt-icon .ui-icon-calendar:after {\n\tbackground-image: url(\"images/icons-png/calendar-black.png\");\n}\n.ui-nosvg .ui-alt-icon.ui-icon-camera:after,\n.ui-nosvg .ui-alt-icon .ui-icon-camera:after {\n\tbackground-image: url(\"images/icons-png/camera-black.png\");\n}\n.ui-nosvg .ui-alt-icon.ui-icon-carat-d:after,\n.ui-nosvg .ui-alt-icon .ui-icon-carat-d:after {\n\tbackground-image: url(\"images/icons-png/carat-d-black.png\");\n}\n.ui-nosvg .ui-alt-icon.ui-icon-carat-l:after,\n.ui-nosvg .ui-alt-icon .ui-icon-carat-l:after {\n\tbackground-image: url(\"images/icons-png/carat-l-black.png\");\n}\n.ui-nosvg .ui-alt-icon.ui-icon-carat-r:after,\n.ui-nosvg .ui-alt-icon .ui-icon-carat-r:after {\n\tbackground-image: url(\"images/icons-png/carat-r-black.png\");\n}\n.ui-nosvg .ui-alt-icon.ui-icon-carat-u:after,\n.ui-nosvg .ui-alt-icon .ui-icon-carat-u:after {\n\tbackground-image: url(\"images/icons-png/carat-u-black.png\");\n}\n.ui-nosvg .ui-alt-icon.ui-icon-check:after,\n.ui-nosvg .ui-alt-icon .ui-icon-check:after,\n.ui-nosvg .ui-alt-icon.ui-btn.ui-checkbox-on:after,\n.ui-nosvg .ui-alt-icon .ui-btn.ui-checkbox-on:after {\n\tbackground-image: url(\"images/icons-png/check-black.png\");\n}\n.ui-nosvg .ui-alt-icon.ui-icon-clock:after,\n.ui-nosvg .ui-alt-icon .ui-icon-clock:after {\n\tbackground-image: url(\"images/icons-png/clock-black.png\");\n}\n.ui-nosvg .ui-alt-icon.ui-icon-cloud:after,\n.ui-nosvg .ui-alt-icon .ui-icon-cloud:after {\n\tbackground-image: url(\"images/icons-png/cloud-black.png\");\n}\n.ui-nosvg .ui-alt-icon.ui-icon-comment:after,\n.ui-nosvg .ui-alt-icon .ui-icon-comment:after {\n\tbackground-image: url(\"images/icons-png/comment-black.png\");\n}\n.ui-nosvg .ui-alt-icon.ui-icon-delete:after,\n.ui-nosvg .ui-alt-icon .ui-icon-delete:after {\n\tbackground-image: url(\"images/icons-png/delete-black.png\");\n}\n.ui-nosvg .ui-alt-icon.ui-icon-edit:after,\n.ui-nosvg .ui-alt-icon .ui-icon-edit:after {\n\tbackground-image: url(\"images/icons-png/edit-black.png\");\n}\n.ui-nosvg .ui-alt-icon.ui-icon-eye:after,\n.ui-nosvg .ui-alt-icon .ui-icon-eye:after {\n\tbackground-image: url(\"images/icons-png/eye-black.png\");\n}\n.ui-nosvg .ui-alt-icon.ui-icon-forbidden:after,\n.ui-nosvg .ui-alt-icon .ui-icon-forbidden:after {\n\tbackground-image: url(\"images/icons-png/forbidden-black.png\");\n}\n.ui-nosvg .ui-alt-icon.ui-icon-forward:after,\n.ui-nosvg .ui-alt-icon .ui-icon-forward:after {\n\tbackground-image: url(\"images/icons-png/forward-black.png\");\n}\n.ui-nosvg .ui-alt-icon.ui-icon-gear:after,\n.ui-nosvg .ui-alt-icon .ui-icon-gear:after {\n\tbackground-image: url(\"images/icons-png/gear-black.png\");\n}\n.ui-nosvg .ui-alt-icon.ui-icon-grid:after,\n.ui-nosvg .ui-alt-icon .ui-icon-grid:after {\n\tbackground-image: url(\"images/icons-png/grid-black.png\");\n}\n.ui-nosvg .ui-alt-icon.ui-icon-heart:after,\n.ui-nosvg .ui-alt-icon .ui-icon-heart:after {\n\tbackground-image: url(\"images/icons-png/heart-black.png\");\n}\n.ui-nosvg .ui-alt-icon.ui-icon-home:after,\n.ui-nosvg .ui-alt-icon .ui-icon-home:after {\n\tbackground-image: url(\"images/icons-png/home-black.png\");\n}\n.ui-nosvg .ui-alt-icon.ui-icon-info:after,\n.ui-nosvg .ui-alt-icon .ui-icon-info:after {\n\tbackground-image: url(\"images/icons-png/info-black.png\");\n}\n.ui-nosvg .ui-alt-icon.ui-icon-location:after,\n.ui-nosvg .ui-alt-icon .ui-icon-location:after {\n\tbackground-image: url(\"images/icons-png/location-black.png\");\n}\n.ui-nosvg .ui-alt-icon.ui-icon-lock:after,\n.ui-nosvg .ui-alt-icon .ui-icon-lock:after {\n\tbackground-image: url(\"images/icons-png/lock-black.png\");\n}\n.ui-nosvg .ui-alt-icon.ui-icon-mail:after,\n.ui-nosvg .ui-alt-icon .ui-icon-mail:after {\n\tbackground-image: url(\"images/icons-png/mail-black.png\");\n}\n.ui-nosvg .ui-alt-icon.ui-icon-minus:after,\n.ui-nosvg .ui-alt-icon .ui-icon-minus:after {\n\tbackground-image: url(\"images/icons-png/minus-black.png\");\n}\n.ui-nosvg .ui-alt-icon.ui-icon-navigation:after,\n.ui-nosvg .ui-alt-icon .ui-icon-navigation:after {\n\tbackground-image: url(\"images/icons-png/navigation-black.png\");\n}\n.ui-nosvg .ui-alt-icon.ui-icon-phone:after,\n.ui-nosvg .ui-alt-icon .ui-icon-phone:after {\n\tbackground-image: url(\"images/icons-png/phone-black.png\");\n}\n.ui-nosvg .ui-alt-icon.ui-icon-plus:after,\n.ui-nosvg .ui-alt-icon .ui-icon-plus:after {\n\tbackground-image: url(\"images/icons-png/plus-black.png\");\n}\n.ui-nosvg .ui-alt-icon.ui-icon-power:after,\n.ui-nosvg .ui-alt-icon .ui-icon-power:after {\n\tbackground-image: url(\"images/icons-png/power-black.png\");\n}\n.ui-nosvg .ui-alt-icon.ui-icon-recycle:after,\n.ui-nosvg .ui-alt-icon .ui-icon-recycle:after {\n\tbackground-image: url(\"images/icons-png/recycle-black.png\");\n}\n.ui-nosvg .ui-alt-icon.ui-icon-refresh:after,\n.ui-nosvg .ui-alt-icon .ui-icon-refresh:after {\n\tbackground-image: url(\"images/icons-png/refresh-black.png\");\n}\n.ui-nosvg .ui-alt-icon.ui-icon-search:after,\n.ui-nosvg .ui-alt-icon .ui-icon-search:after,\n.ui-nosvg .ui-input-search:after {\n\tbackground-image: url(\"images/icons-png/search-black.png\");\n}\n.ui-nosvg .ui-alt-icon.ui-icon-shop:after,\n.ui-nosvg .ui-alt-icon .ui-icon-shop:after {\n\tbackground-image: url(\"images/icons-png/shop-black.png\");\n}\n.ui-nosvg .ui-alt-icon.ui-icon-star:after,\n.ui-nosvg .ui-alt-icon .ui-icon-star:after {\n\tbackground-image: url(\"images/icons-png/star-black.png\");\n}\n.ui-nosvg .ui-alt-icon.ui-icon-tag:after,\n.ui-nosvg .ui-alt-icon .ui-icon-tag:after {\n\tbackground-image: url(\"images/icons-png/tag-black.png\");\n}\n.ui-nosvg .ui-alt-icon.ui-icon-user:after,\n.ui-nosvg .ui-alt-icon .ui-icon-user:after {\n\tbackground-image: url(\"images/icons-png/user-black.png\");\n}\n.ui-nosvg .ui-alt-icon.ui-icon-video:after,\n.ui-nosvg .ui-alt-icon .ui-icon-video:after {\n\tbackground-image: url(\"images/icons-png/video-black.png\");\n}\n"
  },
  {
    "path": "stenogotchi/ui/web/static/js/jquery.mobile/jquery.mobile.inline-png-1.4.5.css",
    "content": "/*!\n* jQuery Mobile 1.4.5\n* Git HEAD hash: 68e55e78b292634d3991c795f06f5e37a512decc <> Date: Fri Oct 31 2014 17:33:30 UTC\n* http://jquerymobile.com\n*\n* Copyright 2010, 2014 jQuery Foundation, Inc. and othercontributors\n* Released under the MIT license.\n* http://jquery.org/license\n*\n*/\n\n\n.ui-icon-action:after {\n\tbackground-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAOxAAADsQBlSsOGwAAAIVJREFUOMtjYCAC/P//fxYQszGQCv5DwDEgliRHIwg8A2JLdEEYaICKqwHxciD+gCb/E4jTGHBosgPiL/+xA1SNSM7iBeIXQPwDiOuAWByvU5E05gPxZyC2xhs4WDTuBuJwtMCZCYsOmHewaZyLJ3Qb4GqxaDQiFC1YNRITn9TRSAqgSCMAGL+QeSGFbu0AAAAASUVORK5CYII=\");\n}\n.ui-icon-alert:after {\n\tbackground-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAOxAAADsQBlSsOGwAAAJVJREFUOMu9z7ENgkAUgOGj0I6eBXQCg8QRdAhdwiV0CF2CIRxBF6Cn08LP5oxIIEjjX13evS+5C6EnbLAOY8IUN1wxGQP3Pu1/RRnqBqyR/QLPEeQo4vk0hJZ4QmMmzvI+lODyfl8LindJF9z5rsCqNdu2UYrKcBXSJjx2LC3in9sd3miOR8fCsuOpcMcsoDS+Mvy9F2w1bmFOO7YjAAAAAElFTkSuQmCC\");\n}\n.ui-icon-arrow-d-l:after {\n\tbackground-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAOxAAADsQBlSsOGwAAAE9JREFUOMut0VsKACAIBECP3tG8mSFZRGVujwV/wkE0IjAikrToJIZq0g3CsIMK9PQWWcM0OkQdbI8QGqCGIbSAAl/wCgWQo7/6PvFpRxdn/yOefcvwdI0AAAAASUVORK5CYII=\");\n}\n.ui-icon-arrow-d-r:after {\n\tbackground-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAOxAAADsQBlSsOGwAAAE1JREFUOMtjYICC////N4AwAykAqgkGGsjRRLRmJhzi9UTZjMNWnDajiBOrGaaOJJuR5Ulx9gFkDql+xq+RGM2EQvsAfWwky4/EaAIBAH/xh5XOyrKIAAAAAElFTkSuQmCC\");\n}\n.ui-icon-arrow-d:after {\n\tbackground-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAOxAAADsQBlSsOGwAAADdJREFUOMtjYMAC/qMBBmLBqEZKNQLFG/6TDhrI0dxAjs0N5Di7gVDANJCsCYfmBgZSAFQzTk0AIbtHzgIaJM8AAAAASUVORK5CYII=\");\n}\n.ui-icon-arrow-l:after {\n\tbackground-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAOxAAADsQBlSsOGwAAAD5JREFUOMul0kEKADAMAsE8PT/fXktpqVHvA8FY9QjQNQ3QABYawR3J8EQSvKFfLJRB+9SonOgd0QCiyakjXzjeR87keFK/AAAAAElFTkSuQmCC\");\n}\n.ui-icon-arrow-r:after {\n\tbackground-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAOxAAADsQBlSsOGwAAADpJREFUOMu90rENADAIA0FG/82dgooiSDgK31+DiWiSRDgpw4VzrBourFjzcGHiTcjbcX7PwdrLXdEBwEtHzn8VrGMAAAAASUVORK5CYII=\");\n}\n.ui-icon-arrow-u-l:after {\n\tbackground-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAOxAAADsQBlSsOGwAAAEtJREFUOMtj+E8caGBAB2RpIkIjdk0ENB5gwAdoYSNJfjxATqg2QPkNRGnGJkiUZlx+INpmUjUz4dPIyMgIMr2RgVyAZnMDOZrhmgAEuoiZ+HH38AAAAABJRU5ErkJggg==\");\n}\n.ui-icon-arrow-u-r:after {\n\tbackground-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAOxAAADsQBlSsOGwAAAEdJREFUOMu9z8ENACAIQ9GOzmhuVq+GSCke/Fd8AYEUyaARbjkYVR2GiuT6s/HpjwKtEgoUeW6j/G6ETjxG3YkaFdhDCdtoA045nn2X6PolAAAAAElFTkSuQmCC\");\n}\n.ui-icon-arrow-u:after {\n\tbackground-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAOxAAADsQBlSsOGwAAADlJREFUOMtjYMAB/v//3wDCDKQAqCYYaCBHE3GacWjCr5mAJuyaidSEqplETQSdjQJIiY5RjZRoBADXbkfOGh7ilQAAAABJRU5ErkJggg==\");\n}\n.ui-icon-audio:after {\n\tbackground-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAOxAAADsQBlSsOGwAAANxJREFUOMuV0rEuRFEQxvETL2DpZVEoVLyFJ1CJRKfabCKikbiJUhQa3kSj32K7DQqJwgugQVay8lOYleO654avmm/m/HMmM5NSg3CUxTO4wlZqE44xyfwa3nzprA2Sg5FfwV3UDkrQN4gd9CJewCPesZQw9FtTcBR+P3wv/GnSrCnYxRNe0cEcPnDbCgZ8HrmN8A8Y/wW8+DeIZTzjBbOYj1ZvEgaYFMDr8P3w/fAn+TqqBnAbuxEvxqDG6NZ3WRUOYBX3UdsrXU9VG856/PKzxQJ8WDvyS2zmbz4B8IPWAlHG2vgAAAAASUVORK5CYII=\");\n}\n.ui-icon-back:after {\n\tbackground-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAOxAAADsQBlSsOGwAAAJJJREFUOMtjYEAD////b2AgFYA0AfF/sjSRpBFZExT8AeLXQHwciCcAsQOxGrGBM0CsS0gzKxBLA7ELELcC8VOo+Ccg1iY6cIBCXEC8Fqp5M05n4xCXgGr8TGqoC5OrsRGqcS+xGkABVQ/E/6AaXQlpUATiYiC+C9UA0lhKjE3I4CYQexDrxGdAvBSIfYGYCV0eAL8TDNuB31nNAAAAAElFTkSuQmCC\");\n}\n.ui-icon-bars:after {\n\tbackground-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAOxAAADsQBlSsOGwAAAClJREFUOMtjYKA7+P///8n/pIMTII3HydB4lGHUjzTy4xly/XhiaPgRALzOTCcBlK2mAAAAAElFTkSuQmCC\");\n}\n.ui-icon-bullets:after {\n\tbackground-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAOxAAADsQBlSsOGwAAADpJREFUOMtjYKA7+P///0kgPo7GJwROgBQeB+KjSBqPE6HxKMOoH2nkxzNgN6PyifLjCTQ/nhicfgQA/VEZvCqEuYoAAAAASUVORK5CYII=\");\n}\n.ui-icon-calendar:after {\n\tbackground-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAOxAAADsQBlSsOGwAAADFJREFUOMtjYICC////nwTi4ww4AFDuDBCfQBYgCwwljWQDZBNIYpOtcdSpeGwhVyMA6YDNaA+GXWMAAAAASUVORK5CYII=\");\n}\n.ui-icon-camera:after {\n\tbackground-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAOxAAADsQBlSsOGwAAAJ1JREFUOMtjYKAW+P//vzoQ1wBxAxSD2KrYFHIBcSaSwqf/McFjJPksIOYEadz8n3SwCaTxDxaJh0A8AYj7oGx08IcBi+ABIBaFOh/kLBEgPoiuCJtGAzTnbwJiQ2I0sgDxLyT+TyBmJdbGTUj89UBsTIzGQ0h+zICyj2DT+BeL5kdA3A8N2ce4QnUTGfG4HqSREy3lEMIZ4JRDLgAADx5bua1tC5oAAAAASUVORK5CYII=\");\n}\n.ui-icon-carat-d:after {\n\tbackground-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAOxAAADsQBlSsOGwAAAHdJREFUKJHV0D0OwjAMBtCcpiBSVn7uv8MpUNVMwAUeSyuiKG3DyLdZ9rMlh/BfwR6nhrkLurnYYcAT5xV0xRsPdAF331TxdOmVzd0CIsYlXEEjDnOzildRtjkiFbhEcekBJd5GGe4LnDZRho8TSOibUIF/Qy35ADEDFfz8Tu1HAAAAAElFTkSuQmCC\");\n}\n.ui-icon-carat-l:after {\n\tbackground-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAOxAAADsQBlSsOGwAAAFNJREFUOMtjYMAD/v//rwvE54FYhYFYAFSsB8Sv/0PAUyBWJVUTCLwHYmNyNJkQo+kNqZr06aOJIo14NJuSEnfImj+Qqvk1mmYzumt+TGp6xZnIAZYXFgOYoY9iAAAAAElFTkSuQmCC\");\n}\n.ui-icon-carat-r:after {\n\tbackground-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAOxAAADsQBlSsOGwAAAGRJREFUOMtjYEAD////Vwfi80CsxUAsACrWAOLn/yHgJRBrE6vRDIg//EcAkjSbU1PzK0o161CiWZdYjR9JshWowIIcTZZYNGkTo+kTSdEBdd4nkuMQqEgNiJ+SHPFIms8RSuQASm4V+ztdam4AAAAASUVORK5CYII=\");\n}\n.ui-icon-carat-u:after {\n\tbackground-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAOxAAADsQBlSsOGwAAAG5JREFUOMtjYKA2+P//vz4Ik6PpDRTrkaoJBghrBilA0wQDr3Fqhmp6jaT4PRQja9YlRpMJEJsC8QesmkEMbJqQDEXX/AqsGUicx6UJj+ZzIEEVIH6KSxOSZjOo5scgPTBBVSA2JiKqzOCahg4AAODRFgCi4LIMAAAAAElFTkSuQmCC\");\n}\n.ui-icon-check:after,\n/* Used ui-checkbox-on twice to increase specificity. If active state has background-image for gradient this rule overrides. */\nhtml .ui-btn.ui-checkbox-on.ui-checkbox-on:after {\n\tbackground-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAOxAAADsQBlSsOGwAAAE5JREFUOMu10DEKACEQQ1GPHl2QxUvHZsURQRJhfzfFKzIp/R1JkISLMmdQUeEebtAKvw053I+KRuUGncLpYxoS9kgfrDYK+LVRwM1GTh2KeDEWoG7NGwAAAABJRU5ErkJggg==\");\n}\n.ui-icon-clock:after {\n\tbackground-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAOxAAADsQBlSsOGwAAAN5JREFUOMuNkl0KglAQhYeexA0kthWtVQRCq6gQWkBRi4mIaA/Zm2EbsYJ6STsjx7jYtTrwoXecP2euiKGyLHtgBc7gQTKwBL7YhA8jcCvbdQWRLaigwxoEwCEh2PBb8Q5me3WliZHsCA7GOabPBXjCf6oqNbqo1LBtaV4IB6EK/gjs03wSTk7l2AKphDaX53tH2pUY70/bGjJmCeWH4DOgb6oV97SP5bemfO41i8/lquIv1Wb0yUG3NkbGBdhyei7R9nbGBRg2M0ZcbpvyjyAj2NPl6p505CQF83d71As1WJi0XvrCDgAAAABJRU5ErkJggg==\");\n}\n.ui-icon-cloud:after {\n\tbackground-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAOxAAADsQBlSsOGwAAAHRJREFUOMtjYBhw8P//f2EgTgTiWigtRIymSCD+/B8VfATiEHyabIH473/s4DcQm+PSuOs/fvAPiF8BsT+yJncg/vafOPASpqniP2ngCxBzgjS+/U862AjS+I4MjT9BGsvJ0LgO5k8XaIQ3EIEzgZiD/kkTAK0pr7/Ot6yrAAAAAElFTkSuQmCC\");\n}\n.ui-icon-comment:after {\n\tbackground-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAOxAAADsQBlSsOGwAAAEJJREFUOMtj+P//fyAQv/xPPHgFxP4MJGqCgZcM/8kEoxpppfEVGfpegDT6k5gIXgCxLwMyQJJsYCAFkKUJqpFoTQBdxXiyPJoNzQAAAABJRU5ErkJggg==\");\n}\n.ui-icon-delete:after {\n\tbackground-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAOxAAADsQBlSsOGwAAAFtJREFUOMulklEKwDAIQ83J153c0U1GK0ZG5o/ga4pNA4ty9zE7gGFFZY5leMSZM4srjjS0LKacgBtGLxmaW1k9q5J3tKLXnI/izbT/QmlVyRz5O+QAyJFTQ34BOkVgA0nxhd0AAAAASUVORK5CYII=\");\n}\n.ui-icon-edit:after {\n\tbackground-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAOxAAADsQBlSsOGwAAAExJREFUOMtjYCAS/P//vwGEGUgBUE0w0ECuRsKakZ1HtK3YFBL0JxanEe28/yRpHPyaFEjWBNWYQLImqMYFJGuCajwA1QyyWYHYZAgAGGspdigXzkIAAAAASUVORK5CYII=\");\n}\n.ui-icon-eye:after {\n\tbackground-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAOxAAADsQBlSsOGwAAAJ9JREFUOMtjYBhQ8P//f0YgjgLig0D8FYoPQMUYcWmSgCrCBUBy4uia5ID4HlTBDyDOBmIBIOaDsn9A5UBq5GCa+IH4OpLJ2Vhck4MkD1LLDxJcheYkAajik0B8HMlwZLCSCYt3/yHRMDYjtkBBd2ouFjUFSPLXQH7HFTi5UAMFoJp+YgQOkqniBKJjP0Z0oCWASKgBX6D4AFSMcWCTJwDwblGBQMiLsgAAAABJRU5ErkJggg==\");\n}\n.ui-icon-forbidden:after {\n\tbackground-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAOxAAADsQBlSsOGwAAANZJREFUOMuF0jFuwkAUhOEtCT0R4iwh4hgu0uUM3AAU5TKIKk1OgSPlHCgUQMOXZrAsY8NIK9k7/v3ezttSWsIMn/jFGSf84AOz0ie842BYB1R90CUffOEFo6w5NvEuDZz22pVqTHo6Wsb/w7TkTNdK9QN4G39dEoS0N7kH4zXeriQ9GMUchDHO/rEk8ga8B+Mpe6eSOcG809YNjMX1vWS4sOkJowt/53nVHcfyAQx7PF/NqnUBtklvnDMtWpUueOv+ucpwh7S/gVrwFGvscEziNVZNe9E/AYkNLyf6mZAAAAAASUVORK5CYII=\");\n}\n.ui-icon-forward:after {\n\tbackground-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAOxAAADsQBlSsOGwAAAJVJREFUOMud0SEPQWEUBuA7I6iSTdFtfoNgJvkzNtE+QfcnRFFVFX9AECmaieYRfOGyue533/qeZ2c7J8tKBCGrEu+EqrAYY4AV9rji4TPhG/Rx8D8hj3q4xeKMJYbooFG0bRuLDZqlj4N7LNtJ78jBVuq5dxEuUuEowifmqKfgWYRwwhTdsniMY/5pKZtrmGCNy6+5F/zkDN/sPUM/AAAAAElFTkSuQmCC\");\n}\n.ui-icon-gear:after {\n\tbackground-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAOxAAADsQBlSsOGwAAANBJREFUOMuN0k1OAkEUReGKDVPsBUiCe/An6CZMCHERkLgABzpwr0rCAhoM/Tl56ktTQc+o07dud71TVUoFXOITe0zLKfCIOcZ488sLRrjDslaCHlvHbCPrscjFebz8ix7XuThOf+qwQotJPHeRbdBkEXmmVWX+dcpfMSthL9NWiueDNfsSyjOTSrEdrOkKpqH81FafUv6Mi+9gNJCzju21UdpF9o6z/MV7/+OAm1xcxhkd8FEpbNIFeBjOscAVmlCeZ2pwe1SqyJiF7d2PiAFfUWcCdKtjEnkAAAAASUVORK5CYII=\");\n}\n.ui-icon-grid:after {\n\tbackground-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAOxAAADsQBlSsOGwAAAElJREFUOMtj+P///8n/CHCcAQjQxE5Axc4gizGCSAYkwAgExIgxMZAJQBpPIPGPQWlsYiexiJEBhlbgnCQyIKgXOGcIBcQQDxwAcK29sfGNuOEAAAAASUVORK5CYII=\");\n}\n.ui-icon-heart:after {\n\tbackground-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAOxAAADsQBlSsOGwAAAJhJREFUOMud0L0NwjAQgNErGAEGoU0WSYUEggGyVULFCFCyAgPQQQsU5NE4EuLfPOka258sXUREYIwldtiixiBNnc526c04UlTg7NkqzaMzisBGvnW8+e2bU+D4R3gItH+Ebb+cXEW/2SYjaqKHEfY/RHsM4x5KXD5EF5TxCipcX0RXVPEJpugeokn8AosUd5hFDswxfXd/AyJMQU8RkPn/AAAAAElFTkSuQmCC\");\n}\n.ui-icon-home:after {\n\tbackground-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAOxAAADsQBlSsOGwAAADxJREFUOMtjYMAB/v//3wDCDKQAqCYYaCBHE3GacWjCr5mAJuyaidSEqplETZg2E6sDmx8p10iK3HDWCADqFJ92uuEinAAAAABJRU5ErkJggg==\");\n}\n.ui-icon-info:after {\n\tbackground-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAOxAAADsQBlSsOGwAAAJ1JREFUOMul0k0KwjAQQOHcQtF7SPEeQsHrKHo8S71IVdBVPzejaJ0u1AezSfKS+UkpL2COPY64RbTYYVYysMbFOGfUmdQPDi5QDdb6pxzpZS9VWCbrJ0xL1PQt2xKNeGNQRkZTonPG5BHx+pfY/iAeSgz3W3FTMIvhps1J5A6Tx0adfICMHqvhrXUMd4zuQ3qRp9iiwTXigM0zveAO8O5cUyF3tnAAAAAASUVORK5CYII=\");\n}\n.ui-icon-location:after {\n\tbackground-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAOxAAADsQBlSsOGwAAAJlJREFUOMuV0TEOAVEUhtHXWYGh04pWzypYlJWIIENU1oQQdJKjucUL4+Er/7knr5iUXsIAO9xxwxb9VCrQxXvnIo6XYI0KbdSxbUrwHkdVtlWxXUvwFEedbOvEdizBVRzV6AbaxrYswanPTUqwhUMDOqD17ZfMGuAsfQs9PDL0QC/9EhYZnKdfwzCDw/RP2GOf/g1jjD59fwKZSi5HaePOlAAAAABJRU5ErkJggg==\");\n}\n.ui-icon-lock:after {\n\tbackground-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAOxAAADsQBlSsOGwAAAHFJREFUOMtjYEAD////Dwbiw0D8HYoPAXEgAz4AVND7HzfowqUpGKrgBxBnA7EAEPNB2T+gcv7YNB6GSmZjkcuByh3EpvE7VFIAixw/VO4rNo1ggMf/mPL/SQQ002gCxObkaDQGYlNyNDZAMf000iZUAdQHDgw3MuoHAAAAAElFTkSuQmCC\");\n}\n.ui-icon-mail:after {\n\tbackground-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAOxAAADsQBlSsOGwAAAIVJREFUOMtjYKA7+P//fzQQf/xPPACpjQZp5AJiRSA+SoQmkBoFkB6QxqtArAXEzEDcAMR/sGgAidVD1WiD9DBAJb4CcQLU6VZAfB9J0z0gtoTKJUDV/mdAM3kB1Ol8QLwEivmgYguQFTJgcRbY6UiBpw0V+09II9zpyE4jViNBMAAa6Q4ARIAH2Rfeh/QAAAAASUVORK5CYII=\");\n}\n.ui-icon-minus:after {\n\tbackground-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAOxAAADsQBlSsOGwAAABZJREFUOE9jYBgFuMF/MsFQ0jgKcAMA2lPfIe/W1fgAAAAASUVORK5CYII=\");\n}\n.ui-icon-navigation:after {\n\tbackground-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAOxAAADsQBlSsOGwAAAJNJREFUOMtjYKA1+P//vxAQ5wLxXGIUMwGxKxCvAOIf/yEgB58GeSBuAOIH/1HBdyAWRFfMAcSRQLwbiP/9xw6WI2swBOIpQPzuP2Hggu5pMyCOBuJ6IF4CxCeA+C2aJpCzGYkNSWRX1JMSBSehmv4CsRwpGpdCNe4iNdIboBojSNUYAw0kdlI1mgPxZHLTpyE2OQBXFwcOWoyvmwAAAABJRU5ErkJggg==\");\n}\n.ui-icon-phone:after {\n\tbackground-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAOxAAADsQBlSsOGwAAALRJREFUOMtj+P//PxMQLwDiI0DMy0AsACqOAuKz/yHgGNGagQrfAPFqNM08xGj8BtWwBqr5NxCbEqPx9H8EWAXEHsQ6tRxJ4yVSAocf6k8YCCZFcyySxi9AbE6K5vlImj8AsTWavBYQc2PTyAbEu5E0/wDiFKicNTT0sScSoCAXEO/5jwouAfFypHg+ikszyOaF/zHBGiTNh/D5OQGI36JphqWwiYQCTACIK4D4HNTPr2HRBQChdFG//DBhowAAAABJRU5ErkJggg==\");\n}\n.ui-icon-plus:after {\n\tbackground-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAOxAAADsQBlSsOGwAAAB5JREFUOMtjYMAC/qMBBmLBcNP4n0wwlDSOJgDcGgFPin6QGOaERAAAAABJRU5ErkJggg==\");\n}\n.ui-icon-power:after {\n\tbackground-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAOxAAADsQBlSsOGwAAANBJREFUOMtjYMAB/v//vxeIdzOQCv5DATEKQ4H4FhCbo2sEUrZAfBuIA9E1KQLxV6jaUCwaY6HcL0Ash6xxClRiNS6nApkboEITkTXehwoa49FoBhW6g6zxD1SQBY9GVqjQb2SNX6CCQkhiF4H4PBJfBKrmE7LGQ1DBBCQxJiBmROKnQtXsQ9aYCBV8AQphLFGlAsSvoWpikSWYkWx9A8QloIACYhMgLgfid1A5UGpiQjdVEIgP/scNQJr4caUeJmhk7wbi51C8C4ijkf1LEQAAs65tnfCMVk0AAAAASUVORK5CYII=\");\n}\n.ui-icon-recycle:after {\n\tbackground-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAOxAAADsQBlSsOGwAAAJ9JREFUOMtjYKAm+P///1kg/gnEP6DsQiBmJ0YjNnAZiGUIafQDYi4g5gZiXyC+DtV8CcVmICcUhPEYxI+kuQAmKArEr6BYlIArQOA0TGA1kj9W4dHIA1XzDVnwB1SQG49GTAugQQ4Cvng0YnoJyCiCagQFAD8ezaiBCORwAPEVJM1+UD+BcAihuJNF0owCiEkxHNDkdQYUelB8gqrpGQBlvyiNmsjT4QAAAABJRU5ErkJggg==\");\n}\n.ui-icon-refresh:after {\n\tbackground-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAOxAAADsQBlSsOGwAAAM9JREFUOMtjYEAC////lwbiTiC+AsQ/gfgHEF8C4lYglkBSV4+sKRaIv/zHDT4BcSQQNwPxH5imGCD+B1WwCoitgJgNiq2BeC2aIX9AmiSB+DNUII8BBwDK7UfX2A7lrMGjqRmbjVegHEscmhqx+Bes8QeUw8ZACqBE42WoRmtSNbZBNa4lQq0vEDPDOJLQyAWBEjyaqqBqDiILRiAlgA1AbA/E3FDsCMRboHJ/gTgI3cQwIP6AJ8mB5IJxOUcMiJuA+Dw03X6BskFxKYasFgCG8ZXX6DfYhgAAAABJRU5ErkJggg==\");\n}\n.ui-icon-search:after {\n\tbackground-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAOxAAADsQBlSsOGwAAAONJREFUOMuV0c8qhVEUhvFvcvKlMHBCUUwU5RpMlIm5UnIFOp2bMHEDiokLkJKpMpXO4Bg4MlAGLkDK3/AzWYPd195iDd/nfVbttasqBjU6OMcdetjFdFUazOJGfp6wlpNqDKI0wDrmsYzjyF+x1BS3E2k0s/gg+EkTnAXYKDyjjU+8o07BbYiLv9zgPjpzaXgR4UpBGsJLdMZSsBPhaUHsBO81wRQeAx5iMrl2Fx/BNnNbV/EchS884K3xn32M5+QFHCXCNy6xhevIrtAuXbCFGYwk2cSf5MLCVN6r/jMh72P4BxnPgmBrkPyTAAAAAElFTkSuQmCC\");\n}\n.ui-icon-shop:after {\n\tbackground-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAOxAAADsQBlSsOGwAAAE9JREFUOMtjYEAD////ZwfiKUD8Hog/QtnsDIQAVOE6IBYDYlEg3gDEk4nRCLJJDIkPMuADMRr/EyMGlyAF4NJoiUWtOTEaybZxVOOAaQQAmEocSjETvxYAAAAASUVORK5CYII=\");\n}\n.ui-icon-star:after {\n\tbackground-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAOxAAADsQBlSsOGwAAAJFJREFUOMtjYMAB/v//bwzCDKQCoKZZQDyTVE28QPwZiD8BMQ8pGtP/I0AaKRrPImk8g0tRAhB//U88AKmNh2nWAuKrRGi6AlKLbjMXEC/Ao2k+SA0uZyvj0aiML1Cy8GjMxKdxA1TRWyAOh+K3ULH1uDSxQCN8KxBLIolLAvE2IP4IUoNNowG+yAbJgdQwUAoAbN9GiH93pK4AAAAASUVORK5CYII=\");\n}\n.ui-icon-tag:after {\n\tbackground-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAOxAAADsQBlSsOGwAAAEFJREFUOMtj+I8dNDAQAv9xgwZiNZoBsQXRmpEUgTRZEW3zf+JAAzaNDaOaSYhjApoJJowGspIiFs3EaULTjKEJAH1ft8O6vRfvAAAAAElFTkSuQmCC\");\n}\n.ui-icon-user:after {\n\tbackground-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAOxAAADsQBlSsOGwAAAJdJREFUOMud0jsOQUEUgOEpJGxD0CpswAqUohStLYitiEJUEtHZgETJKjyiIqqb3E9D4nFdE399vuTkzITwFgqYIMEarRAT+l5L0YyBK5/NY+A5Ax5/oZrsUlTz4ND3BnmwglMGOqD8a91ZBpzGHKeB6xO6oB77lssnuMgbLKGDMbb3X/MowQYjtFF8oB724tuhG/zZ3/AGG1/AkN/xnJsAAAAASUVORK5CYII=\");\n}\n.ui-icon-video:after {\n\tbackground-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAOxAAADsQBlSsOGwAAAExJREFUOMvF0csJACAMBNE0KGJHlqtpYjwJIvF70Lk/CFmR5wEByIxTwFtwhmq5M1HYrEUAR7CiI9iiN/D6VOs5uuGSNYdfbJkAJ98rtv7WyPB7sagAAAAASUVORK5CYII=\");\n}\n/* Alt icons */\n.ui-alt-icon.ui-icon-action:after,\n.ui-alt-icon .ui-icon-action:after {\n\tbackground-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAOxAAADsQBlSsOGwAAAH1JREFUOMtjYCAOzAJiNgYywH8gPgbEkuRoBOFnQGyJLgjDDVBxNSBeDsQf0OR/AnEaAw5NdkD8BYuhWDXCAC8QvwDiH0BcB8TihJwKA/lA/BmIrQkFDrrG3UAcjhY4M5GiowGXxrl4QrcBWS26RiMiogWrRga6aSQFk68RAP5OVqWXKdm9AAAAAElFTkSuQmCC\");\n}\n.ui-alt-icon.ui-icon-alert:after,\n.ui-alt-icon .ui-icon-alert:after {\n\tbackground-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAOxAAADsQBlSsOGwAAAJZJREFUOMtjYMANvIHYi4FEwAbEt4D4JhCzkqKxFIj/Q3EpsZokgPgTksZPUDGCYAFUgxkQW0DZ8wlpMgfif1DFMPAfKmaGSxMjEJ9EciKyxv9QOUZsGhOQFP2HOtMKTSweXRMvED9HU4QNP4eqhYNuLIpMoH5GF++CaVID4l9YFJhjcSoI/wRiVZDGrUQ4ER1vZaA7AAA8nEl47CBNKgAAAABJRU5ErkJggg==\");\n}\n.ui-alt-icon.ui-icon-arrow-d:after,\n.ui-alt-icon .ui-icon-arrow-d:after {\n\tbackground-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAOxAAADsQBlSsOGwAAADRJREFUOMtjYMAO/qNhosGoRko1NmBRSAg3kKO5gRybG8hxdgOhgGkgRxM2zQ0MJIIGfJoARZtMu19O4xgAAAAASUVORK5CYII=\");\n}\n.ui-alt-icon.ui-icon-arrow-d-l:after,\n.ui-alt-icon .ui-icon-arrow-d-l:after {\n\tbackground-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAOxAAADsQBlSsOGwAAAElJREFUOMtjYCAeNEAxSQCk4T8UN5CjiWjN2DTBNTaQo4kBh9UENTFgESRKEwOa5AFiNTHgUEhUCJKlCZ/GA4Tiiuo2UuRHnJoBqxder3inhF8AAAAASUVORK5CYII=\");\n}\n.ui-alt-icon.ui-icon-arrow-d-r:after,\n.ui-alt-icon .ui-icon-arrow-d-r:after {\n\tbackground-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAOxAAADsQBlSsOGwAAAEFJREFUOMtjYECABigmCYA0/IfiBnI0kaQZm0aaaW4gRzNMHUk2I8sT7ewDaHyS/ExQIzGa8YIDdLORLD8So+k/AHCSXq9v5cRTAAAAAElFTkSuQmCC\");\n}\n.ui-alt-icon.ui-icon-arrow-l:after,\n.ui-alt-icon .ui-icon-arrow-l:after {\n\tbackground-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAOxAAADsQBlSsOGwAAADdJREFUOMtjYMANGhjIACBN/8nV9J9cTf/J1fSfXE2EMFmaKNNItlMpChyKooOiBEBRkiMqkQMAcwJMu8C5mgwAAAAASUVORK5CYII=\");\n}\n.ui-alt-icon.ui-icon-arrow-r:after,\n.ui-alt-icon .ui-icon-arrow-r:after {\n\tbackground-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAOxAAADsQBlSsOGwAAADVJREFUOMtjYMAPGhjIBP/J1fyfXM3/ydX8H5/m/yTiBnI1wjXTTWMDxYFD0+hooFuSw6kJAOa7TLvbyXpwAAAAAElFTkSuQmCC\");\n}\n.ui-alt-icon.ui-icon-arrow-u:after,\n.ui-alt-icon .ui-icon-arrow-u:after {\n\tbackground-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAOxAAADsQBlSsOGwAAADVJREFUOMtjYMANGqCYJADS8B+KG8jRRLRmbJoIasanCadmYjRhaCZFE0FnoyskGoxqpEQjABQxTLu007KqAAAAAElFTkSuQmCC\");\n}\n.ui-alt-icon.ui-icon-arrow-u-l:after,\n.ui-alt-icon .ui-icon-arrow-u-l:after {\n\tbackground-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAOxAAADsQBlSsOGwAAAEVJREFUOMtjYGBg+E8EbmDAAsjSxECuJnwaDzAQAFS3kSQ/HiAnVGGSDcRqxiZIlGZcfmggJ8BoppkojeiaidaErBmuCQCtL16vpLfRlQAAAABJRU5ErkJggg==\");\n}\n.ui-alt-icon.ui-icon-arrow-u-r:after,\n.ui-alt-icon .ui-icon-arrow-u-r:after {\n\tbackground-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAOxAAADsQBlSsOGwAAAEVJREFUOMu9zzEOACAIA8A+nafxM12JFiwMNmGCCwDcMQBLKBqbQgWX8W8bRz9myCuYISN9GZ1zLRTn26g88YkYllHEMtpyql6v/pwMSQAAAABJRU5ErkJggg==\");\n}\n.ui-alt-icon.ui-icon-audio:after,\n.ui-alt-icon .ui-icon-audio:after {\n\tbackground-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAOxAAADsQBlSsOGwAAANVJREFUOMuF0jFKg0EQhuHHXCBqL1ELCytzi5zAKgh2ViEgYhMwYCkWaXIUG/sU6YJaCBZewKRRiaAkzRTLun/+r5pvZ15mdhjKukniBh7RVaNb/Cb+BN9YYbQJWmUgHOE1ctdVUAqeoxfxHj7wgwOYJkAOzsJfhe+Fv1eAUrCFOb6wjR384aUOhHG8dcK/Y9lQr62qxKaOh1jgE03sxqjPMInCEvgUvh++H/4u7TwsgGe4iHg/FrWMpSnB+QEc4y1yl1V/HmZgO7r8G7GkQXbkDzhNC9aKZ1PDJ0JepAAAAABJRU5ErkJggg==\");\n}\n.ui-alt-icon.ui-icon-back:after,\n.ui-alt-icon .ui-icon-back:after {\n\tbackground-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAOxAAADsQBlSsOGwAAAItJREFUOMtjYMAEDQxkAJCm/+Rq+k+uJhD+A8Svgfg4EE8AYgdiNWLDZ4BYl5BmViCWBmIXIG4F4qdQ8U9ArE1K4HAB8Vqo3GZ8zsYGJKAaP5Ma6sLkamyEatxLrAZQQNUD8T+oRldCGhSBuBiI70I1gDSWEmMTchzeBGIPYp34DIiXArEvEDOhSwIAi9Qyp4aUzewAAAAASUVORK5CYII=\");\n}\n.ui-alt-icon.ui-icon-bars:after,\n.ui-alt-icon .ui-icon-bars:after {\n\tbackground-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAOxAAADsQBlSsOGwAAACZJREFUOMtjYBgIcBKI/5OIT4A0HidD41GGUT/SCJwh148nhoYfAe0YURTen2r1AAAAAElFTkSuQmCC\");\n}\n.ui-alt-icon.ui-icon-bullets:after,\n.ui-alt-icon .ui-icon-bullets:after {\n\tbackground-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAOxAAADsQBlSsOGwAAADVJREFUOMtjYBgIcBKIj6Px/xPAJxigmo4iaTxOhMajDKN+pBE4A3MzEp8oP55Ac/OJwelHAGSiQoVBqpe0AAAAAElFTkSuQmCC\");\n}\n.ui-alt-icon.ui-icon-calendar:after,\n.ui-alt-icon .ui-icon-calendar:after {\n\tbackground-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAOxAAADsQBlSsOGwAAADRJREFUOMtjZECAk0D8D4gtGbCDM0D8B4gtQBxGIP7PQAYYYhoZKLWRJDZFGkedismmTCMAvGkkB7PDw7MAAAAASUVORK5CYII=\");\n}\n.ui-alt-icon.ui-icon-camera:after,\n.ui-alt-icon .ui-icon-camera:after {\n\tbackground-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAOxAAADsQBlSsOGwAAAJxJREFUOMtjYKAiUAfiGiBugGIQWxWbQi4gzkRS+BSI/6Phx0jyWUDMCdK4GYtCQngTSOMfLBIPgXgCEPdB2ejyID0YggeAWBTqfJCzRID4IBZ1GAIGaM4HOcuQGI0sQPwLif8TiFmJtXETEn89EBsTo/EQkh8zoOwj2DT+xSL4CIj7oSH7GFeobiIjHkHOB6cC5JRDCGfAUg5ZAAAIx317SYGtJAAAAABJRU5ErkJggg==\");\n}\n.ui-alt-icon.ui-icon-carat-d:after,\n.ui-alt-icon .ui-icon-carat-d:after {\n\tbackground-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAOxAAADsQBlSsOGwAAAHFJREFUOMvV0DEKAjEQQNF3GhXXbXW9f6+nkGVTqRfQJoFlIDHa+SFFmHkpwt+1w7Fjb8KmXLaYccepgc544lbwFa98anjCY7V3gQFLA0e0YF+GNdxEa5wCjmiofUDEXah0CDj1oNKYQcoPfdX4C/rYG6dgMtFQD5sUAAAAAElFTkSuQmCC\");\n}\n.ui-alt-icon.ui-icon-carat-l:after,\n.ui-alt-icon .ui-icon-carat-l:after {\n\tbackground-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAOxAAADsQBlSsOGwAAAFBJREFUOMtjYMAPdIH4PBCrMJAA9ID4NRD/B+KnQKxKqiYQfg/ExuRoMiFG0xtSNenTTRNFGnFpNiUl7pA1fyBV82s0zWZ01/yY1PSKM5EDAGi5MtgV7LNzAAAAAElFTkSuQmCC\");\n}\n.ui-alt-icon.ui-icon-carat-r:after,\n.ui-alt-icon .ui-icon-carat-r:after {\n\tbackground-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAOxAAADsQBlSsOGwAAAFpJREFUOMtjYMAE6kB8Hoi1GEgAGkD8HIj/A/FLINYmVqMZEH+AaiRZszk1Nb+iVLMOJZp1idX4kVRbLcjRZIlFkzYxmj6RGh0W5GgCATUgfkpOxMM0nyOUyAF53TLQiFLV2gAAAABJRU5ErkJggg==\");\n}\n.ui-alt-icon.ui-icon-carat-u:after,\n.ui-alt-icon .ui-icon-carat-u:after {\n\tbackground-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAOxAAADsQBlSsOGwAAAGZJREFUOMtjYKAB0IdikjW9gWI9UjX9h2KiNOuhaYLh1/g060EVwBS/h2JkzbrEaDIBYlMg/oBLsy4OTTCArvkVTPN5PJpwaT4HElQB4qd4NMGAGVTzY6geMFAFYmMiosoMWdMQAQBshTLV2RAbgQAAAABJRU5ErkJggg==\");\n}\n.ui-alt-icon.ui-icon-check:after,\n.ui-alt-icon .ui-icon-check:after,\nhtml .ui-alt-icon.ui-btn.ui-checkbox-on:after,\nhtml .ui-alt-icon .ui-btn.ui-checkbox-on:after {\n\tbackground-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAOxAAADsQBlSsOGwAAAEtJREFUOMtjYKADaIBikkAjEP+HYqI1NyFpIlozNk0YGhugToKBZmI1wSSayNGEDzfgCzGiNRHyD1Eh2EaOJhjoIEcTDHSRo4loAAAMpkH3I7j13AAAAABJRU5ErkJggg==\");\n}\n.ui-alt-icon.ui-icon-clock:after,\n.ui-alt-icon .ui-icon-clock:after {\n\tbackground-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAOxAAADsQBlSsOGwAAANhJREFUOMuNkmEKgkAQhYd+hRdI9CpZpwiETlERdICiDhMh0R2qf4ZdxArsT9rbeAtT7GIPPnTHebvjzIp8KwYbcAVPUoA1iMSjMXiAxsMdpC5TzYQt6IMuScCO32ptjtVJU7XZGRzVes6cGwiF/2RP0rIlamWMrYSNaFhem3HA2EXYuYb/4zIaTowFXFcd8euk3l+uhIK7JNKuIXNzc+KBwckfxhmfH0/E4TZsuU8L5pSgZ4OpugAZuxcQU95eXYDR744ph+u7cqXLZBVyuGZOFcnBUpdn9AYEHE/v8XhZcwAAAABJRU5ErkJggg==\");\n}\n.ui-alt-icon.ui-icon-cloud:after,\n.ui-alt-icon .ui-icon-cloud:after {\n\tbackground-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAOxAAADsQBlSsOGwAAAHZJREFUOMtjYBgMQBiIE4G4FkoLEaMpEog/A/F/JPwRiEPwabIF4r9ommD4NxCb49K4C4cmGP4HxK+A2B9ZkzsQfyOgEYZfwjRVEKkBhr8AMSdI41sSNYLwRpDGd2Ro/AnSWE6GxnUwf7pAI7yBCJwJxBz0T5cA6NleA+xgAXwAAAAASUVORK5CYII=\");\n}\n.ui-alt-icon.ui-icon-comment:after,\n.ui-alt-icon .ui-icon-comment:after {\n\tbackground-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAOxAAADsQBlSsOGwAAAEdJREFUOMtjYGBgCATil0D8n0j8Coj9GUjUBMMvGaEMkgETA5lgVCMBja/J0AeKe3AqICURvABiX3STYJINpDqBLE0MpGgCAMwXLfKbu8xgAAAAAElFTkSuQmCC\");\n}\n.ui-alt-icon.ui-icon-delete:after,\n.ui-alt-icon .ui-icon-delete:after {\n\tbackground-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAOxAAADsQBlSsOGwAAAE1JREFUOMtjYECABijGBbDKgwT+Q3EDDk0Y8siC2DTjlMcm8R/Jaf/xGYxLwX8CriFacwO+kCNZE9kaG2jlP6JDlGB0kJ0AyE5yZCVyAIGUcaXrtLjcAAAAAElFTkSuQmCC\");\n}\n.ui-alt-icon.ui-icon-edit:after,\n.ui-alt-icon .ui-icon-edit:after {\n\tbackground-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAOxAAADsQBlSsOGwAAAEVJREFUOMtjYCAeNEAxSQCk4T8UN5CrkSjNyM4j2lZsChtI0USS8/6TqnGQa1IgRxMIJJCjCQQWkKMJBA5ANSdAnU0UAAB60T1Uc0QS+gAAAABJRU5ErkJggg==\");\n}\n.ui-alt-icon.ui-icon-eye:after,\n.ui-alt-icon .ui-icon-eye:after {\n\tbackground-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAOxAAADsQBlSsOGwAAAJtJREFUOMtjYBhowAjEUUB8EIi/QvEBqBgjLk0SUEX/cWCQnDi6JjkgvgdV8AOIs4FYAIj5oOwfULl7ULVgwA/E15FMzsbimhwk+etQPQyr0JwkAFV8EoiPIxmOrGYlExbT/yHR/5ACDQOgOzUXi5oCJPlrUL9jDZxcqIECUE0/sQUODIgTiI792KIDOQFEQg34AsUHoGKMA5s2AdHHPobWAPyKAAAAAElFTkSuQmCC\");\n}\n.ui-alt-icon.ui-icon-forbidden:after,\n.ui-alt-icon .ui-icon-forbidden:after {\n\tbackground-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAOxAAADsQBlSsOGwAAAM1JREFUOMuFkkEOgjAQRd9S2WMIZ1HDMVi48wzcAEO8DGHlxlOAiecgshA31M1vUptiJ2lC+3mdmT+F38iBK/AEPsAMPIBGWjDOwASYlTUBZQha9MMN2AMbrQPQSltcOPcyDUAaqKiS/gIy1JPNNETgTvoFGWFUXhqBj9J65J5RP0TgROdvZLkL/oO3OpvRnIzcIwIXzp5GmzZghg/f9V3746gisAFGYGfF0nkAndxL1FPhZFqAk39zqeGuPbkxBNnINNxels8qs3bLA/gCVFFewZEF7yYAAAAASUVORK5CYII=\");\n}\n.ui-alt-icon.ui-icon-forward:after,\n.ui-alt-icon .ui-icon-forward:after {\n\tbackground-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAOxAAADsQBlSsOGwAAAItJREFUOMtjYCAONDCQCf6Tq/k/MZodgHgCEB8H4tdA/AdJI1bNekB8Bk0RNoyiURuIP0ElngJxKxC7ALE0ELPis20rVGItEHOSEjhfoJISpEYHTKMQqcG9D6qxkVSNblCN/4C4DohZSNFcBtUIMuAuEBcDsQKxmj2A+CZavBENmIDYD4iXAvEzXIoAgqYyqw9Yg9IAAAAASUVORK5CYII=\");\n}\n.ui-alt-icon.ui-icon-gear:after,\n.ui-alt-icon .ui-icon-gear:after {\n\tbackground-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAOxAAADsQBlSsOGwAAAOBJREFUOMuFkkEKwkAMRae13arQXVGo6BFEUS8hiLgSQZcteABddOFJ3YjSA9SK1T/wK2EIGHjw2ySTTDLG6DYAL1CBvhbgC70BMxCCAwio99RzsHYPsEkfUIOCWlLQZ1nJilcGeCBSOovoa2J/FopKJUhBF7SpS/ruoCUHcRFtpUrFTPhzkBhOT96nqyR2nJjKp5BWK4meG2MThyzf2FZJ3Al9BqPmI3CGk7E92/YRPOm7Obs3C2V3Gm8wkXuMxQO4K60+xJ5j12lfxJh7ykWVE/9NwdL8sYQP3N6tpwV8AdaYR91UZ7PcAAAAAElFTkSuQmCC\");\n}\n.ui-alt-icon.ui-icon-grid:after,\n.ui-alt-icon .ui-icon-grid:after {\n\tbackground-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAOxAAADsQBlSsOGwAAAEJJREFUOMtjYGBgOAnE/6H4OAMEIIudgIqdQRf7j4aJFiNb43EkzlGoImxiJ7CIkQeGUOCcIDIgqBc4Z4gJiCEcOADCDYeuTK+m9gAAAABJRU5ErkJggg==\");\n}\n.ui-alt-icon.ui-icon-heart:after,\n.ui-alt-icon .ui-icon-heart:after {\n\tbackground-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAOxAAADsQBlSsOGwAAAJRJREFUOMud0D0OAUEYBuDHFVyEisYlaITYm1GtcAU99V5CSb+bWKEwkrVZ+/cmb/PNPJkvwydj7JHghAiD0CjMEsQYBWOGDK9St9hVzLNgXCoOm3r257WmZnDvAW9w7AEPMO0BJ9+fjTugWCFDXFuga7j7kwnSGpQWVyxngbwCPTDXkDWeBZRjqWWigHOsdMymDr0BP5J/6NqLuzwAAAAASUVORK5CYII=\");\n}\n.ui-alt-icon.ui-icon-home:after,\n.ui-alt-icon .ui-icon-home:after {\n\tbackground-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAOxAAADsQBlSsOGwAAADhJREFUOMtjYMANGqCYJADS8B+KG8jRRLRmbJoIasanCadmYjRhaCZFE1abidWEAaiikRS5YasRAHf0YqUlUKReAAAAAElFTkSuQmCC\");\n}\n.ui-alt-icon.ui-icon-info:after,\n.ui-alt-icon .ui-icon-info:after {\n\tbackground-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAOxAAADsQBlSsOGwAAAJxJREFUOMul0ksKwkAQhOHvFga9hwTvIQS8TkSPZ4gX8QG6Stx0IA6TQLSgNtPzz6O6+dYGZ1zxDrc4YW1CBzzRT/iBKgd1ycYtymStG8ObiZtK7DLrdxTiT/1CH0UQaWGsHNiI5PoZOFd7/QW2P4AX0dylYC0m4jETTgrfsBoKVWYAcu6wT0+torlT0C0HDSqiuU0k94og6vHz4AMNCIcMUIkWVwAAAABJRU5ErkJggg==\");\n}\n.ui-alt-icon.ui-icon-location:after,\n.ui-alt-icon .ui-icon-location:after {\n\tbackground-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAOxAAADsQBlSsOGwAAAJdJREFUOMuVkDEKwkAUBafzBG7sbCVtej2FHionEVGJIZVniqJouoA2T/jo+pMd+M3sm2bhlxxogA54AjWwYIAcuAOvr7sNxY2GRyAAU6CSO3lhp1EwLsg9vPCqUWZcJnfxwoNGFTBTVMvtvXAT+ZjPrb1wArSRqNWbSxkJS0YwB3oT9XKj2JlwSwKFCQsSOeuSWQHLf49vN4Q5LhENhvAAAAAASUVORK5CYII=\");\n}\n.ui-alt-icon.ui-icon-lock:after,\n.ui-alt-icon .ui-icon-lock:after {\n\tbackground-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAOxAAADsQBlSsOGwAAAG5JREFUOMtjYMAEwUB8GIi/Q/EhIA5kIAB6gfg/DtyFS1MwVMEPIM4GYgEg5oOyf0Dl/LFpPAyVzMYilwOVO4hN43eopAAWOX6o3FdsGmF+wQWwyv8nEdNGowkQm5Oj0RiITcnR2ADF9NNIm1AFAP9Vd4ZWPhWFAAAAAElFTkSuQmCC\");\n}\n.ui-alt-icon.ui-icon-mail:after,\n.ui-alt-icon .ui-icon-mail:after {\n\tbackground-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAOxAAADsQBlSsOGwAAAIRJREFUOMtjYBgIEA3EH4H4P5H4I1QPAxcQKwLxUSI0gdQoQPUwXAViLSBmBuIGIP6DRQNIrB6qRhuqByzxFYgToE63AuL7SJruAbElVC4BqvY/A5rJC6DO4APiJVDMBxVbgKYWw1kwp8MAzGn/CWlEdjqy01AwI0w3qYCJ3MhnYhgyAAD7hUiBFf5JtwAAAABJRU5ErkJggg==\");\n}\n.ui-alt-icon.ui-icon-minus:after,\n.ui-alt-icon .ui-icon-minus:after {\n\tbackground-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAOxAAADsQBlSsOGwAAABZJREFUOMtjYBgFeMF/MvFQ0jgKcAAApTQ3yWkQbYUAAAAASUVORK5CYII=\");\n}\n.ui-alt-icon.ui-icon-navigation:after,\n.ui-alt-icon .ui-icon-navigation:after {\n\tbackground-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAOxAAADsQBlSsOGwAAAJRJREFUOMtjYKADEALiXCCeS4xiJiB2BeIVQPwDiP8DcQ4+DfJA3ADED6CKYfg7EAuiK+YA4kgg3g3E/9A0wPByZA2GQDwFiN/hUIyMXdA9bQbE0UBcD8RLgPgEEL9F0wRyNiOxIYnsinpSouAkVNNfIJYjReNSqMZdpEZ6A1RjBKkaY6CBxE6qRnMgnkxu+jTEJgEAOtUv19DqMFAAAAAASUVORK5CYII=\");\n}\n.ui-alt-icon.ui-icon-phone:after,\n.ui-alt-icon .ui-icon-phone:after {\n\tbackground-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAOxAAADsQBlSsOGwAAALBJREFUOMtjYGBgYALiBUB8BIh5GUgAUUB8Foj/A/ExUjS/AeLVaJp5iNH4DaphDVTzbyA2JUbjaahGEF4FxB7EOrUcSeMlUgKHH+pPmOZgUjTHImn8AsTmpGiej6T5AxBbo8lrATE3No1sQLwbSfMPIE6GyllDQx9nIuEC4j1ImmEBthwpno/i0gyyeSGaZuR4BrEP4fNzAhC/RdMMS2ETCAWYABBXAPE5qJ9fw6ILAKJsPsK6IqZ8AAAAAElFTkSuQmCC\");\n}\n.ui-alt-icon.ui-icon-plus:after,\n.ui-alt-icon .ui-icon-plus:after {\n\tbackground-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAOxAAADsQBlSsOGwAAAB1JREFUOMtjYMAO/qNhosFw0/ifTDyUNI4mABwaAYa6X6GPliIhAAAAAElFTkSuQmCC\");\n}\n.ui-alt-icon.ui-icon-power:after,\n.ui-alt-icon .ui-icon-power:after {\n\tbackground-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAOxAAADsQBlSsOGwAAAMZJREFUOMtjYMAN9gLxbgYywH8oJghCgfgWEJtj0WgLxLeBOBBdkyIQf4UqDMWiMRbK/gLEcsgap0AlVuNx6gYofyKyxvtQQWM8Gs2g/DvIGv9ABVnwaGSF8n8ja/wCFRRCErsIxOeR+CJQNZ+QNR6CCiYgiTEBMSMSPxWqZh+yxkSo4AtoCKMDFSB+DVUTiyzBjGTrGyAugQaUCRCXA/E7qNxeqEtQgCAQH0QKFHQM0sSPK/UwQZ0CSqPPoXgXEEej+Zd8AAA35kK6jnLDjgAAAABJRU5ErkJggg==\");\n}\n.ui-alt-icon.ui-icon-recycle:after,\n.ui-alt-icon .ui-icon-recycle:after {\n\tbackground-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAOxAAADsQBlSsOGwAAAJVJREFUOMtjYKAyOAvEP4H4B5RdCMTsxGj8jwVfBmIZQhr9gJgLiLmB2BeIr0M1X0K3ORSKcQF+JM0FMEFRIH4FxaIEXAHSeBomsBrJH6vwaOSBqvmGLPgDKsiNRyNWC85CBXzxaMTqpSKoxuvQgMAFMAKRA4ivIGn2g/oJhEMIxZ0skmZ0TBBwQJPXGWjogfAJqiZmAOozM3SzI/gZAAAAAElFTkSuQmCC\");\n}\n.ui-alt-icon.ui-icon-refresh:after,\n.ui-alt-icon .ui-icon-refresh:after {\n\tbackground-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAOxAAADsQBlSsOGwAAAMlJREFUOMtjYEAF0kDcCcRXgPgnEP8A4ktA3ArEEkjq6pE1xQLxFyD+jwN/AuJIIG4G4j8wTTFA/A+qYBUQWwExGxRbA/FaNEPAGiWB+DNUII8BN9iPrrEdylmDR1MzNhuvQDmWODQ1YvEvWOMPKIeNgURAtsbLUI3WpGpsg2pcS4RaXyBmhnEkoZEL0lyCR1MVVM1BZMEIpASwAYjtgZgbih2BeAtU7i8QB6GbGAbEH/AkOZBcMC7niAFxExCfh6bbL1B2I1QODgBeWE0SXtioYgAAAABJRU5ErkJggg==\");\n}\n.ui-alt-icon.ui-icon-search:after,\n.ui-alt-icon .ui-icon-search:after,\n.ui-input-search:after {\n\tbackground-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAOxAAADsQBlSsOGwAAAOZJREFUOMuV0U8rxFEUxvFPSjMUG/oRio2ivAZLG3ulZGsjzevwBpTZzAuYlD3Zi2JhZKEs7Aclf/Jvc3D7dX8TT906Pc/5nu49l1/VsYUjXOME25jUQ9O4xGfmPGA5B9XRiaYOVjCLReyF/4SFMriZQMOZwc3I98vBQQSrFc8YxRte4nY/ugpwvscObqJn5tvoQzfqiQqohiLqbgoeRt2oADcwgFPcp8E47uIqLYwl227gNbK13NQlPEbDO27xXPrPM4zk4Dm0E+ADx1jHRXjnseWs+jGFocQr/grnlMI7/qkCuxj8AkXLP4FD310vAAAAAElFTkSuQmCC\");\n}\n.ui-alt-icon.ui-icon-shop:after,\n.ui-alt-icon .ui-icon-shop:after {\n\tbackground-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAOxAAADsQBlSsOGwAAAFBJREFUOMtjYMAE7EA8BYjfA/FHKJsdXRETFo29QCwFxOpArALEMkDcw0AEANkkhsQHsT8Qo/E/MWKMeBTjA4zY/GiFRcyCpjYSBUY10kIjAHnuC0BW95IBAAAAAElFTkSuQmCC\");\n}\n.ui-alt-icon.ui-icon-star:after,\n.ui-alt-icon .ui-icon-star:after {\n\tbackground-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAOxAAADsQBlSsOGwAAAIlJREFUOMtjYMANjKGYZDALiGeSqokXiD8D8Scg5iFFYzoQ/4fiNFI0nkXSeAaXogQg/oqkkBAGqY2HadYC4qtEaLoCVYsCuIB4AR5N86FqsAJlPBqV8QVKFh6Nmfg0boAqegvE4VD8Fiq2HpcmFmiEbwViSSRxEHsbEH+EqsEABgQiOw2qhjIAAOvoP4EZPNvPAAAAAElFTkSuQmCC\");\n}\n.ui-alt-icon.ui-icon-tag:after,\n.ui-alt-icon .ui-icon-tag:after {\n\tbackground-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAOxAAADsQBlSsOGwAAAEFJREFUOMtjYGBg+I8FNzAQAf6Tqxmm0AyILUjRDFME0mRFis3/icBYNTeMaiYtjhsoSRgN5CZFdM1Ea0LWjKEJAJLwYwqDORsHAAAAAElFTkSuQmCC\");\n}\n.ui-alt-icon.ui-icon-user:after,\n.ui-alt-icon .ui-icon-user:after {\n\tbackground-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAOxAAADsQBlSsOGwAAAJdJREFUOMtjYMAELEC8BIh/A/EJIPZlIBJkAfF/JPwPiO2J0XgUTSMIrydG4ycsGl8R0qSKRRPMuSr4NNbi0AjC1fg0KgPxGyyaXgKxIiHnrsGicRkxgWMExF+RNH0GYj1i43IHksaN+BRyAHE4EC8A4ovQVAPTCGJfAOJ5QBwKxOwwTYlA/AJPaKLj50Acz0CCBnRMnkYAFb5i4CiuUNsAAAAASUVORK5CYII=\");\n}\n.ui-alt-icon.ui-icon-video:after,\n.ui-alt-icon .ui-icon-video:after {\n\tbackground-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAOxAAADsQBlSsOGwAAAE1JREFUOMtjYBgIEAjEL4H4Pw78Coj9sWnEpwmGX6LpaWAgQhMMI2v6T6rGBmQ+sRob0A2iuUaynYoROK+I0PQCW3T4E4hLkCZfhgEHAMf2cCELnGdHAAAAAElFTkSuQmCC\");\n}\n/* Globals */\n/* Font\n-----------------------------------------------------------------------------------------------------------*/\nhtml {\n\tfont-size: 100%;\n}\nbody,\ninput,\nselect,\ntextarea,\nbutton,\n.ui-btn {\n\tfont-size: 1em;\n\tline-height: 1.3;\n\tfont-family: sans-serif /*{global-font-family}*/;\n}\nlegend,\n.ui-input-text input,\n.ui-input-search input {\n\tcolor: inherit;\n\ttext-shadow: inherit;\n}\n/* Form labels (overrides font-weight bold in bars, and mini font-size) */\n.ui-mobile label,\ndiv.ui-controlgroup-label {\n\tfont-weight: normal;\n\tfont-size: 16px;\n}\n/* Separators\n-----------------------------------------------------------------------------------------------------------*/\n/* Field contain separator (< 28em) */\n.ui-field-contain {\n\tborder-bottom-color: #828282;\n\tborder-bottom-color: rgba(0,0,0,.15);\n\tborder-bottom-width: 1px;\n\tborder-bottom-style: solid;\n}\n/* Table opt-in classes: strokes between each row, and alternating row stripes */\n/* Classes table-stroke and table-stripe are deprecated in 1.4. */\n.table-stroke thead th,\n.table-stripe thead th,\n.table-stripe tbody tr:last-child {\n\tborder-bottom: 1px solid #d6d6d6; /* non-RGBA fallback */\n\tborder-bottom: 1px solid rgba(0,0,0,.1);\n}\n.table-stroke tbody th,\n.table-stroke tbody td {\n\tborder-bottom: 1px solid #e6e6e6; /* non-RGBA fallback  */\n\tborder-bottom: 1px solid rgba(0,0,0,.05);\n}\n.table-stripe.table-stroke tbody tr:last-child th,\n.table-stripe.table-stroke tbody tr:last-child td {\n\tborder-bottom: 0;\n}\n.table-stripe tbody tr:nth-child(odd) td,\n.table-stripe tbody tr:nth-child(odd) th {\n\tbackground-color: #eeeeee; /* non-RGBA fallback  */\n\tbackground-color: rgba(0,0,0,.04);\n}\n/* Buttons\n-----------------------------------------------------------------------------------------------------------*/\n.ui-btn,\nlabel.ui-btn {\n\tfont-weight: bold;\n\tborder-width: 1px;\n\tborder-style: solid;\n}\n.ui-btn {\n\ttext-decoration: none !important;\n}\n.ui-btn-active {\n\tcursor: pointer;\n}\n/* Corner rounding\n-----------------------------------------------------------------------------------------------------------*/\n/* Class ui-btn-corner-all deprecated in 1.4 */\n.ui-corner-all {\n\t-webkit-border-radius: \t\t\t\t.3125em /*{global-radii-blocks}*/;\n\tborder-radius: \t\t\t\t\t\t.3125em /*{global-radii-blocks}*/;\n}\n/* Buttons */\n.ui-btn-corner-all,\n.ui-btn.ui-corner-all,\n/* Slider track */\n.ui-slider-track.ui-corner-all,\n/* Flipswitch */\n.ui-flipswitch.ui-corner-all,\n/* Count bubble */\n.ui-li-count {\n\t-webkit-border-radius: \t\t\t\t.3125em /*{global-radii-buttons}*/;\n\tborder-radius: \t\t\t\t\t\t.3125em /*{global-radii-buttons}*/;\n}\n/* Icon-only buttons */\n.ui-btn-icon-notext.ui-btn-corner-all,\n.ui-btn-icon-notext.ui-corner-all {\n\t-webkit-border-radius: 1em;\n\tborder-radius: 1em;\n}\n/* Radius clip workaround for cleaning up corner trapping */\n.ui-btn-corner-all,\n.ui-corner-all {\n\t-webkit-background-clip: padding;\n\tbackground-clip: padding-box;\n}\n/* Popup arrow */\n.ui-popup.ui-corner-all > .ui-popup-arrow-guide {\n\tleft: .6em /*{global-radii-blocks}*/;\n\tright: .6em /*{global-radii-blocks}*/;\n\ttop: .6em /*{global-radii-blocks}*/;\n\tbottom: .6em /*{global-radii-blocks}*/;\n}\n/* Shadow\n-----------------------------------------------------------------------------------------------------------*/\n.ui-shadow {\n\t-webkit-box-shadow: 0 1px 3px /*{global-box-shadow-size}*/ \t\trgba(0,0,0,.15) /*{global-box-shadow-color}*/;\n\t-moz-box-shadow: 0 1px 3px /*{global-box-shadow-size}*/ \t\trgba(0,0,0,.15) /*{global-box-shadow-color}*/;\n\tbox-shadow: 0 1px 3px /*{global-box-shadow-size}*/ \t\t\t\trgba(0,0,0,.15) /*{global-box-shadow-color}*/;\n}\n.ui-shadow-inset {\n\t-webkit-box-shadow: inset 0 1px 3px /*{global-box-shadow-size}*/ \trgba(0,0,0,.2) /*{global-box-shadow-color}*/;\n\t-moz-box-shadow: inset 0 1px 3px /*{global-box-shadow-size}*/ \t\trgba(0,0,0,.2) /*{global-box-shadow-color}*/;\n\tbox-shadow: inset 0 1px 3px /*{global-box-shadow-size}*/ \trgba(0,0,0,.2) /*{global-box-shadow-color}*/;\n}\n.ui-overlay-shadow {\n\t-webkit-box-shadow: 0 0 12px \t\trgba(0,0,0,.6);\n\t-moz-box-shadow: 0 0 12px \t\t\trgba(0,0,0,.6);\n\tbox-shadow: 0 0 12px \t\t\t\trgba(0,0,0,.6);\n}\n/* Icons\n-----------------------------------------------------------------------------------------------------------*/\n.ui-btn-icon-left:after,\n.ui-btn-icon-right:after,\n.ui-btn-icon-top:after,\n.ui-btn-icon-bottom:after,\n.ui-btn-icon-notext:after {\n\tbackground-color: \t\t\t\t\t#666 /*{global-icon-color}*/;\n\tbackground-color: \t\t\t\t\trgba(0,0,0,.3) /*{global-icon-disc}*/;\n\tbackground-position: center center;\n\tbackground-repeat: no-repeat;\n\t-webkit-border-radius: 1em;\n\tborder-radius: 1em;\n}\n/* Alt icons */\n.ui-alt-icon.ui-btn:after,\n.ui-alt-icon .ui-btn:after,\nhtml .ui-alt-icon.ui-checkbox-off:after,\nhtml .ui-alt-icon.ui-radio-off:after,\nhtml .ui-alt-icon .ui-checkbox-off:after,\nhtml .ui-alt-icon .ui-radio-off:after {\n\tbackground-color: \t\t\t\t\t#666 /*{global-icon-color}*/;\n\tbackground-color: \t\t\t\t\trgba(0,0,0,.15) /*{global-icon-disc}*/;\n}\n/* No disc */\n.ui-nodisc-icon.ui-btn:after,\n.ui-nodisc-icon .ui-btn:after {\n\tbackground-color: transparent;\n}\n/* Icon shadow */\n.ui-shadow-icon.ui-btn:after,\n.ui-shadow-icon .ui-btn:after {\n\t-webkit-box-shadow: 0 1px 0 \t\t\trgba(255,255,255,.3) /*{global-icon-shadow}*/;\n\t-moz-box-shadow: 0 1px 0 \t\t\t\trgba(255,255,255,.3) /*{global-icon-shadow}*/;\n\tbox-shadow: 0 1px 0 \t\t\t\t\trgba(255,255,255,.3) /*{global-icon-shadow}*/;\n}\n/* Checkbox and radio */\n.ui-btn.ui-checkbox-off:after,\n.ui-btn.ui-checkbox-on:after,\n.ui-btn.ui-radio-off:after,\n.ui-btn.ui-radio-on:after {\n\tdisplay: block;\n\twidth: 18px;\n\theight: 18px;\n\tmargin: -9px 2px 0 2px;\n}\n.ui-checkbox-off:after,\n.ui-btn.ui-radio-off:after {\n\tfilter: Alpha(Opacity=30);\n\topacity: .3;\n}\n.ui-btn.ui-checkbox-off:after,\n.ui-btn.ui-checkbox-on:after {\n\t-webkit-border-radius: .1875em;\n\tborder-radius: .1875em;\n}\n.ui-btn.ui-checkbox-off:after {\n\tbackground-color: #666;\n\tbackground-color: rgba(0,0,0,.3);\n}\n.ui-radio .ui-btn.ui-radio-on:after {\n\tbackground-image: none;\n\tbackground-color: #fff;\n\twidth: 8px;\n\theight: 8px;\n\tborder-width: 5px;\n\tborder-style: solid; \n}\n.ui-alt-icon.ui-btn.ui-radio-on:after,\n.ui-alt-icon .ui-btn.ui-radio-on:after {\n\tbackground-color: #000;\n}\n/* Loader */\n.ui-icon-loading {\n\tbackground: url(images/ajax-loader.gif);\n\tbackground-size: 2.875em 2.875em;\n}\n/* Swatches */\n/* A\n-----------------------------------------------------------------------------------------------------------*/\n/* Bar: Toolbars, dividers, slider track */\n.ui-bar-a,\n.ui-page-theme-a .ui-bar-inherit,\nhtml .ui-bar-a .ui-bar-inherit,\nhtml .ui-body-a .ui-bar-inherit,\nhtml body .ui-group-theme-a .ui-bar-inherit {\n\tbackground-color: \t\t\t#e9e9e9 /*{a-bar-background-color}*/;\n\tborder-color:\t \t\t#ddd /*{a-bar-border}*/;\n\tcolor: \t\t\t\t\t#333 /*{a-bar-color}*/;\n\ttext-shadow: 0 /*{a-bar-shadow-x}*/ 1px /*{a-bar-shadow-y}*/ 0 /*{a-bar-shadow-radius}*/ \t#eee /*{a-bar-shadow-color}*/;\n\tfont-weight: bold;\n}\n.ui-bar-a {\n\tborder-width: 1px;\n\tborder-style: solid;\n}\n/* Page and overlay */\n.ui-overlay-a,\n.ui-page-theme-a,\n.ui-page-theme-a .ui-panel-wrapper {\n\tbackground-color: \t\t\t#f9f9f9 /*{a-page-background-color}*/;\n\tborder-color:\t \t\t#bbb /*{a-page-border}*/;\n\tcolor: \t\t\t\t\t#333 /*{a-page-color}*/;\n\ttext-shadow: 0 /*{a-page-shadow-x}*/ 1px /*{a-page-shadow-y}*/ 0 /*{a-page-shadow-radius}*/ \t#f3f3f3 /*{a-page-shadow-color}*/;\n}\n/* Body: Read-only lists, text inputs, collapsible content */\n.ui-body-a,\n.ui-page-theme-a .ui-body-inherit,\nhtml .ui-bar-a .ui-body-inherit,\nhtml .ui-body-a .ui-body-inherit,\nhtml body .ui-group-theme-a .ui-body-inherit,\nhtml .ui-panel-page-container-a {\n\tbackground-color: \t\t\t#fff /*{a-body-background-color}*/;\n\tborder-color:\t \t\t#ddd /*{a-body-border}*/;\n\tcolor: \t\t\t\t\t#333 /*{a-body-color}*/;\n\ttext-shadow: 0 /*{a-body-shadow-x}*/ 1px /*{a-body-shadow-y}*/ 0 /*{a-body-shadow-radius}*/ \t#f3f3f3 /*{a-body-shadow-color}*/;\n}\n.ui-body-a {\n\tborder-width: 1px;\n\tborder-style: solid;\n}\n/* Links */\n.ui-page-theme-a a,\nhtml .ui-bar-a a,\nhtml .ui-body-a a,\nhtml body .ui-group-theme-a a {\n\tcolor: #3388cc /*{a-link-color}*/;\n\tfont-weight: bold;\n}\n.ui-page-theme-a a:visited,\nhtml .ui-bar-a a:visited,\nhtml .ui-body-a a:visited,\nhtml body .ui-group-theme-a a:visited {\n    color: #3388cc /*{a-link-visited}*/;\n}\n.ui-page-theme-a a:hover,\nhtml .ui-bar-a a:hover,\nhtml .ui-body-a a:hover,\nhtml body .ui-group-theme-a a:hover {\n\tcolor: #005599 /*{a-link-hover}*/;\n}\n.ui-page-theme-a a:active,\nhtml .ui-bar-a a:active,\nhtml .ui-body-a a:active,\nhtml body .ui-group-theme-a a:active {\n\tcolor: #005599 /*{a-link-active}*/;\n}\n/* Button up */\n.ui-page-theme-a .ui-btn,\nhtml .ui-bar-a .ui-btn,\nhtml .ui-body-a .ui-btn,\nhtml body .ui-group-theme-a .ui-btn,\nhtml head + body .ui-btn.ui-btn-a,\n/* Button visited */\n.ui-page-theme-a .ui-btn:visited,\nhtml .ui-bar-a .ui-btn:visited,\nhtml .ui-body-a .ui-btn:visited,\nhtml body .ui-group-theme-a .ui-btn:visited,\nhtml head + body .ui-btn.ui-btn-a:visited {\n\tbackground-color: \t\t\t#f6f6f6 /*{a-bup-background-color}*/;\n\tborder-color:\t \t\t#ddd /*{a-bup-border}*/;\n\tcolor: \t\t\t\t\t#333 /*{a-bup-color}*/;\n\ttext-shadow: 0 /*{a-bup-shadow-x}*/ 1px /*{a-bup-shadow-y}*/ 0 /*{a-bup-shadow-radius}*/ #f3f3f3 /*{a-bup-shadow-color}*/;\n}\n/* Button hover */\n.ui-page-theme-a .ui-btn:hover,\nhtml .ui-bar-a .ui-btn:hover,\nhtml .ui-body-a .ui-btn:hover,\nhtml body .ui-group-theme-a .ui-btn:hover,\nhtml head + body .ui-btn.ui-btn-a:hover {\n\tbackground-color: \t\t\t#ededed /*{a-bhover-background-color}*/;\n\tborder-color:\t \t\t#ddd /*{a-bhover-border}*/;\n\tcolor: \t\t\t\t\t#333 /*{a-bhover-color}*/;\n\ttext-shadow: 0 /*{a-bhover-shadow-x}*/ 1px /*{a-bhover-shadow-y}*/ 0 /*{a-bhover-shadow-radius}*/ #f3f3f3 /*{a-bhover-shadow-color}*/;\n}\n/* Button down */\n.ui-page-theme-a .ui-btn:active,\nhtml .ui-bar-a .ui-btn:active,\nhtml .ui-body-a .ui-btn:active,\nhtml body .ui-group-theme-a .ui-btn:active,\nhtml head + body .ui-btn.ui-btn-a:active {\n\tbackground-color: \t\t\t#e8e8e8 /*{a-bdown-background-color}*/;\n\tborder-color:\t \t\t#ddd /*{a-bdown-border}*/;\n\tcolor: \t\t\t\t\t#333 /*{a-bdown-color}*/;\n\ttext-shadow: 0 /*{a-bdown-shadow-x}*/ 1px /*{a-bdown-shadow-y}*/ 0 /*{a-bdown-shadow-radius}*/ #f3f3f3 /*{a-bdown-shadow-color}*/;\n}\n/* Active button */\n.ui-page-theme-a .ui-btn.ui-btn-active,\nhtml .ui-bar-a .ui-btn.ui-btn-active,\nhtml .ui-body-a .ui-btn.ui-btn-active,\nhtml body .ui-group-theme-a .ui-btn.ui-btn-active,\nhtml head + body .ui-btn.ui-btn-a.ui-btn-active,\n/* Active checkbox icon */\n.ui-page-theme-a .ui-checkbox-on:after,\nhtml .ui-bar-a .ui-checkbox-on:after,\nhtml .ui-body-a .ui-checkbox-on:after,\nhtml body .ui-group-theme-a .ui-checkbox-on:after,\n.ui-btn.ui-checkbox-on.ui-btn-a:after,\n/* Active flipswitch background */\n.ui-page-theme-a .ui-flipswitch-active,\nhtml .ui-bar-a .ui-flipswitch-active,\nhtml .ui-body-a .ui-flipswitch-active,\nhtml body .ui-group-theme-a .ui-flipswitch-active,\nhtml body .ui-flipswitch.ui-bar-a.ui-flipswitch-active,\n/* Active slider track */\n.ui-page-theme-a .ui-slider-track .ui-btn-active,\nhtml .ui-bar-a .ui-slider-track .ui-btn-active,\nhtml .ui-body-a .ui-slider-track .ui-btn-active,\nhtml body .ui-group-theme-a .ui-slider-track .ui-btn-active,\nhtml body div.ui-slider-track.ui-body-a .ui-btn-active {\n\tbackground-color: \t\t#3388cc /*{a-active-background-color}*/;\n\tborder-color:\t \t\t#3388cc /*{a-active-border}*/;\n\tcolor: \t\t\t\t\t#fff /*{a-active-color}*/;\n\ttext-shadow: 0 /*{a-active-shadow-x}*/ 1px /*{a-active-shadow-y}*/ 0 /*{a-active-shadow-radius}*/ #005599 /*{a-active-shadow-color}*/;\n}\n/* Active radio button icon */\n.ui-page-theme-a .ui-radio-on:after,\nhtml .ui-bar-a .ui-radio-on:after,\nhtml .ui-body-a .ui-radio-on:after,\nhtml body .ui-group-theme-a .ui-radio-on:after,\n.ui-btn.ui-radio-on.ui-btn-a:after {\n\tborder-color:\t\t\t#3388cc /*{a-active-background-color}*/;\n}\n/* Focus */\n.ui-page-theme-a .ui-btn:focus,\nhtml .ui-bar-a .ui-btn:focus,\nhtml .ui-body-a .ui-btn:focus,\nhtml body .ui-group-theme-a .ui-btn:focus,\nhtml head + body .ui-btn.ui-btn-a:focus,\n/* Focus buttons and text inputs with div wrap */\n.ui-page-theme-a .ui-focus,\nhtml .ui-bar-a .ui-focus,\nhtml .ui-body-a .ui-focus,\nhtml body .ui-group-theme-a .ui-focus,\nhtml head + body .ui-btn-a.ui-focus,\nhtml head + body .ui-body-a.ui-focus {\n\t-webkit-box-shadow: 0 0 12px \t#3388cc /*{a-active-background-color}*/;\n\t-moz-box-shadow: 0 0 12px \t\t#3388cc /*{a-active-background-color}*/;\n\tbox-shadow: 0 0 12px \t\t\t#3388cc /*{a-active-background-color}*/;\n}\n/* B\n-----------------------------------------------------------------------------------------------------------*/\n/* Bar: Toolbars, dividers, slider track */\n.ui-bar-b,\n.ui-page-theme-b .ui-bar-inherit,\nhtml .ui-bar-b .ui-bar-inherit,\nhtml .ui-body-b .ui-bar-inherit,\nhtml body .ui-group-theme-b .ui-bar-inherit {\n\tbackground-color: \t\t\t#1d1d1d /*{b-bar-background-color}*/;\n\tborder-color:\t \t\t#1b1b1b /*{b-bar-border}*/;\n\tcolor: \t\t\t\t\t#fff /*{b-bar-color}*/;\n\ttext-shadow: 0 /*{b-bar-shadow-x}*/ 1px /*{b-bar-shadow-y}*/ 0 /*{b-bar-shadow-radius}*/ \t#111 /*{b-bar-shadow-color}*/;\n\tfont-weight: bold;\n}\n.ui-bar-b {\n\tborder-width: 1px;\n\tborder-style: solid;\n}\n/* Page and overlay */\n.ui-overlay-b,\n.ui-page-theme-b,\n.ui-page-theme-b .ui-panel-wrapper {\n\tbackground-color: \t\t\t#252525 /*{b-page-background-color}*/;\n\tborder-color:\t \t\t#454545 /*{b-page-border}*/;\n\tcolor: \t\t\t\t\t#fff /*{b-page-color}*/;\n\ttext-shadow: 0 /*{b-page-shadow-x}*/ 1px /*{b-page-shadow-y}*/ 0 /*{b-page-shadow-radius}*/ \t#111 /*{b-page-shadow-color}*/;\n}\n/* Body: Read-only lists, text inputs, collapsible content */\n.ui-body-b,\n.ui-page-theme-b .ui-body-inherit,\nhtml .ui-bar-b .ui-body-inherit,\nhtml .ui-body-b .ui-body-inherit,\nhtml body .ui-group-theme-b .ui-body-inherit,\nhtml .ui-panel-page-container-b {\n\tbackground-color: \t\t\t#2a2a2a /*{b-body-background-color}*/;\n\tborder-color:\t \t\t#1d1d1d /*{b-body-border}*/;\n\tcolor: \t\t\t\t\t#fff /*{b-body-color}*/;\n\ttext-shadow: 0 /*{b-body-shadow-x}*/ 1px /*{b-body-shadow-y}*/ 0 /*{b-body-shadow-radius}*/ \t#111 /*{b-body-shadow-color}*/;\n}\n.ui-body-b {\n\tborder-width: 1px;\n\tborder-style: solid;\n}\n/* Links */\n.ui-page-theme-b a,\nhtml .ui-bar-b a,\nhtml .ui-body-b a,\nhtml body .ui-group-theme-b a {\n\tcolor: #22aadd /*{b-link-color}*/;\n\tfont-weight: bold;\n}\n.ui-page-theme-b a:visited,\nhtml .ui-bar-b a:visited,\nhtml .ui-body-b a:visited,\nhtml body .ui-group-theme-b a:visited {\n    color: #22aadd /*{b-link-visited}*/;\n}\n.ui-page-theme-b a:hover,\nhtml .ui-bar-b a:hover,\nhtml .ui-body-b a:hover,\nhtml body .ui-group-theme-b a:hover {\n\tcolor: #0088bb /*{b-link-hover}*/;\n}\n.ui-page-theme-b a:active,\nhtml .ui-bar-b a:active,\nhtml .ui-body-b a:active,\nhtml body .ui-group-theme-b a:active {\n\tcolor: #0088bb /*{b-link-active}*/;\n}\n/* Button up */\n.ui-page-theme-b .ui-btn,\nhtml .ui-bar-b .ui-btn,\nhtml .ui-body-b .ui-btn,\nhtml body .ui-group-theme-b .ui-btn,\nhtml head + body .ui-btn.ui-btn-b,\n/* Button visited */\n.ui-page-theme-b .ui-btn:visited,\nhtml .ui-bar-b .ui-btn:visited,\nhtml .ui-body-b .ui-btn:visited,\nhtml body .ui-group-theme-b .ui-btn:visited,\nhtml head + body .ui-btn.ui-btn-b:visited {\n\tbackground-color: \t\t\t#333 /*{b-bup-background-color}*/;\n\tborder-color:\t \t\t#1f1f1f /*{b-bup-border}*/;\n\tcolor: \t\t\t\t\t#fff /*{b-bup-color}*/;\n\ttext-shadow: 0 /*{b-bup-shadow-x}*/ 1px /*{b-bup-shadow-y}*/ 0 /*{b-bup-shadow-radius}*/ #111 /*{b-bup-shadow-color}*/;\n}\n/* Button hover */\n.ui-page-theme-b .ui-btn:hover,\nhtml .ui-bar-b .ui-btn:hover,\nhtml .ui-body-b .ui-btn:hover,\nhtml body .ui-group-theme-b .ui-btn:hover,\nhtml head + body .ui-btn.ui-btn-b:hover {\n\tbackground-color: \t\t\t#373737 /*{b-bhover-background-color}*/;\n\tborder-color:\t \t\t#1f1f1f /*{b-bhover-border}*/;\n\tcolor: \t\t\t\t\t#fff /*{b-bhover-color}*/;\n\ttext-shadow: 0 /*{b-bhover-shadow-x}*/ 1px /*{b-bhover-shadow-y}*/ 0 /*{b-bhover-shadow-radius}*/ #111 /*{b-bhover-shadow-color}*/;\n}\n/* Button down */\n.ui-page-theme-b .ui-btn:active,\nhtml .ui-bar-b .ui-btn:active,\nhtml .ui-body-b .ui-btn:active,\nhtml body .ui-group-theme-b .ui-btn:active,\nhtml head + body .ui-btn.ui-btn-b:active {\n\tbackground-color: \t\t\t#404040 /*{b-bdown-background-color}*/;\n\tborder-color:\t \t\t#1f1f1f /*{b-bdown-border}*/;\n\tcolor: \t\t\t\t\t#fff /*{b-bdown-color}*/;\n\ttext-shadow: 0 /*{b-bdown-shadow-x}*/ 1px /*{b-bdown-shadow-y}*/ 0 /*{b-bdown-shadow-radius}*/ #111 /*{b-bdown-shadow-color}*/;\n}\n/* Active button */\n.ui-page-theme-b .ui-btn.ui-btn-active,\nhtml .ui-bar-b .ui-btn.ui-btn-active,\nhtml .ui-body-b .ui-btn.ui-btn-active,\nhtml body .ui-group-theme-b .ui-btn.ui-btn-active,\nhtml head + body .ui-btn.ui-btn-b.ui-btn-active,\n/* Active checkbox icon */\n.ui-page-theme-b .ui-checkbox-on:after,\nhtml .ui-bar-b .ui-checkbox-on:after,\nhtml .ui-body-b .ui-checkbox-on:after,\nhtml body .ui-group-theme-b .ui-checkbox-on:after,\n.ui-btn.ui-checkbox-on.ui-btn-b:after,\n/* Active flipswitch background */\n.ui-page-theme-b .ui-flipswitch-active,\nhtml .ui-bar-b .ui-flipswitch-active,\nhtml .ui-body-b .ui-flipswitch-active,\nhtml body .ui-group-theme-b .ui-flipswitch-active,\nhtml body .ui-flipswitch.ui-bar-b.ui-flipswitch-active,\n/* Active slider track */\n.ui-page-theme-b .ui-slider-track .ui-btn-active,\nhtml .ui-bar-b .ui-slider-track .ui-btn-active,\nhtml .ui-body-b .ui-slider-track .ui-btn-active,\nhtml body .ui-group-theme-b .ui-slider-track .ui-btn-active,\nhtml body div.ui-slider-track.ui-body-b .ui-btn-active {\n\tbackground-color: \t\t#22aadd /*{b-active-background-color}*/;\n\tborder-color:\t \t\t#22aadd /*{b-active-border}*/;\n\tcolor: \t\t\t\t\t#fff /*{b-active-color}*/;\n\ttext-shadow: 0 /*{b-active-shadow-x}*/ 1px /*{b-active-shadow-y}*/ 0 /*{b-active-shadow-radius}*/ #0088bb /*{b-active-shadow-color}*/;\n}\n/* Active radio button icon */\n.ui-page-theme-b .ui-radio-on:after,\nhtml .ui-bar-b .ui-radio-on:after,\nhtml .ui-body-b .ui-radio-on:after,\nhtml body .ui-group-theme-b .ui-radio-on:after,\n.ui-btn.ui-radio-on.ui-btn-b:after {\n\tborder-color:\t\t\t#22aadd /*{b-active-background-color}*/;\n}\n/* Focus */\n.ui-page-theme-b .ui-btn:focus,\nhtml .ui-bar-b .ui-btn:focus,\nhtml .ui-body-b .ui-btn:focus,\nhtml body .ui-group-theme-b .ui-btn:focus,\nhtml head + body .ui-btn.ui-btn-b:focus,\n/* Focus buttons and text inputs with div wrap */\n.ui-page-theme-b .ui-focus,\nhtml .ui-bar-b .ui-focus,\nhtml .ui-body-b .ui-focus,\nhtml body .ui-group-theme-b .ui-focus,\nhtml head + body .ui-btn-b.ui-focus,\nhtml head + body .ui-body-b.ui-focus {\n\t-webkit-box-shadow: 0 0 12px \t#22aadd /*{b-active-background-color}*/;\n\t-moz-box-shadow: 0 0 12px \t\t#22aadd /*{b-active-background-color}*/;\n\tbox-shadow: 0 0 12px \t\t\t#22aadd /*{b-active-background-color}*/;\n}\n/* Structure */\n/* Disabled\n-----------------------------------------------------------------------------------------------------------*/\n/* Class ui-disabled deprecated in 1.4. :disabled not supported by IE8 so we use [disabled] */\n.ui-disabled,\n.ui-state-disabled,\nbutton[disabled],\n.ui-select .ui-btn.ui-state-disabled {\n\tfilter: Alpha(Opacity=30);\n\topacity: .3;\n\tcursor: default !important;\n\tpointer-events: none;\n}\n/* Focus state outline\n-----------------------------------------------------------------------------------------------------------*/\n.ui-btn:focus,\n.ui-btn.ui-focus {\n\toutline: 0;\n}\n/* Unset box-shadow in browsers that don't do it right */\n.ui-noboxshadow .ui-shadow,\n.ui-noboxshadow .ui-shadow-inset,\n.ui-noboxshadow .ui-overlay-shadow,\n.ui-noboxshadow .ui-shadow-icon.ui-btn:after,\n.ui-noboxshadow .ui-shadow-icon .ui-btn:after,\n.ui-noboxshadow .ui-focus,\n.ui-noboxshadow .ui-btn:focus,\n.ui-noboxshadow  input:focus,\n.ui-noboxshadow .ui-panel {\n\t-webkit-box-shadow: none !important;\n\t-moz-box-shadow: none !important;\n\tbox-shadow: none !important;\n}\n.ui-noboxshadow .ui-btn:focus,\n.ui-noboxshadow .ui-focus {\n\toutline-width: 1px;\n\toutline-style: auto;\n}\n/* Some unsets */\n.ui-mobile,\n.ui-mobile body {\n\theight: 99.9%;\n}\n.ui-mobile fieldset,\n.ui-page {\n\tpadding: 0;\n\tmargin: 0;\n}\n.ui-mobile a img,\n.ui-mobile fieldset {\n\tborder-width: 0;\n}\n/* Fixes for fieldset issues on IE10 and FF (see #6077) */\n.ui-mobile fieldset {\n\tmin-width: 0;\n}\n@-moz-document url-prefix() {\n\t.ui-mobile fieldset {\n\t\tdisplay: table-column;\n\t\tvertical-align: middle;\n\t}\n}\n/* Viewport */\n.ui-mobile-viewport {\n\tmargin: 0;\n\toverflow-x: visible;\n\t-webkit-text-size-adjust: 100%;\n\t-ms-text-size-adjust:none;\n\t-webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\n/* Issue #2066 */\nbody.ui-mobile-viewport,\ndiv.ui-mobile-viewport {\n\toverflow-x: hidden;\n}\n/* \"page\" containers - full-screen views, one should always be in view post-pageload */\n.ui-mobile [data-role=page],\n.ui-mobile [data-role=dialog],\n.ui-page {\n\ttop: 0;\n\tleft: 0;\n\twidth: 100%;\n\tmin-height: 100%;\n\tposition: absolute;\n\tdisplay: none;\n\tborder: 0;\n}\n/* On ios4, setting focus on the page element causes flashing during transitions when there is an outline, so we turn off outlines */\n.ui-page {\n\toutline: none;\n}\n.ui-mobile .ui-page-active {\n\tdisplay: block;\n\toverflow: visible;\n\toverflow-x: hidden;\n}\n@media screen and (orientation: portrait) {\n\t.ui-mobile .ui-page {\n\t\tmin-height: 420px;\n\t}\n}\n@media screen and (orientation: landscape) {\n\t.ui-mobile .ui-page {\n\t\tmin-height: 300px;\n\t}\n}\n/* Fouc */\n.ui-mobile-rendering > * {\n\tvisibility: hidden;\n}\n/* Non-js content hiding */\n.ui-nojs {\n\tposition: absolute !important;\n\theight: 1px;\n\twidth: 1px;\n\toverflow: hidden;\n\tclip: rect(1px,1px,1px,1px);\n}\n/* Loading screen */\n.ui-loading .ui-loader {\n\tdisplay: block;\n}\n.ui-loader {\n\tdisplay: none;\n\tz-index: 9999999;\n\tposition: fixed;\n\ttop: 50%;\n\tleft: 50%;\n\tborder:0;\n}\n.ui-loader-default {\n\tbackground: none;\n\tfilter: Alpha(Opacity=18);\n\topacity: .18;\n\twidth: 2.875em;\n\theight: 2.875em;\n\tmargin-left: -1.4375em;\n\tmargin-top: -1.4375em;\n}\n.ui-loader-verbose {\n\twidth: 12.5em;\n\tfilter: Alpha(Opacity=88);\n\topacity: .88;\n\tbox-shadow: 0 1px 1px -1px #fff;\n\theight: auto;\n\tmargin-left: -6.875em;\n\tmargin-top: -2.6875em;\n\tpadding: .625em;\n}\n.ui-loader-default h1 {\n\tfont-size: 0;\n\twidth: 0;\n\theight: 0;\n\toverflow: hidden;\n}\n.ui-loader-verbose h1 {\n\tfont-size: 1em;\n\tmargin: 0;\n\ttext-align: center;\n}\n.ui-loader .ui-icon-loading {\n\tbackground-color: #000;\n\tdisplay: block;\n\tmargin: 0;\n\twidth: 2.75em;\n\theight: 2.75em;\n\tpadding: .0625em;\n\t-webkit-border-radius: 2.25em;\n\tborder-radius: 2.25em;\n}\n.ui-loader-verbose .ui-icon-loading {\n\tmargin: 0 auto .625em;\n\tfilter: Alpha(Opacity=75);\n\topacity: .75;\n}\n.ui-loader-textonly {\n\tpadding: .9375em;\n\tmargin-left: -7.1875em;\n}\n.ui-loader-textonly .ui-icon-loading {\n\tdisplay: none;\n}\n.ui-loader-fakefix {\n\tposition: absolute;\n}\n/* Headers, content panels */\n.ui-bar,\n.ui-body {\n\tposition: relative;\n\tpadding: .4em 1em;\n\toverflow: hidden;\n\tdisplay: block;\n\tclear: both;\n}\n.ui-bar h1,\n.ui-bar h2,\n.ui-bar h3,\n.ui-bar h4,\n.ui-bar h5,\n.ui-bar h6 {\n\tmargin: 0;\n\tpadding: 0;\n\tfont-size: 1em;\n\tdisplay: inline-block;\n}\n.ui-header,\n.ui-footer {\n\tborder-width: 1px 0;\n\tborder-style: solid;\n\tposition: relative;\n}\n.ui-header:empty,\n.ui-footer:empty {\n\tmin-height: 2.6875em;\n}\n.ui-header .ui-title,\n.ui-footer .ui-title {\n\tfont-size: 1em;\n\tmin-height: 1.1em;\n\ttext-align: center;\n\tdisplay: block;\n\tmargin: 0 30%;\n\tpadding: .7em 0;\n\ttext-overflow: ellipsis;\n\toverflow: hidden;\n\twhite-space: nowrap;\n\toutline: 0 !important;\n}\n.ui-footer .ui-title {\n\tmargin: 0 1em;\n}\n.ui-content {\n\tborder-width: 0;\n\toverflow: visible;\n\toverflow-x: hidden;\n\tpadding: 1em;\n}\n/* Corner styling for dialogs and popups */\n.ui-corner-all > .ui-header:first-child,\n.ui-corner-all > .ui-content:first-child,\n.ui-corner-all > .ui-footer:first-child {\n\t-webkit-border-top-left-radius: inherit;\n\tborder-top-left-radius: inherit;\n\t-webkit-border-top-right-radius: inherit;\n\tborder-top-right-radius: inherit;\n}\n.ui-corner-all > .ui-header:last-child,\n.ui-corner-all > .ui-content:last-child,\n.ui-corner-all > .ui-footer:last-child {\n\t-webkit-border-bottom-left-radius: inherit;\n\tborder-bottom-left-radius: inherit;\n\t-webkit-border-bottom-right-radius: inherit;\n\tborder-bottom-right-radius: inherit;\n}\n/* Buttons and icons */\n.ui-btn {\n\tfont-size: 16px;\n\tmargin: .5em 0;\n\tpadding: .7em 1em;\n\tdisplay: block;\n\tposition: relative;\n\ttext-align: center;\n\ttext-overflow: ellipsis;\n\toverflow: hidden;\n\twhite-space: nowrap;\n\tcursor: pointer;\n\t-webkit-user-select: none;\n\t-moz-user-select: none;\n\t-ms-user-select: none;\n\tuser-select: none;\n}\n.ui-btn-icon-notext,\n.ui-header button.ui-btn.ui-btn-icon-notext,\n.ui-footer button.ui-btn.ui-btn-icon-notext {\n\tpadding: 0;\n\twidth: 1.75em;\n\theight: 1.75em;\n\ttext-indent: -9999px;\n\twhite-space: nowrap !important;\n}\n.ui-mini {\n\tfont-size: 12.5px;\n}\n.ui-mini .ui-btn {\n\tfont-size: inherit;\n}\n/* Make buttons in toolbars default to mini and inline. */\n.ui-header .ui-btn,\n.ui-footer .ui-btn {\n\tfont-size: 12.5px;\n\tdisplay: inline-block;\n\tvertical-align: middle;\n}\n.ui-header .ui-controlgroup .ui-btn-icon-notext,\n.ui-footer .ui-controlgroup .ui-btn-icon-notext {\n    font-size: 12.5px;\n}\n/* To ensure same top and left/right position when ui-btn-left/right are added to something other than buttons. */\n.ui-header .ui-btn-left,\n.ui-header .ui-btn-right {\n\tfont-size: 12.5px;\n}\n.ui-mini.ui-btn-icon-notext,\n.ui-mini .ui-btn-icon-notext,\n.ui-header .ui-btn-icon-notext,\n.ui-footer .ui-btn-icon-notext {\n\tfont-size: 16px;\t\n\tpadding: 0;\n}\n.ui-btn-inline {\n\tdisplay: inline-block;\n\tvertical-align: middle;\n\tmargin-right: .625em;\n}\n.ui-btn-icon-left {\n\tpadding-left: 2.5em;\n}\n.ui-btn-icon-right {\n\tpadding-right: 2.5em;\n}\n.ui-btn-icon-top {\n\tpadding-top: 2.5em;\n}\n.ui-btn-icon-bottom {\n\tpadding-bottom: 2.5em;\n}\n.ui-header .ui-btn-icon-top,\n.ui-footer .ui-btn-icon-top,\n.ui-header .ui-btn-icon-bottom,\n.ui-footer .ui-btn-icon-bottom {\n\tpadding-left: .3125em;\n\tpadding-right: .3125em;\n}\n.ui-btn-icon-left:after,\n.ui-btn-icon-right:after,\n.ui-btn-icon-top:after,\n.ui-btn-icon-bottom:after,\n.ui-btn-icon-notext:after {\n\tcontent: \"\";\n\tposition: absolute;\n\tdisplay: block;\n\twidth: 22px;\n\theight: 22px;\n}\n.ui-btn-icon-notext:after,\n.ui-btn-icon-left:after,\n.ui-btn-icon-right:after {\n\ttop: 50%;\n\tmargin-top: -11px;\n}\n.ui-btn-icon-left:after {\n\tleft: .5625em;\n}\n.ui-btn-icon-right:after {\n\tright: .5625em;\n}\n.ui-mini.ui-btn-icon-left:after,\n.ui-mini .ui-btn-icon-left:after,\n.ui-header .ui-btn-icon-left:after,\n.ui-footer .ui-btn-icon-left:after {\n\tleft: .37em;\n}\n.ui-mini.ui-btn-icon-right:after,\n.ui-mini .ui-btn-icon-right:after,\n.ui-header .ui-btn-icon-right:after,\n.ui-footer .ui-btn-icon-right:after {\n\tright: .37em;\n}\n.ui-btn-icon-notext:after,\n.ui-btn-icon-top:after,\n.ui-btn-icon-bottom:after {\n\tleft: 50%;\n\tmargin-left: -11px;\n}\n.ui-btn-icon-top:after {\n\ttop: .5625em;\n}\n.ui-btn-icon-bottom:after {\n\ttop: auto;\n\tbottom: .5625em;\n}\n/* Buttons in header position classes */\n.ui-header .ui-btn-left,\n.ui-header .ui-btn-right,\n.ui-btn-left > [class*=\"ui-\"],\n.ui-btn-right > [class*=\"ui-\"] {\n\tmargin: 0;\n}\n.ui-btn-left,\n.ui-btn-right {\n\tposition: absolute;\n\ttop: .24em;\n}\n.ui-btn-left {\n\tleft: .4em;\n}\n.ui-btn-right {\n\tright: .4em;\n}\n.ui-btn-icon-notext.ui-btn-left {\n\ttop: .3125em;\n\tleft: .3125em;\n}\n.ui-btn-icon-notext.ui-btn-right {\n\ttop: .3125em;\n\tright: .3125em;\n}\n/* Button elements */\nbutton.ui-btn,\n.ui-controlgroup-controls button.ui-btn-icon-notext {\n\t-webkit-box-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\tbox-sizing: border-box;\n\t-webkit-appearance: none;\n\t-moz-appearance: none;\n\twidth: 100%;\n}\nbutton.ui-btn-inline,\n.ui-header button.ui-btn,\n.ui-footer button.ui-btn {\n\twidth: auto;\n}\n/* Firefox adds a 1px border in a button element. We negate this to make sure they have the same height as other buttons in controlgroups. */\nbutton.ui-btn::-moz-focus-inner {\n\tborder: 0;\n}\nbutton.ui-btn-icon-notext,\n.ui-controlgroup-horizontal .ui-controlgroup-controls button.ui-btn {\n\t-webkit-box-sizing: content-box;\n\t-moz-box-sizing: content-box;\n\tbox-sizing: content-box;\n\twidth: 1.75em;\n}\n/* Form labels */\n.ui-mobile label,\n.ui-controlgroup-label {\n\tdisplay: block;\n\tmargin: 0 0 .4em;\n}\n/* Accessible content hiding */\n/* ui-hide-label deprecated in 1.4. TODO: Remove in 1.5 */\n.ui-hide-label > label,\n.ui-hide-label .ui-controlgroup-label,\n.ui-hide-label .ui-rangeslider label,\n.ui-hidden-accessible {\n\tposition: absolute !important;\n\theight: 1px;\n\twidth: 1px;\n\toverflow: hidden;\n\tclip: rect(1px,1px,1px,1px);\n}\n/* Used for hiding elements by the filterable widget. You can also use this class to hide list items or buttons in controlgroups; this ensures correct corner styling. */\n.ui-screen-hidden {\n\tdisplay: none !important;\n}\n/* Transitions originally inspired by those from jQtouch, nice work, folks */\n.ui-mobile-viewport-transitioning,\n.ui-mobile-viewport-transitioning .ui-page {\n\twidth: 100%;\n\theight: 100%;\n\toverflow: hidden;\n\t-webkit-box-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\tbox-sizing: border-box;\n}\n.ui-page-pre-in {\n\topacity: 0;\n}\n.in {\n\t-webkit-animation-timing-function: ease-out;\n\t-webkit-animation-duration: 350ms;\n\t-moz-animation-timing-function: ease-out;\n\t-moz-animation-duration: 350ms;\n\tanimation-timing-function: ease-out;\n\tanimation-duration: 350ms;\n}\n.out {\n\t-webkit-animation-timing-function: ease-in;\n\t-webkit-animation-duration: 225ms;\n\t-moz-animation-timing-function: ease-in;\n\t-moz-animation-duration: 225ms;\n\tanimation-timing-function: ease-in;\n\tanimation-duration: 225ms;\n}\n@-webkit-keyframes fadein {\n    from { opacity: 0; }\n    to { opacity: 1; }\n}\n@-moz-keyframes fadein {\n    from { opacity: 0; }\n    to { opacity: 1; }\n}\n@keyframes fadein {\n    from { opacity: 0; }\n    to { opacity: 1; }\n}\n@-webkit-keyframes fadeout {\n    from { opacity: 1; }\n    to { opacity: 0; }\n}\n@-moz-keyframes fadeout {\n    from { opacity: 1; }\n    to { opacity: 0; }\n}\n@keyframes fadeout {\n    from { opacity: 1; }\n    to { opacity: 0; }\n}\n.fade.out {\n\topacity: 0;\n\t-webkit-animation-duration: 125ms;\n\t-webkit-animation-name: fadeout;\n\t-moz-animation-duration: 125ms;\n\t-moz-animation-name: fadeout;\n\tanimation-duration: 125ms;\n\tanimation-name: fadeout;\n}\n.fade.in {\n\topacity: 1;\n\t-webkit-animation-duration: 225ms;\n\t-webkit-animation-name: fadein;\n\t-moz-animation-duration: 225ms;\n\t-moz-animation-name: fadein;\n\tanimation-duration: 225ms;\n\tanimation-name: fadein;\n}\n.pop {\n\t-webkit-transform-origin: 50% 50%;\n\t-moz-transform-origin: 50% 50%;\n\ttransform-origin: 50% 50%;\n}\n.pop.in {\n\t-webkit-transform: scale(1);\n\t-webkit-animation-name: popin;\n\t-webkit-animation-duration: 350ms;\n\t-moz-transform: scale(1);\n\t-moz-animation-name: popin;\n\t-moz-animation-duration: 350ms;\n\ttransform: scale(1);\n\tanimation-name: popin;\n\tanimation-duration: 350ms;\n    opacity: 1;\n}\n.pop.out {\n\t-webkit-animation-name: fadeout;\n\t-webkit-animation-duration: 100ms;\n\t-moz-animation-name: fadeout;\n\t-moz-animation-duration: 100ms;\n\tanimation-name: fadeout;\n\tanimation-duration: 100ms;\n\topacity: 0;\n}\n.pop.in.reverse {\n\t-webkit-animation-name: fadein;\n\t-moz-animation-name: fadein;\n\tanimation-name: fadein;\n}\n.pop.out.reverse {\n\t-webkit-transform: scale(.8);\n\t-webkit-animation-name: popout;\n\t-moz-transform: scale(.8);\n\t-moz-animation-name: popout;\n\ttransform: scale(.8);\n\tanimation-name: popout;\n}\n@-webkit-keyframes popin {\n    from {\n        -webkit-transform: scale(.8);\n        opacity: 0;\n    }\n    to {\n        -webkit-transform: scale(1);\n        opacity: 1;\n    }\n}\n@-moz-keyframes popin {\n    from {\n        -moz-transform: scale(.8);\n        opacity: 0;\n    }\n    to {\n        -moz-transform: scale(1);\n        opacity: 1;\n    }\n}\n@keyframes popin {\n    from {\n        transform: scale(.8);\n        opacity: 0;\n    }\n    to {\n        transform: scale(1);\n        opacity: 1;\n    }\n}\n@-webkit-keyframes popout {\n    from {\n        -webkit-transform: scale(1);\n        opacity: 1;\n    }\n    to {\n        -webkit-transform: scale(.8);\n        opacity: 0;\n    }\n}\n@-moz-keyframes popout {\n    from {\n        -moz-transform: scale(1);\n        opacity: 1;\n    }\n    to {\n        -moz-transform: scale(.8);\n        opacity: 0;\n    }\n}\n@keyframes popout {\n    from {\n        transform: scale(1);\n        opacity: 1;\n    }\n    to {\n        transform: scale(.8);\n        opacity: 0;\n    }\n}\n/* keyframes for slidein from sides */\n@-webkit-keyframes slideinfromright {\n    from { -webkit-transform: translate3d(100%,0,0); }\n    to { -webkit-transform: translate3d(0,0,0); }\n}\n@-moz-keyframes slideinfromright {\n    from { -moz-transform: translateX(100%); }\n    to { -moz-transform: translateX(0); }\n}\n@keyframes slideinfromright {\n    from { transform: translateX(100%); }\n    to { transform: translateX(0); }\n}\n@-webkit-keyframes slideinfromleft {\n    from { -webkit-transform: translate3d(-100%,0,0); }\n    to { -webkit-transform: translate3d(0,0,0); }\n}\n@-moz-keyframes slideinfromleft {\n    from { -moz-transform: translateX(-100%); }\n    to { -moz-transform: translateX(0); }\n}\n@keyframes slideinfromleft {\n    from { transform: translateX(-100%); }\n    to { transform: translateX(0); }\n}\n/* keyframes for slideout to sides */\n@-webkit-keyframes slideouttoleft {\n    from { -webkit-transform: translate3d(0,0,0); }\n    to { -webkit-transform: translate3d(-100%,0,0); }\n}\n@-moz-keyframes slideouttoleft {\n    from { -moz-transform: translateX(0); }\n    to { -moz-transform: translateX(-100%); }\n}\n@keyframes slideouttoleft {\n    from { transform: translateX(0); }\n    to { transform: translateX(-100%); }\n}\n@-webkit-keyframes slideouttoright {\n    from { -webkit-transform: translate3d(0,0,0); }\n    to { -webkit-transform: translate3d(100%,0,0); }\n}\n@-moz-keyframes slideouttoright {\n    from { -moz-transform: translateX(0); }\n    to { -moz-transform: translateX(100%); }\n}\n@keyframes slideouttoright {\n    from { transform: translateX(0); }\n    to { transform: translateX(100%); }\n}\n.slide.out, .slide.in {\n\t-webkit-animation-timing-function: ease-out;\n\t-webkit-animation-duration: 350ms;\n\t-moz-animation-timing-function: ease-out;\n\t-moz-animation-duration: 350ms;\n\tanimation-timing-function: ease-out;\n\tanimation-duration: 350ms;\n}\n.slide.out {\n\t-webkit-transform: translate3d(-100%,0,0);\n\t-webkit-animation-name: slideouttoleft;\n\t-moz-transform: translateX(-100%);\n\t-moz-animation-name: slideouttoleft;\n\ttransform: translateX(-100%);\n\tanimation-name: slideouttoleft;\n}\n.slide.in {\n\t-webkit-transform: translate3d(0,0,0);\n\t-webkit-animation-name: slideinfromright;\n\t-moz-transform: translateX(0);\n\t-moz-animation-name: slideinfromright;\n\ttransform: translateX(0);\n\tanimation-name: slideinfromright;\n}\n.slide.out.reverse {\n\t-webkit-transform: translate3d(100%,0,0);\n\t-webkit-animation-name: slideouttoright;\n\t-moz-transform: translateX(100%);\n\t-moz-animation-name: slideouttoright;\n\ttransform: translateX(100%);\n\tanimation-name: slideouttoright;\n}\n.slide.in.reverse {\n\t-webkit-transform: translate3d(0,0,0);\n\t-webkit-animation-name: slideinfromleft;\n\t-moz-transform: translateX(0);\n\t-moz-animation-name: slideinfromleft;\n\ttransform: translateX(0);\n\tanimation-name: slideinfromleft;\n}\n.slidefade.out {\n\t-webkit-transform: translateX(-100%);\n\t-webkit-animation-name: slideouttoleft;\n\t-webkit-animation-duration: 225ms;\n\t-moz-transform: translateX(-100%);\n\t-moz-animation-name: slideouttoleft;\n\t-moz-animation-duration: 225ms;\n\ttransform: translateX(-100%);\n\tanimation-name: slideouttoleft;\n\tanimation-duration: 225ms;\n}\n.slidefade.in {\n\t-webkit-transform: translateX(0);\n\t-webkit-animation-name: fadein;\n\t-webkit-animation-duration: 200ms;\n\t-moz-transform: translateX(0);\n\t-moz-animation-name: fadein;\n\t-moz-animation-duration: 200ms;\n\ttransform: translateX(0);\n\tanimation-name: fadein;\n\tanimation-duration: 200ms;\n}\n.slidefade.out.reverse {\n\t-webkit-transform: translateX(100%);\n\t-webkit-animation-name: slideouttoright;\n\t-webkit-animation-duration: 200ms;\n\t-moz-transform: translateX(100%);\n\t-moz-animation-name: slideouttoright;\n\t-moz-animation-duration: 200ms;\n\ttransform: translateX(100%);\n\tanimation-name: slideouttoright;\n\tanimation-duration: 200ms;\n}\n.slidefade.in.reverse {\n\t-webkit-transform: translateX(0);\n\t-webkit-animation-name: fadein;\n\t-webkit-animation-duration: 200ms;\n\t-moz-transform: translateX(0);\n\t-moz-animation-name: fadein;\n\t-moz-animation-duration: 200ms;\n\ttransform: translateX(0);\n\tanimation-name: fadein;\n\tanimation-duration: 200ms;\n}\n/* slide down */\n.slidedown.out {\n\t-webkit-animation-name: fadeout;\n\t-webkit-animation-duration: 100ms;\n\t-moz-animation-name: fadeout;\n\t-moz-animation-duration: 100ms;\n\tanimation-name: fadeout;\n\tanimation-duration: 100ms;\n}\n.slidedown.in {\n\t-webkit-transform: translateY(0);\n\t-webkit-animation-name: slideinfromtop;\n\t-webkit-animation-duration: 250ms;\n\t-moz-transform: translateY(0);\n\t-moz-animation-name: slideinfromtop;\n\t-moz-animation-duration: 250ms;\n\ttransform: translateY(0);\n\tanimation-name: slideinfromtop;\n\tanimation-duration: 250ms;\n}\n.slidedown.in.reverse {\n\t-webkit-animation-name: fadein;\n\t-webkit-animation-duration: 150ms;\n\t-moz-animation-name: fadein;\n\t-moz-animation-duration: 150ms;\n\tanimation-name: fadein;\n\tanimation-duration: 150ms;\n}\n.slidedown.out.reverse {\n\t-webkit-transform: translateY(-100%);\n\t-webkit-animation-name: slideouttotop;\n\t-webkit-animation-duration: 200ms;\n\t-moz-transform: translateY(-100%);\n\t-moz-animation-name: slideouttotop;\n\t-moz-animation-duration: 200ms;\n\ttransform: translateY(-100%);\n\tanimation-name: slideouttotop;\n\tanimation-duration: 200ms;\n}\n@-webkit-keyframes slideinfromtop {\n    from { -webkit-transform: translateY(-100%); }\n    to { -webkit-transform: translateY(0); }\n}\n@-moz-keyframes slideinfromtop {\n    from { -moz-transform: translateY(-100%); }\n    to { -moz-transform: translateY(0); }\n}\n@keyframes slideinfromtop {\n    from { transform: translateY(-100%); }\n    to { transform: translateY(0); }\n}\n@-webkit-keyframes slideouttotop {\n    from { -webkit-transform: translateY(0); }\n    to { -webkit-transform: translateY(-100%); }\n}\n@-moz-keyframes slideouttotop {\n    from { -moz-transform: translateY(0); }\n    to { -moz-transform: translateY(-100%); }\n}\n@keyframes slideouttotop {\n    from { transform: translateY(0); }\n    to { transform: translateY(-100%); }\n}\n/* slide up */\n.slideup.out {\n\t-webkit-animation-name: fadeout;\n\t-webkit-animation-duration: 100ms;\n\t-moz-animation-name: fadeout;\n\t-moz-animation-duration: 100ms;\n\tanimation-name: fadeout;\n\tanimation-duration: 100ms;\n}\n.slideup.in {\n\t-webkit-transform: translateY(0);\n\t-webkit-animation-name: slideinfrombottom;\n\t-webkit-animation-duration: 250ms;\n\t-moz-transform: translateY(0);\n\t-moz-animation-name: slideinfrombottom;\n\t-moz-animation-duration: 250ms;\n\ttransform: translateY(0);\n\tanimation-name: slideinfrombottom;\n\tanimation-duration: 250ms;\n}\n.slideup.in.reverse {\n\t-webkit-animation-name: fadein;\n\t-webkit-animation-duration: 150ms;\n\t-moz-animation-name: fadein;\n\t-moz-animation-duration: 150ms;\n\tanimation-name: fadein;\n\tanimation-duration: 150ms;\n}\n.slideup.out.reverse {\n\t-webkit-transform: translateY(100%);\n\t-webkit-animation-name: slideouttobottom;\n\t-webkit-animation-duration: 200ms;\n\t-moz-transform: translateY(100%);\n\t-moz-animation-name: slideouttobottom;\n\t-moz-animation-duration: 200ms;\n\ttransform: translateY(100%);\n\tanimation-name: slideouttobottom;\n\tanimation-duration: 200ms;\n}\n@-webkit-keyframes slideinfrombottom {\n    from { -webkit-transform: translateY(100%); }\n    to { -webkit-transform: translateY(0); }\n}\n@-moz-keyframes slideinfrombottom {\n    from { -moz-transform: translateY(100%); }\n    to { -moz-transform: translateY(0); }\n}\n@keyframes slideinfrombottom {\n    from { transform: translateY(100%); }\n    to { transform: translateY(0); }\n}\n@-webkit-keyframes slideouttobottom {\n    from { -webkit-transform: translateY(0); }\n    to { -webkit-transform: translateY(100%); }\n}\n@-moz-keyframes slideouttobottom {\n    from { -moz-transform: translateY(0); }\n    to { -moz-transform: translateY(100%); }\n}\n@keyframes slideouttobottom {\n    from { transform: translateY(0); }\n    to { transform: translateY(100%); }\n}\n/* The properties in this rule are only necessary for the 'flip' transition.\n * We need specify the perspective to create a projection matrix. This will add\n * some depth as the element flips. The depth number represents the distance of\n * the viewer from the z-plane. According to the CSS3 spec, 1000 is a moderate\n * value.\n */\n.viewport-flip {\n\t-webkit-perspective: 1000;\n\t-moz-perspective: 1000;\n\tperspective: 1000;\n\tposition: absolute;\n}\n.flip {\n\t-webkit-backface-visibility: hidden;\n\t-webkit-transform: translateX(0); /* Needed to work around an iOS 3.1 bug that causes listview thumbs to disappear when -webkit-visibility:hidden is used. */\n\t-moz-backface-visibility: hidden;\n\t-moz-transform: translateX(0);\n\tbackface-visibility: hidden;\n\ttransform: translateX(0);\n}\n.flip.out {\n\t-webkit-transform: rotateY(-90deg) scale(.9);\n\t-webkit-animation-name: flipouttoleft;\n\t-webkit-animation-duration: 175ms;\n\t-moz-transform: rotateY(-90deg) scale(.9);\n\t-moz-animation-name: flipouttoleft;\n\t-moz-animation-duration: 175ms;\n\ttransform: rotateY(-90deg) scale(.9);\n\tanimation-name: flipouttoleft;\n\tanimation-duration: 175ms;\n}\n.flip.in {\n\t-webkit-animation-name: flipintoright;\n\t-webkit-animation-duration: 225ms;\n\t-moz-animation-name: flipintoright;\n\t-moz-animation-duration: 225ms;\n\tanimation-name: flipintoright;\n\tanimation-duration: 225ms;\n}\n.flip.out.reverse {\n\t-webkit-transform: rotateY(90deg) scale(.9);\n\t-webkit-animation-name: flipouttoright;\n\t-moz-transform: rotateY(90deg) scale(.9);\n\t-moz-animation-name: flipouttoright;\n\ttransform: rotateY(90deg) scale(.9);\n\tanimation-name: flipouttoright;\n}\n.flip.in.reverse {\n\t-webkit-animation-name: flipintoleft;\n\t-moz-animation-name: flipintoleft;\n\tanimation-name: flipintoleft;\n}\n@-webkit-keyframes flipouttoleft {\n    from { -webkit-transform: rotateY(0); }\n    to { -webkit-transform: rotateY(-90deg) scale(.9); }\n}\n@-moz-keyframes flipouttoleft {\n    from { -moz-transform: rotateY(0); }\n    to { -moz-transform: rotateY(-90deg) scale(.9); }\n}\n@keyframes flipouttoleft {\n    from { transform: rotateY(0); }\n    to { transform: rotateY(-90deg) scale(.9); }\n}\n@-webkit-keyframes flipouttoright {\n    from { -webkit-transform: rotateY(0) ; }\n    to { -webkit-transform: rotateY(90deg) scale(.9); }\n}\n@-moz-keyframes flipouttoright {\n    from { -moz-transform: rotateY(0); }\n    to { -moz-transform: rotateY(90deg) scale(.9); }\n}\n@keyframes flipouttoright {\n    from { transform: rotateY(0); }\n    to { transform: rotateY(90deg) scale(.9); }\n}\n@-webkit-keyframes flipintoleft {\n    from { -webkit-transform: rotateY(-90deg) scale(.9); }\n    to { -webkit-transform: rotateY(0); }\n}\n@-moz-keyframes flipintoleft {\n    from { -moz-transform: rotateY(-90deg) scale(.9); }\n    to { -moz-transform: rotateY(0); }\n}\n@keyframes flipintoleft {\n    from { transform: rotateY(-90deg) scale(.9); }\n    to { transform: rotateY(0); }\n}\n@-webkit-keyframes flipintoright {\n    from { -webkit-transform: rotateY(90deg) scale(.9); }\n    to { -webkit-transform: rotateY(0); }\n}\n@-moz-keyframes flipintoright {\n    from { -moz-transform: rotateY(90deg) scale(.9); }\n    to { -moz-transform: rotateY(0); }\n}\n@keyframes flipintoright {\n    from { transform: rotateY(90deg) scale(.9); }\n    to { transform: rotateY(0); }\n}\n/* The properties in this rule are only necessary for the 'flip' transition.\n * We need specify the perspective to create a projection matrix. This will add\n * some depth as the element flips. The depth number represents the distance of\n * the viewer from the z-plane. According to the CSS3 spec, 1000 is a moderate\n * value.\n */\n.viewport-turn {\n\t-webkit-perspective: 200px;\n\t-moz-perspective: 200px;\n\t-ms-perspective: 200px;\n\tperspective: 200px;\n\tposition: absolute;\n}\n.turn {\n\t-webkit-backface-visibility: hidden;\n\t-webkit-transform: translateX(0); /* Needed to work around an iOS 3.1 bug that causes listview thumbs to disappear when -webkit-visibility:hidden is used. */\n\t-webkit-transform-origin: 0;\n\t\n\t-moz-backface-visibility: hidden;\n\t-moz-transform: translateX(0);\n\t-moz-transform-origin: 0;\n\t\n\tbackface-visibility :hidden;\n\ttransform: translateX(0);\n\ttransform-origin: 0;\n}\n.turn.out {\n\t-webkit-transform: rotateY(-90deg) scale(.9);\n\t-webkit-animation-name: flipouttoleft;\n\t-webkit-animation-duration: 125ms;\n\t-moz-transform: rotateY(-90deg) scale(.9);\n\t-moz-animation-name: flipouttoleft;\n\t-moz-animation-duration: 125ms;\n\ttransform: rotateY(-90deg) scale(.9);\n\tanimation-name: flipouttoleft;\n\tanimation-duration: 125ms;\n}\n.turn.in {\n\t-webkit-animation-name: flipintoright;\n\t-webkit-animation-duration: 250ms;\n\t-moz-animation-name: flipintoright;\n\t-moz-animation-duration: 250ms;\n\tanimation-name: flipintoright;\n\tanimation-duration: 250ms;\n\t\n}\n.turn.out.reverse {\n\t-webkit-transform: rotateY(90deg) scale(.9);\n\t-webkit-animation-name: flipouttoright;\n\t-moz-transform: rotateY(90deg) scale(.9);\n\t-moz-animation-name: flipouttoright;\n\ttransform: rotateY(90deg) scale(.9);\n\tanimation-name: flipouttoright;\n}\n.turn.in.reverse {\n\t-webkit-animation-name: flipintoleft;\n\t-moz-animation-name: flipintoleft;\n\tanimation-name: flipintoleft;\n}\n@-webkit-keyframes flipouttoleft {\n    from { -webkit-transform: rotateY(0); }\n    to { -webkit-transform: rotateY(-90deg) scale(.9); }\n}\n@-moz-keyframes flipouttoleft {\n    from { -moz-transform: rotateY(0); }\n    to { -moz-transform: rotateY(-90deg) scale(.9); }\n}\n@keyframes flipouttoleft {\n    from { transform: rotateY(0); }\n    to { transform: rotateY(-90deg) scale(.9); }\n}\n@-webkit-keyframes flipouttoright {\n    from { -webkit-transform: rotateY(0) ; }\n    to { -webkit-transform: rotateY(90deg) scale(.9); }\n}\n@-moz-keyframes flipouttoright {\n    from { -moz-transform: rotateY(0); }\n    to { -moz-transform: rotateY(90deg) scale(.9); }\n}\n@keyframes flipouttoright {\n    from { transform: rotateY(0); }\n    to { transform: rotateY(90deg) scale(.9); }\n}\n@-webkit-keyframes flipintoleft {\n    from { -webkit-transform: rotateY(-90deg) scale(.9); }\n    to { -webkit-transform: rotateY(0); }\n}\n@-moz-keyframes flipintoleft {\n    from { -moz-transform: rotateY(-90deg) scale(.9); }\n    to { -moz-transform: rotateY(0); }\n}\n@keyframes flipintoleft {\n    from { transform: rotateY(-90deg) scale(.9); }\n    to { transform: rotateY(0); }\n}\n@-webkit-keyframes flipintoright {\n    from { -webkit-transform: rotateY(90deg) scale(.9); }\n    to { -webkit-transform: rotateY(0); }\n}\n@-moz-keyframes flipintoright {\n    from { -moz-transform: rotateY(90deg) scale(.9); }\n    to { -moz-transform: rotateY(0); }\n}\n@keyframes flipintoright {\n    from { transform: rotateY(90deg) scale(.9); }\n    to { transform: rotateY(0); }\n}\n/* flow transition */\n.flow {\n\t-webkit-transform-origin: 50% 30%;\n\t-webkit-box-shadow: 0 0 20px rgba(0,0,0,.4);\n\t-moz-transform-origin: 50% 30%;\t\n\t-moz-box-shadow: 0 0 20px rgba(0,0,0,.4);\n\ttransform-origin: 50% 30%;\t\n\tbox-shadow: 0 0 20px rgba(0,0,0,.4);\n}\n.ui-dialog.flow {\n\t-webkit-transform-origin: none;\n\t-webkit-box-shadow: none;\n\t-moz-transform-origin: none;\t\n\t-moz-box-shadow: none;\n\ttransform-origin: none;\t\n\tbox-shadow: none;\n}\n.flow.out {\n\t-webkit-transform: translateX(-100%) scale(.7);\n\t-webkit-animation-name: flowouttoleft;\n\t-webkit-animation-timing-function: ease;\n\t-webkit-animation-duration: 350ms;\n\t-moz-transform: translateX(-100%) scale(.7);\n\t-moz-animation-name: flowouttoleft;\n\t-moz-animation-timing-function: ease;\n\t-moz-animation-duration: 350ms;\n\ttransform: translateX(-100%) scale(.7);\n\tanimation-name: flowouttoleft;\n\tanimation-timing-function: ease;\n\tanimation-duration: 350ms;\n}\n.flow.in {\n\t-webkit-transform: translateX(0) scale(1);\n\t-webkit-animation-name: flowinfromright;\n\t-webkit-animation-timing-function: ease;\n\t-webkit-animation-duration: 350ms;\n\t-moz-transform: translateX(0) scale(1);\n\t-moz-animation-name: flowinfromright;\n\t-moz-animation-timing-function: ease;\n\t-moz-animation-duration: 350ms;\n\ttransform: translateX(0) scale(1);\n\tanimation-name: flowinfromright;\n\tanimation-timing-function: ease;\n\tanimation-duration: 350ms;\n}\n.flow.out.reverse {\n\t-webkit-transform: translateX(100%);\n\t-webkit-animation-name: flowouttoright;\n\t-moz-transform: translateX(100%);\n\t-moz-animation-name: flowouttoright;\n\ttransform: translateX(100%);\n\tanimation-name: flowouttoright;\n}\n.flow.in.reverse {\n\t-webkit-animation-name: flowinfromleft;\n\t-moz-animation-name: flowinfromleft;\n\tanimation-name: flowinfromleft;\n}\n@-webkit-keyframes flowouttoleft {\n    0% { -webkit-transform: translateX(0) scale(1); }\n\t60%, 70% { -webkit-transform: translateX(0) scale(.7); }\n    100% { -webkit-transform: translateX(-100%) scale(.7); }\n}\n@-moz-keyframes flowouttoleft {\n    0% { -moz-transform: translateX(0) scale(1); }\n\t60%, 70% { -moz-transform: translateX(0) scale(.7); }\n    100% { -moz-transform:  translateX(-100%) scale(.7); }\n}\n@keyframes flowouttoleft {\n    0% { transform: translateX(0) scale(1); }\n\t60%, 70% { transform: translateX(0) scale(.7); }\n    100% { transform:  translateX(-100%) scale(.7); }\n}\n@-webkit-keyframes flowouttoright {\n    0% { -webkit-transform: translateX(0) scale(1); }\n\t60%, 70% { -webkit-transform: translateX(0) scale(.7); }\n    100% { -webkit-transform:  translateX(100%) scale(.7); }\n}\n@-moz-keyframes flowouttoright {\n    0% { -moz-transform: translateX(0) scale(1); }\n\t60%, 70% { -moz-transform: translateX(0) scale(.7); }\n    100% { -moz-transform:  translateX(100%) scale(.7); }\n}\n@keyframes flowouttoright {\n    0% { transform: translateX(0) scale(1); }\n\t60%, 70% { transform: translateX(0) scale(.7); }\n    100% { transform:  translateX(100%) scale(.7); }\n}\n@-webkit-keyframes flowinfromleft {\n    0% { -webkit-transform: translateX(-100%) scale(.7); }\n\t30%, 40% { -webkit-transform: translateX(0) scale(.7); }\n    100% { -webkit-transform: translateX(0) scale(1); }\n}\n@-moz-keyframes flowinfromleft {\n    0% { -moz-transform: translateX(-100%) scale(.7); }\n\t30%, 40% { -moz-transform: translateX(0) scale(.7); }\n    100% { -moz-transform: translateX(0) scale(1); }\n}\n@keyframes flowinfromleft {\n    0% { transform: translateX(-100%) scale(.7); }\n\t30%, 40% { transform: translateX(0) scale(.7); }\n    100% { transform: translateX(0) scale(1); }\n}\n@-webkit-keyframes flowinfromright {\n    0% { -webkit-transform: translateX(100%) scale(.7); }\n\t30%, 40% { -webkit-transform: translateX(0) scale(.7); }\n    100% { -webkit-transform: translateX(0) scale(1); }\n}\n@-moz-keyframes flowinfromright {\n    0% { -moz-transform: translateX(100%) scale(.7); }\n\t30%, 40% { -moz-transform: translateX(0) scale(.7); }\n    100% { -moz-transform: translateX(0) scale(1); }\n}\n@keyframes flowinfromright {\n    0% { transform: translateX(100%) scale(.7); }\n\t30%, 40% { transform: translateX(0) scale(.7); }\n    100% { transform: translateX(0) scale(1); }\n}\n.ui-field-contain,\n.ui-mobile fieldset.ui-field-contain {\n\tdisplay: block;\n\tposition: relative;\n\toverflow: visible;\n\tclear: both;\n\tpadding: .8em 0;\n}\n.ui-field-contain > label ~ [class*=\"ui-\"],\n.ui-field-contain .ui-controlgroup-controls {\n\tmargin: 0;\n}\n.ui-field-contain:last-child {\n\tborder-bottom-width: 0;\n}\n@media (min-width: 28em) {\n\t.ui-field-contain,\n\t.ui-mobile fieldset.ui-field-contain {\n\t\tpadding: 0;\n\t\tmargin: 1em 0;\n\t\tborder-bottom-width: 0;\n\t}\n\t.ui-field-contain:before,\n\t.ui-field-contain:after {\n\t\tcontent: \"\";\n\t\tdisplay: table;\n\t}\n\t.ui-field-contain:after {\n\t\tclear: both;\n\t}\n\t.ui-field-contain > label,\n\t.ui-field-contain .ui-controlgroup-label,\n\t.ui-field-contain > .ui-rangeslider > label {\n\t\tfloat: left;\n\t\twidth: 20%;\n\t\tmargin: .5em 2% 0 0;\n\t}\n\t.ui-popup .ui-field-contain > label,\n\t.ui-popup .ui-field-contain .ui-controlgroup-label,\n\t.ui-popup .ui-field-contain > .ui-rangeslider > label {\n\t\tfloat: none;\n\t\twidth: auto;\n\t\tmargin: 0 0 .4em;\n\t}\n\t.ui-field-contain > label ~ [class*=\"ui-\"],\n\t.ui-field-contain .ui-controlgroup-controls {\n\t\tfloat: left;\n\t\twidth: 78%;\n\t\t-webkit-box-sizing: border-box;\n\t\t-moz-box-sizing: border-box;\n\t\tbox-sizing: border-box;\n\t}\n\t/* ui-hide-label deprecated in 1.4. TODO: Remove in 1.5 */\n\t.ui-hide-label > label ~ [class*=\"ui-\"],\n\t.ui-hide-label .ui-controlgroup-controls,\n\t.ui-popup .ui-field-contain > label ~ [class*=\"ui-\"],\n\t.ui-popup .ui-field-contain .ui-controlgroup-controls {\n\t\tfloat: none;\n\t\twidth: 100%;\n\t}\n\t.ui-field-contain > label ~ .ui-btn-inline {\n\t\twidth: auto;\n\t\tmargin-right: .625em;\n\t}\n\t.ui-field-contain > label ~ .ui-btn-inline.ui-btn-icon-notext {\n\t\twidth: 1.75em;\n\t}\n}\n/* content configurations. */\n.ui-grid-a,\n.ui-grid-b,\n.ui-grid-c,\n.ui-grid-d,\n.ui-grid-solo {\n\toverflow: hidden;\n}\n.ui-block-a,\n.ui-block-b,\n.ui-block-c,\n.ui-block-d,\n.ui-block-e {\n\tmargin: 0;\n\tpadding: 0;\n\tborder: 0;\n\tfloat: left;\n\tmin-height: 1px;\n\t-webkit-box-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\tbox-sizing: border-box;\n}\n/* force new row */\n.ui-block-a {\n\tclear: left;\n}\nul.ui-grid-a,\nul.ui-grid-b,\nul.ui-grid-c,\nul.ui-grid-d,\nul.ui-grid-solo,\nli.ui-block-a,\nli.ui-block-b,\nli.ui-block-c,\nli.ui-block-d,\nli.ui-block-e {\n\tmargin-left: 0;\n\tmargin-right: 0;\n\tpadding: 0;\n\tlist-style: none;\n}\n/* No margin in grids for 100% width button elements until we can use max-width: fill-available; */\n[class*=\"ui-block-\"] > button.ui-btn {\n\tmargin-right: 0;\n\tmargin-left: 0;\n}\n[class*=\"ui-block-\"] > .ui-btn,\n[class*=\"ui-block-\"] > .ui-select,\n[class*=\"ui-block-\"] > .ui-checkbox,\n[class*=\"ui-block-\"] > .ui-radio,\n[class*=\"ui-block-\"] > button.ui-btn-inline,\n[class*=\"ui-block-\"] > button.ui-btn-icon-notext,\n.ui-header [class*=\"ui-block-\"] > button.ui-btn,\n.ui-footer [class*=\"ui-block-\"] > button.ui-btn {\n\tmargin-right: .3125em;\n\tmargin-left: .3125em;\n}\n.ui-grid-a > .ui-block-a,\n.ui-grid-a > .ui-block-b {\n\t/* width: 49.95%; IE7 */\n\t/* margin-right: -.5px; BB5 */\n\twidth: 50%;\n}\n.ui-grid-b > .ui-block-a,\n.ui-grid-b > .ui-block-b,\n.ui-grid-b > .ui-block-c {\n\t/* width: 33.25%; IE7 */\n\t/* margin-right: -.5px; BB5 */\n\twidth: 33.333%;\n}\n.ui-grid-c > .ui-block-a,\n.ui-grid-c > .ui-block-b,\n.ui-grid-c > .ui-block-c,\n.ui-grid-c > .ui-block-d {\n\t/* width: 24.925%; IE7 */\n\t/* margin-right: -.5px; BB5 */\n\twidth: 25%;\n}\n.ui-grid-d > .ui-block-a,\n.ui-grid-d > .ui-block-b,\n.ui-grid-d > .ui-block-c,\n.ui-grid-d > .ui-block-d,\n.ui-grid-d > .ui-block-e {\n\t/* width: 19.925%; IE7 */\n\twidth: 20%;\n}\n.ui-grid-solo > .ui-block-a {\n\twidth: 100%;\n\tfloat: none; \n}\n/* preset breakpoint to switch to stacked grid styles below 35em (560px) */\n@media (max-width: 35em) {\n\t.ui-responsive > .ui-block-a,\n\t.ui-responsive > .ui-block-b,\n\t.ui-responsive > .ui-block-c,\n\t.ui-responsive > .ui-block-d,\n\t.ui-responsive > .ui-block-e {\n\t\twidth: 100%; \n\t\tfloat: none; \n\t}\n}\n/* fixed page header & footer configuration */\n.ui-header-fixed,\n.ui-footer-fixed {\n\tleft: 0;\n\tright: 0;\n\twidth: 100%;\n\tposition: fixed;\n\tz-index: 1000;\n}\n.ui-header-fixed {\n\ttop: -1px;\n\tpadding-top: 1px;\n}\n.ui-header-fixed.ui-fixed-hidden {\n\ttop: 0;\n\tpadding-top: 0;\n}\n.ui-header-fixed .ui-btn-left,\n.ui-header-fixed .ui-btn-right {\n\tmargin-top: 1px;\n}\n.ui-header-fixed.ui-fixed-hidden .ui-btn-left,\n.ui-header-fixed.ui-fixed-hidden .ui-btn-right {\n\tmargin-top: 0;\n}\n.ui-footer-fixed {\n\tbottom: -1px;\n\tpadding-bottom: 1px;\n}\n.ui-footer-fixed.ui-fixed-hidden {\n\tbottom: 0;\n\tpadding-bottom: 0;\n}\n.ui-header-fullscreen,\n.ui-footer-fullscreen {\n\tfilter: Alpha(Opacity=90);\n\topacity: .9;\n}\n/* updatePagePadding() will update the padding to actual height of header and footer. */\n.ui-page-header-fixed {\n\tpadding-top: 2.8125em;\n}\n.ui-page-footer-fixed {\n\tpadding-bottom: 2.8125em;\n}\n.ui-page-header-fullscreen > .ui-content,\n.ui-page-footer-fullscreen > .ui-content {\n\tpadding: 0;\n}\n.ui-fixed-hidden {\n\tposition: absolute;\n}\n/* Tap toggle: hide external fixed footer. See issue #6604 */\n.ui-footer-fixed.ui-fixed-hidden {\n  display: none;\n}\n.ui-page .ui-footer-fixed.ui-fixed-hidden {\n  display: block\n}\n.ui-page-header-fullscreen .ui-fixed-hidden,\n.ui-page-footer-fullscreen .ui-fixed-hidden {\n\tposition: absolute !important;\n\theight: 1px;\n\twidth: 1px;\n\toverflow: hidden;\n\tclip: rect(1px,1px,1px,1px);\n}\n.ui-header-fixed .ui-btn,\n.ui-footer-fixed .ui-btn { \n\tz-index: 10;\n}\n/* workarounds for other widgets */\n.ui-android-2x-fixed .ui-li-has-thumb {\n\t-webkit-transform: translate3d(0,0,0);\n}\n.ui-navbar {\n\tmax-width: 100%;\n}\n.ui-navbar ul:before,\n.ui-navbar ul:after {\n\tcontent: \"\";\n\tdisplay: table;\n}\n.ui-navbar ul:after {\n\tclear: both;\n}\n.ui-navbar ul {\n\tlist-style: none;\n\tmargin: 0;\n\tpadding: 0;\n\tposition: relative;\n\tdisplay: block;\n\tborder: 0;\n\tmax-width: 100%;\n\toverflow: visible;\n}\n.ui-navbar li .ui-btn {\n\tfont-size: 12.5px;\n\tdisplay: block;\n\tmargin: 0;\n\tborder-right-width: 0;\n}\n.ui-header .ui-navbar li button.ui-btn,\n.ui-footer .ui-navbar li button.ui-btn {\n\tmargin: 0;\n\twidth: 100%;\n}\n.ui-navbar .ui-btn:focus {\n\tz-index: 1;\n}\n/* fixes gaps caused by subpixel problem */\n.ui-navbar li:last-child .ui-btn {\n\tmargin-right: -4px;\n}\n.ui-navbar li:last-child .ui-btn:after {\n\tmargin-right: 4px;\n}\n.ui-content .ui-navbar li:last-child .ui-btn,\n.ui-content .ui-navbar .ui-grid-duo .ui-block-b .ui-btn {\n\tborder-right-width: 1px;\n\tmargin-right: 0;\n}\n.ui-content .ui-navbar li:last-child .ui-btn:after,\n.ui-content .ui-navbar .ui-grid-duo .ui-block-b .ui-btn:after {\n\tmargin-right: 0;\n}\n.ui-navbar .ui-grid-duo .ui-block-a:last-child .ui-btn {\n\tborder-right-width: 1px;\n\tmargin-right: -1px;\n}\n.ui-navbar .ui-grid-duo .ui-block-a:last-child .ui-btn:after {\n\tmargin-right: 1px;\n}\n.ui-navbar .ui-grid-duo .ui-btn {\n\tborder-top-width: 0;\n}\n.ui-navbar .ui-grid-duo .ui-block-a:first-child .ui-btn,\n.ui-navbar .ui-grid-duo .ui-block-a:first-child + .ui-block-b .ui-btn {\n\tborder-top-width: 1px;\n}\n.ui-header .ui-navbar .ui-btn,\n.ui-footer .ui-navbar .ui-btn {\n\tborder-top-width: 0;\n\tborder-bottom-width: 0;\n}\n.ui-header .ui-navbar .ui-grid-duo .ui-block-a:first-child .ui-btn,\n.ui-footer .ui-navbar .ui-grid-duo .ui-block-a:first-child .ui-btn,\n.ui-header .ui-navbar .ui-grid-duo .ui-block-a:first-child + .ui-block-b .ui-btn,\n.ui-footer .ui-navbar .ui-grid-duo .ui-block-a:first-child + .ui-block-b .ui-btn {\n\tborder-top-width: 0;\n}\n.ui-header .ui-title ~ .ui-navbar .ui-btn,\n.ui-footer .ui-title ~ .ui-navbar .ui-btn,\n.ui-header .ui-navbar .ui-grid-duo .ui-btn,\n.ui-footer .ui-navbar .ui-grid-duo .ui-btn,\n.ui-header .ui-title ~ .ui-navbar .ui-grid-duo .ui-block-a:first-child .ui-btn,\n.ui-footer .ui-title ~ .ui-navbar .ui-grid-duo .ui-block-a:first-child .ui-btn,\n.ui-header .ui-title ~ .ui-navbar .ui-grid-duo .ui-block-a:first-child + .ui-block-b .ui-btn,\n.ui-footer .ui-title ~ .ui-navbar .ui-grid-duo .ui-block-a:first-child + .ui-block-b .ui-btn {\n\tborder-top-width: 1px;\n}\n/* Hide the native input element */\n.ui-input-btn input {\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n\twidth: 100%;\n\theight: 100%;\n\tpadding: 0;\n\tborder: 0;\n\toutline: 0;\n\t-webkit-border-radius: inherit;\n\tborder-radius: inherit;\t\n\t-webkit-appearance: none;\n\t-moz-appearance: none;\n\tcursor: pointer;\n\tbackground: #fff;\n\tbackground: rgba(255,255,255,0);\n\tfilter: Alpha(Opacity=0);\n\topacity: .1;\n\tfont-size: 1px;\n\ttext-indent: -9999px;\n\tz-index: 2;\n}\n/* Fixes IE/WP filter alpha opacity bugs */\n.ui-input-btn.ui-state-disabled input {\n\tposition: absolute !important;\n\theight: 1px;\n\twidth: 1px;\n\toverflow: hidden;\n\tclip: rect(1px,1px,1px,1px);\n}\n.ui-collapsible {\n\tmargin: 0 -1em;\n}\n.ui-collapsible-inset,\n.ui-collapsible-set {\n\tmargin: .5em 0;\n}\n.ui-collapsible-heading {\n\tdisplay: block;\n\tmargin: 0;\n\tpadding: 0;\n\tposition: relative;\n}\n.ui-collapsible-heading .ui-btn {\n\ttext-align: left;\n\tmargin: 0;\n\tborder-left-width: 0;\n\tborder-right-width: 0;\n}\n.ui-collapsible-heading .ui-btn-icon-top,\n.ui-collapsible-heading .ui-btn-icon-bottom {\n\ttext-align: center;\n}\n.ui-collapsible-inset .ui-collapsible-heading .ui-btn {\n\tborder-right-width: 1px;\n\tborder-left-width: 1px;\n}\n.ui-collapsible-collapsed + .ui-collapsible:not(.ui-collapsible-inset) > .ui-collapsible-heading .ui-btn {\n\tborder-top-width: 0;\n}\n.ui-collapsible-set .ui-collapsible:not(.ui-collapsible-inset) .ui-collapsible-heading .ui-btn {\n\tborder-top-width: 1px;\n}\n.ui-collapsible-heading-status {\n\tposition: absolute !important;\n\theight: 1px;\n\twidth: 1px;\n\toverflow: hidden;\n\tclip: rect(1px,1px,1px,1px);\n}\n.ui-collapsible-content {\n\tdisplay: block;\n\tmargin: 0;\t\n\tpadding: .5em 1em;\n}\n.ui-collapsible-themed-content .ui-collapsible-content {\n\tborder-left-width: 0;\n\tborder-right-width: 0;\n\tborder-top-width: 0;\n\tborder-bottom-width: 1px;\n\tborder-style: solid;\n}\n.ui-collapsible-inset.ui-collapsible-themed-content .ui-collapsible-content {\n\tborder-left-width: 1px;\n\tborder-right-width: 1px;\n}\n.ui-collapsible-inset .ui-collapsible-content {\n\tmargin: 0;\n}\n.ui-collapsible-content-collapsed {\n\tdisplay: none;\n}\n.ui-collapsible-set > .ui-collapsible.ui-corner-all {\n\t-webkit-border-radius: 0;\n\tborder-radius: 0;\n}\n.ui-collapsible-heading,\n.ui-collapsible-heading > .ui-btn {\n\t-webkit-border-radius: inherit;\t\n\tborder-radius: inherit;\t\n}\n.ui-collapsible-set .ui-collapsible.ui-first-child {\n\t-webkit-border-top-right-radius: inherit;\t\n\tborder-top-right-radius: inherit;\n\t-webkit-border-top-left-radius: inherit;\t\n\tborder-top-left-radius: inherit;\t\t\n}\n.ui-collapsible-content,\n.ui-collapsible-set .ui-collapsible.ui-last-child {\n\t-webkit-border-bottom-right-radius: inherit;\t\n\tborder-bottom-right-radius: inherit;\n\t-webkit-border-bottom-left-radius: inherit;\t\n\tborder-bottom-left-radius: inherit;\t\t\n}\n.ui-collapsible-themed-content:not(.ui-collapsible-collapsed) > .ui-collapsible-heading {\n\t-webkit-border-bottom-right-radius: 0;\t\n\tborder-bottom-right-radius: 0;\n\t-webkit-border-bottom-left-radius: 0;\t\n\tborder-bottom-left-radius: 0;\t\t\n}\n.ui-collapsible-set .ui-collapsible {\n\tmargin: -1px -1em 0;\n}\n.ui-collapsible-set .ui-collapsible-inset {\n\tmargin: -1px 0 0;\n}\n.ui-collapsible-set .ui-collapsible.ui-first-child {\n\tmargin-top: 0;\n}\n.ui-controlgroup,\nfieldset.ui-controlgroup {\n\tpadding: 0;\n\tmargin: .5em 0;\n}\n.ui-field-contain .ui-controlgroup,\n.ui-field-contain fieldset.ui-controlgroup {\n\tmargin: 0;\n}\n.ui-mini .ui-controlgroup-label {\n\tfont-size: 16px;\n}\n.ui-controlgroup.ui-mini .ui-btn-icon-notext,\n.ui-controlgroup .ui-mini.ui-btn-icon-notext {\n\tfont-size: inherit;\n}\n.ui-controlgroup-controls .ui-btn,\n.ui-controlgroup-controls .ui-checkbox,\n.ui-controlgroup-controls .ui-radio,\n.ui-controlgroup-controls .ui-select {\n\tmargin: 0;\n}\n.ui-controlgroup-controls .ui-btn:focus,\n.ui-controlgroup-controls .ui-btn.ui-focus {\n\tz-index: 1;\n}\n.ui-controlgroup-controls li {\n\tlist-style: none;\n}\n.ui-controlgroup-horizontal .ui-controlgroup-controls {\n\tdisplay: inline-block;\n\tvertical-align: middle;\n}\n.ui-controlgroup-horizontal .ui-controlgroup-controls:before,\n.ui-controlgroup-horizontal .ui-controlgroup-controls:after {\n\tcontent: \"\";\n\tdisplay: table;\n}\n.ui-controlgroup-horizontal .ui-controlgroup-controls:after {\n\tclear: both;\n}\n.ui-controlgroup-horizontal .ui-controlgroup-controls > .ui-btn,\n.ui-controlgroup-horizontal .ui-controlgroup-controls li > .ui-btn,\n.ui-controlgroup-horizontal .ui-controlgroup-controls .ui-checkbox,\n.ui-controlgroup-horizontal .ui-controlgroup-controls .ui-radio,\n.ui-controlgroup-horizontal .ui-controlgroup-controls .ui-select {\n\tfloat: left;\n\tclear: none;\n}\n.ui-controlgroup-horizontal .ui-controlgroup-controls button.ui-btn,\n.ui-controlgroup-controls .ui-btn-icon-notext {\n\twidth: auto;\n}\n.ui-controlgroup-horizontal .ui-controlgroup-controls .ui-btn-icon-notext,\n.ui-controlgroup-horizontal .ui-controlgroup-controls button.ui-btn-icon-notext {\n\twidth: 1.5em;\n}\n .ui-controlgroup-controls .ui-btn-icon-notext {\n\theight: auto;\n\tpadding: .7em 1em;\n}\n.ui-controlgroup-vertical .ui-controlgroup-controls .ui-btn {\n\tborder-bottom-width: 0;\n}\n.ui-controlgroup-vertical .ui-controlgroup-controls .ui-btn.ui-last-child {\n\tborder-bottom-width: 1px;\n}\n.ui-controlgroup-horizontal .ui-controlgroup-controls .ui-btn {\n\tborder-right-width: 0;\n}\n.ui-controlgroup-horizontal .ui-controlgroup-controls .ui-btn.ui-last-child {\n\tborder-right-width: 1px;\n}\n.ui-controlgroup-controls .ui-btn-corner-all,\n.ui-controlgroup-controls .ui-btn.ui-corner-all {\n\t-webkit-border-radius: 0;\n\tborder-radius: 0;\n}\n.ui-controlgroup-controls,\n.ui-controlgroup-controls .ui-radio,\n.ui-controlgroup-controls .ui-checkbox,\n.ui-controlgroup-controls .ui-select,\n.ui-controlgroup-controls li {\n\t-webkit-border-radius: inherit;\n\tborder-radius: inherit;\n}\n.ui-controlgroup-vertical .ui-btn.ui-first-child {\n\t-webkit-border-top-left-radius: inherit;\n\tborder-top-left-radius: inherit;\n\t-webkit-border-top-right-radius: inherit;\n\tborder-top-right-radius: inherit;\n}\n.ui-controlgroup-vertical .ui-btn.ui-last-child {\n\t-webkit-border-bottom-left-radius: inherit;\n\tborder-bottom-left-radius: inherit;\n\t-webkit-border-bottom-right-radius: inherit;\n\tborder-bottom-right-radius: inherit;\n}\n.ui-controlgroup-horizontal .ui-btn.ui-first-child {\n\t-webkit-border-top-left-radius: inherit;\n\tborder-top-left-radius: inherit;\n\t-webkit-border-bottom-left-radius: inherit;\n\tborder-bottom-left-radius: inherit;\n}\n.ui-controlgroup-horizontal .ui-btn.ui-last-child {\n\t-webkit-border-top-right-radius: inherit;\n\tborder-top-right-radius: inherit;\n\t-webkit-border-bottom-right-radius: inherit;\n\tborder-bottom-right-radius: inherit;\n}\n.ui-controlgroup-controls a.ui-shadow:not(:focus),\n.ui-controlgroup-controls button.ui-shadow:not(:focus),\n.ui-controlgroup-controls div.ui-shadow:not(.ui-focus) {\n\t-moz-box-shadow: none;\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n}\n/* Fixes legend not wrapping on IE10 */\n.ui-controlgroup-label legend {\n\tmax-width: 100%;\n}\n.ui-controlgroup-controls > label {\n\tposition: absolute !important;\n\theight: 1px;\n\twidth: 1px;\n\toverflow: hidden;\n\tclip: rect(1px,1px,1px,1px);\n}\n.ui-dialog {\n\t background: none !important; /* this is to ensure that dialog theming does not apply (by default at least) on the page div */\n}\n.ui-dialog-contain {\n\twidth: 92.5%;\n\tmax-width: 500px;\n\tmargin: 10% auto 1em auto;\n\tpadding: 0;\n\tposition: relative;\n\ttop: -1em;\n}\n.ui-dialog-contain > .ui-header, \n.ui-dialog-contain > .ui-content, \n.ui-dialog-contain > .ui-footer { \n\tdisplay: block;\n\tposition: relative; \n\twidth: auto;\n\tmargin: 0;\n}\n.ui-dialog-contain > .ui-header {\n\toverflow: hidden;\n\tz-index: 10; \n\tpadding: 0;\n\tborder-top-width: 0;\n}\n.ui-dialog-contain > .ui-footer {\n\tz-index: 10; \n\tpadding: 0 1em; \n\tborder-bottom-width: 0;\n}\n.ui-popup-open .ui-header-fixed,\n.ui-popup-open .ui-footer-fixed {\n\tposition: absolute !important; /* See issues #4816, #4844 and #4874 and popup.js */\n}\n.ui-popup-screen {\n\tbackground-image: url(\"data:image/gif;base64,R0lGODlhAQABAID/AMDAwAAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==\"); /* Necessary to set some form of background to ensure element is clickable in IE6/7. While legacy IE won't understand the data-URI'd image, it ensures no additional requests occur in all other browsers with little overhead. */\n\ttop: 0;\n\tleft: 0;\n\tright: 0;\n\tbottom: 1px;\n\tposition: absolute;\n\tfilter: Alpha(Opacity=0);\n\topacity: 0;\n\tz-index: 1099;\n}\n.ui-popup-screen.in {\n\topacity: 0.5;\n\tfilter: Alpha(Opacity=50);\n}\n.ui-popup-screen.out {\n\topacity: 0;\n\tfilter: Alpha(Opacity=0);\n}\n.ui-popup-container {\n\tz-index: 1100;\n\tdisplay: inline-block;\n\tposition: absolute;\n\tpadding: 0;\n\toutline: 0;\n}\n.ui-popup {\n\tposition: relative;\n}\n.ui-popup.ui-body-inherit {\n\tborder-width: 1px;\n\tborder-style: solid;\n}\n.ui-popup-hidden {\n\tleft: 0;\n\ttop: 0;\n\tposition: absolute !important;\n\tvisibility: hidden;\n}\n.ui-popup-truncate {\n\theight: 1px;\n\twidth: 1px;\n\tmargin: -1px;\n\toverflow: hidden;\n\tclip: rect(1px,1px,1px,1px);\n}\n.ui-popup.ui-content,\n.ui-popup .ui-content {\n\toverflow: visible;\n}\n.ui-popup > .ui-header {\n\tborder-top-width: 0;\n}\n.ui-popup > .ui-footer {\n\tborder-bottom-width: 0;\n}\n.ui-popup > p,\n.ui-popup > h1,\n.ui-popup > h2,\n.ui-popup > h3,\n.ui-popup > h4,\n.ui-popup > h5,\n.ui-popup > h6 {\n\tmargin: .5em .4375em;\n}\n.ui-popup > span {\n\tdisplay: block;\n\tmargin: .5em .4375em;\n}\n.ui-popup-container .ui-content > p,\n.ui-popup-container .ui-content > h1,\n.ui-popup-container .ui-content > h2,\n.ui-popup-container .ui-content > h3,\n.ui-popup-container .ui-content > h4,\n.ui-popup-container .ui-content > h5,\n.ui-popup-container .ui-content > h6 {\n\tmargin: .5em 0;\n}\n.ui-popup-container .ui-content > span {\n\tmargin: 0;\n}\n.ui-popup-container .ui-content > p:first-child,\n.ui-popup-container .ui-content > h1:first-child,\n.ui-popup-container .ui-content > h2:first-child,\n.ui-popup-container .ui-content > h3:first-child,\n.ui-popup-container .ui-content > h4:first-child,\n.ui-popup-container .ui-content > h5:first-child,\n.ui-popup-container .ui-content > h6:first-child {\n\tmargin-top: 0;\n}\n.ui-popup-container .ui-content > p:last-child,\n.ui-popup-container .ui-content > h1:last-child,\n.ui-popup-container .ui-content > h2:last-child,\n.ui-popup-container .ui-content > h3:last-child,\n.ui-popup-container .ui-content > h4:last-child,\n.ui-popup-container .ui-content > h5:last-child,\n.ui-popup-container .ui-content > h6:last-child {\n\tmargin-bottom: 0;\n}\n.ui-popup > img {\n\tmax-width: 100%;\n\tmax-height: 100%;\n\tvertical-align: middle;\n}\n.ui-popup:not(.ui-content) > img:only-child,\n.ui-popup:not(.ui-content) > .ui-btn-left:first-child + img:last-child,\n.ui-popup:not(.ui-content) > .ui-btn-right:first-child + img:last-child {\n\t-webkit-border-radius: inherit;\n\tborder-radius: inherit;\n}\n.ui-popup iframe {\n\tvertical-align: middle;\n}\n.ui-popup > .ui-btn-left,\n.ui-popup > .ui-btn-right {\n\tposition: absolute; \n\ttop: -11px;\n\tmargin: 0;\n\tz-index: 1101;\n}\n.ui-popup > .ui-btn-left {\n\tleft: -11px;\n}\n.ui-popup > .ui-btn-right {\n\tright: -11px;\n}\n/* Dimensions related to the popup arrow\n-----------------------------------------------------------------------------------------------------------*/\n/* desired triangle height: 10px */\n/**\n * guide for the arrow - its width, height, and offset are theme-dependent and\n * should be expessed as left, right, top, bottom, so that the element bearing\n * such a class becomes stretched inside its parent position: relative element.\n * The left/top/right/bottom specified below should reflect the corresponding\n * border radii and so it leaves room for the shadow:\n *     ..--------------------..\n *   .\"        ^ top           \".\n *  /          v                 \\\n * |     +------------------+     |\n * |     |                  |     |\n * | left|                  |right|\n * |<--->|                  |<--->|\n * |     +------------------+     |\n *  \\          ^                 /\n *   `.        v bottom        .'\n *     \"\"--------------------\"\"\n * The idea is that the top/left of the arrow container box does not move to a\n * coordinate smaller than the top/left of the guide and the right/bottom of\n * the arrow container box does not move to a coordinate larger than the\n * bottom/right of the guide. This will help us avoid the following situation:\n *        ..--------------------..\n *      .\"        ^ top           \".\n *   /|/          v                 \\\n *  / |     +------------------+     |\n *  \\ |     |                  |     |\n *   \\| left|                  |right|\n *    |<--->|                  |<--->|\n *    |     +------------------+     |\n *     \\          ^                 /\n *      `.        v bottom        .'\n *        \"\"--------------------\"\"\n * The arrow should not receive a top/left coordinate such that it is too close\n * to one of the corners, because then at first the shadow of the arrow and,\n * given a coordinate even closer to the corner, even the body of the arrow will\n * \"stick out\" of the corner of the popup. The guide provides a hint to the\n * arrow positioning code as to which range of values is acceptable for the\n * arrow container's top/left coordinate.\n **/\n.ui-popup-arrow-container {\n\twidth: 20px;\n\theight: 20px;\n}\n/* aside from the \"infinities\" (-1000,2000), triangle height is used */\n.ui-popup-arrow-container.ui-popup-arrow-l {\n\tleft: -10px;\n\tclip: rect(-1000px,10px,2000px,-1000px);\n}\n.ui-popup-arrow-container.ui-popup-arrow-t {\n\ttop: -10px;\n\tclip: rect(-1000px,2000px,10px,-1000px);\n}\n.ui-popup-arrow-container.ui-popup-arrow-r {\n\tright: -10px;\n\tclip: rect(-1000px,2000px,2000px,10px);\n}\n.ui-popup-arrow-container.ui-popup-arrow-b {\n\tbottom: -10px;\n\tclip: rect(10px,2000px,1000px,-1000px);\n}\n/**\n * For each side, the arrow is twice the desired size and its corner is aligned\n * with the edge of the container:\n *                                           \n *           /\\         /\\                +----+       /\\\n *          /  \\       /  \\               | /\\ |top   /  \\\n *      +----+  \\     /  +----+       +-->|/  \\|     /    \\\n *  left| /  |   \\   /   |  \\ |right  |   |    |    /      \\\n *      |/   |    \\ /    |   \\|       |  /|    |\\  /        \\\n *      |\\   |    / \\    |   /|       | / +----+ \\ \\ +----+ /\n *      | \\  |   /   \\   |  / |       | \\        /  \\|    |/\n *      +----+  /     \\  +----+       |  \\      /    |    |\n *       ^  \\  /       \\  /  ^        |   \\    /  +->|\\  /|\n *       |   \\/         \\/   |        |    \\  /   |  | \\/ |bottom\n *       |                   |        |     \\/    |  +----+\n *       +-------------------+--------+-----------+\n *                           |\n *                    arrow container\n *                     (clips arrow)\n **/\n.ui-popup-arrow-container .ui-popup-arrow {\n\t/* (4*desired triangle height)/sqrt(2) - does not account for border - centred within the outer rectangle */\n\twidth: 28.284271247px;\n\theight: 28.284271247px;\n\tborder-width: 1px;\n\tborder-style: solid;\n}\n.ui-popup-arrow-container.ui-popup-arrow-t .ui-popup-arrow {\n\tleft: -4.142135623px;\n\ttop: 5.857864376px;\n}\n.ui-popup-arrow-container.ui-popup-arrow-b .ui-popup-arrow {\n\tleft: -4.142135623px;\n\ttop: -14.142135623px;\n}\n.ui-popup-arrow-container.ui-popup-arrow-l .ui-popup-arrow {\n\tleft: 5.857864376px;\n\ttop: -4.142135623px;\n}\n.ui-popup-arrow-container.ui-popup-arrow-r .ui-popup-arrow {\n\tleft: -14.142135623px;\n\ttop: -4.142135623px;\n}\n/* Fix rotation center for oldIE - see http://www.useragentman.com/IETransformsTranslator/ */\n.ui-popup-arrow-container.ui-popup-arrow-t.ie .ui-popup-arrow {\n    margin-left: -5.857864376269049px;\n    margin-top: -7.0710678118654755px;\n}\n.ui-popup-arrow-container.ui-popup-arrow-b.ie .ui-popup-arrow {\n    margin-left: -5.857864376269049px;\n    margin-top: -4.142135623730951px;\n}\n \n.ui-popup-arrow-container.ui-popup-arrow-l.ie .ui-popup-arrow {\n    margin-left: -7.0710678118654755px;\n    margin-top: -5.857864376269049px;\n}\n.ui-popup-arrow-container.ui-popup-arrow-r.ie .ui-popup-arrow {\n    margin-left: -4.142135623730951px;\n    margin-top: -5.857864376269049px;\n}\n/* structure */\n.ui-popup > .ui-popup-arrow-guide {\n\tposition: absolute;\n\tleft: 0;\n\tright: 0;\n\ttop: 0;\n\tbottom: 0;\n\tvisibility: hidden;\n}\n.ui-popup-arrow-container {\n\tposition: absolute;\n}\n.ui-popup-arrow {\n\t-webkit-transform: rotate(45deg);\n\t-moz-transform: rotate(45deg);\n\t-ms-transform: rotate(45deg);\n\ttransform: rotate(45deg);\n\tposition: absolute;\n\toverflow: hidden;\n\tbox-sizing: border-box;\n}\n.ui-popup-arrow-container.ie .ui-popup-arrow {\n\t-ms-filter: \"progid:DXImageTransform.Microsoft.Matrix(M11=0.7071067811865474, M12=-0.7071067811865477, M21=0.7071067811865477, M22=0.7071067811865474, SizingMethod='auto expand')\";\n\tfilter: progid:DXImageTransform.Microsoft.Matrix(\n\t      \tM11=0.7071067811865474,\n        \tM12=-0.7071067811865477,\n        \tM21=0.7071067811865477,\n        \tM22=0.7071067811865474,\n        \tSizingMethod='auto expand');\n}\n.ui-checkbox,\n.ui-radio {\n\tmargin: .5em 0;\n\tposition: relative;\n}\n.ui-checkbox .ui-btn,\n.ui-radio .ui-btn {\n\tmargin: 0;\n\ttext-align: left;\n\twhite-space: normal; /* Nowrap + ellipsis doesn't work on label. Issue #1419. */\n\tz-index: 2;\n}\n.ui-controlgroup .ui-checkbox .ui-btn.ui-focus,\n.ui-controlgroup .ui-radio .ui-btn.ui-focus {\n\tz-index: 3;\n}\n.ui-checkbox .ui-btn-icon-top,\n.ui-radio .ui-btn-icon-top,\n.ui-checkbox .ui-btn-icon-bottom,\n.ui-radio .ui-btn-icon-bottom {\n\ttext-align: center;\n}\n.ui-controlgroup-horizontal .ui-checkbox .ui-btn:after,\n.ui-controlgroup-horizontal .ui-radio .ui-btn:after {\n\tcontent: none;\n\tdisplay: none;\n}\n/* Native input positioning */\n.ui-checkbox input,\n.ui-radio input {\n\tposition: absolute;\n\tleft: .466em;\n\ttop: 50%;\n\twidth: 22px;\n\theight: 22px;\n\tmargin: -11px 0 0 0;\n\toutline: 0 !important;\n\tz-index: 1;\n}\n.ui-controlgroup-horizontal .ui-checkbox input,\n.ui-controlgroup-horizontal .ui-radio input {\n\tleft: 50%;\n\tmargin-left: -9px;\n}\n.ui-checkbox input:disabled,\n.ui-radio input:disabled {\n\tposition: absolute !important;\n\theight: 1px;\n\twidth: 1px;\n\toverflow: hidden;\n\tclip: rect(1px,1px,1px,1px);\n}\n.ui-select {\n\tmargin-top: .5em;\n\tmargin-bottom: .5em; /* no shorthand for margin because it would override margin-right for inline selects */\n\tposition: relative;\n}\n.ui-select > select {\n\tposition: absolute !important;\n\theight: 1px;\n\twidth: 1px;\n\toverflow: hidden;\n\tclip: rect(1px,1px,1px,1px);\n}\n.ui-select .ui-btn {\n\tmargin: 0;\n\topacity: 1; /* Fixes #2588: When Windows Phone 7.5 (Mango) tries to calculate a numeric opacity for a select (including \"inherit\") without explicitly specifying an opacity on the parent to give it context, a bug appears where clicking elsewhere on the page after opening the select will open the select again. */\n}\n.ui-select .ui-btn select {\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n\twidth: 100%;\n\tmin-height: 1.5em;\n\tmin-height: 100%;\n\theight: 3em;\n\tmax-height: 100%;\n\toutline: 0;\n\t-webkit-border-radius: inherit;\n\tborder-radius: inherit;\t\n\t-webkit-appearance: none;\n\t-moz-appearance: none;\n\tcursor: pointer;\n\tfilter: Alpha(Opacity=0);\n\topacity: 0;\n\tz-index: 2;\n}\n@-moz-document url-prefix() {\n\t.ui-select .ui-btn select {\n\t\topacity: 0.0001;\n\t}\n}\n/* Display none because of issues with IE/WP's filter alpha opacity */\n.ui-select .ui-state-disabled select {\n\tdisplay: none;\n}\n/* Because we add all classes of the select and option elements to the span... */ \n.ui-select span.ui-state-disabled {\n\tfilter: Alpha(Opacity=100);\n\topacity: 1;\n}\n.ui-select .ui-btn.ui-select-nativeonly {\n\tborder-radius: 0;\n\tborder: 0;\n}\n.ui-select .ui-btn.ui-select-nativeonly select {\n\topacity: 1;\n\ttext-indent: 0;\n\tdisplay: block;\n}\n/* ui-li-count is styled in the listview CSS. We set padding and offset here because select supports icon position while listview doesn't. */\n.ui-select .ui-li-has-count.ui-btn {\n\tpadding-right: 2.8125em;\n}\n.ui-select .ui-li-has-count.ui-btn-icon-right {\n\tpadding-right: 4.6875em;\n}\n.ui-select .ui-btn-icon-right .ui-li-count {\n\tright: 3.2em;\n}\n/* We set the rules for the span as well to fix an issue on Chrome with text-overflow ellipsis for the button in combination with text-align center. */\n.ui-select .ui-btn > span:not(.ui-li-count) {\n\tdisplay: block;\n\ttext-overflow: ellipsis;\n\toverflow: hidden !important;\n\twhite-space: nowrap;\n}\n.ui-selectmenu.ui-popup {\n\tmin-width: 11em;\n}\n.ui-selectmenu .ui-dialog-contain {\n\toverflow: hidden;\n}\n.ui-selectmenu .ui-header {\n\tmargin: 0;\n\tpadding: 0;\n\tborder-width: 0;\n}\n.ui-selectmenu.ui-dialog .ui-header {\n\tz-index: 1;\n\tposition: relative;\n}\n.ui-selectmenu.ui-popup .ui-header {\n\t-webkit-border-bottom-right-radius: 0;\n\tborder-bottom-right-radius: 0;\n\t-webkit-border-bottom-left-radius: 0;\n\tborder-bottom-left-radius: 0;\n}\n/* when no placeholder is defined in a multiple select, the header height doesn't even extend past the close button.  this shim's content in there */\n.ui-selectmenu.ui-popup .ui-header h1:after {\n\tcontent: '.';\n\tvisibility: hidden;\n}\n.ui-selectmenu .ui-header .ui-title {\n\tmargin: 0 2.875em;\n}\n.ui-selectmenu.ui-dialog .ui-content {\n\toverflow: visible;\n\tz-index: 1;\n}\n.ui-selectmenu .ui-selectmenu-list {\n\tmargin: 0;\n\t-webkit-border-radius: inherit;\n\tborder-radius: inherit;\t\n}\n.ui-header:not(.ui-screen-hidden) + .ui-selectmenu-list {\n\t-webkit-border-top-right-radius: 0;\n\tborder-top-right-radius: 0;\n\t-webkit-border-top-left-radius: 0;\n\tborder-top-left-radius: 0;\n}\n.ui-header.ui-screen-hidden + .ui-selectmenu-list li.ui-first-child .ui-btn {\n\tborder-top-width: 0;\n}\n.ui-selectmenu .ui-selectmenu-list li.ui-last-child .ui-btn {\n\tborder-bottom-width: 0;\n}\n.ui-selectmenu .ui-btn.ui-li-divider {\n\tcursor: default;\n}\n.ui-selectmenu .ui-selectmenu-placeholder {\n\tdisplay: none;\n}\n.ui-listview,\n.ui-listview > li {\n\tmargin: 0;\n\tpadding: 0;\n\tlist-style: none;\n}\n.ui-content .ui-listview,\n.ui-panel-inner > .ui-listview {\n\tmargin: -1em;\n}\n.ui-content .ui-listview-inset,\n.ui-panel-inner > .ui-listview-inset {\n\tmargin: 1em 0;\n}\n.ui-collapsible-content > .ui-listview {\n\tmargin: -.5em -1em;\n}\n.ui-collapsible-content > .ui-listview-inset {\n\tmargin: .5em 0;\n}\n.ui-listview > li {\n\tdisplay: block;\n\tposition: relative;\n\toverflow: visible;\n}\n.ui-listview > .ui-li-static,\n.ui-listview > .ui-li-divider,\n.ui-listview > li > a.ui-btn {\n\tmargin: 0;\n\tdisplay: block;\n\tposition: relative;\n\ttext-align: left;\n\ttext-overflow: ellipsis;\n\toverflow: hidden;\n\twhite-space: nowrap;\n}\n.ui-listview > li > .ui-btn:focus {\n\tz-index: 1;\n}\n.ui-listview > .ui-li-static,\n.ui-listview > .ui-li-divider,\n.ui-listview > li > a.ui-btn {\n\tborder-width: 1px 0 0 0;\n\tborder-style: solid;\n}\n.ui-listview-inset > .ui-li-static,\n.ui-listview-inset > .ui-li-divider,\n.ui-listview-inset > li > a.ui-btn {\n\tborder-right-width: 1px;\n\tborder-left-width: 1px;\n}\n.ui-listview > .ui-li-static.ui-last-child,\n.ui-listview > .ui-li-divider.ui-last-child,\n.ui-listview > li.ui-last-child > a.ui-btn {\n\tborder-bottom-width: 1px;\n}\n.ui-collapsible-content > .ui-listview:not(.ui-listview-inset) > li.ui-first-child,\n.ui-collapsible-content > .ui-listview:not(.ui-listview-inset) > li.ui-first-child > a.ui-btn {\n\tborder-top-width: 0;\n}\n.ui-collapsible-themed-content .ui-listview:not(.ui-listview-inset) > li.ui-last-child,\n.ui-collapsible-themed-content .ui-listview:not(.ui-listview-inset) > li.ui-last-child > a.ui-btn {\n\tborder-bottom-width: 0;\n}\n.ui-listview > li.ui-first-child,\n.ui-listview > li.ui-first-child > a.ui-btn {\n\t-webkit-border-top-right-radius: inherit;\t\n\tborder-top-right-radius: inherit;\n\t-webkit-border-top-left-radius: inherit;\n\tborder-top-left-radius: inherit;\n}\n.ui-listview > li.ui-last-child,\n.ui-listview > li.ui-last-child > a.ui-btn {\n\t-webkit-border-bottom-right-radius: inherit;\n\tborder-bottom-right-radius: inherit;\n\t-webkit-border-bottom-left-radius: inherit;\n\tborder-bottom-left-radius: inherit;\n}\n.ui-listview > li.ui-li-has-alt > a.ui-btn {\n\t-webkit-border-top-right-radius: 0;\n\tborder-top-right-radius: 0;\n\t-webkit-border-bottom-right-radius: 0;\n\tborder-bottom-right-radius: 0;\n}\n.ui-listview > li.ui-first-child > a.ui-btn + a.ui-btn {\n\t-webkit-border-top-left-radius: 0;\t\n\tborder-top-left-radius: 0;\n\t-webkit-border-top-right-radius: inherit;\n\tborder-top-right-radius: inherit;\n}\n.ui-listview > li.ui-last-child > a.ui-btn + a.ui-btn {\n\t-webkit-border-bottom-left-radius: 0;\n\tborder-bottom-left-radius: 0;\n\t-webkit-border-bottom-right-radius: inherit;\n\tborder-bottom-right-radius: inherit;\n}\n.ui-listview > li.ui-first-child img:first-child:not(.ui-li-icon) {\n\t-webkit-border-top-left-radius: inherit;\n\tborder-top-left-radius: inherit;\t\n}\n.ui-listview > li.ui-last-child img:first-child:not(.ui-li-icon) {\n\t-webkit-border-bottom-left-radius: inherit;\n\tborder-bottom-left-radius: inherit;\t\n}\n.ui-collapsible-content > .ui-listview:not(.ui-listview-inset) {\n\t-webkit-border-radius: inherit;\n\tborder-radius: inherit;\t\n}\n.ui-listview > .ui-li-static {\n\tpadding: .7em 1em;\n}\n.ui-listview > .ui-li-divider {\n\tpadding: .5em 1.143em;\n\tfont-size: 14px;\n\tfont-weight: bold;\n\tcursor: default;\n\toutline: 0; /* Dividers in custom selectmenus have tabindex */\n}\n.ui-listview > .ui-li-has-count > .ui-btn,\n.ui-listview > .ui-li-static.ui-li-has-count,\n.ui-listview > .ui-li-divider.ui-li-has-count {\n\tpadding-right: 2.8125em;\n}\n.ui-listview > .ui-li-has-count > .ui-btn-icon-right {\n\tpadding-right: 4.6875em;\n}\n.ui-listview > .ui-li-has-thumb > .ui-btn,\n.ui-listview > .ui-li-static.ui-li-has-thumb {\n\tmin-height: 3.625em;\n\tpadding-left: 6.25em;\n}\n/* ui-li-has-icon deprecated in 1.4. TODO: remove in 1.5 */\n.ui-listview > .ui-li-has-icon > .ui-btn,\n.ui-listview > .ui-li-static.ui-li-has-icon {\n\tmin-height: 1.25em;\n\tpadding-left: 2.5em;\n}\n/* Used by both listview and custom multiple select button */\n.ui-li-count {\n\tposition: absolute;\n\tfont-size: 12.5px;\n\tfont-weight: bold;\n\ttext-align: center;\n\tborder-width: 1px;\n\tborder-style: solid;\n\tpadding: 0 .48em;\n\tline-height: 1.6em;\n\tmin-height: 1.6em;\n\tmin-width: .64em;\n\tright: .8em;\n\ttop: 50%;\n\tmargin-top: -.88em;\n}\n.ui-listview .ui-btn-icon-right .ui-li-count {\n\tright: 3.2em;\n}\n.ui-listview .ui-li-has-thumb > img:first-child,\n.ui-listview .ui-li-has-thumb > .ui-btn > img:first-child,\n.ui-listview .ui-li-has-thumb .ui-li-thumb {\n\tposition: absolute;\n\tleft: 0;\n\ttop: 0;\n\tmax-height: 5em;\n\tmax-width: 5em;\n}\n/* ui-li-has-icon deprecated in 1.4. TODO: remove in 1.5 */\n.ui-listview > .ui-li-has-icon > img:first-child,\n.ui-listview > .ui-li-has-icon > .ui-btn > img:first-child {\n\tposition: absolute;\n\tleft: .625em;\n\ttop: .9em;\n\tmax-height: 1em;\n\tmax-width: 1em;\n}\n.ui-listview > li h1,\n.ui-listview > li h2,\n.ui-listview > li h3,\n.ui-listview > li h4,\n.ui-listview > li h5,\n.ui-listview > li h6 {\n\tfont-size: 1em;\n\tfont-weight: bold;\n\tdisplay: block;\n\tmargin: .45em 0;\n\ttext-overflow: ellipsis;\n\toverflow: hidden;\n\twhite-space: nowrap;\n}\n.ui-listview > li p {\n\tfont-size: .75em;\n\tfont-weight: normal;\n\tdisplay: block;\n\tmargin: .6em 0;\n\ttext-overflow: ellipsis;\n\toverflow: hidden;\n\twhite-space: nowrap;\n}\n.ui-listview .ui-li-aside {\n\tposition: absolute;\n\ttop: 1em;\n\tright: 3.333em;\n\tmargin: 0;\n\ttext-align: right;\n}\n.ui-listview > li.ui-li-has-alt > .ui-btn {\n\tmargin-right: 2.5em;\n\tborder-right-width: 0;\n}\n.ui-listview > li.ui-li-has-alt > .ui-btn + .ui-btn {\n\tposition: absolute;\n\twidth: 2.5em;\n\theight: 100%;\n\tmin-height: auto;\n\t-webkit-box-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\tbox-sizing: border-box;\n\tborder-left-width: 1px;\n\ttop: 0;\n\tright: 0;\n\tmargin: 0;\n\tpadding: 0;\n\tz-index: 2;\n}\n.ui-listview-inset > li.ui-li-has-alt > .ui-btn + .ui-btn {\n\tborder-right-width: 1px;\n}\n.ui-listview > li.ui-li-has-alt > .ui-btn + .ui-btn:focus {\n\tz-index: 3;\n}\nol.ui-listview,\nol.ui-listview > .ui-li-divider {\n\tcounter-reset: listnumbering;\n}\nol.ui-listview > li > .ui-btn,\nol.ui-listview > li.ui-li-static {\n\tvertical-align: middle;\n}\nol.ui-listview > li > .ui-btn:first-child:before,\nol.ui-listview > li.ui-li-static:before,\nol.ui-listview > li.ui-field-contain > label:before,\nol.ui-listview > li.ui-field-contain > .ui-controlgroup-label:before {\n\tdisplay: inline-block;\n\tfont-size: .9em;\n\tfont-weight: normal;\n\tpadding-right: .3em;\n\tmin-width: 1.4em;\n\tline-height: 1.5;\n\tvertical-align: middle;\n\tcounter-increment: listnumbering;\n\tcontent: counter(listnumbering) \".\";\n}\nol.ui-listview > li.ui-field-contain:before {\n\tcontent: none;\n\tdisplay: none;\n}\nol.ui-listview > li h1:first-child,\nol.ui-listview > li h2:first-child,\nol.ui-listview > li h3:first-child,\nol.ui-listview > li h4:first-child,\nol.ui-listview > li h5:first-child,\nol.ui-listview > li h6:first-child,\nol.ui-listview > li p:first-child,\nol.ui-listview > li img:first-child + * {\n\tdisplay: inline-block;\n\tvertical-align: middle;\n}\nol.ui-listview > li h1:first-child ~ *,\nol.ui-listview > li h2:first-child ~ *,\nol.ui-listview > li h3:first-child ~ *,\nol.ui-listview > li h4:first-child ~ *,\nol.ui-listview > li h5:first-child ~ *,\nol.ui-listview > li h6:first-child ~ *,\nol.ui-listview > li p:first-child ~ *,\nol.ui-listview > li img:first-child + * ~ * {\n\tmargin-top: 0;\n\ttext-indent: 2.04em; /* (1.4em + .3em) * .9em / .75em */\n}\nhtml .ui-filterable + .ui-listview,\nhtml .ui-filterable.ui-listview {\n\tmargin-top: .5em;\n}\n.ui-collapsible-content > form.ui-filterable {\n\tmargin-top: -.5em;\n}\n.ui-collapsible-content > .ui-input-search.ui-filterable {\n\tmargin-top: 0;\n}\n.ui-collapsible-content > .ui-filterable + .ui-listview:not(.ui-listview-inset) > li.ui-first-child,\n.ui-collapsible-content > .ui-filterable + .ui-listview:not(.ui-listview-inset) > li.ui-first-child > a.ui-btn,\n.ui-collapsible-content > .ui-filterable.ui-listview:not(.ui-listview-inset) > li.ui-first-child,\n.ui-collapsible-content > .ui-filterable.ui-listview:not(.ui-listview-inset) > li.ui-first-child > a.ui-btn {\n\tborder-top-width: 1px;\n}\ndiv.ui-slider {\n\theight: 30px;\n\tmargin: .5em 0;\n\tpadding: 0;\n\t-ms-touch-action: pan-y pinch-zoom double-tap-zoom;\n}\ndiv.ui-slider:before,\ndiv.ui-slider:after {\n\tcontent: \"\";\n\tdisplay: table;\n}\ndiv.ui-slider:after {\n\tclear: both;\n}\ninput.ui-slider-input {\n\tdisplay: block;\n\tfloat: left;\n\tfont-size: 14px;\n\tfont-weight: bold;\n\tmargin: 0;\n\tpadding: 4px;\n\twidth: 40px;\n\theight: 20px;\n\tline-height: 20px;\n\tborder-width: 1px;\n\tborder-style: solid;\n\toutline: 0;\n\ttext-align: center;\n\tvertical-align: text-bottom;\n\t-webkit-appearance: none;\n\t-moz-appearance: none;\n\tappearance: none;\n\t-webkit-box-sizing: content-box;\n\t-moz-box-sizing: content-box;\n\tbox-sizing: content-box;\n}\n.ui-slider-input::-webkit-outer-spin-button,\n.ui-slider-input::-webkit-inner-spin-button {\n\t-webkit-appearance: none;\n\tmargin: 0;\n}\n.ui-slider-track {\n\tposition: relative;\n\toverflow: visible;\n\tborder-width: 1px;\n\tborder-style: solid;\n\theight: 15px;\n\tmargin: 0 15px 0 68px;\n\ttop: 6px;\n}\n.ui-slider-track.ui-mini {\n\theight: 12px;\n\ttop: 8px;\n}\n.ui-slider-track .ui-slider-bg {\n\theight: 100%;\n}\n/* High level of specificity to override button margins in grids */\n.ui-slider-track .ui-btn.ui-slider-handle {\n\tposition: absolute;\n\tz-index: 1;\n\ttop: 50%;\n\twidth: 28px;\n\theight: 28px;\n\tmargin: -15px 0 0 -15px;\n\toutline: 0;\n\tpadding: 0;\n}\n.ui-slider-track.ui-mini .ui-slider-handle {\n\theight: 14px;\n\twidth: 14px;\n\tmargin: -8px 0 0 -8px;\n}\nselect.ui-slider-switch {\n\tposition: absolute !important;\n\theight: 1px;\n\twidth: 1px;\n\toverflow: hidden;\n\tclip: rect(1px,1px,1px,1px);\n}\ndiv.ui-slider-switch {\n\tdisplay: inline-block;\n\theight: 32px;\n\twidth: 5.8em;\n\ttop: 0;\n}\n/* reset the clearfix */\ndiv.ui-slider-switch:before,\ndiv.ui-slider-switch:after {\n\tdisplay: none;\n\tclear: none;\n}\ndiv.ui-slider-switch.ui-mini {\n\theight: 29px;\n\ttop: 0;\n}\n.ui-slider-inneroffset {\n\tmargin: 0 16px;\n\tposition: relative;\n\tz-index: 1;\n}\n.ui-slider-switch.ui-mini .ui-slider-inneroffset {\n\tmargin: 0 15px 0 14px;\n}\n.ui-slider-switch .ui-btn.ui-slider-handle {\n\tmargin: 1px 0 0 -15px;\n}\n.ui-slider-switch.ui-mini .ui-slider-handle {\n\twidth: 25px;\n\theight: 25px;\n\tmargin: 1px 0 0 -13px;\n\tpadding: 0;\n}\n.ui-slider-handle-snapping {\n\t-webkit-transition: left 70ms linear;\n\t-moz-transition: left 70ms linear;\n\ttransition: left 70ms linear;\n}\n.ui-slider-switch .ui-slider-label {\n\tposition: absolute;\n\ttext-align: center;\n\twidth: 100%;\n\toverflow: hidden;\n\tfont-size: 16px;\n\ttop: 0;\n\tline-height: 2;\n\tmin-height: 100%;\n\twhite-space: nowrap;\n\tcursor: pointer;\n}\n.ui-slider-switch.ui-mini .ui-slider-label {\n\tfont-size: 14px;\n}\n.ui-slider-switch .ui-slider-label-a {\n\tz-index: 1;\n\tleft: 0;\n\ttext-indent: -1.5em;\n}\n.ui-slider-switch .ui-slider-label-b {\n\tz-index: 0;\n\tright: 0;\n\ttext-indent: 1.5em;\n}\n/* The corner radii for ui-slider-switch/track can be specified in theme CSS. The bg and handle inherits. */\n.ui-slider-track .ui-slider-bg,\n.ui-slider-switch .ui-slider-label,\n.ui-slider-switch .ui-slider-inneroffset,\n.ui-slider-handle {\n\t-webkit-border-radius: inherit;\n\tborder-radius: inherit;\n}\n.ui-field-contain div.ui-slider-switch {\n\tmargin: 0;\n}\n/* ui-hide-label deprecated in 1.4. TODO: Remove in 1.5 */\n.ui-field-contain div.ui-slider-switch,\n.ui-field-contain.ui-hide-label div.ui-slider-switch,\nhtml .ui-popup .ui-field-contain div.ui-slider-switch {\n\tdisplay: inline-block;\n\twidth: 5.8em;\n}\n/* slider tooltip\n-----------------------------------------------------------------------------------------------------------*/\n.ui-slider-popup {\n\twidth: 64px;\n\theight: 64px;\n\tfont-size: 36px;\n\tpadding-top: 14px;\n\topacity: 0.8;\n}\n.ui-slider-popup {\n\tposition: absolute !important;\n\ttext-align: center;\n\tz-index: 100;\n}\n.ui-slider-track .ui-btn.ui-slider-handle {\n\tfont-size: .9em;\n\tline-height: 30px;\n}\n.ui-rangeslider {\n\tmargin: .5em 0;\n}\n.ui-rangeslider:before,\n.ui-rangeslider:after {\n\tcontent: \"\";\n\tdisplay: table;\n}\n.ui-rangeslider:after {\n\tclear: both;\n}\n.ui-rangeslider .ui-slider-input.ui-rangeslider-last {\n\tfloat: right;\n}\n.ui-rangeslider .ui-rangeslider-sliders {\n\tposition: relative;\n\toverflow: visible;\n\theight: 30px;\n\tmargin: 0 68px;\n}\n.ui-rangeslider .ui-rangeslider-sliders .ui-slider-track {\n\tposition: absolute;\n\ttop: 6px;\n\tright: 0;\n\tleft: 0;\n\tmargin: 0;\n}\n.ui-rangeslider.ui-mini .ui-rangeslider-sliders .ui-slider-track {\n\ttop: 8px;\n}\n.ui-rangeslider .ui-slider-track:first-child .ui-slider-bg {\n\tdisplay: none;\n}\n.ui-rangeslider .ui-rangeslider-sliders .ui-slider-track:first-child {\n\tbackground-color: transparent;\n\tbackground: none;\n\tborder-width: 0;\n\theight: 0;\n}\n/* this makes ie6 and ie7 set height to 0 to fix z-index problem */\nhtml >/**/body .ui-rangeslider .ui-rangeslider-sliders .ui-slider-track:first-child {\n\theight: 15px;\n\tborder-width: 1px;\n}\nhtml >/**/body .ui-rangeslider.ui-mini .ui-rangeslider-sliders .ui-slider-track:first-child {\n\theight: 12px;\n}\n/* Hide the second label (the first is moved outside the div) */\ndiv.ui-rangeslider label {\n\tposition: absolute !important;\n\theight: 1px;\n\twidth: 1px;\n\toverflow: hidden;\n\tclip: rect(1px,1px,1px,1px);\n}\n.ui-field-contain .ui-rangeslider input.ui-slider-input,\n.ui-field-contain .ui-rangeslider.ui-mini input.ui-slider-input,\n.ui-field-contain .ui-rangeslider .ui-rangeslider-sliders,\n.ui-field-contain .ui-rangeslider.ui-mini .ui-rangeslider-sliders {\n\tmargin-top: 0;\n\tmargin-bottom: 0;\n}\n.ui-input-text,\n.ui-input-search {\n\tmargin: .5em 0;\n\tborder-width: 1px;\n\tborder-style: solid;\n}\n.ui-mini {\n\tmargin: .446em;\n}\n.ui-input-text input,\n.ui-input-search input,\ntextarea.ui-input-text {\n\tpadding: .4em;\n\tline-height: 1.4em;\n\tdisplay: block;\n\twidth: 100%;\n\t-webkit-box-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\tbox-sizing: border-box;\n\toutline: 0;\n}\n.ui-input-text input,\n.ui-input-search input {\n\tmargin: 0;\n\tmin-height: 2.2em;\n\ttext-align: left; /* Opera aligns type=\"date\" right by default */\n\tborder: 0;\n\tbackground: transparent none;\n\t-webkit-appearance: none;\n\t-webkit-border-radius: inherit;\n\tborder-radius: inherit;\n}\ntextarea.ui-input-text {\n\toverflow: auto;\n\tresize: vertical;\n}\n.ui-mini .ui-input-text input,\n.ui-mini .ui-input-search input,\n.ui-input-text.ui-mini input,\n.ui-input-search.ui-mini input,\n.ui-mini textarea.ui-input-text,\ntextarea.ui-mini {\n\tfont-size: 14px;\n}\n/* Same margin for mini textareas as other mini sized widgets (12.5/14 * 0.5em) */\n.ui-mini textarea.ui-input-text,\ntextarea.ui-mini {\n\tmargin: .446em 0;\n}\n.ui-input-has-clear,\n.ui-input-search {\n\tposition: relative;\n}\n/* Padding on the div instead of input because of browser spinners etc. */\n.ui-input-has-clear {\n\tpadding-right: 2.375em;\n}\n.ui-mini.ui-input-has-clear {\n\tpadding-right: 2.923em;\n}\n.ui-input-has-clear input {\n\tpadding-right: 0;\n\t/* Autofill on Chrome has bg color so we unset corners right as well. */\n\t-webkit-border-top-right-radius: 0;\n\tborder-top-right-radius: 0;\n\t-webkit-border-bottom-right-radius: 0;\n\tborder-bottom-right-radius: 0;\n}\n/* Search icon */\n.ui-input-search input {\n\tpadding-left: 1.75em;\n}\n.ui-input-search:after {\n\tposition: absolute;\n\tleft: .3125em;\n\ttop: 50%;\n\tmargin-top: -7px;\n\tcontent: \"\";\n\tbackground-position: center center;\n\tbackground-repeat: no-repeat;\n\twidth: 14px;\n\theight: 14px;\n\tfilter: Alpha(Opacity=50);\n\topacity: .5;\n}\n.ui-input-search.ui-input-has-clear .ui-btn.ui-input-clear,\n.ui-input-text.ui-input-has-clear .ui-btn.ui-input-clear {\n\tposition: absolute;\n\tright: 0;\n\ttop: 50%;\n\tmargin: -14px .3125em 0;\n\tborder: 0;\n\tbackground-color: transparent;\n}\n.ui-input-search .ui-input-clear-hidden,\n.ui-input-text .ui-input-clear-hidden {\n\tdisplay: none;\n}\n/* Resolves issue #5166: Added to support issue introduced in Firefox 15. We can likely remove this in the future. */\n.ui-input-text input::-moz-placeholder,\n.ui-input-search input::-moz-placeholder,\ntextarea.ui-input-text::-moz-placeholder {\n\tcolor: #aaa;\n}\n/* Same for IE10 */\n.ui-input-text input:-ms-input-placeholder,\n.ui-input-search input:-ms-input-placeholder,\ntextarea.ui-input-text:-ms-input-placeholder {\n\tcolor: #aaa;\n}\n/* Resolves issue #5131: Width of textinput depends on its type,\nfor Android 4.1 */\n.ui-input-text input[type=number]::-webkit-outer-spin-button {\n\tmargin: 0;\n}\n/* Resolves issue #5756: Textinput in IE10 has a default clear button */\n.ui-input-text input::-ms-clear,\n.ui-input-search input::-ms-clear {\n\tdisplay: none;\n}\n.ui-input-text input:focus,\n.ui-input-search input:focus {\n\t-webkit-box-shadow: none;\n\t-moz-box-shadow: none;\n\tbox-shadow: none;\n}\ntextarea.ui-input-text.ui-textinput-autogrow {\n\toverflow: hidden;\n}\n.ui-textinput-autogrow-resize {\n\t-webkit-transition: height 0.25s;\n\t-o-transition: height 0.25s;\n\t-moz-transition: height 0.25s;\n\ttransition: height 0.25s;\n}\n.ui-flipswitch {\n\tdisplay: inline-block;\n\tvertical-align: middle;\n\twidth: 5.875em; /* Override this and padding-left in next rule if you use labels other than \"on/off\" and need more space */\n\theight: 1.875em;\n\tborder-width: 1px;\n\tborder-style: solid;\n\tmargin: .5em 0;\n\toverflow: hidden;\n\t-webkit-transition-property: padding, width, background-color, color, border-color;\n\t-moz-transition-property: padding, width, background-color, color, border-color;\n\t-o-transition-property: padding, width, background-color, color, border-color;\n\ttransition-property: padding, width, background-color, color, border-color;\n\t-webkit-transition-duration: 100ms;\n\t-moz-transition-duration: 100ms;\n\t-o-transition-duration: 100ms;\n\ttransition-duration: 100ms;\n\t-webkit-touch-callout: none;\n\t-webkit-user-select: none;\n\t-moz-user-select: none;\n\t-ms-user-select: none;\n\tuser-select: none;\n\tcursor: pointer;\n}\n.ui-flipswitch.ui-flipswitch-active {\n\tpadding-left: 4em;  /* Override this and width in previous rule if you use labels other than \"on/off\" and need more space */\n\twidth: 1.875em;\n}\n.ui-flipswitch-input {\n\tposition: absolute;\n\theight: 1px;\n\twidth: 1px;\n\tmargin: -1px;\n\toverflow: hidden;\n\tclip: rect(1px,1px,1px,1px);\n\tborder: 0;\n\toutline: 0;\n\tfilter: Alpha(Opacity=0);\n\topacity: 0;\n}\n.ui-flipswitch .ui-btn.ui-flipswitch-on,\n.ui-flipswitch .ui-flipswitch-off {\n\tfloat: left;\n\theight: 1.75em;\n\tmargin: .0625em;\n\tline-height: 1.65em;\n}\n.ui-flipswitch .ui-btn.ui-flipswitch-on {\n\twidth: 1.75em;\n\tpadding: 0;\n\ttext-indent: -2.6em; /* Override this to center text if you use a label other than \"on\" */\n\ttext-align: left;\n\tborder-width: 1px;\n\tborder-style: solid;\n\t-webkit-box-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\tbox-sizing: border-box;\n\tborder-radius: inherit;\n\toverflow: visible;\n\tcolor: inherit;\n\ttext-shadow: inherit;\n}\n.ui-flipswitch .ui-flipswitch-off {\n\tpadding: 1px;\n\ttext-indent: 1em; /* Override this to center text if you use a label other than \"off\" */\n}\n/* Override field container CSS to prevent the flipswitch from becomming full width */\nhtml .ui-field-contain > label + .ui-flipswitch,\nhtml .ui-popup .ui-field-contain > label + .ui-flipswitch {\n\tdisplay: inline-block;\n\twidth: 5.875em; /* If you override the width for .ui-flipswitch you should repeat the same value here */\n\t-webkit-box-sizing: content-box;\n\t-moz-box-sizing: content-box;\n\tbox-sizing: content-box;\n}\n.ui-field-contain .ui-flipswitch.ui-flipswitch-active,\n.ui-popup .ui-field-contain .ui-flipswitch.ui-flipswitch-active {\n\twidth: 1.875em;\n}\n.ui-table {\n\tborder: 0;\n\tborder-collapse: collapse;\n\tpadding: 0;\n\twidth: 100%;\n}\n.ui-table th,\n.ui-table td {\n\tline-height: 1.5em;\n\ttext-align: left;\n\tpadding: .4em .5em;\n\tvertical-align:top;\n}\n.ui-table th .ui-btn,\n.ui-table td .ui-btn {\n\tline-height: normal;\n}\n.ui-table th {\n\tfont-weight: bold;\n}\n.ui-table caption {\n\ttext-align: left;\n\tmargin-bottom: 1.4em;\n\topacity: .5;\n}\n/*\n Styles for the table columntoggle mode\n*/\n.ui-table-columntoggle-btn {\n\tfloat: right;\n\tmargin-bottom: .8em;\n}\n/* Remove top/bottom margins around the fieldcontain on check list */\n.ui-table-columntoggle-popup fieldset {\n\tmargin:0;\n}\n.ui-table-columntoggle {\n\tclear: both;\n}\n/* Hide all prioritized columns by default */\n@media only all {\n\tth.ui-table-priority-6,\n\ttd.ui-table-priority-6,\n\tth.ui-table-priority-5,\n\ttd.ui-table-priority-5,\n\tth.ui-table-priority-4,\n\ttd.ui-table-priority-4,\n\tth.ui-table-priority-3,\n\ttd.ui-table-priority-3,\n\tth.ui-table-priority-2,\n\ttd.ui-table-priority-2,\n\tth.ui-table-priority-1,\n\ttd.ui-table-priority-1 {\n\t\tdisplay: none;\n\t}\n}\n/* Preset breakpoints if \".ui-responsive\" class added to table */\n/* Show priority 1 at 320px (20em x 16px) */\n@media screen and (min-width: 20em) {\n\t.ui-table-columntoggle.ui-responsive th.ui-table-priority-1,\n\t.ui-table-columntoggle.ui-responsive td.ui-table-priority-1 {\n\t\tdisplay: table-cell;\n\t}\n}\n/* Show priority 2 at 480px (30em x 16px) */\n@media screen and (min-width: 30em) {\n\t.ui-table-columntoggle.ui-responsive th.ui-table-priority-2,\n\t.ui-table-columntoggle.ui-responsive td.ui-table-priority-2 {\n\t\tdisplay: table-cell;\n\t}\n}\n/* Show priority 3 at 640px (40em x 16px) */\n@media screen and (min-width: 40em) {\n\t.ui-table-columntoggle.ui-responsive th.ui-table-priority-3,\n\t.ui-table-columntoggle.ui-responsive td.ui-table-priority-3 {\n\t\tdisplay: table-cell;\n\t}\n}\n/* Show priority 4 at 800px (50em x 16px) */\n@media screen and (min-width: 50em) {\n\t.ui-table-columntoggle.ui-responsive th.ui-table-priority-4,\n\t.ui-table-columntoggle.ui-responsive td.ui-table-priority-4 {\n\t\tdisplay: table-cell;\n\t}\n}\n/* Show priority 5 at 960px (60em x 16px) */\n@media screen and (min-width: 60em) {\n\t.ui-table-columntoggle.ui-responsive th.ui-table-priority-5,\n\t.ui-table-columntoggle.ui-responsive td.ui-table-priority-5 {\n\t\tdisplay: table-cell;\n\t}\n}\n/* Show priority 6 at 1,120px (70em x 16px) */\n@media screen and (min-width: 70em) {\n\t.ui-table-columntoggle.ui-responsive th.ui-table-priority-6,\n\t.ui-table-columntoggle.ui-responsive td.ui-table-priority-6 {\n\t\tdisplay: table-cell;\n\t}\n}\n/* Unchecked manually: Always hide */\n.ui-table-columntoggle th.ui-table-cell-hidden,\n.ui-table-columntoggle td.ui-table-cell-hidden,\n.ui-table-columntoggle.ui-responsive th.ui-table-cell-hidden,\n.ui-table-columntoggle.ui-responsive td.ui-table-cell-hidden {\n\tdisplay: none;\n}\n/* Checked manually: Always show */\n.ui-table-columntoggle th.ui-table-cell-visible,\n.ui-table-columntoggle td.ui-table-cell-visible,\n.ui-table-columntoggle.ui-responsive th.ui-table-cell-visible,\n.ui-table-columntoggle.ui-responsive td.ui-table-cell-visible {\n\tdisplay: table-cell;\n}\n/*\n Styles for the table columntoggle mode\n*/\n.ui-table-reflow td .ui-table-cell-label,\n.ui-table-reflow th .ui-table-cell-label { \n\tdisplay: none;\n}\n/* Mobile first styles: Begin with the stacked presentation at narrow widths */ \n@media only all {\n\t/* Hide the table headers */ \n\t.ui-table-reflow thead td, \n\t.ui-table-reflow thead th {\n\t\tdisplay: none;\n\t}\n\t/* Show the table cells as a block level element */ \n\t.ui-table-reflow td,\n\t.ui-table-reflow th { \n\t\ttext-align: left;\n\t\tdisplay: block;\n\t}\n\t/* Add a fair amount of top margin to visually separate each row when stacked */  \n\t.ui-table-reflow tbody th {\n\t\tmargin-top: 3em;\n\t}\n\t/* Make the label elements a percentage width */ \n\t.ui-table-reflow td .ui-table-cell-label,\n\t.ui-table-reflow th .ui-table-cell-label { \n\t\tpadding: .4em; \n\t\tmin-width: 30%; \n\t\tdisplay: inline-block;\n\t\tmargin: -.4em 1em -.4em -.4em;\n\t}\n\t/* For grouped headers, have a different style to visually separate the levels by classing the first label in each col group */ \n\t.ui-table-reflow th .ui-table-cell-label-top,\n\t.ui-table-reflow td .ui-table-cell-label-top {\n\t\tdisplay: block;\n\t\tpadding: .4em 0;\n\t\tmargin: .4em 0;\n\t\ttext-transform: uppercase;\n\t\tfont-size: .9em;\n\t\tfont-weight: normal;\n\t}\n}\n/* Breakpoint to show as a standard table at 560px (35em x 16px) or wider */ \n@media ( min-width: 35em ) {\n\t/* Show the table header rows */ \n\t.ui-table-reflow.ui-responsive td,\n\t.ui-table-reflow.ui-responsive th,\n\t.ui-table-reflow.ui-responsive tbody th,\n\t.ui-table-reflow.ui-responsive tbody td,\n\t.ui-table-reflow.ui-responsive thead td,\n\t.ui-table-reflow.ui-responsive thead th {\n\t\tdisplay: table-cell;\n\t\tmargin: 0;\n\t}\n\t/* Hide the labels in each cell */ \n\t.ui-table-reflow.ui-responsive td .ui-table-cell-label,\n\t.ui-table-reflow.ui-responsive th .ui-table-cell-label { \n\t\tdisplay: none;\n\t}\n}\n/* Hack to make IE9 and WP7.5 treat cells like block level elements, scoped to ui-responsive class */ \n/* Applied in a max-width media query up to the table layout breakpoint so we don't need to negate this*/ \n@media ( max-width: 35em ) {\n\t.ui-table-reflow.ui-responsive td,\n\t.ui-table-reflow.ui-responsive th {\n\t\twidth: 100%;\n\t\t-webkit-box-sizing: border-box;\n\t\t-moz-box-sizing: border-box;\n\t\tbox-sizing: border-box;\n\t\tfloat: left;\n\t\tclear: left;\n\t}\n}\n/* Panel */\n.ui-panel {\n\twidth: 17em;\n\tmin-height: 100%;\n\tmax-height: none;\n\tborder-width: 0;\n\tposition: absolute;\n\ttop: 0;\n\tdisplay: block;\n}\n.ui-panel-closed {\n\twidth: 0;\n\tmax-height: 100%;\n\toverflow: hidden;\n\tvisibility: hidden;\n\tleft: 0;\n\tclip: rect(1px,1px,1px,1px);\n}\n.ui-panel-fixed {\n\tposition: fixed;\n\tbottom: -1px; /* Fixes gap on Chrome for Android */\n\tpadding-bottom: 1px;\n}\n.ui-panel-display-reveal {\n\tz-index: 1;\n}\n.ui-panel-display-push {\n\tz-index: 999;\n}\n.ui-panel-display-overlay {\n\tz-index: 1001; /* Fixed toolbars have z-index 1000 */\n}\n.ui-panel-inner {\n\tpadding: 1em;\n}\n/* Container, page and wrapper */\n.ui-panel-page-container {\n\toverflow-x: visible;\n}\n.ui-panel-page-container-themed .ui-page-active {\n\tbackground: none;\n}\n.ui-panel-wrapper {\n\tposition: relative;\n\tmin-height: inherit;\n\tborder: 0;\n\toverflow-x: hidden;\n\tz-index: 999;\n}\n/* Fixed toolbars */\n.ui-panel-fixed-toolbar {\n\toverflow-x: hidden;\n}\n/* Dismiss */\n.ui-panel-dismiss {\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n\tright: 0;\n\theight: 100%;\n\tz-index: 1002;\n\tdisplay: none;\n}\n.ui-panel-dismiss-open {\n\tdisplay: block;\n}\n/* Animate class is added to panel, wrapper and fixed toolbars */\n.ui-panel-animate {\n\t-webkit-transition: -webkit-transform 300ms ease;\n\t-webkit-transition-duration: 300ms;\n\t-moz-transition: -moz-transform 300ms ease;\n\ttransition: transform 300ms ease;\n}\n/* Fix for Windows Phone issue #6349: unset the transition for transforms in case of fixed toolbars. */\n@media screen and ( max-device-width: 768px ) {\n\t.ui-page-header-fixed .ui-panel-animate.ui-panel-wrapper,\n\t.ui-page-footer-fixed .ui-panel-animate.ui-panel-wrapper,\n\t.ui-panel-animate.ui-panel-fixed-toolbar {\n\t\t-ms-transition: none;\n\t}\n\t/* We need a transitionend event ... */\n\t.ui-panel-animate.ui-panel-fixed-toolbar {\n\t\t-ms-transition: -ms-transform 1ms;\n\t\t-ms-transform: rotate(0deg);\n\t}\n}\n/* Hardware acceleration for smoother transitions on WebKit browsers */\n.ui-panel-animate.ui-panel:not(.ui-panel-display-reveal) {\n\t-webkit-backface-visibility: hidden;\n\t-webkit-transform: translate3d(0,0,0);\n}\n/* Panel positioning (for overlay and push) */\n/* Panel left closed */\n.ui-panel-position-left {\n\tleft: -17em;\n}\n/* Panel left closed animated */\n.ui-panel-animate.ui-panel-position-left.ui-panel-display-overlay,\n.ui-panel-animate.ui-panel-position-left.ui-panel-display-push {\n\tleft: 0;\n\t-webkit-transform: translate3d(-17em,0,0);\n\t-moz-transform: translate3d(-17em,0,0);\n\ttransform: translate3d(-17em,0,0);\n}\n/* Panel left open */\n.ui-panel-position-left.ui-panel-display-reveal, /* Unset \"panel left closed\" for reveal */\n.ui-panel-open.ui-panel-position-left {\n\tleft: 0;\n}\n/* Panel left open animated */\n.ui-panel-animate.ui-panel-open.ui-panel-position-left.ui-panel-display-overlay,\n.ui-panel-animate.ui-panel-open.ui-panel-position-left.ui-panel-display-push {\n\t-webkit-transform: translate3d(0,0,0);\n\ttransform: translate3d(0,0,0);\n\t-moz-transform: none;\n}\n/* Panel right closed */\n.ui-panel-position-right {\n\tright: -17em;\n}\n/* Panel right closed animated */\n.ui-panel-animate.ui-panel-position-right.ui-panel-display-overlay,\n.ui-panel-animate.ui-panel-position-right.ui-panel-display-push {\n\tright: 0;\n\t-webkit-transform: translate3d(17em,0,0);\n\t-moz-transform: translate3d(17em,0,0);\n\ttransform: translate3d(17em,0,0);\n}\n/* Panel right open */\n.ui-panel-position-right.ui-panel-display-reveal, /* Unset \"panel right closed\" for reveal */\n.ui-panel-position-right.ui-panel-open {\n\tright: 0;\n}\n/* Panel right open animated */\n.ui-panel-animate.ui-panel-open.ui-panel-position-right.ui-panel-display-overlay,\n.ui-panel-animate.ui-panel-open.ui-panel-position-right.ui-panel-display-push {\n\t-webkit-transform: translate3d(0,0,0);\n\ttransform: translate3d(0,0,0);\n\t-moz-transform: none;\n}\n/* Wrapper and fixed toolbars positioning (for reveal and push) */\n/* Panel left open */\n.ui-panel-page-content-position-left {\n\tleft: 17em;\n\tright: -17em;\n}\n/* Panel left open animated */\n.ui-panel-animate.ui-panel-page-content-position-left {\n\tleft: 0;\n\tright: 0;\n\t-webkit-transform: translate3d(17em,0,0);\n\t-moz-transform: translate3d(17em,0,0);\n\ttransform: translate3d(17em,0,0);\n}\n/* Panel right open */\n.ui-panel-page-content-position-right {\n\tleft: -17em;\n\tright: 17em;\n}\n/* Panel right open animated */\n.ui-panel-animate.ui-panel-page-content-position-right {\n\tleft: 0;\n\tright: 0;\n\t-webkit-transform: translate3d(-17em,0,0);\n\t-moz-transform: translate3d(-17em,0,0);\n\ttransform: translate3d(-17em,0,0);\n}\n/* Dismiss model open */\n.ui-panel-dismiss-open.ui-panel-dismiss-position-left {\n\tleft: 17em;\n}\n.ui-panel-dismiss-open.ui-panel-dismiss-position-right {\n\tright: 17em;\n}\n/* Shadows and borders */\n.ui-panel-display-reveal {\n\t-webkit-box-shadow: inset -5px 0 5px rgba(0,0,0,.15);\n\t-moz-box-shadow: inset -5px 0 5px rgba(0,0,0,.15);\n\tbox-shadow: inset -5px 0 5px rgba(0,0,0,.15);\n}\n.ui-panel-position-right.ui-panel-display-reveal {\n\t-webkit-box-shadow: inset 5px 0 5px rgba(0,0,0,.15);\n\t-moz-box-shadow: inset 5px 0 5px rgba(0,0,0,.15);\n\tbox-shadow: inset 5px 0 5px rgba(0,0,0,.15);\n}\n.ui-panel-display-overlay {\n\t-webkit-box-shadow: 5px 0 5px rgba(0,0,0,.15);\n\t-moz-box-shadow: 5px 0 5px rgba(0,0,0,.15);\n\tbox-shadow: 5px 0 5px rgba(0,0,0,.15);\n}\n.ui-panel-position-right.ui-panel-display-overlay {\n\t-webkit-box-shadow: -5px 0 5px rgba(0,0,0,.15);\n\t-moz-box-shadow: -5px 0 5px rgba(0,0,0,.15);\n\tbox-shadow: -5px 0 5px rgba(0,0,0,.15);\n}\n.ui-panel-open.ui-panel-position-left.ui-panel-display-push {\n\tborder-right-width: 1px;\n\tmargin-right: -1px;\n}\n.ui-panel-page-content-position-left.ui-panel-page-content-display-push {\n\tmargin-left: 1px;\n\twidth: auto;\n}\n.ui-panel-open.ui-panel-position-right.ui-panel-display-push {\n\tborder-left-width: 1px;\n\tmargin-left: -1px;\n}\n.ui-panel-page-content-position-right.ui-panel-page-content-display-push {\n\tmargin-right: 1px;\n\twidth: auto;\n}\n/* Responsive: wrap on wide viewports once open */\n@media (min-width:55em) {\n\t.ui-responsive-panel .ui-panel-page-content-open.ui-panel-page-content-position-left {\n\t\tmargin-right: 17em;\n\t}\n\t.ui-responsive-panel .ui-panel-page-content-open.ui-panel-page-content-position-right {\n\t\tmargin-left: 17em;\n\t}\n\t.ui-responsive-panel .ui-panel-page-content-open {\n\t\twidth: auto;\t\n\t}\n\t.ui-responsive-panel .ui-panel-dismiss-display-push,\n\t.ui-responsive-panel.ui-page-active ~ .ui-panel-dismiss-display-push {\n\t\tdisplay: none;\n\t}\n}\n.ui-tabs {\n\tposition: relative;/* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as \"fixed\") */\n\tpadding: .2em;\n}\n"
  },
  {
    "path": "stenogotchi/ui/web/static/js/jquery.mobile/jquery.mobile.inline-svg-1.4.5.css",
    "content": "/*!\n* jQuery Mobile 1.4.5\n* Git HEAD hash: 68e55e78b292634d3991c795f06f5e37a512decc <> Date: Fri Oct 31 2014 17:33:30 UTC\n* http://jquerymobile.com\n*\n* Copyright 2010, 2014 jQuery Foundation, Inc. and othercontributors\n* Released under the MIT license.\n* http://jquery.org/license\n*\n*/\n\n\n.ui-icon-action:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20style%3D%22fill%3A%23FFFFFF%3B%22%20d%3D%22M9%2C5v3l5-4L9%2C0v3c0%2C0-5%2C0-5%2C7C6%2C5%2C9%2C5%2C9%2C5z%20M11%2C12H2V5h1l2-2H0v11h13V7l-2%2C2V12z%22%2F%3E%3C%2Fsvg%3E\");\n}\n.ui-icon-alert:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20style%3D%22fill%3A%23FFFFFF%3B%22%20d%3D%22M7%2C0L0%2C12h14L7%2C0z%20M7%2C11c-0.553%2C0-1-0.447-1-1s0.447-1%2C1-1c0.553%2C0%2C1%2C0.447%2C1%2C1S7.553%2C11%2C7%2C11z%20M7%2C8%20C6.447%2C8%2C6%2C7.553%2C6%2C7V5c0-0.553%2C0.447-1%2C1-1c0.553%2C0%2C1%2C0.447%2C1%2C1v2C8%2C7.553%2C7.553%2C8%2C7%2C8z%22%2F%3E%3C%2Fsvg%3E\");\n}\n.ui-icon-arrow-d-l:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpolygon%20fill%3D%22%23FFF%22%20points%3D%2214%2C3%2011%2C0%203.5%2C7.5%200%2C4%200%2C14%2010%2C14%206.5%2C10.5%20%22%2F%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3C%2Fsvg%3E\");\n}\n.ui-icon-arrow-d-r:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpolygon%20fill%3D%22%23FFF%22%20points%3D%2210.5%2C7.5%203%2C0%200%2C3%207.5%2C10.5%204%2C14%2014%2C14%2014%2C4%20%22%2F%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3C%2Fsvg%3E\");\n}\n.ui-icon-arrow-d:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpolygon%20fill%3D%22%23FFF%22%20points%3D%229%2C7%209%2C0%205%2C0%205%2C7%200%2C7%207%2C14%2014%2C7%20%22%2F%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3C%2Fsvg%3E\");\n}\n.ui-icon-arrow-l:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpolygon%20fill%3D%22%23FFF%22%20points%3D%227%2C5%207%2C0%200%2C7%207%2C14%207%2C9%2014%2C9%2014%2C5%20%22%2F%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3C%2Fsvg%3E\");\n}\n.ui-icon-arrow-r:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpolygon%20fill%3D%22%23FFF%22%20points%3D%2214%2C7%207%2C0%207%2C5%200%2C5%200%2C9%207%2C9%207%2C14%20%22%2F%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3C%2Fsvg%3E\");\n}\n.ui-icon-arrow-u-l:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpolygon%20fill%3D%22%23FFF%22%20points%3D%2214%2C11%206.5%2C3.5%2010%2C0%200%2C0%200%2C10%203.5%2C6.5%2011%2C14%20%22%2F%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3C%2Fsvg%3E\");\n}\n.ui-icon-arrow-u-r:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpolygon%20fill%3D%22%23FFF%22%20points%3D%2214%2C0%204%2C0%207.5%2C3.5%200%2C11%203%2C14%2010.5%2C6.5%2014%2C10%20%22%2F%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3C%2Fsvg%3E\");\n}\n.ui-icon-arrow-u:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpolygon%20fill%3D%22%23FFF%22%20points%3D%227%2C0%200%2C7%205%2C7%205%2C14%209%2C14%209%2C7%2014%2C7%20%22%2F%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3C%2Fsvg%3E\");\n}\n.ui-icon-audio:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214.018px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014.018%2014%22%20style%3D%22enable-background%3Anew%200%200%2014.018%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20fill%3D%22%23FFF%22%20d%3D%22M1%2C4C0.447%2C4%2C0%2C4.447%2C0%2C5v4c0%2C0.553%2C0.447%2C1%2C1%2C1h1l4%2C4V0L2%2C4H1z%20M10.346%2C7c0-1.699-1.042-3.154-2.546-3.867L6.982%2C4.68%20C7.885%2C5.107%2C8.51%2C5.98%2C8.51%2C7S7.885%2C8.893%2C6.982%2C9.32L7.8%2C10.867C9.304%2C10.154%2C10.346%2C8.699%2C10.346%2C7z%20M9.447%2C0.017L8.618%2C1.586%20C10.723%2C2.584%2C12.182%2C4.621%2C12.182%2C7s-1.459%2C4.416-3.563%2C5.414l0.829%2C1.569c2.707-1.283%2C4.57-3.925%2C4.57-6.983%20S12.154%2C1.3%2C9.447%2C0.017z%22%2F%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3C%2Fsvg%3E\");\n}\n.ui-icon-back:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20style%3D%22fill%3A%23FFFFFF%3B%22%20d%3D%22M5%2C3V0L1%2C4l4%2C4V5c0%2C0%2C6%2C0%2C6%2C3s-5%2C4-5%2C4v2c0%2C0%2C7-1%2C7-6C13%2C4%2C8%2C3%2C5%2C3z%22%2F%3E%3C%2Fsvg%3E\");\n}\n.ui-icon-bars:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20style%3D%22fill%3A%23FFFFFF%3B%22%20d%3D%22M1%2C4h12c0.553%2C0%2C1-0.447%2C1-1s-0.447-1-1-1H1C0.447%2C2%2C0%2C2.447%2C0%2C3S0.447%2C4%2C1%2C4z%20M13%2C6H1%20C0.447%2C6%2C0%2C6.447%2C0%2C7c0%2C0.553%2C0.447%2C1%2C1%2C1h12c0.553%2C0%2C1-0.447%2C1-1C14%2C6.447%2C13.553%2C6%2C13%2C6z%20M13%2C10H1c-0.553%2C0-1%2C0.447-1%2C1%20s0.447%2C1%2C1%2C1h12c0.553%2C0%2C1-0.447%2C1-1S13.553%2C10%2C13%2C10z%22%2F%3E%3C%2Fsvg%3E\");\n}\n.ui-icon-bullets:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20style%3D%22fill%3A%23FFFFFF%3B%22%20d%3D%22M5%2C4h8c0.553%2C0%2C1-0.447%2C1-1s-0.447-1-1-1H5C4.447%2C2%2C4%2C2.447%2C4%2C3S4.447%2C4%2C5%2C4z%20M13%2C6H5%20C4.447%2C6%2C4%2C6.447%2C4%2C7c0%2C0.553%2C0.447%2C1%2C1%2C1h8c0.553%2C0%2C1-0.447%2C1-1C14%2C6.447%2C13.553%2C6%2C13%2C6z%20M13%2C10H5c-0.553%2C0-1%2C0.447-1%2C1%20s0.447%2C1%2C1%2C1h8c0.553%2C0%2C1-0.447%2C1-1S13.553%2C10%2C13%2C10z%20M1%2C2C0.447%2C2%2C0%2C2.447%2C0%2C3s0.447%2C1%2C1%2C1s1-0.447%2C1-1S1.553%2C2%2C1%2C2z%20M1%2C6%20C0.447%2C6%2C0%2C6.447%2C0%2C7c0%2C0.553%2C0.447%2C1%2C1%2C1s1-0.447%2C1-1C2%2C6.447%2C1.553%2C6%2C1%2C6z%20M1%2C10c-0.553%2C0-1%2C0.447-1%2C1s0.447%2C1%2C1%2C1s1-0.447%2C1-1%20S1.553%2C10%2C1%2C10z%22%2F%3E%3C%2Fsvg%3E\");\n}\n.ui-icon-calendar:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20fill%3D%22%23FFF%22%20d%3D%22M0%2C8h2V6H0V8z%20M3%2C8h2V6H3V8z%20M6%2C8h2V6H6V8z%20M9%2C8h2V6H9V8z%20M12%2C8h2V6h-2V8z%20M0%2C11h2V9H0V11z%20M3%2C11h2V9H3V11z%20M6%2C11h2V9H6V11z%20%20M9%2C11h2V9H9V11z%20M12%2C11h2V9h-2V11z%20M0%2C14h2v-2H0V14z%20M3%2C14h2v-2H3V14z%20M6%2C14h2v-2H6V14z%20M9%2C14h2v-2H9V14z%20M12%2C1%20c0-0.553-0.447-1-1-1s-1%2C0.447-1%2C1H4c0-0.553-0.447-1-1-1S2%2C0.447%2C2%2C1H0v4h14V1H12z%22%2F%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3C%2Fsvg%3E\");\n}\n.ui-icon-camera:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20style%3D%22fill%3A%23FFFFFF%3B%22%20d%3D%22M12%2C2.5H9.908c-0.206-0.581-0.756-1-1.408-1h-3c-0.652%2C0-1.202%2C0.419-1.408%2C1H2c-1.104%2C0-2%2C0.896-2%2C2%20v6c0%2C1.104%2C0.896%2C2%2C2%2C2h10c1.104%2C0%2C2-0.896%2C2-2v-6C14%2C3.396%2C13.104%2C2.5%2C12%2C2.5z%20M7%2C10.5c-1.657%2C0-3-1.344-3-3c0-1.657%2C1.343-3%2C3-3%20s3%2C1.343%2C3%2C3C10%2C9.156%2C8.657%2C10.5%2C7%2C10.5z%20M7%2C5.5c-1.104%2C0-2%2C0.896-2%2C2c0%2C1.104%2C0.896%2C2%2C2%2C2c1.104%2C0%2C2-0.896%2C2-2%20C9%2C6.396%2C8.104%2C5.5%2C7%2C5.5z%22%2F%3E%3C%2Fsvg%3E\");\n}\n.ui-icon-carat-d:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpolygon%20style%3D%22fill%3A%23FFFFFF%3B%22%20points%3D%2211.949%2C3.404%207%2C8.354%202.05%2C3.404%20-0.071%2C5.525%207%2C12.596%2014.07%2C5.525%20%22%2F%3E%3C%2Fsvg%3E\");\n}\n.ui-icon-carat-l:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpolygon%20style%3D%22fill%3A%23FFFFFF%3B%22%20points%3D%2210.596%2C11.949%205.646%2C7%2010.596%2C2.05%208.475%2C-0.071%201.404%2C7%208.475%2C14.07%20%22%2F%3E%3C%2Fsvg%3E\");\n}\n.ui-icon-carat-r:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpolygon%20style%3D%22fill%3A%23FFFFFF%3B%22%20points%3D%223.404%2C2.051%208.354%2C7%203.404%2C11.95%205.525%2C14.07%2012.596%2C7%205.525%2C-0.071%20%22%2F%3E%3C%2Fsvg%3E\");\n}\n.ui-icon-carat-u:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpolygon%20style%3D%22fill%3A%23FFFFFF%3B%22%20points%3D%222.051%2C10.596%207%2C5.646%2011.95%2C10.596%2014.07%2C8.475%207%2C1.404%20-0.071%2C8.475%20%22%2F%3E%3C%2Fsvg%3E\");\n}\n.ui-icon-check:after,\n/* Used ui-checkbox-on twice to increase specificity. If active state has background-image for gradient this rule overrides. */\nhtml .ui-btn.ui-checkbox-on.ui-checkbox-on:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpolygon%20style%3D%22fill%3A%23FFFFFF%3B%22%20points%3D%2214%2C4%2011%2C1%205.003%2C6.997%203%2C5%200%2C8%204.966%2C13%204.983%2C12.982%205%2C13%20%22%2F%3E%3C%2Fsvg%3E\");\n}\n.ui-icon-clock:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20fill%3D%22%23FFF%22%20d%3D%22M7%2C0C3.134%2C0%2C0%2C3.134%2C0%2C7s3.134%2C7%2C7%2C7s7-3.134%2C7-7S10.866%2C0%2C7%2C0z%20M7%2C12c-2.762%2C0-5-2.238-5-5s2.238-5%2C5-5s5%2C2.238%2C5%2C5%20S9.762%2C12%2C7%2C12z%20M9%2C6H8V4c0-0.553-0.447-1-1-1S6%2C3.447%2C6%2C4v3c0%2C0.553%2C0.447%2C1%2C1%2C1h2c0.553%2C0%2C1-0.447%2C1-1S9.553%2C6%2C9%2C6z%22%2F%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3C%2Fsvg%3E\");\n}\n.ui-icon-cloud:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20style%3D%22fill%3A%23FFFFFF%3B%22%20d%3D%22M14%2C9.5c0-0.793-0.465-1.473-1.134-1.795C12.949%2C7.484%2C13%2C7.249%2C13%2C7c0-1.104-0.896-2-2-2%20c-0.158%2C0-0.311%2C0.023-0.457%2C0.058C9.816%2C3.549%2C8.286%2C2.5%2C6.5%2C2.5c-2.33%2C0-4.224%2C1.777-4.454%2C4.046C0.883%2C6.76%2C0%2C7.773%2C0%2C9%20c0%2C1.381%2C1.119%2C2.5%2C2.5%2C2.5h10v-0.07C13.361%2C11.206%2C14%2C10.432%2C14%2C9.5z%22%2F%3E%3C%2Fsvg%3E\");\n}\n.ui-icon-comment:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20fill%3D%22%23FFF%22%20d%3D%22M12%2C0H2C0.896%2C0%2C0%2C0.896%2C0%2C2v7c0%2C1.104%2C0.896%2C2%2C2%2C2h1v3l3-3h6c1.104%2C0%2C2-0.896%2C2-2V2C14%2C0.896%2C13.104%2C0%2C12%2C0z%22%2F%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3C%2Fsvg%3E\");\n}\n.ui-icon-delete:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpolygon%20fill%3D%22%23FFF%22%20points%3D%2214%2C3%2011%2C0%207%2C4%203%2C0%200%2C3%204%2C7%200%2C11%203%2C14%207%2C10%2011%2C14%2014%2C11%2010%2C7%20%22%2F%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3C%2Fsvg%3E\");\n}\n.ui-icon-edit:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20fill%3D%22%23FFF%22%20d%3D%22M1%2C10l-1%2C4l4-1l7-7L8%2C3L1%2C10z%20M11%2C0L9%2C2l3%2C3l2-2L11%2C0z%22%2F%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3C%2Fsvg%3E\");\n}\n.ui-icon-eye:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20style%3D%22fill%3A%23FFFFFF%3B%22%20d%3D%22M7%2C2C3%2C2%2C0%2C7%2C0%2C7s3%2C5%2C7%2C5s7-5%2C7-5S11%2C2%2C7%2C2z%20M7%2C10c-1.657%2C0-3-1.344-3-3c0-1.657%2C1.343-3%2C3-3%20s3%2C1.343%2C3%2C3C10%2C8.656%2C8.657%2C10%2C7%2C10z%20M7%2C6C6.448%2C6%2C6%2C6.447%2C6%2C7c0%2C0.553%2C0.448%2C1%2C1%2C1s1-0.447%2C1-1C8%2C6.447%2C7.552%2C6%2C7%2C6z%22%2F%3E%3C%2Fsvg%3E\");\n}\n.ui-icon-forbidden:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20fill%3D%22%23FFF%22%20d%3D%22M12.601%2C11.187C13.476%2C10.018%2C14%2C8.572%2C14%2C7c0-3.866-3.134-7-7-7C5.428%2C0%2C3.982%2C0.524%2C2.813%2C1.399L2.757%2C1.343L2.053%2C2.048%20L2.048%2C2.053L1.343%2C2.758l0.056%2C0.056C0.524%2C3.982%2C0%2C5.428%2C0%2C7c0%2C3.866%2C3.134%2C7%2C7%2C7c1.572%2C0%2C3.018-0.524%2C4.187-1.399l0.056%2C0.057%20l0.705-0.705l0.005-0.005l0.705-0.705L12.601%2C11.187z%20M7%2C2c2.761%2C0%2C5%2C2.238%2C5%2C5c0%2C1.019-0.308%2C1.964-0.832%2C2.754L4.246%2C2.832%20C5.036%2C2.308%2C5.981%2C2%2C7%2C2z%20M7%2C12c-2.761%2C0-5-2.238-5-5c0-1.019%2C0.308-1.964%2C0.832-2.754l6.922%2C6.922C8.964%2C11.692%2C8.019%2C12%2C7%2C12z%22%2F%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3C%2Fsvg%3E\");\n}\n.ui-icon-forward:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20style%3D%22fill%3A%23FFFFFF%3B%22%20d%3D%22M13%2C4L9%2C0v3C6%2C3%2C1%2C4%2C1%2C8c0%2C5%2C7%2C6%2C7%2C6v-2c0%2C0-5-1-5-4s6-3%2C6-3v3L13%2C4z%22%2F%3E%3C%2Fsvg%3E\");\n}\n.ui-icon-gear:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20fill%3D%22%23FFF%22%20d%3D%22M13.621%2C5.904l-1.036-0.259c-0.168-0.042-0.303-0.168-0.355-0.332c-0.092-0.284-0.205-0.559-0.339-0.82%20c-0.079-0.153-0.073-0.337%2C0.017-0.486l0.549-0.915c0.118-0.196%2C0.088-0.448-0.075-0.61l-0.862-0.863%20c-0.162-0.163-0.414-0.193-0.611-0.075l-0.916%2C0.55C9.844%2C2.182%2C9.659%2C2.188%2C9.506%2C2.109C9.244%2C1.975%2C8.97%2C1.861%2C8.686%2C1.77%20c-0.165-0.052-0.29-0.187-0.332-0.354L8.095%2C0.379C8.039%2C0.156%2C7.839%2C0%2C7.609%2C0H6.391c-0.229%2C0-0.43%2C0.156-0.485%2C0.379L5.646%2C1.415%20C5.604%2C1.582%2C5.479%2C1.718%2C5.313%2C1.77c-0.284%2C0.092-0.559%2C0.206-0.82%2C0.34C4.339%2C2.188%2C4.155%2C2.182%2C4.007%2C2.093L3.092%2C1.544%20c-0.196-0.118-0.448-0.087-0.61%2C0.075L1.619%2C2.481C1.457%2C2.644%2C1.426%2C2.896%2C1.544%2C3.093l0.549%2C0.914%20c0.089%2C0.148%2C0.095%2C0.332%2C0.017%2C0.486C1.975%2C4.755%2C1.861%2C5.029%2C1.77%2C5.314c-0.053%2C0.164-0.188%2C0.29-0.354%2C0.332L0.379%2C5.905%20C0.156%2C5.961%2C0%2C6.161%2C0%2C6.391v1.219c0%2C0.229%2C0.156%2C0.43%2C0.379%2C0.485l1.036%2C0.26C1.582%2C8.396%2C1.717%2C8.521%2C1.77%2C8.687%20c0.092%2C0.284%2C0.205%2C0.559%2C0.34%2C0.82C2.188%2C9.66%2C2.182%2C9.844%2C2.093%2C9.993l-0.549%2C0.915c-0.118%2C0.195-0.087%2C0.448%2C0.075%2C0.61%20l0.862%2C0.862c0.162%2C0.163%2C0.414%2C0.193%2C0.61%2C0.075l0.915-0.549c0.148-0.089%2C0.332-0.095%2C0.486-0.017%20c0.262%2C0.135%2C0.536%2C0.248%2C0.82%2C0.34c0.165%2C0.053%2C0.291%2C0.187%2C0.332%2C0.354l0.259%2C1.036C5.96%2C13.844%2C6.16%2C14%2C6.39%2C14h1.22%20c0.229%2C0%2C0.43-0.156%2C0.485-0.379l0.259-1.036c0.042-0.167%2C0.168-0.302%2C0.333-0.354c0.284-0.092%2C0.559-0.205%2C0.82-0.34%20c0.154-0.078%2C0.338-0.072%2C0.486%2C0.017l0.914%2C0.549c0.197%2C0.118%2C0.449%2C0.088%2C0.611-0.074l0.862-0.863%20c0.163-0.162%2C0.193-0.415%2C0.075-0.611l-0.549-0.915c-0.089-0.148-0.096-0.332-0.017-0.485c0.134-0.263%2C0.248-0.536%2C0.339-0.82%20c0.053-0.165%2C0.188-0.291%2C0.355-0.333l1.036-0.259C13.844%2C8.039%2C14%2C7.839%2C14%2C7.609V6.39C14%2C6.16%2C13.844%2C5.96%2C13.621%2C5.904z%20M7%2C10%20c-1.657%2C0-3-1.343-3-3s1.343-3%2C3-3s3%2C1.343%2C3%2C3S8.657%2C10%2C7%2C10z%22%2F%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3C%2Fsvg%3E\");\n}\n.ui-icon-grid:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20fill%3D%22%23FFF%22%20d%3D%22M3%2C0H1C0.447%2C0%2C0%2C0.447%2C0%2C1v2c0%2C0.553%2C0.447%2C1%2C1%2C1h2c0.553%2C0%2C1-0.447%2C1-1V1C4%2C0.447%2C3.553%2C0%2C3%2C0z%20M8%2C0H6%20C5.447%2C0%2C5%2C0.447%2C5%2C1v2c0%2C0.553%2C0.447%2C1%2C1%2C1h2c0.553%2C0%2C1-0.447%2C1-1V1C9%2C0.447%2C8.553%2C0%2C8%2C0z%20M13%2C0h-2c-0.553%2C0-1%2C0.447-1%2C1v2%20c0%2C0.553%2C0.447%2C1%2C1%2C1h2c0.553%2C0%2C1-0.447%2C1-1V1C14%2C0.447%2C13.553%2C0%2C13%2C0z%20M3%2C5H1C0.447%2C5%2C0%2C5.447%2C0%2C6v2c0%2C0.553%2C0.447%2C1%2C1%2C1h2%20c0.553%2C0%2C1-0.447%2C1-1V6C4%2C5.447%2C3.553%2C5%2C3%2C5z%20M8%2C5H6C5.447%2C5%2C5%2C5.447%2C5%2C6v2c0%2C0.553%2C0.447%2C1%2C1%2C1h2c0.553%2C0%2C1-0.447%2C1-1V6%20C9%2C5.447%2C8.553%2C5%2C8%2C5z%20M13%2C5h-2c-0.553%2C0-1%2C0.447-1%2C1v2c0%2C0.553%2C0.447%2C1%2C1%2C1h2c0.553%2C0%2C1-0.447%2C1-1V6C14%2C5.447%2C13.553%2C5%2C13%2C5z%20M3%2C10%20H1c-0.553%2C0-1%2C0.447-1%2C1v2c0%2C0.553%2C0.447%2C1%2C1%2C1h2c0.553%2C0%2C1-0.447%2C1-1v-2C4%2C10.447%2C3.553%2C10%2C3%2C10z%20M8%2C10H6c-0.553%2C0-1%2C0.447-1%2C1v2%20c0%2C0.553%2C0.447%2C1%2C1%2C1h2c0.553%2C0%2C1-0.447%2C1-1v-2C9%2C10.447%2C8.553%2C10%2C8%2C10z%20M13%2C10h-2c-0.553%2C0-1%2C0.447-1%2C1v2c0%2C0.553%2C0.447%2C1%2C1%2C1h2%20c0.553%2C0%2C1-0.447%2C1-1v-2C14%2C10.447%2C13.553%2C10%2C13%2C10z%22%2F%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3C%2Fsvg%3E\");\n}\n.ui-icon-heart:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20style%3D%22fill%3A%23FFFFFF%3B%22%20d%3D%22M7%2C1.872c-2-3-7-2-7%2C2c0%2C3%2C4%2C7%2C4%2C7s2.417%2C2.479%2C3%2C3c0.583-0.521%2C3-3%2C3-3s4-4%2C4-7%20C14-0.128%2C9-1.128%2C7%2C1.872z%22%2F%3E%3C%2Fsvg%3E\");\n}\n.ui-icon-home:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpolygon%20fill%3D%22%23FFF%22%20points%3D%227%2C0%200%2C7%202%2C7%202%2C14%205%2C14%205%2C9%209%2C9%209%2C14%2012%2C14%2012%2C7%2014%2C7%20%22%2F%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3C%2Fsvg%3E\");\n}\n.ui-icon-info:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20fill%3D%22%23FFF%22%20d%3D%22M7%2C0C3.134%2C0%2C0%2C3.134%2C0%2C7s3.134%2C7%2C7%2C7s7-3.134%2C7-7S10.866%2C0%2C7%2C0z%20M7%2C2c0.552%2C0%2C1%2C0.447%2C1%2C1S7.552%2C4%2C7%2C4S6%2C3.553%2C6%2C3%20S6.448%2C2%2C7%2C2z%20M9%2C11H5v-1h1V6H5V5h3v5h1V11z%22%2F%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3C%2Fsvg%3E\");\n}\n.ui-icon-location:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20style%3D%22fill%3A%23FFFFFF%3B%22%20d%3D%22M7%2C0C4.791%2C0%2C3%2C1.791%2C3%2C4c0%2C2%2C4%2C10%2C4%2C10s4-8%2C4-10C11%2C1.791%2C9.209%2C0%2C7%2C0z%20M7%2C6C5.896%2C6%2C5%2C5.104%2C5%2C4%20s0.896-2%2C2-2c1.104%2C0%2C2%2C0.896%2C2%2C2S8.104%2C6%2C7%2C6z%22%2F%3E%3C%2Fsvg%3E\");\n}\n.ui-icon-lock:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20style%3D%22fill%3A%23FFFFFF%3B%22%20d%3D%22M12%2C6V5c0-2.762-2.238-5-5-5C4.239%2C0%2C2%2C2.238%2C2%2C5v1H1v8h12V6H12z%20M7.5%2C9.848V12h-1V9.848%20C6.207%2C9.673%2C6%2C9.366%2C6%2C9c0-0.553%2C0.448-1%2C1-1s1%2C0.447%2C1%2C1C8%2C9.366%2C7.793%2C9.673%2C7.5%2C9.848z%20M10%2C6H4V5c0-1.657%2C1.343-3%2C3-3%20s3%2C1.343%2C3%2C3V6z%22%2F%3E%3C%2Fsvg%3E\");\n}\n.ui-icon-mail:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20style%3D%22fill%3A%23FFFFFF%3B%22%20d%3D%22M0%2C3.75V12h14V3.75L7%2C9L0%2C3.75z%20M14%2C2H0l7%2C5L14%2C2z%22%2F%3E%3C%2Fsvg%3E\");\n}\n.ui-icon-minus:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Crect%20y%3D%225%22%20style%3D%22fill%3A%23FFFFFF%3B%22%20width%3D%2214%22%20height%3D%224%22%2F%3E%3C%2Fsvg%3E\");\n}\n.ui-icon-navigation:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpolygon%20style%3D%22fill%3A%23FFFFFF%3B%22%20points%3D%2213%2C1%200%2C6%207%2C7%208%2C14%20%22%2F%3E%3C%2Fsvg%3E\");\n}\n.ui-icon-phone:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%22-0.01%200.008%2014%2014%22%20style%3D%22enable-background%3Anew%20-0.01%200.008%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20style%3D%22fill%3A%23FFFFFF%3B%22%20d%3D%22M6.939%2C9.189C6.165%2C8.557%2C5.271%2C7.705%2C4.497%2C6.744C3.953%2C6.071%2C3.473%2C5.363%2C3.969%2C4.866l-3.482-3.48%20C-0.021%2C2.02-1.146%2C5.04%2C3.675%2C9.984c5.08%2C5.211%2C8.356%2C4.097%2C8.92%2C3.511l-3.396-3.4C8.725%2C10.568%2C8.113%2C10.146%2C6.939%2C9.189z%20%20M13.82%2C11.519v-0.004c0%2C0-2.648-2.646-2.649-2.647c-0.21-0.211-0.546-0.205-0.754%2C0.002L9.455%2C9.831l3.403%2C3.407%20c0%2C0%2C0.962-0.96%2C0.961-0.961l0.002-0.001C14.043%2C12.056%2C14.021%2C11.721%2C13.82%2C11.519z%20M5.192%2C3.644V3.642%20c0.222-0.222%2C0.2-0.557%2C0-0.758V2.881c0%2C0-2.726-2.725-2.727-2.726C2.255-0.055%2C1.92-0.05%2C1.712%2C0.156L0.751%2C1.121l3.479%2C3.482%20C4.231%2C4.604%2C5.192%2C3.645%2C5.192%2C3.644z%22%2F%3E%3C%2Fsvg%3E\");\n}\n.ui-icon-plus:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpolygon%20fill%3D%22%23FFF%22%20points%3D%2214%2C5%209%2C5%209%2C0%205%2C0%205%2C5%200%2C5%200%2C9%205%2C9%205%2C14%209%2C14%209%2C9%2014%2C9%20%22%2F%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3C%2Fsvg%3E\");\n}\n.ui-icon-power:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20style%3D%22fill%3A%23FFFFFF%3B%22%20d%3D%22M11.243%2C2.408c-0.392-0.401-1.024-0.401-1.415%2C0c-0.391%2C0.401-0.391%2C1.054%2C0%2C1.455%20C10.584%2C4.642%2C11%2C5.675%2C11%2C6.773s-0.416%2C2.133-1.172%2C2.91c-1.512%2C1.558-4.145%2C1.558-5.656%2C0C3.416%2C8.904%2C3%2C7.872%2C3%2C6.773%20C3%2C5.673%2C3.416%2C4.64%2C4.172%2C3.863c0.39-0.401%2C0.39-1.054%2C0-1.455c-0.391-0.401-1.024-0.401-1.415%2C0C1.624%2C3.574%2C1%2C5.125%2C1%2C6.773%20c0%2C1.647%2C0.624%2C3.199%2C1.757%2C4.365c1.134%2C1.166%2C2.64%2C1.809%2C4.243%2C1.809c1.604%2C0%2C3.109-0.645%2C4.243-1.811%20C12.376%2C9.975%2C13%2C8.423%2C13%2C6.773C13%2C5.125%2C12.376%2C3.574%2C11.243%2C2.408z%20M7%2C8.053c0.553%2C0%2C1-0.445%2C1-1v-6c0-0.553-0.447-1-1-1%20c-0.553%2C0-1%2C0.447-1%2C1v6C6%2C7.604%2C6.447%2C8.053%2C7%2C8.053z%22%2F%3E%3C%2Fsvg%3E\");\n}\n.ui-icon-recycle:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20style%3D%22fill%3A%23FFFFFF%3B%22%20d%3D%22M3%2C7h1L2%2C4L0%2C7h1c0%2C3.313%2C2.687%2C6%2C6%2C6c0.702%2C0%2C1.374-0.127%2C2-0.35v-2.205C8.41%2C10.789%2C7.732%2C11%2C7%2C11%20C4.791%2C11%2C3%2C9.209%2C3%2C7z%20M13%2C7c0-3.313-2.688-6-6-6C6.298%2C1%2C5.626%2C1.127%2C5%2C1.349v2.206C5.59%2C3.211%2C6.268%2C3%2C7%2C3c2.209%2C0%2C4%2C1.791%2C4%2C4%20h-1l2%2C3l2-3H13z%22%2F%3E%3C%2Fsvg%3E\");\n}\n.ui-icon-refresh:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214.001px%22%20height%3D%2214.002px%22%20viewBox%3D%220%200%2014.001%2014.002%22%20style%3D%22enable-background%3Anew%200%200%2014.001%2014.002%3B%22%20%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20fill%3D%22%23FFF%22%20d%3D%22M14.001%2C6.001v-6l-2.06%2C2.06c-0.423-0.424-0.897-0.809-1.44-1.122C7.153-0.994%2C2.872%2C0.153%2C0.939%2C3.501%20c-1.933%2C3.348-0.786%2C7.629%2C2.562%2C9.562c3.348%2C1.933%2C7.629%2C0.785%2C9.562-2.562l-1.732-1c-1.381%2C2.392-4.438%2C3.211-6.83%2C1.83%20s-3.211-4.438-1.83-6.83s4.438-3.211%2C6.83-1.83c0.389%2C0.225%2C0.718%2C0.506%2C1.02%2C0.81l-2.52%2C2.52H14.001z%22%2F%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3C%2Fsvg%3E\");\n}\n.ui-icon-search:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20style%3D%22fill%3A%23FFFFFF%3B%22%20d%3D%22M10.171%2C8.766c0.617-0.888%2C0.979-1.964%2C0.979-3.126c0-3.037-2.463-5.5-5.5-5.5s-5.5%2C2.463-5.5%2C5.5%20s2.463%2C5.5%2C5.5%2C5.5c1.152%2C0%2C2.223-0.355%2C3.104-0.962l3.684%2C3.683l1.414-1.414L10.171%2C8.766z%20M5.649%2C9.14c-1.933%2C0-3.5-1.567-3.5-3.5%20c0-1.933%2C1.567-3.5%2C3.5-3.5c1.933%2C0%2C3.5%2C1.567%2C3.5%2C3.5C9.149%2C7.572%2C7.582%2C9.14%2C5.649%2C9.14z%22%2F%3E%3C%2Fsvg%3E\");\n}\n.ui-icon-shop:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20style%3D%22fill%3A%23FFFFFF%3B%22%20d%3D%22M10%2C4V3c0-1.657-1.343-3-3-3S4%2C1.343%2C4%2C3v1H1v10h12V4H10z%20M4.5%2C6C4.224%2C6%2C4%2C5.776%2C4%2C5.5%20S4.224%2C5%2C4.5%2C5S5%2C5.224%2C5%2C5.5S4.776%2C6%2C4.5%2C6z%20M5%2C3c0-1.104%2C0.896-2%2C2-2c1.104%2C0%2C2%2C0.896%2C2%2C2v1H5V3z%20M9.5%2C6C9.225%2C6%2C9%2C5.776%2C9%2C5.5%20S9.225%2C5%2C9.5%2C5S10%2C5.224%2C10%2C5.5S9.775%2C6%2C9.5%2C6z%22%2F%3E%3C%2Fsvg%3E\");\n}\n.ui-icon-star:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpolygon%20style%3D%22fill%3A%23FFFFFF%3B%22%20points%3D%2214%2C5%209%2C5%207%2C0%205%2C5%200%2C5%204%2C8%202.625%2C13%207%2C10%2011.375%2C13%2010%2C8%20%22%2F%3E%3C%2Fsvg%3E\");\n}\n.ui-icon-tag:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20fill%3D%22%23FFF%22%20d%3D%22M5%2C0H0v5l9%2C9l5-5L5%2C0z%20M3%2C4C2.447%2C4%2C2%2C3.553%2C2%2C3s0.447-1%2C1-1s1%2C0.447%2C1%2C1S3.553%2C4%2C3%2C4z%22%2F%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3C%2Fsvg%3E\");\n}\n.ui-icon-user:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20fill%3D%22%23FFF%22%20d%3D%22M8.851%2C10.101c-0.18-0.399-0.2-0.763-0.153-1.104C9.383%2C8.49%2C9.738%2C7.621%2C9.891%2C6.465C10.493%2C6.355%2C10.5%2C5.967%2C10.5%2C5.5%20c0-0.437-0.008-0.804-0.502-0.94C9.999%2C4.539%2C10%2C4.521%2C10%2C4.5c0-2.103-1-4-2-4C8%2C0.5%2C7.5%2C0%2C6.5%2C0C5%2C0%2C4%2C1.877%2C4%2C4.5%20c0%2C0.021%2C0.001%2C0.039%2C0.002%2C0.06C3.508%2C4.696%2C3.5%2C5.063%2C3.5%2C5.5c0%2C0.467%2C0.007%2C0.855%2C0.609%2C0.965%20C4.262%2C7.621%2C4.617%2C8.49%2C5.303%2C8.997c0.047%2C0.341%2C0.026%2C0.704-0.153%2C1.104C1.503%2C10.503%2C0%2C12%2C0%2C12v2h14v-2%20C14%2C12%2C12.497%2C10.503%2C8.851%2C10.101z%22%2F%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3C%2Fsvg%3E\");\n}\n.ui-icon-video:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%20-2%2014%2014%22%20style%3D%22enable-background%3Anew%200%20-2%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20style%3D%22fill%3A%23FFFFFF%3B%22%20d%3D%22M8%2C0H2C0.896%2C0%2C0%2C0.896%2C0%2C2v6c0%2C1.104%2C0.896%2C2%2C2%2C2h6c1.104%2C0%2C2-0.896%2C2-2V5V2C10%2C0.896%2C9.104%2C0%2C8%2C0z%20%20M10%2C5l4%2C4V1L10%2C5z%22%2F%3E%3C%2Fsvg%3E\");\n}\n/* Alt icons */\n.ui-alt-icon.ui-icon-action:after,\n.ui-alt-icon .ui-icon-action:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20d%3D%22M9%2C5v3l5-4L9%2C0v3c0%2C0-5%2C0-5%2C7C6%2C5%2C9%2C5%2C9%2C5z%20M11%2C12H2V5h1l2-2H0v11h13V7l-2%2C2V12z%22%2F%3E%3C%2Fsvg%3E\");\n}\n.ui-alt-icon.ui-icon-alert:after,\n.ui-alt-icon .ui-icon-alert:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20d%3D%22M7%2C0L0%2C12h14L7%2C0z%20M7%2C11c-0.553%2C0-1-0.447-1-1s0.447-1%2C1-1c0.553%2C0%2C1%2C0.447%2C1%2C1S7.553%2C11%2C7%2C11z%20M7%2C8C6.447%2C8%2C6%2C7.553%2C6%2C7V5%20c0-0.553%2C0.447-1%2C1-1c0.553%2C0%2C1%2C0.447%2C1%2C1v2C8%2C7.553%2C7.553%2C8%2C7%2C8z%22%2F%3E%3C%2Fsvg%3E\");\n}\n.ui-alt-icon.ui-icon-arrow-d:after,\n.ui-alt-icon .ui-icon-arrow-d:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpolygon%20points%3D%229%2C7%209%2C0%205%2C0%205%2C7%200%2C7%207%2C14%2014%2C7%20%22%2F%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3C%2Fsvg%3E\");\n}\n.ui-alt-icon.ui-icon-arrow-d-l:after,\n.ui-alt-icon .ui-icon-arrow-d-l:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpolygon%20points%3D%2214%2C3%2011%2C0%203.5%2C7.5%200%2C4%200%2C14%2010%2C14%206.5%2C10.5%20%22%2F%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3C%2Fsvg%3E\");\n}\n.ui-alt-icon.ui-icon-arrow-d-r:after,\n.ui-alt-icon .ui-icon-arrow-d-r:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpolygon%20points%3D%2210.5%2C7.5%203%2C0%200%2C3%207.5%2C10.5%204%2C14%2014%2C14%2014%2C4%20%22%2F%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3C%2Fsvg%3E\");\n}\n.ui-alt-icon.ui-icon-arrow-l:after,\n.ui-alt-icon .ui-icon-arrow-l:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpolygon%20points%3D%227%2C5%207%2C0%200%2C7%207%2C14%207%2C9%2014%2C9%2014%2C5%20%22%2F%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3C%2Fsvg%3E\");\n}\n.ui-alt-icon.ui-icon-arrow-r:after,\n.ui-alt-icon .ui-icon-arrow-r:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpolygon%20points%3D%2214%2C7%207%2C0%207%2C5%200%2C5%200%2C9%207%2C9%207%2C14%20%22%2F%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3C%2Fsvg%3E\");\n}\n.ui-alt-icon.ui-icon-arrow-u:after,\n.ui-alt-icon .ui-icon-arrow-u:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpolygon%20points%3D%227%2C0%200%2C7%205%2C7%205%2C14%209%2C14%209%2C7%2014%2C7%20%22%2F%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3C%2Fsvg%3E\");\n}\n.ui-alt-icon.ui-icon-arrow-u-l:after,\n.ui-alt-icon .ui-icon-arrow-u-l:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpolygon%20points%3D%2214%2C11%206.5%2C3.5%2010%2C0%200%2C0%200%2C10%203.5%2C6.5%2011%2C14%20%22%2F%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3C%2Fsvg%3E\");\n}\n.ui-alt-icon.ui-icon-arrow-u-r:after,\n.ui-alt-icon .ui-icon-arrow-u-r:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpolygon%20points%3D%2214%2C0%204%2C0%207.5%2C3.5%200%2C11%203%2C14%2010.5%2C6.5%2014%2C10%20%22%2F%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3C%2Fsvg%3E\");\n}\n.ui-alt-icon.ui-icon-audio:after,\n.ui-alt-icon .ui-icon-audio:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214.018px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014.018%2014%22%20style%3D%22enable-background%3Anew%200%200%2014.018%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20d%3D%22M1%2C4C0.447%2C4%2C0%2C4.447%2C0%2C5v4c0%2C0.553%2C0.447%2C1%2C1%2C1h1l4%2C4V0L2%2C4H1z%20M10.346%2C7c0-1.699-1.042-3.154-2.546-3.867L6.982%2C4.68%20C7.885%2C5.107%2C8.51%2C5.98%2C8.51%2C7S7.885%2C8.893%2C6.982%2C9.32L7.8%2C10.867C9.304%2C10.154%2C10.346%2C8.699%2C10.346%2C7z%20M9.447%2C0.017L8.618%2C1.586%20C10.723%2C2.584%2C12.182%2C4.621%2C12.182%2C7s-1.459%2C4.416-3.563%2C5.414l0.829%2C1.569c2.707-1.283%2C4.57-3.925%2C4.57-6.983%20S12.154%2C1.3%2C9.447%2C0.017z%22%2F%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3C%2Fsvg%3E\");\n}\n.ui-alt-icon.ui-icon-back:after,\n.ui-alt-icon .ui-icon-back:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20d%3D%22M5%2C3V0L1%2C4l4%2C4V5c0%2C0%2C6%2C0%2C6%2C3s-5%2C4-5%2C4v2c0%2C0%2C7-1%2C7-6C13%2C4%2C8%2C3%2C5%2C3z%22%2F%3E%3C%2Fsvg%3E\");\n}\n.ui-alt-icon.ui-icon-bars:after,\n.ui-alt-icon .ui-icon-bars:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20d%3D%22M1%2C4h12c0.553%2C0%2C1-0.447%2C1-1s-0.447-1-1-1H1C0.447%2C2%2C0%2C2.447%2C0%2C3S0.447%2C4%2C1%2C4z%20M13%2C6H1C0.447%2C6%2C0%2C6.447%2C0%2C7%20c0%2C0.553%2C0.447%2C1%2C1%2C1h12c0.553%2C0%2C1-0.447%2C1-1C14%2C6.447%2C13.553%2C6%2C13%2C6z%20M13%2C10H1c-0.553%2C0-1%2C0.447-1%2C1s0.447%2C1%2C1%2C1h12%20c0.553%2C0%2C1-0.447%2C1-1S13.553%2C10%2C13%2C10z%22%2F%3E%3C%2Fsvg%3E\");\n}\n.ui-alt-icon.ui-icon-bullets:after,\n.ui-alt-icon .ui-icon-bullets:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20d%3D%22M5%2C4h8c0.553%2C0%2C1-0.447%2C1-1s-0.447-1-1-1H5C4.447%2C2%2C4%2C2.447%2C4%2C3S4.447%2C4%2C5%2C4z%20M13%2C6H5C4.447%2C6%2C4%2C6.447%2C4%2C7%20c0%2C0.553%2C0.447%2C1%2C1%2C1h8c0.553%2C0%2C1-0.447%2C1-1C14%2C6.447%2C13.553%2C6%2C13%2C6z%20M13%2C10H5c-0.553%2C0-1%2C0.447-1%2C1s0.447%2C1%2C1%2C1h8%20c0.553%2C0%2C1-0.447%2C1-1S13.553%2C10%2C13%2C10z%20M1%2C2C0.447%2C2%2C0%2C2.447%2C0%2C3s0.447%2C1%2C1%2C1s1-0.447%2C1-1S1.553%2C2%2C1%2C2z%20M1%2C6C0.447%2C6%2C0%2C6.447%2C0%2C7%20c0%2C0.553%2C0.447%2C1%2C1%2C1s1-0.447%2C1-1C2%2C6.447%2C1.553%2C6%2C1%2C6z%20M1%2C10c-0.553%2C0-1%2C0.447-1%2C1s0.447%2C1%2C1%2C1s1-0.447%2C1-1S1.553%2C10%2C1%2C10z%22%2F%3E%3C%2Fsvg%3E\");\n}\n.ui-alt-icon.ui-icon-calendar:after,\n.ui-alt-icon .ui-icon-calendar:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20d%3D%22M0%2C8h2V6H0V8z%20M3%2C8h2V6H3V8z%20M6%2C8h2V6H6V8z%20M9%2C8h2V6H9V8z%20M12%2C8h2V6h-2V8z%20M0%2C11h2V9H0V11z%20M3%2C11h2V9H3V11z%20M6%2C11h2V9H6V11z%20%20M9%2C11h2V9H9V11z%20M12%2C11h2V9h-2V11z%20M0%2C14h2v-2H0V14z%20M3%2C14h2v-2H3V14z%20M6%2C14h2v-2H6V14z%20M9%2C14h2v-2H9V14z%20M12%2C1%20c0-0.553-0.447-1-1-1s-1%2C0.447-1%2C1H4c0-0.553-0.447-1-1-1S2%2C0.447%2C2%2C1H0v4h14V1H12z%22%2F%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3C%2Fsvg%3E\");\n}\n.ui-alt-icon.ui-icon-camera:after,\n.ui-alt-icon .ui-icon-camera:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20d%3D%22M12%2C2.5H9.908c-0.206-0.581-0.756-1-1.408-1h-3c-0.652%2C0-1.202%2C0.419-1.408%2C1H2c-1.104%2C0-2%2C0.896-2%2C2v6c0%2C1.104%2C0.896%2C2%2C2%2C2%20h10c1.104%2C0%2C2-0.896%2C2-2v-6C14%2C3.396%2C13.104%2C2.5%2C12%2C2.5z%20M7%2C10.5c-1.657%2C0-3-1.344-3-3c0-1.657%2C1.343-3%2C3-3s3%2C1.343%2C3%2C3%20C10%2C9.156%2C8.657%2C10.5%2C7%2C10.5z%20M7%2C5.5c-1.104%2C0-2%2C0.896-2%2C2c0%2C1.104%2C0.896%2C2%2C2%2C2c1.104%2C0%2C2-0.896%2C2-2C9%2C6.396%2C8.104%2C5.5%2C7%2C5.5z%22%2F%3E%3C%2Fsvg%3E\");\n}\n.ui-alt-icon.ui-icon-carat-d:after,\n.ui-alt-icon .ui-icon-carat-d:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpolygon%20points%3D%2211.949%2C3.404%207%2C8.354%202.05%2C3.404%20-0.071%2C5.525%207%2C12.596%2014.07%2C5.525%20%22%2F%3E%3C%2Fsvg%3E\");\n}\n.ui-alt-icon.ui-icon-carat-l:after,\n.ui-alt-icon .ui-icon-carat-l:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpolygon%20points%3D%2210.596%2C11.949%205.646%2C7%2010.596%2C2.05%208.475%2C-0.071%201.404%2C7%208.475%2C14.07%20%22%2F%3E%3C%2Fsvg%3E\");\n}\n.ui-alt-icon.ui-icon-carat-r:after,\n.ui-alt-icon .ui-icon-carat-r:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpolygon%20points%3D%223.404%2C2.051%208.354%2C7%203.404%2C11.95%205.525%2C14.07%2012.596%2C7%205.525%2C-0.071%20%22%2F%3E%3C%2Fsvg%3E\");\n}\n.ui-alt-icon.ui-icon-carat-u:after,\n.ui-alt-icon .ui-icon-carat-u:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpolygon%20points%3D%222.051%2C10.596%207%2C5.646%2011.95%2C10.596%2014.07%2C8.475%207%2C1.404%20-0.071%2C8.475%20%22%2F%3E%3C%2Fsvg%3E\");\n}\n.ui-alt-icon.ui-icon-check:after,\n.ui-alt-icon .ui-icon-check:after,\nhtml .ui-alt-icon.ui-btn.ui-checkbox-on:after,\nhtml .ui-alt-icon .ui-btn.ui-checkbox-on:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpolygon%20points%3D%2214%2C4%2011%2C1%205.003%2C6.997%203%2C5%200%2C8%204.966%2C13%204.983%2C12.982%205%2C13%20%22%2F%3E%3C%2Fsvg%3E\");\n}\n.ui-alt-icon.ui-icon-clock:after,\n.ui-alt-icon .ui-icon-clock:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20d%3D%22M7%2C0C3.134%2C0%2C0%2C3.134%2C0%2C7s3.134%2C7%2C7%2C7s7-3.134%2C7-7S10.866%2C0%2C7%2C0z%20M7%2C12c-2.762%2C0-5-2.238-5-5s2.238-5%2C5-5s5%2C2.238%2C5%2C5%20S9.762%2C12%2C7%2C12z%20M9%2C6H8V4c0-0.553-0.447-1-1-1S6%2C3.447%2C6%2C4v3c0%2C0.553%2C0.447%2C1%2C1%2C1h2c0.553%2C0%2C1-0.447%2C1-1S9.553%2C6%2C9%2C6z%22%2F%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3C%2Fsvg%3E\");\n}\n.ui-alt-icon.ui-icon-cloud:after,\n.ui-alt-icon .ui-icon-cloud:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20d%3D%22M14%2C9.5c0-0.793-0.465-1.473-1.134-1.795C12.949%2C7.484%2C13%2C7.249%2C13%2C7c0-1.104-0.896-2-2-2c-0.158%2C0-0.311%2C0.023-0.457%2C0.058%20C9.816%2C3.549%2C8.286%2C2.5%2C6.5%2C2.5c-2.33%2C0-4.224%2C1.777-4.454%2C4.046C0.883%2C6.76%2C0%2C7.773%2C0%2C9c0%2C1.381%2C1.119%2C2.5%2C2.5%2C2.5h10v-0.07%20C13.361%2C11.206%2C14%2C10.432%2C14%2C9.5z%22%2F%3E%3C%2Fsvg%3E\");\n}\n.ui-alt-icon.ui-icon-comment:after,\n.ui-alt-icon .ui-icon-comment:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20d%3D%22M12%2C0H2C0.896%2C0%2C0%2C0.896%2C0%2C2v7c0%2C1.104%2C0.896%2C2%2C2%2C2h1v3l3-3h6c1.104%2C0%2C2-0.896%2C2-2V2C14%2C0.896%2C13.104%2C0%2C12%2C0z%22%2F%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3C%2Fsvg%3E\");\n}\n.ui-alt-icon.ui-icon-delete:after,\n.ui-alt-icon .ui-icon-delete:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpolygon%20points%3D%2214%2C3%2011%2C0%207%2C4%203%2C0%200%2C3%204%2C7%200%2C11%203%2C14%207%2C10%2011%2C14%2014%2C11%2010%2C7%20%22%2F%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3C%2Fsvg%3E\");\n}\n.ui-alt-icon.ui-icon-edit:after,\n.ui-alt-icon .ui-icon-edit:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20d%3D%22M1%2C10l-1%2C4l4-1l7-7L8%2C3L1%2C10z%20M11%2C0L9%2C2l3%2C3l2-2L11%2C0z%22%2F%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3C%2Fsvg%3E\");\n}\n.ui-alt-icon.ui-icon-eye:after,\n.ui-alt-icon .ui-icon-eye:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20d%3D%22M7%2C2C3%2C2%2C0%2C7%2C0%2C7s3%2C5%2C7%2C5s7-5%2C7-5S11%2C2%2C7%2C2z%20M7%2C10c-1.657%2C0-3-1.344-3-3c0-1.657%2C1.343-3%2C3-3s3%2C1.343%2C3%2C3%20C10%2C8.656%2C8.657%2C10%2C7%2C10z%20M7%2C6C6.448%2C6%2C6%2C6.447%2C6%2C7c0%2C0.553%2C0.448%2C1%2C1%2C1s1-0.447%2C1-1C8%2C6.447%2C7.552%2C6%2C7%2C6z%22%2F%3E%3C%2Fsvg%3E\");\n}\n.ui-alt-icon.ui-icon-forbidden:after,\n.ui-alt-icon .ui-icon-forbidden:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20d%3D%22M12.601%2C11.187C13.476%2C10.018%2C14%2C8.572%2C14%2C7c0-3.866-3.134-7-7-7C5.428%2C0%2C3.982%2C0.524%2C2.813%2C1.399L2.757%2C1.343L2.053%2C2.048%20L2.048%2C2.053L1.343%2C2.758l0.056%2C0.056C0.524%2C3.982%2C0%2C5.428%2C0%2C7c0%2C3.866%2C3.134%2C7%2C7%2C7c1.572%2C0%2C3.018-0.524%2C4.187-1.399l0.056%2C0.057%20l0.705-0.705l0.005-0.005l0.705-0.705L12.601%2C11.187z%20M7%2C2c2.761%2C0%2C5%2C2.238%2C5%2C5c0%2C1.019-0.308%2C1.964-0.832%2C2.754L4.246%2C2.832%20C5.036%2C2.308%2C5.981%2C2%2C7%2C2z%20M7%2C12c-2.761%2C0-5-2.238-5-5c0-1.019%2C0.308-1.964%2C0.832-2.754l6.922%2C6.922C8.964%2C11.692%2C8.019%2C12%2C7%2C12z%22%2F%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3C%2Fsvg%3E\");\n}\n.ui-alt-icon.ui-icon-forward:after,\n.ui-alt-icon .ui-icon-forward:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20d%3D%22M13%2C4L9%2C0v3C6%2C3%2C1%2C4%2C1%2C8c0%2C5%2C7%2C6%2C7%2C6v-2c0%2C0-5-1-5-4s6-3%2C6-3v3L13%2C4z%22%2F%3E%3C%2Fsvg%3E\");\n}\n.ui-alt-icon.ui-icon-gear:after,\n.ui-alt-icon .ui-icon-gear:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20d%3D%22M13.621%2C5.904l-1.036-0.259c-0.168-0.042-0.303-0.168-0.355-0.332c-0.092-0.284-0.205-0.559-0.339-0.82%20c-0.079-0.153-0.073-0.337%2C0.017-0.486l0.549-0.915c0.118-0.196%2C0.088-0.448-0.075-0.61l-0.862-0.863%20c-0.162-0.163-0.414-0.193-0.611-0.075l-0.916%2C0.55C9.844%2C2.182%2C9.659%2C2.188%2C9.506%2C2.109C9.244%2C1.975%2C8.97%2C1.861%2C8.686%2C1.77%20c-0.165-0.052-0.29-0.187-0.332-0.354L8.095%2C0.379C8.039%2C0.156%2C7.839%2C0%2C7.609%2C0H6.391c-0.229%2C0-0.43%2C0.156-0.485%2C0.379L5.646%2C1.415%20C5.604%2C1.582%2C5.479%2C1.718%2C5.313%2C1.77c-0.284%2C0.092-0.559%2C0.206-0.82%2C0.34C4.339%2C2.188%2C4.155%2C2.182%2C4.007%2C2.093L3.092%2C1.544%20c-0.196-0.118-0.448-0.087-0.61%2C0.075L1.619%2C2.481C1.457%2C2.644%2C1.426%2C2.896%2C1.544%2C3.093l0.549%2C0.914%20c0.089%2C0.148%2C0.095%2C0.332%2C0.017%2C0.486C1.975%2C4.755%2C1.861%2C5.029%2C1.77%2C5.314c-0.053%2C0.164-0.188%2C0.29-0.354%2C0.332L0.379%2C5.905%20C0.156%2C5.961%2C0%2C6.161%2C0%2C6.391v1.219c0%2C0.229%2C0.156%2C0.43%2C0.379%2C0.485l1.036%2C0.26C1.582%2C8.396%2C1.717%2C8.521%2C1.77%2C8.687%20c0.092%2C0.284%2C0.205%2C0.559%2C0.34%2C0.82C2.188%2C9.66%2C2.182%2C9.844%2C2.093%2C9.993l-0.549%2C0.915c-0.118%2C0.195-0.087%2C0.448%2C0.075%2C0.61%20l0.862%2C0.862c0.162%2C0.163%2C0.414%2C0.193%2C0.61%2C0.075l0.915-0.549c0.148-0.089%2C0.332-0.095%2C0.486-0.017%20c0.262%2C0.135%2C0.536%2C0.248%2C0.82%2C0.34c0.165%2C0.053%2C0.291%2C0.187%2C0.332%2C0.354l0.259%2C1.036C5.96%2C13.844%2C6.16%2C14%2C6.39%2C14h1.22%20c0.229%2C0%2C0.43-0.156%2C0.485-0.379l0.259-1.036c0.042-0.167%2C0.168-0.302%2C0.333-0.354c0.284-0.092%2C0.559-0.205%2C0.82-0.34%20c0.154-0.078%2C0.338-0.072%2C0.486%2C0.017l0.914%2C0.549c0.197%2C0.118%2C0.449%2C0.088%2C0.611-0.074l0.862-0.863%20c0.163-0.162%2C0.193-0.415%2C0.075-0.611l-0.549-0.915c-0.089-0.148-0.096-0.332-0.017-0.485c0.134-0.263%2C0.248-0.536%2C0.339-0.82%20c0.053-0.165%2C0.188-0.291%2C0.355-0.333l1.036-0.259C13.844%2C8.039%2C14%2C7.839%2C14%2C7.609V6.39C14%2C6.16%2C13.844%2C5.96%2C13.621%2C5.904z%20M7%2C10%20c-1.657%2C0-3-1.343-3-3s1.343-3%2C3-3s3%2C1.343%2C3%2C3S8.657%2C10%2C7%2C10z%22%2F%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3C%2Fsvg%3E\");\n}\n.ui-alt-icon.ui-icon-grid:after,\n.ui-alt-icon .ui-icon-grid:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20d%3D%22M3%2C0H1C0.447%2C0%2C0%2C0.447%2C0%2C1v2c0%2C0.553%2C0.447%2C1%2C1%2C1h2c0.553%2C0%2C1-0.447%2C1-1V1C4%2C0.447%2C3.553%2C0%2C3%2C0z%20M8%2C0H6%20C5.447%2C0%2C5%2C0.447%2C5%2C1v2c0%2C0.553%2C0.447%2C1%2C1%2C1h2c0.553%2C0%2C1-0.447%2C1-1V1C9%2C0.447%2C8.553%2C0%2C8%2C0z%20M13%2C0h-2c-0.553%2C0-1%2C0.447-1%2C1v2%20c0%2C0.553%2C0.447%2C1%2C1%2C1h2c0.553%2C0%2C1-0.447%2C1-1V1C14%2C0.447%2C13.553%2C0%2C13%2C0z%20M3%2C5H1C0.447%2C5%2C0%2C5.447%2C0%2C6v2c0%2C0.553%2C0.447%2C1%2C1%2C1h2%20c0.553%2C0%2C1-0.447%2C1-1V6C4%2C5.447%2C3.553%2C5%2C3%2C5z%20M8%2C5H6C5.447%2C5%2C5%2C5.447%2C5%2C6v2c0%2C0.553%2C0.447%2C1%2C1%2C1h2c0.553%2C0%2C1-0.447%2C1-1V6%20C9%2C5.447%2C8.553%2C5%2C8%2C5z%20M13%2C5h-2c-0.553%2C0-1%2C0.447-1%2C1v2c0%2C0.553%2C0.447%2C1%2C1%2C1h2c0.553%2C0%2C1-0.447%2C1-1V6C14%2C5.447%2C13.553%2C5%2C13%2C5z%20M3%2C10%20H1c-0.553%2C0-1%2C0.447-1%2C1v2c0%2C0.553%2C0.447%2C1%2C1%2C1h2c0.553%2C0%2C1-0.447%2C1-1v-2C4%2C10.447%2C3.553%2C10%2C3%2C10z%20M8%2C10H6c-0.553%2C0-1%2C0.447-1%2C1v2%20c0%2C0.553%2C0.447%2C1%2C1%2C1h2c0.553%2C0%2C1-0.447%2C1-1v-2C9%2C10.447%2C8.553%2C10%2C8%2C10z%20M13%2C10h-2c-0.553%2C0-1%2C0.447-1%2C1v2c0%2C0.553%2C0.447%2C1%2C1%2C1h2%20c0.553%2C0%2C1-0.447%2C1-1v-2C14%2C10.447%2C13.553%2C10%2C13%2C10z%22%2F%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3C%2Fsvg%3E\");\n}\n.ui-alt-icon.ui-icon-heart:after,\n.ui-alt-icon .ui-icon-heart:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20d%3D%22M7%2C1.958c-2-3-7-2.128-7%2C1.872c0%2C3%2C4%2C7%2C4%2C7s2.417%2C2.48%2C3%2C3c0.583-0.52%2C3-3%2C3-3s4-4%2C4-7C14-0.169%2C9-1.042%2C7%2C1.958z%22%2F%3E%3C%2Fsvg%3E\");\n}\n.ui-alt-icon.ui-icon-home:after,\n.ui-alt-icon .ui-icon-home:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpolygon%20points%3D%227%2C0%200%2C7%202%2C7%202%2C14%205%2C14%205%2C9%209%2C9%209%2C14%2012%2C14%2012%2C7%2014%2C7%20%22%2F%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3C%2Fsvg%3E\");\n}\n.ui-alt-icon.ui-icon-info:after,\n.ui-alt-icon .ui-icon-info:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20d%3D%22M7%2C0C3.134%2C0%2C0%2C3.134%2C0%2C7s3.134%2C7%2C7%2C7s7-3.134%2C7-7S10.866%2C0%2C7%2C0z%20M7%2C2c0.552%2C0%2C1%2C0.447%2C1%2C1S7.552%2C4%2C7%2C4S6%2C3.553%2C6%2C3%20S6.448%2C2%2C7%2C2z%20M9%2C11H5v-1h1V6H5V5h3v5h1V11z%22%2F%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3C%2Fsvg%3E\");\n}\n.ui-alt-icon.ui-icon-location:after,\n.ui-alt-icon .ui-icon-location:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20d%3D%22M7%2C0C4.791%2C0%2C3%2C1.791%2C3%2C4c0%2C2%2C4%2C10%2C4%2C10s4-8%2C4-10C11%2C1.791%2C9.209%2C0%2C7%2C0z%20M7%2C6C5.896%2C6%2C5%2C5.104%2C5%2C4s0.896-2%2C2-2%20c1.104%2C0%2C2%2C0.896%2C2%2C2S8.104%2C6%2C7%2C6z%22%2F%3E%3C%2Fsvg%3E\");\n}\n.ui-alt-icon.ui-icon-lock:after,\n.ui-alt-icon .ui-icon-lock:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20d%3D%22M12%2C6V5c0-2.762-2.238-5-5-5C4.239%2C0%2C2%2C2.238%2C2%2C5v1H1v8h12V6H12z%20M7.5%2C9.848V12h-1V9.848C6.207%2C9.673%2C6%2C9.366%2C6%2C9%20c0-0.553%2C0.448-1%2C1-1s1%2C0.447%2C1%2C1C8%2C9.366%2C7.793%2C9.673%2C7.5%2C9.848z%20M10%2C6H4V5c0-1.657%2C1.343-3%2C3-3s3%2C1.343%2C3%2C3V6z%22%2F%3E%3C%2Fsvg%3E\");\n}\n.ui-alt-icon.ui-icon-mail:after,\n.ui-alt-icon .ui-icon-mail:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20d%3D%22M0%2C3.75V12h14V3.75L7%2C9L0%2C3.75z%20M14%2C2H0l7%2C5L14%2C2z%22%2F%3E%3C%2Fsvg%3E\");\n}\n.ui-alt-icon.ui-icon-minus:after,\n.ui-alt-icon .ui-icon-minus:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Crect%20y%3D%225%22%20width%3D%2214%22%20height%3D%224%22%2F%3E%3C%2Fsvg%3E\");\n}\n.ui-alt-icon.ui-icon-navigation:after,\n.ui-alt-icon .ui-icon-navigation:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpolygon%20points%3D%2213%2C1%200%2C6%207%2C7%208%2C14%20%22%2F%3E%3C%2Fsvg%3E\");\n}\n.ui-alt-icon.ui-icon-phone:after,\n.ui-alt-icon .ui-icon-phone:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20d%3D%22M6.949%2C9.182C6.175%2C8.549%2C5.281%2C7.697%2C4.507%2C6.736C3.963%2C6.063%2C3.483%2C5.355%2C3.979%2C4.858l-3.482-3.48%20c-0.508%2C0.634-1.633%2C3.654%2C3.188%2C8.598c5.08%2C5.211%2C8.356%2C4.097%2C8.92%2C3.511l-3.396-3.399C8.734%2C10.561%2C8.123%2C10.139%2C6.949%2C9.182z%20%20M13.83%2C11.512v-0.004c0%2C0-2.648-2.646-2.649-2.647c-0.21-0.212-0.546-0.205-0.754%2C0.002L9.465%2C9.823l3.402%2C3.407%20c0%2C0%2C0.963-0.961%2C0.961-0.961l0.002-0.002C14.053%2C12.049%2C14.031%2C11.713%2C13.83%2C11.512z%20M5.202%2C3.636V3.634%20c0.222-0.222%2C0.2-0.557%2C0-0.758V2.873c0%2C0-2.726-2.725-2.727-2.726c-0.21-0.21-0.545-0.205-0.753%2C0.001L0.761%2C1.113L4.24%2C4.595%20C4.241%2C4.596%2C5.202%2C3.637%2C5.202%2C3.636z%22%2F%3E%3C%2Fsvg%3E\");\n}\n.ui-alt-icon.ui-icon-plus:after,\n.ui-alt-icon .ui-icon-plus:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpolygon%20points%3D%2214%2C5%209%2C5%209%2C0%205%2C0%205%2C5%200%2C5%200%2C9%205%2C9%205%2C14%209%2C14%209%2C9%2014%2C9%20%22%2F%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3C%2Fsvg%3E\");\n}\n.ui-alt-icon.ui-icon-power:after,\n.ui-alt-icon .ui-icon-power:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20d%3D%22M11.243%2C2.408c-0.392-0.401-1.024-0.401-1.415%2C0c-0.391%2C0.401-0.391%2C1.054%2C0%2C1.455C10.584%2C4.642%2C11%2C5.675%2C11%2C6.773%20s-0.416%2C2.133-1.172%2C2.91c-1.512%2C1.558-4.145%2C1.558-5.656%2C0C3.416%2C8.904%2C3%2C7.872%2C3%2C6.773C3%2C5.673%2C3.416%2C4.64%2C4.172%2C3.863%20c0.39-0.401%2C0.39-1.054%2C0-1.455c-0.391-0.401-1.024-0.401-1.415%2C0C1.624%2C3.574%2C1%2C5.125%2C1%2C6.773c0%2C1.647%2C0.624%2C3.199%2C1.757%2C4.365%20c1.134%2C1.166%2C2.64%2C1.809%2C4.243%2C1.809c1.604%2C0%2C3.109-0.645%2C4.243-1.811C12.376%2C9.975%2C13%2C8.423%2C13%2C6.773%20C13%2C5.125%2C12.376%2C3.574%2C11.243%2C2.408z%20M7%2C8.053c0.553%2C0%2C1-0.445%2C1-1v-6c0-0.553-0.447-1-1-1c-0.553%2C0-1%2C0.447-1%2C1v6%20C6%2C7.604%2C6.447%2C8.053%2C7%2C8.053z%22%2F%3E%3C%2Fsvg%3E\");\n}\n.ui-alt-icon.ui-icon-recycle:after,\n.ui-alt-icon .ui-icon-recycle:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20d%3D%22M3%2C7h1L2%2C4L0%2C7h1c0%2C3.313%2C2.687%2C6%2C6%2C6c0.702%2C0%2C1.374-0.127%2C2-0.35v-2.205C8.41%2C10.789%2C7.732%2C11%2C7%2C11C4.791%2C11%2C3%2C9.209%2C3%2C7z%20%20M13%2C7c0-3.313-2.688-6-6-6C6.298%2C1%2C5.626%2C1.127%2C5%2C1.349v2.206C5.59%2C3.211%2C6.268%2C3%2C7%2C3c2.209%2C0%2C4%2C1.791%2C4%2C4h-1l2%2C3l2-3H13z%22%2F%3E%3C%2Fsvg%3E\");\n}\n.ui-alt-icon.ui-icon-refresh:after,\n.ui-alt-icon .ui-icon-refresh:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214.001px%22%20height%3D%2214.002px%22%20viewBox%3D%220%200%2014.001%2014.002%22%20style%3D%22enable-background%3Anew%200%200%2014.001%2014.002%3B%22%20%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20d%3D%22M14.001%2C6.001v-6l-2.06%2C2.06c-0.423-0.424-0.897-0.809-1.44-1.122C7.153-0.994%2C2.872%2C0.153%2C0.939%2C3.501%20c-1.933%2C3.348-0.786%2C7.629%2C2.562%2C9.562c3.348%2C1.933%2C7.629%2C0.785%2C9.562-2.562l-1.732-1c-1.381%2C2.392-4.438%2C3.211-6.83%2C1.83%20s-3.211-4.438-1.83-6.83s4.438-3.211%2C6.83-1.83c0.389%2C0.225%2C0.718%2C0.506%2C1.02%2C0.81l-2.52%2C2.52H14.001z%22%2F%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3C%2Fsvg%3E\");\n}\n.ui-alt-icon.ui-icon-search:after,\n.ui-alt-icon .ui-icon-search:after,\n.ui-input-search:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20d%3D%22M10.171%2C8.766c0.617-0.888%2C0.979-1.964%2C0.979-3.126c0-3.037-2.463-5.5-5.5-5.5s-5.5%2C2.463-5.5%2C5.5s2.463%2C5.5%2C5.5%2C5.5%20c1.152%2C0%2C2.223-0.355%2C3.104-0.962l3.684%2C3.683l1.414-1.414L10.171%2C8.766z%20M5.649%2C9.14c-1.933%2C0-3.5-1.567-3.5-3.5%20c0-1.933%2C1.567-3.5%2C3.5-3.5c1.933%2C0%2C3.5%2C1.567%2C3.5%2C3.5C9.149%2C7.572%2C7.582%2C9.14%2C5.649%2C9.14z%22%2F%3E%3C%2Fsvg%3E\");\n}\n.ui-alt-icon.ui-icon-shop:after,\n.ui-alt-icon .ui-icon-shop:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20d%3D%22M10%2C4V3c0-1.657-1.343-3-3-3S4%2C1.343%2C4%2C3v1H1v10h12V4H10z%20M4.5%2C6C4.224%2C6%2C4%2C5.776%2C4%2C5.5S4.224%2C5%2C4.5%2C5S5%2C5.224%2C5%2C5.5%20S4.776%2C6%2C4.5%2C6z%20M5%2C3c0-1.104%2C0.896-2%2C2-2c1.104%2C0%2C2%2C0.896%2C2%2C2v1H5V3z%20M9.5%2C6C9.225%2C6%2C9%2C5.776%2C9%2C5.5S9.225%2C5%2C9.5%2C5S10%2C5.224%2C10%2C5.5%20S9.775%2C6%2C9.5%2C6z%22%2F%3E%3C%2Fsvg%3E\");\n}\n.ui-alt-icon.ui-icon-star:after,\n.ui-alt-icon .ui-icon-star:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpolygon%20points%3D%2214%2C5%209%2C5%207%2C0%205%2C5%200%2C5%204%2C8%202.625%2C13%207%2C10%2011.375%2C13%2010%2C8%20%22%2F%3E%3C%2Fsvg%3E\");\n}\n.ui-alt-icon.ui-icon-tag:after,\n.ui-alt-icon .ui-icon-tag:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20d%3D%22M5%2C0H0v5l9%2C9l5-5L5%2C0z%20M3%2C4C2.447%2C4%2C2%2C3.553%2C2%2C3s0.447-1%2C1-1s1%2C0.447%2C1%2C1S3.553%2C4%2C3%2C4z%22%2F%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3C%2Fsvg%3E\");\n}\n.ui-alt-icon.ui-icon-user:after,\n.ui-alt-icon .ui-icon-user:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%200%2014%2014%22%20style%3D%22enable-background%3Anew%200%200%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20d%3D%22M8.851%2C10.101c-0.18-0.399-0.2-0.763-0.153-1.104C9.383%2C8.49%2C9.738%2C7.621%2C9.891%2C6.465C10.493%2C6.355%2C10.5%2C5.967%2C10.5%2C5.5%20c0-0.437-0.008-0.804-0.502-0.94C9.999%2C4.539%2C10%2C4.521%2C10%2C4.5c0-2.103-1-4-2-4C8%2C0.5%2C7.5%2C0%2C6.5%2C0C5%2C0%2C4%2C1.877%2C4%2C4.5%20c0%2C0.021%2C0.001%2C0.039%2C0.002%2C0.06C3.508%2C4.696%2C3.5%2C5.063%2C3.5%2C5.5c0%2C0.467%2C0.007%2C0.855%2C0.609%2C0.965%20C4.262%2C7.621%2C4.617%2C8.49%2C5.303%2C8.997c0.047%2C0.341%2C0.026%2C0.704-0.153%2C1.104C1.503%2C10.503%2C0%2C12%2C0%2C12v2h14v-2%20C14%2C12%2C12.497%2C10.503%2C8.851%2C10.101z%22%2F%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3Cg%3E%3C%2Fg%3E%3C%2Fsvg%3E\");\n}\n.ui-alt-icon.ui-icon-video:after,\n.ui-alt-icon .ui-icon-video:after {\n\tbackground-image: url(\"data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22iso-8859-1%22%3F%3E%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20%20width%3D%2214px%22%20height%3D%2214px%22%20viewBox%3D%220%20-2%2014%2014%22%20style%3D%22enable-background%3Anew%200%20-2%2014%2014%3B%22%20xml%3Aspace%3D%22preserve%22%3E%3Cpath%20d%3D%22M8%2C0H2C0.896%2C0%2C0%2C0.896%2C0%2C2v6c0%2C1.104%2C0.896%2C2%2C2%2C2h6c1.104%2C0%2C2-0.896%2C2-2V5V2C10%2C0.896%2C9.104%2C0%2C8%2C0z%20M10%2C5l4%2C4V1L10%2C5z%22%2F%3E%3C%2Fsvg%3E\");\n}\n/* Globals */\n/* Font\n-----------------------------------------------------------------------------------------------------------*/\nhtml {\n\tfont-size: 100%;\n}\nbody,\ninput,\nselect,\ntextarea,\nbutton,\n.ui-btn {\n\tfont-size: 1em;\n\tline-height: 1.3;\n\tfont-family: sans-serif /*{global-font-family}*/;\n}\nlegend,\n.ui-input-text input,\n.ui-input-search input {\n\tcolor: inherit;\n\ttext-shadow: inherit;\n}\n/* Form labels (overrides font-weight bold in bars, and mini font-size) */\n.ui-mobile label,\ndiv.ui-controlgroup-label {\n\tfont-weight: normal;\n\tfont-size: 16px;\n}\n/* Separators\n-----------------------------------------------------------------------------------------------------------*/\n/* Field contain separator (< 28em) */\n.ui-field-contain {\n\tborder-bottom-color: #828282;\n\tborder-bottom-color: rgba(0,0,0,.15);\n\tborder-bottom-width: 1px;\n\tborder-bottom-style: solid;\n}\n/* Table opt-in classes: strokes between each row, and alternating row stripes */\n/* Classes table-stroke and table-stripe are deprecated in 1.4. */\n.table-stroke thead th,\n.table-stripe thead th,\n.table-stripe tbody tr:last-child {\n\tborder-bottom: 1px solid #d6d6d6; /* non-RGBA fallback */\n\tborder-bottom: 1px solid rgba(0,0,0,.1);\n}\n.table-stroke tbody th,\n.table-stroke tbody td {\n\tborder-bottom: 1px solid #e6e6e6; /* non-RGBA fallback  */\n\tborder-bottom: 1px solid rgba(0,0,0,.05);\n}\n.table-stripe.table-stroke tbody tr:last-child th,\n.table-stripe.table-stroke tbody tr:last-child td {\n\tborder-bottom: 0;\n}\n.table-stripe tbody tr:nth-child(odd) td,\n.table-stripe tbody tr:nth-child(odd) th {\n\tbackground-color: #eeeeee; /* non-RGBA fallback  */\n\tbackground-color: rgba(0,0,0,.04);\n}\n/* Buttons\n-----------------------------------------------------------------------------------------------------------*/\n.ui-btn,\nlabel.ui-btn {\n\tfont-weight: bold;\n\tborder-width: 1px;\n\tborder-style: solid;\n}\n.ui-btn {\n\ttext-decoration: none !important;\n}\n.ui-btn-active {\n\tcursor: pointer;\n}\n/* Corner rounding\n-----------------------------------------------------------------------------------------------------------*/\n/* Class ui-btn-corner-all deprecated in 1.4 */\n.ui-corner-all {\n\t-webkit-border-radius: \t\t\t\t.3125em /*{global-radii-blocks}*/;\n\tborder-radius: \t\t\t\t\t\t.3125em /*{global-radii-blocks}*/;\n}\n/* Buttons */\n.ui-btn-corner-all,\n.ui-btn.ui-corner-all,\n/* Slider track */\n.ui-slider-track.ui-corner-all,\n/* Flipswitch */\n.ui-flipswitch.ui-corner-all,\n/* Count bubble */\n.ui-li-count {\n\t-webkit-border-radius: \t\t\t\t.3125em /*{global-radii-buttons}*/;\n\tborder-radius: \t\t\t\t\t\t.3125em /*{global-radii-buttons}*/;\n}\n/* Icon-only buttons */\n.ui-btn-icon-notext.ui-btn-corner-all,\n.ui-btn-icon-notext.ui-corner-all {\n\t-webkit-border-radius: 1em;\n\tborder-radius: 1em;\n}\n/* Radius clip workaround for cleaning up corner trapping */\n.ui-btn-corner-all,\n.ui-corner-all {\n\t-webkit-background-clip: padding;\n\tbackground-clip: padding-box;\n}\n/* Popup arrow */\n.ui-popup.ui-corner-all > .ui-popup-arrow-guide {\n\tleft: .6em /*{global-radii-blocks}*/;\n\tright: .6em /*{global-radii-blocks}*/;\n\ttop: .6em /*{global-radii-blocks}*/;\n\tbottom: .6em /*{global-radii-blocks}*/;\n}\n/* Shadow\n-----------------------------------------------------------------------------------------------------------*/\n.ui-shadow {\n\t-webkit-box-shadow: 0 1px 3px /*{global-box-shadow-size}*/ \t\trgba(0,0,0,.15) /*{global-box-shadow-color}*/;\n\t-moz-box-shadow: 0 1px 3px /*{global-box-shadow-size}*/ \t\trgba(0,0,0,.15) /*{global-box-shadow-color}*/;\n\tbox-shadow: 0 1px 3px /*{global-box-shadow-size}*/ \t\t\t\trgba(0,0,0,.15) /*{global-box-shadow-color}*/;\n}\n.ui-shadow-inset {\n\t-webkit-box-shadow: inset 0 1px 3px /*{global-box-shadow-size}*/ \trgba(0,0,0,.2) /*{global-box-shadow-color}*/;\n\t-moz-box-shadow: inset 0 1px 3px /*{global-box-shadow-size}*/ \t\trgba(0,0,0,.2) /*{global-box-shadow-color}*/;\n\tbox-shadow: inset 0 1px 3px /*{global-box-shadow-size}*/ \trgba(0,0,0,.2) /*{global-box-shadow-color}*/;\n}\n.ui-overlay-shadow {\n\t-webkit-box-shadow: 0 0 12px \t\trgba(0,0,0,.6);\n\t-moz-box-shadow: 0 0 12px \t\t\trgba(0,0,0,.6);\n\tbox-shadow: 0 0 12px \t\t\t\trgba(0,0,0,.6);\n}\n/* Icons\n-----------------------------------------------------------------------------------------------------------*/\n.ui-btn-icon-left:after,\n.ui-btn-icon-right:after,\n.ui-btn-icon-top:after,\n.ui-btn-icon-bottom:after,\n.ui-btn-icon-notext:after {\n\tbackground-color: \t\t\t\t\t#666 /*{global-icon-color}*/;\n\tbackground-color: \t\t\t\t\trgba(0,0,0,.3) /*{global-icon-disc}*/;\n\tbackground-position: center center;\n\tbackground-repeat: no-repeat;\n\t-webkit-border-radius: 1em;\n\tborder-radius: 1em;\n}\n/* Alt icons */\n.ui-alt-icon.ui-btn:after,\n.ui-alt-icon .ui-btn:after,\nhtml .ui-alt-icon.ui-checkbox-off:after,\nhtml .ui-alt-icon.ui-radio-off:after,\nhtml .ui-alt-icon .ui-checkbox-off:after,\nhtml .ui-alt-icon .ui-radio-off:after {\n\tbackground-color: \t\t\t\t\t#666 /*{global-icon-color}*/;\n\tbackground-color: \t\t\t\t\trgba(0,0,0,.15) /*{global-icon-disc}*/;\n}\n/* No disc */\n.ui-nodisc-icon.ui-btn:after,\n.ui-nodisc-icon .ui-btn:after {\n\tbackground-color: transparent;\n}\n/* Icon shadow */\n.ui-shadow-icon.ui-btn:after,\n.ui-shadow-icon .ui-btn:after {\n\t-webkit-box-shadow: 0 1px 0 \t\t\trgba(255,255,255,.3) /*{global-icon-shadow}*/;\n\t-moz-box-shadow: 0 1px 0 \t\t\t\trgba(255,255,255,.3) /*{global-icon-shadow}*/;\n\tbox-shadow: 0 1px 0 \t\t\t\t\trgba(255,255,255,.3) /*{global-icon-shadow}*/;\n}\n/* Checkbox and radio */\n.ui-btn.ui-checkbox-off:after,\n.ui-btn.ui-checkbox-on:after,\n.ui-btn.ui-radio-off:after,\n.ui-btn.ui-radio-on:after {\n\tdisplay: block;\n\twidth: 18px;\n\theight: 18px;\n\tmargin: -9px 2px 0 2px;\n}\n.ui-checkbox-off:after,\n.ui-btn.ui-radio-off:after {\n\tfilter: Alpha(Opacity=30);\n\topacity: .3;\n}\n.ui-btn.ui-checkbox-off:after,\n.ui-btn.ui-checkbox-on:after {\n\t-webkit-border-radius: .1875em;\n\tborder-radius: .1875em;\n}\n.ui-btn.ui-checkbox-off:after {\n\tbackground-color: #666;\n\tbackground-color: rgba(0,0,0,.3);\n}\n.ui-radio .ui-btn.ui-radio-on:after {\n\tbackground-image: none;\n\tbackground-color: #fff;\n\twidth: 8px;\n\theight: 8px;\n\tborder-width: 5px;\n\tborder-style: solid; \n}\n.ui-alt-icon.ui-btn.ui-radio-on:after,\n.ui-alt-icon .ui-btn.ui-radio-on:after {\n\tbackground-color: #000;\n}\n/* Loader */\n.ui-icon-loading {\n\tbackground: url(images/ajax-loader.gif);\n\tbackground-size: 2.875em 2.875em;\n}\n/* Swatches */\n/* A\n-----------------------------------------------------------------------------------------------------------*/\n/* Bar: Toolbars, dividers, slider track */\n.ui-bar-a,\n.ui-page-theme-a .ui-bar-inherit,\nhtml .ui-bar-a .ui-bar-inherit,\nhtml .ui-body-a .ui-bar-inherit,\nhtml body .ui-group-theme-a .ui-bar-inherit {\n\tbackground-color: \t\t\t#e9e9e9 /*{a-bar-background-color}*/;\n\tborder-color:\t \t\t#ddd /*{a-bar-border}*/;\n\tcolor: \t\t\t\t\t#333 /*{a-bar-color}*/;\n\ttext-shadow: 0 /*{a-bar-shadow-x}*/ 1px /*{a-bar-shadow-y}*/ 0 /*{a-bar-shadow-radius}*/ \t#eee /*{a-bar-shadow-color}*/;\n\tfont-weight: bold;\n}\n.ui-bar-a {\n\tborder-width: 1px;\n\tborder-style: solid;\n}\n/* Page and overlay */\n.ui-overlay-a,\n.ui-page-theme-a,\n.ui-page-theme-a .ui-panel-wrapper {\n\tbackground-color: \t\t\t#f9f9f9 /*{a-page-background-color}*/;\n\tborder-color:\t \t\t#bbb /*{a-page-border}*/;\n\tcolor: \t\t\t\t\t#333 /*{a-page-color}*/;\n\ttext-shadow: 0 /*{a-page-shadow-x}*/ 1px /*{a-page-shadow-y}*/ 0 /*{a-page-shadow-radius}*/ \t#f3f3f3 /*{a-page-shadow-color}*/;\n}\n/* Body: Read-only lists, text inputs, collapsible content */\n.ui-body-a,\n.ui-page-theme-a .ui-body-inherit,\nhtml .ui-bar-a .ui-body-inherit,\nhtml .ui-body-a .ui-body-inherit,\nhtml body .ui-group-theme-a .ui-body-inherit,\nhtml .ui-panel-page-container-a {\n\tbackground-color: \t\t\t#fff /*{a-body-background-color}*/;\n\tborder-color:\t \t\t#ddd /*{a-body-border}*/;\n\tcolor: \t\t\t\t\t#333 /*{a-body-color}*/;\n\ttext-shadow: 0 /*{a-body-shadow-x}*/ 1px /*{a-body-shadow-y}*/ 0 /*{a-body-shadow-radius}*/ \t#f3f3f3 /*{a-body-shadow-color}*/;\n}\n.ui-body-a {\n\tborder-width: 1px;\n\tborder-style: solid;\n}\n/* Links */\n.ui-page-theme-a a,\nhtml .ui-bar-a a,\nhtml .ui-body-a a,\nhtml body .ui-group-theme-a a {\n\tcolor: #3388cc /*{a-link-color}*/;\n\tfont-weight: bold;\n}\n.ui-page-theme-a a:visited,\nhtml .ui-bar-a a:visited,\nhtml .ui-body-a a:visited,\nhtml body .ui-group-theme-a a:visited {\n    color: #3388cc /*{a-link-visited}*/;\n}\n.ui-page-theme-a a:hover,\nhtml .ui-bar-a a:hover,\nhtml .ui-body-a a:hover,\nhtml body .ui-group-theme-a a:hover {\n\tcolor: #005599 /*{a-link-hover}*/;\n}\n.ui-page-theme-a a:active,\nhtml .ui-bar-a a:active,\nhtml .ui-body-a a:active,\nhtml body .ui-group-theme-a a:active {\n\tcolor: #005599 /*{a-link-active}*/;\n}\n/* Button up */\n.ui-page-theme-a .ui-btn,\nhtml .ui-bar-a .ui-btn,\nhtml .ui-body-a .ui-btn,\nhtml body .ui-group-theme-a .ui-btn,\nhtml head + body .ui-btn.ui-btn-a,\n/* Button visited */\n.ui-page-theme-a .ui-btn:visited,\nhtml .ui-bar-a .ui-btn:visited,\nhtml .ui-body-a .ui-btn:visited,\nhtml body .ui-group-theme-a .ui-btn:visited,\nhtml head + body .ui-btn.ui-btn-a:visited {\n\tbackground-color: \t\t\t#f6f6f6 /*{a-bup-background-color}*/;\n\tborder-color:\t \t\t#ddd /*{a-bup-border}*/;\n\tcolor: \t\t\t\t\t#333 /*{a-bup-color}*/;\n\ttext-shadow: 0 /*{a-bup-shadow-x}*/ 1px /*{a-bup-shadow-y}*/ 0 /*{a-bup-shadow-radius}*/ #f3f3f3 /*{a-bup-shadow-color}*/;\n}\n/* Button hover */\n.ui-page-theme-a .ui-btn:hover,\nhtml .ui-bar-a .ui-btn:hover,\nhtml .ui-body-a .ui-btn:hover,\nhtml body .ui-group-theme-a .ui-btn:hover,\nhtml head + body .ui-btn.ui-btn-a:hover {\n\tbackground-color: \t\t\t#ededed /*{a-bhover-background-color}*/;\n\tborder-color:\t \t\t#ddd /*{a-bhover-border}*/;\n\tcolor: \t\t\t\t\t#333 /*{a-bhover-color}*/;\n\ttext-shadow: 0 /*{a-bhover-shadow-x}*/ 1px /*{a-bhover-shadow-y}*/ 0 /*{a-bhover-shadow-radius}*/ #f3f3f3 /*{a-bhover-shadow-color}*/;\n}\n/* Button down */\n.ui-page-theme-a .ui-btn:active,\nhtml .ui-bar-a .ui-btn:active,\nhtml .ui-body-a .ui-btn:active,\nhtml body .ui-group-theme-a .ui-btn:active,\nhtml head + body .ui-btn.ui-btn-a:active {\n\tbackground-color: \t\t\t#e8e8e8 /*{a-bdown-background-color}*/;\n\tborder-color:\t \t\t#ddd /*{a-bdown-border}*/;\n\tcolor: \t\t\t\t\t#333 /*{a-bdown-color}*/;\n\ttext-shadow: 0 /*{a-bdown-shadow-x}*/ 1px /*{a-bdown-shadow-y}*/ 0 /*{a-bdown-shadow-radius}*/ #f3f3f3 /*{a-bdown-shadow-color}*/;\n}\n/* Active button */\n.ui-page-theme-a .ui-btn.ui-btn-active,\nhtml .ui-bar-a .ui-btn.ui-btn-active,\nhtml .ui-body-a .ui-btn.ui-btn-active,\nhtml body .ui-group-theme-a .ui-btn.ui-btn-active,\nhtml head + body .ui-btn.ui-btn-a.ui-btn-active,\n/* Active checkbox icon */\n.ui-page-theme-a .ui-checkbox-on:after,\nhtml .ui-bar-a .ui-checkbox-on:after,\nhtml .ui-body-a .ui-checkbox-on:after,\nhtml body .ui-group-theme-a .ui-checkbox-on:after,\n.ui-btn.ui-checkbox-on.ui-btn-a:after,\n/* Active flipswitch background */\n.ui-page-theme-a .ui-flipswitch-active,\nhtml .ui-bar-a .ui-flipswitch-active,\nhtml .ui-body-a .ui-flipswitch-active,\nhtml body .ui-group-theme-a .ui-flipswitch-active,\nhtml body .ui-flipswitch.ui-bar-a.ui-flipswitch-active,\n/* Active slider track */\n.ui-page-theme-a .ui-slider-track .ui-btn-active,\nhtml .ui-bar-a .ui-slider-track .ui-btn-active,\nhtml .ui-body-a .ui-slider-track .ui-btn-active,\nhtml body .ui-group-theme-a .ui-slider-track .ui-btn-active,\nhtml body div.ui-slider-track.ui-body-a .ui-btn-active {\n\tbackground-color: \t\t#3388cc /*{a-active-background-color}*/;\n\tborder-color:\t \t\t#3388cc /*{a-active-border}*/;\n\tcolor: \t\t\t\t\t#fff /*{a-active-color}*/;\n\ttext-shadow: 0 /*{a-active-shadow-x}*/ 1px /*{a-active-shadow-y}*/ 0 /*{a-active-shadow-radius}*/ #005599 /*{a-active-shadow-color}*/;\n}\n/* Active radio button icon */\n.ui-page-theme-a .ui-radio-on:after,\nhtml .ui-bar-a .ui-radio-on:after,\nhtml .ui-body-a .ui-radio-on:after,\nhtml body .ui-group-theme-a .ui-radio-on:after,\n.ui-btn.ui-radio-on.ui-btn-a:after {\n\tborder-color:\t\t\t#3388cc /*{a-active-background-color}*/;\n}\n/* Focus */\n.ui-page-theme-a .ui-btn:focus,\nhtml .ui-bar-a .ui-btn:focus,\nhtml .ui-body-a .ui-btn:focus,\nhtml body .ui-group-theme-a .ui-btn:focus,\nhtml head + body .ui-btn.ui-btn-a:focus,\n/* Focus buttons and text inputs with div wrap */\n.ui-page-theme-a .ui-focus,\nhtml .ui-bar-a .ui-focus,\nhtml .ui-body-a .ui-focus,\nhtml body .ui-group-theme-a .ui-focus,\nhtml head + body .ui-btn-a.ui-focus,\nhtml head + body .ui-body-a.ui-focus {\n\t-webkit-box-shadow: 0 0 12px \t#3388cc /*{a-active-background-color}*/;\n\t-moz-box-shadow: 0 0 12px \t\t#3388cc /*{a-active-background-color}*/;\n\tbox-shadow: 0 0 12px \t\t\t#3388cc /*{a-active-background-color}*/;\n}\n/* B\n-----------------------------------------------------------------------------------------------------------*/\n/* Bar: Toolbars, dividers, slider track */\n.ui-bar-b,\n.ui-page-theme-b .ui-bar-inherit,\nhtml .ui-bar-b .ui-bar-inherit,\nhtml .ui-body-b .ui-bar-inherit,\nhtml body .ui-group-theme-b .ui-bar-inherit {\n\tbackground-color: \t\t\t#1d1d1d /*{b-bar-background-color}*/;\n\tborder-color:\t \t\t#1b1b1b /*{b-bar-border}*/;\n\tcolor: \t\t\t\t\t#fff /*{b-bar-color}*/;\n\ttext-shadow: 0 /*{b-bar-shadow-x}*/ 1px /*{b-bar-shadow-y}*/ 0 /*{b-bar-shadow-radius}*/ \t#111 /*{b-bar-shadow-color}*/;\n\tfont-weight: bold;\n}\n.ui-bar-b {\n\tborder-width: 1px;\n\tborder-style: solid;\n}\n/* Page and overlay */\n.ui-overlay-b,\n.ui-page-theme-b,\n.ui-page-theme-b .ui-panel-wrapper {\n\tbackground-color: \t\t\t#252525 /*{b-page-background-color}*/;\n\tborder-color:\t \t\t#454545 /*{b-page-border}*/;\n\tcolor: \t\t\t\t\t#fff /*{b-page-color}*/;\n\ttext-shadow: 0 /*{b-page-shadow-x}*/ 1px /*{b-page-shadow-y}*/ 0 /*{b-page-shadow-radius}*/ \t#111 /*{b-page-shadow-color}*/;\n}\n/* Body: Read-only lists, text inputs, collapsible content */\n.ui-body-b,\n.ui-page-theme-b .ui-body-inherit,\nhtml .ui-bar-b .ui-body-inherit,\nhtml .ui-body-b .ui-body-inherit,\nhtml body .ui-group-theme-b .ui-body-inherit,\nhtml .ui-panel-page-container-b {\n\tbackground-color: \t\t\t#2a2a2a /*{b-body-background-color}*/;\n\tborder-color:\t \t\t#1d1d1d /*{b-body-border}*/;\n\tcolor: \t\t\t\t\t#fff /*{b-body-color}*/;\n\ttext-shadow: 0 /*{b-body-shadow-x}*/ 1px /*{b-body-shadow-y}*/ 0 /*{b-body-shadow-radius}*/ \t#111 /*{b-body-shadow-color}*/;\n}\n.ui-body-b {\n\tborder-width: 1px;\n\tborder-style: solid;\n}\n/* Links */\n.ui-page-theme-b a,\nhtml .ui-bar-b a,\nhtml .ui-body-b a,\nhtml body .ui-group-theme-b a {\n\tcolor: #22aadd /*{b-link-color}*/;\n\tfont-weight: bold;\n}\n.ui-page-theme-b a:visited,\nhtml .ui-bar-b a:visited,\nhtml .ui-body-b a:visited,\nhtml body .ui-group-theme-b a:visited {\n    color: #22aadd /*{b-link-visited}*/;\n}\n.ui-page-theme-b a:hover,\nhtml .ui-bar-b a:hover,\nhtml .ui-body-b a:hover,\nhtml body .ui-group-theme-b a:hover {\n\tcolor: #0088bb /*{b-link-hover}*/;\n}\n.ui-page-theme-b a:active,\nhtml .ui-bar-b a:active,\nhtml .ui-body-b a:active,\nhtml body .ui-group-theme-b a:active {\n\tcolor: #0088bb /*{b-link-active}*/;\n}\n/* Button up */\n.ui-page-theme-b .ui-btn,\nhtml .ui-bar-b .ui-btn,\nhtml .ui-body-b .ui-btn,\nhtml body .ui-group-theme-b .ui-btn,\nhtml head + body .ui-btn.ui-btn-b,\n/* Button visited */\n.ui-page-theme-b .ui-btn:visited,\nhtml .ui-bar-b .ui-btn:visited,\nhtml .ui-body-b .ui-btn:visited,\nhtml body .ui-group-theme-b .ui-btn:visited,\nhtml head + body .ui-btn.ui-btn-b:visited {\n\tbackground-color: \t\t\t#333 /*{b-bup-background-color}*/;\n\tborder-color:\t \t\t#1f1f1f /*{b-bup-border}*/;\n\tcolor: \t\t\t\t\t#fff /*{b-bup-color}*/;\n\ttext-shadow: 0 /*{b-bup-shadow-x}*/ 1px /*{b-bup-shadow-y}*/ 0 /*{b-bup-shadow-radius}*/ #111 /*{b-bup-shadow-color}*/;\n}\n/* Button hover */\n.ui-page-theme-b .ui-btn:hover,\nhtml .ui-bar-b .ui-btn:hover,\nhtml .ui-body-b .ui-btn:hover,\nhtml body .ui-group-theme-b .ui-btn:hover,\nhtml head + body .ui-btn.ui-btn-b:hover {\n\tbackground-color: \t\t\t#373737 /*{b-bhover-background-color}*/;\n\tborder-color:\t \t\t#1f1f1f /*{b-bhover-border}*/;\n\tcolor: \t\t\t\t\t#fff /*{b-bhover-color}*/;\n\ttext-shadow: 0 /*{b-bhover-shadow-x}*/ 1px /*{b-bhover-shadow-y}*/ 0 /*{b-bhover-shadow-radius}*/ #111 /*{b-bhover-shadow-color}*/;\n}\n/* Button down */\n.ui-page-theme-b .ui-btn:active,\nhtml .ui-bar-b .ui-btn:active,\nhtml .ui-body-b .ui-btn:active,\nhtml body .ui-group-theme-b .ui-btn:active,\nhtml head + body .ui-btn.ui-btn-b:active {\n\tbackground-color: \t\t\t#404040 /*{b-bdown-background-color}*/;\n\tborder-color:\t \t\t#1f1f1f /*{b-bdown-border}*/;\n\tcolor: \t\t\t\t\t#fff /*{b-bdown-color}*/;\n\ttext-shadow: 0 /*{b-bdown-shadow-x}*/ 1px /*{b-bdown-shadow-y}*/ 0 /*{b-bdown-shadow-radius}*/ #111 /*{b-bdown-shadow-color}*/;\n}\n/* Active button */\n.ui-page-theme-b .ui-btn.ui-btn-active,\nhtml .ui-bar-b .ui-btn.ui-btn-active,\nhtml .ui-body-b .ui-btn.ui-btn-active,\nhtml body .ui-group-theme-b .ui-btn.ui-btn-active,\nhtml head + body .ui-btn.ui-btn-b.ui-btn-active,\n/* Active checkbox icon */\n.ui-page-theme-b .ui-checkbox-on:after,\nhtml .ui-bar-b .ui-checkbox-on:after,\nhtml .ui-body-b .ui-checkbox-on:after,\nhtml body .ui-group-theme-b .ui-checkbox-on:after,\n.ui-btn.ui-checkbox-on.ui-btn-b:after,\n/* Active flipswitch background */\n.ui-page-theme-b .ui-flipswitch-active,\nhtml .ui-bar-b .ui-flipswitch-active,\nhtml .ui-body-b .ui-flipswitch-active,\nhtml body .ui-group-theme-b .ui-flipswitch-active,\nhtml body .ui-flipswitch.ui-bar-b.ui-flipswitch-active,\n/* Active slider track */\n.ui-page-theme-b .ui-slider-track .ui-btn-active,\nhtml .ui-bar-b .ui-slider-track .ui-btn-active,\nhtml .ui-body-b .ui-slider-track .ui-btn-active,\nhtml body .ui-group-theme-b .ui-slider-track .ui-btn-active,\nhtml body div.ui-slider-track.ui-body-b .ui-btn-active {\n\tbackground-color: \t\t#22aadd /*{b-active-background-color}*/;\n\tborder-color:\t \t\t#22aadd /*{b-active-border}*/;\n\tcolor: \t\t\t\t\t#fff /*{b-active-color}*/;\n\ttext-shadow: 0 /*{b-active-shadow-x}*/ 1px /*{b-active-shadow-y}*/ 0 /*{b-active-shadow-radius}*/ #0088bb /*{b-active-shadow-color}*/;\n}\n/* Active radio button icon */\n.ui-page-theme-b .ui-radio-on:after,\nhtml .ui-bar-b .ui-radio-on:after,\nhtml .ui-body-b .ui-radio-on:after,\nhtml body .ui-group-theme-b .ui-radio-on:after,\n.ui-btn.ui-radio-on.ui-btn-b:after {\n\tborder-color:\t\t\t#22aadd /*{b-active-background-color}*/;\n}\n/* Focus */\n.ui-page-theme-b .ui-btn:focus,\nhtml .ui-bar-b .ui-btn:focus,\nhtml .ui-body-b .ui-btn:focus,\nhtml body .ui-group-theme-b .ui-btn:focus,\nhtml head + body .ui-btn.ui-btn-b:focus,\n/* Focus buttons and text inputs with div wrap */\n.ui-page-theme-b .ui-focus,\nhtml .ui-bar-b .ui-focus,\nhtml .ui-body-b .ui-focus,\nhtml body .ui-group-theme-b .ui-focus,\nhtml head + body .ui-btn-b.ui-focus,\nhtml head + body .ui-body-b.ui-focus {\n\t-webkit-box-shadow: 0 0 12px \t#22aadd /*{b-active-background-color}*/;\n\t-moz-box-shadow: 0 0 12px \t\t#22aadd /*{b-active-background-color}*/;\n\tbox-shadow: 0 0 12px \t\t\t#22aadd /*{b-active-background-color}*/;\n}\n/* Structure */\n/* Disabled\n-----------------------------------------------------------------------------------------------------------*/\n/* Class ui-disabled deprecated in 1.4. :disabled not supported by IE8 so we use [disabled] */\n.ui-disabled,\n.ui-state-disabled,\nbutton[disabled],\n.ui-select .ui-btn.ui-state-disabled {\n\tfilter: Alpha(Opacity=30);\n\topacity: .3;\n\tcursor: default !important;\n\tpointer-events: none;\n}\n/* Focus state outline\n-----------------------------------------------------------------------------------------------------------*/\n.ui-btn:focus,\n.ui-btn.ui-focus {\n\toutline: 0;\n}\n/* Unset box-shadow in browsers that don't do it right */\n.ui-noboxshadow .ui-shadow,\n.ui-noboxshadow .ui-shadow-inset,\n.ui-noboxshadow .ui-overlay-shadow,\n.ui-noboxshadow .ui-shadow-icon.ui-btn:after,\n.ui-noboxshadow .ui-shadow-icon .ui-btn:after,\n.ui-noboxshadow .ui-focus,\n.ui-noboxshadow .ui-btn:focus,\n.ui-noboxshadow  input:focus,\n.ui-noboxshadow .ui-panel {\n\t-webkit-box-shadow: none !important;\n\t-moz-box-shadow: none !important;\n\tbox-shadow: none !important;\n}\n.ui-noboxshadow .ui-btn:focus,\n.ui-noboxshadow .ui-focus {\n\toutline-width: 1px;\n\toutline-style: auto;\n}\n/* Some unsets */\n.ui-mobile,\n.ui-mobile body {\n\theight: 99.9%;\n}\n.ui-mobile fieldset,\n.ui-page {\n\tpadding: 0;\n\tmargin: 0;\n}\n.ui-mobile a img,\n.ui-mobile fieldset {\n\tborder-width: 0;\n}\n/* Fixes for fieldset issues on IE10 and FF (see #6077) */\n.ui-mobile fieldset {\n\tmin-width: 0;\n}\n@-moz-document url-prefix() {\n\t.ui-mobile fieldset {\n\t\tdisplay: table-column;\n\t\tvertical-align: middle;\n\t}\n}\n/* Viewport */\n.ui-mobile-viewport {\n\tmargin: 0;\n\toverflow-x: visible;\n\t-webkit-text-size-adjust: 100%;\n\t-ms-text-size-adjust:none;\n\t-webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\n/* Issue #2066 */\nbody.ui-mobile-viewport,\ndiv.ui-mobile-viewport {\n\toverflow-x: hidden;\n}\n/* \"page\" containers - full-screen views, one should always be in view post-pageload */\n.ui-mobile [data-role=page],\n.ui-mobile [data-role=dialog],\n.ui-page {\n\ttop: 0;\n\tleft: 0;\n\twidth: 100%;\n\tmin-height: 100%;\n\tposition: absolute;\n\tdisplay: none;\n\tborder: 0;\n}\n/* On ios4, setting focus on the page element causes flashing during transitions when there is an outline, so we turn off outlines */\n.ui-page {\n\toutline: none;\n}\n.ui-mobile .ui-page-active {\n\tdisplay: block;\n\toverflow: visible;\n\toverflow-x: hidden;\n}\n@media screen and (orientation: portrait) {\n\t.ui-mobile .ui-page {\n\t\tmin-height: 420px;\n\t}\n}\n@media screen and (orientation: landscape) {\n\t.ui-mobile .ui-page {\n\t\tmin-height: 300px;\n\t}\n}\n/* Fouc */\n.ui-mobile-rendering > * {\n\tvisibility: hidden;\n}\n/* Non-js content hiding */\n.ui-nojs {\n\tposition: absolute !important;\n\theight: 1px;\n\twidth: 1px;\n\toverflow: hidden;\n\tclip: rect(1px,1px,1px,1px);\n}\n/* Loading screen */\n.ui-loading .ui-loader {\n\tdisplay: block;\n}\n.ui-loader {\n\tdisplay: none;\n\tz-index: 9999999;\n\tposition: fixed;\n\ttop: 50%;\n\tleft: 50%;\n\tborder:0;\n}\n.ui-loader-default {\n\tbackground: none;\n\tfilter: Alpha(Opacity=18);\n\topacity: .18;\n\twidth: 2.875em;\n\theight: 2.875em;\n\tmargin-left: -1.4375em;\n\tmargin-top: -1.4375em;\n}\n.ui-loader-verbose {\n\twidth: 12.5em;\n\tfilter: Alpha(Opacity=88);\n\topacity: .88;\n\tbox-shadow: 0 1px 1px -1px #fff;\n\theight: auto;\n\tmargin-left: -6.875em;\n\tmargin-top: -2.6875em;\n\tpadding: .625em;\n}\n.ui-loader-default h1 {\n\tfont-size: 0;\n\twidth: 0;\n\theight: 0;\n\toverflow: hidden;\n}\n.ui-loader-verbose h1 {\n\tfont-size: 1em;\n\tmargin: 0;\n\ttext-align: center;\n}\n.ui-loader .ui-icon-loading {\n\tbackground-color: #000;\n\tdisplay: block;\n\tmargin: 0;\n\twidth: 2.75em;\n\theight: 2.75em;\n\tpadding: .0625em;\n\t-webkit-border-radius: 2.25em;\n\tborder-radius: 2.25em;\n}\n.ui-loader-verbose .ui-icon-loading {\n\tmargin: 0 auto .625em;\n\tfilter: Alpha(Opacity=75);\n\topacity: .75;\n}\n.ui-loader-textonly {\n\tpadding: .9375em;\n\tmargin-left: -7.1875em;\n}\n.ui-loader-textonly .ui-icon-loading {\n\tdisplay: none;\n}\n.ui-loader-fakefix {\n\tposition: absolute;\n}\n/* Headers, content panels */\n.ui-bar,\n.ui-body {\n\tposition: relative;\n\tpadding: .4em 1em;\n\toverflow: hidden;\n\tdisplay: block;\n\tclear: both;\n}\n.ui-bar h1,\n.ui-bar h2,\n.ui-bar h3,\n.ui-bar h4,\n.ui-bar h5,\n.ui-bar h6 {\n\tmargin: 0;\n\tpadding: 0;\n\tfont-size: 1em;\n\tdisplay: inline-block;\n}\n.ui-header,\n.ui-footer {\n\tborder-width: 1px 0;\n\tborder-style: solid;\n\tposition: relative;\n}\n.ui-header:empty,\n.ui-footer:empty {\n\tmin-height: 2.6875em;\n}\n.ui-header .ui-title,\n.ui-footer .ui-title {\n\tfont-size: 1em;\n\tmin-height: 1.1em;\n\ttext-align: center;\n\tdisplay: block;\n\tmargin: 0 30%;\n\tpadding: .7em 0;\n\ttext-overflow: ellipsis;\n\toverflow: hidden;\n\twhite-space: nowrap;\n\toutline: 0 !important;\n}\n.ui-footer .ui-title {\n\tmargin: 0 1em;\n}\n.ui-content {\n\tborder-width: 0;\n\toverflow: visible;\n\toverflow-x: hidden;\n\tpadding: 1em;\n}\n/* Corner styling for dialogs and popups */\n.ui-corner-all > .ui-header:first-child,\n.ui-corner-all > .ui-content:first-child,\n.ui-corner-all > .ui-footer:first-child {\n\t-webkit-border-top-left-radius: inherit;\n\tborder-top-left-radius: inherit;\n\t-webkit-border-top-right-radius: inherit;\n\tborder-top-right-radius: inherit;\n}\n.ui-corner-all > .ui-header:last-child,\n.ui-corner-all > .ui-content:last-child,\n.ui-corner-all > .ui-footer:last-child {\n\t-webkit-border-bottom-left-radius: inherit;\n\tborder-bottom-left-radius: inherit;\n\t-webkit-border-bottom-right-radius: inherit;\n\tborder-bottom-right-radius: inherit;\n}\n/* Buttons and icons */\n.ui-btn {\n\tfont-size: 16px;\n\tmargin: .5em 0;\n\tpadding: .7em 1em;\n\tdisplay: block;\n\tposition: relative;\n\ttext-align: center;\n\ttext-overflow: ellipsis;\n\toverflow: hidden;\n\twhite-space: nowrap;\n\tcursor: pointer;\n\t-webkit-user-select: none;\n\t-moz-user-select: none;\n\t-ms-user-select: none;\n\tuser-select: none;\n}\n.ui-btn-icon-notext,\n.ui-header button.ui-btn.ui-btn-icon-notext,\n.ui-footer button.ui-btn.ui-btn-icon-notext {\n\tpadding: 0;\n\twidth: 1.75em;\n\theight: 1.75em;\n\ttext-indent: -9999px;\n\twhite-space: nowrap !important;\n}\n.ui-mini {\n\tfont-size: 12.5px;\n}\n.ui-mini .ui-btn {\n\tfont-size: inherit;\n}\n/* Make buttons in toolbars default to mini and inline. */\n.ui-header .ui-btn,\n.ui-footer .ui-btn {\n\tfont-size: 12.5px;\n\tdisplay: inline-block;\n\tvertical-align: middle;\n}\n.ui-header .ui-controlgroup .ui-btn-icon-notext,\n.ui-footer .ui-controlgroup .ui-btn-icon-notext {\n    font-size: 12.5px;\n}\n/* To ensure same top and left/right position when ui-btn-left/right are added to something other than buttons. */\n.ui-header .ui-btn-left,\n.ui-header .ui-btn-right {\n\tfont-size: 12.5px;\n}\n.ui-mini.ui-btn-icon-notext,\n.ui-mini .ui-btn-icon-notext,\n.ui-header .ui-btn-icon-notext,\n.ui-footer .ui-btn-icon-notext {\n\tfont-size: 16px;\t\n\tpadding: 0;\n}\n.ui-btn-inline {\n\tdisplay: inline-block;\n\tvertical-align: middle;\n\tmargin-right: .625em;\n}\n.ui-btn-icon-left {\n\tpadding-left: 2.5em;\n}\n.ui-btn-icon-right {\n\tpadding-right: 2.5em;\n}\n.ui-btn-icon-top {\n\tpadding-top: 2.5em;\n}\n.ui-btn-icon-bottom {\n\tpadding-bottom: 2.5em;\n}\n.ui-header .ui-btn-icon-top,\n.ui-footer .ui-btn-icon-top,\n.ui-header .ui-btn-icon-bottom,\n.ui-footer .ui-btn-icon-bottom {\n\tpadding-left: .3125em;\n\tpadding-right: .3125em;\n}\n.ui-btn-icon-left:after,\n.ui-btn-icon-right:after,\n.ui-btn-icon-top:after,\n.ui-btn-icon-bottom:after,\n.ui-btn-icon-notext:after {\n\tcontent: \"\";\n\tposition: absolute;\n\tdisplay: block;\n\twidth: 22px;\n\theight: 22px;\n}\n.ui-btn-icon-notext:after,\n.ui-btn-icon-left:after,\n.ui-btn-icon-right:after {\n\ttop: 50%;\n\tmargin-top: -11px;\n}\n.ui-btn-icon-left:after {\n\tleft: .5625em;\n}\n.ui-btn-icon-right:after {\n\tright: .5625em;\n}\n.ui-mini.ui-btn-icon-left:after,\n.ui-mini .ui-btn-icon-left:after,\n.ui-header .ui-btn-icon-left:after,\n.ui-footer .ui-btn-icon-left:after {\n\tleft: .37em;\n}\n.ui-mini.ui-btn-icon-right:after,\n.ui-mini .ui-btn-icon-right:after,\n.ui-header .ui-btn-icon-right:after,\n.ui-footer .ui-btn-icon-right:after {\n\tright: .37em;\n}\n.ui-btn-icon-notext:after,\n.ui-btn-icon-top:after,\n.ui-btn-icon-bottom:after {\n\tleft: 50%;\n\tmargin-left: -11px;\n}\n.ui-btn-icon-top:after {\n\ttop: .5625em;\n}\n.ui-btn-icon-bottom:after {\n\ttop: auto;\n\tbottom: .5625em;\n}\n/* Buttons in header position classes */\n.ui-header .ui-btn-left,\n.ui-header .ui-btn-right,\n.ui-btn-left > [class*=\"ui-\"],\n.ui-btn-right > [class*=\"ui-\"] {\n\tmargin: 0;\n}\n.ui-btn-left,\n.ui-btn-right {\n\tposition: absolute;\n\ttop: .24em;\n}\n.ui-btn-left {\n\tleft: .4em;\n}\n.ui-btn-right {\n\tright: .4em;\n}\n.ui-btn-icon-notext.ui-btn-left {\n\ttop: .3125em;\n\tleft: .3125em;\n}\n.ui-btn-icon-notext.ui-btn-right {\n\ttop: .3125em;\n\tright: .3125em;\n}\n/* Button elements */\nbutton.ui-btn,\n.ui-controlgroup-controls button.ui-btn-icon-notext {\n\t-webkit-box-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\tbox-sizing: border-box;\n\t-webkit-appearance: none;\n\t-moz-appearance: none;\n\twidth: 100%;\n}\nbutton.ui-btn-inline,\n.ui-header button.ui-btn,\n.ui-footer button.ui-btn {\n\twidth: auto;\n}\n/* Firefox adds a 1px border in a button element. We negate this to make sure they have the same height as other buttons in controlgroups. */\nbutton.ui-btn::-moz-focus-inner {\n\tborder: 0;\n}\nbutton.ui-btn-icon-notext,\n.ui-controlgroup-horizontal .ui-controlgroup-controls button.ui-btn {\n\t-webkit-box-sizing: content-box;\n\t-moz-box-sizing: content-box;\n\tbox-sizing: content-box;\n\twidth: 1.75em;\n}\n/* Form labels */\n.ui-mobile label,\n.ui-controlgroup-label {\n\tdisplay: block;\n\tmargin: 0 0 .4em;\n}\n/* Accessible content hiding */\n/* ui-hide-label deprecated in 1.4. TODO: Remove in 1.5 */\n.ui-hide-label > label,\n.ui-hide-label .ui-controlgroup-label,\n.ui-hide-label .ui-rangeslider label,\n.ui-hidden-accessible {\n\tposition: absolute !important;\n\theight: 1px;\n\twidth: 1px;\n\toverflow: hidden;\n\tclip: rect(1px,1px,1px,1px);\n}\n/* Used for hiding elements by the filterable widget. You can also use this class to hide list items or buttons in controlgroups; this ensures correct corner styling. */\n.ui-screen-hidden {\n\tdisplay: none !important;\n}\n/* Transitions originally inspired by those from jQtouch, nice work, folks */\n.ui-mobile-viewport-transitioning,\n.ui-mobile-viewport-transitioning .ui-page {\n\twidth: 100%;\n\theight: 100%;\n\toverflow: hidden;\n\t-webkit-box-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\tbox-sizing: border-box;\n}\n.ui-page-pre-in {\n\topacity: 0;\n}\n.in {\n\t-webkit-animation-timing-function: ease-out;\n\t-webkit-animation-duration: 350ms;\n\t-moz-animation-timing-function: ease-out;\n\t-moz-animation-duration: 350ms;\n\tanimation-timing-function: ease-out;\n\tanimation-duration: 350ms;\n}\n.out {\n\t-webkit-animation-timing-function: ease-in;\n\t-webkit-animation-duration: 225ms;\n\t-moz-animation-timing-function: ease-in;\n\t-moz-animation-duration: 225ms;\n\tanimation-timing-function: ease-in;\n\tanimation-duration: 225ms;\n}\n@-webkit-keyframes fadein {\n    from { opacity: 0; }\n    to { opacity: 1; }\n}\n@-moz-keyframes fadein {\n    from { opacity: 0; }\n    to { opacity: 1; }\n}\n@keyframes fadein {\n    from { opacity: 0; }\n    to { opacity: 1; }\n}\n@-webkit-keyframes fadeout {\n    from { opacity: 1; }\n    to { opacity: 0; }\n}\n@-moz-keyframes fadeout {\n    from { opacity: 1; }\n    to { opacity: 0; }\n}\n@keyframes fadeout {\n    from { opacity: 1; }\n    to { opacity: 0; }\n}\n.fade.out {\n\topacity: 0;\n\t-webkit-animation-duration: 125ms;\n\t-webkit-animation-name: fadeout;\n\t-moz-animation-duration: 125ms;\n\t-moz-animation-name: fadeout;\n\tanimation-duration: 125ms;\n\tanimation-name: fadeout;\n}\n.fade.in {\n\topacity: 1;\n\t-webkit-animation-duration: 225ms;\n\t-webkit-animation-name: fadein;\n\t-moz-animation-duration: 225ms;\n\t-moz-animation-name: fadein;\n\tanimation-duration: 225ms;\n\tanimation-name: fadein;\n}\n.pop {\n\t-webkit-transform-origin: 50% 50%;\n\t-moz-transform-origin: 50% 50%;\n\ttransform-origin: 50% 50%;\n}\n.pop.in {\n\t-webkit-transform: scale(1);\n\t-webkit-animation-name: popin;\n\t-webkit-animation-duration: 350ms;\n\t-moz-transform: scale(1);\n\t-moz-animation-name: popin;\n\t-moz-animation-duration: 350ms;\n\ttransform: scale(1);\n\tanimation-name: popin;\n\tanimation-duration: 350ms;\n    opacity: 1;\n}\n.pop.out {\n\t-webkit-animation-name: fadeout;\n\t-webkit-animation-duration: 100ms;\n\t-moz-animation-name: fadeout;\n\t-moz-animation-duration: 100ms;\n\tanimation-name: fadeout;\n\tanimation-duration: 100ms;\n\topacity: 0;\n}\n.pop.in.reverse {\n\t-webkit-animation-name: fadein;\n\t-moz-animation-name: fadein;\n\tanimation-name: fadein;\n}\n.pop.out.reverse {\n\t-webkit-transform: scale(.8);\n\t-webkit-animation-name: popout;\n\t-moz-transform: scale(.8);\n\t-moz-animation-name: popout;\n\ttransform: scale(.8);\n\tanimation-name: popout;\n}\n@-webkit-keyframes popin {\n    from {\n        -webkit-transform: scale(.8);\n        opacity: 0;\n    }\n    to {\n        -webkit-transform: scale(1);\n        opacity: 1;\n    }\n}\n@-moz-keyframes popin {\n    from {\n        -moz-transform: scale(.8);\n        opacity: 0;\n    }\n    to {\n        -moz-transform: scale(1);\n        opacity: 1;\n    }\n}\n@keyframes popin {\n    from {\n        transform: scale(.8);\n        opacity: 0;\n    }\n    to {\n        transform: scale(1);\n        opacity: 1;\n    }\n}\n@-webkit-keyframes popout {\n    from {\n        -webkit-transform: scale(1);\n        opacity: 1;\n    }\n    to {\n        -webkit-transform: scale(.8);\n        opacity: 0;\n    }\n}\n@-moz-keyframes popout {\n    from {\n        -moz-transform: scale(1);\n        opacity: 1;\n    }\n    to {\n        -moz-transform: scale(.8);\n        opacity: 0;\n    }\n}\n@keyframes popout {\n    from {\n        transform: scale(1);\n        opacity: 1;\n    }\n    to {\n        transform: scale(.8);\n        opacity: 0;\n    }\n}\n/* keyframes for slidein from sides */\n@-webkit-keyframes slideinfromright {\n    from { -webkit-transform: translate3d(100%,0,0); }\n    to { -webkit-transform: translate3d(0,0,0); }\n}\n@-moz-keyframes slideinfromright {\n    from { -moz-transform: translateX(100%); }\n    to { -moz-transform: translateX(0); }\n}\n@keyframes slideinfromright {\n    from { transform: translateX(100%); }\n    to { transform: translateX(0); }\n}\n@-webkit-keyframes slideinfromleft {\n    from { -webkit-transform: translate3d(-100%,0,0); }\n    to { -webkit-transform: translate3d(0,0,0); }\n}\n@-moz-keyframes slideinfromleft {\n    from { -moz-transform: translateX(-100%); }\n    to { -moz-transform: translateX(0); }\n}\n@keyframes slideinfromleft {\n    from { transform: translateX(-100%); }\n    to { transform: translateX(0); }\n}\n/* keyframes for slideout to sides */\n@-webkit-keyframes slideouttoleft {\n    from { -webkit-transform: translate3d(0,0,0); }\n    to { -webkit-transform: translate3d(-100%,0,0); }\n}\n@-moz-keyframes slideouttoleft {\n    from { -moz-transform: translateX(0); }\n    to { -moz-transform: translateX(-100%); }\n}\n@keyframes slideouttoleft {\n    from { transform: translateX(0); }\n    to { transform: translateX(-100%); }\n}\n@-webkit-keyframes slideouttoright {\n    from { -webkit-transform: translate3d(0,0,0); }\n    to { -webkit-transform: translate3d(100%,0,0); }\n}\n@-moz-keyframes slideouttoright {\n    from { -moz-transform: translateX(0); }\n    to { -moz-transform: translateX(100%); }\n}\n@keyframes slideouttoright {\n    from { transform: translateX(0); }\n    to { transform: translateX(100%); }\n}\n.slide.out, .slide.in {\n\t-webkit-animation-timing-function: ease-out;\n\t-webkit-animation-duration: 350ms;\n\t-moz-animation-timing-function: ease-out;\n\t-moz-animation-duration: 350ms;\n\tanimation-timing-function: ease-out;\n\tanimation-duration: 350ms;\n}\n.slide.out {\n\t-webkit-transform: translate3d(-100%,0,0);\n\t-webkit-animation-name: slideouttoleft;\n\t-moz-transform: translateX(-100%);\n\t-moz-animation-name: slideouttoleft;\n\ttransform: translateX(-100%);\n\tanimation-name: slideouttoleft;\n}\n.slide.in {\n\t-webkit-transform: translate3d(0,0,0);\n\t-webkit-animation-name: slideinfromright;\n\t-moz-transform: translateX(0);\n\t-moz-animation-name: slideinfromright;\n\ttransform: translateX(0);\n\tanimation-name: slideinfromright;\n}\n.slide.out.reverse {\n\t-webkit-transform: translate3d(100%,0,0);\n\t-webkit-animation-name: slideouttoright;\n\t-moz-transform: translateX(100%);\n\t-moz-animation-name: slideouttoright;\n\ttransform: translateX(100%);\n\tanimation-name: slideouttoright;\n}\n.slide.in.reverse {\n\t-webkit-transform: translate3d(0,0,0);\n\t-webkit-animation-name: slideinfromleft;\n\t-moz-transform: translateX(0);\n\t-moz-animation-name: slideinfromleft;\n\ttransform: translateX(0);\n\tanimation-name: slideinfromleft;\n}\n.slidefade.out {\n\t-webkit-transform: translateX(-100%);\n\t-webkit-animation-name: slideouttoleft;\n\t-webkit-animation-duration: 225ms;\n\t-moz-transform: translateX(-100%);\n\t-moz-animation-name: slideouttoleft;\n\t-moz-animation-duration: 225ms;\n\ttransform: translateX(-100%);\n\tanimation-name: slideouttoleft;\n\tanimation-duration: 225ms;\n}\n.slidefade.in {\n\t-webkit-transform: translateX(0);\n\t-webkit-animation-name: fadein;\n\t-webkit-animation-duration: 200ms;\n\t-moz-transform: translateX(0);\n\t-moz-animation-name: fadein;\n\t-moz-animation-duration: 200ms;\n\ttransform: translateX(0);\n\tanimation-name: fadein;\n\tanimation-duration: 200ms;\n}\n.slidefade.out.reverse {\n\t-webkit-transform: translateX(100%);\n\t-webkit-animation-name: slideouttoright;\n\t-webkit-animation-duration: 200ms;\n\t-moz-transform: translateX(100%);\n\t-moz-animation-name: slideouttoright;\n\t-moz-animation-duration: 200ms;\n\ttransform: translateX(100%);\n\tanimation-name: slideouttoright;\n\tanimation-duration: 200ms;\n}\n.slidefade.in.reverse {\n\t-webkit-transform: translateX(0);\n\t-webkit-animation-name: fadein;\n\t-webkit-animation-duration: 200ms;\n\t-moz-transform: translateX(0);\n\t-moz-animation-name: fadein;\n\t-moz-animation-duration: 200ms;\n\ttransform: translateX(0);\n\tanimation-name: fadein;\n\tanimation-duration: 200ms;\n}\n/* slide down */\n.slidedown.out {\n\t-webkit-animation-name: fadeout;\n\t-webkit-animation-duration: 100ms;\n\t-moz-animation-name: fadeout;\n\t-moz-animation-duration: 100ms;\n\tanimation-name: fadeout;\n\tanimation-duration: 100ms;\n}\n.slidedown.in {\n\t-webkit-transform: translateY(0);\n\t-webkit-animation-name: slideinfromtop;\n\t-webkit-animation-duration: 250ms;\n\t-moz-transform: translateY(0);\n\t-moz-animation-name: slideinfromtop;\n\t-moz-animation-duration: 250ms;\n\ttransform: translateY(0);\n\tanimation-name: slideinfromtop;\n\tanimation-duration: 250ms;\n}\n.slidedown.in.reverse {\n\t-webkit-animation-name: fadein;\n\t-webkit-animation-duration: 150ms;\n\t-moz-animation-name: fadein;\n\t-moz-animation-duration: 150ms;\n\tanimation-name: fadein;\n\tanimation-duration: 150ms;\n}\n.slidedown.out.reverse {\n\t-webkit-transform: translateY(-100%);\n\t-webkit-animation-name: slideouttotop;\n\t-webkit-animation-duration: 200ms;\n\t-moz-transform: translateY(-100%);\n\t-moz-animation-name: slideouttotop;\n\t-moz-animation-duration: 200ms;\n\ttransform: translateY(-100%);\n\tanimation-name: slideouttotop;\n\tanimation-duration: 200ms;\n}\n@-webkit-keyframes slideinfromtop {\n    from { -webkit-transform: translateY(-100%); }\n    to { -webkit-transform: translateY(0); }\n}\n@-moz-keyframes slideinfromtop {\n    from { -moz-transform: translateY(-100%); }\n    to { -moz-transform: translateY(0); }\n}\n@keyframes slideinfromtop {\n    from { transform: translateY(-100%); }\n    to { transform: translateY(0); }\n}\n@-webkit-keyframes slideouttotop {\n    from { -webkit-transform: translateY(0); }\n    to { -webkit-transform: translateY(-100%); }\n}\n@-moz-keyframes slideouttotop {\n    from { -moz-transform: translateY(0); }\n    to { -moz-transform: translateY(-100%); }\n}\n@keyframes slideouttotop {\n    from { transform: translateY(0); }\n    to { transform: translateY(-100%); }\n}\n/* slide up */\n.slideup.out {\n\t-webkit-animation-name: fadeout;\n\t-webkit-animation-duration: 100ms;\n\t-moz-animation-name: fadeout;\n\t-moz-animation-duration: 100ms;\n\tanimation-name: fadeout;\n\tanimation-duration: 100ms;\n}\n.slideup.in {\n\t-webkit-transform: translateY(0);\n\t-webkit-animation-name: slideinfrombottom;\n\t-webkit-animation-duration: 250ms;\n\t-moz-transform: translateY(0);\n\t-moz-animation-name: slideinfrombottom;\n\t-moz-animation-duration: 250ms;\n\ttransform: translateY(0);\n\tanimation-name: slideinfrombottom;\n\tanimation-duration: 250ms;\n}\n.slideup.in.reverse {\n\t-webkit-animation-name: fadein;\n\t-webkit-animation-duration: 150ms;\n\t-moz-animation-name: fadein;\n\t-moz-animation-duration: 150ms;\n\tanimation-name: fadein;\n\tanimation-duration: 150ms;\n}\n.slideup.out.reverse {\n\t-webkit-transform: translateY(100%);\n\t-webkit-animation-name: slideouttobottom;\n\t-webkit-animation-duration: 200ms;\n\t-moz-transform: translateY(100%);\n\t-moz-animation-name: slideouttobottom;\n\t-moz-animation-duration: 200ms;\n\ttransform: translateY(100%);\n\tanimation-name: slideouttobottom;\n\tanimation-duration: 200ms;\n}\n@-webkit-keyframes slideinfrombottom {\n    from { -webkit-transform: translateY(100%); }\n    to { -webkit-transform: translateY(0); }\n}\n@-moz-keyframes slideinfrombottom {\n    from { -moz-transform: translateY(100%); }\n    to { -moz-transform: translateY(0); }\n}\n@keyframes slideinfrombottom {\n    from { transform: translateY(100%); }\n    to { transform: translateY(0); }\n}\n@-webkit-keyframes slideouttobottom {\n    from { -webkit-transform: translateY(0); }\n    to { -webkit-transform: translateY(100%); }\n}\n@-moz-keyframes slideouttobottom {\n    from { -moz-transform: translateY(0); }\n    to { -moz-transform: translateY(100%); }\n}\n@keyframes slideouttobottom {\n    from { transform: translateY(0); }\n    to { transform: translateY(100%); }\n}\n/* The properties in this rule are only necessary for the 'flip' transition.\n * We need specify the perspective to create a projection matrix. This will add\n * some depth as the element flips. The depth number represents the distance of\n * the viewer from the z-plane. According to the CSS3 spec, 1000 is a moderate\n * value.\n */\n.viewport-flip {\n\t-webkit-perspective: 1000;\n\t-moz-perspective: 1000;\n\tperspective: 1000;\n\tposition: absolute;\n}\n.flip {\n\t-webkit-backface-visibility: hidden;\n\t-webkit-transform: translateX(0); /* Needed to work around an iOS 3.1 bug that causes listview thumbs to disappear when -webkit-visibility:hidden is used. */\n\t-moz-backface-visibility: hidden;\n\t-moz-transform: translateX(0);\n\tbackface-visibility: hidden;\n\ttransform: translateX(0);\n}\n.flip.out {\n\t-webkit-transform: rotateY(-90deg) scale(.9);\n\t-webkit-animation-name: flipouttoleft;\n\t-webkit-animation-duration: 175ms;\n\t-moz-transform: rotateY(-90deg) scale(.9);\n\t-moz-animation-name: flipouttoleft;\n\t-moz-animation-duration: 175ms;\n\ttransform: rotateY(-90deg) scale(.9);\n\tanimation-name: flipouttoleft;\n\tanimation-duration: 175ms;\n}\n.flip.in {\n\t-webkit-animation-name: flipintoright;\n\t-webkit-animation-duration: 225ms;\n\t-moz-animation-name: flipintoright;\n\t-moz-animation-duration: 225ms;\n\tanimation-name: flipintoright;\n\tanimation-duration: 225ms;\n}\n.flip.out.reverse {\n\t-webkit-transform: rotateY(90deg) scale(.9);\n\t-webkit-animation-name: flipouttoright;\n\t-moz-transform: rotateY(90deg) scale(.9);\n\t-moz-animation-name: flipouttoright;\n\ttransform: rotateY(90deg) scale(.9);\n\tanimation-name: flipouttoright;\n}\n.flip.in.reverse {\n\t-webkit-animation-name: flipintoleft;\n\t-moz-animation-name: flipintoleft;\n\tanimation-name: flipintoleft;\n}\n@-webkit-keyframes flipouttoleft {\n    from { -webkit-transform: rotateY(0); }\n    to { -webkit-transform: rotateY(-90deg) scale(.9); }\n}\n@-moz-keyframes flipouttoleft {\n    from { -moz-transform: rotateY(0); }\n    to { -moz-transform: rotateY(-90deg) scale(.9); }\n}\n@keyframes flipouttoleft {\n    from { transform: rotateY(0); }\n    to { transform: rotateY(-90deg) scale(.9); }\n}\n@-webkit-keyframes flipouttoright {\n    from { -webkit-transform: rotateY(0) ; }\n    to { -webkit-transform: rotateY(90deg) scale(.9); }\n}\n@-moz-keyframes flipouttoright {\n    from { -moz-transform: rotateY(0); }\n    to { -moz-transform: rotateY(90deg) scale(.9); }\n}\n@keyframes flipouttoright {\n    from { transform: rotateY(0); }\n    to { transform: rotateY(90deg) scale(.9); }\n}\n@-webkit-keyframes flipintoleft {\n    from { -webkit-transform: rotateY(-90deg) scale(.9); }\n    to { -webkit-transform: rotateY(0); }\n}\n@-moz-keyframes flipintoleft {\n    from { -moz-transform: rotateY(-90deg) scale(.9); }\n    to { -moz-transform: rotateY(0); }\n}\n@keyframes flipintoleft {\n    from { transform: rotateY(-90deg) scale(.9); }\n    to { transform: rotateY(0); }\n}\n@-webkit-keyframes flipintoright {\n    from { -webkit-transform: rotateY(90deg) scale(.9); }\n    to { -webkit-transform: rotateY(0); }\n}\n@-moz-keyframes flipintoright {\n    from { -moz-transform: rotateY(90deg) scale(.9); }\n    to { -moz-transform: rotateY(0); }\n}\n@keyframes flipintoright {\n    from { transform: rotateY(90deg) scale(.9); }\n    to { transform: rotateY(0); }\n}\n/* The properties in this rule are only necessary for the 'flip' transition.\n * We need specify the perspective to create a projection matrix. This will add\n * some depth as the element flips. The depth number represents the distance of\n * the viewer from the z-plane. According to the CSS3 spec, 1000 is a moderate\n * value.\n */\n.viewport-turn {\n\t-webkit-perspective: 200px;\n\t-moz-perspective: 200px;\n\t-ms-perspective: 200px;\n\tperspective: 200px;\n\tposition: absolute;\n}\n.turn {\n\t-webkit-backface-visibility: hidden;\n\t-webkit-transform: translateX(0); /* Needed to work around an iOS 3.1 bug that causes listview thumbs to disappear when -webkit-visibility:hidden is used. */\n\t-webkit-transform-origin: 0;\n\t\n\t-moz-backface-visibility: hidden;\n\t-moz-transform: translateX(0);\n\t-moz-transform-origin: 0;\n\t\n\tbackface-visibility :hidden;\n\ttransform: translateX(0);\n\ttransform-origin: 0;\n}\n.turn.out {\n\t-webkit-transform: rotateY(-90deg) scale(.9);\n\t-webkit-animation-name: flipouttoleft;\n\t-webkit-animation-duration: 125ms;\n\t-moz-transform: rotateY(-90deg) scale(.9);\n\t-moz-animation-name: flipouttoleft;\n\t-moz-animation-duration: 125ms;\n\ttransform: rotateY(-90deg) scale(.9);\n\tanimation-name: flipouttoleft;\n\tanimation-duration: 125ms;\n}\n.turn.in {\n\t-webkit-animation-name: flipintoright;\n\t-webkit-animation-duration: 250ms;\n\t-moz-animation-name: flipintoright;\n\t-moz-animation-duration: 250ms;\n\tanimation-name: flipintoright;\n\tanimation-duration: 250ms;\n\t\n}\n.turn.out.reverse {\n\t-webkit-transform: rotateY(90deg) scale(.9);\n\t-webkit-animation-name: flipouttoright;\n\t-moz-transform: rotateY(90deg) scale(.9);\n\t-moz-animation-name: flipouttoright;\n\ttransform: rotateY(90deg) scale(.9);\n\tanimation-name: flipouttoright;\n}\n.turn.in.reverse {\n\t-webkit-animation-name: flipintoleft;\n\t-moz-animation-name: flipintoleft;\n\tanimation-name: flipintoleft;\n}\n@-webkit-keyframes flipouttoleft {\n    from { -webkit-transform: rotateY(0); }\n    to { -webkit-transform: rotateY(-90deg) scale(.9); }\n}\n@-moz-keyframes flipouttoleft {\n    from { -moz-transform: rotateY(0); }\n    to { -moz-transform: rotateY(-90deg) scale(.9); }\n}\n@keyframes flipouttoleft {\n    from { transform: rotateY(0); }\n    to { transform: rotateY(-90deg) scale(.9); }\n}\n@-webkit-keyframes flipouttoright {\n    from { -webkit-transform: rotateY(0) ; }\n    to { -webkit-transform: rotateY(90deg) scale(.9); }\n}\n@-moz-keyframes flipouttoright {\n    from { -moz-transform: rotateY(0); }\n    to { -moz-transform: rotateY(90deg) scale(.9); }\n}\n@keyframes flipouttoright {\n    from { transform: rotateY(0); }\n    to { transform: rotateY(90deg) scale(.9); }\n}\n@-webkit-keyframes flipintoleft {\n    from { -webkit-transform: rotateY(-90deg) scale(.9); }\n    to { -webkit-transform: rotateY(0); }\n}\n@-moz-keyframes flipintoleft {\n    from { -moz-transform: rotateY(-90deg) scale(.9); }\n    to { -moz-transform: rotateY(0); }\n}\n@keyframes flipintoleft {\n    from { transform: rotateY(-90deg) scale(.9); }\n    to { transform: rotateY(0); }\n}\n@-webkit-keyframes flipintoright {\n    from { -webkit-transform: rotateY(90deg) scale(.9); }\n    to { -webkit-transform: rotateY(0); }\n}\n@-moz-keyframes flipintoright {\n    from { -moz-transform: rotateY(90deg) scale(.9); }\n    to { -moz-transform: rotateY(0); }\n}\n@keyframes flipintoright {\n    from { transform: rotateY(90deg) scale(.9); }\n    to { transform: rotateY(0); }\n}\n/* flow transition */\n.flow {\n\t-webkit-transform-origin: 50% 30%;\n\t-webkit-box-shadow: 0 0 20px rgba(0,0,0,.4);\n\t-moz-transform-origin: 50% 30%;\t\n\t-moz-box-shadow: 0 0 20px rgba(0,0,0,.4);\n\ttransform-origin: 50% 30%;\t\n\tbox-shadow: 0 0 20px rgba(0,0,0,.4);\n}\n.ui-dialog.flow {\n\t-webkit-transform-origin: none;\n\t-webkit-box-shadow: none;\n\t-moz-transform-origin: none;\t\n\t-moz-box-shadow: none;\n\ttransform-origin: none;\t\n\tbox-shadow: none;\n}\n.flow.out {\n\t-webkit-transform: translateX(-100%) scale(.7);\n\t-webkit-animation-name: flowouttoleft;\n\t-webkit-animation-timing-function: ease;\n\t-webkit-animation-duration: 350ms;\n\t-moz-transform: translateX(-100%) scale(.7);\n\t-moz-animation-name: flowouttoleft;\n\t-moz-animation-timing-function: ease;\n\t-moz-animation-duration: 350ms;\n\ttransform: translateX(-100%) scale(.7);\n\tanimation-name: flowouttoleft;\n\tanimation-timing-function: ease;\n\tanimation-duration: 350ms;\n}\n.flow.in {\n\t-webkit-transform: translateX(0) scale(1);\n\t-webkit-animation-name: flowinfromright;\n\t-webkit-animation-timing-function: ease;\n\t-webkit-animation-duration: 350ms;\n\t-moz-transform: translateX(0) scale(1);\n\t-moz-animation-name: flowinfromright;\n\t-moz-animation-timing-function: ease;\n\t-moz-animation-duration: 350ms;\n\ttransform: translateX(0) scale(1);\n\tanimation-name: flowinfromright;\n\tanimation-timing-function: ease;\n\tanimation-duration: 350ms;\n}\n.flow.out.reverse {\n\t-webkit-transform: translateX(100%);\n\t-webkit-animation-name: flowouttoright;\n\t-moz-transform: translateX(100%);\n\t-moz-animation-name: flowouttoright;\n\ttransform: translateX(100%);\n\tanimation-name: flowouttoright;\n}\n.flow.in.reverse {\n\t-webkit-animation-name: flowinfromleft;\n\t-moz-animation-name: flowinfromleft;\n\tanimation-name: flowinfromleft;\n}\n@-webkit-keyframes flowouttoleft {\n    0% { -webkit-transform: translateX(0) scale(1); }\n\t60%, 70% { -webkit-transform: translateX(0) scale(.7); }\n    100% { -webkit-transform: translateX(-100%) scale(.7); }\n}\n@-moz-keyframes flowouttoleft {\n    0% { -moz-transform: translateX(0) scale(1); }\n\t60%, 70% { -moz-transform: translateX(0) scale(.7); }\n    100% { -moz-transform:  translateX(-100%) scale(.7); }\n}\n@keyframes flowouttoleft {\n    0% { transform: translateX(0) scale(1); }\n\t60%, 70% { transform: translateX(0) scale(.7); }\n    100% { transform:  translateX(-100%) scale(.7); }\n}\n@-webkit-keyframes flowouttoright {\n    0% { -webkit-transform: translateX(0) scale(1); }\n\t60%, 70% { -webkit-transform: translateX(0) scale(.7); }\n    100% { -webkit-transform:  translateX(100%) scale(.7); }\n}\n@-moz-keyframes flowouttoright {\n    0% { -moz-transform: translateX(0) scale(1); }\n\t60%, 70% { -moz-transform: translateX(0) scale(.7); }\n    100% { -moz-transform:  translateX(100%) scale(.7); }\n}\n@keyframes flowouttoright {\n    0% { transform: translateX(0) scale(1); }\n\t60%, 70% { transform: translateX(0) scale(.7); }\n    100% { transform:  translateX(100%) scale(.7); }\n}\n@-webkit-keyframes flowinfromleft {\n    0% { -webkit-transform: translateX(-100%) scale(.7); }\n\t30%, 40% { -webkit-transform: translateX(0) scale(.7); }\n    100% { -webkit-transform: translateX(0) scale(1); }\n}\n@-moz-keyframes flowinfromleft {\n    0% { -moz-transform: translateX(-100%) scale(.7); }\n\t30%, 40% { -moz-transform: translateX(0) scale(.7); }\n    100% { -moz-transform: translateX(0) scale(1); }\n}\n@keyframes flowinfromleft {\n    0% { transform: translateX(-100%) scale(.7); }\n\t30%, 40% { transform: translateX(0) scale(.7); }\n    100% { transform: translateX(0) scale(1); }\n}\n@-webkit-keyframes flowinfromright {\n    0% { -webkit-transform: translateX(100%) scale(.7); }\n\t30%, 40% { -webkit-transform: translateX(0) scale(.7); }\n    100% { -webkit-transform: translateX(0) scale(1); }\n}\n@-moz-keyframes flowinfromright {\n    0% { -moz-transform: translateX(100%) scale(.7); }\n\t30%, 40% { -moz-transform: translateX(0) scale(.7); }\n    100% { -moz-transform: translateX(0) scale(1); }\n}\n@keyframes flowinfromright {\n    0% { transform: translateX(100%) scale(.7); }\n\t30%, 40% { transform: translateX(0) scale(.7); }\n    100% { transform: translateX(0) scale(1); }\n}\n.ui-field-contain,\n.ui-mobile fieldset.ui-field-contain {\n\tdisplay: block;\n\tposition: relative;\n\toverflow: visible;\n\tclear: both;\n\tpadding: .8em 0;\n}\n.ui-field-contain > label ~ [class*=\"ui-\"],\n.ui-field-contain .ui-controlgroup-controls {\n\tmargin: 0;\n}\n.ui-field-contain:last-child {\n\tborder-bottom-width: 0;\n}\n@media (min-width: 28em) {\n\t.ui-field-contain,\n\t.ui-mobile fieldset.ui-field-contain {\n\t\tpadding: 0;\n\t\tmargin: 1em 0;\n\t\tborder-bottom-width: 0;\n\t}\n\t.ui-field-contain:before,\n\t.ui-field-contain:after {\n\t\tcontent: \"\";\n\t\tdisplay: table;\n\t}\n\t.ui-field-contain:after {\n\t\tclear: both;\n\t}\n\t.ui-field-contain > label,\n\t.ui-field-contain .ui-controlgroup-label,\n\t.ui-field-contain > .ui-rangeslider > label {\n\t\tfloat: left;\n\t\twidth: 20%;\n\t\tmargin: .5em 2% 0 0;\n\t}\n\t.ui-popup .ui-field-contain > label,\n\t.ui-popup .ui-field-contain .ui-controlgroup-label,\n\t.ui-popup .ui-field-contain > .ui-rangeslider > label {\n\t\tfloat: none;\n\t\twidth: auto;\n\t\tmargin: 0 0 .4em;\n\t}\n\t.ui-field-contain > label ~ [class*=\"ui-\"],\n\t.ui-field-contain .ui-controlgroup-controls {\n\t\tfloat: left;\n\t\twidth: 78%;\n\t\t-webkit-box-sizing: border-box;\n\t\t-moz-box-sizing: border-box;\n\t\tbox-sizing: border-box;\n\t}\n\t/* ui-hide-label deprecated in 1.4. TODO: Remove in 1.5 */\n\t.ui-hide-label > label ~ [class*=\"ui-\"],\n\t.ui-hide-label .ui-controlgroup-controls,\n\t.ui-popup .ui-field-contain > label ~ [class*=\"ui-\"],\n\t.ui-popup .ui-field-contain .ui-controlgroup-controls {\n\t\tfloat: none;\n\t\twidth: 100%;\n\t}\n\t.ui-field-contain > label ~ .ui-btn-inline {\n\t\twidth: auto;\n\t\tmargin-right: .625em;\n\t}\n\t.ui-field-contain > label ~ .ui-btn-inline.ui-btn-icon-notext {\n\t\twidth: 1.75em;\n\t}\n}\n/* content configurations. */\n.ui-grid-a,\n.ui-grid-b,\n.ui-grid-c,\n.ui-grid-d,\n.ui-grid-solo {\n\toverflow: hidden;\n}\n.ui-block-a,\n.ui-block-b,\n.ui-block-c,\n.ui-block-d,\n.ui-block-e {\n\tmargin: 0;\n\tpadding: 0;\n\tborder: 0;\n\tfloat: left;\n\tmin-height: 1px;\n\t-webkit-box-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\tbox-sizing: border-box;\n}\n/* force new row */\n.ui-block-a {\n\tclear: left;\n}\nul.ui-grid-a,\nul.ui-grid-b,\nul.ui-grid-c,\nul.ui-grid-d,\nul.ui-grid-solo,\nli.ui-block-a,\nli.ui-block-b,\nli.ui-block-c,\nli.ui-block-d,\nli.ui-block-e {\n\tmargin-left: 0;\n\tmargin-right: 0;\n\tpadding: 0;\n\tlist-style: none;\n}\n/* No margin in grids for 100% width button elements until we can use max-width: fill-available; */\n[class*=\"ui-block-\"] > button.ui-btn {\n\tmargin-right: 0;\n\tmargin-left: 0;\n}\n[class*=\"ui-block-\"] > .ui-btn,\n[class*=\"ui-block-\"] > .ui-select,\n[class*=\"ui-block-\"] > .ui-checkbox,\n[class*=\"ui-block-\"] > .ui-radio,\n[class*=\"ui-block-\"] > button.ui-btn-inline,\n[class*=\"ui-block-\"] > button.ui-btn-icon-notext,\n.ui-header [class*=\"ui-block-\"] > button.ui-btn,\n.ui-footer [class*=\"ui-block-\"] > button.ui-btn {\n\tmargin-right: .3125em;\n\tmargin-left: .3125em;\n}\n.ui-grid-a > .ui-block-a,\n.ui-grid-a > .ui-block-b {\n\t/* width: 49.95%; IE7 */\n\t/* margin-right: -.5px; BB5 */\n\twidth: 50%;\n}\n.ui-grid-b > .ui-block-a,\n.ui-grid-b > .ui-block-b,\n.ui-grid-b > .ui-block-c {\n\t/* width: 33.25%; IE7 */\n\t/* margin-right: -.5px; BB5 */\n\twidth: 33.333%;\n}\n.ui-grid-c > .ui-block-a,\n.ui-grid-c > .ui-block-b,\n.ui-grid-c > .ui-block-c,\n.ui-grid-c > .ui-block-d {\n\t/* width: 24.925%; IE7 */\n\t/* margin-right: -.5px; BB5 */\n\twidth: 25%;\n}\n.ui-grid-d > .ui-block-a,\n.ui-grid-d > .ui-block-b,\n.ui-grid-d > .ui-block-c,\n.ui-grid-d > .ui-block-d,\n.ui-grid-d > .ui-block-e {\n\t/* width: 19.925%; IE7 */\n\twidth: 20%;\n}\n.ui-grid-solo > .ui-block-a {\n\twidth: 100%;\n\tfloat: none; \n}\n/* preset breakpoint to switch to stacked grid styles below 35em (560px) */\n@media (max-width: 35em) {\n\t.ui-responsive > .ui-block-a,\n\t.ui-responsive > .ui-block-b,\n\t.ui-responsive > .ui-block-c,\n\t.ui-responsive > .ui-block-d,\n\t.ui-responsive > .ui-block-e {\n\t\twidth: 100%; \n\t\tfloat: none; \n\t}\n}\n/* fixed page header & footer configuration */\n.ui-header-fixed,\n.ui-footer-fixed {\n\tleft: 0;\n\tright: 0;\n\twidth: 100%;\n\tposition: fixed;\n\tz-index: 1000;\n}\n.ui-header-fixed {\n\ttop: -1px;\n\tpadding-top: 1px;\n}\n.ui-header-fixed.ui-fixed-hidden {\n\ttop: 0;\n\tpadding-top: 0;\n}\n.ui-header-fixed .ui-btn-left,\n.ui-header-fixed .ui-btn-right {\n\tmargin-top: 1px;\n}\n.ui-header-fixed.ui-fixed-hidden .ui-btn-left,\n.ui-header-fixed.ui-fixed-hidden .ui-btn-right {\n\tmargin-top: 0;\n}\n.ui-footer-fixed {\n\tbottom: -1px;\n\tpadding-bottom: 1px;\n}\n.ui-footer-fixed.ui-fixed-hidden {\n\tbottom: 0;\n\tpadding-bottom: 0;\n}\n.ui-header-fullscreen,\n.ui-footer-fullscreen {\n\tfilter: Alpha(Opacity=90);\n\topacity: .9;\n}\n/* updatePagePadding() will update the padding to actual height of header and footer. */\n.ui-page-header-fixed {\n\tpadding-top: 2.8125em;\n}\n.ui-page-footer-fixed {\n\tpadding-bottom: 2.8125em;\n}\n.ui-page-header-fullscreen > .ui-content,\n.ui-page-footer-fullscreen > .ui-content {\n\tpadding: 0;\n}\n.ui-fixed-hidden {\n\tposition: absolute;\n}\n/* Tap toggle: hide external fixed footer. See issue #6604 */\n.ui-footer-fixed.ui-fixed-hidden {\n  display: none;\n}\n.ui-page .ui-footer-fixed.ui-fixed-hidden {\n  display: block\n}\n.ui-page-header-fullscreen .ui-fixed-hidden,\n.ui-page-footer-fullscreen .ui-fixed-hidden {\n\tposition: absolute !important;\n\theight: 1px;\n\twidth: 1px;\n\toverflow: hidden;\n\tclip: rect(1px,1px,1px,1px);\n}\n.ui-header-fixed .ui-btn,\n.ui-footer-fixed .ui-btn { \n\tz-index: 10;\n}\n/* workarounds for other widgets */\n.ui-android-2x-fixed .ui-li-has-thumb {\n\t-webkit-transform: translate3d(0,0,0);\n}\n.ui-navbar {\n\tmax-width: 100%;\n}\n.ui-navbar ul:before,\n.ui-navbar ul:after {\n\tcontent: \"\";\n\tdisplay: table;\n}\n.ui-navbar ul:after {\n\tclear: both;\n}\n.ui-navbar ul {\n\tlist-style: none;\n\tmargin: 0;\n\tpadding: 0;\n\tposition: relative;\n\tdisplay: block;\n\tborder: 0;\n\tmax-width: 100%;\n\toverflow: visible;\n}\n.ui-navbar li .ui-btn {\n\tfont-size: 12.5px;\n\tdisplay: block;\n\tmargin: 0;\n\tborder-right-width: 0;\n}\n.ui-header .ui-navbar li button.ui-btn,\n.ui-footer .ui-navbar li button.ui-btn {\n\tmargin: 0;\n\twidth: 100%;\n}\n.ui-navbar .ui-btn:focus {\n\tz-index: 1;\n}\n/* fixes gaps caused by subpixel problem */\n.ui-navbar li:last-child .ui-btn {\n\tmargin-right: -4px;\n}\n.ui-navbar li:last-child .ui-btn:after {\n\tmargin-right: 4px;\n}\n.ui-content .ui-navbar li:last-child .ui-btn,\n.ui-content .ui-navbar .ui-grid-duo .ui-block-b .ui-btn {\n\tborder-right-width: 1px;\n\tmargin-right: 0;\n}\n.ui-content .ui-navbar li:last-child .ui-btn:after,\n.ui-content .ui-navbar .ui-grid-duo .ui-block-b .ui-btn:after {\n\tmargin-right: 0;\n}\n.ui-navbar .ui-grid-duo .ui-block-a:last-child .ui-btn {\n\tborder-right-width: 1px;\n\tmargin-right: -1px;\n}\n.ui-navbar .ui-grid-duo .ui-block-a:last-child .ui-btn:after {\n\tmargin-right: 1px;\n}\n.ui-navbar .ui-grid-duo .ui-btn {\n\tborder-top-width: 0;\n}\n.ui-navbar .ui-grid-duo .ui-block-a:first-child .ui-btn,\n.ui-navbar .ui-grid-duo .ui-block-a:first-child + .ui-block-b .ui-btn {\n\tborder-top-width: 1px;\n}\n.ui-header .ui-navbar .ui-btn,\n.ui-footer .ui-navbar .ui-btn {\n\tborder-top-width: 0;\n\tborder-bottom-width: 0;\n}\n.ui-header .ui-navbar .ui-grid-duo .ui-block-a:first-child .ui-btn,\n.ui-footer .ui-navbar .ui-grid-duo .ui-block-a:first-child .ui-btn,\n.ui-header .ui-navbar .ui-grid-duo .ui-block-a:first-child + .ui-block-b .ui-btn,\n.ui-footer .ui-navbar .ui-grid-duo .ui-block-a:first-child + .ui-block-b .ui-btn {\n\tborder-top-width: 0;\n}\n.ui-header .ui-title ~ .ui-navbar .ui-btn,\n.ui-footer .ui-title ~ .ui-navbar .ui-btn,\n.ui-header .ui-navbar .ui-grid-duo .ui-btn,\n.ui-footer .ui-navbar .ui-grid-duo .ui-btn,\n.ui-header .ui-title ~ .ui-navbar .ui-grid-duo .ui-block-a:first-child .ui-btn,\n.ui-footer .ui-title ~ .ui-navbar .ui-grid-duo .ui-block-a:first-child .ui-btn,\n.ui-header .ui-title ~ .ui-navbar .ui-grid-duo .ui-block-a:first-child + .ui-block-b .ui-btn,\n.ui-footer .ui-title ~ .ui-navbar .ui-grid-duo .ui-block-a:first-child + .ui-block-b .ui-btn {\n\tborder-top-width: 1px;\n}\n/* Hide the native input element */\n.ui-input-btn input {\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n\twidth: 100%;\n\theight: 100%;\n\tpadding: 0;\n\tborder: 0;\n\toutline: 0;\n\t-webkit-border-radius: inherit;\n\tborder-radius: inherit;\t\n\t-webkit-appearance: none;\n\t-moz-appearance: none;\n\tcursor: pointer;\n\tbackground: #fff;\n\tbackground: rgba(255,255,255,0);\n\tfilter: Alpha(Opacity=0);\n\topacity: .1;\n\tfont-size: 1px;\n\ttext-indent: -9999px;\n\tz-index: 2;\n}\n/* Fixes IE/WP filter alpha opacity bugs */\n.ui-input-btn.ui-state-disabled input {\n\tposition: absolute !important;\n\theight: 1px;\n\twidth: 1px;\n\toverflow: hidden;\n\tclip: rect(1px,1px,1px,1px);\n}\n.ui-collapsible {\n\tmargin: 0 -1em;\n}\n.ui-collapsible-inset,\n.ui-collapsible-set {\n\tmargin: .5em 0;\n}\n.ui-collapsible-heading {\n\tdisplay: block;\n\tmargin: 0;\n\tpadding: 0;\n\tposition: relative;\n}\n.ui-collapsible-heading .ui-btn {\n\ttext-align: left;\n\tmargin: 0;\n\tborder-left-width: 0;\n\tborder-right-width: 0;\n}\n.ui-collapsible-heading .ui-btn-icon-top,\n.ui-collapsible-heading .ui-btn-icon-bottom {\n\ttext-align: center;\n}\n.ui-collapsible-inset .ui-collapsible-heading .ui-btn {\n\tborder-right-width: 1px;\n\tborder-left-width: 1px;\n}\n.ui-collapsible-collapsed + .ui-collapsible:not(.ui-collapsible-inset) > .ui-collapsible-heading .ui-btn {\n\tborder-top-width: 0;\n}\n.ui-collapsible-set .ui-collapsible:not(.ui-collapsible-inset) .ui-collapsible-heading .ui-btn {\n\tborder-top-width: 1px;\n}\n.ui-collapsible-heading-status {\n\tposition: absolute !important;\n\theight: 1px;\n\twidth: 1px;\n\toverflow: hidden;\n\tclip: rect(1px,1px,1px,1px);\n}\n.ui-collapsible-content {\n\tdisplay: block;\n\tmargin: 0;\t\n\tpadding: .5em 1em;\n}\n.ui-collapsible-themed-content .ui-collapsible-content {\n\tborder-left-width: 0;\n\tborder-right-width: 0;\n\tborder-top-width: 0;\n\tborder-bottom-width: 1px;\n\tborder-style: solid;\n}\n.ui-collapsible-inset.ui-collapsible-themed-content .ui-collapsible-content {\n\tborder-left-width: 1px;\n\tborder-right-width: 1px;\n}\n.ui-collapsible-inset .ui-collapsible-content {\n\tmargin: 0;\n}\n.ui-collapsible-content-collapsed {\n\tdisplay: none;\n}\n.ui-collapsible-set > .ui-collapsible.ui-corner-all {\n\t-webkit-border-radius: 0;\n\tborder-radius: 0;\n}\n.ui-collapsible-heading,\n.ui-collapsible-heading > .ui-btn {\n\t-webkit-border-radius: inherit;\t\n\tborder-radius: inherit;\t\n}\n.ui-collapsible-set .ui-collapsible.ui-first-child {\n\t-webkit-border-top-right-radius: inherit;\t\n\tborder-top-right-radius: inherit;\n\t-webkit-border-top-left-radius: inherit;\t\n\tborder-top-left-radius: inherit;\t\t\n}\n.ui-collapsible-content,\n.ui-collapsible-set .ui-collapsible.ui-last-child {\n\t-webkit-border-bottom-right-radius: inherit;\t\n\tborder-bottom-right-radius: inherit;\n\t-webkit-border-bottom-left-radius: inherit;\t\n\tborder-bottom-left-radius: inherit;\t\t\n}\n.ui-collapsible-themed-content:not(.ui-collapsible-collapsed) > .ui-collapsible-heading {\n\t-webkit-border-bottom-right-radius: 0;\t\n\tborder-bottom-right-radius: 0;\n\t-webkit-border-bottom-left-radius: 0;\t\n\tborder-bottom-left-radius: 0;\t\t\n}\n.ui-collapsible-set .ui-collapsible {\n\tmargin: -1px -1em 0;\n}\n.ui-collapsible-set .ui-collapsible-inset {\n\tmargin: -1px 0 0;\n}\n.ui-collapsible-set .ui-collapsible.ui-first-child {\n\tmargin-top: 0;\n}\n.ui-controlgroup,\nfieldset.ui-controlgroup {\n\tpadding: 0;\n\tmargin: .5em 0;\n}\n.ui-field-contain .ui-controlgroup,\n.ui-field-contain fieldset.ui-controlgroup {\n\tmargin: 0;\n}\n.ui-mini .ui-controlgroup-label {\n\tfont-size: 16px;\n}\n.ui-controlgroup.ui-mini .ui-btn-icon-notext,\n.ui-controlgroup .ui-mini.ui-btn-icon-notext {\n\tfont-size: inherit;\n}\n.ui-controlgroup-controls .ui-btn,\n.ui-controlgroup-controls .ui-checkbox,\n.ui-controlgroup-controls .ui-radio,\n.ui-controlgroup-controls .ui-select {\n\tmargin: 0;\n}\n.ui-controlgroup-controls .ui-btn:focus,\n.ui-controlgroup-controls .ui-btn.ui-focus {\n\tz-index: 1;\n}\n.ui-controlgroup-controls li {\n\tlist-style: none;\n}\n.ui-controlgroup-horizontal .ui-controlgroup-controls {\n\tdisplay: inline-block;\n\tvertical-align: middle;\n}\n.ui-controlgroup-horizontal .ui-controlgroup-controls:before,\n.ui-controlgroup-horizontal .ui-controlgroup-controls:after {\n\tcontent: \"\";\n\tdisplay: table;\n}\n.ui-controlgroup-horizontal .ui-controlgroup-controls:after {\n\tclear: both;\n}\n.ui-controlgroup-horizontal .ui-controlgroup-controls > .ui-btn,\n.ui-controlgroup-horizontal .ui-controlgroup-controls li > .ui-btn,\n.ui-controlgroup-horizontal .ui-controlgroup-controls .ui-checkbox,\n.ui-controlgroup-horizontal .ui-controlgroup-controls .ui-radio,\n.ui-controlgroup-horizontal .ui-controlgroup-controls .ui-select {\n\tfloat: left;\n\tclear: none;\n}\n.ui-controlgroup-horizontal .ui-controlgroup-controls button.ui-btn,\n.ui-controlgroup-controls .ui-btn-icon-notext {\n\twidth: auto;\n}\n.ui-controlgroup-horizontal .ui-controlgroup-controls .ui-btn-icon-notext,\n.ui-controlgroup-horizontal .ui-controlgroup-controls button.ui-btn-icon-notext {\n\twidth: 1.5em;\n}\n .ui-controlgroup-controls .ui-btn-icon-notext {\n\theight: auto;\n\tpadding: .7em 1em;\n}\n.ui-controlgroup-vertical .ui-controlgroup-controls .ui-btn {\n\tborder-bottom-width: 0;\n}\n.ui-controlgroup-vertical .ui-controlgroup-controls .ui-btn.ui-last-child {\n\tborder-bottom-width: 1px;\n}\n.ui-controlgroup-horizontal .ui-controlgroup-controls .ui-btn {\n\tborder-right-width: 0;\n}\n.ui-controlgroup-horizontal .ui-controlgroup-controls .ui-btn.ui-last-child {\n\tborder-right-width: 1px;\n}\n.ui-controlgroup-controls .ui-btn-corner-all,\n.ui-controlgroup-controls .ui-btn.ui-corner-all {\n\t-webkit-border-radius: 0;\n\tborder-radius: 0;\n}\n.ui-controlgroup-controls,\n.ui-controlgroup-controls .ui-radio,\n.ui-controlgroup-controls .ui-checkbox,\n.ui-controlgroup-controls .ui-select,\n.ui-controlgroup-controls li {\n\t-webkit-border-radius: inherit;\n\tborder-radius: inherit;\n}\n.ui-controlgroup-vertical .ui-btn.ui-first-child {\n\t-webkit-border-top-left-radius: inherit;\n\tborder-top-left-radius: inherit;\n\t-webkit-border-top-right-radius: inherit;\n\tborder-top-right-radius: inherit;\n}\n.ui-controlgroup-vertical .ui-btn.ui-last-child {\n\t-webkit-border-bottom-left-radius: inherit;\n\tborder-bottom-left-radius: inherit;\n\t-webkit-border-bottom-right-radius: inherit;\n\tborder-bottom-right-radius: inherit;\n}\n.ui-controlgroup-horizontal .ui-btn.ui-first-child {\n\t-webkit-border-top-left-radius: inherit;\n\tborder-top-left-radius: inherit;\n\t-webkit-border-bottom-left-radius: inherit;\n\tborder-bottom-left-radius: inherit;\n}\n.ui-controlgroup-horizontal .ui-btn.ui-last-child {\n\t-webkit-border-top-right-radius: inherit;\n\tborder-top-right-radius: inherit;\n\t-webkit-border-bottom-right-radius: inherit;\n\tborder-bottom-right-radius: inherit;\n}\n.ui-controlgroup-controls a.ui-shadow:not(:focus),\n.ui-controlgroup-controls button.ui-shadow:not(:focus),\n.ui-controlgroup-controls div.ui-shadow:not(.ui-focus) {\n\t-moz-box-shadow: none;\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n}\n/* Fixes legend not wrapping on IE10 */\n.ui-controlgroup-label legend {\n\tmax-width: 100%;\n}\n.ui-controlgroup-controls > label {\n\tposition: absolute !important;\n\theight: 1px;\n\twidth: 1px;\n\toverflow: hidden;\n\tclip: rect(1px,1px,1px,1px);\n}\n.ui-dialog {\n\t background: none !important; /* this is to ensure that dialog theming does not apply (by default at least) on the page div */\n}\n.ui-dialog-contain {\n\twidth: 92.5%;\n\tmax-width: 500px;\n\tmargin: 10% auto 1em auto;\n\tpadding: 0;\n\tposition: relative;\n\ttop: -1em;\n}\n.ui-dialog-contain > .ui-header, \n.ui-dialog-contain > .ui-content, \n.ui-dialog-contain > .ui-footer { \n\tdisplay: block;\n\tposition: relative; \n\twidth: auto;\n\tmargin: 0;\n}\n.ui-dialog-contain > .ui-header {\n\toverflow: hidden;\n\tz-index: 10; \n\tpadding: 0;\n\tborder-top-width: 0;\n}\n.ui-dialog-contain > .ui-footer {\n\tz-index: 10; \n\tpadding: 0 1em; \n\tborder-bottom-width: 0;\n}\n.ui-popup-open .ui-header-fixed,\n.ui-popup-open .ui-footer-fixed {\n\tposition: absolute !important; /* See issues #4816, #4844 and #4874 and popup.js */\n}\n.ui-popup-screen {\n\tbackground-image: url(\"data:image/gif;base64,R0lGODlhAQABAID/AMDAwAAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==\"); /* Necessary to set some form of background to ensure element is clickable in IE6/7. While legacy IE won't understand the data-URI'd image, it ensures no additional requests occur in all other browsers with little overhead. */\n\ttop: 0;\n\tleft: 0;\n\tright: 0;\n\tbottom: 1px;\n\tposition: absolute;\n\tfilter: Alpha(Opacity=0);\n\topacity: 0;\n\tz-index: 1099;\n}\n.ui-popup-screen.in {\n\topacity: 0.5;\n\tfilter: Alpha(Opacity=50);\n}\n.ui-popup-screen.out {\n\topacity: 0;\n\tfilter: Alpha(Opacity=0);\n}\n.ui-popup-container {\n\tz-index: 1100;\n\tdisplay: inline-block;\n\tposition: absolute;\n\tpadding: 0;\n\toutline: 0;\n}\n.ui-popup {\n\tposition: relative;\n}\n.ui-popup.ui-body-inherit {\n\tborder-width: 1px;\n\tborder-style: solid;\n}\n.ui-popup-hidden {\n\tleft: 0;\n\ttop: 0;\n\tposition: absolute !important;\n\tvisibility: hidden;\n}\n.ui-popup-truncate {\n\theight: 1px;\n\twidth: 1px;\n\tmargin: -1px;\n\toverflow: hidden;\n\tclip: rect(1px,1px,1px,1px);\n}\n.ui-popup.ui-content,\n.ui-popup .ui-content {\n\toverflow: visible;\n}\n.ui-popup > .ui-header {\n\tborder-top-width: 0;\n}\n.ui-popup > .ui-footer {\n\tborder-bottom-width: 0;\n}\n.ui-popup > p,\n.ui-popup > h1,\n.ui-popup > h2,\n.ui-popup > h3,\n.ui-popup > h4,\n.ui-popup > h5,\n.ui-popup > h6 {\n\tmargin: .5em .4375em;\n}\n.ui-popup > span {\n\tdisplay: block;\n\tmargin: .5em .4375em;\n}\n.ui-popup-container .ui-content > p,\n.ui-popup-container .ui-content > h1,\n.ui-popup-container .ui-content > h2,\n.ui-popup-container .ui-content > h3,\n.ui-popup-container .ui-content > h4,\n.ui-popup-container .ui-content > h5,\n.ui-popup-container .ui-content > h6 {\n\tmargin: .5em 0;\n}\n.ui-popup-container .ui-content > span {\n\tmargin: 0;\n}\n.ui-popup-container .ui-content > p:first-child,\n.ui-popup-container .ui-content > h1:first-child,\n.ui-popup-container .ui-content > h2:first-child,\n.ui-popup-container .ui-content > h3:first-child,\n.ui-popup-container .ui-content > h4:first-child,\n.ui-popup-container .ui-content > h5:first-child,\n.ui-popup-container .ui-content > h6:first-child {\n\tmargin-top: 0;\n}\n.ui-popup-container .ui-content > p:last-child,\n.ui-popup-container .ui-content > h1:last-child,\n.ui-popup-container .ui-content > h2:last-child,\n.ui-popup-container .ui-content > h3:last-child,\n.ui-popup-container .ui-content > h4:last-child,\n.ui-popup-container .ui-content > h5:last-child,\n.ui-popup-container .ui-content > h6:last-child {\n\tmargin-bottom: 0;\n}\n.ui-popup > img {\n\tmax-width: 100%;\n\tmax-height: 100%;\n\tvertical-align: middle;\n}\n.ui-popup:not(.ui-content) > img:only-child,\n.ui-popup:not(.ui-content) > .ui-btn-left:first-child + img:last-child,\n.ui-popup:not(.ui-content) > .ui-btn-right:first-child + img:last-child {\n\t-webkit-border-radius: inherit;\n\tborder-radius: inherit;\n}\n.ui-popup iframe {\n\tvertical-align: middle;\n}\n.ui-popup > .ui-btn-left,\n.ui-popup > .ui-btn-right {\n\tposition: absolute; \n\ttop: -11px;\n\tmargin: 0;\n\tz-index: 1101;\n}\n.ui-popup > .ui-btn-left {\n\tleft: -11px;\n}\n.ui-popup > .ui-btn-right {\n\tright: -11px;\n}\n/* Dimensions related to the popup arrow\n-----------------------------------------------------------------------------------------------------------*/\n/* desired triangle height: 10px */\n/**\n * guide for the arrow - its width, height, and offset are theme-dependent and\n * should be expessed as left, right, top, bottom, so that the element bearing\n * such a class becomes stretched inside its parent position: relative element.\n * The left/top/right/bottom specified below should reflect the corresponding\n * border radii and so it leaves room for the shadow:\n *     ..--------------------..\n *   .\"        ^ top           \".\n *  /          v                 \\\n * |     +------------------+     |\n * |     |                  |     |\n * | left|                  |right|\n * |<--->|                  |<--->|\n * |     +------------------+     |\n *  \\          ^                 /\n *   `.        v bottom        .'\n *     \"\"--------------------\"\"\n * The idea is that the top/left of the arrow container box does not move to a\n * coordinate smaller than the top/left of the guide and the right/bottom of\n * the arrow container box does not move to a coordinate larger than the\n * bottom/right of the guide. This will help us avoid the following situation:\n *        ..--------------------..\n *      .\"        ^ top           \".\n *   /|/          v                 \\\n *  / |     +------------------+     |\n *  \\ |     |                  |     |\n *   \\| left|                  |right|\n *    |<--->|                  |<--->|\n *    |     +------------------+     |\n *     \\          ^                 /\n *      `.        v bottom        .'\n *        \"\"--------------------\"\"\n * The arrow should not receive a top/left coordinate such that it is too close\n * to one of the corners, because then at first the shadow of the arrow and,\n * given a coordinate even closer to the corner, even the body of the arrow will\n * \"stick out\" of the corner of the popup. The guide provides a hint to the\n * arrow positioning code as to which range of values is acceptable for the\n * arrow container's top/left coordinate.\n **/\n.ui-popup-arrow-container {\n\twidth: 20px;\n\theight: 20px;\n}\n/* aside from the \"infinities\" (-1000,2000), triangle height is used */\n.ui-popup-arrow-container.ui-popup-arrow-l {\n\tleft: -10px;\n\tclip: rect(-1000px,10px,2000px,-1000px);\n}\n.ui-popup-arrow-container.ui-popup-arrow-t {\n\ttop: -10px;\n\tclip: rect(-1000px,2000px,10px,-1000px);\n}\n.ui-popup-arrow-container.ui-popup-arrow-r {\n\tright: -10px;\n\tclip: rect(-1000px,2000px,2000px,10px);\n}\n.ui-popup-arrow-container.ui-popup-arrow-b {\n\tbottom: -10px;\n\tclip: rect(10px,2000px,1000px,-1000px);\n}\n/**\n * For each side, the arrow is twice the desired size and its corner is aligned\n * with the edge of the container:\n *                                           \n *           /\\         /\\                +----+       /\\\n *          /  \\       /  \\               | /\\ |top   /  \\\n *      +----+  \\     /  +----+       +-->|/  \\|     /    \\\n *  left| /  |   \\   /   |  \\ |right  |   |    |    /      \\\n *      |/   |    \\ /    |   \\|       |  /|    |\\  /        \\\n *      |\\   |    / \\    |   /|       | / +----+ \\ \\ +----+ /\n *      | \\  |   /   \\   |  / |       | \\        /  \\|    |/\n *      +----+  /     \\  +----+       |  \\      /    |    |\n *       ^  \\  /       \\  /  ^        |   \\    /  +->|\\  /|\n *       |   \\/         \\/   |        |    \\  /   |  | \\/ |bottom\n *       |                   |        |     \\/    |  +----+\n *       +-------------------+--------+-----------+\n *                           |\n *                    arrow container\n *                     (clips arrow)\n **/\n.ui-popup-arrow-container .ui-popup-arrow {\n\t/* (4*desired triangle height)/sqrt(2) - does not account for border - centred within the outer rectangle */\n\twidth: 28.284271247px;\n\theight: 28.284271247px;\n\tborder-width: 1px;\n\tborder-style: solid;\n}\n.ui-popup-arrow-container.ui-popup-arrow-t .ui-popup-arrow {\n\tleft: -4.142135623px;\n\ttop: 5.857864376px;\n}\n.ui-popup-arrow-container.ui-popup-arrow-b .ui-popup-arrow {\n\tleft: -4.142135623px;\n\ttop: -14.142135623px;\n}\n.ui-popup-arrow-container.ui-popup-arrow-l .ui-popup-arrow {\n\tleft: 5.857864376px;\n\ttop: -4.142135623px;\n}\n.ui-popup-arrow-container.ui-popup-arrow-r .ui-popup-arrow {\n\tleft: -14.142135623px;\n\ttop: -4.142135623px;\n}\n/* Fix rotation center for oldIE - see http://www.useragentman.com/IETransformsTranslator/ */\n.ui-popup-arrow-container.ui-popup-arrow-t.ie .ui-popup-arrow {\n    margin-left: -5.857864376269049px;\n    margin-top: -7.0710678118654755px;\n}\n.ui-popup-arrow-container.ui-popup-arrow-b.ie .ui-popup-arrow {\n    margin-left: -5.857864376269049px;\n    margin-top: -4.142135623730951px;\n}\n \n.ui-popup-arrow-container.ui-popup-arrow-l.ie .ui-popup-arrow {\n    margin-left: -7.0710678118654755px;\n    margin-top: -5.857864376269049px;\n}\n.ui-popup-arrow-container.ui-popup-arrow-r.ie .ui-popup-arrow {\n    margin-left: -4.142135623730951px;\n    margin-top: -5.857864376269049px;\n}\n/* structure */\n.ui-popup > .ui-popup-arrow-guide {\n\tposition: absolute;\n\tleft: 0;\n\tright: 0;\n\ttop: 0;\n\tbottom: 0;\n\tvisibility: hidden;\n}\n.ui-popup-arrow-container {\n\tposition: absolute;\n}\n.ui-popup-arrow {\n\t-webkit-transform: rotate(45deg);\n\t-moz-transform: rotate(45deg);\n\t-ms-transform: rotate(45deg);\n\ttransform: rotate(45deg);\n\tposition: absolute;\n\toverflow: hidden;\n\tbox-sizing: border-box;\n}\n.ui-popup-arrow-container.ie .ui-popup-arrow {\n\t-ms-filter: \"progid:DXImageTransform.Microsoft.Matrix(M11=0.7071067811865474, M12=-0.7071067811865477, M21=0.7071067811865477, M22=0.7071067811865474, SizingMethod='auto expand')\";\n\tfilter: progid:DXImageTransform.Microsoft.Matrix(\n\t      \tM11=0.7071067811865474,\n        \tM12=-0.7071067811865477,\n        \tM21=0.7071067811865477,\n        \tM22=0.7071067811865474,\n        \tSizingMethod='auto expand');\n}\n.ui-checkbox,\n.ui-radio {\n\tmargin: .5em 0;\n\tposition: relative;\n}\n.ui-checkbox .ui-btn,\n.ui-radio .ui-btn {\n\tmargin: 0;\n\ttext-align: left;\n\twhite-space: normal; /* Nowrap + ellipsis doesn't work on label. Issue #1419. */\n\tz-index: 2;\n}\n.ui-controlgroup .ui-checkbox .ui-btn.ui-focus,\n.ui-controlgroup .ui-radio .ui-btn.ui-focus {\n\tz-index: 3;\n}\n.ui-checkbox .ui-btn-icon-top,\n.ui-radio .ui-btn-icon-top,\n.ui-checkbox .ui-btn-icon-bottom,\n.ui-radio .ui-btn-icon-bottom {\n\ttext-align: center;\n}\n.ui-controlgroup-horizontal .ui-checkbox .ui-btn:after,\n.ui-controlgroup-horizontal .ui-radio .ui-btn:after {\n\tcontent: none;\n\tdisplay: none;\n}\n/* Native input positioning */\n.ui-checkbox input,\n.ui-radio input {\n\tposition: absolute;\n\tleft: .466em;\n\ttop: 50%;\n\twidth: 22px;\n\theight: 22px;\n\tmargin: -11px 0 0 0;\n\toutline: 0 !important;\n\tz-index: 1;\n}\n.ui-controlgroup-horizontal .ui-checkbox input,\n.ui-controlgroup-horizontal .ui-radio input {\n\tleft: 50%;\n\tmargin-left: -9px;\n}\n.ui-checkbox input:disabled,\n.ui-radio input:disabled {\n\tposition: absolute !important;\n\theight: 1px;\n\twidth: 1px;\n\toverflow: hidden;\n\tclip: rect(1px,1px,1px,1px);\n}\n.ui-select {\n\tmargin-top: .5em;\n\tmargin-bottom: .5em; /* no shorthand for margin because it would override margin-right for inline selects */\n\tposition: relative;\n}\n.ui-select > select {\n\tposition: absolute !important;\n\theight: 1px;\n\twidth: 1px;\n\toverflow: hidden;\n\tclip: rect(1px,1px,1px,1px);\n}\n.ui-select .ui-btn {\n\tmargin: 0;\n\topacity: 1; /* Fixes #2588: When Windows Phone 7.5 (Mango) tries to calculate a numeric opacity for a select (including \"inherit\") without explicitly specifying an opacity on the parent to give it context, a bug appears where clicking elsewhere on the page after opening the select will open the select again. */\n}\n.ui-select .ui-btn select {\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n\twidth: 100%;\n\tmin-height: 1.5em;\n\tmin-height: 100%;\n\theight: 3em;\n\tmax-height: 100%;\n\toutline: 0;\n\t-webkit-border-radius: inherit;\n\tborder-radius: inherit;\t\n\t-webkit-appearance: none;\n\t-moz-appearance: none;\n\tcursor: pointer;\n\tfilter: Alpha(Opacity=0);\n\topacity: 0;\n\tz-index: 2;\n}\n@-moz-document url-prefix() {\n\t.ui-select .ui-btn select {\n\t\topacity: 0.0001;\n\t}\n}\n/* Display none because of issues with IE/WP's filter alpha opacity */\n.ui-select .ui-state-disabled select {\n\tdisplay: none;\n}\n/* Because we add all classes of the select and option elements to the span... */ \n.ui-select span.ui-state-disabled {\n\tfilter: Alpha(Opacity=100);\n\topacity: 1;\n}\n.ui-select .ui-btn.ui-select-nativeonly {\n\tborder-radius: 0;\n\tborder: 0;\n}\n.ui-select .ui-btn.ui-select-nativeonly select {\n\topacity: 1;\n\ttext-indent: 0;\n\tdisplay: block;\n}\n/* ui-li-count is styled in the listview CSS. We set padding and offset here because select supports icon position while listview doesn't. */\n.ui-select .ui-li-has-count.ui-btn {\n\tpadding-right: 2.8125em;\n}\n.ui-select .ui-li-has-count.ui-btn-icon-right {\n\tpadding-right: 4.6875em;\n}\n.ui-select .ui-btn-icon-right .ui-li-count {\n\tright: 3.2em;\n}\n/* We set the rules for the span as well to fix an issue on Chrome with text-overflow ellipsis for the button in combination with text-align center. */\n.ui-select .ui-btn > span:not(.ui-li-count) {\n\tdisplay: block;\n\ttext-overflow: ellipsis;\n\toverflow: hidden !important;\n\twhite-space: nowrap;\n}\n.ui-selectmenu.ui-popup {\n\tmin-width: 11em;\n}\n.ui-selectmenu .ui-dialog-contain {\n\toverflow: hidden;\n}\n.ui-selectmenu .ui-header {\n\tmargin: 0;\n\tpadding: 0;\n\tborder-width: 0;\n}\n.ui-selectmenu.ui-dialog .ui-header {\n\tz-index: 1;\n\tposition: relative;\n}\n.ui-selectmenu.ui-popup .ui-header {\n\t-webkit-border-bottom-right-radius: 0;\n\tborder-bottom-right-radius: 0;\n\t-webkit-border-bottom-left-radius: 0;\n\tborder-bottom-left-radius: 0;\n}\n/* when no placeholder is defined in a multiple select, the header height doesn't even extend past the close button.  this shim's content in there */\n.ui-selectmenu.ui-popup .ui-header h1:after {\n\tcontent: '.';\n\tvisibility: hidden;\n}\n.ui-selectmenu .ui-header .ui-title {\n\tmargin: 0 2.875em;\n}\n.ui-selectmenu.ui-dialog .ui-content {\n\toverflow: visible;\n\tz-index: 1;\n}\n.ui-selectmenu .ui-selectmenu-list {\n\tmargin: 0;\n\t-webkit-border-radius: inherit;\n\tborder-radius: inherit;\t\n}\n.ui-header:not(.ui-screen-hidden) + .ui-selectmenu-list {\n\t-webkit-border-top-right-radius: 0;\n\tborder-top-right-radius: 0;\n\t-webkit-border-top-left-radius: 0;\n\tborder-top-left-radius: 0;\n}\n.ui-header.ui-screen-hidden + .ui-selectmenu-list li.ui-first-child .ui-btn {\n\tborder-top-width: 0;\n}\n.ui-selectmenu .ui-selectmenu-list li.ui-last-child .ui-btn {\n\tborder-bottom-width: 0;\n}\n.ui-selectmenu .ui-btn.ui-li-divider {\n\tcursor: default;\n}\n.ui-selectmenu .ui-selectmenu-placeholder {\n\tdisplay: none;\n}\n.ui-listview,\n.ui-listview > li {\n\tmargin: 0;\n\tpadding: 0;\n\tlist-style: none;\n}\n.ui-content .ui-listview,\n.ui-panel-inner > .ui-listview {\n\tmargin: -1em;\n}\n.ui-content .ui-listview-inset,\n.ui-panel-inner > .ui-listview-inset {\n\tmargin: 1em 0;\n}\n.ui-collapsible-content > .ui-listview {\n\tmargin: -.5em -1em;\n}\n.ui-collapsible-content > .ui-listview-inset {\n\tmargin: .5em 0;\n}\n.ui-listview > li {\n\tdisplay: block;\n\tposition: relative;\n\toverflow: visible;\n}\n.ui-listview > .ui-li-static,\n.ui-listview > .ui-li-divider,\n.ui-listview > li > a.ui-btn {\n\tmargin: 0;\n\tdisplay: block;\n\tposition: relative;\n\ttext-align: left;\n\ttext-overflow: ellipsis;\n\toverflow: hidden;\n\twhite-space: nowrap;\n}\n.ui-listview > li > .ui-btn:focus {\n\tz-index: 1;\n}\n.ui-listview > .ui-li-static,\n.ui-listview > .ui-li-divider,\n.ui-listview > li > a.ui-btn {\n\tborder-width: 1px 0 0 0;\n\tborder-style: solid;\n}\n.ui-listview-inset > .ui-li-static,\n.ui-listview-inset > .ui-li-divider,\n.ui-listview-inset > li > a.ui-btn {\n\tborder-right-width: 1px;\n\tborder-left-width: 1px;\n}\n.ui-listview > .ui-li-static.ui-last-child,\n.ui-listview > .ui-li-divider.ui-last-child,\n.ui-listview > li.ui-last-child > a.ui-btn {\n\tborder-bottom-width: 1px;\n}\n.ui-collapsible-content > .ui-listview:not(.ui-listview-inset) > li.ui-first-child,\n.ui-collapsible-content > .ui-listview:not(.ui-listview-inset) > li.ui-first-child > a.ui-btn {\n\tborder-top-width: 0;\n}\n.ui-collapsible-themed-content .ui-listview:not(.ui-listview-inset) > li.ui-last-child,\n.ui-collapsible-themed-content .ui-listview:not(.ui-listview-inset) > li.ui-last-child > a.ui-btn {\n\tborder-bottom-width: 0;\n}\n.ui-listview > li.ui-first-child,\n.ui-listview > li.ui-first-child > a.ui-btn {\n\t-webkit-border-top-right-radius: inherit;\t\n\tborder-top-right-radius: inherit;\n\t-webkit-border-top-left-radius: inherit;\n\tborder-top-left-radius: inherit;\n}\n.ui-listview > li.ui-last-child,\n.ui-listview > li.ui-last-child > a.ui-btn {\n\t-webkit-border-bottom-right-radius: inherit;\n\tborder-bottom-right-radius: inherit;\n\t-webkit-border-bottom-left-radius: inherit;\n\tborder-bottom-left-radius: inherit;\n}\n.ui-listview > li.ui-li-has-alt > a.ui-btn {\n\t-webkit-border-top-right-radius: 0;\n\tborder-top-right-radius: 0;\n\t-webkit-border-bottom-right-radius: 0;\n\tborder-bottom-right-radius: 0;\n}\n.ui-listview > li.ui-first-child > a.ui-btn + a.ui-btn {\n\t-webkit-border-top-left-radius: 0;\t\n\tborder-top-left-radius: 0;\n\t-webkit-border-top-right-radius: inherit;\n\tborder-top-right-radius: inherit;\n}\n.ui-listview > li.ui-last-child > a.ui-btn + a.ui-btn {\n\t-webkit-border-bottom-left-radius: 0;\n\tborder-bottom-left-radius: 0;\n\t-webkit-border-bottom-right-radius: inherit;\n\tborder-bottom-right-radius: inherit;\n}\n.ui-listview > li.ui-first-child img:first-child:not(.ui-li-icon) {\n\t-webkit-border-top-left-radius: inherit;\n\tborder-top-left-radius: inherit;\t\n}\n.ui-listview > li.ui-last-child img:first-child:not(.ui-li-icon) {\n\t-webkit-border-bottom-left-radius: inherit;\n\tborder-bottom-left-radius: inherit;\t\n}\n.ui-collapsible-content > .ui-listview:not(.ui-listview-inset) {\n\t-webkit-border-radius: inherit;\n\tborder-radius: inherit;\t\n}\n.ui-listview > .ui-li-static {\n\tpadding: .7em 1em;\n}\n.ui-listview > .ui-li-divider {\n\tpadding: .5em 1.143em;\n\tfont-size: 14px;\n\tfont-weight: bold;\n\tcursor: default;\n\toutline: 0; /* Dividers in custom selectmenus have tabindex */\n}\n.ui-listview > .ui-li-has-count > .ui-btn,\n.ui-listview > .ui-li-static.ui-li-has-count,\n.ui-listview > .ui-li-divider.ui-li-has-count {\n\tpadding-right: 2.8125em;\n}\n.ui-listview > .ui-li-has-count > .ui-btn-icon-right {\n\tpadding-right: 4.6875em;\n}\n.ui-listview > .ui-li-has-thumb > .ui-btn,\n.ui-listview > .ui-li-static.ui-li-has-thumb {\n\tmin-height: 3.625em;\n\tpadding-left: 6.25em;\n}\n/* ui-li-has-icon deprecated in 1.4. TODO: remove in 1.5 */\n.ui-listview > .ui-li-has-icon > .ui-btn,\n.ui-listview > .ui-li-static.ui-li-has-icon {\n\tmin-height: 1.25em;\n\tpadding-left: 2.5em;\n}\n/* Used by both listview and custom multiple select button */\n.ui-li-count {\n\tposition: absolute;\n\tfont-size: 12.5px;\n\tfont-weight: bold;\n\ttext-align: center;\n\tborder-width: 1px;\n\tborder-style: solid;\n\tpadding: 0 .48em;\n\tline-height: 1.6em;\n\tmin-height: 1.6em;\n\tmin-width: .64em;\n\tright: .8em;\n\ttop: 50%;\n\tmargin-top: -.88em;\n}\n.ui-listview .ui-btn-icon-right .ui-li-count {\n\tright: 3.2em;\n}\n.ui-listview .ui-li-has-thumb > img:first-child,\n.ui-listview .ui-li-has-thumb > .ui-btn > img:first-child,\n.ui-listview .ui-li-has-thumb .ui-li-thumb {\n\tposition: absolute;\n\tleft: 0;\n\ttop: 0;\n\tmax-height: 5em;\n\tmax-width: 5em;\n}\n/* ui-li-has-icon deprecated in 1.4. TODO: remove in 1.5 */\n.ui-listview > .ui-li-has-icon > img:first-child,\n.ui-listview > .ui-li-has-icon > .ui-btn > img:first-child {\n\tposition: absolute;\n\tleft: .625em;\n\ttop: .9em;\n\tmax-height: 1em;\n\tmax-width: 1em;\n}\n.ui-listview > li h1,\n.ui-listview > li h2,\n.ui-listview > li h3,\n.ui-listview > li h4,\n.ui-listview > li h5,\n.ui-listview > li h6 {\n\tfont-size: 1em;\n\tfont-weight: bold;\n\tdisplay: block;\n\tmargin: .45em 0;\n\ttext-overflow: ellipsis;\n\toverflow: hidden;\n\twhite-space: nowrap;\n}\n.ui-listview > li p {\n\tfont-size: .75em;\n\tfont-weight: normal;\n\tdisplay: block;\n\tmargin: .6em 0;\n\ttext-overflow: ellipsis;\n\toverflow: hidden;\n\twhite-space: nowrap;\n}\n.ui-listview .ui-li-aside {\n\tposition: absolute;\n\ttop: 1em;\n\tright: 3.333em;\n\tmargin: 0;\n\ttext-align: right;\n}\n.ui-listview > li.ui-li-has-alt > .ui-btn {\n\tmargin-right: 2.5em;\n\tborder-right-width: 0;\n}\n.ui-listview > li.ui-li-has-alt > .ui-btn + .ui-btn {\n\tposition: absolute;\n\twidth: 2.5em;\n\theight: 100%;\n\tmin-height: auto;\n\t-webkit-box-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\tbox-sizing: border-box;\n\tborder-left-width: 1px;\n\ttop: 0;\n\tright: 0;\n\tmargin: 0;\n\tpadding: 0;\n\tz-index: 2;\n}\n.ui-listview-inset > li.ui-li-has-alt > .ui-btn + .ui-btn {\n\tborder-right-width: 1px;\n}\n.ui-listview > li.ui-li-has-alt > .ui-btn + .ui-btn:focus {\n\tz-index: 3;\n}\nol.ui-listview,\nol.ui-listview > .ui-li-divider {\n\tcounter-reset: listnumbering;\n}\nol.ui-listview > li > .ui-btn,\nol.ui-listview > li.ui-li-static {\n\tvertical-align: middle;\n}\nol.ui-listview > li > .ui-btn:first-child:before,\nol.ui-listview > li.ui-li-static:before,\nol.ui-listview > li.ui-field-contain > label:before,\nol.ui-listview > li.ui-field-contain > .ui-controlgroup-label:before {\n\tdisplay: inline-block;\n\tfont-size: .9em;\n\tfont-weight: normal;\n\tpadding-right: .3em;\n\tmin-width: 1.4em;\n\tline-height: 1.5;\n\tvertical-align: middle;\n\tcounter-increment: listnumbering;\n\tcontent: counter(listnumbering) \".\";\n}\nol.ui-listview > li.ui-field-contain:before {\n\tcontent: none;\n\tdisplay: none;\n}\nol.ui-listview > li h1:first-child,\nol.ui-listview > li h2:first-child,\nol.ui-listview > li h3:first-child,\nol.ui-listview > li h4:first-child,\nol.ui-listview > li h5:first-child,\nol.ui-listview > li h6:first-child,\nol.ui-listview > li p:first-child,\nol.ui-listview > li img:first-child + * {\n\tdisplay: inline-block;\n\tvertical-align: middle;\n}\nol.ui-listview > li h1:first-child ~ *,\nol.ui-listview > li h2:first-child ~ *,\nol.ui-listview > li h3:first-child ~ *,\nol.ui-listview > li h4:first-child ~ *,\nol.ui-listview > li h5:first-child ~ *,\nol.ui-listview > li h6:first-child ~ *,\nol.ui-listview > li p:first-child ~ *,\nol.ui-listview > li img:first-child + * ~ * {\n\tmargin-top: 0;\n\ttext-indent: 2.04em; /* (1.4em + .3em) * .9em / .75em */\n}\nhtml .ui-filterable + .ui-listview,\nhtml .ui-filterable.ui-listview {\n\tmargin-top: .5em;\n}\n.ui-collapsible-content > form.ui-filterable {\n\tmargin-top: -.5em;\n}\n.ui-collapsible-content > .ui-input-search.ui-filterable {\n\tmargin-top: 0;\n}\n.ui-collapsible-content > .ui-filterable + .ui-listview:not(.ui-listview-inset) > li.ui-first-child,\n.ui-collapsible-content > .ui-filterable + .ui-listview:not(.ui-listview-inset) > li.ui-first-child > a.ui-btn,\n.ui-collapsible-content > .ui-filterable.ui-listview:not(.ui-listview-inset) > li.ui-first-child,\n.ui-collapsible-content > .ui-filterable.ui-listview:not(.ui-listview-inset) > li.ui-first-child > a.ui-btn {\n\tborder-top-width: 1px;\n}\ndiv.ui-slider {\n\theight: 30px;\n\tmargin: .5em 0;\n\tpadding: 0;\n\t-ms-touch-action: pan-y pinch-zoom double-tap-zoom;\n}\ndiv.ui-slider:before,\ndiv.ui-slider:after {\n\tcontent: \"\";\n\tdisplay: table;\n}\ndiv.ui-slider:after {\n\tclear: both;\n}\ninput.ui-slider-input {\n\tdisplay: block;\n\tfloat: left;\n\tfont-size: 14px;\n\tfont-weight: bold;\n\tmargin: 0;\n\tpadding: 4px;\n\twidth: 40px;\n\theight: 20px;\n\tline-height: 20px;\n\tborder-width: 1px;\n\tborder-style: solid;\n\toutline: 0;\n\ttext-align: center;\n\tvertical-align: text-bottom;\n\t-webkit-appearance: none;\n\t-moz-appearance: none;\n\tappearance: none;\n\t-webkit-box-sizing: content-box;\n\t-moz-box-sizing: content-box;\n\tbox-sizing: content-box;\n}\n.ui-slider-input::-webkit-outer-spin-button,\n.ui-slider-input::-webkit-inner-spin-button {\n\t-webkit-appearance: none;\n\tmargin: 0;\n}\n.ui-slider-track {\n\tposition: relative;\n\toverflow: visible;\n\tborder-width: 1px;\n\tborder-style: solid;\n\theight: 15px;\n\tmargin: 0 15px 0 68px;\n\ttop: 6px;\n}\n.ui-slider-track.ui-mini {\n\theight: 12px;\n\ttop: 8px;\n}\n.ui-slider-track .ui-slider-bg {\n\theight: 100%;\n}\n/* High level of specificity to override button margins in grids */\n.ui-slider-track .ui-btn.ui-slider-handle {\n\tposition: absolute;\n\tz-index: 1;\n\ttop: 50%;\n\twidth: 28px;\n\theight: 28px;\n\tmargin: -15px 0 0 -15px;\n\toutline: 0;\n\tpadding: 0;\n}\n.ui-slider-track.ui-mini .ui-slider-handle {\n\theight: 14px;\n\twidth: 14px;\n\tmargin: -8px 0 0 -8px;\n}\nselect.ui-slider-switch {\n\tposition: absolute !important;\n\theight: 1px;\n\twidth: 1px;\n\toverflow: hidden;\n\tclip: rect(1px,1px,1px,1px);\n}\ndiv.ui-slider-switch {\n\tdisplay: inline-block;\n\theight: 32px;\n\twidth: 5.8em;\n\ttop: 0;\n}\n/* reset the clearfix */\ndiv.ui-slider-switch:before,\ndiv.ui-slider-switch:after {\n\tdisplay: none;\n\tclear: none;\n}\ndiv.ui-slider-switch.ui-mini {\n\theight: 29px;\n\ttop: 0;\n}\n.ui-slider-inneroffset {\n\tmargin: 0 16px;\n\tposition: relative;\n\tz-index: 1;\n}\n.ui-slider-switch.ui-mini .ui-slider-inneroffset {\n\tmargin: 0 15px 0 14px;\n}\n.ui-slider-switch .ui-btn.ui-slider-handle {\n\tmargin: 1px 0 0 -15px;\n}\n.ui-slider-switch.ui-mini .ui-slider-handle {\n\twidth: 25px;\n\theight: 25px;\n\tmargin: 1px 0 0 -13px;\n\tpadding: 0;\n}\n.ui-slider-handle-snapping {\n\t-webkit-transition: left 70ms linear;\n\t-moz-transition: left 70ms linear;\n\ttransition: left 70ms linear;\n}\n.ui-slider-switch .ui-slider-label {\n\tposition: absolute;\n\ttext-align: center;\n\twidth: 100%;\n\toverflow: hidden;\n\tfont-size: 16px;\n\ttop: 0;\n\tline-height: 2;\n\tmin-height: 100%;\n\twhite-space: nowrap;\n\tcursor: pointer;\n}\n.ui-slider-switch.ui-mini .ui-slider-label {\n\tfont-size: 14px;\n}\n.ui-slider-switch .ui-slider-label-a {\n\tz-index: 1;\n\tleft: 0;\n\ttext-indent: -1.5em;\n}\n.ui-slider-switch .ui-slider-label-b {\n\tz-index: 0;\n\tright: 0;\n\ttext-indent: 1.5em;\n}\n/* The corner radii for ui-slider-switch/track can be specified in theme CSS. The bg and handle inherits. */\n.ui-slider-track .ui-slider-bg,\n.ui-slider-switch .ui-slider-label,\n.ui-slider-switch .ui-slider-inneroffset,\n.ui-slider-handle {\n\t-webkit-border-radius: inherit;\n\tborder-radius: inherit;\n}\n.ui-field-contain div.ui-slider-switch {\n\tmargin: 0;\n}\n/* ui-hide-label deprecated in 1.4. TODO: Remove in 1.5 */\n.ui-field-contain div.ui-slider-switch,\n.ui-field-contain.ui-hide-label div.ui-slider-switch,\nhtml .ui-popup .ui-field-contain div.ui-slider-switch {\n\tdisplay: inline-block;\n\twidth: 5.8em;\n}\n/* slider tooltip\n-----------------------------------------------------------------------------------------------------------*/\n.ui-slider-popup {\n\twidth: 64px;\n\theight: 64px;\n\tfont-size: 36px;\n\tpadding-top: 14px;\n\topacity: 0.8;\n}\n.ui-slider-popup {\n\tposition: absolute !important;\n\ttext-align: center;\n\tz-index: 100;\n}\n.ui-slider-track .ui-btn.ui-slider-handle {\n\tfont-size: .9em;\n\tline-height: 30px;\n}\n.ui-rangeslider {\n\tmargin: .5em 0;\n}\n.ui-rangeslider:before,\n.ui-rangeslider:after {\n\tcontent: \"\";\n\tdisplay: table;\n}\n.ui-rangeslider:after {\n\tclear: both;\n}\n.ui-rangeslider .ui-slider-input.ui-rangeslider-last {\n\tfloat: right;\n}\n.ui-rangeslider .ui-rangeslider-sliders {\n\tposition: relative;\n\toverflow: visible;\n\theight: 30px;\n\tmargin: 0 68px;\n}\n.ui-rangeslider .ui-rangeslider-sliders .ui-slider-track {\n\tposition: absolute;\n\ttop: 6px;\n\tright: 0;\n\tleft: 0;\n\tmargin: 0;\n}\n.ui-rangeslider.ui-mini .ui-rangeslider-sliders .ui-slider-track {\n\ttop: 8px;\n}\n.ui-rangeslider .ui-slider-track:first-child .ui-slider-bg {\n\tdisplay: none;\n}\n.ui-rangeslider .ui-rangeslider-sliders .ui-slider-track:first-child {\n\tbackground-color: transparent;\n\tbackground: none;\n\tborder-width: 0;\n\theight: 0;\n}\n/* this makes ie6 and ie7 set height to 0 to fix z-index problem */\nhtml >/**/body .ui-rangeslider .ui-rangeslider-sliders .ui-slider-track:first-child {\n\theight: 15px;\n\tborder-width: 1px;\n}\nhtml >/**/body .ui-rangeslider.ui-mini .ui-rangeslider-sliders .ui-slider-track:first-child {\n\theight: 12px;\n}\n/* Hide the second label (the first is moved outside the div) */\ndiv.ui-rangeslider label {\n\tposition: absolute !important;\n\theight: 1px;\n\twidth: 1px;\n\toverflow: hidden;\n\tclip: rect(1px,1px,1px,1px);\n}\n.ui-field-contain .ui-rangeslider input.ui-slider-input,\n.ui-field-contain .ui-rangeslider.ui-mini input.ui-slider-input,\n.ui-field-contain .ui-rangeslider .ui-rangeslider-sliders,\n.ui-field-contain .ui-rangeslider.ui-mini .ui-rangeslider-sliders {\n\tmargin-top: 0;\n\tmargin-bottom: 0;\n}\n.ui-input-text,\n.ui-input-search {\n\tmargin: .5em 0;\n\tborder-width: 1px;\n\tborder-style: solid;\n}\n.ui-mini {\n\tmargin: .446em;\n}\n.ui-input-text input,\n.ui-input-search input,\ntextarea.ui-input-text {\n\tpadding: .4em;\n\tline-height: 1.4em;\n\tdisplay: block;\n\twidth: 100%;\n\t-webkit-box-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\tbox-sizing: border-box;\n\toutline: 0;\n}\n.ui-input-text input,\n.ui-input-search input {\n\tmargin: 0;\n\tmin-height: 2.2em;\n\ttext-align: left; /* Opera aligns type=\"date\" right by default */\n\tborder: 0;\n\tbackground: transparent none;\n\t-webkit-appearance: none;\n\t-webkit-border-radius: inherit;\n\tborder-radius: inherit;\n}\ntextarea.ui-input-text {\n\toverflow: auto;\n\tresize: vertical;\n}\n.ui-mini .ui-input-text input,\n.ui-mini .ui-input-search input,\n.ui-input-text.ui-mini input,\n.ui-input-search.ui-mini input,\n.ui-mini textarea.ui-input-text,\ntextarea.ui-mini {\n\tfont-size: 14px;\n}\n/* Same margin for mini textareas as other mini sized widgets (12.5/14 * 0.5em) */\n.ui-mini textarea.ui-input-text,\ntextarea.ui-mini {\n\tmargin: .446em 0;\n}\n.ui-input-has-clear,\n.ui-input-search {\n\tposition: relative;\n}\n/* Padding on the div instead of input because of browser spinners etc. */\n.ui-input-has-clear {\n\tpadding-right: 2.375em;\n}\n.ui-mini.ui-input-has-clear {\n\tpadding-right: 2.923em;\n}\n.ui-input-has-clear input {\n\tpadding-right: 0;\n\t/* Autofill on Chrome has bg color so we unset corners right as well. */\n\t-webkit-border-top-right-radius: 0;\n\tborder-top-right-radius: 0;\n\t-webkit-border-bottom-right-radius: 0;\n\tborder-bottom-right-radius: 0;\n}\n/* Search icon */\n.ui-input-search input {\n\tpadding-left: 1.75em;\n}\n.ui-input-search:after {\n\tposition: absolute;\n\tleft: .3125em;\n\ttop: 50%;\n\tmargin-top: -7px;\n\tcontent: \"\";\n\tbackground-position: center center;\n\tbackground-repeat: no-repeat;\n\twidth: 14px;\n\theight: 14px;\n\tfilter: Alpha(Opacity=50);\n\topacity: .5;\n}\n.ui-input-search.ui-input-has-clear .ui-btn.ui-input-clear,\n.ui-input-text.ui-input-has-clear .ui-btn.ui-input-clear {\n\tposition: absolute;\n\tright: 0;\n\ttop: 50%;\n\tmargin: -14px .3125em 0;\n\tborder: 0;\n\tbackground-color: transparent;\n}\n.ui-input-search .ui-input-clear-hidden,\n.ui-input-text .ui-input-clear-hidden {\n\tdisplay: none;\n}\n/* Resolves issue #5166: Added to support issue introduced in Firefox 15. We can likely remove this in the future. */\n.ui-input-text input::-moz-placeholder,\n.ui-input-search input::-moz-placeholder,\ntextarea.ui-input-text::-moz-placeholder {\n\tcolor: #aaa;\n}\n/* Same for IE10 */\n.ui-input-text input:-ms-input-placeholder,\n.ui-input-search input:-ms-input-placeholder,\ntextarea.ui-input-text:-ms-input-placeholder {\n\tcolor: #aaa;\n}\n/* Resolves issue #5131: Width of textinput depends on its type,\nfor Android 4.1 */\n.ui-input-text input[type=number]::-webkit-outer-spin-button {\n\tmargin: 0;\n}\n/* Resolves issue #5756: Textinput in IE10 has a default clear button */\n.ui-input-text input::-ms-clear,\n.ui-input-search input::-ms-clear {\n\tdisplay: none;\n}\n.ui-input-text input:focus,\n.ui-input-search input:focus {\n\t-webkit-box-shadow: none;\n\t-moz-box-shadow: none;\n\tbox-shadow: none;\n}\ntextarea.ui-input-text.ui-textinput-autogrow {\n\toverflow: hidden;\n}\n.ui-textinput-autogrow-resize {\n\t-webkit-transition: height 0.25s;\n\t-o-transition: height 0.25s;\n\t-moz-transition: height 0.25s;\n\ttransition: height 0.25s;\n}\n.ui-flipswitch {\n\tdisplay: inline-block;\n\tvertical-align: middle;\n\twidth: 5.875em; /* Override this and padding-left in next rule if you use labels other than \"on/off\" and need more space */\n\theight: 1.875em;\n\tborder-width: 1px;\n\tborder-style: solid;\n\tmargin: .5em 0;\n\toverflow: hidden;\n\t-webkit-transition-property: padding, width, background-color, color, border-color;\n\t-moz-transition-property: padding, width, background-color, color, border-color;\n\t-o-transition-property: padding, width, background-color, color, border-color;\n\ttransition-property: padding, width, background-color, color, border-color;\n\t-webkit-transition-duration: 100ms;\n\t-moz-transition-duration: 100ms;\n\t-o-transition-duration: 100ms;\n\ttransition-duration: 100ms;\n\t-webkit-touch-callout: none;\n\t-webkit-user-select: none;\n\t-moz-user-select: none;\n\t-ms-user-select: none;\n\tuser-select: none;\n\tcursor: pointer;\n}\n.ui-flipswitch.ui-flipswitch-active {\n\tpadding-left: 4em;  /* Override this and width in previous rule if you use labels other than \"on/off\" and need more space */\n\twidth: 1.875em;\n}\n.ui-flipswitch-input {\n\tposition: absolute;\n\theight: 1px;\n\twidth: 1px;\n\tmargin: -1px;\n\toverflow: hidden;\n\tclip: rect(1px,1px,1px,1px);\n\tborder: 0;\n\toutline: 0;\n\tfilter: Alpha(Opacity=0);\n\topacity: 0;\n}\n.ui-flipswitch .ui-btn.ui-flipswitch-on,\n.ui-flipswitch .ui-flipswitch-off {\n\tfloat: left;\n\theight: 1.75em;\n\tmargin: .0625em;\n\tline-height: 1.65em;\n}\n.ui-flipswitch .ui-btn.ui-flipswitch-on {\n\twidth: 1.75em;\n\tpadding: 0;\n\ttext-indent: -2.6em; /* Override this to center text if you use a label other than \"on\" */\n\ttext-align: left;\n\tborder-width: 1px;\n\tborder-style: solid;\n\t-webkit-box-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\tbox-sizing: border-box;\n\tborder-radius: inherit;\n\toverflow: visible;\n\tcolor: inherit;\n\ttext-shadow: inherit;\n}\n.ui-flipswitch .ui-flipswitch-off {\n\tpadding: 1px;\n\ttext-indent: 1em; /* Override this to center text if you use a label other than \"off\" */\n}\n/* Override field container CSS to prevent the flipswitch from becomming full width */\nhtml .ui-field-contain > label + .ui-flipswitch,\nhtml .ui-popup .ui-field-contain > label + .ui-flipswitch {\n\tdisplay: inline-block;\n\twidth: 5.875em; /* If you override the width for .ui-flipswitch you should repeat the same value here */\n\t-webkit-box-sizing: content-box;\n\t-moz-box-sizing: content-box;\n\tbox-sizing: content-box;\n}\n.ui-field-contain .ui-flipswitch.ui-flipswitch-active,\n.ui-popup .ui-field-contain .ui-flipswitch.ui-flipswitch-active {\n\twidth: 1.875em;\n}\n.ui-table {\n\tborder: 0;\n\tborder-collapse: collapse;\n\tpadding: 0;\n\twidth: 100%;\n}\n.ui-table th,\n.ui-table td {\n\tline-height: 1.5em;\n\ttext-align: left;\n\tpadding: .4em .5em;\n\tvertical-align:top;\n}\n.ui-table th .ui-btn,\n.ui-table td .ui-btn {\n\tline-height: normal;\n}\n.ui-table th {\n\tfont-weight: bold;\n}\n.ui-table caption {\n\ttext-align: left;\n\tmargin-bottom: 1.4em;\n\topacity: .5;\n}\n/*\n Styles for the table columntoggle mode\n*/\n.ui-table-columntoggle-btn {\n\tfloat: right;\n\tmargin-bottom: .8em;\n}\n/* Remove top/bottom margins around the fieldcontain on check list */\n.ui-table-columntoggle-popup fieldset {\n\tmargin:0;\n}\n.ui-table-columntoggle {\n\tclear: both;\n}\n/* Hide all prioritized columns by default */\n@media only all {\n\tth.ui-table-priority-6,\n\ttd.ui-table-priority-6,\n\tth.ui-table-priority-5,\n\ttd.ui-table-priority-5,\n\tth.ui-table-priority-4,\n\ttd.ui-table-priority-4,\n\tth.ui-table-priority-3,\n\ttd.ui-table-priority-3,\n\tth.ui-table-priority-2,\n\ttd.ui-table-priority-2,\n\tth.ui-table-priority-1,\n\ttd.ui-table-priority-1 {\n\t\tdisplay: none;\n\t}\n}\n/* Preset breakpoints if \".ui-responsive\" class added to table */\n/* Show priority 1 at 320px (20em x 16px) */\n@media screen and (min-width: 20em) {\n\t.ui-table-columntoggle.ui-responsive th.ui-table-priority-1,\n\t.ui-table-columntoggle.ui-responsive td.ui-table-priority-1 {\n\t\tdisplay: table-cell;\n\t}\n}\n/* Show priority 2 at 480px (30em x 16px) */\n@media screen and (min-width: 30em) {\n\t.ui-table-columntoggle.ui-responsive th.ui-table-priority-2,\n\t.ui-table-columntoggle.ui-responsive td.ui-table-priority-2 {\n\t\tdisplay: table-cell;\n\t}\n}\n/* Show priority 3 at 640px (40em x 16px) */\n@media screen and (min-width: 40em) {\n\t.ui-table-columntoggle.ui-responsive th.ui-table-priority-3,\n\t.ui-table-columntoggle.ui-responsive td.ui-table-priority-3 {\n\t\tdisplay: table-cell;\n\t}\n}\n/* Show priority 4 at 800px (50em x 16px) */\n@media screen and (min-width: 50em) {\n\t.ui-table-columntoggle.ui-responsive th.ui-table-priority-4,\n\t.ui-table-columntoggle.ui-responsive td.ui-table-priority-4 {\n\t\tdisplay: table-cell;\n\t}\n}\n/* Show priority 5 at 960px (60em x 16px) */\n@media screen and (min-width: 60em) {\n\t.ui-table-columntoggle.ui-responsive th.ui-table-priority-5,\n\t.ui-table-columntoggle.ui-responsive td.ui-table-priority-5 {\n\t\tdisplay: table-cell;\n\t}\n}\n/* Show priority 6 at 1,120px (70em x 16px) */\n@media screen and (min-width: 70em) {\n\t.ui-table-columntoggle.ui-responsive th.ui-table-priority-6,\n\t.ui-table-columntoggle.ui-responsive td.ui-table-priority-6 {\n\t\tdisplay: table-cell;\n\t}\n}\n/* Unchecked manually: Always hide */\n.ui-table-columntoggle th.ui-table-cell-hidden,\n.ui-table-columntoggle td.ui-table-cell-hidden,\n.ui-table-columntoggle.ui-responsive th.ui-table-cell-hidden,\n.ui-table-columntoggle.ui-responsive td.ui-table-cell-hidden {\n\tdisplay: none;\n}\n/* Checked manually: Always show */\n.ui-table-columntoggle th.ui-table-cell-visible,\n.ui-table-columntoggle td.ui-table-cell-visible,\n.ui-table-columntoggle.ui-responsive th.ui-table-cell-visible,\n.ui-table-columntoggle.ui-responsive td.ui-table-cell-visible {\n\tdisplay: table-cell;\n}\n/*\n Styles for the table columntoggle mode\n*/\n.ui-table-reflow td .ui-table-cell-label,\n.ui-table-reflow th .ui-table-cell-label { \n\tdisplay: none;\n}\n/* Mobile first styles: Begin with the stacked presentation at narrow widths */ \n@media only all {\n\t/* Hide the table headers */ \n\t.ui-table-reflow thead td, \n\t.ui-table-reflow thead th {\n\t\tdisplay: none;\n\t}\n\t/* Show the table cells as a block level element */ \n\t.ui-table-reflow td,\n\t.ui-table-reflow th { \n\t\ttext-align: left;\n\t\tdisplay: block;\n\t}\n\t/* Add a fair amount of top margin to visually separate each row when stacked */  \n\t.ui-table-reflow tbody th {\n\t\tmargin-top: 3em;\n\t}\n\t/* Make the label elements a percentage width */ \n\t.ui-table-reflow td .ui-table-cell-label,\n\t.ui-table-reflow th .ui-table-cell-label { \n\t\tpadding: .4em; \n\t\tmin-width: 30%; \n\t\tdisplay: inline-block;\n\t\tmargin: -.4em 1em -.4em -.4em;\n\t}\n\t/* For grouped headers, have a different style to visually separate the levels by classing the first label in each col group */ \n\t.ui-table-reflow th .ui-table-cell-label-top,\n\t.ui-table-reflow td .ui-table-cell-label-top {\n\t\tdisplay: block;\n\t\tpadding: .4em 0;\n\t\tmargin: .4em 0;\n\t\ttext-transform: uppercase;\n\t\tfont-size: .9em;\n\t\tfont-weight: normal;\n\t}\n}\n/* Breakpoint to show as a standard table at 560px (35em x 16px) or wider */ \n@media ( min-width: 35em ) {\n\t/* Show the table header rows */ \n\t.ui-table-reflow.ui-responsive td,\n\t.ui-table-reflow.ui-responsive th,\n\t.ui-table-reflow.ui-responsive tbody th,\n\t.ui-table-reflow.ui-responsive tbody td,\n\t.ui-table-reflow.ui-responsive thead td,\n\t.ui-table-reflow.ui-responsive thead th {\n\t\tdisplay: table-cell;\n\t\tmargin: 0;\n\t}\n\t/* Hide the labels in each cell */ \n\t.ui-table-reflow.ui-responsive td .ui-table-cell-label,\n\t.ui-table-reflow.ui-responsive th .ui-table-cell-label { \n\t\tdisplay: none;\n\t}\n}\n/* Hack to make IE9 and WP7.5 treat cells like block level elements, scoped to ui-responsive class */ \n/* Applied in a max-width media query up to the table layout breakpoint so we don't need to negate this*/ \n@media ( max-width: 35em ) {\n\t.ui-table-reflow.ui-responsive td,\n\t.ui-table-reflow.ui-responsive th {\n\t\twidth: 100%;\n\t\t-webkit-box-sizing: border-box;\n\t\t-moz-box-sizing: border-box;\n\t\tbox-sizing: border-box;\n\t\tfloat: left;\n\t\tclear: left;\n\t}\n}\n/* Panel */\n.ui-panel {\n\twidth: 17em;\n\tmin-height: 100%;\n\tmax-height: none;\n\tborder-width: 0;\n\tposition: absolute;\n\ttop: 0;\n\tdisplay: block;\n}\n.ui-panel-closed {\n\twidth: 0;\n\tmax-height: 100%;\n\toverflow: hidden;\n\tvisibility: hidden;\n\tleft: 0;\n\tclip: rect(1px,1px,1px,1px);\n}\n.ui-panel-fixed {\n\tposition: fixed;\n\tbottom: -1px; /* Fixes gap on Chrome for Android */\n\tpadding-bottom: 1px;\n}\n.ui-panel-display-reveal {\n\tz-index: 1;\n}\n.ui-panel-display-push {\n\tz-index: 999;\n}\n.ui-panel-display-overlay {\n\tz-index: 1001; /* Fixed toolbars have z-index 1000 */\n}\n.ui-panel-inner {\n\tpadding: 1em;\n}\n/* Container, page and wrapper */\n.ui-panel-page-container {\n\toverflow-x: visible;\n}\n.ui-panel-page-container-themed .ui-page-active {\n\tbackground: none;\n}\n.ui-panel-wrapper {\n\tposition: relative;\n\tmin-height: inherit;\n\tborder: 0;\n\toverflow-x: hidden;\n\tz-index: 999;\n}\n/* Fixed toolbars */\n.ui-panel-fixed-toolbar {\n\toverflow-x: hidden;\n}\n/* Dismiss */\n.ui-panel-dismiss {\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n\tright: 0;\n\theight: 100%;\n\tz-index: 1002;\n\tdisplay: none;\n}\n.ui-panel-dismiss-open {\n\tdisplay: block;\n}\n/* Animate class is added to panel, wrapper and fixed toolbars */\n.ui-panel-animate {\n\t-webkit-transition: -webkit-transform 300ms ease;\n\t-webkit-transition-duration: 300ms;\n\t-moz-transition: -moz-transform 300ms ease;\n\ttransition: transform 300ms ease;\n}\n/* Fix for Windows Phone issue #6349: unset the transition for transforms in case of fixed toolbars. */\n@media screen and ( max-device-width: 768px ) {\n\t.ui-page-header-fixed .ui-panel-animate.ui-panel-wrapper,\n\t.ui-page-footer-fixed .ui-panel-animate.ui-panel-wrapper,\n\t.ui-panel-animate.ui-panel-fixed-toolbar {\n\t\t-ms-transition: none;\n\t}\n\t/* We need a transitionend event ... */\n\t.ui-panel-animate.ui-panel-fixed-toolbar {\n\t\t-ms-transition: -ms-transform 1ms;\n\t\t-ms-transform: rotate(0deg);\n\t}\n}\n/* Hardware acceleration for smoother transitions on WebKit browsers */\n.ui-panel-animate.ui-panel:not(.ui-panel-display-reveal) {\n\t-webkit-backface-visibility: hidden;\n\t-webkit-transform: translate3d(0,0,0);\n}\n/* Panel positioning (for overlay and push) */\n/* Panel left closed */\n.ui-panel-position-left {\n\tleft: -17em;\n}\n/* Panel left closed animated */\n.ui-panel-animate.ui-panel-position-left.ui-panel-display-overlay,\n.ui-panel-animate.ui-panel-position-left.ui-panel-display-push {\n\tleft: 0;\n\t-webkit-transform: translate3d(-17em,0,0);\n\t-moz-transform: translate3d(-17em,0,0);\n\ttransform: translate3d(-17em,0,0);\n}\n/* Panel left open */\n.ui-panel-position-left.ui-panel-display-reveal, /* Unset \"panel left closed\" for reveal */\n.ui-panel-open.ui-panel-position-left {\n\tleft: 0;\n}\n/* Panel left open animated */\n.ui-panel-animate.ui-panel-open.ui-panel-position-left.ui-panel-display-overlay,\n.ui-panel-animate.ui-panel-open.ui-panel-position-left.ui-panel-display-push {\n\t-webkit-transform: translate3d(0,0,0);\n\ttransform: translate3d(0,0,0);\n\t-moz-transform: none;\n}\n/* Panel right closed */\n.ui-panel-position-right {\n\tright: -17em;\n}\n/* Panel right closed animated */\n.ui-panel-animate.ui-panel-position-right.ui-panel-display-overlay,\n.ui-panel-animate.ui-panel-position-right.ui-panel-display-push {\n\tright: 0;\n\t-webkit-transform: translate3d(17em,0,0);\n\t-moz-transform: translate3d(17em,0,0);\n\ttransform: translate3d(17em,0,0);\n}\n/* Panel right open */\n.ui-panel-position-right.ui-panel-display-reveal, /* Unset \"panel right closed\" for reveal */\n.ui-panel-position-right.ui-panel-open {\n\tright: 0;\n}\n/* Panel right open animated */\n.ui-panel-animate.ui-panel-open.ui-panel-position-right.ui-panel-display-overlay,\n.ui-panel-animate.ui-panel-open.ui-panel-position-right.ui-panel-display-push {\n\t-webkit-transform: translate3d(0,0,0);\n\ttransform: translate3d(0,0,0);\n\t-moz-transform: none;\n}\n/* Wrapper and fixed toolbars positioning (for reveal and push) */\n/* Panel left open */\n.ui-panel-page-content-position-left {\n\tleft: 17em;\n\tright: -17em;\n}\n/* Panel left open animated */\n.ui-panel-animate.ui-panel-page-content-position-left {\n\tleft: 0;\n\tright: 0;\n\t-webkit-transform: translate3d(17em,0,0);\n\t-moz-transform: translate3d(17em,0,0);\n\ttransform: translate3d(17em,0,0);\n}\n/* Panel right open */\n.ui-panel-page-content-position-right {\n\tleft: -17em;\n\tright: 17em;\n}\n/* Panel right open animated */\n.ui-panel-animate.ui-panel-page-content-position-right {\n\tleft: 0;\n\tright: 0;\n\t-webkit-transform: translate3d(-17em,0,0);\n\t-moz-transform: translate3d(-17em,0,0);\n\ttransform: translate3d(-17em,0,0);\n}\n/* Dismiss model open */\n.ui-panel-dismiss-open.ui-panel-dismiss-position-left {\n\tleft: 17em;\n}\n.ui-panel-dismiss-open.ui-panel-dismiss-position-right {\n\tright: 17em;\n}\n/* Shadows and borders */\n.ui-panel-display-reveal {\n\t-webkit-box-shadow: inset -5px 0 5px rgba(0,0,0,.15);\n\t-moz-box-shadow: inset -5px 0 5px rgba(0,0,0,.15);\n\tbox-shadow: inset -5px 0 5px rgba(0,0,0,.15);\n}\n.ui-panel-position-right.ui-panel-display-reveal {\n\t-webkit-box-shadow: inset 5px 0 5px rgba(0,0,0,.15);\n\t-moz-box-shadow: inset 5px 0 5px rgba(0,0,0,.15);\n\tbox-shadow: inset 5px 0 5px rgba(0,0,0,.15);\n}\n.ui-panel-display-overlay {\n\t-webkit-box-shadow: 5px 0 5px rgba(0,0,0,.15);\n\t-moz-box-shadow: 5px 0 5px rgba(0,0,0,.15);\n\tbox-shadow: 5px 0 5px rgba(0,0,0,.15);\n}\n.ui-panel-position-right.ui-panel-display-overlay {\n\t-webkit-box-shadow: -5px 0 5px rgba(0,0,0,.15);\n\t-moz-box-shadow: -5px 0 5px rgba(0,0,0,.15);\n\tbox-shadow: -5px 0 5px rgba(0,0,0,.15);\n}\n.ui-panel-open.ui-panel-position-left.ui-panel-display-push {\n\tborder-right-width: 1px;\n\tmargin-right: -1px;\n}\n.ui-panel-page-content-position-left.ui-panel-page-content-display-push {\n\tmargin-left: 1px;\n\twidth: auto;\n}\n.ui-panel-open.ui-panel-position-right.ui-panel-display-push {\n\tborder-left-width: 1px;\n\tmargin-left: -1px;\n}\n.ui-panel-page-content-position-right.ui-panel-page-content-display-push {\n\tmargin-right: 1px;\n\twidth: auto;\n}\n/* Responsive: wrap on wide viewports once open */\n@media (min-width:55em) {\n\t.ui-responsive-panel .ui-panel-page-content-open.ui-panel-page-content-position-left {\n\t\tmargin-right: 17em;\n\t}\n\t.ui-responsive-panel .ui-panel-page-content-open.ui-panel-page-content-position-right {\n\t\tmargin-left: 17em;\n\t}\n\t.ui-responsive-panel .ui-panel-page-content-open {\n\t\twidth: auto;\t\n\t}\n\t.ui-responsive-panel .ui-panel-dismiss-display-push,\n\t.ui-responsive-panel.ui-page-active ~ .ui-panel-dismiss-display-push {\n\t\tdisplay: none;\n\t}\n}\n.ui-tabs {\n\tposition: relative;/* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as \"fixed\") */\n\tpadding: .2em;\n}\n"
  },
  {
    "path": "stenogotchi/ui/web/static/js/jquery.mobile/jquery.mobile.structure-1.4.5.css",
    "content": "/*!\n* jQuery Mobile 1.4.5\n* Git HEAD hash: 68e55e78b292634d3991c795f06f5e37a512decc <> Date: Fri Oct 31 2014 17:33:30 UTC\n* http://jquerymobile.com\n*\n* Copyright 2010, 2014 jQuery Foundation, Inc. and othercontributors\n* Released under the MIT license.\n* http://jquery.org/license\n*\n*/\n\n\n/* Some unsets */\n.ui-mobile,\n.ui-mobile body {\n\theight: 99.9%;\n}\n.ui-mobile fieldset,\n.ui-page {\n\tpadding: 0;\n\tmargin: 0;\n}\n.ui-mobile a img,\n.ui-mobile fieldset {\n\tborder-width: 0;\n}\n/* Fixes for fieldset issues on IE10 and FF (see #6077) */\n.ui-mobile fieldset {\n\tmin-width: 0;\n}\n@-moz-document url-prefix() {\n\t.ui-mobile fieldset {\n\t\tdisplay: table-column;\n\t\tvertical-align: middle;\n\t}\n}\n/* Viewport */\n.ui-mobile-viewport {\n\tmargin: 0;\n\toverflow-x: visible;\n\t-webkit-text-size-adjust: 100%;\n\t-ms-text-size-adjust:none;\n\t-webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\n/* Issue #2066 */\nbody.ui-mobile-viewport,\ndiv.ui-mobile-viewport {\n\toverflow-x: hidden;\n}\n/* \"page\" containers - full-screen views, one should always be in view post-pageload */\n.ui-mobile [data-role=page],\n.ui-mobile [data-role=dialog],\n.ui-page {\n\ttop: 0;\n\tleft: 0;\n\twidth: 100%;\n\tmin-height: 100%;\n\tposition: absolute;\n\tdisplay: none;\n\tborder: 0;\n}\n/* On ios4, setting focus on the page element causes flashing during transitions when there is an outline, so we turn off outlines */\n.ui-page {\n\toutline: none;\n}\n.ui-mobile .ui-page-active {\n\tdisplay: block;\n\toverflow: visible;\n\toverflow-x: hidden;\n}\n@media screen and (orientation: portrait) {\n\t.ui-mobile .ui-page {\n\t\tmin-height: 420px;\n\t}\n}\n@media screen and (orientation: landscape) {\n\t.ui-mobile .ui-page {\n\t\tmin-height: 300px;\n\t}\n}\n/* Fouc */\n.ui-mobile-rendering > * {\n\tvisibility: hidden;\n}\n/* Non-js content hiding */\n.ui-nojs {\n\tposition: absolute !important;\n\theight: 1px;\n\twidth: 1px;\n\toverflow: hidden;\n\tclip: rect(1px,1px,1px,1px);\n}\n/* Loading screen */\n.ui-loading .ui-loader {\n\tdisplay: block;\n}\n.ui-loader {\n\tdisplay: none;\n\tz-index: 9999999;\n\tposition: fixed;\n\ttop: 50%;\n\tleft: 50%;\n\tborder:0;\n}\n.ui-loader-default {\n\tbackground: none;\n\tfilter: Alpha(Opacity=18);\n\topacity: .18;\n\twidth: 2.875em;\n\theight: 2.875em;\n\tmargin-left: -1.4375em;\n\tmargin-top: -1.4375em;\n}\n.ui-loader-verbose {\n\twidth: 12.5em;\n\tfilter: Alpha(Opacity=88);\n\topacity: .88;\n\tbox-shadow: 0 1px 1px -1px #fff;\n\theight: auto;\n\tmargin-left: -6.875em;\n\tmargin-top: -2.6875em;\n\tpadding: .625em;\n}\n.ui-loader-default h1 {\n\tfont-size: 0;\n\twidth: 0;\n\theight: 0;\n\toverflow: hidden;\n}\n.ui-loader-verbose h1 {\n\tfont-size: 1em;\n\tmargin: 0;\n\ttext-align: center;\n}\n.ui-loader .ui-icon-loading {\n\tbackground-color: #000;\n\tdisplay: block;\n\tmargin: 0;\n\twidth: 2.75em;\n\theight: 2.75em;\n\tpadding: .0625em;\n\t-webkit-border-radius: 2.25em;\n\tborder-radius: 2.25em;\n}\n.ui-loader-verbose .ui-icon-loading {\n\tmargin: 0 auto .625em;\n\tfilter: Alpha(Opacity=75);\n\topacity: .75;\n}\n.ui-loader-textonly {\n\tpadding: .9375em;\n\tmargin-left: -7.1875em;\n}\n.ui-loader-textonly .ui-icon-loading {\n\tdisplay: none;\n}\n.ui-loader-fakefix {\n\tposition: absolute;\n}\n/* Headers, content panels */\n.ui-bar,\n.ui-body {\n\tposition: relative;\n\tpadding: .4em 1em;\n\toverflow: hidden;\n\tdisplay: block;\n\tclear: both;\n}\n.ui-bar h1,\n.ui-bar h2,\n.ui-bar h3,\n.ui-bar h4,\n.ui-bar h5,\n.ui-bar h6 {\n\tmargin: 0;\n\tpadding: 0;\n\tfont-size: 1em;\n\tdisplay: inline-block;\n}\n.ui-header,\n.ui-footer {\n\tborder-width: 1px 0;\n\tborder-style: solid;\n\tposition: relative;\n}\n.ui-header:empty,\n.ui-footer:empty {\n\tmin-height: 2.6875em;\n}\n.ui-header .ui-title,\n.ui-footer .ui-title {\n\tfont-size: 1em;\n\tmin-height: 1.1em;\n\ttext-align: center;\n\tdisplay: block;\n\tmargin: 0 30%;\n\tpadding: .7em 0;\n\ttext-overflow: ellipsis;\n\toverflow: hidden;\n\twhite-space: nowrap;\n\toutline: 0 !important;\n}\n.ui-footer .ui-title {\n\tmargin: 0 1em;\n}\n.ui-content {\n\tborder-width: 0;\n\toverflow: visible;\n\toverflow-x: hidden;\n\tpadding: 1em;\n}\n/* Corner styling for dialogs and popups */\n.ui-corner-all > .ui-header:first-child,\n.ui-corner-all > .ui-content:first-child,\n.ui-corner-all > .ui-footer:first-child {\n\t-webkit-border-top-left-radius: inherit;\n\tborder-top-left-radius: inherit;\n\t-webkit-border-top-right-radius: inherit;\n\tborder-top-right-radius: inherit;\n}\n.ui-corner-all > .ui-header:last-child,\n.ui-corner-all > .ui-content:last-child,\n.ui-corner-all > .ui-footer:last-child {\n\t-webkit-border-bottom-left-radius: inherit;\n\tborder-bottom-left-radius: inherit;\n\t-webkit-border-bottom-right-radius: inherit;\n\tborder-bottom-right-radius: inherit;\n}\n/* Buttons and icons */\n.ui-btn {\n\tfont-size: 16px;\n\tmargin: .5em 0;\n\tpadding: .7em 1em;\n\tdisplay: block;\n\tposition: relative;\n\ttext-align: center;\n\ttext-overflow: ellipsis;\n\toverflow: hidden;\n\twhite-space: nowrap;\n\tcursor: pointer;\n\t-webkit-user-select: none;\n\t-moz-user-select: none;\n\t-ms-user-select: none;\n\tuser-select: none;\n}\n.ui-btn-icon-notext,\n.ui-header button.ui-btn.ui-btn-icon-notext,\n.ui-footer button.ui-btn.ui-btn-icon-notext {\n\tpadding: 0;\n\twidth: 1.75em;\n\theight: 1.75em;\n\ttext-indent: -9999px;\n\twhite-space: nowrap !important;\n}\n.ui-mini {\n\tfont-size: 12.5px;\n}\n.ui-mini .ui-btn {\n\tfont-size: inherit;\n}\n/* Make buttons in toolbars default to mini and inline. */\n.ui-header .ui-btn,\n.ui-footer .ui-btn {\n\tfont-size: 12.5px;\n\tdisplay: inline-block;\n\tvertical-align: middle;\n}\n.ui-header .ui-controlgroup .ui-btn-icon-notext,\n.ui-footer .ui-controlgroup .ui-btn-icon-notext {\n    font-size: 12.5px;\n}\n/* To ensure same top and left/right position when ui-btn-left/right are added to something other than buttons. */\n.ui-header .ui-btn-left,\n.ui-header .ui-btn-right {\n\tfont-size: 12.5px;\n}\n.ui-mini.ui-btn-icon-notext,\n.ui-mini .ui-btn-icon-notext,\n.ui-header .ui-btn-icon-notext,\n.ui-footer .ui-btn-icon-notext {\n\tfont-size: 16px;\t\n\tpadding: 0;\n}\n.ui-btn-inline {\n\tdisplay: inline-block;\n\tvertical-align: middle;\n\tmargin-right: .625em;\n}\n.ui-btn-icon-left {\n\tpadding-left: 2.5em;\n}\n.ui-btn-icon-right {\n\tpadding-right: 2.5em;\n}\n.ui-btn-icon-top {\n\tpadding-top: 2.5em;\n}\n.ui-btn-icon-bottom {\n\tpadding-bottom: 2.5em;\n}\n.ui-header .ui-btn-icon-top,\n.ui-footer .ui-btn-icon-top,\n.ui-header .ui-btn-icon-bottom,\n.ui-footer .ui-btn-icon-bottom {\n\tpadding-left: .3125em;\n\tpadding-right: .3125em;\n}\n.ui-btn-icon-left:after,\n.ui-btn-icon-right:after,\n.ui-btn-icon-top:after,\n.ui-btn-icon-bottom:after,\n.ui-btn-icon-notext:after {\n\tcontent: \"\";\n\tposition: absolute;\n\tdisplay: block;\n\twidth: 22px;\n\theight: 22px;\n}\n.ui-btn-icon-notext:after,\n.ui-btn-icon-left:after,\n.ui-btn-icon-right:after {\n\ttop: 50%;\n\tmargin-top: -11px;\n}\n.ui-btn-icon-left:after {\n\tleft: .5625em;\n}\n.ui-btn-icon-right:after {\n\tright: .5625em;\n}\n.ui-mini.ui-btn-icon-left:after,\n.ui-mini .ui-btn-icon-left:after,\n.ui-header .ui-btn-icon-left:after,\n.ui-footer .ui-btn-icon-left:after {\n\tleft: .37em;\n}\n.ui-mini.ui-btn-icon-right:after,\n.ui-mini .ui-btn-icon-right:after,\n.ui-header .ui-btn-icon-right:after,\n.ui-footer .ui-btn-icon-right:after {\n\tright: .37em;\n}\n.ui-btn-icon-notext:after,\n.ui-btn-icon-top:after,\n.ui-btn-icon-bottom:after {\n\tleft: 50%;\n\tmargin-left: -11px;\n}\n.ui-btn-icon-top:after {\n\ttop: .5625em;\n}\n.ui-btn-icon-bottom:after {\n\ttop: auto;\n\tbottom: .5625em;\n}\n/* Buttons in header position classes */\n.ui-header .ui-btn-left,\n.ui-header .ui-btn-right,\n.ui-btn-left > [class*=\"ui-\"],\n.ui-btn-right > [class*=\"ui-\"] {\n\tmargin: 0;\n}\n.ui-btn-left,\n.ui-btn-right {\n\tposition: absolute;\n\ttop: .24em;\n}\n.ui-btn-left {\n\tleft: .4em;\n}\n.ui-btn-right {\n\tright: .4em;\n}\n.ui-btn-icon-notext.ui-btn-left {\n\ttop: .3125em;\n\tleft: .3125em;\n}\n.ui-btn-icon-notext.ui-btn-right {\n\ttop: .3125em;\n\tright: .3125em;\n}\n/* Button elements */\nbutton.ui-btn,\n.ui-controlgroup-controls button.ui-btn-icon-notext {\n\t-webkit-box-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\tbox-sizing: border-box;\n\t-webkit-appearance: none;\n\t-moz-appearance: none;\n\twidth: 100%;\n}\nbutton.ui-btn-inline,\n.ui-header button.ui-btn,\n.ui-footer button.ui-btn {\n\twidth: auto;\n}\n/* Firefox adds a 1px border in a button element. We negate this to make sure they have the same height as other buttons in controlgroups. */\nbutton.ui-btn::-moz-focus-inner {\n\tborder: 0;\n}\nbutton.ui-btn-icon-notext,\n.ui-controlgroup-horizontal .ui-controlgroup-controls button.ui-btn {\n\t-webkit-box-sizing: content-box;\n\t-moz-box-sizing: content-box;\n\tbox-sizing: content-box;\n\twidth: 1.75em;\n}\n/* Form labels */\n.ui-mobile label,\n.ui-controlgroup-label {\n\tdisplay: block;\n\tmargin: 0 0 .4em;\n}\n/* Accessible content hiding */\n/* ui-hide-label deprecated in 1.4. TODO: Remove in 1.5 */\n.ui-hide-label > label,\n.ui-hide-label .ui-controlgroup-label,\n.ui-hide-label .ui-rangeslider label,\n.ui-hidden-accessible {\n\tposition: absolute !important;\n\theight: 1px;\n\twidth: 1px;\n\toverflow: hidden;\n\tclip: rect(1px,1px,1px,1px);\n}\n/* Used for hiding elements by the filterable widget. You can also use this class to hide list items or buttons in controlgroups; this ensures correct corner styling. */\n.ui-screen-hidden {\n\tdisplay: none !important;\n}\n/* Transitions originally inspired by those from jQtouch, nice work, folks */\n.ui-mobile-viewport-transitioning,\n.ui-mobile-viewport-transitioning .ui-page {\n\twidth: 100%;\n\theight: 100%;\n\toverflow: hidden;\n\t-webkit-box-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\tbox-sizing: border-box;\n}\n.ui-page-pre-in {\n\topacity: 0;\n}\n.in {\n\t-webkit-animation-timing-function: ease-out;\n\t-webkit-animation-duration: 350ms;\n\t-moz-animation-timing-function: ease-out;\n\t-moz-animation-duration: 350ms;\n\tanimation-timing-function: ease-out;\n\tanimation-duration: 350ms;\n}\n.out {\n\t-webkit-animation-timing-function: ease-in;\n\t-webkit-animation-duration: 225ms;\n\t-moz-animation-timing-function: ease-in;\n\t-moz-animation-duration: 225ms;\n\tanimation-timing-function: ease-in;\n\tanimation-duration: 225ms;\n}\n@-webkit-keyframes fadein {\n    from { opacity: 0; }\n    to { opacity: 1; }\n}\n@-moz-keyframes fadein {\n    from { opacity: 0; }\n    to { opacity: 1; }\n}\n@keyframes fadein {\n    from { opacity: 0; }\n    to { opacity: 1; }\n}\n@-webkit-keyframes fadeout {\n    from { opacity: 1; }\n    to { opacity: 0; }\n}\n@-moz-keyframes fadeout {\n    from { opacity: 1; }\n    to { opacity: 0; }\n}\n@keyframes fadeout {\n    from { opacity: 1; }\n    to { opacity: 0; }\n}\n.fade.out {\n\topacity: 0;\n\t-webkit-animation-duration: 125ms;\n\t-webkit-animation-name: fadeout;\n\t-moz-animation-duration: 125ms;\n\t-moz-animation-name: fadeout;\n\tanimation-duration: 125ms;\n\tanimation-name: fadeout;\n}\n.fade.in {\n\topacity: 1;\n\t-webkit-animation-duration: 225ms;\n\t-webkit-animation-name: fadein;\n\t-moz-animation-duration: 225ms;\n\t-moz-animation-name: fadein;\n\tanimation-duration: 225ms;\n\tanimation-name: fadein;\n}\n.pop {\n\t-webkit-transform-origin: 50% 50%;\n\t-moz-transform-origin: 50% 50%;\n\ttransform-origin: 50% 50%;\n}\n.pop.in {\n\t-webkit-transform: scale(1);\n\t-webkit-animation-name: popin;\n\t-webkit-animation-duration: 350ms;\n\t-moz-transform: scale(1);\n\t-moz-animation-name: popin;\n\t-moz-animation-duration: 350ms;\n\ttransform: scale(1);\n\tanimation-name: popin;\n\tanimation-duration: 350ms;\n    opacity: 1;\n}\n.pop.out {\n\t-webkit-animation-name: fadeout;\n\t-webkit-animation-duration: 100ms;\n\t-moz-animation-name: fadeout;\n\t-moz-animation-duration: 100ms;\n\tanimation-name: fadeout;\n\tanimation-duration: 100ms;\n\topacity: 0;\n}\n.pop.in.reverse {\n\t-webkit-animation-name: fadein;\n\t-moz-animation-name: fadein;\n\tanimation-name: fadein;\n}\n.pop.out.reverse {\n\t-webkit-transform: scale(.8);\n\t-webkit-animation-name: popout;\n\t-moz-transform: scale(.8);\n\t-moz-animation-name: popout;\n\ttransform: scale(.8);\n\tanimation-name: popout;\n}\n@-webkit-keyframes popin {\n    from {\n        -webkit-transform: scale(.8);\n        opacity: 0;\n    }\n    to {\n        -webkit-transform: scale(1);\n        opacity: 1;\n    }\n}\n@-moz-keyframes popin {\n    from {\n        -moz-transform: scale(.8);\n        opacity: 0;\n    }\n    to {\n        -moz-transform: scale(1);\n        opacity: 1;\n    }\n}\n@keyframes popin {\n    from {\n        transform: scale(.8);\n        opacity: 0;\n    }\n    to {\n        transform: scale(1);\n        opacity: 1;\n    }\n}\n@-webkit-keyframes popout {\n    from {\n        -webkit-transform: scale(1);\n        opacity: 1;\n    }\n    to {\n        -webkit-transform: scale(.8);\n        opacity: 0;\n    }\n}\n@-moz-keyframes popout {\n    from {\n        -moz-transform: scale(1);\n        opacity: 1;\n    }\n    to {\n        -moz-transform: scale(.8);\n        opacity: 0;\n    }\n}\n@keyframes popout {\n    from {\n        transform: scale(1);\n        opacity: 1;\n    }\n    to {\n        transform: scale(.8);\n        opacity: 0;\n    }\n}\n/* keyframes for slidein from sides */\n@-webkit-keyframes slideinfromright {\n    from { -webkit-transform: translate3d(100%,0,0); }\n    to { -webkit-transform: translate3d(0,0,0); }\n}\n@-moz-keyframes slideinfromright {\n    from { -moz-transform: translateX(100%); }\n    to { -moz-transform: translateX(0); }\n}\n@keyframes slideinfromright {\n    from { transform: translateX(100%); }\n    to { transform: translateX(0); }\n}\n@-webkit-keyframes slideinfromleft {\n    from { -webkit-transform: translate3d(-100%,0,0); }\n    to { -webkit-transform: translate3d(0,0,0); }\n}\n@-moz-keyframes slideinfromleft {\n    from { -moz-transform: translateX(-100%); }\n    to { -moz-transform: translateX(0); }\n}\n@keyframes slideinfromleft {\n    from { transform: translateX(-100%); }\n    to { transform: translateX(0); }\n}\n/* keyframes for slideout to sides */\n@-webkit-keyframes slideouttoleft {\n    from { -webkit-transform: translate3d(0,0,0); }\n    to { -webkit-transform: translate3d(-100%,0,0); }\n}\n@-moz-keyframes slideouttoleft {\n    from { -moz-transform: translateX(0); }\n    to { -moz-transform: translateX(-100%); }\n}\n@keyframes slideouttoleft {\n    from { transform: translateX(0); }\n    to { transform: translateX(-100%); }\n}\n@-webkit-keyframes slideouttoright {\n    from { -webkit-transform: translate3d(0,0,0); }\n    to { -webkit-transform: translate3d(100%,0,0); }\n}\n@-moz-keyframes slideouttoright {\n    from { -moz-transform: translateX(0); }\n    to { -moz-transform: translateX(100%); }\n}\n@keyframes slideouttoright {\n    from { transform: translateX(0); }\n    to { transform: translateX(100%); }\n}\n.slide.out, .slide.in {\n\t-webkit-animation-timing-function: ease-out;\n\t-webkit-animation-duration: 350ms;\n\t-moz-animation-timing-function: ease-out;\n\t-moz-animation-duration: 350ms;\n\tanimation-timing-function: ease-out;\n\tanimation-duration: 350ms;\n}\n.slide.out {\n\t-webkit-transform: translate3d(-100%,0,0);\n\t-webkit-animation-name: slideouttoleft;\n\t-moz-transform: translateX(-100%);\n\t-moz-animation-name: slideouttoleft;\n\ttransform: translateX(-100%);\n\tanimation-name: slideouttoleft;\n}\n.slide.in {\n\t-webkit-transform: translate3d(0,0,0);\n\t-webkit-animation-name: slideinfromright;\n\t-moz-transform: translateX(0);\n\t-moz-animation-name: slideinfromright;\n\ttransform: translateX(0);\n\tanimation-name: slideinfromright;\n}\n.slide.out.reverse {\n\t-webkit-transform: translate3d(100%,0,0);\n\t-webkit-animation-name: slideouttoright;\n\t-moz-transform: translateX(100%);\n\t-moz-animation-name: slideouttoright;\n\ttransform: translateX(100%);\n\tanimation-name: slideouttoright;\n}\n.slide.in.reverse {\n\t-webkit-transform: translate3d(0,0,0);\n\t-webkit-animation-name: slideinfromleft;\n\t-moz-transform: translateX(0);\n\t-moz-animation-name: slideinfromleft;\n\ttransform: translateX(0);\n\tanimation-name: slideinfromleft;\n}\n.slidefade.out {\n\t-webkit-transform: translateX(-100%);\n\t-webkit-animation-name: slideouttoleft;\n\t-webkit-animation-duration: 225ms;\n\t-moz-transform: translateX(-100%);\n\t-moz-animation-name: slideouttoleft;\n\t-moz-animation-duration: 225ms;\n\ttransform: translateX(-100%);\n\tanimation-name: slideouttoleft;\n\tanimation-duration: 225ms;\n}\n.slidefade.in {\n\t-webkit-transform: translateX(0);\n\t-webkit-animation-name: fadein;\n\t-webkit-animation-duration: 200ms;\n\t-moz-transform: translateX(0);\n\t-moz-animation-name: fadein;\n\t-moz-animation-duration: 200ms;\n\ttransform: translateX(0);\n\tanimation-name: fadein;\n\tanimation-duration: 200ms;\n}\n.slidefade.out.reverse {\n\t-webkit-transform: translateX(100%);\n\t-webkit-animation-name: slideouttoright;\n\t-webkit-animation-duration: 200ms;\n\t-moz-transform: translateX(100%);\n\t-moz-animation-name: slideouttoright;\n\t-moz-animation-duration: 200ms;\n\ttransform: translateX(100%);\n\tanimation-name: slideouttoright;\n\tanimation-duration: 200ms;\n}\n.slidefade.in.reverse {\n\t-webkit-transform: translateX(0);\n\t-webkit-animation-name: fadein;\n\t-webkit-animation-duration: 200ms;\n\t-moz-transform: translateX(0);\n\t-moz-animation-name: fadein;\n\t-moz-animation-duration: 200ms;\n\ttransform: translateX(0);\n\tanimation-name: fadein;\n\tanimation-duration: 200ms;\n}\n/* slide down */\n.slidedown.out {\n\t-webkit-animation-name: fadeout;\n\t-webkit-animation-duration: 100ms;\n\t-moz-animation-name: fadeout;\n\t-moz-animation-duration: 100ms;\n\tanimation-name: fadeout;\n\tanimation-duration: 100ms;\n}\n.slidedown.in {\n\t-webkit-transform: translateY(0);\n\t-webkit-animation-name: slideinfromtop;\n\t-webkit-animation-duration: 250ms;\n\t-moz-transform: translateY(0);\n\t-moz-animation-name: slideinfromtop;\n\t-moz-animation-duration: 250ms;\n\ttransform: translateY(0);\n\tanimation-name: slideinfromtop;\n\tanimation-duration: 250ms;\n}\n.slidedown.in.reverse {\n\t-webkit-animation-name: fadein;\n\t-webkit-animation-duration: 150ms;\n\t-moz-animation-name: fadein;\n\t-moz-animation-duration: 150ms;\n\tanimation-name: fadein;\n\tanimation-duration: 150ms;\n}\n.slidedown.out.reverse {\n\t-webkit-transform: translateY(-100%);\n\t-webkit-animation-name: slideouttotop;\n\t-webkit-animation-duration: 200ms;\n\t-moz-transform: translateY(-100%);\n\t-moz-animation-name: slideouttotop;\n\t-moz-animation-duration: 200ms;\n\ttransform: translateY(-100%);\n\tanimation-name: slideouttotop;\n\tanimation-duration: 200ms;\n}\n@-webkit-keyframes slideinfromtop {\n    from { -webkit-transform: translateY(-100%); }\n    to { -webkit-transform: translateY(0); }\n}\n@-moz-keyframes slideinfromtop {\n    from { -moz-transform: translateY(-100%); }\n    to { -moz-transform: translateY(0); }\n}\n@keyframes slideinfromtop {\n    from { transform: translateY(-100%); }\n    to { transform: translateY(0); }\n}\n@-webkit-keyframes slideouttotop {\n    from { -webkit-transform: translateY(0); }\n    to { -webkit-transform: translateY(-100%); }\n}\n@-moz-keyframes slideouttotop {\n    from { -moz-transform: translateY(0); }\n    to { -moz-transform: translateY(-100%); }\n}\n@keyframes slideouttotop {\n    from { transform: translateY(0); }\n    to { transform: translateY(-100%); }\n}\n/* slide up */\n.slideup.out {\n\t-webkit-animation-name: fadeout;\n\t-webkit-animation-duration: 100ms;\n\t-moz-animation-name: fadeout;\n\t-moz-animation-duration: 100ms;\n\tanimation-name: fadeout;\n\tanimation-duration: 100ms;\n}\n.slideup.in {\n\t-webkit-transform: translateY(0);\n\t-webkit-animation-name: slideinfrombottom;\n\t-webkit-animation-duration: 250ms;\n\t-moz-transform: translateY(0);\n\t-moz-animation-name: slideinfrombottom;\n\t-moz-animation-duration: 250ms;\n\ttransform: translateY(0);\n\tanimation-name: slideinfrombottom;\n\tanimation-duration: 250ms;\n}\n.slideup.in.reverse {\n\t-webkit-animation-name: fadein;\n\t-webkit-animation-duration: 150ms;\n\t-moz-animation-name: fadein;\n\t-moz-animation-duration: 150ms;\n\tanimation-name: fadein;\n\tanimation-duration: 150ms;\n}\n.slideup.out.reverse {\n\t-webkit-transform: translateY(100%);\n\t-webkit-animation-name: slideouttobottom;\n\t-webkit-animation-duration: 200ms;\n\t-moz-transform: translateY(100%);\n\t-moz-animation-name: slideouttobottom;\n\t-moz-animation-duration: 200ms;\n\ttransform: translateY(100%);\n\tanimation-name: slideouttobottom;\n\tanimation-duration: 200ms;\n}\n@-webkit-keyframes slideinfrombottom {\n    from { -webkit-transform: translateY(100%); }\n    to { -webkit-transform: translateY(0); }\n}\n@-moz-keyframes slideinfrombottom {\n    from { -moz-transform: translateY(100%); }\n    to { -moz-transform: translateY(0); }\n}\n@keyframes slideinfrombottom {\n    from { transform: translateY(100%); }\n    to { transform: translateY(0); }\n}\n@-webkit-keyframes slideouttobottom {\n    from { -webkit-transform: translateY(0); }\n    to { -webkit-transform: translateY(100%); }\n}\n@-moz-keyframes slideouttobottom {\n    from { -moz-transform: translateY(0); }\n    to { -moz-transform: translateY(100%); }\n}\n@keyframes slideouttobottom {\n    from { transform: translateY(0); }\n    to { transform: translateY(100%); }\n}\n/* The properties in this rule are only necessary for the 'flip' transition.\n * We need specify the perspective to create a projection matrix. This will add\n * some depth as the element flips. The depth number represents the distance of\n * the viewer from the z-plane. According to the CSS3 spec, 1000 is a moderate\n * value.\n */\n.viewport-flip {\n\t-webkit-perspective: 1000;\n\t-moz-perspective: 1000;\n\tperspective: 1000;\n\tposition: absolute;\n}\n.flip {\n\t-webkit-backface-visibility: hidden;\n\t-webkit-transform: translateX(0); /* Needed to work around an iOS 3.1 bug that causes listview thumbs to disappear when -webkit-visibility:hidden is used. */\n\t-moz-backface-visibility: hidden;\n\t-moz-transform: translateX(0);\n\tbackface-visibility: hidden;\n\ttransform: translateX(0);\n}\n.flip.out {\n\t-webkit-transform: rotateY(-90deg) scale(.9);\n\t-webkit-animation-name: flipouttoleft;\n\t-webkit-animation-duration: 175ms;\n\t-moz-transform: rotateY(-90deg) scale(.9);\n\t-moz-animation-name: flipouttoleft;\n\t-moz-animation-duration: 175ms;\n\ttransform: rotateY(-90deg) scale(.9);\n\tanimation-name: flipouttoleft;\n\tanimation-duration: 175ms;\n}\n.flip.in {\n\t-webkit-animation-name: flipintoright;\n\t-webkit-animation-duration: 225ms;\n\t-moz-animation-name: flipintoright;\n\t-moz-animation-duration: 225ms;\n\tanimation-name: flipintoright;\n\tanimation-duration: 225ms;\n}\n.flip.out.reverse {\n\t-webkit-transform: rotateY(90deg) scale(.9);\n\t-webkit-animation-name: flipouttoright;\n\t-moz-transform: rotateY(90deg) scale(.9);\n\t-moz-animation-name: flipouttoright;\n\ttransform: rotateY(90deg) scale(.9);\n\tanimation-name: flipouttoright;\n}\n.flip.in.reverse {\n\t-webkit-animation-name: flipintoleft;\n\t-moz-animation-name: flipintoleft;\n\tanimation-name: flipintoleft;\n}\n@-webkit-keyframes flipouttoleft {\n    from { -webkit-transform: rotateY(0); }\n    to { -webkit-transform: rotateY(-90deg) scale(.9); }\n}\n@-moz-keyframes flipouttoleft {\n    from { -moz-transform: rotateY(0); }\n    to { -moz-transform: rotateY(-90deg) scale(.9); }\n}\n@keyframes flipouttoleft {\n    from { transform: rotateY(0); }\n    to { transform: rotateY(-90deg) scale(.9); }\n}\n@-webkit-keyframes flipouttoright {\n    from { -webkit-transform: rotateY(0) ; }\n    to { -webkit-transform: rotateY(90deg) scale(.9); }\n}\n@-moz-keyframes flipouttoright {\n    from { -moz-transform: rotateY(0); }\n    to { -moz-transform: rotateY(90deg) scale(.9); }\n}\n@keyframes flipouttoright {\n    from { transform: rotateY(0); }\n    to { transform: rotateY(90deg) scale(.9); }\n}\n@-webkit-keyframes flipintoleft {\n    from { -webkit-transform: rotateY(-90deg) scale(.9); }\n    to { -webkit-transform: rotateY(0); }\n}\n@-moz-keyframes flipintoleft {\n    from { -moz-transform: rotateY(-90deg) scale(.9); }\n    to { -moz-transform: rotateY(0); }\n}\n@keyframes flipintoleft {\n    from { transform: rotateY(-90deg) scale(.9); }\n    to { transform: rotateY(0); }\n}\n@-webkit-keyframes flipintoright {\n    from { -webkit-transform: rotateY(90deg) scale(.9); }\n    to { -webkit-transform: rotateY(0); }\n}\n@-moz-keyframes flipintoright {\n    from { -moz-transform: rotateY(90deg) scale(.9); }\n    to { -moz-transform: rotateY(0); }\n}\n@keyframes flipintoright {\n    from { transform: rotateY(90deg) scale(.9); }\n    to { transform: rotateY(0); }\n}\n/* The properties in this rule are only necessary for the 'flip' transition.\n * We need specify the perspective to create a projection matrix. This will add\n * some depth as the element flips. The depth number represents the distance of\n * the viewer from the z-plane. According to the CSS3 spec, 1000 is a moderate\n * value.\n */\n.viewport-turn {\n\t-webkit-perspective: 200px;\n\t-moz-perspective: 200px;\n\t-ms-perspective: 200px;\n\tperspective: 200px;\n\tposition: absolute;\n}\n.turn {\n\t-webkit-backface-visibility: hidden;\n\t-webkit-transform: translateX(0); /* Needed to work around an iOS 3.1 bug that causes listview thumbs to disappear when -webkit-visibility:hidden is used. */\n\t-webkit-transform-origin: 0;\n\t\n\t-moz-backface-visibility: hidden;\n\t-moz-transform: translateX(0);\n\t-moz-transform-origin: 0;\n\t\n\tbackface-visibility :hidden;\n\ttransform: translateX(0);\n\ttransform-origin: 0;\n}\n.turn.out {\n\t-webkit-transform: rotateY(-90deg) scale(.9);\n\t-webkit-animation-name: flipouttoleft;\n\t-webkit-animation-duration: 125ms;\n\t-moz-transform: rotateY(-90deg) scale(.9);\n\t-moz-animation-name: flipouttoleft;\n\t-moz-animation-duration: 125ms;\n\ttransform: rotateY(-90deg) scale(.9);\n\tanimation-name: flipouttoleft;\n\tanimation-duration: 125ms;\n}\n.turn.in {\n\t-webkit-animation-name: flipintoright;\n\t-webkit-animation-duration: 250ms;\n\t-moz-animation-name: flipintoright;\n\t-moz-animation-duration: 250ms;\n\tanimation-name: flipintoright;\n\tanimation-duration: 250ms;\n\t\n}\n.turn.out.reverse {\n\t-webkit-transform: rotateY(90deg) scale(.9);\n\t-webkit-animation-name: flipouttoright;\n\t-moz-transform: rotateY(90deg) scale(.9);\n\t-moz-animation-name: flipouttoright;\n\ttransform: rotateY(90deg) scale(.9);\n\tanimation-name: flipouttoright;\n}\n.turn.in.reverse {\n\t-webkit-animation-name: flipintoleft;\n\t-moz-animation-name: flipintoleft;\n\tanimation-name: flipintoleft;\n}\n@-webkit-keyframes flipouttoleft {\n    from { -webkit-transform: rotateY(0); }\n    to { -webkit-transform: rotateY(-90deg) scale(.9); }\n}\n@-moz-keyframes flipouttoleft {\n    from { -moz-transform: rotateY(0); }\n    to { -moz-transform: rotateY(-90deg) scale(.9); }\n}\n@keyframes flipouttoleft {\n    from { transform: rotateY(0); }\n    to { transform: rotateY(-90deg) scale(.9); }\n}\n@-webkit-keyframes flipouttoright {\n    from { -webkit-transform: rotateY(0) ; }\n    to { -webkit-transform: rotateY(90deg) scale(.9); }\n}\n@-moz-keyframes flipouttoright {\n    from { -moz-transform: rotateY(0); }\n    to { -moz-transform: rotateY(90deg) scale(.9); }\n}\n@keyframes flipouttoright {\n    from { transform: rotateY(0); }\n    to { transform: rotateY(90deg) scale(.9); }\n}\n@-webkit-keyframes flipintoleft {\n    from { -webkit-transform: rotateY(-90deg) scale(.9); }\n    to { -webkit-transform: rotateY(0); }\n}\n@-moz-keyframes flipintoleft {\n    from { -moz-transform: rotateY(-90deg) scale(.9); }\n    to { -moz-transform: rotateY(0); }\n}\n@keyframes flipintoleft {\n    from { transform: rotateY(-90deg) scale(.9); }\n    to { transform: rotateY(0); }\n}\n@-webkit-keyframes flipintoright {\n    from { -webkit-transform: rotateY(90deg) scale(.9); }\n    to { -webkit-transform: rotateY(0); }\n}\n@-moz-keyframes flipintoright {\n    from { -moz-transform: rotateY(90deg) scale(.9); }\n    to { -moz-transform: rotateY(0); }\n}\n@keyframes flipintoright {\n    from { transform: rotateY(90deg) scale(.9); }\n    to { transform: rotateY(0); }\n}\n/* flow transition */\n.flow {\n\t-webkit-transform-origin: 50% 30%;\n\t-webkit-box-shadow: 0 0 20px rgba(0,0,0,.4);\n\t-moz-transform-origin: 50% 30%;\t\n\t-moz-box-shadow: 0 0 20px rgba(0,0,0,.4);\n\ttransform-origin: 50% 30%;\t\n\tbox-shadow: 0 0 20px rgba(0,0,0,.4);\n}\n.ui-dialog.flow {\n\t-webkit-transform-origin: none;\n\t-webkit-box-shadow: none;\n\t-moz-transform-origin: none;\t\n\t-moz-box-shadow: none;\n\ttransform-origin: none;\t\n\tbox-shadow: none;\n}\n.flow.out {\n\t-webkit-transform: translateX(-100%) scale(.7);\n\t-webkit-animation-name: flowouttoleft;\n\t-webkit-animation-timing-function: ease;\n\t-webkit-animation-duration: 350ms;\n\t-moz-transform: translateX(-100%) scale(.7);\n\t-moz-animation-name: flowouttoleft;\n\t-moz-animation-timing-function: ease;\n\t-moz-animation-duration: 350ms;\n\ttransform: translateX(-100%) scale(.7);\n\tanimation-name: flowouttoleft;\n\tanimation-timing-function: ease;\n\tanimation-duration: 350ms;\n}\n.flow.in {\n\t-webkit-transform: translateX(0) scale(1);\n\t-webkit-animation-name: flowinfromright;\n\t-webkit-animation-timing-function: ease;\n\t-webkit-animation-duration: 350ms;\n\t-moz-transform: translateX(0) scale(1);\n\t-moz-animation-name: flowinfromright;\n\t-moz-animation-timing-function: ease;\n\t-moz-animation-duration: 350ms;\n\ttransform: translateX(0) scale(1);\n\tanimation-name: flowinfromright;\n\tanimation-timing-function: ease;\n\tanimation-duration: 350ms;\n}\n.flow.out.reverse {\n\t-webkit-transform: translateX(100%);\n\t-webkit-animation-name: flowouttoright;\n\t-moz-transform: translateX(100%);\n\t-moz-animation-name: flowouttoright;\n\ttransform: translateX(100%);\n\tanimation-name: flowouttoright;\n}\n.flow.in.reverse {\n\t-webkit-animation-name: flowinfromleft;\n\t-moz-animation-name: flowinfromleft;\n\tanimation-name: flowinfromleft;\n}\n@-webkit-keyframes flowouttoleft {\n    0% { -webkit-transform: translateX(0) scale(1); }\n\t60%, 70% { -webkit-transform: translateX(0) scale(.7); }\n    100% { -webkit-transform: translateX(-100%) scale(.7); }\n}\n@-moz-keyframes flowouttoleft {\n    0% { -moz-transform: translateX(0) scale(1); }\n\t60%, 70% { -moz-transform: translateX(0) scale(.7); }\n    100% { -moz-transform:  translateX(-100%) scale(.7); }\n}\n@keyframes flowouttoleft {\n    0% { transform: translateX(0) scale(1); }\n\t60%, 70% { transform: translateX(0) scale(.7); }\n    100% { transform:  translateX(-100%) scale(.7); }\n}\n@-webkit-keyframes flowouttoright {\n    0% { -webkit-transform: translateX(0) scale(1); }\n\t60%, 70% { -webkit-transform: translateX(0) scale(.7); }\n    100% { -webkit-transform:  translateX(100%) scale(.7); }\n}\n@-moz-keyframes flowouttoright {\n    0% { -moz-transform: translateX(0) scale(1); }\n\t60%, 70% { -moz-transform: translateX(0) scale(.7); }\n    100% { -moz-transform:  translateX(100%) scale(.7); }\n}\n@keyframes flowouttoright {\n    0% { transform: translateX(0) scale(1); }\n\t60%, 70% { transform: translateX(0) scale(.7); }\n    100% { transform:  translateX(100%) scale(.7); }\n}\n@-webkit-keyframes flowinfromleft {\n    0% { -webkit-transform: translateX(-100%) scale(.7); }\n\t30%, 40% { -webkit-transform: translateX(0) scale(.7); }\n    100% { -webkit-transform: translateX(0) scale(1); }\n}\n@-moz-keyframes flowinfromleft {\n    0% { -moz-transform: translateX(-100%) scale(.7); }\n\t30%, 40% { -moz-transform: translateX(0) scale(.7); }\n    100% { -moz-transform: translateX(0) scale(1); }\n}\n@keyframes flowinfromleft {\n    0% { transform: translateX(-100%) scale(.7); }\n\t30%, 40% { transform: translateX(0) scale(.7); }\n    100% { transform: translateX(0) scale(1); }\n}\n@-webkit-keyframes flowinfromright {\n    0% { -webkit-transform: translateX(100%) scale(.7); }\n\t30%, 40% { -webkit-transform: translateX(0) scale(.7); }\n    100% { -webkit-transform: translateX(0) scale(1); }\n}\n@-moz-keyframes flowinfromright {\n    0% { -moz-transform: translateX(100%) scale(.7); }\n\t30%, 40% { -moz-transform: translateX(0) scale(.7); }\n    100% { -moz-transform: translateX(0) scale(1); }\n}\n@keyframes flowinfromright {\n    0% { transform: translateX(100%) scale(.7); }\n\t30%, 40% { transform: translateX(0) scale(.7); }\n    100% { transform: translateX(0) scale(1); }\n}\n.ui-field-contain,\n.ui-mobile fieldset.ui-field-contain {\n\tdisplay: block;\n\tposition: relative;\n\toverflow: visible;\n\tclear: both;\n\tpadding: .8em 0;\n}\n.ui-field-contain > label ~ [class*=\"ui-\"],\n.ui-field-contain .ui-controlgroup-controls {\n\tmargin: 0;\n}\n.ui-field-contain:last-child {\n\tborder-bottom-width: 0;\n}\n@media (min-width: 28em) {\n\t.ui-field-contain,\n\t.ui-mobile fieldset.ui-field-contain {\n\t\tpadding: 0;\n\t\tmargin: 1em 0;\n\t\tborder-bottom-width: 0;\n\t}\n\t.ui-field-contain:before,\n\t.ui-field-contain:after {\n\t\tcontent: \"\";\n\t\tdisplay: table;\n\t}\n\t.ui-field-contain:after {\n\t\tclear: both;\n\t}\n\t.ui-field-contain > label,\n\t.ui-field-contain .ui-controlgroup-label,\n\t.ui-field-contain > .ui-rangeslider > label {\n\t\tfloat: left;\n\t\twidth: 20%;\n\t\tmargin: .5em 2% 0 0;\n\t}\n\t.ui-popup .ui-field-contain > label,\n\t.ui-popup .ui-field-contain .ui-controlgroup-label,\n\t.ui-popup .ui-field-contain > .ui-rangeslider > label {\n\t\tfloat: none;\n\t\twidth: auto;\n\t\tmargin: 0 0 .4em;\n\t}\n\t.ui-field-contain > label ~ [class*=\"ui-\"],\n\t.ui-field-contain .ui-controlgroup-controls {\n\t\tfloat: left;\n\t\twidth: 78%;\n\t\t-webkit-box-sizing: border-box;\n\t\t-moz-box-sizing: border-box;\n\t\tbox-sizing: border-box;\n\t}\n\t/* ui-hide-label deprecated in 1.4. TODO: Remove in 1.5 */\n\t.ui-hide-label > label ~ [class*=\"ui-\"],\n\t.ui-hide-label .ui-controlgroup-controls,\n\t.ui-popup .ui-field-contain > label ~ [class*=\"ui-\"],\n\t.ui-popup .ui-field-contain .ui-controlgroup-controls {\n\t\tfloat: none;\n\t\twidth: 100%;\n\t}\n\t.ui-field-contain > label ~ .ui-btn-inline {\n\t\twidth: auto;\n\t\tmargin-right: .625em;\n\t}\n\t.ui-field-contain > label ~ .ui-btn-inline.ui-btn-icon-notext {\n\t\twidth: 1.75em;\n\t}\n}\n/* content configurations. */\n.ui-grid-a,\n.ui-grid-b,\n.ui-grid-c,\n.ui-grid-d,\n.ui-grid-solo {\n\toverflow: hidden;\n}\n.ui-block-a,\n.ui-block-b,\n.ui-block-c,\n.ui-block-d,\n.ui-block-e {\n\tmargin: 0;\n\tpadding: 0;\n\tborder: 0;\n\tfloat: left;\n\tmin-height: 1px;\n\t-webkit-box-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\tbox-sizing: border-box;\n}\n/* force new row */\n.ui-block-a {\n\tclear: left;\n}\nul.ui-grid-a,\nul.ui-grid-b,\nul.ui-grid-c,\nul.ui-grid-d,\nul.ui-grid-solo,\nli.ui-block-a,\nli.ui-block-b,\nli.ui-block-c,\nli.ui-block-d,\nli.ui-block-e {\n\tmargin-left: 0;\n\tmargin-right: 0;\n\tpadding: 0;\n\tlist-style: none;\n}\n/* No margin in grids for 100% width button elements until we can use max-width: fill-available; */\n[class*=\"ui-block-\"] > button.ui-btn {\n\tmargin-right: 0;\n\tmargin-left: 0;\n}\n[class*=\"ui-block-\"] > .ui-btn,\n[class*=\"ui-block-\"] > .ui-select,\n[class*=\"ui-block-\"] > .ui-checkbox,\n[class*=\"ui-block-\"] > .ui-radio,\n[class*=\"ui-block-\"] > button.ui-btn-inline,\n[class*=\"ui-block-\"] > button.ui-btn-icon-notext,\n.ui-header [class*=\"ui-block-\"] > button.ui-btn,\n.ui-footer [class*=\"ui-block-\"] > button.ui-btn {\n\tmargin-right: .3125em;\n\tmargin-left: .3125em;\n}\n.ui-grid-a > .ui-block-a,\n.ui-grid-a > .ui-block-b {\n\t/* width: 49.95%; IE7 */\n\t/* margin-right: -.5px; BB5 */\n\twidth: 50%;\n}\n.ui-grid-b > .ui-block-a,\n.ui-grid-b > .ui-block-b,\n.ui-grid-b > .ui-block-c {\n\t/* width: 33.25%; IE7 */\n\t/* margin-right: -.5px; BB5 */\n\twidth: 33.333%;\n}\n.ui-grid-c > .ui-block-a,\n.ui-grid-c > .ui-block-b,\n.ui-grid-c > .ui-block-c,\n.ui-grid-c > .ui-block-d {\n\t/* width: 24.925%; IE7 */\n\t/* margin-right: -.5px; BB5 */\n\twidth: 25%;\n}\n.ui-grid-d > .ui-block-a,\n.ui-grid-d > .ui-block-b,\n.ui-grid-d > .ui-block-c,\n.ui-grid-d > .ui-block-d,\n.ui-grid-d > .ui-block-e {\n\t/* width: 19.925%; IE7 */\n\twidth: 20%;\n}\n.ui-grid-solo > .ui-block-a {\n\twidth: 100%;\n\tfloat: none; \n}\n/* preset breakpoint to switch to stacked grid styles below 35em (560px) */\n@media (max-width: 35em) {\n\t.ui-responsive > .ui-block-a,\n\t.ui-responsive > .ui-block-b,\n\t.ui-responsive > .ui-block-c,\n\t.ui-responsive > .ui-block-d,\n\t.ui-responsive > .ui-block-e {\n\t\twidth: 100%; \n\t\tfloat: none; \n\t}\n}\n/* fixed page header & footer configuration */\n.ui-header-fixed,\n.ui-footer-fixed {\n\tleft: 0;\n\tright: 0;\n\twidth: 100%;\n\tposition: fixed;\n\tz-index: 1000;\n}\n.ui-header-fixed {\n\ttop: -1px;\n\tpadding-top: 1px;\n}\n.ui-header-fixed.ui-fixed-hidden {\n\ttop: 0;\n\tpadding-top: 0;\n}\n.ui-header-fixed .ui-btn-left,\n.ui-header-fixed .ui-btn-right {\n\tmargin-top: 1px;\n}\n.ui-header-fixed.ui-fixed-hidden .ui-btn-left,\n.ui-header-fixed.ui-fixed-hidden .ui-btn-right {\n\tmargin-top: 0;\n}\n.ui-footer-fixed {\n\tbottom: -1px;\n\tpadding-bottom: 1px;\n}\n.ui-footer-fixed.ui-fixed-hidden {\n\tbottom: 0;\n\tpadding-bottom: 0;\n}\n.ui-header-fullscreen,\n.ui-footer-fullscreen {\n\tfilter: Alpha(Opacity=90);\n\topacity: .9;\n}\n/* updatePagePadding() will update the padding to actual height of header and footer. */\n.ui-page-header-fixed {\n\tpadding-top: 2.8125em;\n}\n.ui-page-footer-fixed {\n\tpadding-bottom: 2.8125em;\n}\n.ui-page-header-fullscreen > .ui-content,\n.ui-page-footer-fullscreen > .ui-content {\n\tpadding: 0;\n}\n.ui-fixed-hidden {\n\tposition: absolute;\n}\n/* Tap toggle: hide external fixed footer. See issue #6604 */\n.ui-footer-fixed.ui-fixed-hidden {\n  display: none;\n}\n.ui-page .ui-footer-fixed.ui-fixed-hidden {\n  display: block\n}\n.ui-page-header-fullscreen .ui-fixed-hidden,\n.ui-page-footer-fullscreen .ui-fixed-hidden {\n\tposition: absolute !important;\n\theight: 1px;\n\twidth: 1px;\n\toverflow: hidden;\n\tclip: rect(1px,1px,1px,1px);\n}\n.ui-header-fixed .ui-btn,\n.ui-footer-fixed .ui-btn { \n\tz-index: 10;\n}\n/* workarounds for other widgets */\n.ui-android-2x-fixed .ui-li-has-thumb {\n\t-webkit-transform: translate3d(0,0,0);\n}\n.ui-navbar {\n\tmax-width: 100%;\n}\n.ui-navbar ul:before,\n.ui-navbar ul:after {\n\tcontent: \"\";\n\tdisplay: table;\n}\n.ui-navbar ul:after {\n\tclear: both;\n}\n.ui-navbar ul {\n\tlist-style: none;\n\tmargin: 0;\n\tpadding: 0;\n\tposition: relative;\n\tdisplay: block;\n\tborder: 0;\n\tmax-width: 100%;\n\toverflow: visible;\n}\n.ui-navbar li .ui-btn {\n\tfont-size: 12.5px;\n\tdisplay: block;\n\tmargin: 0;\n\tborder-right-width: 0;\n}\n.ui-header .ui-navbar li button.ui-btn,\n.ui-footer .ui-navbar li button.ui-btn {\n\tmargin: 0;\n\twidth: 100%;\n}\n.ui-navbar .ui-btn:focus {\n\tz-index: 1;\n}\n/* fixes gaps caused by subpixel problem */\n.ui-navbar li:last-child .ui-btn {\n\tmargin-right: -4px;\n}\n.ui-navbar li:last-child .ui-btn:after {\n\tmargin-right: 4px;\n}\n.ui-content .ui-navbar li:last-child .ui-btn,\n.ui-content .ui-navbar .ui-grid-duo .ui-block-b .ui-btn {\n\tborder-right-width: 1px;\n\tmargin-right: 0;\n}\n.ui-content .ui-navbar li:last-child .ui-btn:after,\n.ui-content .ui-navbar .ui-grid-duo .ui-block-b .ui-btn:after {\n\tmargin-right: 0;\n}\n.ui-navbar .ui-grid-duo .ui-block-a:last-child .ui-btn {\n\tborder-right-width: 1px;\n\tmargin-right: -1px;\n}\n.ui-navbar .ui-grid-duo .ui-block-a:last-child .ui-btn:after {\n\tmargin-right: 1px;\n}\n.ui-navbar .ui-grid-duo .ui-btn {\n\tborder-top-width: 0;\n}\n.ui-navbar .ui-grid-duo .ui-block-a:first-child .ui-btn,\n.ui-navbar .ui-grid-duo .ui-block-a:first-child + .ui-block-b .ui-btn {\n\tborder-top-width: 1px;\n}\n.ui-header .ui-navbar .ui-btn,\n.ui-footer .ui-navbar .ui-btn {\n\tborder-top-width: 0;\n\tborder-bottom-width: 0;\n}\n.ui-header .ui-navbar .ui-grid-duo .ui-block-a:first-child .ui-btn,\n.ui-footer .ui-navbar .ui-grid-duo .ui-block-a:first-child .ui-btn,\n.ui-header .ui-navbar .ui-grid-duo .ui-block-a:first-child + .ui-block-b .ui-btn,\n.ui-footer .ui-navbar .ui-grid-duo .ui-block-a:first-child + .ui-block-b .ui-btn {\n\tborder-top-width: 0;\n}\n.ui-header .ui-title ~ .ui-navbar .ui-btn,\n.ui-footer .ui-title ~ .ui-navbar .ui-btn,\n.ui-header .ui-navbar .ui-grid-duo .ui-btn,\n.ui-footer .ui-navbar .ui-grid-duo .ui-btn,\n.ui-header .ui-title ~ .ui-navbar .ui-grid-duo .ui-block-a:first-child .ui-btn,\n.ui-footer .ui-title ~ .ui-navbar .ui-grid-duo .ui-block-a:first-child .ui-btn,\n.ui-header .ui-title ~ .ui-navbar .ui-grid-duo .ui-block-a:first-child + .ui-block-b .ui-btn,\n.ui-footer .ui-title ~ .ui-navbar .ui-grid-duo .ui-block-a:first-child + .ui-block-b .ui-btn {\n\tborder-top-width: 1px;\n}\n/* Hide the native input element */\n.ui-input-btn input {\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n\twidth: 100%;\n\theight: 100%;\n\tpadding: 0;\n\tborder: 0;\n\toutline: 0;\n\t-webkit-border-radius: inherit;\n\tborder-radius: inherit;\t\n\t-webkit-appearance: none;\n\t-moz-appearance: none;\n\tcursor: pointer;\n\tbackground: #fff;\n\tbackground: rgba(255,255,255,0);\n\tfilter: Alpha(Opacity=0);\n\topacity: .1;\n\tfont-size: 1px;\n\ttext-indent: -9999px;\n\tz-index: 2;\n}\n/* Fixes IE/WP filter alpha opacity bugs */\n.ui-input-btn.ui-state-disabled input {\n\tposition: absolute !important;\n\theight: 1px;\n\twidth: 1px;\n\toverflow: hidden;\n\tclip: rect(1px,1px,1px,1px);\n}\n.ui-collapsible {\n\tmargin: 0 -1em;\n}\n.ui-collapsible-inset,\n.ui-collapsible-set {\n\tmargin: .5em 0;\n}\n.ui-collapsible-heading {\n\tdisplay: block;\n\tmargin: 0;\n\tpadding: 0;\n\tposition: relative;\n}\n.ui-collapsible-heading .ui-btn {\n\ttext-align: left;\n\tmargin: 0;\n\tborder-left-width: 0;\n\tborder-right-width: 0;\n}\n.ui-collapsible-heading .ui-btn-icon-top,\n.ui-collapsible-heading .ui-btn-icon-bottom {\n\ttext-align: center;\n}\n.ui-collapsible-inset .ui-collapsible-heading .ui-btn {\n\tborder-right-width: 1px;\n\tborder-left-width: 1px;\n}\n.ui-collapsible-collapsed + .ui-collapsible:not(.ui-collapsible-inset) > .ui-collapsible-heading .ui-btn {\n\tborder-top-width: 0;\n}\n.ui-collapsible-set .ui-collapsible:not(.ui-collapsible-inset) .ui-collapsible-heading .ui-btn {\n\tborder-top-width: 1px;\n}\n.ui-collapsible-heading-status {\n\tposition: absolute !important;\n\theight: 1px;\n\twidth: 1px;\n\toverflow: hidden;\n\tclip: rect(1px,1px,1px,1px);\n}\n.ui-collapsible-content {\n\tdisplay: block;\n\tmargin: 0;\t\n\tpadding: .5em 1em;\n}\n.ui-collapsible-themed-content .ui-collapsible-content {\n\tborder-left-width: 0;\n\tborder-right-width: 0;\n\tborder-top-width: 0;\n\tborder-bottom-width: 1px;\n\tborder-style: solid;\n}\n.ui-collapsible-inset.ui-collapsible-themed-content .ui-collapsible-content {\n\tborder-left-width: 1px;\n\tborder-right-width: 1px;\n}\n.ui-collapsible-inset .ui-collapsible-content {\n\tmargin: 0;\n}\n.ui-collapsible-content-collapsed {\n\tdisplay: none;\n}\n.ui-collapsible-set > .ui-collapsible.ui-corner-all {\n\t-webkit-border-radius: 0;\n\tborder-radius: 0;\n}\n.ui-collapsible-heading,\n.ui-collapsible-heading > .ui-btn {\n\t-webkit-border-radius: inherit;\t\n\tborder-radius: inherit;\t\n}\n.ui-collapsible-set .ui-collapsible.ui-first-child {\n\t-webkit-border-top-right-radius: inherit;\t\n\tborder-top-right-radius: inherit;\n\t-webkit-border-top-left-radius: inherit;\t\n\tborder-top-left-radius: inherit;\t\t\n}\n.ui-collapsible-content,\n.ui-collapsible-set .ui-collapsible.ui-last-child {\n\t-webkit-border-bottom-right-radius: inherit;\t\n\tborder-bottom-right-radius: inherit;\n\t-webkit-border-bottom-left-radius: inherit;\t\n\tborder-bottom-left-radius: inherit;\t\t\n}\n.ui-collapsible-themed-content:not(.ui-collapsible-collapsed) > .ui-collapsible-heading {\n\t-webkit-border-bottom-right-radius: 0;\t\n\tborder-bottom-right-radius: 0;\n\t-webkit-border-bottom-left-radius: 0;\t\n\tborder-bottom-left-radius: 0;\t\t\n}\n.ui-collapsible-set .ui-collapsible {\n\tmargin: -1px -1em 0;\n}\n.ui-collapsible-set .ui-collapsible-inset {\n\tmargin: -1px 0 0;\n}\n.ui-collapsible-set .ui-collapsible.ui-first-child {\n\tmargin-top: 0;\n}\n.ui-controlgroup,\nfieldset.ui-controlgroup {\n\tpadding: 0;\n\tmargin: .5em 0;\n}\n.ui-field-contain .ui-controlgroup,\n.ui-field-contain fieldset.ui-controlgroup {\n\tmargin: 0;\n}\n.ui-mini .ui-controlgroup-label {\n\tfont-size: 16px;\n}\n.ui-controlgroup.ui-mini .ui-btn-icon-notext,\n.ui-controlgroup .ui-mini.ui-btn-icon-notext {\n\tfont-size: inherit;\n}\n.ui-controlgroup-controls .ui-btn,\n.ui-controlgroup-controls .ui-checkbox,\n.ui-controlgroup-controls .ui-radio,\n.ui-controlgroup-controls .ui-select {\n\tmargin: 0;\n}\n.ui-controlgroup-controls .ui-btn:focus,\n.ui-controlgroup-controls .ui-btn.ui-focus {\n\tz-index: 1;\n}\n.ui-controlgroup-controls li {\n\tlist-style: none;\n}\n.ui-controlgroup-horizontal .ui-controlgroup-controls {\n\tdisplay: inline-block;\n\tvertical-align: middle;\n}\n.ui-controlgroup-horizontal .ui-controlgroup-controls:before,\n.ui-controlgroup-horizontal .ui-controlgroup-controls:after {\n\tcontent: \"\";\n\tdisplay: table;\n}\n.ui-controlgroup-horizontal .ui-controlgroup-controls:after {\n\tclear: both;\n}\n.ui-controlgroup-horizontal .ui-controlgroup-controls > .ui-btn,\n.ui-controlgroup-horizontal .ui-controlgroup-controls li > .ui-btn,\n.ui-controlgroup-horizontal .ui-controlgroup-controls .ui-checkbox,\n.ui-controlgroup-horizontal .ui-controlgroup-controls .ui-radio,\n.ui-controlgroup-horizontal .ui-controlgroup-controls .ui-select {\n\tfloat: left;\n\tclear: none;\n}\n.ui-controlgroup-horizontal .ui-controlgroup-controls button.ui-btn,\n.ui-controlgroup-controls .ui-btn-icon-notext {\n\twidth: auto;\n}\n.ui-controlgroup-horizontal .ui-controlgroup-controls .ui-btn-icon-notext,\n.ui-controlgroup-horizontal .ui-controlgroup-controls button.ui-btn-icon-notext {\n\twidth: 1.5em;\n}\n .ui-controlgroup-controls .ui-btn-icon-notext {\n\theight: auto;\n\tpadding: .7em 1em;\n}\n.ui-controlgroup-vertical .ui-controlgroup-controls .ui-btn {\n\tborder-bottom-width: 0;\n}\n.ui-controlgroup-vertical .ui-controlgroup-controls .ui-btn.ui-last-child {\n\tborder-bottom-width: 1px;\n}\n.ui-controlgroup-horizontal .ui-controlgroup-controls .ui-btn {\n\tborder-right-width: 0;\n}\n.ui-controlgroup-horizontal .ui-controlgroup-controls .ui-btn.ui-last-child {\n\tborder-right-width: 1px;\n}\n.ui-controlgroup-controls .ui-btn-corner-all,\n.ui-controlgroup-controls .ui-btn.ui-corner-all {\n\t-webkit-border-radius: 0;\n\tborder-radius: 0;\n}\n.ui-controlgroup-controls,\n.ui-controlgroup-controls .ui-radio,\n.ui-controlgroup-controls .ui-checkbox,\n.ui-controlgroup-controls .ui-select,\n.ui-controlgroup-controls li {\n\t-webkit-border-radius: inherit;\n\tborder-radius: inherit;\n}\n.ui-controlgroup-vertical .ui-btn.ui-first-child {\n\t-webkit-border-top-left-radius: inherit;\n\tborder-top-left-radius: inherit;\n\t-webkit-border-top-right-radius: inherit;\n\tborder-top-right-radius: inherit;\n}\n.ui-controlgroup-vertical .ui-btn.ui-last-child {\n\t-webkit-border-bottom-left-radius: inherit;\n\tborder-bottom-left-radius: inherit;\n\t-webkit-border-bottom-right-radius: inherit;\n\tborder-bottom-right-radius: inherit;\n}\n.ui-controlgroup-horizontal .ui-btn.ui-first-child {\n\t-webkit-border-top-left-radius: inherit;\n\tborder-top-left-radius: inherit;\n\t-webkit-border-bottom-left-radius: inherit;\n\tborder-bottom-left-radius: inherit;\n}\n.ui-controlgroup-horizontal .ui-btn.ui-last-child {\n\t-webkit-border-top-right-radius: inherit;\n\tborder-top-right-radius: inherit;\n\t-webkit-border-bottom-right-radius: inherit;\n\tborder-bottom-right-radius: inherit;\n}\n.ui-controlgroup-controls a.ui-shadow:not(:focus),\n.ui-controlgroup-controls button.ui-shadow:not(:focus),\n.ui-controlgroup-controls div.ui-shadow:not(.ui-focus) {\n\t-moz-box-shadow: none;\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n}\n/* Fixes legend not wrapping on IE10 */\n.ui-controlgroup-label legend {\n\tmax-width: 100%;\n}\n.ui-controlgroup-controls > label {\n\tposition: absolute !important;\n\theight: 1px;\n\twidth: 1px;\n\toverflow: hidden;\n\tclip: rect(1px,1px,1px,1px);\n}\n.ui-dialog {\n\t background: none !important; /* this is to ensure that dialog theming does not apply (by default at least) on the page div */\n}\n.ui-dialog-contain {\n\twidth: 92.5%;\n\tmax-width: 500px;\n\tmargin: 10% auto 1em auto;\n\tpadding: 0;\n\tposition: relative;\n\ttop: -1em;\n}\n.ui-dialog-contain > .ui-header, \n.ui-dialog-contain > .ui-content, \n.ui-dialog-contain > .ui-footer { \n\tdisplay: block;\n\tposition: relative; \n\twidth: auto;\n\tmargin: 0;\n}\n.ui-dialog-contain > .ui-header {\n\toverflow: hidden;\n\tz-index: 10; \n\tpadding: 0;\n\tborder-top-width: 0;\n}\n.ui-dialog-contain > .ui-footer {\n\tz-index: 10; \n\tpadding: 0 1em; \n\tborder-bottom-width: 0;\n}\n.ui-popup-open .ui-header-fixed,\n.ui-popup-open .ui-footer-fixed {\n\tposition: absolute !important; /* See issues #4816, #4844 and #4874 and popup.js */\n}\n.ui-popup-screen {\n\tbackground-image: url(\"data:image/gif;base64,R0lGODlhAQABAID/AMDAwAAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==\"); /* Necessary to set some form of background to ensure element is clickable in IE6/7. While legacy IE won't understand the data-URI'd image, it ensures no additional requests occur in all other browsers with little overhead. */\n\ttop: 0;\n\tleft: 0;\n\tright: 0;\n\tbottom: 1px;\n\tposition: absolute;\n\tfilter: Alpha(Opacity=0);\n\topacity: 0;\n\tz-index: 1099;\n}\n.ui-popup-screen.in {\n\topacity: 0.5;\n\tfilter: Alpha(Opacity=50);\n}\n.ui-popup-screen.out {\n\topacity: 0;\n\tfilter: Alpha(Opacity=0);\n}\n.ui-popup-container {\n\tz-index: 1100;\n\tdisplay: inline-block;\n\tposition: absolute;\n\tpadding: 0;\n\toutline: 0;\n}\n.ui-popup {\n\tposition: relative;\n}\n.ui-popup.ui-body-inherit {\n\tborder-width: 1px;\n\tborder-style: solid;\n}\n.ui-popup-hidden {\n\tleft: 0;\n\ttop: 0;\n\tposition: absolute !important;\n\tvisibility: hidden;\n}\n.ui-popup-truncate {\n\theight: 1px;\n\twidth: 1px;\n\tmargin: -1px;\n\toverflow: hidden;\n\tclip: rect(1px,1px,1px,1px);\n}\n.ui-popup.ui-content,\n.ui-popup .ui-content {\n\toverflow: visible;\n}\n.ui-popup > .ui-header {\n\tborder-top-width: 0;\n}\n.ui-popup > .ui-footer {\n\tborder-bottom-width: 0;\n}\n.ui-popup > p,\n.ui-popup > h1,\n.ui-popup > h2,\n.ui-popup > h3,\n.ui-popup > h4,\n.ui-popup > h5,\n.ui-popup > h6 {\n\tmargin: .5em .4375em;\n}\n.ui-popup > span {\n\tdisplay: block;\n\tmargin: .5em .4375em;\n}\n.ui-popup-container .ui-content > p,\n.ui-popup-container .ui-content > h1,\n.ui-popup-container .ui-content > h2,\n.ui-popup-container .ui-content > h3,\n.ui-popup-container .ui-content > h4,\n.ui-popup-container .ui-content > h5,\n.ui-popup-container .ui-content > h6 {\n\tmargin: .5em 0;\n}\n.ui-popup-container .ui-content > span {\n\tmargin: 0;\n}\n.ui-popup-container .ui-content > p:first-child,\n.ui-popup-container .ui-content > h1:first-child,\n.ui-popup-container .ui-content > h2:first-child,\n.ui-popup-container .ui-content > h3:first-child,\n.ui-popup-container .ui-content > h4:first-child,\n.ui-popup-container .ui-content > h5:first-child,\n.ui-popup-container .ui-content > h6:first-child {\n\tmargin-top: 0;\n}\n.ui-popup-container .ui-content > p:last-child,\n.ui-popup-container .ui-content > h1:last-child,\n.ui-popup-container .ui-content > h2:last-child,\n.ui-popup-container .ui-content > h3:last-child,\n.ui-popup-container .ui-content > h4:last-child,\n.ui-popup-container .ui-content > h5:last-child,\n.ui-popup-container .ui-content > h6:last-child {\n\tmargin-bottom: 0;\n}\n.ui-popup > img {\n\tmax-width: 100%;\n\tmax-height: 100%;\n\tvertical-align: middle;\n}\n.ui-popup:not(.ui-content) > img:only-child,\n.ui-popup:not(.ui-content) > .ui-btn-left:first-child + img:last-child,\n.ui-popup:not(.ui-content) > .ui-btn-right:first-child + img:last-child {\n\t-webkit-border-radius: inherit;\n\tborder-radius: inherit;\n}\n.ui-popup iframe {\n\tvertical-align: middle;\n}\n.ui-popup > .ui-btn-left,\n.ui-popup > .ui-btn-right {\n\tposition: absolute; \n\ttop: -11px;\n\tmargin: 0;\n\tz-index: 1101;\n}\n.ui-popup > .ui-btn-left {\n\tleft: -11px;\n}\n.ui-popup > .ui-btn-right {\n\tright: -11px;\n}\n/* Dimensions related to the popup arrow\n-----------------------------------------------------------------------------------------------------------*/\n/* desired triangle height: 10px */\n/**\n * guide for the arrow - its width, height, and offset are theme-dependent and\n * should be expessed as left, right, top, bottom, so that the element bearing\n * such a class becomes stretched inside its parent position: relative element.\n * The left/top/right/bottom specified below should reflect the corresponding\n * border radii and so it leaves room for the shadow:\n *     ..--------------------..\n *   .\"        ^ top           \".\n *  /          v                 \\\n * |     +------------------+     |\n * |     |                  |     |\n * | left|                  |right|\n * |<--->|                  |<--->|\n * |     +------------------+     |\n *  \\          ^                 /\n *   `.        v bottom        .'\n *     \"\"--------------------\"\"\n * The idea is that the top/left of the arrow container box does not move to a\n * coordinate smaller than the top/left of the guide and the right/bottom of\n * the arrow container box does not move to a coordinate larger than the\n * bottom/right of the guide. This will help us avoid the following situation:\n *        ..--------------------..\n *      .\"        ^ top           \".\n *   /|/          v                 \\\n *  / |     +------------------+     |\n *  \\ |     |                  |     |\n *   \\| left|                  |right|\n *    |<--->|                  |<--->|\n *    |     +------------------+     |\n *     \\          ^                 /\n *      `.        v bottom        .'\n *        \"\"--------------------\"\"\n * The arrow should not receive a top/left coordinate such that it is too close\n * to one of the corners, because then at first the shadow of the arrow and,\n * given a coordinate even closer to the corner, even the body of the arrow will\n * \"stick out\" of the corner of the popup. The guide provides a hint to the\n * arrow positioning code as to which range of values is acceptable for the\n * arrow container's top/left coordinate.\n **/\n.ui-popup-arrow-container {\n\twidth: 20px;\n\theight: 20px;\n}\n/* aside from the \"infinities\" (-1000,2000), triangle height is used */\n.ui-popup-arrow-container.ui-popup-arrow-l {\n\tleft: -10px;\n\tclip: rect(-1000px,10px,2000px,-1000px);\n}\n.ui-popup-arrow-container.ui-popup-arrow-t {\n\ttop: -10px;\n\tclip: rect(-1000px,2000px,10px,-1000px);\n}\n.ui-popup-arrow-container.ui-popup-arrow-r {\n\tright: -10px;\n\tclip: rect(-1000px,2000px,2000px,10px);\n}\n.ui-popup-arrow-container.ui-popup-arrow-b {\n\tbottom: -10px;\n\tclip: rect(10px,2000px,1000px,-1000px);\n}\n/**\n * For each side, the arrow is twice the desired size and its corner is aligned\n * with the edge of the container:\n *                                           \n *           /\\         /\\                +----+       /\\\n *          /  \\       /  \\               | /\\ |top   /  \\\n *      +----+  \\     /  +----+       +-->|/  \\|     /    \\\n *  left| /  |   \\   /   |  \\ |right  |   |    |    /      \\\n *      |/   |    \\ /    |   \\|       |  /|    |\\  /        \\\n *      |\\   |    / \\    |   /|       | / +----+ \\ \\ +----+ /\n *      | \\  |   /   \\   |  / |       | \\        /  \\|    |/\n *      +----+  /     \\  +----+       |  \\      /    |    |\n *       ^  \\  /       \\  /  ^        |   \\    /  +->|\\  /|\n *       |   \\/         \\/   |        |    \\  /   |  | \\/ |bottom\n *       |                   |        |     \\/    |  +----+\n *       +-------------------+--------+-----------+\n *                           |\n *                    arrow container\n *                     (clips arrow)\n **/\n.ui-popup-arrow-container .ui-popup-arrow {\n\t/* (4*desired triangle height)/sqrt(2) - does not account for border - centred within the outer rectangle */\n\twidth: 28.284271247px;\n\theight: 28.284271247px;\n\tborder-width: 1px;\n\tborder-style: solid;\n}\n.ui-popup-arrow-container.ui-popup-arrow-t .ui-popup-arrow {\n\tleft: -4.142135623px;\n\ttop: 5.857864376px;\n}\n.ui-popup-arrow-container.ui-popup-arrow-b .ui-popup-arrow {\n\tleft: -4.142135623px;\n\ttop: -14.142135623px;\n}\n.ui-popup-arrow-container.ui-popup-arrow-l .ui-popup-arrow {\n\tleft: 5.857864376px;\n\ttop: -4.142135623px;\n}\n.ui-popup-arrow-container.ui-popup-arrow-r .ui-popup-arrow {\n\tleft: -14.142135623px;\n\ttop: -4.142135623px;\n}\n/* Fix rotation center for oldIE - see http://www.useragentman.com/IETransformsTranslator/ */\n.ui-popup-arrow-container.ui-popup-arrow-t.ie .ui-popup-arrow {\n    margin-left: -5.857864376269049px;\n    margin-top: -7.0710678118654755px;\n}\n.ui-popup-arrow-container.ui-popup-arrow-b.ie .ui-popup-arrow {\n    margin-left: -5.857864376269049px;\n    margin-top: -4.142135623730951px;\n}\n \n.ui-popup-arrow-container.ui-popup-arrow-l.ie .ui-popup-arrow {\n    margin-left: -7.0710678118654755px;\n    margin-top: -5.857864376269049px;\n}\n.ui-popup-arrow-container.ui-popup-arrow-r.ie .ui-popup-arrow {\n    margin-left: -4.142135623730951px;\n    margin-top: -5.857864376269049px;\n}\n/* structure */\n.ui-popup > .ui-popup-arrow-guide {\n\tposition: absolute;\n\tleft: 0;\n\tright: 0;\n\ttop: 0;\n\tbottom: 0;\n\tvisibility: hidden;\n}\n.ui-popup-arrow-container {\n\tposition: absolute;\n}\n.ui-popup-arrow {\n\t-webkit-transform: rotate(45deg);\n\t-moz-transform: rotate(45deg);\n\t-ms-transform: rotate(45deg);\n\ttransform: rotate(45deg);\n\tposition: absolute;\n\toverflow: hidden;\n\tbox-sizing: border-box;\n}\n.ui-popup-arrow-container.ie .ui-popup-arrow {\n\t-ms-filter: \"progid:DXImageTransform.Microsoft.Matrix(M11=0.7071067811865474, M12=-0.7071067811865477, M21=0.7071067811865477, M22=0.7071067811865474, SizingMethod='auto expand')\";\n\tfilter: progid:DXImageTransform.Microsoft.Matrix(\n\t      \tM11=0.7071067811865474,\n        \tM12=-0.7071067811865477,\n        \tM21=0.7071067811865477,\n        \tM22=0.7071067811865474,\n        \tSizingMethod='auto expand');\n}\n.ui-checkbox,\n.ui-radio {\n\tmargin: .5em 0;\n\tposition: relative;\n}\n.ui-checkbox .ui-btn,\n.ui-radio .ui-btn {\n\tmargin: 0;\n\ttext-align: left;\n\twhite-space: normal; /* Nowrap + ellipsis doesn't work on label. Issue #1419. */\n\tz-index: 2;\n}\n.ui-controlgroup .ui-checkbox .ui-btn.ui-focus,\n.ui-controlgroup .ui-radio .ui-btn.ui-focus {\n\tz-index: 3;\n}\n.ui-checkbox .ui-btn-icon-top,\n.ui-radio .ui-btn-icon-top,\n.ui-checkbox .ui-btn-icon-bottom,\n.ui-radio .ui-btn-icon-bottom {\n\ttext-align: center;\n}\n.ui-controlgroup-horizontal .ui-checkbox .ui-btn:after,\n.ui-controlgroup-horizontal .ui-radio .ui-btn:after {\n\tcontent: none;\n\tdisplay: none;\n}\n/* Native input positioning */\n.ui-checkbox input,\n.ui-radio input {\n\tposition: absolute;\n\tleft: .466em;\n\ttop: 50%;\n\twidth: 22px;\n\theight: 22px;\n\tmargin: -11px 0 0 0;\n\toutline: 0 !important;\n\tz-index: 1;\n}\n.ui-controlgroup-horizontal .ui-checkbox input,\n.ui-controlgroup-horizontal .ui-radio input {\n\tleft: 50%;\n\tmargin-left: -9px;\n}\n.ui-checkbox input:disabled,\n.ui-radio input:disabled {\n\tposition: absolute !important;\n\theight: 1px;\n\twidth: 1px;\n\toverflow: hidden;\n\tclip: rect(1px,1px,1px,1px);\n}\n.ui-select {\n\tmargin-top: .5em;\n\tmargin-bottom: .5em; /* no shorthand for margin because it would override margin-right for inline selects */\n\tposition: relative;\n}\n.ui-select > select {\n\tposition: absolute !important;\n\theight: 1px;\n\twidth: 1px;\n\toverflow: hidden;\n\tclip: rect(1px,1px,1px,1px);\n}\n.ui-select .ui-btn {\n\tmargin: 0;\n\topacity: 1; /* Fixes #2588: When Windows Phone 7.5 (Mango) tries to calculate a numeric opacity for a select (including \"inherit\") without explicitly specifying an opacity on the parent to give it context, a bug appears where clicking elsewhere on the page after opening the select will open the select again. */\n}\n.ui-select .ui-btn select {\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n\twidth: 100%;\n\tmin-height: 1.5em;\n\tmin-height: 100%;\n\theight: 3em;\n\tmax-height: 100%;\n\toutline: 0;\n\t-webkit-border-radius: inherit;\n\tborder-radius: inherit;\t\n\t-webkit-appearance: none;\n\t-moz-appearance: none;\n\tcursor: pointer;\n\tfilter: Alpha(Opacity=0);\n\topacity: 0;\n\tz-index: 2;\n}\n@-moz-document url-prefix() {\n\t.ui-select .ui-btn select {\n\t\topacity: 0.0001;\n\t}\n}\n/* Display none because of issues with IE/WP's filter alpha opacity */\n.ui-select .ui-state-disabled select {\n\tdisplay: none;\n}\n/* Because we add all classes of the select and option elements to the span... */ \n.ui-select span.ui-state-disabled {\n\tfilter: Alpha(Opacity=100);\n\topacity: 1;\n}\n.ui-select .ui-btn.ui-select-nativeonly {\n\tborder-radius: 0;\n\tborder: 0;\n}\n.ui-select .ui-btn.ui-select-nativeonly select {\n\topacity: 1;\n\ttext-indent: 0;\n\tdisplay: block;\n}\n/* ui-li-count is styled in the listview CSS. We set padding and offset here because select supports icon position while listview doesn't. */\n.ui-select .ui-li-has-count.ui-btn {\n\tpadding-right: 2.8125em;\n}\n.ui-select .ui-li-has-count.ui-btn-icon-right {\n\tpadding-right: 4.6875em;\n}\n.ui-select .ui-btn-icon-right .ui-li-count {\n\tright: 3.2em;\n}\n/* We set the rules for the span as well to fix an issue on Chrome with text-overflow ellipsis for the button in combination with text-align center. */\n.ui-select .ui-btn > span:not(.ui-li-count) {\n\tdisplay: block;\n\ttext-overflow: ellipsis;\n\toverflow: hidden !important;\n\twhite-space: nowrap;\n}\n.ui-selectmenu.ui-popup {\n\tmin-width: 11em;\n}\n.ui-selectmenu .ui-dialog-contain {\n\toverflow: hidden;\n}\n.ui-selectmenu .ui-header {\n\tmargin: 0;\n\tpadding: 0;\n\tborder-width: 0;\n}\n.ui-selectmenu.ui-dialog .ui-header {\n\tz-index: 1;\n\tposition: relative;\n}\n.ui-selectmenu.ui-popup .ui-header {\n\t-webkit-border-bottom-right-radius: 0;\n\tborder-bottom-right-radius: 0;\n\t-webkit-border-bottom-left-radius: 0;\n\tborder-bottom-left-radius: 0;\n}\n/* when no placeholder is defined in a multiple select, the header height doesn't even extend past the close button.  this shim's content in there */\n.ui-selectmenu.ui-popup .ui-header h1:after {\n\tcontent: '.';\n\tvisibility: hidden;\n}\n.ui-selectmenu .ui-header .ui-title {\n\tmargin: 0 2.875em;\n}\n.ui-selectmenu.ui-dialog .ui-content {\n\toverflow: visible;\n\tz-index: 1;\n}\n.ui-selectmenu .ui-selectmenu-list {\n\tmargin: 0;\n\t-webkit-border-radius: inherit;\n\tborder-radius: inherit;\t\n}\n.ui-header:not(.ui-screen-hidden) + .ui-selectmenu-list {\n\t-webkit-border-top-right-radius: 0;\n\tborder-top-right-radius: 0;\n\t-webkit-border-top-left-radius: 0;\n\tborder-top-left-radius: 0;\n}\n.ui-header.ui-screen-hidden + .ui-selectmenu-list li.ui-first-child .ui-btn {\n\tborder-top-width: 0;\n}\n.ui-selectmenu .ui-selectmenu-list li.ui-last-child .ui-btn {\n\tborder-bottom-width: 0;\n}\n.ui-selectmenu .ui-btn.ui-li-divider {\n\tcursor: default;\n}\n.ui-selectmenu .ui-selectmenu-placeholder {\n\tdisplay: none;\n}\n.ui-listview,\n.ui-listview > li {\n\tmargin: 0;\n\tpadding: 0;\n\tlist-style: none;\n}\n.ui-content .ui-listview,\n.ui-panel-inner > .ui-listview {\n\tmargin: -1em;\n}\n.ui-content .ui-listview-inset,\n.ui-panel-inner > .ui-listview-inset {\n\tmargin: 1em 0;\n}\n.ui-collapsible-content > .ui-listview {\n\tmargin: -.5em -1em;\n}\n.ui-collapsible-content > .ui-listview-inset {\n\tmargin: .5em 0;\n}\n.ui-listview > li {\n\tdisplay: block;\n\tposition: relative;\n\toverflow: visible;\n}\n.ui-listview > .ui-li-static,\n.ui-listview > .ui-li-divider,\n.ui-listview > li > a.ui-btn {\n\tmargin: 0;\n\tdisplay: block;\n\tposition: relative;\n\ttext-align: left;\n\ttext-overflow: ellipsis;\n\toverflow: hidden;\n\twhite-space: nowrap;\n}\n.ui-listview > li > .ui-btn:focus {\n\tz-index: 1;\n}\n.ui-listview > .ui-li-static,\n.ui-listview > .ui-li-divider,\n.ui-listview > li > a.ui-btn {\n\tborder-width: 1px 0 0 0;\n\tborder-style: solid;\n}\n.ui-listview-inset > .ui-li-static,\n.ui-listview-inset > .ui-li-divider,\n.ui-listview-inset > li > a.ui-btn {\n\tborder-right-width: 1px;\n\tborder-left-width: 1px;\n}\n.ui-listview > .ui-li-static.ui-last-child,\n.ui-listview > .ui-li-divider.ui-last-child,\n.ui-listview > li.ui-last-child > a.ui-btn {\n\tborder-bottom-width: 1px;\n}\n.ui-collapsible-content > .ui-listview:not(.ui-listview-inset) > li.ui-first-child,\n.ui-collapsible-content > .ui-listview:not(.ui-listview-inset) > li.ui-first-child > a.ui-btn {\n\tborder-top-width: 0;\n}\n.ui-collapsible-themed-content .ui-listview:not(.ui-listview-inset) > li.ui-last-child,\n.ui-collapsible-themed-content .ui-listview:not(.ui-listview-inset) > li.ui-last-child > a.ui-btn {\n\tborder-bottom-width: 0;\n}\n.ui-listview > li.ui-first-child,\n.ui-listview > li.ui-first-child > a.ui-btn {\n\t-webkit-border-top-right-radius: inherit;\t\n\tborder-top-right-radius: inherit;\n\t-webkit-border-top-left-radius: inherit;\n\tborder-top-left-radius: inherit;\n}\n.ui-listview > li.ui-last-child,\n.ui-listview > li.ui-last-child > a.ui-btn {\n\t-webkit-border-bottom-right-radius: inherit;\n\tborder-bottom-right-radius: inherit;\n\t-webkit-border-bottom-left-radius: inherit;\n\tborder-bottom-left-radius: inherit;\n}\n.ui-listview > li.ui-li-has-alt > a.ui-btn {\n\t-webkit-border-top-right-radius: 0;\n\tborder-top-right-radius: 0;\n\t-webkit-border-bottom-right-radius: 0;\n\tborder-bottom-right-radius: 0;\n}\n.ui-listview > li.ui-first-child > a.ui-btn + a.ui-btn {\n\t-webkit-border-top-left-radius: 0;\t\n\tborder-top-left-radius: 0;\n\t-webkit-border-top-right-radius: inherit;\n\tborder-top-right-radius: inherit;\n}\n.ui-listview > li.ui-last-child > a.ui-btn + a.ui-btn {\n\t-webkit-border-bottom-left-radius: 0;\n\tborder-bottom-left-radius: 0;\n\t-webkit-border-bottom-right-radius: inherit;\n\tborder-bottom-right-radius: inherit;\n}\n.ui-listview > li.ui-first-child img:first-child:not(.ui-li-icon) {\n\t-webkit-border-top-left-radius: inherit;\n\tborder-top-left-radius: inherit;\t\n}\n.ui-listview > li.ui-last-child img:first-child:not(.ui-li-icon) {\n\t-webkit-border-bottom-left-radius: inherit;\n\tborder-bottom-left-radius: inherit;\t\n}\n.ui-collapsible-content > .ui-listview:not(.ui-listview-inset) {\n\t-webkit-border-radius: inherit;\n\tborder-radius: inherit;\t\n}\n.ui-listview > .ui-li-static {\n\tpadding: .7em 1em;\n}\n.ui-listview > .ui-li-divider {\n\tpadding: .5em 1.143em;\n\tfont-size: 14px;\n\tfont-weight: bold;\n\tcursor: default;\n\toutline: 0; /* Dividers in custom selectmenus have tabindex */\n}\n.ui-listview > .ui-li-has-count > .ui-btn,\n.ui-listview > .ui-li-static.ui-li-has-count,\n.ui-listview > .ui-li-divider.ui-li-has-count {\n\tpadding-right: 2.8125em;\n}\n.ui-listview > .ui-li-has-count > .ui-btn-icon-right {\n\tpadding-right: 4.6875em;\n}\n.ui-listview > .ui-li-has-thumb > .ui-btn,\n.ui-listview > .ui-li-static.ui-li-has-thumb {\n\tmin-height: 3.625em;\n\tpadding-left: 6.25em;\n}\n/* ui-li-has-icon deprecated in 1.4. TODO: remove in 1.5 */\n.ui-listview > .ui-li-has-icon > .ui-btn,\n.ui-listview > .ui-li-static.ui-li-has-icon {\n\tmin-height: 1.25em;\n\tpadding-left: 2.5em;\n}\n/* Used by both listview and custom multiple select button */\n.ui-li-count {\n\tposition: absolute;\n\tfont-size: 12.5px;\n\tfont-weight: bold;\n\ttext-align: center;\n\tborder-width: 1px;\n\tborder-style: solid;\n\tpadding: 0 .48em;\n\tline-height: 1.6em;\n\tmin-height: 1.6em;\n\tmin-width: .64em;\n\tright: .8em;\n\ttop: 50%;\n\tmargin-top: -.88em;\n}\n.ui-listview .ui-btn-icon-right .ui-li-count {\n\tright: 3.2em;\n}\n.ui-listview .ui-li-has-thumb > img:first-child,\n.ui-listview .ui-li-has-thumb > .ui-btn > img:first-child,\n.ui-listview .ui-li-has-thumb .ui-li-thumb {\n\tposition: absolute;\n\tleft: 0;\n\ttop: 0;\n\tmax-height: 5em;\n\tmax-width: 5em;\n}\n/* ui-li-has-icon deprecated in 1.4. TODO: remove in 1.5 */\n.ui-listview > .ui-li-has-icon > img:first-child,\n.ui-listview > .ui-li-has-icon > .ui-btn > img:first-child {\n\tposition: absolute;\n\tleft: .625em;\n\ttop: .9em;\n\tmax-height: 1em;\n\tmax-width: 1em;\n}\n.ui-listview > li h1,\n.ui-listview > li h2,\n.ui-listview > li h3,\n.ui-listview > li h4,\n.ui-listview > li h5,\n.ui-listview > li h6 {\n\tfont-size: 1em;\n\tfont-weight: bold;\n\tdisplay: block;\n\tmargin: .45em 0;\n\ttext-overflow: ellipsis;\n\toverflow: hidden;\n\twhite-space: nowrap;\n}\n.ui-listview > li p {\n\tfont-size: .75em;\n\tfont-weight: normal;\n\tdisplay: block;\n\tmargin: .6em 0;\n\ttext-overflow: ellipsis;\n\toverflow: hidden;\n\twhite-space: nowrap;\n}\n.ui-listview .ui-li-aside {\n\tposition: absolute;\n\ttop: 1em;\n\tright: 3.333em;\n\tmargin: 0;\n\ttext-align: right;\n}\n.ui-listview > li.ui-li-has-alt > .ui-btn {\n\tmargin-right: 2.5em;\n\tborder-right-width: 0;\n}\n.ui-listview > li.ui-li-has-alt > .ui-btn + .ui-btn {\n\tposition: absolute;\n\twidth: 2.5em;\n\theight: 100%;\n\tmin-height: auto;\n\t-webkit-box-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\tbox-sizing: border-box;\n\tborder-left-width: 1px;\n\ttop: 0;\n\tright: 0;\n\tmargin: 0;\n\tpadding: 0;\n\tz-index: 2;\n}\n.ui-listview-inset > li.ui-li-has-alt > .ui-btn + .ui-btn {\n\tborder-right-width: 1px;\n}\n.ui-listview > li.ui-li-has-alt > .ui-btn + .ui-btn:focus {\n\tz-index: 3;\n}\nol.ui-listview,\nol.ui-listview > .ui-li-divider {\n\tcounter-reset: listnumbering;\n}\nol.ui-listview > li > .ui-btn,\nol.ui-listview > li.ui-li-static {\n\tvertical-align: middle;\n}\nol.ui-listview > li > .ui-btn:first-child:before,\nol.ui-listview > li.ui-li-static:before,\nol.ui-listview > li.ui-field-contain > label:before,\nol.ui-listview > li.ui-field-contain > .ui-controlgroup-label:before {\n\tdisplay: inline-block;\n\tfont-size: .9em;\n\tfont-weight: normal;\n\tpadding-right: .3em;\n\tmin-width: 1.4em;\n\tline-height: 1.5;\n\tvertical-align: middle;\n\tcounter-increment: listnumbering;\n\tcontent: counter(listnumbering) \".\";\n}\nol.ui-listview > li.ui-field-contain:before {\n\tcontent: none;\n\tdisplay: none;\n}\nol.ui-listview > li h1:first-child,\nol.ui-listview > li h2:first-child,\nol.ui-listview > li h3:first-child,\nol.ui-listview > li h4:first-child,\nol.ui-listview > li h5:first-child,\nol.ui-listview > li h6:first-child,\nol.ui-listview > li p:first-child,\nol.ui-listview > li img:first-child + * {\n\tdisplay: inline-block;\n\tvertical-align: middle;\n}\nol.ui-listview > li h1:first-child ~ *,\nol.ui-listview > li h2:first-child ~ *,\nol.ui-listview > li h3:first-child ~ *,\nol.ui-listview > li h4:first-child ~ *,\nol.ui-listview > li h5:first-child ~ *,\nol.ui-listview > li h6:first-child ~ *,\nol.ui-listview > li p:first-child ~ *,\nol.ui-listview > li img:first-child + * ~ * {\n\tmargin-top: 0;\n\ttext-indent: 2.04em; /* (1.4em + .3em) * .9em / .75em */\n}\nhtml .ui-filterable + .ui-listview,\nhtml .ui-filterable.ui-listview {\n\tmargin-top: .5em;\n}\n.ui-collapsible-content > form.ui-filterable {\n\tmargin-top: -.5em;\n}\n.ui-collapsible-content > .ui-input-search.ui-filterable {\n\tmargin-top: 0;\n}\n.ui-collapsible-content > .ui-filterable + .ui-listview:not(.ui-listview-inset) > li.ui-first-child,\n.ui-collapsible-content > .ui-filterable + .ui-listview:not(.ui-listview-inset) > li.ui-first-child > a.ui-btn,\n.ui-collapsible-content > .ui-filterable.ui-listview:not(.ui-listview-inset) > li.ui-first-child,\n.ui-collapsible-content > .ui-filterable.ui-listview:not(.ui-listview-inset) > li.ui-first-child > a.ui-btn {\n\tborder-top-width: 1px;\n}\ndiv.ui-slider {\n\theight: 30px;\n\tmargin: .5em 0;\n\tpadding: 0;\n\t-ms-touch-action: pan-y pinch-zoom double-tap-zoom;\n}\ndiv.ui-slider:before,\ndiv.ui-slider:after {\n\tcontent: \"\";\n\tdisplay: table;\n}\ndiv.ui-slider:after {\n\tclear: both;\n}\ninput.ui-slider-input {\n\tdisplay: block;\n\tfloat: left;\n\tfont-size: 14px;\n\tfont-weight: bold;\n\tmargin: 0;\n\tpadding: 4px;\n\twidth: 40px;\n\theight: 20px;\n\tline-height: 20px;\n\tborder-width: 1px;\n\tborder-style: solid;\n\toutline: 0;\n\ttext-align: center;\n\tvertical-align: text-bottom;\n\t-webkit-appearance: none;\n\t-moz-appearance: none;\n\tappearance: none;\n\t-webkit-box-sizing: content-box;\n\t-moz-box-sizing: content-box;\n\tbox-sizing: content-box;\n}\n.ui-slider-input::-webkit-outer-spin-button,\n.ui-slider-input::-webkit-inner-spin-button {\n\t-webkit-appearance: none;\n\tmargin: 0;\n}\n.ui-slider-track {\n\tposition: relative;\n\toverflow: visible;\n\tborder-width: 1px;\n\tborder-style: solid;\n\theight: 15px;\n\tmargin: 0 15px 0 68px;\n\ttop: 6px;\n}\n.ui-slider-track.ui-mini {\n\theight: 12px;\n\ttop: 8px;\n}\n.ui-slider-track .ui-slider-bg {\n\theight: 100%;\n}\n/* High level of specificity to override button margins in grids */\n.ui-slider-track .ui-btn.ui-slider-handle {\n\tposition: absolute;\n\tz-index: 1;\n\ttop: 50%;\n\twidth: 28px;\n\theight: 28px;\n\tmargin: -15px 0 0 -15px;\n\toutline: 0;\n\tpadding: 0;\n}\n.ui-slider-track.ui-mini .ui-slider-handle {\n\theight: 14px;\n\twidth: 14px;\n\tmargin: -8px 0 0 -8px;\n}\nselect.ui-slider-switch {\n\tposition: absolute !important;\n\theight: 1px;\n\twidth: 1px;\n\toverflow: hidden;\n\tclip: rect(1px,1px,1px,1px);\n}\ndiv.ui-slider-switch {\n\tdisplay: inline-block;\n\theight: 32px;\n\twidth: 5.8em;\n\ttop: 0;\n}\n/* reset the clearfix */\ndiv.ui-slider-switch:before,\ndiv.ui-slider-switch:after {\n\tdisplay: none;\n\tclear: none;\n}\ndiv.ui-slider-switch.ui-mini {\n\theight: 29px;\n\ttop: 0;\n}\n.ui-slider-inneroffset {\n\tmargin: 0 16px;\n\tposition: relative;\n\tz-index: 1;\n}\n.ui-slider-switch.ui-mini .ui-slider-inneroffset {\n\tmargin: 0 15px 0 14px;\n}\n.ui-slider-switch .ui-btn.ui-slider-handle {\n\tmargin: 1px 0 0 -15px;\n}\n.ui-slider-switch.ui-mini .ui-slider-handle {\n\twidth: 25px;\n\theight: 25px;\n\tmargin: 1px 0 0 -13px;\n\tpadding: 0;\n}\n.ui-slider-handle-snapping {\n\t-webkit-transition: left 70ms linear;\n\t-moz-transition: left 70ms linear;\n\ttransition: left 70ms linear;\n}\n.ui-slider-switch .ui-slider-label {\n\tposition: absolute;\n\ttext-align: center;\n\twidth: 100%;\n\toverflow: hidden;\n\tfont-size: 16px;\n\ttop: 0;\n\tline-height: 2;\n\tmin-height: 100%;\n\twhite-space: nowrap;\n\tcursor: pointer;\n}\n.ui-slider-switch.ui-mini .ui-slider-label {\n\tfont-size: 14px;\n}\n.ui-slider-switch .ui-slider-label-a {\n\tz-index: 1;\n\tleft: 0;\n\ttext-indent: -1.5em;\n}\n.ui-slider-switch .ui-slider-label-b {\n\tz-index: 0;\n\tright: 0;\n\ttext-indent: 1.5em;\n}\n/* The corner radii for ui-slider-switch/track can be specified in theme CSS. The bg and handle inherits. */\n.ui-slider-track .ui-slider-bg,\n.ui-slider-switch .ui-slider-label,\n.ui-slider-switch .ui-slider-inneroffset,\n.ui-slider-handle {\n\t-webkit-border-radius: inherit;\n\tborder-radius: inherit;\n}\n.ui-field-contain div.ui-slider-switch {\n\tmargin: 0;\n}\n/* ui-hide-label deprecated in 1.4. TODO: Remove in 1.5 */\n.ui-field-contain div.ui-slider-switch,\n.ui-field-contain.ui-hide-label div.ui-slider-switch,\nhtml .ui-popup .ui-field-contain div.ui-slider-switch {\n\tdisplay: inline-block;\n\twidth: 5.8em;\n}\n/* slider tooltip\n-----------------------------------------------------------------------------------------------------------*/\n.ui-slider-popup {\n\twidth: 64px;\n\theight: 64px;\n\tfont-size: 36px;\n\tpadding-top: 14px;\n\topacity: 0.8;\n}\n.ui-slider-popup {\n\tposition: absolute !important;\n\ttext-align: center;\n\tz-index: 100;\n}\n.ui-slider-track .ui-btn.ui-slider-handle {\n\tfont-size: .9em;\n\tline-height: 30px;\n}\n.ui-rangeslider {\n\tmargin: .5em 0;\n}\n.ui-rangeslider:before,\n.ui-rangeslider:after {\n\tcontent: \"\";\n\tdisplay: table;\n}\n.ui-rangeslider:after {\n\tclear: both;\n}\n.ui-rangeslider .ui-slider-input.ui-rangeslider-last {\n\tfloat: right;\n}\n.ui-rangeslider .ui-rangeslider-sliders {\n\tposition: relative;\n\toverflow: visible;\n\theight: 30px;\n\tmargin: 0 68px;\n}\n.ui-rangeslider .ui-rangeslider-sliders .ui-slider-track {\n\tposition: absolute;\n\ttop: 6px;\n\tright: 0;\n\tleft: 0;\n\tmargin: 0;\n}\n.ui-rangeslider.ui-mini .ui-rangeslider-sliders .ui-slider-track {\n\ttop: 8px;\n}\n.ui-rangeslider .ui-slider-track:first-child .ui-slider-bg {\n\tdisplay: none;\n}\n.ui-rangeslider .ui-rangeslider-sliders .ui-slider-track:first-child {\n\tbackground-color: transparent;\n\tbackground: none;\n\tborder-width: 0;\n\theight: 0;\n}\n/* this makes ie6 and ie7 set height to 0 to fix z-index problem */\nhtml >/**/body .ui-rangeslider .ui-rangeslider-sliders .ui-slider-track:first-child {\n\theight: 15px;\n\tborder-width: 1px;\n}\nhtml >/**/body .ui-rangeslider.ui-mini .ui-rangeslider-sliders .ui-slider-track:first-child {\n\theight: 12px;\n}\n/* Hide the second label (the first is moved outside the div) */\ndiv.ui-rangeslider label {\n\tposition: absolute !important;\n\theight: 1px;\n\twidth: 1px;\n\toverflow: hidden;\n\tclip: rect(1px,1px,1px,1px);\n}\n.ui-field-contain .ui-rangeslider input.ui-slider-input,\n.ui-field-contain .ui-rangeslider.ui-mini input.ui-slider-input,\n.ui-field-contain .ui-rangeslider .ui-rangeslider-sliders,\n.ui-field-contain .ui-rangeslider.ui-mini .ui-rangeslider-sliders {\n\tmargin-top: 0;\n\tmargin-bottom: 0;\n}\n.ui-input-text,\n.ui-input-search {\n\tmargin: .5em 0;\n\tborder-width: 1px;\n\tborder-style: solid;\n}\n.ui-mini {\n\tmargin: .446em;\n}\n.ui-input-text input,\n.ui-input-search input,\ntextarea.ui-input-text {\n\tpadding: .4em;\n\tline-height: 1.4em;\n\tdisplay: block;\n\twidth: 100%;\n\t-webkit-box-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\tbox-sizing: border-box;\n\toutline: 0;\n}\n.ui-input-text input,\n.ui-input-search input {\n\tmargin: 0;\n\tmin-height: 2.2em;\n\ttext-align: left; /* Opera aligns type=\"date\" right by default */\n\tborder: 0;\n\tbackground: transparent none;\n\t-webkit-appearance: none;\n\t-webkit-border-radius: inherit;\n\tborder-radius: inherit;\n}\ntextarea.ui-input-text {\n\toverflow: auto;\n\tresize: vertical;\n}\n.ui-mini .ui-input-text input,\n.ui-mini .ui-input-search input,\n.ui-input-text.ui-mini input,\n.ui-input-search.ui-mini input,\n.ui-mini textarea.ui-input-text,\ntextarea.ui-mini {\n\tfont-size: 14px;\n}\n/* Same margin for mini textareas as other mini sized widgets (12.5/14 * 0.5em) */\n.ui-mini textarea.ui-input-text,\ntextarea.ui-mini {\n\tmargin: .446em 0;\n}\n.ui-input-has-clear,\n.ui-input-search {\n\tposition: relative;\n}\n/* Padding on the div instead of input because of browser spinners etc. */\n.ui-input-has-clear {\n\tpadding-right: 2.375em;\n}\n.ui-mini.ui-input-has-clear {\n\tpadding-right: 2.923em;\n}\n.ui-input-has-clear input {\n\tpadding-right: 0;\n\t/* Autofill on Chrome has bg color so we unset corners right as well. */\n\t-webkit-border-top-right-radius: 0;\n\tborder-top-right-radius: 0;\n\t-webkit-border-bottom-right-radius: 0;\n\tborder-bottom-right-radius: 0;\n}\n/* Search icon */\n.ui-input-search input {\n\tpadding-left: 1.75em;\n}\n.ui-input-search:after {\n\tposition: absolute;\n\tleft: .3125em;\n\ttop: 50%;\n\tmargin-top: -7px;\n\tcontent: \"\";\n\tbackground-position: center center;\n\tbackground-repeat: no-repeat;\n\twidth: 14px;\n\theight: 14px;\n\tfilter: Alpha(Opacity=50);\n\topacity: .5;\n}\n.ui-input-search.ui-input-has-clear .ui-btn.ui-input-clear,\n.ui-input-text.ui-input-has-clear .ui-btn.ui-input-clear {\n\tposition: absolute;\n\tright: 0;\n\ttop: 50%;\n\tmargin: -14px .3125em 0;\n\tborder: 0;\n\tbackground-color: transparent;\n}\n.ui-input-search .ui-input-clear-hidden,\n.ui-input-text .ui-input-clear-hidden {\n\tdisplay: none;\n}\n/* Resolves issue #5166: Added to support issue introduced in Firefox 15. We can likely remove this in the future. */\n.ui-input-text input::-moz-placeholder,\n.ui-input-search input::-moz-placeholder,\ntextarea.ui-input-text::-moz-placeholder {\n\tcolor: #aaa;\n}\n/* Same for IE10 */\n.ui-input-text input:-ms-input-placeholder,\n.ui-input-search input:-ms-input-placeholder,\ntextarea.ui-input-text:-ms-input-placeholder {\n\tcolor: #aaa;\n}\n/* Resolves issue #5131: Width of textinput depends on its type,\nfor Android 4.1 */\n.ui-input-text input[type=number]::-webkit-outer-spin-button {\n\tmargin: 0;\n}\n/* Resolves issue #5756: Textinput in IE10 has a default clear button */\n.ui-input-text input::-ms-clear,\n.ui-input-search input::-ms-clear {\n\tdisplay: none;\n}\n.ui-input-text input:focus,\n.ui-input-search input:focus {\n\t-webkit-box-shadow: none;\n\t-moz-box-shadow: none;\n\tbox-shadow: none;\n}\ntextarea.ui-input-text.ui-textinput-autogrow {\n\toverflow: hidden;\n}\n.ui-textinput-autogrow-resize {\n\t-webkit-transition: height 0.25s;\n\t-o-transition: height 0.25s;\n\t-moz-transition: height 0.25s;\n\ttransition: height 0.25s;\n}\n.ui-flipswitch {\n\tdisplay: inline-block;\n\tvertical-align: middle;\n\twidth: 5.875em; /* Override this and padding-left in next rule if you use labels other than \"on/off\" and need more space */\n\theight: 1.875em;\n\tborder-width: 1px;\n\tborder-style: solid;\n\tmargin: .5em 0;\n\toverflow: hidden;\n\t-webkit-transition-property: padding, width, background-color, color, border-color;\n\t-moz-transition-property: padding, width, background-color, color, border-color;\n\t-o-transition-property: padding, width, background-color, color, border-color;\n\ttransition-property: padding, width, background-color, color, border-color;\n\t-webkit-transition-duration: 100ms;\n\t-moz-transition-duration: 100ms;\n\t-o-transition-duration: 100ms;\n\ttransition-duration: 100ms;\n\t-webkit-touch-callout: none;\n\t-webkit-user-select: none;\n\t-moz-user-select: none;\n\t-ms-user-select: none;\n\tuser-select: none;\n\tcursor: pointer;\n}\n.ui-flipswitch.ui-flipswitch-active {\n\tpadding-left: 4em;  /* Override this and width in previous rule if you use labels other than \"on/off\" and need more space */\n\twidth: 1.875em;\n}\n.ui-flipswitch-input {\n\tposition: absolute;\n\theight: 1px;\n\twidth: 1px;\n\tmargin: -1px;\n\toverflow: hidden;\n\tclip: rect(1px,1px,1px,1px);\n\tborder: 0;\n\toutline: 0;\n\tfilter: Alpha(Opacity=0);\n\topacity: 0;\n}\n.ui-flipswitch .ui-btn.ui-flipswitch-on,\n.ui-flipswitch .ui-flipswitch-off {\n\tfloat: left;\n\theight: 1.75em;\n\tmargin: .0625em;\n\tline-height: 1.65em;\n}\n.ui-flipswitch .ui-btn.ui-flipswitch-on {\n\twidth: 1.75em;\n\tpadding: 0;\n\ttext-indent: -2.6em; /* Override this to center text if you use a label other than \"on\" */\n\ttext-align: left;\n\tborder-width: 1px;\n\tborder-style: solid;\n\t-webkit-box-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\tbox-sizing: border-box;\n\tborder-radius: inherit;\n\toverflow: visible;\n\tcolor: inherit;\n\ttext-shadow: inherit;\n}\n.ui-flipswitch .ui-flipswitch-off {\n\tpadding: 1px;\n\ttext-indent: 1em; /* Override this to center text if you use a label other than \"off\" */\n}\n/* Override field container CSS to prevent the flipswitch from becomming full width */\nhtml .ui-field-contain > label + .ui-flipswitch,\nhtml .ui-popup .ui-field-contain > label + .ui-flipswitch {\n\tdisplay: inline-block;\n\twidth: 5.875em; /* If you override the width for .ui-flipswitch you should repeat the same value here */\n\t-webkit-box-sizing: content-box;\n\t-moz-box-sizing: content-box;\n\tbox-sizing: content-box;\n}\n.ui-field-contain .ui-flipswitch.ui-flipswitch-active,\n.ui-popup .ui-field-contain .ui-flipswitch.ui-flipswitch-active {\n\twidth: 1.875em;\n}\n.ui-table {\n\tborder: 0;\n\tborder-collapse: collapse;\n\tpadding: 0;\n\twidth: 100%;\n}\n.ui-table th,\n.ui-table td {\n\tline-height: 1.5em;\n\ttext-align: left;\n\tpadding: .4em .5em;\n\tvertical-align:top;\n}\n.ui-table th .ui-btn,\n.ui-table td .ui-btn {\n\tline-height: normal;\n}\n.ui-table th {\n\tfont-weight: bold;\n}\n.ui-table caption {\n\ttext-align: left;\n\tmargin-bottom: 1.4em;\n\topacity: .5;\n}\n/*\n Styles for the table columntoggle mode\n*/\n.ui-table-columntoggle-btn {\n\tfloat: right;\n\tmargin-bottom: .8em;\n}\n/* Remove top/bottom margins around the fieldcontain on check list */\n.ui-table-columntoggle-popup fieldset {\n\tmargin:0;\n}\n.ui-table-columntoggle {\n\tclear: both;\n}\n/* Hide all prioritized columns by default */\n@media only all {\n\tth.ui-table-priority-6,\n\ttd.ui-table-priority-6,\n\tth.ui-table-priority-5,\n\ttd.ui-table-priority-5,\n\tth.ui-table-priority-4,\n\ttd.ui-table-priority-4,\n\tth.ui-table-priority-3,\n\ttd.ui-table-priority-3,\n\tth.ui-table-priority-2,\n\ttd.ui-table-priority-2,\n\tth.ui-table-priority-1,\n\ttd.ui-table-priority-1 {\n\t\tdisplay: none;\n\t}\n}\n/* Preset breakpoints if \".ui-responsive\" class added to table */\n/* Show priority 1 at 320px (20em x 16px) */\n@media screen and (min-width: 20em) {\n\t.ui-table-columntoggle.ui-responsive th.ui-table-priority-1,\n\t.ui-table-columntoggle.ui-responsive td.ui-table-priority-1 {\n\t\tdisplay: table-cell;\n\t}\n}\n/* Show priority 2 at 480px (30em x 16px) */\n@media screen and (min-width: 30em) {\n\t.ui-table-columntoggle.ui-responsive th.ui-table-priority-2,\n\t.ui-table-columntoggle.ui-responsive td.ui-table-priority-2 {\n\t\tdisplay: table-cell;\n\t}\n}\n/* Show priority 3 at 640px (40em x 16px) */\n@media screen and (min-width: 40em) {\n\t.ui-table-columntoggle.ui-responsive th.ui-table-priority-3,\n\t.ui-table-columntoggle.ui-responsive td.ui-table-priority-3 {\n\t\tdisplay: table-cell;\n\t}\n}\n/* Show priority 4 at 800px (50em x 16px) */\n@media screen and (min-width: 50em) {\n\t.ui-table-columntoggle.ui-responsive th.ui-table-priority-4,\n\t.ui-table-columntoggle.ui-responsive td.ui-table-priority-4 {\n\t\tdisplay: table-cell;\n\t}\n}\n/* Show priority 5 at 960px (60em x 16px) */\n@media screen and (min-width: 60em) {\n\t.ui-table-columntoggle.ui-responsive th.ui-table-priority-5,\n\t.ui-table-columntoggle.ui-responsive td.ui-table-priority-5 {\n\t\tdisplay: table-cell;\n\t}\n}\n/* Show priority 6 at 1,120px (70em x 16px) */\n@media screen and (min-width: 70em) {\n\t.ui-table-columntoggle.ui-responsive th.ui-table-priority-6,\n\t.ui-table-columntoggle.ui-responsive td.ui-table-priority-6 {\n\t\tdisplay: table-cell;\n\t}\n}\n/* Unchecked manually: Always hide */\n.ui-table-columntoggle th.ui-table-cell-hidden,\n.ui-table-columntoggle td.ui-table-cell-hidden,\n.ui-table-columntoggle.ui-responsive th.ui-table-cell-hidden,\n.ui-table-columntoggle.ui-responsive td.ui-table-cell-hidden {\n\tdisplay: none;\n}\n/* Checked manually: Always show */\n.ui-table-columntoggle th.ui-table-cell-visible,\n.ui-table-columntoggle td.ui-table-cell-visible,\n.ui-table-columntoggle.ui-responsive th.ui-table-cell-visible,\n.ui-table-columntoggle.ui-responsive td.ui-table-cell-visible {\n\tdisplay: table-cell;\n}\n/*\n Styles for the table columntoggle mode\n*/\n.ui-table-reflow td .ui-table-cell-label,\n.ui-table-reflow th .ui-table-cell-label { \n\tdisplay: none;\n}\n/* Mobile first styles: Begin with the stacked presentation at narrow widths */ \n@media only all {\n\t/* Hide the table headers */ \n\t.ui-table-reflow thead td, \n\t.ui-table-reflow thead th {\n\t\tdisplay: none;\n\t}\n\t/* Show the table cells as a block level element */ \n\t.ui-table-reflow td,\n\t.ui-table-reflow th { \n\t\ttext-align: left;\n\t\tdisplay: block;\n\t}\n\t/* Add a fair amount of top margin to visually separate each row when stacked */  \n\t.ui-table-reflow tbody th {\n\t\tmargin-top: 3em;\n\t}\n\t/* Make the label elements a percentage width */ \n\t.ui-table-reflow td .ui-table-cell-label,\n\t.ui-table-reflow th .ui-table-cell-label { \n\t\tpadding: .4em; \n\t\tmin-width: 30%; \n\t\tdisplay: inline-block;\n\t\tmargin: -.4em 1em -.4em -.4em;\n\t}\n\t/* For grouped headers, have a different style to visually separate the levels by classing the first label in each col group */ \n\t.ui-table-reflow th .ui-table-cell-label-top,\n\t.ui-table-reflow td .ui-table-cell-label-top {\n\t\tdisplay: block;\n\t\tpadding: .4em 0;\n\t\tmargin: .4em 0;\n\t\ttext-transform: uppercase;\n\t\tfont-size: .9em;\n\t\tfont-weight: normal;\n\t}\n}\n/* Breakpoint to show as a standard table at 560px (35em x 16px) or wider */ \n@media ( min-width: 35em ) {\n\t/* Show the table header rows */ \n\t.ui-table-reflow.ui-responsive td,\n\t.ui-table-reflow.ui-responsive th,\n\t.ui-table-reflow.ui-responsive tbody th,\n\t.ui-table-reflow.ui-responsive tbody td,\n\t.ui-table-reflow.ui-responsive thead td,\n\t.ui-table-reflow.ui-responsive thead th {\n\t\tdisplay: table-cell;\n\t\tmargin: 0;\n\t}\n\t/* Hide the labels in each cell */ \n\t.ui-table-reflow.ui-responsive td .ui-table-cell-label,\n\t.ui-table-reflow.ui-responsive th .ui-table-cell-label { \n\t\tdisplay: none;\n\t}\n}\n/* Hack to make IE9 and WP7.5 treat cells like block level elements, scoped to ui-responsive class */ \n/* Applied in a max-width media query up to the table layout breakpoint so we don't need to negate this*/ \n@media ( max-width: 35em ) {\n\t.ui-table-reflow.ui-responsive td,\n\t.ui-table-reflow.ui-responsive th {\n\t\twidth: 100%;\n\t\t-webkit-box-sizing: border-box;\n\t\t-moz-box-sizing: border-box;\n\t\tbox-sizing: border-box;\n\t\tfloat: left;\n\t\tclear: left;\n\t}\n}\n/* Panel */\n.ui-panel {\n\twidth: 17em;\n\tmin-height: 100%;\n\tmax-height: none;\n\tborder-width: 0;\n\tposition: absolute;\n\ttop: 0;\n\tdisplay: block;\n}\n.ui-panel-closed {\n\twidth: 0;\n\tmax-height: 100%;\n\toverflow: hidden;\n\tvisibility: hidden;\n\tleft: 0;\n\tclip: rect(1px,1px,1px,1px);\n}\n.ui-panel-fixed {\n\tposition: fixed;\n\tbottom: -1px; /* Fixes gap on Chrome for Android */\n\tpadding-bottom: 1px;\n}\n.ui-panel-display-reveal {\n\tz-index: 1;\n}\n.ui-panel-display-push {\n\tz-index: 999;\n}\n.ui-panel-display-overlay {\n\tz-index: 1001; /* Fixed toolbars have z-index 1000 */\n}\n.ui-panel-inner {\n\tpadding: 1em;\n}\n/* Container, page and wrapper */\n.ui-panel-page-container {\n\toverflow-x: visible;\n}\n.ui-panel-page-container-themed .ui-page-active {\n\tbackground: none;\n}\n.ui-panel-wrapper {\n\tposition: relative;\n\tmin-height: inherit;\n\tborder: 0;\n\toverflow-x: hidden;\n\tz-index: 999;\n}\n/* Fixed toolbars */\n.ui-panel-fixed-toolbar {\n\toverflow-x: hidden;\n}\n/* Dismiss */\n.ui-panel-dismiss {\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n\tright: 0;\n\theight: 100%;\n\tz-index: 1002;\n\tdisplay: none;\n}\n.ui-panel-dismiss-open {\n\tdisplay: block;\n}\n/* Animate class is added to panel, wrapper and fixed toolbars */\n.ui-panel-animate {\n\t-webkit-transition: -webkit-transform 300ms ease;\n\t-webkit-transition-duration: 300ms;\n\t-moz-transition: -moz-transform 300ms ease;\n\ttransition: transform 300ms ease;\n}\n/* Fix for Windows Phone issue #6349: unset the transition for transforms in case of fixed toolbars. */\n@media screen and ( max-device-width: 768px ) {\n\t.ui-page-header-fixed .ui-panel-animate.ui-panel-wrapper,\n\t.ui-page-footer-fixed .ui-panel-animate.ui-panel-wrapper,\n\t.ui-panel-animate.ui-panel-fixed-toolbar {\n\t\t-ms-transition: none;\n\t}\n\t/* We need a transitionend event ... */\n\t.ui-panel-animate.ui-panel-fixed-toolbar {\n\t\t-ms-transition: -ms-transform 1ms;\n\t\t-ms-transform: rotate(0deg);\n\t}\n}\n/* Hardware acceleration for smoother transitions on WebKit browsers */\n.ui-panel-animate.ui-panel:not(.ui-panel-display-reveal) {\n\t-webkit-backface-visibility: hidden;\n\t-webkit-transform: translate3d(0,0,0);\n}\n/* Panel positioning (for overlay and push) */\n/* Panel left closed */\n.ui-panel-position-left {\n\tleft: -17em;\n}\n/* Panel left closed animated */\n.ui-panel-animate.ui-panel-position-left.ui-panel-display-overlay,\n.ui-panel-animate.ui-panel-position-left.ui-panel-display-push {\n\tleft: 0;\n\t-webkit-transform: translate3d(-17em,0,0);\n\t-moz-transform: translate3d(-17em,0,0);\n\ttransform: translate3d(-17em,0,0);\n}\n/* Panel left open */\n.ui-panel-position-left.ui-panel-display-reveal, /* Unset \"panel left closed\" for reveal */\n.ui-panel-open.ui-panel-position-left {\n\tleft: 0;\n}\n/* Panel left open animated */\n.ui-panel-animate.ui-panel-open.ui-panel-position-left.ui-panel-display-overlay,\n.ui-panel-animate.ui-panel-open.ui-panel-position-left.ui-panel-display-push {\n\t-webkit-transform: translate3d(0,0,0);\n\ttransform: translate3d(0,0,0);\n\t-moz-transform: none;\n}\n/* Panel right closed */\n.ui-panel-position-right {\n\tright: -17em;\n}\n/* Panel right closed animated */\n.ui-panel-animate.ui-panel-position-right.ui-panel-display-overlay,\n.ui-panel-animate.ui-panel-position-right.ui-panel-display-push {\n\tright: 0;\n\t-webkit-transform: translate3d(17em,0,0);\n\t-moz-transform: translate3d(17em,0,0);\n\ttransform: translate3d(17em,0,0);\n}\n/* Panel right open */\n.ui-panel-position-right.ui-panel-display-reveal, /* Unset \"panel right closed\" for reveal */\n.ui-panel-position-right.ui-panel-open {\n\tright: 0;\n}\n/* Panel right open animated */\n.ui-panel-animate.ui-panel-open.ui-panel-position-right.ui-panel-display-overlay,\n.ui-panel-animate.ui-panel-open.ui-panel-position-right.ui-panel-display-push {\n\t-webkit-transform: translate3d(0,0,0);\n\ttransform: translate3d(0,0,0);\n\t-moz-transform: none;\n}\n/* Wrapper and fixed toolbars positioning (for reveal and push) */\n/* Panel left open */\n.ui-panel-page-content-position-left {\n\tleft: 17em;\n\tright: -17em;\n}\n/* Panel left open animated */\n.ui-panel-animate.ui-panel-page-content-position-left {\n\tleft: 0;\n\tright: 0;\n\t-webkit-transform: translate3d(17em,0,0);\n\t-moz-transform: translate3d(17em,0,0);\n\ttransform: translate3d(17em,0,0);\n}\n/* Panel right open */\n.ui-panel-page-content-position-right {\n\tleft: -17em;\n\tright: 17em;\n}\n/* Panel right open animated */\n.ui-panel-animate.ui-panel-page-content-position-right {\n\tleft: 0;\n\tright: 0;\n\t-webkit-transform: translate3d(-17em,0,0);\n\t-moz-transform: translate3d(-17em,0,0);\n\ttransform: translate3d(-17em,0,0);\n}\n/* Dismiss model open */\n.ui-panel-dismiss-open.ui-panel-dismiss-position-left {\n\tleft: 17em;\n}\n.ui-panel-dismiss-open.ui-panel-dismiss-position-right {\n\tright: 17em;\n}\n/* Shadows and borders */\n.ui-panel-display-reveal {\n\t-webkit-box-shadow: inset -5px 0 5px rgba(0,0,0,.15);\n\t-moz-box-shadow: inset -5px 0 5px rgba(0,0,0,.15);\n\tbox-shadow: inset -5px 0 5px rgba(0,0,0,.15);\n}\n.ui-panel-position-right.ui-panel-display-reveal {\n\t-webkit-box-shadow: inset 5px 0 5px rgba(0,0,0,.15);\n\t-moz-box-shadow: inset 5px 0 5px rgba(0,0,0,.15);\n\tbox-shadow: inset 5px 0 5px rgba(0,0,0,.15);\n}\n.ui-panel-display-overlay {\n\t-webkit-box-shadow: 5px 0 5px rgba(0,0,0,.15);\n\t-moz-box-shadow: 5px 0 5px rgba(0,0,0,.15);\n\tbox-shadow: 5px 0 5px rgba(0,0,0,.15);\n}\n.ui-panel-position-right.ui-panel-display-overlay {\n\t-webkit-box-shadow: -5px 0 5px rgba(0,0,0,.15);\n\t-moz-box-shadow: -5px 0 5px rgba(0,0,0,.15);\n\tbox-shadow: -5px 0 5px rgba(0,0,0,.15);\n}\n.ui-panel-open.ui-panel-position-left.ui-panel-display-push {\n\tborder-right-width: 1px;\n\tmargin-right: -1px;\n}\n.ui-panel-page-content-position-left.ui-panel-page-content-display-push {\n\tmargin-left: 1px;\n\twidth: auto;\n}\n.ui-panel-open.ui-panel-position-right.ui-panel-display-push {\n\tborder-left-width: 1px;\n\tmargin-left: -1px;\n}\n.ui-panel-page-content-position-right.ui-panel-page-content-display-push {\n\tmargin-right: 1px;\n\twidth: auto;\n}\n/* Responsive: wrap on wide viewports once open */\n@media (min-width:55em) {\n\t.ui-responsive-panel .ui-panel-page-content-open.ui-panel-page-content-position-left {\n\t\tmargin-right: 17em;\n\t}\n\t.ui-responsive-panel .ui-panel-page-content-open.ui-panel-page-content-position-right {\n\t\tmargin-left: 17em;\n\t}\n\t.ui-responsive-panel .ui-panel-page-content-open {\n\t\twidth: auto;\t\n\t}\n\t.ui-responsive-panel .ui-panel-dismiss-display-push,\n\t.ui-responsive-panel.ui-page-active ~ .ui-panel-dismiss-display-push {\n\t\tdisplay: none;\n\t}\n}\n.ui-tabs {\n\tposition: relative;/* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as \"fixed\") */\n\tpadding: .2em;\n}\n"
  },
  {
    "path": "stenogotchi/ui/web/static/js/jquery.mobile/jquery.mobile.theme-1.4.5.css",
    "content": "/*!\n* jQuery Mobile 1.4.5\n* Git HEAD hash: 68e55e78b292634d3991c795f06f5e37a512decc <> Date: Fri Oct 31 2014 17:33:30 UTC\n* http://jquerymobile.com\n*\n* Copyright 2010, 2014 jQuery Foundation, Inc. and othercontributors\n* Released under the MIT license.\n* http://jquery.org/license\n*\n*/\n\n\n/* Globals */\n/* Font\n-----------------------------------------------------------------------------------------------------------*/\nhtml {\n\tfont-size: 100%;\n}\nbody,\ninput,\nselect,\ntextarea,\nbutton,\n.ui-btn {\n\tfont-size: 1em;\n\tline-height: 1.3;\n\tfont-family: sans-serif /*{global-font-family}*/;\n}\nlegend,\n.ui-input-text input,\n.ui-input-search input {\n\tcolor: inherit;\n\ttext-shadow: inherit;\n}\n/* Form labels (overrides font-weight bold in bars, and mini font-size) */\n.ui-mobile label,\ndiv.ui-controlgroup-label {\n\tfont-weight: normal;\n\tfont-size: 16px;\n}\n/* Separators\n-----------------------------------------------------------------------------------------------------------*/\n/* Field contain separator (< 28em) */\n.ui-field-contain {\n\tborder-bottom-color: #828282;\n\tborder-bottom-color: rgba(0,0,0,.15);\n\tborder-bottom-width: 1px;\n\tborder-bottom-style: solid;\n}\n/* Table opt-in classes: strokes between each row, and alternating row stripes */\n/* Classes table-stroke and table-stripe are deprecated in 1.4. */\n.table-stroke thead th,\n.table-stripe thead th,\n.table-stripe tbody tr:last-child {\n\tborder-bottom: 1px solid #d6d6d6; /* non-RGBA fallback */\n\tborder-bottom: 1px solid rgba(0,0,0,.1);\n}\n.table-stroke tbody th,\n.table-stroke tbody td {\n\tborder-bottom: 1px solid #e6e6e6; /* non-RGBA fallback  */\n\tborder-bottom: 1px solid rgba(0,0,0,.05);\n}\n.table-stripe.table-stroke tbody tr:last-child th,\n.table-stripe.table-stroke tbody tr:last-child td {\n\tborder-bottom: 0;\n}\n.table-stripe tbody tr:nth-child(odd) td,\n.table-stripe tbody tr:nth-child(odd) th {\n\tbackground-color: #eeeeee; /* non-RGBA fallback  */\n\tbackground-color: rgba(0,0,0,.04);\n}\n/* Buttons\n-----------------------------------------------------------------------------------------------------------*/\n.ui-btn,\nlabel.ui-btn {\n\tfont-weight: bold;\n\tborder-width: 1px;\n\tborder-style: solid;\n}\n.ui-btn {\n\ttext-decoration: none !important;\n}\n.ui-btn-active {\n\tcursor: pointer;\n}\n/* Corner rounding\n-----------------------------------------------------------------------------------------------------------*/\n/* Class ui-btn-corner-all deprecated in 1.4 */\n.ui-corner-all {\n\t-webkit-border-radius: \t\t\t\t.3125em /*{global-radii-blocks}*/;\n\tborder-radius: \t\t\t\t\t\t.3125em /*{global-radii-blocks}*/;\n}\n/* Buttons */\n.ui-btn-corner-all,\n.ui-btn.ui-corner-all,\n/* Slider track */\n.ui-slider-track.ui-corner-all,\n/* Flipswitch */\n.ui-flipswitch.ui-corner-all,\n/* Count bubble */\n.ui-li-count {\n\t-webkit-border-radius: \t\t\t\t.3125em /*{global-radii-buttons}*/;\n\tborder-radius: \t\t\t\t\t\t.3125em /*{global-radii-buttons}*/;\n}\n/* Icon-only buttons */\n.ui-btn-icon-notext.ui-btn-corner-all,\n.ui-btn-icon-notext.ui-corner-all {\n\t-webkit-border-radius: 1em;\n\tborder-radius: 1em;\n}\n/* Radius clip workaround for cleaning up corner trapping */\n.ui-btn-corner-all,\n.ui-corner-all {\n\t-webkit-background-clip: padding;\n\tbackground-clip: padding-box;\n}\n/* Popup arrow */\n.ui-popup.ui-corner-all > .ui-popup-arrow-guide {\n\tleft: .6em /*{global-radii-blocks}*/;\n\tright: .6em /*{global-radii-blocks}*/;\n\ttop: .6em /*{global-radii-blocks}*/;\n\tbottom: .6em /*{global-radii-blocks}*/;\n}\n/* Shadow\n-----------------------------------------------------------------------------------------------------------*/\n.ui-shadow {\n\t-webkit-box-shadow: 0 1px 3px /*{global-box-shadow-size}*/ \t\trgba(0,0,0,.15) /*{global-box-shadow-color}*/;\n\t-moz-box-shadow: 0 1px 3px /*{global-box-shadow-size}*/ \t\trgba(0,0,0,.15) /*{global-box-shadow-color}*/;\n\tbox-shadow: 0 1px 3px /*{global-box-shadow-size}*/ \t\t\t\trgba(0,0,0,.15) /*{global-box-shadow-color}*/;\n}\n.ui-shadow-inset {\n\t-webkit-box-shadow: inset 0 1px 3px /*{global-box-shadow-size}*/ \trgba(0,0,0,.2) /*{global-box-shadow-color}*/;\n\t-moz-box-shadow: inset 0 1px 3px /*{global-box-shadow-size}*/ \t\trgba(0,0,0,.2) /*{global-box-shadow-color}*/;\n\tbox-shadow: inset 0 1px 3px /*{global-box-shadow-size}*/ \trgba(0,0,0,.2) /*{global-box-shadow-color}*/;\n}\n.ui-overlay-shadow {\n\t-webkit-box-shadow: 0 0 12px \t\trgba(0,0,0,.6);\n\t-moz-box-shadow: 0 0 12px \t\t\trgba(0,0,0,.6);\n\tbox-shadow: 0 0 12px \t\t\t\trgba(0,0,0,.6);\n}\n/* Icons\n-----------------------------------------------------------------------------------------------------------*/\n.ui-btn-icon-left:after,\n.ui-btn-icon-right:after,\n.ui-btn-icon-top:after,\n.ui-btn-icon-bottom:after,\n.ui-btn-icon-notext:after {\n\tbackground-color: \t\t\t\t\t#666 /*{global-icon-color}*/;\n\tbackground-color: \t\t\t\t\trgba(0,0,0,.3) /*{global-icon-disc}*/;\n\tbackground-position: center center;\n\tbackground-repeat: no-repeat;\n\t-webkit-border-radius: 1em;\n\tborder-radius: 1em;\n}\n/* Alt icons */\n.ui-alt-icon.ui-btn:after,\n.ui-alt-icon .ui-btn:after,\nhtml .ui-alt-icon.ui-checkbox-off:after,\nhtml .ui-alt-icon.ui-radio-off:after,\nhtml .ui-alt-icon .ui-checkbox-off:after,\nhtml .ui-alt-icon .ui-radio-off:after {\n\tbackground-color: \t\t\t\t\t#666 /*{global-icon-color}*/;\n\tbackground-color: \t\t\t\t\trgba(0,0,0,.15) /*{global-icon-disc}*/;\n}\n/* No disc */\n.ui-nodisc-icon.ui-btn:after,\n.ui-nodisc-icon .ui-btn:after {\n\tbackground-color: transparent;\n}\n/* Icon shadow */\n.ui-shadow-icon.ui-btn:after,\n.ui-shadow-icon .ui-btn:after {\n\t-webkit-box-shadow: 0 1px 0 \t\t\trgba(255,255,255,.3) /*{global-icon-shadow}*/;\n\t-moz-box-shadow: 0 1px 0 \t\t\t\trgba(255,255,255,.3) /*{global-icon-shadow}*/;\n\tbox-shadow: 0 1px 0 \t\t\t\t\trgba(255,255,255,.3) /*{global-icon-shadow}*/;\n}\n/* Checkbox and radio */\n.ui-btn.ui-checkbox-off:after,\n.ui-btn.ui-checkbox-on:after,\n.ui-btn.ui-radio-off:after,\n.ui-btn.ui-radio-on:after {\n\tdisplay: block;\n\twidth: 18px;\n\theight: 18px;\n\tmargin: -9px 2px 0 2px;\n}\n.ui-checkbox-off:after,\n.ui-btn.ui-radio-off:after {\n\tfilter: Alpha(Opacity=30);\n\topacity: .3;\n}\n.ui-btn.ui-checkbox-off:after,\n.ui-btn.ui-checkbox-on:after {\n\t-webkit-border-radius: .1875em;\n\tborder-radius: .1875em;\n}\n.ui-btn.ui-checkbox-off:after {\n\tbackground-color: #666;\n\tbackground-color: rgba(0,0,0,.3);\n}\n.ui-radio .ui-btn.ui-radio-on:after {\n\tbackground-image: none;\n\tbackground-color: #fff;\n\twidth: 8px;\n\theight: 8px;\n\tborder-width: 5px;\n\tborder-style: solid; \n}\n.ui-alt-icon.ui-btn.ui-radio-on:after,\n.ui-alt-icon .ui-btn.ui-radio-on:after {\n\tbackground-color: #000;\n}\n/* Loader */\n.ui-icon-loading {\n\tbackground: url(\"images/ajax-loader.gif\");\n\tbackground-size: 2.875em 2.875em;\n}\n/* Swatches */\n/* A\n-----------------------------------------------------------------------------------------------------------*/\n/* Bar: Toolbars, dividers, slider track */\n.ui-bar-a,\n.ui-page-theme-a .ui-bar-inherit,\nhtml .ui-bar-a .ui-bar-inherit,\nhtml .ui-body-a .ui-bar-inherit,\nhtml body .ui-group-theme-a .ui-bar-inherit {\n\tbackground-color: \t\t\t#e9e9e9 /*{a-bar-background-color}*/;\n\tborder-color:\t \t\t#ddd /*{a-bar-border}*/;\n\tcolor: \t\t\t\t\t#333 /*{a-bar-color}*/;\n\ttext-shadow: 0 /*{a-bar-shadow-x}*/ 1px /*{a-bar-shadow-y}*/ 0 /*{a-bar-shadow-radius}*/ \t#eee /*{a-bar-shadow-color}*/;\n\tfont-weight: bold;\n}\n.ui-bar-a {\n\tborder-width: 1px;\n\tborder-style: solid;\n}\n/* Page and overlay */\n.ui-overlay-a,\n.ui-page-theme-a,\n.ui-page-theme-a .ui-panel-wrapper {\n\tbackground-color: \t\t\t#f9f9f9 /*{a-page-background-color}*/;\n\tborder-color:\t \t\t#bbb /*{a-page-border}*/;\n\tcolor: \t\t\t\t\t#333 /*{a-page-color}*/;\n\ttext-shadow: 0 /*{a-page-shadow-x}*/ 1px /*{a-page-shadow-y}*/ 0 /*{a-page-shadow-radius}*/ \t#f3f3f3 /*{a-page-shadow-color}*/;\n}\n/* Body: Read-only lists, text inputs, collapsible content */\n.ui-body-a,\n.ui-page-theme-a .ui-body-inherit,\nhtml .ui-bar-a .ui-body-inherit,\nhtml .ui-body-a .ui-body-inherit,\nhtml body .ui-group-theme-a .ui-body-inherit,\nhtml .ui-panel-page-container-a {\n\tbackground-color: \t\t\t#fff /*{a-body-background-color}*/;\n\tborder-color:\t \t\t#ddd /*{a-body-border}*/;\n\tcolor: \t\t\t\t\t#333 /*{a-body-color}*/;\n\ttext-shadow: 0 /*{a-body-shadow-x}*/ 1px /*{a-body-shadow-y}*/ 0 /*{a-body-shadow-radius}*/ \t#f3f3f3 /*{a-body-shadow-color}*/;\n}\n.ui-body-a {\n\tborder-width: 1px;\n\tborder-style: solid;\n}\n/* Links */\n.ui-page-theme-a a,\nhtml .ui-bar-a a,\nhtml .ui-body-a a,\nhtml body .ui-group-theme-a a {\n\tcolor: #3388cc /*{a-link-color}*/;\n\tfont-weight: bold;\n}\n.ui-page-theme-a a:visited,\nhtml .ui-bar-a a:visited,\nhtml .ui-body-a a:visited,\nhtml body .ui-group-theme-a a:visited {\n    color: #3388cc /*{a-link-visited}*/;\n}\n.ui-page-theme-a a:hover,\nhtml .ui-bar-a a:hover,\nhtml .ui-body-a a:hover,\nhtml body .ui-group-theme-a a:hover {\n\tcolor: #005599 /*{a-link-hover}*/;\n}\n.ui-page-theme-a a:active,\nhtml .ui-bar-a a:active,\nhtml .ui-body-a a:active,\nhtml body .ui-group-theme-a a:active {\n\tcolor: #005599 /*{a-link-active}*/;\n}\n/* Button up */\n.ui-page-theme-a .ui-btn,\nhtml .ui-bar-a .ui-btn,\nhtml .ui-body-a .ui-btn,\nhtml body .ui-group-theme-a .ui-btn,\nhtml head + body .ui-btn.ui-btn-a,\n/* Button visited */\n.ui-page-theme-a .ui-btn:visited,\nhtml .ui-bar-a .ui-btn:visited,\nhtml .ui-body-a .ui-btn:visited,\nhtml body .ui-group-theme-a .ui-btn:visited,\nhtml head + body .ui-btn.ui-btn-a:visited {\n\tbackground-color: \t\t\t#f6f6f6 /*{a-bup-background-color}*/;\n\tborder-color:\t \t\t#ddd /*{a-bup-border}*/;\n\tcolor: \t\t\t\t\t#333 /*{a-bup-color}*/;\n\ttext-shadow: 0 /*{a-bup-shadow-x}*/ 1px /*{a-bup-shadow-y}*/ 0 /*{a-bup-shadow-radius}*/ #f3f3f3 /*{a-bup-shadow-color}*/;\n}\n/* Button hover */\n.ui-page-theme-a .ui-btn:hover,\nhtml .ui-bar-a .ui-btn:hover,\nhtml .ui-body-a .ui-btn:hover,\nhtml body .ui-group-theme-a .ui-btn:hover,\nhtml head + body .ui-btn.ui-btn-a:hover {\n\tbackground-color: \t\t\t#ededed /*{a-bhover-background-color}*/;\n\tborder-color:\t \t\t#ddd /*{a-bhover-border}*/;\n\tcolor: \t\t\t\t\t#333 /*{a-bhover-color}*/;\n\ttext-shadow: 0 /*{a-bhover-shadow-x}*/ 1px /*{a-bhover-shadow-y}*/ 0 /*{a-bhover-shadow-radius}*/ #f3f3f3 /*{a-bhover-shadow-color}*/;\n}\n/* Button down */\n.ui-page-theme-a .ui-btn:active,\nhtml .ui-bar-a .ui-btn:active,\nhtml .ui-body-a .ui-btn:active,\nhtml body .ui-group-theme-a .ui-btn:active,\nhtml head + body .ui-btn.ui-btn-a:active {\n\tbackground-color: \t\t\t#e8e8e8 /*{a-bdown-background-color}*/;\n\tborder-color:\t \t\t#ddd /*{a-bdown-border}*/;\n\tcolor: \t\t\t\t\t#333 /*{a-bdown-color}*/;\n\ttext-shadow: 0 /*{a-bdown-shadow-x}*/ 1px /*{a-bdown-shadow-y}*/ 0 /*{a-bdown-shadow-radius}*/ #f3f3f3 /*{a-bdown-shadow-color}*/;\n}\n/* Active button */\n.ui-page-theme-a .ui-btn.ui-btn-active,\nhtml .ui-bar-a .ui-btn.ui-btn-active,\nhtml .ui-body-a .ui-btn.ui-btn-active,\nhtml body .ui-group-theme-a .ui-btn.ui-btn-active,\nhtml head + body .ui-btn.ui-btn-a.ui-btn-active,\n/* Active checkbox icon */\n.ui-page-theme-a .ui-checkbox-on:after,\nhtml .ui-bar-a .ui-checkbox-on:after,\nhtml .ui-body-a .ui-checkbox-on:after,\nhtml body .ui-group-theme-a .ui-checkbox-on:after,\n.ui-btn.ui-checkbox-on.ui-btn-a:after,\n/* Active flipswitch background */\n.ui-page-theme-a .ui-flipswitch-active,\nhtml .ui-bar-a .ui-flipswitch-active,\nhtml .ui-body-a .ui-flipswitch-active,\nhtml body .ui-group-theme-a .ui-flipswitch-active,\nhtml body .ui-flipswitch.ui-bar-a.ui-flipswitch-active,\n/* Active slider track */\n.ui-page-theme-a .ui-slider-track .ui-btn-active,\nhtml .ui-bar-a .ui-slider-track .ui-btn-active,\nhtml .ui-body-a .ui-slider-track .ui-btn-active,\nhtml body .ui-group-theme-a .ui-slider-track .ui-btn-active,\nhtml body div.ui-slider-track.ui-body-a .ui-btn-active {\n\tbackground-color: \t\t#3388cc /*{a-active-background-color}*/;\n\tborder-color:\t \t\t#3388cc /*{a-active-border}*/;\n\tcolor: \t\t\t\t\t#fff /*{a-active-color}*/;\n\ttext-shadow: 0 /*{a-active-shadow-x}*/ 1px /*{a-active-shadow-y}*/ 0 /*{a-active-shadow-radius}*/ #005599 /*{a-active-shadow-color}*/;\n}\n/* Active radio button icon */\n.ui-page-theme-a .ui-radio-on:after,\nhtml .ui-bar-a .ui-radio-on:after,\nhtml .ui-body-a .ui-radio-on:after,\nhtml body .ui-group-theme-a .ui-radio-on:after,\n.ui-btn.ui-radio-on.ui-btn-a:after {\n\tborder-color:\t\t\t#3388cc /*{a-active-background-color}*/;\n}\n/* Focus */\n.ui-page-theme-a .ui-btn:focus,\nhtml .ui-bar-a .ui-btn:focus,\nhtml .ui-body-a .ui-btn:focus,\nhtml body .ui-group-theme-a .ui-btn:focus,\nhtml head + body .ui-btn.ui-btn-a:focus,\n/* Focus buttons and text inputs with div wrap */\n.ui-page-theme-a .ui-focus,\nhtml .ui-bar-a .ui-focus,\nhtml .ui-body-a .ui-focus,\nhtml body .ui-group-theme-a .ui-focus,\nhtml head + body .ui-btn-a.ui-focus,\nhtml head + body .ui-body-a.ui-focus {\n\t-webkit-box-shadow: 0 0 12px \t#3388cc /*{a-active-background-color}*/;\n\t-moz-box-shadow: 0 0 12px \t\t#3388cc /*{a-active-background-color}*/;\n\tbox-shadow: 0 0 12px \t\t\t#3388cc /*{a-active-background-color}*/;\n}\n/* B\n-----------------------------------------------------------------------------------------------------------*/\n/* Bar: Toolbars, dividers, slider track */\n.ui-bar-b,\n.ui-page-theme-b .ui-bar-inherit,\nhtml .ui-bar-b .ui-bar-inherit,\nhtml .ui-body-b .ui-bar-inherit,\nhtml body .ui-group-theme-b .ui-bar-inherit {\n\tbackground-color: \t\t\t#1d1d1d /*{b-bar-background-color}*/;\n\tborder-color:\t \t\t#1b1b1b /*{b-bar-border}*/;\n\tcolor: \t\t\t\t\t#fff /*{b-bar-color}*/;\n\ttext-shadow: 0 /*{b-bar-shadow-x}*/ 1px /*{b-bar-shadow-y}*/ 0 /*{b-bar-shadow-radius}*/ \t#111 /*{b-bar-shadow-color}*/;\n\tfont-weight: bold;\n}\n.ui-bar-b {\n\tborder-width: 1px;\n\tborder-style: solid;\n}\n/* Page and overlay */\n.ui-overlay-b,\n.ui-page-theme-b,\n.ui-page-theme-b .ui-panel-wrapper {\n\tbackground-color: \t\t\t#252525 /*{b-page-background-color}*/;\n\tborder-color:\t \t\t#454545 /*{b-page-border}*/;\n\tcolor: \t\t\t\t\t#fff /*{b-page-color}*/;\n\ttext-shadow: 0 /*{b-page-shadow-x}*/ 1px /*{b-page-shadow-y}*/ 0 /*{b-page-shadow-radius}*/ \t#111 /*{b-page-shadow-color}*/;\n}\n/* Body: Read-only lists, text inputs, collapsible content */\n.ui-body-b,\n.ui-page-theme-b .ui-body-inherit,\nhtml .ui-bar-b .ui-body-inherit,\nhtml .ui-body-b .ui-body-inherit,\nhtml body .ui-group-theme-b .ui-body-inherit,\nhtml .ui-panel-page-container-b {\n\tbackground-color: \t\t\t#2a2a2a /*{b-body-background-color}*/;\n\tborder-color:\t \t\t#1d1d1d /*{b-body-border}*/;\n\tcolor: \t\t\t\t\t#fff /*{b-body-color}*/;\n\ttext-shadow: 0 /*{b-body-shadow-x}*/ 1px /*{b-body-shadow-y}*/ 0 /*{b-body-shadow-radius}*/ \t#111 /*{b-body-shadow-color}*/;\n}\n.ui-body-b {\n\tborder-width: 1px;\n\tborder-style: solid;\n}\n/* Links */\n.ui-page-theme-b a,\nhtml .ui-bar-b a,\nhtml .ui-body-b a,\nhtml body .ui-group-theme-b a {\n\tcolor: #22aadd /*{b-link-color}*/;\n\tfont-weight: bold;\n}\n.ui-page-theme-b a:visited,\nhtml .ui-bar-b a:visited,\nhtml .ui-body-b a:visited,\nhtml body .ui-group-theme-b a:visited {\n    color: #22aadd /*{b-link-visited}*/;\n}\n.ui-page-theme-b a:hover,\nhtml .ui-bar-b a:hover,\nhtml .ui-body-b a:hover,\nhtml body .ui-group-theme-b a:hover {\n\tcolor: #0088bb /*{b-link-hover}*/;\n}\n.ui-page-theme-b a:active,\nhtml .ui-bar-b a:active,\nhtml .ui-body-b a:active,\nhtml body .ui-group-theme-b a:active {\n\tcolor: #0088bb /*{b-link-active}*/;\n}\n/* Button up */\n.ui-page-theme-b .ui-btn,\nhtml .ui-bar-b .ui-btn,\nhtml .ui-body-b .ui-btn,\nhtml body .ui-group-theme-b .ui-btn,\nhtml head + body .ui-btn.ui-btn-b,\n/* Button visited */\n.ui-page-theme-b .ui-btn:visited,\nhtml .ui-bar-b .ui-btn:visited,\nhtml .ui-body-b .ui-btn:visited,\nhtml body .ui-group-theme-b .ui-btn:visited,\nhtml head + body .ui-btn.ui-btn-b:visited {\n\tbackground-color: \t\t\t#333 /*{b-bup-background-color}*/;\n\tborder-color:\t \t\t#1f1f1f /*{b-bup-border}*/;\n\tcolor: \t\t\t\t\t#fff /*{b-bup-color}*/;\n\ttext-shadow: 0 /*{b-bup-shadow-x}*/ 1px /*{b-bup-shadow-y}*/ 0 /*{b-bup-shadow-radius}*/ #111 /*{b-bup-shadow-color}*/;\n}\n/* Button hover */\n.ui-page-theme-b .ui-btn:hover,\nhtml .ui-bar-b .ui-btn:hover,\nhtml .ui-body-b .ui-btn:hover,\nhtml body .ui-group-theme-b .ui-btn:hover,\nhtml head + body .ui-btn.ui-btn-b:hover {\n\tbackground-color: \t\t\t#373737 /*{b-bhover-background-color}*/;\n\tborder-color:\t \t\t#1f1f1f /*{b-bhover-border}*/;\n\tcolor: \t\t\t\t\t#fff /*{b-bhover-color}*/;\n\ttext-shadow: 0 /*{b-bhover-shadow-x}*/ 1px /*{b-bhover-shadow-y}*/ 0 /*{b-bhover-shadow-radius}*/ #111 /*{b-bhover-shadow-color}*/;\n}\n/* Button down */\n.ui-page-theme-b .ui-btn:active,\nhtml .ui-bar-b .ui-btn:active,\nhtml .ui-body-b .ui-btn:active,\nhtml body .ui-group-theme-b .ui-btn:active,\nhtml head + body .ui-btn.ui-btn-b:active {\n\tbackground-color: \t\t\t#404040 /*{b-bdown-background-color}*/;\n\tborder-color:\t \t\t#1f1f1f /*{b-bdown-border}*/;\n\tcolor: \t\t\t\t\t#fff /*{b-bdown-color}*/;\n\ttext-shadow: 0 /*{b-bdown-shadow-x}*/ 1px /*{b-bdown-shadow-y}*/ 0 /*{b-bdown-shadow-radius}*/ #111 /*{b-bdown-shadow-color}*/;\n}\n/* Active button */\n.ui-page-theme-b .ui-btn.ui-btn-active,\nhtml .ui-bar-b .ui-btn.ui-btn-active,\nhtml .ui-body-b .ui-btn.ui-btn-active,\nhtml body .ui-group-theme-b .ui-btn.ui-btn-active,\nhtml head + body .ui-btn.ui-btn-b.ui-btn-active,\n/* Active checkbox icon */\n.ui-page-theme-b .ui-checkbox-on:after,\nhtml .ui-bar-b .ui-checkbox-on:after,\nhtml .ui-body-b .ui-checkbox-on:after,\nhtml body .ui-group-theme-b .ui-checkbox-on:after,\n.ui-btn.ui-checkbox-on.ui-btn-b:after,\n/* Active flipswitch background */\n.ui-page-theme-b .ui-flipswitch-active,\nhtml .ui-bar-b .ui-flipswitch-active,\nhtml .ui-body-b .ui-flipswitch-active,\nhtml body .ui-group-theme-b .ui-flipswitch-active,\nhtml body .ui-flipswitch.ui-bar-b.ui-flipswitch-active,\n/* Active slider track */\n.ui-page-theme-b .ui-slider-track .ui-btn-active,\nhtml .ui-bar-b .ui-slider-track .ui-btn-active,\nhtml .ui-body-b .ui-slider-track .ui-btn-active,\nhtml body .ui-group-theme-b .ui-slider-track .ui-btn-active,\nhtml body div.ui-slider-track.ui-body-b .ui-btn-active {\n\tbackground-color: \t\t#22aadd /*{b-active-background-color}*/;\n\tborder-color:\t \t\t#22aadd /*{b-active-border}*/;\n\tcolor: \t\t\t\t\t#fff /*{b-active-color}*/;\n\ttext-shadow: 0 /*{b-active-shadow-x}*/ 1px /*{b-active-shadow-y}*/ 0 /*{b-active-shadow-radius}*/ #0088bb /*{b-active-shadow-color}*/;\n}\n/* Active radio button icon */\n.ui-page-theme-b .ui-radio-on:after,\nhtml .ui-bar-b .ui-radio-on:after,\nhtml .ui-body-b .ui-radio-on:after,\nhtml body .ui-group-theme-b .ui-radio-on:after,\n.ui-btn.ui-radio-on.ui-btn-b:after {\n\tborder-color:\t\t\t#22aadd /*{b-active-background-color}*/;\n}\n/* Focus */\n.ui-page-theme-b .ui-btn:focus,\nhtml .ui-bar-b .ui-btn:focus,\nhtml .ui-body-b .ui-btn:focus,\nhtml body .ui-group-theme-b .ui-btn:focus,\nhtml head + body .ui-btn.ui-btn-b:focus,\n/* Focus buttons and text inputs with div wrap */\n.ui-page-theme-b .ui-focus,\nhtml .ui-bar-b .ui-focus,\nhtml .ui-body-b .ui-focus,\nhtml body .ui-group-theme-b .ui-focus,\nhtml head + body .ui-btn-b.ui-focus,\nhtml head + body .ui-body-b.ui-focus {\n\t-webkit-box-shadow: 0 0 12px \t#22aadd /*{b-active-background-color}*/;\n\t-moz-box-shadow: 0 0 12px \t\t#22aadd /*{b-active-background-color}*/;\n\tbox-shadow: 0 0 12px \t\t\t#22aadd /*{b-active-background-color}*/;\n}\n/* Structure */\n/* Disabled\n-----------------------------------------------------------------------------------------------------------*/\n/* Class ui-disabled deprecated in 1.4. :disabled not supported by IE8 so we use [disabled] */\n.ui-disabled,\n.ui-state-disabled,\nbutton[disabled],\n.ui-select .ui-btn.ui-state-disabled {\n\tfilter: Alpha(Opacity=30);\n\topacity: .3;\n\tcursor: default !important;\n\tpointer-events: none;\n}\n/* Focus state outline\n-----------------------------------------------------------------------------------------------------------*/\n.ui-btn:focus,\n.ui-btn.ui-focus {\n\toutline: 0;\n}\n/* Unset box-shadow in browsers that don't do it right */\n.ui-noboxshadow .ui-shadow,\n.ui-noboxshadow .ui-shadow-inset,\n.ui-noboxshadow .ui-overlay-shadow,\n.ui-noboxshadow .ui-shadow-icon.ui-btn:after,\n.ui-noboxshadow .ui-shadow-icon .ui-btn:after,\n.ui-noboxshadow .ui-focus,\n.ui-noboxshadow .ui-btn:focus,\n.ui-noboxshadow  input:focus,\n.ui-noboxshadow .ui-panel {\n\t-webkit-box-shadow: none !important;\n\t-moz-box-shadow: none !important;\n\tbox-shadow: none !important;\n}\n.ui-noboxshadow .ui-btn:focus,\n.ui-noboxshadow .ui-focus {\n\toutline-width: 1px;\n\toutline-style: auto;\n}\n"
  },
  {
    "path": "stenogotchi/ui/web/static/js/jquery.timeago.js",
    "content": "/**\n * Timeago is a jQuery plugin that makes it easy to support automatically\n * updating fuzzy timestamps (e.g. \"4 minutes ago\" or \"about 1 day ago\").\n *\n * @name timeago\n * @version 1.6.7\n * @requires jQuery >=1.5.0 <4.0\n * @author Ryan McGeary\n * @license MIT License - http://www.opensource.org/licenses/mit-license.php\n *\n * For usage and examples, visit:\n * http://timeago.yarp.com/\n *\n * Copyright (c) 2008-2019, Ryan McGeary (ryan -[at]- mcgeary [*dot*] org)\n */\n\n(function (factory) {\n  if (typeof define === 'function' && define.amd) {\n    // AMD. Register as an anonymous module.\n    define(['jquery'], factory);\n  } else if (typeof module === 'object' && typeof module.exports === 'object') {\n    factory(require('jquery'));\n  } else {\n    // Browser globals\n    factory(jQuery);\n  }\n}(function ($) {\n  $.timeago = function(timestamp) {\n    if (timestamp instanceof Date) {\n      return inWords(timestamp);\n    } else if (typeof timestamp === \"string\") {\n      return inWords($.timeago.parse(timestamp));\n    } else if (typeof timestamp === \"number\") {\n      return inWords(new Date(timestamp));\n    } else {\n      return inWords($.timeago.datetime(timestamp));\n    }\n  };\n  var $t = $.timeago;\n\n  $.extend($.timeago, {\n    settings: {\n      refreshMillis: 60000,\n      allowPast: true,\n      allowFuture: false,\n      localeTitle: false,\n      cutoff: 0,\n      autoDispose: true,\n      strings: {\n        prefixAgo: null,\n        prefixFromNow: null,\n        suffixAgo: \"ago\",\n        suffixFromNow: \"from now\",\n        inPast: 'any moment now',\n        seconds: \"less than a minute\",\n        minute: \"about a minute\",\n        minutes: \"%d minutes\",\n        hour: \"about an hour\",\n        hours: \"about %d hours\",\n        day: \"a day\",\n        days: \"%d days\",\n        month: \"about a month\",\n        months: \"%d months\",\n        year: \"about a year\",\n        years: \"%d years\",\n        wordSeparator: \" \",\n        numbers: []\n      }\n    },\n\n    inWords: function(distanceMillis) {\n      if (!this.settings.allowPast && ! this.settings.allowFuture) {\n          throw 'timeago allowPast and allowFuture settings can not both be set to false.';\n      }\n\n      var $l = this.settings.strings;\n      var prefix = $l.prefixAgo;\n      var suffix = $l.suffixAgo;\n      if (this.settings.allowFuture) {\n        if (distanceMillis < 0) {\n          prefix = $l.prefixFromNow;\n          suffix = $l.suffixFromNow;\n        }\n      }\n\n      if (!this.settings.allowPast && distanceMillis >= 0) {\n        return this.settings.strings.inPast;\n      }\n\n      var seconds = Math.abs(distanceMillis) / 1000;\n      var minutes = seconds / 60;\n      var hours = minutes / 60;\n      var days = hours / 24;\n      var years = days / 365;\n\n      function substitute(stringOrFunction, number) {\n        var string = $.isFunction(stringOrFunction) ? stringOrFunction(number, distanceMillis) : stringOrFunction;\n        var value = ($l.numbers && $l.numbers[number]) || number;\n        return string.replace(/%d/i, value);\n      }\n\n      var words = seconds < 45 && substitute($l.seconds, Math.round(seconds)) ||\n        seconds < 90 && substitute($l.minute, 1) ||\n        minutes < 45 && substitute($l.minutes, Math.round(minutes)) ||\n        minutes < 90 && substitute($l.hour, 1) ||\n        hours < 24 && substitute($l.hours, Math.round(hours)) ||\n        hours < 42 && substitute($l.day, 1) ||\n        days < 30 && substitute($l.days, Math.round(days)) ||\n        days < 45 && substitute($l.month, 1) ||\n        days < 365 && substitute($l.months, Math.round(days / 30)) ||\n        years < 1.5 && substitute($l.year, 1) ||\n        substitute($l.years, Math.round(years));\n\n      var separator = $l.wordSeparator || \"\";\n      if ($l.wordSeparator === undefined) { separator = \" \"; }\n      return $.trim([prefix, words, suffix].join(separator));\n    },\n\n    parse: function(iso8601) {\n      var s = $.trim(iso8601);\n      s = s.replace(/\\.\\d+/,\"\"); // remove milliseconds\n      s = s.replace(/-/,\"/\").replace(/-/,\"/\");\n      s = s.replace(/T/,\" \").replace(/Z/,\" UTC\");\n      s = s.replace(/([\\+\\-]\\d\\d)\\:?(\\d\\d)/,\" $1$2\"); // -04:00 -> -0400\n      s = s.replace(/([\\+\\-]\\d\\d)$/,\" $100\"); // +09 -> +0900\n      return new Date(s);\n    },\n    datetime: function(elem) {\n      var iso8601 = $t.isTime(elem) ? $(elem).attr(\"datetime\") : $(elem).attr(\"title\");\n      return $t.parse(iso8601);\n    },\n    isTime: function(elem) {\n      // jQuery's `is()` doesn't play well with HTML5 in IE\n      return $(elem).get(0).tagName.toLowerCase() === \"time\"; // $(elem).is(\"time\");\n    }\n  });\n\n  // functions that can be called via $(el).timeago('action')\n  // init is default when no action is given\n  // functions are called with context of a single element\n  var functions = {\n    init: function() {\n      functions.dispose.call(this);\n      var refresh_el = $.proxy(refresh, this);\n      refresh_el();\n      var $s = $t.settings;\n      if ($s.refreshMillis > 0) {\n        this._timeagoInterval = setInterval(refresh_el, $s.refreshMillis);\n      }\n    },\n    update: function(timestamp) {\n      var date = (timestamp instanceof Date) ? timestamp : $t.parse(timestamp);\n      $(this).data('timeago', { datetime: date });\n      if ($t.settings.localeTitle) {\n        $(this).attr(\"title\", date.toLocaleString());\n      }\n      refresh.apply(this);\n    },\n    updateFromDOM: function() {\n      $(this).data('timeago', { datetime: $t.parse( $t.isTime(this) ? $(this).attr(\"datetime\") : $(this).attr(\"title\") ) });\n      refresh.apply(this);\n    },\n    dispose: function () {\n      if (this._timeagoInterval) {\n        window.clearInterval(this._timeagoInterval);\n        this._timeagoInterval = null;\n      }\n    }\n  };\n\n  $.fn.timeago = function(action, options) {\n    var fn = action ? functions[action] : functions.init;\n    if (!fn) {\n      throw new Error(\"Unknown function name '\"+ action +\"' for timeago\");\n    }\n    // each over objects here and call the requested function\n    this.each(function() {\n      fn.call(this, options);\n    });\n    return this;\n  };\n\n  function refresh() {\n    var $s = $t.settings;\n\n    //check if it's still visible\n    if ($s.autoDispose && !$.contains(document.documentElement,this)) {\n      //stop if it has been removed\n      $(this).timeago(\"dispose\");\n      return this;\n    }\n\n    var data = prepareData(this);\n\n    if (!isNaN(data.datetime)) {\n      if ( $s.cutoff === 0 || Math.abs(distance(data.datetime)) < $s.cutoff) {\n        $(this).text(inWords(data.datetime));\n      } else {\n        if ($(this).attr('title').length > 0) {\n            $(this).text($(this).attr('title'));\n        }\n      }\n    }\n    return this;\n  }\n\n  function prepareData(element) {\n    element = $(element);\n    if (!element.data(\"timeago\")) {\n      element.data(\"timeago\", { datetime: $t.datetime(element) });\n      var text = $.trim(element.text());\n      if ($t.settings.localeTitle) {\n        element.attr(\"title\", element.data('timeago').datetime.toLocaleString());\n      } else if (text.length > 0 && !($t.isTime(element) && element.attr(\"title\"))) {\n        element.attr(\"title\", text);\n      }\n    }\n    return element.data(\"timeago\");\n  }\n\n  function inWords(date) {\n    return $t.inWords(distance(date));\n  }\n\n  function distance(date) {\n    return (new Date().getTime() - date.getTime());\n  }\n\n  // fix for IE6 suckage\n  document.createElement(\"abbr\");\n  document.createElement(\"time\");\n}));\n"
  },
  {
    "path": "stenogotchi/ui/web/static/js/plugins/jqplot.BezierCurveRenderer.js",
    "content": "/**\n * jqPlot\n * Pure JavaScript plotting plugin using jQuery\n *\n * Version: 1.0.9\n * Revision: d96a669\n *\n * Copyright (c) 2009-2016 Chris Leonello\n * jqPlot is currently available for use in all personal or commercial projects \n * under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL \n * version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can \n * choose the license that best suits your project and use it accordingly. \n *\n * Although not required, the author would appreciate an email letting him \n * know of any substantial use of jqPlot.  You can reach the author at: \n * chris at jqplot dot com or see http://www.jqplot.com/info.php .\n *\n * If you are feeling kind and generous, consider supporting the project by\n * making a donation at: http://www.jqplot.com/donate.php .\n *\n * sprintf functions contained in jqplot.sprintf.js by Ash Searle:\n *\n *     version 2007.04.27\n *     author Ash Searle\n *     http://hexmen.com/blog/2007/03/printf-sprintf/\n *     http://hexmen.com/js/sprintf.js\n *     The author (Ash Searle) has placed this code in the public domain:\n *     \"This code is unrestricted: you are free to use it however you like.\"\n * \n */\n(function($) {\n    // Class: $.jqplot.BezierCurveRenderer.js\n    // Renderer which draws lines as stacked bezier curves.\n    // Data for the line will not be specified as an array of\n    // [x, y] data point values, but as a an array of [start piont, bezier curve]\n    // So, the line is specified as: [[xstart, ystart], [cp1x, cp1y, cp2x, cp2y, xend, yend]].\n    $.jqplot.BezierCurveRenderer = function(){\n        $.jqplot.LineRenderer.call(this);\n    };\n    \n    $.jqplot.BezierCurveRenderer.prototype = new $.jqplot.LineRenderer();\n    $.jqplot.BezierCurveRenderer.prototype.constructor = $.jqplot.BezierCurveRenderer;\n\n    \n    // Method: setGridData\n    // converts the user data values to grid coordinates and stores them\n    // in the gridData array.\n    // Called with scope of a series.\n    $.jqplot.BezierCurveRenderer.prototype.setGridData = function(plot) {\n        // recalculate the grid data\n        var xp = this._xaxis.series_u2p;\n        var yp = this._yaxis.series_u2p;\n        // this._plotData should be same as this.data\n        var data = this.data;\n        this.gridData = [];\n        this._prevGridData = [];\n        // if seriesIndex = 0, fill to x axis.\n        // if seriesIndex > 0, fill to previous series data.\n        var idx = this.index;\n        if (data.length == 2) {\n            if (idx == 0) {\n                this.gridData = [\n                    [xp.call(this._xaxis, data[0][0]), yp.call(this._yaxis, data[0][1])], \n                    [xp.call(this._xaxis, data[1][0]), yp.call(this._yaxis, data[1][1]), \n                        xp.call(this._xaxis, data[1][2]), yp.call(this._yaxis, data[1][3]),  \n                        xp.call(this._xaxis, data[1][4]), yp.call(this._yaxis, data[1][5])],\n                    [xp.call(this._xaxis, data[1][4]), yp.call(this._yaxis, this._yaxis.min)],\n                    [xp.call(this._xaxis, data[0][0]), yp.call(this._yaxis, this._yaxis.min)]\n                ];\n            }\n            else {\n                var psd = plot.series[idx-1].data;\n                this.gridData = [\n                    [xp.call(this._xaxis, data[0][0]), yp.call(this._yaxis, data[0][1])], \n                    [xp.call(this._xaxis, data[1][0]), yp.call(this._yaxis, data[1][1]), \n                        xp.call(this._xaxis, data[1][2]), yp.call(this._yaxis, data[1][3]),  \n                        xp.call(this._xaxis, data[1][4]), yp.call(this._yaxis, data[1][5])],\n                    [xp.call(this._xaxis, psd[1][4]), yp.call(this._yaxis, psd[1][5])],\n                    [xp.call(this._xaxis, psd[1][2]), yp.call(this._yaxis, psd[1][3]), \n                        xp.call(this._xaxis, psd[1][0]), yp.call(this._yaxis, psd[1][1]),  \n                        xp.call(this._xaxis, psd[0][0]), yp.call(this._yaxis, psd[0][1])]\n                ];\n            }\n        }\n        else {\n            if (idx == 0) {\n                this.gridData = [\n                    [xp.call(this._xaxis, data[0][0]), yp.call(this._yaxis, data[0][1])], \n                    [xp.call(this._xaxis, data[1][0]), yp.call(this._yaxis, data[1][1]), \n                        xp.call(this._xaxis, data[2][0]), yp.call(this._yaxis, data[2][1]),  \n                        xp.call(this._xaxis, data[3][0]), yp.call(this._yaxis, data[3][1])],\n                    [xp.call(this._xaxis, data[3][1]), yp.call(this._yaxis, this._yaxis.min)],\n                    [xp.call(this._xaxis, data[0][0]), yp.call(this._yaxis, this._yaxis.min)]\n                ];\n            }\n            else {\n                var psd = plot.series[idx-1].data;\n                this.gridData = [\n                    [xp.call(this._xaxis, data[0][0]), yp.call(this._yaxis, data[0][1])], \n                    [xp.call(this._xaxis, data[1][0]), yp.call(this._yaxis, data[1][1]), \n                        xp.call(this._xaxis, data[2][0]), yp.call(this._yaxis, data[2][1]),  \n                        xp.call(this._xaxis, data[3][0]), yp.call(this._yaxis, data[3][1])],\n                    [xp.call(this._xaxis, psd[3][0]), yp.call(this._yaxis, psd[3][1])],\n                    [xp.call(this._xaxis, psd[2][0]), yp.call(this._yaxis, psd[2][1]), \n                        xp.call(this._xaxis, psd[1][0]), yp.call(this._yaxis, psd[1][1]),  \n                        xp.call(this._xaxis, psd[0][0]), yp.call(this._yaxis, psd[0][1])]\n                ];\n            }\n        }\n    };\n    \n    // Method: makeGridData\n    // converts any arbitrary data values to grid coordinates and\n    // returns them.  This method exists so that plugins can use a series'\n    // linerenderer to generate grid data points without overwriting the\n    // grid data associated with that series.\n    // Called with scope of a series.\n    $.jqplot.BezierCurveRenderer.prototype.makeGridData = function(data, plot) {\n        // recalculate the grid data\n        var xp = this._xaxis.series_u2p;\n        var yp = this._yaxis.series_u2p;\n        var gd = [];\n        var pgd = [];\n        // if seriesIndex = 0, fill to x axis.\n        // if seriesIndex > 0, fill to previous series data.\n        var idx = this.index;\n        if (data.length == 2) {\n            if (idx == 0) {\n                gd = [\n                    [xp.call(this._xaxis, data[0][0]), yp.call(this._yaxis, data[0][1])], \n                    [xp.call(this._xaxis, data[1][0]), yp.call(this._yaxis, data[1][1]), \n                        xp.call(this._xaxis, data[1][2]), yp.call(this._yaxis, data[1][3]),  \n                        xp.call(this._xaxis, data[1][4]), yp.call(this._yaxis, data[1][5])],\n                    [xp.call(this._xaxis, data[1][4]), yp.call(this._yaxis, this._yaxis.min)],\n                    [xp.call(this._xaxis, data[0][0]), yp.call(this._yaxis, this._yaxis.min)]\n                ];\n            }\n            else {\n                var psd = plot.series[idx-1].data;\n                gd = [\n                    [xp.call(this._xaxis, data[0][0]), yp.call(this._yaxis, data[0][1])], \n                    [xp.call(this._xaxis, data[1][0]), yp.call(this._yaxis, data[1][1]), \n                        xp.call(this._xaxis, data[1][2]), yp.call(this._yaxis, data[1][3]),  \n                        xp.call(this._xaxis, data[1][4]), yp.call(this._yaxis, data[1][5])],\n                    [xp.call(this._xaxis, psd[1][4]), yp.call(this._yaxis, psd[1][5])],\n                    [xp.call(this._xaxis, psd[1][2]), yp.call(this._yaxis, psd[1][3]), \n                        xp.call(this._xaxis, psd[1][0]), yp.call(this._yaxis, psd[1][1]),  \n                        xp.call(this._xaxis, psd[0][0]), yp.call(this._yaxis, psd[0][1])]\n                ];\n            }\n        }\n        else {\n            if (idx == 0) {\n                gd = [\n                    [xp.call(this._xaxis, data[0][0]), yp.call(this._yaxis, data[0][1])], \n                    [xp.call(this._xaxis, data[1][0]), yp.call(this._yaxis, data[1][1]), \n                        xp.call(this._xaxis, data[2][0]), yp.call(this._yaxis, data[2][1]),  \n                        xp.call(this._xaxis, data[3][0]), yp.call(this._yaxis, data[3][1])],\n                    [xp.call(this._xaxis, data[3][1]), yp.call(this._yaxis, this._yaxis.min)],\n                    [xp.call(this._xaxis, data[0][0]), yp.call(this._yaxis, this._yaxis.min)]\n                ];\n            }\n            else {\n                var psd = plot.series[idx-1].data;\n                gd = [\n                    [xp.call(this._xaxis, data[0][0]), yp.call(this._yaxis, data[0][1])], \n                    [xp.call(this._xaxis, data[1][0]), yp.call(this._yaxis, data[1][1]), \n                        xp.call(this._xaxis, data[2][0]), yp.call(this._yaxis, data[2][1]),  \n                        xp.call(this._xaxis, data[3][0]), yp.call(this._yaxis, data[3][1])],\n                    [xp.call(this._xaxis, psd[3][0]), yp.call(this._yaxis, psd[3][1])],\n                    [xp.call(this._xaxis, psd[2][0]), yp.call(this._yaxis, psd[2][1]), \n                        xp.call(this._xaxis, psd[1][0]), yp.call(this._yaxis, psd[1][1]),  \n                        xp.call(this._xaxis, psd[0][0]), yp.call(this._yaxis, psd[0][1])]\n                ];\n            }\n        }\n        return gd;\n    };\n    \n\n    // called within scope of series.\n    $.jqplot.BezierCurveRenderer.prototype.draw = function(ctx, gd, options) {\n        var i;\n        ctx.save();\n        if (gd.length) {\n            if (this.showLine) {\n                ctx.save();\n                var opts = (options != null) ? options : {};\n                ctx.fillStyle = opts.fillStyle || this.color;\n                ctx.beginPath();\n                ctx.moveTo(gd[0][0], gd[0][1]);\n                ctx.bezierCurveTo(gd[1][0], gd[1][1], gd[1][2], gd[1][3], gd[1][4], gd[1][5]);\n                ctx.lineTo(gd[2][0], gd[2][1]);\n                if (gd[3].length == 2) {\n                    ctx.lineTo(gd[3][0], gd[3][1]);\n                }\n                else {\n                    ctx.bezierCurveTo(gd[3][0], gd[3][1], gd[3][2], gd[3][3], gd[3][4], gd[3][5]);\n                }\n                ctx.closePath();\n                ctx.fill();\n                ctx.restore();\n            }\n        }\n        \n        ctx.restore();\n    };  \n    \n    $.jqplot.BezierCurveRenderer.prototype.drawShadow = function(ctx, gd, options) {\n        // This is a no-op, shadows drawn with lines.\n    };\n    \n    $.jqplot.BezierAxisRenderer = function() {\n        $.jqplot.LinearAxisRenderer.call(this);\n    };\n    \n    $.jqplot.BezierAxisRenderer.prototype = new $.jqplot.LinearAxisRenderer();\n    $.jqplot.BezierAxisRenderer.prototype.constructor = $.jqplot.BezierAxisRenderer;\n        \n    \n    // Axes on a plot with Bezier Curves\n    $.jqplot.BezierAxisRenderer.prototype.init = function(options){\n        $.extend(true, this, options);\n        var db = this._dataBounds;\n        // Go through all the series attached to this axis and find\n        // the min/max bounds for this axis.\n        for (var i=0; i<this._series.length; i++) {\n            var s = this._series[i];\n            var d = s.data;  \n            if (d.length == 4) {\n                for (var j=0; j<d.length; j++) { \n                    if (this.name == 'xaxis' || this.name == 'x2axis') {\n                        if (d[j][0] < db.min || db.min == null) {\n                            db.min = d[j][0];\n                        }\n                        if (d[j][0] > db.max || db.max == null) {\n                            db.max = d[j][0];\n                        }\n                    }              \n                    else {\n                        if (d[j][1] < db.min || db.min == null) {\n                            db.min = d[j][1];\n                        }\n                        if (d[j][1] > db.max || db.max == null) {\n                            db.max = d[j][1];\n                        }\n                    }              \n                }\n            }          \n            else {    \n                if (this.name == 'xaxis' || this.name == 'x2axis') {\n                    if (d[0][0] < db.min || db.min == null) {\n                        db.min = d[0][0];\n                    }\n                    if (d[0][0] > db.max || db.max == null) {\n                        db.max = d[0][0];\n                    }\n                    for (var j=0; j<5; j+=2) {\n                        if (d[1][j] < db.min || db.min == null) {\n                            db.min = d[1][j];\n                        }\n                        if (d[1][j] > db.max || db.max == null) {\n                            db.max = d[1][j];\n                        }\n                    }\n                }              \n                else {\n                    if (d[0][1] < db.min || db.min == null) {\n                        db.min = d[0][1];\n                    }\n                    if (d[0][1] > db.max || db.max == null) {\n                        db.max = d[0][1];\n                    }\n                    for (var j=1; j<6; j+=2) {\n                        if (d[1][j] < db.min || db.min == null) {\n                            db.min = d[1][j];\n                        }\n                        if (d[1][j] > db.max || db.max == null) {\n                            db.max = d[1][j];\n                        }\n                    }\n                }           \n            }\n        }\n    };\n    \n    // setup default renderers for axes and legend so user doesn't have to\n    // called with scope of plot\n    function preInit(target, data, options) {\n        options = options || {};\n        options.axesDefaults = $.extend(true, {pad:0}, options.axesDefaults);\n        options.seriesDefaults = options.seriesDefaults || {};\n        options.legend = $.extend(true, {placement:'outside'}, options.legend);\n        // only set these if there is a pie series\n        var setopts = false;\n        if (options.seriesDefaults.renderer == $.jqplot.BezierCurveRenderer) {\n            setopts = true;\n        }\n        else if (options.series) {\n            for (var i=0; i < options.series.length; i++) {\n                if (options.series[i].renderer == $.jqplot.BezierCurveRenderer) {\n                    setopts = true;\n                }\n            }\n        }\n        \n        if (setopts) {\n            options.axesDefaults.renderer = $.jqplot.BezierAxisRenderer;\n        }\n    }\n    \n    $.jqplot.preInitHooks.push(preInit);\n    \n})(jQuery);    "
  },
  {
    "path": "stenogotchi/ui/web/static/js/plugins/jqplot.barRenderer.js",
    "content": "/**\n * jqPlot\n * Pure JavaScript plotting plugin using jQuery\n *\n * Version: 1.0.9\n * Revision: d96a669\n *\n * Copyright (c) 2009-2016 Chris Leonello\n * jqPlot is currently available for use in all personal or commercial projects \n * under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL \n * version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can \n * choose the license that best suits your project and use it accordingly. \n *\n * Although not required, the author would appreciate an email letting him \n * know of any substantial use of jqPlot.  You can reach the author at: \n * chris at jqplot dot com or see http://www.jqplot.com/info.php .\n *\n * If you are feeling kind and generous, consider supporting the project by\n * making a donation at: http://www.jqplot.com/donate.php .\n *\n * sprintf functions contained in jqplot.sprintf.js by Ash Searle:\n *\n *     version 2007.04.27\n *     author Ash Searle\n *     http://hexmen.com/blog/2007/03/printf-sprintf/\n *     http://hexmen.com/js/sprintf.js\n *     The author (Ash Searle) has placed this code in the public domain:\n *     \"This code is unrestricted: you are free to use it however you like.\"\n * \n */\n(function($) {\n    \n    // Class: $.jqplot.BarRenderer\n    // A plugin renderer for jqPlot to draw a bar plot.\n    // Draws series as a line.\n    \n    $.jqplot.BarRenderer = function(){\n        $.jqplot.LineRenderer.call(this);\n    };\n    \n    $.jqplot.BarRenderer.prototype = new $.jqplot.LineRenderer();\n    $.jqplot.BarRenderer.prototype.constructor = $.jqplot.BarRenderer;\n    \n    // called with scope of series.\n    $.jqplot.BarRenderer.prototype.init = function(options, plot) {\n        // Group: Properties\n        //\n        // prop: barPadding\n        // Number of pixels between adjacent bars at the same axis value.\n        this.barPadding = 8;\n        // prop: barMargin\n        // Number of pixels between groups of bars at adjacent axis values.\n        this.barMargin = 10;\n        // prop: barDirection\n        // 'vertical' = up and down bars, 'horizontal' = side to side bars\n        this.barDirection = 'vertical';\n        // prop: barWidth\n        // Width of the bar in pixels (auto by devaul).  null = calculated automatically.\n        this.barWidth = null;\n        // prop: shadowOffset\n        // offset of the shadow from the slice and offset of \n        // each succesive stroke of the shadow from the last.\n        this.shadowOffset = 2;\n        // prop: shadowDepth\n        // number of strokes to apply to the shadow, \n        // each stroke offset shadowOffset from the last.\n        this.shadowDepth = 5;\n        // prop: shadowAlpha\n        // transparency of the shadow (0 = transparent, 1 = opaque)\n        this.shadowAlpha = 0.08;\n        // prop: waterfall\n        // true to enable waterfall plot.\n        this.waterfall = false;\n        // prop: groups\n        // group bars into this many groups\n        this.groups = 1;\n        // prop: varyBarColor\n        // true to color each bar of a series separately rather than\n        // have every bar of a given series the same color.\n        // If used for non-stacked multiple series bar plots, user should\n        // specify a separate 'seriesColors' array for each series.\n        // Otherwise, each series will set their bars to the same color array.\n        // This option has no Effect for stacked bar charts and is disabled.\n        this.varyBarColor = false;\n        // prop: highlightMouseOver\n        // True to highlight slice when moused over.\n        // This must be false to enable highlightMouseDown to highlight when clicking on a slice.\n        this.highlightMouseOver = true;\n        // prop: highlightMouseDown\n        // True to highlight when a mouse button is pressed over a slice.\n        // This will be disabled if highlightMouseOver is true.\n        this.highlightMouseDown = false;\n        // prop: highlightColors\n        // an array of colors to use when highlighting a bar.\n        this.highlightColors = [];\n        // prop: transposedData\n        // NOT IMPLEMENTED YET.  True if this is a horizontal bar plot and \n        // x and y values are \"transposed\".  Tranposed, or \"swapped\", data is \n        // required prior to rev. 894 builds of jqPlot with horizontal bars. \n        // Allows backward compatability of bar renderer horizontal bars with \n        // old style data sets.\n        this.transposedData = true;\n        this.renderer.animation = {\n            show: false,\n            direction: 'down',\n            speed: 3000,\n            _supported: true\n        };\n        this._type = 'bar';\n        \n        // if user has passed in highlightMouseDown option and not set highlightMouseOver, disable highlightMouseOver\n        if (options.highlightMouseDown && options.highlightMouseOver == null) {\n            options.highlightMouseOver = false;\n        }\n        \n        //////\n        // This is probably wrong here.\n        // After going back and forth on whether renderer should be the thing\n        // or extend the thing, it seems that it it best if it is a property\n        // on the thing.  This should be something that is commonized \n        // among series renderers in the future.\n        //////\n        $.extend(true, this, options);\n\n        // really should probably do this\n        $.extend(true, this.renderer, options);\n        // fill is still needed to properly draw the legend.\n        // bars have to be filled.\n        this.fill = true;\n\n        // if horizontal bar and animating, reset the default direction\n        if (this.barDirection === 'horizontal' && this.rendererOptions.animation && this.rendererOptions.animation.direction == null) {\n            this.renderer.animation.direction = 'left';\n        }\n        \n        if (this.waterfall) {\n            this.fillToZero = false;\n            this.disableStack = true;\n        }\n        \n        if (this.barDirection == 'vertical' ) {\n            this._primaryAxis = '_xaxis';\n            this._stackAxis = 'y';\n            this.fillAxis = 'y';\n        }\n        else {\n            this._primaryAxis = '_yaxis';\n            this._stackAxis = 'x';\n            this.fillAxis = 'x';\n        }\n        // index of the currenty highlighted point, if any\n        this._highlightedPoint = null;\n        // total number of values for all bar series, total number of bar series, and position of this series\n        this._plotSeriesInfo = null;\n        // Array of actual data colors used for each data point.\n        this._dataColors = [];\n        this._barPoints = [];\n        \n        // set the shape renderer options\n        var opts = {lineJoin:'miter', lineCap:'round', fill:true, isarc:false, strokeStyle:this.color, fillStyle:this.color, closePath:this.fill};\n        this.renderer.shapeRenderer.init(opts);\n        // set the shadow renderer options\n        var sopts = {lineJoin:'miter', lineCap:'round', fill:true, isarc:false, angle:this.shadowAngle, offset:this.shadowOffset, alpha:this.shadowAlpha, depth:this.shadowDepth, closePath:this.fill};\n        this.renderer.shadowRenderer.init(sopts);\n        \n        plot.postInitHooks.addOnce(postInit);\n        plot.postDrawHooks.addOnce(postPlotDraw);\n        plot.eventListenerHooks.addOnce('jqplotMouseMove', handleMove);\n        plot.eventListenerHooks.addOnce('jqplotMouseDown', handleMouseDown);\n        plot.eventListenerHooks.addOnce('jqplotMouseUp', handleMouseUp);\n        plot.eventListenerHooks.addOnce('jqplotClick', handleClick);\n        plot.eventListenerHooks.addOnce('jqplotRightClick', handleRightClick); \n    };\n    \n    // called with scope of series\n    function barPreInit(target, data, seriesDefaults, options) {\n        if (this.rendererOptions.barDirection == 'horizontal') {\n            this._stackAxis = 'x';\n            this._primaryAxis = '_yaxis';\n        }\n        if (this.rendererOptions.waterfall == true) {\n            this._data = $.extend(true, [], this.data);\n            var sum = 0;\n            var pos = (!this.rendererOptions.barDirection || this.rendererOptions.barDirection === 'vertical' || this.transposedData === false) ? 1 : 0;\n            for(var i=0; i<this.data.length; i++) {\n                sum += this.data[i][pos];\n                if (i>0) {\n                    this.data[i][pos] += this.data[i-1][pos];\n                }\n            }\n            this.data[this.data.length] = (pos == 1) ? [this.data.length+1, sum] : [sum, this.data.length+1];\n            this._data[this._data.length] = (pos == 1) ? [this._data.length+1, sum] : [sum, this._data.length+1];\n        }\n        if (this.rendererOptions.groups > 1) {\n            this.breakOnNull = true;\n            var l = this.data.length;\n            var skip = parseInt(l/this.rendererOptions.groups, 10);\n            var count = 0;\n            for (var i=skip; i<l; i+=skip) {\n                this.data.splice(i+count, 0, [null, null]);\n                this._plotData.splice(i+count, 0, [null, null]);\n                this._stackData.splice(i+count, 0, [null, null]);\n                count++;\n            }\n            for (i=0; i<this.data.length; i++) {\n                if (this._primaryAxis == '_xaxis') {\n                    this.data[i][0] = i+1;\n                    this._plotData[i][0] = i+1;\n                    this._stackData[i][0] = i+1;\n                }\n                else {\n                    this.data[i][1] = i+1;\n                    this._plotData[i][1] = i+1;\n                    this._stackData[i][1] = i+1;\n                }\n            }\n        }\n    }\n    \n    $.jqplot.preSeriesInitHooks.push(barPreInit);\n    \n    // needs to be called with scope of series, not renderer.\n    $.jqplot.BarRenderer.prototype.calcSeriesNumbers = function() {\n        var nvals = 0;\n        var nseries = 0;\n        var paxis = this[this._primaryAxis];\n        var s, series, pos;\n        // loop through all series on this axis\n        for (var i=0; i < paxis._series.length; i++) {\n            series = paxis._series[i];\n            if (series === this) {\n                pos = i;\n            }\n            // is the series rendered as a bar?\n            if (series.renderer.constructor == $.jqplot.BarRenderer) {\n                // gridData may not be computed yet, use data length insted\n                nvals += series.data.length;\n                nseries += 1;\n            }\n        }\n        // return total number of values for all bar series, total number of bar series, and position of this series\n        return [nvals, nseries, pos];\n    };\n\n    $.jqplot.BarRenderer.prototype.setBarWidth = function() {\n        // need to know how many data values we have on the approprate axis and figure it out.\n        var i;\n        var nvals = 0;\n        var nseries = 0;\n        var paxis = this[this._primaryAxis];\n        var s, series, pos;\n        var temp = this._plotSeriesInfo = this.renderer.calcSeriesNumbers.call(this);\n        nvals = temp[0];\n        nseries = temp[1];\n        var nticks = paxis.numberTicks;\n        var nbins = (nticks-1)/2;\n        // so, now we have total number of axis values.\n        if (paxis.name == 'xaxis' || paxis.name == 'x2axis') {\n            if (this._stack) {\n                this.barWidth = (paxis._offsets.max - paxis._offsets.min) / nvals * nseries - this.barMargin;\n            }\n            else {\n                this.barWidth = ((paxis._offsets.max - paxis._offsets.min)/nbins  - this.barPadding * (nseries-1) - this.barMargin*2)/nseries;\n                // this.barWidth = (paxis._offsets.max - paxis._offsets.min) / nvals - this.barPadding - this.barMargin/nseries;\n            }\n        }\n        else {\n            if (this._stack) {\n                this.barWidth = (paxis._offsets.min - paxis._offsets.max) / nvals * nseries - this.barMargin;\n            }\n            else {\n                this.barWidth = ((paxis._offsets.min - paxis._offsets.max)/nbins  - this.barPadding * (nseries-1) - this.barMargin*2)/nseries;\n                // this.barWidth = (paxis._offsets.min - paxis._offsets.max) / nvals - this.barPadding - this.barMargin/nseries;\n            }\n        }\n        return [nvals, nseries];\n    };\n\n    function computeHighlightColors (colors) {\n        var ret = [];\n        for (var i=0; i<colors.length; i++){\n            var rgba = $.jqplot.getColorComponents(colors[i]);\n            var newrgb = [rgba[0], rgba[1], rgba[2]];\n            var sum = newrgb[0] + newrgb[1] + newrgb[2];\n            for (var j=0; j<3; j++) {\n                // when darkening, lowest color component can be is 60.\n                newrgb[j] = (sum > 570) ?  newrgb[j] * 0.8 : newrgb[j] + 0.3 * (255 - newrgb[j]);\n                newrgb[j] = parseInt(newrgb[j], 10);\n            }\n            ret.push('rgb('+newrgb[0]+','+newrgb[1]+','+newrgb[2]+')');\n        }\n        return ret;\n    }\n\n    function getStart(sidx, didx, comp, plot, axis) {\n        // check if sign change\n        var seriesIndex = sidx,\n            prevSeriesIndex = sidx - 1,\n            start,\n            prevVal,\n            aidx = (axis === 'x') ? 0 : 1;\n\n        // is this not the first series?\n        if (seriesIndex > 0) {\n            prevVal = plot.series[prevSeriesIndex]._plotData[didx][aidx];\n\n            // is there a sign change\n            if ((comp * prevVal) < 0) {\n                start = getStart(prevSeriesIndex, didx, comp, plot, axis);\n            }\n\n            // no sign change.\n            else {\n                start = plot.series[prevSeriesIndex].gridData[didx][aidx];\n            }\n\n        }\n\n        // if first series, return value at 0\n        else {\n\n            start = (aidx === 0) ? plot.series[seriesIndex]._xaxis.series_u2p(0) : plot.series[seriesIndex]._yaxis.series_u2p(0);\n        }\n\n        return start;\n    }\n\n    \n    $.jqplot.BarRenderer.prototype.draw = function(ctx, gridData, options, plot) {\n        var i;\n        // Ughhh, have to make a copy of options b/c it may be modified later.\n        var opts = $.extend({}, options);\n        var shadow = (opts.shadow != undefined) ? opts.shadow : this.shadow;\n        var showLine = (opts.showLine != undefined) ? opts.showLine : this.showLine;\n        var fill = (opts.fill != undefined) ? opts.fill : this.fill;\n        var xaxis = this.xaxis;\n        var yaxis = this.yaxis;\n        var xp = this._xaxis.series_u2p;\n        var yp = this._yaxis.series_u2p;\n        var pointx, pointy;\n        // clear out data colors.\n        this._dataColors = [];\n        this._barPoints = [];\n        \n        if (this.barWidth == null || this.rendererOptions.barWidth == null) {//check pull request https://bitbucket.org/cleonello/jqplot/pull-request/61/fix-for-issue-513/diff\n            this.renderer.setBarWidth.call(this);\n        }\n        \n        var temp = this._plotSeriesInfo = this.renderer.calcSeriesNumbers.call(this);\n        var nvals = temp[0];\n        var nseries = temp[1];\n        var pos = temp[2];\n        var points = [];\n        \n        if (this._stack) {\n            this._barNudge = 0;\n        }\n        else {\n            this._barNudge = (-Math.abs(nseries/2 - 0.5) + pos) * (this.barWidth + this.barPadding);\n        }\n        if (showLine) {\n            var negativeColors = new $.jqplot.ColorGenerator(this.negativeSeriesColors);\n            var positiveColors = new $.jqplot.ColorGenerator(this.seriesColors);\n            var negativeColor = negativeColors.get(this.index);\n            if (! this.useNegativeColors) {\n                negativeColor = opts.fillStyle;\n            }\n            var positiveColor = opts.fillStyle;\n            var base;\n            var xstart; \n            var ystart;\n            \n            if (this.barDirection == 'vertical') {\n                for (var i=0; i<gridData.length; i++) {\n                    if (!this._stack && this.data[i][1] == null) {\n                        continue;\n                    }\n                    points = [];\n                    base = gridData[i][0] + this._barNudge;\n                    \n                    // stacked\n                    if (this._stack && this._prevGridData.length) {\n                        ystart = getStart(this.index, i, this._plotData[i][1], plot, 'y');\n                    }\n\n                    // not stacked\n                    else {\n                        if (this.fillToZero) {\n                            ystart = this._yaxis.series_u2p(0);\n                        }\n                        else if (this.waterfall && i > 0 && i < this.gridData.length-1) {\n                            ystart = this.gridData[i-1][1];\n                        }\n                        else if (this.waterfall && i == 0 && i < this.gridData.length-1) {\n                            if (this._yaxis.min <= 0 && this._yaxis.max >= 0) {\n                                ystart = this._yaxis.series_u2p(0);\n                            }\n                            else if (this._yaxis.min > 0) {\n                                ystart = ctx.canvas.height;\n                            }\n                            else {\n                                ystart = 0;\n                            }\n                        }\n                        else if (this.waterfall && i == this.gridData.length - 1) {\n                            if (this._yaxis.min <= 0 && this._yaxis.max >= 0) {\n                                ystart = this._yaxis.series_u2p(0);\n                            }\n                            else if (this._yaxis.min > 0) {\n                                ystart = ctx.canvas.height;\n                            }\n                            else {\n                                ystart = 0;\n                            }\n                        }\n                        else {\n                            ystart = ctx.canvas.height;\n                        }\n                    }\n                    if ((this.fillToZero && this._plotData[i][1] < 0) || (this.waterfall && this._data[i][1] < 0)) {\n                        if (this.varyBarColor && !this._stack) {\n                            if (this.useNegativeColors) {\n                                opts.fillStyle = negativeColors.next();\n                            }\n                            else {\n                                opts.fillStyle = positiveColors.next();\n                            }\n                        }\n                        else {\n                            opts.fillStyle = negativeColor;\n                        }\n                    }\n                    else {\n                        if (this.varyBarColor && !this._stack) {\n                            opts.fillStyle = positiveColors.next();\n                        }\n                        else {\n                            opts.fillStyle = positiveColor;\n                        }\n                    }\n                    \n                    if (!this.fillToZero || this._plotData[i][1] >= 0) { \n                        points.push([base-this.barWidth/2, ystart]);\n                        points.push([base-this.barWidth/2, gridData[i][1]]);\n                        points.push([base+this.barWidth/2, gridData[i][1]]);\n                        points.push([base+this.barWidth/2, ystart]);\n                    }\n                    // for negative bars make sure points are always ordered clockwise\n                    else {              \n                        points.push([base-this.barWidth/2, gridData[i][1]]);\n                        points.push([base-this.barWidth/2, ystart]);\n                        points.push([base+this.barWidth/2, ystart]);\n                        points.push([base+this.barWidth/2, gridData[i][1]]);\n                    }\n                    this._barPoints.push(points);\n                    // now draw the shadows if not stacked.\n                    // for stacked plots, they are predrawn by drawShadow\n                    if (shadow && !this._stack) {\n                        var sopts = $.extend(true, {}, opts);\n                        // need to get rid of fillStyle on shadow.\n                        delete sopts.fillStyle;\n                        this.renderer.shadowRenderer.draw(ctx, points, sopts);\n                    }\n                    var clr = opts.fillStyle || this.color;\n                    this._dataColors.push(clr);\n                    this.renderer.shapeRenderer.draw(ctx, points, opts); \n                }\n            }\n            \n            else if (this.barDirection == 'horizontal'){\n                for (var i=0; i<gridData.length; i++) {\n                    if (!this._stack && this.data[i][0] == null) {\n                        continue;\n                    }\n                    points = [];\n                    base = gridData[i][1] - this._barNudge;\n                    xstart;\n                    \n                    if (this._stack && this._prevGridData.length) {\n                        xstart = getStart(this.index, i, this._plotData[i][0], plot, 'x');\n                    }\n                    // not stacked\n                    else {\n                        if (this.fillToZero) {\n                            xstart = this._xaxis.series_u2p(0);\n                        }\n                        else if (this.waterfall && i > 0 && i < this.gridData.length-1) {\n                            xstart = this.gridData[i-1][0];\n                        }\n                        else if (this.waterfall && i == 0 && i < this.gridData.length-1) {\n                            if (this._xaxis.min <= 0 && this._xaxis.max >= 0) {\n                                xstart = this._xaxis.series_u2p(0);\n                            }\n                            else if (this._xaxis.min > 0) {\n                                xstart = 0;\n                            }\n                            else {\n                                xstart = 0;\n                            }\n                        }\n                        else if (this.waterfall && i == this.gridData.length - 1) {\n                            if (this._xaxis.min <= 0 && this._xaxis.max >= 0) {\n                                xstart = this._xaxis.series_u2p(0);\n                            }\n                            else if (this._xaxis.min > 0) {\n                                xstart = 0;\n                            }\n                            else {\n                                xstart = ctx.canvas.width;\n                            }\n                        }\n                        else {\n                            xstart = 0;\n                        }\n                    }\n                    if ((this.fillToZero && this._plotData[i][0] < 0) || (this.waterfall && this._data[i][0] < 0)) {\n                        if (this.varyBarColor && !this._stack) {\n                            if (this.useNegativeColors) {\n                                opts.fillStyle = negativeColors.next();\n                            }\n                            else {\n                                opts.fillStyle = positiveColors.next();\n                            }\n                        }\n                        else {\n                            opts.fillStyle = negativeColor;\n                        }\n                    }\n                    else {\n                        if (this.varyBarColor && !this._stack) {\n                            opts.fillStyle = positiveColors.next();\n                        }\n                        else {\n                            opts.fillStyle = positiveColor;\n                        }                    \n                    }\n                    \n\n                    if (!this.fillToZero || this._plotData[i][0] >= 0) {\n                        points.push([xstart, base + this.barWidth / 2]);\n                        points.push([xstart, base - this.barWidth / 2]);\n                        points.push([gridData[i][0], base - this.barWidth / 2]);\n                        points.push([gridData[i][0], base + this.barWidth / 2]);\n                    }\n                    else {\n                        points.push([gridData[i][0], base + this.barWidth / 2]);\n                        points.push([gridData[i][0], base - this.barWidth / 2]);\n                        points.push([xstart, base - this.barWidth / 2]);\n                        points.push([xstart, base + this.barWidth / 2]);\n                    }\n\n                    this._barPoints.push(points);\n                    // now draw the shadows if not stacked.\n                    // for stacked plots, they are predrawn by drawShadow\n                    if (shadow && !this._stack) {\n                        var sopts = $.extend(true, {}, opts);\n                        delete sopts.fillStyle;\n                        this.renderer.shadowRenderer.draw(ctx, points, sopts);\n                    }\n                    var clr = opts.fillStyle || this.color;\n                    this._dataColors.push(clr);\n                    this.renderer.shapeRenderer.draw(ctx, points, opts);\n                } \n            }\n        }                \n        \n        if (this.highlightColors.length == 0) {\n            this.highlightColors = $.jqplot.computeHighlightColors(this._dataColors);\n        }\n        \n        else if (typeof(this.highlightColors) == 'string') {\n            var temp = this.highlightColors;\n            this.highlightColors = [];\n            for (var i=0; i<this._dataColors.length; i++) {\n                this.highlightColors.push(temp);\n            }\n        }\n        \n    };\n    \n     \n    // for stacked plots, shadows will be pre drawn by drawShadow.\n    $.jqplot.BarRenderer.prototype.drawShadow = function(ctx, gridData, options, plot) {\n        var i;\n        var opts = (options != undefined) ? options : {};\n        var shadow = (opts.shadow != undefined) ? opts.shadow : this.shadow;\n        var showLine = (opts.showLine != undefined) ? opts.showLine : this.showLine;\n        var fill = (opts.fill != undefined) ? opts.fill : this.fill;\n        var xaxis = this.xaxis;\n        var yaxis = this.yaxis;\n        var xp = this._xaxis.series_u2p;\n        var yp = this._yaxis.series_u2p;\n        var pointx, points, pointy, nvals, nseries, pos;\n        \n        if (this._stack && this.shadow) {\n            if (this.barWidth == null) {\n                this.renderer.setBarWidth.call(this);\n            }\n        \n            var temp = this._plotSeriesInfo = this.renderer.calcSeriesNumbers.call(this);\n            nvals = temp[0];\n            nseries = temp[1];\n            pos = temp[2];\n        \n            if (this._stack) {\n                this._barNudge = 0;\n            }\n            else {\n                this._barNudge = (-Math.abs(nseries/2 - 0.5) + pos) * (this.barWidth + this.barPadding);\n            }\n            if (showLine) {\n            \n                if (this.barDirection == 'vertical') {\n                    for (var i=0; i<gridData.length; i++) {\n                        if (this.data[i][1] == null) {\n                            continue;\n                        }\n                        points = [];\n                        var base = gridData[i][0] + this._barNudge;\n                        var ystart;\n                    \n                        if (this._stack && this._prevGridData.length) {\n                            ystart = getStart(this.index, i, this._plotData[i][1], plot, 'y');\n                        }\n                        else {\n                            if (this.fillToZero) {\n                                ystart = this._yaxis.series_u2p(0);\n                            }\n                            else {\n                                ystart = ctx.canvas.height;\n                            }\n                        }\n                    \n                        points.push([base-this.barWidth/2, ystart]);\n                        points.push([base-this.barWidth/2, gridData[i][1]]);\n                        points.push([base+this.barWidth/2, gridData[i][1]]);\n                        points.push([base+this.barWidth/2, ystart]);\n                        this.renderer.shadowRenderer.draw(ctx, points, opts);\n                    }\n                }\n            \n                else if (this.barDirection == 'horizontal'){\n                    for (var i=0; i<gridData.length; i++) {\n                        if (this.data[i][0] == null) {\n                            continue;\n                        }\n                        points = [];\n                        var base = gridData[i][1] - this._barNudge;\n                        var xstart;\n                    \n                        if (this._stack && this._prevGridData.length) {\n                            xstart = getStart(this.index, i, this._plotData[i][0], plot, 'x');\n                        }\n                        else {\n                            if (this.fillToZero) {\n                                xstart = this._xaxis.series_u2p(0);\n                            }\n                            else {\n                                xstart = 0;\n                            }\n                        }\n                    \n                        points.push([xstart, base+this.barWidth/2]);\n                        points.push([gridData[i][0], base+this.barWidth/2]);\n                        points.push([gridData[i][0], base-this.barWidth/2]);\n                        points.push([xstart, base-this.barWidth/2]);\n                        this.renderer.shadowRenderer.draw(ctx, points, opts);\n                    }  \n                }\n            }   \n            \n        }\n    };\n    \n    function postInit(target, data, options) {\n        for (var i=0; i<this.series.length; i++) {\n            if (this.series[i].renderer.constructor == $.jqplot.BarRenderer) {\n                // don't allow mouseover and mousedown at same time.\n                if (this.series[i].highlightMouseOver) {\n                    this.series[i].highlightMouseDown = false;\n                }\n            }\n        }\n    }\n    \n    // called within context of plot\n    // create a canvas which we can draw on.\n    // insert it before the eventCanvas, so eventCanvas will still capture events.\n    function postPlotDraw() {\n        // Memory Leaks patch    \n        if (this.plugins.barRenderer && this.plugins.barRenderer.highlightCanvas) {\n\n            this.plugins.barRenderer.highlightCanvas.resetCanvas();\n            this.plugins.barRenderer.highlightCanvas = null;\n        }\n         \n        this.plugins.barRenderer = {highlightedSeriesIndex:null};\n        this.plugins.barRenderer.highlightCanvas = new $.jqplot.GenericCanvas();\n        \n        this.eventCanvas._elem.before(this.plugins.barRenderer.highlightCanvas.createElement(this._gridPadding, 'jqplot-barRenderer-highlight-canvas', this._plotDimensions, this));\n        this.plugins.barRenderer.highlightCanvas.setContext();\n        this.eventCanvas._elem.bind('mouseleave', {plot:this}, function (ev) { unhighlight(ev.data.plot); });\n    }   \n    \n    function highlight (plot, sidx, pidx, points) {\n        var s = plot.series[sidx];\n        var canvas = plot.plugins.barRenderer.highlightCanvas;\n        canvas._ctx.clearRect(0,0,canvas._ctx.canvas.width, canvas._ctx.canvas.height);\n        s._highlightedPoint = pidx;\n        plot.plugins.barRenderer.highlightedSeriesIndex = sidx;\n        var opts = {fillStyle: s.highlightColors[pidx]};\n        s.renderer.shapeRenderer.draw(canvas._ctx, points, opts);\n        canvas = null;\n    }\n    \n    function unhighlight (plot) {\n        var canvas = plot.plugins.barRenderer.highlightCanvas;\n        canvas._ctx.clearRect(0,0, canvas._ctx.canvas.width, canvas._ctx.canvas.height);\n        for (var i=0; i<plot.series.length; i++) {\n            plot.series[i]._highlightedPoint = null;\n        }\n        plot.plugins.barRenderer.highlightedSeriesIndex = null;\n        plot.target.trigger('jqplotDataUnhighlight');\n        canvas =  null;\n    }\n    \n    \n    function handleMove(ev, gridpos, datapos, neighbor, plot) {\n        if (neighbor) {\n            var ins = [neighbor.seriesIndex, neighbor.pointIndex, neighbor.data];\n            var evt1 = jQuery.Event('jqplotDataMouseOver');\n            evt1.pageX = ev.pageX;\n            evt1.pageY = ev.pageY;\n            plot.target.trigger(evt1, ins);\n            if (plot.series[ins[0]].show && plot.series[ins[0]].highlightMouseOver &&\n                !(ins[0] == plot.plugins.barRenderer.highlightedSeriesIndex && ins[1] == plot.series[ins[0]]._highlightedPoint)) {\n                var evt = jQuery.Event('jqplotDataHighlight');\n                evt.which = ev.which;\n                evt.pageX = ev.pageX;\n                evt.pageY = ev.pageY;\n                plot.target.trigger(evt, ins);\n                highlight (plot, neighbor.seriesIndex, neighbor.pointIndex, neighbor.points);\n            }\n        }\n        else if (neighbor == null) {\n            unhighlight (plot);\n        }\n    }\n    \n    function handleMouseDown(ev, gridpos, datapos, neighbor, plot) {\n        if (neighbor) {\n            var ins = [neighbor.seriesIndex, neighbor.pointIndex, neighbor.data];\n            if (plot.series[ins[0]].highlightMouseDown && !(ins[0] == plot.plugins.barRenderer.highlightedSeriesIndex && ins[1] == plot.series[ins[0]]._highlightedPoint)) {\n                var evt = jQuery.Event('jqplotDataHighlight');\n                evt.which = ev.which;\n                evt.pageX = ev.pageX;\n                evt.pageY = ev.pageY;\n                plot.target.trigger(evt, ins);\n                highlight (plot, neighbor.seriesIndex, neighbor.pointIndex, neighbor.points);\n            }\n        }\n        else if (neighbor == null) {\n            unhighlight (plot);\n        }\n    }\n    \n    function handleMouseUp(ev, gridpos, datapos, neighbor, plot) {\n        var idx = plot.plugins.barRenderer.highlightedSeriesIndex;\n        if (idx != null && plot.series[idx].highlightMouseDown) {\n            unhighlight(plot);\n        }\n    }\n    \n    function handleClick(ev, gridpos, datapos, neighbor, plot) {\n        if (neighbor) {\n            var ins = [neighbor.seriesIndex, neighbor.pointIndex, neighbor.data];\n            var evt = jQuery.Event('jqplotDataClick');\n            evt.which = ev.which;\n            evt.pageX = ev.pageX;\n            evt.pageY = ev.pageY;\n            plot.target.trigger(evt, ins);\n        }\n    }\n    \n    function handleRightClick(ev, gridpos, datapos, neighbor, plot) {\n        if (neighbor) {\n            var ins = [neighbor.seriesIndex, neighbor.pointIndex, neighbor.data];\n            var idx = plot.plugins.barRenderer.highlightedSeriesIndex;\n            if (idx != null && plot.series[idx].highlightMouseDown) {\n                unhighlight(plot);\n            }\n            var evt = jQuery.Event('jqplotDataRightClick');\n            evt.which = ev.which;\n            evt.pageX = ev.pageX;\n            evt.pageY = ev.pageY;\n            plot.target.trigger(evt, ins);\n        }\n    }\n    \n    \n})(jQuery);\n"
  },
  {
    "path": "stenogotchi/ui/web/static/js/plugins/jqplot.blockRenderer.js",
    "content": "/**\n * jqPlot\n * Pure JavaScript plotting plugin using jQuery\n *\n * Version: 1.0.9\n * Revision: d96a669\n *\n * Copyright (c) 2009-2016 Chris Leonello\n * jqPlot is currently available for use in all personal or commercial projects \n * under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL \n * version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can \n * choose the license that best suits your project and use it accordingly. \n *\n * Although not required, the author would appreciate an email letting him \n * know of any substantial use of jqPlot.  You can reach the author at: \n * chris at jqplot dot com or see http://www.jqplot.com/info.php .\n *\n * If you are feeling kind and generous, consider supporting the project by\n * making a donation at: http://www.jqplot.com/donate.php .\n *\n * sprintf functions contained in jqplot.sprintf.js by Ash Searle:\n *\n *     version 2007.04.27\n *     author Ash Searle\n *     http://hexmen.com/blog/2007/03/printf-sprintf/\n *     http://hexmen.com/js/sprintf.js\n *     The author (Ash Searle) has placed this code in the public domain:\n *     \"This code is unrestricted: you are free to use it however you like.\"\n * \n */\n(function($) {\n    /**\n     * Class: $.jqplot.BlockRenderer\n     * Plugin renderer to draw a x-y block chart.  A Block chart has data points displayed as\n     * colored squares with a text label inside.  Data must be supplied in the form:\n     * \n     * > [[x1, y1, \"label 1\", {css}], [x2, y2, \"label 2\", {css}], ...]\n     * \n     * The label and css object are optional.  If the label is ommitted, the\n     * box will collapse unless a css height and/or width is specified.\n     * \n     * The css object is an object specifying css properties \n     * such as:\n     * \n     * > {background:'#4f98a5', border:'3px solid gray', padding:'1px'}\n     * \n     * Note that css properties specified with the data point override defaults\n     * specified with the series.\n     * \n     */\n    $.jqplot.BlockRenderer = function(){\n        $.jqplot.LineRenderer.call(this);\n    };\n    \n    $.jqplot.BlockRenderer.prototype = new $.jqplot.LineRenderer();\n    $.jqplot.BlockRenderer.prototype.constructor = $.jqplot.BlockRenderer;\n    \n    // called with scope of a series\n    $.jqplot.BlockRenderer.prototype.init = function(options) {\n        // Group: Properties\n        //\n        // prop: css\n        // default css styles that will be applied to all data blocks.\n        // these values will be overridden by css styles supplied with the\n        // individulal data points.\n        this.css = {padding:'2px', border:'1px solid #999', textAlign:'center'};\n        // prop: escapeHtml\n        // true to escape html in the box label.\n        this.escapeHtml = false;\n        // prop: insertBreaks\n        // true to turn spaces in data block label into html breaks <br />.\n        this.insertBreaks = true;\n        // prop: varyBlockColors\n        // true to vary the color of each block in this series according to\n        // the seriesColors array.  False to set each block to the color\n        // specified on this series.  This has no effect if a css background color\n        // option is specified in the renderer css options.\n        this.varyBlockColors = false;\n        $.extend(true, this, options);\n        if (this.css.backgroundColor) {\n            this.color = this.css.backgroundColor;\n        }\n        else if (this.css.background) {\n            this.color = this.css.background;\n        }\n        else if (!this.varyBlockColors) {\n            this.css.background = this.color;\n        }\n        this.canvas = new $.jqplot.BlockCanvas();\n        this.shadowCanvas =  new $.jqplot.BlockCanvas();\n        this.canvas._plotDimensions = this._plotDimensions;\n        this.shadowCanvas._plotDimensions = this._plotDimensions;\n        this._type = 'block';\n        \n        // group: Methods \n        //\n        // Method: moveBlock\n        // Moves an individual block.  More efficient than redrawing\n        // the whole series by calling plot.drawSeries().\n        // Properties:\n        // idx - the 0 based index of the block or point in this series.\n        // x - the x coordinate in data units (value on x axis) to move the block to.\n        // y - the y coordinate in data units (value on the y axis) to move the block to.\n        // duration - optional parameter to create an animated movement.  Can be a\n        // number (higher is slower animation) or 'fast', 'normal' or 'slow'.  If not\n        // provided, the element is moved without any animation.\n        this.moveBlock = function (idx, x, y, duration) {\n            // update plotData, stackData, data and gridData\n            // x and y are in data coordinates.\n            var el = this.canvas._elem.children(':eq('+idx+')');\n            this.data[idx][0] = x;\n            this.data[idx][1] = y;\n            this._plotData[idx][0] = x;\n            this._plotData[idx][1] = y;\n            this._stackData[idx][0] = x;\n            this._stackData[idx][1] = y;\n            this.gridData[idx][0] = this._xaxis.series_u2p(x);\n            this.gridData[idx][1] = this._yaxis.series_u2p(y);\n            var w = el.outerWidth();\n            var h = el.outerHeight();\n            var left = this.gridData[idx][0] - w/2 + 'px';\n            var top = this.gridData[idx][1] - h/2 + 'px';\n            if (duration) {\n                if (parseInt(duration, 10)) {\n                    duration = parseInt(duration, 10);\n                }\n                el.animate({left:left, top:top}, duration);\n            }\n            else {\n                el.css({left:left, top:top});\n            }\n            el = null;\n        };\n    };\n    \n    // called with scope of series\n    $.jqplot.BlockRenderer.prototype.draw = function (ctx, gd, options) {\n        if (this.plugins.pointLabels) {\n            this.plugins.pointLabels.show = false;\n        }\n        var i, el, d, gd, t, css, w, h, left, top;\n        var opts = (options != undefined) ? options : {};\n        var colorGenerator = new $.jqplot.ColorGenerator(this.seriesColors);\n        this.canvas._elem.empty();\n        for (i=0; i<this.gridData.length; i++) {\n            d = this.data[i];\n            gd = this.gridData[i];\n            t = '';\n            css = {};\n            if (typeof d[2] == 'string') {\n                t = d[2];\n            }\n            else if (typeof d[2] == 'object') {\n                css = d[2];\n            }\n            if (typeof d[3] ==  'object') {\n                css = d[3];\n            }\n            if (this.insertBreaks){ \n                t = t.replace(/ /g, '<br />');\n            }\n            css = $.extend(true, {}, this.css, css);\n            // create a div\n            el = $('<div style=\"position:absolute;margin-left:auto;margin-right:auto;\"></div>');\n            this.canvas._elem.append(el);\n            // set text\n            this.escapeHtml ? el.text(t) : el.html(t);\n            // style it\n            // remove styles we don't want overridden.\n            delete css.position;\n            delete css.marginRight;\n            delete css.marginLeft;\n            if (!css.background && !css.backgroundColor && !css.backgroundImage){ \n                css.background = colorGenerator.next();\n            }\n            el.css(css);\n            w = el.outerWidth();\n            h = el.outerHeight();\n            left = gd[0] - w/2 + 'px';\n            top = gd[1] - h/2 + 'px';\n            el.css({left:left, top:top});\n            el = null;\n        }\n    };\n    \n    $.jqplot.BlockCanvas = function() {\n        $.jqplot.ElemContainer.call(this);\n        this._ctx;  \n    };\n    \n    $.jqplot.BlockCanvas.prototype = new $.jqplot.ElemContainer();\n    $.jqplot.BlockCanvas.prototype.constructor = $.jqplot.BlockCanvas;\n    \n    $.jqplot.BlockCanvas.prototype.createElement = function(offsets, clss, plotDimensions) {\n        this._offsets = offsets;\n        var klass = 'jqplot-blockCanvas';\n        if (clss != undefined) {\n            klass = clss;\n        }\n        var elem;\n        // if this canvas already has a dom element, don't make a new one.\n        if (this._elem) {\n            elem = this._elem.get(0);\n        }\n        else {\n            elem = document.createElement('div');\n        }\n        // if new plotDimensions supplied, use them.\n        if (plotDimensions != undefined) {\n            this._plotDimensions = plotDimensions;\n        }\n        \n        var w = this._plotDimensions.width - this._offsets.left - this._offsets.right + 'px';\n        var h = this._plotDimensions.height - this._offsets.top - this._offsets.bottom + 'px';\n        this._elem = $(elem);\n        this._elem.css({ position: 'absolute', width:w, height:h, left: this._offsets.left, top: this._offsets.top });\n        \n        this._elem.addClass(klass);\n        return this._elem;\n    };\n    \n    $.jqplot.BlockCanvas.prototype.setContext = function() {\n        this._ctx = {\n            canvas:{\n                width:0,\n                height:0\n            },\n            clearRect:function(){return null;}\n        };\n        return this._ctx;\n    };\n    \n})(jQuery);\n    \n    "
  },
  {
    "path": "stenogotchi/ui/web/static/js/plugins/jqplot.bubbleRenderer.js",
    "content": "/**\n * jqPlot\n * Pure JavaScript plotting plugin using jQuery\n *\n * Version: 1.0.9\n * Revision: d96a669\n *\n * Copyright (c) 2009-2016 Chris Leonello\n * jqPlot is currently available for use in all personal or commercial projects \n * under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL \n * version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can \n * choose the license that best suits your project and use it accordingly. \n *\n * Although not required, the author would appreciate an email letting him \n * know of any substantial use of jqPlot.  You can reach the author at: \n * chris at jqplot dot com or see http://www.jqplot.com/info.php .\n *\n * If you are feeling kind and generous, consider supporting the project by\n * making a donation at: http://www.jqplot.com/donate.php .\n *\n * sprintf functions contained in jqplot.sprintf.js by Ash Searle:\n *\n *     version 2007.04.27\n *     author Ash Searle\n *     http://hexmen.com/blog/2007/03/printf-sprintf/\n *     http://hexmen.com/js/sprintf.js\n *     The author (Ash Searle) has placed this code in the public domain:\n *     \"This code is unrestricted: you are free to use it however you like.\"\n * \n */\n(function($) {\n    var arrayMax = function( array ){\n        return Math.max.apply( Math, array );\n    };\n    var arrayMin = function( array ){\n        return Math.min.apply( Math, array );\n    };\n\n    /**\n     * Class: $.jqplot.BubbleRenderer\n     * Plugin renderer to draw a bubble chart.  A Bubble chart has data points displayed as\n     * colored circles with an optional text label inside.  To use\n     * the bubble renderer, you must include the bubble renderer like:\n     * \n     * > <script language=\"javascript\" type=\"text/javascript\" src=\"../src/plugins/jqplot.bubbleRenderer.js\"></script>\n     * \n     * Data must be supplied in \n     * the form:\n     * \n     * > [[x1, y1, r1, <label or {label:'text', color:color}>], ...]\n     * \n     * where the label or options \n     * object is optional.  \n     * \n     * Note that all bubble colors will be the same\n     * unless the \"varyBubbleColors\" option is set to true.  Colors can be specified in the data array\n     * or in the seriesColors array option on the series.  If no colors are defined, the default jqPlot\n     * series of 16 colors are used.  Colors are automatically cycled around again if there are more\n     * bubbles than colors.\n     * \n     * Bubbles are autoscaled by default to fit within the chart area while maintaining \n     * relative sizes.  If the \"autoscaleBubbles\" option is set to false, the r(adius) values\n     * in the data array a treated as literal pixel values for the radii of the bubbles.\n     * \n     * Properties are passed into the bubble renderer in the rendererOptions object of\n     * the series options like:\n     * \n     * > seriesDefaults: {\n     * >     renderer: $.jqplot.BubbleRenderer,\n     * >     rendererOptions: {\n     * >         bubbleAlpha: 0.7,\n     * >         varyBubbleColors: false\n     * >     }\n     * > }\n     * \n     */\n    $.jqplot.BubbleRenderer = function(){\n        $.jqplot.LineRenderer.call(this);\n    };\n    \n    $.jqplot.BubbleRenderer.prototype = new $.jqplot.LineRenderer();\n    $.jqplot.BubbleRenderer.prototype.constructor = $.jqplot.BubbleRenderer;\n    \n    // called with scope of a series\n    $.jqplot.BubbleRenderer.prototype.init = function(options, plot) {\n        // Group: Properties\n        //\n        // prop: varyBubbleColors\n        // True to vary the color of each bubble in this series according to\n        // the seriesColors array.  False to set each bubble to the color\n        // specified on this series.  This has no effect if a css background color\n        // option is specified in the renderer css options.\n        this.varyBubbleColors = true;\n        // prop: autoscaleBubbles\n        // True to scale the bubble radius based on plot size.\n        // False will use the radius value as provided as a raw pixel value for\n        // bubble radius.\n        this.autoscaleBubbles = true;\n        // prop: autoscaleMultiplier\n        // Multiplier the bubble size if autoscaleBubbles is true.\n        this.autoscaleMultiplier = 1.0;\n        // prop: autoscalePointsFactor\n        // Factor which decreases bubble size based on how many bubbles on on the chart.\n        // 0 means no adjustment for number of bubbles.  Negative values will decrease\n        // size of bubbles as more bubbles are added.  Values between 0 and -0.2\n        // should work well.\n        this.autoscalePointsFactor = -0.07;\n        // prop: escapeHtml\n        // True to escape html in bubble label text.\n        this.escapeHtml = true;\n        // prop: highlightMouseOver\n        // True to highlight bubbles when moused over.\n        // This must be false to enable highlightMouseDown to highlight when clicking on a slice.\n        this.highlightMouseOver = true;\n        // prop: highlightMouseDown\n        // True to highlight when a mouse button is pressed over a bubble.\n        // This will be disabled if highlightMouseOver is true.\n        this.highlightMouseDown = false;\n        // prop: highlightColors\n        // An array of colors to use when highlighting a slice.  Calculated automatically\n        // if not supplied.\n        this.highlightColors = [];\n        // prop: bubbleAlpha\n        // Alpha transparency to apply to all bubbles in this series.\n        this.bubbleAlpha = 1.0;\n        // prop: highlightAlpha\n        // Alpha transparency to apply when highlighting bubble.\n        // Set to value of bubbleAlpha by default.\n        this.highlightAlpha = null;\n        // prop: bubbleGradients\n        // True to color the bubbles with gradient fills instead of flat colors.\n        // NOT AVAILABLE IN IE due to lack of excanvas support for radial gradient fills.\n        // will be ignored in IE.\n        this.bubbleGradients = false;\n        // prop: showLabels\n        // True to show labels on bubbles (if any), false to not show.\n        this.showLabels = true;\n        // array of [point index, radius] which will be sorted in descending order to plot \n        // largest points below smaller points.\n        this.radii = [];\n        this.maxRadius = 0;\n        // index of the currenty highlighted point, if any\n        this._highlightedPoint = null;\n        // array of jQuery labels.\n        this.labels = [];\n        this.bubbleCanvases = [];\n        this._type = 'bubble';\n        \n        // if user has passed in highlightMouseDown option and not set highlightMouseOver, disable highlightMouseOver\n        if (options.highlightMouseDown && options.highlightMouseOver == null) {\n            options.highlightMouseOver = false;\n        }\n        \n        $.extend(true, this, options);\n        \n        if (this.highlightAlpha == null) {\n            this.highlightAlpha = this.bubbleAlpha;\n            if (this.bubbleGradients) {\n                this.highlightAlpha = 0.35;\n            }\n        }\n        \n        this.autoscaleMultiplier = this.autoscaleMultiplier * Math.pow(this.data.length, this.autoscalePointsFactor);\n        \n        // index of the currenty highlighted point, if any\n        this._highlightedPoint = null;\n        \n        // adjust the series colors for options colors passed in with data or for alpha.\n        // note, this can leave undefined holes in the seriesColors array.\n        var comps;\n        for (var i=0; i<this.data.length; i++) {\n            var color = null;\n            var d = this.data[i];\n            this.maxRadius = Math.max(this.maxRadius, d[2]);\n            if (d[3]) {\n                if (typeof(d[3]) == 'object') {\n                    color = d[3]['color'];\n                }\n            }\n            \n            if (color == null) {\n                if (this.seriesColors[i] != null) {\n                    color = this.seriesColors[i];\n                }\n            }\n            \n            if (color && this.bubbleAlpha < 1.0) {\n                comps = $.jqplot.getColorComponents(color);\n                color = 'rgba('+comps[0]+', '+comps[1]+', '+comps[2]+', '+this.bubbleAlpha+')';\n            }\n            \n            if (color) {\n                this.seriesColors[i] = color;\n            }\n        }\n        \n        if (!this.varyBubbleColors) {\n            this.seriesColors = [this.color];\n        }\n        \n        this.colorGenerator = new $.jqplot.ColorGenerator(this.seriesColors);\n        \n        // set highlight colors if none provided\n        if (this.highlightColors.length == 0) {\n            for (var i=0; i<this.seriesColors.length; i++){\n                var rgba = $.jqplot.getColorComponents(this.seriesColors[i]);\n                var newrgb = [rgba[0], rgba[1], rgba[2]];\n                var sum = newrgb[0] + newrgb[1] + newrgb[2];\n                for (var j=0; j<3; j++) {\n                    // when darkening, lowest color component can be is 60.\n                    newrgb[j] = (sum > 570) ?  newrgb[j] * 0.8 : newrgb[j] + 0.3 * (255 - newrgb[j]);\n                    newrgb[j] = parseInt(newrgb[j], 10);\n                }\n                this.highlightColors.push('rgba('+newrgb[0]+','+newrgb[1]+','+newrgb[2]+', '+this.highlightAlpha+')');\n            }\n        }\n        \n        this.highlightColorGenerator = new $.jqplot.ColorGenerator(this.highlightColors);\n        \n        var sopts = {fill:true, isarc:true, angle:this.shadowAngle, alpha:this.shadowAlpha, closePath:true};\n        \n        this.renderer.shadowRenderer.init(sopts);\n        \n        this.canvas = new $.jqplot.DivCanvas();\n        this.canvas._plotDimensions = this._plotDimensions;\n        \n        plot.eventListenerHooks.addOnce('jqplotMouseMove', handleMove);\n        plot.eventListenerHooks.addOnce('jqplotMouseDown', handleMouseDown);\n        plot.eventListenerHooks.addOnce('jqplotMouseUp', handleMouseUp);\n        plot.eventListenerHooks.addOnce('jqplotClick', handleClick);\n        plot.eventListenerHooks.addOnce('jqplotRightClick', handleRightClick);\n        plot.postDrawHooks.addOnce(postPlotDraw);\n        \n    };\n    \n\n    // converts the user data values to grid coordinates and stores them\n    // in the gridData array.\n    // Called with scope of a series.\n    $.jqplot.BubbleRenderer.prototype.setGridData = function(plot) {\n        // recalculate the grid data\n        var xp = this._xaxis.series_u2p;\n        var yp = this._yaxis.series_u2p;\n        var data = this._plotData;\n        this.gridData = [];\n        var radii = [];\n        this.radii = [];\n        var dim = Math.min(plot._height, plot._width);\n        for (var i=0; i<this.data.length; i++) {\n            if (data[i] != null) {\n                this.gridData.push([xp.call(this._xaxis, data[i][0]), yp.call(this._yaxis, data[i][1]), data[i][2]]);\n                this.radii.push([i, data[i][2]]);\n                radii.push(data[i][2]);\n            }\n        }\n        var r, val, maxr = this.maxRadius = arrayMax(radii);\n        var l = this.gridData.length;\n        if (this.autoscaleBubbles) {\n            for (var i=0; i<l; i++) {\n                val = radii[i]/maxr;\n                r = this.autoscaleMultiplier * dim / 6;\n                this.gridData[i][2] = r * val;\n            }\n        }\n        \n        this.radii.sort(function(a, b) { return b[1] - a[1]; });\n    };\n    \n    // converts any arbitrary data values to grid coordinates and\n    // returns them.  This method exists so that plugins can use a series'\n    // linerenderer to generate grid data points without overwriting the\n    // grid data associated with that series.\n    // Called with scope of a series.\n    $.jqplot.BubbleRenderer.prototype.makeGridData = function(data, plot) {\n        // recalculate the grid data\n        var xp = this._xaxis.series_u2p;\n        var yp = this._yaxis.series_u2p;\n        var gd = [];\n        var radii = [];\n        this.radii = [];\n        var dim = Math.min(plot._height, plot._width);\n        for (var i=0; i<data.length; i++) {\n            if (data[i] != null) {\n                gd.push([xp.call(this._xaxis, data[i][0]), yp.call(this._yaxis, data[i][1]), data[i][2]]);\n                radii.push(data[i][2]);\n                this.radii.push([i, data[i][2]]);\n            }\n        }\n        var r, val, maxr = this.maxRadius = arrayMax(radii);\n        var l = this.gridData.length;\n        if (this.autoscaleBubbles) {\n            for (var i=0; i<l; i++) {\n                val = radii[i]/maxr;\n                r = this.autoscaleMultiplier * dim / 6;\n                gd[i][2] = r * val;\n            }\n        }\n        this.radii.sort(function(a, b) { return b[1] - a[1]; });\n        return gd;\n    };\n    \n    // called with scope of series\n    $.jqplot.BubbleRenderer.prototype.draw = function (ctx, gd, options) {\n        if (this.plugins.pointLabels) {\n            this.plugins.pointLabels.show = false;\n        }\n        var opts = (options != undefined) ? options : {};\n        var shadow = (opts.shadow != undefined) ? opts.shadow : this.shadow;\n        this.canvas._elem.empty();\n        for (var i=0; i<this.radii.length; i++) {\n            var idx = this.radii[i][0];\n            var t=null;\n            var color = null;\n            var el = null;\n            var tel = null;\n            var d = this.data[idx];\n            var gd = this.gridData[idx];\n            if (d[3]) {\n                if (typeof(d[3]) == 'object') {\n                    t = d[3]['label'];\n                }\n                else if (typeof(d[3]) == 'string') {\n                    t = d[3];\n                }\n            }\n            \n            // color = (this.varyBubbleColors) ? this.colorGenerator.get(idx) : this.color;\n            color = this.colorGenerator.get(idx);\n            \n            // If we're drawing a shadow, expand the canvas dimensions to accomodate.\n            var canvasRadius = gd[2];\n            var offset, depth;\n            if (this.shadow) {\n                offset = (0.7 + gd[2]/40).toFixed(1);\n                depth = 1 + Math.ceil(gd[2]/15);\n                canvasRadius += offset*depth;\n            }\n            this.bubbleCanvases[idx] = new $.jqplot.BubbleCanvas();\n            this.canvas._elem.append(this.bubbleCanvases[idx].createElement(gd[0], gd[1], canvasRadius));\n            this.bubbleCanvases[idx].setContext();\n            var ctx = this.bubbleCanvases[idx]._ctx;\n            var x = ctx.canvas.width/2;\n            var y = ctx.canvas.height/2;\n            if (this.shadow) {\n                this.renderer.shadowRenderer.draw(ctx, [x, y, gd[2], 0, 2*Math.PI], {offset: offset, depth: depth});\n            }\n            this.bubbleCanvases[idx].draw(gd[2], color, this.bubbleGradients, this.shadowAngle/180*Math.PI);\n            \n            // now draw label.\n            if (t && this.showLabels) {\n                tel = $('<div style=\"position:absolute;\" class=\"jqplot-bubble-label\"></div>');\n                if (this.escapeHtml) {\n                    tel.text(t);\n                }\n                else {\n                    tel.html(t);\n                }\n                this.canvas._elem.append(tel);\n                var h = $(tel).outerHeight();\n                var w = $(tel).outerWidth();\n                var top = gd[1] - 0.5*h;\n                var left = gd[0] - 0.5*w;\n                tel.css({top: top, left: left});\n                this.labels[idx] = $(tel);\n            }\n        }\n    };\n\n    \n    $.jqplot.DivCanvas = function() {\n        $.jqplot.ElemContainer.call(this);\n        this._ctx;  \n    };\n    \n    $.jqplot.DivCanvas.prototype = new $.jqplot.ElemContainer();\n    $.jqplot.DivCanvas.prototype.constructor = $.jqplot.DivCanvas;\n    \n    $.jqplot.DivCanvas.prototype.createElement = function(offsets, clss, plotDimensions) {\n        this._offsets = offsets;\n        var klass = 'jqplot-DivCanvas';\n        if (clss != undefined) {\n            klass = clss;\n        }\n        var elem;\n        // if this canvas already has a dom element, don't make a new one.\n        if (this._elem) {\n            elem = this._elem.get(0);\n        }\n        else {\n            elem = document.createElement('div');\n        }\n        // if new plotDimensions supplied, use them.\n        if (plotDimensions != undefined) {\n            this._plotDimensions = plotDimensions;\n        }\n        \n        var w = this._plotDimensions.width - this._offsets.left - this._offsets.right + 'px';\n        var h = this._plotDimensions.height - this._offsets.top - this._offsets.bottom + 'px';\n        this._elem = $(elem);\n        this._elem.css({ position: 'absolute', width:w, height:h, left: this._offsets.left, top: this._offsets.top });\n        \n        this._elem.addClass(klass);\n        return this._elem;\n    };\n    \n    $.jqplot.DivCanvas.prototype.setContext = function() {\n        this._ctx = {\n            canvas:{\n                width:0,\n                height:0\n            },\n            clearRect:function(){return null;}\n        };\n        return this._ctx;\n    };\n    \n    $.jqplot.BubbleCanvas = function() {\n        $.jqplot.ElemContainer.call(this);\n        this._ctx;\n    };\n    \n    $.jqplot.BubbleCanvas.prototype = new $.jqplot.ElemContainer();\n    $.jqplot.BubbleCanvas.prototype.constructor = $.jqplot.BubbleCanvas;\n    \n    // initialize with the x,y pont of bubble center and the bubble radius.\n    $.jqplot.BubbleCanvas.prototype.createElement = function(x, y, r) {     \n        var klass = 'jqplot-bubble-point';\n\n        var elem;\n        // if this canvas already has a dom element, don't make a new one.\n        if (this._elem) {\n            elem = this._elem.get(0);\n        }\n        else {\n            elem = document.createElement('canvas');\n        }\n        \n        elem.width = (r != null) ? 2*r : elem.width;\n        elem.height = (r != null) ? 2*r : elem.height;\n        this._elem = $(elem);\n        var l = (x != null && r != null) ? x - r : this._elem.css('left');\n        var t = (y != null && r != null) ? y - r : this._elem.css('top');\n        this._elem.css({ position: 'absolute', left: l, top: t });\n        \n        this._elem.addClass(klass);\n        if ($.jqplot.use_excanvas) {\n            window.G_vmlCanvasManager.init_(document);\n            elem = window.G_vmlCanvasManager.initElement(elem);\n        }\n        \n        return this._elem;\n    };\n    \n    $.jqplot.BubbleCanvas.prototype.draw = function(r, color, gradients, angle) {\n        var ctx = this._ctx;\n        // r = Math.floor(r*1.04);\n        // var x = Math.round(ctx.canvas.width/2);\n        // var y = Math.round(ctx.canvas.height/2);\n        var x = ctx.canvas.width/2;\n        var y = ctx.canvas.height/2;\n        ctx.save();\n        if (gradients && !$.jqplot.use_excanvas) {\n            r = r*1.04;\n            var comps = $.jqplot.getColorComponents(color);\n            var colorinner = 'rgba('+Math.round(comps[0]+0.8*(255-comps[0]))+', '+Math.round(comps[1]+0.8*(255-comps[1]))+', '+Math.round(comps[2]+0.8*(255-comps[2]))+', '+comps[3]+')';\n            var colorend = 'rgba('+comps[0]+', '+comps[1]+', '+comps[2]+', 0)';\n            // var rinner = Math.round(0.35 * r);\n            // var xinner = Math.round(x - Math.cos(angle) * 0.33 * r);\n            // var yinner = Math.round(y - Math.sin(angle) * 0.33 * r);\n            var rinner = 0.35 * r;\n            var xinner = x - Math.cos(angle) * 0.33 * r;\n            var yinner = y - Math.sin(angle) * 0.33 * r;\n            var radgrad = ctx.createRadialGradient(xinner, yinner, rinner, x, y, r);\n            radgrad.addColorStop(0, colorinner);\n            radgrad.addColorStop(0.93, color);\n            radgrad.addColorStop(0.96, colorend);\n            radgrad.addColorStop(1, colorend);\n            // radgrad.addColorStop(.98, colorend);\n            ctx.fillStyle = radgrad;\n            ctx.fillRect(0,0, ctx.canvas.width, ctx.canvas.height);\n        }\n        else {\n            ctx.fillStyle = color;\n            ctx.strokeStyle = color;\n            ctx.lineWidth = 1;\n            ctx.beginPath();\n            var ang = 2*Math.PI;\n            ctx.arc(x, y, r, 0, ang, 0);\n            ctx.closePath();\n            ctx.fill();\n        }\n        ctx.restore();\n    };\n    \n    $.jqplot.BubbleCanvas.prototype.setContext = function() {\n        this._ctx = this._elem.get(0).getContext(\"2d\");\n        return this._ctx;\n    };\n    \n    $.jqplot.BubbleAxisRenderer = function() {\n        $.jqplot.LinearAxisRenderer.call(this);\n    };\n    \n    $.jqplot.BubbleAxisRenderer.prototype = new $.jqplot.LinearAxisRenderer();\n    $.jqplot.BubbleAxisRenderer.prototype.constructor = $.jqplot.BubbleAxisRenderer;\n        \n    // called with scope of axis object.\n    $.jqplot.BubbleAxisRenderer.prototype.init = function(options){\n        $.extend(true, this, options);\n        var db = this._dataBounds;\n        var minsidx = 0,\n            minpidx = 0,\n            maxsidx = 0,\n            maxpidx = 0,\n            maxr = 0,\n            minr = 0,\n            minMaxRadius = 0,\n            maxMaxRadius = 0,\n            maxMult = 0,\n            minMult = 0;\n        // Go through all the series attached to this axis and find\n        // the min/max bounds for this axis.\n        for (var i=0; i<this._series.length; i++) {\n            var s = this._series[i];\n            var d = s._plotData;\n            \n            for (var j=0; j<d.length; j++) { \n                if (this.name == 'xaxis' || this.name == 'x2axis') {\n                    if (d[j][0] < db.min || db.min == null) {\n                        db.min = d[j][0];\n                        minsidx=i;\n                        minpidx=j;\n                        minr = d[j][2];\n                        minMaxRadius = s.maxRadius;\n                        minMult = s.autoscaleMultiplier;\n                    }\n                    if (d[j][0] > db.max || db.max == null) {\n                        db.max = d[j][0];\n                        maxsidx=i;\n                        maxpidx=j;\n                        maxr = d[j][2];\n                        maxMaxRadius = s.maxRadius;\n                        maxMult = s.autoscaleMultiplier;\n                    }\n                }              \n                else {\n                    if (d[j][1] < db.min || db.min == null) {\n                        db.min = d[j][1];\n                        minsidx=i;\n                        minpidx=j;\n                        minr = d[j][2];\n                        minMaxRadius = s.maxRadius;\n                        minMult = s.autoscaleMultiplier;\n                    }\n                    if (d[j][1] > db.max || db.max == null) {\n                        db.max = d[j][1];\n                        maxsidx=i;\n                        maxpidx=j;\n                        maxr = d[j][2];\n                        maxMaxRadius = s.maxRadius;\n                        maxMult = s.autoscaleMultiplier;\n                    }\n                }              \n            }\n        }\n        \n        var minRatio = minr/minMaxRadius;\n        var maxRatio = maxr/maxMaxRadius;\n        \n        // need to estimate the effect of the radius on total axis span and adjust axis accordingly.\n        var span = db.max - db.min;\n        // var dim = (this.name == 'xaxis' || this.name == 'x2axis') ? this._plotDimensions.width : this._plotDimensions.height;\n        var dim = Math.min(this._plotDimensions.width, this._plotDimensions.height);\n        \n        var minfact = minRatio * minMult/3 * span;\n        var maxfact = maxRatio * maxMult/3 * span;\n        db.max += maxfact;\n        db.min -= minfact;\n    };\n    \n    function highlight (plot, sidx, pidx) {\n        plot.plugins.bubbleRenderer.highlightLabelCanvas.empty();\n        var s = plot.series[sidx];\n        var canvas = plot.plugins.bubbleRenderer.highlightCanvas;\n        var ctx = canvas._ctx;\n        ctx.clearRect(0,0,ctx.canvas.width, ctx.canvas.height);\n        s._highlightedPoint = pidx;\n        plot.plugins.bubbleRenderer.highlightedSeriesIndex = sidx;\n        \n        var color = s.highlightColorGenerator.get(pidx);\n        var x = s.gridData[pidx][0],\n            y = s.gridData[pidx][1],\n            r = s.gridData[pidx][2];\n        ctx.save();\n        ctx.fillStyle = color;\n        ctx.strokeStyle = color;\n        ctx.lineWidth = 1;\n        ctx.beginPath();\n        ctx.arc(x, y, r, 0, 2*Math.PI, 0);\n        ctx.closePath();\n        ctx.fill();\n        ctx.restore();        \n        // bring label to front\n        if (s.labels[pidx]) {\n            plot.plugins.bubbleRenderer.highlightLabel = s.labels[pidx].clone();\n            plot.plugins.bubbleRenderer.highlightLabel.appendTo(plot.plugins.bubbleRenderer.highlightLabelCanvas);\n            plot.plugins.bubbleRenderer.highlightLabel.addClass('jqplot-bubble-label-highlight');\n        }\n    }\n    \n    function unhighlight (plot) {\n        var canvas = plot.plugins.bubbleRenderer.highlightCanvas;\n        var sidx = plot.plugins.bubbleRenderer.highlightedSeriesIndex;\n        plot.plugins.bubbleRenderer.highlightLabelCanvas.empty();\n        canvas._ctx.clearRect(0,0, canvas._ctx.canvas.width, canvas._ctx.canvas.height);\n        for (var i=0; i<plot.series.length; i++) {\n            plot.series[i]._highlightedPoint = null;\n        }\n        plot.plugins.bubbleRenderer.highlightedSeriesIndex = null;\n        plot.target.trigger('jqplotDataUnhighlight');\n    }\n    \n \n    function handleMove(ev, gridpos, datapos, neighbor, plot) {\n        if (neighbor) {\n            var si = neighbor.seriesIndex;\n            var pi = neighbor.pointIndex;\n            var ins = [si, pi, neighbor.data, plot.series[si].gridData[pi][2]];\n            var evt1 = jQuery.Event('jqplotDataMouseOver');\n            evt1.pageX = ev.pageX;\n            evt1.pageY = ev.pageY;\n            plot.target.trigger(evt1, ins);\n            if (plot.series[ins[0]].highlightMouseOver && !(ins[0] == plot.plugins.bubbleRenderer.highlightedSeriesIndex && ins[1] == plot.series[ins[0]]._highlightedPoint)) {\n                var evt = jQuery.Event('jqplotDataHighlight');\n                evt.which = ev.which;\n                evt.pageX = ev.pageX;\n                evt.pageY = ev.pageY;\n                plot.target.trigger(evt, ins);\n                highlight (plot, ins[0], ins[1]);\n            }\n        }\n        else if (neighbor == null) {\n            unhighlight (plot);\n        }\n    } \n    \n    function handleMouseDown(ev, gridpos, datapos, neighbor, plot) {\n        if (neighbor) {\n            var si = neighbor.seriesIndex;\n            var pi = neighbor.pointIndex;\n            var ins = [si, pi, neighbor.data, plot.series[si].gridData[pi][2]];\n            if (plot.series[ins[0]].highlightMouseDown && !(ins[0] == plot.plugins.bubbleRenderer.highlightedSeriesIndex && ins[1] == plot.series[ins[0]]._highlightedPoint)) {\n                var evt = jQuery.Event('jqplotDataHighlight');\n                evt.which = ev.which;\n                evt.pageX = ev.pageX;\n                evt.pageY = ev.pageY;\n                plot.target.trigger(evt, ins);\n                highlight (plot, ins[0], ins[1]);\n            }\n        }\n        else if (neighbor == null) {\n            unhighlight (plot);\n        }\n    }\n    \n    function handleMouseUp(ev, gridpos, datapos, neighbor, plot) {\n        var idx = plot.plugins.bubbleRenderer.highlightedSeriesIndex;\n        if (idx != null && plot.series[idx].highlightMouseDown) {\n            unhighlight(plot);\n        }\n    }\n    \n    function handleClick(ev, gridpos, datapos, neighbor, plot) {\n        if (neighbor) {\n            var si = neighbor.seriesIndex;\n            var pi = neighbor.pointIndex;\n            var ins = [si, pi, neighbor.data, plot.series[si].gridData[pi][2]];\n            var evt = jQuery.Event('jqplotDataClick');\n            evt.which = ev.which;\n            evt.pageX = ev.pageX;\n            evt.pageY = ev.pageY;\n            plot.target.trigger(evt, ins);\n        }\n    }\n    \n    function handleRightClick(ev, gridpos, datapos, neighbor, plot) {\n        if (neighbor) {\n            var si = neighbor.seriesIndex;\n            var pi = neighbor.pointIndex;\n            var ins = [si, pi, neighbor.data, plot.series[si].gridData[pi][2]];\n            var idx = plot.plugins.bubbleRenderer.highlightedSeriesIndex;\n            if (idx != null && plot.series[idx].highlightMouseDown) {\n                unhighlight(plot);\n            }\n            var evt = jQuery.Event('jqplotDataRightClick');\n            evt.which = ev.which;\n            evt.pageX = ev.pageX;\n            evt.pageY = ev.pageY;\n            plot.target.trigger(evt, ins);\n        }\n    }\n    \n    // called within context of plot\n    // create a canvas which we can draw on.\n    // insert it before the eventCanvas, so eventCanvas will still capture events.\n    function postPlotDraw() {\n        // Memory Leaks patch    \n        if (this.plugins.bubbleRenderer && this.plugins.bubbleRenderer.highlightCanvas) {\n            this.plugins.bubbleRenderer.highlightCanvas.resetCanvas();\n            this.plugins.bubbleRenderer.highlightCanvas = null;\n        }\n        \n        this.plugins.bubbleRenderer = {highlightedSeriesIndex:null};\n        this.plugins.bubbleRenderer.highlightCanvas = new $.jqplot.GenericCanvas();\n        this.plugins.bubbleRenderer.highlightLabel = null;\n        this.plugins.bubbleRenderer.highlightLabelCanvas = $('<div style=\"position:absolute;\"></div>');\n        var top = this._gridPadding.top;\n        var left = this._gridPadding.left;\n        var width = this._plotDimensions.width - this._gridPadding.left - this._gridPadding.right;\n        var height = this._plotDimensions.height - this._gridPadding.top - this._gridPadding.bottom;\n        this.plugins.bubbleRenderer.highlightLabelCanvas.css({top:top, left:left, width:width+'px', height:height+'px'});\n\n        this.eventCanvas._elem.before(this.plugins.bubbleRenderer.highlightCanvas.createElement(this._gridPadding, 'jqplot-bubbleRenderer-highlight-canvas', this._plotDimensions, this));\n        this.eventCanvas._elem.before(this.plugins.bubbleRenderer.highlightLabelCanvas);\n        \n        var hctx = this.plugins.bubbleRenderer.highlightCanvas.setContext();\n    }\n\n    \n    // setup default renderers for axes and legend so user doesn't have to\n    // called with scope of plot\n    function preInit(target, data, options) {\n        options = options || {};\n        options.axesDefaults = options.axesDefaults || {};\n        options.seriesDefaults = options.seriesDefaults || {};\n        // only set these if there is a Bubble series\n        var setopts = false;\n        if (options.seriesDefaults.renderer == $.jqplot.BubbleRenderer) {\n            setopts = true;\n        }\n        else if (options.series) {\n            for (var i=0; i < options.series.length; i++) {\n                if (options.series[i].renderer == $.jqplot.BubbleRenderer) {\n                    setopts = true;\n                }\n            }\n        }\n        \n        if (setopts) {\n            options.axesDefaults.renderer = $.jqplot.BubbleAxisRenderer;\n            options.sortData = false;\n        }\n    }\n    \n    $.jqplot.preInitHooks.push(preInit);\n    \n})(jQuery);\n    \n    "
  },
  {
    "path": "stenogotchi/ui/web/static/js/plugins/jqplot.canvasAxisLabelRenderer.js",
    "content": "/**\n * jqPlot\n * Pure JavaScript plotting plugin using jQuery\n *\n * Version: 1.0.9\n * Revision: d96a669\n *\n * Copyright (c) 2009-2016 Chris Leonello\n * jqPlot is currently available for use in all personal or commercial projects \n * under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL \n * version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can \n * choose the license that best suits your project and use it accordingly. \n *\n * Although not required, the author would appreciate an email letting him \n * know of any substantial use of jqPlot.  You can reach the author at: \n * chris at jqplot dot com or see http://www.jqplot.com/info.php .\n *\n * If you are feeling kind and generous, consider supporting the project by\n * making a donation at: http://www.jqplot.com/donate.php .\n *\n * sprintf functions contained in jqplot.sprintf.js by Ash Searle:\n *\n *     version 2007.04.27\n *     author Ash Searle\n *     http://hexmen.com/blog/2007/03/printf-sprintf/\n *     http://hexmen.com/js/sprintf.js\n *     The author (Ash Searle) has placed this code in the public domain:\n *     \"This code is unrestricted: you are free to use it however you like.\"\n * \n */\n(function($) {\n    /**\n    * Class: $.jqplot.CanvasAxisLabelRenderer\n    * Renderer to draw axis labels with a canvas element to support advanced\n    * featrues such as rotated text.  This renderer uses a separate rendering engine\n    * to draw the text on the canvas.  Two modes of rendering the text are available.\n    * If the browser has native font support for canvas fonts (currently Mozila 3.5\n    * and Safari 4), you can enable text rendering with the canvas fillText method.\n    * You do so by setting the \"enableFontSupport\" option to true. \n    * \n    * Browsers lacking native font support will have the text drawn on the canvas\n    * using the Hershey font metrics.  Even if the \"enableFontSupport\" option is true\n    * non-supporting browsers will still render with the Hershey font.\n    * \n    */\n    $.jqplot.CanvasAxisLabelRenderer = function(options) {\n        // Group: Properties\n        \n        // prop: angle\n        // angle of text, measured clockwise from x axis.\n        this.angle = 0;\n        // name of the axis associated with this tick\n        this.axis;\n        // prop: show\n        // whether or not to show the tick (mark and label).\n        this.show = true;\n        // prop: showLabel\n        // whether or not to show the label.\n        this.showLabel = true;\n        // prop: label\n        // label for the axis.\n        this.label = '';\n        // prop: fontFamily\n        // CSS spec for the font-family css attribute.\n        // Applies only to browsers supporting native font rendering in the\n        // canvas tag.  Currently Mozilla 3.5 and Safari 4.\n        this.fontFamily = '\"Trebuchet MS\", Arial, Helvetica, sans-serif';\n        // prop: fontSize\n        // CSS spec for font size.\n        this.fontSize = '11pt';\n        // prop: fontWeight\n        // CSS spec for fontWeight:  normal, bold, bolder, lighter or a number 100 - 900\n        this.fontWeight = 'normal';\n        // prop: fontStretch\n        // Multiplier to condense or expand font width.  \n        // Applies only to browsers which don't support canvas native font rendering.\n        this.fontStretch = 1.0;\n        // prop: textColor\n        // css spec for the color attribute.\n        this.textColor = '#666666';\n        // prop: enableFontSupport\n        // true to turn on native canvas font support in Mozilla 3.5+ and Safari 4+.\n        // If true, label will be drawn with canvas tag native support for fonts.\n        // If false, label will be drawn with Hershey font metrics.\n        this.enableFontSupport = true;\n        // prop: pt2px\n        // Point to pixel scaling factor, used for computing height of bounding box\n        // around a label.  The labels text renderer has a default setting of 1.4, which \n        // should be suitable for most fonts.  Leave as null to use default.  If tops of\n        // letters appear clipped, increase this.  If bounding box seems too big, decrease.\n        // This is an issue only with the native font renderering capabilities of Mozilla\n        // 3.5 and Safari 4 since they do not provide a method to determine the font height.\n        this.pt2px = null;\n        \n        this._elem;\n        this._ctx;\n        this._plotWidth;\n        this._plotHeight;\n        this._plotDimensions = {height:null, width:null};\n        \n        $.extend(true, this, options);\n        \n        if (options.angle == null && this.axis != 'xaxis' && this.axis != 'x2axis') {\n            this.angle = -90;\n        }\n        \n        var ropts = {fontSize:this.fontSize, fontWeight:this.fontWeight, fontStretch:this.fontStretch, fillStyle:this.textColor, angle:this.getAngleRad(), fontFamily:this.fontFamily};\n        if (this.pt2px) {\n            ropts.pt2px = this.pt2px;\n        }\n        \n        if (this.enableFontSupport) {\n            if ($.jqplot.support_canvas_text()) {\n                this._textRenderer = new $.jqplot.CanvasFontRenderer(ropts);\n            }\n            \n            else {\n                this._textRenderer = new $.jqplot.CanvasTextRenderer(ropts); \n            }\n        }\n        else {\n            this._textRenderer = new $.jqplot.CanvasTextRenderer(ropts); \n        }\n    };\n    \n    $.jqplot.CanvasAxisLabelRenderer.prototype.init = function(options) {\n        $.extend(true, this, options);\n        this._textRenderer.init({fontSize:this.fontSize, fontWeight:this.fontWeight, fontStretch:this.fontStretch, fillStyle:this.textColor, angle:this.getAngleRad(), fontFamily:this.fontFamily});\n    };\n    \n    // return width along the x axis\n    // will check first to see if an element exists.\n    // if not, will return the computed text box width.\n    $.jqplot.CanvasAxisLabelRenderer.prototype.getWidth = function(ctx) {\n        if (this._elem) {\n         return this._elem.outerWidth(true);\n        }\n        else {\n            var tr = this._textRenderer;\n            var l = tr.getWidth(ctx);\n            var h = tr.getHeight(ctx);\n            var w = Math.abs(Math.sin(tr.angle)*h) + Math.abs(Math.cos(tr.angle)*l);\n            return w;\n        }\n    };\n    \n    // return height along the y axis.\n    $.jqplot.CanvasAxisLabelRenderer.prototype.getHeight = function(ctx) {\n        if (this._elem) {\n         return this._elem.outerHeight(true);\n        }\n        else {\n            var tr = this._textRenderer;\n            var l = tr.getWidth(ctx);\n            var h = tr.getHeight(ctx);\n            var w = Math.abs(Math.cos(tr.angle)*h) + Math.abs(Math.sin(tr.angle)*l);\n            return w;\n        }\n    };\n    \n    $.jqplot.CanvasAxisLabelRenderer.prototype.getAngleRad = function() {\n        var a = this.angle * Math.PI/180;\n        return a;\n    };\n    \n    $.jqplot.CanvasAxisLabelRenderer.prototype.draw = function(ctx, plot) {\n          // Memory Leaks patch\n          if (this._elem) {\n              if ($.jqplot.use_excanvas && window.G_vmlCanvasManager.uninitElement !== undefined) {\n                  window.G_vmlCanvasManager.uninitElement(this._elem.get(0));\n              }\n            \n              this._elem.emptyForce();\n              this._elem = null;\n          }\n\n        // create a canvas here, but can't draw on it untill it is appended\n        // to dom for IE compatability.\n        var elem = plot.canvasManager.getCanvas();\n\n        this._textRenderer.setText(this.label, ctx);\n        var w = this.getWidth(ctx);\n        var h = this.getHeight(ctx);\n        elem.width = w;\n        elem.height = h;\n        elem.style.width = w;\n        elem.style.height = h;\n        \n        elem = plot.canvasManager.initCanvas(elem);\n\n        this._elem = $(elem);\n        this._elem.css({ position: 'absolute'});\n        this._elem.addClass('jqplot-'+this.axis+'-label');\n        \n        elem = null;\n        return this._elem;\n    };\n    \n    $.jqplot.CanvasAxisLabelRenderer.prototype.pack = function() {\n        this._textRenderer.draw(this._elem.get(0).getContext(\"2d\"), this.label);\n    };\n    \n})(jQuery);"
  },
  {
    "path": "stenogotchi/ui/web/static/js/plugins/jqplot.canvasAxisTickRenderer.js",
    "content": "/**\n * jqPlot\n * Pure JavaScript plotting plugin using jQuery\n *\n * Version: 1.0.9\n * Revision: d96a669\n *\n * Copyright (c) 2009-2016 Chris Leonello\n * jqPlot is currently available for use in all personal or commercial projects \n * under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL \n * version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can \n * choose the license that best suits your project and use it accordingly. \n *\n * Although not required, the author would appreciate an email letting him \n * know of any substantial use of jqPlot.  You can reach the author at: \n * chris at jqplot dot com or see http://www.jqplot.com/info.php .\n *\n * If you are feeling kind and generous, consider supporting the project by\n * making a donation at: http://www.jqplot.com/donate.php .\n *\n * sprintf functions contained in jqplot.sprintf.js by Ash Searle:\n *\n *     version 2007.04.27\n *     author Ash Searle\n *     http://hexmen.com/blog/2007/03/printf-sprintf/\n *     http://hexmen.com/js/sprintf.js\n *     The author (Ash Searle) has placed this code in the public domain:\n *     \"This code is unrestricted: you are free to use it however you like.\"\n * \n */\n(function($) {\n    /**\n    *  Class: $.jqplot.CanvasAxisTickRenderer\n    * Renderer to draw axis ticks with a canvas element to support advanced\n    * featrues such as rotated text.  This renderer uses a separate rendering engine\n    * to draw the text on the canvas.  Two modes of rendering the text are available.\n    * If the browser has native font support for canvas fonts (currently Mozila 3.5\n    * and Safari 4), you can enable text rendering with the canvas fillText method.\n    * You do so by setting the \"enableFontSupport\" option to true. \n    * \n    * Browsers lacking native font support will have the text drawn on the canvas\n    * using the Hershey font metrics.  Even if the \"enableFontSupport\" option is true\n    * non-supporting browsers will still render with the Hershey font.\n    */\n    $.jqplot.CanvasAxisTickRenderer = function(options) {\n        // Group: Properties\n        \n        // prop: mark\n        // tick mark on the axis.  One of 'inside', 'outside', 'cross', '' or null.\n        this.mark = 'outside';\n        // prop: showMark\n        // whether or not to show the mark on the axis.\n        this.showMark = true;\n        // prop: showGridline\n        // whether or not to draw the gridline on the grid at this tick.\n        this.showGridline = true;\n        // prop: isMinorTick\n        // if this is a minor tick.\n        this.isMinorTick = false;\n        // prop: angle\n        // angle of text, measured clockwise from x axis.\n        this.angle = 0;\n        // prop:  markSize\n        // Length of the tick marks in pixels.  For 'cross' style, length\n        // will be stoked above and below axis, so total length will be twice this.\n        this.markSize = 4;\n        // prop: show\n        // whether or not to show the tick (mark and label).\n        this.show = true;\n        // prop: showLabel\n        // whether or not to show the label.\n        this.showLabel = true;\n        // prop: labelPosition\n        // 'auto', 'start', 'middle' or 'end'.\n        // Whether tick label should be positioned so the start, middle, or end\n        // of the tick mark.\n        this.labelPosition = 'auto';\n        this.label = '';\n        this.value = null;\n        this._styles = {};\n        // prop: formatter\n        // A class of a formatter for the tick text.\n        // The default $.jqplot.DefaultTickFormatter uses sprintf.\n        this.formatter = $.jqplot.DefaultTickFormatter;\n        // prop: formatString\n        // string passed to the formatter.\n        this.formatString = '';\n        // prop: prefix\n        // String to prepend to the tick label.\n        // Prefix is prepended to the formatted tick label.\n        this.prefix = '';\n        // prop: fontFamily\n        // css spec for the font-family css attribute.\n        this.fontFamily = '\"Trebuchet MS\", Arial, Helvetica, sans-serif';\n        // prop: fontSize\n        // CSS spec for font size.\n        this.fontSize = '10pt';\n        // prop: fontWeight\n        // CSS spec for fontWeight\n        this.fontWeight = 'normal';\n        // prop: fontStretch\n        // Multiplier to condense or expand font width.  \n        // Applies only to browsers which don't support canvas native font rendering.\n        this.fontStretch = 1.0;\n        // prop: textColor\n        // css spec for the color attribute.\n        this.textColor = '#666666';\n        // prop: enableFontSupport\n        // true to turn on native canvas font support in Mozilla 3.5+ and Safari 4+.\n        // If true, tick label will be drawn with canvas tag native support for fonts.\n        // If false, tick label will be drawn with Hershey font metrics.\n        this.enableFontSupport = true;\n        // prop: pt2px\n        // Point to pixel scaling factor, used for computing height of bounding box\n        // around a label.  The labels text renderer has a default setting of 1.4, which \n        // should be suitable for most fonts.  Leave as null to use default.  If tops of\n        // letters appear clipped, increase this.  If bounding box seems too big, decrease.\n        // This is an issue only with the native font renderering capabilities of Mozilla\n        // 3.5 and Safari 4 since they do not provide a method to determine the font height.\n        this.pt2px = null;\n        \n        this._elem;\n        this._ctx;\n        this._plotWidth;\n        this._plotHeight;\n        this._plotDimensions = {height:null, width:null};\n        \n        $.extend(true, this, options);\n        \n        var ropts = {fontSize:this.fontSize, fontWeight:this.fontWeight, fontStretch:this.fontStretch, fillStyle:this.textColor, angle:this.getAngleRad(), fontFamily:this.fontFamily};\n        if (this.pt2px) {\n            ropts.pt2px = this.pt2px;\n        }\n        \n        if (this.enableFontSupport) {\n            if ($.jqplot.support_canvas_text()) {\n                this._textRenderer = new $.jqplot.CanvasFontRenderer(ropts);\n            }\n            \n            else {\n                this._textRenderer = new $.jqplot.CanvasTextRenderer(ropts); \n            }\n        }\n        else {\n            this._textRenderer = new $.jqplot.CanvasTextRenderer(ropts); \n        }\n    };\n    \n    $.jqplot.CanvasAxisTickRenderer.prototype.init = function(options) {\n        $.extend(true, this, options);\n        this._textRenderer.init({fontSize:this.fontSize, fontWeight:this.fontWeight, fontStretch:this.fontStretch, fillStyle:this.textColor, angle:this.getAngleRad(), fontFamily:this.fontFamily});\n    };\n    \n    // return width along the x axis\n    // will check first to see if an element exists.\n    // if not, will return the computed text box width.\n    $.jqplot.CanvasAxisTickRenderer.prototype.getWidth = function(ctx) {\n        if (this._elem) {\n         return this._elem.outerWidth(true);\n        }\n        else {\n            var tr = this._textRenderer;\n            var l = tr.getWidth(ctx);\n            var h = tr.getHeight(ctx);\n            var w = Math.abs(Math.sin(tr.angle)*h) + Math.abs(Math.cos(tr.angle)*l);\n            return w;\n        }\n    };\n    \n    // return height along the y axis.\n    $.jqplot.CanvasAxisTickRenderer.prototype.getHeight = function(ctx) {\n        if (this._elem) {\n         return this._elem.outerHeight(true);\n        }\n        else {\n            var tr = this._textRenderer;\n            var l = tr.getWidth(ctx);\n            var h = tr.getHeight(ctx);\n            var w = Math.abs(Math.cos(tr.angle)*h) + Math.abs(Math.sin(tr.angle)*l);\n            return w;\n        }\n    };\n\n    // return top.\n    $.jqplot.CanvasAxisTickRenderer.prototype.getTop = function(ctx) {\n        if (this._elem) {\n         return this._elem.position().top;\n        }\n        else {\n            return null;\n        }\n    };\n    \n    $.jqplot.CanvasAxisTickRenderer.prototype.getAngleRad = function() {\n        var a = this.angle * Math.PI/180;\n        return a;\n    };\n    \n    \n    $.jqplot.CanvasAxisTickRenderer.prototype.setTick = function(value, axisName, isMinor) {\n        this.value = value;\n        if (isMinor) {\n            this.isMinorTick = true;\n        }\n        return this;\n    };\n    \n    $.jqplot.CanvasAxisTickRenderer.prototype.draw = function(ctx, plot) {\n        if (!this.label) {\n            this.label = this.prefix + this.formatter(this.formatString, this.value);\n        }\n        \n        // Memory Leaks patch\n        if (this._elem) {\n            if ($.jqplot.use_excanvas && window.G_vmlCanvasManager.uninitElement !== undefined) {\n                window.G_vmlCanvasManager.uninitElement(this._elem.get(0));\n            }\n            \n            this._elem.emptyForce();\n            this._elem = null;\n        }\n\n        // create a canvas here, but can't draw on it untill it is appended\n        // to dom for IE compatability.\n\n        var elem = plot.canvasManager.getCanvas();\n\n        this._textRenderer.setText(this.label, ctx);\n        var w = this.getWidth(ctx);\n        var h = this.getHeight(ctx);\n        // canvases seem to need to have width and heigh attributes directly set.\n        elem.width = w;\n        elem.height = h;\n        elem.style.width = w;\n        elem.style.height = h;\n        elem.style.textAlign = 'left';\n        elem.style.position = 'absolute';\n\n        elem = plot.canvasManager.initCanvas(elem);\n\n        this._elem = $(elem);\n        this._elem.css(this._styles);\n        this._elem.addClass('jqplot-'+this.axis+'-tick');\n\n        elem = null;\n        return this._elem;\n    };\n    \n    $.jqplot.CanvasAxisTickRenderer.prototype.pack = function() {\n        this._textRenderer.draw(this._elem.get(0).getContext(\"2d\"), this.label);\n    };\n    \n})(jQuery);"
  },
  {
    "path": "stenogotchi/ui/web/static/js/plugins/jqplot.canvasOverlay.js",
    "content": "/**\n * jqPlot\n * Pure JavaScript plotting plugin using jQuery\n *\n * Version: 1.0.9\n * Revision: d96a669\n *\n * Copyright (c) 2009-2016 Chris Leonello\n * jqPlot is currently available for use in all personal or commercial projects \n * under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL \n * version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can \n * choose the license that best suits your project and use it accordingly. \n *\n * Although not required, the author would appreciate an email letting him \n * know of any substantial use of jqPlot.  You can reach the author at: \n * chris at jqplot dot com or see http://www.jqplot.com/info.php .\n *\n * If you are feeling kind and generous, consider supporting the project by\n * making a donation at: http://www.jqplot.com/donate.php .\n *\n * sprintf functions contained in jqplot.sprintf.js by Ash Searle:\n *\n *     version 2007.04.27\n *     author Ash Searle\n *     http://hexmen.com/blog/2007/03/printf-sprintf/\n *     http://hexmen.com/js/sprintf.js\n *     The author (Ash Searle) has placed this code in the public domain:\n *     \"This code is unrestricted: you are free to use it however you like.\"\n * \n */\n(function($) {\n    var objCounter = 0;\n    // class: $.jqplot.CanvasOverlay\n    $.jqplot.CanvasOverlay = function(opts){\n        var options = opts || {};\n        this.options = {\n            show: $.jqplot.config.enablePlugins,\n            deferDraw: false\n        };\n        // prop: objects\n        this.objects = [];\n        this.objectNames = [];\n        this.canvas = null;\n        this.markerRenderer = new $.jqplot.MarkerRenderer({style:'line'});\n        this.markerRenderer.init();\n        this.highlightObjectIndex = null;\n        if (options.objects) {\n            var objs = options.objects,\n                obj;\n            for (var i=0; i<objs.length; i++) {\n                obj = objs[i];\n                for (var n in obj) {\n                    switch (n) {\n                        case 'line':\n                            this.addLine(obj[n]);\n                            break;\n                        case 'horizontalLine':\n                            this.addHorizontalLine(obj[n]);\n                            break;\n                        case 'dashedHorizontalLine':\n                            this.addDashedHorizontalLine(obj[n]);\n                            break;\n                        case 'verticalLine':\n                            this.addVerticalLine(obj[n]);\n                            break;\n                        case 'dashedVerticalLine':\n                            this.addDashedVerticalLine(obj[n]);\n                            break;\n                        case 'rectangle':\n                            this.addRectangle(obj[n]);\n                            break;\n                        default:\n                            break;\n                    }\n                }   \n            }\n        }\n        $.extend(true, this.options, options);\n    };\n    \n    // called with scope of a plot object\n    $.jqplot.CanvasOverlay.postPlotInit = function (target, data, opts) {\n        var options = opts || {};\n        // add a canvasOverlay attribute to the plot\n        this.plugins.canvasOverlay = new $.jqplot.CanvasOverlay(options.canvasOverlay);     \n    };\n\n\n    function LineBase() {\n        this.uid = null;\n        this.type = null;\n        this.gridStart = null;\n        this.gridStop = null;\n        this.tooltipWidthFactor = 0;\n        this.options = {           \n            // prop: name\n            // Optional name for the overlay object.\n            // Can be later used to retrieve the object by name.\n            name: null,\n            // prop: show\n            // true to show (draw), false to not draw.\n            show: true,\n            // prop: lineWidth\n            // Width of the line.\n            lineWidth: 2,\n            // prop: lineCap\n            // Type of ending placed on the line ['round', 'butt', 'square']\n            lineCap: 'round',\n            // prop: color\n            // color of the line\n            color: '#666666',\n            // prop: shadow\n            // whether or not to draw a shadow on the line\n            shadow: true,\n            // prop: shadowAngle\n            // Shadow angle in degrees\n            shadowAngle: 45,\n            // prop: shadowOffset\n            // Shadow offset from line in pixels\n            shadowOffset: 1,\n            // prop: shadowDepth\n            // Number of times shadow is stroked, each stroke offset shadowOffset from the last.\n            shadowDepth: 3,\n            // prop: shadowAlpha\n            // Alpha channel transparency of shadow.  0 = transparent.\n            shadowAlpha: '0.07',\n            // prop: xaxis\n            // X axis to use for positioning/scaling the line.\n            xaxis: 'xaxis',\n            // prop: yaxis\n            // Y axis to use for positioning/scaling the line.\n            yaxis: 'yaxis',\n            // prop: showTooltip\n            // Show a tooltip with data point values.\n            showTooltip: false,\n            // prop: showTooltipPrecision\n            // Controls how close to line cursor must be to show tooltip.\n            // Higher number = closer to line, lower number = farther from line.\n            // 1.0 = cursor must be over line.\n            showTooltipPrecision: 0.6,\n            // prop: tooltipLocation\n            // Where to position tooltip, 'n', 'ne', 'e', 'se', 's', 'sw', 'w', 'nw'\n            tooltipLocation: 'nw',\n            // prop: fadeTooltip\n            // true = fade in/out tooltip, flase = show/hide tooltip\n            fadeTooltip: true,\n            // prop: tooltipFadeSpeed\n            // 'slow', 'def', 'fast', or number of milliseconds.\n            tooltipFadeSpeed: \"fast\",\n            // prop: tooltipOffset\n            // Pixel offset of tooltip from the highlight.\n            tooltipOffset: 4,\n            // prop: tooltipFormatString\n            // Format string passed the x and y values of the cursor on the line.\n            // e.g., 'Dogs: %.2f, Cats: %d'.\n            tooltipFormatString: '%d, %d'\n        };\n    }\n    \n    \n    function Rectangle(options) {\n        LineBase.call(this);\n        this.type = 'rectangle';\n        var opts = {\n         // prop: xmin\n                // x value for the start of the line, null to scale to axis min.\n                xmin: null,\n                // prop: xmax\n                // x value for the end of the line, null to scale to axis max.\n                xmax: null,\n                // prop xOffset\n                // offset ends of the line inside the grid. Number\n                xOffset: '6px', // number or string. Number interpreted as units, string as pixels.\n                xminOffset: null,\n                xmaxOffset: null,\n                \n                ymin: null,\n                ymax: null,\n                yOffset: '6px', // number or string. Number interpreted as units, string as pixels.\n                yminOffset: null,\n                ymaxOffset: null\n        };\n        $.extend(true, this.options, opts, options);\n\n        if (this.options.showTooltipPrecision < 0.01) {\n            this.options.showTooltipPrecision = 0.01;\n        }\n    }\n\n    Rectangle.prototype = new LineBase();\n    Rectangle.prototype.constructor = Rectangle;\n\n    \n    /**\n     * Class: Line\n     * A straight line.\n     */\n    function Line(options) {\n        LineBase.call(this);\n        this.type = 'line';\n        var opts = {\n            // prop: start\n            // [x, y] coordinates for the start of the line.\n            start: [],\n            // prop: stop\n            // [x, y] coordinates for the end of the line.\n            stop: []\n        };\n        $.extend(true, this.options, opts, options);\n\n        if (this.options.showTooltipPrecision < 0.01) {\n            this.options.showTooltipPrecision = 0.01;\n        }\n    }\n\n    Line.prototype = new LineBase();\n    Line.prototype.constructor = Line;\n\n\n    /**\n     * Class: HorizontalLine\n     * A straight horizontal line.\n     */\n    function HorizontalLine(options) {\n        LineBase.call(this);\n        this.type = 'horizontalLine';\n        var opts = {\n            // prop: y\n            // y value to position the line\n            y: null,\n            // prop: xmin\n            // x value for the start of the line, null to scale to axis min.\n            xmin: null,\n            // prop: xmax\n            // x value for the end of the line, null to scale to axis max.\n            xmax: null,\n            // prop xOffset\n            // offset ends of the line inside the grid.  Number \n            xOffset: '6px', // number or string.  Number interpreted as units, string as pixels.\n            xminOffset: null,\n            xmaxOffset: null\n        };\n        $.extend(true, this.options, opts, options);\n\n        if (this.options.showTooltipPrecision < 0.01) {\n            this.options.showTooltipPrecision = 0.01;\n        }\n    }\n\n    HorizontalLine.prototype = new LineBase();\n    HorizontalLine.prototype.constructor = HorizontalLine;\n    \n\n    /**\n     * Class: DashedHorizontalLine\n     * A straight dashed horizontal line.\n     */\n    function DashedHorizontalLine(options) {\n        LineBase.call(this);\n        this.type = 'dashedHorizontalLine';\n        var opts = {\n            y: null,\n            xmin: null,\n            xmax: null,\n            xOffset: '6px', // number or string.  Number interpreted as units, string as pixels.\n            xminOffset: null,\n            xmaxOffset: null,\n            // prop: dashPattern\n            // Array of line, space settings in pixels.\n            // Default is 8 pixel of line, 8 pixel of space.\n            // Note, limit to a 2 element array b/c of bug with higher order arrays.\n            dashPattern: [8,8]\n        };\n        $.extend(true, this.options, opts, options);\n\n        if (this.options.showTooltipPrecision < 0.01) {\n            this.options.showTooltipPrecision = 0.01;\n        }\n    }\n\n    DashedHorizontalLine.prototype = new LineBase();\n    DashedHorizontalLine.prototype.constructor = DashedHorizontalLine;\n    \n\n    /**\n     * Class: VerticalLine\n     * A straight vertical line.\n     */\n    function VerticalLine(options) {\n        LineBase.call(this);\n        this.type = 'verticalLine';\n        var opts = {\n            x: null,\n            ymin: null,\n            ymax: null,\n            yOffset: '6px', // number or string.  Number interpreted as units, string as pixels.\n            yminOffset: null,\n            ymaxOffset: null\n        };\n        $.extend(true, this.options, opts, options);\n\n        if (this.options.showTooltipPrecision < 0.01) {\n            this.options.showTooltipPrecision = 0.01;\n        }\n    }\n\n    VerticalLine.prototype = new LineBase();\n    VerticalLine.prototype.constructor = VerticalLine;\n    \n\n    /**\n     * Class: DashedVerticalLine\n     * A straight dashed vertical line.\n     */\n    function DashedVerticalLine(options) {\n        LineBase.call(this);\n        this.type = 'dashedVerticalLine';\n        this.start = null;\n        this.stop = null;\n        var opts = {\n            x: null,\n            ymin: null,\n            ymax: null,\n            yOffset: '6px', // number or string.  Number interpreted as units, string as pixels.\n            yminOffset: null,\n            ymaxOffset: null,\n            // prop: dashPattern\n            // Array of line, space settings in pixels.\n            // Default is 8 pixel of line, 8 pixel of space.\n            // Note, limit to a 2 element array b/c of bug with higher order arrays.\n            dashPattern: [8,8]\n        };\n        $.extend(true, this.options, opts, options);\n\n        if (this.options.showTooltipPrecision < 0.01) {\n            this.options.showTooltipPrecision = 0.01;\n        }\n    }\n\n    DashedVerticalLine.prototype = new LineBase();\n    DashedVerticalLine.prototype.constructor = DashedVerticalLine;\n    \n    $.jqplot.CanvasOverlay.prototype.addLine = function(opts) {\n        var line = new Line(opts);\n        line.uid = objCounter++;\n        this.objects.push(line);\n        this.objectNames.push(line.options.name);\n    };\n    \n    $.jqplot.CanvasOverlay.prototype.addHorizontalLine = function(opts) {\n        var line = new HorizontalLine(opts);\n        line.uid = objCounter++;\n        this.objects.push(line);\n        this.objectNames.push(line.options.name);\n    };\n    \n    $.jqplot.CanvasOverlay.prototype.addDashedHorizontalLine = function(opts) {\n        var line = new DashedHorizontalLine(opts);\n        line.uid = objCounter++;\n        this.objects.push(line);\n        this.objectNames.push(line.options.name);\n    };\n    \n    $.jqplot.CanvasOverlay.prototype.addVerticalLine = function(opts) {\n        var line = new VerticalLine(opts);\n        line.uid = objCounter++;\n        this.objects.push(line);\n        this.objectNames.push(line.options.name);\n    };\n    \n    $.jqplot.CanvasOverlay.prototype.addDashedVerticalLine = function(opts) {\n        var line = new DashedVerticalLine(opts);\n        line.uid = objCounter++;\n        this.objects.push(line);\n        this.objectNames.push(line.options.name);\n    };\n    \n    $.jqplot.CanvasOverlay.prototype.addRectangle = function(opts) {\n        var line = new Rectangle(opts);\n        line.uid = objCounter++;\n        this.objects.push(line);\n        this.objectNames.push(line.options.name);\n    };\n    \n    $.jqplot.CanvasOverlay.prototype.removeObject = function(idx) {\n        // check if integer, remove by index\n        if ($.type(idx) == 'number') {\n            this.objects.splice(idx, 1);\n            this.objectNames.splice(idx, 1);\n        }\n        // if string, remove by name\n        else {\n            var id = $.inArray(idx, this.objectNames);\n            if (id != -1) {\n                this.objects.splice(id, 1);\n                this.objectNames.splice(id, 1);\n            }\n        }\n    };\n    \n    $.jqplot.CanvasOverlay.prototype.getObject = function(idx) {\n        // check if integer, remove by index\n        if ($.type(idx) == 'number') {\n            return this.objects[idx];\n        }\n        // if string, remove by name\n        else {\n            var id = $.inArray(idx, this.objectNames);\n            if (id != -1) {\n                return this.objects[id];\n            }\n        }\n    };\n    \n    // Set get as alias for getObject.\n    $.jqplot.CanvasOverlay.prototype.get = $.jqplot.CanvasOverlay.prototype.getObject;\n    \n    $.jqplot.CanvasOverlay.prototype.clear = function(plot) {\n        this.canvas._ctx.clearRect(0,0,this.canvas.getWidth(), this.canvas.getHeight());\n    };\n    \n    $.jqplot.CanvasOverlay.prototype.draw = function(plot) {\n        var obj, \n            objs = this.objects,\n            mr = this.markerRenderer,\n            start,\n            stop;\n        if (this.options.show) {\n            this.canvas._ctx.clearRect(0,0,this.canvas.getWidth(), this.canvas.getHeight());\n            for (var k=0; k<objs.length; k++) {\n                obj = objs[k];\n                var opts = $.extend(true, {}, obj.options);\n                if (obj.options.show) {\n                    // style and shadow properties should be set before\n                    // every draw of marker renderer.\n                    mr.shadow = obj.options.shadow;\n                    obj.tooltipWidthFactor = obj.options.lineWidth / obj.options.showTooltipPrecision;\n                    switch (obj.type) {\n                        case 'line':\n                            // style and shadow properties should be set before\n                            // every draw of marker renderer.\n                            mr.style = 'line';\n                            opts.closePath = false;\n                            start = [plot.axes[obj.options.xaxis].series_u2p(obj.options.start[0]), plot.axes[obj.options.yaxis].series_u2p(obj.options.start[1])];\n                            stop = [plot.axes[obj.options.xaxis].series_u2p(obj.options.stop[0]), plot.axes[obj.options.yaxis].series_u2p(obj.options.stop[1])];\n                            obj.gridStart = start;\n                            obj.gridStop = stop;\n                            mr.draw(start, stop, this.canvas._ctx, opts);\n                            break;\n                        case 'horizontalLine':\n                            \n                            // style and shadow properties should be set before\n                            // every draw of marker renderer.\n                            if (obj.options.y != null) {\n                                mr.style = 'line';\n                                opts.closePath = false;\n                                var xaxis = plot.axes[obj.options.xaxis],\n                                    xstart,\n                                    xstop,\n                                    y = plot.axes[obj.options.yaxis].series_u2p(obj.options.y),\n                                    xminoff = obj.options.xminOffset || obj.options.xOffset,\n                                    xmaxoff = obj.options.xmaxOffset || obj.options.xOffset;\n                                if (obj.options.xmin != null) {\n                                    xstart = xaxis.series_u2p(obj.options.xmin);\n                                }\n                                else if (xminoff != null) {\n                                    if ($.type(xminoff) == \"number\") {\n                                        xstart = xaxis.series_u2p(xaxis.min + xminoff);\n                                    }\n                                    else if ($.type(xminoff) == \"string\") {\n                                        xstart = xaxis.series_u2p(xaxis.min) + parseFloat(xminoff);\n                                    }\n                                }\n                                if (obj.options.xmax != null) {\n                                    xstop = xaxis.series_u2p(obj.options.xmax);\n                                }\n                                else if (xmaxoff != null) {\n                                    if ($.type(xmaxoff) == \"number\") {\n                                        xstop = xaxis.series_u2p(xaxis.max - xmaxoff);\n                                    }\n                                    else if ($.type(xmaxoff) == \"string\") {\n                                        xstop = xaxis.series_u2p(xaxis.max) - parseFloat(xmaxoff);\n                                    }\n                                }\n                                if (xstop != null && xstart != null) {\n                                    obj.gridStart = [xstart, y];\n                                    obj.gridStop = [xstop, y];\n                                    mr.draw([xstart, y], [xstop, y], this.canvas._ctx, opts);\n                                }\n                            }\n                            break;\n\n                        case 'dashedHorizontalLine':\n                            \n                            var dashPat = obj.options.dashPattern;\n                            var dashPatLen = 0;\n                            for (var i=0; i<dashPat.length; i++) {\n                                dashPatLen += dashPat[i];\n                            }\n\n                            // style and shadow properties should be set before\n                            // every draw of marker renderer.\n                            if (obj.options.y != null) {\n                                mr.style = 'line';\n                                opts.closePath = false;\n                                var xaxis = plot.axes[obj.options.xaxis],\n                                    xstart,\n                                    xstop,\n                                    y = plot.axes[obj.options.yaxis].series_u2p(obj.options.y),\n                                    xminoff = obj.options.xminOffset || obj.options.xOffset,\n                                    xmaxoff = obj.options.xmaxOffset || obj.options.xOffset;\n                                if (obj.options.xmin != null) {\n                                    xstart = xaxis.series_u2p(obj.options.xmin);\n                                }\n                                else if (xminoff != null) {\n                                    if ($.type(xminoff) == \"number\") {\n                                        xstart = xaxis.series_u2p(xaxis.min + xminoff);\n                                    }\n                                    else if ($.type(xminoff) == \"string\") {\n                                        xstart = xaxis.series_u2p(xaxis.min) + parseFloat(xminoff);\n                                    }\n                                }\n                                if (obj.options.xmax != null) {\n                                    xstop = xaxis.series_u2p(obj.options.xmax);\n                                }\n                                else if (xmaxoff != null) {\n                                    if ($.type(xmaxoff) == \"number\") {\n                                        xstop = xaxis.series_u2p(xaxis.max - xmaxoff);\n                                    }\n                                    else if ($.type(xmaxoff) == \"string\") {\n                                        xstop = xaxis.series_u2p(xaxis.max) - parseFloat(xmaxoff);\n                                    }\n                                }\n                                if (xstop != null && xstart != null) {\n                                    obj.gridStart = [xstart, y];\n                                    obj.gridStop = [xstop, y];\n                                    var numDash = Math.ceil((xstop - xstart)/dashPatLen);\n                                    var b=xstart, e;\n                                    for (var i=0; i<numDash; i++) {\n                                        for (var j=0; j<dashPat.length; j+=2) {\n                                            e = b+dashPat[j];\n                                            mr.draw([b, y], [e, y], this.canvas._ctx, opts);\n                                            b += dashPat[j];\n                                            if (j < dashPat.length-1) {\n                                                b += dashPat[j+1];\n                                            }\n                                        }\n                                    }\n                                }\n                            }\n                            break;\n\n                        case 'verticalLine':\n                            \n                            // style and shadow properties should be set before\n                            // every draw of marker renderer.\n                            if (obj.options.x != null) {\n                                mr.style = 'line';\n                                opts.closePath = false;\n                                var yaxis = plot.axes[obj.options.yaxis],\n                                    ystart,\n                                    ystop,\n                                    x = plot.axes[obj.options.xaxis].series_u2p(obj.options.x),\n                                    yminoff = obj.options.yminOffset || obj.options.yOffset,\n                                    ymaxoff = obj.options.ymaxOffset || obj.options.yOffset;\n                                if (obj.options.ymin != null) {\n                                    ystart = yaxis.series_u2p(obj.options.ymin);\n                                }\n                                else if (yminoff != null) {\n                                    if ($.type(yminoff) == \"number\") {\n                                        ystart = yaxis.series_u2p(yaxis.min - yminoff);\n                                    }\n                                    else if ($.type(yminoff) == \"string\") {\n                                        ystart = yaxis.series_u2p(yaxis.min) - parseFloat(yminoff);\n                                    }\n                                }\n                                if (obj.options.ymax != null) {\n                                    ystop = yaxis.series_u2p(obj.options.ymax);\n                                }\n                                else if (ymaxoff != null) {\n                                    if ($.type(ymaxoff) == \"number\") {\n                                        ystop = yaxis.series_u2p(yaxis.max + ymaxoff);\n                                    }\n                                    else if ($.type(ymaxoff) == \"string\") {\n                                        ystop = yaxis.series_u2p(yaxis.max) + parseFloat(ymaxoff);\n                                    }\n                                }\n                                if (ystop != null && ystart != null) {\n                                    obj.gridStart = [x, ystart];\n                                    obj.gridStop = [x, ystop];\n                                    mr.draw([x, ystart], [x, ystop], this.canvas._ctx, opts);\n                                }\n                            }\n                            break;\n\n                        case 'dashedVerticalLine':\n                            \n                            var dashPat = obj.options.dashPattern;\n                            var dashPatLen = 0;\n                            for (var i=0; i<dashPat.length; i++) {\n                                dashPatLen += dashPat[i];\n                            }\n\n                            // style and shadow properties should be set before\n                            // every draw of marker renderer.\n                            if (obj.options.x != null) {\n                                mr.style = 'line';\n                                opts.closePath = false;\n                                var yaxis = plot.axes[obj.options.yaxis],\n                                    ystart,\n                                    ystop,\n                                    x = plot.axes[obj.options.xaxis].series_u2p(obj.options.x),\n                                    yminoff = obj.options.yminOffset || obj.options.yOffset,\n                                    ymaxoff = obj.options.ymaxOffset || obj.options.yOffset;\n                                if (obj.options.ymin != null) {\n                                    ystart = yaxis.series_u2p(obj.options.ymin);\n                                }\n                                else if (yminoff != null) {\n                                    if ($.type(yminoff) == \"number\") {\n                                        ystart = yaxis.series_u2p(yaxis.min - yminoff);\n                                    }\n                                    else if ($.type(yminoff) == \"string\") {\n                                        ystart = yaxis.series_u2p(yaxis.min) - parseFloat(yminoff);\n                                    }\n                                }\n                                if (obj.options.ymax != null) {\n                                    ystop = yaxis.series_u2p(obj.options.ymax);\n                                }\n                                else if (ymaxoff != null) {\n                                    if ($.type(ymaxoff) == \"number\") {\n                                        ystop = yaxis.series_u2p(yaxis.max + ymaxoff);\n                                    }\n                                    else if ($.type(ymaxoff) == \"string\") {\n                                        ystop = yaxis.series_u2p(yaxis.max) + parseFloat(ymaxoff);\n                                    }\n                                }\n\n\n                                if (ystop != null && ystart != null) {\n                                    obj.gridStart = [x, ystart];\n                                    obj.gridStop = [x, ystop];\n                                    var numDash = Math.ceil((ystart - ystop)/dashPatLen);\n                                    var firstDashAdjust = ((numDash * dashPatLen) - (ystart - ystop))/2.0;\n                                    var b=ystart, e, bs, es;\n                                    for (var i=0; i<numDash; i++) {\n                                        for (var j=0; j<dashPat.length; j+=2) {\n                                            e = b - dashPat[j];\n                                            if (e < ystop) {\n                                                e = ystop;\n                                            }\n                                            if (b < ystop) {\n                                                b = ystop;\n                                            }\n                                            // es = e;\n                                            // if (i == 0) {\n                                            //  es += firstDashAdjust;\n                                            // }\n                                            mr.draw([x, b], [x, e], this.canvas._ctx, opts);\n                                            b -= dashPat[j];\n                                            if (j < dashPat.length-1) {\n                                                b -= dashPat[j+1];\n                                            }\n                                        }\n                                    }\n                                }\n                            }\n                            break;\n                            \n                        case 'rectangle':\n                            // style and shadow properties should be set before\n                            // every draw of marker renderer.\n                            mr.style = 'line';\n                            opts.closePath = true;\n                            \n                            var xaxis = plot.axes[obj.options.xaxis],\n                                    xstart,\n                                    xstop,\n                                    y = plot.axes[obj.options.yaxis].series_u2p(obj.options.y),\n                                    xminoff = obj.options.xminOffset || obj.options.xOffset,\n                                    xmaxoff = obj.options.xmaxOffset || obj.options.xOffset;\n                            if (obj.options.xmin != null) {\n                                xstart = xaxis.series_u2p(obj.options.xmin);\n                            }\n                            else if (xminoff != null) {\n                                if ($.type(xminoff) == \"number\") {\n                                    xstart = xaxis.series_u2p(xaxis.min + xminoff);\n                                }\n                                else if ($.type(xminoff) == \"string\") {\n                                    xstart = xaxis.series_u2p(xaxis.min) + parseFloat(xminoff);\n                                }\n                            }\n                            if (obj.options.xmax != null) {\n                                xstop = xaxis.series_u2p(obj.options.xmax);\n                            }\n                            else if (xmaxoff != null) {\n                                if ($.type(xmaxoff) == \"number\") {\n                                    xstop = xaxis.series_u2p(xaxis.max - xmaxoff);\n                                }\n                                else if ($.type(xmaxoff) == \"string\") {\n                                    xstop = xaxis.series_u2p(xaxis.max) - parseFloat(xmaxoff);\n                                }\n                            }\n                            \n                            var yaxis = plot.axes[obj.options.yaxis],\n                                ystart,\n                                ystop,\n                                x = plot.axes[obj.options.xaxis].series_u2p(obj.options.x),\n                                yminoff = obj.options.yminOffset || obj.options.yOffset,\n                                ymaxoff = obj.options.ymaxOffset || obj.options.yOffset;\n                            if (obj.options.ymin != null) {\n                                ystart = yaxis.series_u2p(obj.options.ymin);\n                            }\n                            else if (yminoff != null) {\n                                if ($.type(yminoff) == \"number\") {\n                                    ystart = yaxis.series_u2p(yaxis.min - yminoff);\n                                }\n                                else if ($.type(yminoff) == \"string\") {\n                                    ystart = yaxis.series_u2p(yaxis.min) - parseFloat(yminoff);\n                                }\n                            }\n                            if (obj.options.ymax != null) {\n                                ystop = yaxis.series_u2p(obj.options.ymax);\n                            }\n                            else if (ymaxoff != null) {\n                                if ($.type(ymaxoff) == \"number\") {\n                                    ystop = yaxis.series_u2p(yaxis.max + ymaxoff);\n                                }\n                                else if ($.type(ymaxoff) == \"string\") {\n                                    ystop = yaxis.series_u2p(yaxis.max) + parseFloat(ymaxoff);\n                                }\n                            }\n                            \n\n                            if (xstop != null && xstart != null && ystop != null && ystart != null) {\n                                obj.gridStart = [xstart, ystart];\n                                obj.gridStop = [xstop, ystop];\n                                \n                                this.canvas._ctx.fillStyle = obj.options.color;\n                                this.canvas._ctx.fillRect(xstart, ystart, xstop - xstart, ystop - ystart);\n                            }\n                            break;\n\n                        default:\n                            break;\n                    }\n                }\n            }\n        }\n    };\n    \n    // called within context of plot\n    // create a canvas which we can draw on.\n    // insert it before the eventCanvas, so eventCanvas will still capture events.\n    $.jqplot.CanvasOverlay.postPlotDraw = function() {\n        var co = this.plugins.canvasOverlay;\n        // Memory Leaks patch    \n        if (co && co.highlightCanvas) {\n            co.highlightCanvas.resetCanvas();\n            co.highlightCanvas = null;\n        }\n        co.canvas = new $.jqplot.GenericCanvas();\n        \n        this.eventCanvas._elem.before(co.canvas.createElement(this._gridPadding, 'jqplot-overlayCanvas-canvas', this._plotDimensions, this));\n        co.canvas.setContext();\n        if (!co.deferDraw) {\n            co.draw(this);\n        }\n\n        var elem = document.createElement('div');\n        co._tooltipElem = $(elem);\n        elem = null;\n        co._tooltipElem.addClass('jqplot-canvasOverlay-tooltip');\n        co._tooltipElem.css({position:'absolute', display:'none'});\n        \n        this.eventCanvas._elem.before(co._tooltipElem);\n        this.eventCanvas._elem.bind('mouseleave', { elem: co._tooltipElem }, function (ev) { ev.data.elem.hide(); });\n\n        var co = null;\n    };\n\n\n    function showTooltip(plot, obj, gridpos, datapos) {\n        var co = plot.plugins.canvasOverlay;\n        var elem = co._tooltipElem;\n\n        var opts = obj.options, x, y;\n\n        elem.html($.jqplot.sprintf(opts.tooltipFormatString, datapos[0], datapos[1]));\n        \n        switch (opts.tooltipLocation) {\n            case 'nw':\n                x = gridpos[0] + plot._gridPadding.left - elem.outerWidth(true) - opts.tooltipOffset;\n                y = gridpos[1] + plot._gridPadding.top - opts.tooltipOffset - elem.outerHeight(true);\n                break;\n            case 'n':\n                x = gridpos[0] + plot._gridPadding.left - elem.outerWidth(true)/2;\n                y = gridpos[1] + plot._gridPadding.top - opts.tooltipOffset - elem.outerHeight(true);\n                break;\n            case 'ne':\n                x = gridpos[0] + plot._gridPadding.left + opts.tooltipOffset;\n                y = gridpos[1] + plot._gridPadding.top - opts.tooltipOffset - elem.outerHeight(true);\n                break;\n            case 'e':\n                x = gridpos[0] + plot._gridPadding.left + opts.tooltipOffset;\n                y = gridpos[1] + plot._gridPadding.top - elem.outerHeight(true)/2;\n                break;\n            case 'se':\n                x = gridpos[0] + plot._gridPadding.left + opts.tooltipOffset;\n                y = gridpos[1] + plot._gridPadding.top + opts.tooltipOffset;\n                break;\n            case 's':\n                x = gridpos[0] + plot._gridPadding.left - elem.outerWidth(true)/2;\n                y = gridpos[1] + plot._gridPadding.top + opts.tooltipOffset;\n                break;\n            case 'sw':\n                x = gridpos[0] + plot._gridPadding.left - elem.outerWidth(true) - opts.tooltipOffset;\n                y = gridpos[1] + plot._gridPadding.top + opts.tooltipOffset;\n                break;\n            case 'w':\n                x = gridpos[0] + plot._gridPadding.left - elem.outerWidth(true) - opts.tooltipOffset;\n                y = gridpos[1] + plot._gridPadding.top - elem.outerHeight(true)/2;\n                break;\n            default: // same as 'nw'\n                x = gridpos[0] + plot._gridPadding.left - elem.outerWidth(true) - opts.tooltipOffset;\n                y = gridpos[1] + plot._gridPadding.top - opts.tooltipOffset - elem.outerHeight(true);\n                break;\n        }\n\n        elem.css('left', x);\n        elem.css('top', y);\n        if (opts.fadeTooltip) {\n            // Fix for stacked up animations.  Thnanks Trevor!\n            elem.stop(true,true).fadeIn(opts.tooltipFadeSpeed);\n        }\n        else {\n            elem.show();\n        }\n        elem = null;\n    }\n\n\n    function isNearLine(point, lstart, lstop, width) {\n        // r is point to test, p and q are end points.\n        var rx = point[0];\n        var ry = point[1];\n        var px = Math.round(lstop[0]);\n        var py = Math.round(lstop[1]);\n        var qx = Math.round(lstart[0]);\n        var qy = Math.round(lstart[1]);\n\n        var l = Math.sqrt(Math.pow(px-qx, 2) + Math.pow(py-qy, 2));\n\n        // scale error term by length of line.\n        var eps = width*l;\n        var res = Math.abs((qx-px) * (ry-py) - (qy-py) * (rx-px));\n        var ret = (res < eps) ? true : false;\n        return ret;\n    }\n    \n    function isNearRectangle(point, lstart, lstop, width) {\n        // r is point to test, p and q are end points.\n        var rx = point[0];\n        var ry = point[1];\n        var px = Math.round(lstop[0]);\n        var py = Math.round(lstop[1]);\n        var qx = Math.round(lstart[0]);\n        var qy = Math.round(lstart[1]);\n        \n        var temp;\n        if (px > qx) { temp = px; px = qx; qx = temp; }\n        if (py > qy) { temp = py; py = qy; qy = temp; }\n        \n        var ret = (rx >= px && rx <= qx && ry >= py && ry <= qy);\n        \n        return ret;\n    }\n\n\n    function handleMove(ev, gridpos, datapos, neighbor, plot) {\n        var co = plot.plugins.canvasOverlay;\n        var objs = co.objects;\n        var l = objs.length;\n        var obj, haveHighlight=false;\n        var elem;\n        for (var i=0; i<l; i++) {\n            obj = objs[i];\n            if (obj.options.showTooltip) {\n            \tvar n;\n                if (obj.type === 'rectangle') {\n                 n = isNearRectangle([gridpos.x, gridpos.y], obj.gridStart, obj.gridStop, obj.tooltipWidthFactor);\n                } else {\n                 n = isNearLine([gridpos.x, gridpos.y], obj.gridStart, obj.gridStop, obj.tooltipWidthFactor);\n                }\n                datapos = [plot.axes[obj.options.xaxis].series_p2u(gridpos.x), plot.axes[obj.options.yaxis].series_p2u(gridpos.y)];\n\n                // cases:\n                //    near line, no highlighting\n                //    near line, highliting on this line\n                //    near line, highlighting another line\n                //    not near any line, highlighting\n                //    not near any line, no highlighting\n\n                // near line, not currently highlighting\n                if (n && co.highlightObjectIndex == null) {\n                    switch (obj.type) {\n                        case 'line':\n                            showTooltip(plot, obj, [gridpos.x, gridpos.y], datapos);\n                            break;\n\n                        case 'horizontalLine':\n                        case 'dashedHorizontalLine':\n                            showTooltip(plot, obj, [gridpos.x, obj.gridStart[1]], [datapos[0], obj.options.y]);\n                            break;\n\n                        case 'verticalLine':\n                        case 'dashedVerticalLine':\n                            showTooltip(plot, obj, [obj.gridStart[0], gridpos.y], [obj.options.x, datapos[1]]);\n                            break;\n                            \n                        case 'rectangle':\n                            showTooltip(plot, obj, [obj.gridStart[0], gridpos.y], [obj.options.x, datapos[1]]);\n                            break;\n                            \n                        default:\n                            break;\n                    } \n                    co.highlightObjectIndex = i;\n                    haveHighlight = true;\n                    break;\n                }\n\n                // near line, highlighting another line.\n                else if (n && co.highlightObjectIndex !== i) {\n                    // turn off tooltip.\n                    elem = co._tooltipElem;\n                    if (obj.fadeTooltip) {\n                        elem.fadeOut(obj.tooltipFadeSpeed);\n                    }\n                    else {\n                        elem.hide();\n                    }\n\n                    // turn on right tooltip.\n                    switch (obj.type) {\n                        case 'line':\n                            showTooltip(plot, obj, [gridpos.x, gridpos.y], datapos);\n                            break;\n\n                        case 'horizontalLine':\n                        case 'dashedHorizontalLine':\n                            showTooltip(plot, obj, [gridpos.x, obj.gridStart[1]], [datapos[0], obj.options.y]);\n                            break;\n\n                        case 'verticalLine':\n                        case 'dashedVerticalLine':\n                            showTooltip(plot, obj, [obj.gridStart[0], gridpos.y], [obj.options.x, datapos[1]]);\n                            break;\n                            \n                        case 'rectangle':\n                            showTooltip(plot, obj, [obj.gridStart[0], gridpos.y], [obj.options.x, datapos[1]]);\n                            break;\n                            \n                        default:\n                            break;\n                    }\n\n                    co.highlightObjectIndex = i;\n                    haveHighlight = true;\n                    break;\n                }\n\n                // near line, already highlighting this line, update\n                else if (n) {\n                    switch (obj.type) {\n                        case 'line':\n                            showTooltip(plot, obj, [gridpos.x, gridpos.y], datapos);\n                            break;\n\n                        case 'horizontalLine':\n                        case 'dashedHorizontalLine':\n                            showTooltip(plot, obj, [gridpos.x, obj.gridStart[1]], [datapos[0], obj.options.y]);\n                            break;\n\n                        case 'verticalLine':\n                        case 'dashedVerticalLine':\n                            showTooltip(plot, obj, [obj.gridStart[0], gridpos.y], [obj.options.x, datapos[1]]);\n                            break;\n                            \n                        case 'rectangle':\n                            showTooltip(plot, obj, [obj.gridStart[0], gridpos.y], [obj.options.x, datapos[1]]);\n                            break;\n                            \n                        default:\n                            break;\n                    }\n\n                    haveHighlight = true;\n                    break;\n                }\n            }\n        }\n\n        // check if we are highlighting and not near a line, turn it off.\n        if (!haveHighlight && co.highlightObjectIndex !== null) {\n            elem = co._tooltipElem;\n            obj = co.getObject(co.highlightObjectIndex);\n            if (obj.fadeTooltip) {\n                elem.fadeOut(obj.tooltipFadeSpeed);\n            }\n            else {\n                elem.hide();\n            }\n            co.highlightObjectIndex = null;\n        }\n    }\n    \n    $.jqplot.postInitHooks.push($.jqplot.CanvasOverlay.postPlotInit);\n    $.jqplot.postDrawHooks.push($.jqplot.CanvasOverlay.postPlotDraw);\n    $.jqplot.eventListenerHooks.push(['jqplotMouseMove', handleMove]);\n\n})(jQuery);"
  },
  {
    "path": "stenogotchi/ui/web/static/js/plugins/jqplot.canvasTextRenderer.js",
    "content": "/**\n * jqPlot\n * Pure JavaScript plotting plugin using jQuery\n *\n * Version: 1.0.9\n * Revision: d96a669\n *\n * Copyright (c) 2009-2016 Chris Leonello\n * jqPlot is currently available for use in all personal or commercial projects \n * under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL \n * version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can \n * choose the license that best suits your project and use it accordingly. \n *\n * Although not required, the author would appreciate an email letting him \n * know of any substantial use of jqPlot.  You can reach the author at: \n * chris at jqplot dot com or see http://www.jqplot.com/info.php .\n *\n * If you are feeling kind and generous, consider supporting the project by\n * making a donation at: http://www.jqplot.com/donate.php .\n *\n * sprintf functions contained in jqplot.sprintf.js by Ash Searle:\n *\n *     version 2007.04.27\n *     author Ash Searle\n *     http://hexmen.com/blog/2007/03/printf-sprintf/\n *     http://hexmen.com/js/sprintf.js\n *     The author (Ash Searle) has placed this code in the public domain:\n *     \"This code is unrestricted: you are free to use it however you like.\"\n *\n * included jsDate library by Chris Leonello:\n *\n * Copyright (c) 2010-2015 Chris Leonello\n *\n * jsDate is currently available for use in all personal or commercial projects \n * under both the MIT and GPL version 2.0 licenses. This means that you can \n * choose the license that best suits your project and use it accordingly.\n *\n * jsDate borrows many concepts and ideas from the Date Instance \n * Methods by Ken Snyder along with some parts of Ken's actual code.\n * \n * Ken's original Date Instance Methods and copyright notice:\n * \n * Ken Snyder (ken d snyder at gmail dot com)\n * 2008-09-10\n * version 2.0.2 (http://kendsnyder.com/sandbox/date/)     \n * Creative Commons Attribution License 3.0 (http://creativecommons.org/licenses/by/3.0/)\n *\n * jqplotToImage function based on Larry Siden's export-jqplot-to-png.js.\n * Larry has generously given permission to adapt his code for inclusion\n * into jqPlot.\n *\n * Larry's original code can be found here:\n *\n * https://github.com/lsiden/export-jqplot-to-png\n * \n * \n */\n\n(function($) {    \n    // This code is a modified version of the canvastext.js code, copyright below:\n    //\n    // This code is released to the public domain by Jim Studt, 2007.\n    // He may keep some sort of up to date copy at http://www.federated.com/~jim/canvastext/\n    //\n    $.jqplot.CanvasTextRenderer = function(options){\n        this.fontStyle = 'normal';  // normal, italic, oblique [not implemented]\n        this.fontVariant = 'normal';    // normal, small caps [not implemented]\n        this.fontWeight = 'normal'; // normal, bold, bolder, lighter, 100 - 900\n        this.fontSize = '10px'; \n        this.fontFamily = 'sans-serif';\n        this.fontStretch = 1.0;\n        this.fillStyle = '#666666';\n        this.angle = 0;\n        this.textAlign = 'start';\n        this.textBaseline = 'alphabetic';\n        this.text;\n        this.width;\n        this.height;\n        this.pt2px = 1.28;\n\n        $.extend(true, this, options);\n        this.normalizedFontSize = this.normalizeFontSize(this.fontSize);\n        this.setHeight();\n    };\n    \n    $.jqplot.CanvasTextRenderer.prototype.init = function(options) {\n        $.extend(true, this, options);\n        this.normalizedFontSize = this.normalizeFontSize(this.fontSize);\n        this.setHeight();\n    };\n    \n    // convert css spec into point size\n    // returns float\n    $.jqplot.CanvasTextRenderer.prototype.normalizeFontSize = function(sz) {\n        sz = String(sz);\n        var n = parseFloat(sz);\n        if (sz.indexOf('px') > -1) {\n            return n/this.pt2px;\n        }\n        else if (sz.indexOf('pt') > -1) {\n            return n;\n        }\n        else if (sz.indexOf('em') > -1) {\n            return n*12;\n        }\n        else if (sz.indexOf('%') > -1) {\n            return n*12/100;\n        }\n        // default to pixels;\n        else {\n            return n/this.pt2px;\n        }\n    };\n    \n    \n    $.jqplot.CanvasTextRenderer.prototype.fontWeight2Float = function(w) {\n        // w = normal | bold | bolder | lighter | 100 | 200 | 300 | 400 | 500 | 600 | 700 | 800 | 900\n        // return values adjusted for Hershey font.\n        if (Number(w)) {\n            return w/400;\n        }\n        else {\n            switch (w) {\n                case 'normal':\n                    return 1;\n                    break;\n                case 'bold':\n                    return 1.75;\n                    break;\n                case 'bolder':\n                    return 2.25;\n                    break;\n                case 'lighter':\n                    return 0.75;\n                    break;\n                default:\n                    return 1;\n                    break;\n             }   \n        }\n    };\n    \n    $.jqplot.CanvasTextRenderer.prototype.getText = function() {\n        return this.text;\n    };\n    \n    $.jqplot.CanvasTextRenderer.prototype.setText = function(t, ctx) {\n        this.text = t;\n        this.setWidth(ctx);\n        return this;\n    };\n    \n    $.jqplot.CanvasTextRenderer.prototype.getWidth = function(ctx) {\n        return this.width;\n    };\n    \n    $.jqplot.CanvasTextRenderer.prototype.setWidth = function(ctx, w) {\n        if (!w) {\n            this.width = this.measure(ctx, this.text);\n        }\n        else {\n            this.width = w;   \n        }\n        return this;\n    };\n    \n    // return height in pixels.\n    $.jqplot.CanvasTextRenderer.prototype.getHeight = function(ctx) {\n        return this.height;\n    };\n    \n    // w - height in pt\n    // set heigh in px\n    $.jqplot.CanvasTextRenderer.prototype.setHeight = function(w) {\n        if (!w) {\n            //height = this.fontSize /0.75;\n            this.height = this.normalizedFontSize * this.pt2px;\n        }\n        else {\n            this.height = w;   \n        }\n        return this;\n    };\n\n    $.jqplot.CanvasTextRenderer.prototype.letter = function (ch)\n    {\n        return this.letters[ch];\n    };\n\n    $.jqplot.CanvasTextRenderer.prototype.ascent = function()\n    {\n        return this.normalizedFontSize;\n    };\n\n    $.jqplot.CanvasTextRenderer.prototype.descent = function()\n    {\n        return 7.0*this.normalizedFontSize/25.0;\n    };\n\n    $.jqplot.CanvasTextRenderer.prototype.measure = function(ctx, str)\n    {\n        var total = 0;\n        var len = str.length;\n \n        for (var i = 0; i < len; i++) {\n            var c = this.letter(str.charAt(i));\n            if (c) {\n                total += c.width * this.normalizedFontSize / 25.0 * this.fontStretch;\n            }\n        }\n        return total;\n    };\n\n    $.jqplot.CanvasTextRenderer.prototype.draw = function(ctx,str)\n    {\n        var x = 0;\n        // leave room at bottom for descenders.\n        var y = this.height*0.72;\n         var total = 0;\n         var len = str.length;\n         var mag = this.normalizedFontSize / 25.0;\n\n         ctx.save();\n         var tx, ty;\n         \n         // 1st quadrant\n         if ((-Math.PI/2 <= this.angle && this.angle <= 0) || (Math.PI*3/2 <= this.angle && this.angle <= Math.PI*2)) {\n             tx = 0;\n             ty = -Math.sin(this.angle) * this.width;\n         }\n         // 4th quadrant\n         else if ((0 < this.angle && this.angle <= Math.PI/2) || (-Math.PI*2 <= this.angle && this.angle <= -Math.PI*3/2)) {\n             tx = Math.sin(this.angle) * this.height;\n             ty = 0;\n         }\n         // 2nd quadrant\n         else if ((-Math.PI < this.angle && this.angle < -Math.PI/2) || (Math.PI <= this.angle && this.angle <= Math.PI*3/2)) {\n             tx = -Math.cos(this.angle) * this.width;\n             ty = -Math.sin(this.angle) * this.width - Math.cos(this.angle) * this.height;\n         }\n         // 3rd quadrant\n         else if ((-Math.PI*3/2 < this.angle && this.angle < Math.PI) || (Math.PI/2 < this.angle && this.angle < Math.PI)) {\n             tx = Math.sin(this.angle) * this.height - Math.cos(this.angle)*this.width;\n             ty = -Math.cos(this.angle) * this.height;\n         }\n         \n         ctx.strokeStyle = this.fillStyle;\n         ctx.fillStyle = this.fillStyle;\n         ctx.translate(tx, ty);\n         ctx.rotate(this.angle);\n         ctx.lineCap = \"round\";\n         // multiplier was 2.0\n         var fact = (this.normalizedFontSize > 30) ? 2.0 : 2 + (30 - this.normalizedFontSize)/20;\n         ctx.lineWidth = fact * mag * this.fontWeight2Float(this.fontWeight);\n         \n         for ( var i = 0; i < len; i++) {\n            var c = this.letter( str.charAt(i));\n            if ( !c) {\n                continue;\n            }\n\n            ctx.beginPath();\n\n            var penUp = 1;\n            var needStroke = 0;\n            for ( var j = 0; j < c.points.length; j++) {\n              var a = c.points[j];\n              if ( a[0] == -1 && a[1] == -1) {\n                  penUp = 1;\n                  continue;\n              }\n              if ( penUp) {\n                  ctx.moveTo( x + a[0]*mag*this.fontStretch, y - a[1]*mag);\n                  penUp = false;\n              } else {\n                  ctx.lineTo( x + a[0]*mag*this.fontStretch, y - a[1]*mag);\n              }\n            }\n            ctx.stroke();\n            x += c.width*mag*this.fontStretch;\n         }\n         ctx.restore();\n         return total;\n    };\n\n    $.jqplot.CanvasTextRenderer.prototype.letters = {\n         ' ': { width: 16, points: [] },\n         '!': { width: 10, points: [[5,21],[5,7],[-1,-1],[5,2],[4,1],[5,0],[6,1],[5,2]] },\n         '\"': { width: 16, points: [[4,21],[4,14],[-1,-1],[12,21],[12,14]] },\n         '#': { width: 21, points: [[11,25],[4,-7],[-1,-1],[17,25],[10,-7],[-1,-1],[4,12],[18,12],[-1,-1],[3,6],[17,6]] },\n         '$': { width: 20, points: [[8,25],[8,-4],[-1,-1],[12,25],[12,-4],[-1,-1],[17,18],[15,20],[12,21],[8,21],[5,20],[3,18],[3,16],[4,14],[5,13],[7,12],[13,10],[15,9],[16,8],[17,6],[17,3],[15,1],[12,0],[8,0],[5,1],[3,3]] },\n         '%': { width: 24, points: [[21,21],[3,0],[-1,-1],[8,21],[10,19],[10,17],[9,15],[7,14],[5,14],[3,16],[3,18],[4,20],[6,21],[8,21],[10,20],[13,19],[16,19],[19,20],[21,21],[-1,-1],[17,7],[15,6],[14,4],[14,2],[16,0],[18,0],[20,1],[21,3],[21,5],[19,7],[17,7]] },\n         '&': { width: 26, points: [[23,12],[23,13],[22,14],[21,14],[20,13],[19,11],[17,6],[15,3],[13,1],[11,0],[7,0],[5,1],[4,2],[3,4],[3,6],[4,8],[5,9],[12,13],[13,14],[14,16],[14,18],[13,20],[11,21],[9,20],[8,18],[8,16],[9,13],[11,10],[16,3],[18,1],[20,0],[22,0],[23,1],[23,2]] },\n         '\\'': { width: 10, points: [[5,19],[4,20],[5,21],[6,20],[6,18],[5,16],[4,15]] },\n         '(': { width: 14, points: [[11,25],[9,23],[7,20],[5,16],[4,11],[4,7],[5,2],[7,-2],[9,-5],[11,-7]] },\n         ')': { width: 14, points: [[3,25],[5,23],[7,20],[9,16],[10,11],[10,7],[9,2],[7,-2],[5,-5],[3,-7]] },\n         '*': { width: 16, points: [[8,21],[8,9],[-1,-1],[3,18],[13,12],[-1,-1],[13,18],[3,12]] },\n         '+': { width: 26, points: [[13,18],[13,0],[-1,-1],[4,9],[22,9]] },\n         ',': { width: 10, points: [[6,1],[5,0],[4,1],[5,2],[6,1],[6,-1],[5,-3],[4,-4]] },\n         '-': { width: 18, points: [[6,9],[12,9]] },\n         '.': { width: 10, points: [[5,2],[4,1],[5,0],[6,1],[5,2]] },\n         '/': { width: 22, points: [[20,25],[2,-7]] },\n         '0': { width: 20, points: [[9,21],[6,20],[4,17],[3,12],[3,9],[4,4],[6,1],[9,0],[11,0],[14,1],[16,4],[17,9],[17,12],[16,17],[14,20],[11,21],[9,21]] },\n         '1': { width: 20, points: [[6,17],[8,18],[11,21],[11,0]] },\n         '2': { width: 20, points: [[4,16],[4,17],[5,19],[6,20],[8,21],[12,21],[14,20],[15,19],[16,17],[16,15],[15,13],[13,10],[3,0],[17,0]] },\n         '3': { width: 20, points: [[5,21],[16,21],[10,13],[13,13],[15,12],[16,11],[17,8],[17,6],[16,3],[14,1],[11,0],[8,0],[5,1],[4,2],[3,4]] },\n         '4': { width: 20, points: [[13,21],[3,7],[18,7],[-1,-1],[13,21],[13,0]] },\n         '5': { width: 20, points: [[15,21],[5,21],[4,12],[5,13],[8,14],[11,14],[14,13],[16,11],[17,8],[17,6],[16,3],[14,1],[11,0],[8,0],[5,1],[4,2],[3,4]] },\n         '6': { width: 20, points: [[16,18],[15,20],[12,21],[10,21],[7,20],[5,17],[4,12],[4,7],[5,3],[7,1],[10,0],[11,0],[14,1],[16,3],[17,6],[17,7],[16,10],[14,12],[11,13],[10,13],[7,12],[5,10],[4,7]] },\n         '7': { width: 20, points: [[17,21],[7,0],[-1,-1],[3,21],[17,21]] },\n         '8': { width: 20, points: [[8,21],[5,20],[4,18],[4,16],[5,14],[7,13],[11,12],[14,11],[16,9],[17,7],[17,4],[16,2],[15,1],[12,0],[8,0],[5,1],[4,2],[3,4],[3,7],[4,9],[6,11],[9,12],[13,13],[15,14],[16,16],[16,18],[15,20],[12,21],[8,21]] },\n         '9': { width: 20, points: [[16,14],[15,11],[13,9],[10,8],[9,8],[6,9],[4,11],[3,14],[3,15],[4,18],[6,20],[9,21],[10,21],[13,20],[15,18],[16,14],[16,9],[15,4],[13,1],[10,0],[8,0],[5,1],[4,3]] },\n         ':': { width: 10, points: [[5,14],[4,13],[5,12],[6,13],[5,14],[-1,-1],[5,2],[4,1],[5,0],[6,1],[5,2]] },\n         ';': { width: 10, points: [[5,14],[4,13],[5,12],[6,13],[5,14],[-1,-1],[6,1],[5,0],[4,1],[5,2],[6,1],[6,-1],[5,-3],[4,-4]] },\n         '<': { width: 24, points: [[20,18],[4,9],[20,0]] },\n         '=': { width: 26, points: [[4,12],[22,12],[-1,-1],[4,6],[22,6]] },\n         '>': { width: 24, points: [[4,18],[20,9],[4,0]] },\n         '?': { width: 18, points: [[3,16],[3,17],[4,19],[5,20],[7,21],[11,21],[13,20],[14,19],[15,17],[15,15],[14,13],[13,12],[9,10],[9,7],[-1,-1],[9,2],[8,1],[9,0],[10,1],[9,2]] },\n         '@': { width: 27, points: [[18,13],[17,15],[15,16],[12,16],[10,15],[9,14],[8,11],[8,8],[9,6],[11,5],[14,5],[16,6],[17,8],[-1,-1],[12,16],[10,14],[9,11],[9,8],[10,6],[11,5],[-1,-1],[18,16],[17,8],[17,6],[19,5],[21,5],[23,7],[24,10],[24,12],[23,15],[22,17],[20,19],[18,20],[15,21],[12,21],[9,20],[7,19],[5,17],[4,15],[3,12],[3,9],[4,6],[5,4],[7,2],[9,1],[12,0],[15,0],[18,1],[20,2],[21,3],[-1,-1],[19,16],[18,8],[18,6],[19,5]] },\n         'A': { width: 18, points: [[9,21],[1,0],[-1,-1],[9,21],[17,0],[-1,-1],[4,7],[14,7]] },\n         'B': { width: 21, points: [[4,21],[4,0],[-1,-1],[4,21],[13,21],[16,20],[17,19],[18,17],[18,15],[17,13],[16,12],[13,11],[-1,-1],[4,11],[13,11],[16,10],[17,9],[18,7],[18,4],[17,2],[16,1],[13,0],[4,0]] },\n         'C': { width: 21, points: [[18,16],[17,18],[15,20],[13,21],[9,21],[7,20],[5,18],[4,16],[3,13],[3,8],[4,5],[5,3],[7,1],[9,0],[13,0],[15,1],[17,3],[18,5]] },\n         'D': { width: 21, points: [[4,21],[4,0],[-1,-1],[4,21],[11,21],[14,20],[16,18],[17,16],[18,13],[18,8],[17,5],[16,3],[14,1],[11,0],[4,0]] },\n         'E': { width: 19, points: [[4,21],[4,0],[-1,-1],[4,21],[17,21],[-1,-1],[4,11],[12,11],[-1,-1],[4,0],[17,0]] },\n         'F': { width: 18, points: [[4,21],[4,0],[-1,-1],[4,21],[17,21],[-1,-1],[4,11],[12,11]] },\n         'G': { width: 21, points: [[18,16],[17,18],[15,20],[13,21],[9,21],[7,20],[5,18],[4,16],[3,13],[3,8],[4,5],[5,3],[7,1],[9,0],[13,0],[15,1],[17,3],[18,5],[18,8],[-1,-1],[13,8],[18,8]] },\n         'H': { width: 22, points: [[4,21],[4,0],[-1,-1],[18,21],[18,0],[-1,-1],[4,11],[18,11]] },\n         'I': { width: 8, points: [[4,21],[4,0]] },\n         'J': { width: 16, points: [[12,21],[12,5],[11,2],[10,1],[8,0],[6,0],[4,1],[3,2],[2,5],[2,7]] },\n         'K': { width: 21, points: [[4,21],[4,0],[-1,-1],[18,21],[4,7],[-1,-1],[9,12],[18,0]] },\n         'L': { width: 17, points: [[4,21],[4,0],[-1,-1],[4,0],[16,0]] },\n         'M': { width: 24, points: [[4,21],[4,0],[-1,-1],[4,21],[12,0],[-1,-1],[20,21],[12,0],[-1,-1],[20,21],[20,0]] },\n         'N': { width: 22, points: [[4,21],[4,0],[-1,-1],[4,21],[18,0],[-1,-1],[18,21],[18,0]] },\n         'O': { width: 22, points: [[9,21],[7,20],[5,18],[4,16],[3,13],[3,8],[4,5],[5,3],[7,1],[9,0],[13,0],[15,1],[17,3],[18,5],[19,8],[19,13],[18,16],[17,18],[15,20],[13,21],[9,21]] },\n         'P': { width: 21, points: [[4,21],[4,0],[-1,-1],[4,21],[13,21],[16,20],[17,19],[18,17],[18,14],[17,12],[16,11],[13,10],[4,10]] },\n         'Q': { width: 22, points: [[9,21],[7,20],[5,18],[4,16],[3,13],[3,8],[4,5],[5,3],[7,1],[9,0],[13,0],[15,1],[17,3],[18,5],[19,8],[19,13],[18,16],[17,18],[15,20],[13,21],[9,21],[-1,-1],[12,4],[18,-2]] },\n         'R': { width: 21, points: [[4,21],[4,0],[-1,-1],[4,21],[13,21],[16,20],[17,19],[18,17],[18,15],[17,13],[16,12],[13,11],[4,11],[-1,-1],[11,11],[18,0]] },\n         'S': { width: 20, points: [[17,18],[15,20],[12,21],[8,21],[5,20],[3,18],[3,16],[4,14],[5,13],[7,12],[13,10],[15,9],[16,8],[17,6],[17,3],[15,1],[12,0],[8,0],[5,1],[3,3]] },\n         'T': { width: 16, points: [[8,21],[8,0],[-1,-1],[1,21],[15,21]] },\n         'U': { width: 22, points: [[4,21],[4,6],[5,3],[7,1],[10,0],[12,0],[15,1],[17,3],[18,6],[18,21]] },\n         'V': { width: 18, points: [[1,21],[9,0],[-1,-1],[17,21],[9,0]] },\n         'W': { width: 24, points: [[2,21],[7,0],[-1,-1],[12,21],[7,0],[-1,-1],[12,21],[17,0],[-1,-1],[22,21],[17,0]] },\n         'X': { width: 20, points: [[3,21],[17,0],[-1,-1],[17,21],[3,0]] },\n         'Y': { width: 18, points: [[1,21],[9,11],[9,0],[-1,-1],[17,21],[9,11]] },\n         'Z': { width: 20, points: [[17,21],[3,0],[-1,-1],[3,21],[17,21],[-1,-1],[3,0],[17,0]] },\n         '[': { width: 14, points: [[4,25],[4,-7],[-1,-1],[5,25],[5,-7],[-1,-1],[4,25],[11,25],[-1,-1],[4,-7],[11,-7]] },\n         '\\\\': { width: 14, points: [[0,21],[14,-3]] },\n         ']': { width: 14, points: [[9,25],[9,-7],[-1,-1],[10,25],[10,-7],[-1,-1],[3,25],[10,25],[-1,-1],[3,-7],[10,-7]] },\n         '^': { width: 16, points: [[6,15],[8,18],[10,15],[-1,-1],[3,12],[8,17],[13,12],[-1,-1],[8,17],[8,0]] },\n         '_': { width: 16, points: [[0,-2],[16,-2]] },\n         '`': { width: 10, points: [[6,21],[5,20],[4,18],[4,16],[5,15],[6,16],[5,17]] },\n         'a': { width: 19, points: [[15,14],[15,0],[-1,-1],[15,11],[13,13],[11,14],[8,14],[6,13],[4,11],[3,8],[3,6],[4,3],[6,1],[8,0],[11,0],[13,1],[15,3]] },\n         'b': { width: 19, points: [[4,21],[4,0],[-1,-1],[4,11],[6,13],[8,14],[11,14],[13,13],[15,11],[16,8],[16,6],[15,3],[13,1],[11,0],[8,0],[6,1],[4,3]] },\n         'c': { width: 18, points: [[15,11],[13,13],[11,14],[8,14],[6,13],[4,11],[3,8],[3,6],[4,3],[6,1],[8,0],[11,0],[13,1],[15,3]] },\n         'd': { width: 19, points: [[15,21],[15,0],[-1,-1],[15,11],[13,13],[11,14],[8,14],[6,13],[4,11],[3,8],[3,6],[4,3],[6,1],[8,0],[11,0],[13,1],[15,3]] },\n         'e': { width: 18, points: [[3,8],[15,8],[15,10],[14,12],[13,13],[11,14],[8,14],[6,13],[4,11],[3,8],[3,6],[4,3],[6,1],[8,0],[11,0],[13,1],[15,3]] },\n         'f': { width: 12, points: [[10,21],[8,21],[6,20],[5,17],[5,0],[-1,-1],[2,14],[9,14]] },\n         'g': { width: 19, points: [[15,14],[15,-2],[14,-5],[13,-6],[11,-7],[8,-7],[6,-6],[-1,-1],[15,11],[13,13],[11,14],[8,14],[6,13],[4,11],[3,8],[3,6],[4,3],[6,1],[8,0],[11,0],[13,1],[15,3]] },\n         'h': { width: 19, points: [[4,21],[4,0],[-1,-1],[4,10],[7,13],[9,14],[12,14],[14,13],[15,10],[15,0]] },\n         'i': { width: 8, points: [[3,21],[4,20],[5,21],[4,22],[3,21],[-1,-1],[4,14],[4,0]] },\n         'j': { width: 10, points: [[5,21],[6,20],[7,21],[6,22],[5,21],[-1,-1],[6,14],[6,-3],[5,-6],[3,-7],[1,-7]] },\n         'k': { width: 17, points: [[4,21],[4,0],[-1,-1],[14,14],[4,4],[-1,-1],[8,8],[15,0]] },\n         'l': { width: 8, points: [[4,21],[4,0]] },\n         'm': { width: 30, points: [[4,14],[4,0],[-1,-1],[4,10],[7,13],[9,14],[12,14],[14,13],[15,10],[15,0],[-1,-1],[15,10],[18,13],[20,14],[23,14],[25,13],[26,10],[26,0]] },\n         'n': { width: 19, points: [[4,14],[4,0],[-1,-1],[4,10],[7,13],[9,14],[12,14],[14,13],[15,10],[15,0]] },\n         'o': { width: 19, points: [[8,14],[6,13],[4,11],[3,8],[3,6],[4,3],[6,1],[8,0],[11,0],[13,1],[15,3],[16,6],[16,8],[15,11],[13,13],[11,14],[8,14]] },\n         'p': { width: 19, points: [[4,14],[4,-7],[-1,-1],[4,11],[6,13],[8,14],[11,14],[13,13],[15,11],[16,8],[16,6],[15,3],[13,1],[11,0],[8,0],[6,1],[4,3]] },\n         'q': { width: 19, points: [[15,14],[15,-7],[-1,-1],[15,11],[13,13],[11,14],[8,14],[6,13],[4,11],[3,8],[3,6],[4,3],[6,1],[8,0],[11,0],[13,1],[15,3]] },\n         'r': { width: 13, points: [[4,14],[4,0],[-1,-1],[4,8],[5,11],[7,13],[9,14],[12,14]] },\n         's': { width: 17, points: [[14,11],[13,13],[10,14],[7,14],[4,13],[3,11],[4,9],[6,8],[11,7],[13,6],[14,4],[14,3],[13,1],[10,0],[7,0],[4,1],[3,3]] },\n         't': { width: 12, points: [[5,21],[5,4],[6,1],[8,0],[10,0],[-1,-1],[2,14],[9,14]] },\n         'u': { width: 19, points: [[4,14],[4,4],[5,1],[7,0],[10,0],[12,1],[15,4],[-1,-1],[15,14],[15,0]] },\n         'v': { width: 16, points: [[2,14],[8,0],[-1,-1],[14,14],[8,0]] },\n         'w': { width: 22, points: [[3,14],[7,0],[-1,-1],[11,14],[7,0],[-1,-1],[11,14],[15,0],[-1,-1],[19,14],[15,0]] },\n         'x': { width: 17, points: [[3,14],[14,0],[-1,-1],[14,14],[3,0]] },\n         'y': { width: 16, points: [[2,14],[8,0],[-1,-1],[14,14],[8,0],[6,-4],[4,-6],[2,-7],[1,-7]] },\n         'z': { width: 17, points: [[14,14],[3,0],[-1,-1],[3,14],[14,14],[-1,-1],[3,0],[14,0]] },\n         '{': { width: 14, points: [[9,25],[7,24],[6,23],[5,21],[5,19],[6,17],[7,16],[8,14],[8,12],[6,10],[-1,-1],[7,24],[6,22],[6,20],[7,18],[8,17],[9,15],[9,13],[8,11],[4,9],[8,7],[9,5],[9,3],[8,1],[7,0],[6,-2],[6,-4],[7,-6],[-1,-1],[6,8],[8,6],[8,4],[7,2],[6,1],[5,-1],[5,-3],[6,-5],[7,-6],[9,-7]] },\n         '|': { width: 8, points: [[4,25],[4,-7]] },\n         '}': { width: 14, points: [[5,25],[7,24],[8,23],[9,21],[9,19],[8,17],[7,16],[6,14],[6,12],[8,10],[-1,-1],[7,24],[8,22],[8,20],[7,18],[6,17],[5,15],[5,13],[6,11],[10,9],[6,7],[5,5],[5,3],[6,1],[7,0],[8,-2],[8,-4],[7,-6],[-1,-1],[8,8],[6,6],[6,4],[7,2],[8,1],[9,-1],[9,-3],[8,-5],[7,-6],[5,-7]] },\n         '~': { width: 24, points: [[3,6],[3,8],[4,11],[6,12],[8,12],[10,11],[14,8],[16,7],[18,7],[20,8],[21,10],[-1,-1],[3,8],[4,10],[6,11],[8,11],[10,10],[14,7],[16,6],[18,6],[20,7],[21,10],[21,12]] }\n     };\n     \n    $.jqplot.CanvasFontRenderer = function(options) {\n        options = options || {};\n        if (!options.pt2px) {\n            options.pt2px = 1.5;\n        }\n        $.jqplot.CanvasTextRenderer.call(this, options);\n    };\n    \n    $.jqplot.CanvasFontRenderer.prototype = new $.jqplot.CanvasTextRenderer({});\n    $.jqplot.CanvasFontRenderer.prototype.constructor = $.jqplot.CanvasFontRenderer;\n\n    $.jqplot.CanvasFontRenderer.prototype.measure = function(ctx, str)\n    {\n        // var fstyle = this.fontStyle+' '+this.fontVariant+' '+this.fontWeight+' '+this.fontSize+' '+this.fontFamily;\n        var fstyle = this.fontSize+' '+this.fontFamily;\n        ctx.save();\n        ctx.font = fstyle;\n        var w = ctx.measureText(str).width;\n        ctx.restore();\n        return w;\n    };\n\n    $.jqplot.CanvasFontRenderer.prototype.draw = function(ctx, str)\n    {\n        var x = 0;\n        // leave room at bottom for descenders.\n        var y = this.height*0.72;\n        //var y = 12;\n\n         ctx.save();\n         var tx, ty;\n         \n         // 1st quadrant\n         if ((-Math.PI/2 <= this.angle && this.angle <= 0) || (Math.PI*3/2 <= this.angle && this.angle <= Math.PI*2)) {\n             tx = 0;\n             ty = -Math.sin(this.angle) * this.width;\n         }\n         // 4th quadrant\n         else if ((0 < this.angle && this.angle <= Math.PI/2) || (-Math.PI*2 <= this.angle && this.angle <= -Math.PI*3/2)) {\n             tx = Math.sin(this.angle) * this.height;\n             ty = 0;\n         }\n         // 2nd quadrant\n         else if ((-Math.PI < this.angle && this.angle < -Math.PI/2) || (Math.PI <= this.angle && this.angle <= Math.PI*3/2)) {\n             tx = -Math.cos(this.angle) * this.width;\n             ty = -Math.sin(this.angle) * this.width - Math.cos(this.angle) * this.height;\n         }\n         // 3rd quadrant\n         else if ((-Math.PI*3/2 < this.angle && this.angle < Math.PI) || (Math.PI/2 < this.angle && this.angle < Math.PI)) {\n             tx = Math.sin(this.angle) * this.height - Math.cos(this.angle)*this.width;\n             ty = -Math.cos(this.angle) * this.height;\n         }\n         ctx.strokeStyle = this.fillStyle;\n         ctx.fillStyle = this.fillStyle;\n        // var fstyle = this.fontStyle+' '+this.fontVariant+' '+this.fontWeight+' '+this.fontSize+' '+this.fontFamily;\n        var fstyle = this.fontSize+' '+this.fontFamily;\n         ctx.font = fstyle;\n         ctx.translate(tx, ty);\n         ctx.rotate(this.angle);\n         ctx.fillText(str, x, y);\n         // ctx.strokeText(str, x, y);\n\n         ctx.restore();\n    };\n    \n})(jQuery);"
  },
  {
    "path": "stenogotchi/ui/web/static/js/plugins/jqplot.categoryAxisRenderer.js",
    "content": "/**\n * jqPlot\n * Pure JavaScript plotting plugin using jQuery\n *\n * Version: 1.0.9\n * Revision: d96a669\n *\n * Copyright (c) 2009-2016 Chris Leonello\n * jqPlot is currently available for use in all personal or commercial projects \n * under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL \n * version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can \n * choose the license that best suits your project and use it accordingly. \n *\n * Although not required, the author would appreciate an email letting him \n * know of any substantial use of jqPlot.  You can reach the author at: \n * chris at jqplot dot com or see http://www.jqplot.com/info.php .\n *\n * If you are feeling kind and generous, consider supporting the project by\n * making a donation at: http://www.jqplot.com/donate.php .\n *\n * sprintf functions contained in jqplot.sprintf.js by Ash Searle:\n *\n *     version 2007.04.27\n *     author Ash Searle\n *     http://hexmen.com/blog/2007/03/printf-sprintf/\n *     http://hexmen.com/js/sprintf.js\n *     The author (Ash Searle) has placed this code in the public domain:\n *     \"This code is unrestricted: you are free to use it however you like.\"\n * \n */\n(function($) {   \n    /**\n    *  class: $.jqplot.CategoryAxisRenderer\n    *  A plugin for jqPlot to render a category style axis, with equal pixel spacing between y data values of a series.\n    *  \n    *  To use this renderer, include the plugin in your source\n    *  > <script type=\"text/javascript\" language=\"javascript\" src=\"plugins/jqplot.categoryAxisRenderer.js\"></script>\n    *  \n    *  and supply the appropriate options to your plot\n    *  \n    *  > {axes:{xaxis:{renderer:$.jqplot.CategoryAxisRenderer}}}\n    **/\n    $.jqplot.CategoryAxisRenderer = function(options) {\n        $.jqplot.LinearAxisRenderer.call(this);\n        // prop: sortMergedLabels\n        // True to sort tick labels when labels are created by merging\n        // x axis values from multiple series.  That is, say you have\n        // two series like:\n        // > line1 = [[2006, 4],            [2008, 9], [2009, 16]];\n        // > line2 = [[2006, 3], [2007, 7], [2008, 6]];\n        // If no label array is specified, tick labels will be collected\n        // from the x values of the series.  With sortMergedLabels\n        // set to true, tick labels will be:\n        // > [2006, 2007, 2008, 2009]\n        // With sortMergedLabels set to false, tick labels will be:\n        // > [2006, 2008, 2009, 2007]\n        //\n        // Note, this property is specified on the renderOptions for the \n        // axes when creating a plot:\n        // > axes:{xaxis:{renderer:$.jqplot.CategoryAxisRenderer, rendererOptions:{sortMergedLabels:true}}}\n        this.sortMergedLabels = false;\n    };\n    \n    $.jqplot.CategoryAxisRenderer.prototype = new $.jqplot.LinearAxisRenderer();\n    $.jqplot.CategoryAxisRenderer.prototype.constructor = $.jqplot.CategoryAxisRenderer;\n    \n    $.jqplot.CategoryAxisRenderer.prototype.init = function(options){\n        this.groups = 1;\n        this.groupLabels = [];\n        this._groupLabels = [];\n        this._grouped = false;\n        this._barsPerGroup = null;\n        this.reverse = false;\n        // prop: tickRenderer\n        // A class of a rendering engine for creating the ticks labels displayed on the plot, \n        // See <$.jqplot.AxisTickRenderer>.\n        // this.tickRenderer = $.jqplot.AxisTickRenderer;\n        // this.labelRenderer = $.jqplot.AxisLabelRenderer;\n        $.extend(true, this, {tickOptions:{formatString:'%d'}}, options);\n        var db = this._dataBounds;\n        // Go through all the series attached to this axis and find\n        // the min/max bounds for this axis.\n        for (var i=0; i<this._series.length; i++) {\n            var s = this._series[i];\n            if (s.groups) {\n                this.groups = s.groups;\n            }\n            var d = s.data;\n            \n            for (var j=0; j<d.length; j++) { \n                if (this.name == 'xaxis' || this.name == 'x2axis') {\n                    if (d[j][0] < db.min || db.min == null) {\n                        db.min = d[j][0];\n                    }\n                    if (d[j][0] > db.max || db.max == null) {\n                        db.max = d[j][0];\n                    }\n                }              \n                else {\n                    if (d[j][1] < db.min || db.min == null) {\n                        db.min = d[j][1];\n                    }\n                    if (d[j][1] > db.max || db.max == null) {\n                        db.max = d[j][1];\n                    }\n                }              \n            }\n        }\n        \n        if (this.groupLabels.length) {\n            this.groups = this.groupLabels.length;\n        }\n    };\n \n\n    $.jqplot.CategoryAxisRenderer.prototype.createTicks = function() {\n        // we're are operating on an axis here\n        var ticks = this._ticks;\n        var userTicks = this.ticks;\n        var name = this.name;\n        // databounds were set on axis initialization.\n        var db = this._dataBounds;\n        var dim, interval;\n        var min, max;\n        var pos1, pos2;\n        var tt, i;\n\n        // if we already have ticks, use them.\n        if (userTicks.length) {\n            // adjust with blanks if we have groups\n            if (this.groups > 1 && !this._grouped) {\n                var l = userTicks.length;\n                var skip = parseInt(l/this.groups, 10);\n                var count = 0;\n                for (var i=skip; i<l; i+=skip) {\n                    userTicks.splice(i+count, 0, ' ');\n                    count++;\n                }\n                this._grouped = true;\n            }\n            this.min = 0.5;\n            this.max = userTicks.length + 0.5;\n            var range = this.max - this.min;\n            this.numberTicks = 2*userTicks.length + 1;\n            for (i=0; i<userTicks.length; i++){\n                tt = this.min + 2 * i * range / (this.numberTicks-1);\n                // need a marker before and after the tick\n                var t = new this.tickRenderer(this.tickOptions);\n                t.showLabel = false;\n                // t.showMark = true;\n                t.setTick(tt, this.name);\n                this._ticks.push(t);\n                var t = new this.tickRenderer(this.tickOptions);\n                t.label = userTicks[i];\n                // t.showLabel = true;\n                t.showMark = false;\n                t.showGridline = false;\n                t.setTick(tt+0.5, this.name);\n                this._ticks.push(t);\n            }\n            // now add the last tick at the end\n            var t = new this.tickRenderer(this.tickOptions);\n            t.showLabel = false;\n            // t.showMark = true;\n            t.setTick(tt+1, this.name);\n            this._ticks.push(t);\n        }\n\n        // we don't have any ticks yet, let's make some!\n        else {\n            if (name == 'xaxis' || name == 'x2axis') {\n                dim = this._plotDimensions.width;\n            }\n            else {\n                dim = this._plotDimensions.height;\n            }\n            \n            // if min, max and number of ticks specified, user can't specify interval.\n            if (this.min != null && this.max != null && this.numberTicks != null) {\n                this.tickInterval = null;\n            }\n            \n            // if max, min, and interval specified and interval won't fit, ignore interval.\n            if (this.min != null && this.max != null && this.tickInterval != null) {\n                if (parseInt((this.max-this.min)/this.tickInterval, 10) != (this.max-this.min)/this.tickInterval) {\n                    this.tickInterval = null;\n                }\n            }\n        \n            // find out how many categories are in the lines and collect labels\n            var labels = [];\n            var numcats = 0;\n            var min = 0.5;\n            var max, val;\n            var isMerged = false;\n            for (var i=0; i<this._series.length; i++) {\n                var s = this._series[i];\n                for (var j=0; j<s.data.length; j++) {\n                    if (this.name == 'xaxis' || this.name == 'x2axis') {\n                        val = s.data[j][0];\n                    }\n                    else {\n                        val = s.data[j][1];\n                    }\n                    if ($.inArray(val, labels) == -1) {\n                        isMerged = true;\n                        numcats += 1;      \n                        labels.push(val);\n                    }\n                }\n            }\n            \n            if (isMerged && this.sortMergedLabels) {\n                if (typeof labels[0] == \"string\") {\n                    labels.sort();\n                } else {\n                    labels.sort(function(a,b) { return a - b; });\n                }\n            }\n            \n            // keep a reference to these tick labels to use for redrawing plot (see bug #57)\n            this.ticks = labels;\n            \n            // now bin the data values to the right lables.\n            for (var i=0; i<this._series.length; i++) {\n                var s = this._series[i];\n                for (var j=0; j<s.data.length; j++) {\n                    if (this.name == 'xaxis' || this.name == 'x2axis') {\n                        val = s.data[j][0];\n                    }\n                    else {\n                        val = s.data[j][1];\n                    }\n                    // for category axis, force the values into category bins.\n                    // we should have the value in the label array now.\n                    var idx = $.inArray(val, labels)+1;\n                    if (this.name == 'xaxis' || this.name == 'x2axis') {\n                        s.data[j][0] = idx;\n                    }\n                    else {\n                        s.data[j][1] = idx;\n                    }\n                }\n            }\n            \n            // adjust with blanks if we have groups\n            if (this.groups > 1 && !this._grouped) {\n                var l = labels.length;\n                var skip = parseInt(l/this.groups, 10);\n                var count = 0;\n                for (var i=skip; i<l; i+=skip+1) {\n                    labels[i] = ' ';\n                }\n                this._grouped = true;\n            }\n        \n            max = numcats + 0.5;\n            if (this.numberTicks == null) {\n                this.numberTicks = 2*numcats + 1;\n            }\n\n            var range = max - min;\n            this.min = min;\n            this.max = max;\n            var track = 0;\n            \n            // todo: adjust this so more ticks displayed.\n            var maxVisibleTicks = parseInt(3+dim/10, 10);\n            var skip = parseInt(numcats/maxVisibleTicks, 10);\n\n            if (this.tickInterval == null) {\n\n                this.tickInterval = range / (this.numberTicks-1);\n\n            }\n            // if tickInterval is specified, we will ignore any computed maximum.\n            for (var i=0; i<this.numberTicks; i++){\n                tt = this.min + i * this.tickInterval;\n                var t = new this.tickRenderer(this.tickOptions);\n                // if even tick, it isn't a category, it's a divider\n                if (i/2 == parseInt(i/2, 10)) {\n                    t.showLabel = false;\n                    t.showMark = true;\n                }\n                else {\n                    if (skip>0 && track<skip) {\n                        t.showLabel = false;\n                        track += 1;\n                    }\n                    else {\n                        t.showLabel = true;\n                        track = 0;\n                    } \n                    t.label = t.formatter(t.formatString, labels[(i-1)/2]);\n                    t.showMark = false;\n                    t.showGridline = false;\n                }\n                t.setTick(tt, this.name);\n                this._ticks.push(t);\n            }\n        }\n        \n    };\n    \n    // called with scope of axis\n    $.jqplot.CategoryAxisRenderer.prototype.draw = function(ctx, plot) {\n        if (this.show) {\n            // populate the axis label and value properties.\n            // createTicks is a method on the renderer, but\n            // call it within the scope of the axis.\n            this.renderer.createTicks.call(this);\n            // fill a div with axes labels in the right direction.\n            // Need to pregenerate each axis to get its bounds and\n            // position it and the labels correctly on the plot.\n            var dim=0;\n            var temp;\n            // Added for theming.\n            if (this._elem) {\n                // this._elem.empty();\n                // Memory Leaks patch\n                this._elem.emptyForce();\n            }\n\n            this._elem = this._elem || $('<div class=\"jqplot-axis jqplot-'+this.name+'\" style=\"position:absolute;\"></div>');\n            \n            if (this.name == 'xaxis' || this.name == 'x2axis') {\n                this._elem.width(this._plotDimensions.width);\n            }\n            else {\n                this._elem.height(this._plotDimensions.height);\n            }\n            \n            // create a _label object.\n            this.labelOptions.axis = this.name;\n            this._label = new this.labelRenderer(this.labelOptions);\n            if (this._label.show) {\n                var elem = this._label.draw(ctx, plot);\n                elem.appendTo(this._elem);\n            }\n    \n            var t = this._ticks;\n            for (var i=0; i<t.length; i++) {\n                var tick = t[i];\n                if (tick.showLabel && (!tick.isMinorTick || this.showMinorTicks)) {\n                    var elem = tick.draw(ctx, plot);\n                    elem.appendTo(this._elem);\n                }\n            }\n        \n            this._groupLabels = [];\n            // now make group labels\n            for (var i=0; i<this.groupLabels.length; i++)\n            {\n                var elem = $('<div style=\"position:absolute;\" class=\"jqplot-'+this.name+'-groupLabel\"></div>');\n                elem.html(this.groupLabels[i]);\n                this._groupLabels.push(elem);\n                elem.appendTo(this._elem);\n            }\n        }\n        return this._elem;\n    };\n    \n    // called with scope of axis\n    $.jqplot.CategoryAxisRenderer.prototype.set = function() { \n        var dim = 0;\n        var temp;\n        var w = 0;\n        var h = 0;\n        var lshow = (this._label == null) ? false : this._label.show;\n        if (this.show) {\n            var t = this._ticks;\n            for (var i=0; i<t.length; i++) {\n                var tick = t[i];\n                if (tick.showLabel && (!tick.isMinorTick || this.showMinorTicks)) {\n                    if (this.name == 'xaxis' || this.name == 'x2axis') {\n                        temp = tick._elem.outerHeight(true);\n                    }\n                    else {\n                        temp = tick._elem.outerWidth(true);\n                    }\n                    if (temp > dim) {\n                        dim = temp;\n                    }\n                }\n            }\n            \n            var dim2 = 0;\n            for (var i=0; i<this._groupLabels.length; i++) {\n                var l = this._groupLabels[i];\n                if (this.name == 'xaxis' || this.name == 'x2axis') {\n                    temp = l.outerHeight(true);\n                }\n                else {\n                    temp = l.outerWidth(true);\n                }\n                if (temp > dim2) {\n                    dim2 = temp;\n                }\n            }\n            \n            if (lshow) {\n                w = this._label._elem.outerWidth(true);\n                h = this._label._elem.outerHeight(true); \n            }\n            if (this.name == 'xaxis') {\n                dim += dim2 + h;\n                this._elem.css({'height':dim+'px', left:'0px', bottom:'0px'});\n            }\n            else if (this.name == 'x2axis') {\n                dim += dim2 + h;\n                this._elem.css({'height':dim+'px', left:'0px', top:'0px'});\n            }\n            else if (this.name == 'yaxis') {\n                dim += dim2 + w;\n                this._elem.css({'width':dim+'px', left:'0px', top:'0px'});\n                if (lshow && this._label.constructor == $.jqplot.AxisLabelRenderer) {\n                    this._label._elem.css('width', w+'px');\n                }\n            }\n            else {\n                dim += dim2 + w;\n                this._elem.css({'width':dim+'px', right:'0px', top:'0px'});\n                if (lshow && this._label.constructor == $.jqplot.AxisLabelRenderer) {\n                    this._label._elem.css('width', w+'px');\n                }\n            }\n        }  \n    };\n    \n    // called with scope of axis\n    $.jqplot.CategoryAxisRenderer.prototype.pack = function(pos, offsets) {\n        var ticks = this._ticks;\n        var max = this.max;\n        var min = this.min;\n        var offmax = offsets.max;\n        var offmin = offsets.min;\n        var lshow = (this._label == null) ? false : this._label.show;\n        var i;\n\n        for (var p in pos) {\n            this._elem.css(p, pos[p]);\n        }\n        \n        this._offsets = offsets;\n        // pixellength will be + for x axes and - for y axes becasue pixels always measured from top left.\n        var pixellength = offmax - offmin;\n        var unitlength = max - min;\n        \n        if (!this.reverse) {\n            // point to unit and unit to point conversions references to Plot DOM element top left corner.\n            \n            this.u2p = function(u){\n                return (u - min) * pixellength / unitlength + offmin;\n            };\n\n            this.p2u = function(p){\n                return (p - offmin) * unitlength / pixellength + min;\n            };\n                    \n            if (this.name == 'xaxis' || this.name == 'x2axis'){\n                this.series_u2p = function(u){\n                    return (u - min) * pixellength / unitlength;\n                };\n                this.series_p2u = function(p){\n                    return p * unitlength / pixellength + min;\n                };\n            }\n            \n            else {\n                this.series_u2p = function(u){\n                    return (u - max) * pixellength / unitlength;\n                };\n                this.series_p2u = function(p){\n                    return p * unitlength / pixellength + max;\n                };\n            }\n        }\n\n        else {\n            // point to unit and unit to point conversions references to Plot DOM element top left corner.\n            \n            this.u2p = function(u){\n                return offmin + (max - u) * pixellength / unitlength;\n            };\n\n            this.p2u = function(p){\n                return min + (p - offmin) * unitlength / pixellength;\n            };\n                    \n            if (this.name == 'xaxis' || this.name == 'x2axis'){\n                this.series_u2p = function(u){\n                    return (max - u) * pixellength / unitlength;\n                };\n                this.series_p2u = function(p){\n                    return p * unitlength / pixellength + max;\n                };\n            }\n            \n            else {\n                this.series_u2p = function(u){\n                    return (min - u) * pixellength / unitlength;\n                };\n                this.series_p2u = function(p){\n                    return p * unitlength / pixellength + min;\n                };\n            }\n\n        }\n            \n        \n        if (this.show) {\n            if (this.name == 'xaxis' || this.name == 'x2axis') {\n                for (i=0; i<ticks.length; i++) {\n                    var t = ticks[i];\n                    if (t.show && t.showLabel) {\n                        var shim;\n                        \n                        if (t.constructor == $.jqplot.CanvasAxisTickRenderer && t.angle) {\n                            // will need to adjust auto positioning based on which axis this is.\n                            var temp = (this.name == 'xaxis') ? 1 : -1;\n                            switch (t.labelPosition) {\n                                case 'auto':\n                                    // position at end\n                                    if (temp * t.angle < 0) {\n                                        shim = -t.getWidth() + t._textRenderer.height * Math.sin(-t._textRenderer.angle) / 2;\n                                    }\n                                    // position at start\n                                    else {\n                                        shim = -t._textRenderer.height * Math.sin(t._textRenderer.angle) / 2;\n                                    }\n                                    break;\n                                case 'end':\n                                    shim = -t.getWidth() + t._textRenderer.height * Math.sin(-t._textRenderer.angle) / 2;\n                                    break;\n                                case 'start':\n                                    shim = -t._textRenderer.height * Math.sin(t._textRenderer.angle) / 2;\n                                    break;\n                                case 'middle':\n                                    shim = -t.getWidth()/2 + t._textRenderer.height * Math.sin(-t._textRenderer.angle) / 2;\n                                    break;\n                                default:\n                                    shim = -t.getWidth()/2 + t._textRenderer.height * Math.sin(-t._textRenderer.angle) / 2;\n                                    break;\n                            }\n                        }\n                        else {\n                            shim = -t.getWidth()/2;\n                        }\n                        var val = this.u2p(t.value) + shim + 'px';\n                        t._elem.css('left', val);\n                        t.pack();\n                    }\n                }\n                \n                var labeledge=['bottom', 0];\n                if (lshow) {\n                    var w = this._label._elem.outerWidth(true);\n                    this._label._elem.css('left', offmin + pixellength/2 - w/2 + 'px');\n                    if (this.name == 'xaxis') {\n                        this._label._elem.css('bottom', '0px');\n                        labeledge = ['bottom', this._label._elem.outerHeight(true)];\n                    }\n                    else {\n                        this._label._elem.css('top', '0px');\n                        labeledge = ['top', this._label._elem.outerHeight(true)];\n                    }\n                    this._label.pack();\n                }\n                \n                // draw the group labels\n                var step = parseInt(this._ticks.length/this.groups, 10) + 1;\n                for (i=0; i<this._groupLabels.length; i++) {\n                    var mid = 0;\n                    var count = 0;\n                    for (var j=i*step; j<(i+1)*step; j++) {\n                        if (j >= this._ticks.length-1) continue; // the last tick does not exist as there is no other group in order to have an empty one.\n                        if (this._ticks[j]._elem && this._ticks[j].label != \" \") {\n                            var t = this._ticks[j]._elem;\n                            var p = t.position();\n                            mid += p.left + t.outerWidth(true)/2;\n                            count++;\n                        }\n                    }\n                    mid = mid/count;\n                    this._groupLabels[i].css({'left':(mid - this._groupLabels[i].outerWidth(true)/2)});\n                    this._groupLabels[i].css(labeledge[0], labeledge[1]);\n                }\n            }\n            else {\n                for (i=0; i<ticks.length; i++) {\n                    var t = ticks[i];\n                    if (t.show && t.showLabel) {                        \n                        var shim;\n                        if (t.constructor == $.jqplot.CanvasAxisTickRenderer && t.angle) {\n                            // will need to adjust auto positioning based on which axis this is.\n                            var temp = (this.name == 'yaxis') ? 1 : -1;\n                            switch (t.labelPosition) {\n                                case 'auto':\n                                    // position at end\n                                case 'end':\n                                    if (temp * t.angle < 0) {\n                                        shim = -t._textRenderer.height * Math.cos(-t._textRenderer.angle) / 2;\n                                    }\n                                    else {\n                                        shim = -t.getHeight() + t._textRenderer.height * Math.cos(t._textRenderer.angle) / 2;\n                                    }\n                                    break;\n                                case 'start':\n                                    if (t.angle > 0) {\n                                        shim = -t._textRenderer.height * Math.cos(-t._textRenderer.angle) / 2;\n                                    }\n                                    else {\n                                        shim = -t.getHeight() + t._textRenderer.height * Math.cos(t._textRenderer.angle) / 2;\n                                    }\n                                    break;\n                                case 'middle':\n                                    // if (t.angle > 0) {\n                                    //     shim = -t.getHeight()/2 + t._textRenderer.height * Math.sin(-t._textRenderer.angle) / 2;\n                                    // }\n                                    // else {\n                                    //     shim = -t.getHeight()/2 - t._textRenderer.height * Math.sin(t._textRenderer.angle) / 2;\n                                    // }\n                                    shim = -t.getHeight()/2;\n                                    break;\n                                default:\n                                    shim = -t.getHeight()/2;\n                                    break;\n                            }\n                        }\n                        else {\n                            shim = -t.getHeight()/2;\n                        }\n                        \n                        var val = this.u2p(t.value) + shim + 'px';\n                        t._elem.css('top', val);\n                        t.pack();\n                    }\n                }\n                \n                var labeledge=['left', 0];\n                if (lshow) {\n                    var h = this._label._elem.outerHeight(true);\n                    this._label._elem.css('top', offmax - pixellength/2 - h/2 + 'px');\n                    if (this.name == 'yaxis') {\n                        this._label._elem.css('left', '0px');\n                        labeledge = ['left', this._label._elem.outerWidth(true)];\n                    }\n                    else {\n                        this._label._elem.css('right', '0px');\n                        labeledge = ['right', this._label._elem.outerWidth(true)];\n                    }   \n                    this._label.pack();\n                }\n                \n                // draw the group labels, position top here, do left after label position.\n                var step = parseInt(this._ticks.length/this.groups, 10) + 1; // step is one more than before as we don't want to have overlaps in loops\n                for (i=0; i<this._groupLabels.length; i++) {\n                    var mid = 0;\n                    var count = 0;\n                    for (var j=i*step; j<(i+1)*step; j++) { // j must never reach (i+1)*step as we don't want to have overlap between loops\n                        if (j >= this._ticks.length-1) continue; // the last tick does not exist as there is no other group in order to have an empty one.\n                        if (this._ticks[j]._elem && this._ticks[j].label != \" \") {\n                            var t = this._ticks[j]._elem;\n                            var p = t.position();\n                            mid += p.top + t.outerHeight()/2;\n                            count++;\n                        }\n                    }\n                    mid = mid/count;\n                    this._groupLabels[i].css({'top':mid - this._groupLabels[i].outerHeight()/2});\n                    this._groupLabels[i].css(labeledge[0], labeledge[1]);\n                    \n                }\n            }\n        }\n    };    \n    \n    \n})(jQuery);\n"
  },
  {
    "path": "stenogotchi/ui/web/static/js/plugins/jqplot.ciParser.js",
    "content": "/**\n * jqPlot\n * Pure JavaScript plotting plugin using jQuery\n *\n * Version: 1.0.9\n * Revision: d96a669\n *\n * Copyright (c) 2009-2016 Chris Leonello\n * jqPlot is currently available for use in all personal or commercial projects \n * under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL \n * version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can \n * choose the license that best suits your project and use it accordingly. \n *\n * Although not required, the author would appreciate an email letting him \n * know of any substantial use of jqPlot.  You can reach the author at: \n * chris at jqplot dot com or see http://www.jqplot.com/info.php .\n *\n * If you are feeling kind and generous, consider supporting the project by\n * making a donation at: http://www.jqplot.com/donate.php .\n *\n * sprintf functions contained in jqplot.sprintf.js by Ash Searle:\n *\n *     version 2007.04.27\n *     author Ash Searle\n *     http://hexmen.com/blog/2007/03/printf-sprintf/\n *     http://hexmen.com/js/sprintf.js\n *     The author (Ash Searle) has placed this code in the public domain:\n *     \"This code is unrestricted: you are free to use it however you like.\"\n * \n */\n(function($) {\n    /**\n     * Class: $.jqplot.ciParser\n     * Data Renderer function which converts a custom JSON data object into jqPlot data format.\n     * Set this as a callable on the jqplot dataRenderer plot option:\n     * \n     * > plot = $.jqplot('mychart', [data], { dataRenderer: $.jqplot.ciParser, ... });\n     * \n     * Where data is an object in JSON format or a JSON encoded string conforming to the\n     * City Index API spec.\n     * \n     * Note that calling the renderer function is handled internally by jqPlot.  The\n     * user does not have to call the function.  The parameters described below will\n     * automatically be passed to the ciParser function.\n     * \n     * Parameters:\n     * data - JSON encoded string or object.\n     * plot - reference to jqPlot Plot object.\n     * \n     * Returns:\n     * data array in jqPlot format.\n     * \n     */\n    $.jqplot.ciParser = function (data, plot) {\n        var ret = [],\n            line,\n            temp,\n            i, j, k, kk;\n    \n         if (typeof(data) == \"string\") {\n             data =  $.jqplot.JSON.parse(data, handleStrings);\n         }\n \n         else if (typeof(data) == \"object\") {\n             for (k in data) {\n                 for (i=0; i<data[k].length; i++) {\n                     for (kk in data[k][i]) {\n                         data[k][i][kk] = handleStrings(kk, data[k][i][kk]);\n                     }\n                 }\n             }\n         }\n \n         else {\n             return null;\n         }\n \n         // function handleStrings\n         // Checks any JSON encoded strings to see if they are\n         // encoded dates.  If so, pull out the timestamp.\n         // Expects dates to be represented by js timestamps.\n \n         function handleStrings(key, value) {\n            var a;\n            if (value != null) {\n                if (value.toString().indexOf('Date') >= 0) {\n                    //here we will try to extract the ticks from the Date string in the \"value\" fields of JSON returned data\n                    a = /^\\/Date\\((-?[0-9]+)\\)\\/$/.exec(value);\n                    if (a) {\n                        return parseInt(a[1], 10);\n                    }\n                }\n                return value;\n            }\n         }\n \n        for (var prop in data) {\n            line = [];\n            temp = data[prop];\n            switch (prop) {\n                case \"PriceTicks\":\n                    for (i=0; i<temp.length; i++) {\n                        line.push([temp[i]['TickDate'], temp[i]['Price']]);\n                    }\n                    break;\n                case \"PriceBars\":\n                    for (i=0; i<temp.length; i++) {\n                        line.push([temp[i]['BarDate'], temp[i]['Open'], temp[i]['High'], temp[i]['Low'], temp[i]['Close']]);\n                    }\n                    break;\n            }\n            ret.push(line);\n        }\n        return ret;\n    };\n})(jQuery);"
  },
  {
    "path": "stenogotchi/ui/web/static/js/plugins/jqplot.cursor.js",
    "content": "/**\n * jqPlot\n * Pure JavaScript plotting plugin using jQuery\n *\n * Version: 1.0.9\n * Revision: d96a669\n *\n * Copyright (c) 2009-2016 Chris Leonello\n * jqPlot is currently available for use in all personal or commercial projects \n * under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL \n * version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can \n * choose the license that best suits your project and use it accordingly. \n *\n * Although not required, the author would appreciate an email letting him \n * know of any substantial use of jqPlot.  You can reach the author at: \n * chris at jqplot dot com or see http://www.jqplot.com/info.php .\n *\n * If you are feeling kind and generous, consider supporting the project by\n * making a donation at: http://www.jqplot.com/donate.php .\n *\n * sprintf functions contained in jqplot.sprintf.js by Ash Searle:\n *\n *     version 2007.04.27\n *     author Ash Searle\n *     http://hexmen.com/blog/2007/03/printf-sprintf/\n *     http://hexmen.com/js/sprintf.js\n *     The author (Ash Searle) has placed this code in the public domain:\n *     \"This code is unrestricted: you are free to use it however you like.\"\n * \n */\n(function($) {\n    \n    /**\n     * Class: $.jqplot.Cursor\n     * Plugin class representing the cursor as displayed on the plot.\n     */\n    $.jqplot.Cursor = function(options) {\n        // Group: Properties\n        //\n        // prop: style\n        // CSS spec for cursor style\n        this.style = 'crosshair';\n        this.previousCursor = 'auto';\n        // prop: show\n        // whether to show the cursor or not.\n        this.show = $.jqplot.config.enablePlugins;\n        // prop: showTooltip\n        // show a cursor position tooltip.  Location of the tooltip\n        // will be controlled by followMouse and tooltipLocation.\n        this.showTooltip = true;\n        // prop: followMouse\n        // Tooltip follows the mouse, it is not at a fixed location.\n        // Tooltip will show on the grid at the location given by\n        // tooltipLocation, offset from the grid edge by tooltipOffset.\n        this.followMouse = false;\n        // prop: tooltipLocation\n        // Where to position tooltip.  If followMouse is true, this is\n        // relative to the cursor, otherwise, it is relative to the grid.\n        // One of 'n', 'ne', 'e', 'se', 's', 'sw', 'w', 'nw'\n        this.tooltipLocation = 'se';\n        // prop: tooltipOffset\n        // Pixel offset of tooltip from the grid boudaries or cursor center.\n        this.tooltipOffset = 6;\n        // prop: showTooltipGridPosition\n        // show the grid pixel coordinates of the mouse.\n        this.showTooltipGridPosition = false;\n        // prop: showTooltipUnitPosition\n        // show the unit (data) coordinates of the mouse.\n        this.showTooltipUnitPosition = true;\n        // prop: showTooltipDataPosition\n        // Used with showVerticalLine to show intersecting data points in the tooltip.\n        this.showTooltipDataPosition = false;\n        // prop: tooltipFormatString\n        // sprintf format string for the tooltip.\n        // Uses Ash Searle's javascript sprintf implementation\n        // found here: http://hexmen.com/blog/2007/03/printf-sprintf/\n        // See http://perldoc.perl.org/functions/sprintf.html for reference\n        // Note, if showTooltipDataPosition is true, the default tooltipFormatString\n        // will be set to the cursorLegendFormatString, not the default given here.\n        this.tooltipFormatString = '%.4P, %.4P';\n        // prop: useAxesFormatters\n        // Use the x and y axes formatters to format the text in the tooltip.\n        this.useAxesFormatters = true;\n        // prop: tooltipAxisGroups\n        // Show position for the specified axes.\n        // This is an array like [['xaxis', 'yaxis'], ['xaxis', 'y2axis']]\n        // Default is to compute automatically for all visible axes.\n        this.tooltipAxisGroups = [];\n        // prop: zoom\n        // Enable plot zooming.\n        this.zoom = false;\n        // zoomProxy and zoomTarget properties are not directly set by user.  \n        // They Will be set through call to zoomProxy method.\n        this.zoomProxy = false;\n        this.zoomTarget = false;\n        // prop: looseZoom\n        // Will expand zoom range to provide more rounded tick values.\n        // Works only with linear, log and date axes.\n        this.looseZoom = true;\n        // prop: clickReset\n        // Will reset plot zoom if single click on plot without drag.\n        this.clickReset = false;\n        // prop: dblClickReset\n        // Will reset plot zoom if double click on plot without drag.\n        this.dblClickReset = true;\n        // prop: showVerticalLine\n        // draw a vertical line across the plot which follows the cursor.\n        // When the line is near a data point, a special legend and/or tooltip can\n        // be updated with the data values.\n        this.showVerticalLine = false;\n        // prop: showHorizontalLine\n        // draw a horizontal line across the plot which follows the cursor.\n        this.showHorizontalLine = false;\n        // prop: constrainZoomTo\n        // 'none', 'x' or 'y'\n        this.constrainZoomTo = 'none';\n        // // prop: autoscaleConstraint\n        // // when a constrained axis is specified, true will\n        // // auatoscale the adjacent axis.\n        // this.autoscaleConstraint = true;\n        this.shapeRenderer = new $.jqplot.ShapeRenderer();\n        this._zoom = {start:[], end:[], started: false, zooming:false, isZoomed:false, axes:{start:{}, end:{}}, gridpos:{}, datapos:{}};\n        this._tooltipElem;\n        this.zoomCanvas;\n        this.cursorCanvas;\n        // prop: intersectionThreshold\n        // pixel distance from data point or marker to consider cursor lines intersecting with point.\n        // If data point markers are not shown, this should be >= 1 or will often miss point intersections.\n        this.intersectionThreshold = 2;\n        // prop: showCursorLegend\n        // Replace the plot legend with an enhanced legend displaying intersection information.\n        this.showCursorLegend = false;\n        // prop: cursorLegendFormatString\n        // Format string used in the cursor legend.  If showTooltipDataPosition is true,\n        // this will also be the default format string used by tooltipFormatString.\n        this.cursorLegendFormatString = $.jqplot.Cursor.cursorLegendFormatString;\n        // whether the cursor is over the grid or not.\n        this._oldHandlers = {onselectstart: null, ondrag: null, onmousedown: null};\n        // prop: constrainOutsideZoom\n        // True to limit actual zoom area to edges of grid, even when zooming\n        // outside of plot area.  That is, can't zoom out by mousing outside plot.\n        this.constrainOutsideZoom = true;\n        // prop: showTooltipOutsideZoom\n        // True will keep updating the tooltip when zooming of the grid.\n        this.showTooltipOutsideZoom = false;\n        // true if mouse is over grid, false if not.\n        this.onGrid = false;\n        $.extend(true, this, options);\n    };\n    \n    $.jqplot.Cursor.cursorLegendFormatString = '%s x:%s, y:%s';\n    \n    // called with scope of plot\n    $.jqplot.Cursor.init = function (target, data, opts){\n        // add a cursor attribute to the plot\n        var options = opts || {};\n        this.plugins.cursor = new $.jqplot.Cursor(options.cursor);\n        var c = this.plugins.cursor;\n\n        if (c.show) {\n            $.jqplot.eventListenerHooks.push(['jqplotMouseEnter', handleMouseEnter]);\n            $.jqplot.eventListenerHooks.push(['jqplotMouseLeave', handleMouseLeave]);\n            $.jqplot.eventListenerHooks.push(['jqplotMouseMove', handleMouseMove]);\n            \n            if (c.showCursorLegend) {              \n                opts.legend = opts.legend || {};\n                opts.legend.renderer =  $.jqplot.CursorLegendRenderer;\n                opts.legend.formatString = this.plugins.cursor.cursorLegendFormatString;\n                opts.legend.show = true;\n            }\n            \n            if (c.zoom) {\n                $.jqplot.eventListenerHooks.push(['jqplotMouseDown', handleMouseDown]);\n                \n                if (c.clickReset) {\n                    $.jqplot.eventListenerHooks.push(['jqplotClick', handleClick]);\n                }\n                \n                if (c.dblClickReset) {\n                    $.jqplot.eventListenerHooks.push(['jqplotDblClick', handleDblClick]);\n                }             \n            }\n    \n            this.resetZoom = function() {\n                var axes = this.axes;\n                if (!c.zoomProxy) {\n                    for (var ax in axes) {\n                        axes[ax].reset();\n                        axes[ax]._ticks = [];\n                        // fake out tick creation algorithm to make sure original auto\n                        // computed format string is used if _overrideFormatString is true\n                        if (c._zoom.axes[ax] !== undefined) {\n                            axes[ax]._autoFormatString = c._zoom.axes[ax].tickFormatString;\n                        }\n                    }\n                    this.redraw();\n                }\n                else {\n                    var ctx = this.plugins.cursor.zoomCanvas._ctx;\n                    ctx.clearRect(0,0,ctx.canvas.width, ctx.canvas.height);\n                    ctx = null;\n                }\n                this.plugins.cursor._zoom.isZoomed = false;\n                this.target.trigger('jqplotResetZoom', [this, this.plugins.cursor]);\n            };\n            \n\n            if (c.showTooltipDataPosition) {\n                c.showTooltipUnitPosition = false;\n                c.showTooltipGridPosition = false;\n                if (options.cursor.tooltipFormatString == undefined) {\n                    c.tooltipFormatString = $.jqplot.Cursor.cursorLegendFormatString;\n                }\n            }\n        }\n    };\n    \n    // called with context of plot\n    $.jqplot.Cursor.postDraw = function() {\n        var c = this.plugins.cursor;\n        \n        // Memory Leaks patch\n        if (c.zoomCanvas) {\n            c.zoomCanvas.resetCanvas();\n            c.zoomCanvas = null;\n        }\n        \n        if (c.cursorCanvas) {\n            c.cursorCanvas.resetCanvas();\n            c.cursorCanvas = null;\n        }\n        \n        if (c._tooltipElem) {\n            c._tooltipElem.emptyForce();\n            c._tooltipElem = null;\n        }\n\n        \n        if (c.zoom) {\n            c.zoomCanvas = new $.jqplot.GenericCanvas();\n            this.eventCanvas._elem.before(c.zoomCanvas.createElement(this._gridPadding, 'jqplot-zoom-canvas', this._plotDimensions, this));\n            c.zoomCanvas.setContext();\n        }\n\n        var elem = document.createElement('div');\n        c._tooltipElem = $(elem);\n        elem = null;\n        c._tooltipElem.addClass('jqplot-cursor-tooltip');\n        c._tooltipElem.css({position:'absolute', display:'none'});\n        \n        \n        if (c.zoomCanvas) {\n            c.zoomCanvas._elem.before(c._tooltipElem);\n        }\n\n        else {\n            this.eventCanvas._elem.before(c._tooltipElem);\n        }\n\n        if (c.showVerticalLine || c.showHorizontalLine) {\n            c.cursorCanvas = new $.jqplot.GenericCanvas();\n            this.eventCanvas._elem.before(c.cursorCanvas.createElement(this._gridPadding, 'jqplot-cursor-canvas', this._plotDimensions, this));\n            c.cursorCanvas.setContext();\n        }\n\n        // if we are showing the positions in unit coordinates, and no axes groups\n        // were specified, create a default set.\n        if (c.showTooltipUnitPosition){\n            if (c.tooltipAxisGroups.length === 0) {\n                var series = this.series;\n                var s;\n                var temp = [];\n                for (var i=0; i<series.length; i++) {\n                    s = series[i];\n                    var ax = s.xaxis+','+s.yaxis;\n                    if ($.inArray(ax, temp) == -1) {\n                        temp.push(ax);\n                    }\n                }\n                for (var i=0; i<temp.length; i++) {\n                    c.tooltipAxisGroups.push(temp[i].split(','));\n                }\n            }\n        }\n    };\n    \n    // Group: methods\n    //\n    // method: $.jqplot.Cursor.zoomProxy\n    // links targetPlot to controllerPlot so that plot zooming of\n    // targetPlot will be controlled by zooming on the controllerPlot.\n    // controllerPlot will not actually zoom, but acts as an\n    // overview plot.  Note, the zoom options must be set to true for\n    // zoomProxy to work.\n    $.jqplot.Cursor.zoomProxy = function(targetPlot, controllerPlot) {\n        var tc = targetPlot.plugins.cursor;\n        var cc = controllerPlot.plugins.cursor;\n        tc.zoomTarget = true;\n        tc.zoom = true;\n        tc.style = 'auto';\n        tc.dblClickReset = false;\n        cc.zoom = true;\n        cc.zoomProxy = true;\n              \n        controllerPlot.target.bind('jqplotZoom', plotZoom);\n        controllerPlot.target.bind('jqplotResetZoom', plotReset);\n\n        function plotZoom(ev, gridpos, datapos, plot, cursor) {\n            tc.doZoom(gridpos, datapos, targetPlot, cursor);\n        } \n\n        function plotReset(ev, plot, cursor) {\n            targetPlot.resetZoom();\n        }\n    };\n    \n    $.jqplot.Cursor.prototype.resetZoom = function(plot, cursor) {\n        var axes = plot.axes;\n        var cax = cursor._zoom.axes;\n        if (!plot.plugins.cursor.zoomProxy && cursor._zoom.isZoomed) {\n            for (var ax in axes) {\n                // axes[ax]._ticks = [];\n                // axes[ax].min = cax[ax].min;\n                // axes[ax].max = cax[ax].max;\n                // axes[ax].numberTicks = cax[ax].numberTicks; \n                // axes[ax].tickInterval = cax[ax].tickInterval;\n                // // for date axes\n                // axes[ax].daTickInterval = cax[ax].daTickInterval;\n                axes[ax].reset();\n                axes[ax]._ticks = [];\n                // fake out tick creation algorithm to make sure original auto\n                // computed format string is used if _overrideFormatString is true\n                axes[ax]._autoFormatString = cax[ax].tickFormatString;\n            }\n            plot.redraw();\n            cursor._zoom.isZoomed = false;\n        }\n        else {\n            var ctx = cursor.zoomCanvas._ctx;\n            ctx.clearRect(0,0,ctx.canvas.width, ctx.canvas.height);\n            ctx = null;\n        }\n        plot.target.trigger('jqplotResetZoom', [plot, cursor]);\n    };\n    \n    $.jqplot.Cursor.resetZoom = function(plot) {\n        plot.resetZoom();\n    };\n    \n    $.jqplot.Cursor.prototype.doZoom = function (gridpos, datapos, plot, cursor) {\n        var c = cursor;\n        var axes = plot.axes;\n        var zaxes = c._zoom.axes;\n        var start = zaxes.start;\n        var end = zaxes.end;\n        var min, max, dp, span,\n            newmin, newmax, curax, _numberTicks, ret;\n        var ctx = plot.plugins.cursor.zoomCanvas._ctx;\n        // don't zoom if zoom area is too small (in pixels)\n        if ((c.constrainZoomTo == 'none' && Math.abs(gridpos.x - c._zoom.start[0]) > 6 && Math.abs(gridpos.y - c._zoom.start[1]) > 6) || (c.constrainZoomTo == 'x' && Math.abs(gridpos.x - c._zoom.start[0]) > 6) ||  (c.constrainZoomTo == 'y' && Math.abs(gridpos.y - c._zoom.start[1]) > 6)) {\n            if (!plot.plugins.cursor.zoomProxy) {\n                for (var ax in datapos) {\n                    // make a copy of the original axes to revert back.\n                    if (c._zoom.axes[ax] == undefined) {\n                        c._zoom.axes[ax] = {};\n                        c._zoom.axes[ax].numberTicks = axes[ax].numberTicks;\n                        c._zoom.axes[ax].tickInterval = axes[ax].tickInterval;\n                        // for date axes...\n                        c._zoom.axes[ax].daTickInterval = axes[ax].daTickInterval;\n                        c._zoom.axes[ax].min = axes[ax].min;\n                        c._zoom.axes[ax].max = axes[ax].max;\n                        c._zoom.axes[ax].tickFormatString = (axes[ax].tickOptions != null) ? axes[ax].tickOptions.formatString :  '';\n                    }\n\n\n                    if ((c.constrainZoomTo == 'none') || (c.constrainZoomTo == 'x' && ax.charAt(0) == 'x') || (c.constrainZoomTo == 'y' && ax.charAt(0) == 'y')) {   \n                        dp = datapos[ax];\n                        if (dp != null) {           \n                            if (dp > start[ax]) { \n                                newmin = start[ax];\n                                newmax = dp;\n                            }\n                            else {\n                                span = start[ax] - dp;\n                                newmin = dp;\n                                newmax = start[ax];\n                            }\n\n                            curax = axes[ax];\n\n                            _numberTicks = null;\n\n                            // if aligning this axis, use number of ticks from previous axis.\n                            // Do I need to reset somehow if alignTicks is changed and then graph is replotted??\n                            if (curax.alignTicks) {\n                                if (curax.name === 'x2axis' && plot.axes.xaxis.show) {\n                                    _numberTicks = plot.axes.xaxis.numberTicks;\n                                }\n                                else if (curax.name.charAt(0) === 'y' && curax.name !== 'yaxis' && curax.name !== 'yMidAxis' && plot.axes.yaxis.show) {\n                                    _numberTicks = plot.axes.yaxis.numberTicks;\n                                }\n                            }\n                            \n                            if (this.looseZoom && (axes[ax].renderer.constructor === $.jqplot.LinearAxisRenderer || axes[ax].renderer.constructor === $.jqplot.LogAxisRenderer )) { //} || axes[ax].renderer.constructor === $.jqplot.DateAxisRenderer)) {\n\n                                ret = $.jqplot.LinearTickGenerator(newmin, newmax, curax._scalefact, _numberTicks);\n\n                                // if new minimum is less than \"true\" minimum of axis display, adjust it\n                                if (axes[ax].tickInset && ret[0] < axes[ax].min + axes[ax].tickInset * axes[ax].tickInterval) {\n                                    ret[0] += ret[4];\n                                    ret[2] -= 1;\n                                }\n\n                                // if new maximum is greater than \"true\" max of axis display, adjust it\n                                if (axes[ax].tickInset && ret[1] > axes[ax].max - axes[ax].tickInset * axes[ax].tickInterval) {\n                                    ret[1] -= ret[4];\n                                    ret[2] -= 1;\n                                }\n\n                                // for log axes, don't fall below current minimum, this will look bad and can't have 0 in range anyway.\n                                if (axes[ax].renderer.constructor === $.jqplot.LogAxisRenderer && ret[0] < axes[ax].min) {\n                                    // remove a tick and shift min up\n                                    ret[0] += ret[4];\n                                    ret[2] -= 1;\n                                }\n\n                                axes[ax].min = ret[0];\n                                axes[ax].max = ret[1];\n                                axes[ax]._autoFormatString = ret[3];\n                                axes[ax].numberTicks = ret[2];\n                                axes[ax].tickInterval = ret[4];\n                                // for date axes...\n                                axes[ax].daTickInterval = [ret[4]/1000, 'seconds'];\n                            }\n                            else {\n                                axes[ax].min = newmin;\n                                axes[ax].max = newmax;\n                                axes[ax].tickInterval = null;\n                                axes[ax].numberTicks = null;\n                                // for date axes...\n                                axes[ax].daTickInterval = null;\n                            }\n\n                            axes[ax]._ticks = [];\n                        }\n                    }\n                            \n                    // if ((c.constrainZoomTo == 'x' && ax.charAt(0) == 'y' && c.autoscaleConstraint) || (c.constrainZoomTo == 'y' && ax.charAt(0) == 'x' && c.autoscaleConstraint)) {\n                    //     dp = datapos[ax];\n                    //     if (dp != null) {\n                    //         axes[ax].max == null;\n                    //         axes[ax].min = null;\n                    //     }\n                    // }\n                }\n                ctx.clearRect(0,0,ctx.canvas.width, ctx.canvas.height);\n                plot.redraw();\n                c._zoom.isZoomed = true;\n                ctx = null;\n            }\n            plot.target.trigger('jqplotZoom', [gridpos, datapos, plot, cursor]);\n        }\n    };\n    \n    $.jqplot.preInitHooks.push($.jqplot.Cursor.init);\n    $.jqplot.postDrawHooks.push($.jqplot.Cursor.postDraw);\n    \n    function updateTooltip(gridpos, datapos, plot) {\n        var c = plot.plugins.cursor;\n        var s = '';\n        var addbr = false;\n        if (c.showTooltipGridPosition) {\n            s = gridpos.x+', '+gridpos.y;\n            addbr = true;\n        }\n        if (c.showTooltipUnitPosition) {\n            var g;\n            for (var i=0; i<c.tooltipAxisGroups.length; i++) {\n                g = c.tooltipAxisGroups[i];\n                if (addbr) {\n                    s += '<br />';\n                }\n                if (c.useAxesFormatters) {\n                    for (var j=0; j<g.length; j++) {\n                        if (j) {\n                            s += ', ';\n                        }\n                        var af = plot.axes[g[j]]._ticks[0].formatter;\n                        var afstr = plot.axes[g[j]]._ticks[0].formatString;\n                        s += af(afstr, datapos[g[j]]);\n                    }\n                }\n                else {\n                    s += $.jqplot.sprintf(c.tooltipFormatString, datapos[g[0]], datapos[g[1]]);\n                }\n                addbr = true;\n            }\n        }\n        \n        if (c.showTooltipDataPosition) {\n            var series = plot.series; \n            var ret = getIntersectingPoints(plot, gridpos.x, gridpos.y);\n            var addbr = false;\n        \n            for (var i = 0; i< series.length; i++) {\n                if (series[i].show) {\n                    var idx = series[i].index;\n                    var label = series[i].label.toString();\n                    var cellid = $.inArray(idx, ret.indices);\n                    var sx = undefined;\n                    var sy = undefined;\n                    if (cellid != -1) {\n                        var data = ret.data[cellid].data;\n                        if (c.useAxesFormatters) {\n                            var xf = series[i]._xaxis._ticks[0].formatter;\n                            var yf = series[i]._yaxis._ticks[0].formatter;\n                            var xfstr = series[i]._xaxis._ticks[0].formatString;\n                            var yfstr = series[i]._yaxis._ticks[0].formatString;\n                            sx = xf(xfstr, data[0]);\n                            sy = yf(yfstr, data[1]);\n                        }\n                        else {\n                            sx = data[0];\n                            sy = data[1];\n                        }\n                        if (addbr) {\n                            s += '<br />';\n                        }\n                        s += $.jqplot.sprintf(c.tooltipFormatString, label, sx, sy);\n                        addbr = true;\n                    }\n                }\n            }\n            \n        }\n        c._tooltipElem.html(s);\n    }\n    \n    function moveLine(gridpos, plot) {\n        var c = plot.plugins.cursor;\n        var ctx = c.cursorCanvas._ctx;\n        ctx.clearRect(0,0,ctx.canvas.width, ctx.canvas.height);\n        if (c.showVerticalLine) {\n            c.shapeRenderer.draw(ctx, [[gridpos.x, 0], [gridpos.x, ctx.canvas.height]]);\n        }\n        if (c.showHorizontalLine) {\n            c.shapeRenderer.draw(ctx, [[0, gridpos.y], [ctx.canvas.width, gridpos.y]]);\n        }\n        var ret = getIntersectingPoints(plot, gridpos.x, gridpos.y);\n        if (c.showCursorLegend) {\n            var cells = $(plot.targetId + ' td.jqplot-cursor-legend-label');\n            for (var i=0; i<cells.length; i++) {\n                var idx = $(cells[i]).data('seriesIndex');\n                var series = plot.series[idx];\n                var label = series.label.toString();\n                var cellid = $.inArray(idx, ret.indices);\n                var sx = undefined;\n                var sy = undefined;\n                if (cellid != -1) {\n                    var data = ret.data[cellid].data;\n                    if (c.useAxesFormatters) {\n                        var xf = series._xaxis._ticks[0].formatter;\n                        var yf = series._yaxis._ticks[0].formatter;\n                        var xfstr = series._xaxis._ticks[0].formatString;\n                        var yfstr = series._yaxis._ticks[0].formatString;\n                        sx = xf(xfstr, data[0]);\n                        sy = yf(yfstr, data[1]);\n                    }\n                    else {\n                        sx = data[0];\n                        sy = data[1];\n                    }\n                }\n                if (plot.legend.escapeHtml) {\n                    $(cells[i]).text($.jqplot.sprintf(c.cursorLegendFormatString, label, sx, sy));\n                }\n                else {\n                    $(cells[i]).html($.jqplot.sprintf(c.cursorLegendFormatString, label, sx, sy));\n                }\n            }        \n        }\n        ctx = null;\n    }\n        \n    function getIntersectingPoints(plot, x, y) {\n        var ret = {indices:[], data:[]};\n        var s, i, d0, d, j, r, p;\n        var threshold;\n        var c = plot.plugins.cursor;\n        for (var i=0; i<plot.series.length; i++) {\n            s = plot.series[i];\n            r = s.renderer;\n            if (s.show) {\n                threshold = c.intersectionThreshold;\n                if (s.showMarker) {\n                    threshold += s.markerRenderer.size/2;\n                }\n                for (var j=0; j<s.gridData.length; j++) {\n                    p = s.gridData[j];\n                    // check vertical line\n                    if (c.showVerticalLine) {\n                        if (Math.abs(x-p[0]) <= threshold) {\n                            ret.indices.push(i);\n                            ret.data.push({seriesIndex: i, pointIndex:j, gridData:p, data:s.data[j]});\n                        }\n                    }\n                } \n            }\n        }\n        return ret;\n    }\n    \n    function moveTooltip(gridpos, plot) {\n        var c = plot.plugins.cursor;  \n        var elem = c._tooltipElem;\n        switch (c.tooltipLocation) {\n            case 'nw':\n                var x = gridpos.x + plot._gridPadding.left - elem.outerWidth(true) - c.tooltipOffset;\n                var y = gridpos.y + plot._gridPadding.top - c.tooltipOffset - elem.outerHeight(true);\n                break;\n            case 'n':\n                var x = gridpos.x + plot._gridPadding.left - elem.outerWidth(true)/2;\n                var y = gridpos.y + plot._gridPadding.top - c.tooltipOffset - elem.outerHeight(true);\n                break;\n            case 'ne':\n                var x = gridpos.x + plot._gridPadding.left + c.tooltipOffset;\n                var y = gridpos.y + plot._gridPadding.top - c.tooltipOffset - elem.outerHeight(true);\n                break;\n            case 'e':\n                var x = gridpos.x + plot._gridPadding.left + c.tooltipOffset;\n                var y = gridpos.y + plot._gridPadding.top - elem.outerHeight(true)/2;\n                break;\n            case 'se':\n                var x = gridpos.x + plot._gridPadding.left + c.tooltipOffset;\n                var y = gridpos.y + plot._gridPadding.top + c.tooltipOffset;\n                break;\n            case 's':\n                var x = gridpos.x + plot._gridPadding.left - elem.outerWidth(true)/2;\n                var y = gridpos.y + plot._gridPadding.top + c.tooltipOffset;\n                break;\n            case 'sw':\n                var x = gridpos.x + plot._gridPadding.left - elem.outerWidth(true) - c.tooltipOffset;\n                var y = gridpos.y + plot._gridPadding.top + c.tooltipOffset;\n                break;\n            case 'w':\n                var x = gridpos.x + plot._gridPadding.left - elem.outerWidth(true) - c.tooltipOffset;\n                var y = gridpos.y + plot._gridPadding.top - elem.outerHeight(true)/2;\n                break;\n            default:\n                var x = gridpos.x + plot._gridPadding.left + c.tooltipOffset;\n                var y = gridpos.y + plot._gridPadding.top + c.tooltipOffset;\n                break;\n        }\n            \n        elem.css('left', x);\n        elem.css('top', y);\n        elem = null;\n    }\n    \n    function positionTooltip(plot) { \n        // fake a grid for positioning\n        var grid = plot._gridPadding; \n        var c = plot.plugins.cursor;\n        var elem = c._tooltipElem;  \n        switch (c.tooltipLocation) {\n            case 'nw':\n                var a = grid.left + c.tooltipOffset;\n                var b = grid.top + c.tooltipOffset;\n                elem.css('left', a);\n                elem.css('top', b);\n                break;\n            case 'n':\n                var a = (grid.left + (plot._plotDimensions.width - grid.right))/2 - elem.outerWidth(true)/2;\n                var b = grid.top + c.tooltipOffset;\n                elem.css('left', a);\n                elem.css('top', b);\n                break;\n            case 'ne':\n                var a = grid.right + c.tooltipOffset;\n                var b = grid.top + c.tooltipOffset;\n                elem.css({right:a, top:b});\n                break;\n            case 'e':\n                var a = grid.right + c.tooltipOffset;\n                var b = (grid.top + (plot._plotDimensions.height - grid.bottom))/2 - elem.outerHeight(true)/2;\n                elem.css({right:a, top:b});\n                break;\n            case 'se':\n                var a = grid.right + c.tooltipOffset;\n                var b = grid.bottom + c.tooltipOffset;\n                elem.css({right:a, bottom:b});\n                break;\n            case 's':\n                var a = (grid.left + (plot._plotDimensions.width - grid.right))/2 - elem.outerWidth(true)/2;\n                var b = grid.bottom + c.tooltipOffset;\n                elem.css({left:a, bottom:b});\n                break;\n            case 'sw':\n                var a = grid.left + c.tooltipOffset;\n                var b = grid.bottom + c.tooltipOffset;\n                elem.css({left:a, bottom:b});\n                break;\n            case 'w':\n                var a = grid.left + c.tooltipOffset;\n                var b = (grid.top + (plot._plotDimensions.height - grid.bottom))/2 - elem.outerHeight(true)/2;\n                elem.css({left:a, top:b});\n                break;\n            default:  // same as 'se'\n                var a = grid.right - c.tooltipOffset;\n                var b = grid.bottom + c.tooltipOffset;\n                elem.css({right:a, bottom:b});\n                break;\n        }\n        elem = null;\n    }\n    \n    function handleClick (ev, gridpos, datapos, neighbor, plot) {\n        ev.preventDefault();\n        ev.stopImmediatePropagation();\n        var c = plot.plugins.cursor;\n        if (c.clickReset) {\n            c.resetZoom(plot, c);\n        }\n        var sel = window.getSelection;\n        if (document.selection && document.selection.empty)\n        {\n            document.selection.empty();\n        }\n        else if (sel && !sel().isCollapsed) {\n            sel().collapse();\n        }\n        return false;\n    }\n    \n    function handleDblClick (ev, gridpos, datapos, neighbor, plot) {\n        ev.preventDefault();\n        ev.stopImmediatePropagation();\n        var c = plot.plugins.cursor;\n        if (c.dblClickReset) {\n            c.resetZoom(plot, c);\n        }\n        var sel = window.getSelection;\n        if (document.selection && document.selection.empty)\n        {\n            document.selection.empty();\n        }\n        else if (sel && !sel().isCollapsed) {\n            sel().collapse();\n        }\n        return false;\n    }\n    \n    function handleMouseLeave(ev, gridpos, datapos, neighbor, plot) {\n        var c = plot.plugins.cursor;\n        c.onGrid = false;\n        if (c.show) {\n            $(ev.target).css('cursor', c.previousCursor);\n            if (c.showTooltip && !(c._zoom.zooming && c.showTooltipOutsideZoom && !c.constrainOutsideZoom)) {\n                c._tooltipElem.empty();\n                c._tooltipElem.hide();\n            }\n            if (c.zoom) {\n                c._zoom.gridpos = gridpos;\n                c._zoom.datapos = datapos;\n            }\n            if (c.showVerticalLine || c.showHorizontalLine) {\n                var ctx = c.cursorCanvas._ctx;\n                ctx.clearRect(0,0,ctx.canvas.width, ctx.canvas.height);\n                ctx = null;\n            }\n            if (c.showCursorLegend) {\n                var cells = $(plot.targetId + ' td.jqplot-cursor-legend-label');\n                for (var i=0; i<cells.length; i++) {\n                    var idx = $(cells[i]).data('seriesIndex');\n                    var series = plot.series[idx];\n                    var label = series.label.toString();\n                    if (plot.legend.escapeHtml) {\n                        $(cells[i]).text($.jqplot.sprintf(c.cursorLegendFormatString, label, undefined, undefined));\n                    }\n                    else {\n                        $(cells[i]).html($.jqplot.sprintf(c.cursorLegendFormatString, label, undefined, undefined));\n                    }\n                \n                }        \n            }\n        }\n    }\n    \n    function handleMouseEnter(ev, gridpos, datapos, neighbor, plot) {\n        var c = plot.plugins.cursor;\n        c.onGrid = true;\n        if (c.show) {\n            c.previousCursor = ev.target.style.cursor;\n            ev.target.style.cursor = c.style;\n            if (c.showTooltip) {\n                updateTooltip(gridpos, datapos, plot);\n                if (c.followMouse) {\n                    moveTooltip(gridpos, plot);\n                }\n                else {\n                    positionTooltip(plot);\n                }\n                c._tooltipElem.show();\n            }\n            if (c.showVerticalLine || c.showHorizontalLine) {\n                moveLine(gridpos, plot);\n            }\n        }\n\n    }    \n    \n    function handleMouseMove(ev, gridpos, datapos, neighbor, plot) {\n        var c = plot.plugins.cursor;\n        if (c.show) {\n            if (c.showTooltip) {\n                updateTooltip(gridpos, datapos, plot);\n                if (c.followMouse) {\n                    moveTooltip(gridpos, plot);\n                }\n            }\n            if (c.showVerticalLine || c.showHorizontalLine) {\n                moveLine(gridpos, plot);\n            }\n        }\n    }\n            \n    function getEventPosition(ev) {\n        var plot = ev.data.plot;\n        var go = plot.eventCanvas._elem.offset();\n        var gridPos = {x:ev.pageX - go.left, y:ev.pageY - go.top};\n        //////\n        // TO DO: handle yMidAxis\n        //////\n        var dataPos = {xaxis:null, yaxis:null, x2axis:null, y2axis:null, y3axis:null, y4axis:null, y5axis:null, y6axis:null, y7axis:null, y8axis:null, y9axis:null, yMidAxis:null};\n        var an = ['xaxis', 'yaxis', 'x2axis', 'y2axis', 'y3axis', 'y4axis', 'y5axis', 'y6axis', 'y7axis', 'y8axis', 'y9axis', 'yMidAxis'];\n        var ax = plot.axes;\n        var n, axis;\n        for (n=11; n>0; n--) {\n            axis = an[n-1];\n            if (ax[axis].show) {\n                dataPos[axis] = ax[axis].series_p2u(gridPos[axis.charAt(0)]);\n            }\n        }\n\n        return {offsets:go, gridPos:gridPos, dataPos:dataPos};\n    }    \n    \n    function handleZoomMove(ev) {\n        var plot = ev.data.plot;\n        var c = plot.plugins.cursor;\n        // don't do anything if not on grid.\n        if (c.show && c.zoom && c._zoom.started && !c.zoomTarget) {\n            ev.preventDefault();\n            var ctx = c.zoomCanvas._ctx;\n            var positions = getEventPosition(ev);\n            var gridpos = positions.gridPos;\n            var datapos = positions.dataPos;\n            c._zoom.gridpos = gridpos;\n            c._zoom.datapos = datapos;\n            c._zoom.zooming = true;\n            var xpos = gridpos.x;\n            var ypos = gridpos.y;\n            var height = ctx.canvas.height;\n            var width = ctx.canvas.width;\n            if (c.showTooltip && !c.onGrid && c.showTooltipOutsideZoom) {\n                updateTooltip(gridpos, datapos, plot);\n                if (c.followMouse) {\n                    moveTooltip(gridpos, plot);\n                }\n            }\n            if (c.constrainZoomTo == 'x') {\n                c._zoom.end = [xpos, height];\n            }\n            else if (c.constrainZoomTo == 'y') {\n                c._zoom.end = [width, ypos];\n            }\n            else {\n                c._zoom.end = [xpos, ypos];\n            }\n            var sel = window.getSelection;\n            if (document.selection && document.selection.empty)\n            {\n                document.selection.empty();\n            }\n            else if (sel && !sel().isCollapsed) {\n                sel().collapse();\n            }\n            drawZoomBox.call(c);\n            ctx = null;\n        }\n    }\n    \n    function handleMouseDown(ev, gridpos, datapos, neighbor, plot) {\n        var c = plot.plugins.cursor;\n        if(plot.plugins.mobile){\n            $(document).one('vmouseup.jqplot_cursor', {plot:plot}, handleMouseUp);\n        } else {\n            $(document).one('mouseup.jqplot_cursor', {plot:plot}, handleMouseUp);\n        }\n        var axes = plot.axes;\n        if (document.onselectstart != undefined) {\n            c._oldHandlers.onselectstart = document.onselectstart;\n            document.onselectstart = function () { return false; };\n        }\n        if (document.ondrag != undefined) {\n            c._oldHandlers.ondrag = document.ondrag;\n            document.ondrag = function () { return false; };\n        }\n        if (document.onmousedown != undefined) {\n            c._oldHandlers.onmousedown = document.onmousedown;\n            document.onmousedown = function () { return false; };\n        }\n        if (c.zoom) {\n            if (!c.zoomProxy) {\n                var ctx = c.zoomCanvas._ctx;\n                ctx.clearRect(0,0,ctx.canvas.width, ctx.canvas.height);\n                ctx = null;\n            }\n            if (c.constrainZoomTo == 'x') {\n                c._zoom.start = [gridpos.x, 0];\n            }\n            else if (c.constrainZoomTo == 'y') {\n                c._zoom.start = [0, gridpos.y];\n            }\n            else {\n                c._zoom.start = [gridpos.x, gridpos.y];\n            }\n            c._zoom.started = true;\n            for (var ax in datapos) {\n                // get zoom starting position.\n                c._zoom.axes.start[ax] = datapos[ax];\n            }  \n           if(plot.plugins.mobile){\n                $(document).bind('vmousemove.jqplotCursor', {plot:plot}, handleZoomMove);              \n            } else {\n                $(document).bind('mousemove.jqplotCursor', {plot:plot}, handleZoomMove);              \n            }\n\n        }\n    }\n    \n    function handleMouseUp(ev) {\n        var plot = ev.data.plot;\n        var c = plot.plugins.cursor;\n        if (c.zoom && c._zoom.zooming && !c.zoomTarget) {\n            var xpos = c._zoom.gridpos.x;\n            var ypos = c._zoom.gridpos.y;\n            var datapos = c._zoom.datapos;\n            var height = c.zoomCanvas._ctx.canvas.height;\n            var width = c.zoomCanvas._ctx.canvas.width;\n            var axes = plot.axes;\n            \n            if (c.constrainOutsideZoom && !c.onGrid) {\n                if (xpos < 0) { xpos = 0; }\n                else if (xpos > width) { xpos = width; }\n                if (ypos < 0) { ypos = 0; }\n                else if (ypos > height) { ypos = height; }\n                \n                for (var axis in datapos) {\n                    if (datapos[axis]) {\n                        if (axis.charAt(0) == 'x') {\n                            datapos[axis] = axes[axis].series_p2u(xpos);\n                        }\n                        else {\n                            datapos[axis] = axes[axis].series_p2u(ypos);\n                        }\n                    }\n                }\n            }\n            \n            if (c.constrainZoomTo == 'x') {\n                ypos = height;\n            }\n            else if (c.constrainZoomTo == 'y') {\n                xpos = width;\n            }\n            c._zoom.end = [xpos, ypos];\n            c._zoom.gridpos = {x:xpos, y:ypos};\n            \n            c.doZoom(c._zoom.gridpos, datapos, plot, c);\n        }\n        c._zoom.started = false;\n        c._zoom.zooming = false;\n        \n        $(document).unbind('mousemove.jqplotCursor', handleZoomMove);\n        \n        if (document.onselectstart != undefined && c._oldHandlers.onselectstart != null){\n            document.onselectstart = c._oldHandlers.onselectstart;\n            c._oldHandlers.onselectstart = null;\n        }\n        if (document.ondrag != undefined && c._oldHandlers.ondrag != null){\n            document.ondrag = c._oldHandlers.ondrag;\n            c._oldHandlers.ondrag = null;\n        }\n        if (document.onmousedown != undefined && c._oldHandlers.onmousedown != null){\n            document.onmousedown = c._oldHandlers.onmousedown;\n            c._oldHandlers.onmousedown = null;\n        }\n\n    }\n    \n    function drawZoomBox() {\n        var start = this._zoom.start;\n        var end = this._zoom.end;\n        var ctx = this.zoomCanvas._ctx;\n        var l, t, h, w;\n        if (end[0] > start[0]) {\n            l = start[0];\n            w = end[0] - start[0];\n        }\n        else {\n            l = end[0];\n            w = start[0] - end[0];\n        }\n        if (end[1] > start[1]) {\n            t = start[1];\n            h = end[1] - start[1];\n        }\n        else {\n            t = end[1];\n            h = start[1] - end[1];\n        }\n        ctx.fillStyle = 'rgba(0,0,0,0.2)';\n        ctx.strokeStyle = '#999999';\n        ctx.lineWidth = 1.0;\n        ctx.clearRect(0,0,ctx.canvas.width, ctx.canvas.height);\n        ctx.fillRect(0,0,ctx.canvas.width, ctx.canvas.height);\n        ctx.clearRect(l, t, w, h);\n        // IE won't show transparent fill rect, so stroke a rect also.\n        ctx.strokeRect(l,t,w,h);\n        ctx = null;\n    }\n    \n    $.jqplot.CursorLegendRenderer = function(options) {\n        $.jqplot.TableLegendRenderer.call(this, options);\n        this.formatString = '%s';\n    };\n    \n    $.jqplot.CursorLegendRenderer.prototype = new $.jqplot.TableLegendRenderer();\n    $.jqplot.CursorLegendRenderer.prototype.constructor = $.jqplot.CursorLegendRenderer;\n    \n    // called in context of a Legend\n    $.jqplot.CursorLegendRenderer.prototype.draw = function() {\n        if (this._elem) {\n            this._elem.emptyForce();\n            this._elem = null;\n        }\n        if (this.show) {\n            var series = this._series, s;\n            // make a table.  one line label per row.\n            var elem = document.createElement('table');\n            this._elem = $(elem);\n            elem = null;\n            this._elem.addClass('jqplot-legend jqplot-cursor-legend');\n            this._elem.css('position', 'absolute');\n        \n            var pad = false;\n            for (var i = 0; i< series.length; i++) {\n                s = series[i];\n                if (s.show && s.showLabel) {\n                    var lt = $.jqplot.sprintf(this.formatString, s.label.toString());\n                    if (lt) {\n                        var color = s.color;\n                        if (s._stack && !s.fill) {\n                            color = '';\n                        }\n                        addrow.call(this, lt, color, pad, i);\n                        pad = true;\n                    }\n                    // let plugins add more rows to legend.  Used by trend line plugin.\n                    for (var j=0; j<$.jqplot.addLegendRowHooks.length; j++) {\n                        var item = $.jqplot.addLegendRowHooks[j].call(this, s);\n                        if (item) {\n                            addrow.call(this, item.label, item.color, pad);\n                            pad = true;\n                        } \n                    }\n                }\n            }\n            series = s = null;\n            delete series;\n            delete s;\n        }\n        \n        function addrow(label, color, pad, idx) {\n            var rs = (pad) ? this.rowSpacing : '0';\n            var tr = $('<tr class=\"jqplot-legend jqplot-cursor-legend\"></tr>').appendTo(this._elem);\n            tr.data('seriesIndex', idx);\n            $('<td class=\"jqplot-legend jqplot-cursor-legend-swatch\" style=\"padding-top:'+rs+';\">'+\n                '<div style=\"border:1px solid #cccccc;padding:0.2em;\">'+\n                '<div class=\"jqplot-cursor-legend-swatch\" style=\"background-color:'+color+';\"></div>'+\n                '</div></td>').appendTo(tr);\n            var td = $('<td class=\"jqplot-legend jqplot-cursor-legend-label\" style=\"vertical-align:middle;padding-top:'+rs+';\"></td>');\n            td.appendTo(tr);\n            td.data('seriesIndex', idx);\n            if (this.escapeHtml) {\n                td.text(label);\n            }\n            else {\n                td.html(label);\n            }\n            tr = null;\n            td = null;\n        }\n        return this._elem;\n    };\n    \n})(jQuery);\n"
  },
  {
    "path": "stenogotchi/ui/web/static/js/plugins/jqplot.dateAxisRenderer.js",
    "content": "/**\n * jqPlot\n * Pure JavaScript plotting plugin using jQuery\n *\n * Version: 1.0.9\n * Revision: d96a669\n *\n * Copyright (c) 2009-2016 Chris Leonello\n * jqPlot is currently available for use in all personal or commercial projects \n * under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL \n * version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can \n * choose the license that best suits your project and use it accordingly. \n *\n * Although not required, the author would appreciate an email letting him \n * know of any substantial use of jqPlot.  You can reach the author at: \n * chris at jqplot dot com or see http://www.jqplot.com/info.php .\n *\n * If you are feeling kind and generous, consider supporting the project by\n * making a donation at: http://www.jqplot.com/donate.php .\n *\n * sprintf functions contained in jqplot.sprintf.js by Ash Searle:\n *\n *     version 2007.04.27\n *     author Ash Searle\n *     http://hexmen.com/blog/2007/03/printf-sprintf/\n *     http://hexmen.com/js/sprintf.js\n *     The author (Ash Searle) has placed this code in the public domain:\n *     \"This code is unrestricted: you are free to use it however you like.\"\n * \n */\n(function($) {  \n    /**\n     * Class: $.jqplot.DateAxisRenderer\n     * A plugin for a jqPlot to render an axis as a series of date values.\n     * This renderer has no options beyond those supplied by the <Axis> class.\n     * It supplies its own tick formatter, so the tickOptions.formatter option\n     * should not be overridden.\n     * \n     * Thanks to Ken Synder for his enhanced Date instance methods which are\n     * included with this code <http://kendsnyder.com/sandbox/date/>.\n     * \n     * To use this renderer, include the plugin in your source\n     * > <script type=\"text/javascript\" language=\"javascript\" src=\"plugins/jqplot.dateAxisRenderer.js\"></script>\n     * \n     * and supply the appropriate options to your plot\n     * \n     * > {axes:{xaxis:{renderer:$.jqplot.DateAxisRenderer}}}\n     * \n     * Dates can be passed into the axis in almost any recognizable value and \n     * will be parsed.  They will be rendered on the axis in the format\n     * specified by tickOptions.formatString.  e.g. tickOptions.formatString = '%Y-%m-%d'.\n     * \n     * Accecptable format codes \n     * are:\n     * \n     * > Code    Result                  Description\n     * >             == Years ==\n     * > %Y      2008                Four-digit year\n     * > %y      08                  Two-digit year\n     * >             == Months ==\n     * > %m      09                  Two-digit month\n     * > %#m     9                   One or two-digit month\n     * > %B      September           Full month name\n     * > %b      Sep                 Abbreviated month name\n     * >             == Days ==\n     * > %d      05                  Two-digit day of month\n     * > %#d     5                   One or two-digit day of month\n     * > %e      5                   One or two-digit day of month\n     * > %A      Sunday              Full name of the day of the week\n     * > %a      Sun                 Abbreviated name of the day of the week\n     * > %w      0                   Number of the day of the week (0 = Sunday, 6 = Saturday)\n     * > %o      th                  The ordinal suffix string following the day of the month\n     * >             == Hours ==\n     * > %H      23                  Hours in 24-hour format (two digits)\n     * > %#H     3                   Hours in 24-hour integer format (one or two digits)\n     * > %I      11                  Hours in 12-hour format (two digits)\n     * > %#I     3                   Hours in 12-hour integer format (one or two digits)\n     * > %p      PM                  AM or PM\n     * >             == Minutes ==\n     * > %M      09                  Minutes (two digits)\n     * > %#M     9                   Minutes (one or two digits)\n     * >             == Seconds ==\n     * > %S      02                  Seconds (two digits)\n     * > %#S     2                   Seconds (one or two digits)\n     * > %s      1206567625723       Unix timestamp (Seconds past 1970-01-01 00:00:00)\n     * >             == Milliseconds ==\n     * > %N      008                 Milliseconds (three digits)\n     * > %#N     8                   Milliseconds (one to three digits)\n     * >             == Timezone ==\n     * > %O      360                 difference in minutes between local time and GMT\n     * > %Z      Mountain Standard Time  Name of timezone as reported by browser\n     * > %G      -06:00              Hours and minutes between GMT\n     * >             == Shortcuts ==\n     * > %F      2008-03-26          %Y-%m-%d\n     * > %T      05:06:30            %H:%M:%S\n     * > %X      05:06:30            %H:%M:%S\n     * > %x      03/26/08            %m/%d/%y\n     * > %D      03/26/08            %m/%d/%y\n     * > %#c     Wed Mar 26 15:31:00 2008  %a %b %e %H:%M:%S %Y\n     * > %v      3-Sep-2008          %e-%b-%Y\n     * > %R      15:31               %H:%M\n     * > %r      3:31:00 PM          %I:%M:%S %p\n     * >             == Characters ==\n     * > %n      \\n                  Newline\n     * > %t      \\t                  Tab\n     * > %%      %                   Percent Symbol \n     */\n    $.jqplot.DateAxisRenderer = function() {\n        $.jqplot.LinearAxisRenderer.call(this);\n        this.date = new $.jsDate();\n    };\n\n    var second = 1000;\n    var minute = 60 * second;\n    var hour = 60 * minute;\n    var day = 24 * hour;\n    var week = 7 * day;\n\n    // these are less definitive\n    var month = 30.4368499 * day;\n    var year = 365.242199 * day;\n\n    var daysInMonths = [31,28,31,30,31,30,31,30,31,30,31,30];\n    // array of consistent nice intervals.  Longer intervals\n    // will depend on days in month, days in year, etc.\n    var niceFormatStrings = ['%M:%S.%#N', '%M:%S.%#N', '%M:%S.%#N', '%M:%S', '%M:%S', '%M:%S', '%M:%S', '%H:%M:%S', '%H:%M:%S', '%H:%M', '%H:%M', '%H:%M', '%H:%M', '%H:%M', '%H:%M', '%a %H:%M', '%a %H:%M', '%b %e %H:%M', '%b %e %H:%M', '%b %e %H:%M', '%b %e %H:%M', '%v', '%v', '%v', '%v', '%v', '%v', '%v'];\n    var niceIntervals = [0.1*second, 0.2*second, 0.5*second, second, 2*second, 5*second, 10*second, 15*second, 30*second, minute, 2*minute, 5*minute, 10*minute, 15*minute, 30*minute, hour, 2*hour, 4*hour, 6*hour, 8*hour, 12*hour, day, 2*day, 3*day, 4*day, 5*day, week, 2*week];\n\n    var niceMonthlyIntervals = [];\n\n    function bestDateInterval(min, max, titarget) {\n        // iterate through niceIntervals to find one closest to titarget\n        var badness = Number.MAX_VALUE;\n        var temp, bestTi, bestfmt;\n        for (var i=0, l=niceIntervals.length; i < l; i++) {\n            temp = Math.abs(titarget - niceIntervals[i]);\n            if (temp < badness) {\n                badness = temp;\n                bestTi = niceIntervals[i];\n                bestfmt = niceFormatStrings[i];\n            }\n        }\n\n        return [bestTi, bestfmt];\n    }\n    \n    $.jqplot.DateAxisRenderer.prototype = new $.jqplot.LinearAxisRenderer();\n    $.jqplot.DateAxisRenderer.prototype.constructor = $.jqplot.DateAxisRenderer;\n    \n    $.jqplot.DateTickFormatter = function(format, val) {\n        if (!format) {\n            format = '%Y/%m/%d';\n        }\n        return $.jsDate.strftime(val, format);\n    };\n    \n    $.jqplot.DateAxisRenderer.prototype.init = function(options){\n        // prop: tickRenderer\n        // A class of a rendering engine for creating the ticks labels displayed on the plot, \n        // See <$.jqplot.AxisTickRenderer>.\n        // this.tickRenderer = $.jqplot.AxisTickRenderer;\n        // this.labelRenderer = $.jqplot.AxisLabelRenderer;\n        this.tickOptions.formatter = $.jqplot.DateTickFormatter;\n        // prop: tickInset\n        // Controls the amount to inset the first and last ticks from \n        // the edges of the grid, in multiples of the tick interval.\n        // 0 is no inset, 0.5 is one half a tick interval, 1 is a full\n        // tick interval, etc.\n        this.tickInset = 0;\n        // prop: drawBaseline\n        // True to draw the axis baseline.\n        this.drawBaseline = true;\n        // prop: baselineWidth\n        // width of the baseline in pixels.\n        this.baselineWidth = null;\n        // prop: baselineColor\n        // CSS color spec for the baseline.\n        this.baselineColor = null;\n        this.daTickInterval = null;\n        this._daTickInterval = null;\n        \n        $.extend(true, this, options);\n        \n        var db = this._dataBounds,\n            stats, \n            sum,\n            s,\n            d,\n            pd,\n            sd,\n            intv;\n        \n        // Go through all the series attached to this axis and find\n        // the min/max bounds for this axis.\n        for (var i=0; i<this._series.length; i++) {\n            stats = {intervals:[], frequencies:{}, sortedIntervals:[], min:null, max:null, mean:null};\n            sum = 0;\n            s = this._series[i];\n            d = s.data;\n            pd = s._plotData;\n            sd = s._stackData;\n            intv = 0;\n            \n            for (var j=0; j<d.length; j++) { \n                if (this.name == 'xaxis' || this.name == 'x2axis') {\n                    d[j][0] = new $.jsDate(d[j][0]).getTime();\n                    pd[j][0] = new $.jsDate(d[j][0]).getTime();\n                    sd[j][0] = new $.jsDate(d[j][0]).getTime();\n                    if ((d[j][0] != null && d[j][0] < db.min) || db.min == null) {\n                        db.min = d[j][0];\n                    }\n                    if ((d[j][0] != null && d[j][0] > db.max) || db.max == null) {\n                        db.max = d[j][0];\n                    }\n                    if (j>0) {\n                        intv = Math.abs(d[j][0] - d[j-1][0]);\n                        stats.intervals.push(intv);\n                        if (stats.frequencies.hasOwnProperty(intv)) {\n                            stats.frequencies[intv] += 1;\n                        }\n                        else {\n                            stats.frequencies[intv] = 1;\n                        }\n                    }\n                    sum += intv;\n                    \n                }              \n                else {\n                    d[j][1] = new $.jsDate(d[j][1]).getTime();\n                    pd[j][1] = new $.jsDate(d[j][1]).getTime();\n                    sd[j][1] = new $.jsDate(d[j][1]).getTime();\n                    if ((d[j][1] != null && d[j][1] < db.min) || db.min == null) {\n                        db.min = d[j][1];\n                    }\n                    if ((d[j][1] != null && d[j][1] > db.max) || db.max == null) {\n                        db.max = d[j][1];\n                    }\n                    if (j>0) {\n                        intv = Math.abs(d[j][1] - d[j-1][1]);\n                        stats.intervals.push(intv);\n                        if (stats.frequencies.hasOwnProperty(intv)) {\n                            stats.frequencies[intv] += 1;\n                        }\n                        else {\n                            stats.frequencies[intv] = 1;\n                        }\n                    }\n                }\n                sum += intv;              \n            }\n\n            if (s.renderer.bands) {\n                if (s.renderer.bands.hiData.length) {\n                    var bd = s.renderer.bands.hiData;\n                    for (var j=0, l=bd.length; j < l; j++) {\n                        if (this.name === 'xaxis' || this.name === 'x2axis') {\n                            bd[j][0] = new $.jsDate(bd[j][0]).getTime();\n                            if ((bd[j][0] != null && bd[j][0] > db.max) || db.max == null) {\n                                db.max = bd[j][0];\n                            }                        \n                        }              \n                        else {\n                            bd[j][1] = new $.jsDate(bd[j][1]).getTime();\n                            if ((bd[j][1] != null && bd[j][1] > db.max) || db.max == null) {\n                                db.max = bd[j][1];\n                            }\n                        }\n                    }\n                }\n                if (s.renderer.bands.lowData.length) {\n                    var bd = s.renderer.bands.lowData;\n                    for (var j=0, l=bd.length; j < l; j++) {\n                        if (this.name === 'xaxis' || this.name === 'x2axis') {\n                            bd[j][0] = new $.jsDate(bd[j][0]).getTime();\n                            if ((bd[j][0] != null && bd[j][0] < db.min) || db.min == null) {\n                                db.min = bd[j][0];\n                            }                       \n                        }              \n                        else {\n                            bd[j][1] = new $.jsDate(bd[j][1]).getTime();\n                            if ((bd[j][1] != null && bd[j][1] < db.min) || db.min == null) {\n                                db.min = bd[j][1];\n                            }\n                        }\n                    }\n                }\n            }\n            \n            var tempf = 0,\n                tempn=0;\n            for (var n in stats.frequencies) {\n                stats.sortedIntervals.push({interval:n, frequency:stats.frequencies[n]});\n            }\n            stats.sortedIntervals.sort(function(a, b){\n                return b.frequency - a.frequency;\n            });\n            \n            stats.min = $.jqplot.arrayMin(stats.intervals);\n            stats.max = $.jqplot.arrayMax(stats.intervals);\n            stats.mean = sum/d.length;\n            this._intervalStats.push(stats);\n            stats = sum = s = d = pd = sd = null;\n        }\n        db = null;\n        \n    };\n    \n    // called with scope of an axis\n    $.jqplot.DateAxisRenderer.prototype.reset = function() {\n        this.min = this._options.min;\n        this.max = this._options.max;\n        this.tickInterval = this._options.tickInterval;\n        this.numberTicks = this._options.numberTicks;\n        this._autoFormatString = '';\n        if (this._overrideFormatString && this.tickOptions && this.tickOptions.formatString) {\n            this.tickOptions.formatString = '';\n        }\n        this.daTickInterval = this._daTickInterval;\n        // this._ticks = this.__ticks;\n    };\n    \n    $.jqplot.DateAxisRenderer.prototype.createTicks = function(plot) {\n        // we're are operating on an axis here\n        var ticks = this._ticks;\n        var userTicks = this.ticks;\n        var name = this.name;\n        // databounds were set on axis initialization.\n        var db = this._dataBounds;\n        var iv = this._intervalStats;\n        var dim = (this.name.charAt(0) === 'x') ? this._plotDimensions.width : this._plotDimensions.height;\n        var interval;\n        var min, max;\n        var pos1, pos2;\n        var tt, i;\n        var threshold = 30;\n        var insetMult = 1;\n        var daTickInterval = null;\n        \n        // if user specified a tick interval, convert to usable.\n        if (this.tickInterval != null)\n        {\n            // if interval is a number or can be converted to one, use it.\n            // Assume it is in SECONDS!!!\n            if (Number(this.tickInterval)) {\n                daTickInterval = [Number(this.tickInterval), 'seconds'];\n            }\n            // else, parse out something we can build from.\n            else if (typeof this.tickInterval == \"string\") {\n                var parts = this.tickInterval.split(' ');\n                if (parts.length == 1) {\n                    daTickInterval = [1, parts[0]];\n                }\n                else if (parts.length == 2) {\n                    daTickInterval = [parts[0], parts[1]];\n                }\n            }\n        }\n\n        var tickInterval = this.tickInterval;\n        \n        // if we already have ticks, use them.\n        // ticks must be in order of increasing value.\n        \n        min = new $.jsDate((this.min != null) ? this.min : db.min).getTime();\n        max = new $.jsDate((this.max != null) ? this.max : db.max).getTime();\n\n        // see if we're zooming.  if we are, don't use the min and max we're given,\n        // but compute some nice ones.  They will be reset later.\n\n        var cursor = plot.plugins.cursor;\n\n        if (cursor && cursor._zoom && cursor._zoom.zooming) {\n            this.min = null;\n            this.max = null;\n        }\n\n        var range = max - min;\n\n        if (this.tickOptions == null || !this.tickOptions.formatString) {\n            this._overrideFormatString = true;\n        }\n        \n        if (userTicks.length) {\n            // ticks could be 1D or 2D array of [val, val, ,,,] or [[val, label], [val, label], ...] or mixed\n            for (i=0; i<userTicks.length; i++){\n                var ut = userTicks[i];\n                var t = new this.tickRenderer(this.tickOptions);\n                if (ut.constructor == Array) {\n                    t.value = new $.jsDate(ut[0]).getTime();\n                    t.label = ut[1];\n                    if (!this.showTicks) {\n                        t.showLabel = false;\n                        t.showMark = false;\n                    }\n                    else if (!this.showTickMarks) {\n                        t.showMark = false;\n                    }\n                    t.setTick(t.value, this.name);\n                    this._ticks.push(t);\n                }\n                \n                else {\n                    t.value = new $.jsDate(ut).getTime();\n                    if (!this.showTicks) {\n                        t.showLabel = false;\n                        t.showMark = false;\n                    }\n                    else if (!this.showTickMarks) {\n                        t.showMark = false;\n                    }\n                    t.setTick(t.value, this.name);\n                    this._ticks.push(t);\n                }\n            }\n            this.numberTicks = userTicks.length;\n            this.min = this._ticks[0].value;\n            this.max = this._ticks[this.numberTicks-1].value;\n            this.daTickInterval = [(this.max - this.min) / (this.numberTicks - 1)/1000, 'seconds'];\n        }\n\n        ////////\n        // We don't have any ticks yet, let's make some!\n        ////////\n\n        // special case when there is only one point, make three tick marks to center the point\n        else if (this.min == null && this.max == null && db.min == db.max)\n        {\n             var onePointOpts = $.extend(true, {}, this.tickOptions, {name: this.name, value: null});\n             var delta = 300000;\n             this.min = db.min - delta;\n             this.max = db.max + delta;\n             this.numberTicks = 3;\n\n             for(var i=this.min;i<=this.max;i+= delta)\n             {\n                 onePointOpts.value = i;\n\n                 var t = new this.tickRenderer(onePointOpts);\n\n                 if (this._overrideFormatString && this._autoFormatString != '') {\n                    t.formatString = this._autoFormatString;\n                 }\n\n                 t.showLabel = false;\n                 t.showMark = false;\n\n                 this._ticks.push(t);\n             }\n\n             if(this.showTicks) {\n                 this._ticks[1].showLabel = true;\n             }\n             if(this.showTickMarks) {\n                 this._ticks[1].showTickMarks = true;\n             }                   \n        }\n        // if user specified min and max are null, we set those to make best ticks.\n        else if (this.min == null && this.max == null) {\n\n            var opts = $.extend(true, {}, this.tickOptions, {name: this.name, value: null});\n\n            // want to find a nice interval \n            var nttarget,\n                titarget;\n\n            // if no tickInterval or numberTicks options specified,  make a good guess.\n            if (!this.tickInterval && !this.numberTicks) {\n                var tdim = Math.max(dim, threshold+1);\n                // how many ticks to put on the axis?\n                // date labels tend to be long.  If ticks not rotated,\n                // don't use too many and have a high spacing factor.\n                // If we are rotating ticks, use a lower factor.\n                var spacingFactor = 115;\n                if (this.tickRenderer === $.jqplot.CanvasAxisTickRenderer && this.tickOptions.angle) {\n                    spacingFactor = 115 - 40 * Math.abs(Math.sin(this.tickOptions.angle/180*Math.PI));\n                }\n\n                nttarget =  Math.ceil((tdim-threshold)/spacingFactor + 1);\n                titarget = (max - min) / (nttarget - 1);\n            }\n\n            // If tickInterval is specified, we'll try to honor it.\n            // Not guaranteed to get this interval, but we'll get as close as\n            // we can.\n            // tickInterval will be used before numberTicks, that is if\n            // both are specified, numberTicks will be ignored.\n            else if (this.tickInterval) {\n                titarget = new $.jsDate(0).add(daTickInterval[0], daTickInterval[1]).getTime();\n            }\n\n            // if numberTicks specified, try to honor it.\n            // Not guaranteed, but will try to get close.\n            else if (this.numberTicks) {\n                nttarget = this.numberTicks;\n                titarget = (max - min) / (nttarget - 1);\n            }\n\n            // If we can use an interval of 2 weeks or less, pick best one\n            if (titarget <= 19*day) {\n                var ret = bestDateInterval(min, max, titarget);\n                var tempti = ret[0];\n                this._autoFormatString = ret[1];\n\n                min = new $.jsDate(min);\n                min = Math.floor((min.getTime() - min.getUtcOffset())/tempti) * tempti + min.getUtcOffset();\n\n                nttarget = Math.ceil((max - min) / tempti) + 1;\n                this.min = min;\n                this.max = min + (nttarget - 1) * tempti;\n\n                // if max is less than max, add an interval\n                if (this.max < max) {\n                    this.max += tempti;\n                    nttarget += 1;\n                }\n                this.tickInterval = tempti;\n                this.numberTicks = nttarget;\n\n                for (var i=0; i<nttarget; i++) {\n                    opts.value = this.min + i * tempti;\n                    t = new this.tickRenderer(opts);\n                    \n                    if (this._overrideFormatString && this._autoFormatString != '') {\n                        t.formatString = this._autoFormatString;\n                    }\n                    if (!this.showTicks) {\n                        t.showLabel = false;\n                        t.showMark = false;\n                    }\n                    else if (!this.showTickMarks) {\n                        t.showMark = false;\n                    }\n                    this._ticks.push(t);\n                }\n\n                insetMult = this.tickInterval;\n            }\n\n            // should we use a monthly interval?\n            else if (titarget <= 9 * month) {\n\n                this._autoFormatString = '%v';\n\n                // how many months in an interval?\n                var intv = Math.round(titarget/month);\n                if (intv < 1) {\n                    intv = 1;\n                }\n                else if (intv > 6) {\n                    intv = 6;\n                }\n\n                // figure out the starting month and ending month.\n                var mstart = new $.jsDate(min).setDate(1).setHours(0,0,0,0);\n\n                // See if max ends exactly on a month\n                var tempmend = new $.jsDate(max);\n                var mend = new $.jsDate(max).setDate(1).setHours(0,0,0,0);\n\n                if (tempmend.getTime() !== mend.getTime()) {\n                    mend = mend.add(1, 'month');\n                }\n\n                var nmonths = mend.diff(mstart, 'month');\n\n                nttarget = Math.ceil(nmonths/intv) + 1;\n\n                this.min = mstart.getTime();\n                this.max = mstart.clone().add((nttarget - 1) * intv, 'month').getTime();\n                this.numberTicks = nttarget;\n\n                for (var i=0; i<nttarget; i++) {\n                    if (i === 0) {\n                        opts.value = mstart.getTime();\n                    }\n                    else {\n                        opts.value = mstart.add(intv, 'month').getTime();\n                    }\n                    t = new this.tickRenderer(opts);\n                    \n                    if (this._overrideFormatString && this._autoFormatString != '') {\n                        t.formatString = this._autoFormatString;\n                    }\n                    if (!this.showTicks) {\n                        t.showLabel = false;\n                        t.showMark = false;\n                    }\n                    else if (!this.showTickMarks) {\n                        t.showMark = false;\n                    }\n                    this._ticks.push(t);\n                }\n\n                insetMult = intv * month;\n            }\n\n            // use yearly intervals\n            else {\n\n                this._autoFormatString = '%v';\n\n                // how many years in an interval?\n                var intv = Math.round(titarget/year);\n                if (intv < 1) {\n                    intv = 1;\n                }\n\n                // figure out the starting and ending years.\n                var mstart = new $.jsDate(min).setMonth(0, 1).setHours(0,0,0,0);\n                var mend = new $.jsDate(max).add(1, 'year').setMonth(0, 1).setHours(0,0,0,0);\n\n                var nyears = mend.diff(mstart, 'year');\n\n                nttarget = Math.ceil(nyears/intv) + 1;\n\n                this.min = mstart.getTime();\n                this.max = mstart.clone().add((nttarget - 1) * intv, 'year').getTime();\n                this.numberTicks = nttarget;\n\n                for (var i=0; i<nttarget; i++) {\n                    if (i === 0) {\n                        opts.value = mstart.getTime();\n                    }\n                    else {\n                        opts.value = mstart.add(intv, 'year').getTime();\n                    }\n                    t = new this.tickRenderer(opts);\n                    \n                    if (this._overrideFormatString && this._autoFormatString != '') {\n                        t.formatString = this._autoFormatString;\n                    }\n                    if (!this.showTicks) {\n                        t.showLabel = false;\n                        t.showMark = false;\n                    }\n                    else if (!this.showTickMarks) {\n                        t.showMark = false;\n                    }\n                    this._ticks.push(t);\n                }\n\n                insetMult = intv * year;\n            }\n        }\n\n        ////////\n        // Some option(s) specified, work around that.\n        ////////\n        \n        else {      \n            if (name == 'xaxis' || name == 'x2axis') {\n                dim = this._plotDimensions.width;\n            }\n            else {\n                dim = this._plotDimensions.height;\n            }\n            \n            // if min, max and number of ticks specified, user can't specify interval.\n            if (this.min != null && this.max != null && this.numberTicks != null) {\n                this.tickInterval = null;\n            }\n            \n            if (this.tickInterval != null && daTickInterval != null) {\n                this.daTickInterval = daTickInterval;\n            }\n            \n            // if min and max are same, space them out a bit\n            if (min == max) {\n                var adj = 24*60*60*500;  // 1/2 day\n                min -= adj;\n                max += adj;\n            }\n\n            range = max - min;\n            \n            var optNumTicks = 2 + parseInt(Math.max(0, dim-100)/100, 10);\n            \n            \n            var rmin, rmax;\n            \n            rmin = (this.min != null) ? new $.jsDate(this.min).getTime() : min - range/2*(this.padMin - 1);\n            rmax = (this.max != null) ? new $.jsDate(this.max).getTime() : max + range/2*(this.padMax - 1);\n            this.min = rmin;\n            this.max = rmax;\n            range = this.max - this.min;\n            \n            if (this.numberTicks == null){\n                // if tickInterval is specified by user, we will ignore computed maximum.\n                // max will be equal or greater to fit even # of ticks.\n                if (this.daTickInterval != null) {\n                    var nc = new $.jsDate(this.max).diff(this.min, this.daTickInterval[1], true);\n                    this.numberTicks = Math.ceil(nc/this.daTickInterval[0]) +1;\n                    // this.max = new $.jsDate(this.min).add(this.numberTicks-1, this.daTickInterval[1]).getTime();\n                    this.max = new $.jsDate(this.min).add((this.numberTicks-1) * this.daTickInterval[0], this.daTickInterval[1]).getTime();\n                }\n                else if (dim > 200) {\n                    this.numberTicks = parseInt(3+(dim-200)/100, 10);\n                }\n                else {\n                    this.numberTicks = 2;\n                }\n            }\n            \n            insetMult = range / (this.numberTicks-1)/1000;\n\n            if (this.daTickInterval == null) {\n                this.daTickInterval = [insetMult, 'seconds'];\n            }\n\n\n            for (var i=0; i<this.numberTicks; i++){\n                var min = new $.jsDate(this.min);\n                tt = min.add(i*this.daTickInterval[0], this.daTickInterval[1]).getTime();\n                var t = new this.tickRenderer(this.tickOptions);\n                // var t = new $.jqplot.AxisTickRenderer(this.tickOptions);\n                if (!this.showTicks) {\n                    t.showLabel = false;\n                    t.showMark = false;\n                }\n                else if (!this.showTickMarks) {\n                    t.showMark = false;\n                }\n                t.setTick(tt, this.name);\n                this._ticks.push(t);\n            }\n        }\n\n        if (this.tickInset) {\n            this.min = this.min - this.tickInset * insetMult;\n            this.max = this.max + this.tickInset * insetMult;\n        }\n\n        if (this._daTickInterval == null) {\n            this._daTickInterval = this.daTickInterval;    \n        }\n\n        ticks = null;\n    };\n   \n})(jQuery);\n\n"
  },
  {
    "path": "stenogotchi/ui/web/static/js/plugins/jqplot.donutRenderer.js",
    "content": "/**\n * jqPlot\n * Pure JavaScript plotting plugin using jQuery\n *\n * Version: 1.0.9\n * Revision: d96a669\n *\n * Copyright (c) 2009-2016 Chris Leonello\n * jqPlot is currently available for use in all personal or commercial projects \n * under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL \n * version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can \n * choose the license that best suits your project and use it accordingly. \n *\n * Although not required, the author would appreciate an email letting him \n * know of any substantial use of jqPlot.  You can reach the author at: \n * chris at jqplot dot com or see http://www.jqplot.com/info.php .\n *\n * If you are feeling kind and generous, consider supporting the project by\n * making a donation at: http://www.jqplot.com/donate.php .\n *\n * sprintf functions contained in jqplot.sprintf.js by Ash Searle:\n *\n *     version 2007.04.27\n *     author Ash Searle\n *     http://hexmen.com/blog/2007/03/printf-sprintf/\n *     http://hexmen.com/js/sprintf.js\n *     The author (Ash Searle) has placed this code in the public domain:\n *     \"This code is unrestricted: you are free to use it however you like.\"\n * \n */\n(function($) {\n    /**\n     * Class: $.jqplot.DonutRenderer\n     * Plugin renderer to draw a donut chart.\n     * x values, if present, will be used as slice labels.\n     * y values give slice size.\n     * \n     * To use this renderer, you need to include the \n     * donut renderer plugin, for example:\n     * \n     * > <script type=\"text/javascript\" src=\"plugins/jqplot.donutRenderer.js\"></script>\n     * \n     * Properties described here are passed into the $.jqplot function\n     * as options on the series renderer.  For example:\n     * \n     * > plot2 = $.jqplot('chart2', [s1, s2], {\n     * >     seriesDefaults: {\n     * >         renderer:$.jqplot.DonutRenderer,\n     * >         rendererOptions:{\n     * >              sliceMargin: 2,\n     * >              innerDiameter: 110,\n     * >              startAngle: -90\n     * >          }\n     * >      }\n     * > });\n     * \n     * A donut plot will trigger events on the plot target\n     * according to user interaction.  All events return the event object,\n     * the series index, the point (slice) index, and the point data for \n     * the appropriate slice.\n     * \n     * 'jqplotDataMouseOver' - triggered when user mouseing over a slice.\n     * 'jqplotDataHighlight' - triggered the first time user mouses over a slice,\n     * if highlighting is enabled.\n     * 'jqplotDataUnhighlight' - triggered when a user moves the mouse out of\n     * a highlighted slice.\n     * 'jqplotDataClick' - triggered when the user clicks on a slice.\n     * 'jqplotDataRightClick' - tiggered when the user right clicks on a slice if\n     * the \"captureRightClick\" option is set to true on the plot.\n     */\n    $.jqplot.DonutRenderer = function(){\n        $.jqplot.LineRenderer.call(this);\n    };\n    \n    $.jqplot.DonutRenderer.prototype = new $.jqplot.LineRenderer();\n    $.jqplot.DonutRenderer.prototype.constructor = $.jqplot.DonutRenderer;\n    \n    // called with scope of a series\n    $.jqplot.DonutRenderer.prototype.init = function(options, plot) {\n        // Group: Properties\n        //\n        // prop: diameter\n        // Outer diameter of the donut, auto computed by default\n        this.diameter = null;\n        // prop: innerDiameter\n        // Inner diameter of the donut, auto calculated by default.\n        // If specified will override thickness value.\n        this.innerDiameter = null;\n        // prop: thickness\n        // thickness of the donut, auto computed by default\n        // Overridden by if innerDiameter is specified.\n        this.thickness = null;\n        // prop: padding\n        // padding between the donut and plot edges, legend, etc.\n        this.padding = 20;\n        // prop: sliceMargin\n        // angular spacing between donut slices in degrees.\n        this.sliceMargin = 0;\n        // prop: ringMargin\n        // pixel distance between rings, or multiple series in a donut plot.\n        // null will compute ringMargin based on sliceMargin.\n        this.ringMargin = null;\n        // prop: fill\n        // true or false, whether to fil the slices.\n        this.fill = true;\n        // prop: shadowOffset\n        // offset of the shadow from the slice and offset of \n        // each succesive stroke of the shadow from the last.\n        this.shadowOffset = 2;\n        // prop: shadowAlpha\n        // transparency of the shadow (0 = transparent, 1 = opaque)\n        this.shadowAlpha = 0.07;\n        // prop: shadowDepth\n        // number of strokes to apply to the shadow, \n        // each stroke offset shadowOffset from the last.\n        this.shadowDepth = 5;\n        // prop: highlightMouseOver\n        // True to highlight slice when moused over.\n        // This must be false to enable highlightMouseDown to highlight when clicking on a slice.\n        this.highlightMouseOver = true;\n        // prop: highlightMouseDown\n        // True to highlight when a mouse button is pressed over a slice.\n        // This will be disabled if highlightMouseOver is true.\n        this.highlightMouseDown = false;\n        // prop: highlightColors\n        // an array of colors to use when highlighting a slice.\n        this.highlightColors = [];\n        // prop: dataLabels\n        // Either 'label', 'value', 'percent' or an array of labels to place on the pie slices.\n        // Defaults to percentage of each pie slice.\n        this.dataLabels = 'percent';\n        // prop: showDataLabels\n        // true to show data labels on slices.\n        this.showDataLabels = false;\n        // prop: totalLabel\n        // true to show total label in the centre\n        this.totalLabel = false;\n        // prop: dataLabelFormatString\n        // Format string for data labels.  If none, '%s' is used for \"label\" and for arrays, '%d' for value and '%d%%' for percentage.\n        this.dataLabelFormatString = null;\n        // prop: dataLabelThreshold\n        // Threshhold in percentage (0 - 100) of pie area, below which no label will be displayed.\n        // This applies to all label types, not just to percentage labels.\n        this.dataLabelThreshold = 3;\n        // prop: dataLabelPositionFactor\n        // A Multiplier (0-1) of the pie radius which controls position of label on slice.\n        // Increasing will slide label toward edge of pie, decreasing will slide label toward center of pie.\n        this.dataLabelPositionFactor = 0.4;\n        // prop: dataLabelNudge\n        // Number of pixels to slide the label away from (+) or toward (-) the center of the pie.\n        this.dataLabelNudge = 0;\n        // prop: startAngle\n        // Angle to start drawing donut in degrees.  \n        // According to orientation of canvas coordinate system:\n        // 0 = on the positive x axis\n        // -90 = on the positive y axis.\n        // 90 = on the negaive y axis.\n        // 180 or - 180 = on the negative x axis.\n        this.startAngle = 0;\n        this.tickRenderer = $.jqplot.DonutTickRenderer;\n        // Used as check for conditions where donut shouldn't be drawn.\n        this._drawData = true;\n        this._type = 'donut';\n        \n        // if user has passed in highlightMouseDown option and not set highlightMouseOver, disable highlightMouseOver\n        if (options.highlightMouseDown && options.highlightMouseOver == null) {\n            options.highlightMouseOver = false;\n        }\n        \n        $.extend(true, this, options);\n        if (this.diameter != null) {\n            this.diameter = this.diameter - this.sliceMargin;\n        }\n        this._diameter = null;\n        this._innerDiameter = null;\n        this._radius = null;\n        this._innerRadius = null;\n        this._thickness = null;\n        // references to the previous series in the plot to properly calculate diameters\n        // and thicknesses of nested rings.\n        this._previousSeries = [];\n        this._numberSeries = 1;\n        // array of [start,end] angles arrays, one for each slice.  In radians.\n        this._sliceAngles = [];\n        // index of the currenty highlighted point, if any\n        this._highlightedPoint = null;\n        \n        // set highlight colors if none provided\n        if (this.highlightColors.length == 0) {\n            for (var i=0; i<this.seriesColors.length; i++){\n                var rgba = $.jqplot.getColorComponents(this.seriesColors[i]);\n                var newrgb = [rgba[0], rgba[1], rgba[2]];\n                var sum = newrgb[0] + newrgb[1] + newrgb[2];\n                for (var j=0; j<3; j++) {\n                    // when darkening, lowest color component can be is 60.\n                    newrgb[j] = (sum > 570) ?  newrgb[j] * 0.8 : newrgb[j] + 0.3 * (255 - newrgb[j]);\n                    newrgb[j] = parseInt(newrgb[j], 10);\n                }\n                this.highlightColors.push('rgb('+newrgb[0]+','+newrgb[1]+','+newrgb[2]+')');\n            }\n        }\n        \n        plot.postParseOptionsHooks.addOnce(postParseOptions);\n        plot.postInitHooks.addOnce(postInit);\n        plot.eventListenerHooks.addOnce('jqplotMouseMove', handleMove);\n        plot.eventListenerHooks.addOnce('jqplotMouseDown', handleMouseDown);\n        plot.eventListenerHooks.addOnce('jqplotMouseUp', handleMouseUp);\n        plot.eventListenerHooks.addOnce('jqplotClick', handleClick);\n        plot.eventListenerHooks.addOnce('jqplotRightClick', handleRightClick);\n        plot.postDrawHooks.addOnce(postPlotDraw);\n        \n        \n    };\n    \n    $.jqplot.DonutRenderer.prototype.setGridData = function(plot) {\n        // set gridData property.  This will hold angle in radians of each data point.\n        var stack = [];\n        var td = [];\n        var sa = this.startAngle/180*Math.PI;\n        var tot = 0;\n        // don't know if we have any valid data yet, so set plot to not draw.\n        this._drawData = false;\n        for (var i=0; i<this.data.length; i++){\n            if (this.data[i][1] != 0) {\n                // we have data, O.K. to draw.\n                this._drawData = true;\n            }\n            stack.push(this.data[i][1]);\n            td.push([this.data[i][0]]);\n            if (i>0) {\n                stack[i] += stack[i-1];\n            }\n            tot += this.data[i][1];\n        }\n        var fact = Math.PI*2/stack[stack.length - 1];\n        \n        for (var i=0; i<stack.length; i++) {\n            td[i][1] = stack[i] * fact;\n            td[i][2] = this.data[i][1]/tot;\n        }\n        this.gridData = td;\n    };\n    \n    $.jqplot.DonutRenderer.prototype.makeGridData = function(data, plot) {\n        var stack = [];\n        var td = [];\n        var tot = 0;\n        var sa = this.startAngle/180*Math.PI;\n        // don't know if we have any valid data yet, so set plot to not draw.\n        this._drawData = false;\n        for (var i=0; i<data.length; i++){\n            if (this.data[i][1] != 0) {\n                // we have data, O.K. to draw.\n                this._drawData = true;\n            }\n            stack.push(data[i][1]);\n            td.push([data[i][0]]);\n            if (i>0) {\n                stack[i] += stack[i-1];\n            }\n            tot += data[i][1];\n        }\n        var fact = Math.PI*2/stack[stack.length - 1];\n        \n        for (var i=0; i<stack.length; i++) {\n            td[i][1] = stack[i] * fact;\n            td[i][2] = data[i][1]/tot;\n        }\n        this._totalAmount = tot;        \n        return td;\n    };\n    \n    $.jqplot.DonutRenderer.prototype.drawSlice = function (ctx, ang1, ang2, color, isShadow) {\n        var r = this._diameter / 2;\n        var ri = r - this._thickness;\n        var fill = this.fill;\n        // var lineWidth = this.lineWidth;\n        ctx.save();\n        ctx.translate(this._center[0], this._center[1]);\n        // ctx.translate(this.sliceMargin*Math.cos((ang1+ang2)/2), this.sliceMargin*Math.sin((ang1+ang2)/2));\n        \n        if (isShadow) {\n            for (var i=0; i<this.shadowDepth; i++) {\n                ctx.save();\n                ctx.translate(this.shadowOffset*Math.cos(this.shadowAngle/180*Math.PI), this.shadowOffset*Math.sin(this.shadowAngle/180*Math.PI));\n                doDraw();\n            }\n        }\n        \n        else {\n            doDraw();\n        }\n        \n        function doDraw () {\n            // Fix for IE and Chrome that can't seem to draw circles correctly.\n            // ang2 should always be <= 2 pi since that is the way the data is converted.\n             if (ang2 > 6.282 + this.startAngle) {\n                ang2 = 6.282 + this.startAngle;\n                if (ang1 > ang2) {\n                    ang1 = 6.281 + this.startAngle;\n                }\n            }\n            // Fix for IE, where it can't seem to handle 0 degree angles.  Also avoids\n            // ugly line on unfilled donuts.\n            if (ang1 >= ang2) {\n                return;\n            }\n            ctx.beginPath();  \n            ctx.fillStyle = color;\n            ctx.strokeStyle = color;\n            // ctx.lineWidth = lineWidth;\n            ctx.arc(0, 0, r, ang1, ang2, false);\n            ctx.lineTo(ri*Math.cos(ang2), ri*Math.sin(ang2));\n            ctx.arc(0,0, ri, ang2, ang1, true);\n            ctx.closePath();\n            if (fill) {\n                ctx.fill();\n            }\n            else {\n                ctx.stroke();\n            }\n        }\n        \n        if (isShadow) {\n            for (var i=0; i<this.shadowDepth; i++) {\n                ctx.restore();\n            }\n        }\n        \n        ctx.restore();\n    };\n    \n    // called with scope of series\n    $.jqplot.DonutRenderer.prototype.draw = function (ctx, gd, options, plot) {\n        var i;\n        var opts = (options != undefined) ? options : {};\n        // offset and direction of offset due to legend placement\n        var offx = 0;\n        var offy = 0;\n        var trans = 1;\n        // var colorGenerator = new this.colorGenerator(this.seriesColors);\n        if (options.legendInfo && options.legendInfo.placement == 'insideGrid') {\n            var li = options.legendInfo;\n            switch (li.location) {\n                case 'nw':\n                    offx = li.width + li.xoffset;\n                    break;\n                case 'w':\n                    offx = li.width + li.xoffset;\n                    break;\n                case 'sw':\n                    offx = li.width + li.xoffset;\n                    break;\n                case 'ne':\n                    offx = li.width + li.xoffset;\n                    trans = -1;\n                    break;\n                case 'e':\n                    offx = li.width + li.xoffset;\n                    trans = -1;\n                    break;\n                case 'se':\n                    offx = li.width + li.xoffset;\n                    trans = -1;\n                    break;\n                case 'n':\n                    offy = li.height + li.yoffset;\n                    break;\n                case 's':\n                    offy = li.height + li.yoffset;\n                    trans = -1;\n                    break;\n                default:\n                    break;\n            }\n        }\n        \n        var shadow = (opts.shadow != undefined) ? opts.shadow : this.shadow;\n        var showLine = (opts.showLine != undefined) ? opts.showLine : this.showLine;\n        var fill = (opts.fill != undefined) ? opts.fill : this.fill;\n        //see http://stackoverflow.com/questions/20221461/hidpi-retina-plot-drawing\n        var cw = parseInt(ctx.canvas.style.width);\n        var ch = parseInt(ctx.canvas.style.height);\n        var w = cw - offx - 2 * this.padding;\n        var h = ch - offy - 2 * this.padding;\n        var mindim = Math.min(w,h);\n        var d = mindim;\n        var ringmargin =  (this.ringMargin == null) ? this.sliceMargin * 2.0 : this.ringMargin;\n        \n        for (var i=0; i<this._previousSeries.length; i++) {\n            d -= 2.0 * this._previousSeries[i]._thickness + 2.0 * ringmargin;\n        }\n        this._diameter = this.diameter || d;\n        if (this.innerDiameter != null) {\n            var od = (this._numberSeries > 1 && this.index > 0) ? this._previousSeries[0]._diameter : this._diameter;\n            this._thickness = this.thickness || (od - this.innerDiameter - 2.0*ringmargin*this._numberSeries) / this._numberSeries/2.0;\n        }\n        else {\n            this._thickness = this.thickness || mindim / 2 / (this._numberSeries + 1) * 0.85;\n        }\n        if (this._diameter < 6) {\n            $.jqplot.log(\"Diameter of donut too small, not rendering.\");\n            return;\n        }\n        var r = this._radius = this._diameter/2;\n        this._innerRadius = this._radius - this._thickness;\n        var sa = this.startAngle / 180 * Math.PI;\n        this._center = [(cw - trans * offx)/2 + trans * offx, (ch - trans*offy)/2 + trans * offy];\n        \n        if (this.shadow) {\n            var shadowColor = 'rgba(0,0,0,'+this.shadowAlpha+')';\n            for (var i=0; i<gd.length; i++) {\n                var ang1 = (i == 0) ? sa : gd[i-1][1] + sa;\n                // Adjust ang1 and ang2 for sliceMargin\n                ang1 += this.sliceMargin/180*Math.PI;\n                this.renderer.drawSlice.call (this, ctx, ang1, gd[i][1]+sa, shadowColor, true);\n            }\n            \n        }\n        for (var i=0; i<gd.length; i++) {\n            var ang1 = (i == 0) ? sa : gd[i-1][1] + sa;\n            // Adjust ang1 and ang2 for sliceMargin\n            ang1 += this.sliceMargin/180*Math.PI;\n            var ang2 = gd[i][1] + sa;\n            this._sliceAngles.push([ang1, ang2]);\n            this.renderer.drawSlice.call (this, ctx, ang1, ang2, this.seriesColors[i], false);\n            \n            if (this.showDataLabels && gd[i][2]*100 >= this.dataLabelThreshold) {\n                var fstr, avgang = (ang1+ang2)/2, label;\n                \n                if (this.dataLabels == 'label') {\n                    fstr = this.dataLabelFormatString || '%s';\n                    label = $.jqplot.sprintf(fstr, gd[i][0]);\n                }\n                else if (this.dataLabels == 'value') {\n                    fstr = this.dataLabelFormatString || '%d';\n                    label = $.jqplot.sprintf(fstr, this.data[i][1]);\n                }\n                else if (this.dataLabels == 'percent') {\n                    fstr = this.dataLabelFormatString || '%d%%';\n                    label = $.jqplot.sprintf(fstr, gd[i][2]*100);\n                }\n                else if (this.dataLabels.constructor == Array) {\n                    fstr = this.dataLabelFormatString || '%s';\n                    label = $.jqplot.sprintf(fstr, this.dataLabels[i]);\n                }\n                \n                var fact = this._innerRadius + this._thickness * this.dataLabelPositionFactor + this.sliceMargin + this.dataLabelNudge;\n                \n                var x = this._center[0] + Math.cos(avgang) * fact + this.canvas._offsets.left;\n                var y = this._center[1] + Math.sin(avgang) * fact + this.canvas._offsets.top;\n                \n                var labelelem = $('<span class=\"jqplot-donut-series jqplot-data-label\" style=\"position:absolute;\">' + label + '</span>').insertBefore(plot.eventCanvas._elem);\n                x -= labelelem.width()/2;\n                y -= labelelem.height()/2;\n                x = Math.round(x);\n                y = Math.round(y);\n                labelelem.css({left: x, top: y});\n            }\n        }\n        if (this.totalLabel) {\n            var totalLabel = $('<div class=\"jqplot-data-label\" style=\"position:absolute\">' + this._totalAmount + '</div>').insertAfter(plot.eventCanvas._elem);\n            totalLabel.css({left: this._center[0], top: this._center[1]});\n        }\n    };\n    \n    $.jqplot.DonutAxisRenderer = function() {\n        $.jqplot.LinearAxisRenderer.call(this);\n    };\n    \n    $.jqplot.DonutAxisRenderer.prototype = new $.jqplot.LinearAxisRenderer();\n    $.jqplot.DonutAxisRenderer.prototype.constructor = $.jqplot.DonutAxisRenderer;\n        \n    \n    // There are no traditional axes on a donut chart.  We just need to provide\n    // dummy objects with properties so the plot will render.\n    // called with scope of axis object.\n    $.jqplot.DonutAxisRenderer.prototype.init = function(options){\n        //\n        this.tickRenderer = $.jqplot.DonutTickRenderer;\n        $.extend(true, this, options);\n        // I don't think I'm going to need _dataBounds here.\n        // have to go Axis scaling in a way to fit chart onto plot area\n        // and provide u2p and p2u functionality for mouse cursor, etc.\n        // for convienence set _dataBounds to 0 and 100 and\n        // set min/max to 0 and 100.\n        this._dataBounds = {min:0, max:100};\n        this.min = 0;\n        this.max = 100;\n        this.showTicks = false;\n        this.ticks = [];\n        this.showMark = false;\n        this.show = false; \n    };\n    \n    \n    \n    \n    $.jqplot.DonutLegendRenderer = function(){\n        $.jqplot.TableLegendRenderer.call(this);\n    };\n    \n    $.jqplot.DonutLegendRenderer.prototype = new $.jqplot.TableLegendRenderer();\n    $.jqplot.DonutLegendRenderer.prototype.constructor = $.jqplot.DonutLegendRenderer;\n    \n    /**\n     * Class: $.jqplot.DonutLegendRenderer\n     * Legend Renderer specific to donut plots.  Set by default\n     * when user creates a donut plot.\n     */\n    $.jqplot.DonutLegendRenderer.prototype.init = function(options) {\n        // Group: Properties\n        //\n        // prop: numberRows\n        // Maximum number of rows in the legend.  0 or null for unlimited.\n        this.numberRows = null;\n        // prop: numberColumns\n        // Maximum number of columns in the legend.  0 or null for unlimited.\n        this.numberColumns = null;\n        $.extend(true, this, options);\n    };\n    \n    // called with context of legend\n    $.jqplot.DonutLegendRenderer.prototype.draw = function() {\n        var legend = this;\n        if (this.show) {\n            var series = this._series;\n            var ss = 'position:absolute;';\n            ss += (this.background) ? 'background:'+this.background+';' : '';\n            ss += (this.border) ? 'border:'+this.border+';' : '';\n            ss += (this.fontSize) ? 'font-size:'+this.fontSize+';' : '';\n            ss += (this.fontFamily) ? 'font-family:'+this.fontFamily+';' : '';\n            ss += (this.textColor) ? 'color:'+this.textColor+';' : '';\n            ss += (this.marginTop != null) ? 'margin-top:'+this.marginTop+';' : '';\n            ss += (this.marginBottom != null) ? 'margin-bottom:'+this.marginBottom+';' : '';\n            ss += (this.marginLeft != null) ? 'margin-left:'+this.marginLeft+';' : '';\n            ss += (this.marginRight != null) ? 'margin-right:'+this.marginRight+';' : '';\n            this._elem = $('<table class=\"jqplot-table-legend\" style=\"'+ss+'\"></table>');\n            // Donut charts legends don't go by number of series, but by number of data points\n            // in the series.  Refactor things here for that.\n            \n            var pad = false, \n                reverse = false,\n                nr, nc;\n            var s = series[0];\n            var colorGenerator = new $.jqplot.ColorGenerator(s.seriesColors);\n            \n            if (s.show) {\n                var pd = s.data;\n                if (this.numberRows) {\n                    nr = this.numberRows;\n                    if (!this.numberColumns){\n                        nc = Math.ceil(pd.length/nr);\n                    }\n                    else{\n                        nc = this.numberColumns;\n                    }\n                }\n                else if (this.numberColumns) {\n                    nc = this.numberColumns;\n                    nr = Math.ceil(pd.length/this.numberColumns);\n                }\n                else {\n                    nr = pd.length;\n                    nc = 1;\n                }\n                \n                var i, j, tr, td1, td2, lt, rs, color;\n                var idx = 0;    \n                \n                for (i=0; i<nr; i++) {\n                    if (reverse){\n                        tr = $('<tr class=\"jqplot-table-legend\"></tr>').prependTo(this._elem);\n                    }\n                    else{\n                        tr = $('<tr class=\"jqplot-table-legend\"></tr>').appendTo(this._elem);\n                    }\n                    for (j=0; j<nc; j++) {\n                        if (idx < pd.length){\n                            lt = this.labels[idx] || pd[idx][0].toString();\n                            color = colorGenerator.next();\n                            if (!reverse){\n                                if (i>0){\n                                    pad = true;\n                                }\n                                else{\n                                    pad = false;\n                                }\n                            }\n                            else{\n                                if (i == nr -1){\n                                    pad = false;\n                                }\n                                else{\n                                    pad = true;\n                                }\n                            }\n                            rs = (pad) ? this.rowSpacing : '0';\n                \n                            td1 = $('<td class=\"jqplot-table-legend\" style=\"text-align:center;padding-top:'+rs+';\">'+\n                                '<div><div class=\"jqplot-table-legend-swatch\" style=\"border-color:'+color+';\"></div>'+\n                                '</div></td>');\n                            td2 = $('<td class=\"jqplot-table-legend\" style=\"padding-top:'+rs+';\"></td>');\n                            if (this.escapeHtml){\n                                td2.text(lt);\n                            }\n                            else {\n                                td2.html(lt);\n                            }\n                            if (reverse) {\n                                td2.prependTo(tr);\n                                td1.prependTo(tr);\n                            }\n                            else {\n                                td1.appendTo(tr);\n                                td2.appendTo(tr);\n                            }\n                            pad = true;\n                        }\n                        idx++;\n                    }   \n                }\n            }\n        }\n        return this._elem;                \n    };\n    \n    // setup default renderers for axes and legend so user doesn't have to\n    // called with scope of plot\n    function preInit(target, data, options) {\n        options = options || {};\n        options.axesDefaults = options.axesDefaults || {};\n        options.legend = options.legend || {};\n        options.seriesDefaults = options.seriesDefaults || {};\n        // only set these if there is a donut series\n        var setopts = false;\n        if (options.seriesDefaults.renderer == $.jqplot.DonutRenderer) {\n            setopts = true;\n        }\n        else if (options.series) {\n            for (var i=0; i < options.series.length; i++) {\n                if (options.series[i].renderer == $.jqplot.DonutRenderer) {\n                    setopts = true;\n                }\n            }\n        }\n        \n        if (setopts) {\n            options.axesDefaults.renderer = $.jqplot.DonutAxisRenderer;\n            options.legend.renderer = $.jqplot.DonutLegendRenderer;\n            options.legend.preDraw = true;\n            options.seriesDefaults.pointLabels = {show: false};\n        }\n    }\n    \n    // called with scope of plot.\n    function postInit(target, data, options) {\n        // if multiple series, add a reference to the previous one so that\n        // donut rings can nest.\n        for (var i=1; i<this.series.length; i++) {\n            if (!this.series[i]._previousSeries.length){\n                for (var j=0; j<i; j++) {\n                    if (this.series[i].renderer.constructor == $.jqplot.DonutRenderer && this.series[j].renderer.constructor == $.jqplot.DonutRenderer) {\n                        this.series[i]._previousSeries.push(this.series[j]);\n                    }\n                }\n            }\n        }\n        for (i=0; i<this.series.length; i++) {\n            if (this.series[i].renderer.constructor == $.jqplot.DonutRenderer) {\n                this.series[i]._numberSeries = this.series.length;\n                // don't allow mouseover and mousedown at same time.\n                if (this.series[i].highlightMouseOver) {\n                    this.series[i].highlightMouseDown = false;\n                }\n            }\n        }\n    }\n    \n    var postParseOptionsRun = false;\n    // called with scope of plot\n    function postParseOptions(options) {\n        for (var i=0; i<this.series.length; i++) {\n            this.series[i].seriesColors = this.seriesColors;\n            this.series[i].colorGenerator = $.jqplot.colorGenerator;\n        }\n    }\n    \n    function highlight (plot, sidx, pidx) {\n        var s = plot.series[sidx];\n        var canvas = plot.plugins.donutRenderer.highlightCanvas;\n        canvas._ctx.clearRect(0,0,canvas._ctx.canvas.width, canvas._ctx.canvas.height);\n        s._highlightedPoint = pidx;\n        plot.plugins.donutRenderer.highlightedSeriesIndex = sidx;\n        s.renderer.drawSlice.call(s, canvas._ctx, s._sliceAngles[pidx][0], s._sliceAngles[pidx][1], s.highlightColors[pidx], false);\n    }\n    \n    function unhighlight (plot) {\n        var canvas = plot.plugins.donutRenderer.highlightCanvas;\n        canvas._ctx.clearRect(0,0, canvas._ctx.canvas.width, canvas._ctx.canvas.height);\n        for (var i=0; i<plot.series.length; i++) {\n            plot.series[i]._highlightedPoint = null;\n        }\n        plot.plugins.donutRenderer.highlightedSeriesIndex = null;\n        plot.target.trigger('jqplotDataUnhighlight');\n    }\n \n    function handleMove(ev, gridpos, datapos, neighbor, plot) {\n        if (neighbor) {\n            var ins = [neighbor.seriesIndex, neighbor.pointIndex, neighbor.data];\n            var evt1 = jQuery.Event('jqplotDataMouseOver');\n            evt1.pageX = ev.pageX;\n            evt1.pageY = ev.pageY;\n            plot.target.trigger(evt1, ins);\n            if (plot.series[ins[0]].highlightMouseOver && !(ins[0] == plot.plugins.donutRenderer.highlightedSeriesIndex && ins[1] == plot.series[ins[0]]._highlightedPoint)) {\n                var evt = jQuery.Event('jqplotDataHighlight');\n                evt.which = ev.which;\n                evt.pageX = ev.pageX;\n                evt.pageY = ev.pageY;\n                plot.target.trigger(evt, ins);\n                highlight (plot, ins[0], ins[1]);\n            }\n        }\n        else if (neighbor == null) {\n            unhighlight (plot);\n        }\n    } \n    \n    function handleMouseDown(ev, gridpos, datapos, neighbor, plot) {\n        if (neighbor) {\n            var ins = [neighbor.seriesIndex, neighbor.pointIndex, neighbor.data];\n            if (plot.series[ins[0]].highlightMouseDown && !(ins[0] == plot.plugins.donutRenderer.highlightedSeriesIndex && ins[1] == plot.series[ins[0]]._highlightedPoint)) {\n                var evt = jQuery.Event('jqplotDataHighlight');\n                evt.which = ev.which;\n                evt.pageX = ev.pageX;\n                evt.pageY = ev.pageY;\n                plot.target.trigger(evt, ins);\n                highlight (plot, ins[0], ins[1]);\n            }\n        }\n        else if (neighbor == null) {\n            unhighlight (plot);\n        }\n    }\n    \n    function handleMouseUp(ev, gridpos, datapos, neighbor, plot) {\n        var idx = plot.plugins.donutRenderer.highlightedSeriesIndex;\n        if (idx != null && plot.series[idx].highlightMouseDown) {\n            unhighlight(plot);\n        }\n    }\n    \n    function handleClick(ev, gridpos, datapos, neighbor, plot) {\n        if (neighbor) {\n            var ins = [neighbor.seriesIndex, neighbor.pointIndex, neighbor.data];\n            var evt = jQuery.Event('jqplotDataClick');\n            evt.which = ev.which;\n            evt.pageX = ev.pageX;\n            evt.pageY = ev.pageY;\n            plot.target.trigger(evt, ins);\n        }\n    }\n    \n    function handleRightClick(ev, gridpos, datapos, neighbor, plot) {\n        if (neighbor) {\n            var ins = [neighbor.seriesIndex, neighbor.pointIndex, neighbor.data];\n            var idx = plot.plugins.donutRenderer.highlightedSeriesIndex;\n            if (idx != null && plot.series[idx].highlightMouseDown) {\n                unhighlight(plot);\n            }\n            var evt = jQuery.Event('jqplotDataRightClick');\n            evt.which = ev.which;\n            evt.pageX = ev.pageX;\n            evt.pageY = ev.pageY;\n            plot.target.trigger(evt, ins);\n        }\n    }    \n    \n    // called within context of plot\n    // create a canvas which we can draw on.\n    // insert it before the eventCanvas, so eventCanvas will still capture events.\n    function postPlotDraw() {\n        // Memory Leaks patch    \n        if (this.plugins.donutRenderer && this.plugins.donutRenderer.highlightCanvas) {\n            this.plugins.donutRenderer.highlightCanvas.resetCanvas();\n            this.plugins.donutRenderer.highlightCanvas = null;\n        }\n\n        this.plugins.donutRenderer = {highlightedSeriesIndex:null};\n        this.plugins.donutRenderer.highlightCanvas = new $.jqplot.GenericCanvas();\n        // do we have any data labels?  if so, put highlight canvas before those\n        // Fix for broken jquery :first selector with canvas (VML) elements.\n        var labels = $(this.targetId+' .jqplot-data-label');\n        if (labels.length) {\n            $(labels[0]).before(this.plugins.donutRenderer.highlightCanvas.createElement(this._gridPadding, 'jqplot-donutRenderer-highlight-canvas', this._plotDimensions, this));\n        }\n        // else put highlight canvas before event canvas.\n        else {\n            this.eventCanvas._elem.before(this.plugins.donutRenderer.highlightCanvas.createElement(this._gridPadding, 'jqplot-donutRenderer-highlight-canvas', this._plotDimensions, this));\n        }\n        var hctx = this.plugins.donutRenderer.highlightCanvas.setContext();\n        this.eventCanvas._elem.bind('mouseleave', {plot:this}, function (ev) { unhighlight(ev.data.plot); });\n    }\n    \n    $.jqplot.preInitHooks.push(preInit);\n    \n    $.jqplot.DonutTickRenderer = function() {\n        $.jqplot.AxisTickRenderer.call(this);\n    };\n    \n    $.jqplot.DonutTickRenderer.prototype = new $.jqplot.AxisTickRenderer();\n    $.jqplot.DonutTickRenderer.prototype.constructor = $.jqplot.DonutTickRenderer;\n    \n})(jQuery);\n    \n    \n"
  },
  {
    "path": "stenogotchi/ui/web/static/js/plugins/jqplot.dragable.js",
    "content": "/**\n * jqPlot\n * Pure JavaScript plotting plugin using jQuery\n *\n * Version: 1.0.9\n * Revision: d96a669\n *\n * Copyright (c) 2009-2016 Chris Leonello\n * jqPlot is currently available for use in all personal or commercial projects \n * under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL \n * version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can \n * choose the license that best suits your project and use it accordingly. \n *\n * Although not required, the author would appreciate an email letting him \n * know of any substantial use of jqPlot.  You can reach the author at: \n * chris at jqplot dot com or see http://www.jqplot.com/info.php .\n *\n * If you are feeling kind and generous, consider supporting the project by\n * making a donation at: http://www.jqplot.com/donate.php .\n *\n * sprintf functions contained in jqplot.sprintf.js by Ash Searle:\n *\n *     version 2007.04.27\n *     author Ash Searle\n *     http://hexmen.com/blog/2007/03/printf-sprintf/\n *     http://hexmen.com/js/sprintf.js\n *     The author (Ash Searle) has placed this code in the public domain:\n *     \"This code is unrestricted: you are free to use it however you like.\"\n * \n */\n(function($) {\n    \n    /**\n     * Class: $.jqplot.Dragable\n     * Plugin to make plotted points dragable by the user.\n     */\n    $.jqplot.Dragable = function(options) {\n        // Group: Properties\n        this.markerRenderer = new $.jqplot.MarkerRenderer({shadow:false});\n        this.shapeRenderer = new $.jqplot.ShapeRenderer();\n        this.isDragging = false;\n        this.isOver = false;\n        this._ctx;\n        this._elem;\n        this._point;\n        this._gridData;\n        // prop: color\n        // CSS color spec for the dragged point (and adjacent line segment or bar).\n        this.color;\n        // prop: constrainTo\n        // Constrain dragging motion to an axis or to none.\n        // Allowable values are 'none', 'x', 'y'\n        this.constrainTo = 'none';  // 'x', 'y', or 'none';\n        $.extend(true, this, options);\n    };\n    \n    function DragCanvas() {\n        $.jqplot.GenericCanvas.call(this);\n        this.isDragging = false;\n        this.isOver = false;\n        this._neighbor;\n        this._cursors = [];\n    }\n    \n    DragCanvas.prototype = new $.jqplot.GenericCanvas();\n    DragCanvas.prototype.constructor = DragCanvas;\n    \n    \n    // called within scope of series\n    $.jqplot.Dragable.parseOptions = function (defaults, opts) {\n        var options = opts || {};\n        this.plugins.dragable = new $.jqplot.Dragable(options.dragable);\n        // since this function is called before series options are parsed,\n        // we can set this here and it will be overridden if needed.\n        this.isDragable = $.jqplot.config.enablePlugins;\n    };\n    \n    // called within context of plot\n    // create a canvas which we can draw on.\n    // insert it before the eventCanvas, so eventCanvas will still capture events.\n    // add a new DragCanvas object to the plot plugins to handle drawing on this new canvas.\n    $.jqplot.Dragable.postPlotDraw = function() {\n        // Memory Leaks patch    \n        if (this.plugins.dragable && this.plugins.dragable.highlightCanvas) {\n            this.plugins.dragable.highlightCanvas.resetCanvas();\n            this.plugins.dragable.highlightCanvas = null;\n        }\n\n        this.plugins.dragable = {previousCursor:'auto', isOver:false};\n        this.plugins.dragable.dragCanvas = new DragCanvas();\n        \n        this.eventCanvas._elem.before(this.plugins.dragable.dragCanvas.createElement(this._gridPadding, 'jqplot-dragable-canvas', this._plotDimensions, this));\n        var dctx = this.plugins.dragable.dragCanvas.setContext();\n    };\n    \n    //$.jqplot.preInitHooks.push($.jqplot.Dragable.init);\n    $.jqplot.preParseSeriesOptionsHooks.push($.jqplot.Dragable.parseOptions);\n    $.jqplot.postDrawHooks.push($.jqplot.Dragable.postPlotDraw);\n    $.jqplot.eventListenerHooks.push(['jqplotMouseMove', handleMove]);\n    $.jqplot.eventListenerHooks.push(['jqplotMouseDown', handleDown]);\n    $.jqplot.eventListenerHooks.push(['jqplotMouseUp', handleUp]);\n\n    \n    function initDragPoint(plot, neighbor) {\n        var s = plot.series[neighbor.seriesIndex];\n        var drag = s.plugins.dragable;\n        \n        // first, init the mark renderer for the dragged point\n        var smr = s.markerRenderer;\n        var mr = drag.markerRenderer;\n        mr.style = smr.style;\n        mr.lineWidth = smr.lineWidth + 2.5;\n        mr.size = smr.size + 5;\n        if (!drag.color) {\n            var rgba = $.jqplot.getColorComponents(smr.color);\n            var newrgb = [rgba[0], rgba[1], rgba[2]];\n            var alpha = (rgba[3] >= 0.6) ? rgba[3]*0.6 : rgba[3]*(2-rgba[3]);\n            drag.color = 'rgba('+newrgb[0]+','+newrgb[1]+','+newrgb[2]+','+alpha+')';\n        }\n        mr.color = drag.color;\n        mr.init();\n\n        var start = (neighbor.pointIndex > 0) ? neighbor.pointIndex - 1 : 0;\n        var end = neighbor.pointIndex+2;\n        drag._gridData = s.gridData.slice(start, end);\n    }\n    \n    function handleMove(ev, gridpos, datapos, neighbor, plot) {\n        if (plot.plugins.dragable.dragCanvas.isDragging) {\n            var dc = plot.plugins.dragable.dragCanvas;\n            var dp = dc._neighbor;\n            var s = plot.series[dp.seriesIndex];\n            var drag = s.plugins.dragable;\n            var gd = s.gridData;\n            \n            // compute the new grid position with any constraints.\n            var x = (drag.constrainTo == 'y') ? dp.gridData[0] : gridpos.x;\n            var y = (drag.constrainTo == 'x') ? dp.gridData[1] : gridpos.y;\n            \n            // compute data values for any listeners.\n            var xu = s._xaxis.series_p2u(x);\n            var yu = s._yaxis.series_p2u(y);\n            \n            // clear the canvas then redraw effect at new position.\n            var ctx = dc._ctx;\n            ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height);\n            \n            // adjust our gridData for the new mouse position\n            if (dp.pointIndex > 0) {\n                drag._gridData[1] = [x, y];\n            }\n            else {\n                drag._gridData[0] = [x, y];\n            }\n            plot.series[dp.seriesIndex].draw(dc._ctx, {gridData:drag._gridData, shadow:false, preventJqPlotSeriesDrawTrigger:true, color:drag.color, markerOptions:{color:drag.color, shadow:false}, trendline:{show:false}});\n            plot.target.trigger('jqplotSeriesPointChange', [dp.seriesIndex, dp.pointIndex, [xu,yu], [x,y]]);\n        }\n        else if (neighbor != null) {\n            var series = plot.series[neighbor.seriesIndex];\n            if (series.isDragable) {\n                var dc = plot.plugins.dragable.dragCanvas;\n                if (!dc.isOver) {\n                    dc._cursors.push(ev.target.style.cursor);\n                    ev.target.style.cursor = \"pointer\";\n                }\n                dc.isOver = true;\n            }\n        }\n        else if (neighbor == null) {\n            var dc = plot.plugins.dragable.dragCanvas;\n            if (dc.isOver) {\n                ev.target.style.cursor = dc._cursors.pop();\n                dc.isOver = false;\n            }\n        }\n    }\n    \n    function handleDown(ev, gridpos, datapos, neighbor, plot) {\n        var dc = plot.plugins.dragable.dragCanvas;\n        dc._cursors.push(ev.target.style.cursor);\n        if (neighbor != null) {\n            var s = plot.series[neighbor.seriesIndex];\n            var drag = s.plugins.dragable;\n            if (s.isDragable && !dc.isDragging) {\n                dc._neighbor = neighbor;\n                dc.isDragging = true;\n                initDragPoint(plot, neighbor);\n                drag.markerRenderer.draw(s.gridData[neighbor.pointIndex][0], s.gridData[neighbor.pointIndex][1], dc._ctx);\n                ev.target.style.cursor = \"move\";\n                plot.target.trigger('jqplotDragStart', [neighbor.seriesIndex, neighbor.pointIndex, gridpos, datapos]);\n            }\n        }\n        // Just in case of a hickup, we'll clear the drag canvas and reset.\n        else {\n           var ctx = dc._ctx;\n           ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height);\n           dc.isDragging = false;\n        }\n    }\n    \n    function handleUp(ev, gridpos, datapos, neighbor, plot) {\n        if (plot.plugins.dragable.dragCanvas.isDragging) {\n            var dc = plot.plugins.dragable.dragCanvas;\n            // clear the canvas\n            var ctx = dc._ctx;\n            ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height);\n            dc.isDragging = false;\n            // redraw the series canvas at the new point.\n            var dp = dc._neighbor;\n            var s = plot.series[dp.seriesIndex];\n            var drag = s.plugins.dragable;\n            // compute the new grid position with any constraints.\n            var x = (drag.constrainTo == 'y') ? dp.data[0] : datapos[s.xaxis];\n            var y = (drag.constrainTo == 'x') ? dp.data[1] : datapos[s.yaxis];\n            // var x = datapos[s.xaxis];\n            // var y = datapos[s.yaxis];\n            s.data[dp.pointIndex][0] = x;\n            s.data[dp.pointIndex][1] = y;\n            plot.drawSeries({preventJqPlotSeriesDrawTrigger:true}, dp.seriesIndex);\n            dc._neighbor = null;\n            ev.target.style.cursor = dc._cursors.pop();\n            plot.target.trigger('jqplotDragStop', [gridpos, datapos]);\n        }\n    }\n})(jQuery);"
  },
  {
    "path": "stenogotchi/ui/web/static/js/plugins/jqplot.enhancedLegendRenderer.js",
    "content": "/**\n * jqPlot\n * Pure JavaScript plotting plugin using jQuery\n *\n * Version: 1.0.9\n * Revision: d96a669\n *\n * Copyright (c) 2009-2016 Chris Leonello\n * jqPlot is currently available for use in all personal or commercial projects \n * under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL \n * version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can \n * choose the license that best suits your project and use it accordingly. \n *\n * Although not required, the author would appreciate an email letting him \n * know of any substantial use of jqPlot.  You can reach the author at: \n * chris at jqplot dot com or see http://www.jqplot.com/info.php .\n *\n * If you are feeling kind and generous, consider supporting the project by\n * making a donation at: http://www.jqplot.com/donate.php .\n *\n * sprintf functions contained in jqplot.sprintf.js by Ash Searle:\n *\n *     version 2007.04.27\n *     author Ash Searle\n *     http://hexmen.com/blog/2007/03/printf-sprintf/\n *     http://hexmen.com/js/sprintf.js\n *     The author (Ash Searle) has placed this code in the public domain:\n *     \"This code is unrestricted: you are free to use it however you like.\"\n * \n */\n(function($) {\n    // class $.jqplot.EnhancedLegendRenderer\n    // Legend renderer which can specify the number of rows and/or columns in the legend.\n    $.jqplot.EnhancedLegendRenderer = function(){\n        $.jqplot.TableLegendRenderer.call(this);\n    };\n    \n    $.jqplot.EnhancedLegendRenderer.prototype = new $.jqplot.TableLegendRenderer();\n    $.jqplot.EnhancedLegendRenderer.prototype.constructor = $.jqplot.EnhancedLegendRenderer;\n    \n    // called with scope of legend.\n    $.jqplot.EnhancedLegendRenderer.prototype.init = function(options) {\n        // prop: numberRows\n        // Maximum number of rows in the legend.  0 or null for unlimited.\n        this.numberRows = null;\n        // prop: numberColumns\n        // Maximum number of columns in the legend.  0 or null for unlimited.\n        this.numberColumns = null;\n        // prop: seriesToggle\n        // false to not enable series on/off toggling on the legend.\n        // true or a fadein/fadeout speed (number of milliseconds or 'fast', 'normal', 'slow') \n        // to enable show/hide of series on click of legend item.\n        this.seriesToggle = 'normal';\n        // prop: seriesToggleReplot\n        // True to replot the chart after toggling series on/off.\n        // This will set the series show property to false.\n        // This allows for rescaling or other maniplation of chart.\n        // Set to an options object (e.g. {resetAxes: true}) for replot options.\n        this.seriesToggleReplot = false;\n        // prop: disableIEFading\n        // true to toggle series with a show/hide method only and not allow fading in/out.  \n        // This is to overcome poor performance of fade in some versions of IE.\n        this.disableIEFading = true;\n        $.extend(true, this, options);\n        \n        if (this.seriesToggle) {\n            $.jqplot.postDrawHooks.push(postDraw);\n        }\n    };\n    \n    // called with scope of legend\n    $.jqplot.EnhancedLegendRenderer.prototype.draw = function(offsets, plot) {\n        var legend = this;\n        if (this.show) {\n            var series = this._series;\n            var s;\n            var ss = 'position:absolute;';\n            ss += (this.background) ? 'background:'+this.background+';' : '';\n            ss += (this.border) ? 'border:'+this.border+';' : '';\n            ss += (this.fontSize) ? 'font-size:'+this.fontSize+';' : '';\n            ss += (this.fontFamily) ? 'font-family:'+this.fontFamily+';' : '';\n            ss += (this.textColor) ? 'color:'+this.textColor+';' : '';\n            ss += (this.marginTop != null) ? 'margin-top:'+this.marginTop+';' : '';\n            ss += (this.marginBottom != null) ? 'margin-bottom:'+this.marginBottom+';' : '';\n            ss += (this.marginLeft != null) ? 'margin-left:'+this.marginLeft+';' : '';\n            ss += (this.marginRight != null) ? 'margin-right:'+this.marginRight+';' : '';\n            this._elem = $('<table class=\"jqplot-table-legend\" style=\"'+ss+'\"></table>');\n            if (this.seriesToggle) {\n                this._elem.css('z-index', '3');\n            }\n        \n            var pad = false, \n                reverse = false,\n                nr, nc;\n            if (this.numberRows) {\n                nr = this.numberRows;\n                if (!this.numberColumns){\n                    nc = Math.ceil(series.length/nr);\n                }\n                else{\n                    nc = this.numberColumns;\n                }\n            }\n            else if (this.numberColumns) {\n                nc = this.numberColumns;\n                nr = Math.ceil(series.length/this.numberColumns);\n            }\n            else {\n                nr = series.length;\n                nc = 1;\n            }\n                \n            var i, j, tr, td1, td2, lt, rs, div, div0, div1;\n            var idx = 0;\n            // check to see if we need to reverse\n            for (i=series.length-1; i>=0; i--) {\n                if (nc == 1 && series[i]._stack || series[i].renderer.constructor == $.jqplot.BezierCurveRenderer){\n                    reverse = true;\n                }\n            }    \n                \n            for (i=0; i<nr; i++) {\n                tr = $(document.createElement('tr'));\n                tr.addClass('jqplot-table-legend');\n                if (reverse){\n                    tr.prependTo(this._elem);\n                }\n                else{\n                    tr.appendTo(this._elem);\n                }\n                for (j=0; j<nc; j++) {\n                    if (idx < series.length && (series[idx].show || series[idx].showLabel)){\n                        s = series[idx];\n                        lt = this.labels[idx] || s.label.toString();\n                        if (lt) {\n                            var color = s.color;\n                            if (!reverse){\n                                if (i>0){\n                                    pad = true;\n                                }\n                                else{\n                                    pad = false;\n                                }\n                            }\n                            else{\n                                if (i == nr -1){\n                                    pad = false;\n                                }\n                                else{\n                                    pad = true;\n                                }\n                            }\n                            rs = (pad) ? this.rowSpacing : '0';\n\n                            td1 = $(document.createElement('td'));\n                            td1.addClass('jqplot-table-legend jqplot-table-legend-swatch');\n                            td1.css({textAlign: 'center', paddingTop: rs});\n\n                            div0 = $(document.createElement('div'));\n                            div0.addClass('jqplot-table-legend-swatch-outline');\n                            div1 = $(document.createElement('div'));\n                            div1.addClass('jqplot-table-legend-swatch');\n                            div1.css({backgroundColor: color, borderColor: color});\n\n                            td1.append(div0.append(div1));\n\n                            td2 = $(document.createElement('td'));\n                            td2.addClass('jqplot-table-legend jqplot-table-legend-label');\n                            td2.css('paddingTop', rs);\n                    \n                            // td1 = $('<td class=\"jqplot-table-legend\" style=\"text-align:center;padding-top:'+rs+';\">'+\n                            //     '<div><div class=\"jqplot-table-legend-swatch\" style=\"background-color:'+color+';border-color:'+color+';\"></div>'+\n                            //     '</div></td>');\n                            // td2 = $('<td class=\"jqplot-table-legend\" style=\"padding-top:'+rs+';\"></td>');\n                            if (this.escapeHtml){\n                                td2.text(lt);\n                            }\n                            else {\n                                td2.html(lt);\n                            }\n                            if (reverse) {\n                                if (this.showLabels) {td2.prependTo(tr);}\n                                if (this.showSwatches) {td1.prependTo(tr);}\n                            }\n                            else {\n                                if (this.showSwatches) {td1.appendTo(tr);}\n                                if (this.showLabels) {td2.appendTo(tr);}\n                            }\n                            \n                            if (this.seriesToggle) {\n\n                                // add an overlay for clicking series on/off\n                                // div0 = $(document.createElement('div'));\n                                // div0.addClass('jqplot-table-legend-overlay');\n                                // div0.css({position:'relative', left:0, top:0, height:'100%', width:'100%'});\n                                // tr.append(div0);\n\n                                var speed;\n                                if (typeof(this.seriesToggle) === 'string' || typeof(this.seriesToggle) === 'number') {\n                                    if (!$.jqplot.use_excanvas || !this.disableIEFading) {\n                                        speed = this.seriesToggle;\n                                    }\n                                } \n                                if (this.showSwatches) {\n                                    td1.bind('click', {series:s, speed:speed, plot: plot, replot:this.seriesToggleReplot}, handleToggle);\n                                    td1.addClass('jqplot-seriesToggle');\n                                }\n                                if (this.showLabels)  {\n                                    td2.bind('click', {series:s, speed:speed, plot: plot, replot:this.seriesToggleReplot}, handleToggle);\n                                    td2.addClass('jqplot-seriesToggle');\n                                }\n\n                                // for series that are already hidden, add the hidden class\n                                if (!s.show && s.showLabel) {\n                                    td1.addClass('jqplot-series-hidden');\n                                    td2.addClass('jqplot-series-hidden');\n                                }\n                            }\n                            \n                            pad = true;\n                        }\n                    }\n                    idx++;\n                }\n                \n                td1 = td2 = div0 = div1 = null;   \n            }\n        }\n        return this._elem;\n    };\n\n    var handleToggle = function (ev) {\n        var d = ev.data,\n            s = d.series,\n            replot = d.replot,\n            plot = d.plot,\n            speed = d.speed,\n            sidx = s.index,\n            showing = false;\n\n        if (s.canvas._elem.is(':hidden') || !s.show) {\n            showing = true;\n        }\n\n        var doLegendToggle = function() {\n\n            if (replot) {\n                var opts = {};\n\n                if ($.isPlainObject(replot)) {\n                    $.extend(true, opts, replot);\n                }\n\n                plot.replot(opts);\n                // if showing, there was no canvas element to fade in, so hide here\n                // and then do a fade in.\n                if (showing && speed) {\n                    var s = plot.series[sidx];\n\n                    if (s.shadowCanvas._elem) {\n                        s.shadowCanvas._elem.hide().fadeIn(speed);\n                    }\n                    s.canvas._elem.hide().fadeIn(speed);\n                    s.canvas._elem.nextAll('.jqplot-point-label.jqplot-series-'+s.index).hide().fadeIn(speed);\n                }\n\n            }\n\n            else {\n                var s = plot.series[sidx];\n\n                if (s.canvas._elem.is(':hidden') || !s.show) {\n                    // Not sure if there is a better way to check for showSwatches and showLabels === true.\n                    // Test for \"undefined\" since default values for both showSwatches and showLables is true.\n                    if (typeof plot.options.legend.showSwatches === 'undefined' || plot.options.legend.showSwatches === true) {\n                        plot.legend._elem.find('td').eq(sidx * 2).addClass('jqplot-series-hidden');\n                    }\n                    if (typeof plot.options.legend.showLabels === 'undefined' || plot.options.legend.showLabels === true) {\n                        plot.legend._elem.find('td').eq((sidx * 2) + 1).addClass('jqplot-series-hidden');\n                    }\n                }\n                else {\n                    if (typeof plot.options.legend.showSwatches === 'undefined' || plot.options.legend.showSwatches === true) {\n                        plot.legend._elem.find('td').eq(sidx * 2).removeClass('jqplot-series-hidden');\n                    }\n                    if (typeof plot.options.legend.showLabels === 'undefined' || plot.options.legend.showLabels === true) {\n                        plot.legend._elem.find('td').eq((sidx * 2) + 1).removeClass('jqplot-series-hidden');\n                    }\n                }\n\n            }\n\n        };\n\n        s.toggleDisplay(ev, doLegendToggle);\n    };\n    \n    // called with scope of plot.\n    var postDraw = function () {\n        if (this.legend.renderer.constructor == $.jqplot.EnhancedLegendRenderer && this.legend.seriesToggle){\n            var e = this.legend._elem.detach();\n            this.eventCanvas._elem.after(e);\n        }\n    };\n})(jQuery);\n"
  },
  {
    "path": "stenogotchi/ui/web/static/js/plugins/jqplot.enhancedPieLegendRenderer.js",
    "content": "/**\n * jqPlot\n * Pure JavaScript plotting plugin using jQuery\n *\n * Version: 1.0.9\n * Revision: d96a669\n *\n * Copyright (c) 2009-2016 Chris Leonello\n * jqPlot is currently available for use in all personal or commercial projects \n * under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL \n * version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can \n * choose the license that best suits your project and use it accordingly. \n *\n * Although not required, the author would appreciate an email letting him \n * know of any substantial use of jqPlot.  You can reach the author at: \n * chris at jqplot dot com or see http://www.jqplot.com/info.php .\n *\n * If you are feeling kind and generous, consider supporting the project by\n * making a donation at: http://www.jqplot.com/donate.php .\n *\n * sprintf functions contained in jqplot.sprintf.js by Ash Searle:\n *\n *     version 2007.04.27\n *     author Ash Searle\n *     http://hexmen.com/blog/2007/03/printf-sprintf/\n *     http://hexmen.com/js/sprintf.js\n *     The author (Ash Searle) has placed this code in the public domain:\n *     \"This code is unrestricted: you are free to use it however you like.\"\n * \n */\n(function($) {\n    // class $.jqplot.EnhancedPieLegendRenderer\n    // Legend renderer which can specify the number of rows and/or columns in the legend\n    // Similar to EnhancedLegendRenderer, but for pie charts\n    $.jqplot.EnhancedPieLegendRenderer = function(){\n        $.jqplot.TableLegendRenderer.call(this);\n    };\n    \n    $.jqplot.EnhancedPieLegendRenderer.prototype = new $.jqplot.TableLegendRenderer();\n    $.jqplot.EnhancedPieLegendRenderer.prototype.constructor = $.jqplot.EnhancedPieLegendRenderer;\n    \n    // called with scope of legend.\n    $.jqplot.EnhancedPieLegendRenderer.prototype.init = function(options) {\n        // prop: numberRows\n        // Maximum number of rows in the legend.  0 or null for unlimited.\n        this.numberRows = null;\n        // prop: numberColumns\n        // Maximum number of columns in the legend.  0 or null for unlimited.\n        this.numberColumns = null;\n        // prop: seriesToggle\n        // false to not enable series on/off toggling on the legend.\n        // true or a fadein/fadeout speed (number of milliseconds or 'fast', 'normal', 'slow') \n        // to enable show/hide of series on click of legend item.\n        this.seriesToggle = 'normal';\n        // prop: seriesToggleReplot\n        // True to replot the chart after toggling series on/off.\n        // This will set the series show property to false.\n        // This allows for rescaling or other maniplation of chart.\n        // Set to an options object (e.g. {resetAxes: true}) for replot options.\n        this.seriesToggleReplot = false;\n        // prop: disableIEFading\n        // true to toggle series with a show/hide method only and not allow fading in/out.  \n        // This is to overcome poor performance of fade in some versions of IE.\n        this.disableIEFading = true;\n        // prop: toolTips\n        // optional array of toolTip text corresponding to each pie slice\n        this.toolTips = [];\n        $.extend(true, this, options);\n        \n        if (this.seriesToggle) {\n            $.jqplot.postDrawHooks.push(postDraw);\n        }\n    };\n    \n    // called with scope of legend\n    $.jqplot.EnhancedPieLegendRenderer.prototype.draw = function(offsets, plot) {\n        var legend = this;\n        if (this.show) {\n            var series = this._series;\n            var s;\n            var ss = 'position:absolute;';\n            ss += (this.background) ? 'background:'+this.background+';' : '';\n            ss += (this.border) ? 'border:'+this.border+';' : '';\n            ss += (this.fontSize) ? 'font-size:'+this.fontSize+';' : '';\n            ss += (this.fontFamily) ? 'font-family:'+this.fontFamily+';' : '';\n            ss += (this.textColor) ? 'color:'+this.textColor+';' : '';\n            ss += (this.marginTop != null) ? 'margin-top:'+this.marginTop+';' : '';\n            ss += (this.marginBottom != null) ? 'margin-bottom:'+this.marginBottom+';' : '';\n            ss += (this.marginLeft != null) ? 'margin-left:'+this.marginLeft+';' : '';\n            ss += (this.marginRight != null) ? 'margin-right:'+this.marginRight+';' : '';\n            this._elem = $('<table class=\"jqplot-table-legend\" style=\"'+ss+'\"></table>');\n            if (this.seriesToggle) {\n                this._elem.css('z-index', '3');\n            }\n        \n            var pad = false, \n                reverse = false,\n                nr, nc;\n            var s = series[0];\n            var slen = s.data.length;\n            var colorGenerator = new $.jqplot.ColorGenerator(s.seriesColors);\n\n            if (this.numberRows) {\n                nr = this.numberRows;\n                if (!this.numberColumns){\n                    nc = Math.ceil(slen/nr);\n                }\n                else{\n                    nc = this.numberColumns;\n                }\n            }\n            else if (this.numberColumns) {\n                nc = this.numberColumns;\n                nr = Math.ceil(slen/this.numberColumns);\n            }\n            else {\n                nr = slen;\n                nc = 1;\n            }\n                \n            var i, j, tr, td1, td2, lt, rs, div, div0, div1;\n            var idx = 0;\n            // check to see if we need to reverse\n            for (i=series.length-1; i>=0; i--) {\n                if (nc == 1 && series[i]._stack || series[i].renderer.constructor == $.jqplot.BezierCurveRenderer){\n                    reverse = true;\n                }\n            }    \n                \n            for (i=0; i<nr; i++) {\n                tr = $(document.createElement('tr'));\n                tr.addClass('jqplot-table-legend');\n                if (reverse){\n                    tr.prependTo(this._elem);\n                }\n                else{\n                    tr.appendTo(this._elem);\n                }\n                for (j=0; j<nc; j++) {\n                    if (idx < slen){\n                        lt = this.labels[idx] || s.data[idx][0].toString();\n                        tt = this.toolTips[idx];\n                        if (lt) {\n                            var color = colorGenerator.next();\n                            if (!reverse){\n                                if (i>0){\n                                    pad = true;\n                                }\n                                else{\n                                    pad = false;\n                                }\n                            }\n                            else{\n                                if (i == nr -1){\n                                    pad = false;\n                                }\n                                else{\n                                    pad = true;\n                                }\n                            }\n                            rs = (pad) ? this.rowSpacing : '0';\n\n                            td1 = $(document.createElement('td'));\n                            td1.addClass('jqplot-table-legend jqplot-table-legend-swatch');\n                            td1.css({textAlign: 'center', paddingTop: rs});\n\n                            div0 = $(document.createElement('div'));\n                            div0.addClass('jqplot-table-legend-swatch-outline');\n                            if (tt !== undefined) {\n                                div0.attr(\"title\", tt);\n                            }\n\n                            div1 = $(document.createElement('div'));\n                            div1.addClass('jqplot-table-legend-swatch');\n                            div1.css({backgroundColor: color, borderColor: color});\n\n                            td1.append(div0.append(div1));\n\n                            td2 = $(document.createElement('td'));\n                            td2.addClass('jqplot-table-legend jqplot-table-legend-label');\n                            td2.css('paddingTop', rs);\n                            if (tt !== undefined) {\n                                td2.attr(\"title\", tt);\n                            }\n                    \n                            if (this.escapeHtml){\n                                td2.text(lt);\n                            }\n                            else {\n                                td2.html(lt);\n                            }\n                            if (reverse) {\n                                if (this.showLabels) {td2.prependTo(tr);}\n                                if (this.showSwatches) {td1.prependTo(tr);}\n                            }\n                            else {\n                                if (this.showSwatches) {td1.appendTo(tr);}\n                                if (this.showLabels) {td2.appendTo(tr);}\n                            }\n                            \n                            if (this.seriesToggle) {\n\n                                var speed;\n                                if (typeof(this.seriesToggle) === 'string' || typeof(this.seriesToggle) === 'number') {\n                                    if (!$.jqplot.use_excanvas || !this.disableIEFading) {\n                                        speed = this.seriesToggle;\n                                    }\n                                } \n                                if (this.showSwatches) {\n                                    td1.bind('click', {series:s, index:idx, speed:speed, plot: plot, replot:this.seriesToggleReplot}, handleToggle);\n                                    td1.addClass('jqplot-seriesToggle');\n                                }\n                                if (this.showLabels)  {\n                                    td2.bind('click', {series:s, index:idx, speed:speed, plot: plot, replot:this.seriesToggleReplot}, handleToggle);\n                                    td2.addClass('jqplot-seriesToggle');\n                                }\n\n                                // for slices that are already hidden, add the hidden class\n                                if (s.showSlice[idx] === false && s.showLabel) {\n                                    td1.addClass('jqplot-series-hidden');\n                                    td2.addClass('jqplot-series-hidden');\n                                }\n                            }\n                            \n                            pad = true;\n                        }\n                    }\n                    idx++;\n                }\n                \n                td1 = td2 = div0 = div1 = null;   \n            }\n        }\n        return this._elem;\n    };\n\n    var handleToggle = function (ev) {\n        var d = ev.data,\n            replot = d.replot,\n            plot = d.plot,\n            idx = d.index;\n\n        d.series.showSlice[idx] = (d.series.showSlice[idx] === false) ? true : false;\n    \n        var opts = {};\n\n        if ($.isPlainObject(replot)) {\n            $.extend(true, opts, replot);\n        }\n\n        plot.replot(opts);\n    };\n\n    // called with scope of plot.\n    var postDraw = function () {\n        if (this.legend.renderer.constructor == $.jqplot.EnhancedPieLegendRenderer && this.legend.seriesToggle) {\n            var e = this.legend._elem.detach();\n            this.eventCanvas._elem.after(e);\n        }\n    };\n})(jQuery);\n"
  },
  {
    "path": "stenogotchi/ui/web/static/js/plugins/jqplot.funnelRenderer.js",
    "content": "/**\n * jqPlot\n * Pure JavaScript plotting plugin using jQuery\n *\n * Version: 1.0.9\n * Revision: d96a669\n *\n * Copyright (c) 2009-2016 Chris Leonello\n * jqPlot is currently available for use in all personal or commercial projects \n * under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL \n * version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can \n * choose the license that best suits your project and use it accordingly. \n *\n * Although not required, the author would appreciate an email letting him \n * know of any substantial use of jqPlot.  You can reach the author at: \n * chris at jqplot dot com or see http://www.jqplot.com/info.php .\n *\n * If you are feeling kind and generous, consider supporting the project by\n * making a donation at: http://www.jqplot.com/donate.php .\n *\n * sprintf functions contained in jqplot.sprintf.js by Ash Searle:\n *\n *     version 2007.04.27\n *     author Ash Searle\n *     http://hexmen.com/blog/2007/03/printf-sprintf/\n *     http://hexmen.com/js/sprintf.js\n *     The author (Ash Searle) has placed this code in the public domain:\n *     \"This code is unrestricted: you are free to use it however you like.\"\n * \n */\n(function($) {\n    /**\n     * Class: $.jqplot.FunnelRenderer\n     * Plugin renderer to draw a funnel chart.\n     * x values, if present, will be used as labels.\n     * y values give area size.\n     * \n     * Funnel charts will draw a single series\n     * only.\n     * \n     * To use this renderer, you need to include the \n     * funnel renderer plugin, for example:\n     * \n     * > <script type=\"text/javascript\" src=\"plugins/jqplot.funnelRenderer.js\"></script>\n     * \n     * Properties described here are passed into the $.jqplot function\n     * as options on the series renderer.  For example:\n     * \n     * > plot2 = $.jqplot('chart2', [s1, s2], {\n     * >     seriesDefaults: {\n     * >         renderer:$.jqplot.FunnelRenderer,\n     * >         rendererOptions:{\n     * >              sectionMargin: 12,\n     * >              widthRatio: 0.3\n     * >          }\n     * >      }\n     * > });\n     * \n     * IMPORTANT\n     * \n     * *The funnel renderer will reorder data in descending order* so the largest value in\n     * the data set is first and displayed on top of the funnel.  Data will then\n     * be displayed in descending order down the funnel.  The area of each funnel\n     * section will correspond to the value of each data point relative to the sum\n     * of all values.  That is section area is proportional to section value divided by \n     * sum of all section values.\n     * \n     * If your data is not in descending order when passed into the plot, *it will be\n     * reordered* when stored in the series.data property.  A copy of the unordered\n     * data is kept in the series._unorderedData property.\n     * \n     * A funnel plot will trigger events on the plot target\n     * according to user interaction.  All events return the event object,\n     * the series index, the point (section) index, and the point data for \n     * the appropriate section. *Note* the point index will referr to the ordered\n     * data, not the original unordered data.\n     * \n     * 'jqplotDataMouseOver' - triggered when mousing over a section.\n     * 'jqplotDataHighlight' - triggered the first time user mouses over a section,\n     * if highlighting is enabled.\n     * 'jqplotDataUnhighlight' - triggered when a user moves the mouse out of\n     * a highlighted section.\n     * 'jqplotDataClick' - triggered when the user clicks on a section.\n     * 'jqplotDataRightClick' - tiggered when the user right clicks on a section if\n     * the \"captureRightClick\" option is set to true on the plot.\n     */\n    $.jqplot.FunnelRenderer = function(){\n        $.jqplot.LineRenderer.call(this);\n    };\n    \n    $.jqplot.FunnelRenderer.prototype = new $.jqplot.LineRenderer();\n    $.jqplot.FunnelRenderer.prototype.constructor = $.jqplot.FunnelRenderer;\n    \n    // called with scope of a series\n    $.jqplot.FunnelRenderer.prototype.init = function(options, plot) {\n        // Group: Properties\n        //\n        // prop: padding\n        // padding between the funnel and plot edges, legend, etc.\n        this.padding = {top: 20, right: 20, bottom: 20, left: 20};\n        // prop: sectionMargin\n        // spacing between funnel sections in pixels.\n        this.sectionMargin = 6;\n        // prop: fill\n        // true or false, whether to fill the areas.\n        this.fill = true;\n        // prop: shadowOffset\n        // offset of the shadow from the area and offset of \n        // each succesive stroke of the shadow from the last.\n        this.shadowOffset = 2;\n        // prop: shadowAlpha\n        // transparency of the shadow (0 = transparent, 1 = opaque)\n        this.shadowAlpha = 0.07;\n        // prop: shadowDepth\n        // number of strokes to apply to the shadow, \n        // each stroke offset shadowOffset from the last.\n        this.shadowDepth = 5;\n        // prop: highlightMouseOver\n        // True to highlight area when moused over.\n        // This must be false to enable highlightMouseDown to highlight when clicking on a area.\n        this.highlightMouseOver = true;\n        // prop: highlightMouseDown\n        // True to highlight when a mouse button is pressed over a area.\n        // This will be disabled if highlightMouseOver is true.\n        this.highlightMouseDown = false;\n        // prop: highlightColors\n        // array of colors to use when highlighting an area.\n        this.highlightColors = [];\n        // prop: widthRatio\n        // The ratio of the width of the top of the funnel to the bottom.\n        // a ratio of 0 will make an upside down pyramid. \n        this.widthRatio = 0.2;\n        // prop: lineWidth\n        // width of line if areas are stroked and not filled.\n        this.lineWidth = 2;\n        // prop: dataLabels\n        // Either 'label', 'value', 'percent' or an array of labels to place on the pie slices.\n        // Defaults to percentage of each pie slice.\n        this.dataLabels = 'percent';\n        // prop: showDataLabels\n        // true to show data labels on slices.\n        this.showDataLabels = false;\n        // prop: dataLabelFormatString\n        // Format string for data labels.  If none, '%s' is used for \"label\" and for arrays, '%d' for value and '%d%%' for percentage.\n        this.dataLabelFormatString = null;\n        // prop: dataLabelThreshold\n        // Threshhold in percentage (0 - 100) of pie area, below which no label will be displayed.\n        // This applies to all label types, not just to percentage labels.\n        this.dataLabelThreshold = 3;\n        this._type = 'funnel';\n        \n        this.tickRenderer = $.jqplot.FunnelTickRenderer;\n        \n        // if user has passed in highlightMouseDown option and not set highlightMouseOver, disable highlightMouseOver\n        if (options.highlightMouseDown && options.highlightMouseOver == null) {\n            options.highlightMouseOver = false;\n        }\n        \n        $.extend(true, this, options);\n        \n        // index of the currenty highlighted point, if any\n        this._highlightedPoint = null;\n        \n        // lengths of bases, or horizontal sides of areas of trapezoid.\n        this._bases = [];\n        // total area\n        this._atot;\n        // areas of segments.\n        this._areas = [];\n        // vertical lengths of segments.\n        this._lengths = [];\n        // angle of the funnel to vertical.\n        this._angle;\n        this._dataIndices = [];\n        \n        // sort data\n        this._unorderedData = $.extend(true, [], this.data);\n        var idxs = $.extend(true, [], this.data);\n        for (var i=0; i<idxs.length; i++) {\n            idxs[i].push(i);\n        }\n        this.data.sort( function (a, b) { return b[1] - a[1]; } );\n        idxs.sort( function (a, b) { return b[1] - a[1]; });\n        for (var i=0; i<idxs.length; i++) {\n            this._dataIndices.push(idxs[i][2]);\n        }\n        \n        // set highlight colors if none provided\n        if (this.highlightColors.length == 0) {\n            for (var i=0; i<this.seriesColors.length; i++){\n                var rgba = $.jqplot.getColorComponents(this.seriesColors[i]);\n                var newrgb = [rgba[0], rgba[1], rgba[2]];\n                var sum = newrgb[0] + newrgb[1] + newrgb[2];\n                for (var j=0; j<3; j++) {\n                    // when darkening, lowest color component can be is 60.\n                    newrgb[j] = (sum > 570) ?  newrgb[j] * 0.8 : newrgb[j] + 0.4 * (255 - newrgb[j]);\n                    newrgb[j] = parseInt(newrgb[j], 10);\n                }\n                this.highlightColors.push('rgb('+newrgb[0]+','+newrgb[1]+','+newrgb[2]+')');\n            }\n        }\n\n        plot.postParseOptionsHooks.addOnce(postParseOptions);\n        plot.postInitHooks.addOnce(postInit);\n        plot.eventListenerHooks.addOnce('jqplotMouseMove', handleMove);\n        plot.eventListenerHooks.addOnce('jqplotMouseDown', handleMouseDown);\n        plot.eventListenerHooks.addOnce('jqplotMouseUp', handleMouseUp);\n        plot.eventListenerHooks.addOnce('jqplotClick', handleClick);\n        plot.eventListenerHooks.addOnce('jqplotRightClick', handleRightClick);\n        plot.postDrawHooks.addOnce(postPlotDraw);        \n        \n    };\n    \n    // gridData will be of form [label, percentage of total]\n    $.jqplot.FunnelRenderer.prototype.setGridData = function(plot) {\n        // set gridData property.  This will hold angle in radians of each data point.\n        var sum = 0;\n        var td = [];\n        for (var i=0; i<this.data.length; i++){\n            sum += this.data[i][1];\n            td.push([this.data[i][0], this.data[i][1]]);\n        }\n        \n        // normalize y values, so areas are proportional.\n        for (var i=0; i<td.length; i++) {\n            td[i][1] = td[i][1]/sum;\n        }\n        \n        this._bases = new Array(td.length + 1);\n        this._lengths = new Array(td.length);\n        \n        this.gridData = td;\n    };\n    \n    $.jqplot.FunnelRenderer.prototype.makeGridData = function(data, plot) {\n        // set gridData property.  This will hold angle in radians of each data point.\n        var sum = 0;\n        var td = [];\n        for (var i=0; i<this.data.length; i++){\n            sum += this.data[i][1];\n            td.push([this.data[i][0], this.data[i][1]]);\n        }\n        \n        // normalize y values, so areas are proportional.\n        for (var i=0; i<td.length; i++) {\n            td[i][1] = td[i][1]/sum;\n        }\n        \n        this._bases = new Array(td.length + 1);\n        this._lengths = new Array(td.length);\n        \n        return td;\n    };\n    \n    $.jqplot.FunnelRenderer.prototype.drawSection = function (ctx, vertices, color, isShadow) {\n        var fill = this.fill;\n        var lineWidth = this.lineWidth;\n        ctx.save();\n        \n        if (isShadow) {\n            for (var i=0; i<this.shadowDepth; i++) {\n                ctx.save();\n                ctx.translate(this.shadowOffset*Math.cos(this.shadowAngle/180*Math.PI), this.shadowOffset*Math.sin(this.shadowAngle/180*Math.PI));\n                doDraw();\n            }\n        }\n        \n        else {\n            doDraw();\n        }\n        \n        function doDraw () {\n            ctx.beginPath();  \n            ctx.fillStyle = color;\n            ctx.strokeStyle = color;\n            ctx.lineWidth = lineWidth;\n            ctx.moveTo(vertices[0][0], vertices[0][1]);\n            for (var i=1; i<4; i++) {\n                ctx.lineTo(vertices[i][0], vertices[i][1]);\n            }\n            ctx.closePath();\n            if (fill) {\n                ctx.fill();\n            }\n            else {\n                ctx.stroke();\n            }\n        }\n        \n        if (isShadow) {\n            for (var i=0; i<this.shadowDepth; i++) {\n                ctx.restore();\n            }\n        }\n        \n        ctx.restore();\n    };\n    \n    // called with scope of series\n    $.jqplot.FunnelRenderer.prototype.draw = function (ctx, gd, options, plot) {\n        var i;\n        var opts = (options != undefined) ? options : {};\n        // offset and direction of offset due to legend placement\n        var offx = 0;\n        var offy = 0;\n        var trans = 1;\n        this._areas = [];\n        // var colorGenerator = new this.colorGenerator(this.seriesColors);\n        if (options.legendInfo && options.legendInfo.placement == 'insideGrid') {\n            var li = options.legendInfo;\n            switch (li.location) {\n                case 'nw':\n                    offx = li.width + li.xoffset;\n                    break;\n                case 'w':\n                    offx = li.width + li.xoffset;\n                    break;\n                case 'sw':\n                    offx = li.width + li.xoffset;\n                    break;\n                case 'ne':\n                    offx = li.width + li.xoffset;\n                    trans = -1;\n                    break;\n                case 'e':\n                    offx = li.width + li.xoffset;\n                    trans = -1;\n                    break;\n                case 'se':\n                    offx = li.width + li.xoffset;\n                    trans = -1;\n                    break;\n                case 'n':\n                    offy = li.height + li.yoffset;\n                    break;\n                case 's':\n                    offy = li.height + li.yoffset;\n                    trans = -1;\n                    break;\n                default:\n                    break;\n            }\n        }\n        \n        var loff = (trans==1) ? this.padding.left + offx : this.padding.left;\n        var toff = (trans==1) ? this.padding.top + offy : this.padding.top;\n        var roff = (trans==-1) ? this.padding.right + offx : this.padding.right;\n        var boff = (trans==-1) ? this.padding.bottom + offy : this.padding.bottom;\n        \n        var shadow = (opts.shadow != undefined) ? opts.shadow : this.shadow;\n        var showLine = (opts.showLine != undefined) ? opts.showLine : this.showLine;\n        var fill = (opts.fill != undefined) ? opts.fill : this.fill;\n        var cw = ctx.canvas.width;\n        var ch = ctx.canvas.height;\n        this._bases[0] = cw - loff - roff;\n        var ltot = this._length = ch - toff - boff;\n\n        var hend = this._bases[0]*this.widthRatio;\n        this._atot = ltot/2 * (this._bases[0] + this._bases[0]*this.widthRatio);\n\n        this._angle = Math.atan((this._bases[0] - hend)/2/ltot);\n\n        for (i=0; i<gd.length; i++) {\n            this._areas.push(gd[i][1] * this._atot);\n        }\n\n        \n        var guess, err, count, lsum=0;\n        var tolerance = 0.0001;\n\n        for (i=0; i<this._areas.length; i++) {\n            guess = this._areas[i]/this._bases[i];\n            err = 999999;\n            this._lengths[i] = guess;\n            count = 0;\n            while (err > this._lengths[i]*tolerance && count < 100) {\n                this._lengths[i] = this._areas[i]/(this._bases[i] - this._lengths[i] * Math.tan(this._angle));\n                err = Math.abs(this._lengths[i] - guess);\n                this._bases[i+1] = this._bases[i] - (2*this._lengths[i]*Math.tan(this._angle));\n                guess = this._lengths[i];\n                count++;\n            }\n            lsum += this._lengths[i];\n        }\n        \n        // figure out vertices of each section\n        this._vertices = new Array(gd.length);\n        \n        // these are 4 coners of entire trapezoid\n        var p0 = [loff, toff],\n            p1 = [loff+this._bases[0], toff],\n            p2 = [loff + (this._bases[0] - this._bases[this._bases.length-1])/2, toff + this._length],\n            p3 = [p2[0] + this._bases[this._bases.length-1], p2[1]];\n            \n        // equations of right and left sides, returns x, y values given height of section (y value)\n        function findleft (l) {\n            var m = (p0[1] - p2[1])/(p0[0] - p2[0]);\n            var b = p0[1] - m*p0[0];\n            var y = l + p0[1];\n            \n            return [(y - b)/m, y];\n        }\n        \n        function findright (l) {\n            var m = (p1[1] - p3[1])/(p1[0] - p3[0]);\n            var b = p1[1] - m*p1[0];\n            var y = l + p1[1];\n            \n            return [(y - b)/m, y];\n        }\n        \n        var x = offx, y = offy;\n        var h=0, adj=0;\n        \n        for (i=0; i<gd.length; i++) {\n            this._vertices[i] = new Array();\n            var v = this._vertices[i];\n            var sm = this.sectionMargin;\n            if (i == 0) {\n                adj = 0;\n            }\n            if (i == 1) {\n                adj = sm/3;\n            }\n            else if (i > 0 && i < gd.length-1) {\n                adj = sm/2;\n            }\n            else if (i == gd.length -1) {\n                adj = 2*sm/3;\n            }\n            v.push(findleft(h+adj));\n            v.push(findright(h+adj));\n            h += this._lengths[i];\n            if (i == 0) {\n                adj = -2*sm/3;\n            }\n            else if (i > 0 && i < gd.length-1) {\n                adj = -sm/2;\n            }\n            else if (i == gd.length - 1) {\n                adj = 0;\n            }\n            v.push(findright(h+adj));\n            v.push(findleft(h+adj));\n            \n        }\n\n        if (this.shadow) {\n            var shadowColor = 'rgba(0,0,0,'+this.shadowAlpha+')';\n            for (var i=0; i<gd.length; i++) {\n                this.renderer.drawSection.call (this, ctx, this._vertices[i], shadowColor, true);\n            }\n            \n        }\n        for (var i=0; i<gd.length; i++) {\n            var v = this._vertices[i];\n            this.renderer.drawSection.call (this, ctx, v, this.seriesColors[i]);\n            \n            if (this.showDataLabels && gd[i][1]*100 >= this.dataLabelThreshold) {\n                var fstr, label;\n                \n                if (this.dataLabels == 'label') {\n                    fstr = this.dataLabelFormatString || '%s';\n                    label = $.jqplot.sprintf(fstr, gd[i][0]);\n                }\n                else if (this.dataLabels == 'value') {\n                    fstr = this.dataLabelFormatString || '%d';\n                    label = $.jqplot.sprintf(fstr, this.data[i][1]);\n                }\n                else if (this.dataLabels == 'percent') {\n                    fstr = this.dataLabelFormatString || '%d%%';\n                    label = $.jqplot.sprintf(fstr, gd[i][1]*100);\n                }\n                else if (this.dataLabels.constructor == Array) {\n                    fstr = this.dataLabelFormatString || '%s';\n                    label = $.jqplot.sprintf(fstr, this.dataLabels[this._dataIndices[i]]);\n                }\n                \n                var fact = (this._radius ) * this.dataLabelPositionFactor + this.sliceMargin + this.dataLabelNudge;\n                \n                var x = (v[0][0] + v[1][0])/2 + this.canvas._offsets.left;\n                var y = (v[1][1] + v[2][1])/2 + this.canvas._offsets.top;\n                \n                var labelelem = $('<span class=\"jqplot-funnel-series jqplot-data-label\" style=\"position:absolute;\">' + label + '</span>').insertBefore(plot.eventCanvas._elem);\n                x -= labelelem.width()/2;\n                y -= labelelem.height()/2;\n                x = Math.round(x);\n                y = Math.round(y);\n                labelelem.css({left: x, top: y});\n            }\n            \n        }\n               \n    };\n    \n    $.jqplot.FunnelAxisRenderer = function() {\n        $.jqplot.LinearAxisRenderer.call(this);\n    };\n    \n    $.jqplot.FunnelAxisRenderer.prototype = new $.jqplot.LinearAxisRenderer();\n    $.jqplot.FunnelAxisRenderer.prototype.constructor = $.jqplot.FunnelAxisRenderer;\n        \n    \n    // There are no traditional axes on a funnel chart.  We just need to provide\n    // dummy objects with properties so the plot will render.\n    // called with scope of axis object.\n    $.jqplot.FunnelAxisRenderer.prototype.init = function(options){\n        //\n        this.tickRenderer = $.jqplot.FunnelTickRenderer;\n        $.extend(true, this, options);\n        // I don't think I'm going to need _dataBounds here.\n        // have to go Axis scaling in a way to fit chart onto plot area\n        // and provide u2p and p2u functionality for mouse cursor, etc.\n        // for convienence set _dataBounds to 0 and 100 and\n        // set min/max to 0 and 100.\n        this._dataBounds = {min:0, max:100};\n        this.min = 0;\n        this.max = 100;\n        this.showTicks = false;\n        this.ticks = [];\n        this.showMark = false;\n        this.show = false; \n    };\n    \n    \n    \n    /**\n     * Class: $.jqplot.FunnelLegendRenderer\n     * Legend Renderer specific to funnel plots.  Set by default\n     * when the user creates a funnel plot.\n     */\n    $.jqplot.FunnelLegendRenderer = function(){\n        $.jqplot.TableLegendRenderer.call(this);\n    };\n    \n    $.jqplot.FunnelLegendRenderer.prototype = new $.jqplot.TableLegendRenderer();\n    $.jqplot.FunnelLegendRenderer.prototype.constructor = $.jqplot.FunnelLegendRenderer;\n    \n    $.jqplot.FunnelLegendRenderer.prototype.init = function(options) {\n        // Group: Properties\n        //\n        // prop: numberRows\n        // Maximum number of rows in the legend.  0 or null for unlimited.\n        this.numberRows = null;\n        // prop: numberColumns\n        // Maximum number of columns in the legend.  0 or null for unlimited.\n        this.numberColumns = null;\n        $.extend(true, this, options);\n    };\n    \n    // called with context of legend\n    $.jqplot.FunnelLegendRenderer.prototype.draw = function() {\n        var legend = this;\n        if (this.show) {\n            var series = this._series;\n            var ss = 'position:absolute;';\n            ss += (this.background) ? 'background:'+this.background+';' : '';\n            ss += (this.border) ? 'border:'+this.border+';' : '';\n            ss += (this.fontSize) ? 'font-size:'+this.fontSize+';' : '';\n            ss += (this.fontFamily) ? 'font-family:'+this.fontFamily+';' : '';\n            ss += (this.textColor) ? 'color:'+this.textColor+';' : '';\n            ss += (this.marginTop != null) ? 'margin-top:'+this.marginTop+';' : '';\n            ss += (this.marginBottom != null) ? 'margin-bottom:'+this.marginBottom+';' : '';\n            ss += (this.marginLeft != null) ? 'margin-left:'+this.marginLeft+';' : '';\n            ss += (this.marginRight != null) ? 'margin-right:'+this.marginRight+';' : '';\n            this._elem = $('<table class=\"jqplot-table-legend\" style=\"'+ss+'\"></table>');\n            // Funnel charts legends don't go by number of series, but by number of data points\n            // in the series.  Refactor things here for that.\n            \n            var pad = false, \n                reverse = false,\n                nr, nc;\n            var s = series[0];\n            var colorGenerator = new $.jqplot.ColorGenerator(s.seriesColors);\n            \n            if (s.show) {\n                var pd = s.data;\n                if (this.numberRows) {\n                    nr = this.numberRows;\n                    if (!this.numberColumns){\n                        nc = Math.ceil(pd.length/nr);\n                    }\n                    else{\n                        nc = this.numberColumns;\n                    }\n                }\n                else if (this.numberColumns) {\n                    nc = this.numberColumns;\n                    nr = Math.ceil(pd.length/this.numberColumns);\n                }\n                else {\n                    nr = pd.length;\n                    nc = 1;\n                }\n                \n                var i, j, tr, td1, td2, lt, rs, color;\n                var idx = 0;    \n                \n                for (i=0; i<nr; i++) {\n                    if (reverse){\n                        tr = $('<tr class=\"jqplot-table-legend\"></tr>').prependTo(this._elem);\n                    }\n                    else{\n                        tr = $('<tr class=\"jqplot-table-legend\"></tr>').appendTo(this._elem);\n                    }\n                    for (j=0; j<nc; j++) {\n                        if (idx < pd.length){\n                            lt = this.labels[idx] || pd[idx][0].toString();\n                            color = colorGenerator.next();\n                            if (!reverse){\n                                if (i>0){\n                                    pad = true;\n                                }\n                                else{\n                                    pad = false;\n                                }\n                            }\n                            else{\n                                if (i == nr -1){\n                                    pad = false;\n                                }\n                                else{\n                                    pad = true;\n                                }\n                            }\n                            rs = (pad) ? this.rowSpacing : '0';\n                \n                            td1 = $('<td class=\"jqplot-table-legend\" style=\"text-align:center;padding-top:'+rs+';\">'+\n                                '<div><div class=\"jqplot-table-legend-swatch\" style=\"border-color:'+color+';\"></div>'+\n                                '</div></td>');\n                            td2 = $('<td class=\"jqplot-table-legend\" style=\"padding-top:'+rs+';\"></td>');\n                            if (this.escapeHtml){\n                                td2.text(lt);\n                            }\n                            else {\n                                td2.html(lt);\n                            }\n                            if (reverse) {\n                                td2.prependTo(tr);\n                                td1.prependTo(tr);\n                            }\n                            else {\n                                td1.appendTo(tr);\n                                td2.appendTo(tr);\n                            }\n                            pad = true;\n                        }\n                        idx++;\n                    }   \n                }\n            }\n        }\n        return this._elem;                \n    };\n    \n    // $.jqplot.FunnelLegendRenderer.prototype.pack = function(offsets) {\n    //     if (this.show) {\n    //         // fake a grid for positioning\n    //         var grid = {_top:offsets.top, _left:offsets.left, _right:offsets.right, _bottom:this._plotDimensions.height - offsets.bottom};        \n    //         if (this.placement == 'insideGrid') {\n    //             switch (this.location) {\n    //                 case 'nw':\n    //                     var a = grid._left + this.xoffset;\n    //                     var b = grid._top + this.yoffset;\n    //                     this._elem.css('left', a);\n    //                     this._elem.css('top', b);\n    //                     break;\n    //                 case 'n':\n    //                     var a = (offsets.left + (this._plotDimensions.width - offsets.right))/2 - this.getWidth()/2;\n    //                     var b = grid._top + this.yoffset;\n    //                     this._elem.css('left', a);\n    //                     this._elem.css('top', b);\n    //                     break;\n    //                 case 'ne':\n    //                     var a = offsets.right + this.xoffset;\n    //                     var b = grid._top + this.yoffset;\n    //                     this._elem.css({right:a, top:b});\n    //                     break;\n    //                 case 'e':\n    //                     var a = offsets.right + this.xoffset;\n    //                     var b = (offsets.top + (this._plotDimensions.height - offsets.bottom))/2 - this.getHeight()/2;\n    //                     this._elem.css({right:a, top:b});\n    //                     break;\n    //                 case 'se':\n    //                     var a = offsets.right + this.xoffset;\n    //                     var b = offsets.bottom + this.yoffset;\n    //                     this._elem.css({right:a, bottom:b});\n    //                     break;\n    //                 case 's':\n    //                     var a = (offsets.left + (this._plotDimensions.width - offsets.right))/2 - this.getWidth()/2;\n    //                     var b = offsets.bottom + this.yoffset;\n    //                     this._elem.css({left:a, bottom:b});\n    //                     break;\n    //                 case 'sw':\n    //                     var a = grid._left + this.xoffset;\n    //                     var b = offsets.bottom + this.yoffset;\n    //                     this._elem.css({left:a, bottom:b});\n    //                     break;\n    //                 case 'w':\n    //                     var a = grid._left + this.xoffset;\n    //                     var b = (offsets.top + (this._plotDimensions.height - offsets.bottom))/2 - this.getHeight()/2;\n    //                     this._elem.css({left:a, top:b});\n    //                     break;\n    //                 default:  // same as 'se'\n    //                     var a = grid._right - this.xoffset;\n    //                     var b = grid._bottom + this.yoffset;\n    //                     this._elem.css({right:a, bottom:b});\n    //                     break;\n    //             }\n    //             \n    //         }\n    //         else {\n    //             switch (this.location) {\n    //                 case 'nw':\n    //                     var a = this._plotDimensions.width - grid._left + this.xoffset;\n    //                     var b = grid._top + this.yoffset;\n    //                     this._elem.css('right', a);\n    //                     this._elem.css('top', b);\n    //                     break;\n    //                 case 'n':\n    //                     var a = (offsets.left + (this._plotDimensions.width - offsets.right))/2 - this.getWidth()/2;\n    //                     var b = this._plotDimensions.height - grid._top + this.yoffset;\n    //                     this._elem.css('left', a);\n    //                     this._elem.css('bottom', b);\n    //                     break;\n    //                 case 'ne':\n    //                     var a = this._plotDimensions.width - offsets.right + this.xoffset;\n    //                     var b = grid._top + this.yoffset;\n    //                     this._elem.css({left:a, top:b});\n    //                     break;\n    //                 case 'e':\n    //                     var a = this._plotDimensions.width - offsets.right + this.xoffset;\n    //                     var b = (offsets.top + (this._plotDimensions.height - offsets.bottom))/2 - this.getHeight()/2;\n    //                     this._elem.css({left:a, top:b});\n    //                     break;\n    //                 case 'se':\n    //                     var a = this._plotDimensions.width - offsets.right + this.xoffset;\n    //                     var b = offsets.bottom + this.yoffset;\n    //                     this._elem.css({left:a, bottom:b});\n    //                     break;\n    //                 case 's':\n    //                     var a = (offsets.left + (this._plotDimensions.width - offsets.right))/2 - this.getWidth()/2;\n    //                     var b = this._plotDimensions.height - offsets.bottom + this.yoffset;\n    //                     this._elem.css({left:a, top:b});\n    //                     break;\n    //                 case 'sw':\n    //                     var a = this._plotDimensions.width - grid._left + this.xoffset;\n    //                     var b = offsets.bottom + this.yoffset;\n    //                     this._elem.css({right:a, bottom:b});\n    //                     break;\n    //                 case 'w':\n    //                     var a = this._plotDimensions.width - grid._left + this.xoffset;\n    //                     var b = (offsets.top + (this._plotDimensions.height - offsets.bottom))/2 - this.getHeight()/2;\n    //                     this._elem.css({right:a, top:b});\n    //                     break;\n    //                 default:  // same as 'se'\n    //                     var a = grid._right - this.xoffset;\n    //                     var b = grid._bottom + this.yoffset;\n    //                     this._elem.css({right:a, bottom:b});\n    //                     break;\n    //             }\n    //         }\n    //     } \n    // };\n    \n    // setup default renderers for axes and legend so user doesn't have to\n    // called with scope of plot\n    function preInit(target, data, options) {\n        options = options || {};\n        options.axesDefaults = options.axesDefaults || {};\n        options.legend = options.legend || {};\n        options.seriesDefaults = options.seriesDefaults || {};\n        // only set these if there is a funnel series\n        var setopts = false;\n        if (options.seriesDefaults.renderer == $.jqplot.FunnelRenderer) {\n            setopts = true;\n        }\n        else if (options.series) {\n            for (var i=0; i < options.series.length; i++) {\n                if (options.series[i].renderer == $.jqplot.FunnelRenderer) {\n                    setopts = true;\n                }\n            }\n        }\n        \n        if (setopts) {\n            options.axesDefaults.renderer = $.jqplot.FunnelAxisRenderer;\n            options.legend.renderer = $.jqplot.FunnelLegendRenderer;\n            options.legend.preDraw = true;\n            options.sortData = false;\n            options.seriesDefaults.pointLabels = {show: false};\n        }\n    }\n    \n    function postInit(target, data, options) {\n        // if multiple series, add a reference to the previous one so that\n        // funnel rings can nest.\n        for (var i=0; i<this.series.length; i++) {\n            if (this.series[i].renderer.constructor == $.jqplot.FunnelRenderer) {\n                // don't allow mouseover and mousedown at same time.\n                if (this.series[i].highlightMouseOver) {\n                    this.series[i].highlightMouseDown = false;\n                }\n            }\n        }\n    }\n    \n    // called with scope of plot\n    function postParseOptions(options) {\n        for (var i=0; i<this.series.length; i++) {\n            this.series[i].seriesColors = this.seriesColors;\n            this.series[i].colorGenerator = $.jqplot.colorGenerator;\n        }\n    }\n    \n    function highlight (plot, sidx, pidx) {\n        var s = plot.series[sidx];\n        var canvas = plot.plugins.funnelRenderer.highlightCanvas;\n        canvas._ctx.clearRect(0,0,canvas._ctx.canvas.width, canvas._ctx.canvas.height);\n        s._highlightedPoint = pidx;\n        plot.plugins.funnelRenderer.highlightedSeriesIndex = sidx;\n        s.renderer.drawSection.call(s, canvas._ctx, s._vertices[pidx], s.highlightColors[pidx], false);\n    }\n    \n    function unhighlight (plot) {\n        var canvas = plot.plugins.funnelRenderer.highlightCanvas;\n        canvas._ctx.clearRect(0,0, canvas._ctx.canvas.width, canvas._ctx.canvas.height);\n        for (var i=0; i<plot.series.length; i++) {\n            plot.series[i]._highlightedPoint = null;\n        }\n        plot.plugins.funnelRenderer.highlightedSeriesIndex = null;\n        plot.target.trigger('jqplotDataUnhighlight');\n    }\n    \n    function handleMove(ev, gridpos, datapos, neighbor, plot) {\n        if (neighbor) {\n            var ins = [neighbor.seriesIndex, neighbor.pointIndex, neighbor.data];\n            var evt1 = jQuery.Event('jqplotDataMouseOver');\n            evt1.pageX = ev.pageX;\n            evt1.pageY = ev.pageY;\n            plot.target.trigger(evt1, ins);\n            if (plot.series[ins[0]].highlightMouseOver && !(ins[0] == plot.plugins.funnelRenderer.highlightedSeriesIndex && ins[1] == plot.series[ins[0]]._highlightedPoint)) {\n                var evt = jQuery.Event('jqplotDataHighlight');\n                evt.which = ev.which;\n                evt.pageX = ev.pageX;\n                evt.pageY = ev.pageY;\n                plot.target.trigger(evt, ins);\n                highlight (plot, ins[0], ins[1]);\n            }\n        }\n        else if (neighbor == null) {\n            unhighlight (plot);\n        }\n    }\n    \n    function handleMouseDown(ev, gridpos, datapos, neighbor, plot) {\n        if (neighbor) {\n            var ins = [neighbor.seriesIndex, neighbor.pointIndex, neighbor.data];\n            if (plot.series[ins[0]].highlightMouseDown && !(ins[0] == plot.plugins.funnelRenderer.highlightedSeriesIndex && ins[1] == plot.series[ins[0]]._highlightedPoint)) {\n                var evt = jQuery.Event('jqplotDataHighlight');\n                evt.which = ev.which;\n                evt.pageX = ev.pageX;\n                evt.pageY = ev.pageY;\n                plot.target.trigger(evt, ins);\n                highlight (plot, ins[0], ins[1]);\n            }\n        }\n        else if (neighbor == null) {\n            unhighlight (plot);\n        }\n    }\n    \n    function handleMouseUp(ev, gridpos, datapos, neighbor, plot) {\n        var idx = plot.plugins.funnelRenderer.highlightedSeriesIndex;\n        if (idx != null && plot.series[idx].highlightMouseDown) {\n            unhighlight(plot);\n        }\n    }\n    \n    function handleClick(ev, gridpos, datapos, neighbor, plot) {\n        if (neighbor) {\n            var ins = [neighbor.seriesIndex, neighbor.pointIndex, neighbor.data];\n            var evt = jQuery.Event('jqplotDataClick');\n            evt.which = ev.which;\n            evt.pageX = ev.pageX;\n            evt.pageY = ev.pageY;\n            plot.target.trigger(evt, ins);\n        }\n    }\n    \n    function handleRightClick(ev, gridpos, datapos, neighbor, plot) {\n        if (neighbor) {\n            var ins = [neighbor.seriesIndex, neighbor.pointIndex, neighbor.data];\n            var idx = plot.plugins.funnelRenderer.highlightedSeriesIndex;\n            if (idx != null && plot.series[idx].highlightMouseDown) {\n                unhighlight(plot);\n            }\n            var evt = jQuery.Event('jqplotDataRightClick');\n            evt.which = ev.which;\n            evt.pageX = ev.pageX;\n            evt.pageY = ev.pageY;\n            plot.target.trigger(evt, ins);\n        }\n    }\n    \n    // called within context of plot\n    // create a canvas which we can draw on.\n    // insert it before the eventCanvas, so eventCanvas will still capture events.\n    function postPlotDraw() {\n        // Memory Leaks patch    \n        if (this.plugins.funnelRenderer && this.plugins.funnelRenderer.highlightCanvas) {\n            this.plugins.funnelRenderer.highlightCanvas.resetCanvas();\n            this.plugins.funnelRenderer.highlightCanvas = null;\n        }\n\n        this.plugins.funnelRenderer = {};\n        this.plugins.funnelRenderer.highlightCanvas = new $.jqplot.GenericCanvas();\n        \n        // do we have any data labels?  if so, put highlight canvas before those\n        var labels = $(this.targetId+' .jqplot-data-label');\n        if (labels.length) {\n            $(labels[0]).before(this.plugins.funnelRenderer.highlightCanvas.createElement(this._gridPadding, 'jqplot-funnelRenderer-highlight-canvas', this._plotDimensions, this));\n        }\n        // else put highlight canvas before event canvas.\n        else {\n            this.eventCanvas._elem.before(this.plugins.funnelRenderer.highlightCanvas.createElement(this._gridPadding, 'jqplot-funnelRenderer-highlight-canvas', this._plotDimensions, this));\n        }\n        var hctx = this.plugins.funnelRenderer.highlightCanvas.setContext();\n        this.eventCanvas._elem.bind('mouseleave', {plot:this}, function (ev) { unhighlight(ev.data.plot); });\n    }\n    \n    $.jqplot.preInitHooks.push(preInit);\n    \n    $.jqplot.FunnelTickRenderer = function() {\n        $.jqplot.AxisTickRenderer.call(this);\n    };\n    \n    $.jqplot.FunnelTickRenderer.prototype = new $.jqplot.AxisTickRenderer();\n    $.jqplot.FunnelTickRenderer.prototype.constructor = $.jqplot.FunnelTickRenderer;\n    \n})(jQuery);\n    \n    "
  },
  {
    "path": "stenogotchi/ui/web/static/js/plugins/jqplot.highlighter.js",
    "content": "/**\n * jqPlot\n * Pure JavaScript plotting plugin using jQuery\n *\n * Version: 1.0.9\n * Revision: d96a669\n *\n * Copyright (c) 2009-2016 Chris Leonello\n * jqPlot is currently available for use in all personal or commercial projects \n * under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL \n * version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can \n * choose the license that best suits your project and use it accordingly. \n *\n * Although not required, the author would appreciate an email letting him \n * know of any substantial use of jqPlot.  You can reach the author at: \n * chris at jqplot dot com or see http://www.jqplot.com/info.php .\n *\n * If you are feeling kind and generous, consider supporting the project by\n * making a donation at: http://www.jqplot.com/donate.php .\n *\n * sprintf functions contained in jqplot.sprintf.js by Ash Searle:\n *\n *     version 2007.04.27\n *     author Ash Searle\n *     http://hexmen.com/blog/2007/03/printf-sprintf/\n *     http://hexmen.com/js/sprintf.js\n *     The author (Ash Searle) has placed this code in the public domain:\n *     \"This code is unrestricted: you are free to use it however you like.\"\n * \n */\n(function($) {\n    $.jqplot.eventListenerHooks.push(['jqplotMouseMove', handleMove]);\n    \n    /**\n     * Class: $.jqplot.Highlighter\n     * Plugin which will highlight data points when they are moused over.\n     * \n     * To use this plugin, include the js\n     * file in your source:\n     * \n     * > <script type=\"text/javascript\" src=\"plugins/jqplot.highlighter.js\"></script>\n     * \n     * A tooltip providing information about the data point is enabled by default.\n     * To disable the tooltip, set \"showTooltip\" to false.\n     * \n     * You can control what data is displayed in the tooltip with various\n     * options.  The \"tooltipAxes\" option controls whether the x, y or both\n     * data values are displayed.\n     * \n     * Some chart types (e.g. hi-low-close) have more than one y value per\n     * data point. To display the additional values in the tooltip, set the\n     * \"yvalues\" option to the desired number of y values present (3 for a hlc chart).\n     * \n     * By default, data values will be formatted with the same formatting\n     * specifiers as used to format the axis ticks.  A custom format code\n     * can be supplied with the tooltipFormatString option.  This will apply \n     * to all values in the tooltip.  \n     * \n     * For more complete control, the \"formatString\" option can be set.  This\n     * Allows conplete control over tooltip formatting.  Values are passed to\n     * the format string in an order determined by the \"tooltipAxes\" and \"yvalues\"\n     * options.  So, if you have a hi-low-close chart and you just want to display \n     * the hi-low-close values in the tooltip, you could set a formatString like:\n     * \n     * > highlighter: {\n     * >     tooltipAxes: 'y',\n     * >     yvalues: 3,\n     * >     formatString:'<table class=\"jqplot-highlighter\">\n     * >         <tr><td>hi:</td><td>%s</td></tr>\n     * >         <tr><td>low:</td><td>%s</td></tr>\n     * >         <tr><td>close:</td><td>%s</td></tr></table>'\n     * > }\n     * \n     */\n    $.jqplot.Highlighter = function(options) {\n        // Group: Properties\n        //\n        //prop: show\n        // true to show the highlight.\n        this.show = $.jqplot.config.enablePlugins;\n        // prop: markerRenderer\n        // Renderer used to draw the marker of the highlighted point.\n        // Renderer will assimilate attributes from the data point being highlighted,\n        // so no attributes need set on the renderer directly.\n        // Default is to turn off shadow drawing on the highlighted point.\n        this.markerRenderer = new $.jqplot.MarkerRenderer({shadow:false});\n        // prop: showMarker\n        // true to show the marker\n        this.showMarker  = true;\n        // prop: lineWidthAdjust\n        // Pixels to add to the lineWidth of the highlight.\n        this.lineWidthAdjust = 2.5;\n        // prop: sizeAdjust\n        // Pixels to add to the overall size of the highlight.\n        this.sizeAdjust = 5;\n        // prop: showTooltip\n        // Show a tooltip with data point values.\n        this.showTooltip = true;\n        // prop: tooltipLocation\n        // Where to position tooltip, 'n', 'ne', 'e', 'se', 's', 'sw', 'w', 'nw'\n        this.tooltipLocation = 'nw';\n        // prop: fadeTooltip\n        // true = fade in/out tooltip, flase = show/hide tooltip\n        this.fadeTooltip = true;\n        // prop: tooltipFadeSpeed\n        // 'slow', 'def', 'fast', or number of milliseconds.\n        this.tooltipFadeSpeed = \"fast\";\n        // prop: tooltipOffset\n        // Pixel offset of tooltip from the highlight.\n        this.tooltipOffset = 2;\n        // prop: tooltipAxes\n        // Which axes to display in tooltip, 'x', 'y' or 'both', 'xy' or 'yx'\n        // 'both' and 'xy' are equivalent, 'yx' reverses order of labels.\n        this.tooltipAxes = 'both';\n        // prop; tooltipSeparator\n        // String to use to separate x and y axes in tooltip.\n        this.tooltipSeparator = ', ';\n        // prop; tooltipContentEditor\n        // Function used to edit/augment/replace the formatted tooltip contents.\n        // Called as str = tooltipContentEditor(str, seriesIndex, pointIndex)\n        // where str is the generated tooltip html and seriesIndex and pointIndex identify\n        // the data point being highlighted. Should return the html for the tooltip contents.\n        this.tooltipContentEditor = null;\n        // prop: useAxesFormatters\n        // Use the x and y axes formatters to format the text in the tooltip.\n        this.useAxesFormatters = true;\n        // prop: tooltipFormatString\n        // sprintf format string for the tooltip.\n        // Uses Ash Searle's javascript sprintf implementation\n        // found here: http://hexmen.com/blog/2007/03/printf-sprintf/\n        // See http://perldoc.perl.org/functions/sprintf.html for reference.\n        // Additional \"p\" and \"P\" format specifiers added by Chris Leonello.\n        this.tooltipFormatString = '%.5P';\n        // prop: formatString\n        // alternative to tooltipFormatString\n        // will format the whole tooltip text, populating with x, y values as\n        // indicated by tooltipAxes option.  So, you could have a tooltip like:\n        // 'Date: %s, number of cats: %d' to format the whole tooltip at one go.\n        // If useAxesFormatters is true, values will be formatted according to\n        // Axes formatters and you can populate your tooltip string with \n        // %s placeholders.\n        this.formatString = null;\n        // prop: yvalues\n        // Number of y values to expect in the data point array.\n        // Typically this is 1.  Certain plots, like OHLC, will\n        // have more y values in each data point array.\n        this.yvalues = 1;\n        // prop: bringSeriesToFront\n        // This option requires jQuery 1.4+\n        // True to bring the series of the highlighted point to the front\n        // of other series.\n        this.bringSeriesToFront = false;\n        this._tooltipElem;\n        this.isHighlighting = false;\n        this.currentNeighbor = null;\n\n        $.extend(true, this, options);\n    };\n    \n    var locations = ['nw', 'n', 'ne', 'e', 'se', 's', 'sw', 'w'];\n    var locationIndicies = {'nw':0, 'n':1, 'ne':2, 'e':3, 'se':4, 's':5, 'sw':6, 'w':7};\n    var oppositeLocations = ['se', 's', 'sw', 'w', 'nw', 'n', 'ne', 'e'];\n    \n    // axis.renderer.tickrenderer.formatter\n    \n    // called with scope of plot\n    $.jqplot.Highlighter.init = function (target, data, opts){\n        var options = opts || {};\n        // add a highlighter attribute to the plot\n        this.plugins.highlighter = new $.jqplot.Highlighter(options.highlighter);\n    };\n    \n    // called within scope of series\n    $.jqplot.Highlighter.parseOptions = function (defaults, options) {\n        // Add a showHighlight option to the series \n        // and set it to true by default.\n        this.showHighlight = true;\n    };\n    \n    // called within context of plot\n    // create a canvas which we can draw on.\n    // insert it before the eventCanvas, so eventCanvas will still capture events.\n    $.jqplot.Highlighter.postPlotDraw = function() {\n        // Memory Leaks patch    \n        if (this.plugins.highlighter && this.plugins.highlighter.highlightCanvas) {\n            this.plugins.highlighter.highlightCanvas.resetCanvas();\n            this.plugins.highlighter.highlightCanvas = null;\n        }\n\n        if (this.plugins.highlighter && this.plugins.highlighter._tooltipElem) {\n            this.plugins.highlighter._tooltipElem.emptyForce();\n            this.plugins.highlighter._tooltipElem = null;\n        }\n\n        this.plugins.highlighter.highlightCanvas = new $.jqplot.GenericCanvas();\n        \n        this.eventCanvas._elem.before(this.plugins.highlighter.highlightCanvas.createElement(this._gridPadding, 'jqplot-highlight-canvas', this._plotDimensions, this));\n        this.plugins.highlighter.highlightCanvas.setContext();\n\n        var elem = document.createElement('div');\n        this.plugins.highlighter._tooltipElem = $(elem);\n        elem = null;\n        this.plugins.highlighter._tooltipElem.addClass('jqplot-highlighter-tooltip');\n        this.plugins.highlighter._tooltipElem.css({position:'absolute', display:'none'});\n        \n        this.eventCanvas._elem.before(this.plugins.highlighter._tooltipElem);\n    };\n    \n    $.jqplot.preInitHooks.push($.jqplot.Highlighter.init);\n    $.jqplot.preParseSeriesOptionsHooks.push($.jqplot.Highlighter.parseOptions);\n    $.jqplot.postDrawHooks.push($.jqplot.Highlighter.postPlotDraw);\n    \n    function draw(plot, neighbor) {\n        var hl = plot.plugins.highlighter;\n        var s = plot.series[neighbor.seriesIndex];\n        var smr = s.markerRenderer;\n        var mr = hl.markerRenderer;\n        mr.style = smr.style;\n        mr.lineWidth = smr.lineWidth + hl.lineWidthAdjust;\n        mr.size = smr.size + hl.sizeAdjust;\n        var rgba = $.jqplot.getColorComponents(smr.color);\n        var newrgb = [rgba[0], rgba[1], rgba[2]];\n        var alpha = (rgba[3] >= 0.6) ? rgba[3]*0.6 : rgba[3]*(2-rgba[3]);\n        mr.color = 'rgba('+newrgb[0]+','+newrgb[1]+','+newrgb[2]+','+alpha+')';\n        mr.init();\n        mr.draw(s.gridData[neighbor.pointIndex][0], s.gridData[neighbor.pointIndex][1], hl.highlightCanvas._ctx);\n    }\n    \n    function showTooltip(plot, series, neighbor) {\n        // neighbor looks like: {seriesIndex: i, pointIndex:j, gridData:p, data:s.data[j]}\n        // gridData should be x,y pixel coords on the grid.\n        // add the plot._gridPadding to that to get x,y in the target.\n        var hl = plot.plugins.highlighter;\n        var elem = hl._tooltipElem;\n        var serieshl = series.highlighter || {};\n\n        var opts = $.extend(true, {}, hl, serieshl);\n\n        if (opts.useAxesFormatters) {\n            var xf = series._xaxis._ticks[0].formatter;\n            var yf = series._yaxis._ticks[0].formatter;\n            var xfstr = series._xaxis._ticks[0].formatString;\n            var yfstr = series._yaxis._ticks[0].formatString;\n            var str;\n            var xstr = xf(xfstr, neighbor.data[0]);\n            var ystrs = [];\n            for (var i=1; i<opts.yvalues+1; i++) {\n                ystrs.push(yf(yfstr, neighbor.data[i]));\n            }\n            if (typeof opts.formatString === 'string') {\n                switch (opts.tooltipAxes) {\n                    case 'both':\n                    case 'xy':\n                        ystrs.unshift(xstr);\n                        ystrs.unshift(opts.formatString);\n                        str = $.jqplot.sprintf.apply($.jqplot.sprintf, ystrs);\n                        break;\n                    case 'yx':\n                        ystrs.push(xstr);\n                        ystrs.unshift(opts.formatString);\n                        str = $.jqplot.sprintf.apply($.jqplot.sprintf, ystrs);\n                        break;\n                    case 'x':\n                        str = $.jqplot.sprintf.apply($.jqplot.sprintf, [opts.formatString, xstr]);\n                        break;\n                    case 'y':\n                        ystrs.unshift(opts.formatString);\n                        str = $.jqplot.sprintf.apply($.jqplot.sprintf, ystrs);\n                        break;\n                    default: // same as xy\n                        ystrs.unshift(xstr);\n                        ystrs.unshift(opts.formatString);\n                        str = $.jqplot.sprintf.apply($.jqplot.sprintf, ystrs);\n                        break;\n                } \n            }\n            else {\n                switch (opts.tooltipAxes) {\n                    case 'both':\n                    case 'xy':\n                        str = xstr;\n                        for (var i=0; i<ystrs.length; i++) {\n                            str += opts.tooltipSeparator + ystrs[i];\n                        }\n                        break;\n                    case 'yx':\n                        str = '';\n                        for (var i=0; i<ystrs.length; i++) {\n                            str += ystrs[i] + opts.tooltipSeparator;\n                        }\n                        str += xstr;\n                        break;\n                    case 'x':\n                        str = xstr;\n                        break;\n                    case 'y':\n                        str = ystrs.join(opts.tooltipSeparator);\n                        break;\n                    default: // same as 'xy'\n                        str = xstr;\n                        for (var i=0; i<ystrs.length; i++) {\n                            str += opts.tooltipSeparator + ystrs[i];\n                        }\n                        break;\n                    \n                }                \n            }\n        }\n        else {\n            var str;\n            if (typeof opts.formatString ===  'string') {\n                str = $.jqplot.sprintf.apply($.jqplot.sprintf, [opts.formatString].concat(neighbor.data));\n            }\n\n            else {\n                if (opts.tooltipAxes == 'both' || opts.tooltipAxes == 'xy') {\n                    str = $.jqplot.sprintf(opts.tooltipFormatString, neighbor.data[0]) + opts.tooltipSeparator + $.jqplot.sprintf(opts.tooltipFormatString, neighbor.data[1]);\n                }\n                else if (opts.tooltipAxes == 'yx') {\n                    str = $.jqplot.sprintf(opts.tooltipFormatString, neighbor.data[1]) + opts.tooltipSeparator + $.jqplot.sprintf(opts.tooltipFormatString, neighbor.data[0]);\n                }\n                else if (opts.tooltipAxes == 'x') {\n                    str = $.jqplot.sprintf(opts.tooltipFormatString, neighbor.data[0]);\n                }\n                else if (opts.tooltipAxes == 'y') {\n                    str = $.jqplot.sprintf(opts.tooltipFormatString, neighbor.data[1]);\n                } \n            }\n        }\n        if ($.isFunction(opts.tooltipContentEditor)) {\n            // args str, seriesIndex, pointIndex are essential so the hook can look up\n            // extra data for the point.\n            str = opts.tooltipContentEditor(str, neighbor.seriesIndex, neighbor.pointIndex, plot);\n        }\n        elem.html(str);\n        var gridpos = {x:neighbor.gridData[0], y:neighbor.gridData[1]};\n        var ms = 0;\n        var fact = 0.707;\n        if (series.markerRenderer.show == true) { \n            ms = (series.markerRenderer.size + opts.sizeAdjust)/2;\n        }\n\n        var loc = locations;\n        if (series.fillToZero && series.fill && neighbor.data[1] < 0) {\n          loc = oppositeLocations;\n        }\n\n        switch (loc[locationIndicies[opts.tooltipLocation]]) {\n            case 'nw':\n                var x = gridpos.x + plot._gridPadding.left - elem.outerWidth(true) - opts.tooltipOffset - fact * ms;\n                var y = gridpos.y + plot._gridPadding.top - opts.tooltipOffset - elem.outerHeight(true) - fact * ms;\n                break;\n            case 'n':\n                var x = gridpos.x + plot._gridPadding.left - elem.outerWidth(true)/2;\n                var y = gridpos.y + plot._gridPadding.top - opts.tooltipOffset - elem.outerHeight(true) - ms;\n                break;\n            case 'ne':\n                var x = gridpos.x + plot._gridPadding.left + opts.tooltipOffset + fact * ms;\n                var y = gridpos.y + plot._gridPadding.top - opts.tooltipOffset - elem.outerHeight(true) - fact * ms;\n                break;\n            case 'e':\n                var x = gridpos.x + plot._gridPadding.left + opts.tooltipOffset + ms;\n                var y = gridpos.y + plot._gridPadding.top - elem.outerHeight(true)/2;\n                break;\n            case 'se':\n                var x = gridpos.x + plot._gridPadding.left + opts.tooltipOffset + fact * ms;\n                var y = gridpos.y + plot._gridPadding.top + opts.tooltipOffset + fact * ms;\n                break;\n            case 's':\n                var x = gridpos.x + plot._gridPadding.left - elem.outerWidth(true)/2;\n                var y = gridpos.y + plot._gridPadding.top + opts.tooltipOffset + ms;\n                break;\n            case 'sw':\n                var x = gridpos.x + plot._gridPadding.left - elem.outerWidth(true) - opts.tooltipOffset - fact * ms;\n                var y = gridpos.y + plot._gridPadding.top + opts.tooltipOffset + fact * ms;\n                break;\n            case 'w':\n                var x = gridpos.x + plot._gridPadding.left - elem.outerWidth(true) - opts.tooltipOffset - ms;\n                var y = gridpos.y + plot._gridPadding.top - elem.outerHeight(true)/2;\n                break;\n            default: // same as 'nw'\n                var x = gridpos.x + plot._gridPadding.left - elem.outerWidth(true) - opts.tooltipOffset - fact * ms;\n                var y = gridpos.y + plot._gridPadding.top - opts.tooltipOffset - elem.outerHeight(true) - fact * ms;\n                break;\n        }\n        elem.css('left', x);\n        elem.css('top', y);\n        if (opts.fadeTooltip) {\n            // Fix for stacked up animations.  Thnanks Trevor!\n            elem.stop(true,true).fadeIn(opts.tooltipFadeSpeed);\n        }\n        else {\n            elem.show();\n        }\n        elem = null;\n        \n    }\n    \n    function handleMove(ev, gridpos, datapos, neighbor, plot) {\n        var hl = plot.plugins.highlighter;\n        var c = plot.plugins.cursor;\n        if (hl.show) {\n            if (neighbor == null && hl.isHighlighting) {\n                var evt = jQuery.Event('jqplotHighlighterUnhighlight');\n                plot.target.trigger(evt);\n\n                var ctx = hl.highlightCanvas._ctx;\n                ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height);\n                if (hl.fadeTooltip) {\n                    hl._tooltipElem.fadeOut(hl.tooltipFadeSpeed);\n                }\n                else {\n                    hl._tooltipElem.hide();\n                }\n                if (hl.bringSeriesToFront) {\n                    plot.restorePreviousSeriesOrder();\n                }\n                hl.isHighlighting = false;\n                hl.currentNeighbor = null;\n                ctx = null;\n            }\n            else if (neighbor != null && plot.series[neighbor.seriesIndex].showHighlight && !hl.isHighlighting) {\n                var evt = jQuery.Event('jqplotHighlighterHighlight');\n                evt.which = ev.which;\n                evt.pageX = ev.pageX;\n                evt.pageY = ev.pageY;\n                var ins = [neighbor.seriesIndex, neighbor.pointIndex, neighbor.data, plot];\n                plot.target.trigger(evt, ins);\n\n                hl.isHighlighting = true;\n                hl.currentNeighbor = neighbor;\n                if (hl.showMarker) {\n                    draw(plot, neighbor);\n                }\n                if (plot.series[neighbor.seriesIndex].show && hl.showTooltip && (!c || !c._zoom.started)) {\n                    showTooltip(plot, plot.series[neighbor.seriesIndex], neighbor);\n                }\n                if (hl.bringSeriesToFront) {\n                    plot.moveSeriesToFront(neighbor.seriesIndex);\n                }\n            }\n            // check to see if we're highlighting the wrong point.\n            else if (neighbor != null && hl.isHighlighting && hl.currentNeighbor != neighbor) {\n                // highlighting the wrong point.\n\n                // if new series allows highlighting, highlight new point.\n                if (plot.series[neighbor.seriesIndex].showHighlight) {\n                    var ctx = hl.highlightCanvas._ctx;\n                    ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height);\n                    hl.isHighlighting = true;\n                    hl.currentNeighbor = neighbor;\n                    if (hl.showMarker) {\n                        draw(plot, neighbor);\n                    }\n                    if (plot.series[neighbor.seriesIndex].show && hl.showTooltip && (!c || !c._zoom.started)) {\n                        showTooltip(plot, plot.series[neighbor.seriesIndex], neighbor);\n                    }\n                    if (hl.bringSeriesToFront) {\n                        plot.moveSeriesToFront(neighbor.seriesIndex);\n                    }                    \n                }                \n            }\n        }\n    }\n})(jQuery);"
  },
  {
    "path": "stenogotchi/ui/web/static/js/plugins/jqplot.json2.js",
    "content": "/*\n    2010-11-01 Chris Leonello\n    \n    Slightly modified version of the original json2.js to put JSON\n    functions under the $.jqplot namespace.\n    \n    licensing and orignal comments follow:\n    \n    http://www.JSON.org/json2.js\n    2010-08-25\n    \n    Public Domain.\n\n    NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.\n\n    See http://www.JSON.org/js.html\n\n\n    This code should be minified before deployment.\n    See http://javascript.crockford.com/jsmin.html\n\n    USE YOUR OWN COPY. IT IS EXTREMELY UNWISE TO LOAD CODE FROM SERVERS YOU DO\n    NOT CONTROL.\n\n\n    This file creates a global JSON object containing two methods: stringify\n    and parse.\n\n        $.jqplot.JSON.stringify(value, replacer, space)\n            value       any JavaScript value, usually an object or array.\n\n            replacer    an optional parameter that determines how object\n                        values are stringified for objects. It can be a\n                        function or an array of strings.\n\n            space       an optional parameter that specifies the indentation\n                        of nested structures. If it is omitted, the text will\n                        be packed without extra whitespace. If it is a number,\n                        it will specify the number of spaces to indent at each\n                        level. If it is a string (such as '\\t' or '&nbsp;'),\n                        it contains the characters used to indent at each level.\n\n            This method produces a JSON text from a JavaScript value.\n\n            When an object value is found, if the object contains a toJSON\n            method, its toJSON method will be called and the result will be\n            stringified. A toJSON method does not serialize: it returns the\n            value represented by the name/value pair that should be serialized,\n            or undefined if nothing should be serialized. The toJSON method\n            will be passed the key associated with the value, and this will be\n            bound to the value\n\n            For example, this would serialize Dates as ISO strings.\n\n                Date.prototype.toJSON = function (key) {\n                    function f(n) {\n                        // Format integers to have at least two digits.\n                        return n < 10 ? '0' + n : n;\n                    }\n\n                    return this.getUTCFullYear()   + '-' +\n                         f(this.getUTCMonth() + 1) + '-' +\n                         f(this.getUTCDate())      + 'T' +\n                         f(this.getUTCHours())     + ':' +\n                         f(this.getUTCMinutes())   + ':' +\n                         f(this.getUTCSeconds())   + 'Z';\n                };\n\n            You can provide an optional replacer method. It will be passed the\n            key and value of each member, with this bound to the containing\n            object. The value that is returned from your method will be\n            serialized. If your method returns undefined, then the member will\n            be excluded from the serialization.\n\n            If the replacer parameter is an array of strings, then it will be\n            used to select the members to be serialized. It filters the results\n            such that only members with keys listed in the replacer array are\n            stringified.\n\n            Values that do not have JSON representations, such as undefined or\n            functions, will not be serialized. Such values in objects will be\n            dropped; in arrays they will be replaced with null. You can use\n            a replacer function to replace those with JSON values.\n            $.jqplot.JSON.stringify(undefined) returns undefined.\n\n            The optional space parameter produces a stringification of the\n            value that is filled with line breaks and indentation to make it\n            easier to read.\n\n            If the space parameter is a non-empty string, then that string will\n            be used for indentation. If the space parameter is a number, then\n            the indentation will be that many spaces.\n\n            Example:\n\n            text = $.jqplot.JSON.stringify(['e', {pluribus: 'unum'}]);\n            // text is '[\"e\",{\"pluribus\":\"unum\"}]'\n\n\n            text = $.jqplot.JSON.stringify(['e', {pluribus: 'unum'}], null, '\\t');\n            // text is '[\\n\\t\"e\",\\n\\t{\\n\\t\\t\"pluribus\": \"unum\"\\n\\t}\\n]'\n\n            text = $.jqplot.JSON.stringify([new Date()], function (key, value) {\n                return this[key] instanceof Date ?\n                    'Date(' + this[key] + ')' : value;\n            });\n            // text is '[\"Date(---current time---)\"]'\n\n\n        $.jqplot.JSON.parse(text, reviver)\n            This method parses a JSON text to produce an object or array.\n            It can throw a SyntaxError exception.\n\n            The optional reviver parameter is a function that can filter and\n            transform the results. It receives each of the keys and values,\n            and its return value is used instead of the original value.\n            If it returns what it received, then the structure is not modified.\n            If it returns undefined then the member is deleted.\n\n            Example:\n\n            // Parse the text. Values that look like ISO date strings will\n            // be converted to Date objects.\n\n            myData = $.jqplot.JSON.parse(text, function (key, value) {\n                var a;\n                if (typeof value === 'string') {\n                    a =\n/^(\\d{4})-(\\d{2})-(\\d{2})T(\\d{2}):(\\d{2}):(\\d{2}(?:\\.\\d*)?)Z$/.exec(value);\n                    if (a) {\n                        return new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4],\n                            +a[5], +a[6]));\n                    }\n                }\n                return value;\n            });\n\n            myData = $.jqplot.JSON.parse('[\"Date(09/09/2001)\"]', function (key, value) {\n                var d;\n                if (typeof value === 'string' &&\n                        value.slice(0, 5) === 'Date(' &&\n                        value.slice(-1) === ')') {\n                    d = new Date(value.slice(5, -1));\n                    if (d) {\n                        return d;\n                    }\n                }\n                return value;\n            });\n\n\n    This is a reference implementation. You are free to copy, modify, or\n    redistribute.\n*/\n\n(function($) {\n\n    $.jqplot.JSON = window.JSON;\n\n    if (!window.JSON) {\n        $.jqplot.JSON = {};\n    }\n    \n    function f(n) {\n        // Format integers to have at least two digits.\n        return n < 10 ? '0' + n : n;\n    }\n\n    if (typeof Date.prototype.toJSON !== 'function') {\n\n        Date.prototype.toJSON = function (key) {\n\n            return isFinite(this.valueOf()) ?\n                   this.getUTCFullYear()   + '-' +\n                 f(this.getUTCMonth() + 1) + '-' +\n                 f(this.getUTCDate())      + 'T' +\n                 f(this.getUTCHours())     + ':' +\n                 f(this.getUTCMinutes())   + ':' +\n                 f(this.getUTCSeconds())   + 'Z' : null;\n        };\n\n        String.prototype.toJSON =\n        Number.prototype.toJSON =\n        Boolean.prototype.toJSON = function (key) {\n            return this.valueOf();\n        };\n    }\n\n    var cx = /[\\u0000\\u00ad\\u0600-\\u0604\\u070f\\u17b4\\u17b5\\u200c-\\u200f\\u2028-\\u202f\\u2060-\\u206f\\ufeff\\ufff0-\\uffff]/g,\n        escapable = /[\\\\\\\"\\x00-\\x1f\\x7f-\\x9f\\u00ad\\u0600-\\u0604\\u070f\\u17b4\\u17b5\\u200c-\\u200f\\u2028-\\u202f\\u2060-\\u206f\\ufeff\\ufff0-\\uffff]/g,\n        gap,\n        indent,\n        meta = {    // table of character substitutions\n            '\\b': '\\\\b',\n            '\\t': '\\\\t',\n            '\\n': '\\\\n',\n            '\\f': '\\\\f',\n            '\\r': '\\\\r',\n            '\"' : '\\\\\"',\n            '\\\\': '\\\\\\\\'\n        },\n        rep;\n\n\n    function quote(string) {\n\n// If the string contains no control characters, no quote characters, and no\n// backslash characters, then we can safely slap some quotes around it.\n// Otherwise we must also replace the offending characters with safe escape\n// sequences.\n\n        escapable.lastIndex = 0;\n        return escapable.test(string) ?\n            '\"' + string.replace(escapable, function (a) {\n                var c = meta[a];\n                return typeof c === 'string' ? c :\n                    '\\\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4);\n            }) + '\"' :\n            '\"' + string + '\"';\n    }\n\n\n    function str(key, holder) {\n\n// Produce a string from holder[key].\n\n        var i,          // The loop counter.\n            k,          // The member key.\n            v,          // The member value.\n            length,\n            mind = gap,\n            partial,\n            value = holder[key];\n\n// If the value has a toJSON method, call it to obtain a replacement value.\n\n        if (value && typeof value === 'object' &&\n                typeof value.toJSON === 'function') {\n            value = value.toJSON(key);\n        }\n\n// If we were called with a replacer function, then call the replacer to\n// obtain a replacement value.\n\n        if (typeof rep === 'function') {\n            value = rep.call(holder, key, value);\n        }\n\n// What happens next depends on the value's type.\n\n        switch (typeof value) {\n        case 'string':\n            return quote(value);\n\n        case 'number':\n\n// JSON numbers must be finite. Encode non-finite numbers as null.\n\n            return isFinite(value) ? String(value) : 'null';\n\n        case 'boolean':\n        case 'null':\n\n// If the value is a boolean or null, convert it to a string. Note:\n// typeof null does not produce 'null'. The case is included here in\n// the remote chance that this gets fixed someday.\n\n            return String(value);\n\n// If the type is 'object', we might be dealing with an object or an array or\n// null.\n\n        case 'object':\n\n// Due to a specification blunder in ECMAScript, typeof null is 'object',\n// so watch out for that case.\n\n            if (!value) {\n                return 'null';\n            }\n\n// Make an array to hold the partial results of stringifying this object value.\n\n            gap += indent;\n            partial = [];\n\n// Is the value an array?\n\n            if (Object.prototype.toString.apply(value) === '[object Array]') {\n\n// The value is an array. Stringify every element. Use null as a placeholder\n// for non-JSON values.\n\n                length = value.length;\n                for (i = 0; i < length; i += 1) {\n                    partial[i] = str(i, value) || 'null';\n                }\n\n// Join all of the elements together, separated with commas, and wrap them in\n// brackets.\n\n                v = partial.length === 0 ? '[]' :\n                    gap ? '[\\n' + gap +\n                            partial.join(',\\n' + gap) + '\\n' +\n                                mind + ']' :\n                          '[' + partial.join(',') + ']';\n                gap = mind;\n                return v;\n            }\n\n// If the replacer is an array, use it to select the members to be stringified.\n\n            if (rep && typeof rep === 'object') {\n                length = rep.length;\n                for (i = 0; i < length; i += 1) {\n                    k = rep[i];\n                    if (typeof k === 'string') {\n                        v = str(k, value);\n                        if (v) {\n                            partial.push(quote(k) + (gap ? ': ' : ':') + v);\n                        }\n                    }\n                }\n            } else {\n\n// Otherwise, iterate through all of the keys in the object.\n\n                for (k in value) {\n                    if (Object.hasOwnProperty.call(value, k)) {\n                        v = str(k, value);\n                        if (v) {\n                            partial.push(quote(k) + (gap ? ': ' : ':') + v);\n                        }\n                    }\n                }\n            }\n\n// Join all of the member texts together, separated with commas,\n// and wrap them in braces.\n\n            v = partial.length === 0 ? '{}' :\n                gap ? '{\\n' + gap + partial.join(',\\n' + gap) + '\\n' +\n                        mind + '}' : '{' + partial.join(',') + '}';\n            gap = mind;\n            return v;\n        }\n    }\n\n// If the JSON object does not yet have a stringify method, give it one.\n\n    if (typeof $.jqplot.JSON.stringify !== 'function') {\n        $.jqplot.JSON.stringify = function (value, replacer, space) {\n\n// The stringify method takes a value and an optional replacer, and an optional\n// space parameter, and returns a JSON text. The replacer can be a function\n// that can replace values, or an array of strings that will select the keys.\n// A default replacer method can be provided. Use of the space parameter can\n// produce text that is more easily readable.\n\n            var i;\n            gap = '';\n            indent = '';\n\n// If the space parameter is a number, make an indent string containing that\n// many spaces.\n\n            if (typeof space === 'number') {\n                for (i = 0; i < space; i += 1) {\n                    indent += ' ';\n                }\n\n// If the space parameter is a string, it will be used as the indent string.\n\n            } else if (typeof space === 'string') {\n                indent = space;\n            }\n\n// If there is a replacer, it must be a function or an array.\n// Otherwise, throw an error.\n\n            rep = replacer;\n            if (replacer && typeof replacer !== 'function' &&\n                    (typeof replacer !== 'object' ||\n                     typeof replacer.length !== 'number')) {\n                throw new Error('$.jqplot.JSON.stringify');\n            }\n\n// Make a fake root object containing our value under the key of ''.\n// Return the result of stringifying the value.\n\n            return str('', {'': value});\n        };\n    }\n\n\n// If the JSON object does not yet have a parse method, give it one.\n\n    if (typeof $.jqplot.JSON.parse !== 'function') {\n        $.jqplot.JSON.parse = function (text, reviver) {\n\n// The parse method takes a text and an optional reviver function, and returns\n// a JavaScript value if the text is a valid JSON text.\n\n            var j;\n\n            function walk(holder, key) {\n\n// The walk method is used to recursively walk the resulting structure so\n// that modifications can be made.\n\n                var k, v, value = holder[key];\n                if (value && typeof value === 'object') {\n                    for (k in value) {\n                        if (Object.hasOwnProperty.call(value, k)) {\n                            v = walk(value, k);\n                            if (v !== undefined) {\n                                value[k] = v;\n                            } else {\n                                delete value[k];\n                            }\n                        }\n                    }\n                }\n                return reviver.call(holder, key, value);\n            }\n\n\n// Parsing happens in four stages. In the first stage, we replace certain\n// Unicode characters with escape sequences. JavaScript handles many characters\n// incorrectly, either silently deleting them, or treating them as line endings.\n\n            text = String(text);\n            cx.lastIndex = 0;\n            if (cx.test(text)) {\n                text = text.replace(cx, function (a) {\n                    return '\\\\u' +\n                        ('0000' + a.charCodeAt(0).toString(16)).slice(-4);\n                });\n            }\n\n// In the second stage, we run the text against regular expressions that look\n// for non-JSON patterns. We are especially concerned with '()' and 'new'\n// because they can cause invocation, and '=' because it can cause mutation.\n// But just to be safe, we want to reject all unexpected forms.\n\n// We split the second stage into 4 regexp operations in order to work around\n// crippling inefficiencies in IE's and Safari's regexp engines. First we\n// replace the JSON backslash pairs with '@' (a non-JSON character). Second, we\n// replace all simple value tokens with ']' characters. Third, we delete all\n// open brackets that follow a colon or comma or that begin the text. Finally,\n// we look to see that the remaining characters are only whitespace or ']' or\n// ',' or ':' or '{' or '}'. If that is so, then the text is safe for eval.\n\n            if (/^[\\],:{}\\s]*$/.test(text.replace(/\\\\(?:[\"\\\\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@').replace(/\"[^\"\\\\\\n\\r]*\"|true|false|null|-?\\d+(?:\\.\\d*)?(?:[eE][+\\-]?\\d+)?/g, ']').replace(/(?:^|:|,)(?:\\s*\\[)+/g, ''))) {\n\n// In the third stage we use the eval function to compile the text into a\n// JavaScript structure. The '{' operator is subject to a syntactic ambiguity\n// in JavaScript: it can begin a block or an object literal. We wrap the text\n// in parens to eliminate the ambiguity.\n\n                j = eval('(' + text + ')');\n\n// In the optional fourth stage, we recursively walk the new structure, passing\n// each name/value pair to a reviver function for possible transformation.\n\n                return typeof reviver === 'function' ?\n                    walk({'': j}, '') : j;\n            }\n\n// If the text is not JSON parseable, then a SyntaxError is thrown.\n\n            throw new SyntaxError('$.jqplot.JSON.parse');\n        };\n    }\n})(jQuery);\n"
  },
  {
    "path": "stenogotchi/ui/web/static/js/plugins/jqplot.logAxisRenderer.js",
    "content": "/**\n * jqPlot\n * Pure JavaScript plotting plugin using jQuery\n *\n * Version: 1.0.9\n * Revision: d96a669\n *\n * Copyright (c) 2009-2016 Chris Leonello\n * jqPlot is currently available for use in all personal or commercial projects \n * under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL \n * version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can \n * choose the license that best suits your project and use it accordingly. \n *\n * Although not required, the author would appreciate an email letting him \n * know of any substantial use of jqPlot.  You can reach the author at: \n * chris at jqplot dot com or see http://www.jqplot.com/info.php .\n *\n * If you are feeling kind and generous, consider supporting the project by\n * making a donation at: http://www.jqplot.com/donate.php .\n *\n * sprintf functions contained in jqplot.sprintf.js by Ash Searle:\n *\n *     version 2007.04.27\n *     author Ash Searle\n *     http://hexmen.com/blog/2007/03/printf-sprintf/\n *     http://hexmen.com/js/sprintf.js\n *     The author (Ash Searle) has placed this code in the public domain:\n *     \"This code is unrestricted: you are free to use it however you like.\"\n * \n */\n(function($) {\n    /**\n    *  class: $.jqplot.LogAxisRenderer\n    *  A plugin for a jqPlot to render a logarithmic axis.\n    * \n    *  To use this renderer, include the plugin in your source\n    *  > <script type=\"text/javascript\" language=\"javascript\" src=\"plugins/jqplot.logAxisRenderer.js\"></script>\n    *  \n    *  and supply the appropriate options to your plot\n    *  \n    *  > {axes:{xaxis:{renderer:$.jqplot.LogAxisRenderer}}}\n    **/ \n    $.jqplot.LogAxisRenderer = function() {\n        $.jqplot.LinearAxisRenderer.call(this);\n        // prop: axisDefaults\n        // Default properties which will be applied directly to the series.\n        //\n        // Group: Properties\n        //\n        // Properties\n        //\n        // base - the logarithmic base, commonly 2, 10 or Math.E\n        // tickDistribution - Deprecated.  \"power\" distribution of ticks\n        // always used.  Option has no effect.\n        this.axisDefaults = {\n            base : 10,\n            tickDistribution :'power'\n        };\n    };\n    \n    $.jqplot.LogAxisRenderer.prototype = new $.jqplot.LinearAxisRenderer();\n    $.jqplot.LogAxisRenderer.prototype.constructor = $.jqplot.LogAxisRenderer;\n    \n    $.jqplot.LogAxisRenderer.prototype.init = function(options) {\n        // prop: drawBaseline\n        // True to draw the axis baseline.\n        this.drawBaseline = true;\n        // prop: minorTicks\n        // Number of ticks to add between \"major\" ticks.\n        // Major ticks are ticks supplied by user or auto computed.\n        // Minor ticks cannot be created by user.\n        this.minorTicks = 'auto';\n        this._scalefact = 1.0;\n\n        $.extend(true, this, options);\n\n        this._autoFormatString = '%d';\n        this._overrideFormatString = false;\n\n        for (var d in this.renderer.axisDefaults) {\n            if (this[d] == null) {\n                this[d] = this.renderer.axisDefaults[d];\n            }\n        }\n\n        this.resetDataBounds();\n    };\n    \n    $.jqplot.LogAxisRenderer.prototype.createTicks = function(plot) {\n        // we're are operating on an axis here\n        var ticks = this._ticks;\n        var userTicks = this.ticks;\n        var name = this.name;\n        var db = this._dataBounds;\n        var dim = (this.name.charAt(0) === 'x') ? this._plotDimensions.width : this._plotDimensions.height;\n        var interval;\n        var min, max;\n        var pos1, pos2;\n        var tt, i;\n\n        var threshold = 30;\n        // For some reason scalefactor is screwing up ticks.\n        this._scalefact =  (Math.max(dim, threshold+1) - threshold)/300;\n\n        // if we already have ticks, use them.\n        // ticks must be in order of increasing value.\n        if (userTicks.length) {\n            // ticks could be 1D or 2D array of [val, val, ,,,] or [[val, label], [val, label], ...] or mixed\n            for (i=0; i<userTicks.length; i++){\n                var ut = userTicks[i];\n                var t = new this.tickRenderer(this.tickOptions);\n                if (ut.constructor == Array) {\n                    t.value = ut[0];\n                    t.label = ut[1];\n                    if (!this.showTicks) {\n                        t.showLabel = false;\n                        t.showMark = false;\n                    }\n                    else if (!this.showTickMarks) {\n                        t.showMark = false;\n                    }\n                    t.setTick(ut[0], this.name);\n                    this._ticks.push(t);\n                }\n\n                else if ($.isPlainObject(ut)) {\n                    $.extend(true, t, ut);\n                    t.axis = this.name;\n                    this._ticks.push(t);\n                }\n                \n                else {\n                    t.value = ut;\n                    if (!this.showTicks) {\n                        t.showLabel = false;\n                        t.showMark = false;\n                    }\n                    else if (!this.showTickMarks) {\n                        t.showMark = false;\n                    }\n                    t.setTick(ut, this.name);\n                    this._ticks.push(t);\n                }\n            }\n            this.numberTicks = userTicks.length;\n            this.min = this._ticks[0].value;\n            this.max = this._ticks[this.numberTicks-1].value;\n        }\n        \n        // we don't have any ticks yet, let's make some!\n        else if (this.min == null && this.max == null) {\n            min = db.min * (2 - this.padMin);\n            max = db.max * this.padMax;\n            \n            // if min and max are same, space them out a bit\n            if (min == max) {\n                var adj = 0.05;\n                min = min*(1-adj);\n                max = max*(1+adj);\n            }\n            \n            // perform some checks\n            if (this.min != null && this.min <= 0) {\n                throw new Error(\"Log axis minimum must be greater than 0\");\n            }\n            if (this.max != null && this.max <= 0) {\n                throw new Error(\"Log axis maximum must be greater than 0\");\n            }\n\n            function findCeil (val) {\n                var order = Math.pow(10, Math.floor(Math.log(val)/Math.LN10));\n                return Math.ceil(val/order) * order;\n            }\n\n            function findFloor(val) {\n                var order = Math.pow(10, Math.floor(Math.log(val)/Math.LN10));\n                return Math.floor(val/order) * order;\n            }\n\n            // var range = max - min;\n            var rmin, rmax;\n\n            // for power distribution, open up range to get a nice power of axis.renderer.base.\n            // power distribution won't respect the user's min/max settings.\n            rmin = Math.pow(this.base, Math.floor(Math.log(min)/Math.log(this.base)));\n            rmax = Math.pow(this.base, Math.ceil(Math.log(max)/Math.log(this.base)));\n\n            // // if min and max are same, space them out a bit\n            // if (rmin === rmax) {\n            //     var adj = 0.05;\n            //     rmin = rmin*(1-adj);\n            //     rmax = rmax*(1+adj);\n            // }\n\n            // Handle case where a data value was zero\n            if (rmin === 0) {\n              rmin = 1;\n            }\n\n            var order = Math.round(Math.log(rmin)/Math.LN10);\n\n            if (this.tickOptions == null || !this.tickOptions.formatString) {\n                this._overrideFormatString = true;\n            }\n\n            this.min = rmin;\n            this.max = rmax;\n            var range = this.max - this.min;            \n\n            var minorTicks = (this.minorTicks === 'auto') ? 0 : this.minorTicks;\n            var numberTicks;\n            if (this.numberTicks == null){\n                if (dim > 140) {\n                    numberTicks = Math.round(Math.log(this.max/this.min)/Math.log(this.base) + 1);\n                    if (numberTicks < 2) {\n                        numberTicks = 2;\n                    }\n                    if (minorTicks === 0) {\n                        var temp = dim/(numberTicks - 1);\n                        if (temp < 100) {\n                            minorTicks = 0;\n                        }\n                        else if (temp < 190) {\n                            minorTicks = 1;\n                        }\n                        else if (temp < 250) {\n                            minorTicks = 3;\n                        }\n                        else if (temp < 600) {\n                            minorTicks = 4;\n                        }\n                        else {\n                            minorTicks = 9;\n                        }\n                    }\n                }\n                else {\n                    numberTicks = 2;\n                    if (minorTicks === 0) {\n                        minorTicks = 1;\n                    }\n                    minorTicks = 0;\n                }\n            }\n            else {\n                numberTicks = this.numberTicks;\n            }\n\n            if (order >= 0 && minorTicks !== 3) {\n                this._autoFormatString = '%d';\n            }\n            // Adjust format string for case with 3 ticks where we'll have like 1, 2.5, 5, 7.5, 10\n            else if (order <= 0 && minorTicks === 3) {\n                var temp = -(order - 1);\n                this._autoFormatString = '%.'+ Math.abs(order-1) + 'f';\n            }\n\n            // Adjust format string for values less than 1.\n            else if (order < 0) {\n                var temp = -order;\n                this._autoFormatString = '%.'+ Math.abs(order) + 'f';\n            }\n\n            else {\n                this._autoFormatString = '%d';\n            }\n\n            var to, t, val, tt1, spread, interval;\n            for (var i=0; i<numberTicks; i++){\n                tt = Math.pow(this.base, i - numberTicks + 1) * this.max;\n\n                t = new this.tickRenderer(this.tickOptions);\n            \n                if (this._overrideFormatString) {\n                    t.formatString = this._autoFormatString;\n                }\n                \n                if (!this.showTicks) {\n                    t.showLabel = false;\n                    t.showMark = false;\n                }\n                else if (!this.showTickMarks) {\n                    t.showMark = false;\n                }\n                t.setTick(tt, this.name);\n                this._ticks.push(t);\n\n                if (minorTicks && i<numberTicks-1) {\n                    tt1 = Math.pow(this.base, i - numberTicks + 2) * this.max;\n                    spread = tt1 - tt;\n                    interval = tt1 / (minorTicks+1);\n                    for (var j=minorTicks-1; j>=0; j--) {\n                        val = tt1-interval*(j+1);\n                        t = new this.tickRenderer(this.tickOptions);\n            \n                        if (this._overrideFormatString && this._autoFormatString != '') {\n                            t.formatString = this._autoFormatString;\n                        }\n                        if (!this.showTicks) {\n                            t.showLabel = false;\n                            t.showMark = false;\n                        }\n                        else if (!this.showTickMarks) {\n                            t.showMark = false;\n                        }\n                        t.setTick(val, this.name);\n                        this._ticks.push(t);\n                    }\n                }       \n            }     \n        }\n\n        // min and max are set as would be the case with zooming\n        else if (this.min != null && this.max != null) {\n            var opts = $.extend(true, {}, this.tickOptions, {name: this.name, value: null});\n            var nt, ti;\n            // don't have an interval yet, pick one that gives the most\n            // \"round\" ticks we can get.\n            if (this.numberTicks == null && this.tickInterval == null) {\n                // var threshold = 30;\n                var tdim = Math.max(dim, threshold+1);\n                var nttarget =  Math.ceil((tdim-threshold)/35 + 1);\n\n                var ret = $.jqplot.LinearTickGenerator.bestConstrainedInterval(this.min, this.max, nttarget);\n\n                this._autoFormatString = ret[3];\n                nt = ret[2];\n                ti = ret[4];\n\n                for (var i=0; i<nt; i++) {\n                    opts.value = this.min + i * ti;\n                    t = new this.tickRenderer(opts);\n                    \n                    if (this._overrideFormatString && this._autoFormatString != '') {\n                        t.formatString = this._autoFormatString;\n                    }\n                    if (!this.showTicks) {\n                        t.showLabel = false;\n                        t.showMark = false;\n                    }\n                    else if (!this.showTickMarks) {\n                        t.showMark = false;\n                    }\n                    this._ticks.push(t);\n                }\n            }\n\n            // for loose zoom, number ticks and interval are also set.\n            else if (this.numberTicks != null && this.tickInterval != null) {\n                nt = this.numberTicks;\n                for (var i=0; i<nt; i++) {\n                    opts.value = this.min + i * this.tickInterval;\n                    t = new this.tickRenderer(opts);\n                    \n                    if (this._overrideFormatString && this._autoFormatString != '') {\n                        t.formatString = this._autoFormatString;\n                    }\n                    if (!this.showTicks) {\n                        t.showLabel = false;\n                        t.showMark = false;\n                    }\n                    else if (!this.showTickMarks) {\n                        t.showMark = false;\n                    }\n                    this._ticks.push(t);\n                }\n            }\n        }\n    };\n    \n    $.jqplot.LogAxisRenderer.prototype.pack = function(pos, offsets) {\n        var lb = parseInt(this.base, 10);\n        var ticks = this._ticks;\n        var trans = function (v) { return Math.log(v)/Math.log(lb); };\n        var invtrans = function (v) { return Math.pow(Math.E, (Math.log(lb)*v)); };\n        var max = trans(this.max);\n        var min = trans(this.min);\n        var offmax = offsets.max;\n        var offmin = offsets.min;\n        var lshow = (this._label == null) ? false : this._label.show;\n        \n        for (var p in pos) {\n            this._elem.css(p, pos[p]);\n        }\n        \n        this._offsets = offsets;\n        // pixellength will be + for x axes and - for y axes becasue pixels always measured from top left.\n        var pixellength = offmax - offmin;\n        var unitlength = max - min;\n        \n        // point to unit and unit to point conversions references to Plot DOM element top left corner.\n        this.p2u = function(p){\n            return invtrans((p - offmin) * unitlength / pixellength + min);\n        };\n        \n        this.u2p = function(u){\n            return (trans(u) - min) * pixellength / unitlength + offmin;\n        };\n        \n        if (this.name == 'xaxis' || this.name == 'x2axis'){\n            this.series_u2p = function(u){\n                return (trans(u) - min) * pixellength / unitlength;\n            };\n            this.series_p2u = function(p){\n                return invtrans(p * unitlength / pixellength + min);\n            };\n        }\n        // yaxis is max at top of canvas.\n        else {\n            this.series_u2p = function(u){\n                return (trans(u) - max) * pixellength / unitlength;\n            };\n            this.series_p2u = function(p){\n                return invtrans(p * unitlength / pixellength + max);\n            };\n        }\n        \n        if (this.show) {\n            if (this.name == 'xaxis' || this.name == 'x2axis') {\n                for (var i=0; i<ticks.length; i++) {\n                    var t = ticks[i];\n                    if (t.show && t.showLabel) {\n                        var shim;\n                        \n                        if (t.constructor == $.jqplot.CanvasAxisTickRenderer && t.angle) {\n                            switch (t.labelPosition) {\n                                case 'auto':\n                                    // position at end\n                                    if (t.angle < 0) {\n                                        shim = -t.getWidth() + t._textRenderer.height * Math.sin(-t._textRenderer.angle) / 2;\n                                    }\n                                    // position at start\n                                    else {\n                                        shim = -t._textRenderer.height * Math.sin(t._textRenderer.angle) / 2;\n                                    }\n                                    break;\n                                case 'end':\n                                    shim = -t.getWidth() + t._textRenderer.height * Math.sin(-t._textRenderer.angle) / 2;\n                                    break;\n                                case 'start':\n                                    shim = -t._textRenderer.height * Math.sin(t._textRenderer.angle) / 2;\n                                    break;\n                                case 'middle':\n                                    shim = -t.getWidth()/2 + t._textRenderer.height * Math.sin(-t._textRenderer.angle) / 2;\n                                    break;\n                                default:\n                                    shim = -t.getWidth()/2 + t._textRenderer.height * Math.sin(-t._textRenderer.angle) / 2;\n                                    break;\n                            }\n                        }\n                        else {\n                            shim = -t.getWidth()/2;\n                        }\n                        // var shim = t.getWidth()/2;\n                        var val = this.u2p(t.value) + shim + 'px';\n                        t._elem.css('left', val);\n                        t.pack();\n                    }\n                }\n                if (lshow) {\n                    var w = this._label._elem.outerWidth(true);\n                    this._label._elem.css('left', offmin + pixellength/2 - w/2 + 'px');\n                    if (this.name == 'xaxis') {\n                        this._label._elem.css('bottom', '0px');\n                    }\n                    else {\n                        this._label._elem.css('top', '0px');\n                    }\n                    this._label.pack();\n                }\n            }\n            else {\n                for (var i=0; i<ticks.length; i++) {\n                    var t = ticks[i];\n                    if (t.show && t.showLabel) {                        \n                        var shim;\n                        if (t.constructor == $.jqplot.CanvasAxisTickRenderer && t.angle) {\n                            switch (t.labelPosition) {\n                                case 'auto':\n                                    // position at end\n                                case 'end':\n                                    if (t.angle < 0) {\n                                        shim = -t._textRenderer.height * Math.cos(-t._textRenderer.angle) / 2;\n                                    }\n                                    else {\n                                        shim = -t.getHeight() + t._textRenderer.height * Math.cos(t._textRenderer.angle) / 2;\n                                    }\n                                    break;\n                                case 'start':\n                                    if (t.angle > 0) {\n                                        shim = -t._textRenderer.height * Math.cos(-t._textRenderer.angle) / 2;\n                                    }\n                                    else {\n                                        shim = -t.getHeight() + t._textRenderer.height * Math.cos(t._textRenderer.angle) / 2;\n                                    }\n                                    break;\n                                case 'middle':\n                                    // if (t.angle > 0) {\n                                    //     shim = -t.getHeight()/2 + t._textRenderer.height * Math.sin(-t._textRenderer.angle) / 2;\n                                    // }\n                                    // else {\n                                    //     shim = -t.getHeight()/2 - t._textRenderer.height * Math.sin(t._textRenderer.angle) / 2;\n                                    // }\n                                    shim = -t.getHeight()/2;\n                                    break;\n                                default:\n                                    shim = -t.getHeight()/2;\n                                    break;\n                            }\n                        }\n                        else {\n                            shim = -t.getHeight()/2;\n                        }\n                        \n                        var val = this.u2p(t.value) + shim + 'px';\n                        t._elem.css('top', val);\n                        t.pack();\n                    }\n                }\n                if (lshow) {\n                    var h = this._label._elem.outerHeight(true);\n                    this._label._elem.css('top', offmax - pixellength/2 - h/2 + 'px');\n                    if (this.name == 'yaxis') {\n                        this._label._elem.css('left', '0px');\n                    }\n                    else {\n                        this._label._elem.css('right', '0px');\n                    }   \n                    this._label.pack();\n                }\n            }\n        }        \n    };\n})(jQuery);"
  },
  {
    "path": "stenogotchi/ui/web/static/js/plugins/jqplot.mekkoAxisRenderer.js",
    "content": "/**\n * jqPlot\n * Pure JavaScript plotting plugin using jQuery\n *\n * Version: 1.0.9\n * Revision: d96a669\n *\n * Copyright (c) 2009-2016 Chris Leonello\n * jqPlot is currently available for use in all personal or commercial projects \n * under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL \n * version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can \n * choose the license that best suits your project and use it accordingly. \n *\n * Although not required, the author would appreciate an email letting him \n * know of any substantial use of jqPlot.  You can reach the author at: \n * chris at jqplot dot com or see http://www.jqplot.com/info.php .\n *\n * If you are feeling kind and generous, consider supporting the project by\n * making a donation at: http://www.jqplot.com/donate.php .\n *\n * sprintf functions contained in jqplot.sprintf.js by Ash Searle:\n *\n *     version 2007.04.27\n *     author Ash Searle\n *     http://hexmen.com/blog/2007/03/printf-sprintf/\n *     http://hexmen.com/js/sprintf.js\n *     The author (Ash Searle) has placed this code in the public domain:\n *     \"This code is unrestricted: you are free to use it however you like.\"\n * \n */\n(function($) {\n    // class: $.jqplot.MekkoAxisRenderer\n    // An axis renderer for a Mekko chart.\n    // Should be used with a Mekko chart where the mekkoRenderer is used on the series.\n    // Displays the Y axis as a range from 0 to 1 (0 to 100%) and the x axis with a tick\n    // for each series scaled to the sum of all the y values.\n    $.jqplot.MekkoAxisRenderer = function() {\n    };\n    \n    // called with scope of axis object.\n    $.jqplot.MekkoAxisRenderer.prototype.init = function(options){\n        // prop: tickMode\n        // How to space the ticks on the axis.\n        // 'bar' will place a tick at the width of each bar.  \n        // This is the default for the x axis.\n        // 'even' will place ticks at even intervals.  This is\n        // the default for x2 axis and y axis.  y axis cannot be changed.\n        this.tickMode;\n        // prop: barLabelRenderer\n        // renderer to use to draw labels under each bar.\n        this.barLabelRenderer = $.jqplot.AxisLabelRenderer;\n        // prop: barLabels\n        // array of labels to put under each bar.\n        this.barLabels = this.barLabels || [];\n        // prop: barLabelOptions\n        // options object to pass to the bar label renderer.\n        this.barLabelOptions = {};\n        this.tickOptions = $.extend(true, {showGridline:false}, this.tickOptions);\n        this._barLabels = [];\n        $.extend(true, this, options);\n        if (this.name == 'yaxis') {\n            this.tickOptions.formatString = this.tickOptions.formatString || \"%d\\%\";\n        }\n        var db = this._dataBounds;\n        db.min = 0;\n        // for y axes, scale always go from 0 to 1 (0 to 100%)\n        if (this.name == 'yaxis' || this.name == 'y2axis') {\n            db.max = 100;\n            this.tickMode = 'even';\n        }\n        // For x axes, scale goes from 0 to sum of all y values.\n        else if (this.name == 'xaxis'){\n            this.tickMode = (this.tickMode == null) ? 'bar' : this.tickMode;\n            for (var i=0; i<this._series.length; i++) {\n                db.max += this._series[i]._sumy;\n            }\n        }\n        else if (this.name == 'x2axis'){\n            this.tickMode = (this.tickMode == null) ? 'even' : this.tickMode;\n            for (var i=0; i<this._series.length; i++) {\n                db.max += this._series[i]._sumy;\n            }\n        }\n    };\n    \n    // called with scope of axis\n    $.jqplot.MekkoAxisRenderer.prototype.draw = function(ctx, plot) {\n        if (this.show) {\n            // populate the axis label and value properties.\n            // createTicks is a method on the renderer, but\n            // call it within the scope of the axis.\n            this.renderer.createTicks.call(this);\n            // fill a div with axes labels in the right direction.\n            // Need to pregenerate each axis to get its bounds and\n            // position it and the labels correctly on the plot.\n            var dim=0;\n            var temp;\n            \n            var elem = document.createElement('div');\n            this._elem = $(elem);\n            this._elem.addClass('jqplot-axis jqplot-'+this.name);\n            this._elem.css('position', 'absolute');\n            elem = null;\n            \n            if (this.name == 'xaxis' || this.name == 'x2axis') {\n                this._elem.width(this._plotDimensions.width);\n            }\n            else {\n                this._elem.height(this._plotDimensions.height);\n            }\n            \n            // draw the axis label\n            // create a _label object.\n            this.labelOptions.axis = this.name;\n            this._label = new this.labelRenderer(this.labelOptions);\n            if (this._label.show) {\n                this._elem.append(this._label.draw(ctx));\n            }\n            \n            var t, tick, elem;\n            if (this.showTicks) {\n                t = this._ticks;\n                for (var i=0; i<t.length; i++) {\n                    tick = t[i];\n                    if (tick.showLabel && (!tick.isMinorTick || this.showMinorTicks)) {\n                        this._elem.append(tick.draw(ctx));\n                    }\n                }\n            }\n            \n            // draw the series labels\n            for (i=0; i<this.barLabels.length; i++) {\n                this.barLabelOptions.axis = this.name;\n                this.barLabelOptions.label = this.barLabels[i];\n                this._barLabels.push(new this.barLabelRenderer(this.barLabelOptions));\n                if (this.tickMode != 'bar') {\n                    this._barLabels[i].show = false;\n                }\n                if (this._barLabels[i].show) {\n                    var elem = this._barLabels[i].draw(ctx, plot);\n                    elem.removeClass('jqplot-'+this.name+'-label');\n                    elem.addClass('jqplot-'+this.name+'-tick');\n                    elem.addClass('jqplot-mekko-barLabel');\n                    elem.appendTo(this._elem);\n                    elem = null;\n                }   \n            }\n            \n        }\n        return this._elem;\n    };\n    \n    // called with scope of an axis\n    $.jqplot.MekkoAxisRenderer.prototype.reset = function() {\n        this.min = this._min;\n        this.max = this._max;\n        this.tickInterval = this._tickInterval;\n        this.numberTicks = this._numberTicks;\n        // this._ticks = this.__ticks;\n    };\n    \n    // called with scope of axis\n    $.jqplot.MekkoAxisRenderer.prototype.set = function() { \n        var dim = 0;\n        var temp;\n        var w = 0;\n        var h = 0;\n        var lshow = (this._label == null) ? false : this._label.show;\n        if (this.show && this.showTicks) {\n            var t = this._ticks;\n            for (var i=0; i<t.length; i++) {\n                var tick = t[i];\n                if (tick.showLabel && (!tick.isMinorTick || this.showMinorTicks)) {\n                    if (this.name == 'xaxis' || this.name == 'x2axis') {\n                        temp = tick._elem.outerHeight(true);\n                    }\n                    else {\n                        temp = tick._elem.outerWidth(true);\n                    }\n                    if (temp > dim) {\n                        dim = temp;\n                    }\n                }\n            }\n            \n            if (lshow) {\n                w = this._label._elem.outerWidth(true);\n                h = this._label._elem.outerHeight(true); \n            }\n            if (this.name == 'xaxis') {\n                dim = dim + h;\n                this._elem.css({'height':dim+'px', left:'0px', bottom:'0px'});\n            }\n            else if (this.name == 'x2axis') {\n                dim = dim + h;\n                this._elem.css({'height':dim+'px', left:'0px', top:'0px'});\n            }\n            else if (this.name == 'yaxis') {\n                dim = dim + w;\n                this._elem.css({'width':dim+'px', left:'0px', top:'0px'});\n                if (lshow && this._label.constructor == $.jqplot.AxisLabelRenderer) {\n                    this._label._elem.css('width', w+'px');\n                }\n            }\n            else {\n                dim = dim + w;\n                this._elem.css({'width':dim+'px', right:'0px', top:'0px'});\n                if (lshow && this._label.constructor == $.jqplot.AxisLabelRenderer) {\n                    this._label._elem.css('width', w+'px');\n                }\n            }\n        }  \n    };    \n    \n    // called with scope of axis\n    $.jqplot.MekkoAxisRenderer.prototype.createTicks = function() {\n        // we're are operating on an axis here\n        var ticks = this._ticks;\n        var userTicks = this.ticks;\n        var name = this.name;\n        // databounds were set on axis initialization.\n        var db = this._dataBounds;\n        var dim, interval;\n        var min, max;\n        var pos1, pos2;\n        var t, tt, i, j;\n        \n        // if we already have ticks, use them.\n        // ticks must be in order of increasing value.\n        \n        if (userTicks.length) {\n            // ticks could be 1D or 2D array of [val, val, ,,,] or [[val, label], [val, label], ...] or mixed\n            for (i=0; i<userTicks.length; i++){\n                var ut = userTicks[i];\n                var t = new this.tickRenderer(this.tickOptions);\n                if (ut.constructor == Array) {\n                    t.value = ut[0];\n                    t.label = ut[1];\n                    if (!this.showTicks) {\n                        t.showLabel = false;\n                        t.showMark = false;\n                    }\n                    else if (!this.showTickMarks) {\n                        t.showMark = false;\n                    }\n                    t.setTick(ut[0], this.name);\n                    this._ticks.push(t);\n                }\n                \n                else {\n                    t.value = ut;\n                    if (!this.showTicks) {\n                        t.showLabel = false;\n                        t.showMark = false;\n                    }\n                    else if (!this.showTickMarks) {\n                        t.showMark = false;\n                    }\n                    t.setTick(ut, this.name);\n                    this._ticks.push(t);\n                }\n            }\n            this.numberTicks = userTicks.length;\n            this.min = this._ticks[0].value;\n            this.max = this._ticks[this.numberTicks-1].value;\n            this.tickInterval = (this.max - this.min) / (this.numberTicks - 1);\n        }\n        \n        // we don't have any ticks yet, let's make some!\n        else {\n            if (name == 'xaxis' || name == 'x2axis') {\n                dim = this._plotDimensions.width;\n            }\n            else {\n                dim = this._plotDimensions.height;\n            }\n            \n            // if min, max and number of ticks specified, user can't specify interval.\n            if (this.min != null && this.max != null && this.numberTicks != null) {\n                this.tickInterval = null;\n            }\n        \n            min = (this.min != null) ? this.min : db.min;\n            max = (this.max != null) ? this.max : db.max;\n            \n            // if min and max are same, space them out a bit.+\n            if (min == max) {\n                var adj = 0.05;\n                if (min > 0) {\n                    adj = Math.max(Math.log(min)/Math.LN10, 0.05);\n                }\n                min -= adj;\n                max += adj;\n            }\n\n            var range = max - min;\n            var rmin, rmax;\n            var temp, prev, curr;\n            var ynumticks = [3,5,6,11,21];\n            \n            // yaxis divide ticks in nice intervals from 0 to 1.\n            if (this.name == 'yaxis' || this.name == 'y2axis') { \n                this.min = 0;\n                this.max = 100; \n                // user didn't specify number of ticks.\n                if (!this.numberTicks){\n                    if (this.tickInterval) {\n                        this.numberTicks = 3 + Math.ceil(range / this.tickInterval);\n                    }\n                    else {\n                        temp = 2 + Math.ceil((dim-(this.tickSpacing-1))/this.tickSpacing);\n                        for (i=0; i<ynumticks.length; i++) {\n                            curr = temp/ynumticks[i];\n                            if (curr == 1) {\n                                this.numberTicks = ynumticks[i];\n                                break;\n                            }\n                            else if (curr > 1) {\n                                prev = curr;\n                                continue;\n                            }\n                            else if (curr < 1) {\n                                // was prev or is curr closer to one?\n                                if (Math.abs(prev - 1) < Math.abs(curr - 1)) {\n                                    this.numberTicks = ynumticks[i-1];\n                                    break;\n                                }\n                                else {\n                                    this.numberTicks = ynumticks[i];\n                                    break;\n                                }\n                            }\n                            else if (i == ynumticks.length -1) {\n                                this.numberTicks = ynumticks[i];\n                            }\n                        }\n                        this.tickInterval = range / (this.numberTicks - 1);\n                    }\n                }\n                \n                // user did specify number of ticks.\n                else {\n                    this.tickInterval = range / (this.numberTicks - 1);\n                }\n\n                for (var i=0; i<this.numberTicks; i++){\n                    tt = this.min + i * this.tickInterval;\n                    t = new this.tickRenderer(this.tickOptions);\n                    // var t = new $.jqplot.AxisTickRenderer(this.tickOptions);\n                    if (!this.showTicks) {\n                        t.showLabel = false;\n                        t.showMark = false;\n                    }\n                    else if (!this.showTickMarks) {\n                        t.showMark = false;\n                    }\n                    t.setTick(tt, this.name);\n                    this._ticks.push(t);\n                }\n            }\n            \n            // for x axes, have number ot ticks equal to number of series and ticks placed\n            // at sum of y values for each series.\n            else if (this.tickMode == 'bar') {\n                this.min = 0;\n                this.numberTicks = this._series.length + 1;\n                t = new this.tickRenderer(this.tickOptions);\n                if (!this.showTicks) {\n                    t.showLabel = false;\n                    t.showMark = false;\n                }\n                else if (!this.showTickMarks) {\n                    t.showMark = false;\n                }\n                t.setTick(0, this.name);\n                this._ticks.push(t);\n                \n                temp = 0;\n\n                for (i=1; i<this.numberTicks; i++){\n                    temp += this._series[i-1]._sumy;\n                    t = new this.tickRenderer(this.tickOptions);\n                    if (!this.showTicks) {\n                        t.showLabel = false;\n                        t.showMark = false;\n                    }\n                    else if (!this.showTickMarks) {\n                        t.showMark = false;\n                    }\n                    t.setTick(temp, this.name);\n                    this._ticks.push(t);\n                }\n                this.max = this.max || temp;\n                \n                // if user specified a max and it is greater than sum, add a tick\n                if (this.max > temp) {\n                     t = new this.tickRenderer(this.tickOptions);\n                    if (!this.showTicks) {\n                        t.showLabel = false;\n                        t.showMark = false;\n                    }\n                    else if (!this.showTickMarks) {\n                        t.showMark = false;\n                    }\n                    t.setTick(this.max, this.name);\n                    this._ticks.push(t);\n                    \n                }\n            }\n            \n            else if (this.tickMode == 'even') {\n                this.min = 0;\n                this.max = this.max || db.max;\n                // get a desired number of ticks\n                var nt = 2 + Math.ceil((dim-(this.tickSpacing-1))/this.tickSpacing);\n                range = this.max - this.min;\n                this.numberTicks = nt;\n                this.tickInterval = range / (this.numberTicks - 1);\n\n                for (i=0; i<this.numberTicks; i++){\n                    tt = this.min + i * this.tickInterval;\n                    t = new this.tickRenderer(this.tickOptions);\n                    // var t = new $.jqplot.AxisTickRenderer(this.tickOptions);\n                    if (!this.showTicks) {\n                        t.showLabel = false;\n                        t.showMark = false;\n                    }\n                    else if (!this.showTickMarks) {\n                        t.showMark = false;\n                    }\n                    t.setTick(tt, this.name);\n                    this._ticks.push(t);\n                }\n                \n            }\n        }\n    };\n    \n    // called with scope of axis\n    $.jqplot.MekkoAxisRenderer.prototype.pack = function(pos, offsets) {\n        var ticks = this._ticks;\n        var max = this.max;\n        var min = this.min;\n        var offmax = offsets.max;\n        var offmin = offsets.min;\n        var lshow = (this._label == null) ? false : this._label.show;\n        \n        for (var p in pos) {\n            this._elem.css(p, pos[p]);\n        }\n        \n        this._offsets = offsets;\n        // pixellength will be + for x axes and - for y axes becasue pixels always measured from top left.\n        var pixellength = offmax - offmin;\n        var unitlength = max - min;\n        \n        // point to unit and unit to point conversions references to Plot DOM element top left corner.\n        this.p2u = function(p){\n            return (p - offmin) * unitlength / pixellength + min;\n        };\n        \n        this.u2p = function(u){\n            return (u - min) * pixellength / unitlength + offmin;\n        };\n                \n        if (this.name == 'xaxis' || this.name == 'x2axis'){\n            this.series_u2p = function(u){\n                return (u - min) * pixellength / unitlength;\n            };\n            this.series_p2u = function(p){\n                return p * unitlength / pixellength + min;\n            };\n        }\n        \n        else {\n            this.series_u2p = function(u){\n                return (u - max) * pixellength / unitlength;\n            };\n            this.series_p2u = function(p){\n                return p * unitlength / pixellength + max;\n            };\n        }\n        \n        if (this.show) {\n            if (this.name == 'xaxis' || this.name == 'x2axis') {\n                for (var i=0; i<ticks.length; i++) {\n                    var t = ticks[i];\n                    if (t.show && t.showLabel) {\n                        var shim;\n                        \n                        if (t.constructor == $.jqplot.CanvasAxisTickRenderer && t.angle) {\n                            // will need to adjust auto positioning based on which axis this is.\n                            var temp = (this.name == 'xaxis') ? 1 : -1;\n                            switch (t.labelPosition) {\n                                case 'auto':\n                                    // position at end\n                                    if (temp * t.angle < 0) {\n                                        shim = -t.getWidth() + t._textRenderer.height * Math.sin(-t._textRenderer.angle) / 2;\n                                    }\n                                    // position at start\n                                    else {\n                                        shim = -t._textRenderer.height * Math.sin(t._textRenderer.angle) / 2;\n                                    }\n                                    break;\n                                case 'end':\n                                    shim = -t.getWidth() + t._textRenderer.height * Math.sin(-t._textRenderer.angle) / 2;\n                                    break;\n                                case 'start':\n                                    shim = -t._textRenderer.height * Math.sin(t._textRenderer.angle) / 2;\n                                    break;\n                                case 'middle':\n                                    shim = -t.getWidth()/2 + t._textRenderer.height * Math.sin(-t._textRenderer.angle) / 2;\n                                    break;\n                                default:\n                                    shim = -t.getWidth()/2 + t._textRenderer.height * Math.sin(-t._textRenderer.angle) / 2;\n                                    break;\n                            }\n                        }\n                        else {\n                            shim = -t.getWidth()/2;\n                        }\n                        var val = this.u2p(t.value) + shim + 'px';\n                        t._elem.css('left', val);\n                        t.pack();\n                    }\n                }\n                var w;\n                if (lshow) {\n                    w = this._label._elem.outerWidth(true);\n                    this._label._elem.css('left', offmin + pixellength/2 - w/2 + 'px');\n                    if (this.name == 'xaxis') {\n                        this._label._elem.css('bottom', '0px');\n                    }\n                    else {\n                        this._label._elem.css('top', '0px');\n                    }\n                    this._label.pack();\n                }\n                // now show the labels under the bars.\n                var b, l, r;\n                for (var i=0; i<this.barLabels.length; i++) {\n                    b = this._barLabels[i];\n                    if (b.show) {\n                        w = b.getWidth();\n                        l = this._ticks[i].getLeft() + this._ticks[i].getWidth();\n                        r = this._ticks[i+1].getLeft();\n                        b._elem.css('left', (r+l-w)/2+'px');\n                        b._elem.css('top', this._ticks[i]._elem.css('top'));\n                        b.pack();\n                    }\n                }\n            }\n            else {\n                for (var i=0; i<ticks.length; i++) {\n                    var t = ticks[i];\n                    if (t.show && t.showLabel) {                        \n                        var shim;\n                        if (t.constructor == $.jqplot.CanvasAxisTickRenderer && t.angle) {\n                            // will need to adjust auto positioning based on which axis this is.\n                            var temp = (this.name == 'yaxis') ? 1 : -1;\n                            switch (t.labelPosition) {\n                                case 'auto':\n                                    // position at end\n                                case 'end':\n                                    if (temp * t.angle < 0) {\n                                        shim = -t._textRenderer.height * Math.cos(-t._textRenderer.angle) / 2;\n                                    }\n                                    else {\n                                        shim = -t.getHeight() + t._textRenderer.height * Math.cos(t._textRenderer.angle) / 2;\n                                    }\n                                    break;\n                                case 'start':\n                                    if (t.angle > 0) {\n                                        shim = -t._textRenderer.height * Math.cos(-t._textRenderer.angle) / 2;\n                                    }\n                                    else {\n                                        shim = -t.getHeight() + t._textRenderer.height * Math.cos(t._textRenderer.angle) / 2;\n                                    }\n                                    break;\n                                case 'middle':\n                                    shim = -t.getHeight()/2;\n                                    break;\n                                default:\n                                    shim = -t.getHeight()/2;\n                                    break;\n                            }\n                        }\n                        else {\n                            shim = -t.getHeight()/2;\n                        }\n                        \n                        var val = this.u2p(t.value) + shim + 'px';\n                        t._elem.css('top', val);\n                        t.pack();\n                    }\n                }\n                if (lshow) {\n                    var h = this._label._elem.outerHeight(true);\n                    this._label._elem.css('top', offmax - pixellength/2 - h/2 + 'px');\n                    if (this.name == 'yaxis') {\n                        this._label._elem.css('left', '0px');\n                    }\n                    else {\n                        this._label._elem.css('right', '0px');\n                    }   \n                    this._label.pack();\n                }\n            }\n        }\n    };\n})(jQuery);\n"
  },
  {
    "path": "stenogotchi/ui/web/static/js/plugins/jqplot.mekkoRenderer.js",
    "content": "/**\n * jqPlot\n * Pure JavaScript plotting plugin using jQuery\n *\n * Version: 1.0.9\n * Revision: d96a669\n *\n * Copyright (c) 2009-2016 Chris Leonello\n * jqPlot is currently available for use in all personal or commercial projects \n * under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL \n * version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can \n * choose the license that best suits your project and use it accordingly. \n *\n * Although not required, the author would appreciate an email letting him \n * know of any substantial use of jqPlot.  You can reach the author at: \n * chris at jqplot dot com or see http://www.jqplot.com/info.php .\n *\n * If you are feeling kind and generous, consider supporting the project by\n * making a donation at: http://www.jqplot.com/donate.php .\n *\n * sprintf functions contained in jqplot.sprintf.js by Ash Searle:\n *\n *     version 2007.04.27\n *     author Ash Searle\n *     http://hexmen.com/blog/2007/03/printf-sprintf/\n *     http://hexmen.com/js/sprintf.js\n *     The author (Ash Searle) has placed this code in the public domain:\n *     \"This code is unrestricted: you are free to use it however you like.\"\n * \n */\n(function($) {\n    /**\n     * Class: $.jqplot.MekkoRenderer\n     * Draws a Mekko style chart which shows 3 dimensional data on a 2 dimensional graph.\n     * the <$.jqplot.MekkoAxisRenderer> should be used with mekko charts.  The mekko renderer\n     * overrides the default legend renderer with its own $.jqplot.MekkoLegendRenderer\n     * which allows more flexibility to specify number of rows and columns in the legend.\n     * \n     * Data is specified per bar in the chart.  You can specify data as an array of y values, or as \n     * an array of [label, value] pairs.  Note that labels are used only on the first series.  \n     * Labels on subsequent series are ignored:\n     * \n     * > bar1 = [['shirts', 8],['hats', 14],['shoes', 6],['gloves', 16],['dolls', 12]];\n     * > bar2 = [15,6,9,13,6];\n     * > bar3 = [['grumpy',4],['sneezy',2],['happy',7],['sleepy',9],['doc',7]];\n     * \n     * If you want to place labels for each bar under the axis, you use the barLabels option on \n     * the axes.  The bar labels can be styled with the \".jqplot-mekko-barLabel\" css class.\n     * \n     * > barLabels = ['Mickey Mouse', 'Donald Duck', 'Goofy'];\n     * > axes:{xaxis:{barLabels:barLabels}}\n     * \n     */\n    \n    \n    $.jqplot.MekkoRenderer = function(){\n        this.shapeRenderer = new $.jqplot.ShapeRenderer();\n        // prop: borderColor\n        // color of the borders between areas on the chart\n        this.borderColor = null;\n        // prop: showBorders\n        // True to draw borders lines between areas on the chart.\n        // False will draw borders lines with the same color as the area.\n        this.showBorders = true;\n    };\n    \n    // called with scope of series.\n    $.jqplot.MekkoRenderer.prototype.init = function(options, plot) {\n        this.fill = false;\n        this.fillRect = true;\n        this.strokeRect = true;\n        this.shadow = false;\n        // width of bar on x axis.\n        this._xwidth = 0;\n        this._xstart = 0;\n        $.extend(true, this.renderer, options);\n        // set the shape renderer options\n        var opts = {lineJoin:'miter', lineCap:'butt', isarc:false, fillRect:this.fillRect, strokeRect:this.strokeRect};\n        this.renderer.shapeRenderer.init(opts);\n        plot.axes.x2axis._series.push(this);\n        this._type = 'mekko';\n    };\n    \n    // Method: setGridData\n    // converts the user data values to grid coordinates and stores them\n    // in the gridData array.  Will convert user data into appropriate\n    // rectangles.\n    // Called with scope of a series.\n    $.jqplot.MekkoRenderer.prototype.setGridData = function(plot) {\n        // recalculate the grid data\n        var xp = this._xaxis.series_u2p;\n        var yp = this._yaxis.series_u2p;\n        var data = this._plotData;\n        this.gridData = [];\n        // figure out width on x axis.\n        // this._xwidth = this._sumy / plot._sumy * this.canvas.getWidth();\n        this._xwidth = xp(this._sumy) - xp(0);\n        if (this.index>0) {\n            this._xstart = plot.series[this.index-1]._xstart + plot.series[this.index-1]._xwidth;\n        }\n        var totheight = this.canvas.getHeight();\n        var sumy = 0;\n        var cury;\n        var curheight;\n        for (var i=0; i<data.length; i++) {\n            if (data[i] != null) {\n                sumy += data[i][1];\n                cury = totheight - (sumy / this._sumy * totheight);\n                curheight = data[i][1] / this._sumy * totheight;\n                this.gridData.push([this._xstart, cury, this._xwidth, curheight]);\n            }\n        }\n    };\n    \n    // Method: makeGridData\n    // converts any arbitrary data values to grid coordinates and\n    // returns them.  This method exists so that plugins can use a series'\n    // linerenderer to generate grid data points without overwriting the\n    // grid data associated with that series.\n    // Called with scope of a series.\n    $.jqplot.MekkoRenderer.prototype.makeGridData = function(data, plot) {\n        // recalculate the grid data\n        // figure out width on x axis.\n        var xp = this._xaxis.series_u2p;\n        var totheight = this.canvas.getHeight();\n        var sumy = 0;\n        var cury;\n        var curheight;\n        var gd = [];\n        for (var i=0; i<data.length; i++) {\n            if (data[i] != null) {\n                sumy += data[i][1];\n                cury = totheight - (sumy / this._sumy * totheight);\n                curheight = data[i][1] / this._sumy * totheight;\n                gd.push([this._xstart, cury, this._xwidth, curheight]);\n            }\n        }\n        return gd;\n    };\n    \n\n    // called within scope of series.\n    $.jqplot.MekkoRenderer.prototype.draw = function(ctx, gd, options) {\n        var i;\n        var opts = (options != undefined) ? options : {};\n        var showLine = (opts.showLine != undefined) ? opts.showLine : this.showLine;\n        var colorGenerator = new $.jqplot.ColorGenerator(this.seriesColors);\n        ctx.save();\n        if (gd.length) {\n            if (showLine) {\n                for (i=0; i<gd.length; i++){\n                    opts.fillStyle = colorGenerator.next();\n                    if (this.renderer.showBorders) {\n                        opts.strokeStyle = this.renderer.borderColor;\n                    }\n                    else {\n                        opts.strokeStyle = opts.fillStyle;\n                    }\n                    this.renderer.shapeRenderer.draw(ctx, gd[i], opts);\n                }\n            }\n        }\n        \n        ctx.restore();\n    };  \n    \n    $.jqplot.MekkoRenderer.prototype.drawShadow = function(ctx, gd, options) {\n        // This is a no-op, no shadows on mekko charts.\n    };\n    \n    /**\n     * Class: $.jqplot.MekkoLegendRenderer\n     * Legend renderer used by mekko charts with options for \n     * controlling number or rows and columns as well as placement\n     * outside of plot area.\n     * \n     */\n    $.jqplot.MekkoLegendRenderer = function(){\n        //\n    };\n    \n    $.jqplot.MekkoLegendRenderer.prototype.init = function(options) {\n        // prop: numberRows\n        // Maximum number of rows in the legend.  0 or null for unlimited.\n        this.numberRows = null;\n        // prop: numberColumns\n        // Maximum number of columns in the legend.  0 or null for unlimited.\n        this.numberColumns = null;\n        // this will override the placement option on the Legend object\n        this.placement = \"outside\";\n        $.extend(true, this, options);\n    };\n    \n    // called with scope of legend\n    $.jqplot.MekkoLegendRenderer.prototype.draw = function() {\n        var legend = this;\n        if (this.show) {\n            var series = this._series;\n            var ss = 'position:absolute;';\n            ss += (this.background) ? 'background:'+this.background+';' : '';\n            ss += (this.border) ? 'border:'+this.border+';' : '';\n            ss += (this.fontSize) ? 'font-size:'+this.fontSize+';' : '';\n            ss += (this.fontFamily) ? 'font-family:'+this.fontFamily+';' : '';\n            ss += (this.textColor) ? 'color:'+this.textColor+';' : '';\n            this._elem = $('<table class=\"jqplot-table-legend\" style=\"'+ss+'\"></table>');\n            // Mekko charts  legends don't go by number of series, but by number of data points\n            // in the series.  Refactor things here for that.\n            \n            var pad = false, \n                reverse = true,    // mekko charts are always stacked, so reverse\n                nr, nc;\n            var s = series[0];\n            var colorGenerator = new $.jqplot.ColorGenerator(s.seriesColors);\n            \n            if (s.show) {\n                var pd = s.data;\n                if (this.numberRows) {\n                    nr = this.numberRows;\n                    if (!this.numberColumns){\n                        nc = Math.ceil(pd.length/nr);\n                    }\n                    else{\n                        nc = this.numberColumns;\n                    }\n                }\n                else if (this.numberColumns) {\n                    nc = this.numberColumns;\n                    nr = Math.ceil(pd.length/this.numberColumns);\n                }\n                else {\n                    nr = pd.length;\n                    nc = 1;\n                }\n                \n                var i, j, tr, td1, td2, lt, rs, color;\n                var idx = 0;    \n                \n                for (i=0; i<nr; i++) {\n                    if (reverse){\n                        tr = $('<tr class=\"jqplot-table-legend\"></tr>').prependTo(this._elem);\n                    }\n                    else{\n                        tr = $('<tr class=\"jqplot-table-legend\"></tr>').appendTo(this._elem);\n                    }\n                    for (j=0; j<nc; j++) {\n                        if (idx < pd.length) {\n                            lt = this.labels[idx] || pd[idx][0].toString();\n                            color = colorGenerator.next();\n                            if (!reverse){\n                                if (i>0){\n                                    pad = true;\n                                }\n                                else{\n                                    pad = false;\n                                }\n                            }\n                            else{\n                                if (i == nr -1){\n                                    pad = false;\n                                }\n                                else{\n                                    pad = true;\n                                }\n                            }\n                            rs = (pad) ? this.rowSpacing : '0';\n                \n                            td1 = $('<td class=\"jqplot-table-legend\" style=\"text-align:center;padding-top:'+rs+';\">'+\n                                '<div><div class=\"jqplot-table-legend-swatch\" style=\"border-color:'+color+';\"></div>'+\n                                '</div></td>');\n                            td2 = $('<td class=\"jqplot-table-legend\" style=\"padding-top:'+rs+';\"></td>');\n                            if (this.escapeHtml){\n                                td2.text(lt);\n                            }\n                            else {\n                                td2.html(lt);\n                            }\n                            if (reverse) {\n                                td2.prependTo(tr);\n                                td1.prependTo(tr);\n                            }\n                            else {\n                                td1.appendTo(tr);\n                                td2.appendTo(tr);\n                            }\n                            pad = true;\n                        }\n                        idx++;\n                    }   \n                }\n\n                tr = null;\n                td1 = null;\n                td2 = null;\n            }\n        }\n        return this._elem;\n    };\n    \n    $.jqplot.MekkoLegendRenderer.prototype.pack = function(offsets) {\n        if (this.show) {\n            // fake a grid for positioning\n            var grid = {_top:offsets.top, _left:offsets.left, _right:offsets.right, _bottom:this._plotDimensions.height - offsets.bottom};        \n            if (this.placement == 'insideGrid') {\n                switch (this.location) {\n                    case 'nw':\n                        var a = grid._left + this.xoffset;\n                        var b = grid._top + this.yoffset;\n                        this._elem.css('left', a);\n                        this._elem.css('top', b);\n                        break;\n                    case 'n':\n                        var a = (offsets.left + (this._plotDimensions.width - offsets.right))/2 - this.getWidth()/2;\n                        var b = grid._top + this.yoffset;\n                        this._elem.css('left', a);\n                        this._elem.css('top', b);\n                        break;\n                    case 'ne':\n                        var a = offsets.right + this.xoffset;\n                        var b = grid._top + this.yoffset;\n                        this._elem.css({right:a, top:b});\n                        break;\n                    case 'e':\n                        var a = offsets.right + this.xoffset;\n                        var b = (offsets.top + (this._plotDimensions.height - offsets.bottom))/2 - this.getHeight()/2;\n                        this._elem.css({right:a, top:b});\n                        break;\n                    case 'se':\n                        var a = offsets.right + this.xoffset;\n                        var b = offsets.bottom + this.yoffset;\n                        this._elem.css({right:a, bottom:b});\n                        break;\n                    case 's':\n                        var a = (offsets.left + (this._plotDimensions.width - offsets.right))/2 - this.getWidth()/2;\n                        var b = offsets.bottom + this.yoffset;\n                        this._elem.css({left:a, bottom:b});\n                        break;\n                    case 'sw':\n                        var a = grid._left + this.xoffset;\n                        var b = offsets.bottom + this.yoffset;\n                        this._elem.css({left:a, bottom:b});\n                        break;\n                    case 'w':\n                        var a = grid._left + this.xoffset;\n                        var b = (offsets.top + (this._plotDimensions.height - offsets.bottom))/2 - this.getHeight()/2;\n                        this._elem.css({left:a, top:b});\n                        break;\n                    default:  // same as 'se'\n                        var a = grid._right - this.xoffset;\n                        var b = grid._bottom + this.yoffset;\n                        this._elem.css({right:a, bottom:b});\n                        break;\n                }\n                \n            }\n            else {\n                switch (this.location) {\n                    case 'nw':\n                        var a = this._plotDimensions.width - grid._left + this.xoffset;\n                        var b = grid._top + this.yoffset;\n                        this._elem.css('right', a);\n                        this._elem.css('top', b);\n                        break;\n                    case 'n':\n                        var a = (offsets.left + (this._plotDimensions.width - offsets.right))/2 - this.getWidth()/2;\n                        var b = this._plotDimensions.height - grid._top + this.yoffset;\n                        this._elem.css('left', a);\n                        this._elem.css('bottom', b);\n                        break;\n                    case 'ne':\n                        var a = this._plotDimensions.width - offsets.right + this.xoffset;\n                        var b = grid._top + this.yoffset;\n                        this._elem.css({left:a, top:b});\n                        break;\n                    case 'e':\n                        var a = this._plotDimensions.width - offsets.right + this.xoffset;\n                        var b = (offsets.top + (this._plotDimensions.height - offsets.bottom))/2 - this.getHeight()/2;\n                        this._elem.css({left:a, top:b});\n                        break;\n                    case 'se':\n                        var a = this._plotDimensions.width - offsets.right + this.xoffset;\n                        var b = offsets.bottom + this.yoffset;\n                        this._elem.css({left:a, bottom:b});\n                        break;\n                    case 's':\n                        var a = (offsets.left + (this._plotDimensions.width - offsets.right))/2 - this.getWidth()/2;\n                        var b = this._plotDimensions.height - offsets.bottom + this.yoffset;\n                        this._elem.css({left:a, top:b});\n                        break;\n                    case 'sw':\n                        var a = this._plotDimensions.width - grid._left + this.xoffset;\n                        var b = offsets.bottom + this.yoffset;\n                        this._elem.css({right:a, bottom:b});\n                        break;\n                    case 'w':\n                        var a = this._plotDimensions.width - grid._left + this.xoffset;\n                        var b = (offsets.top + (this._plotDimensions.height - offsets.bottom))/2 - this.getHeight()/2;\n                        this._elem.css({right:a, top:b});\n                        break;\n                    default:  // same as 'se'\n                        var a = grid._right - this.xoffset;\n                        var b = grid._bottom + this.yoffset;\n                        this._elem.css({right:a, bottom:b});\n                        break;\n                }\n            }\n        } \n    };\n    \n    // setup default renderers for axes and legend so user doesn't have to\n    // called with scope of plot\n    function preInit(target, data, options) {\n        options = options || {};\n        options.axesDefaults = options.axesDefaults || {};\n        options.legend = options.legend || {};\n        options.seriesDefaults = options.seriesDefaults || {};\n        var setopts = false;\n        if (options.seriesDefaults.renderer == $.jqplot.MekkoRenderer) {\n            setopts = true;\n        }\n        else if (options.series) {\n            for (var i=0; i < options.series.length; i++) {\n                if (options.series[i].renderer == $.jqplot.MekkoRenderer) {\n                    setopts = true;\n                }\n            }\n        }\n        \n        if (setopts) {\n            options.axesDefaults.renderer = $.jqplot.MekkoAxisRenderer;\n            options.legend.renderer = $.jqplot.MekkoLegendRenderer;\n            options.legend.preDraw = true;\n        }\n    }\n    \n    $.jqplot.preInitHooks.push(preInit);\n    \n})(jQuery);    \n"
  },
  {
    "path": "stenogotchi/ui/web/static/js/plugins/jqplot.meterGaugeRenderer.js",
    "content": "/**\n * jqPlot\n * Pure JavaScript plotting plugin using jQuery\n *\n * Version: 1.0.9\n * Revision: d96a669\n *\n * Copyright (c) 2009-2016 Chris Leonello\n * jqPlot is currently available for use in all personal or commercial projects \n * under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL \n * version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can \n * choose the license that best suits your project and use it accordingly. \n *\n * Although not required, the author would appreciate an email letting him \n * know of any substantial use of jqPlot.  You can reach the author at: \n * chris at jqplot dot com or see http://www.jqplot.com/info.php .\n *\n * If you are feeling kind and generous, consider supporting the project by\n * making a donation at: http://www.jqplot.com/donate.php .\n *\n * sprintf functions contained in jqplot.sprintf.js by Ash Searle:\n *\n *     version 2007.04.27\n *     author Ash Searle\n *     http://hexmen.com/blog/2007/03/printf-sprintf/\n *     http://hexmen.com/js/sprintf.js\n *     The author (Ash Searle) has placed this code in the public domain:\n *     \"This code is unrestricted: you are free to use it however you like.\"\n * \n */\n(function($) {\n    /**\n     * Class: $.jqplot.MeterGaugeRenderer\n     * Plugin renderer to draw a meter gauge chart.\n     * \n     * Data consists of a single series with 1 data point to position the gauge needle.\n     * \n     * To use this renderer, you need to include the \n     * meter gauge renderer plugin, for example:\n     * \n     * > <script type=\"text/javascript\" src=\"plugins/jqplot.meterGaugeRenderer.js\"></script>\n     * \n     * Properties described here are passed into the $.jqplot function\n     * as options on the series renderer.  For example:\n     * \n     * > plot0 = $.jqplot('chart0',[[18]],{\n     * >     title: 'Network Speed',\n     * >     seriesDefaults: {\n     * >         renderer: $.jqplot.MeterGaugeRenderer,\n     * >         rendererOptions: {\n     * >             label: 'MB/s'\n     * >         }\n     * >     }\n     * > });\n     * \n     * A meterGauge plot does not support events.\n     */\n    $.jqplot.MeterGaugeRenderer = function(){\n        $.jqplot.LineRenderer.call(this);\n    };\n    \n    $.jqplot.MeterGaugeRenderer.prototype = new $.jqplot.LineRenderer();\n    $.jqplot.MeterGaugeRenderer.prototype.constructor = $.jqplot.MeterGaugeRenderer;\n    \n    // called with scope of a series\n    $.jqplot.MeterGaugeRenderer.prototype.init = function(options) {\n        // Group: Properties\n        //\n        // prop: diameter\n        // Outer diameter of the meterGauge, auto computed by default\n        this.diameter = null;\n        // prop: padding\n        // padding between the meterGauge and plot edges, auto\n        // calculated by default.\n        this.padding = null;\n        // prop: shadowOffset\n        // offset of the shadow from the gauge ring and offset of \n        // each succesive stroke of the shadow from the last.\n        this.shadowOffset = 2;\n        // prop: shadowAlpha\n        // transparency of the shadow (0 = transparent, 1 = opaque)\n        this.shadowAlpha = 0.07;\n        // prop: shadowDepth\n        // number of strokes to apply to the shadow, \n        // each stroke offset shadowOffset from the last.\n        this.shadowDepth = 4;\n        // prop: background\n        // background color of the inside of the gauge.\n        this.background = \"#efefef\";\n        // prop: ringColor\n        // color of the outer ring, hub, and needle of the gauge.\n        this.ringColor = \"#BBC6D0\";\n        // needle color not implemented yet.\n        this.needleColor = \"#C3D3E5\";\n        // prop: tickColor\n        // color of the tick marks around the gauge.\n        this.tickColor = \"#989898\";\n        // prop: ringWidth\n        // width of the ring around the gauge.  Auto computed by default.\n        this.ringWidth = null;\n        // prop: min\n        // Minimum value on the gauge.  Auto computed by default\n        this.min;\n        // prop: max\n        // Maximum value on the gauge. Auto computed by default\n        this.max;\n        // prop: ticks\n        // Array of tick values. Auto computed by default.\n        this.ticks = [];\n        // prop: showTicks\n        // true to show ticks around gauge.\n        this.showTicks = true;\n        // prop: showTickLabels\n        // true to show tick labels next to ticks.\n        this.showTickLabels = true;\n        // prop: label\n        // A gauge label like 'kph' or 'Volts'\n        this.label = null;\n        // prop: labelHeightAdjust\n        // Number of Pixels to offset the label up (-) or down (+) from its default position.\n        this.labelHeightAdjust = 0;\n        // prop: labelPosition\n        // Where to position the label, either 'inside' or 'bottom'.\n        this.labelPosition = 'inside';\n        // prop: intervals\n        // Array of ranges to be drawn around the gauge.\n        // Array of form:\n        // > [value1, value2, ...]\n        // indicating the values for the first, second, ... intervals.\n        this.intervals = [];\n        // prop: intervalColors\n        // Array of colors to use for the intervals.\n        this.intervalColors = [ \"#4bb2c5\", \"#EAA228\", \"#c5b47f\", \"#579575\", \"#839557\", \"#958c12\", \"#953579\", \"#4b5de4\", \"#d8b83f\", \"#ff5800\", \"#0085cc\", \"#c747a3\", \"#cddf54\", \"#FBD178\", \"#26B4E3\", \"#bd70c7\"];\n        // prop: intervalInnerRadius\n        // Radius of the inner circle of the interval ring.\n        this.intervalInnerRadius =  null;\n        // prop: intervalOuterRadius\n        // Radius of the outer circle of the interval ring.\n        this.intervalOuterRadius = null;\n        this.tickRenderer = $.jqplot.MeterGaugeTickRenderer;\n        // ticks spaced every 1, 2, 2.5, 5, 10, 20, .1, .2, .25, .5, etc.\n        this.tickPositions = [1, 2, 2.5, 5, 10];\n        // prop: tickSpacing\n        // Degrees between ticks.  This is a target number, if \n        // incompatible span and ticks are supplied, a suitable\n        // spacing close to this value will be computed.\n        this.tickSpacing = 30;\n        this.numberMinorTicks = null;\n        // prop: hubRadius\n        // Radius of the hub at the bottom center of gauge which the needle attaches to.\n        // Auto computed by default\n        this.hubRadius = null;\n        // prop: tickPadding\n        // padding of the tick marks to the outer ring and the tick labels to marks.\n        // Auto computed by default.\n        this.tickPadding = null;\n        // prop: needleThickness\n        // Maximum thickness the needle.  Auto computed by default.\n        this.needleThickness = null;\n        // prop: needlePad\n        // Padding between needle and inner edge of the ring when the needle is at the min or max gauge value.\n        this.needlePad = 6;\n        // prop: pegNeedle\n        // True will stop needle just below/above the  min/max values if data is below/above min/max,\n        // as if the meter is \"pegged\".\n        this.pegNeedle = true;\n        this._type = 'meterGauge';\n        \n        $.extend(true, this, options);\n        this.type = null;\n        this.numberTicks = null;\n        this.tickInterval = null;\n        // span, the sweep (in degrees) from min to max.  This gauge is \n        // a semi-circle.\n        this.span = 180;\n        // get rid of this nonsense\n        // this.innerSpan = this.span;\n        if (this.type == 'circular') {\n            this.semiCircular = false;\n        }\n        else if (this.type != 'circular') {\n            this.semiCircular = true;\n        }\n        else {\n            this.semiCircular = (this.span <= 180) ? true : false;\n        }\n        this._tickPoints = [];\n        // reference to label element.\n        this._labelElem = null;\n        \n        // start the gauge at the beginning of the span\n        this.startAngle = (90 + (360 - this.span)/2) * Math.PI/180;\n        this.endAngle = (90 - (360 - this.span)/2) * Math.PI/180;\n        \n        this.setmin = !!(this.min == null);\n        this.setmax = !!(this.max == null);\n        \n        // if given intervals and is an array of values, create labels and colors.\n        if (this.intervals.length) {\n            if (this.intervals[0].length == null || this.intervals.length == 1) {\n                for (var i=0; i<this.intervals.length; i++) {\n                    this.intervals[i] = [this.intervals[i], this.intervals[i], this.intervalColors[i]];\n                }\n            }\n            else if (this.intervals[0].length == 2) {\n                for (i=0; i<this.intervals.length; i++) {\n                    this.intervals[i] = [this.intervals[i][0], this.intervals[i][1], this.intervalColors[i]];\n                }\n            }\n        }\n        \n        // compute min, max and ticks if not supplied:\n        if (this.ticks.length) {\n            if (this.ticks[0].length == null || this.ticks[0].length == 1) {\n                for (var i=0; i<this.ticks.length; i++) {\n                    this.ticks[i] = [this.ticks[i], this.ticks[i]];\n                }\n            }\n            this.min = (this.min == null) ? this.ticks[0][0] : this.min;\n            this.max = (this.max == null) ? this.ticks[this.ticks.length-1][0] : this.max;\n            this.setmin = false;\n            this.setmax = false;\n            this.numberTicks = this.ticks.length;\n            this.tickInterval = this.ticks[1][0] - this.ticks[0][0];\n            this.tickFactor = Math.floor(parseFloat((Math.log(this.tickInterval)/Math.log(10)).toFixed(11)));\n            // use the first interal to calculate minor ticks;\n            this.numberMinorTicks = getnmt(this.tickPositions, this.tickInterval, this.tickFactor);\n            if (!this.numberMinorTicks) {\n                this.numberMinorTicks = getnmt(this.tickPositions, this.tickInterval, this.tickFactor-1);\n            }\n            if (!this.numberMinorTicks) {\n                this.numberMinorTicks = 1;\n            }\n        }\n        \n        else if (this.intervals.length) {\n            this.min = (this.min == null) ? 0 : this.min;\n            this.setmin = false;\n            if (this.max == null) {\n                if (this.intervals[this.intervals.length-1][0] >= this.data[0][1]) {\n                    this.max = this.intervals[this.intervals.length-1][0];\n                    this.setmax = false;\n                }\n            }\n            else {\n                this.setmax = false;\n            }\n        }\n        \n        else {\n            // no ticks and no intervals supplied, put needle in middle\n            this.min = (this.min == null) ? 0 : this.min;\n            this.setmin = false;\n            if (this.max == null) {\n                this.max = this.data[0][1] * 1.25;\n                this.setmax = true;\n            }\n            else {\n                this.setmax = false;\n            }\n        }\n    };\n    \n    $.jqplot.MeterGaugeRenderer.prototype.setGridData = function(plot) {\n        // set gridData property.  This will hold angle in radians of each data point.\n        var stack = [];\n        var td = [];\n        var sa = this.startAngle;\n        for (var i=0; i<this.data.length; i++){\n            stack.push(this.data[i][1]);\n            td.push([this.data[i][0]]);\n            if (i>0) {\n                stack[i] += stack[i-1];\n            }\n        }\n        var fact = Math.PI*2/stack[stack.length - 1];\n        \n        for (var i=0; i<stack.length; i++) {\n            td[i][1] = stack[i] * fact;\n        }\n        this.gridData = td;\n    };\n    \n    $.jqplot.MeterGaugeRenderer.prototype.makeGridData = function(data, plot) {\n        var stack = [];\n        var td = [];\n        var sa = this.startAngle;\n        for (var i=0; i<data.length; i++){\n            stack.push(data[i][1]);\n            td.push([data[i][0]]);\n            if (i>0) {\n                stack[i] += stack[i-1];\n            }\n        }\n        var fact = Math.PI*2/stack[stack.length - 1];\n        \n        for (var i=0; i<stack.length; i++) {\n            td[i][1] = stack[i] * fact;\n        }\n        return td;\n    };\n\n        \n    function getnmt(pos, interval, fact) {\n        var temp;\n        for (var i=pos.length-1; i>=0; i--) {\n            temp = interval/(pos[i] * Math.pow(10, fact));\n            if (temp == 4 || temp == 5) {\n                return temp - 1;\n            }\n        }\n        return null;\n    }\n    \n    // called with scope of series\n    $.jqplot.MeterGaugeRenderer.prototype.draw = function (ctx, gd, options) {\n        var i;\n        var opts = (options != undefined) ? options : {};\n        // offset and direction of offset due to legend placement\n        var offx = 0;\n        var offy = 0;\n        var trans = 1;\n        if (options.legendInfo && options.legendInfo.placement == 'inside') {\n            var li = options.legendInfo;\n            switch (li.location) {\n                case 'nw':\n                    offx = li.width + li.xoffset;\n                    break;\n                case 'w':\n                    offx = li.width + li.xoffset;\n                    break;\n                case 'sw':\n                    offx = li.width + li.xoffset;\n                    break;\n                case 'ne':\n                    offx = li.width + li.xoffset;\n                    trans = -1;\n                    break;\n                case 'e':\n                    offx = li.width + li.xoffset;\n                    trans = -1;\n                    break;\n                case 'se':\n                    offx = li.width + li.xoffset;\n                    trans = -1;\n                    break;\n                case 'n':\n                    offy = li.height + li.yoffset;\n                    break;\n                case 's':\n                    offy = li.height + li.yoffset;\n                    trans = -1;\n                    break;\n                default:\n                    break;\n            }\n        }\n        \n        \n            \n        // pre-draw so can get its dimensions.\n        if (this.label) {\n            this._labelElem = $('<div class=\"jqplot-meterGauge-label\" style=\"position:absolute;\">'+this.label+'</div>');\n            this.canvas._elem.after(this._labelElem);\n        }\n        \n        var shadow = (opts.shadow != undefined) ? opts.shadow : this.shadow;\n        var showLine = (opts.showLine != undefined) ? opts.showLine : this.showLine;\n        var fill = (opts.fill != undefined) ? opts.fill : this.fill;\n        var cw = ctx.canvas.width;\n        var ch = ctx.canvas.height;\n        if (this.padding == null) {\n            this.padding = Math.round(Math.min(cw, ch)/30);\n        }\n        var w = cw - offx - 2 * this.padding;\n        var h = ch - offy - 2 * this.padding;\n        if (this.labelPosition == 'bottom' && this.label) {\n            h -= this._labelElem.outerHeight(true);\n        }\n        var mindim = Math.min(w,h);\n        var d = mindim;\n            \n        if (!this.diameter) {\n            if (this.semiCircular) {\n                if ( w >= 2*h) {\n                    if (!this.ringWidth) {\n                        this.ringWidth = 2*h/35;\n                    }\n                    this.needleThickness = this.needleThickness || 2+Math.pow(this.ringWidth, 0.8);\n                    this.innerPad = this.ringWidth/2 + this.needleThickness/2 + this.needlePad;\n                    this.diameter = 2 * (h - 2*this.innerPad);\n                }\n                else {\n                    if (!this.ringWidth) {\n                        this.ringWidth = w/35;\n                    }\n                    this.needleThickness = this.needleThickness || 2+Math.pow(this.ringWidth, 0.8);\n                    this.innerPad = this.ringWidth/2 + this.needleThickness/2 + this.needlePad;\n                    this.diameter = w - 2*this.innerPad - this.ringWidth - this.padding;\n                }\n                // center taking into account legend and over draw for gauge bottom below hub.\n                // this will be center of hub.\n                this._center = [(cw - trans * offx)/2 + trans * offx,  (ch + trans*offy - this.padding - this.ringWidth - this.innerPad)];\n            }\n            else {\n                if (!this.ringWidth) {\n                    this.ringWidth = d/35;\n                }\n                this.needleThickness = this.needleThickness || 2+Math.pow(this.ringWidth, 0.8);\n                this.innerPad = 0;\n                this.diameter = d - this.ringWidth;\n                // center in middle of canvas taking into account legend.\n                // will be center of hub.\n                this._center = [(cw-trans*offx)/2 + trans * offx, (ch-trans*offy)/2 + trans * offy];\n            }\n            if (this._labelElem && this.labelPosition == 'bottom') {\n                this._center[1] -= this._labelElem.outerHeight(true);\n            }\n            \n        }\n\n        this._radius = this.diameter/2;\n        \n        this.tickSpacing = 6000/this.diameter;\n        \n        if (!this.hubRadius) {\n            this.hubRadius = this.diameter/18;\n        }\n        \n        this.shadowOffset = 0.5 + this.ringWidth/9;\n        this.shadowWidth = this.ringWidth*1;\n        \n        this.tickPadding = 3 + Math.pow(this.diameter/20, 0.7);\n        this.tickOuterRadius = this._radius - this.ringWidth/2 - this.tickPadding;\n        this.tickLength = (this.showTicks) ? this._radius/13 : 0;\n        \n        if (this.ticks.length == 0) {\n            // no ticks, lets make some.\n            var max = this.max,\n                min = this.min,\n                setmax = this.setmax,\n                setmin = this.setmin,\n                ti = (max - min) * this.tickSpacing / this.span;\n            var tf = Math.floor(parseFloat((Math.log(ti)/Math.log(10)).toFixed(11)));\n            var tp = (ti/Math.pow(10, tf));\n            (tp > 2 && tp <= 2.5) ? tp = 2.5 : tp = Math.ceil(tp);\n            var t = this.tickPositions;\n            var tpindex, nt;\n    \n            for (i=0; i<t.length; i++) {\n                if (tp == t[i] || i && t[i-1] < tp && tp < t[i]) { \n                    ti = t[i]*Math.pow(10, tf);\n                    tpindex = i;\n                }\n            }\n        \n            for (i=0; i<t.length; i++) {\n                if (tp == t[i] || i && t[i-1] < tp && tp < t[i]) { \n                    ti = t[i]*Math.pow(10, tf);\n                    nt = Math.ceil((max - min) / ti);\n                }\n            }\n        \n            // both max and min are free\n            if (setmax && setmin) {\n                var tmin = (min > 0) ? min - min % ti : min - min % ti - ti;\n                if (!this.forceZero) {\n                    var diff = Math.min(min - tmin, 0.8*ti);\n                    var ntp = Math.floor(diff/t[tpindex]);\n                    if (ntp > 1) {\n                        tmin = tmin + t[tpindex] * (ntp-1);\n                        if (parseInt(tmin, 10) != tmin && parseInt(tmin-t[tpindex], 10) == tmin-t[tpindex]) {\n                            tmin = tmin - t[tpindex];\n                        }\n                    }\n                }\n                if (min == tmin) {\n                    min -= ti;\n                }\n                else {\n                    // tmin should always be lower than dataMin\n                    if (min - tmin > 0.23*ti) {\n                        min = tmin;\n                    }\n                    else {\n                        min = tmin -ti;\n                        nt += 1;\n                    }\n                }\n                nt += 1;\n                var tmax = min + (nt - 1) * ti;\n                if (max >= tmax) { \n                    tmax += ti;\n                    nt += 1;\n                }\n                // now tmax should always be mroe than dataMax\n                if (tmax - max < 0.23*ti) { \n                    tmax += ti;\n                    nt += 1;\n                }\n                this.max = max = tmax;\n                this.min = min;    \n\n                this.tickInterval = ti;\n                this.numberTicks = nt;\n                var it;\n                for (i=0; i<nt; i++) {\n                    it = parseFloat((min+i*ti).toFixed(11));\n                    this.ticks.push([it, it]);\n                }\n                this.max = this.ticks[nt-1][1];\n            \n                this.tickFactor = tf;      \n                // determine number of minor ticks\n\n                this.numberMinorTicks = getnmt(this.tickPositions, this.tickInterval, this.tickFactor);     \n        \n                if (!this.numberMinorTicks) {\n                    this.numberMinorTicks = getnmt(this.tickPositions, this.tickInterval, this.tickFactor-1);\n                }\n            }\n            // max is free, min is fixed\n            else if (setmax) {\n                var tmax = min + (nt - 1) * ti;\n                if (max >= tmax) {\n                    max = tmax + ti;\n                    nt += 1;\n                }\n                else {\n                    max = tmax;\n                }\n\n                this.tickInterval = this.tickInterval || ti;\n                this.numberTicks = this.numberTicks || nt;\n                var it;\n                for (i=0; i<this.numberTicks; i++) {\n                    it = parseFloat((min+i*this.tickInterval).toFixed(11));\n                    this.ticks.push([it, it]);\n                }\n                this.max = this.ticks[this.numberTicks-1][1];\n            \n                this.tickFactor = tf;\n                // determine number of minor ticks\n                this.numberMinorTicks = getnmt(this.tickPositions, this.tickInterval, this.tickFactor);\n        \n                if (!this.numberMinorTicks) {\n                    this.numberMinorTicks = getnmt(this.tickPositions, this.tickInterval, this.tickFactor-1);\n                }\n            }\n            \n            // not setting max or min\n            if (!setmax && !setmin) {\n                var range = this.max - this.min;\n                tf = Math.floor(parseFloat((Math.log(range)/Math.log(10)).toFixed(11))) - 1;\n                var nticks = [5,6,4,7,3,8,9,10,2], res, numticks, nonSigDigits=0, sigRange;\n                // check to see how many zeros are at the end of the range\n                if (range > 1) {\n                    var rstr = String(range);\n                    if (rstr.search(/\\./) == -1) {\n                         var pos = rstr.search(/0+$/);\n                         nonSigDigits = (pos > 0) ? rstr.length - pos - 1 : 0;\n                    }\n                }\n                sigRange = range/Math.pow(10, nonSigDigits);\n                for (i=0; i<nticks.length; i++) {\n                    res = sigRange/(nticks[i]-1);\n                    if (res == parseInt(res, 10)) {\n                        this.numberTicks = nticks[i];\n                        this.tickInterval = range/(this.numberTicks-1);\n                        this.tickFactor = tf+1;\n                        break;\n                    }\n                }\n                var it;\n                for (i=0; i<this.numberTicks; i++) {\n                    it = parseFloat((this.min+i*this.tickInterval).toFixed(11));\n                    this.ticks.push([it, it]);\n                }\n                // determine number of minor ticks\n                this.numberMinorTicks = getnmt(this.tickPositions, this.tickInterval, this.tickFactor);\n        \n                if (!this.numberMinorTicks) {\n                    this.numberMinorTicks = getnmt(this.tickPositions, this.tickInterval, this.tickFactor-1);\n                }\n                \n                if (!this.numberMinorTicks) {\n                    this.numberMinorTicks = 1;\n                    var nums = [4, 5, 3, 6, 2];\n                    for (i=0; i<5; i++) {\n                        var temp = this.tickInterval/nums[i];\n                        if (temp == parseInt(temp, 10)) {\n                            this.numberMinorTicks = nums[i]-1;\n                            break;\n                        }\n                    }\n                }\n            }\n        }\n        \n\n        var r = this._radius,\n            sa = this.startAngle,\n            ea = this.endAngle,       \n            pi = Math.PI,\n            hpi = Math.PI/2;\n            \n        if (this.semiCircular) {\n            var overAngle = Math.atan(this.innerPad/r),\n                outersa = this.outerStartAngle = sa - overAngle,\n                outerea = this.outerEndAngle = ea + overAngle,\n                hubsa = this.hubStartAngle = sa - Math.atan(this.innerPad/this.hubRadius*2),\n                hubea = this.hubEndAngle = ea + Math.atan(this.innerPad/this.hubRadius*2);\n\n            ctx.save();            \n            \n            ctx.translate(this._center[0], this._center[1]);\n            ctx.lineJoin = \"round\";\n            ctx.lineCap = \"round\";\n            \n            // draw the innerbackground\n            ctx.save();\n            ctx.beginPath();  \n            ctx.fillStyle = this.background;\n            ctx.arc(0, 0, r, outersa, outerea, false);\n            ctx.closePath();\n            ctx.fill();\n            ctx.restore();\n            \n            // draw the shadow\n            // the outer ring.\n            var shadowColor = 'rgba(0,0,0,'+this.shadowAlpha+')';\n            ctx.save();\n            for (var i=0; i<this.shadowDepth; i++) {\n                ctx.translate(this.shadowOffset*Math.cos(this.shadowAngle/180*Math.PI), this.shadowOffset*Math.sin(this.shadowAngle/180*Math.PI));\n                ctx.beginPath();  \n                ctx.strokeStyle = shadowColor;\n                ctx.lineWidth = this.shadowWidth;\n                ctx.arc(0 ,0, r, outersa, outerea, false);\n                ctx.closePath();\n                ctx.stroke();\n            }\n            ctx.restore();\n            \n            // the inner hub.\n            ctx.save();\n            var tempd = parseInt((this.shadowDepth+1)/2, 10);\n            for (var i=0; i<tempd; i++) {\n                ctx.translate(this.shadowOffset*Math.cos(this.shadowAngle/180*Math.PI), this.shadowOffset*Math.sin(this.shadowAngle/180*Math.PI));\n                ctx.beginPath();  \n                ctx.fillStyle = shadowColor;\n                ctx.arc(0 ,0, this.hubRadius, hubsa, hubea, false);\n                ctx.closePath();\n                ctx.fill();\n            }\n            ctx.restore();\n            \n            // draw the outer ring.\n            ctx.save();\n            ctx.beginPath();  \n            ctx.strokeStyle = this.ringColor;\n            ctx.lineWidth = this.ringWidth;\n            ctx.arc(0 ,0, r, outersa, outerea, false);\n            ctx.closePath();\n            ctx.stroke();\n            ctx.restore();\n            \n            // draw the hub\n            \n            ctx.save();\n            ctx.beginPath();  \n            ctx.fillStyle = this.ringColor;\n            ctx.arc(0 ,0, this.hubRadius,hubsa, hubea, false);\n            ctx.closePath();\n            ctx.fill();\n            ctx.restore();\n            \n            // draw the ticks\n            if (this.showTicks) {\n                ctx.save();\n                var orad = this.tickOuterRadius,\n                    tl = this.tickLength,\n                    mtl = tl/2,\n                    nmt = this.numberMinorTicks,\n                    ts = this.span * Math.PI / 180 / (this.ticks.length-1),\n                    mts = ts/(nmt + 1);\n                \n                for (i = 0; i<this.ticks.length; i++) {\n                    ctx.beginPath();\n                    ctx.lineWidth = 1.5 + this.diameter/360;\n                    ctx.strokeStyle = this.ringColor;\n                    var wps = ts*i+sa;\n                    ctx.moveTo(-orad * Math.cos(ts*i+sa), orad * Math.sin(ts*i+sa));\n                    ctx.lineTo(-(orad-tl) * Math.cos(ts*i+sa), (orad - tl) * Math.sin(ts*i+sa));\n                    this._tickPoints.push([(orad-tl) * Math.cos(ts*i+sa) + this._center[0] + this.canvas._offsets.left, (orad - tl) * Math.sin(ts*i+sa) + this._center[1] + this.canvas._offsets.top, ts*i+sa]);\n                    ctx.stroke();\n                    ctx.lineWidth = 1.0 + this.diameter/440;\n                    if (i<this.ticks.length-1) {\n                        for (var j=1; j<=nmt; j++) {\n                            ctx.beginPath();\n                            ctx.moveTo(-orad * Math.cos(ts*i+mts*j+sa), orad * Math.sin(ts*i+mts*j+sa));\n                            ctx.lineTo(-(orad-mtl) * Math.cos(ts*i+mts*j+sa), (orad-mtl) * Math.sin(ts*i+mts*j+sa));\n                            ctx.stroke();\n                        }   \n                    }\n                }\n                ctx.restore();\n            }\n            \n            // draw the tick labels\n            if (this.showTickLabels) {\n                var elem, l, t, ew, eh, dim, maxdim=0;\n                var tp = this.tickPadding * (1 - 1/(this.diameter/80+1));\n                for (i=0; i<this.ticks.length; i++) {\n                    elem = $('<div class=\"jqplot-meterGauge-tick\" style=\"position:absolute;\">'+this.ticks[i][1]+'</div>');\n                    this.canvas._elem.after(elem);\n                    ew = elem.outerWidth(true);\n                    eh = elem.outerHeight(true);\n                    l = this._tickPoints[i][0] - ew * (this._tickPoints[i][2]-Math.PI)/Math.PI - tp * Math.cos(this._tickPoints[i][2]);\n                    t = this._tickPoints[i][1] - eh/2 + eh/2 * Math.pow(Math.abs((Math.sin(this._tickPoints[i][2]))), 0.5) + tp/3 * Math.pow(Math.abs((Math.sin(this._tickPoints[i][2]))), 0.5) ;\n                    // t = this._tickPoints[i][1] - eh/2 - eh/2 * Math.sin(this._tickPoints[i][2]) - tp/2 * Math.sin(this._tickPoints[i][2]);\n                    elem.css({left:l, top:t, color: this.tickColor});\n                    dim  = ew*Math.cos(this._tickPoints[i][2]) + eh*Math.sin(Math.PI/2+this._tickPoints[i][2]/2);\n                    maxdim = (dim > maxdim) ? dim : maxdim;\n                }\n            }\n            \n            // draw the gauge label\n            if (this.label && this.labelPosition == 'inside') {\n                var l = this._center[0] + this.canvas._offsets.left;\n                var tp = this.tickPadding * (1 - 1/(this.diameter/80+1));\n                var t = 0.5*(this._center[1] + this.canvas._offsets.top - this.hubRadius) + 0.5*(this._center[1] + this.canvas._offsets.top - this.tickOuterRadius + this.tickLength + tp) + this.labelHeightAdjust;\n                // this._labelElem = $('<div class=\"jqplot-meterGauge-label\" style=\"position:absolute;\">'+this.label+'</div>');\n                // this.canvas._elem.after(this._labelElem);\n                l -= this._labelElem.outerWidth(true)/2;\n                t -= this._labelElem.outerHeight(true)/2;\n                this._labelElem.css({left:l, top:t});\n            }\n            \n            else if (this.label && this.labelPosition == 'bottom') {\n                var l = this._center[0] + this.canvas._offsets.left - this._labelElem.outerWidth(true)/2;\n                var t = this._center[1] + this.canvas._offsets.top + this.innerPad + this.ringWidth + this.padding + this.labelHeightAdjust;\n                this._labelElem.css({left:l, top:t});\n                \n            }\n            \n            // draw the intervals\n            \n            ctx.save();\n            var inner = this.intervalInnerRadius || this.hubRadius * 1.5;\n            if (this.intervalOuterRadius == null) {\n                if (this.showTickLabels) {\n                    var outer = (this.tickOuterRadius - this.tickLength - this.tickPadding - this.diameter/8);\n                }\n                else {\n                    var outer = (this.tickOuterRadius - this.tickLength - this.diameter/16);\n                }\n            }\n            else {\n                var outer = this.intervalOuterRadius;\n            }\n            var range = this.max - this.min;\n            var intrange = this.intervals[this.intervals.length-1] - this.min;\n            var start, end, span = this.span*Math.PI/180;\n            for (i=0; i<this.intervals.length; i++) {\n                start = (i == 0) ? sa : sa + (this.intervals[i-1][0] - this.min)*span/range;\n                if (start < 0) {\n                    start = 0;\n                }\n                end = sa + (this.intervals[i][0] - this.min)*span/range;\n                if (end < 0) {\n                    end = 0;\n                }\n                ctx.beginPath();\n                ctx.fillStyle = this.intervals[i][2];\n                ctx.arc(0, 0, inner, start, end, false);\n                ctx.lineTo(outer*Math.cos(end), outer*Math.sin(end));\n                ctx.arc(0, 0, outer, end, start, true);\n                ctx.lineTo(inner*Math.cos(start), inner*Math.sin(start));\n                ctx.closePath();\n                ctx.fill();\n            }\n            ctx.restore();\n            \n            // draw the needle\n            var datapoint = this.data[0][1];\n            var dataspan = this.max - this.min;\n            if (this.pegNeedle) {\n                if (this.data[0][1] > this.max + dataspan*3/this.span) {\n                    datapoint = this.max + dataspan*3/this.span;\n                }\n                if (this.data[0][1] < this.min - dataspan*3/this.span) {\n                    datapoint = this.min - dataspan*3/this.span;\n                }\n            }\n            var dataang = (datapoint - this.min)/dataspan * this.span * Math.PI/180 + this.startAngle;\n            \n            \n            ctx.save();\n            ctx.beginPath();\n            ctx.fillStyle = this.ringColor;\n            ctx.strokeStyle = this.ringColor;\n            this.needleLength = (this.tickOuterRadius - this.tickLength) * 0.85;\n            this.needleThickness = (this.needleThickness < 2) ? 2 : this.needleThickness;\n            var endwidth = this.needleThickness * 0.4;\n\n            \n            var dl = this.needleLength/10;\n            var dt = (this.needleThickness - endwidth)/10;\n            var templ;\n            for (var i=0; i<10; i++) {\n                templ = this.needleThickness - i*dt;\n                ctx.moveTo(dl*i*Math.cos(dataang), dl*i*Math.sin(dataang));\n                ctx.lineWidth = templ;\n                ctx.lineTo(dl*(i+1)*Math.cos(dataang), dl*(i+1)*Math.sin(dataang));\n                ctx.stroke();\n            }\n            \n            ctx.restore();\n        }\n        else {\n            this._center = [(cw - trans * offx)/2 + trans * offx, (ch - trans*offy)/2 + trans * offy];\n        }               \n    };\n    \n    $.jqplot.MeterGaugeAxisRenderer = function() {\n        $.jqplot.LinearAxisRenderer.call(this);\n    };\n    \n    $.jqplot.MeterGaugeAxisRenderer.prototype = new $.jqplot.LinearAxisRenderer();\n    $.jqplot.MeterGaugeAxisRenderer.prototype.constructor = $.jqplot.MeterGaugeAxisRenderer;\n        \n    \n    // There are no traditional axes on a gauge chart.  We just need to provide\n    // dummy objects with properties so the plot will render.\n    // called with scope of axis object.\n    $.jqplot.MeterGaugeAxisRenderer.prototype.init = function(options){\n        //\n        this.tickRenderer = $.jqplot.MeterGaugeTickRenderer;\n        $.extend(true, this, options);\n        // I don't think I'm going to need _dataBounds here.\n        // have to go Axis scaling in a way to fit chart onto plot area\n        // and provide u2p and p2u functionality for mouse cursor, etc.\n        // for convienence set _dataBounds to 0 and 100 and\n        // set min/max to 0 and 100.\n        this._dataBounds = {min:0, max:100};\n        this.min = 0;\n        this.max = 100;\n        this.showTicks = false;\n        this.ticks = [];\n        this.showMark = false;\n        this.show = false; \n    };\n    \n    $.jqplot.MeterGaugeLegendRenderer = function(){\n        $.jqplot.TableLegendRenderer.call(this);\n    };\n    \n    $.jqplot.MeterGaugeLegendRenderer.prototype = new $.jqplot.TableLegendRenderer();\n    $.jqplot.MeterGaugeLegendRenderer.prototype.constructor = $.jqplot.MeterGaugeLegendRenderer;\n    \n    /**\n     * Class: $.jqplot.MeterGaugeLegendRenderer\n     *Meter gauges don't typically have a legend, this overrides the default legend renderer.\n     */\n    $.jqplot.MeterGaugeLegendRenderer.prototype.init = function(options) {\n        // Maximum number of rows in the legend.  0 or null for unlimited.\n        this.numberRows = null;\n        // Maximum number of columns in the legend.  0 or null for unlimited.\n        this.numberColumns = null;\n        $.extend(true, this, options);\n    };\n    \n    // called with context of legend\n    $.jqplot.MeterGaugeLegendRenderer.prototype.draw = function() {\n        if (this.show) {\n            var series = this._series;\n            var ss = 'position:absolute;';\n            ss += (this.background) ? 'background:'+this.background+';' : '';\n            ss += (this.border) ? 'border:'+this.border+';' : '';\n            ss += (this.fontSize) ? 'font-size:'+this.fontSize+';' : '';\n            ss += (this.fontFamily) ? 'font-family:'+this.fontFamily+';' : '';\n            ss += (this.textColor) ? 'color:'+this.textColor+';' : '';\n            ss += (this.marginTop != null) ? 'margin-top:'+this.marginTop+';' : '';\n            ss += (this.marginBottom != null) ? 'margin-bottom:'+this.marginBottom+';' : '';\n            ss += (this.marginLeft != null) ? 'margin-left:'+this.marginLeft+';' : '';\n            ss += (this.marginRight != null) ? 'margin-right:'+this.marginRight+';' : '';\n            this._elem = $('<table class=\"jqplot-table-legend\" style=\"'+ss+'\"></table>');\n            // MeterGauge charts legends don't go by number of series, but by number of data points\n            // in the series.  Refactor things here for that.\n            \n            var pad = false, \n                reverse = false,\n                nr, nc;\n            var s = series[0];\n            \n            if (s.show) {\n                var pd = s.data;\n                if (this.numberRows) {\n                    nr = this.numberRows;\n                    if (!this.numberColumns){\n                        nc = Math.ceil(pd.length/nr);\n                    }\n                    else{\n                        nc = this.numberColumns;\n                    }\n                }\n                else if (this.numberColumns) {\n                    nc = this.numberColumns;\n                    nr = Math.ceil(pd.length/this.numberColumns);\n                }\n                else {\n                    nr = pd.length;\n                    nc = 1;\n                }\n                \n                var i, j, tr, td1, td2, lt, rs, color;\n                var idx = 0;    \n                \n                for (i=0; i<nr; i++) {\n                    if (reverse){\n                        tr = $('<tr class=\"jqplot-table-legend\"></tr>').prependTo(this._elem);\n                    }\n                    else{\n                        tr = $('<tr class=\"jqplot-table-legend\"></tr>').appendTo(this._elem);\n                    }\n                    for (j=0; j<nc; j++) {\n                        if (idx < pd.length){\n                            // debugger\n                            lt = this.labels[idx] || pd[idx][0].toString();\n                            color = s.color;\n                            if (!reverse){\n                                if (i>0){\n                                    pad = true;\n                                }\n                                else{\n                                    pad = false;\n                                }\n                            }\n                            else{\n                                if (i == nr -1){\n                                    pad = false;\n                                }\n                                else{\n                                    pad = true;\n                                }\n                            }\n                            rs = (pad) ? this.rowSpacing : '0';\n                \n                            td1 = $('<td class=\"jqplot-table-legend\" style=\"text-align:center;padding-top:'+rs+';\">'+\n                                '<div><div class=\"jqplot-table-legend-swatch\" style=\"border-color:'+color+';\"></div>'+\n                                '</div></td>');\n                            td2 = $('<td class=\"jqplot-table-legend\" style=\"padding-top:'+rs+';\"></td>');\n                            if (this.escapeHtml){\n                                td2.text(lt);\n                            }\n                            else {\n                                td2.html(lt);\n                            }\n                            if (reverse) {\n                                td2.prependTo(tr);\n                                td1.prependTo(tr);\n                            }\n                            else {\n                                td1.appendTo(tr);\n                                td2.appendTo(tr);\n                            }\n                            pad = true;\n                        }\n                        idx++;\n                    }   \n                }\n            }\n        }\n        return this._elem;                \n    };\n    \n    \n    // setup default renderers for axes and legend so user doesn't have to\n    // called with scope of plot\n    function preInit(target, data, options) {\n        // debugger\n        options = options || {};\n        options.axesDefaults = options.axesDefaults || {};\n        options.legend = options.legend || {};\n        options.seriesDefaults = options.seriesDefaults || {};\n        options.grid = options.grid || {};\n           \n        // only set these if there is a gauge series\n        var setopts = false;\n        if (options.seriesDefaults.renderer == $.jqplot.MeterGaugeRenderer) {\n            setopts = true;\n        }\n        else if (options.series) {\n            for (var i=0; i < options.series.length; i++) {\n                if (options.series[i].renderer == $.jqplot.MeterGaugeRenderer) {\n                    setopts = true;\n                }\n            }\n        }\n        \n        if (setopts) {\n            options.axesDefaults.renderer = $.jqplot.MeterGaugeAxisRenderer;\n            options.legend.renderer = $.jqplot.MeterGaugeLegendRenderer;\n            options.legend.preDraw = true;\n            options.grid.background = options.grid.background || 'white';\n            options.grid.drawGridlines = false;\n            options.grid.borderWidth = (options.grid.borderWidth != null) ? options.grid.borderWidth : 0;\n            options.grid.shadow = (options.grid.shadow != null) ? options.grid.shadow : false;\n        }\n    }\n    \n    // called with scope of plot\n    function postParseOptions(options) {\n        //\n    }\n    \n    $.jqplot.preInitHooks.push(preInit);\n    $.jqplot.postParseOptionsHooks.push(postParseOptions);\n    \n    $.jqplot.MeterGaugeTickRenderer = function() {\n        $.jqplot.AxisTickRenderer.call(this);\n    };\n    \n    $.jqplot.MeterGaugeTickRenderer.prototype = new $.jqplot.AxisTickRenderer();\n    $.jqplot.MeterGaugeTickRenderer.prototype.constructor = $.jqplot.MeterGaugeTickRenderer;\n    \n})(jQuery);\n    \n    \n"
  },
  {
    "path": "stenogotchi/ui/web/static/js/plugins/jqplot.mobile.js",
    "content": "/**\n * jqplot.jquerymobile plugin\n * jQuery Mobile virtual event support.\n *\n * Version: 1.0.9\n * Revision: d96a669\n *\n * Copyright (c) 2011 Takashi Okamoto\n * jqPlot is currently available for use in all personal or commercial projects \n * under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL \n * version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can \n * choose the license that best suits your project and use it accordingly. \n *\n * Although not required, the author would appreciate an email letting him \n * know of any substantial use of jqPlot.  You can reach the author at: \n * chris at jqplot dot com or see http://www.jqplot.com/info.php .\n *\n * If you are feeling kind and generous, consider supporting the project by\n * making a donation at: http://www.jqplot.com/donate.php .\n *\n */\n(function($) {\n    function postInit(target, data, options){\n        this.bindCustomEvents = function() {\n            this.eventCanvas._elem.bind('vclick', {plot:this}, this.onClick);\n            this.eventCanvas._elem.bind('dblclick', {plot:this}, this.onDblClick);\n            this.eventCanvas._elem.bind('taphold', {plot:this}, this.onDblClick);\n            this.eventCanvas._elem.bind('vmousedown', {plot:this}, this.onMouseDown);\n            this.eventCanvas._elem.bind('vmousemove', {plot:this}, this.onMouseMove);\n            this.eventCanvas._elem.bind('mouseenter', {plot:this}, this.onMouseEnter);\n            this.eventCanvas._elem.bind('mouseleave', {plot:this}, this.onMouseLeave);\n            if (this.captureRightClick) {\n                this.eventCanvas._elem.bind('vmouseup', {plot:this}, this.onRightClick);\n                this.eventCanvas._elem.get(0).oncontextmenu = function() {\n                    return false;\n                };\n            }\n            else {\n                this.eventCanvas._elem.bind('vmouseup', {plot:this}, this.onMouseUp);\n            }\n        };\n        this.plugins.mobile = true;\n    }\n    $.jqplot.postInitHooks.push(postInit);\n})(jQuery);"
  },
  {
    "path": "stenogotchi/ui/web/static/js/plugins/jqplot.ohlcRenderer.js",
    "content": "/**\n * jqPlot\n * Pure JavaScript plotting plugin using jQuery\n *\n * Version: 1.0.9\n * Revision: d96a669\n *\n * Copyright (c) 2009-2016 Chris Leonello\n * jqPlot is currently available for use in all personal or commercial projects \n * under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL \n * version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can \n * choose the license that best suits your project and use it accordingly. \n *\n * Although not required, the author would appreciate an email letting him \n * know of any substantial use of jqPlot.  You can reach the author at: \n * chris at jqplot dot com or see http://www.jqplot.com/info.php .\n *\n * If you are feeling kind and generous, consider supporting the project by\n * making a donation at: http://www.jqplot.com/donate.php .\n *\n * sprintf functions contained in jqplot.sprintf.js by Ash Searle:\n *\n *     version 2007.04.27\n *     author Ash Searle\n *     http://hexmen.com/blog/2007/03/printf-sprintf/\n *     http://hexmen.com/js/sprintf.js\n *     The author (Ash Searle) has placed this code in the public domain:\n *     \"This code is unrestricted: you are free to use it however you like.\"\n * \n */\n(function($) {\n    /**\n     * Class: $.jqplot.OHLCRenderer\n     * jqPlot Plugin to draw Open Hi Low Close, Candlestick and Hi Low Close charts.\n     * \n     * To use this plugin, include the renderer js file in \n     * your source:\n     * \n     * > <script type=\"text/javascript\" src=\"plugins/jqplot.ohlcRenderer.js\"></script>\n     * \n     * You will most likely want to use a date axis renderer\n     * for the x axis also, so include the date axis render js file also:\n     * \n     * > <script type=\"text/javascript\" src=\"plugins/jqplot.dateAxisRenderer.js\"></script>\n     * \n     * Then you set the renderer in the series options on your plot:\n     * \n     * > series: [{renderer:$.jqplot.OHLCRenderer}]\n     * \n     * For OHLC and candlestick charts, data should be specified\n     * like so:\n     * \n     * > dat = [['07/06/2009',138.7,139.68,135.18,135.4], ['06/29/2009',143.46,144.66,139.79,140.02], ...]\n     * \n     * If the data array has only 4 values per point instead of 5,\n     * the renderer will create a Hi Low Close chart instead.  In that case,\n     * data should be supplied like:\n     * \n     * > dat = [['07/06/2009',139.68,135.18,135.4], ['06/29/2009',144.66,139.79,140.02], ...]\n     * \n     * To generate a candlestick chart instead of an OHLC chart,\n     * set the \"candlestick\" option to true:\n     * \n     * > series: [{renderer:$.jqplot.OHLCRenderer, rendererOptions:{candleStick:true}}],\n     * \n     */\n    $.jqplot.OHLCRenderer = function(){\n        // subclass line renderer to make use of some of its methods.\n        $.jqplot.LineRenderer.call(this);\n        // prop: candleStick\n        // true to render chart as candleStick.\n        // Must have an open price, cannot be a hlc chart.\n        this.candleStick = false;\n        // prop: tickLength\n        // length of the line in pixels indicating open and close price.\n        // Default will auto calculate based on plot width and \n        // number of points displayed.\n        this.tickLength = 'auto';\n        // prop: bodyWidth\n        // width of the candlestick body in pixels.  Default will auto calculate\n        // based on plot width and number of candlesticks displayed.\n        this.bodyWidth = 'auto';\n        // prop: openColor\n        // color of the open price tick mark.  Default is series color.\n        this.openColor = null;\n        // prop: closeColor\n        // color of the close price tick mark.  Default is series color.\n        this.closeColor = null;\n        // prop: wickColor\n        // color of the hi-lo line thorugh the candlestick body.\n        // Default is the series color.\n        this.wickColor = null;\n        // prop: fillUpBody\n        // true to render an \"up\" day (close price greater than open price)\n        // with a filled candlestick body.\n        this.fillUpBody = false;\n        // prop: fillDownBody\n        // true to render a \"down\" day (close price lower than open price)\n        // with a filled candlestick body.\n        this.fillDownBody = true;\n        // prop: upBodyColor\n        // Color of candlestick body of an \"up\" day.  Default is series color.\n        this.upBodyColor = null;\n        // prop: downBodyColor\n        // Color of candlestick body on a \"down\" day.  Default is series color.\n        this.downBodyColor = null;\n        // prop: hlc\n        // true if is a hi-low-close chart (no open price).\n        // This is determined automatically from the series data.\n        this.hlc = false;\n        // prop: lineWidth\n        // Width of the hi-low line and open/close ticks.\n        // Must be set in the rendererOptions for the series.\n        this.lineWidth = 1.5;\n        this._tickLength;\n        this._bodyWidth;\n    };\n    \n    $.jqplot.OHLCRenderer.prototype = new $.jqplot.LineRenderer();\n    $.jqplot.OHLCRenderer.prototype.constructor = $.jqplot.OHLCRenderer;\n    \n    // called with scope of series.\n    $.jqplot.OHLCRenderer.prototype.init = function(options) {\n        options = options || {};\n        // lineWidth has to be set on the series, changes in renderer\n        // constructor have no effect.  set the default here\n        // if no renderer option for lineWidth is specified.\n        this.lineWidth = options.lineWidth || 1.5;\n        $.jqplot.LineRenderer.prototype.init.call(this, options);\n        this._type = 'ohlc';\n        // set the yaxis data bounds here to account for hi and low values\n        var db = this._yaxis._dataBounds;\n        var d = this._plotData;\n        // if data points have less than 5 values, force a hlc chart.\n        if (d[0].length < 5) {\n            this.renderer.hlc = true;\n\n            for (var j=0; j<d.length; j++) { \n                if (d[j][2] < db.min || db.min == null) {\n                    db.min = d[j][2];\n                }\n                if (d[j][1] > db.max || db.max == null) {\n                    db.max = d[j][1];\n                }             \n            }\n        }\n        else {\n            for (var j=0; j<d.length; j++) { \n                if (d[j][3] < db.min || db.min == null) {\n                    db.min = d[j][3];\n                }\n                if (d[j][2] > db.max || db.max == null) {\n                    db.max = d[j][2];\n                }             \n            }\n        }\n        \n    };\n    \n    // called within scope of series.\n    $.jqplot.OHLCRenderer.prototype.draw = function(ctx, gd, options) {\n        var d = this.data;\n        var xmin = this._xaxis.min;\n        var xmax = this._xaxis.max;\n        // index of last value below range of plot.\n        var xminidx = 0;\n        // index of first value above range of plot.\n        var xmaxidx = d.length;\n        var xp = this._xaxis.series_u2p;\n        var yp = this._yaxis.series_u2p;\n        var i, prevColor, ops, b, h, w, a, points;\n        var o;\n        var r = this.renderer;\n        var opts = (options != undefined) ? options : {};\n        var shadow = (opts.shadow != undefined) ? opts.shadow : this.shadow;\n        var fill = (opts.fill != undefined) ? opts.fill : this.fill;\n        var fillAndStroke = (opts.fillAndStroke != undefined) ? opts.fillAndStroke : this.fillAndStroke;\n        r.bodyWidth = (opts.bodyWidth != undefined) ? opts.bodyWidth : r.bodyWidth;\n        r.tickLength = (opts.tickLength != undefined) ? opts.tickLength : r.tickLength;\n        ctx.save();\n        if (this.show) {\n            var x, open, hi, low, close;\n            // need to get widths based on number of points shown,\n            // not on total number of points.  Use the results \n            // to speed up drawing in next step.\n            for (var i=0; i<d.length; i++) {\n                if (d[i][0] < xmin) {\n                    xminidx = i;\n                }\n                else if (d[i][0] < xmax) {\n                    xmaxidx = i+1;\n                }\n            }\n\n            var dwidth = this.gridData[xmaxidx-1][0] - this.gridData[xminidx][0];\n            var nvisiblePoints = xmaxidx - xminidx;\n            try {\n                var dinterval = Math.abs(this._xaxis.series_u2p(parseInt(this._xaxis._intervalStats[0].sortedIntervals[0].interval, 10)) - this._xaxis.series_u2p(0)); \n            }\n\n            catch (e) {\n                var dinterval = dwidth / nvisiblePoints;\n            }\n            \n            if (r.candleStick) {\n                if (typeof(r.bodyWidth) == 'number') {\n                    r._bodyWidth = r.bodyWidth;\n                }\n                else {\n                    r._bodyWidth = Math.min(20, dinterval/1.65);\n                }\n            }\n            else {\n                if (typeof(r.tickLength) == 'number') {\n                    r._tickLength = r.tickLength;\n                }\n                else {\n                    r._tickLength = Math.min(10, dinterval/3.5);\n                }\n            }\n            \n            for (var i=xminidx; i<xmaxidx; i++) {\n                x = xp(d[i][0]);\n                if (r.hlc) {\n                    open = null;\n                    hi = yp(d[i][1]);\n                    low = yp(d[i][2]);\n                    close = yp(d[i][3]);\n                }\n                else {\n                    open = yp(d[i][1]);\n                    hi = yp(d[i][2]);\n                    low = yp(d[i][3]);\n                    close = yp(d[i][4]);\n                }\n                o = {};\n                if (r.candleStick && !r.hlc) {\n                    w = r._bodyWidth;\n                    a = x - w/2;\n                    // draw candle\n                    // determine if candle up or down\n                    // up, remember grid coordinates increase downward\n                    if (close < open) {\n                        // draw wick\n                        if (r.wickColor) {\n                            o.color = r.wickColor;\n                        }\n                        else if (r.downBodyColor) {\n                            o.color = r.upBodyColor;\n                        }\n                        ops = $.extend(true, {}, opts, o);\n                        r.shapeRenderer.draw(ctx, [[x, hi], [x, close]], ops); \n                        r.shapeRenderer.draw(ctx, [[x, open], [x, low]], ops); \n                        o = {};\n                        b = close;\n                        h = open - close;\n                        // if color specified, use it\n                        if (r.fillUpBody) {\n                            o.fillRect = true;\n                        }\n                        else {\n                            o.strokeRect = true;\n                            w = w - this.lineWidth;\n                            a = x - w/2;\n                        }\n                        if (r.upBodyColor) {\n                            o.color = r.upBodyColor;\n                            o.fillStyle = r.upBodyColor;\n                        }\n                        points = [a, b, w, h];\n                    }\n                    // down\n                    else if (close >  open) {\n                        // draw wick\n                        if (r.wickColor) {\n                            o.color = r.wickColor;\n                        }\n                        else if (r.downBodyColor) {\n                            o.color = r.downBodyColor;\n                        }\n                        ops = $.extend(true, {}, opts, o);\n                        r.shapeRenderer.draw(ctx, [[x, hi], [x, open]], ops); \n                        r.shapeRenderer.draw(ctx, [[x, close], [x, low]], ops);\n                         \n                        o = {};\n                        \n                        b = open;\n                        h = close - open;\n                        // if color specified, use it\n                        if (r.fillDownBody) {\n                            o.fillRect = true;\n                        }\n                        else {\n                            o.strokeRect = true;\n                            w = w - this.lineWidth;\n                            a = x - w/2;\n                        }\n                        if (r.downBodyColor) {\n                            o.color = r.downBodyColor;\n                            o.fillStyle = r.downBodyColor;\n                        }\n                        points = [a, b, w, h];\n                    }\n                    // even, open = close\n                    else  {\n                        // draw wick\n                        if (r.wickColor) {\n                            o.color = r.wickColor;\n                        }\n                        ops = $.extend(true, {}, opts, o);\n                        r.shapeRenderer.draw(ctx, [[x, hi], [x, low]], ops); \n                        o = {};\n                        o.fillRect = false;\n                        o.strokeRect = false;\n                        a = [x - w/2, open];\n                        b = [x + w/2, close];\n                        w = null;\n                        h = null;\n                        points = [a, b];\n                    }\n                    ops = $.extend(true, {}, opts, o);\n                    r.shapeRenderer.draw(ctx, points, ops);\n                }\n                else {\n                    prevColor = opts.color;\n                    if (r.openColor) {\n                        opts.color = r.openColor;\n                    }\n                    // draw open tick\n                    if (!r.hlc) {\n                        r.shapeRenderer.draw(ctx, [[x-r._tickLength, open], [x, open]], opts);    \n                    }\n                    opts.color = prevColor;\n                    // draw wick\n                    if (r.wickColor) {\n                        opts.color = r.wickColor;\n                    }\n                    r.shapeRenderer.draw(ctx, [[x, hi], [x, low]], opts); \n                    opts.color  = prevColor;\n                    // draw close tick\n                    if (r.closeColor) {\n                        opts.color = r.closeColor;\n                    }\n                    r.shapeRenderer.draw(ctx, [[x, close], [x+r._tickLength, close]], opts); \n                    opts.color = prevColor;\n                }\n            }\n        }\n        \n        ctx.restore();\n    };  \n    \n    $.jqplot.OHLCRenderer.prototype.drawShadow = function(ctx, gd, options) {\n        // This is a no-op, shadows drawn with lines.\n    };\n    \n    // called with scope of plot.\n    $.jqplot.OHLCRenderer.checkOptions = function(target, data, options) {\n        // provide some sensible highlighter options by default\n        // These aren't good for hlc, only for ohlc or candlestick\n        if (!options.highlighter) {\n            options.highlighter = {\n                showMarker:false,\n                tooltipAxes: 'y',\n                yvalues: 4,\n                formatString:'<table class=\"jqplot-highlighter\"><tr><td>date:</td><td>%s</td></tr><tr><td>open:</td><td>%s</td></tr><tr><td>hi:</td><td>%s</td></tr><tr><td>low:</td><td>%s</td></tr><tr><td>close:</td><td>%s</td></tr></table>'\n            };\n        }\n    };\n    \n    //$.jqplot.preInitHooks.push($.jqplot.OHLCRenderer.checkOptions);\n    \n})(jQuery);    \n"
  },
  {
    "path": "stenogotchi/ui/web/static/js/plugins/jqplot.pieRenderer.js",
    "content": "/**\n * jqPlot\n * Pure JavaScript plotting plugin using jQuery\n *\n * Version: 1.0.9\n * Revision: d96a669\n *\n * Copyright (c) 2009-2016 Chris Leonello\n * jqPlot is currently available for use in all personal or commercial projects \n * under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL \n * version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can \n * choose the license that best suits your project and use it accordingly. \n *\n * Although not required, the author would appreciate an email letting him \n * know of any substantial use of jqPlot.  You can reach the author at: \n * chris at jqplot dot com or see http://www.jqplot.com/info.php .\n *\n * If you are feeling kind and generous, consider supporting the project by\n * making a donation at: http://www.jqplot.com/donate.php .\n *\n * sprintf functions contained in jqplot.sprintf.js by Ash Searle:\n *\n *     version 2007.04.27\n *     author Ash Searle\n *     http://hexmen.com/blog/2007/03/printf-sprintf/\n *     http://hexmen.com/js/sprintf.js\n *     The author (Ash Searle) has placed this code in the public domain:\n *     \"This code is unrestricted: you are free to use it however you like.\"\n * \n */\n(function($) {\n    /**\n     * Class: $.jqplot.PieRenderer\n     * Plugin renderer to draw a pie chart.\n     * x values, if present, will be used as slice labels.\n     * y values give slice size.\n     * \n     * To use this renderer, you need to include the \n     * pie renderer plugin, for example:\n     * \n     * > <script type=\"text/javascript\" src=\"plugins/jqplot.pieRenderer.js\"></script>\n     * \n     * Properties described here are passed into the $.jqplot function\n     * as options on the series renderer.  For example:\n     * \n     * > plot2 = $.jqplot('chart2', [s1, s2], {\n     * >     seriesDefaults: {\n     * >         renderer:$.jqplot.PieRenderer,\n     * >         rendererOptions:{\n     * >              sliceMargin: 2,\n     * >              startAngle: -90\n     * >          }\n     * >      }\n     * > });\n     * \n     * A pie plot will trigger events on the plot target\n     * according to user interaction.  All events return the event object,\n     * the series index, the point (slice) index, and the point data for \n     * the appropriate slice.\n     * \n     * 'jqplotDataMouseOver' - triggered when user mouseing over a slice.\n     * 'jqplotDataHighlight' - triggered the first time user mouses over a slice,\n     *   if highlighting is enabled.\n     * 'jqplotDataUnhighlight' - triggered when a user moves the mouse out of\n     *   a highlighted slice.\n     * 'jqplotLegendHighlight' - triggered the first time user mouses over a legend,\n     *   if highlighting is enabled.\n     * 'jqplotLegendUnhighlight' - triggered when a user moves the mouse out of\n     *   a highlighted legend.\n     * 'jqplotDataClick' - triggered when the user clicks on a slice.\n     * 'jqplotDataRightClick' - tiggered when the user right clicks on a slice if\n     * the \"captureRightClick\" option is set to true on the plot.\n     */\n    $.jqplot.PieRenderer = function(){\n        $.jqplot.LineRenderer.call(this);\n    };\n    \n    $.jqplot.PieRenderer.prototype = new $.jqplot.LineRenderer();\n    $.jqplot.PieRenderer.prototype.constructor = $.jqplot.PieRenderer;\n    \n    // called with scope of a series\n    $.jqplot.PieRenderer.prototype.init = function(options, plot) {\n        // Group: Properties\n        //\n        // prop: diameter\n        // Outer diameter of the pie, auto computed by default\n        this.diameter = null;\n        // prop: padding\n        // padding between the pie and plot edges, legend, etc.\n        this.padding = 20;\n        // prop: sliceMargin\n        // angular spacing between pie slices in degrees.\n        this.sliceMargin = 0;\n        // prop: fill\n        // true or false, whether to fil the slices.\n        this.fill = true;\n        // prop: shadowOffset\n        // offset of the shadow from the slice and offset of \n        // each succesive stroke of the shadow from the last.\n        this.shadowOffset = 2;\n        // prop: shadowAlpha\n        // transparency of the shadow (0 = transparent, 1 = opaque)\n        this.shadowAlpha = 0.07;\n        // prop: shadowDepth\n        // number of strokes to apply to the shadow, \n        // each stroke offset shadowOffset from the last.\n        this.shadowDepth = 5;\n        // prop: highlightMouseOver\n        // True to highlight slice when moused over.\n        // This must be false to enable highlightMouseDown to highlight when clicking on a slice.\n        this.highlightMouseOver = true;\n        // prop: highlightMouseDown\n        // True to highlight when a mouse button is pressed over a slice.\n        // This will be disabled if highlightMouseOver is true.\n        this.highlightMouseDown = false;\n        // prop: highlightColors\n        // an array of colors to use when highlighting a slice.\n        this.highlightColors = [];\n        // prop: dataLabels\n        // Either 'label', 'value', 'percent' or an array of labels to place on the pie slices.\n        // Defaults to percentage of each pie slice.\n        this.dataLabels = 'percent';\n        // prop: showDataLabels\n        // true to show data labels on slices.\n        this.showDataLabels = false;\n        // prop: dataLabelFormatString\n        // Format string for data labels.  If none, '%s' is used for \"label\" and for arrays, '%d' for value and '%d%%' for percentage.\n        this.dataLabelFormatString = null;\n        // prop: dataLabelThreshold\n        // Threshhold in percentage (0-100) of pie area, below which no label will be displayed.\n        // This applies to all label types, not just to percentage labels.\n        this.dataLabelThreshold = 3;\n        // prop: dataLabelPositionFactor\n        // A Multiplier (0-1) of the pie radius which controls position of label on slice.\n        // Increasing will slide label toward edge of pie, decreasing will slide label toward center of pie.\n        this.dataLabelPositionFactor = 0.52;\n        // prop: dataLabelNudge\n        // Number of pixels to slide the label away from (+) or toward (-) the center of the pie.\n        this.dataLabelNudge = 2;\n        // prop: dataLabelCenterOn\n        // True to center the data label at its position.\n        // False to set the inside facing edge of the label at its position.\n        this.dataLabelCenterOn = true;\n        // prop: startAngle\n        // Angle to start drawing pie in degrees.  \n        // According to orientation of canvas coordinate system:\n        // 0 = on the positive x axis\n        // -90 = on the positive y axis.\n        // 90 = on the negaive y axis.\n        // 180 or - 180 = on the negative x axis.\n        this.startAngle = 0;\n        this.tickRenderer = $.jqplot.PieTickRenderer;\n        // prop: showSlice\n        // Array for whether the pie chart slice for a data element should be displayed.\n        // Containsg true or false for each data element.  If not specified, defaults to true.\n        this.showSlice = [];\n        // Used as check for conditions where pie shouldn't be drawn.\n        this._drawData = true;\n        this._type = 'pie';\n        \n        // if user has passed in highlightMouseDown option and not set highlightMouseOver, disable highlightMouseOver\n        if (options.highlightMouseDown && options.highlightMouseOver == null) {\n            options.highlightMouseOver = false;\n        }\n        \n        $.extend(true, this, options);\n\n        if (this.sliceMargin < 0) {\n            this.sliceMargin = 0;\n        }\n\n        this._diameter = null;\n        this._radius = null;\n        // array of [start,end] angles arrays, one for each slice.  In radians.\n        this._sliceAngles = [];\n        // index of the currenty highlighted point, if any\n        this._highlightedPoint = null;\n        \n        // set highlight colors if none provided\n        if (this.highlightColors.length == 0) {\n            for (var i=0; i<this.seriesColors.length; i++){\n                var rgba = $.jqplot.getColorComponents(this.seriesColors[i]);\n                var newrgb = [rgba[0], rgba[1], rgba[2]];\n                var sum = newrgb[0] + newrgb[1] + newrgb[2];\n                for (var j=0; j<3; j++) {\n                    // when darkening, lowest color component can be is 60.\n                    newrgb[j] = (sum > 570) ?  newrgb[j] * 0.8 : newrgb[j] + 0.3 * (255 - newrgb[j]);\n                    newrgb[j] = parseInt(newrgb[j], 10);\n                }\n                this.highlightColors.push('rgb('+newrgb[0]+','+newrgb[1]+','+newrgb[2]+')');\n            }\n        }\n        \n        this.highlightColorGenerator = new $.jqplot.ColorGenerator(this.highlightColors);\n        \n        plot.postParseOptionsHooks.addOnce(postParseOptions);\n        plot.postInitHooks.addOnce(postInit);\n        plot.eventListenerHooks.addOnce('jqplotMouseMove', handleMove);\n        plot.eventListenerHooks.addOnce('jqplotMouseDown', handleMouseDown);\n        plot.eventListenerHooks.addOnce('jqplotMouseUp', handleMouseUp);\n        plot.eventListenerHooks.addOnce('jqplotClick', handleClick);\n        plot.eventListenerHooks.addOnce('jqplotRightClick', handleRightClick);\n        plot.postDrawHooks.addOnce(postPlotDraw);\n    };\n    \n    $.jqplot.PieRenderer.prototype.setGridData = function(plot) {\n        // set gridData property.  This will hold angle in radians of each data point.\n        var stack = [];\n        var td = [];\n        var sa = this.startAngle/180*Math.PI;\n        var tot = 0;\n        // don't know if we have any valid data yet, so set plot to not draw.\n        this._drawData = false;\n        for (var i=0; i<this.data.length; i++){\n            if (this.data[i][1] != 0) {\n                // we have data, O.K. to draw.\n                this._drawData = true;\n                if (this.showSlice[i] === undefined) {\n                  this.showSlice[i] = true;\n                }\n            }\n            stack.push(this.data[i][1]);\n            td.push([this.data[i][0]]);\n            if (i>0) {\n                stack[i] += stack[i-1];\n            }\n            tot += this.data[i][1];\n        }\n        var fact = Math.PI*2/stack[stack.length - 1];\n        \n        for (var i=0; i<stack.length; i++) {\n            td[i][1] = stack[i] * fact;\n            td[i][2] = this.data[i][1]/tot;\n        }\n        this.gridData = td;\n    };\n    \n    $.jqplot.PieRenderer.prototype.makeGridData = function(data, plot) {\n        var stack = [];\n        var td = [];\n        var tot = 0;\n        var sa = this.startAngle/180*Math.PI;\n        // don't know if we have any valid data yet, so set plot to not draw.\n        this._drawData = false;\n        for (var i=0; i<data.length; i++){\n            if (this.data[i][1] != 0) {\n                // we have data, O.K. to draw.\n                this._drawData = true;\n            }\n            stack.push(data[i][1]);\n            td.push([data[i][0]]);\n            if (i>0) {\n                stack[i] += stack[i-1];\n            }\n            tot += data[i][1];\n        }\n        var fact = Math.PI*2/stack[stack.length - 1];\n        \n        for (var i=0; i<stack.length; i++) {\n            td[i][1] = stack[i] * fact;\n            td[i][2] = data[i][1]/tot;\n        }\n        return td;\n    };\n\n    function calcRadiusAdjustment(ang) {\n        return Math.sin((ang - (ang-Math.PI) / 8 / Math.PI )/2.0);\n    }\n\n    function calcRPrime(ang1, ang2, sliceMargin, fill, lineWidth) {\n        var rprime = 0;\n        var ang = ang2 - ang1;\n        var absang = Math.abs(ang);\n        var sm = sliceMargin;\n        if (fill == false) {\n            sm += lineWidth;\n        }\n\n        if (sm > 0 && absang > 0.01 && absang < 6.282) {\n            rprime = parseFloat(sm) / 2.0 / calcRadiusAdjustment(ang);\n        }\n\n        return rprime;\n    }\n    \n    $.jqplot.PieRenderer.prototype.drawSlice = function (ctx, ang1, ang2, color, isShadow) {\n        if (this._drawData) {\n            var r = this._radius;\n            var fill = this.fill;\n            var lineWidth = this.lineWidth;\n            var sm = this.sliceMargin;\n            if (this.fill == false) {\n                sm += this.lineWidth;\n            }\n            ctx.save();\n            ctx.translate(this._center[0], this._center[1]);\n            \n            var rprime = calcRPrime(ang1, ang2, this.sliceMargin, this.fill, this.lineWidth);\n\n            var transx = rprime * Math.cos((ang1 + ang2) / 2.0);\n            var transy = rprime * Math.sin((ang1 + ang2) / 2.0);\n\n            if ((ang2 - ang1) <= Math.PI) {\n                r -= rprime;  \n            }\n            else {\n                r += rprime;\n            }\n\n            ctx.translate(transx, transy);\n            \n            if (isShadow) {\n                for (var i=0, l=this.shadowDepth; i<l; i++) {\n                    ctx.save();\n                    ctx.translate(this.shadowOffset*Math.cos(this.shadowAngle/180*Math.PI), this.shadowOffset*Math.sin(this.shadowAngle/180*Math.PI));\n                    doDraw(r);\n                }\n                for (var i=0, l=this.shadowDepth; i<l; i++) {\n                    ctx.restore();\n                }\n            }\n    \n            else {\n                doDraw(r);\n            }\n            ctx.restore();\n        }\n    \n        function doDraw (rad) {\n            // Fix for IE and Chrome that can't seem to draw circles correctly.\n            // ang2 should always be <= 2 pi since that is the way the data is converted.\n            // 2Pi = 6.2831853, Pi = 3.1415927\n             if (ang2 > 6.282 + this.startAngle) {\n                ang2 = 6.282 + this.startAngle;\n                if (ang1 > ang2) {\n                    ang1 = 6.281 + this.startAngle;\n                }\n            }\n            // Fix for IE, where it can't seem to handle 0 degree angles.  Also avoids\n            // ugly line on unfilled pies.\n            if (ang1 >= ang2) {\n                return;\n            }            \n        \n            ctx.beginPath();  \n            ctx.fillStyle = color;\n            ctx.strokeStyle = color;\n            ctx.lineWidth = lineWidth;\n            ctx.arc(0, 0, rad, ang1, ang2, false);\n            ctx.lineTo(0,0);\n            ctx.closePath();\n        \n            if (fill) {\n                ctx.fill();\n            }\n            else {\n                ctx.stroke();\n            }\n        }\n    };\n    \n    // called with scope of series\n    $.jqplot.PieRenderer.prototype.draw = function (ctx, gd, options, plot) {\n        var i;\n        var opts = (options != undefined) ? options : {};\n        // offset and direction of offset due to legend placement\n        var offx = 0;\n        var offy = 0;\n        var trans = 1;\n        var colorGenerator = new $.jqplot.ColorGenerator(this.seriesColors);\n        var sliceColor;\n\n        if (options.legendInfo && options.legendInfo.placement == 'insideGrid') {\n            var li = options.legendInfo;\n            switch (li.location) {\n                case 'nw':\n                    offx = li.width + li.xoffset;\n                    break;\n                case 'w':\n                    offx = li.width + li.xoffset;\n                    break;\n                case 'sw':\n                    offx = li.width + li.xoffset;\n                    break;\n                case 'ne':\n                    offx = li.width + li.xoffset;\n                    trans = -1;\n                    break;\n                case 'e':\n                    offx = li.width + li.xoffset;\n                    trans = -1;\n                    break;\n                case 'se':\n                    offx = li.width + li.xoffset;\n                    trans = -1;\n                    break;\n                case 'n':\n                    offy = li.height + li.yoffset;\n                    break;\n                case 's':\n                    offy = li.height + li.yoffset;\n                    trans = -1;\n                    break;\n                default:\n                    break;\n            }\n        }\n        \n        var shadow = (opts.shadow != undefined) ? opts.shadow : this.shadow;\n        var fill = (opts.fill != undefined) ? opts.fill : this.fill;\n        \n        //see http://stackoverflow.com/questions/20221461/hidpi-retina-plot-drawing\n        var cw = parseInt(ctx.canvas.style.width);\n        var ch = parseInt(ctx.canvas.style.height);\n        //\n        \n        var w = cw - offx - 2 * this.padding;\n        var h = ch - offy - 2 * this.padding;\n        var mindim = Math.min(w,h);\n        var d = mindim;\n        \n        // Fixes issue #272.  Thanks hugwijst!\n        // reset slice angles array.\n        this._sliceAngles = [];\n\n        var sm = this.sliceMargin;\n        if (this.fill == false) {\n            sm += this.lineWidth;\n        }\n        \n        var rprime;\n        var maxrprime = 0;\n\n        var ang, ang1, ang2, shadowColor;\n        var sa = this.startAngle / 180 * Math.PI;\n\n        // have to pre-draw shadows, so loop throgh here and calculate some values also.\n        for (var i=0, l=gd.length; i<l; i++) {\n            ang1 = (i == 0) ? sa : gd[i-1][1] + sa;\n            ang2 = gd[i][1] + sa;\n\n            this._sliceAngles.push([ang1, ang2]);\n\n            rprime = calcRPrime(ang1, ang2, this.sliceMargin, this.fill, this.lineWidth);\n\n            if (Math.abs(ang2-ang1) > Math.PI) {\n                maxrprime = Math.max(rprime, maxrprime);  \n            }\n        }\n\n        if (this.diameter != null && this.diameter > 0) {\n            this._diameter = this.diameter - 2*maxrprime;\n        }\n        else {\n            this._diameter = d - 2*maxrprime;\n        }\n\n        // Need to check for undersized pie.  This can happen if\n        // plot area too small and legend is too big.\n        if (this._diameter < 6) {\n            $.jqplot.log('Diameter of pie too small, not rendering.');\n            return;\n        }\n\n        var r = this._radius = this._diameter/2;\n\n        this._center = [(cw - trans * offx)/2 + trans * offx + maxrprime * Math.cos(sa), (ch - trans*offy)/2 + trans * offy + maxrprime * Math.sin(sa)];\n\n        if (this.shadow) {\n            for (var i=0, l=gd.length; i<l; i++) {\n                shadowColor = 'rgba(0,0,0,'+this.shadowAlpha+')';\n                this.renderer.drawSlice.call (this, ctx, this._sliceAngles[i][0], this._sliceAngles[i][1], shadowColor, true);\n            }\n        }\n        \n        for (var i=0; i<gd.length; i++) {\n\n            sliceColor = colorGenerator.next();\n\n            if (this.showSlice[i]) {\n                this.renderer.drawSlice.call (this, ctx, this._sliceAngles[i][0], this._sliceAngles[i][1], sliceColor, false);\n            \n                if (this.showDataLabels && gd[i][2]*100 >= this.dataLabelThreshold) {\n                    var fstr, avgang = (this._sliceAngles[i][0] + this._sliceAngles[i][1])/2, label;\n                \n                    if (this.dataLabels == 'label') {\n                        fstr = this.dataLabelFormatString || '%s';\n                        label = $.jqplot.sprintf(fstr, gd[i][0]);\n                    }\n                    else if (this.dataLabels == 'value') {\n                        fstr = this.dataLabelFormatString || '%d';\n                        label = $.jqplot.sprintf(fstr, this.data[i][1]);\n                    }\n                    else if (this.dataLabels == 'percent') {\n                        fstr = this.dataLabelFormatString || '%d%%';\n                        label = $.jqplot.sprintf(fstr, gd[i][2]*100);\n                    }\n                    else if (this.dataLabels.constructor == Array) {\n                        fstr = this.dataLabelFormatString || '%s';\n                        label = $.jqplot.sprintf(fstr, this.dataLabels[i]);\n                    }\n                \n                    var fact = (this._radius ) * this.dataLabelPositionFactor + this.sliceMargin + this.dataLabelNudge;\n                \n                    var x = this._center[0] + Math.cos(avgang) * fact + this.canvas._offsets.left;\n                    var y = this._center[1] + Math.sin(avgang) * fact + this.canvas._offsets.top;\n                \n                    var labelelem = $('<div class=\"jqplot-pie-series jqplot-data-label\" style=\"position:absolute;\">' + label + '</div>').insertBefore(plot.eventCanvas._elem);\n                    if (this.dataLabelCenterOn) {\n                        x -= labelelem.width()/2;\n                        y -= labelelem.height()/2;\n                    }\n                    else {\n                        x -= labelelem.width() * Math.sin(avgang/2);\n                        y -= labelelem.height()/2;\n                    }\n                    x = Math.round(x);\n                    y = Math.round(y);\n                    labelelem.css({left: x, top: y});\n                }\n            }\n        }            \n    };\n    \n    $.jqplot.PieAxisRenderer = function() {\n        $.jqplot.LinearAxisRenderer.call(this);\n    };\n    \n    $.jqplot.PieAxisRenderer.prototype = new $.jqplot.LinearAxisRenderer();\n    $.jqplot.PieAxisRenderer.prototype.constructor = $.jqplot.PieAxisRenderer;\n        \n    \n    // There are no traditional axes on a pie chart.  We just need to provide\n    // dummy objects with properties so the plot will render.\n    // called with scope of axis object.\n    $.jqplot.PieAxisRenderer.prototype.init = function(options){\n        //\n        this.tickRenderer = $.jqplot.PieTickRenderer;\n        $.extend(true, this, options);\n        // I don't think I'm going to need _dataBounds here.\n        // have to go Axis scaling in a way to fit chart onto plot area\n        // and provide u2p and p2u functionality for mouse cursor, etc.\n        // for convienence set _dataBounds to 0 and 100 and\n        // set min/max to 0 and 100.\n        this._dataBounds = {min:0, max:100};\n        this.min = 0;\n        this.max = 100;\n        this.showTicks = false;\n        this.ticks = [];\n        this.showMark = false;\n        this.show = false; \n    };\n    \n    \n    \n    \n    $.jqplot.PieLegendRenderer = function(){\n        $.jqplot.TableLegendRenderer.call(this);\n    };\n    \n    $.jqplot.PieLegendRenderer.prototype = new $.jqplot.TableLegendRenderer();\n    $.jqplot.PieLegendRenderer.prototype.constructor = $.jqplot.PieLegendRenderer;\n    \n    /**\n     * Class: $.jqplot.PieLegendRenderer\n     * Legend Renderer specific to pie plots.  Set by default\n     * when user creates a pie plot.\n     */\n    $.jqplot.PieLegendRenderer.prototype.init = function(options) {\n        // Group: Properties\n        //\n        // prop: numberRows\n        // Maximum number of rows in the legend.  0 or null for unlimited.\n        this.numberRows = null;\n        // prop: numberColumns\n        // Maximum number of columns in the legend.  0 or null for unlimited.\n        this.numberColumns = null;\n        // prop: width\n        // Fixed with of legend.  0 or null for auto size\n        this.width = null;\n        $.extend(true, this, options);\n    };\n    \n    // called with context of legend\n    $.jqplot.PieLegendRenderer.prototype.draw = function() {\n        var legend = this;\n        if (this.show) {\n            var series = this._series;\n\n\n            this._elem = $(document.createElement('table'));\n            this._elem.addClass('jqplot-table-legend');\n\n            var ss = {position:'absolute'};\n            if (this.background) {\n                ss['background'] = this.background;\n            }\n            if (this.border) {\n                ss['border'] = this.border;\n            }\n            if (this.fontSize) {\n                ss['fontSize'] = this.fontSize;\n            }\n            if (this.fontFamily) {\n                ss['fontFamily'] = this.fontFamily;\n            }\n            if (this.textColor) {\n                ss['textColor'] = this.textColor;\n            }\n            if (this.marginTop != null) {\n                ss['marginTop'] = this.marginTop;\n            }\n            if (this.marginBottom != null) {\n                ss['marginBottom'] = this.marginBottom;\n            }\n            if (this.marginLeft != null) {\n                ss['marginLeft'] = this.marginLeft;\n            }\n            if (this.marginRight != null) {\n                ss['marginRight'] = this.marginRight;\n            }\n\n            this._elem.css(ss);\n\n            // Pie charts legends don't go by number of series, but by number of data points\n            // in the series.  Refactor things here for that.\n            \n            var pad = false, \n                reverse = false,\n                nr, \n                nc;\n            var s = series[0];\n            var colorGenerator = new $.jqplot.ColorGenerator(s.seriesColors);\n            \n            if (s.show) {\n                var pd = s.data;\n                if (this.numberRows) {\n                    nr = this.numberRows;\n                    if (!this.numberColumns){\n                        nc = Math.ceil(pd.length/nr);\n                    }\n                    else{\n                        nc = this.numberColumns;\n                    }\n                }\n                else if (this.numberColumns) {\n                    nc = this.numberColumns;\n                    nr = Math.ceil(pd.length/this.numberColumns);\n                }\n                else {\n                    nr = pd.length;\n                    nc = 1;\n                }\n                \n                var i, j;\n                var tr, td1, td2; \n                var lt, tt, rs, color;\n                var idx = 0; \n                var div0, div1;   \n                \n                for (i=0; i<nr; i++) {\n                    tr = $(document.createElement('tr'));\n                    tr.addClass('jqplot-table-legend');\n                    \n                    if (reverse){\n                        tr.prependTo(this._elem);\n                    }\n                    \n                    else{\n                        tr.appendTo(this._elem);\n                    }\n                    \n                    for (j=0; j<nc; j++) {\n                        if (idx < pd.length) {\n                            tt = '';\n                            if (this.labels[idx]) {\n                                lt = this.labels[idx];\n                            }\n                            else {\n                                if (typeof pd[idx][0] === 'object') {\n                                    lt = pd[idx][0][0].toString();\n                                    tt = pd[idx][0][1].toString();\n                                }\n                                else  {\n                                    lt = pd[idx][0].toString();\n                                }\n                            }\n                            //lt = this.labels[idx] || pd[idx][0].toString();\n                            color = colorGenerator.next();\n                            if (!reverse){\n                                if (i>0){\n                                    pad = true;\n                                }\n                                else{\n                                    pad = false;\n                                }\n                            }\n                            else{\n                                if (i == nr -1){\n                                    pad = false;\n                                }\n                                else{\n                                    pad = true;\n                                }\n                            }\n                            rs = (pad) ? this.rowSpacing : '0';\n\n\n\n                            td1 = $(document.createElement('td'));\n                            td1.addClass('jqplot-table-legend jqplot-table-legend-swatch');\n                            td1.css({textAlign: 'center', paddingTop: rs});\n\n                            div0 = $(document.createElement('div'));\n                            div0.addClass('jqplot-table-legend-swatch-outline');\n                            if (tt !== '') {\n                                div0.attr(\"title\", tt);\n                            }\n                            div1 = $(document.createElement('div'));\n                            div1.addClass('jqplot-table-legend-swatch');\n                            div1.css({backgroundColor: color, borderColor: color});\n                            td1.append(div0.append(div1));\n\n                            td2 = $(document.createElement('td'));\n                            td2.addClass('jqplot-table-legend jqplot-table-legend-label');\n                            td2.css('paddingTop', rs);\n\n                            if (this.escapeHtml){\n                                td2.text(lt);\n                            }\n                            else {\n                                td2.html('<a title=\"' + tt + '\">' + lt + \"</a>\");\n                            }\n                            if (reverse) {\n                                td2.prependTo(tr);\n                                td1.prependTo(tr);\n                            }\n                            else {\n                                td1.appendTo(tr);\n                                td2.appendTo(tr);\n                            }\n                            pad = true;\n                        }\n                        idx++;\n                    }   \n                }\n            }\n        }\n        return this._elem;                \n    };\n    \n    $.jqplot.PieRenderer.prototype.handleMove = function(ev, gridpos, datapos, neighbor, plot) {\n        if (neighbor) {\n            var ins = [neighbor.seriesIndex, neighbor.pointIndex, neighbor.data];\n            plot.target.trigger('jqplotDataMouseOver', ins);\n            if (plot.series[ins[0]].highlightMouseOver && !(ins[0] == plot.plugins.pieRenderer.highlightedSeriesIndex && ins[1] == plot.series[ins[0]]._highlightedPoint)) {\n                plot.target.trigger('jqplotDataHighlight', ins);\n                highlight (plot, ins[0], ins[1]);\n            }\n        }\n        else if (neighbor == null) {\n            unhighlight (plot);\n        }\n    };\n    \n    \n    // this.eventCanvas._elem.bind($.jqplot.eventListenerHooks[i][0], {plot:this}, $.jqplot.eventListenerHooks[i][1]);\n    \n    // setup default renderers for axes and legend so user doesn't have to\n    // called with scope of plot\n    function preInit(target, data, options) {\n        options = options || {};\n        options.axesDefaults = options.axesDefaults || {};\n        options.legend = options.legend || {};\n        options.seriesDefaults = options.seriesDefaults || {};\n        // only set these if there is a pie series\n        var setopts = false;\n        if (options.seriesDefaults.renderer == $.jqplot.PieRenderer) {\n            setopts = true;\n        }\n        else if (options.series) {\n            for (var i=0; i < options.series.length; i++) {\n                if (options.series[i].renderer == $.jqplot.PieRenderer) {\n                    setopts = true;\n                }\n            }\n        }\n        \n        if (setopts) {\n            options.axesDefaults.renderer = $.jqplot.PieAxisRenderer;\n            options.legend.renderer = options.legend.renderer || $.jqplot.PieLegendRenderer;\n            options.legend.preDraw = true;\n            options.seriesDefaults.pointLabels = {show: false};\n        }\n    }\n    \n    function postInit(target, data, options) {\n        for (var i=0; i<this.series.length; i++) {\n            if (this.series[i].renderer.constructor == $.jqplot.PieRenderer) {\n                // don't allow mouseover and mousedown at same time.\n                if (this.series[i].highlightMouseOver) {\n                    this.series[i].highlightMouseDown = false;\n                }\n            }\n        }\n    }\n    \n    // called with scope of plot\n    function postParseOptions(options) {\n        for (var i=0; i<this.series.length; i++) {\n            this.series[i].seriesColors = this.seriesColors;\n            this.series[i].colorGenerator = $.jqplot.colorGenerator;\n        }\n    }\n    \n    function highlight (plot, sidx, pidx) {\n        if (plot.series[sidx].showSlice[pidx]) {\n            var s = plot.series[sidx];\n            var canvas = plot.plugins.pieRenderer.highlightCanvas;\n            canvas._ctx.clearRect(0,0,canvas._ctx.canvas.width, canvas._ctx.canvas.height);\n            s._highlightedPoint = pidx;\n            plot.plugins.pieRenderer.highlightedSeriesIndex = sidx;\n            s.renderer.drawSlice.call(s, canvas._ctx, s._sliceAngles[pidx][0], s._sliceAngles[pidx][1], s.highlightColorGenerator.get(pidx), false);\n        }\n    }\n    \n    function unhighlight (plot) {\n        var canvas = plot.plugins.pieRenderer.highlightCanvas;\n        canvas._ctx.clearRect(0,0, canvas._ctx.canvas.width, canvas._ctx.canvas.height);\n        for (var i=0; i<plot.series.length; i++) {\n            plot.series[i]._highlightedPoint = null;\n        }\n        plot.plugins.pieRenderer.highlightedSeriesIndex = null;\n        plot.target.trigger('jqplotDataUnhighlight');\n    }\n \n    function handleMove(ev, gridpos, datapos, neighbor, plot) {\n        if (neighbor) {\n            var ins = [neighbor.seriesIndex, neighbor.pointIndex, neighbor.data];\n            var evt1 = jQuery.Event('jqplotDataMouseOver');\n            evt1.pageX = ev.pageX;\n            evt1.pageY = ev.pageY;\n            plot.target.trigger(evt1, ins);\n            if (plot.series[ins[0]].highlightMouseOver && !(ins[0] == plot.plugins.pieRenderer.highlightedSeriesIndex && ins[1] == plot.series[ins[0]]._highlightedPoint)) {\n                var evt = jQuery.Event('jqplotDataHighlight');\n                evt.which = ev.which;\n                evt.pageX = ev.pageX;\n                evt.pageY = ev.pageY;\n                plot.target.trigger(evt, ins);\n                highlight (plot, ins[0], ins[1]);\n            }\n        }\n        else if (neighbor == null) {\n            unhighlight (plot);\n        }\n    } \n    \n    function handleMouseDown(ev, gridpos, datapos, neighbor, plot) {\n        if (neighbor) {\n            var ins = [neighbor.seriesIndex, neighbor.pointIndex, neighbor.data];\n            if (plot.series[ins[0]].highlightMouseDown && !(ins[0] == plot.plugins.pieRenderer.highlightedSeriesIndex && ins[1] == plot.series[ins[0]]._highlightedPoint)) {\n                var evt = jQuery.Event('jqplotDataHighlight');\n                evt.which = ev.which;\n                evt.pageX = ev.pageX;\n                evt.pageY = ev.pageY;\n                plot.target.trigger(evt, ins);\n                highlight (plot, ins[0], ins[1]);\n            }\n        }\n        else if (neighbor == null) {\n            unhighlight (plot);\n        }\n    }\n    \n    function handleMouseUp(ev, gridpos, datapos, neighbor, plot) {\n        var idx = plot.plugins.pieRenderer.highlightedSeriesIndex;\n        if (idx != null && plot.series[idx].highlightMouseDown) {\n            unhighlight(plot);\n        }\n    }\n    \n    function handleClick(ev, gridpos, datapos, neighbor, plot) {\n        if (neighbor) {\n            var ins = [neighbor.seriesIndex, neighbor.pointIndex, neighbor.data];\n            var evt = jQuery.Event('jqplotDataClick');\n            evt.which = ev.which;\n            evt.pageX = ev.pageX;\n            evt.pageY = ev.pageY;\n            plot.target.trigger(evt, ins);\n        }\n    }\n    \n    function handleRightClick(ev, gridpos, datapos, neighbor, plot) {\n        if (neighbor) {\n            var ins = [neighbor.seriesIndex, neighbor.pointIndex, neighbor.data];\n            var idx = plot.plugins.pieRenderer.highlightedSeriesIndex;\n            if (idx != null && plot.series[idx].highlightMouseDown) {\n                unhighlight(plot);\n            }\n            var evt = jQuery.Event('jqplotDataRightClick');\n            evt.which = ev.which;\n            evt.pageX = ev.pageX;\n            evt.pageY = ev.pageY;\n            plot.target.trigger(evt, ins);\n        }\n    }    \n    \n    // called within context of plot\n    // create a canvas which we can draw on.\n    // insert it before the eventCanvas, so eventCanvas will still capture events.\n    function postPlotDraw() {\n        // Memory Leaks patch    \n        if (this.plugins.pieRenderer && this.plugins.pieRenderer.highlightCanvas) {\n            this.plugins.pieRenderer.highlightCanvas.resetCanvas();\n            this.plugins.pieRenderer.highlightCanvas = null;\n        }\n\n        this.plugins.pieRenderer = {highlightedSeriesIndex:null};\n        this.plugins.pieRenderer.highlightCanvas = new $.jqplot.GenericCanvas();\n        \n        // do we have any data labels?  if so, put highlight canvas before those\n        var labels = $(this.targetId+' .jqplot-data-label');\n        if (labels.length) {\n            $(labels[0]).before(this.plugins.pieRenderer.highlightCanvas.createElement(this._gridPadding, 'jqplot-pieRenderer-highlight-canvas', this._plotDimensions, this));\n        }\n        // else put highlight canvas before event canvas.\n        else {\n            this.eventCanvas._elem.before(this.plugins.pieRenderer.highlightCanvas.createElement(this._gridPadding, 'jqplot-pieRenderer-highlight-canvas', this._plotDimensions, this));\n        }\n        \n        var hctx = this.plugins.pieRenderer.highlightCanvas.setContext();\n        this.eventCanvas._elem.bind('mouseleave', {plot:this}, function (ev) { unhighlight(ev.data.plot); });\n    }\n    \n    $.jqplot.preInitHooks.push(preInit);\n    \n    $.jqplot.PieTickRenderer = function() {\n        $.jqplot.AxisTickRenderer.call(this);\n    };\n    \n    $.jqplot.PieTickRenderer.prototype = new $.jqplot.AxisTickRenderer();\n    $.jqplot.PieTickRenderer.prototype.constructor = $.jqplot.PieTickRenderer;\n    \n})(jQuery);\n    \n    "
  },
  {
    "path": "stenogotchi/ui/web/static/js/plugins/jqplot.pointLabels.js",
    "content": "/**\n * jqPlot\n * Pure JavaScript plotting plugin using jQuery\n *\n * Version: 1.0.9\n * Revision: d96a669\n *\n * Copyright (c) 2009-2016 Chris Leonello\n * jqPlot is currently available for use in all personal or commercial projects \n * under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL \n * version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can \n * choose the license that best suits your project and use it accordingly. \n *\n * Although not required, the author would appreciate an email letting him \n * know of any substantial use of jqPlot.  You can reach the author at: \n * chris at jqplot dot com or see http://www.jqplot.com/info.php .\n *\n * If you are feeling kind and generous, consider supporting the project by\n * making a donation at: http://www.jqplot.com/donate.php .\n *\n * sprintf functions contained in jqplot.sprintf.js by Ash Searle:\n *\n *     version 2007.04.27\n *     author Ash Searle\n *     http://hexmen.com/blog/2007/03/printf-sprintf/\n *     http://hexmen.com/js/sprintf.js\n *     The author (Ash Searle) has placed this code in the public domain:\n *     \"This code is unrestricted: you are free to use it however you like.\"\n * \n */\n(function($) {\n    \n    /**\n     * Class: $.jqplot.PointLabels\n     * Plugin for putting labels at the data points.\n     * \n     * To use this plugin, include the js\n     * file in your source:\n     * \n     * > <script type=\"text/javascript\" src=\"plugins/jqplot.pointLabels.js\"></script>\n     * \n     * By default, the last value in the data ponit array in the data series is used\n     * for the label.  For most series renderers, extra data can be added to the \n     * data point arrays and the last value will be used as the label.\n     * \n     * For instance, \n     * this series:\n     * \n     * > [[1,4], [3,5], [7,2]]\n     * \n     * Would, by default, use the y values in the labels.\n     * Extra data can be added to the series like so:\n     * \n     * > [[1,4,'mid'], [3 5,'hi'], [7,2,'low']]\n     * \n     * And now the point labels would be 'mid', 'low', and 'hi'.\n     * \n     * Options to the point labels and a custom labels array can be passed into the\n     * \"pointLabels\" option on the series option like so:\n     * \n     * > series:[{pointLabels:{\n     * >    labels:['mid', 'hi', 'low'],\n     * >    location:'se',\n     * >    ypadding: 12\n     * >    }\n     * > }]\n     * \n     * A custom labels array in the options takes precendence over any labels\n     * in the series data.  If you have a custom labels array in the options,\n     * but still want to use values from the series array as labels, set the\n     * \"labelsFromSeries\" option to true.\n     * \n     * By default, html entities (<, >, etc.) are escaped in point labels.  \n     * If you want to include actual html markup in the labels, \n     * set the \"escapeHTML\" option to false.\n     * \n     */\n    $.jqplot.PointLabels = function(options) {\n        // Group: Properties\n        //\n        // prop: show\n        // show the labels or not.\n        this.show = $.jqplot.config.enablePlugins;\n        // prop: location\n        // compass location where to position the label around the point.\n        // 'n', 'ne', 'e', 'se', 's', 'sw', 'w', 'nw'\n        this.location = 'n';\n        // prop: labelsFromSeries\n        // true to use labels within data point arrays.\n        this.labelsFromSeries = false;\n        // prop: seriesLabelIndex\n        // array index for location of labels within data point arrays.\n        // if null, will use the last element of the data point array.\n        this.seriesLabelIndex = null;\n        // prop: labels\n        // array of arrays of labels, one array for each series.\n        this.labels = [];\n        // actual labels that will get displayed.\n        // needed to preserve user specified labels in labels array.\n        this._labels = [];\n        // prop: stackedValue\n        // true to display value as stacked in a stacked plot.\n        // no effect if labels is specified.\n        this.stackedValue = false;\n        // prop: ypadding\n        // vertical padding in pixels between point and label\n        this.ypadding = 6;\n        // prop: xpadding\n        // horizontal padding in pixels between point and label\n        this.xpadding = 6;\n        // prop: escapeHTML\n        // true to escape html entities in the labels.\n        // If you want to include markup in the labels, set to false.\n        this.escapeHTML = true;\n        // prop: edgeTolerance\n        // Number of pixels that the label must be away from an axis\n        // boundary in order to be drawn.  Negative values will allow overlap\n        // with the grid boundaries.\n        this.edgeTolerance = -5;\n        // prop: formatter\n        // A class of a formatter for the tick text.  sprintf by default.\n        this.formatter = $.jqplot.DefaultTickFormatter;\n        // prop: formatString\n        // string passed to the formatter.\n        this.formatString = '';\n        // prop: hideZeros\n        // true to not show a label for a value which is 0.\n        this.hideZeros = false;\n        this._elems = [];\n        \n        $.extend(true, this, options);\n    };\n    \n    var locations = ['nw', 'n', 'ne', 'e', 'se', 's', 'sw', 'w'];\n    var locationIndicies = {'nw':0, 'n':1, 'ne':2, 'e':3, 'se':4, 's':5, 'sw':6, 'w':7};\n    var oppositeLocations = ['se', 's', 'sw', 'w', 'nw', 'n', 'ne', 'e'];\n    \n    // called with scope of a series\n    $.jqplot.PointLabels.init = function (target, data, seriesDefaults, opts, plot){\n        var options = $.extend(true, {}, seriesDefaults, opts);\n        options.pointLabels = options.pointLabels || {};\n        if (this.renderer.constructor === $.jqplot.BarRenderer && this.barDirection === 'horizontal' && !options.pointLabels.location) {\n            options.pointLabels.location = 'e';\n        }\n        // add a pointLabels attribute to the series plugins\n        this.plugins.pointLabels = new $.jqplot.PointLabels(options.pointLabels);\n        this.plugins.pointLabels.setLabels.call(this);\n    };\n    \n    // called with scope of series\n    $.jqplot.PointLabels.prototype.setLabels = function() {   \n        var p = this.plugins.pointLabels; \n        var labelIdx;\n        if (p.seriesLabelIndex != null) {\n            labelIdx = p.seriesLabelIndex;\n        }\n        else if (this.renderer.constructor === $.jqplot.BarRenderer && this.barDirection === 'horizontal') {\n           labelIdx = (this._plotData[0].length < 3) ? 0 : this._plotData[0].length -1;\n        }\n        else {\n            labelIdx = (this._plotData.length === 0) ? 0 : this._plotData[0].length -1;\n        }\n        p._labels = [];\n        if (p.labels.length === 0 || p.labelsFromSeries) {    \n            if (p.stackedValue) {\n                if (this._plotData.length && this._plotData[0].length){\n                    // var idx = p.seriesLabelIndex || this._plotData[0].length -1;\n                    for (var i=0; i<this._plotData.length; i++) {\n                        p._labels.push(this._plotData[i][labelIdx]);\n                    }\n                }\n            }\n            else {\n                // var d = this._plotData;\n                var d = this.data;\n                if (this.renderer.constructor === $.jqplot.BarRenderer && this.waterfall) {\n                    d = this._data;\n                }\n                if (d.length && d[0].length) {\n                    // var idx = p.seriesLabelIndex || d[0].length -1;\n                    for (var i=0; i<d.length; i++) {\n                        p._labels.push(d[i][labelIdx]);\n                    }\n                }\n                d = null;\n            }\n        }\n        else if (p.labels.length){\n            p._labels = p.labels;\n        }\n    };\n    \n    $.jqplot.PointLabels.prototype.xOffset = function(elem, location, padding) {\n        location = location || this.location;\n        padding = padding || this.xpadding;\n        var offset;\n        \n        switch (location) {\n            case 'nw':\n                offset = -elem.outerWidth(true) - this.xpadding;\n                break;\n            case 'n':\n                offset = -elem.outerWidth(true)/2;\n                break;\n            case 'ne':\n                offset =  this.xpadding;\n                break;\n            case 'e':\n                offset = this.xpadding;\n                break;\n            case 'se':\n                offset = this.xpadding;\n                break;\n            case 's':\n                offset = -elem.outerWidth(true)/2;\n                break;\n            case 'sw':\n                offset = -elem.outerWidth(true) - this.xpadding;\n                break;\n            case 'w':\n                offset = -elem.outerWidth(true) - this.xpadding;\n                break;\n            default: // same as 'nw'\n                offset = -elem.outerWidth(true) - this.xpadding;\n                break;\n        }\n        return offset; \n    };\n    \n    $.jqplot.PointLabels.prototype.yOffset = function(elem, location, padding) {\n        location = location || this.location;\n        padding = padding || this.xpadding;\n        var offset;\n        \n        switch (location) {\n            case 'nw':\n                offset = -elem.outerHeight(true) - this.ypadding;\n                break;\n            case 'n':\n                offset = -elem.outerHeight(true) - this.ypadding;\n                break;\n            case 'ne':\n                offset = -elem.outerHeight(true) - this.ypadding;\n                break;\n            case 'e':\n                offset = -elem.outerHeight(true)/2;\n                break;\n            case 'se':\n                offset = this.ypadding;\n                break;\n            case 's':\n                offset = this.ypadding;\n                break;\n            case 'sw':\n                offset = this.ypadding;\n                break;\n            case 'w':\n                offset = -elem.outerHeight(true)/2;\n                break;\n            default: // same as 'nw'\n                offset = -elem.outerHeight(true) - this.ypadding;\n                break;\n        }\n        return offset; \n    };\n    \n    // called with scope of series\n    $.jqplot.PointLabels.draw = function (sctx, options, plot) {\n        var p = this.plugins.pointLabels;\n        // set labels again in case they have changed.\n        p.setLabels.call(this);\n        // remove any previous labels\n        for (var i=0; i<p._elems.length; i++) {\n            // Memory Leaks patch\n            // p._elems[i].remove();\n            if(p._elems[i]) {\n                p._elems[i].emptyForce();\n            }\n        }\n        p._elems.splice(0, p._elems.length);\n\n        if (p.show) {\n            var ax = '_'+this._stackAxis+'axis';\n        \n            if (!p.formatString) {\n                p.formatString = this[ax]._ticks[0].formatString;\n                p.formatter = this[ax]._ticks[0].formatter;\n            }\n        \n            var pd = this._plotData;\n            var ppd = this._prevPlotData;\n            var xax = this._xaxis;\n            var yax = this._yaxis;\n            var elem, helem;\n\n            for (var i=0, l=p._labels.length; i < l; i++) {\n                var label = p._labels[i];\n                \n                if (label == null || (p.hideZeros && parseFloat(label) == 0)) {\n                    continue;\n                }\n                \n                label = p.formatter(p.formatString, label);\n\n                helem = document.createElement('div');\n                p._elems[i] = $(helem);\n\n                elem = p._elems[i];\n\n\n                elem.addClass('jqplot-point-label jqplot-series-'+this.index+' jqplot-point-'+i);\n                elem.css('position', 'absolute');\n                elem.insertAfter(sctx.canvas);\n\n                if (p.escapeHTML) {\n                    elem.text(label);\n                }\n                else {\n                    elem.html(label);\n                }\n                var location = p.location;\n                if ((this.fillToZero && pd[i][1] < 0) || (this.fillToZero && this._type === 'bar' && this.barDirection === 'horizontal' && pd[i][0] < 0) || (this.waterfall && parseInt(label, 10)) < 0) {\n                    location = oppositeLocations[locationIndicies[location]];\n                }\n\n\n                var ell = xax.u2p(pd[i][0]) + p.xOffset(elem, location);\n                var elt = yax.u2p(pd[i][1]) + p.yOffset(elem, location);\n\n                // we have stacked chart but are not showing stacked values,\n                // place labels in center.\n                if (this._stack && !p.stackedValue) {\n                    if (this.barDirection === \"vertical\") {\n                        elt = (this._barPoints[i][0][1] + this._barPoints[i][1][1]) / 2 + plot._gridPadding.top - 0.5 * elem.outerHeight(true);\n                    }\n                    else {\n                        ell = (this._barPoints[i][2][0] + this._barPoints[i][0][0]) / 2 + plot._gridPadding.left - 0.5 * elem.outerWidth(true);\n                    }\n                }\n\n                if (this.renderer.constructor == $.jqplot.BarRenderer) {\n                    if (this.barDirection == \"vertical\") {\n                        ell += this._barNudge;\n                    }\n                    else {\n                        elt -= this._barNudge;\n                    }\n                }\n                elem.css('left', ell);\n                elem.css('top', elt);\n                var elr = ell + elem.width();\n                var elb = elt + elem.height();\n                var et = p.edgeTolerance;\n                var scl = $(sctx.canvas).position().left;\n                var sct = $(sctx.canvas).position().top;\n                var scr = sctx.canvas.width + scl;\n                var scb = sctx.canvas.height + sct;\n                // if label is outside of allowed area, remove it\n                if (ell - et < scl || elt - et < sct || elr + et > scr || elb + et > scb) {\n                    elem.remove();\n                }\n\n                elem = null;\n                helem = null;\n            }\n\n            // finally, animate them if the series is animated\n            // if (this.renderer.animation && this.renderer.animation._supported && this.renderer.animation.show && plot._drawCount < 2) {\n            //     var sel = '.jqplot-point-label.jqplot-series-'+this.index;\n            //     $(sel).hide();\n            //     $(sel).fadeIn(1000);\n            // }\n\n        }\n    };\n    \n    $.jqplot.postSeriesInitHooks.push($.jqplot.PointLabels.init);\n    $.jqplot.postDrawSeriesHooks.push($.jqplot.PointLabels.draw);\n})(jQuery);\n"
  },
  {
    "path": "stenogotchi/ui/web/static/js/plugins/jqplot.pyramidAxisRenderer.js",
    "content": "/**\n * jqPlot\n * Pure JavaScript plotting plugin using jQuery\n *\n * Version: 1.0.9\n * Revision: d96a669\n *\n * Copyright (c) 2009-2016 Chris Leonello\n * jqPlot is currently available for use in all personal or commercial projects \n * under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL \n * version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can \n * choose the license that best suits your project and use it accordingly. \n *\n * Although not required, the author would appreciate an email letting him \n * know of any substantial use of jqPlot.  You can reach the author at: \n * chris at jqplot dot com or see http://www.jqplot.com/info.php .\n *\n * If you are feeling kind and generous, consider supporting the project by\n * making a donation at: http://www.jqplot.com/donate.php .\n *\n * sprintf functions contained in jqplot.sprintf.js by Ash Searle:\n *\n *     version 2007.04.27\n *     author Ash Searle\n *     http://hexmen.com/blog/2007/03/printf-sprintf/\n *     http://hexmen.com/js/sprintf.js\n *     The author (Ash Searle) has placed this code in the public domain:\n *     \"This code is unrestricted: you are free to use it however you like.\"\n * \n */\n(function($) {\n    $.jqplot.PyramidAxisRenderer = function() {\n        $.jqplot.LinearAxisRenderer.call(this);\n    };\n    \n    $.jqplot.PyramidAxisRenderer.prototype = new $.jqplot.LinearAxisRenderer();\n    $.jqplot.PyramidAxisRenderer.prototype.constructor = $.jqplot.PyramidAxisRenderer;\n        \n    // called with scope of axis\n    $.jqplot.PyramidAxisRenderer.prototype.init = function(options){\n        // Group: Properties\n        //\n        // prop: position\n        // Position of axis.  Values are: top, bottom , left, center, right.\n        // By default, x and x2 axes are bottom, y axis is center.\n        this.position = null;\n        // prop: drawBaseline\n        // True to draw the axis baseline.\n        this.drawBaseline = true;\n        // prop: baselineWidth\n        // width of the baseline in pixels.\n        this.baselineWidth = null;\n        // prop: baselineColor\n        // CSS color spec for the baseline.\n        this.baselineColor = null;\n        this.tickSpacingFactor = 25;\n        this._type = 'pyramid';\n        this._splitAxis = false;\n        this._splitLength = null;\n        this.category = false;\n        this._autoFormatString = '';\n        this._overrideFormatString = false;\n        \n        $.extend(true, this, options);\n        this.renderer.options = options;\n\n        this.resetDataBounds = this.renderer.resetDataBounds;\n        this.resetDataBounds();\n\n    };\n\n    $.jqplot.PyramidAxisRenderer.prototype.resetDataBounds = function() {\n        // Go through all the series attached to this axis and find\n        // the min/max bounds for this axis.\n        var db = this._dataBounds;\n        db.min = null;\n        db.max = null;\n        var temp;\n        for (var i=0; i<this._series.length; i++) {\n            var s = this._series[i];\n            var d = s._plotData;\n            \n            for (var j=0, l=d.length; j<l; j++) { \n                if (this.name.charAt(0) === 'x') {\n                    temp = d[j][1];\n                    if ((temp !== null && temp < db.min) || db.min === null) {\n                        db.min = temp;\n                    }\n                    if ((temp !== null && temp > db.max) || db.max === null) {\n                        db.max = temp;\n                    }\n                }              \n                else {\n                    temp = d[j][0];\n                    if ((temp !== null && temp < db.min) || db.min === null) {\n                        db.min = temp;\n                    }\n                    if ((temp !== null && temp > db.max) || db.max === null) {\n                        db.max = temp;\n                    }\n                }              \n            }\n        }\n    };\n    \n    // called with scope of axis\n    $.jqplot.PyramidAxisRenderer.prototype.draw = function(ctx, plot) {\n        if (this.show) {\n            // populate the axis label and value properties.\n            // createTicks is a method on the renderer, but\n            // call it within the scope of the axis.\n            this.renderer.createTicks.call(this, plot);\n            // fill a div with axes labels in the right direction.\n            // Need to pregenerate each axis to get its bounds and\n            // position it and the labels correctly on the plot.\n            var dim=0;\n            var temp;\n            // Added for theming.\n            if (this._elem) {\n                // Memory Leaks patch\n                //this._elem.empty();\n                this._elem.emptyForce();\n                this._elem = null;\n            }\n            \n            this._elem = $(document.createElement('div'));\n            this._elem.addClass('jqplot-axis jqplot-'+this.name);\n            this._elem.css('position', 'absolute');\n\n            \n            if (this.name == 'xaxis' || this.name == 'x2axis') {\n                this._elem.width(this._plotDimensions.width);\n            }\n            else {\n                this._elem.height(this._plotDimensions.height);\n            }\n            \n            // create a _label object.\n            this.labelOptions.axis = this.name;\n            this._label = new this.labelRenderer(this.labelOptions);\n            if (this._label.show) {\n                var elem = this._label.draw(ctx, plot);\n                elem.appendTo(this._elem);\n                elem = null;\n            }\n    \n            var t = this._ticks;\n            var tick;\n            for (var i=0; i<t.length; i++) {\n                tick = t[i];\n                if (tick.show && tick.showLabel && (!tick.isMinorTick)) {\n                    this._elem.append(tick.draw(ctx, plot));\n                }\n            }\n            tick = null;\n            t = null;\n        }\n        return this._elem;\n    };   \n\n    // Note, primes can be found on http://primes.utm.edu/\n    var _primes = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, 317, 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, 419, 421, 431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503, 509, 521, 523, 541, 547, 557, 563, 569, 571, 577, 587, 593, 599, 601, 607, 613, 617, 619, 631, 641, 643, 647, 653, 659, 661, 673, 677, 683, 691, 701, 709, 719, 727, 733, 739, 743, 751, 757, 761, 769, 773, 787, 797, 809, 811, 821, 823, 827, 829, 839, 853, 857, 859, 863, 877, 881, 883, 887, 907, 911, 919, 929, 937, 941, 947, 953, 967, 971, 977, 983, 991, 997];\n\n\n    var _primesHash = {};\n\n    for (var i =0, l = _primes.length; i < l; i++) {\n        _primesHash[_primes[i]] = _primes[i];\n    }\n\n    // called with scope of axis\n    $.jqplot.PyramidAxisRenderer.prototype.createTicks = function(plot) {\n        // we're are operating on an axis here\n        var userTicks = this.ticks;\n        // databounds were set on axis initialization.\n        var db = this._dataBounds;\n        var dim;\n        var interval;\n        var min;\n        var max;\n        var range;\n        var pos1;\n        var pos2;\n        var tt;\n        var i;\n        var l;\n        var s;\n        // get a copy of user's settings for min/max.\n        var userMin = this.min;\n        var userMax = this.max;\n        var ut;\n        var t;\n        var threshold;\n        var tdim;\n        var scalefact;\n        var ret;\n        var tumin;\n        var tumax;\n        var maxVisibleTicks;\n        var val;\n        var skip = null;\n        var temp;\n        \n        // if we already have ticks, use them.\n        // ticks must be in order of increasing value.\n\n        if (userTicks.length) {\n            // ticks could be 1D or 2D array of [val, val, ,,,] or [[val, label], [val, label], ...] or mixed\n            for (i=0, l=userTicks.length; i<l; i++){\n                ut = userTicks[i];\n                t = new this.tickRenderer(this.tickOptions);\n                if ($.isArray(ut)) {\n                    t.value = ut[0];\n                    t.label = ut[1];\n                    t.setTick(ut[0], this.name);\n                    this._ticks.push(t);\n                }\n\n                else if ($.isPlainObject(ut)) {\n                    $.extend(true, t, ut);\n                    t.axis = this.name;\n                    this._ticks.push(t);\n                }\n                \n                else {\n                    if (typeof ut === 'string') {\n                        val = i + plot.defaultAxisStart;\n                    }\n                    else {\n                        val = ut;\n                    }\n                    t.value = val;\n                    t.label = ut;\n                    t.axis = this.name;\n                    this._ticks.push(t);\n                }\n            }\n            this.numberTicks = userTicks.length;\n            this.min = this._ticks[0].value;\n            this.max = this._ticks[this.numberTicks-1].value;\n            this.tickInterval = (this.max - this.min) / (this.numberTicks - 1);\n\n            // use user specified tickInterval if there is one\n            if (this._options.tickInterval) {\n                // hide every tick except for ticks on interval\n                var ti = this._options.tickInterval;\n                for (i=0; i<this.numberTicks; i++) {\n                    if (i%ti !== 0) {\n                        // this._ticks[i].show = false;\n                        this._ticks[i].isMinorTick = true;\n                    }\n                }\n            }\n\n            else {\n                // check if we have too many ticks\n                dim = (this.name.charAt(0) === 'x') ? this._plotDimensions.width : this._plotDimensions.height;\n                maxVisibleTicks = Math.round(2.0 + dim/this.tickSpacingFactor);\n\n                if (this.numberTicks > maxVisibleTicks) {\n                    // check for number of ticks we can skip\n                    temp = this.numberTicks - 1;\n                    for (i=2; i<temp; i++) {\n                        if (temp % i === 0 && temp/i < maxVisibleTicks) {\n                            skip = i-1;\n                            break;\n                        }\n                    }\n\n                    if (skip !== null) {\n                        var count = 1;\n                        for (i=1, l=this._ticks.length; i<l; i++) {\n                            if (count <= skip) {\n                                this._ticks[i].show = false;\n                                count += 1;\n                            }\n                            else {\n                                count = 1;\n                            }\n                        }\n                    }\n                }\n            }\n\n            // if category style, add minor ticks in between\n            temp = [];\n            if (this.category) {\n                // turn off gridline and mark on first tick\n                this._ticks[0].showGridline = false;\n                this._ticks[0].showMark = false;\n\n                for (i=this._ticks.length-1; i>0; i--) {\n                    t = new this.tickRenderer(this.tickOptions);\n                    t.value = this._ticks[i-1].value + this.tickInterval/2.0;\n                    t.label = '';\n                    t.showLabel = false;\n                    t.axis = this.name;\n                    this._ticks[i].showGridline = false;\n                    this._ticks[i].showMark = false;\n                    this._ticks.splice(i, 0, t);\n                    // temp.push(t);\n                }\n\n                // merge in the new ticks\n                // for (i=1, l=temp.length; i<l; i++) {\n                //     this._ticks.splice(i, 0, temp[i]);\n                // }\n\n                // now add a tick at beginning and end\n                t = new this.tickRenderer(this.tickOptions);\n                t.value = this._ticks[0].value - this.tickInterval/2.0;\n                t.label = '';\n                t.showLabel = false;\n                t.axis = this.name;\n                this._ticks.unshift(t);\n\n                t = new this.tickRenderer(this.tickOptions);\n                t.value = this._ticks[this._ticks.length-1].value + this.tickInterval/2.0;\n                t.label = '';\n                t.showLabel = false;\n                t.axis = this.name;\n                this._ticks.push(t);\n\n                this.tickInterval = this.tickInterval / 2.0;\n                this.numberTicks = this._ticks.length;\n                this.min = this._ticks[0].value;\n                this.max = this._ticks[this._ticks.length-1].value;\n            }\n        }\n\n        // we don't have any ticks yet, let's make some!\n        else {\n            if (this.name.charAt(0) === 'x') {\n                dim = this._plotDimensions.width;\n                // make sure x axis is symetric about 0.\n                var tempmax = Math.max(db.max, Math.abs(db.min));\n                var tempmin = Math.min(db.min, -tempmax);\n                // min = ((this.min != null) ? this.min : tempmin);\n                // max = ((this.max != null) ? this.max : tempmax);\n                min = tempmin;\n                max = tempmax;\n                range = max - min;\n\n                if (this.tickOptions == null || !this.tickOptions.formatString) {\n                    this._overrideFormatString = true;\n                }\n\n                threshold = 30;\n                tdim = Math.max(dim, threshold+1);\n                scalefact =  (tdim-threshold)/300.0;\n                ret = $.jqplot.LinearTickGenerator(min, max, scalefact); \n                // calculate a padded max and min, points should be less than these\n                // so that they aren't too close to the edges of the plot.\n                // User can adjust how much padding is allowed with pad, padMin and PadMax options. \n                tumin = min + range*(this.padMin - 1);\n                tumax = max - range*(this.padMax - 1);\n\n                if (min < tumin || max > tumax) {\n                    tumin = min - range*(this.padMin - 1);\n                    tumax = max + range*(this.padMax - 1);\n                    ret = $.jqplot.LinearTickGenerator(tumin, tumax, scalefact);\n                }\n\n                this.min = ret[0];\n                this.max = ret[1];\n                this.numberTicks = ret[2];\n                this._autoFormatString = ret[3];\n                this.tickInterval = ret[4];\n            }\n            else {\n                dim = this._plotDimensions.height;\n\n                // ticks will be on whole integers like 1, 2, 3, ... or 1, 4, 7, ...\n                min = db.min;\n                max = db.max;\n                s = this._series[0];\n                this._ticks = [];\n\n                range = max - min;\n\n                // if range is a prime, will get only 2 ticks, expand range in that case.\n                if (_primesHash[range]) {\n                    range += 1;\n                    max += 1;\n                }\n\n                this.max = max;\n                this.min = min;\n                \n                maxVisibleTicks = Math.round(2.0 + dim/this.tickSpacingFactor);\n\n                if (range + 1 <= maxVisibleTicks) {\n                    this.numberTicks = range + 1;\n                    this.tickInterval = 1.0;\n                }\n\n                else {\n                    // figure out a round number of ticks to skip in every interval\n                    // range / ti + 1 = nt\n                    // ti = range / (nt - 1)\n                    for (var i=maxVisibleTicks; i>1; i--) {\n                        if (range/(i - 1) === Math.round(range/(i - 1))) {\n                            this.numberTicks = i;\n                            this.tickInterval = range/(i - 1);\n                            break;\n                        }\n                        \n                    }\n                }\n            }\n            \n            if (this._overrideFormatString && this._autoFormatString != '') {\n                this.tickOptions = this.tickOptions || {};\n                this.tickOptions.formatString = this._autoFormatString;\n            }\n\n            var labelval;\n            for (i=0; i<this.numberTicks; i++) {\n                this.tickOptions.axis = this.name;\n                labelval = this.min + this.tickInterval * i;\n                if (this.name.charAt(0) === 'x') {\n                    labelval = Math.abs(labelval);\n                }\n                // this.tickOptions.label = String (labelval);\n                this.tickOptions.value = this.min + this.tickInterval * i;\n                t = new this.tickRenderer(this.tickOptions);\n\n                t.label = t.prefix + t.formatter(t.formatString, labelval);\n\n                this._ticks.push(t);\n                // for x axis, if y axis is in middle, add a symetrical 0 tick\n                if (this.name.charAt(0) === 'x' && plot.axes.yMidAxis.show && this.tickOptions.value === 0) {\n                    this._splitAxis = true;\n                    this._splitLength = plot.axes.yMidAxis.getWidth();\n                    // t.value = -this.max/2000.0;\n                    t = new this.tickRenderer(this.tickOptions);\n                    this._ticks.push(t);\n                    t.value = this.max/2000.0;\n                }\n            }\n            t = null;\n        }\n    };\n    \n    // called with scope of axis\n    $.jqplot.PyramidAxisRenderer.prototype.set = function() { \n        var dim = 0;\n        var temp;\n        var w = 0;\n        var h = 0;\n        var i;\n        var t;\n        var tick;\n        var lshow = (this._label == null) ? false : this._label.show;\n        if (this.show) {\n            t = this._ticks;\n            l = t.length;\n            for (i=0; i<l; i++) {\n                tick = t[i];\n                if (!tick._breakTick && tick.show && tick.showLabel && !tick.isMinorTick) {\n                    if (this.name.charAt(0) === 'x') {\n                        temp = tick._elem.outerHeight(true);\n                    }\n                    else {\n                        temp = tick._elem.outerWidth(true);\n                    }\n                    if (temp > dim) {\n                        dim = temp;\n                    }\n                }\n            }\n\n            if (this.name === 'yMidAxis') {\n                for (i=0; i<l; i++) {\n                    tick = t[i];\n                    if (tick._elem) {\n                        temp = (dim - tick._elem.outerWidth(true))/2.0;\n                        tick._elem.css('left', temp);\n                    }\n                }\n            }\n            tick = null;\n            t = null;\n            \n            if (lshow) {\n                w = this._label._elem.outerWidth(true);\n                h = this._label._elem.outerHeight(true); \n            }\n            if (this.name === 'xaxis') {\n                dim = dim + h;\n                this._elem.css({'height':dim+'px', left:'0px', bottom:'0px'});\n            }\n            else if (this.name === 'x2axis') {\n                dim = dim + h;\n                this._elem.css({'height':dim+'px', left:'0px', top:'0px'});\n            }\n            else if (this.name === 'yaxis') {\n                dim = dim + w;\n                this._elem.css({'width':dim+'px', left:'0px', top:'0px'});\n                if (lshow && this._label.constructor == $.jqplot.AxisLabelRenderer) {\n                    this._label._elem.css('width', w+'px');\n                }\n            }\n            else if (this.name === 'yMidAxis') {\n                // don't include width of label at all in width of axis?\n                // dim = (dim > w) ? dim : w;\n                var temp = dim/2.0 - w/2.0;\n                this._elem.css({'width':dim+'px', top:'0px'});\n                if (lshow && this._label.constructor == $.jqplot.AxisLabelRenderer) {\n                    this._label._elem.css({width: w, left: temp, top: 0});\n                }\n            }\n            else {\n                dim = dim + w;\n                this._elem.css({'width':dim+'px', right:'0px', top:'0px'});\n                if (lshow && this._label.constructor == $.jqplot.AxisLabelRenderer) {\n                    this._label._elem.css('width', w+'px');\n                }\n            }\n        }  \n    };\n    \n    $.jqplot.PyramidAxisRenderer.prototype.pack = function(pos, offsets) { \n        // Add defaults for repacking from resetTickValues function.\n        pos = pos || {};\n        offsets = offsets || this._offsets;\n        \n        var ticks = this._ticks;\n        var max = this.max;\n        var min = this.min;\n        var offmax = offsets.max;\n        var offmin = offsets.min;\n        var lshow = (this._label == null) ? false : this._label.show;\n        \n        for (var p in pos) {\n            this._elem.css(p, pos[p]);\n        }\n        \n        this._offsets = offsets;\n        // pixellength will be + for x axes and - for y axes becasue pixels always measured from top left.\n        var pixellength = offmax - offmin;\n        var unitlength = max - min;\n        var sl = this._splitLength;\n        \n        // point to unit and unit to point conversions references to Plot DOM element top left corner.\n        if (this._splitAxis) {\n            pixellength -= this._splitLength;\n            \n            // don't know that this one is correct.\n            this.p2u = function(p){\n                return (p - offmin) * unitlength / pixellength + min;\n            };\n        \n            this.u2p = function(u){\n                if (u <= 0) {\n                    return (u - min) * pixellength / unitlength + offmin;\n                }\n                else {\n                    return (u - min) * pixellength / unitlength + offmin + sl;\n                }\n            };\n                \n            this.series_u2p = function(u){\n                if (u <= 0) {\n                    return (u - min) * pixellength / unitlength;\n                }\n                else {\n                    return (u - min) * pixellength / unitlength + sl;\n                }\n            };\n\n            // don't know that this one is correct.\n            this.series_p2u = function(p){\n                return p * unitlength / pixellength + min;\n            };\n        }\n        else {\n            this.p2u = function(p){\n                return (p - offmin) * unitlength / pixellength + min;\n            };\n        \n            this.u2p = function(u){\n                return (u - min) * pixellength / unitlength + offmin;\n            };\n                \n            if (this.name.charAt(0) === 'x'){\n                this.series_u2p = function(u){\n                    return (u - min) * pixellength / unitlength;\n                };\n                this.series_p2u = function(p){\n                    return p * unitlength / pixellength + min;\n                };\n            }\n        \n            else {\n                this.series_u2p = function(u){\n                    return (u - max) * pixellength / unitlength;\n                };\n                this.series_p2u = function(p){\n                    return p * unitlength / pixellength + max;\n                };\n            }\n        }\n        \n        if (this.show) {\n            if (this.name.charAt(0) === 'x') {\n                for (var i=0; i<ticks.length; i++) {\n                    var t = ticks[i];\n                    if (t.show && t.showLabel) {\n                        var shim;\n                        \n                        if (t.constructor == $.jqplot.CanvasAxisTickRenderer && t.angle) {\n                            // will need to adjust auto positioning based on which axis this is.\n                            var temp = (this.name == 'xaxis') ? 1 : -1;\n                            switch (t.labelPosition) {\n                                case 'auto':\n                                    // position at end\n                                    if (temp * t.angle < 0) {\n                                        shim = -t.getWidth() + t._textRenderer.height * Math.sin(-t._textRenderer.angle) / 2;\n                                    }\n                                    // position at start\n                                    else {\n                                        shim = -t._textRenderer.height * Math.sin(t._textRenderer.angle) / 2;\n                                    }\n                                    break;\n                                case 'end':\n                                    shim = -t.getWidth() + t._textRenderer.height * Math.sin(-t._textRenderer.angle) / 2;\n                                    break;\n                                case 'start':\n                                    shim = -t._textRenderer.height * Math.sin(t._textRenderer.angle) / 2;\n                                    break;\n                                case 'middle':\n                                    shim = -t.getWidth()/2 + t._textRenderer.height * Math.sin(-t._textRenderer.angle) / 2;\n                                    break;\n                                default:\n                                    shim = -t.getWidth()/2 + t._textRenderer.height * Math.sin(-t._textRenderer.angle) / 2;\n                                    break;\n                            }\n                        }\n                        else {\n                            shim = -t.getWidth()/2;\n                        }\n                        var val = this.u2p(t.value) + shim + 'px';\n                        t._elem.css('left', val);\n                        t.pack();\n                    }\n                }\n                if (lshow) {\n                    var w = this._label._elem.outerWidth(true);\n                    this._label._elem.css('left', offmin + pixellength/2 - w/2 + 'px');\n                    if (this.name == 'xaxis') {\n                        this._label._elem.css('bottom', '0px');\n                    }\n                    else {\n                        this._label._elem.css('top', '0px');\n                    }\n                    this._label.pack();\n                }\n            }\n            else {\n                for (var i=0; i<ticks.length; i++) {\n                    var t = ticks[i];\n                    if (t.show && t.showLabel && !t.isMinorTick) {                        \n                        var shim;\n                        if (t.constructor == $.jqplot.CanvasAxisTickRenderer && t.angle) {\n                            // will need to adjust auto positioning based on which axis this is.\n                            var temp = (this.name == 'yaxis') ? 1 : -1;\n                            switch (t.labelPosition) {\n                                case 'auto':\n                                    // position at end\n                                case 'end':\n                                    if (temp * t.angle < 0) {\n                                        shim = -t._textRenderer.height * Math.cos(-t._textRenderer.angle) / 2;\n                                    }\n                                    else {\n                                        shim = -t.getHeight() + t._textRenderer.height * Math.cos(t._textRenderer.angle) / 2;\n                                    }\n                                    break;\n                                case 'start':\n                                    if (t.angle > 0) {\n                                        shim = -t._textRenderer.height * Math.cos(-t._textRenderer.angle) / 2;\n                                    }\n                                    else {\n                                        shim = -t.getHeight() + t._textRenderer.height * Math.cos(t._textRenderer.angle) / 2;\n                                    }\n                                    break;\n                                case 'middle':\n                                    // if (t.angle > 0) {\n                                    //     shim = -t.getHeight()/2 + t._textRenderer.height * Math.sin(-t._textRenderer.angle) / 2;\n                                    // }\n                                    // else {\n                                    //     shim = -t.getHeight()/2 - t._textRenderer.height * Math.sin(t._textRenderer.angle) / 2;\n                                    // }\n                                    shim = -t.getHeight()/2;\n                                    break;\n                                default:\n                                    shim = -t.getHeight()/2;\n                                    break;\n                            }\n                        }\n                        else {\n                            shim = -t.getHeight()/2;\n                        }\n                        \n                        var val = this.u2p(t.value) + shim + 'px';\n                        t._elem.css('top', val);\n                        t.pack();\n                    }\n                }\n                if (lshow) {\n                    var h = this._label._elem.outerHeight(true);\n                    if (this.name !== 'yMidAxis') {\n                        this._label._elem.css('top', offmax - pixellength/2 - h/2 + 'px');\n                    }\n                    if (this.name == 'yaxis') {\n                        this._label._elem.css('left', '0px');\n                    }\n                    else if (this.name !== 'yMidAxis') {\n                        this._label._elem.css('right', '0px');\n                    }   \n                    this._label.pack();\n                }\n            }\n        }\n\n        ticks = null;\n    };\n})(jQuery);\n"
  },
  {
    "path": "stenogotchi/ui/web/static/js/plugins/jqplot.pyramidGridRenderer.js",
    "content": "/**\n * jqPlot\n * Pure JavaScript plotting plugin using jQuery\n *\n * Version: 1.0.9\n * Revision: d96a669\n *\n * Copyright (c) 2009-2016 Chris Leonello\n * jqPlot is currently available for use in all personal or commercial projects \n * under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL \n * version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can \n * choose the license that best suits your project and use it accordingly. \n *\n * Although not required, the author would appreciate an email letting him \n * know of any substantial use of jqPlot.  You can reach the author at: \n * chris at jqplot dot com or see http://www.jqplot.com/info.php .\n *\n * If you are feeling kind and generous, consider supporting the project by\n * making a donation at: http://www.jqplot.com/donate.php .\n *\n * sprintf functions contained in jqplot.sprintf.js by Ash Searle:\n *\n *     version 2007.04.27\n *     author Ash Searle\n *     http://hexmen.com/blog/2007/03/printf-sprintf/\n *     http://hexmen.com/js/sprintf.js\n *     The author (Ash Searle) has placed this code in the public domain:\n *     \"This code is unrestricted: you are free to use it however you like.\"\n * \n */\n(function($) {     \n    // Class: $.jqplot.CanvasGridRenderer\n    // The default jqPlot grid renderer, creating a grid on a canvas element.\n    // The renderer has no additional options beyond the <Grid> class.\n    $.jqplot.PyramidGridRenderer = function(){\n        $.jqplot.CanvasGridRenderer.call(this);\n    };\n\n    $.jqplot.PyramidGridRenderer.prototype = new $.jqplot.CanvasGridRenderer();\n    $.jqplot.PyramidGridRenderer.prototype.constructor = $.jqplot.PyramidGridRenderer;\n    \n    // called with context of Grid object\n    $.jqplot.CanvasGridRenderer.prototype.init = function(options) {\n        this._ctx;\n        this.plotBands = {\n            show: false,\n            color: 'rgb(230, 219, 179)',\n            axis: 'y',\n            start: null,\n            interval: 10\n        };\n        $.extend(true, this, options);\n        // set the shadow renderer options\n        var sopts = {lineJoin:'miter', lineCap:'round', fill:false, isarc:false, angle:this.shadowAngle, offset:this.shadowOffset, alpha:this.shadowAlpha, depth:this.shadowDepth, lineWidth:this.shadowWidth, closePath:false, strokeStyle:this.shadowColor};\n        this.renderer.shadowRenderer.init(sopts);\n    };\n    \n    $.jqplot.PyramidGridRenderer.prototype.draw = function() {\n        this._ctx = this._elem.get(0).getContext(\"2d\");\n        var ctx = this._ctx;\n        var axes = this._axes;\n        var xp = axes.xaxis.u2p;\n        var yp = axes.yMidAxis.u2p;\n        var xnudge = axes.xaxis.max/1000.0;\n        var xp0 = xp(0);\n        var xpn = xp(xnudge);\n        var ax = ['xaxis', 'yaxis', 'x2axis', 'y2axis','yMidAxis'];\n        // Add the grid onto the grid canvas.  This is the bottom most layer.\n        ctx.save();\n        ctx.clearRect(0, 0, this._plotDimensions.width, this._plotDimensions.height);\n        ctx.fillStyle = this.backgroundColor || this.background;\n\n        ctx.fillRect(this._left, this._top, this._width, this._height);\n\n        if (this.plotBands.show) {\n            ctx.save();\n            var pb = this.plotBands;\n            ctx.fillStyle = pb.color;\n            var axis;\n            var x, y, w, h;\n            // find axis to work with\n            if (pb.axis.charAt(0) === 'x') {\n                if (axes.xaxis.show) {\n                    axis = axes.xaxis;\n                }\n            }\n            else if (pb.axis.charAt(0) === 'y') {\n                if (axes.yaxis.show) {\n                    axis = axes.yaxis;\n                }\n                else if (axes.y2axis.show) {\n                    axis = axes.y2axis;\n                }\n                else if (axes.yMidAxis.show) {\n                    axis = axes.yMidAxis;\n                }\n            }\n\n            if (axis !== undefined) {\n                // draw some rectangles\n                var start = pb.start;\n                if (start === null) {\n                    start = axis.min;\n                }\n                for (var i = start; i < axis.max; i += 2 * pb.interval) {\n                    if (axis.name.charAt(0) === 'y') {\n                        x = this._left;\n                        if ((i + pb.interval) < axis.max) {\n                            y = axis.series_u2p(i + pb.interval) + this._top;\n                        }\n                        else {\n                            y = axis.series_u2p(axis.max) + this._top;\n                        }\n                        w = this._right - this._left;\n                        h = axis.series_u2p(start) - axis.series_u2p(start + pb.interval);\n                        ctx.fillRect(x, y, w, h);\n                    }\n                    // else {\n                    //     y = 0;\n                    //     x = axis.series_u2p(i);\n                    //     h = this._height;\n                    //     w = axis.series_u2p(start + pb.interval) - axis.series_u2p(start);\n                    // }\n\n                }\n            }\n            ctx.restore();\n        }\n        \n        ctx.save();\n        ctx.lineJoin = 'miter';\n        ctx.lineCap = 'butt';\n        ctx.lineWidth = this.gridLineWidth;\n        ctx.strokeStyle = this.gridLineColor;\n        var b, e, s, m;\n        for (var i=5; i>0; i--) {\n            var name = ax[i-1];\n            var axis = axes[name];\n            var ticks = axis._ticks;\n            var numticks = ticks.length;\n            if (axis.show) {\n                if (axis.drawBaseline) {\n                    var bopts = {};\n                    if (axis.baselineWidth !== null) {\n                        bopts.lineWidth = axis.baselineWidth;\n                    }\n                    if (axis.baselineColor !== null) {\n                        bopts.strokeStyle = axis.baselineColor;\n                    }\n                    switch (name) {\n                        case 'xaxis':\n                            if (axes.yMidAxis.show) {\n                                drawLine (this._left, this._bottom, xp0, this._bottom, bopts);\n                                drawLine (xpn, this._bottom, this._right, this._bottom, bopts);\n                            }\n                            else {\n                                drawLine (this._left, this._bottom, this._right, this._bottom, bopts);\n                            }\n                            break;\n                        case 'yaxis':\n                            drawLine (this._left, this._bottom, this._left, this._top, bopts);\n                            break;\n                        case 'yMidAxis':               \n                            drawLine(xp0, this._bottom, xp0, this._top, bopts);\n                            drawLine(xpn, this._bottom, xpn, this._top, bopts);\n                            break;\n                        case 'x2axis':\n                            if (axes.yMidAxis.show) {\n                                drawLine (this._left, this._top, xp0, this._top, bopts);\n                                drawLine (xpn, this._top, this._right, this._top, bopts);\n                            }\n                            else {\n                                drawLine (this._left, this._bottom, this._right, this._bottom, bopts);\n                            }\n                            break;\n                        case 'y2axis':\n                            drawLine (this._right, this._bottom, this._right, this._top, bopts);\n                            break;\n\n                    }\n                }\n                for (var j=numticks; j>0; j--) {\n                    var t = ticks[j-1];\n                    if (t.show) {\n                        var pos = Math.round(axis.u2p(t.value)) + 0.5;\n                        switch (name) {\n                            case 'xaxis':\n                                // draw the grid line if we should\n                                if (t.showGridline && this.drawGridlines && (!t.isMinorTick || axis.showMinorTicks)) {\n                                    drawLine(pos, this._top, pos, this._bottom);\n                                }\n                                \n                                // draw the mark\n                                if (t.showMark && t.mark && (!t.isMinorTick || axis.showMinorTicks)) {\n                                    s = t.markSize;\n                                    m = t.mark;\n                                    var pos = Math.round(axis.u2p(t.value)) + 0.5;\n                                    switch (m) {\n                                        case 'outside':\n                                            b = this._bottom;\n                                            e = this._bottom+s;\n                                            break;\n                                        case 'inside':\n                                            b = this._bottom-s;\n                                            e = this._bottom;\n                                            break;\n                                        case 'cross':\n                                            b = this._bottom-s;\n                                            e = this._bottom+s;\n                                            break;\n                                        default:\n                                            b = this._bottom;\n                                            e = this._bottom+s;\n                                            break;\n                                    }\n                                    // draw the shadow\n                                    if (this.shadow) {\n                                        this.renderer.shadowRenderer.draw(ctx, [[pos,b],[pos,e]], {lineCap:'butt', lineWidth:this.gridLineWidth, offset:this.gridLineWidth*0.75, depth:2, fill:false, closePath:false});\n                                    }\n                                    // draw the line\n                                    drawLine(pos, b, pos, e);\n                                }\n                                break;\n                            case 'yaxis':\n                                // draw the grid line\n                                if (t.showGridline && this.drawGridlines && (!t.isMinorTick || axis.showMinorTicks)) {\n                                    drawLine(this._right, pos, this._left, pos);\n                                }\n\n                                // draw the mark\n                                if (t.showMark && t.mark && (!t.isMinorTick || axis.showMinorTicks)) {\n                                    s = t.markSize;\n                                    m = t.mark;\n                                    var pos = Math.round(axis.u2p(t.value)) + 0.5;\n                                    switch (m) {\n                                        case 'outside':\n                                            b = this._left-s;\n                                            e = this._left;\n                                            break;\n                                        case 'inside':\n                                            b = this._left;\n                                            e = this._left+s;\n                                            break;\n                                        case 'cross':\n                                            b = this._left-s;\n                                            e = this._left+s;\n                                            break;\n                                        default:\n                                            b = this._left-s;\n                                            e = this._left;\n                                            break;\n                                            }\n                                    // draw the shadow\n                                    if (this.shadow) {\n                                        this.renderer.shadowRenderer.draw(ctx, [[b, pos], [e, pos]], {lineCap:'butt', lineWidth:this.gridLineWidth*1.5, offset:this.gridLineWidth*0.75, fill:false, closePath:false});\n                                    }\n                                    drawLine(b, pos, e, pos, {strokeStyle:axis.borderColor});\n                                }\n                                break;\n                            case 'yMidAxis':\n                                // draw the grid line\n                                if (t.showGridline && this.drawGridlines && (!t.isMinorTick || axis.showMinorTicks)) {\n                                    drawLine(this._left, pos, xp0, pos);\n                                    drawLine(xpn, pos, this._right, pos);\n                                }\n                                // draw the mark\n                                if (t.showMark && t.mark && (!t.isMinorTick || axis.showMinorTicks)) {\n                                    s = t.markSize;\n                                    m = t.mark;\n                                    var pos = Math.round(axis.u2p(t.value)) + 0.5;\n\n                                    b = xp0;\n                                    e = xp0 + s;\n                                    // draw the shadow\n                                    if (this.shadow) {\n                                        this.renderer.shadowRenderer.draw(ctx, [[b, pos], [e, pos]], {lineCap:'butt', lineWidth:this.gridLineWidth*1.5, offset:this.gridLineWidth*0.75, fill:false, closePath:false});\n                                    }\n                                    drawLine(b, pos, e, pos, {strokeStyle:axis.borderColor});\n\n                                    b = xpn - s;\n                                    e = xpn;\n                                    // draw the shadow\n                                    if (this.shadow) {\n                                        this.renderer.shadowRenderer.draw(ctx, [[b, pos], [e, pos]], {lineCap:'butt', lineWidth:this.gridLineWidth*1.5, offset:this.gridLineWidth*0.75, fill:false, closePath:false});\n                                    }\n                                    drawLine(b, pos, e, pos, {strokeStyle:axis.borderColor});\n                                }\n                                break;\n                            case 'x2axis':\n                                // draw the grid line\n                                if (t.showGridline && this.drawGridlines && (!t.isMinorTick || axis.showMinorTicks)) {\n                                    drawLine(pos, this._bottom, pos, this._top);\n                                }\n\n                                // draw the mark\n                                if (t.showMark && t.mark && (!t.isMinorTick || axis.showMinorTicks)) {\n                                    s = t.markSize;\n                                    m = t.mark;\n                                    var pos = Math.round(axis.u2p(t.value)) + 0.5;\n                                    switch (m) {\n                                        case 'outside':\n                                            b = this._top-s;\n                                            e = this._top;\n                                            break;\n                                        case 'inside':\n                                            b = this._top;\n                                            e = this._top+s;\n                                            break;\n                                        case 'cross':\n                                            b = this._top-s;\n                                            e = this._top+s;\n                                            break;\n                                        default:\n                                            b = this._top-s;\n                                            e = this._top;\n                                            break;\n                                            }\n                                    // draw the shadow\n                                    if (this.shadow) {\n                                        this.renderer.shadowRenderer.draw(ctx, [[pos,b],[pos,e]], {lineCap:'butt', lineWidth:this.gridLineWidth, offset:this.gridLineWidth*0.75, depth:2, fill:false, closePath:false});\n                                    }\n                                    drawLine(pos, b, pos, e);\n                                }\n                                break;\n                            case 'y2axis':\n                                // draw the grid line\n                                if (t.showGridline && this.drawGridlines && (!t.isMinorTick || axis.showMinorTicks)) {\n                                    drawLine(this._left, pos, this._right, pos);\n                                }\n\n                                // draw the mark\n                                if (t.showMark && t.mark && (!t.isMinorTick || axis.showMinorTicks)) {\n                                    s = t.markSize;\n                                    m = t.mark;\n                                    var pos = Math.round(axis.u2p(t.value)) + 0.5;\n                                    switch (m) {\n                                        case 'outside':\n                                            b = this._right;\n                                            e = this._right+s;\n                                            break;\n                                        case 'inside':\n                                            b = this._right-s;\n                                            e = this._right;\n                                            break;\n                                        case 'cross':\n                                            b = this._right-s;\n                                            e = this._right+s;\n                                            break;\n                                        default:\n                                            b = this._right;\n                                            e = this._right+s;\n                                            break;\n                                            }\n                                    // draw the shadow\n                                    if (this.shadow) {\n                                        this.renderer.shadowRenderer.draw(ctx, [[b, pos], [e, pos]], {lineCap:'butt', lineWidth:this.gridLineWidth*1.5, offset:this.gridLineWidth*0.75, fill:false, closePath:false});\n                                    }\n                                    drawLine(b, pos, e, pos, {strokeStyle:axis.borderColor});\n                                }\n                                break;\n                            default:\n                                break;\n                        }\n                    }\n                }\n                t = null;\n            }\n            axis = null;\n            ticks = null;\n        }\n        \n        ctx.restore();\n        \n        function drawLine(bx, by, ex, ey, opts) {\n            ctx.save();\n            opts = opts || {};\n            if (opts.lineWidth == null || opts.lineWidth != 0){\n                $.extend(true, ctx, opts);\n                ctx.beginPath();\n                ctx.moveTo(bx, by);\n                ctx.lineTo(ex, ey);\n                ctx.stroke();\n            }\n            ctx.restore();\n        }\n        \n        if (this.shadow) {\n            if (axes.yMidAxis.show) {\n                var points = [[this._left, this._bottom], [xp0, this._bottom]];\n                this.renderer.shadowRenderer.draw(ctx, points);\n                var points = [[xpn, this._bottom], [this._right, this._bottom], [this._right, this._top]];\n                this.renderer.shadowRenderer.draw(ctx, points);\n                var points = [[xp0, this._bottom], [xp0, this._top]];\n                this.renderer.shadowRenderer.draw(ctx, points);\n            }\n            else {\n                var points = [[this._left, this._bottom], [this._right, this._bottom], [this._right, this._top]];\n                this.renderer.shadowRenderer.draw(ctx, points);\n            }\n        }\n        // Now draw border around grid.  Use axis border definitions. start at\n        // upper left and go clockwise.\n        if (this.borderWidth != 0 && this.drawBorder) {\n            if (axes.yMidAxis.show) {\n                drawLine (this._left, this._top, xp0, this._top, {lineCap:'round', strokeStyle:axes.x2axis.borderColor, lineWidth:axes.x2axis.borderWidth});\n                drawLine (xpn, this._top, this._right, this._top, {lineCap:'round', strokeStyle:axes.x2axis.borderColor, lineWidth:axes.x2axis.borderWidth});\n                drawLine (this._right, this._top, this._right, this._bottom, {lineCap:'round', strokeStyle:axes.y2axis.borderColor, lineWidth:axes.y2axis.borderWidth});\n                drawLine (this._right, this._bottom, xpn, this._bottom, {lineCap:'round', strokeStyle:axes.xaxis.borderColor, lineWidth:axes.xaxis.borderWidth});\n                drawLine (xp0, this._bottom, this._left, this._bottom, {lineCap:'round', strokeStyle:axes.xaxis.borderColor, lineWidth:axes.xaxis.borderWidth});\n                drawLine (this._left, this._bottom, this._left, this._top, {lineCap:'round', strokeStyle:axes.yaxis.borderColor, lineWidth:axes.yaxis.borderWidth});\n                drawLine (xp0, this._bottom, xp0, this._top, {lineCap:'round', strokeStyle:axes.yaxis.borderColor, lineWidth:axes.yaxis.borderWidth});\n                drawLine (xpn, this._bottom, xpn, this._top, {lineCap:'round', strokeStyle:axes.yaxis.borderColor, lineWidth:axes.yaxis.borderWidth});\n            }\n            else {\n                drawLine (this._left, this._top, this._right, this._top, {lineCap:'round', strokeStyle:axes.x2axis.borderColor, lineWidth:axes.x2axis.borderWidth});\n                drawLine (this._right, this._top, this._right, this._bottom, {lineCap:'round', strokeStyle:axes.y2axis.borderColor, lineWidth:axes.y2axis.borderWidth});\n                drawLine (this._right, this._bottom, this._left, this._bottom, {lineCap:'round', strokeStyle:axes.xaxis.borderColor, lineWidth:axes.xaxis.borderWidth});\n                drawLine (this._left, this._bottom, this._left, this._top, {lineCap:'round', strokeStyle:axes.yaxis.borderColor, lineWidth:axes.yaxis.borderWidth});\n            }\n        }\n        // ctx.lineWidth = this.borderWidth;\n        // ctx.strokeStyle = this.borderColor;\n        // ctx.strokeRect(this._left, this._top, this._width, this._height);\n        \n        ctx.restore();\n        ctx =  null;\n        axes = null;\n    };\n})(jQuery); "
  },
  {
    "path": "stenogotchi/ui/web/static/js/plugins/jqplot.pyramidRenderer.js",
    "content": "/**\n * jqPlot\n * Pure JavaScript plotting plugin using jQuery\n *\n * Version: 1.0.9\n * Revision: d96a669\n *\n * Copyright (c) 2009-2016 Chris Leonello\n * jqPlot is currently available for use in all personal or commercial projects \n * under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL \n * version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can \n * choose the license that best suits your project and use it accordingly. \n *\n * Although not required, the author would appreciate an email letting him \n * know of any substantial use of jqPlot.  You can reach the author at: \n * chris at jqplot dot com or see http://www.jqplot.com/info.php .\n *\n * If you are feeling kind and generous, consider supporting the project by\n * making a donation at: http://www.jqplot.com/donate.php .\n *\n * sprintf functions contained in jqplot.sprintf.js by Ash Searle:\n *\n *     version 2007.04.27\n *     author Ash Searle\n *     http://hexmen.com/blog/2007/03/printf-sprintf/\n *     http://hexmen.com/js/sprintf.js\n *     The author (Ash Searle) has placed this code in the public domain:\n *     \"This code is unrestricted: you are free to use it however you like.\"\n * \n */\n(function($) {\n\n    // Need to ensure pyramid axis and grid renderers are loaded.\n    // You should load these with script tags in the html head, that is more efficient\n    // as the browser will cache the request.\n    // Note, have to block with synchronous request in order to execute bar renderer code.\n    if ($.jqplot.PyramidAxisRenderer === undefined) {\n        $.ajax({\n            url: $.jqplot.pluginLocation + 'jqplot.pyramidAxisRenderer.js',\n            dataType: \"script\",\n            async: false\n        });\n    }\n    \n    if ($.jqplot.PyramidGridRenderer === undefined) {\n        $.ajax({\n            url: $.jqplot.pluginLocation + 'jqplot.pyramidGridRenderer.js',\n            dataType: \"script\",\n            async: false\n        });\n    }\n\n    $.jqplot.PyramidRenderer = function(){\n        $.jqplot.LineRenderer.call(this);\n    };\n    \n    $.jqplot.PyramidRenderer.prototype = new $.jqplot.LineRenderer();\n    $.jqplot.PyramidRenderer.prototype.constructor = $.jqplot.PyramidRenderer;\n    \n    // called with scope of a series\n    $.jqplot.PyramidRenderer.prototype.init = function(options, plot) {\n        options = options || {};\n        this._type = 'pyramid';\n        // Group: Properties\n        //\n        // prop: barPadding\n        this.barPadding = 10;\n        this.barWidth = null;\n        // prop: fill\n        // True to fill the bars.\n        this.fill = true;\n        // prop: highlightMouseOver\n        // True to highlight slice when moused over.\n        // This must be false to enable highlightMouseDown to highlight when clicking on a slice.\n        this.highlightMouseOver = true;\n        // prop: highlightMouseDown\n        // True to highlight when a mouse button is pressed over a slice.\n        // This will be disabled if highlightMouseOver is true.\n        this.highlightMouseDown = false;\n        // prop: highlightColors\n        // an array of colors to use when highlighting a slice.\n        this.highlightColors = [];\n        // prop highlightThreshold\n        // Expand the highlightable region in the x direction.\n        // E.g. a value of 3 will highlight a bar when the mouse is\n        // within 3 pixels of the bar in the x direction.\n        this.highlightThreshold = 2;\n        // prop: synchronizeHighlight\n        // Index of another series to highlight when this series is highlighted.\n        // null or false to not synchronize.\n        this.synchronizeHighlight = false;\n        // prop: offsetBars\n        // False will center bars on their y value.\n        // True will push bars up by 1/2 bar width to fill between their y values.\n        // If true, there needs to be 1 more tick than there are bars.\n        this.offsetBars = false;\n        \n        // if user has passed in highlightMouseDown option and not set highlightMouseOver, disable highlightMouseOver\n        if (options.highlightMouseDown && options.highlightMouseOver == null) {\n            options.highlightMouseOver = false;\n        }\n\n        this.side = 'right';\n        \n        $.extend(true, this, options);\n\n        // if (this.fill === false) {\n        //     this.shadow = false;\n        // }\n\n        if (this.side === 'left') {\n            this._highlightThreshold = [[-this.highlightThreshold, 0], [-this.highlightThreshold, 0], [0,0], [0,0]];\n        }\n\n        else {\n            this._highlightThreshold = [[0,0], [0,0], [this.highlightThreshold, 0], [this.highlightThreshold, 0]];\n        }\n        \n        this.renderer.options = options;\n        // index of the currenty highlighted point, if any\n        this._highlightedPoint = null;\n        // Array of actual data colors used for each data point.\n        this._dataColors = [];\n        this._barPoints = [];\n        this.fillAxis = 'y';\n        this._primaryAxis = '_yaxis';\n        this._xnudge = 0;\n        \n        // set the shape renderer options\n        var opts = {lineJoin:'miter', lineCap:'butt', fill:this.fill, fillRect:this.fill, isarc:false, strokeStyle:this.color, fillStyle:this.color, closePath:this.fill, lineWidth: this.lineWidth};\n        this.renderer.shapeRenderer.init(opts);\n        // set the shadow renderer options\n        var shadow_offset = options.shadowOffset;\n        // set the shadow renderer options\n        if (shadow_offset == null) {\n            // scale the shadowOffset to the width of the line.\n            if (this.lineWidth > 2.5) {\n                shadow_offset = 1.25 * (1 + (Math.atan((this.lineWidth/2.5))/0.785398163 - 1)*0.6);\n                // var shadow_offset = this.shadowOffset;\n            }\n            // for skinny lines, don't make such a big shadow.\n            else {\n                shadow_offset = 1.25 * Math.atan((this.lineWidth/2.5))/0.785398163;\n            }\n        }\n        var sopts = {lineJoin:'miter', lineCap:'butt', fill:this.fill, fillRect:this.fill, isarc:false, angle:this.shadowAngle, offset:shadow_offset, alpha:this.shadowAlpha, depth:this.shadowDepth, closePath:this.fill, lineWidth: this.lineWidth};\n        this.renderer.shadowRenderer.init(sopts);\n\n        plot.postDrawHooks.addOnce(postPlotDraw);\n        plot.eventListenerHooks.addOnce('jqplotMouseMove', handleMove);\n\n        // if this is the left side of pyramid, set y values to negative.\n        if (this.side === 'left') {\n            for (var i=0, l=this.data.length; i<l; i++) {\n                this.data[i][1] = -Math.abs(this.data[i][1]);\n            }\n        }\n    };\n    \n    // setGridData\n    // converts the user data values to grid coordinates and stores them\n    // in the gridData array.\n    // Called with scope of a series.\n    $.jqplot.PyramidRenderer.prototype.setGridData = function(plot) {\n        // recalculate the grid data\n        var xp = this._xaxis.series_u2p;\n        var yp = this._yaxis.series_u2p;\n        var data = this._plotData;\n        var pdata = this._prevPlotData;\n        this.gridData = [];\n        this._prevGridData = [];\n        var l = data.length;\n        var adjust = false;\n        var i;\n\n        // if any data values are < 0,  consider this a negative series\n        for (i = 0; i < l; i++) {\n            if (data[i][1] < 0) {\n                this.side = 'left';\n            }\n        }\n\n        if (this._yaxis.name === 'yMidAxis' && this.side === 'right') {\n            this._xnudge = this._xaxis.max/2000.0;\n            adjust = true;\n        }\n\n        for (i = 0; i < l; i++) {\n            // if not a line series or if no nulls in data, push the converted point onto the array.\n            if (data[i][0] != null && data[i][1] != null) {\n                this.gridData.push([xp(data[i][1]), yp(data[i][0])]);\n            }\n            // else if there is a null, preserve it.\n            else if (data[i][0] == null) {\n                this.gridData.push([xp(data[i][1]), null]);\n            }\n            else if (data[i][1] == null) {\n                this.gridData.push(null, [yp(data[i][0])]);\n            }\n            // finally, adjust x grid data if have to\n            if (data[i][1] === 0 && adjust) {\n                this.gridData[i][0] = xp(this._xnudge);\n            }\n        }\n    };\n    \n    // makeGridData\n    // converts any arbitrary data values to grid coordinates and\n    // returns them.  This method exists so that plugins can use a series'\n    // linerenderer to generate grid data points without overwriting the\n    // grid data associated with that series.\n    // Called with scope of a series.\n    $.jqplot.PyramidRenderer.prototype.makeGridData = function(data, plot) {\n        // recalculate the grid data\n        var xp = this._xaxis.series_u2p;\n        var yp = this._yaxis.series_u2p;\n        var gd = [];\n        var l = data.length;\n        var adjust = false;\n        var i;\n\n        // if any data values are < 0,  consider this a negative series\n        for (i = 0; i < l; i++) {\n            if (data[i][1] < 0) {\n                this.side = 'left';\n            }\n        }\n\n        if (this._yaxis.name === 'yMidAxis' && this.side === 'right') {\n            this._xnudge = this._xaxis.max/2000.0;\n            adjust = true;\n        }\n\n        for (i = 0; i < l; i++) {\n            // if not a line series or if no nulls in data, push the converted point onto the array.\n            if (data[i][0] != null && data[i][1] != null) {\n                gd.push([xp(data[i][1]), yp(data[i][0])]);\n            }\n            // else if there is a null, preserve it.\n            else if (data[i][0] == null) {\n                gd.push([xp(data[i][1]), null]);\n            }\n            else if (data[i][1] == null) {\n                gd.push([null, yp(data[i][0])]);\n            }\n            // finally, adjust x grid data if have to\n            if (data[i][1] === 0 && adjust) {\n                gd[i][0] = xp(this._xnudge);\n            }\n        }\n\n        return gd;\n    };\n\n    $.jqplot.PyramidRenderer.prototype.setBarWidth = function() {\n        // need to know how many data values we have on the approprate axis and figure it out.\n        var i;\n        var nvals = 0;\n        var nseries = 0;\n        var paxis = this[this._primaryAxis];\n        var s, series, pos;\n        nvals = paxis.max - paxis.min;\n        var nticks = paxis.numberTicks;\n        var nbins = (nticks-1)/2;\n        // so, now we have total number of axis values.\n        var temp = (this.barPadding === 0) ? 1.0 : 0;\n        if (paxis.name == 'xaxis' || paxis.name == 'x2axis') {\n            this.barWidth = (paxis._offsets.max - paxis._offsets.min) / nvals - this.barPadding + temp;\n        }\n        else {\n            if (this.fill) {\n                this.barWidth = (paxis._offsets.min - paxis._offsets.max) / nvals - this.barPadding + temp;\n            }\n            else {\n                this.barWidth = (paxis._offsets.min - paxis._offsets.max) / nvals;\n            }\n        }\n    };\n    \n    $.jqplot.PyramidRenderer.prototype.draw = function(ctx, gridData, options) {\n        var i;\n        // Ughhh, have to make a copy of options b/c it may be modified later.\n        var opts = $.extend({}, options);\n        var shadow = (opts.shadow != undefined) ? opts.shadow : this.shadow;\n        var showLine = (opts.showLine != undefined) ? opts.showLine : this.showLine;\n        var fill = (opts.fill != undefined) ? opts.fill : this.fill;\n        var xp = this._xaxis.series_u2p;\n        var yp = this._yaxis.series_u2p;\n        var pointx, pointy;\n        // clear out data colors.\n        this._dataColors = [];\n        this._barPoints = [];\n        \n        if (this.renderer.options.barWidth == null) {\n            this.renderer.setBarWidth.call(this);\n        }\n        \n        // var temp = this._plotSeriesInfo = this.renderer.calcSeriesNumbers.call(this);\n        // var nvals = temp[0];\n        // var nseries = temp[1];\n        // var pos = temp[2];\n        var points = [],\n            w,\n            h;\n        \n        // this._barNudge = 0;\n\n        if (showLine) {\n            var negativeColors = new $.jqplot.ColorGenerator(this.negativeSeriesColors);\n            var positiveColors = new $.jqplot.ColorGenerator(this.seriesColors);\n            var negativeColor = negativeColors.get(this.index);\n            if (! this.useNegativeColors) {\n                negativeColor = opts.fillStyle;\n            }\n            var positiveColor = opts.fillStyle;\n            var base;\n            var xstart = this._xaxis.series_u2p(this._xnudge);\n            var ystart = this._yaxis.series_u2p(this._yaxis.min);\n            var yend = this._yaxis.series_u2p(this._yaxis.max);\n            var bw = this.barWidth;\n            var bw2 = bw/2.0;\n            var points = [];\n            var yadj = this.offsetBars ? bw2 : 0;\n            \n            for (var i=0, l=gridData.length; i<l; i++) {\n                if (this.data[i][0] == null) {\n                    continue;\n                }\n                base = gridData[i][1];\n                // not stacked and first series in stack\n\n                if (this._plotData[i][1] < 0) {\n                    if (this.varyBarColor && !this._stack) {\n                        if (this.useNegativeColors) {\n                            opts.fillStyle = negativeColors.next();\n                        }\n                        else {\n                            opts.fillStyle = positiveColors.next();\n                        }\n                    }\n                }\n                else {\n                    if (this.varyBarColor && !this._stack) {\n                        opts.fillStyle = positiveColors.next();\n                    }\n                    else {\n                        opts.fillStyle = positiveColor;\n                    }                    \n                }\n                \n                if (this.fill) {\n\n                    if (this._plotData[i][1] >= 0) {\n                        // xstart = this._xaxis.series_u2p(this._xnudge);\n                        w = gridData[i][0] - xstart;\n                        h = this.barWidth;\n                        points = [xstart, base - bw2 - yadj, w, h];\n                    }\n                    else {\n                        // xstart = this._xaxis.series_u2p(0);\n                        w = xstart - gridData[i][0];\n                        h = this.barWidth;\n                        points = [gridData[i][0], base - bw2 - yadj, w, h];\n                    }\n\n                    this._barPoints.push([[points[0], points[1] + h], [points[0], points[1]], [points[0] + w, points[1]], [points[0] + w, points[1] + h]]);\n\n                    if (shadow) {\n                        this.renderer.shadowRenderer.draw(ctx, points);\n                    }\n                    var clr = opts.fillStyle || this.color;\n                    this._dataColors.push(clr);\n                    this.renderer.shapeRenderer.draw(ctx, points, opts); \n                }\n\n                else {\n                    if (i === 0) {\n                        points =[[xstart, ystart], [gridData[i][0], ystart], [gridData[i][0], gridData[i][1] - bw2 - yadj]];\n                    }\n\n                    else if (i < l-1) {\n                        points = points.concat([[gridData[i-1][0], gridData[i-1][1] - bw2 - yadj], [gridData[i][0], gridData[i][1] + bw2 - yadj], [gridData[i][0], gridData[i][1] - bw2 - yadj]]);\n                    } \n\n                    // finally, draw the line\n                    else {\n                        points = points.concat([[gridData[i-1][0], gridData[i-1][1] - bw2 - yadj], [gridData[i][0], gridData[i][1] + bw2 - yadj], [gridData[i][0], yend], [xstart, yend]]);\n                    \n                        if (shadow) {\n                            this.renderer.shadowRenderer.draw(ctx, points);\n                        }\n                        var clr = opts.fillStyle || this.color;\n                        this._dataColors.push(clr);\n                        this.renderer.shapeRenderer.draw(ctx, points, opts);\n                    }\n                }\n            }  \n        }        \n        \n        if (this.highlightColors.length == 0) {\n            this.highlightColors = $.jqplot.computeHighlightColors(this._dataColors);\n        }\n        \n        else if (typeof(this.highlightColors) == 'string') {\n            this.highlightColors = [];\n            for (var i=0; i<this._dataColors.length; i++) {\n                this.highlightColors.push(this.highlightColors);\n            }\n        }\n        \n    };\n\n        \n    // setup default renderers for axes and legend so user doesn't have to\n    // called with scope of plot\n    function preInit(target, data, options) {\n        options = options || {};\n        options.axesDefaults = options.axesDefaults || {};\n        options.grid = options.grid || {};\n        options.legend = options.legend || {};\n        options.seriesDefaults = options.seriesDefaults || {};\n        // only set these if there is a pie series\n        var setopts = false;\n        if (options.seriesDefaults.renderer === $.jqplot.PyramidRenderer) {\n            setopts = true;\n        }\n        else if (options.series) {\n            for (var i=0; i < options.series.length; i++) {\n                if (options.series[i].renderer === $.jqplot.PyramidRenderer) {\n                    setopts = true;\n                }\n            }\n        }\n        \n        if (setopts) {\n            options.axesDefaults.renderer = $.jqplot.PyramidAxisRenderer;\n            options.grid.renderer = $.jqplot.PyramidGridRenderer;\n            options.seriesDefaults.pointLabels = {show: false};\n        }\n    }\n    \n    // called within context of plot\n    // create a canvas which we can draw on.\n    // insert it before the eventCanvas, so eventCanvas will still capture events.\n    function postPlotDraw() {\n        // Memory Leaks patch    \n        if (this.plugins.pyramidRenderer && this.plugins.pyramidRenderer.highlightCanvas) {\n\n            this.plugins.pyramidRenderer.highlightCanvas.resetCanvas();\n            this.plugins.pyramidRenderer.highlightCanvas = null;\n        }\n         \n        this.plugins.pyramidRenderer = {highlightedSeriesIndex:null};\n        this.plugins.pyramidRenderer.highlightCanvas = new $.jqplot.GenericCanvas();\n        \n        this.eventCanvas._elem.before(this.plugins.pyramidRenderer.highlightCanvas.createElement(this._gridPadding, 'jqplot-pyramidRenderer-highlight-canvas', this._plotDimensions, this));\n        this.plugins.pyramidRenderer.highlightCanvas.setContext();\n        this.eventCanvas._elem.bind('mouseleave', {plot:this}, function (ev) { unhighlight(ev.data.plot); });\n    }  \n    \n    function highlight (plot, sidx, pidx, points) {\n        var s = plot.series[sidx];\n        var canvas = plot.plugins.pyramidRenderer.highlightCanvas;\n        canvas._ctx.clearRect(0,0,canvas._ctx.canvas.width, canvas._ctx.canvas.height);\n        s._highlightedPoint = pidx;\n        plot.plugins.pyramidRenderer.highlightedSeriesIndex = sidx;\n        var opts = {fillStyle: s.highlightColors[pidx], fillRect: false};\n        s.renderer.shapeRenderer.draw(canvas._ctx, points, opts);\n        if (s.synchronizeHighlight !== false && plot.series.length >= s.synchronizeHighlight && s.synchronizeHighlight !== sidx) {\n            s = plot.series[s.synchronizeHighlight];\n            opts = {fillStyle: s.highlightColors[pidx], fillRect: false};\n            s.renderer.shapeRenderer.draw(canvas._ctx, s._barPoints[pidx], opts);\n        }\n        canvas = null;\n    }\n    \n    function unhighlight (plot) {\n        var canvas = plot.plugins.pyramidRenderer.highlightCanvas;\n        canvas._ctx.clearRect(0,0, canvas._ctx.canvas.width, canvas._ctx.canvas.height);\n        for (var i=0; i<plot.series.length; i++) {\n            plot.series[i]._highlightedPoint = null;\n        }\n        plot.plugins.pyramidRenderer.highlightedSeriesIndex = null;\n        plot.target.trigger('jqplotDataUnhighlight');\n        canvas =  null;\n    }\n    \n    \n    function handleMove(ev, gridpos, datapos, neighbor, plot) {\n        if (neighbor) {\n            var ins = [neighbor.seriesIndex, neighbor.pointIndex, neighbor.data];\n            var evt1 = jQuery.Event('jqplotDataMouseOver');\n            evt1.pageX = ev.pageX;\n            evt1.pageY = ev.pageY;\n            plot.target.trigger(evt1, ins);\n            if (plot.series[ins[0]].highlightMouseOver && !(ins[0] == plot.plugins.pyramidRenderer.highlightedSeriesIndex && ins[1] == plot.series[ins[0]]._highlightedPoint)) {\n                var evt = jQuery.Event('jqplotDataHighlight');\n                evt.which = ev.which;\n                evt.pageX = ev.pageX;\n                evt.pageY = ev.pageY;\n                plot.target.trigger(evt, ins);\n                highlight (plot, neighbor.seriesIndex, neighbor.pointIndex, neighbor.points);\n            }\n        }\n        else if (neighbor == null) {\n            unhighlight (plot);\n        }\n    }\n\n    // Have to add hook here, becuase it needs called before series is inited.\n    $.jqplot.preInitHooks.push(preInit);\n    \n\n})(jQuery);"
  },
  {
    "path": "stenogotchi/ui/web/static/js/plugins/jqplot.trendline.js",
    "content": "/**\n * jqPlot\n * Pure JavaScript plotting plugin using jQuery\n *\n * Version: 1.0.9\n * Revision: d96a669\n *\n * Copyright (c) 2009-2016 Chris Leonello\n * jqPlot is currently available for use in all personal or commercial projects \n * under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL \n * version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can \n * choose the license that best suits your project and use it accordingly. \n *\n * Although not required, the author would appreciate an email letting him \n * know of any substantial use of jqPlot.  You can reach the author at: \n * chris at jqplot dot com or see http://www.jqplot.com/info.php .\n *\n * If you are feeling kind and generous, consider supporting the project by\n * making a donation at: http://www.jqplot.com/donate.php .\n *\n * sprintf functions contained in jqplot.sprintf.js by Ash Searle:\n *\n *     version 2007.04.27\n *     author Ash Searle\n *     http://hexmen.com/blog/2007/03/printf-sprintf/\n *     http://hexmen.com/js/sprintf.js\n *     The author (Ash Searle) has placed this code in the public domain:\n *     \"This code is unrestricted: you are free to use it however you like.\"\n * \n */\n(function($) {\n    \n    /**\n     * Class: $.jqplot.Trendline\n     * Plugin which will automatically compute and draw trendlines for plotted data.\n     */\n    $.jqplot.Trendline = function() {\n        // Group: Properties\n        \n        // prop: show\n        // Wether or not to show the trend line.\n        this.show = $.jqplot.config.enablePlugins;\n        // prop: color\n        // CSS color spec for the trend line.\n        // By default this wil be the same color as the primary line.\n        this.color = '#666666';\n        // prop: renderer\n        // Renderer to use to draw the trend line.\n        // The data series that is plotted may not be rendered as a line.\n        // Therefore, we use our own line renderer here to draw a trend line.\n        this.renderer = new $.jqplot.LineRenderer();\n        // prop: rendererOptions\n        // Options to pass to the line renderer.\n        // By default, markers are not shown on trend lines.\n        this.rendererOptions = {marker:{show:false}};\n        // prop: label\n        // Label for the trend line to use in the legend.\n        this.label = '';\n        // prop: type\n        // Either 'exponential', 'exp', or 'linear'.\n        this.type = 'linear';\n        // prop: shadow\n        // true or false, whether or not to show the shadow.\n        this.shadow = true;\n        // prop: markerRenderer\n        // Renderer to use to draw markers on the line.\n        // I think this is wrong.\n        this.markerRenderer = {show:false};\n        // prop: lineWidth\n        // Width of the trend line.\n        this.lineWidth = 1.5;\n        // prop: shadowAngle\n        // Angle of the shadow on the trend line.\n        this.shadowAngle = 45;\n        // prop: shadowOffset\n        // pixel offset for each stroke of the shadow.\n        this.shadowOffset = 1.0;\n        // prop: shadowAlpha\n        // Alpha transparency of the shadow.\n        this.shadowAlpha = 0.07;\n        // prop: shadowDepth\n        // number of strokes to make of the shadow.\n        this.shadowDepth = 3;\n        this.isTrendline = true;\n        \n    };\n    \n    $.jqplot.postSeriesInitHooks.push(parseTrendLineOptions);\n    $.jqplot.postDrawSeriesHooks.push(drawTrendline);\n    $.jqplot.addLegendRowHooks.push(addTrendlineLegend);\n    \n    // called witin scope of the legend object\n    // current series passed in\n    // must return null or an object {label:label, color:color}\n    function addTrendlineLegend(series) {\n        var ret = null;\n        if (series.trendline && series.trendline.show) {\n            var lt = series.trendline.label.toString();\n            if (lt) {\n                ret = {label:lt, color:series.trendline.color};\n            }\n        }\n        return ret;\n    }\n\n    // called within scope of a series\n    function parseTrendLineOptions (target, data, seriesDefaults, options, plot) {\n        if (this._type && (this._type === 'line' || this._type == 'bar')) {\n            this.trendline = new $.jqplot.Trendline();\n            options = options || {};\n            $.extend(true, this.trendline, {color:this.color}, seriesDefaults.trendline, options.trendline);\n            this.trendline.renderer.init.call(this.trendline, null);\n        }\n    }\n    \n    // called within scope of series object\n    function drawTrendline(sctx, options) {\n        // if we have options, merge trendline options in with precedence\n        options = $.extend(true, {}, this.trendline, options);\n\n        if (this.trendline && options.show) {\n            var fit;\n            // this.renderer.setGridData.call(this);\n            var data = options.data || this.data;\n            fit = fitData(data, this.trendline.type);\n            var gridData = options.gridData || this.renderer.makeGridData.call(this, fit.data);\n            this.trendline.renderer.draw.call(this.trendline, sctx, gridData, {showLine:true, shadow:this.trendline.shadow});\n        }\n    }\n    \n    function regression(x, y, typ)  {\n        var type = (typ == null) ? 'linear' : typ;\n        var N = x.length;\n        var slope;\n        var intercept;  \n        var SX = 0;\n        var SY = 0;\n        var SXX = 0;\n        var SXY = 0;\n        var SYY = 0;\n        var Y = [];\n        var X = [];\n    \n        if (type == 'linear') {\n            X = x;\n            Y = y;\n        }\n        else if (type == 'exp' || type == 'exponential') {\n            for ( var i=0; i<y.length; i++) {\n                // ignore points <= 0, log undefined.\n                if (y[i] <= 0) {\n                    N--;\n                }\n                else {\n                    X.push(x[i]);\n                    Y.push(Math.log(y[i]));\n                }\n            }\n        }\n\n        for ( var i = 0; i < N; i++) {\n            SX = SX + X[i];\n            SY = SY + Y[i];\n            SXY = SXY + X[i]* Y[i];\n            SXX = SXX + X[i]* X[i];\n            SYY = SYY + Y[i]* Y[i];\n        }\n\n        slope = (N*SXY - SX*SY)/(N*SXX - SX*SX);\n        intercept = (SY - slope*SX)/N;\n\n        return [slope, intercept];\n    }\n\n    function linearRegression(X,Y) {\n        var ret;\n        ret = regression(X,Y,'linear');\n        return [ret[0],ret[1]];\n    }\n\n    function expRegression(X,Y) {\n        var ret;\n        var x = X;\n        var y = Y;\n        ret = regression(x, y,'exp');\n        var base = Math.exp(ret[0]);\n        var coeff = Math.exp(ret[1]);\n        return [base, coeff];\n    }\n\n    function fitData(data, typ) {\n        var type = (typ == null) ?  'linear' : typ;\n        var ret;\n        var res;\n        var x = [];\n        var y = [];\n        var ypred = [];\n        \n        for (i=0; i<data.length; i++){\n            if (data[i] != null && data[i][0] != null && data[i][1] != null) {\n                x.push(data[i][0]);\n                y.push(data[i][1]);\n            }\n        }\n        \n        if (type == 'linear') {\n            ret = linearRegression(x,y);\n            for ( var i=0; i<x.length; i++){\n                res = ret[0]*x[i] + ret[1];\n                ypred.push([x[i], res]);\n            }\n        }\n        else if (type == 'exp' || type == 'exponential') {\n            ret = expRegression(x,y);\n            for ( var i=0; i<x.length; i++){\n                res = ret[1]*Math.pow(ret[0],x[i]);\n                ypred.push([x[i], res]);\n            }\n        }\n        return {data: ypred, slope: ret[0], intercept: ret[1]};\n    } \n\n})(jQuery);"
  },
  {
    "path": "stenogotchi/ui/web/static/js/viewportHeight.js",
    "content": "/* https://css-tricks.com/the-trick-to-viewport-units-on-mobile/*/\n\nvar lastViewportHeight;\n\nfunction updateViewportSize() {\n  // First we get the viewport height and we multiple it by 1% to get a value for a vh unit\n  var vh = window.innerHeight * 0.01;\n  if (!lastViewportHeight || lastViewportHeight !== vh) {\n    // Then we set the value in the --vh custom property to the root of the document\n    document.documentElement.style.setProperty(\"--vh\", vh + \"px\");\n    lastViewportHeight = vh;\n  }\n}\n\ndocument.addEventListener(\"DOMContentLoaded\", function() {\n  updateViewportSize();\n});"
  },
  {
    "path": "stenogotchi/ui/web/templates/base.html",
    "content": "<!DOCTYPE html>\n<html>\n{% block head %}\n<head>\n    {% block meta %}\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    {% endblock %}\n\n    <title>\n        {% block title %}\n        {% endblock %}\n    </title>\n\n    {% block styles %}\n    <link rel=\"stylesheet\" href=\"/js/jquery.mobile/jquery.mobile-1.4.5.min.css\"/>\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"/css/style.css\"/>\n    {% endblock %}\n\n</head>\n{% endblock %}\n\n{% block body %}\n<body>\n<div data-role=\"page\">\n\n    {% if error %}\n    <div id=\"error\" class=\"error ui-content\" data-role=\"popup\" data-overlay-theme=\"a\" data-theme=\"b\">\n        <p>{{ error }}</p>\n    </div>\n    <script>\n        $(function(){\n            $(\"#error\").popup(\"open\");\n        });\n    </script>\n    {% endif %}\n\n    {% set navigation = [\n        ( '/', 'home', 'home', 'Home' ),\n        ( '/buttonshim/E', 'buttonshim', 'bars', 'E' ),\n        ( '/buttonshim/D', 'buttonshim', 'bars', 'D' ),\n        ( '/buttonshim/C', 'buttonshim', 'bars', 'C' ),\n        ( '/buttonshim/B', 'buttonshim', 'bars', 'B' ),\n        ( '/buttonshim/A', 'buttonshim', 'bars', 'A' ),\n        ( '/plugins', 'plugins', 'grid', 'Plugins' ),\n    ] %}\n    {% set active_page = active_page|default('inbox') %}\n\n    <div data-role=\"footer\">\n        <div data-role=\"navbar\" data-iconpos=\"left\">\n            <ul>\n                {% for href, id, icon, caption in navigation %}\n                    <li class=\"navitem\">\n                       <a href=\"{{ href }}\" id=\"{{ id }}\" data-icon=\"{{ icon }}\" class=\"{{ 'ui-btn-active' if active_page == id }}\">{{ caption }}</a>\n                    </li>\n                {% endfor %}\n            </ul>\n        </div>\n    </div>\n\n    {% block content %}\n    {% endblock %}\n\n</div>\n{% block scripts %}\n<script type=\"text/javascript\" src=\"/js/jquery-1.12.4.min.js\"></script>\n<script type=\"text/javascript\" src=\"/js/jquery.mobile/jquery.mobile-1.4.5.min.js\"></script>\n<script type=\"text/javascript\" src=\"/js/jquery.timeago.js\"></script>\n<script type=\"text/javascript\" src=\"/js/jquery-qrcode-0.17.0.min.js\"></script>\n<script type=\"text/javascript\">\n    $.mobile.ajaxEnabled = false;\n    $.mobile.pushStateEnabled = false;\n\n    jQuery(document).ready(function() {\n      jQuery(\"time.timeago\").timeago();\n    });\n\n    {% block script %}\n    {% endblock %}\n</script>\n{% endblock %}\n</body>\n{% endblock %}\n</html>\n"
  },
  {
    "path": "stenogotchi/ui/web/templates/index.html",
    "content": "{% extends \"base.html\" %}\n{% set active_page = \"home\" %}\n\n{% block title %}\n{{ title }}\n{% endblock %}\n\n{% block script %}\nwindow.onload = function() {\n    var image = document.getElementById(\"ui\");\n    function updateImage() {\n        image.src = image.src.split(\"?\")[0] + \"?\" + new Date().getTime();\n    }\n    setInterval(updateImage, 1000);\n}\n{% endblock %}\n\n{% block content %}\n<img class=\"ui-image pixelated\" src=\"/ui\" id=\"ui\"/>\n<div data-role=\"navbar\">\n\t<ul>\n\t\t<li>\n\t\t\t<form class=\"action\" method=\"post\" action=\"/shutdown\"\n          onsubmit=\"return confirm('this will halt the unit, continue?');\">\n\t\t\t\t<input type=\"submit\" class=\"button ui-btn ui-corner-all\" value=\"Shutdown\"/>\n\t\t\t\t<input type=\"hidden\" name=\"csrf_token\" value=\"{{ csrf_token() }}\"/>\n\t\t\t</form>\n\t\t</li>\n\t\t<li>\n\t\t\t<form class=\"action\" method=\"post\" action=\"/toggle_input\";>\n\t\t\t\t<input type=\"submit\" class=\"button ui-btn ui-corner-all\" value=\"Input mode\"/>\n\t\t\t\t<input type=\"hidden\" name=\"csrf_token\" value=\"{{ csrf_token() }}\"/>\n\t\t\t</form>\n\t\t</li>\n\t\t<li>\n\t\t\t<form class=\"action\" method=\"post\" action=\"/toggle_wpm\";>\n\t\t\t\t<input type=\"submit\" class=\"button ui-btn ui-corner-all\" value=\"WPM readings\"/>\n\t\t\t\t<input type=\"hidden\" name=\"csrf_token\" value=\"{{ csrf_token() }}\"/>\n\t\t\t</form>\n\t\t</li>\n\t\t<li>\n\t\t\t<form class=\"action\" method=\"post\" action=\"/toggle_lookup\";>\n\t\t\t\t<input type=\"submit\" class=\"button ui-btn ui-corner-all\" value=\"Dict lookup\"/>\n\t\t\t\t<input type=\"hidden\" name=\"csrf_token\" value=\"{{ csrf_token() }}\"/>\n\t\t\t</form>\n\t\t</li>\n\t\t<li>\n\t\t\t<form class=\"action\" method=\"post\" action=\"/reboot\"\n          onsubmit=\"return confirm('this will reboot the unit, continue?');\">\n\t\t\t\t<input type=\"submit\" class=\"button ui-btn ui-corner-all\" value=\"Reboot\"/>\n\t\t\t\t<input type=\"hidden\" name=\"csrf_token\" value=\"{{ csrf_token() }}\"/>\n\t\t\t</form>\n\t\t</li>\n\t</ul>\n</div>\n{% endblock %}\n"
  },
  {
    "path": "stenogotchi/ui/web/templates/plugins.html",
    "content": "{% extends \"base.html\" %}\n{% set active_page = \"plugins\" %}\n\n{% block title %}\nPlugins\n{% endblock %}\n\n{% block styles %}\n  {{ super() }}\n  <style>\n  .tooltip {\n    position: relative;\n    display: inline-block;\n  }\n  .tooltip .tooltiptext {\n    visibility: hidden;\n    width: 200px;\n    background-color: #3388cc;\n    color: #fff;\n    text-align: center;\n    border-radius: 10px;\n    border: 2px solid black;\n    padding: 20px 0;\n\n    position: absolute;\n    z-index: 1;\n    top: 100%;\n    left: 50%;\n    margin-left: -100px;\n  }\n\n  .tooltip:hover .tooltiptext {\n    visibility: visible;\n  }\n\n  </style>\n{% endblock %}\n\n{% block script %}\n$(function(){\n    $('input[type=checkbox]').change(function(e) {\n          var checkbox = $(this);\n          var form = checkbox.closest('form');\n          var url = form.attr('action');\n\n          $.ajax({\n             type: 'POST',\n             url: url,\n             data: form.serialize(),\n             success: function(data) {\n                  if( data.indexOf('failed') != -1 ) {\n                      alert('Could not be toggled.');\n                  }\n            }\n        });\n    });\n});\n{% endblock %}\n{% block content %}\n<div id=\"container\">\n    {% for name in database.keys() | sort %}\n        {% set has_info = name in loaded and loaded[name].__description__ is defined %}\n        <div class=\"plugins-box\">\n          <div class=\"tooltip\">\n            <h4>\n              <a {% if name in loaded and loaded[name].on_webhook is defined %} href=\"/plugins/{{name}}\" {% endif %}>{{name}}</a>\n            </h4>\n            {% if has_info %}\n              <span class=\"tooltiptext\">{{ loaded[name].__description__ }}</span>\n            {% else %}\n              <span class=\"tooltiptext\">Description can't be loaded yet.</span>\n            {% endif %}\n          </div>\n          <form method=\"POST\" action=\"/plugins/toggle\">\n            <input type=\"checkbox\" data-role=\"flipswitch\" name=\"enabled\" id=\"flip-checkbox-{{name}}\" data-on-text=\"Enabled\" data-off-text=\"Disabled\" data-wrapper-class=\"custom-size-flipswitch\" {% if name in loaded %} checked {% endif %}>\n            <input type=\"hidden\" name=\"csrf_token\" value=\"{{ csrf_token() }}\"/>\n            <input type=\"hidden\" name=\"plugin\" value=\"{{ name }}\"/>\n          </form>\n        </div>\n    {% endfor %}\n</div>\n{% endblock %}\n"
  },
  {
    "path": "stenogotchi/ui/web/templates/status.html",
    "content": "<html>\n  <head>\n      <title>{{ title }}</title>\n      <meta http-equiv=\"refresh\" content=\"{{ go_back_after }};URL=/\">\n      <link rel=\"stylesheet\" type=\"text/css\" href=\"/css/style.css\"/>\n  </head>\n  <body>\n    <div class=\"status\">\n        {{ message }}\n    </div>\n  </body>\n</html>"
  },
  {
    "path": "stenogotchi/utils.py",
    "content": "import logging\nimport glob\nimport os\nimport sys\nimport time\n\nimport json\nimport shutil\nimport toml\nimport sys\nimport re\n\nfrom toml.encoder import TomlEncoder, _dump_str\nfrom zipfile import ZipFile\nfrom datetime import datetime\n\n\nclass DottedTomlEncoder(TomlEncoder):\n    \"\"\"\n    Dumps the toml into the dotted-key format\n    \"\"\"\n\n    def __init__(self, _dict=dict):\n        super(DottedTomlEncoder, self).__init__(_dict)\n\n    def dump_list(self, v):\n        retval = \"[\"\n        # 1 line if its just 1 item; therefore no newline\n        if len(v) > 1:\n            retval += \"\\n\"\n        for u in v:\n            retval += \" \" + str(self.dump_value(u)) + \",\\n\"\n        # 1 line if its just 1 item; remove newline\n        if len(v) <= 1:\n            retval = retval.rstrip(\"\\n\")\n        retval += \"]\"\n        return retval\n\n    def dump_sections(self, o, sup):\n        retstr = \"\"\n        pre = \"\"\n\n        if sup:\n            pre = sup + \".\"\n\n        for section, value in o.items():\n            section = str(section)\n            qsection = section\n            if not re.match(r'^[A-Za-z0-9_-]+$', section):\n                qsection = _dump_str(section)\n            if value is not None:\n                if isinstance(value, dict):\n                    toadd, _ = self.dump_sections(value, pre + qsection)\n                    retstr += toadd\n                    # separte sections\n                    if not retstr.endswith('\\n\\n'):\n                        retstr += '\\n'\n                else:\n                    retstr += (pre + qsection + \" = \" +\n                                str(self.dump_value(value)) + '\\n')\n        return (retstr, self._dict())\n\ndef parse_version(version):\n    \"\"\"\n    Converts a version str to tuple, so that versions can be compared\n    \"\"\"\n    return tuple(version.split('.'))\n\ndef download_file(url, destination, chunk_size=128):\n    import requests\n    resp = requests.get(url)\n    resp.raise_for_status()\n\n    with open(destination, 'wb') as fd:\n        for chunk in resp.iter_content(chunk_size):\n            fd.write(chunk)\n\ndef unzip(file, destination, strip_dirs=0):\n    os.makedirs(destination, exist_ok=True)\n    with ZipFile(file, 'r') as zip:\n        if strip_dirs:\n            for info in zip.infolist():\n                new_filename = info.filename.split('/', maxsplit=strip_dirs)[strip_dirs]\n                if new_filename:\n                    info.filename = new_filename\n                    zip.extract(info, destination)\n        else:\n            zip.extractall(destination)\n\n# https://stackoverflow.com/questions/823196/yaml-merge-in-python\ndef merge_config(user, default):\n    if isinstance(user, dict) and isinstance(default, dict):\n        for k, v in default.items():\n            if k not in user:\n                user[k] = v\n            else:\n                user[k] = merge_config(user[k], v)\n    return user\n\ndef load_configOLD(args):\n    import stenogotchi\n    config_file = os.path.join(os.path.dirname(stenogotchi.__file__), 'config.toml')\n    config = None\n\n    # load the config\n    with open(config_file) as fp:\n        config = toml.load(fp)\n\n    # check if display is supported \n    if config['ui']['display']['type'] in ('waveshare2in13v2', 'ws_2', 'ws2', 'waveshare_2', 'waveshare2'):\n        config['ui']['display']['type'] = 'waveshare_2'\n    else:\n        print(\"unsupported display type %s\" % config['ui']['display']['type'])\n        sys.exit(1)\n    return config\n\ndef save_config(config, target):\n    with open(target, 'wt') as fp:\n        fp.write(toml.dumps(config, encoder=DottedTomlEncoder()))\n    return True\n\ndef load_config(args):\n    default_config_path = os.path.dirname(args.config)\n    if not os.path.exists(default_config_path):\n        os.makedirs(default_config_path)\n\n    import stenogotchi\n    ref_defaults_file = os.path.join(os.path.dirname(stenogotchi.__file__), 'defaults.toml')\n    ref_defaults_data = None\n\n    # check for a config.toml file on /boot/\n    boot_conf = '/boot/config.toml'\n    if os.path.exists(boot_conf):\n        # logging not configured here yet\n        print(\"installing %s to %s ...\", boot_conf, args.user_config)\n        # https://stackoverflow.com/questions/42392600/oserror-errno-18-invalid-cross-device-link\n        shutil.move(boot_conf, args.user_config)\n\n    # check for an entire stenogotchi folder on /boot/\n    if os.path.isdir('/boot/stenogotchi'):\n        print(\"installing /boot/stenogotchi to /etc/stenogotchi ...\")\n        shutil.rmtree('/etc/stenogotchi', ignore_errors=True)\n        shutil.move('/boot/stenogotchi', '/etc/')\n\n    # if not config is found, copy the defaults\n    if not os.path.exists(args.config):\n        print(\"copying %s to %s ...\" % (ref_defaults_file, args.config))\n        shutil.copy(ref_defaults_file, args.config)\n    else:\n        # check if the user messed with the defaults\n\n        with open(ref_defaults_file) as fp:\n            ref_defaults_data = fp.read()\n\n        with open(args.config) as fp:\n            defaults_data = fp.read()\n\n        if ref_defaults_data != defaults_data:\n            print(\"!!! file in %s is different than release defaults, overwriting !!!\" % args.config)\n            shutil.copy(ref_defaults_file, args.config)\n\n    # load the defaults\n    with open(args.config) as fp:\n        config = toml.load(fp)\n\n    # load the user config\n    try:\n        user_config = None\n        if os.path.exists(args.user_config):\n            with open(args.user_config) as toml_file:\n                user_config = toml.load(toml_file)\n\n        if user_config:\n            config = merge_config(user_config, config)\n    except Exception as ex:\n        logging.error(\"There was an error processing the configuration file:\\n%s \",ex)\n        sys.exit(1)\n\n    # dropins\n    dropin = config['main']['confd']\n    if dropin and os.path.isdir(dropin):\n        dropin += '*.toml' if dropin.endswith('/') else '/*.toml'\n        for conf in glob.glob(dropin):\n            with open(conf) as toml_file:\n                additional_config = toml.load(toml_file)\n                config = merge_config(additional_config, config)\n\n    # the very first step is to normalize the display name so we don't need dozens of if/elif around\n    #if config['ui']['display']['type'] in ('inky', 'inkyphat'):\n    #    config['ui']['display']['type'] = 'inky'\n\n    #elif config['ui']['display']['type'] in ('papirus', 'papi'):\n    #    config['ui']['display']['type'] = 'papirus'\n\n    #elif config['ui']['display']['type'] in ('oledhat',):\n    #    config['ui']['display']['type'] = 'oledhat'\n\n    #elif config['ui']['display']['type'] in ('ws_1', 'ws1', 'waveshare_1', 'waveshare1'):\n    #    config['ui']['display']['type'] = 'waveshare_1'\n\n    if config['ui']['display']['type'] in ('ws_2', 'ws2', 'waveshare_2', 'waveshare2', 'waveshare2in13v2'):\n        config['ui']['display']['type'] = 'waveshare_2'\n\n    #elif config['ui']['display']['type'] in ('ws_27inch', 'ws27inch', 'waveshare_27inch', 'waveshare27inch'):\n    #    config['ui']['display']['type'] = 'waveshare27inch'\n\n    #elif config['ui']['display']['type'] in ('ws_29inch', 'ws29inch', 'waveshare_29inch', 'waveshare29inch'):\n    #    config['ui']['display']['type'] = 'waveshare29inch'\n\n    #elif config['ui']['display']['type'] in ('lcdhat',):\n    #    config['ui']['display']['type'] = 'lcdhat'\n\n    #elif config['ui']['display']['type'] in ('dfrobot_1', 'df1'):\n    #    config['ui']['display']['type'] = 'dfrobot_1'\n\n    #elif config['ui']['display']['type'] in ('dfrobot_2', 'df2'):\n    #    config['ui']['display']['type'] = 'dfrobot_2'\n\n    #elif config['ui']['display']['type'] in ('ws_154inch', 'ws154inch', 'waveshare_154inch', 'waveshare154inch'):\n    #    config['ui']['display']['type'] = 'waveshare154inch'\n\n    #elif config['ui']['display']['type'] in ('waveshare144lcd', 'ws_144inch', 'ws144inch', 'waveshare_144inch', 'waveshare144inch'):\n    #    config['ui']['display']['type'] = 'waveshare144lcd'\n\n    #elif config['ui']['display']['type'] in ('ws_213d', 'ws213d', 'waveshare_213d', 'waveshare213d'):\n    #    config['ui']['display']['type'] = 'waveshare213d'\n\n    #elif config['ui']['display']['type'] in ('ws_213bc', 'ws213bc', 'waveshare_213bc', 'waveshare213bc'):\n    #    config['ui']['display']['type'] = 'waveshare213bc'\n\n    #elif config['ui']['display']['type'] in ('spotpear24inch'):\n    #    config['ui']['display']['type'] = 'spotpear24inch'\n\n    else:\n        print(\"unsupported display type %s\" % config['ui']['display']['type'])\n        sys.exit(1)\n\n    return config\n\ndef secs_to_hhmmss(secs):\n    mins, secs = divmod(secs, 60)\n    hours, mins = divmod(mins, 60)\n    return '%02d:%02d:%02d' % (hours, mins, secs)\n\ndef led(on=True):\n    with open('/sys/class/leds/led0/brightness', 'w+t') as fp:\n        fp.write(\"%d\" % (0 if on is True else 1))\n\n\ndef blink(times=1, delay=0.3):\n    for _ in range(0, times):\n        led(True)\n        time.sleep(delay)\n        led(False)\n        time.sleep(delay)\n    led(True)\n\nclass StatusFile(object):\n    def __init__(self, path, data_format='raw'):\n        self._path = path\n        self._updated = None\n        self._format = data_format\n        self.data = None\n\n        if os.path.exists(path):\n            self._updated = datetime.fromtimestamp(os.path.getmtime(path))\n            with open(path) as fp:\n                if data_format == 'json':\n                    self.data = json.load(fp)\n                else:\n                    self.data = fp.read()\n\n    def data_field_or(self, name, default=\"\"):\n        if self.data is not None and name in self.data:\n            return self.data[name]\n        return default\n\n    def newer_then_minutes(self, minutes):\n        return self._updated is not None and ((datetime.now() - self._updated).seconds / 60) < minutes\n\n    def newer_then_hours(self, hours):\n        return self._updated is not None and ((datetime.now() - self._updated).seconds / (60 * 60)) < hours\n\n    def newer_then_days(self, days):\n        return self._updated is not None and (datetime.now() - self._updated).days < days\n\n    def update(self, data=None):\n        from stenogotchi.fs import ensure_write\n        self._updated = datetime.now()\n        self.data = data\n        with ensure_write(self._path, 'w') as fp:\n            if data is None:\n                fp.write(str(self._updated))\n\n            elif self._format == 'json':\n                json.dump(self.data, fp)\n\n            else:\n                fp.write(data)"
  },
  {
    "path": "stenogotchi/voice.py",
    "content": "import random\nimport gettext\nimport os\n\n\nclass Voice:\n    def __init__(self, lang):\n        localedir = os.path.join(os.path.abspath(os.path.dirname(__file__)), 'locale')\n        translation = gettext.translation(\n            'voice', localedir,\n            languages=[lang],\n            fallback=True,\n        )\n        translation.install()\n        self._ = translation.gettext\n\n    def custom(self, s):\n        return s\n\n    def default(self):\n        return self._('ZzzzZZzzzzZzzz')\n\n    def on_starting(self):\n        return random.choice([\n            self._('Hi, I\\'m Stenogotchi! Starting ...'),\n            self._('New day, new words, new chords!'),\n            self._('Caption the day!')])\n\n    def on_ai_ready(self):\n        return random.choice([\n            self._('AI ready.'),\n            self._('The neural network is ready.')])\n\n    def on_keys_generation(self):\n        return random.choice([\n            self._('Generating keys, do not turn off ...')])\n\n    def on_normal(self):\n        return random.choice([\n            self._('Wonder what we\\'ll type next'),\n            self._('Sure is cosy in here'),\n            self._('We better not be writing any spam mail ...'),\n            self._('I bet I\\'m a great swimmer.'),\n            self._('Used to know this Tama guy. Real piece of work.'),\n            self._('Did you know I\\'m barely literate?'),\n            self._('Hi buddy'),\n            self._('You\\'re looking sharp today!'),\n            self._('We\\'re friends right? Best friends!'),\n            self._('I like hanging out with you'),\n            '',\n            '...'])\n\n    def on_reading_logs(self, lines_so_far=0):\n        if lines_so_far == 0:\n            return self._('Reading last session logs ...')\n        else:\n            return self._('Read {lines_so_far} log lines so far ...').format(lines_so_far=lines_so_far)\n\n    def on_bored(self):\n        return random.choice([\n            self._('I\\'m bored ...'),\n            self._('Let\\'s go for a walk!'),\n            self._('Let\\'s write something!')])\n\n    def on_motivated(self, reward):\n        return self._('This is the best day of my life!')\n\n    def on_demotivated(self, reward):\n        return random.choice([\n            self._('This sucks ...'),\n            self._('Meh ...'),\n            self._('What\\'s even the point ...'),\n            self._('Shitty day :/')])\n\n\n    def on_sad(self):\n        return random.choice([\n            self._('I\\'m extremely bored ...'),\n            self._('I\\'m very sad ...'),\n            self._('I\\'m sad'),\n            '...'])\n\n    def on_angry(self):\n        # passive aggressive or not? :D\n        return random.choice([\n            '...',\n            self._('Leave me alone ...'),\n            self._('I\\'m mad at you!')])\n\n    def on_excited(self):\n        return random.choice([\n            self._('I\\'m living the life!'),\n            self._('I type before you think'),\n            self._('So many words!!!'),\n            self._('I\\'m having so much fun!'),\n            self._('My crime is that of curiosity ...')])\n\n    def on_new_peer(self, peer):\n        if peer.first_encounter():\n            return random.choice([\n                self._('Hello {name}! Nice to meet you.').format(name=peer.name())])\n        else:\n            return random.choice([\n                self._('Yo {name}! Sup?').format(name=peer.name()),\n                self._('Hey {name} how are you doing?').format(name=peer.name()),\n                self._('Unit {name} is nearby!').format(name=peer.name())])\n\n    def on_lost_peer(self, peer):\n        return random.choice([\n            self._('Uhm ... goodbye {name}').format(name=peer.name()),\n            self._('{name} is gone ...').format(name=peer.name())])\n\n    def on_miss(self, who):\n        return random.choice([\n            self._('Whoops ... {name} is gone.').format(name=who),\n            self._('{name} missed!').format(name=who),\n            self._('Missed!')])\n\n    def on_grateful(self):\n        return random.choice([\n            self._('Good friends are a blessing!'),\n            self._('I love my friends!')])\n\n    def on_lonely(self):\n        return random.choice([\n            self._('Nobody wants to play with me ...'),\n            self._('I feel so alone ...'),\n            self._('Where\\'s everybody?!')])\n\n    def on_napping(self, secs):\n        return random.choice([\n            #self._('Napping for {secs}s ...').format(secs=secs),\n            self._('Napping for a bit ...'),\n            self._('Zzzzz'),\n            self._('ZzzZzzz')])\n\n    def on_shutdown(self):\n        return random.choice([\n            self._('Good night.'),\n            self._('Zzz')])\n\n    def on_awakening(self):\n        return random.choice([\n        '!',\n        ''])\n\n    def on_waiting(self, secs):\n        return random.choice([\n            self._('Waiting for {secs}s ...').format(secs=secs),\n            '...',\n            self._('Looking around ({secs}s)').format(secs=secs)])\n\n    def on_rebooting(self):\n        return self._(\"Oops, something went wrong ... Rebooting ...\")\n\n    def on_last_session_data(self, last_session):\n        status = self._('Probably typed a lot last time buddy')\n        return status\n\n    def on_last_session_tweet(self, last_session):\n        pass\n\n    def on_bt_connected(self, bthost_name):\n        return random.choice([\n            self._(f'Grabbed hold of {bthost_name} with my bluetooth tentacle'),\n            self._(f'{bthost_name} is ready to receive'),\n            self._(f'Sinking my tooth into {bthost_name}'),\n            self._(f'Hi {bthost_name}, Let\\'s team up!')])\n\n    def on_bt_disconnected(self):\n        return random.choice([\n            self._('Lost connection to bluetooth host'),\n            self._('Maybe it was a milk tooth and not bluetooth since it fell out ...'),\n            self._('Need a new bluetooth connection buddy')])\n\n    def on_wifi_connected(self, ssid, ip):\n        return random.choice([\n            self._(f'Found a town called {ssid}. I\\'m gonna be known as {ip}'),\n            self._(f'Connected to: {ssid} with ip: {ip}'),\n            self._(f'Infiltrated {ssid} under the alias {ip}'),\n            self._(f'Hit me up at {ssid} under {ip}')])\n\n    \n    def on_wifi_disconnected(self):\n        return random.choice([\n            self._('I... I just lost WiFi'),\n            self._('I\\'m feeling disconnected'),\n            self._('Bruh, I was watching Netflix!')])\n\n    def on_plover_boot(self):\n        return random.choice([\n            self._('Just waiting for Plover to pick up the phone now ...'),\n            self._('Plover is loading dictionaries ...'),\n            self._('Waiting for Plover to wake up')])\n\n    def on_plover_ready(self):\n        return random.choice([\n            self._('My fingers are itching, let\\'s type'),\n            self._('Throw some chords at me bro'),\n            self._('Plover is ready'),\n            self._('Plover is finally dressed and ready to go'),\n            self._('We are ready to go')])\n    \n    def on_wpm_record(self, wpm_top):\n        if wpm_top < 100:\n            return random.choice([\n                self._('Keep up the good work!'),\n                self._('You are getting quick!')])\n        if wpm_top < 150:\n            return random.choice([\n                self._('Impressive!'),\n                self._('You have left most qwerty users in the dust!')])\n        elif wpm_top < 200:\n            return random.choice([\n                self._('Your fingers were a blur'),\n                self._('Wow, I barely managed to keep up'),\n                self._('Amazing!')])\n        elif wpm_top < 250:\n            return random.choice([\n                self._('I can\\'t keep up with you anymore'),\n                self._('I can barely think that fast'),\n                self._('Warp drive engaged!')])\n        elif wpm_top < 300:\n            return random.choice([\n                self._('I\\'m starting to think you\\'re cheating!'),\n                self._('Keep that up and your fingers will fly off')])\n        else:\n            return self._('Mark Kislingbury ... Is that you?!')\n\n    def on_dict_lookup_done(self):\n        return random.choice([\n            self._('I can never remember that one either'),\n            self._('Welp ... I already forgot it again'),\n            self._('Oh ... I totally knew that one'),\n            self._('How often do you need that word anyway?'),\n            self._('Last time we\\'ll need to look that one up. Right?')])\n        \n    def hhmmss(self, count, fmt):\n        if count > 1:\n            # plural\n            if fmt == \"h\":\n                return self._(\"hours\")\n            if fmt == \"m\":\n                return self._(\"minutes\")\n            if fmt == \"s\":\n                return self._(\"seconds\")\n        else:\n            # sing\n            if fmt == \"h\":\n                return self._(\"hour\")\n            if fmt == \"m\":\n                return self._(\"minute\")\n            if fmt == \"s\":\n                return self._(\"second\")\n        return fmt\n"
  },
  {
    "path": "stenogotchi.py",
    "content": "#!/usr/bin/python3\nimport logging\nimport argparse\nimport time\nimport signal\nimport sys\nimport toml\n\nimport stenogotchi\nfrom stenogotchi import utils\nfrom stenogotchi.plugins import cmd as plugins_cmd\nfrom stenogotchi import log\nfrom stenogotchi import restart\nfrom stenogotchi import fs\nfrom stenogotchi.utils import DottedTomlEncoder\n\n\ndef do_clear(display):\n    logging.info(\"clearing the display ...\")\n    display.clear()\n    sys.exit(0)\n\ndef do_manual_mode(agent):\n    logging.info(\"entering manual mode ...\")\n\n    agent.mode = 'manual'\n    agent.last_session.parse(agent.view(), args.skip_session)\n    if not args.skip_session:\n        logging.info(\"the last session lasted %s\" % (agent.last_session.duration_human))\n\n    while True:\n        display.on_manual_mode(agent.last_session)\n        time.sleep(5)\n\ndef do_auto_mode(agent):\n    logging.info(\"entering auto mode ...\")\n\n    agent.mode = 'auto'\n    agent.start()\n\n    while True:\n        try:\n            # This is the main loop. But we don't have any main duty outside interacting with plover and acting as ui.\n            # Need to come up with some more dynamic way of triggering UI updates based on Plover/etc events\n            time.sleep(600)\n            agent._view.on_normal()\n        except Exception as e:\n            logging.exception(\"main loop exception (%s)\", e)\n\n\nif __name__ == '__main__':\n    parser = argparse.ArgumentParser()\n    parser = plugins_cmd.add_parsers(parser)\n\n    parser.add_argument('-C', '--config', action='store', dest='config', default='/etc/stenogotchi/default.toml',\n                        help='Main configuration file.')\n    parser.add_argument('-U', '--user-config', action='store', dest='user_config', default='/etc/stenogotchi/config.toml',\n                        help='If this file exists, configuration will be merged and this will override default values.')\n\n    parser.add_argument('--manual', dest=\"do_manual\", action=\"store_true\", default=False, help=\"Manual mode.\")\n    parser.add_argument('--skip-session', dest=\"skip_session\", action=\"store_true\", default=False,\n                        help=\"Skip last session parsing in manual mode.\")\n\n    parser.add_argument('--clear', dest=\"do_clear\", action=\"store_true\", default=False,\n                        help=\"Clear the ePaper display and exit.\")\n\n    parser.add_argument('--debug', dest=\"debug\", action=\"store_true\", default=False,\n                        help=\"Enable debug logs.\")\n\n    parser.add_argument('--version', dest=\"version\", action=\"store_true\", default=False,\n                        help=\"Print the version.\")\n\n    parser.add_argument('--print-config', dest=\"print_config\", action=\"store_true\", default=False,\n                        help=\"Print the configuration.\")\n\n    args = parser.parse_args()\n\n\n    if plugins_cmd.used_plugin_cmd(args):\n        config = utils.load_config(args)\n        log.setup_logging(args, config)\n        rc = plugins_cmd.handle_cmd(args, config)\n        sys.exit(rc)\n\n    if args.version:\n        print(stenogotchi.__version__)\n        sys.exit(0)\n\n    config = utils.load_config(args)\n\n    if args.print_config:\n        print(toml.dumps(config, encoder=DottedTomlEncoder()))\n        sys.exit(0)\n\n    from stenogotchi.agent import Agent\n    from stenogotchi.ui import fonts\n    from stenogotchi.ui.display import Display\n    from stenogotchi import plugins\n\n    stenogotchi.config = config\n    fs.setup_mounts(config)\n    log.setup_logging(args, config)\n    fonts.init(config)\n\n    stenogotchi.set_name(config['main']['name'])\n\n    plugins.load(config)\n\n    display = Display(config=config, state={'name': '%s>' % stenogotchi.name()})\n\n    if args.do_clear:\n        do_clear(display)\n        sys.exit(0)\n\n    agent = Agent(view=display, config=config)\n\n    def usr1_handler(*unused):\n        logging.info('Received USR1 singal. Restart process ...')\n        restart(\"MANU\" if args.do_manual else \"AUTO\")\n\n    signal.signal(signal.SIGUSR1, usr1_handler)\n\n    if args.do_manual:\n        do_manual_mode(agent)\n    else:\n        do_auto_mode(agent)\n\n\n"
  }
]